diff -pruN 0.11.4-1/.cargo_vcs_info.json 0.11.5-1/.cargo_vcs_info.json
--- 0.11.4-1/.cargo_vcs_info.json	1970-01-01 00:00:01.000000000 +0000
+++ 0.11.5-1/.cargo_vcs_info.json	1970-01-01 00:00:01.000000000 +0000
@@ -1,6 +1,6 @@
 {
   "git": {
-    "sha1": "fb498f918087557f48dd34b81f3bf4081fe6e961"
+    "sha1": "72dd8c7b9210bace1be990e3e3018fab46fd8291"
   },
   "path_in_vcs": ""
 }
\ No newline at end of file
diff -pruN 0.11.4-1/.clippy.toml 0.11.5-1/.clippy.toml
--- 0.11.4-1/.clippy.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.clippy.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-allow-print-in-tests = true
-allow-expect-in-tests = true
-allow-unwrap-in-tests = true
-allow-dbg-in-tests = true
diff -pruN 0.11.4-1/.github/renovate.json5 0.11.5-1/.github/renovate.json5
--- 0.11.4-1/.github/renovate.json5	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.github/renovate.json5	1970-01-01 00:00:00.000000000 +0000
@@ -1,109 +0,0 @@
-{
-  schedule: [
-    'before 5am on the first day of the month',
-  ],
-  semanticCommits: 'enabled',
-  commitMessageLowerCase: 'never',
-  configMigration: true,
-  dependencyDashboard: true,
-  customManagers: [
-    {
-      customType: 'regex',
-      fileMatch: [
-        '^rust-toolchain\\.toml$',
-        'Cargo.toml$',
-        'clippy.toml$',
-        '\\.clippy.toml$',
-        '^\\.github/workflows/ci.yml$',
-        '^\\.github/workflows/rust-next.yml$',
-      ],
-      matchStrings: [
-        'STABLE.*?(?<currentValue>\\d+\\.\\d+(\\.\\d+)?)',
-        '(?<currentValue>\\d+\\.\\d+(\\.\\d+)?).*?STABLE',
-      ],
-      depNameTemplate: 'STABLE',
-      packageNameTemplate: 'rust-lang/rust',
-      datasourceTemplate: 'github-releases',
-    },
-  ],
-  packageRules: [
-    {
-      commitMessageTopic: 'Rust Stable',
-      matchManagers: [
-        'custom.regex',
-      ],
-      matchPackageNames: [
-        'STABLE',
-      ],
-      extractVersion: '^(?<version>\\d+\\.\\d+)',  // Drop the patch version
-      schedule: [
-        '* * * * *',
-      ],
-      automerge: true,
-    },
-    // Goals:
-    // - Keep version reqs low, ignoring compatible normal/build dependencies
-    // - Take advantage of latest dev-dependencies
-    // - Rollup safe upgrades to reduce CI runner load
-    // - Help keep number of versions down by always using latest breaking change
-    // - Have lockfile and manifest in-sync
-    {
-      matchManagers: [
-        'cargo',
-      ],
-      matchDepTypes: [
-        'build-dependencies',
-        'dependencies',
-      ],
-      matchCurrentVersion: '>=0.1.0',
-      matchUpdateTypes: [
-        'patch',
-      ],
-      enabled: false,
-    },
-    {
-      matchManagers: [
-        'cargo',
-      ],
-      matchDepTypes: [
-        'build-dependencies',
-        'dependencies',
-      ],
-      matchCurrentVersion: '>=1.0.0',
-      matchUpdateTypes: [
-        'minor',
-        'patch',
-      ],
-      enabled: false,
-    },
-    {
-      matchManagers: [
-        'cargo',
-      ],
-      matchDepTypes: [
-        'dev-dependencies',
-      ],
-      matchCurrentVersion: '>=0.1.0',
-      matchUpdateTypes: [
-        'patch',
-      ],
-      automerge: true,
-      groupName: 'compatible (dev)',
-    },
-    {
-      matchManagers: [
-        'cargo',
-      ],
-      matchDepTypes: [
-        'dev-dependencies',
-      ],
-      matchCurrentVersion: '>=1.0.0',
-      matchUpdateTypes: [
-        'minor',
-        'patch',
-      ],
-      automerge: true,
-      groupName: 'compatible (dev)',
-    },
-  ],
-}
diff -pruN 0.11.4-1/.github/workflows/audit.yml 0.11.5-1/.github/workflows/audit.yml
--- 0.11.4-1/.github/workflows/audit.yml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.github/workflows/audit.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,53 +0,0 @@
-name: Security audit
-
-permissions:
-  contents: read
-
-on:
-  pull_request:
-    paths:
-      - '**/Cargo.toml'
-      - '**/Cargo.lock'
-  push:
-    branches:
-    - master
-
-env:
-  RUST_BACKTRACE: 1
-  CARGO_TERM_COLOR: always
-  CLICOLOR: 1
-
-concurrency:
-  group: "${{ github.workflow }}-${{ github.ref }}"
-  cancel-in-progress: true
-
-jobs:
-  security_audit:
-    permissions:
-      issues: write # to create issues (actions-rs/audit-check)
-      checks: write # to create check (actions-rs/audit-check)
-    runs-on: ubuntu-latest
-    # Prevent sudden announcement of a new advisory from failing ci:
-    continue-on-error: true
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-    - uses: actions-rs/audit-check@v1
-      with:
-        token: ${{ secrets.GITHUB_TOKEN }}
-
-  cargo_deny:
-    permissions:
-      issues: write # to create issues (actions-rs/audit-check)
-      checks: write # to create check (actions-rs/audit-check)
-    runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        checks:
-          - bans licenses sources
-    steps:
-    - uses: actions/checkout@v4
-    - uses: EmbarkStudios/cargo-deny-action@v1
-      with:
-        command: check ${{ matrix.checks }}
-        rust-version: stable
diff -pruN 0.11.4-1/.github/workflows/ci.yml 0.11.5-1/.github/workflows/ci.yml
--- 0.11.4-1/.github/workflows/ci.yml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.github/workflows/ci.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,140 +0,0 @@
-name: CI
-
-permissions:
-  contents: read
-
-on:
-  pull_request:
-  push:
-    branches:
-    - master
-
-env:
-  RUST_BACKTRACE: 1
-  CARGO_TERM_COLOR: always
-  CLICOLOR: 1
-
-concurrency:
-  group: "${{ github.workflow }}-${{ github.ref }}"
-  cancel-in-progress: true
-
-jobs:
-  ci:
-    permissions:
-      contents: none
-    name: CI
-    needs: [test, msrv, lockfile, docs, rustfmt, clippy]
-    runs-on: ubuntu-latest
-    if: "always()"
-    steps:
-      - name: Failed
-        run: exit 1
-        if: "contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped')"
-  test:
-    name: Test
-    strategy:
-      matrix:
-        os: ["ubuntu-latest", "windows-latest", "macos-14"]
-        rust: ["stable"]
-    continue-on-error: ${{ matrix.rust != 'stable' }}
-    runs-on: ${{ matrix.os }}
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-    - name: Install Rust
-      uses: dtolnay/rust-toolchain@stable
-      with:
-        toolchain: ${{ matrix.rust }}
-    - uses: Swatinem/rust-cache@v2
-    - uses: taiki-e/install-action@cargo-hack
-    - name: Build
-      run: cargo test --workspace --no-run
-    - name: Test
-      run: cargo hack test --feature-powerset --workspace
-  msrv:
-    name: "Check MSRV"
-    runs-on: ubuntu-latest
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-    - name: Install Rust
-      uses: dtolnay/rust-toolchain@stable
-      with:
-        toolchain: stable
-    - uses: Swatinem/rust-cache@v2
-    - uses: taiki-e/install-action@cargo-hack
-    - name: Default features
-      run: cargo hack check --feature-powerset --locked --rust-version --ignore-private --workspace --all-targets
-  lockfile:
-    runs-on: ubuntu-latest
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-    - name: Install Rust
-      uses: dtolnay/rust-toolchain@stable
-      with:
-        toolchain: stable
-    - uses: Swatinem/rust-cache@v2
-    - name: "Is lockfile updated?"
-      run: cargo update --workspace --locked
-  docs:
-    name: Docs
-    runs-on: ubuntu-latest
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-    - name: Install Rust
-      uses: dtolnay/rust-toolchain@stable
-      with:
-        toolchain: "1.79"  # STABLE
-    - uses: Swatinem/rust-cache@v2
-    - name: Check documentation
-      env:
-        RUSTDOCFLAGS: -D warnings
-      run: cargo doc --workspace --all-features --no-deps --document-private-items
-  rustfmt:
-    name: rustfmt
-    runs-on: ubuntu-latest
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-    - name: Install Rust
-      uses: dtolnay/rust-toolchain@stable
-      with:
-        toolchain: "1.79"  # STABLE
-        components: rustfmt
-    - uses: Swatinem/rust-cache@v2
-    - name: Check formatting
-      run: cargo fmt --all -- --check
-  clippy:
-    name: clippy
-    runs-on: ubuntu-latest
-    permissions:
-      security-events: write # to upload sarif results
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-    - name: Install Rust
-      uses: dtolnay/rust-toolchain@stable
-      with:
-        toolchain: "1.79"  # STABLE
-        components: clippy
-    - uses: Swatinem/rust-cache@v2
-    - name: Install SARIF tools
-      run: cargo install clippy-sarif --locked
-    - name: Install SARIF tools
-      run: cargo install sarif-fmt --locked
-    - name: Check
-      run: >
-        cargo clippy --workspace --all-features --all-targets --message-format=json -- -D warnings --allow deprecated
-        | clippy-sarif
-        | tee clippy-results.sarif
-        | sarif-fmt
-      continue-on-error: true
-    - name: Upload
-      uses: github/codeql-action/upload-sarif@v3
-      with:
-        sarif_file: clippy-results.sarif
-        wait-for-processing: true
-    - name: Report status
-      run: cargo clippy --workspace --all-features --all-targets -- -D warnings --allow deprecated
diff -pruN 0.11.4-1/.github/workflows/committed.yml 0.11.5-1/.github/workflows/committed.yml
--- 0.11.4-1/.github/workflows/committed.yml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.github/workflows/committed.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,28 +0,0 @@
-# Not run as part of pre-commit checks because they don't handle sending the correct commit
-# range to `committed`
-name: Lint Commits
-on: [pull_request]
-
-permissions:
-  contents: read
-
-env:
-  RUST_BACKTRACE: 1
-  CARGO_TERM_COLOR: always
-  CLICOLOR: 1
-
-concurrency:
-  group: "${{ github.workflow }}-${{ github.ref }}"
-  cancel-in-progress: true
-
-jobs:
-  committed:
-    name: Lint Commits
-    runs-on: ubuntu-latest
-    steps:
-    - name: Checkout Actions Repository
-      uses: actions/checkout@v4
-      with:
-        fetch-depth: 0
-    - name: Lint Commits
-      uses: crate-ci/committed@master
diff -pruN 0.11.4-1/.github/workflows/pre-commit.yml 0.11.5-1/.github/workflows/pre-commit.yml
--- 0.11.4-1/.github/workflows/pre-commit.yml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.github/workflows/pre-commit.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,27 +0,0 @@
-name: pre-commit
-
-permissions: {} # none
-
-on:
-  pull_request:
-  push:
-    branches: [master]
-
-env:
-  RUST_BACKTRACE: 1
-  CARGO_TERM_COLOR: always
-  CLICOLOR: 1
-
-concurrency:
-  group: "${{ github.workflow }}-${{ github.ref }}"
-  cancel-in-progress: true
-
-jobs:
-  pre-commit:
-    permissions:
-      contents: read
-    runs-on: ubuntu-latest
-    steps:
-    - uses: actions/checkout@v4
-    - uses: actions/setup-python@v5
-    - uses: pre-commit/action@v3.0.1
diff -pruN 0.11.4-1/.github/workflows/rust-next.yml 0.11.5-1/.github/workflows/rust-next.yml
--- 0.11.4-1/.github/workflows/rust-next.yml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.github/workflows/rust-next.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,61 +0,0 @@
-name: rust-next
-
-permissions:
-  contents: read
-
-on:
-  schedule:
-  - cron: '1 1 1 * *'
-
-env:
-  RUST_BACKTRACE: 1
-  CARGO_TERM_COLOR: always
-  CLICOLOR: 1
-
-concurrency:
-  group: "${{ github.workflow }}-${{ github.ref }}"
-  cancel-in-progress: true
-
-jobs:
-  test:
-    name: Test
-    strategy:
-      matrix:
-        os: ["ubuntu-latest", "windows-latest", "macos-latest", "macos-14"]
-        rust: ["stable", "beta"]
-        include:
-        - os: ubuntu-latest
-          rust: "nightly"
-    continue-on-error: ${{ matrix.rust != 'stable' }}
-    runs-on: ${{ matrix.os }}
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-    - name: Install Rust
-      uses: dtolnay/rust-toolchain@stable
-      with:
-        toolchain: ${{ matrix.rust }}
-    - uses: Swatinem/rust-cache@v2
-    - uses: taiki-e/install-action@cargo-hack
-    - name: Build
-      run: cargo test --workspace --no-run
-    - name: Test
-      run: cargo hack test --feature-powerset --workspace
-  latest:
-    name: "Check latest dependencies"
-    runs-on: ubuntu-latest
-    steps:
-    - name: Checkout repository
-      uses: actions/checkout@v4
-    - name: Install Rust
-      uses: dtolnay/rust-toolchain@stable
-      with:
-        toolchain: stable
-    - uses: Swatinem/rust-cache@v2
-    - uses: taiki-e/install-action@cargo-hack
-    - name: Update dependencies
-      run: cargo update
-    - name: Build
-      run: cargo test --workspace --no-run
-    - name: Test
-      run: cargo hack test --feature-powerset --workspace
diff -pruN 0.11.4-1/.github/workflows/spelling.yml 0.11.5-1/.github/workflows/spelling.yml
--- 0.11.4-1/.github/workflows/spelling.yml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.github/workflows/spelling.yml	1970-01-01 00:00:00.000000000 +0000
@@ -1,25 +0,0 @@
-name: Spelling
-
-permissions:
-  contents: read
-
-on: [pull_request]
-
-env:
-  RUST_BACKTRACE: 1
-  CARGO_TERM_COLOR: always
-  CLICOLOR: 1
-
-concurrency:
-  group: "${{ github.workflow }}-${{ github.ref }}"
-  cancel-in-progress: true
-
-jobs:
-  spelling:
-    name: Spell Check with Typos
-    runs-on: ubuntu-latest
-    steps:
-    - name: Checkout Actions Repository
-      uses: actions/checkout@v4
-    - name: Spell Check Repo
-      uses: crate-ci/typos@master
diff -pruN 0.11.4-1/.gitignore 0.11.5-1/.gitignore
--- 0.11.4-1/.gitignore	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.gitignore	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-target
diff -pruN 0.11.4-1/.pre-commit-config.yaml 0.11.5-1/.pre-commit-config.yaml
--- 0.11.4-1/.pre-commit-config.yaml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/.pre-commit-config.yaml	1970-01-01 00:00:00.000000000 +0000
@@ -1,26 +0,0 @@
-repos:
-  - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.5.0
-    hooks:
-    - id: check-yaml
-      stages: [commit]
-    - id: check-json
-      stages: [commit]
-    - id: check-toml
-      stages: [commit]
-    - id: check-merge-conflict
-      stages: [commit]
-    - id: check-case-conflict
-      stages: [commit]
-    - id: detect-private-key
-      stages: [commit]
-  - repo: https://github.com/crate-ci/typos
-    rev: v1.16.20
-    hooks:
-    - id: typos
-      stages: [commit]
-  - repo: https://github.com/crate-ci/committed
-    rev: v1.0.20
-    hooks:
-    - id: committed
-      stages: [commit-msg]
diff -pruN 0.11.4-1/CHANGELOG.md 0.11.5-1/CHANGELOG.md
--- 0.11.4-1/CHANGELOG.md	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/CHANGELOG.md	1970-01-01 00:00:00.000000000 +0000
@@ -1,164 +0,0 @@
-# Change Log
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/)
-and this project adheres to [Semantic Versioning](http://semver.org/).
-
-<!-- next-header -->
-## [Unreleased] - ReleaseDate
-
-## [0.11.4] - 2024-06-15
-
-### Fixes
-
-- Annotations for `\r\n` are now correctly handled [#131](https://github.com/rust-lang/annotate-snippets-rs/pull/131)
-
-## [0.11.3] - 2024-06-06
-
-### Fixes
-
-- Dropped MSRV to 1.65
-
-## [0.11.2] - 2024-04-27
-
-### Added
-
-- All public types now implement `Debug` [#119](https://github.com/rust-lang/annotate-snippets-rs/pull/119)
-
-## [0.11.1] - 2024-03-21
-
-### Fixes
-
-- Switch `fold` to use rustc's logic: always show first and last line of folded section and detect if its worth folding
-- When `fold`ing the start of a `source`, don't show anything, like we do for the end of the `source`
-- Render an underline for an empty span on `Annotation`s
-
-## [0.11.0] - 2024-03-15
-
-### Breaking Changes
-
-- Switched from char spans to byte spans [#90](https://github.com/rust-lang/annotate-snippets-rs/pull/90/commits/b65b8cabcd34da9fed88490a7a1cd8085777706a)
-- Renamed `AnnotationType` to `Level` [#94](https://github.com/rust-lang/annotate-snippets-rs/pull/94/commits/b49f9471d920c7f561fa61970039b0ba44e448ac)
-- Renamed `SourceAnnotation` to `Annotation` [#94](https://github.com/rust-lang/annotate-snippets-rs/pull/94/commits/bbf9c5fe27e83652433151cbfc7d6cafc02a8c47)
-- Renamed `Snippet` to `Message` [#94](https://github.com/rust-lang/annotate-snippets-rs/pull/94/commits/105da760b6e1bd4cfce4c642ac679ecf6011f511)
-- Renamed `Slice` to `Snippet` [#94](https://github.com/rust-lang/annotate-snippets-rs/pull/94/commits/1c18950300cf8b93d92d89e9797ed0bae02c0a37)
-- `Message`, `Snippet`, `Annotation` and `Level` can only be built with a builder pattern [#91](https://github.com/rust-lang/annotate-snippets-rs/pull/91) and [#94](https://github.com/rust-lang/annotate-snippets-rs/pull/94)
-- `Annotation` labels are now optional [#94](https://github.com/rust-lang/annotate-snippets-rs/pull/94/commits/c821084068a1acd2688b6c8d0b3423e143d359e2)
-- `Annotation` now takes in `Range<usize>` instead of `(usize, usize)` [#90](https://github.com/rust-lang/annotate-snippets-rs/pull/90/commits/c3bd0c3a63f983f5f2b4793a099972b1f6e97a9f)
-- `Margin` is now an internal detail, only `term_width` is exposed [#105](https://github.com/rust-lang/annotate-snippets-rs/pull/105)
-- `footer` was generalized to be a `Message` [#98](https://github.com/rust-lang/annotate-snippets-rs/pull/98)
-
-### Added
-- `term_width` was added to `Renderer` to control the rendering width [#105](https://github.com/rust-lang/annotate-snippets-rs/pull/105)
-  - defaults to 140 when not set
-
-### Fixed
-- `Margin`s are now calculated per `Snippet`, rather than for the entire `Message` [#105](https://github.com/rust-lang/annotate-snippets-rs/pull/105)
-- `Annotation`s can be created without labels
-
-### Features
-- `footer` was expanded to allow annotating sources by accepting `Message` [#98](https://github.com/rust-lang/annotate-snippets-rs/pull/98)
-
-## [0.10.2] - 2024-02-29
-
-### Added
-
-- Added `testing-colors` feature to remove platform-specific colors when testing
-  [#82](https://github.com/rust-lang/annotate-snippets-rs/pull/82)
-
-## [0.10.1] - 2024-01-04
-
-### Fixed
-
-- Match `rustc`'s colors [#73](https://github.com/rust-lang/annotate-snippets-rs/pull/73)
-- Allow highlighting one past the end of `source` [#74](https://github.com/rust-lang/annotate-snippets-rs/pull/74)
-
-### Compatibility
-
-- Set the minimum supported Rust version to `1.73.0` [#71](https://github.com/rust-lang/annotate-snippets-rs/pull/71)
-
-## [0.10.0] - December 12, 2023
-
-### Added
-
-- `Renderer` is now used for displaying a `Snippet` [#67](https://github.com/rust-lang/annotate-snippets-rs/pull/67/commits/9076cbf66336e5137b47dc7a52df2999b6c82598)
-  - `Renderer` also controls the color scheme and formatting of the snippet
-
-### Changed
-
-- Moved everything in the `snippet` to be in the crate root [#67](https://github.com/rust-lang/annotate-snippets-rs/pull/67/commits/a1007ddf2fc6f76e960a4fc01207228e64e9fae7)
-
-### Breaking Changes
-
-- `Renderer` now controls the color scheme and formatting of `Snippet`s [#67](https://github.com/rust-lang/annotate-snippets-rs/pull/67/commits/d0c65b26493d60f86a82c5919ef736b35808c23a)
-- Removed the `Style` and `Stylesheet` traits, as color is controlled by `Renderer` [#67](https://github.com/rust-lang/annotate-snippets-rs/pull/67/commits/4affdfb50ea0670d85e52737c082c03f89ae8ada)
-- Replaced [`yansi-term`](https://crates.io/crates/yansi-term) with [`anstyle`](https://crates.io/crates/anstyle) [#67](https://github.com/rust-lang/annotate-snippets-rs/pull/67/commits/dfd4e87d6f31ec50d29af26d7310cff5e66ca978)
-  - `anstyle` is designed primarily to exist in public APIs for interoperability 
-  - `anstyle` is re-exported under `annotate_snippets::renderer`
-- Removed the `color` feature in favor of `Renderer::plain()` [#67](https://github.com/rust-lang/annotate-snippets-rs/pull/67/commits/dfd4e87d6f31ec50d29af26d7310cff5e66ca978)
-- Moved `Margin` to `renderer` module [#67](https://github.com/rust-lang/annotate-snippets-rs/pull/67/commits/79f657ea252c3c0ce55fa69894ee520f8820b4bf)
-- Made the `display_list` module private [#67](https://github.com/rust-lang/annotate-snippets-rs/pull/67/commits/da45f4858af3ec4c0d792ecc40225e27fdd2bac8)
-
-### Compatibility
-
-- Changed the edition to `2021` [#61](https://github.com/rust-lang/annotate-snippets-rs/pull/61)
-- Set the minimum supported Rust version to `1.70.0` [#61](https://github.com/rust-lang/annotate-snippets-rs/pull/61)
-
-## [0.9.2] - October 30, 2023
-
-- Remove parsing of __ in title strings, fixes (#53)
-- Origin line number is not correct when using a slice with fold: true (#52)
-
-## [0.9.1] - September 4, 2021
-
-- Fix character split when strip code. (#37)
-- Fix off by one error in multiline highlighting. (#42)
-- Fix display of annotation for double width characters. (#46)
-
-## [0.9.0] - June 28, 2020
-
-- Add strip code to the left and right of long lines. (#36)
-
-## [0.8.0] - April 14, 2020
-
-- Replace `ansi_term` with `yansi-term` for improved performance. (#30)
-- Turn `Snippet` and `Slice` to work on borrowed slices, rather than Strings. (#32)
-- Fix `\r\n` end of lines. (#29)
-
-## [0.7.0] - March 30, 2020
-
-- Refactor API to use `fmt::Display` (#27)
-- Fix SourceAnnotation range (#27)
-- Fix column numbers (#22)
-- Derive `PartialEq` for `AnnotationType` (#19)
-- Update `ansi_term` to 0.12.
-
-## [0.6.1] - July 23, 2019
-
-- Fix too many anonymized line numbers (#5)
- 
-## [0.6.0] - June 26, 2019
- 
-- Add an option to anonymize line numbers (#3)
-- Transition the crate to rust-lang org.
-- Update the syntax to Rust 2018 idioms. (#4)
-
-<!-- next-url -->
-[Unreleased]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.11.4...HEAD
-[0.11.4]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.11.3...0.11.4
-[0.11.3]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.11.2...0.11.3
-[0.11.2]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.11.1...0.11.2
-[0.11.1]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.11.0...0.11.1
-[0.11.0]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.10.2...0.11.0
-[0.10.2]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.10.1...0.10.2
-[0.10.1]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.10.0...0.10.1
-[0.10.0]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.9.2...0.10.0
-[0.9.2]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.9.1...0.9.2
-[0.9.1]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.9.0...0.9.1
-[0.9.0]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.8.0...0.9.0
-[0.8.0]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.7.0...0.8.0
-[0.7.0]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.6.1...0.7.0
-[0.6.1]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.6.0...0.6.1
-[0.6.0]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.5.0...0.6.0
-[0.5.0]: https://github.com/rust-lang/annotate-snippets-rs/compare/0.1.0...0.5.0
-[0.1.0]: https://github.com/rust-lang/annotate-snippets-rs/compare/6015d08d7d10151c126c6a70c14f234c0c01b50e...0.1.0
diff -pruN 0.11.4-1/Cargo.lock 0.11.5-1/Cargo.lock
--- 0.11.4-1/Cargo.lock	1970-01-01 00:00:01.000000000 +0000
+++ 0.11.5-1/Cargo.lock	1970-01-01 00:00:01.000000000 +0000
@@ -12,25 +12,20 @@ dependencies = [
 ]
 
 [[package]]
-name = "anes"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
-
-[[package]]
 name = "annotate-snippets"
-version = "0.11.4"
+version = "0.11.5"
 dependencies = [
- "anstream 0.6.14",
+ "anstream 0.6.18",
  "anstyle",
- "criterion",
  "difference",
+ "divan",
  "glob",
+ "memchr",
  "serde",
  "snapbox",
  "toml",
  "tryfn",
- "unicode-width",
+ "unicode-width 0.2.0",
 ]
 
 [[package]]
@@ -50,14 +45,14 @@ dependencies = [
 
 [[package]]
 name = "anstream"
-version = "0.6.14"
+version = "0.6.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
 dependencies = [
  "anstyle",
  "anstyle-parse",
  "anstyle-query",
- "anstyle-wincon 3.0.3",
+ "anstyle-wincon 3.0.6",
  "colorchoice",
  "is_terminal_polyfill",
  "utf8parse",
@@ -102,11 +97,11 @@ version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bbbf0bf947d663010f0b4132f28ca08da9151f3b9035fa7578a38de521c1d1aa"
 dependencies = [
- "anstream 0.6.14",
+ "anstream 0.6.18",
  "anstyle",
  "anstyle-lossy",
  "html-escape",
- "unicode-width",
+ "unicode-width 0.1.13",
 ]
 
 [[package]]
@@ -121,19 +116,19 @@ dependencies = [
 
 [[package]]
 name = "anstyle-wincon"
-version = "3.0.3"
+version = "3.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
+checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
 dependencies = [
  "anstyle",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
-name = "autocfg"
-version = "1.3.0"
+name = "bitflags"
+version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bstr"
@@ -146,51 +141,12 @@ dependencies = [
 ]
 
 [[package]]
-name = "bumpalo"
-version = "3.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
-
-[[package]]
-name = "cast"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
-
-[[package]]
 name = "cfg-if"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
 [[package]]
-name = "ciborium"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
-dependencies = [
- "ciborium-io",
- "ciborium-ll",
- "serde",
-]
-
-[[package]]
-name = "ciborium-io"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
-
-[[package]]
-name = "ciborium-ll"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
-dependencies = [
- "ciborium-io",
- "half",
-]
-
-[[package]]
 name = "clap"
 version = "4.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -211,6 +167,7 @@ dependencies = [
  "anstyle",
  "clap_lex",
  "strsim",
+ "terminal_size",
 ]
 
 [[package]]
@@ -238,83 +195,57 @@ source = "registry+https://github.com/ru
 checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
 
 [[package]]
-name = "criterion"
-version = "0.5.1"
+name = "condtype"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
-dependencies = [
- "anes",
- "cast",
- "ciborium",
- "clap",
- "criterion-plot",
- "is-terminal",
- "itertools",
- "num-traits",
- "once_cell",
- "oorandom",
- "plotters",
- "rayon",
- "regex",
- "serde",
- "serde_derive",
- "serde_json",
- "tinytemplate",
- "walkdir",
-]
+checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af"
 
 [[package]]
-name = "criterion-plot"
-version = "0.5.0"
+name = "difference"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
-dependencies = [
- "cast",
- "itertools",
-]
+checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
 
 [[package]]
-name = "crossbeam-deque"
-version = "0.8.5"
+name = "divan"
+version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
+checksum = "ccc40f214f0d9e897cfc72e2edfa5c225d3252f758c537f11ac0a80371c073a6"
 dependencies = [
- "crossbeam-epoch",
- "crossbeam-utils",
+ "cfg-if",
+ "clap",
+ "condtype",
+ "divan-macros",
+ "libc",
+ "regex-lite",
 ]
 
 [[package]]
-name = "crossbeam-epoch"
-version = "0.9.18"
+name = "divan-macros"
+version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+checksum = "7bdb5411188f7f878a17964798c1264b6b0a9f915bd39b20bf99193c923e1b4e"
 dependencies = [
- "crossbeam-utils",
+ "proc-macro2",
+ "quote",
+ "syn",
 ]
 
 [[package]]
-name = "crossbeam-utils"
-version = "0.8.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
-
-[[package]]
-name = "crunchy"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
-
-[[package]]
-name = "difference"
-version = "2.0.0"
+name = "equivalent"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
 [[package]]
-name = "either"
-version = "1.12.0"
+name = "errno"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
 
 [[package]]
 name = "escape8259"
@@ -327,9 +258,9 @@ dependencies = [
 
 [[package]]
 name = "escargot"
-version = "0.5.11"
+version = "0.5.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "650eb5f6eeda986377996e9ed570cbc20cc16d30440696f82f129c863e4e3e83"
+checksum = "05a3ac187a16b5382fef8c69fd1bad123c67b7cf3932240a2d43dcdd32cded88"
 dependencies = [
  "log",
  "once_cell",
@@ -357,13 +288,10 @@ dependencies = [
 ]
 
 [[package]]
-name = "half"
-version = "2.2.1"
+name = "hashbrown"
+version = "0.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0"
-dependencies = [
- "crunchy",
-]
+checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
 
 [[package]]
 name = "heck"
@@ -404,6 +332,27 @@ dependencies = [
 ]
 
 [[package]]
+name = "indexmap"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
+dependencies = [
+ "equivalent",
+ "hashbrown",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
 name = "is-terminal"
 version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -424,30 +373,12 @@ dependencies = [
 ]
 
 [[package]]
-name = "itertools"
-version = "0.10.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
-dependencies = [
- "either",
-]
-
-[[package]]
 name = "itoa"
 version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
 
 [[package]]
-name = "js-sys"
-version = "0.3.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
-dependencies = [
- "wasm-bindgen",
-]
-
-[[package]]
 name = "lazy_static"
 version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -472,6 +403,12 @@ dependencies = [
 ]
 
 [[package]]
+name = "linux-raw-sys"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
+
+[[package]]
 name = "log"
 version = "0.4.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -479,9 +416,9 @@ checksum = "90ed8c1e510134f979dbc4f070f8
 
 [[package]]
 name = "memchr"
-version = "2.7.2"
+version = "2.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
 
 [[package]]
 name = "normalize-line-endings"
@@ -490,15 +427,6 @@ source = "registry+https://github.com/ru
 checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
 
 [[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
 name = "num_cpus"
 version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -515,12 +443,6 @@ source = "registry+https://github.com/ru
 checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
-name = "oorandom"
-version = "11.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
-
-[[package]]
 name = "os_pipe"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -531,34 +453,6 @@ dependencies = [
 ]
 
 [[package]]
-name = "plotters"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3"
-dependencies = [
- "num-traits",
- "plotters-backend",
- "plotters-svg",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "plotters-backend"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7"
-
-[[package]]
-name = "plotters-svg"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705"
-dependencies = [
- "plotters-backend",
-]
-
-[[package]]
 name = "proc-macro2"
 version = "1.0.85"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -577,26 +471,6 @@ dependencies = [
 ]
 
 [[package]]
-name = "rayon"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
-dependencies = [
- "either",
- "rayon-core",
-]
-
-[[package]]
-name = "rayon-core"
-version = "1.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
-dependencies = [
- "crossbeam-deque",
- "crossbeam-utils",
-]
-
-[[package]]
 name = "regex"
 version = "1.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -620,12 +494,32 @@ dependencies = [
 ]
 
 [[package]]
+name = "regex-lite"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a"
+
+[[package]]
 name = "regex-syntax"
 version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
 
 [[package]]
+name = "rustix"
+version = "0.37.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
 name = "rustversion"
 version = "1.0.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -648,18 +542,18 @@ dependencies = [
 
 [[package]]
 name = "serde"
-version = "1.0.203"
+version = "1.0.215"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
+checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.203"
+version = "1.0.215"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
+checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -678,6 +572,15 @@ dependencies = [
 ]
 
 [[package]]
+name = "serde_spanned"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
+dependencies = [
+ "serde",
+]
+
+[[package]]
 name = "similar"
 version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -685,11 +588,11 @@ checksum = "fa42c91313f1d05da9b26f267f93
 
 [[package]]
 name = "snapbox"
-version = "0.6.7"
+version = "0.6.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94204b12a4d3550420babdb4148c6639692e4e3e61060866929c5107f208aeb6"
+checksum = "1373ce406dfad473059bbc31d807715642182bbc952a811952b58d1c9e41dcfa"
 dependencies = [
- "anstream 0.6.14",
+ "anstream 0.6.18",
  "anstyle",
  "anstyle-svg",
  "escargot",
@@ -700,16 +603,16 @@ dependencies = [
  "similar",
  "snapbox-macros",
  "wait-timeout",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
 name = "snapbox-macros"
-version = "0.3.9"
+version = "0.3.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1f4c14672714436c09254801c934b203196a51182a5107fb76591c7cc56424d"
+checksum = "16569f53ca23a41bb6f62e0a5084aa1661f4814a67fa33696a79073e03a664af"
 dependencies = [
- "anstream 0.6.14",
+ "anstream 0.6.18",
 ]
 
 [[package]]
@@ -720,9 +623,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a
 
 [[package]]
 name = "syn"
-version = "2.0.66"
+version = "2.0.86"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
+checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -739,6 +642,16 @@ dependencies = [
 ]
 
 [[package]]
+name = "terminal_size"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237"
+dependencies = [
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
 name = "thread_local"
 version = "1.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -758,29 +671,44 @@ dependencies = [
 ]
 
 [[package]]
-name = "tinytemplate"
-version = "1.2.1"
+name = "toml"
+version = "0.8.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
 dependencies = [
  "serde",
- "serde_json",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit",
 ]
 
 [[package]]
-name = "toml"
-version = "0.5.11"
+name = "toml_datetime"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
 dependencies = [
  "serde",
 ]
 
 [[package]]
+name = "toml_edit"
+version = "0.22.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
 name = "tryfn"
-version = "0.2.1"
+version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "493e1390312bb94363f762687be32a1bd01c3333dfad25a5a7fffab1edc64839"
+checksum = "5fe242ee9e646acec9ab73a5c540e8543ed1b107f0ce42be831e0775d423c396"
 dependencies = [
  "ignore",
  "libtest-mimic",
@@ -800,6 +728,12 @@ source = "registry+https://github.com/ru
 checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
 
 [[package]]
+name = "unicode-width"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
+
+[[package]]
 name = "utf8-width"
 version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -831,70 +765,6 @@ dependencies = [
 ]
 
 [[package]]
-name = "wasm-bindgen"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
-dependencies = [
- "cfg-if",
- "wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
-dependencies = [
- "bumpalo",
- "log",
- "once_cell",
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
-
-[[package]]
-name = "web-sys"
-version = "0.3.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
 name = "winapi-util"
 version = "0.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -918,7 +788,16 @@ version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
 dependencies = [
- "windows-targets 0.52.5",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
 ]
 
 [[package]]
@@ -938,18 +817,18 @@ dependencies = [
 
 [[package]]
 name = "windows-targets"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
 dependencies = [
- "windows_aarch64_gnullvm 0.52.5",
- "windows_aarch64_msvc 0.52.5",
- "windows_i686_gnu 0.52.5",
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
  "windows_i686_gnullvm",
- "windows_i686_msvc 0.52.5",
- "windows_x86_64_gnu 0.52.5",
- "windows_x86_64_gnullvm 0.52.5",
- "windows_x86_64_msvc 0.52.5",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
 ]
 
 [[package]]
@@ -960,9 +839,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
 
 [[package]]
 name = "windows_aarch64_msvc"
@@ -972,9 +851,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
 
 [[package]]
 name = "windows_i686_gnu"
@@ -984,15 +863,15 @@ checksum = "a75915e7def60c94dcef72200b9a
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
 
 [[package]]
 name = "windows_i686_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
 
 [[package]]
 name = "windows_i686_msvc"
@@ -1002,9 +881,9 @@ checksum = "8f55c233f70c4b27f66c523580f7
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
 
 [[package]]
 name = "windows_x86_64_gnu"
@@ -1014,9 +893,9 @@ checksum = "53d40abd2583d23e4718fddf1ebe
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
@@ -1026,9 +905,9 @@ checksum = "0b7b52767868a23d5bab768e390d
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
 
 [[package]]
 name = "windows_x86_64_msvc"
@@ -1038,6 +917,15 @@ checksum = "ed94fce61571a4006852b7389a06
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.52.5"
+version = "0.52.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "winnow"
+version = "0.6.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
+dependencies = [
+ "memchr",
+]
diff -pruN 0.11.4-1/Cargo.toml 0.11.5-1/Cargo.toml
--- 0.11.4-1/Cargo.toml	1970-01-01 00:00:01.000000000 +0000
+++ 0.11.5-1/Cargo.toml	1970-01-01 00:00:01.000000000 +0000
@@ -11,11 +11,21 @@
 
 [package]
 edition = "2021"
-rust-version = "1.65"
+rust-version = "1.66.0"
 name = "annotate-snippets"
-version = "0.11.4"
-authors = ["Zibi Braniecki <gandalf@mozilla.com>"]
+version = "0.11.5"
 build = false
+include = [
+    "build.rs",
+    "src/**/*",
+    "Cargo.toml",
+    "Cargo.lock",
+    "LICENSE*",
+    "README.md",
+    "benches/**/*",
+    "examples/**/*",
+]
+autolib = false
 autobins = false
 autoexamples = false
 autotests = false
@@ -29,9 +39,18 @@ keywords = [
     "errors",
     "debug",
 ]
-license = "Apache-2.0/MIT"
+categories = []
+license = "MIT OR Apache-2.0"
 repository = "https://github.com/rust-lang/annotate-snippets-rs"
 
+[package.metadata.docs.rs]
+all-features = true
+rustdoc-args = [
+    "--cfg",
+    "docsrs",
+    "--generate-link-to-definition",
+]
+
 [package.metadata.release]
 tag-name = "{{version}}"
 
@@ -90,39 +109,30 @@ path = "examples/format.rs"
 name = "multislice"
 path = "examples/multislice.rs"
 
-[[test]]
-name = "examples"
-path = "tests/examples.rs"
-
-[[test]]
-name = "fixtures"
-path = "tests/fixtures/main.rs"
-harness = false
-
-[[test]]
-name = "formatter"
-path = "tests/formatter.rs"
-
 [[bench]]
-name = "simple"
-path = "benches/simple.rs"
+name = "bench"
+path = "benches/bench.rs"
 harness = false
 
 [dependencies.anstyle]
 version = "1.0.4"
 
+[dependencies.memchr]
+version = "2.7.4"
+optional = true
+
 [dependencies.unicode-width]
-version = "0.1.11"
+version = "0.2.0"
 
 [dev-dependencies.anstream]
 version = "0.6.13"
 
-[dev-dependencies.criterion]
-version = "0.5.1"
-
 [dev-dependencies.difference]
 version = "2.0.0"
 
+[dev-dependencies.divan]
+version = "0.1.14"
+
 [dev-dependencies.glob]
 version = "0.3.1"
 
@@ -140,13 +150,14 @@ features = [
 ]
 
 [dev-dependencies.toml]
-version = "0.5.11"
+version = "0.8.0"
 
 [dev-dependencies.tryfn]
 version = "0.2.1"
 
 [features]
 default = []
+simd = ["memchr"]
 testing-colors = []
 
 [badges.maintenance]
@@ -197,6 +208,7 @@ rc_mutex = "warn"
 redundant_feature_names = "warn"
 ref_option_ref = "warn"
 rest_pat_in_fully_bound_structs = "warn"
+result_large_err = "allow"
 same_functions_in_if_condition = "warn"
 self_named_module_files = "warn"
 semicolon_if_nothing_returned = "warn"
@@ -207,6 +219,7 @@ string_lit_as_bytes = "warn"
 string_to_string = "warn"
 todo = "warn"
 trait_duplication_in_bounds = "warn"
+uninlined_format_args = "warn"
 verbose_file_reads = "warn"
 wildcard_imports = "warn"
 zero_sized_map_values = "warn"
diff -pruN 0.11.4-1/Cargo.toml.orig 0.11.5-1/Cargo.toml.orig
--- 0.11.4-1/Cargo.toml.orig	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/Cargo.toml.orig	2006-07-24 01:21:28.000000000 +0000
@@ -1,55 +1,23 @@
-[package]
-name = "annotate-snippets"
-version = "0.11.4"
-edition = "2021"
-rust-version = "1.65"  # MSRV
-authors = ["Zibi Braniecki <gandalf@mozilla.com>"]
-description = "Library for building code annotations"
-license = "Apache-2.0/MIT"
-repository = "https://github.com/rust-lang/annotate-snippets-rs"
-readme = "README.md"
-keywords = ["code", "analysis", "ascii", "errors", "debug"]
+[workspace]
+resolver = "2"
 
-[package.metadata.release]
-tag-name = "{{version}}"
-pre-release-replacements = [
-  {file="CHANGELOG.md", search="Unreleased", replace="{{version}}", min=1},
-  {file="CHANGELOG.md", search="\\.\\.\\.HEAD", replace="...{{tag_name}}", exactly=1},
-  {file="CHANGELOG.md", search="ReleaseDate", replace="{{date}}", min=1},
-  {file="CHANGELOG.md", search="<!-- next-header -->", replace="<!-- next-header -->\n## [Unreleased] - ReleaseDate\n", exactly=1},
-  {file="CHANGELOG.md", search="<!-- next-url -->", replace="<!-- next-url -->\n[Unreleased]: https://github.com/rust-lang/annotate-snippets-rs/compare/{{tag_name}}...HEAD", exactly=1},
+[workspace.package]
+repository = "https://github.com/rust-lang/annotate-snippets-rs"
+license = "MIT OR Apache-2.0"
+edition = "2021"
+rust-version = "1.66.0"  # MSRV
+include = [
+  "build.rs",
+  "src/**/*",
+  "Cargo.toml",
+  "Cargo.lock",
+  "LICENSE*",
+  "README.md",
+  "benches/**/*",
+  "examples/**/*"
 ]
 
-[badges]
-maintenance = { status = "actively-developed" }
-
-[dependencies]
-anstyle = "1.0.4"
-unicode-width = "0.1.11"
-
-[dev-dependencies]
-anstream = "0.6.13"
-criterion = "0.5.1"
-difference = "2.0.0"
-glob = "0.3.1"
-serde = { version = "1.0.199", features = ["derive"] }
-snapbox = { version = "0.6.0", features = ["diff", "term-svg", "cmd", "examples"] }
-toml = "0.5.11"
-tryfn = "0.2.1"
-
-[[bench]]
-name = "simple"
-harness = false
-
-[[test]]
-name = "fixtures"
-harness = false
-
-[features]
-default = []
-testing-colors = []
-
-[lints.rust]
+[workspace.lints.rust]
 rust_2018_idioms = { level = "warn", priority = -1 }
 unreachable_pub = "warn"
 unsafe_op_in_unsafe_fn = "warn"
@@ -57,7 +25,7 @@ unused_lifetimes = "warn"
 unused_macro_rules = "warn"
 unused_qualifications = "warn"
 
-[lints.clippy]
+[workspace.lints.clippy]
 bool_assert_comparison = "allow"
 branches_sharing_code = "allow"
 checked_conversions = "warn"
@@ -102,6 +70,7 @@ rc_mutex = "warn"
 redundant_feature_names = "warn"
 ref_option_ref = "warn"
 rest_pat_in_fully_bound_structs = "warn"
+result_large_err = "allow"
 same_functions_in_if_condition = "warn"
 self_named_module_files = "warn"
 semicolon_if_nothing_returned = "warn"
@@ -112,6 +81,68 @@ string_lit_as_bytes = "warn"
 string_to_string = "warn"
 todo = "warn"
 trait_duplication_in_bounds = "warn"
+uninlined_format_args = "warn"
 verbose_file_reads = "warn"
 wildcard_imports = "warn"
 zero_sized_map_values = "warn"
+
+[package]
+name = "annotate-snippets"
+version = "0.11.5"
+description = "Library for building code annotations"
+categories = []
+keywords = ["code", "analysis", "ascii", "errors", "debug"]
+repository.workspace = true
+license.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+include.workspace = true
+
+[package.metadata.docs.rs]
+all-features = true
+rustdoc-args = ["--cfg", "docsrs", "--generate-link-to-definition"]
+
+[package.metadata.release]
+tag-name = "{{version}}"
+pre-release-replacements = [
+  {file="CHANGELOG.md", search="Unreleased", replace="{{version}}", min=1},
+  {file="CHANGELOG.md", search="\\.\\.\\.HEAD", replace="...{{tag_name}}", exactly=1},
+  {file="CHANGELOG.md", search="ReleaseDate", replace="{{date}}", min=1},
+  {file="CHANGELOG.md", search="<!-- next-header -->", replace="<!-- next-header -->\n## [Unreleased] - ReleaseDate\n", exactly=1},
+  {file="CHANGELOG.md", search="<!-- next-url -->", replace="<!-- next-url -->\n[Unreleased]: https://github.com/rust-lang/annotate-snippets-rs/compare/{{tag_name}}...HEAD", exactly=1},
+]
+
+[badges]
+maintenance = { status = "actively-developed" }
+
+[dependencies]
+anstyle = "1.0.4"
+memchr = { version = "2.7.4", optional = true }
+unicode-width = "0.2.0"
+
+[dev-dependencies]
+annotate-snippets = { path = ".", features = ["testing-colors"] }
+anstream = "0.6.13"
+difference = "2.0.0"
+divan = "0.1.14"
+glob = "0.3.1"
+serde = { version = "1.0.199", features = ["derive"] }
+snapbox = { version = "0.6.0", features = ["diff", "term-svg", "cmd", "examples"] }
+toml = "0.8.0"
+tryfn = "0.2.1"
+
+[[bench]]
+name = "bench"
+harness = false
+
+[[test]]
+name = "fixtures"
+harness = false
+
+[features]
+default = []
+simd = ["memchr"]
+testing-colors = []
+
+[lints]
+workspace = true
diff -pruN 0.11.4-1/LICENSE-APACHE 0.11.5-1/LICENSE-APACHE
--- 0.11.4-1/LICENSE-APACHE	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/LICENSE-APACHE	2006-07-24 01:21:28.000000000 +0000
@@ -178,7 +178,7 @@
    APPENDIX: How to apply the Apache License to your work.
 
       To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
+      boilerplate notice, with the fields enclosed by brackets "{}"
       replaced with your own identifying information. (Don't include
       the brackets!)  The text should be enclosed in the appropriate
       comment syntax for the file format. We also recommend that a
@@ -186,7 +186,7 @@
       same "printed page" as the copyright notice for easier
       identification within third-party archives.
 
-   Copyright [yyyy] [name of copyright owner]
+   Copyright {yyyy} {name of copyright owner}
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
@@ -199,3 +199,4 @@
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
+
diff -pruN 0.11.4-1/LICENSE-MIT 0.11.5-1/LICENSE-MIT
--- 0.11.4-1/LICENSE-MIT	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/LICENSE-MIT	2006-07-24 01:21:28.000000000 +0000
@@ -1,11 +1,11 @@
-Copyright 2017 Mozilla
+Copyright (c) Individual contributors
 
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
 
 The above copyright notice and this permission notice shall be included in all
 copies or substantial portions of the Software.
diff -pruN 0.11.4-1/benches/bench.rs 0.11.5-1/benches/bench.rs
--- 0.11.4-1/benches/bench.rs	1970-01-01 00:00:00.000000000 +0000
+++ 0.11.5-1/benches/bench.rs	2006-07-24 01:21:28.000000000 +0000
@@ -0,0 +1,89 @@
+use annotate_snippets::{Level, Renderer, Snippet};
+
+#[divan::bench]
+fn simple() -> String {
+    let source = r#") -> Option<String> {
+    for ann in annotations {
+        match (ann.range.0, ann.range.1) {
+            (None, None) => continue,
+            (Some(start), Some(end)) if start > end_index => continue,
+            (Some(start), Some(end)) if start >= start_index => {
+                let label = if let Some(ref label) = ann.label {
+                    format!(" {}", label)
+                } else {
+                    String::from("")
+                };
+
+                return Some(format!(
+                    "{}{}{}",
+                    " ".repeat(start - start_index),
+                    "^".repeat(end - start),
+                    label
+                ));
+            }
+            _ => continue,
+        }
+    }"#;
+    let message = Level::Error.title("mismatched types").id("E0308").snippet(
+        Snippet::source(source)
+            .line_start(51)
+            .origin("src/format.rs")
+            .annotation(
+                Level::Warning
+                    .span(5..19)
+                    .label("expected `Option<String>` because of return type"),
+            )
+            .annotation(
+                Level::Error
+                    .span(26..724)
+                    .label("expected enum `std::option::Option`"),
+            ),
+    );
+
+    let renderer = Renderer::plain();
+    let rendered = renderer.render(message).to_string();
+    rendered
+}
+
+#[divan::bench(args=[0, 1, 10, 100, 1_000, 10_000, 100_000])]
+fn fold(bencher: divan::Bencher<'_, '_>, context: usize) {
+    bencher
+        .with_inputs(|| {
+            let line = "012345678901234567890123456789";
+            let mut input = String::new();
+            for _ in 1..=context {
+                input.push_str(line);
+                input.push('\n');
+            }
+            let span_start = input.len() + line.len();
+            let span = span_start..span_start;
+
+            input.push_str(line);
+            input.push('\n');
+            for _ in 1..=context {
+                input.push_str(line);
+                input.push('\n');
+            }
+            (input, span)
+        })
+        .bench_values(|(input, span)| {
+            let message = Level::Error.title("mismatched types").id("E0308").snippet(
+                Snippet::source(&input)
+                    .fold(true)
+                    .origin("src/format.rs")
+                    .annotation(
+                        Level::Warning
+                            .span(span)
+                            .label("expected `Option<String>` because of return type"),
+                    ),
+            );
+
+            let renderer = Renderer::plain();
+            let rendered = renderer.render(message).to_string();
+            rendered
+        });
+}
+
+fn main() {
+    divan::main();
+}
diff -pruN 0.11.4-1/benches/simple.rs 0.11.5-1/benches/simple.rs
--- 0.11.4-1/benches/simple.rs	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/benches/simple.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,58 +0,0 @@
-#![allow(clippy::unit_arg)]
-#[macro_use]
-extern crate criterion;
-
-use criterion::{black_box, Criterion};
-
-use annotate_snippets::{Level, Renderer, Snippet};
-
-fn create_snippet(renderer: Renderer) {
-    let source = r#") -> Option<String> {
-    for ann in annotations {
-        match (ann.range.0, ann.range.1) {
-            (None, None) => continue,
-            (Some(start), Some(end)) if start > end_index => continue,
-            (Some(start), Some(end)) if start >= start_index => {
-                let label = if let Some(ref label) = ann.label {
-                    format!(" {}", label)
-                } else {
-                    String::from("")
-                };
-
-                return Some(format!(
-                    "{}{}{}",
-                    " ".repeat(start - start_index),
-                    "^".repeat(end - start),
-                    label
-                ));
-            }
-            _ => continue,
-        }
-    }"#;
-    let message = Level::Error.title("mismatched types").id("E0308").snippet(
-        Snippet::source(source)
-            .line_start(51)
-            .origin("src/format.rs")
-            .annotation(
-                Level::Warning
-                    .span(5..19)
-                    .label("expected `Option<String>` because of return type"),
-            )
-            .annotation(
-                Level::Error
-                    .span(26..724)
-                    .label("expected enum `std::option::Option`"),
-            ),
-    );
-
-    let _result = renderer.render(message).to_string();
-}
-
-pub fn criterion_benchmark(c: &mut Criterion) {
-    c.bench_function("format", |b| {
-        b.iter(|| black_box(create_snippet(Renderer::plain())));
-    });
-}
-
-criterion_group!(benches, criterion_benchmark);
-criterion_main!(benches);
diff -pruN 0.11.4-1/committed.toml 0.11.5-1/committed.toml
--- 0.11.4-1/committed.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/committed.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-style="conventional"
-ignore_author_re="(dependabot|renovate)"
-merge_commit = false
diff -pruN 0.11.4-1/debian/changelog 0.11.5-1/debian/changelog
--- 0.11.4-1/debian/changelog	2024-10-02 00:11:37.000000000 +0000
+++ 0.11.5-1/debian/changelog	2025-09-20 03:55:09.000000000 +0000
@@ -1,3 +1,12 @@
+rust-annotate-snippets (0.11.5-1) unstable; urgency=medium
+
+  * Team upload.
+  * Package annotate-snippets 0.11.5 from crates.io using debcargo 2.7.8
+  * Update patches for new upstream.
+  * Add patch to eliminate dev-dependency on divan.
+
+ -- Peter Michael Green <plugwash@debian.org>  Sat, 20 Sep 2025 03:55:09 +0000
+
 rust-annotate-snippets (0.11.4-1) unstable; urgency=medium
 
   * Team upload.
diff -pruN 0.11.4-1/debian/control 0.11.5-1/debian/control
--- 0.11.4-1/debian/control	2024-10-02 00:11:37.000000000 +0000
+++ 0.11.5-1/debian/control	2025-09-20 03:55:09.000000000 +0000
@@ -2,18 +2,19 @@ Source: rust-annotate-snippets
 Section: rust
 Priority: optional
 Build-Depends: debhelper-compat (= 13),
- dh-cargo (>= 25),
- cargo:native <!nocheck>,
- rustc:native (>= 1.65) <!nocheck>,
+ dh-sequence-cargo
+Build-Depends-Arch: cargo:native <!nocheck>,
+ rustc:native (>= 1.66.0) <!nocheck>,
  libstd-rust-dev <!nocheck>,
  librust-anstyle-1+default-dev (>= 1.0.4-~~) <!nocheck>,
- librust-unicode-width-0.1+default-dev (>= 0.1.11-~~) <!nocheck>
+ librust-unicode-width-0.2+default-dev <!nocheck>
 Maintainer: Debian Rust Maintainers <pkg-rust-maintainers@alioth-lists.debian.net>
 Uploaders:
  Jelmer Vernooĳ <jelmer@debian.org>
 Standards-Version: 4.7.0
 Vcs-Git: https://salsa.debian.org/rust-team/debcargo-conf.git [src/annotate-snippets]
 Vcs-Browser: https://salsa.debian.org/rust-team/debcargo-conf/tree/master/src/annotate-snippets
+Homepage: https://github.com/rust-lang/annotate-snippets-rs
 X-Cargo-Crate: annotate-snippets
 Rules-Requires-Root: no
 
@@ -23,18 +24,27 @@ Multi-Arch: same
 Depends:
  ${misc:Depends},
  librust-anstyle-1+default-dev (>= 1.0.4-~~),
- librust-unicode-width-0.1+default-dev (>= 0.1.11-~~)
+ librust-memchr-2+default-dev (>= 2.7.4-~~),
+ librust-unicode-width-0.2+default-dev
 Provides:
  librust-annotate-snippets+default-dev (= ${binary:Version}),
+ librust-annotate-snippets+memchr-dev (= ${binary:Version}),
+ librust-annotate-snippets+simd-dev (= ${binary:Version}),
  librust-annotate-snippets+testing-colors-dev (= ${binary:Version}),
  librust-annotate-snippets-0-dev (= ${binary:Version}),
  librust-annotate-snippets-0+default-dev (= ${binary:Version}),
+ librust-annotate-snippets-0+memchr-dev (= ${binary:Version}),
+ librust-annotate-snippets-0+simd-dev (= ${binary:Version}),
  librust-annotate-snippets-0+testing-colors-dev (= ${binary:Version}),
  librust-annotate-snippets-0.11-dev (= ${binary:Version}),
  librust-annotate-snippets-0.11+default-dev (= ${binary:Version}),
+ librust-annotate-snippets-0.11+memchr-dev (= ${binary:Version}),
+ librust-annotate-snippets-0.11+simd-dev (= ${binary:Version}),
  librust-annotate-snippets-0.11+testing-colors-dev (= ${binary:Version}),
- librust-annotate-snippets-0.11.4-dev (= ${binary:Version}),
- librust-annotate-snippets-0.11.4+default-dev (= ${binary:Version}),
- librust-annotate-snippets-0.11.4+testing-colors-dev (= ${binary:Version})
+ librust-annotate-snippets-0.11.5-dev (= ${binary:Version}),
+ librust-annotate-snippets-0.11.5+default-dev (= ${binary:Version}),
+ librust-annotate-snippets-0.11.5+memchr-dev (= ${binary:Version}),
+ librust-annotate-snippets-0.11.5+simd-dev (= ${binary:Version}),
+ librust-annotate-snippets-0.11.5+testing-colors-dev (= ${binary:Version})
 Description: Building code annotations - Rust source code
  Source code for Debianized Rust crate "annotate-snippets"
diff -pruN 0.11.4-1/debian/copyright.debcargo.hint 0.11.5-1/debian/copyright.debcargo.hint
--- 0.11.4-1/debian/copyright.debcargo.hint	2024-10-02 00:11:37.000000000 +0000
+++ 0.11.5-1/debian/copyright.debcargo.hint	2025-09-20 03:55:09.000000000 +0000
@@ -1,29 +1,22 @@
 Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 Upstream-Name: annotate-snippets
-Upstream-Contact: Zibi Braniecki <gandalf@mozilla.com>
+Upstream-Contact: FIXME (overlay) UNKNOWN-AUTHORS
 Source: https://github.com/rust-lang/annotate-snippets-rs
 
 Files: *
-Copyright: FIXME (overlay) UNKNOWN-YEARS Zibi Braniecki <gandalf@mozilla.com>
-License: Apache-2.0 or MIT
+Copyright: FIXME (overlay) UNKNOWN-AUTHORS FIXME (overlay) UNKNOWN-YEARS
+License: MIT or Apache-2.0
 Comment:
  FIXME (overlay): Since upstream copyright years are not available in
  Cargo.toml, they were extracted from the upstream Git repository. This may not
  be correct information so you should review and fix this before uploading to
  the archive.
 
-Files: LICENSE-MIT
-Copyright: 2017 Mozilla
-License: UNKNOWN-LICENSE; FIXME (overlay)
-Comment:
- FIXME (overlay): These notices are extracted from files. Please review them
- before uploading to the archive.
-
 Files: debian/*
 Copyright:
- 2023-2024 Debian Rust Maintainers <pkg-rust-maintainers@alioth-lists.debian.net>
- 2023-2024 Jelmer Vernooĳ <jelmer@debian.org>
-License: Apache-2.0 or MIT
+ 2023-2025 Debian Rust Maintainers <pkg-rust-maintainers@alioth-lists.debian.net>
+ 2023-2025 Jelmer Vernooĳ <jelmer@debian.org>
+License: MIT or Apache-2.0
 
 License: Apache-2.0
  Debian systems provide the Apache 2.0 license in
diff -pruN 0.11.4-1/debian/patches/drop-divan.patch 0.11.5-1/debian/patches/drop-divan.patch
--- 0.11.4-1/debian/patches/drop-divan.patch	1970-01-01 00:00:00.000000000 +0000
+++ 0.11.5-1/debian/patches/drop-divan.patch	2025-09-20 03:55:09.000000000 +0000
@@ -0,0 +1,26 @@
+Index: annotate-snippets/Cargo.toml
+===================================================================
+--- annotate-snippets.orig/Cargo.toml
++++ annotate-snippets/Cargo.toml
+@@ -109,11 +109,6 @@ path = "examples/format.rs"
+ name = "multislice"
+ path = "examples/multislice.rs"
+ 
+-[[bench]]
+-name = "bench"
+-path = "benches/bench.rs"
+-harness = false
+-
+ [dependencies.anstyle]
+ version = "1.0.4"
+ 
+@@ -130,9 +125,6 @@ version = "0.6.13"
+ [dev-dependencies.difference]
+ version = "2.0.0"
+ 
+-[dev-dependencies.divan]
+-version = "0.1.14"
+-
+ [dev-dependencies.glob]
+ version = "0.3.1"
+ 
diff -pruN 0.11.4-1/debian/patches/drop-snapbox.patch 0.11.5-1/debian/patches/drop-snapbox.patch
--- 0.11.4-1/debian/patches/drop-snapbox.patch	2024-10-02 00:11:37.000000000 +0000
+++ 0.11.5-1/debian/patches/drop-snapbox.patch	2025-09-20 03:55:09.000000000 +0000
@@ -1,25 +1,6 @@
-Index: annotate-snippets/Cargo.toml
-===================================================================
 --- annotate-snippets.orig/Cargo.toml
 +++ annotate-snippets/Cargo.toml
-@@ -90,14 +90,6 @@ path = "examples/format.rs"
- name = "multislice"
- path = "examples/multislice.rs"
- 
--[[test]]
--name = "examples"
--path = "tests/examples.rs"
--
--[[test]]
--name = "formatter"
--path = "tests/formatter.rs"
--
- [[bench]]
- name = "simple"
- path = "benches/simple.rs"
-@@ -125,15 +117,6 @@ version = "0.3.1"
- version = "1.0.199"
- features = ["derive"]
+@@ -127,11 +119,2 @@
  
 -[dev-dependencies.snapbox]
 -version = "0.6.0"
@@ -31,5 +12,3 @@ Index: annotate-snippets/Cargo.toml
 -]
 -
  [dev-dependencies.toml]
- version = "0.5.11"
- 
diff -pruN 0.11.4-1/debian/patches/drop-tryfn.patch 0.11.5-1/debian/patches/drop-tryfn.patch
--- 0.11.4-1/debian/patches/drop-tryfn.patch	2024-10-02 00:11:37.000000000 +0000
+++ 0.11.5-1/debian/patches/drop-tryfn.patch	2025-09-20 03:55:09.000000000 +0000
@@ -1,26 +1,8 @@
-Index: annotate-snippets/Cargo.toml
-===================================================================
 --- annotate-snippets.orig/Cargo.toml
 +++ annotate-snippets/Cargo.toml
-@@ -95,11 +95,6 @@ name = "examples"
- path = "tests/examples.rs"
- 
- [[test]]
--name = "fixtures"
--path = "tests/fixtures/main.rs"
--harness = false
--
--[[test]]
- name = "formatter"
- path = "tests/formatter.rs"
- 
-@@ -142,9 +137,6 @@ features = [
- [dev-dependencies.toml]
- version = "0.5.11"
+@@ -144,5 +139,2 @@
  
 -[dev-dependencies.tryfn]
 -version = "0.2.1"
 -
  [features]
- default = []
- testing-colors = []
diff -pruN 0.11.4-1/debian/patches/series 0.11.5-1/debian/patches/series
--- 0.11.4-1/debian/patches/series	2024-10-02 00:11:37.000000000 +0000
+++ 0.11.5-1/debian/patches/series	2025-09-20 03:55:09.000000000 +0000
@@ -1,2 +1,3 @@
 drop-tryfn.patch
 drop-snapbox.patch
+drop-divan.patch
diff -pruN 0.11.4-1/debian/tests/control 0.11.5-1/debian/tests/control
--- 0.11.4-1/debian/tests/control	2024-10-02 00:11:37.000000000 +0000
+++ 0.11.5-1/debian/tests/control	2025-09-20 03:55:09.000000000 +0000
@@ -1,19 +1,29 @@
-Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.4 --all-targets --all-features
+Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.5 --all-targets --all-features
 Features: test-name=rust-annotate-snippets:@
-Depends: dh-cargo (>= 31), rustc:native (>= 1.65), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-criterion-0.5+default-dev (>= 0.5.1-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.5+default-dev (>= 0.5.11-~~), @
+Depends: dh-cargo (>= 31), rustc (>= 1.66.0), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.8+default-dev, @
 Restrictions: allow-stderr, skip-not-installable
 
-Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.4 --all-targets
+Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.5 --all-targets
 Features: test-name=librust-annotate-snippets-dev:default
-Depends: dh-cargo (>= 31), rustc:native (>= 1.65), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-criterion-0.5+default-dev (>= 0.5.1-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.5+default-dev (>= 0.5.11-~~), @
+Depends: dh-cargo (>= 31), rustc (>= 1.66.0), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.8+default-dev, @
 Restrictions: allow-stderr, skip-not-installable
 
-Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.4 --all-targets --no-default-features --features testing-colors
+Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.5 --all-targets --no-default-features --features memchr
+Features: test-name=librust-annotate-snippets-dev:memchr
+Depends: dh-cargo (>= 31), rustc (>= 1.66.0), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.8+default-dev, @
+Restrictions: allow-stderr, skip-not-installable
+
+Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.5 --all-targets --no-default-features --features simd
+Features: test-name=librust-annotate-snippets-dev:simd
+Depends: dh-cargo (>= 31), rustc (>= 1.66.0), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.8+default-dev, @
+Restrictions: allow-stderr, skip-not-installable
+
+Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.5 --all-targets --no-default-features --features testing-colors
 Features: test-name=librust-annotate-snippets-dev:testing-colors
-Depends: dh-cargo (>= 31), rustc:native (>= 1.65), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-criterion-0.5+default-dev (>= 0.5.1-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.5+default-dev (>= 0.5.11-~~), @
+Depends: dh-cargo (>= 31), rustc (>= 1.66.0), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.8+default-dev, @
 Restrictions: allow-stderr, skip-not-installable
 
-Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.4 --all-targets --no-default-features
+Test-Command: /usr/share/cargo/bin/cargo-auto-test annotate-snippets 0.11.5 --all-targets --no-default-features
 Features: test-name=librust-annotate-snippets-dev:
-Depends: dh-cargo (>= 31), rustc:native (>= 1.65), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-criterion-0.5+default-dev (>= 0.5.1-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.5+default-dev (>= 0.5.11-~~), @
+Depends: dh-cargo (>= 31), rustc (>= 1.66.0), librust-anstream-0.6+default-dev (>= 0.6.13-~~), librust-difference-2+default-dev, librust-glob-0.3+default-dev (>= 0.3.1-~~), librust-serde-1+default-dev (>= 1.0.199-~~), librust-serde-1+derive-dev (>= 1.0.199-~~), librust-toml-0.8+default-dev, @
 Restrictions: allow-stderr, skip-not-installable
diff -pruN 0.11.4-1/debian/watch 0.11.5-1/debian/watch
--- 0.11.4-1/debian/watch	2024-10-02 00:11:37.000000000 +0000
+++ 0.11.5-1/debian/watch	2025-09-20 03:55:09.000000000 +0000
@@ -1,4 +1,4 @@
 version=4
 opts=filenamemangle=s/.*\/(.*)\/download/annotate-snippets-$1\.tar\.gz/g,\
-uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\d*)$/$1~$2/ \
+uversionmangle=s/(\d)[_\.\-\+]?((RC|rc|pre|dev|beta|alpha)\.?\d*)$/$1~$2/ \
 https://qa.debian.org/cgi-bin/fakeupstream.cgi?upstream=crates.io/annotate-snippets .*/crates/annotate-snippets/@ANY_VERSION@/download
diff -pruN 0.11.4-1/deny.toml 0.11.5-1/deny.toml
--- 0.11.4-1/deny.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/deny.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,236 +0,0 @@
-# Note that all fields that take a lint level have these possible values:
-# * deny - An error will be produced and the check will fail
-# * warn - A warning will be produced, but the check will not fail
-# * allow - No warning or error will be produced, though in some cases a note
-# will be
-
-# Root options
-
-# The graph table configures how the dependency graph is constructed and thus
-# which crates the checks are performed against
-[graph]
-# If 1 or more target triples (and optionally, target_features) are specified,
-# only the specified targets will be checked when running `cargo deny check`.
-# This means, if a particular package is only ever used as a target specific
-# dependency, such as, for example, the `nix` crate only being used via the
-# `target_family = "unix"` configuration, that only having windows targets in
-# this list would mean the nix crate, as well as any of its exclusive
-# dependencies not shared by any other crates, would be ignored, as the target
-# list here is effectively saying which targets you are building for.
-targets = [
-    # The triple can be any string, but only the target triples built in to
-    # rustc (as of 1.40) can be checked against actual config expressions
-    #"x86_64-unknown-linux-musl",
-    # You can also specify which target_features you promise are enabled for a
-    # particular target. target_features are currently not validated against
-    # the actual valid features supported by the target architecture.
-    #{ triple = "wasm32-unknown-unknown", features = ["atomics"] },
-]
-# When creating the dependency graph used as the source of truth when checks are
-# executed, this field can be used to prune crates from the graph, removing them
-# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate
-# is pruned from the graph, all of its dependencies will also be pruned unless
-# they are connected to another crate in the graph that hasn't been pruned,
-# so it should be used with care. The identifiers are [Package ID Specifications]
-# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html)
-#exclude = []
-# If true, metadata will be collected with `--all-features`. Note that this can't
-# be toggled off if true, if you want to conditionally enable `--all-features` it
-# is recommended to pass `--all-features` on the cmd line instead
-all-features = false
-# If true, metadata will be collected with `--no-default-features`. The same
-# caveat with `all-features` applies
-no-default-features = false
-# If set, these feature will be enabled when collecting metadata. If `--features`
-# is specified on the cmd line they will take precedence over this option.
-#features = []
-
-# The output table provides options for how/if diagnostics are outputted
-[output]
-# When outputting inclusion graphs in diagnostics that include features, this
-# option can be used to specify the depth at which feature edges will be added.
-# This option is included since the graphs can be quite large and the addition
-# of features from the crate(s) to all of the graph roots can be far too verbose.
-# This option can be overridden via `--feature-depth` on the cmd line
-feature-depth = 1
-
-# This section is considered when running `cargo deny check advisories`
-# More documentation for the advisories section can be found here:
-# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html
-[advisories]
-# The path where the advisory databases are cloned/fetched into
-#db-path = "$CARGO_HOME/advisory-dbs"
-# The url(s) of the advisory databases to use
-#db-urls = ["https://github.com/rustsec/advisory-db"]
-# A list of advisory IDs to ignore. Note that ignored advisories will still
-# output a note when they are encountered.
-ignore = [
-    #"RUSTSEC-0000-0000",
-    #{ id = "RUSTSEC-0000-0000", reason = "you can specify a reason the advisory is ignored" },
-    #"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish
-    #{ crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" },
-]
-# If this is true, then cargo deny will use the git executable to fetch advisory database.
-# If this is false, then it uses a built-in git library.
-# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support.
-# See Git Authentication for more information about setting up git authentication.
-#git-fetch-with-cli = true
-
-# This section is considered when running `cargo deny check licenses`
-# More documentation for the licenses section can be found here:
-# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html
-[licenses]
-# List of explicitly allowed licenses
-# See https://spdx.org/licenses/ for list of possible licenses
-# [possible values: any SPDX 3.11 short identifier (+ optional exception)].
-allow = [
-    "MIT",
-    "MIT-0",
-    "Apache-2.0",
-    "BSD-3-Clause",
-    "MPL-2.0",
-    "Unicode-DFS-2016",
-    "CC0-1.0",
-    "ISC",
-    "OpenSSL",
-]
-# The confidence threshold for detecting a license from license text.
-# The higher the value, the more closely the license text must be to the
-# canonical license text of a valid SPDX license file.
-# [possible values: any between 0.0 and 1.0].
-confidence-threshold = 0.8
-# Allow 1 or more licenses on a per-crate basis, so that particular licenses
-# aren't accepted for every possible crate as with the normal allow list
-exceptions = [
-    # Each entry is the crate and version constraint, and its specific allow
-    # list
-    #{ allow = ["Zlib"], crate = "adler32" },
-]
-
-# Some crates don't have (easily) machine readable licensing information,
-# adding a clarification entry for it allows you to manually specify the
-# licensing information
-[[licenses.clarify]]
-# The package spec the clarification applies to
-crate = "ring"
-# The SPDX expression for the license requirements of the crate
-expression = "MIT AND ISC AND OpenSSL"
-# One or more files in the crate's source used as the "source of truth" for
-# the license expression. If the contents match, the clarification will be used
-# when running the license check, otherwise the clarification will be ignored
-# and the crate will be checked normally, which may produce warnings or errors
-# depending on the rest of your configuration
-license-files = [
-# Each entry is a crate relative path, and the (opaque) hash of its contents
-{ path = "LICENSE", hash = 0xbd0eed23 }
-]
-
-[licenses.private]
-# If true, ignores workspace crates that aren't published, or are only
-# published to private registries.
-# To see how to mark a crate as unpublished (to the official registry),
-# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field.
-ignore = true
-# One or more private registries that you might publish crates to, if a crate
-# is only published to private registries, and ignore is true, the crate will
-# not have its license(s) checked
-registries = [
-    #"https://sekretz.com/registry
-]
-
-# This section is considered when running `cargo deny check bans`.
-# More documentation about the 'bans' section can be found here:
-# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html
-[bans]
-# Lint level for when multiple versions of the same crate are detected
-multiple-versions = "warn"
-# Lint level for when a crate version requirement is `*`
-wildcards = "allow"
-# The graph highlighting used when creating dotgraphs for crates
-# with multiple versions
-# * lowest-version - The path to the lowest versioned duplicate is highlighted
-# * simplest-path - The path to the version with the fewest edges is highlighted
-# * all - Both lowest-version and simplest-path are used
-highlight = "all"
-# The default lint level for `default` features for crates that are members of
-# the workspace that is being checked. This can be overridden by allowing/denying
-# `default` on a crate-by-crate basis if desired.
-workspace-default-features = "allow"
-# The default lint level for `default` features for external crates that are not
-# members of the workspace. This can be overridden by allowing/denying `default`
-# on a crate-by-crate basis if desired.
-external-default-features = "allow"
-# List of crates that are allowed. Use with care!
-allow = [
-    #"ansi_term@0.11.0",
-    #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is allowed" },
-]
-# List of crates to deny
-deny = [
-    #"ansi_term@0.11.0",
-    #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is banned" },
-    # Wrapper crates can optionally be specified to allow the crate when it
-    # is a direct dependency of the otherwise banned crate
-    #{ crate = "ansi_term@0.11.0", wrappers = ["this-crate-directly-depends-on-ansi_term"] },
-]
-
-# List of features to allow/deny
-# Each entry the name of a crate and a version range. If version is
-# not specified, all versions will be matched.
-#[[bans.features]]
-#crate = "reqwest"
-# Features to not allow
-#deny = ["json"]
-# Features to allow
-#allow = [
-#    "rustls",
-#    "__rustls",
-#    "__tls",
-#    "hyper-rustls",
-#    "rustls",
-#    "rustls-pemfile",
-#    "rustls-tls-webpki-roots",
-#    "tokio-rustls",
-#    "webpki-roots",
-#]
-# If true, the allowed features must exactly match the enabled feature set. If
-# this is set there is no point setting `deny`
-#exact = true
-
-# Certain crates/versions that will be skipped when doing duplicate detection.
-skip = [
-    #"ansi_term@0.11.0",
-    #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason why it can't be updated/removed" },
-]
-# Similarly to `skip` allows you to skip certain crates during duplicate
-# detection. Unlike skip, it also includes the entire tree of transitive
-# dependencies starting at the specified crate, up to a certain depth, which is
-# by default infinite.
-skip-tree = [
-    #"ansi_term@0.11.0", # will be skipped along with _all_ of its direct and transitive dependencies
-    #{ crate = "ansi_term@0.11.0", depth = 20 },
-]
-
-# This section is considered when running `cargo deny check sources`.
-# More documentation about the 'sources' section can be found here:
-# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html
-[sources]
-# Lint level for what to happen when a crate from a crate registry that is not
-# in the allow list is encountered
-unknown-registry = "deny"
-# Lint level for what to happen when a crate from a git repository that is not
-# in the allow list is encountered
-unknown-git = "deny"
-# List of URLs for allowed crate registries. Defaults to the crates.io index
-# if not specified. If it is specified but empty, no registries are allowed.
-allow-registry = ["https://github.com/rust-lang/crates.io-index"]
-# List of URLs for allowed Git repositories
-allow-git = []
-
-[sources.allow-org]
-# 1 or more github.com organizations to allow git sources for
-github = []
-# 1 or more gitlab.com organizations to allow git sources for
-gitlab = []
-# 1 or more bitbucket.org organizations to allow git sources for
-bitbucket = []
diff -pruN 0.11.4-1/examples/expected_type.svg 0.11.5-1/examples/expected_type.svg
--- 0.11.4-1/examples/expected_type.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/examples/expected_type.svg	2006-07-24 01:21:28.000000000 +0000
@@ -23,11 +23,11 @@
 </tspan>
     <tspan x="10px" y="46px"><tspan>  </tspan><tspan class="fg-bright-blue bold">--&gt;</tspan><tspan> examples/footer.rs:29:25</tspan>
 </tspan>
-    <tspan x="10px" y="64px"><tspan class="fg-bright-blue bold">   |</tspan>
+    <tspan x="10px" y="64px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
     <tspan x="10px" y="82px"><tspan class="fg-bright-blue bold">26 |</tspan><tspan>                 annotations: vec![SourceAnnotation {</tspan>
 </tspan>
-    <tspan x="10px" y="100px"><tspan class="fg-bright-blue bold">   |</tspan><tspan class="fg-bright-blue bold">                                   ----------------</tspan><tspan> </tspan><tspan class="fg-bright-blue bold">info</tspan><tspan class="fg-bright-blue bold">: while parsing this struct</tspan>
+    <tspan x="10px" y="100px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan><tspan>                                   </tspan><tspan class="fg-bright-blue bold">----------------</tspan><tspan> </tspan><tspan class="fg-bright-blue bold">info: while parsing this struct</tspan>
 </tspan>
     <tspan x="10px" y="118px"><tspan class="fg-bright-blue bold">27 |</tspan><tspan>                 label: "expected struct `annotate_snippets::snippet::Slice`, found reference"</tspan>
 </tspan>
@@ -35,9 +35,9 @@
 </tspan>
     <tspan x="10px" y="154px"><tspan class="fg-bright-blue bold">29 |</tspan><tspan>                 range: &lt;22, 25&gt;,</tspan>
 </tspan>
-    <tspan x="10px" y="172px"><tspan class="fg-bright-blue bold">   |</tspan><tspan class="fg-bright-red bold">                         ^^</tspan><tspan> </tspan><tspan class="fg-bright-red bold">expected struct `annotate_snippets::snippet::Slice`, found reference</tspan>
+    <tspan x="10px" y="172px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan><tspan>                         </tspan><tspan class="fg-bright-red bold">^^</tspan><tspan> </tspan><tspan class="fg-bright-red bold">expected struct `annotate_snippets::snippet::Slice`, found reference</tspan>
 </tspan>
-    <tspan x="10px" y="190px"><tspan class="fg-bright-blue bold">   |</tspan>
+    <tspan x="10px" y="190px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
     <tspan x="10px" y="208px">
 </tspan>
diff -pruN 0.11.4-1/examples/footer.svg 0.11.5-1/examples/footer.svg
--- 0.11.4-1/examples/footer.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/examples/footer.svg	2006-07-24 01:21:28.000000000 +0000
@@ -24,15 +24,15 @@
 </tspan>
     <tspan x="10px" y="46px"><tspan>  </tspan><tspan class="fg-bright-blue bold">--&gt;</tspan><tspan> src/multislice.rs:13:22</tspan>
 </tspan>
-    <tspan x="10px" y="64px"><tspan class="fg-bright-blue bold">   |</tspan>
+    <tspan x="10px" y="64px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
     <tspan x="10px" y="82px"><tspan class="fg-bright-blue bold">13 |</tspan><tspan>         slices: vec!["A",</tspan>
 </tspan>
-    <tspan x="10px" y="100px"><tspan class="fg-bright-blue bold">   |</tspan><tspan class="fg-bright-red bold">                      ^^^</tspan><tspan> </tspan><tspan class="fg-bright-red bold">expected struct `annotate_snippets::snippet::Slice`, found reference</tspan>
+    <tspan x="10px" y="100px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan><tspan>                      </tspan><tspan class="fg-bright-red bold">^^^</tspan><tspan> </tspan><tspan class="fg-bright-red bold">expected struct `annotate_snippets::snippet::Slice`, found reference</tspan>
 </tspan>
-    <tspan x="10px" y="118px"><tspan class="fg-bright-blue bold">   |</tspan>
+    <tspan x="10px" y="118px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
-    <tspan x="10px" y="136px"><tspan>   </tspan><tspan class="fg-bright-blue bold">=</tspan><tspan> </tspan><tspan class="fg-bright-green bold">note</tspan><tspan>: expected type: `snippet::Annotation`</tspan>
+    <tspan x="10px" y="136px"><tspan>   </tspan><tspan class="fg-bright-blue bold">= </tspan><tspan class="fg-bright-green bold">note</tspan><tspan>: expected type: `snippet::Annotation`</tspan>
 </tspan>
     <tspan x="10px" y="154px"><tspan>              found type: `__&amp;__snippet::Annotation`</tspan>
 </tspan>
diff -pruN 0.11.4-1/examples/format.svg 0.11.5-1/examples/format.svg
--- 0.11.4-1/examples/format.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/examples/format.svg	2006-07-24 01:21:28.000000000 +0000
@@ -1,4 +1,4 @@
-<svg width="740px" height="560px" xmlns="http://www.w3.org/2000/svg">
+<svg width="740px" height="542px" xmlns="http://www.w3.org/2000/svg">
   <style>
     .fg { fill: #AAAAAA }
     .bg { background: #000000 }
@@ -24,61 +24,59 @@
 </tspan>
     <tspan x="10px" y="46px"><tspan>  </tspan><tspan class="fg-bright-blue bold">--&gt;</tspan><tspan> src/format.rs:51:6</tspan>
 </tspan>
-    <tspan x="10px" y="64px"><tspan class="fg-bright-blue bold">   |</tspan>
+    <tspan x="10px" y="64px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
     <tspan x="10px" y="82px"><tspan class="fg-bright-blue bold">51 |</tspan><tspan>   ) -&gt; Option&lt;String&gt; {</tspan>
 </tspan>
-    <tspan x="10px" y="100px"><tspan class="fg-bright-blue bold">   |</tspan><tspan>  </tspan><tspan class="fg-yellow bold">      --------------</tspan><tspan> </tspan><tspan class="fg-yellow bold">expected `Option&lt;String&gt;` because of return type</tspan>
+    <tspan x="10px" y="100px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan><tspan>        </tspan><tspan class="fg-yellow bold">--------------</tspan><tspan> </tspan><tspan class="fg-yellow bold">expected `Option&lt;String&gt;` because of return type</tspan>
 </tspan>
-    <tspan x="10px" y="118px"><tspan class="fg-bright-blue bold">52 |</tspan><tspan>       for ann in annotations {</tspan>
+    <tspan x="10px" y="118px"><tspan class="fg-bright-blue bold">52 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">/</tspan><tspan>     for ann in annotations {</tspan>
 </tspan>
-    <tspan x="10px" y="136px"><tspan class="fg-bright-blue bold">   |</tspan><tspan>  </tspan><tspan class="fg-bright-red bold">_____^</tspan>
+    <tspan x="10px" y="136px"><tspan class="fg-bright-blue bold">53 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>         match (ann.range.0, ann.range.1) {</tspan>
 </tspan>
-    <tspan x="10px" y="154px"><tspan class="fg-bright-blue bold">53 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>         match (ann.range.0, ann.range.1) {</tspan>
+    <tspan x="10px" y="154px"><tspan class="fg-bright-blue bold">54 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             (None, None) =&gt; continue,</tspan>
 </tspan>
-    <tspan x="10px" y="172px"><tspan class="fg-bright-blue bold">54 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             (None, None) =&gt; continue,</tspan>
+    <tspan x="10px" y="172px"><tspan class="fg-bright-blue bold">55 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             (Some(start), Some(end)) if start &gt; end_index =&gt; continue,</tspan>
 </tspan>
-    <tspan x="10px" y="190px"><tspan class="fg-bright-blue bold">55 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             (Some(start), Some(end)) if start &gt; end_index =&gt; continue,</tspan>
+    <tspan x="10px" y="190px"><tspan class="fg-bright-blue bold">56 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             (Some(start), Some(end)) if start &gt;= start_index =&gt; {</tspan>
 </tspan>
-    <tspan x="10px" y="208px"><tspan class="fg-bright-blue bold">56 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             (Some(start), Some(end)) if start &gt;= start_index =&gt; {</tspan>
+    <tspan x="10px" y="208px"><tspan class="fg-bright-blue bold">57 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 let label = if let Some(ref label) = ann.label {</tspan>
 </tspan>
-    <tspan x="10px" y="226px"><tspan class="fg-bright-blue bold">57 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 let label = if let Some(ref label) = ann.label {</tspan>
+    <tspan x="10px" y="226px"><tspan class="fg-bright-blue bold">58 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     format!(" {}", label)</tspan>
 </tspan>
-    <tspan x="10px" y="244px"><tspan class="fg-bright-blue bold">58 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     format!(" {}", label)</tspan>
+    <tspan x="10px" y="244px"><tspan class="fg-bright-blue bold">59 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 } else {</tspan>
 </tspan>
-    <tspan x="10px" y="262px"><tspan class="fg-bright-blue bold">59 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 } else {</tspan>
+    <tspan x="10px" y="262px"><tspan class="fg-bright-blue bold">60 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     String::from("")</tspan>
 </tspan>
-    <tspan x="10px" y="280px"><tspan class="fg-bright-blue bold">60 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     String::from("")</tspan>
+    <tspan x="10px" y="280px"><tspan class="fg-bright-blue bold">61 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 };</tspan>
 </tspan>
-    <tspan x="10px" y="298px"><tspan class="fg-bright-blue bold">61 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 };</tspan>
+    <tspan x="10px" y="298px"><tspan class="fg-bright-blue bold">62 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan>
 </tspan>
-    <tspan x="10px" y="316px"><tspan class="fg-bright-blue bold">62 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan> </tspan>
+    <tspan x="10px" y="316px"><tspan class="fg-bright-blue bold">63 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 return Some(format!(</tspan>
 </tspan>
-    <tspan x="10px" y="334px"><tspan class="fg-bright-blue bold">63 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 return Some(format!(</tspan>
+    <tspan x="10px" y="334px"><tspan class="fg-bright-blue bold">64 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     "{}{}{}",</tspan>
 </tspan>
-    <tspan x="10px" y="352px"><tspan class="fg-bright-blue bold">64 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     "{}{}{}",</tspan>
+    <tspan x="10px" y="352px"><tspan class="fg-bright-blue bold">65 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     " ".repeat(start - start_index),</tspan>
 </tspan>
-    <tspan x="10px" y="370px"><tspan class="fg-bright-blue bold">65 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     " ".repeat(start - start_index),</tspan>
+    <tspan x="10px" y="370px"><tspan class="fg-bright-blue bold">66 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     "^".repeat(end - start),</tspan>
 </tspan>
-    <tspan x="10px" y="388px"><tspan class="fg-bright-blue bold">66 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     "^".repeat(end - start),</tspan>
+    <tspan x="10px" y="388px"><tspan class="fg-bright-blue bold">67 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     label</tspan>
 </tspan>
-    <tspan x="10px" y="406px"><tspan class="fg-bright-blue bold">67 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                     label</tspan>
+    <tspan x="10px" y="406px"><tspan class="fg-bright-blue bold">68 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 ));</tspan>
 </tspan>
-    <tspan x="10px" y="424px"><tspan class="fg-bright-blue bold">68 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>                 ));</tspan>
+    <tspan x="10px" y="424px"><tspan class="fg-bright-blue bold">69 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             }</tspan>
 </tspan>
-    <tspan x="10px" y="442px"><tspan class="fg-bright-blue bold">69 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             }</tspan>
+    <tspan x="10px" y="442px"><tspan class="fg-bright-blue bold">70 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             _ =&gt; continue,</tspan>
 </tspan>
-    <tspan x="10px" y="460px"><tspan class="fg-bright-blue bold">70 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>             _ =&gt; continue,</tspan>
+    <tspan x="10px" y="460px"><tspan class="fg-bright-blue bold">71 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>         }</tspan>
 </tspan>
-    <tspan x="10px" y="478px"><tspan class="fg-bright-blue bold">71 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>         }</tspan>
+    <tspan x="10px" y="478px"><tspan class="fg-bright-blue bold">72 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>     }</tspan>
 </tspan>
-    <tspan x="10px" y="496px"><tspan class="fg-bright-blue bold">72 |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan>     }</tspan>
+    <tspan x="10px" y="496px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|____^</tspan><tspan> </tspan><tspan class="fg-bright-red bold">expected enum `std::option::Option`</tspan>
 </tspan>
-    <tspan x="10px" y="514px"><tspan class="fg-bright-blue bold">   |</tspan><tspan> </tspan><tspan class="fg-bright-red bold">|</tspan><tspan class="fg-bright-red bold">____^</tspan><tspan> </tspan><tspan class="fg-bright-red bold">expected enum `std::option::Option`</tspan>
+    <tspan x="10px" y="514px"><tspan>   </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
-    <tspan x="10px" y="532px"><tspan class="fg-bright-blue bold">   |</tspan>
-</tspan>
-    <tspan x="10px" y="550px">
+    <tspan x="10px" y="532px">
 </tspan>
   </text>
 
diff -pruN 0.11.4-1/examples/multislice.svg 0.11.5-1/examples/multislice.svg
--- 0.11.4-1/examples/multislice.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/examples/multislice.svg	2006-07-24 01:21:28.000000000 +0000
@@ -23,19 +23,19 @@
 </tspan>
     <tspan x="10px" y="46px"><tspan>   </tspan><tspan class="fg-bright-blue bold">--&gt;</tspan><tspan> src/format.rs</tspan>
 </tspan>
-    <tspan x="10px" y="64px"><tspan class="fg-bright-blue bold">    |</tspan>
+    <tspan x="10px" y="64px"><tspan>    </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
     <tspan x="10px" y="82px"><tspan class="fg-bright-blue bold"> 51 |</tspan><tspan> Foo</tspan>
 </tspan>
-    <tspan x="10px" y="100px"><tspan class="fg-bright-blue bold">    |</tspan>
+    <tspan x="10px" y="100px"><tspan>    </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
     <tspan x="10px" y="118px"><tspan>   </tspan><tspan class="fg-bright-blue bold">:::</tspan><tspan> src/display.rs</tspan>
 </tspan>
-    <tspan x="10px" y="136px"><tspan class="fg-bright-blue bold">    |</tspan>
+    <tspan x="10px" y="136px"><tspan>    </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
     <tspan x="10px" y="154px"><tspan class="fg-bright-blue bold">129 |</tspan><tspan> Faa</tspan>
 </tspan>
-    <tspan x="10px" y="172px"><tspan class="fg-bright-blue bold">    |</tspan>
+    <tspan x="10px" y="172px"><tspan>    </tspan><tspan class="fg-bright-blue bold">|</tspan>
 </tspan>
     <tspan x="10px" y="190px">
 </tspan>
diff -pruN 0.11.4-1/release.toml 0.11.5-1/release.toml
--- 0.11.4-1/release.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/release.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-allow-branch = ["master"]
diff -pruN 0.11.4-1/src/renderer/display_list.rs 0.11.5-1/src/renderer/display_list.rs
--- 0.11.4-1/src/renderer/display_list.rs	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/src/renderer/display_list.rs	2006-07-24 01:21:28.000000000 +0000
@@ -32,11 +32,13 @@
 //!
 //! The above snippet has been built out of the following structure:
 use crate::snippet;
-use std::cmp::{max, min};
-use std::fmt::{Display, Write};
+use std::cmp::{max, min, Reverse};
+use std::collections::HashMap;
+use std::fmt::Display;
 use std::ops::Range;
 use std::{cmp, fmt};
 
+use crate::renderer::styled_buffer::StyledBuffer;
 use crate::renderer::{stylesheet::Stylesheet, Margin, Style, DEFAULT_TERM_WIDTH};
 
 const ANONYMIZED_LINE_NUM: &str = "LL";
@@ -53,13 +55,13 @@ pub(crate) struct DisplayList<'a> {
     pub(crate) anonymized_line_numbers: bool,
 }
 
-impl<'a> PartialEq for DisplayList<'a> {
+impl PartialEq for DisplayList<'_> {
     fn eq(&self, other: &Self) -> bool {
         self.body == other.body && self.anonymized_line_numbers == other.anonymized_line_numbers
     }
 }
 
-impl<'a> fmt::Debug for DisplayList<'a> {
+impl fmt::Debug for DisplayList<'_> {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         f.debug_struct("DisplayList")
             .field("body", &self.body)
@@ -68,7 +70,7 @@ impl<'a> fmt::Debug for DisplayList<'a>
     }
 }
 
-impl<'a> Display for DisplayList<'a> {
+impl Display for DisplayList<'_> {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         let lineno_width = self.body.iter().fold(0, |max, set| {
             set.display_lines.iter().fold(max, |max, line| match line {
@@ -83,19 +85,31 @@ impl<'a> Display for DisplayList<'a> {
         } else {
             ((lineno_width as f64).log10().floor() as usize) + 1
         };
-        let inline_marks_width = self.body.iter().fold(0, |max, set| {
-            set.display_lines.iter().fold(max, |max, line| match line {
-                DisplayLine::Source { inline_marks, .. } => cmp::max(inline_marks.len(), max),
-                _ => max,
+
+        let multiline_depth = self.body.iter().fold(0, |max, set| {
+            set.display_lines.iter().fold(max, |max2, line| match line {
+                DisplayLine::Source { annotations, .. } => cmp::max(
+                    annotations.iter().fold(max2, |max3, line| {
+                        cmp::max(
+                            match line.annotation_part {
+                                DisplayAnnotationPart::Standalone => 0,
+                                DisplayAnnotationPart::LabelContinuation => 0,
+                                DisplayAnnotationPart::MultilineStart(depth) => depth + 1,
+                                DisplayAnnotationPart::MultilineEnd(depth) => depth + 1,
+                            },
+                            max3,
+                        )
+                    }),
+                    max,
+                ),
+                _ => max2,
             })
         });
-
-        let mut count_offset = 0;
+        let mut buffer = StyledBuffer::new();
         for set in self.body.iter() {
-            self.format_set(set, lineno_width, inline_marks_width, count_offset, f)?;
-            count_offset += set.display_lines.len();
+            self.format_set(set, lineno_width, multiline_depth, &mut buffer)?;
         }
-        Ok(())
+        write!(f, "{}", buffer.render(self.stylesheet)?)
     }
 }
 
@@ -119,27 +133,18 @@ impl<'a> DisplayList<'a> {
         &self,
         set: &DisplaySet<'_>,
         lineno_width: usize,
-        inline_marks_width: usize,
-        count_offset: usize,
-        f: &mut fmt::Formatter<'_>,
+        multiline_depth: usize,
+        buffer: &mut StyledBuffer,
     ) -> fmt::Result {
-        let body_len = self
-            .body
-            .iter()
-            .map(|set| set.display_lines.len())
-            .sum::<usize>();
-        for (i, line) in set.display_lines.iter().enumerate() {
+        for line in &set.display_lines {
             set.format_line(
                 line,
                 lineno_width,
-                inline_marks_width,
+                multiline_depth,
                 self.stylesheet,
                 self.anonymized_line_numbers,
-                f,
+                buffer,
             )?;
-            if i + count_offset + 1 < body_len {
-                f.write_char('\n')?;
-            }
         }
         Ok(())
     }
@@ -151,39 +156,30 @@ pub(crate) struct DisplaySet<'a> {
     pub(crate) margin: Margin,
 }
 
-impl<'a> DisplaySet<'a> {
+impl DisplaySet<'_> {
     fn format_label(
         &self,
+        line_offset: usize,
         label: &[DisplayTextFragment<'_>],
         stylesheet: &Stylesheet,
-        f: &mut fmt::Formatter<'_>,
+        buffer: &mut StyledBuffer,
     ) -> fmt::Result {
-        let emphasis_style = stylesheet.emphasis();
-
         for fragment in label {
-            match fragment.style {
-                DisplayTextStyle::Regular => fragment.content.fmt(f)?,
-                DisplayTextStyle::Emphasis => {
-                    write!(
-                        f,
-                        "{}{}{}",
-                        emphasis_style.render(),
-                        fragment.content,
-                        emphasis_style.render_reset()
-                    )?;
-                }
-            }
+            let style = match fragment.style {
+                DisplayTextStyle::Regular => stylesheet.none(),
+                DisplayTextStyle::Emphasis => stylesheet.emphasis(),
+            };
+            buffer.append(line_offset, fragment.content, *style);
         }
         Ok(())
     }
-
     fn format_annotation(
         &self,
+        line_offset: usize,
         annotation: &Annotation<'_>,
         continuation: bool,
-        in_source: bool,
         stylesheet: &Stylesheet,
-        f: &mut fmt::Formatter<'_>,
+        buffer: &mut StyledBuffer,
     ) -> fmt::Result {
         let color = get_annotation_style(&annotation.annotation_type, stylesheet);
         let formatted_len = if let Some(id) = &annotation.id {
@@ -193,31 +189,27 @@ impl<'a> DisplaySet<'a> {
         };
 
         if continuation {
-            format_repeat_char(' ', formatted_len + 2, f)?;
-            return self.format_label(&annotation.label, stylesheet, f);
+            for _ in 0..formatted_len + 2 {
+                buffer.append(line_offset, " ", Style::new());
+            }
+            return self.format_label(line_offset, &annotation.label, stylesheet, buffer);
         }
         if formatted_len == 0 {
-            self.format_label(&annotation.label, stylesheet, f)
+            self.format_label(line_offset, &annotation.label, stylesheet, buffer)
         } else {
-            write!(f, "{}", color.render())?;
-            format_annotation_type(&annotation.annotation_type, f)?;
-            if let Some(id) = &annotation.id {
-                f.write_char('[')?;
-                f.write_str(id)?;
-                f.write_char(']')?;
-            }
-            write!(f, "{}", color.render_reset())?;
+            let id = match &annotation.id {
+                Some(id) => format!("[{id}]"),
+                None => String::new(),
+            };
+            buffer.append(
+                line_offset,
+                &format!("{}{}", annotation_type_str(&annotation.annotation_type), id),
+                *color,
+            );
 
             if !is_annotation_empty(annotation) {
-                if in_source {
-                    write!(f, "{}", color.render())?;
-                    f.write_str(": ")?;
-                    self.format_label(&annotation.label, stylesheet, f)?;
-                    write!(f, "{}", color.render_reset())?;
-                } else {
-                    f.write_str(": ")?;
-                    self.format_label(&annotation.label, stylesheet, f)?;
-                }
+                buffer.append(line_offset, ": ", stylesheet.none);
+                self.format_label(line_offset, &annotation.label, stylesheet, buffer)?;
             }
             Ok(())
         }
@@ -226,10 +218,11 @@ impl<'a> DisplaySet<'a> {
     #[inline]
     fn format_raw_line(
         &self,
+        line_offset: usize,
         line: &DisplayRawLine<'_>,
         lineno_width: usize,
         stylesheet: &Stylesheet,
-        f: &mut fmt::Formatter<'_>,
+        buffer: &mut StyledBuffer,
     ) -> fmt::Result {
         match line {
             DisplayRawLine::Origin {
@@ -242,34 +235,15 @@ impl<'a> DisplaySet<'a> {
                     DisplayHeaderType::Continuation => ":::",
                 };
                 let lineno_color = stylesheet.line_no();
-
+                buffer.puts(line_offset, lineno_width, header_sigil, *lineno_color);
+                buffer.puts(line_offset, lineno_width + 4, path, stylesheet.none);
                 if let Some((col, row)) = pos {
-                    format_repeat_char(' ', lineno_width, f)?;
-                    write!(
-                        f,
-                        "{}{}{}",
-                        lineno_color.render(),
-                        header_sigil,
-                        lineno_color.render_reset()
-                    )?;
-                    f.write_char(' ')?;
-                    path.fmt(f)?;
-                    f.write_char(':')?;
-                    col.fmt(f)?;
-                    f.write_char(':')?;
-                    row.fmt(f)
-                } else {
-                    format_repeat_char(' ', lineno_width, f)?;
-                    write!(
-                        f,
-                        "{}{}{}",
-                        lineno_color.render(),
-                        header_sigil,
-                        lineno_color.render_reset()
-                    )?;
-                    f.write_char(' ')?;
-                    path.fmt(f)
+                    buffer.append(line_offset, ":", stylesheet.none);
+                    buffer.append(line_offset, col.to_string().as_str(), stylesheet.none);
+                    buffer.append(line_offset, ":", stylesheet.none);
+                    buffer.append(line_offset, row.to_string().as_str(), stylesheet.none);
                 }
+                Ok(())
             }
             DisplayRawLine::Annotation {
                 annotation,
@@ -278,35 +252,35 @@ impl<'a> DisplaySet<'a> {
             } => {
                 if *source_aligned {
                     if *continuation {
-                        format_repeat_char(' ', lineno_width + 3, f)?;
+                        for _ in 0..lineno_width + 3 {
+                            buffer.append(line_offset, " ", stylesheet.none);
+                        }
                     } else {
                         let lineno_color = stylesheet.line_no();
-                        format_repeat_char(' ', lineno_width, f)?;
-                        f.write_char(' ')?;
-                        write!(
-                            f,
-                            "{}={}",
-                            lineno_color.render(),
-                            lineno_color.render_reset()
-                        )?;
-                        f.write_char(' ')?;
+                        for _ in 0..lineno_width + 1 {
+                            buffer.append(line_offset, " ", stylesheet.none);
+                        }
+                        buffer.append(line_offset, "=", *lineno_color);
+                        buffer.append(line_offset, " ", *lineno_color);
                     }
                 }
-                self.format_annotation(annotation, *continuation, false, stylesheet, f)
+                self.format_annotation(line_offset, annotation, *continuation, stylesheet, buffer)
             }
         }
     }
 
+    // Adapted from https://github.com/rust-lang/rust/blob/d371d17496f2ce3a56da76aa083f4ef157572c20/compiler/rustc_errors/src/emitter.rs#L706-L1211
     #[inline]
     fn format_line(
         &self,
         dl: &DisplayLine<'_>,
         lineno_width: usize,
-        inline_marks_width: usize,
+        multiline_depth: usize,
         stylesheet: &Stylesheet,
         anonymized_line_numbers: bool,
-        f: &mut fmt::Formatter<'_>,
+        buffer: &mut StyledBuffer,
     ) -> fmt::Result {
+        let line_offset = buffer.num_lines();
         match dl {
             DisplayLine::Source {
                 lineno,
@@ -316,36 +290,45 @@ impl<'a> DisplaySet<'a> {
             } => {
                 let lineno_color = stylesheet.line_no();
                 if anonymized_line_numbers && lineno.is_some() {
-                    write!(f, "{}", lineno_color.render())?;
-                    f.write_str(ANONYMIZED_LINE_NUM)?;
-                    f.write_str(" |")?;
-                    write!(f, "{}", lineno_color.render_reset())?;
+                    let num = format!("{ANONYMIZED_LINE_NUM:>lineno_width$} |");
+                    buffer.puts(line_offset, 0, &num, *lineno_color);
                 } else {
-                    write!(f, "{}", lineno_color.render())?;
                     match lineno {
-                        Some(n) => write!(f, "{:>width$}", n, width = lineno_width),
-                        None => format_repeat_char(' ', lineno_width, f),
-                    }?;
-                    f.write_str(" |")?;
-                    write!(f, "{}", lineno_color.render_reset())?;
+                        Some(n) => {
+                            let num = format!("{n:>lineno_width$} |");
+                            buffer.puts(line_offset, 0, &num, *lineno_color);
+                        }
+                        None => {
+                            buffer.putc(line_offset, lineno_width + 1, '|', *lineno_color);
+                        }
+                    };
                 }
-
                 if let DisplaySourceLine::Content { text, .. } = line {
-                    if !inline_marks.is_empty() || 0 < inline_marks_width {
-                        f.write_char(' ')?;
-                        self.format_inline_marks(inline_marks, inline_marks_width, stylesheet, f)?;
+                    // The width of the line number, a space, pipe, and a space
+                    // `123 | ` is `lineno_width + 3`.
+                    let width_offset = lineno_width + 3;
+                    let code_offset = if multiline_depth == 0 {
+                        width_offset
+                    } else {
+                        width_offset + multiline_depth + 1
+                    };
+
+                    // Add any inline marks to the code line
+                    if !inline_marks.is_empty() || 0 < multiline_depth {
+                        format_inline_marks(
+                            line_offset,
+                            inline_marks,
+                            lineno_width,
+                            stylesheet,
+                            buffer,
+                        )?;
                     }
-                    f.write_char(' ')?;
 
                     let text = normalize_whitespace(text);
                     let line_len = text.as_bytes().len();
-                    let mut left = self.margin.left(line_len);
+                    let left = self.margin.left(line_len);
                     let right = self.margin.right(line_len);
 
-                    if self.margin.was_cut_left() {
-                        "...".fmt(f)?;
-                        left += 3;
-                    }
                     // On long lines, we strip the source line, accounting for unicode.
                     let mut taken = 0;
                     let code: String = text
@@ -364,135 +347,405 @@ impl<'a> DisplaySet<'a> {
                             true
                         })
                         .collect();
-
+                    buffer.puts(line_offset, code_offset, &code, Style::new());
+                    if self.margin.was_cut_left() {
+                        // We have stripped some code/whitespace from the beginning, make it clear.
+                        buffer.puts(line_offset, code_offset, "...", *lineno_color);
+                    }
                     if self.margin.was_cut_right(line_len) {
-                        code[..taken.saturating_sub(3)].fmt(f)?;
-                        "...".fmt(f)?;
-                    } else {
-                        code.fmt(f)?;
+                        buffer.puts(line_offset, code_offset + taken - 3, "...", *lineno_color);
                     }
 
-                    let mut left: usize = text
+                    let left: usize = text
                         .chars()
                         .take(left)
                         .map(|ch| unicode_width::UnicodeWidthChar::width(ch).unwrap_or(1))
                         .sum();
 
-                    if self.margin.was_cut_left() {
-                        left = left.saturating_sub(3);
+                    let mut annotations = annotations.clone();
+                    annotations.sort_by_key(|a| Reverse(a.range.0));
+
+                    let mut annotations_positions = vec![];
+                    let mut line_len: usize = 0;
+                    let mut p = 0;
+                    for (i, annotation) in annotations.iter().enumerate() {
+                        for (j, next) in annotations.iter().enumerate() {
+                            // This label overlaps with another one and both take space (
+                            // they have text and are not multiline lines).
+                            if overlaps(next, annotation, 0)
+                                && annotation.has_label()
+                                && j > i
+                                && p == 0
+                            // We're currently on the first line, move the label one line down
+                            {
+                                // If we're overlapping with an un-labelled annotation with the same span
+                                // we can just merge them in the output
+                                if next.range.0 == annotation.range.0
+                                    && next.range.1 == annotation.range.1
+                                    && !next.has_label()
+                                {
+                                    continue;
+                                }
+
+                                // This annotation needs a new line in the output.
+                                p += 1;
+                                break;
+                            }
+                        }
+                        annotations_positions.push((p, annotation));
+                        for (j, next) in annotations.iter().enumerate() {
+                            if j > i {
+                                let l = next
+                                    .annotation
+                                    .label
+                                    .iter()
+                                    .map(|label| label.content)
+                                    .collect::<Vec<_>>()
+                                    .join("")
+                                    .len()
+                                    + 2;
+                                // Do not allow two labels to be in the same line if they
+                                // overlap including padding, to avoid situations like:
+                                //
+                                // fn foo(x: u32) {
+                                // -------^------
+                                // |      |
+                                // fn_spanx_span
+                                //
+                                // Both labels must have some text, otherwise they are not
+                                // overlapping. Do not add a new line if this annotation or
+                                // the next are vertical line placeholders. If either this
+                                // or the next annotation is multiline start/end, move it
+                                // to a new line so as not to overlap the horizontal lines.
+                                if (overlaps(next, annotation, l)
+                                    && annotation.has_label()
+                                    && next.has_label())
+                                    || (annotation.takes_space() && next.has_label())
+                                    || (annotation.has_label() && next.takes_space())
+                                    || (annotation.takes_space() && next.takes_space())
+                                    || (overlaps(next, annotation, l)
+                                        && next.range.1 <= annotation.range.1
+                                        && next.has_label()
+                                        && p == 0)
+                                // Avoid #42595.
+                                {
+                                    // This annotation needs a new line in the output.
+                                    p += 1;
+                                    break;
+                                }
+                            }
+                        }
+                        line_len = max(line_len, p);
+                    }
+
+                    if line_len != 0 {
+                        line_len += 1;
+                    }
+
+                    if annotations_positions.iter().all(|(_, ann)| {
+                        matches!(
+                            ann.annotation_part,
+                            DisplayAnnotationPart::MultilineStart(_)
+                        )
+                    }) {
+                        if let Some(max_pos) =
+                            annotations_positions.iter().map(|(pos, _)| *pos).max()
+                        {
+                            // Special case the following, so that we minimize overlapping multiline spans.
+                            //
+                            // 3 │       X0 Y0 Z0
+                            //   │ ┏━━━━━┛  │  │     < We are writing these lines
+                            //   │ ┃┌───────┘  │     < by reverting the "depth" of
+                            //   │ ┃│┌─────────┘     < their multilne spans.
+                            // 4 │ ┃││   X1 Y1 Z1
+                            // 5 │ ┃││   X2 Y2 Z2
+                            //   │ ┃│└────╿──│──┘ `Z` label
+                            //   │ ┃└─────│──┤
+                            //   │ ┗━━━━━━┥  `Y` is a good letter too
+                            //   ╰╴       `X` is a good letter
+                            for (pos, _) in &mut annotations_positions {
+                                *pos = max_pos - *pos;
+                            }
+                            // We know then that we don't need an additional line for the span label, saving us
+                            // one line of vertical space.
+                            line_len = line_len.saturating_sub(1);
+                        }
+                    }
+
+                    // This is a special case where we have a multiline
+                    // annotation that is at the start of the line disregarding
+                    // any leading whitespace, and no other multiline
+                    // annotations overlap it. In this case, we want to draw
+                    //
+                    // 2 |   fn foo() {
+                    //   |  _^
+                    // 3 | |
+                    // 4 | | }
+                    //   | |_^ test
+                    //
+                    // we simplify the output to:
+                    //
+                    // 2 | / fn foo() {
+                    // 3 | |
+                    // 4 | | }
+                    //   | |_^ test
+                    if multiline_depth == 1
+                        && annotations_positions.len() == 1
+                        && annotations_positions
+                            .first()
+                            .map_or(false, |(_, annotation)| {
+                                matches!(
+                                    annotation.annotation_part,
+                                    DisplayAnnotationPart::MultilineStart(_)
+                                ) && text
+                                    .chars()
+                                    .take(annotation.range.0)
+                                    .all(|c| c.is_whitespace())
+                            })
+                    {
+                        let (_, ann) = annotations_positions.remove(0);
+                        let style = get_annotation_style(&ann.annotation_type, stylesheet);
+                        buffer.putc(line_offset, 3 + lineno_width, '/', *style);
+                    }
+
+                    // Draw the column separator for any extra lines that were
+                    // created
+                    //
+                    // After this we will have:
+                    //
+                    // 2 |   fn foo() {
+                    //   |
+                    //   |
+                    //   |
+                    // 3 |
+                    // 4 |   }
+                    //   |
+                    if !annotations_positions.is_empty() {
+                        for pos in 0..=line_len {
+                            buffer.putc(
+                                line_offset + pos + 1,
+                                lineno_width + 1,
+                                '|',
+                                stylesheet.line_no,
+                            );
+                        }
+                    }
+
+                    // Write the horizontal lines for multiline annotations
+                    // (only the first and last lines need this).
+                    //
+                    // After this we will have:
+                    //
+                    // 2 |   fn foo() {
+                    //   |  __________
+                    //   |
+                    //   |
+                    // 3 |
+                    // 4 |   }
+                    //   |  _
+                    for &(pos, annotation) in &annotations_positions {
+                        let style = get_annotation_style(&annotation.annotation_type, stylesheet);
+                        let pos = pos + 1;
+                        match annotation.annotation_part {
+                            DisplayAnnotationPart::MultilineStart(depth)
+                            | DisplayAnnotationPart::MultilineEnd(depth) => {
+                                for col in width_offset + depth
+                                    ..(code_offset + annotation.range.0).saturating_sub(left)
+                                {
+                                    buffer.putc(line_offset + pos, col + 1, '_', *style);
+                                }
+                            }
+                            _ => {}
+                        }
+                    }
+
+                    // Write the vertical lines for labels that are on a different line as the underline.
+                    //
+                    // After this we will have:
+                    //
+                    // 2 |   fn foo() {
+                    //   |  __________
+                    //   | |    |
+                    //   | |
+                    // 3 | |
+                    // 4 | | }
+                    //   | |_
+                    for &(pos, annotation) in &annotations_positions {
+                        let style = get_annotation_style(&annotation.annotation_type, stylesheet);
+                        let pos = pos + 1;
+                        if pos > 1 && (annotation.has_label() || annotation.takes_space()) {
+                            for p in line_offset + 2..=line_offset + pos {
+                                buffer.putc(
+                                    p,
+                                    (code_offset + annotation.range.0).saturating_sub(left),
+                                    '|',
+                                    *style,
+                                );
+                            }
+                        }
+                        match annotation.annotation_part {
+                            DisplayAnnotationPart::MultilineStart(depth) => {
+                                for p in line_offset + pos + 1..line_offset + line_len + 2 {
+                                    buffer.putc(p, width_offset + depth, '|', *style);
+                                }
+                            }
+                            DisplayAnnotationPart::MultilineEnd(depth) => {
+                                for p in line_offset..=line_offset + pos {
+                                    buffer.putc(p, width_offset + depth, '|', *style);
+                                }
+                            }
+                            _ => {}
+                        }
                     }
 
-                    for annotation in annotations {
-                        // Each annotation should be on its own line
-                        f.write_char('\n')?;
-                        // Add the line number and the line number delimiter
-                        write!(f, "{}", stylesheet.line_no.render())?;
-                        format_repeat_char(' ', lineno_width, f)?;
-                        f.write_str(" |")?;
-                        write!(f, "{}", stylesheet.line_no.render_reset())?;
-
-                        if !inline_marks.is_empty() || 0 < inline_marks_width {
-                            f.write_char(' ')?;
-                            self.format_inline_marks(
-                                inline_marks,
-                                inline_marks_width,
-                                stylesheet,
-                                f,
-                            )?;
+                    // Add in any inline marks for any extra lines that have
+                    // been created. Output should look like above.
+                    for inline_mark in inline_marks {
+                        let DisplayMarkType::AnnotationThrough(depth) = inline_mark.mark_type;
+                        let style = get_annotation_style(&inline_mark.annotation_type, stylesheet);
+                        if annotations_positions.is_empty() {
+                            buffer.putc(line_offset, width_offset + depth, '|', *style);
+                        } else {
+                            for p in line_offset..=line_offset + line_len + 1 {
+                                buffer.putc(p, width_offset + depth, '|', *style);
+                            }
+                        }
+                    }
+
+                    // Write the labels on the annotations that actually have a label.
+                    //
+                    // After this we will have:
+                    //
+                    // 2 |   fn foo() {
+                    //   |  __________
+                    //   |      |
+                    //   |      something about `foo`
+                    // 3 |
+                    // 4 |   }
+                    //   |  _  test
+                    for &(pos, annotation) in &annotations_positions {
+                        if !is_annotation_empty(&annotation.annotation) {
+                            let style =
+                                get_annotation_style(&annotation.annotation_type, stylesheet);
+                            let mut formatted_len = if let Some(id) = &annotation.annotation.id {
+                                2 + id.len()
+                                    + annotation_type_len(&annotation.annotation.annotation_type)
+                            } else {
+                                annotation_type_len(&annotation.annotation.annotation_type)
+                            };
+                            let (pos, col) = if pos == 0 {
+                                (pos + 1, (annotation.range.1 + 1).saturating_sub(left))
+                            } else {
+                                (pos + 2, annotation.range.0.saturating_sub(left))
+                            };
+                            if annotation.annotation_part
+                                == DisplayAnnotationPart::LabelContinuation
+                            {
+                                formatted_len = 0;
+                            } else if formatted_len != 0 {
+                                formatted_len += 2;
+                                let id = match &annotation.annotation.id {
+                                    Some(id) => format!("[{id}]"),
+                                    None => String::new(),
+                                };
+                                buffer.puts(
+                                    line_offset + pos,
+                                    col + code_offset,
+                                    &format!(
+                                        "{}{}: ",
+                                        annotation_type_str(&annotation.annotation_type),
+                                        id
+                                    ),
+                                    *style,
+                                );
+                            } else {
+                                formatted_len = 0;
+                            }
+                            let mut before = 0;
+                            for fragment in &annotation.annotation.label {
+                                let inner_col = before + formatted_len + col + code_offset;
+                                buffer.puts(line_offset + pos, inner_col, fragment.content, *style);
+                                before += fragment.content.len();
+                            }
+                        }
+                    }
+
+                    // Sort from biggest span to smallest span so that smaller spans are
+                    // represented in the output:
+                    //
+                    // x | fn foo()
+                    //   | ^^^---^^
+                    //   | |  |
+                    //   | |  something about `foo`
+                    //   | something about `fn foo()`
+                    annotations_positions.sort_by_key(|(_, ann)| {
+                        // Decreasing order. When annotations share the same length, prefer `Primary`.
+                        Reverse(ann.len())
+                    });
+
+                    // Write the underlines.
+                    //
+                    // After this we will have:
+                    //
+                    // 2 |   fn foo() {
+                    //   |  ____-_____^
+                    //   |      |
+                    //   |      something about `foo`
+                    // 3 |
+                    // 4 |   }
+                    //   |  _^  test
+                    for &(_, annotation) in &annotations_positions {
+                        let mark = match annotation.annotation_type {
+                            DisplayAnnotationType::Error => '^',
+                            DisplayAnnotationType::Warning => '-',
+                            DisplayAnnotationType::Info => '-',
+                            DisplayAnnotationType::Note => '-',
+                            DisplayAnnotationType::Help => '-',
+                            DisplayAnnotationType::None => ' ',
+                        };
+                        let style = get_annotation_style(&annotation.annotation_type, stylesheet);
+                        for p in annotation.range.0..annotation.range.1 {
+                            buffer.putc(
+                                line_offset + 1,
+                                (code_offset + p).saturating_sub(left),
+                                mark,
+                                *style,
+                            );
                         }
-                        self.format_source_annotation(annotation, left, stylesheet, f)?;
                     }
                 } else if !inline_marks.is_empty() {
-                    f.write_char(' ')?;
-                    self.format_inline_marks(inline_marks, inline_marks_width, stylesheet, f)?;
+                    format_inline_marks(
+                        line_offset,
+                        inline_marks,
+                        lineno_width,
+                        stylesheet,
+                        buffer,
+                    )?;
                 }
                 Ok(())
             }
             DisplayLine::Fold { inline_marks } => {
-                f.write_str("...")?;
-                if !inline_marks.is_empty() || 0 < inline_marks_width {
-                    format_repeat_char(' ', lineno_width, f)?;
-                    self.format_inline_marks(inline_marks, inline_marks_width, stylesheet, f)?;
+                buffer.puts(line_offset, 0, "...", *stylesheet.line_no());
+                if !inline_marks.is_empty() || 0 < multiline_depth {
+                    format_inline_marks(
+                        line_offset,
+                        inline_marks,
+                        lineno_width,
+                        stylesheet,
+                        buffer,
+                    )?;
                 }
                 Ok(())
             }
-            DisplayLine::Raw(line) => self.format_raw_line(line, lineno_width, stylesheet, f),
-        }
-    }
-
-    fn format_inline_marks(
-        &self,
-        inline_marks: &[DisplayMark],
-        inline_marks_width: usize,
-        stylesheet: &Stylesheet,
-        f: &mut fmt::Formatter<'_>,
-    ) -> fmt::Result {
-        format_repeat_char(' ', inline_marks_width - inline_marks.len(), f)?;
-        for mark in inline_marks {
-            let annotation_style = get_annotation_style(&mark.annotation_type, stylesheet);
-            write!(f, "{}", annotation_style.render())?;
-            f.write_char(match mark.mark_type {
-                DisplayMarkType::AnnotationThrough => '|',
-                DisplayMarkType::AnnotationStart => '/',
-            })?;
-            write!(f, "{}", annotation_style.render_reset())?;
-        }
-        Ok(())
-    }
-
-    fn format_source_annotation(
-        &self,
-        annotation: &DisplaySourceAnnotation<'_>,
-        left: usize,
-        stylesheet: &Stylesheet,
-        f: &mut fmt::Formatter<'_>,
-    ) -> fmt::Result {
-        let indent_char = match annotation.annotation_part {
-            DisplayAnnotationPart::Standalone => ' ',
-            DisplayAnnotationPart::LabelContinuation => ' ',
-            DisplayAnnotationPart::MultilineStart => '_',
-            DisplayAnnotationPart::MultilineEnd => '_',
-        };
-        let mark = match annotation.annotation_type {
-            DisplayAnnotationType::Error => '^',
-            DisplayAnnotationType::Warning => '-',
-            DisplayAnnotationType::Info => '-',
-            DisplayAnnotationType::Note => '-',
-            DisplayAnnotationType::Help => '-',
-            DisplayAnnotationType::None => ' ',
-        };
-        let color = get_annotation_style(&annotation.annotation_type, stylesheet);
-        let range = (
-            annotation.range.0.saturating_sub(left),
-            annotation.range.1.saturating_sub(left),
-        );
-        let indent_length = match annotation.annotation_part {
-            DisplayAnnotationPart::LabelContinuation => range.1,
-            _ => range.0,
-        };
-        write!(f, "{}", color.render())?;
-        format_repeat_char(indent_char, indent_length + 1, f)?;
-        format_repeat_char(mark, range.1 - indent_length, f)?;
-        write!(f, "{}", color.render_reset())?;
-
-        if !is_annotation_empty(&annotation.annotation) {
-            f.write_char(' ')?;
-            write!(f, "{}", color.render())?;
-            self.format_annotation(
-                &annotation.annotation,
-                annotation.annotation_part == DisplayAnnotationPart::LabelContinuation,
-                true,
-                stylesheet,
-                f,
-            )?;
-            write!(f, "{}", color.render_reset())?;
+            DisplayLine::Raw(line) => {
+                self.format_raw_line(line_offset, line, lineno_width, stylesheet, buffer)
+            }
         }
-        Ok(())
     }
 }
 
 /// Inline annotation which can be used in either Raw or Source line.
-#[derive(Debug, PartialEq)]
+#[derive(Clone, Debug, PartialEq)]
 pub(crate) struct Annotation<'a> {
     pub(crate) annotation_type: DisplayAnnotationType,
     pub(crate) id: Option<&'a str>,
@@ -530,7 +783,7 @@ pub(crate) enum DisplaySourceLine<'a> {
     Empty,
 }
 
-#[derive(Debug, PartialEq)]
+#[derive(Clone, Debug, PartialEq)]
 pub(crate) struct DisplaySourceAnnotation<'a> {
     pub(crate) annotation: Annotation<'a>,
     pub(crate) range: (usize, usize),
@@ -538,6 +791,34 @@ pub(crate) struct DisplaySourceAnnotatio
     pub(crate) annotation_part: DisplayAnnotationPart,
 }
 
+impl DisplaySourceAnnotation<'_> {
+    fn has_label(&self) -> bool {
+        !self
+            .annotation
+            .label
+            .iter()
+            .all(|label| label.content.is_empty())
+    }
+
+    // Length of this annotation as displayed in the stderr output
+    fn len(&self) -> usize {
+        // Account for usize underflows
+        if self.range.1 > self.range.0 {
+            self.range.1 - self.range.0
+        } else {
+            self.range.0 - self.range.1
+        }
+    }
+
+    fn takes_space(&self) -> bool {
+        // Multiline annotations always have to keep vertical space.
+        matches!(
+            self.annotation_part,
+            DisplayAnnotationPart::MultilineStart(_) | DisplayAnnotationPart::MultilineEnd(_)
+        )
+    }
+}
+
 /// Raw line - a line which does not have the `lineno` part and is not considered
 /// a part of the snippet.
 #[derive(Debug, PartialEq)]
@@ -566,7 +847,7 @@ pub(crate) enum DisplayRawLine<'a> {
 }
 
 /// An inline text fragment which any label is composed of.
-#[derive(Debug, PartialEq)]
+#[derive(Clone, Debug, PartialEq)]
 pub(crate) struct DisplayTextFragment<'a> {
     pub(crate) content: &'a str,
     pub(crate) style: DisplayTextStyle,
@@ -589,9 +870,9 @@ pub(crate) enum DisplayAnnotationPart {
     /// A continuation of a multi-line label of an annotation.
     LabelContinuation,
     /// A line starting a multiline annotation.
-    MultilineStart,
+    MultilineStart(usize),
     /// A line ending a multiline annotation.
-    MultilineEnd,
+    MultilineEnd(usize),
 }
 
 /// A visual mark used in `inline_marks` field of the `DisplaySourceLine`.
@@ -605,9 +886,7 @@ pub(crate) struct DisplayMark {
 #[derive(Debug, Clone, PartialEq)]
 pub(crate) enum DisplayMarkType {
     /// A mark indicating a multiline annotation going through the current line.
-    AnnotationThrough,
-    /// A mark indicating a multiline annotation starting on the given line.
-    AnnotationStart,
+    AnnotationThrough(usize),
 }
 
 /// A type of the `Annotation` which may impact the sigils, style or text displayed.
@@ -653,7 +932,7 @@ pub(crate) enum DisplayHeaderType {
 
 struct CursorLines<'a>(&'a str);
 
-impl<'a> CursorLines<'a> {
+impl CursorLines<'_> {
     fn new(src: &str) -> CursorLines<'_> {
         CursorLines(src)
     }
@@ -661,9 +940,20 @@ impl<'a> CursorLines<'a> {
 
 #[derive(Copy, Clone, Debug, PartialEq)]
 pub(crate) enum EndLine {
-    Eof = 0,
-    Crlf = 1,
-    Lf = 2,
+    Eof,
+    Lf,
+    Crlf,
+}
+
+impl EndLine {
+    /// The number of characters this line ending occupies in bytes.
+    pub(crate) fn len(self) -> usize {
+        match self {
+            EndLine::Eof => 0,
+            EndLine::Lf => 1,
+            EndLine::Crlf => 2,
+        }
+    }
 }
 
 impl<'a> Iterator for CursorLines<'a> {
@@ -678,12 +968,12 @@ impl<'a> Iterator for CursorLines<'a> {
                 .map(|x| {
                     let ret = if 0 < x {
                         if self.0.as_bytes()[x - 1] == b'\r' {
-                            (&self.0[..x - 1], EndLine::Lf)
+                            (&self.0[..x - 1], EndLine::Crlf)
                         } else {
-                            (&self.0[..x], EndLine::Crlf)
+                            (&self.0[..x], EndLine::Lf)
                         }
                     } else {
-                        ("", EndLine::Crlf)
+                        ("", EndLine::Lf)
                     };
                     self.0 = &self.0[x + 1..];
                     ret
@@ -859,7 +1149,7 @@ fn format_header<'a>(
                 ..
             } = item
             {
-                if main_range >= range.0 && main_range <= range.1 + *end_line as usize {
+                if main_range >= range.0 && main_range < range.1 + max(*end_line as usize, 1) {
                     let char_column = text[0..(main_range - range.0).min(text.len())]
                         .chars()
                         .count();
@@ -902,7 +1192,7 @@ fn fold_prefix_suffix(mut snippet: snipp
     if let Some(before_new_start) = snippet.source[0..ann_start].rfind('\n') {
         let new_start = before_new_start + 1;
 
-        let line_offset = snippet.source[..new_start].lines().count();
+        let line_offset = newline_count(&snippet.source[..new_start]);
         snippet.line_start += line_offset;
 
         snippet.source = &snippet.source[new_start..];
@@ -928,6 +1218,17 @@ fn fold_prefix_suffix(mut snippet: snipp
     snippet
 }
 
+fn newline_count(body: &str) -> usize {
+    #[cfg(feature = "simd")]
+    {
+        memchr::memchr_iter(b'\n', body.as_bytes()).count()
+    }
+    #[cfg(not(feature = "simd"))]
+    {
+        body.lines().count()
+    }
+}
+
 fn fold_body(body: Vec<DisplayLine<'_>>) -> Vec<DisplayLine<'_>> {
     const INNER_CONTEXT: usize = 1;
     const INNER_UNFOLD_SIZE: usize = INNER_CONTEXT * 2 + 1;
@@ -936,18 +1237,8 @@ fn fold_body(body: Vec<DisplayLine<'_>>)
     let mut unhighlighed_lines = vec![];
     for line in body {
         match &line {
-            DisplayLine::Source {
-                annotations,
-                inline_marks,
-                ..
-            } => {
-                if annotations.is_empty()
-                    // A multiline start mark (`/`) needs be treated as an
-                    // annotation or the line could get folded.
-                    && inline_marks
-                        .iter()
-                        .all(|m| m.mark_type != DisplayMarkType::AnnotationStart)
-                {
+            DisplayLine::Source { annotations, .. } => {
+                if annotations.is_empty() {
                     unhighlighed_lines.push(line);
                 } else {
                     if lines.is_empty() {
@@ -969,10 +1260,7 @@ fn fold_body(body: Vec<DisplayLine<'_>>)
                                         ref inline_marks, ..
                                     } = line
                                     {
-                                        let mut inline_marks = inline_marks.clone();
-                                        for mark in &mut inline_marks {
-                                            mark.mark_type = DisplayMarkType::AnnotationThrough;
-                                        }
+                                        let inline_marks = inline_marks.clone();
                                         Some(inline_marks)
                                     } else {
                                         None
@@ -1015,10 +1303,7 @@ fn format_body(
             None
         }
     }) {
-        panic!(
-            "SourceAnnotation range `{:?}` is beyond the end of buffer `{}`",
-            bigger, source_len
-        )
+        panic!("SourceAnnotation range `{bigger:?}` is beyond the end of buffer `{source_len}`")
     }
 
     let mut body = vec![];
@@ -1031,11 +1316,68 @@ fn format_body(
     let mut label_right_margin = 0;
     let mut max_line_len = 0;
 
+    let mut depth_map: HashMap<usize, usize> = HashMap::new();
+    let mut current_depth = 0;
     let mut annotations = snippet.annotations;
+    let ranges = annotations
+        .iter()
+        .map(|a| a.range.clone())
+        .collect::<Vec<_>>();
+    // We want to merge multiline annotations that have the same range into one
+    // multiline annotation to save space. This is done by making any duplicate
+    // multiline annotations into a single-line annotation pointing at the end
+    // of the range.
+    //
+    // 3 |       X0 Y0 Z0
+    //   |  _____^
+    //   | | ____|
+    //   | || ___|
+    //   | |||
+    // 4 | |||   X1 Y1 Z1
+    // 5 | |||   X2 Y2 Z2
+    //   | |||    ^
+    //   | |||____|
+    //   |  ||____`X` is a good letter
+    //   |   |____`Y` is a good letter too
+    //   |        `Z` label
+    // Should be
+    // error: foo
+    //  --> test.rs:3:3
+    //   |
+    // 3 | /   X0 Y0 Z0
+    // 4 | |   X1 Y1 Z1
+    // 5 | |   X2 Y2 Z2
+    //   | |    ^
+    //   | |____|
+    //   |      `X` is a good letter
+    //   |      `Y` is a good letter too
+    //   |      `Z` label
+    //   |
+    ranges.iter().enumerate().for_each(|(r_idx, range)| {
+        annotations
+            .iter_mut()
+            .enumerate()
+            .skip(r_idx + 1)
+            .for_each(|(ann_idx, ann)| {
+                // Skip if the annotation's index matches the range index
+                if ann_idx != r_idx
+                    // We only want to merge multiline annotations
+                    && snippet.source[ann.range.clone()].lines().count() > 1
+                    // We only want to merge annotations that have the same range
+                    && ann.range.start == range.start
+                    && ann.range.end == range.end
+                {
+                    ann.range.start = ann.range.end.saturating_sub(1);
+                }
+            });
+    });
+    annotations.sort_by_key(|a| a.range.start);
+    let mut annotations = annotations.into_iter().enumerate().collect::<Vec<_>>();
+
     for (idx, (line, end_line)) in CursorLines::new(snippet.source).enumerate() {
         let line_length: usize = line.len();
         let line_range = (current_index, current_index + line_length);
-        let end_line_size = end_line as usize;
+        let end_line_size = end_line.len();
         body.push(DisplayLine::Source {
             lineno: Some(current_line),
             inline_marks: vec![],
@@ -1069,7 +1411,7 @@ fn format_body(
         current_index += line_length + end_line_size;
 
         // It would be nice to use filter_drain here once it's stable.
-        annotations.retain(|annotation| {
+        annotations.retain(|(key, annotation)| {
             let body_idx = idx;
             let annotation_type = match annotation.level {
                 snippet::Level::Error => DisplayAnnotationType::None,
@@ -1136,20 +1478,7 @@ fn format_body(
                         && start <= line_end_index + end_line_size.saturating_sub(1)
                         && end > line_end_index =>
                 {
-                    // Special case for multiline annotations that start at the
-                    // beginning of a line, which requires a special mark (`/`)
-                    if start - line_start_index == 0 {
-                        if let DisplayLine::Source {
-                            ref mut inline_marks,
-                            ..
-                        } = body[body_idx]
-                        {
-                            inline_marks.push(DisplayMark {
-                                mark_type: DisplayMarkType::AnnotationStart,
-                                annotation_type: DisplayAnnotationType::from(annotation.level),
-                            });
-                        }
-                    } else if let DisplayLine::Source {
+                    if let DisplayLine::Source {
                         ref mut annotations,
                         ..
                     } = body[body_idx]
@@ -1175,8 +1504,10 @@ fn format_body(
                             },
                             range,
                             annotation_type: DisplayAnnotationType::from(annotation.level),
-                            annotation_part: DisplayAnnotationPart::MultilineStart,
+                            annotation_part: DisplayAnnotationPart::MultilineStart(current_depth),
                         });
+                        depth_map.insert(*key, current_depth);
+                        current_depth += 1;
                     }
                     true
                 }
@@ -1190,8 +1521,9 @@ fn format_body(
                         ..
                     } = body[body_idx]
                     {
+                        let depth = depth_map.get(key).cloned().unwrap_or_default();
                         inline_marks.push(DisplayMark {
-                            mark_type: DisplayMarkType::AnnotationThrough,
+                            mark_type: DisplayMarkType::AnnotationThrough(depth),
                             annotation_type: DisplayAnnotationType::from(annotation.level),
                         });
                     }
@@ -1207,15 +1539,10 @@ fn format_body(
                         && end <= line_end_index + max(end_line_size, 1) =>
                 {
                     if let DisplayLine::Source {
-                        ref mut inline_marks,
                         ref mut annotations,
                         ..
                     } = body[body_idx]
                     {
-                        inline_marks.push(DisplayMark {
-                            mark_type: DisplayMarkType::AnnotationThrough,
-                            annotation_type: DisplayAnnotationType::from(annotation.level),
-                        });
                         let end_mark = line[0..(end - line_start_index).min(line_length)]
                             .chars()
                             .map(|c| unicode_width::UnicodeWidthChar::width(c).unwrap_or(0))
@@ -1237,6 +1564,7 @@ fn format_body(
                         label_right_margin = max(label_right_margin, end_plus_one + label_right);
 
                         let range = (end_mark, end_plus_one);
+                        let depth = depth_map.remove(key).unwrap_or(0);
                         annotations.push(DisplaySourceAnnotation {
                             annotation: Annotation {
                                 annotation_type,
@@ -1245,7 +1573,7 @@ fn format_body(
                             },
                             range,
                             annotation_type: DisplayAnnotationType::from(annotation.level),
-                            annotation_part: DisplayAnnotationPart::MultilineEnd,
+                            annotation_part: DisplayAnnotationPart::MultilineEnd(depth),
                         });
                     }
                     false
@@ -1253,6 +1581,12 @@ fn format_body(
                 _ => true,
             }
         });
+        // Reset the depth counter, but only after we've processed all
+        // annotations for a given line.
+        let max = depth_map.len();
+        if current_depth > max {
+            current_depth = max;
+        }
     }
 
     if snippet.fold {
@@ -1313,25 +1647,15 @@ fn format_body(
     }
 }
 
-fn format_repeat_char(c: char, n: usize, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-    for _ in 0..n {
-        f.write_char(c)?;
-    }
-    Ok(())
-}
-
 #[inline]
-fn format_annotation_type(
-    annotation_type: &DisplayAnnotationType,
-    f: &mut fmt::Formatter<'_>,
-) -> fmt::Result {
+fn annotation_type_str(annotation_type: &DisplayAnnotationType) -> &'static str {
     match annotation_type {
-        DisplayAnnotationType::Error => f.write_str(ERROR_TXT),
-        DisplayAnnotationType::Help => f.write_str(HELP_TXT),
-        DisplayAnnotationType::Info => f.write_str(INFO_TXT),
-        DisplayAnnotationType::Note => f.write_str(NOTE_TXT),
-        DisplayAnnotationType::Warning => f.write_str(WARNING_TXT),
-        DisplayAnnotationType::None => Ok(()),
+        DisplayAnnotationType::Error => ERROR_TXT,
+        DisplayAnnotationType::Help => HELP_TXT,
+        DisplayAnnotationType::Info => INFO_TXT,
+        DisplayAnnotationType::Note => NOTE_TXT,
+        DisplayAnnotationType::Warning => WARNING_TXT,
+        DisplayAnnotationType::None => "",
     }
 }
 
@@ -1390,3 +1714,30 @@ fn normalize_whitespace(str: &str) -> St
     }
     s
 }
+
+fn overlaps(
+    a1: &DisplaySourceAnnotation<'_>,
+    a2: &DisplaySourceAnnotation<'_>,
+    padding: usize,
+) -> bool {
+    (a2.range.0..a2.range.1).contains(&a1.range.0)
+        || (a1.range.0..a1.range.1 + padding).contains(&a2.range.0)
+}
+
+fn format_inline_marks(
+    line: usize,
+    inline_marks: &[DisplayMark],
+    lineno_width: usize,
+    stylesheet: &Stylesheet,
+    buf: &mut StyledBuffer,
+) -> fmt::Result {
+    for mark in inline_marks.iter() {
+        let annotation_style = get_annotation_style(&mark.annotation_type, stylesheet);
+        match mark.mark_type {
+            DisplayMarkType::AnnotationThrough(depth) => {
+                buf.putc(line, 3 + lineno_width + depth, '|', *annotation_style);
+            }
+        };
+    }
+    Ok(())
+}
diff -pruN 0.11.4-1/src/renderer/mod.rs 0.11.5-1/src/renderer/mod.rs
--- 0.11.4-1/src/renderer/mod.rs	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/src/renderer/mod.rs	2006-07-24 01:21:28.000000000 +0000
@@ -12,6 +12,7 @@
 
 mod display_list;
 mod margin;
+mod styled_buffer;
 pub(crate) mod stylesheet;
 
 use crate::snippet::Message;
diff -pruN 0.11.4-1/src/renderer/styled_buffer.rs 0.11.5-1/src/renderer/styled_buffer.rs
--- 0.11.4-1/src/renderer/styled_buffer.rs	1970-01-01 00:00:00.000000000 +0000
+++ 0.11.5-1/src/renderer/styled_buffer.rs	2006-07-24 01:21:28.000000000 +0000
@@ -0,0 +1,97 @@
+//! Adapted from [styled_buffer]
+//!
+//! [styled_buffer]: https://github.com/rust-lang/rust/blob/894f7a4ba6554d3797404bbf550d9919df060b97/compiler/rustc_errors/src/styled_buffer.rs
+
+use crate::renderer::stylesheet::Stylesheet;
+use anstyle::Style;
+use std::fmt;
+use std::fmt::Write;
+
+#[derive(Debug)]
+pub(crate) struct StyledBuffer {
+    lines: Vec<Vec<StyledChar>>,
+}
+
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub(crate) struct StyledChar {
+    ch: char,
+    style: Style,
+}
+
+impl StyledChar {
+    pub(crate) const SPACE: Self = StyledChar::new(' ', Style::new());
+
+    pub(crate) const fn new(ch: char, style: Style) -> StyledChar {
+        StyledChar { ch, style }
+    }
+}
+
+impl StyledBuffer {
+    pub(crate) fn new() -> StyledBuffer {
+        StyledBuffer { lines: vec![] }
+    }
+
+    fn ensure_lines(&mut self, line: usize) {
+        if line >= self.lines.len() {
+            self.lines.resize(line + 1, Vec::new());
+        }
+    }
+
+    pub(crate) fn render(&self, stylesheet: &Stylesheet) -> Result<String, fmt::Error> {
+        let mut str = String::new();
+        for (i, line) in self.lines.iter().enumerate() {
+            let mut current_style = stylesheet.none;
+            for ch in line {
+                if ch.style != current_style {
+                    if !line.is_empty() {
+                        write!(str, "{}", current_style.render_reset())?;
+                    }
+                    current_style = ch.style;
+                    write!(str, "{}", current_style.render())?;
+                }
+                write!(str, "{}", ch.ch)?;
+            }
+            write!(str, "{}", current_style.render_reset())?;
+            if i != self.lines.len() - 1 {
+                writeln!(str)?;
+            }
+        }
+        Ok(str)
+    }
+
+    /// Sets `chr` with `style` for given `line`, `col`.
+    /// If `line` does not exist in our buffer, adds empty lines up to the given
+    /// and fills the last line with unstyled whitespace.
+    pub(crate) fn putc(&mut self, line: usize, col: usize, chr: char, style: Style) {
+        self.ensure_lines(line);
+        if col >= self.lines[line].len() {
+            self.lines[line].resize(col + 1, StyledChar::SPACE);
+        }
+        self.lines[line][col] = StyledChar::new(chr, style);
+    }
+
+    /// Sets `string` with `style` for given `line`, starting from `col`.
+    /// If `line` does not exist in our buffer, adds empty lines up to the given
+    /// and fills the last line with unstyled whitespace.
+    pub(crate) fn puts(&mut self, line: usize, col: usize, string: &str, style: Style) {
+        let mut n = col;
+        for c in string.chars() {
+            self.putc(line, n, c, style);
+            n += 1;
+        }
+    }
+    /// For given `line` inserts `string` with `style` after old content of that line,
+    /// adding lines if needed
+    pub(crate) fn append(&mut self, line: usize, string: &str, style: Style) {
+        if line >= self.lines.len() {
+            self.puts(line, 0, string, style);
+        } else {
+            let col = self.lines[line].len();
+            self.puts(line, col, string, style);
+        }
+    }
+
+    pub(crate) fn num_lines(&self) -> usize {
+        self.lines.len()
+    }
+}
diff -pruN 0.11.4-1/tests/examples.rs 0.11.5-1/tests/examples.rs
--- 0.11.4-1/tests/examples.rs	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/examples.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,37 +0,0 @@
-#[test]
-fn expected_type() {
-    let target = "expected_type";
-    let expected = snapbox::file!["../examples/expected_type.svg": TermSvg];
-    assert_example(target, expected);
-}
-
-#[test]
-fn footer() {
-    let target = "footer";
-    let expected = snapbox::file!["../examples/footer.svg": TermSvg];
-    assert_example(target, expected);
-}
-
-#[test]
-fn format() {
-    let target = "format";
-    let expected = snapbox::file!["../examples/format.svg": TermSvg];
-    assert_example(target, expected);
-}
-
-#[test]
-fn multislice() {
-    let target = "multislice";
-    let expected = snapbox::file!["../examples/multislice.svg": TermSvg];
-    assert_example(target, expected);
-}
-
-#[track_caller]
-fn assert_example(target: &str, expected: snapbox::Data) {
-    let bin_path = snapbox::cmd::compile_example(target, ["--features=testing-colors"]).unwrap();
-    snapbox::cmd::Command::new(bin_path)
-        .env("CLICOLOR_FORCE", "1")
-        .assert()
-        .success()
-        .stdout_eq(expected.raw());
-}
diff -pruN 0.11.4-1/tests/fixtures/deserialize.rs 0.11.5-1/tests/fixtures/deserialize.rs
--- 0.11.4-1/tests/fixtures/deserialize.rs	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/deserialize.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,166 +0,0 @@
-use serde::{Deserialize, Deserializer, Serialize};
-use std::ops::Range;
-
-use annotate_snippets::renderer::DEFAULT_TERM_WIDTH;
-use annotate_snippets::{Annotation, Level, Message, Renderer, Snippet};
-
-#[derive(Deserialize)]
-pub(crate) struct Fixture<'a> {
-    #[serde(default)]
-    pub(crate) renderer: RendererDef,
-    #[serde(borrow)]
-    pub(crate) message: MessageDef<'a>,
-}
-
-#[derive(Deserialize)]
-pub struct MessageDef<'a> {
-    #[serde(with = "LevelDef")]
-    pub level: Level,
-    #[serde(borrow)]
-    pub title: &'a str,
-    #[serde(default)]
-    #[serde(borrow)]
-    pub id: Option<&'a str>,
-    #[serde(default)]
-    #[serde(borrow)]
-    pub footer: Vec<MessageDef<'a>>,
-    #[serde(deserialize_with = "deserialize_snippets")]
-    #[serde(borrow)]
-    pub snippets: Vec<Snippet<'a>>,
-}
-
-impl<'a> From<MessageDef<'a>> for Message<'a> {
-    fn from(val: MessageDef<'a>) -> Self {
-        let MessageDef {
-            level,
-            title,
-            id,
-            footer,
-            snippets,
-        } = val;
-        let mut message = level.title(title);
-        if let Some(id) = id {
-            message = message.id(id);
-        }
-        message = message.snippets(snippets);
-        message = message.footers(footer.into_iter().map(Into::into));
-        message
-    }
-}
-
-fn deserialize_snippets<'de, D>(deserializer: D) -> Result<Vec<Snippet<'de>>, D::Error>
-where
-    D: Deserializer<'de>,
-{
-    #[derive(Deserialize)]
-    struct Wrapper<'a>(
-        #[serde(with = "SnippetDef")]
-        #[serde(borrow)]
-        SnippetDef<'a>,
-    );
-
-    let v = Vec::deserialize(deserializer)?;
-    Ok(v.into_iter().map(|Wrapper(a)| a.into()).collect())
-}
-
-#[derive(Deserialize)]
-pub struct SnippetDef<'a> {
-    #[serde(borrow)]
-    pub source: &'a str,
-    pub line_start: usize,
-    #[serde(borrow)]
-    pub origin: Option<&'a str>,
-    #[serde(deserialize_with = "deserialize_annotations")]
-    #[serde(borrow)]
-    pub annotations: Vec<Annotation<'a>>,
-    #[serde(default)]
-    pub fold: bool,
-}
-
-impl<'a> From<SnippetDef<'a>> for Snippet<'a> {
-    fn from(val: SnippetDef<'a>) -> Self {
-        let SnippetDef {
-            source,
-            line_start,
-            origin,
-            annotations,
-            fold,
-        } = val;
-        let mut snippet = Snippet::source(source).line_start(line_start).fold(fold);
-        if let Some(origin) = origin {
-            snippet = snippet.origin(origin);
-        }
-        snippet = snippet.annotations(annotations);
-        snippet
-    }
-}
-
-fn deserialize_annotations<'de, D>(deserializer: D) -> Result<Vec<Annotation<'de>>, D::Error>
-where
-    D: Deserializer<'de>,
-{
-    #[derive(Deserialize)]
-    struct Wrapper<'a>(#[serde(borrow)] AnnotationDef<'a>);
-
-    let v = Vec::deserialize(deserializer)?;
-    Ok(v.into_iter().map(|Wrapper(a)| a.into()).collect())
-}
-
-#[derive(Serialize, Deserialize)]
-pub struct AnnotationDef<'a> {
-    pub range: Range<usize>,
-    #[serde(borrow)]
-    pub label: &'a str,
-    #[serde(with = "LevelDef")]
-    pub level: Level,
-}
-
-impl<'a> From<AnnotationDef<'a>> for Annotation<'a> {
-    fn from(val: AnnotationDef<'a>) -> Self {
-        let AnnotationDef {
-            range,
-            label,
-            level,
-        } = val;
-        level.span(range).label(label)
-    }
-}
-
-#[derive(Serialize, Deserialize)]
-pub(crate) struct LabelDef<'a> {
-    #[serde(with = "LevelDef")]
-    pub(crate) level: Level,
-    #[serde(borrow)]
-    pub(crate) label: &'a str,
-}
-
-#[allow(dead_code)]
-#[derive(Serialize, Deserialize)]
-#[serde(remote = "Level")]
-enum LevelDef {
-    Error,
-    Warning,
-    Info,
-    Note,
-    Help,
-}
-
-#[derive(Default, Deserialize)]
-pub struct RendererDef {
-    #[serde(default)]
-    anonymized_line_numbers: bool,
-    #[serde(default)]
-    term_width: Option<usize>,
-}
-
-impl From<RendererDef> for Renderer {
-    fn from(val: RendererDef) -> Self {
-        let RendererDef {
-            anonymized_line_numbers,
-            term_width,
-        } = val;
-        Renderer::plain()
-            .anonymized_line_numbers(anonymized_line_numbers)
-            .term_width(term_width.unwrap_or(DEFAULT_TERM_WIDTH))
-    }
-}
diff -pruN 0.11.4-1/tests/fixtures/main.rs 0.11.5-1/tests/fixtures/main.rs
--- 0.11.4-1/tests/fixtures/main.rs	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/main.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,32 +0,0 @@
-mod deserialize;
-
-use crate::deserialize::Fixture;
-use annotate_snippets::{Message, Renderer};
-use snapbox::data::DataFormat;
-use snapbox::Data;
-use std::error::Error;
-
-fn main() {
-    #[cfg(not(windows))]
-    tryfn::Harness::new("tests/fixtures/", setup, test)
-        .select(["*/*.toml"])
-        .test();
-}
-
-fn setup(input_path: std::path::PathBuf) -> tryfn::Case {
-    let name = input_path.file_name().unwrap().to_str().unwrap().to_owned();
-    let expected = Data::read_from(&input_path.with_extension("svg"), None);
-    tryfn::Case {
-        name,
-        fixture: input_path,
-        expected,
-    }
-}
-
-fn test(input_path: &std::path::Path) -> Result<Data, Box<dyn Error>> {
-    let src = std::fs::read_to_string(input_path)?;
-    let (renderer, message): (Renderer, Message<'_>) =
-        toml::from_str(&src).map(|a: Fixture<'_>| (a.renderer.into(), a.message.into()))?;
-    let actual = renderer.render(message).to_string();
-    Ok(Data::from(actual).coerce_to(DataFormat::TermSvg))
-}
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_eof.svg 0.11.5-1/tests/fixtures/no-color/ann_eof.svg
--- 0.11.4-1/tests/fixtures/no-color/ann_eof.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_eof.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<svg width="740px" height="128px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error: expected `.`, `=`</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan> --&gt; Cargo.toml:1:5</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>  |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>1 | asdf</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>  |     ^</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>  |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_eof.toml 0.11.5-1/tests/fixtures/no-color/ann_eof.toml
--- 0.11.4-1/tests/fixtures/no-color/ann_eof.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_eof.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,12 +0,0 @@
-[message]
-level = "Error"
-title = "expected `.`, `=`"
-
-[[message.snippets]]
-source = "asdf"
-line_start = 1
-origin = "Cargo.toml"
-[[message.snippets.annotations]]
-label = ""
-level = "Error"
-range = [4, 4]
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_insertion.svg 0.11.5-1/tests/fixtures/no-color/ann_insertion.svg
--- 0.11.4-1/tests/fixtures/no-color/ann_insertion.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_insertion.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<svg width="740px" height="128px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error: expected `.`, `=`</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan> --&gt; Cargo.toml:1:3</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>  |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>1 | asf</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>  |   ^ 'd' belongs here</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>  |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_insertion.toml 0.11.5-1/tests/fixtures/no-color/ann_insertion.toml
--- 0.11.4-1/tests/fixtures/no-color/ann_insertion.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_insertion.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,12 +0,0 @@
-[message]
-level = "Error"
-title = "expected `.`, `=`"
-
-[[message.snippets]]
-source = "asf"
-line_start = 1
-origin = "Cargo.toml"
-[[message.snippets.annotations]]
-label = "'d' belongs here"
-level = "Error"
-range = [2, 2]
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_multiline.svg 0.11.5-1/tests/fixtures/no-color/ann_multiline.svg
--- 0.11.4-1/tests/fixtures/no-color/ann_multiline.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_multiline.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,39 +0,0 @@
-<svg width="740px" height="182px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error[E0027]: pattern does not mention fields `lineno`, `content`</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan>   --&gt; src/display_list.rs:139:32</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>    |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>139 |                           if let DisplayLine::Source {</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>    |  ________________________________^</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>140 | |                             ref mut inline_marks,</tspan>
-</tspan>
-    <tspan x="10px" y="136px"><tspan>141 | |                         } = body[body_idx]</tspan>
-</tspan>
-    <tspan x="10px" y="154px"><tspan>    | |_________________________^ missing fields `lineno`, `content`</tspan>
-</tspan>
-    <tspan x="10px" y="172px"><tspan>    |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_multiline.toml 0.11.5-1/tests/fixtures/no-color/ann_multiline.toml
--- 0.11.4-1/tests/fixtures/no-color/ann_multiline.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_multiline.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[message]
-level = "Error"
-id = "E0027"
-title = "pattern does not mention fields `lineno`, `content`"
-
-[[message.snippets]]
-source = """
-                        if let DisplayLine::Source {
-                            ref mut inline_marks,
-                        } = body[body_idx]
-"""
-line_start = 139
-origin = "src/display_list.rs"
-fold = false
-[[message.snippets.annotations]]
-label = "missing fields `lineno`, `content`"
-level = "Error"
-range = [31, 128]
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_multiline2.svg 0.11.5-1/tests/fixtures/no-color/ann_multiline2.svg
--- 0.11.4-1/tests/fixtures/no-color/ann_multiline2.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_multiline2.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,37 +0,0 @@
-<svg width="740px" height="164px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error[E####]: spacing error found</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan>  --&gt; foo.txt:26:12</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>   |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>26 | This is an example</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>   |            ^^^^^^^ this should not be on separate lines</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>27 | of an edge case of an annotation overflowing</tspan>
-</tspan>
-    <tspan x="10px" y="136px"><tspan>28 | to exactly one character on next line.</tspan>
-</tspan>
-    <tspan x="10px" y="154px"><tspan>   |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_multiline2.toml 0.11.5-1/tests/fixtures/no-color/ann_multiline2.toml
--- 0.11.4-1/tests/fixtures/no-color/ann_multiline2.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_multiline2.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[message]
-level = "Error"
-id = "E####"
-title = "spacing error found"
-
-[[message.snippets]]
-source = """
-This is an example
-of an edge case of an annotation overflowing
-to exactly one character on next line.
-"""
-line_start = 26
-origin = "foo.txt"
-fold = false
-[[message.snippets.annotations]]
-label = "this should not be on separate lines"
-level = "Error"
-range = [11, 19]
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_removed_nl.svg 0.11.5-1/tests/fixtures/no-color/ann_removed_nl.svg
--- 0.11.4-1/tests/fixtures/no-color/ann_removed_nl.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_removed_nl.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<svg width="740px" height="128px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error: expected `.`, `=`</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan> --&gt; Cargo.toml:1:5</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>  |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>1 | asdf</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>  |     ^</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>  |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/ann_removed_nl.toml 0.11.5-1/tests/fixtures/no-color/ann_removed_nl.toml
--- 0.11.4-1/tests/fixtures/no-color/ann_removed_nl.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ann_removed_nl.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,12 +0,0 @@
-[message]
-level = "Error"
-title = "expected `.`, `=`"
-
-[[message.snippets]]
-source = "asdf"
-line_start = 1
-origin = "Cargo.toml"
-[[message.snippets.annotations]]
-label = ""
-level = "Error"
-range = [4, 5]
diff -pruN 0.11.4-1/tests/fixtures/no-color/ensure-emoji-highlight-width.svg 0.11.5-1/tests/fixtures/no-color/ensure-emoji-highlight-width.svg
--- 0.11.4-1/tests/fixtures/no-color/ensure-emoji-highlight-width.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ensure-emoji-highlight-width.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<svg width="1356px" height="128px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error: invalid character ` ` in package name: `haha this isn't a valid name 🐛`, characters must be Unicode XID characters (numbers, `-`, `_`, or most letters)</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan> --&gt; &lt;file&gt;:7:1</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>  |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>7 | "haha this isn't a valid name 🐛" = { package = "libc", version = "0.1" }</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>  |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/ensure-emoji-highlight-width.toml 0.11.5-1/tests/fixtures/no-color/ensure-emoji-highlight-width.toml
--- 0.11.4-1/tests/fixtures/no-color/ensure-emoji-highlight-width.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/ensure-emoji-highlight-width.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,15 +0,0 @@
-[message]
-title = "invalid character ` ` in package name: `haha this isn't a valid name 🐛`, characters must be Unicode XID characters (numbers, `-`, `_`, or most letters)"
-level = "Error"
-
-
-[[message.snippets]]
-source = """
-"haha this isn't a valid name 🐛" = { package = "libc", version = "0.1" }
-"""
-line_start = 7
-origin = "<file>"
-[[message.snippets.annotations]]
-label = ""
-level = "Error"
-range = [0, 35]
diff -pruN 0.11.4-1/tests/fixtures/no-color/fold_ann_multiline.svg 0.11.5-1/tests/fixtures/no-color/fold_ann_multiline.svg
--- 0.11.4-1/tests/fixtures/no-color/fold_ann_multiline.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/fold_ann_multiline.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,45 +0,0 @@
-<svg width="869px" height="236px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error[E0308]: mismatched types</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan>  --&gt; src/format.rs:51:6</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>   |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>51 |   ) -&gt; Option&lt;String&gt; {</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>   |        -------------- expected `std::option::Option&lt;std::string::String&gt;` because of return type</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>52 | /     for ann in annotations {</tspan>
-</tspan>
-    <tspan x="10px" y="136px"><tspan>53 | |         match (ann.range.0, ann.range.1) {</tspan>
-</tspan>
-    <tspan x="10px" y="154px"><tspan>...  |</tspan>
-</tspan>
-    <tspan x="10px" y="172px"><tspan>71 | |         }</tspan>
-</tspan>
-    <tspan x="10px" y="190px"><tspan>72 | |     }</tspan>
-</tspan>
-    <tspan x="10px" y="208px"><tspan>   | |_____^ expected enum `std::option::Option`, found ()</tspan>
-</tspan>
-    <tspan x="10px" y="226px"><tspan>   |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/fold_ann_multiline.toml 0.11.5-1/tests/fixtures/no-color/fold_ann_multiline.toml
--- 0.11.4-1/tests/fixtures/no-color/fold_ann_multiline.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/fold_ann_multiline.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,41 +0,0 @@
-[message]
-level = "Error"
-id = "E0308"
-title = "mismatched types"
-
-[[message.snippets]]
-source = """
-) -> Option<String> {
-    for ann in annotations {
-        match (ann.range.0, ann.range.1) {
-            (None, None) => continue,
-            (Some(start), Some(end)) if start > end_index || end < start_index => continue,
-            (Some(start), Some(end)) if start >= start_index && end <= end_index => {
-                let label = if let Some(ref label) = ann.label {
-                    format!(" {}", label)
-                } else {
-                    String::from("")
-                };
-
-                return Some(format!(
-                    "{}{}{}",
-                    " ".repeat(start - start_index),
-                    "^".repeat(end - start),
-                    label
-                ));
-            }
-            _ => continue,
-        }
-    }
-"""
-line_start = 51
-origin = "src/format.rs"
-fold = true
-[[message.snippets.annotations]]
-label = "expected `std::option::Option<std::string::String>` because of return type"
-level = "Warning"
-range = [5, 19]
-[[message.snippets.annotations]]
-label = "expected enum `std::option::Option`, found ()"
-level = "Error"
-range = [22, 766]
diff -pruN 0.11.4-1/tests/fixtures/no-color/fold_bad_origin_line.svg 0.11.5-1/tests/fixtures/no-color/fold_bad_origin_line.svg
--- 0.11.4-1/tests/fixtures/no-color/fold_bad_origin_line.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/fold_bad_origin_line.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<svg width="740px" height="128px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan> --&gt; path/to/error.rs:3:1</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>  |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>3 | invalid syntax</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>  | -------------- error here</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>  |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/fold_bad_origin_line.toml 0.11.5-1/tests/fixtures/no-color/fold_bad_origin_line.toml
--- 0.11.4-1/tests/fixtures/no-color/fold_bad_origin_line.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/fold_bad_origin_line.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,17 +0,0 @@
-[message]
-level = "Error"
-title = ""
-
-[[message.snippets]]
-source = """
-
-
-invalid syntax
-"""
-line_start = 1
-origin = "path/to/error.rs"
-fold = true
-[[message.snippets.annotations]]
-label = "error here"
-level = "Warning"
-range = [2,16]
diff -pruN 0.11.4-1/tests/fixtures/no-color/fold_leading.svg 0.11.5-1/tests/fixtures/no-color/fold_leading.svg
--- 0.11.4-1/tests/fixtures/no-color/fold_leading.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/fold_leading.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<svg width="740px" height="128px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error[E0308]: invalid type: integer `20`, expected a bool</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan>  --&gt; Cargo.toml:11:13</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>   |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>11 | workspace = 20</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>   |             ^^</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>   |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/fold_leading.toml 0.11.5-1/tests/fixtures/no-color/fold_leading.toml
--- 0.11.4-1/tests/fixtures/no-color/fold_leading.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/fold_leading.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,26 +0,0 @@
-[message]
-level = "Error"
-id = "E0308"
-title = "invalid type: integer `20`, expected a bool"
-
-[[message.snippets]]
-source = """
-[workspace]
-
-[package]
-name = "hello"
-version = "1.0.0"
-license = "MIT"
-rust-version = "1.70"
-edition = "2021"
-
-[lints]
-workspace = 20
-"""
-line_start = 1
-origin = "Cargo.toml"
-fold = true
-[[message.snippets.annotations]]
-label = ""
-level = "Error"
-range = [132, 134]
diff -pruN 0.11.4-1/tests/fixtures/no-color/fold_trailing.svg 0.11.5-1/tests/fixtures/no-color/fold_trailing.svg
--- 0.11.4-1/tests/fixtures/no-color/fold_trailing.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/fold_trailing.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<svg width="740px" height="128px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error[E0308]: invalid type: integer `20`, expected a lints table</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan> --&gt; Cargo.toml:1:9</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>  |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>1 | lints = 20</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>  |         ^^</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>  |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/fold_trailing.toml 0.11.5-1/tests/fixtures/no-color/fold_trailing.toml
--- 0.11.4-1/tests/fixtures/no-color/fold_trailing.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/fold_trailing.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,25 +0,0 @@
-[message]
-level = "Error"
-id = "E0308"
-title = "invalid type: integer `20`, expected a lints table"
-
-[[message.snippets]]
-source = """
-lints = 20
-
-[workspace]
-
-[package]
-name = "hello"
-version = "1.0.0"
-license = "MIT"
-rust-version = "1.70"
-edition = "2021"
-"""
-line_start = 1
-origin = "Cargo.toml"
-fold = true
-[[message.snippets.annotations]]
-label = ""
-level = "Error"
-range = [8, 10]
diff -pruN 0.11.4-1/tests/fixtures/no-color/issue_9.svg 0.11.5-1/tests/fixtures/no-color/issue_9.svg
--- 0.11.4-1/tests/fixtures/no-color/issue_9.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/issue_9.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,45 +0,0 @@
-<svg width="911px" height="236px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error: expected one of `.`, `;`, `?`, or an operator, found `for`</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan> --&gt; /code/rust/src/test/ui/annotate-snippet/suggestion.rs:4:5</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>  |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>4 | let x = vec![1];</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>  |     - move occurs because `x` has type `std::vec::Vec&lt;i32&gt;`, which does not implement the `Copy` trait</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>  |</tspan>
-</tspan>
-    <tspan x="10px" y="136px"><tspan>7 | let y = x;</tspan>
-</tspan>
-    <tspan x="10px" y="154px"><tspan>  |         - value moved here</tspan>
-</tspan>
-    <tspan x="10px" y="172px"><tspan>  |</tspan>
-</tspan>
-    <tspan x="10px" y="190px"><tspan>9 | x;</tspan>
-</tspan>
-    <tspan x="10px" y="208px"><tspan>  | ^ value used here after move</tspan>
-</tspan>
-    <tspan x="10px" y="226px"><tspan>  |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/issue_9.toml 0.11.5-1/tests/fixtures/no-color/issue_9.toml
--- 0.11.4-1/tests/fixtures/no-color/issue_9.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/issue_9.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,28 +0,0 @@
-[message]
-level = "Error"
-title = "expected one of `.`, `;`, `?`, or an operator, found `for`"
-
-[[message.snippets]]
-source = "let x = vec![1];"
-line_start = 4
-origin = "/code/rust/src/test/ui/annotate-snippet/suggestion.rs"
-[[message.snippets.annotations]]
-label = "move occurs because `x` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait"
-level = "Warning"
-range = [4, 5]
-
-[[message.snippets]]
-source = "let y = x;"
-line_start = 7
-[[message.snippets.annotations]]
-label = "value moved here"
-level = "Warning"
-range = [8, 9]
-
-[[message.snippets]]
-source = "x;"
-line_start = 9
-[[message.snippets.annotations]]
-label = "value used here after move"
-level = "Error"
-range = [0, 1]
diff -pruN 0.11.4-1/tests/fixtures/no-color/multiple_annotations.svg 0.11.5-1/tests/fixtures/no-color/multiple_annotations.svg
--- 0.11.4-1/tests/fixtures/no-color/multiple_annotations.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/multiple_annotations.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,51 +0,0 @@
-<svg width="768px" height="290px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan>    |</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan> 96 | fn add_title_line(result: &amp;mut Vec&lt;String&gt;, main_annotation: Option&lt;&amp;Annotation&gt;) {</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan> 97 |     if let Some(annotation) = main_annotation {</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>    |                 ^^^^^^^^^^ Variable defined here</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan> 98 |         result.push(format_title_line(</tspan>
-</tspan>
-    <tspan x="10px" y="136px"><tspan> 99 |             &amp;annotation.annotation_type,</tspan>
-</tspan>
-    <tspan x="10px" y="154px"><tspan>    |              ^^^^^^^^^^ Referenced here</tspan>
-</tspan>
-    <tspan x="10px" y="172px"><tspan>100 |             None,</tspan>
-</tspan>
-    <tspan x="10px" y="190px"><tspan>101 |             &amp;annotation.label,</tspan>
-</tspan>
-    <tspan x="10px" y="208px"><tspan>    |              ^^^^^^^^^^ Referenced again here</tspan>
-</tspan>
-    <tspan x="10px" y="226px"><tspan>102 |         ));</tspan>
-</tspan>
-    <tspan x="10px" y="244px"><tspan>103 |     }</tspan>
-</tspan>
-    <tspan x="10px" y="262px"><tspan>104 | }</tspan>
-</tspan>
-    <tspan x="10px" y="280px"><tspan>    |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/multiple_annotations.toml 0.11.5-1/tests/fixtures/no-color/multiple_annotations.toml
--- 0.11.4-1/tests/fixtures/no-color/multiple_annotations.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/multiple_annotations.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,29 +0,0 @@
-[message]
-level = "Error"
-title = ""
-
-[[message.snippets]]
-source = """
-fn add_title_line(result: &mut Vec<String>, main_annotation: Option<&Annotation>) {
-    if let Some(annotation) = main_annotation {
-        result.push(format_title_line(
-            &annotation.annotation_type,
-            None,
-            &annotation.label,
-        ));
-    }
-}
-"""
-line_start = 96
-[[message.snippets.annotations]]
-label = "Variable defined here"
-level = "Error"
-range = [100, 110]
-[[message.snippets.annotations]]
-label = "Referenced here"
-level = "Error"
-range = [184, 194]
-[[message.snippets.annotations]]
-label = "Referenced again here"
-level = "Error"
-range = [243, 253]
diff -pruN 0.11.4-1/tests/fixtures/no-color/simple.svg 0.11.5-1/tests/fixtures/no-color/simple.svg
--- 0.11.4-1/tests/fixtures/no-color/simple.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/simple.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,39 +0,0 @@
-<svg width="740px" height="182px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error: expected one of `.`, `;`, `?`, or an operator, found `for`</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan>   --&gt; src/format_color.rs:171:9</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>    |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>169 |         })</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>    |           - expected one of `.`, `;`, `?`, or an operator here</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>170 | </tspan>
-</tspan>
-    <tspan x="10px" y="136px"><tspan>171 |         for line in &amp;self.body {</tspan>
-</tspan>
-    <tspan x="10px" y="154px"><tspan>    |         ^^^ unexpected token</tspan>
-</tspan>
-    <tspan x="10px" y="172px"><tspan>    |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/simple.toml 0.11.5-1/tests/fixtures/no-color/simple.toml
--- 0.11.4-1/tests/fixtures/no-color/simple.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/simple.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,19 +0,0 @@
-[message]
-level = "Error"
-title = "expected one of `.`, `;`, `?`, or an operator, found `for`"
-
-[[message.snippets]]
-source = """
-        })
-
-        for line in &self.body {"""
-line_start = 169
-origin = "src/format_color.rs"
-[[message.snippets.annotations]]
-label = "unexpected token"
-level = "Error"
-range = [20, 23]
-[[message.snippets.annotations]]
-label = "expected one of `.`, `;`, `?`, or an operator here"
-level = "Warning"
-range = [10, 11]
diff -pruN 0.11.4-1/tests/fixtures/no-color/strip_line.svg 0.11.5-1/tests/fixtures/no-color/strip_line.svg
--- 0.11.4-1/tests/fixtures/no-color/strip_line.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/strip_line.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<svg width="740px" height="128px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error[E0308]: mismatched types</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan>  --&gt; $DIR/whitespace-trimming.rs:4:193</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>   |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>LL | ...                   let _: () = 42;</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>   |                                   ^^ expected (), found integer</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>   |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/strip_line.toml 0.11.5-1/tests/fixtures/no-color/strip_line.toml
--- 0.11.4-1/tests/fixtures/no-color/strip_line.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/strip_line.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[message]
-level = "Error"
-id = "E0308"
-title = "mismatched types"
-
-[[message.snippets]]
-source = "                                                                                                                                                                                    let _: () = 42;"
-line_start = 4
-origin = "$DIR/whitespace-trimming.rs"
-
-[[message.snippets.annotations]]
-label = "expected (), found integer"
-level = "Error"
-range = [192, 194]
-
-[renderer]
-color = false
-anonymized_line_numbers = true
diff -pruN 0.11.4-1/tests/fixtures/no-color/strip_line_char.svg 0.11.5-1/tests/fixtures/no-color/strip_line_char.svg
--- 0.11.4-1/tests/fixtures/no-color/strip_line_char.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/strip_line_char.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-<svg width="740px" height="128px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error[E0308]: mismatched types</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan>  --&gt; $DIR/whitespace-trimming.rs:4:193</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>   |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>LL | ...                   let _: () = 42ñ</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>   |                                   ^^ expected (), found integer</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>   |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/strip_line_char.toml 0.11.5-1/tests/fixtures/no-color/strip_line_char.toml
--- 0.11.4-1/tests/fixtures/no-color/strip_line_char.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/strip_line_char.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,18 +0,0 @@
-[message]
-level = "Error"
-id = "E0308"
-title = "mismatched types" 
-
-[[message.snippets]]
-source = "                                                                                                                                                                                    let _: () = 42ñ"
-line_start = 4
-origin = "$DIR/whitespace-trimming.rs"
-
-[[message.snippets.annotations]]
-label = "expected (), found integer"
-level = "Error"
-range = [192, 194]
-
-[renderer]
-color = false
-anonymized_line_numbers = true
diff -pruN 0.11.4-1/tests/fixtures/no-color/strip_line_non_ws.svg 0.11.5-1/tests/fixtures/no-color/strip_line_non_ws.svg
--- 0.11.4-1/tests/fixtures/no-color/strip_line_non_ws.svg	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/strip_line_non_ws.svg	1970-01-01 00:00:00.000000000 +0000
@@ -1,35 +0,0 @@
-<svg width="1196px" height="146px" xmlns="http://www.w3.org/2000/svg">
-  <style>
-    .fg { fill: #AAAAAA }
-    .bg { background: #000000 }
-    .container {
-      padding: 0 10px;
-      line-height: 18px;
-    }
-    tspan {
-      font: 14px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
-      white-space: pre;
-      line-height: 18px;
-    }
-  </style>
-
-  <rect width="100%" height="100%" y="0" rx="4.5" class="bg" />
-
-  <text xml:space="preserve" class="container fg">
-    <tspan x="10px" y="28px"><tspan>error[E0308]: mismatched types</tspan>
-</tspan>
-    <tspan x="10px" y="46px"><tspan>  --&gt; $DIR/non-whitespace-trimming.rs:4:242</tspan>
-</tspan>
-    <tspan x="10px" y="64px"><tspan>   |</tspan>
-</tspan>
-    <tspan x="10px" y="82px"><tspan>LL | ... = (); let _: () = (); let _: () = (); let _: () = 42; let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () ...</tspan>
-</tspan>
-    <tspan x="10px" y="100px"><tspan>   |                                                       ^^ expected `()`, found integer</tspan>
-</tspan>
-    <tspan x="10px" y="118px"><tspan>   |                                                  ^^ expected due to this</tspan>
-</tspan>
-    <tspan x="10px" y="136px"><tspan>   |</tspan>
-</tspan>
-  </text>
-
-</svg>
diff -pruN 0.11.4-1/tests/fixtures/no-color/strip_line_non_ws.toml 0.11.5-1/tests/fixtures/no-color/strip_line_non_ws.toml
--- 0.11.4-1/tests/fixtures/no-color/strip_line_non_ws.toml	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/fixtures/no-color/strip_line_non_ws.toml	1970-01-01 00:00:00.000000000 +0000
@@ -1,25 +0,0 @@
-[message]
-level = "Error"
-id = "E0308"
-title = "mismatched types"
-
-[[message.snippets]]
-source = """
-	let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = 42; let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = (); let _: () = ();
-"""
-line_start = 4
-origin = "$DIR/non-whitespace-trimming.rs"
-
-[[message.snippets.annotations]]
-label = "expected `()`, found integer"
-level = "Error"
-range = [241, 243]
-
-[[message.snippets.annotations]]
-label = "expected due to this"
-level = "Error"
-range = [236, 238]
-
-
-[renderer]
-anonymized_line_numbers = true
diff -pruN 0.11.4-1/tests/formatter.rs 0.11.5-1/tests/formatter.rs
--- 0.11.4-1/tests/formatter.rs	2006-07-24 01:21:28.000000000 +0000
+++ 0.11.5-1/tests/formatter.rs	1970-01-01 00:00:00.000000000 +0000
@@ -1,734 +0,0 @@
-use annotate_snippets::{Level, Renderer, Snippet};
-
-use snapbox::{assert_data_eq, str};
-
-#[test]
-fn test_i_29() {
-    let snippets = Level::Error.title("oops").snippet(
-        Snippet::source("First line\r\nSecond oops line")
-            .origin("<current file>")
-            .annotation(Level::Error.span(19..23).label("oops"))
-            .fold(true),
-    );
-    let expected = str![[r#"
-error: oops
- --> <current file>:2:8
-  |
-2 | Second oops line
-  |        ^^^^ oops
-  |
-"#]];
-
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(snippets).to_string(), expected);
-}
-
-#[test]
-fn test_point_to_double_width_characters() {
-    let snippets = Level::Error.title("").snippet(
-        Snippet::source("こんにちは、世界")
-            .origin("<current file>")
-            .annotation(Level::Error.span(18..24).label("world")),
-    );
-
-    let expected = str![[r#"
-error
- --> <current file>:1:7
-  |
-1 | こんにちは、世界
-  |             ^^^^ world
-  |
-"#]];
-
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(snippets).to_string(), expected);
-}
-
-#[test]
-fn test_point_to_double_width_characters_across_lines() {
-    let snippets = Level::Error.title("").snippet(
-        Snippet::source("おはよう\nございます")
-            .origin("<current file>")
-            .annotation(Level::Error.span(6..22).label("Good morning")),
-    );
-
-    let expected = str![[r#"
-error
- --> <current file>:1:3
-  |
-1 |   おはよう
-  |  _____^
-2 | | ございます
-  | |______^ Good morning
-  |
-"#]];
-
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(snippets).to_string(), expected);
-}
-
-#[test]
-fn test_point_to_double_width_characters_multiple() {
-    let snippets = Level::Error.title("").snippet(
-        Snippet::source("お寿司\n食べたい🍣")
-            .origin("<current file>")
-            .annotation(Level::Error.span(0..9).label("Sushi1"))
-            .annotation(Level::Note.span(16..22).label("Sushi2")),
-    );
-
-    let expected = str![[r#"
-error
- --> <current file>:1:1
-  |
-1 | お寿司
-  | ^^^^^^ Sushi1
-2 | 食べたい🍣
-  |     ---- note: Sushi2
-  |
-"#]];
-
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(snippets).to_string(), expected);
-}
-
-#[test]
-fn test_point_to_double_width_characters_mixed() {
-    let snippets = Level::Error.title("").snippet(
-        Snippet::source("こんにちは、新しいWorld！")
-            .origin("<current file>")
-            .annotation(Level::Error.span(18..32).label("New world")),
-    );
-
-    let expected = str![[r#"
-error
- --> <current file>:1:7
-  |
-1 | こんにちは、新しいWorld！
-  |             ^^^^^^^^^^^ New world
-  |
-"#]];
-
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(snippets).to_string(), expected);
-}
-
-#[test]
-fn test_format_title() {
-    let input = Level::Error.title("This is a title").id("E0001");
-
-    let expected = str![r#"error[E0001]: This is a title"#];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn test_format_snippet_only() {
-    let source = "This is line 1\nThis is line 2";
-    let input = Level::Error
-        .title("")
-        .snippet(Snippet::source(source).line_start(5402));
-
-    let expected = str![[r#"
-error
-     |
-5402 | This is line 1
-5403 | This is line 2
-     |
-"#]];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn test_format_snippets_continuation() {
-    let src_0 = "This is slice 1";
-    let src_1 = "This is slice 2";
-    let input = Level::Error
-        .title("")
-        .snippet(Snippet::source(src_0).line_start(5402).origin("file1.rs"))
-        .snippet(Snippet::source(src_1).line_start(2).origin("file2.rs"));
-    let expected = str![[r#"
-error
-    --> file1.rs
-     |
-5402 | This is slice 1
-     |
-    ::: file2.rs
-     |
-   2 | This is slice 2
-     |
-"#]];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn test_format_snippet_annotation_standalone() {
-    let line_1 = "This is line 1";
-    let line_2 = "This is line 2";
-    let source = [line_1, line_2].join("\n");
-    // In line 2
-    let range = 22..24;
-    let input = Level::Error.title("").snippet(
-        Snippet::source(&source)
-            .line_start(5402)
-            .annotation(Level::Info.span(range.clone()).label("Test annotation")),
-    );
-    let expected = str![[r#"
-error
-     |
-5402 | This is line 1
-5403 | This is line 2
-     |        -- info: Test annotation
-     |
-"#]];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn test_format_footer_title() {
-    let input = Level::Error
-        .title("")
-        .footer(Level::Error.title("This __is__ a title"));
-    let expected = str![[r#"
-error
- = error: This __is__ a title
-"#]];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-#[should_panic]
-fn test_i26() {
-    let source = "short";
-    let label = "label";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .line_start(0)
-            .annotation(Level::Error.span(0..source.len() + 2).label(label)),
-    );
-    let renderer = Renderer::plain();
-    let _ = renderer.render(input).to_string();
-}
-
-#[test]
-fn test_source_content() {
-    let source = "This is an example\nof content lines";
-    let input = Level::Error
-        .title("")
-        .snippet(Snippet::source(source).line_start(56));
-    let expected = str![[r#"
-error
-   |
-56 | This is an example
-57 | of content lines
-   |
-"#]];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn test_source_annotation_standalone_singleline() {
-    let source = "tests";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .line_start(1)
-            .annotation(Level::Help.span(0..5).label("Example string")),
-    );
-    let expected = str![[r#"
-error
-  |
-1 | tests
-  | ----- help: Example string
-  |
-"#]];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn test_source_annotation_standalone_multiline() {
-    let source = "tests";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .line_start(1)
-            .annotation(Level::Help.span(0..5).label("Example string"))
-            .annotation(Level::Help.span(0..5).label("Second line")),
-    );
-    let expected = str![[r#"
-error
-  |
-1 | tests
-  | ----- help: Example string
-  | ----- help: Second line
-  |
-"#]];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn test_only_source() {
-    let input = Level::Error
-        .title("")
-        .snippet(Snippet::source("").origin("file.rs"));
-    let expected = str![[r#"
-error
---> file.rs
- |
- |
-"#]];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn test_anon_lines() {
-    let source = "This is an example\nof content lines\n\nabc";
-    let input = Level::Error
-        .title("")
-        .snippet(Snippet::source(source).line_start(56));
-    let expected = str![[r#"
-error
-   |
-LL | This is an example
-LL | of content lines
-LL | 
-LL | abc
-   |
-"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(true);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn issue_130() {
-    let input = Level::Error.title("dummy").snippet(
-        Snippet::source("foo\nbar\nbaz")
-            .origin("file/path")
-            .line_start(3)
-            .fold(true)
-            .annotation(Level::Error.span(4..11)), // bar\nbaz
-    );
-
-    let expected = str![[r#"
-error: dummy
- --> file/path:4:1
-  |
-4 | / bar
-5 | | baz
-  | |___^
-  |
-"#]];
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn unterminated_string_multiline() {
-    let source = "\
-a\"
-// ...
-";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .fold(true)
-            .annotation(Level::Error.span(0..10)), // 1..10 works
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:1
-  |
-3 | / a"
-4 | | // ...
-  | |_______^
-  |
-"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn char_and_nl_annotate_char() {
-    let source = "a\r\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(0..2)), // a\r
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:1
-  |
-3 | a
-  | ^
-4 | b
-  |"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn char_eol_annotate_char() {
-    let source = "a\r\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(0..3)), // a\r\n
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:1
-  |
-3 | a
-  | ^
-4 | b
-  |"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn char_eol_annotate_char_double_width() {
-    let snippets = Level::Error.title("").snippet(
-        Snippet::source("こん\r\nにちは\r\n世界")
-            .origin("<current file>")
-            .annotation(Level::Error.span(3..8)), // ん\r\n
-    );
-
-    let expected = str![[r#"
-error
- --> <current file>:1:2
-  |
-1 | こん
-  |   ^^
-2 | にちは
-3 | 世界
-  |
-"#]];
-
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(snippets).to_string(), expected);
-}
-
-#[test]
-fn annotate_eol() {
-    let source = "a\r\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(1..2)), // \r
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 | a
-  |  ^
-4 | b
-  |"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn annotate_eol2() {
-    let source = "a\r\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(1..3)), // \r\n
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 | a
-  |  ^
-4 | b
-  |"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn annotate_eol3() {
-    let source = "a\r\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(2..3)), // \n
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 | a
-  |  ^
-4 | b
-  |"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn annotate_eol4() {
-    let source = "a\r\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(2..2)), // \n
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 | a
-  |  ^
-4 | b
-  |"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn annotate_eol_double_width() {
-    let snippets = Level::Error.title("").snippet(
-        Snippet::source("こん\r\nにちは\r\n世界")
-            .origin("<current file>")
-            .annotation(Level::Error.span(7..8)), // \n
-    );
-
-    let expected = str![[r#"
-error
- --> <current file>:1:3
-  |
-1 | こん
-  |     ^
-2 | にちは
-3 | 世界
-  |
-"#]];
-
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(snippets).to_string(), expected);
-}
-
-#[test]
-fn multiline_eol_start() {
-    let source = "a\r\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(1..4)), // \r\nb
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 |   a
-  |  __^
-4 | | b
-  | |_^
-  |"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn multiline_eol_start2() {
-    let source = "a\r\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(2..4)), // \nb
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 |   a
-  |  __^
-4 | | b
-  | |_^
-  |"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn multiline_eol_start3() {
-    let source = "a\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(1..3)), // \nb
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 |   a
-  |  __^
-4 | | b
-  | |_^
-  |"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn multiline_eol_start_double_width() {
-    let snippets = Level::Error.title("").snippet(
-        Snippet::source("こん\r\nにちは\r\n世界")
-            .origin("<current file>")
-            .annotation(Level::Error.span(7..11)), // \r\nに
-    );
-
-    let expected = str![[r#"
-error
- --> <current file>:1:3
-  |
-1 |   こん
-  |  _____^
-2 | | にちは
-  | |__^
-3 |   世界
-  |
-"#]];
-
-    let renderer = Renderer::plain();
-    assert_data_eq!(renderer.render(snippets).to_string(), expected);
-}
-
-#[test]
-fn multiline_eol_start_eol_end() {
-    let source = "a\nb\nc";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(1..4)), // \nb\n
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 |   a
-  |  __^
-4 | | b
-  | |__^
-5 |   c
-  |
-"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn multiline_eol_start_eol_end2() {
-    let source = "a\r\nb\r\nc";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(2..5)), // \nb\r
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 |   a
-  |  __^
-4 | | b
-  | |__^
-5 |   c
-  |
-"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn multiline_eol_start_eol_end3() {
-    let source = "a\r\nb\r\nc";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(2..6)), // \nb\r\n
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 |   a
-  |  __^
-4 | | b
-  | |__^
-5 |   c
-  |
-"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn multiline_eol_start_eof_end() {
-    let source = "a\r\nb";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(1..5)), // \r\nb(EOF)
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 |   a
-  |  __^
-4 | | b
-  | |__^
-  |
-"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
-
-#[test]
-fn multiline_eol_start_eof_end_double_width() {
-    let source = "ん\r\nに";
-    let input = Level::Error.title("").snippet(
-        Snippet::source(source)
-            .origin("file/path")
-            .line_start(3)
-            .annotation(Level::Error.span(3..9)), // \r\nに(EOF)
-    );
-    let expected = str![[r#"
-error
- --> file/path:3:2
-  |
-3 |   ん
-  |  ___^
-4 | | に
-  | |___^
-  |
-"#]];
-    let renderer = Renderer::plain().anonymized_line_numbers(false);
-    assert_data_eq!(renderer.render(input).to_string(), expected);
-}
