mirror of
https://github.com/dirtydishes/dreamio.git
synced 2026-06-06 13:37:24 +00:00
444 lines
No EOL
791 KiB
HTML
444 lines
No EOL
791 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>Dreamio Turn: VLC Seek Range Cache Priming</title>
|
||
<style>
|
||
:root { color-scheme: light; --ink: oklch(0.19 0.02 265); --muted: oklch(0.46 0.025 265); --paper: oklch(0.985 0.006 265); --panel: oklch(0.965 0.012 265); --line: oklch(0.86 0.018 265); --accent: oklch(0.55 0.15 292); --accent-soft: oklch(0.92 0.045 292); }
|
||
* { box-sizing: border-box; }
|
||
body { margin: 0; background: var(--paper); color: var(--ink); font: 16px/1.58 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
|
||
main { width: min(1120px, calc(100vw - 40px)); margin: 0 auto; padding: 48px 0 64px; }
|
||
header { margin-bottom: 28px; }
|
||
h1 { max-width: 860px; margin: 0 0 10px; font-size: clamp(2rem, 4vw, 4rem); line-height: 1.02; letter-spacing: 0; }
|
||
.summary { max-width: 760px; color: var(--muted); font-size: 1.08rem; }
|
||
section.panel { border: 1px solid var(--line); background: var(--panel); border-radius: 8px; padding: 22px 24px; margin: 16px 0; }
|
||
h2 { margin: 0 0 10px; font-size: 1.08rem; letter-spacing: 0; }
|
||
h3 { margin: 18px 0 10px; font-size: .95rem; color: var(--muted); }
|
||
p, ul { margin: 0; }
|
||
ul { padding-left: 1.2rem; }
|
||
li + li { margin-top: 6px; }
|
||
code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: .92em; }
|
||
.note { color: var(--muted); }
|
||
.diff-file { margin-top: 18px; }
|
||
.diff-file > div, .diff-file pre { border-radius: 8px; overflow: auto; }
|
||
.badge { display: inline-block; border: 1px solid var(--line); background: var(--accent-soft); color: var(--accent); border-radius: 999px; padding: 3px 9px; font-size: .82rem; font-weight: 700; margin-bottom: 12px; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<main>
|
||
<header><span class="badge">2026-05-26</span><h1>VLC Seek Range Cache Priming</h1><p class="summary">Dreamio now primes local VLC range-cache seeks from stable 1 MB boundaries behind the estimated target, retains useful nearby bytes under a bounded budget, and logs foreground misses with more precision.</p></header>
|
||
<section class="panel"><h2>Summary</h2><p>Reduced post-seek buffering risk in native VLC playback by making seek and jump prefetch conservative behind the target instead of only racing ahead from the estimated byte offset.</p></section>
|
||
<section class="panel"><h2>Changes Made</h2><ul><li>Added seek-specific prefetch through <code>prefetchForSeek</code>, with a 4 MB backward prime window and user-initiated task priority for the first chunks.</li><li>Aligned prefetch chunks to global 1 MB boundaries so repeated VLC requests reuse stable cached ranges.</li><li>Replaced prefetch-window eviction with a 64 MB bounded cache budget that preserves active playback, recent seek, header, and tail/index ranges.</li><li>Changed foreground miss handling to fetch only missing subranges and log <code>uncached</code> versus <code>partial-miss</code>.</li><li>Routed VLC delegate state handling onto the main actor before reading player state or firing UI callbacks.</li><li>Added tests for the observed VLC request pattern, global chunk alignment, and budget retention.</li></ul></section>
|
||
<section class="panel"><h2>Context</h2><p>A 15-second skip estimated byte <code>213615760</code>, while VLC’s first real read started at <code>212942432</code>. The old prefetch overlapped the request but missed its front edge, then eviction could discard ranges that were still useful during the next VLC probes.</p></section>
|
||
<section class="panel"><h2>Important Implementation Details</h2><ul><li>The observed request and estimated seek offset both fall inside global chunk <code>212860928-213909503</code>, so seek priming now warms that chunk before later ahead chunks.</li><li>Normal prefetch still prefers the playhead area, while seek prefetch starts at the backward-biased window start.</li><li>Cache eviction removes unprotected segments farthest from protected areas until the byte budget is met; protected ranges are not trimmed simply because a new prefetch window appears.</li><li>Foreground reads cancel or reprioritize normal prefetch when VLC asks outside the expected area.</li></ul></section>
|
||
<section class="panel"><h2>Relevant Diff Snippets</h2><p class="note">Rendered with <code>@pierre/diffs/ssr</code>.</p><section class="diff-file"><h3>Dreamio/ProgressiveHTTPRangeCache.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
|
||
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
|
||
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
|
||
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
|
||
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
|
||
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
|
||
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
|
||
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
|
||
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
|
||
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
|
||
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
|
||
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
|
||
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
|
||
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
|
||
</symbol>
|
||
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
|
||
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
|
||
@layer theme {
|
||
|
||
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
|
||
@layer rendered {
|
||
:host {
|
||
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
|
||
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
|
||
}
|
||
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Dreamio/ProgressiveHTTPRangeCache.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-15</span><span data-additions-count="">+174</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 286"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">72 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="73" data-line-index="72,72"><span data-line-number-content="">73</span></div><div data-line-type="context" data-column-number="74" data-line-index="73,73"><span data-line-number-content="">74</span></div><div data-line-type="context" data-column-number="75" data-line-index="74,74"><span data-line-number-content="">75</span></div><div data-gutter-buffer="buffer" data-buffer-size="6" style="grid-row: span 6;min-height:calc(6 * 1lh);"></div><div data-line-type="context" data-column-number="76" data-line-index="81,81"><span data-line-number-content="">76</span></div><div data-line-type="context" data-column-number="77" data-line-index="82,82"><span data-line-number-content="">77</span></div><div data-line-type="context" data-column-number="78" data-line-index="83,83"><span data-line-number-content="">78</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="117" data-line-index="122,122"><span data-line-number-content="">117</span></div><div data-line-type="context" data-column-number="118" data-line-index="123,123"><span data-line-number-content="">118</span></div><div data-line-type="context" data-column-number="119" data-line-index="124,124"><span data-line-number-content="">119</span></div><div data-gutter-buffer="buffer" data-buffer-size="27" style="grid-row: span 27;min-height:calc(27 * 1lh);"></div><div data-line-type="context" data-column-number="120" data-line-index="152,152"><span data-line-number-content="">120</span></div><div data-line-type="context" data-column-number="121" data-line-index="153,153"><span data-line-number-content="">121</span></div><div data-line-type="context" data-column-number="122" data-line-index="154,154"><span data-line-number-content="">122</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="135" data-line-index="167,167"><span data-line-number-content="">135</span></div><div data-line-type="context" data-column-number="136" data-line-index="168,168"><span data-line-number-content="">136</span></div><div data-line-type="context" data-column-number="137" data-line-index="169,169"><span data-line-number-content="">137</span></div><div data-gutter-buffer="buffer" data-buffer-size="55" style="grid-row: span 55;min-height:calc(55 * 1lh);"></div><div data-line-type="context" data-column-number="138" data-line-index="225,225"><span data-line-number-content="">138</span></div><div data-line-type="context" data-column-number="139" data-line-index="226,226"><span data-line-number-content="">139</span></div><div data-line-type="context" data-column-number="140" data-line-index="227,227"><span data-line-number-content="">140</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">116 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="257" data-line-index="344,344"><span data-line-number-content="">257</span></div><div data-line-type="context" data-column-number="258" data-line-index="345,345"><span data-line-number-content="">258</span></div><div data-line-type="context" data-column-number="259" data-line-index="346,346"><span data-line-number-content="">259</span></div><div data-gutter-buffer="buffer" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh);"></div><div data-line-type="context" data-column-number="260" data-line-index="349,349"><span data-line-number-content="">260</span></div><div data-line-type="context" data-column-number="261" data-line-index="350,350"><span data-line-number-content="">261</span></div><div data-line-type="context" data-column-number="262" data-line-index="351,351"><span data-line-number-content="">262</span></div><div data-line-type="change-deletion" data-column-number="263" data-line-index="352,352"><span data-line-number-content="">263</span></div><div data-line-type="change-deletion" data-column-number="264" data-line-index="353,353"><span data-line-number-content="">264</span></div><div data-gutter-buffer="buffer" data-buffer-size="7" style="grid-row: span 7;min-height:calc(7 * 1lh);"></div><div data-line-type="context" data-column-number="265" data-line-index="363,361"><span data-line-number-content="">265</span></div><div data-line-type="context" data-column-number="266" data-line-index="364,362"><span data-line-number-content="">266</span></div><div data-line-type="context" data-column-number="267" data-line-index="365,363"><span data-line-number-content="">267</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="268" data-line-index="367,365"><span data-line-number-content="">268</span></div><div data-line-type="context" data-column-number="269" data-line-index="368,366"><span data-line-number-content="">269</span></div><div data-line-type="context" data-column-number="270" data-line-index="369,367"><span data-line-number-content="">270</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="273" data-line-index="372,370"><span data-line-number-content="">273</span></div><div data-line-type="context" data-column-number="274" data-line-index="373,371"><span data-line-number-content="">274</span></div><div data-line-type="context" data-column-number="275" data-line-index="374,372"><span data-line-number-content="">275</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="276" data-line-index="376,374"><span data-line-number-content="">276</span></div><div data-line-type="context" data-column-number="277" data-line-index="377,375"><span data-line-number-content="">277</span></div><div data-line-type="context" data-column-number="278" data-line-index="378,376"><span data-line-number-content="">278</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="280" data-line-index="380,378"><span data-line-number-content="">280</span></div><div data-line-type="context" data-column-number="281" data-line-index="381,379"><span data-line-number-content="">281</span></div><div data-line-type="context" data-column-number="282" data-line-index="382,380"><span data-line-number-content="">282</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="283" data-line-index="384,382"><span data-line-number-content="">283</span></div><div data-line-type="change-deletion" data-column-number="284" data-line-index="385,383"><span data-line-number-content="">284</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="285" data-line-index="388,385"><span data-line-number-content="">285</span></div><div data-line-type="context" data-column-number="286" data-line-index="389,386"><span data-line-number-content="">286</span></div><div data-line-type="change-deletion" data-column-number="287" data-line-index="390,387"><span data-line-number-content="">287</span></div><div data-line-type="change-deletion" data-column-number="288" data-line-index="391,388"><span data-line-number-content="">288</span></div><div data-gutter-buffer="buffer" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh);"></div><div data-line-type="context" data-column-number="289" data-line-index="396,391"><span data-line-number-content="">289</span></div><div data-line-type="change-deletion" data-column-number="290" data-line-index="397,392"><span data-line-number-content="">290</span></div><div data-line-type="context" data-column-number="291" data-line-index="399,393"><span data-line-number-content="">291</span></div><div data-line-type="context" data-column-number="292" data-line-index="400,394"><span data-line-number-content="">292</span></div><div data-line-type="context" data-column-number="293" data-line-index="401,395"><span data-line-number-content="">293</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">5 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="299" data-line-index="407,401"><span data-line-number-content="">299</span></div><div data-line-type="context" data-column-number="300" data-line-index="408,402"><span data-line-number-content="">300</span></div><div data-line-type="context" data-column-number="301" data-line-index="409,403"><span data-line-number-content="">301</span></div><div data-line-type="change-deletion" data-column-number="302" data-line-index="410,404"><span data-line-number-content="">302</span></div><div data-gutter-buffer="buffer" data-buffer-size="15" style="grid-row: span 15;min-height:calc(15 * 1lh);"></div><div data-line-type="context" data-column-number="303" data-line-index="427,420"><span data-line-number-content="">303</span></div><div data-line-type="context" data-column-number="304" data-line-index="428,421"><span data-line-number-content="">304</span></div><div data-line-type="context" data-column-number="305" data-line-index="429,422"><span data-line-number-content="">305</span></div><div data-gutter-buffer="buffer" data-buffer-size="9" style="grid-row: span 9;min-height:calc(9 * 1lh);"></div><div data-line-type="context" data-column-number="306" data-line-index="439,432"><span data-line-number-content="">306</span></div><div data-line-type="context" data-column-number="307" data-line-index="440,433"><span data-line-number-content="">307</span></div><div data-line-type="context" data-column-number="308" data-line-index="441,434"><span data-line-number-content="">308</span></div><div data-line-type="context" data-column-number="309" data-line-index="442,435"><span data-line-number-content="">309</span></div><div data-line-type="context" data-column-number="310" data-line-index="443,436"><span data-line-number-content="">310</span></div><div data-line-type="change-deletion" data-column-number="311" data-line-index="444,437"><span data-line-number-content="">311</span></div><div data-line-type="context" data-column-number="312" data-line-index="446,438"><span data-line-number-content="">312</span></div><div data-line-type="context" data-column-number="313" data-line-index="447,439"><span data-line-number-content="">313</span></div><div data-line-type="change-deletion" data-column-number="314" data-line-index="448,440"><span data-line-number-content="">314</span></div><div data-line-type="context" data-column-number="315" data-line-index="450,441"><span data-line-number-content="">315</span></div><div data-line-type="context" data-column-number="316" data-line-index="451,442"><span data-line-number-content="">316</span></div><div data-line-type="context" data-column-number="317" data-line-index="452,443"><span data-line-number-content="">317</span></div><div data-line-type="context" data-column-number="318" data-line-index="453,444"><span data-line-number-content="">318</span></div><div data-line-type="context" data-column-number="319" data-line-index="454,445"><span data-line-number-content="">319</span></div><div data-line-type="context" data-column-number="320" data-line-index="455,446"><span data-line-number-content="">320</span></div><div data-line-type="change-deletion" data-column-number="321" data-line-index="456,447"><span data-line-number-content="">321</span></div><div data-line-type="context" data-column-number="322" data-line-index="458,448"><span data-line-number-content="">322</span></div><div data-line-type="context" data-column-number="323" data-line-index="459,449"><span data-line-number-content="">323</span></div><div data-line-type="context" data-column-number="324" data-line-index="460,450"><span data-line-number-content="">324</span></div><div data-line-type="change-deletion" data-column-number="325" data-line-index="461,451"><span data-line-number-content="">325</span></div><div data-line-type="context" data-column-number="326" data-line-index="463,452"><span data-line-number-content="">326</span></div><div data-line-type="context" data-column-number="327" data-line-index="464,453"><span data-line-number-content="">327</span></div><div data-line-type="context" data-column-number="328" data-line-index="465,454"><span data-line-number-content="">328</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="330" data-line-index="467,456"><span data-line-number-content="">330</span></div><div data-line-type="context" data-column-number="331" data-line-index="468,457"><span data-line-number-content="">331</span></div><div data-line-type="context" data-column-number="332" data-line-index="469,458"><span data-line-number-content="">332</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="333" data-line-index="471,460"><span data-line-number-content="">333</span></div><div data-line-type="context" data-column-number="334" data-line-index="472,461"><span data-line-number-content="">334</span></div><div data-line-type="context" data-column-number="335" data-line-index="473,462"><span data-line-number-content="">335</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">37 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="373" data-line-index="511,500"><span data-line-number-content="">373</span></div><div data-line-type="context" data-column-number="374" data-line-index="512,501"><span data-line-number-content="">374</span></div><div data-line-type="context" data-column-number="375" data-line-index="513,502"><span data-line-number-content="">375</span></div><div data-gutter-buffer="buffer" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh);"></div><div data-line-type="context" data-column-number="376" data-line-index="518,507"><span data-line-number-content="">376</span></div><div data-line-type="change-deletion" data-column-number="377" data-line-index="519,508"><span data-line-number-content="">377</span></div><div data-line-type="context" data-column-number="378" data-line-index="521,509"><span data-line-number-content="">378</span></div><div data-line-type="change-deletion" data-column-number="379" data-line-index="522,510"><span data-line-number-content="">379</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="380" data-line-index="525,512"><span data-line-number-content="">380</span></div><div data-line-type="context" data-column-number="381" data-line-index="526,513"><span data-line-number-content="">381</span></div><div data-line-type="context" data-column-number="382" data-line-index="527,514"><span data-line-number-content="">382</span></div><div data-gutter-buffer="buffer" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh);"></div><div data-line-type="context" data-column-number="383" data-line-index="532,519"><span data-line-number-content="">383</span></div><div data-line-type="change-deletion" data-column-number="384" data-line-index="533,520"><span data-line-number-content="">384</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="385" data-line-index="536,522"><span data-line-number-content="">385</span></div><div data-line-type="context" data-column-number="386" data-line-index="537,523"><span data-line-number-content="">386</span></div><div data-line-type="context" data-column-number="387" data-line-index="538,524"><span data-line-number-content="">387</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="391" data-line-index="542,528"><span data-line-number-content="">391</span></div><div data-line-type="context" data-column-number="392" data-line-index="543,529"><span data-line-number-content="">392</span></div><div data-line-type="context" data-column-number="393" data-line-index="544,530"><span data-line-number-content="">393</span></div><div data-line-type="change-deletion" data-column-number="394" data-line-index="545,531"><span data-line-number-content="">394</span></div><div data-line-type="context" data-column-number="395" data-line-index="547,532"><span data-line-number-content="">395</span></div><div data-line-type="context" data-column-number="396" data-line-index="548,533"><span data-line-number-content="">396</span></div><div data-line-type="context" data-column-number="397" data-line-index="549,534"><span data-line-number-content="">397</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="401" data-line-index="553,538"><span data-line-number-content="">401</span></div><div data-line-type="context" data-column-number="402" data-line-index="554,539"><span data-line-number-content="">402</span></div><div data-line-type="context" data-column-number="403" data-line-index="555,540"><span data-line-number-content="">403</span></div><div data-gutter-buffer="buffer" data-buffer-size="21" style="grid-row: span 21;min-height:calc(21 * 1lh);"></div><div data-line-type="context" data-column-number="404" data-line-index="577,562"><span data-line-number-content="">404</span></div><div data-line-type="context" data-column-number="405" data-line-index="578,563"><span data-line-number-content="">405</span></div><div data-line-type="context" data-column-number="406" data-line-index="579,564"><span data-line-number-content="">406</span></div></div><div data-content="" style="grid-row: span 286"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">72 unmodified lines</span></div></div></div><div data-line="73" data-alt-line="73" data-line-type="context" data-line-index="72,72"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="74" data-alt-line="74" data-line-type="context" data-line-index="73,73"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="75" data-alt-line="75" data-line-type="context" data-line-index="74,74">
|
||
</div><div data-content-buffer="" data-buffer-size="6" style="grid-row: span 6;min-height:calc(6 * 1lh)"></div><div data-line="76" data-alt-line="82" data-line-type="context" data-line-index="81,81"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">at</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> start</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="77" data-alt-line="83" data-line-type="context" data-line-index="82,82"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">data.isEmpty </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="78" data-alt-line="84" data-line-type="context" data-line-index="83,83"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line="117" data-alt-line="123" data-line-type="context" data-line-index="122,122"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="118" data-alt-line="124" data-line-type="context" data-line-index="123,123"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="119" data-alt-line="125" data-line-type="context" data-line-index="124,124">
|
||
</div><div data-content-buffer="" data-buffer-size="27" style="grid-row: span 27;min-height:calc(27 * 1lh)"></div><div data-line="120" data-alt-line="153" data-line-type="context" data-line-index="152,152"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">keeping</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="121" data-alt-line="154" data-line-type="context" data-line-index="153,153"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="122" data-alt-line="155" data-line-type="context" data-line-index="154,154"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">compactMap</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line="135" data-alt-line="168" data-line-type="context" data-line-index="167,167"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="136" data-alt-line="169" data-line-type="context" data-line-index="168,168"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="137" data-alt-line="170" data-line-type="context" data-line-index="169,169">
|
||
</div><div data-content-buffer="" data-buffer-size="55" style="grid-row: span 55;min-height:calc(55 * 1lh)"></div><div data-line="138" data-alt-line="226" data-line-type="context" data-line-index="225,225"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mergeSegments</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="139" data-alt-line="227" data-line-type="context" data-line-index="226,226"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">segments.isEmpty </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="140" data-alt-line="228" data-line-type="context" data-line-index="227,227"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">116 unmodified lines</span></div></div></div><div data-line="257" data-alt-line="345" data-line-type="context" data-line-index="344,344"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> durationProvider: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> TimeInterval</span></div><div data-line="258" data-alt-line="346" data-line-type="context" data-line-index="345,345"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchChunkSize: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="259" data-alt-line="347" data-line-type="context" data-line-index="346,346"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseChunkSize: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-content-buffer="" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh)"></div><div data-line="260" data-alt-line="350" data-line-type="context" data-line-index="349,349"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask: Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"><</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Void</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, Never</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>?</span></div><div data-line="261" data-alt-line="351" data-line-type="context" data-line-index="350,350"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="262" data-alt-line="352" data-line-type="context" data-line-index="351,351"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="263" data-line-type="change-deletion" data-line-index="352,352">
|
||
</div><div data-line="264" data-line-type="change-deletion" data-line-index="353,353"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> </span><span data-diff-span=""><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetcher</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPRangeRemoteFetcher, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span data-diff-span=""><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">durationProvider</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">@</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">escaping</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> TimeInterval</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></span></div><div data-content-buffer="" data-buffer-size="7" style="grid-row: span 7;min-height:calc(7 * 1lh)"></div><div data-line="265" data-alt-line="362" data-line-type="context" data-line-index="363,361"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher</span></div><div data-line="266" data-alt-line="363" data-line-type="context" data-line-index="364,362"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> contentLength</span></div><div data-line="267" data-alt-line="364" data-line-type="context" data-line-index="365,363"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> durationProvider</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="268" data-alt-line="366" data-line-type="context" data-line-index="367,365"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="269" data-alt-line="367" data-line-type="context" data-line-index="368,366">
|
||
</div><div data-line="270" data-alt-line="368" data-line-type="context" data-line-index="369,367"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> deinit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line="273" data-alt-line="371" data-line-type="context" data-line-index="372,370">
|
||
</div><div data-line="274" data-alt-line="372" data-line-type="context" data-line-index="373,371"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> requestedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> throws</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="275" data-alt-line="373" data-line-type="context" data-line-index="374,372"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">requestedRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="276" data-alt-line="375" data-line-type="context" data-line-index="376,374"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="277" data-alt-line="376" data-line-type="context" data-line-index="377,375"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="278" data-alt-line="377" data-line-type="context" data-line-index="378,376"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=hit range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="280" data-alt-line="379" data-line-type="context" data-line-index="380,378"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data</span></div><div data-line="281" data-alt-line="380" data-line-type="context" data-line-index="381,379"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="282" data-alt-line="381" data-line-type="context" data-line-index="382,380">
|
||
</div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="283" data-alt-line="383" data-line-type="context" data-line-index="384,382"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="284" data-line-type="change-deletion" data-line-index="385,383"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">] </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">cache=miss range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span></span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="285" data-alt-line="386" data-line-type="context" data-line-index="388,385"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="286" data-alt-line="387" data-line-type="context" data-line-index="389,386"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetchIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forForegroundRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="287" data-line-type="change-deletion" data-line-index="390,387"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></span></div><div data-line="288" data-line-type="change-deletion" data-line-index="391,388"><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.start</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh)"></div><div data-line="289" data-alt-line="392" data-line-type="context" data-line-index="396,391"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="290" data-line-type="change-deletion" data-line-index="397,392"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">data</span></span></div><div data-line="291" data-alt-line="394" data-line-type="context" data-line-index="399,393"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="292" data-alt-line="395" data-line-type="context" data-line-index="400,394">
|
||
</div><div data-line="293" data-alt-line="396" data-line-type="context" data-line-index="401,395"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> responseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> requestedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">5 unmodified lines</span></div></div></div><div data-line="299" data-alt-line="402" data-line-type="context" data-line-index="407,401"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="300" data-alt-line="403" data-line-type="context" data-line-index="408,402">
|
||
</div><div data-line="301" data-alt-line="404" data-line-type="context" data-line-index="409,403"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="302" data-line-type="change-deletion" data-line-index="410,404"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="15" style="grid-row: span 15;min-height:calc(15 * 1lh)"></div><div data-line="303" data-alt-line="421" data-line-type="context" data-line-index="427,420"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="304" data-alt-line="422" data-line-type="context" data-line-index="428,421">
|
||
</div><div data-line="305" data-alt-line="423" data-line-type="context" data-line-index="429,422"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forceRestart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="9" style="grid-row: span 9;min-height:calc(9 * 1lh)"></div><div data-line="306" data-alt-line="433" data-line-type="context" data-line-index="439,432"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">forceRestart, activePrefetchWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.isCancelled </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="307" data-alt-line="434" data-line-type="context" data-line-index="440,433"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="308" data-alt-line="435" data-line-type="context" data-line-index="441,434"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="309" data-alt-line="436" data-line-type="context" data-line-index="442,435">
|
||
</div><div data-line="310" data-alt-line="437" data-line-type="context" data-line-index="443,436"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="311" data-line-type="change-deletion" data-line-index="444,437"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="312" data-alt-line="439" data-line-type="context" data-line-index="446,438"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window</span></div><div data-line="313" data-alt-line="440" data-line-type="context" data-line-index="447,439"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> offset</span></div><div data-line="314" data-line-type="change-deletion" data-line-index="448,440"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">keeping</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="315" data-alt-line="442" data-line-type="context" data-line-index="450,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasData</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="316" data-alt-line="443" data-line-type="context" data-line-index="451,442"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="317" data-alt-line="444" data-line-type="context" data-line-index="452,443"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="318" data-alt-line="445" data-line-type="context" data-line-index="453,444"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="319" data-alt-line="446" data-line-type="context" data-line-index="454,445"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="320" data-alt-line="447" data-line-type="context" data-line-index="455,446">
|
||
</div><div data-line="321" data-line-type="change-deletion" data-line-index="456,447"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">weak</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">] </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="322" data-alt-line="449" data-line-type="context" data-line-index="458,448"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="323" data-alt-line="450" data-line-type="context" data-line-index="459,449"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="324" data-alt-line="451" data-line-type="context" data-line-index="460,450"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="325" data-line-type="change-deletion" data-line-index="461,451"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window, preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="326" data-alt-line="453" data-line-type="context" data-line-index="463,452"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">Task.isCancelled </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="327" data-alt-line="454" data-line-type="context" data-line-index="464,453"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="328" data-alt-line="455" data-line-type="context" data-line-index="465,454"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="330" data-alt-line="457" data-line-type="context" data-line-index="467,456"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> do</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="331" data-alt-line="458" data-line-type="context" data-line-index="468,457"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="332" data-alt-line="459" data-line-type="context" data-line-index="469,458"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="333" data-alt-line="461" data-line-type="context" data-line-index="471,460"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="334" data-alt-line="462" data-line-type="context" data-line-index="472,461"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] fetched range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunk.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunk.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> bytes=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">data.count</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="335" data-alt-line="463" data-line-type="context" data-line-index="473,462"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">37 unmodified lines</span></div></div></div><div data-line="373" data-alt-line="501" data-line-type="context" data-line-index="511,500"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="374" data-alt-line="502" data-line-type="context" data-line-index="512,501">
|
||
</div><div data-line="375" data-alt-line="503" data-line-type="context" data-line-index="513,502"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-content-buffer="" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh)"></div><div data-line="376" data-alt-line="508" data-line-type="context" data-line-index="518,507"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedBytesPerSecond</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="377" data-line-type="change-deletion" data-line-index="519,508"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> behind </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunkSize</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 30</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="378" data-alt-line="510" data-line-type="context" data-line-index="521,509"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ahead </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 2</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 60</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="379" data-line-type="change-deletion" data-line-index="522,510"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">return</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> behind, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ahead</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="380" data-alt-line="513" data-line-type="context" data-line-index="525,512"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="381" data-alt-line="514" data-line-type="context" data-line-index="526,513">
|
||
</div><div data-line="382" data-alt-line="515" data-line-type="context" data-line-index="527,514"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh)"></div><div data-line="383" data-alt-line="520" data-line-type="context" data-line-index="532,519"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> boundedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.start, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.end, offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="384" data-line-type="change-deletion" data-line-index="533,520"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">preferredStart</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">window.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ((</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">boundedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">window.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> /</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchChunkSize</span></span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="385" data-alt-line="523" data-line-type="context" data-line-index="536,522"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="386" data-alt-line="524" data-line-type="context" data-line-index="537,523">
|
||
</div><div data-line="387" data-alt-line="525" data-line-type="context" data-line-index="538,524"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line="391" data-alt-line="529" data-line-type="context" data-line-index="542,528"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="392" data-alt-line="530" data-line-type="context" data-line-index="543,529"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="393" data-alt-line="531" data-line-type="context" data-line-index="544,530">
|
||
</div><div data-line="394" data-line-type="change-deletion" data-line-index="545,531"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">window.start</span></span></div><div data-line="395" data-alt-line="533" data-line-type="context" data-line-index="547,532"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> while</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"><</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="396" data-alt-line="534" data-line-type="context" data-line-index="548,533"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="397" data-alt-line="535" data-line-type="context" data-line-index="549,534"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line="401" data-alt-line="539" data-line-type="context" data-line-index="553,538"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="402" data-alt-line="540" data-line-type="context" data-line-index="554,539"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="403" data-alt-line="541" data-line-type="context" data-line-index="555,540">
|
||
</div><div data-content-buffer="" data-buffer-size="21" style="grid-row: span 21;min-height:calc(21 * 1lh)"></div><div data-line="404" data-alt-line="563" data-line-type="context" data-line-index="577,562"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedBytesPerSecond</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="405" data-alt-line="564" data-line-type="context" data-line-index="578,563"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="406" data-alt-line="565" data-line-type="context" data-line-index="579,564"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 286"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">72 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="73" data-line-index="72,72"><span data-line-number-content="">73</span></div><div data-line-type="context" data-column-number="74" data-line-index="73,73"><span data-line-number-content="">74</span></div><div data-line-type="context" data-column-number="75" data-line-index="74,74"><span data-line-number-content="">75</span></div><div data-line-type="change-addition" data-column-number="76" data-line-index="75,75"><span data-line-number-content="">76</span></div><div data-line-type="change-addition" data-column-number="77" data-line-index="76,76"><span data-line-number-content="">77</span></div><div data-line-type="change-addition" data-column-number="78" data-line-index="77,77"><span data-line-number-content="">78</span></div><div data-line-type="change-addition" data-column-number="79" data-line-index="78,78"><span data-line-number-content="">79</span></div><div data-line-type="change-addition" data-column-number="80" data-line-index="79,79"><span data-line-number-content="">80</span></div><div data-line-type="change-addition" data-column-number="81" data-line-index="80,80"><span data-line-number-content="">81</span></div><div data-line-type="context" data-column-number="82" data-line-index="81,81"><span data-line-number-content="">82</span></div><div data-line-type="context" data-column-number="83" data-line-index="82,82"><span data-line-number-content="">83</span></div><div data-line-type="context" data-column-number="84" data-line-index="83,83"><span data-line-number-content="">84</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="123" data-line-index="122,122"><span data-line-number-content="">123</span></div><div data-line-type="context" data-column-number="124" data-line-index="123,123"><span data-line-number-content="">124</span></div><div data-line-type="context" data-column-number="125" data-line-index="124,124"><span data-line-number-content="">125</span></div><div data-line-type="change-addition" data-column-number="126" data-line-index="125,125"><span data-line-number-content="">126</span></div><div data-line-type="change-addition" data-column-number="127" data-line-index="126,126"><span data-line-number-content="">127</span></div><div data-line-type="change-addition" data-column-number="128" data-line-index="127,127"><span data-line-number-content="">128</span></div><div data-line-type="change-addition" data-column-number="129" data-line-index="128,128"><span data-line-number-content="">129</span></div><div data-line-type="change-addition" data-column-number="130" data-line-index="129,129"><span data-line-number-content="">130</span></div><div data-line-type="change-addition" data-column-number="131" data-line-index="130,130"><span data-line-number-content="">131</span></div><div data-line-type="change-addition" data-column-number="132" data-line-index="131,131"><span data-line-number-content="">132</span></div><div data-line-type="change-addition" data-column-number="133" data-line-index="132,132"><span data-line-number-content="">133</span></div><div data-line-type="change-addition" data-column-number="134" data-line-index="133,133"><span data-line-number-content="">134</span></div><div data-line-type="change-addition" data-column-number="135" data-line-index="134,134"><span data-line-number-content="">135</span></div><div data-line-type="change-addition" data-column-number="136" data-line-index="135,135"><span data-line-number-content="">136</span></div><div data-line-type="change-addition" data-column-number="137" data-line-index="136,136"><span data-line-number-content="">137</span></div><div data-line-type="change-addition" data-column-number="138" data-line-index="137,137"><span data-line-number-content="">138</span></div><div data-line-type="change-addition" data-column-number="139" data-line-index="138,138"><span data-line-number-content="">139</span></div><div data-line-type="change-addition" data-column-number="140" data-line-index="139,139"><span data-line-number-content="">140</span></div><div data-line-type="change-addition" data-column-number="141" data-line-index="140,140"><span data-line-number-content="">141</span></div><div data-line-type="change-addition" data-column-number="142" data-line-index="141,141"><span data-line-number-content="">142</span></div><div data-line-type="change-addition" data-column-number="143" data-line-index="142,142"><span data-line-number-content="">143</span></div><div data-line-type="change-addition" data-column-number="144" data-line-index="143,143"><span data-line-number-content="">144</span></div><div data-line-type="change-addition" data-column-number="145" data-line-index="144,144"><span data-line-number-content="">145</span></div><div data-line-type="change-addition" data-column-number="146" data-line-index="145,145"><span data-line-number-content="">146</span></div><div data-line-type="change-addition" data-column-number="147" data-line-index="146,146"><span data-line-number-content="">147</span></div><div data-line-type="change-addition" data-column-number="148" data-line-index="147,147"><span data-line-number-content="">148</span></div><div data-line-type="change-addition" data-column-number="149" data-line-index="148,148"><span data-line-number-content="">149</span></div><div data-line-type="change-addition" data-column-number="150" data-line-index="149,149"><span data-line-number-content="">150</span></div><div data-line-type="change-addition" data-column-number="151" data-line-index="150,150"><span data-line-number-content="">151</span></div><div data-line-type="change-addition" data-column-number="152" data-line-index="151,151"><span data-line-number-content="">152</span></div><div data-line-type="context" data-column-number="153" data-line-index="152,152"><span data-line-number-content="">153</span></div><div data-line-type="context" data-column-number="154" data-line-index="153,153"><span data-line-number-content="">154</span></div><div data-line-type="context" data-column-number="155" data-line-index="154,154"><span data-line-number-content="">155</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="168" data-line-index="167,167"><span data-line-number-content="">168</span></div><div data-line-type="context" data-column-number="169" data-line-index="168,168"><span data-line-number-content="">169</span></div><div data-line-type="context" data-column-number="170" data-line-index="169,169"><span data-line-number-content="">170</span></div><div data-line-type="change-addition" data-column-number="171" data-line-index="170,170"><span data-line-number-content="">171</span></div><div data-line-type="change-addition" data-column-number="172" data-line-index="171,171"><span data-line-number-content="">172</span></div><div data-line-type="change-addition" data-column-number="173" data-line-index="172,172"><span data-line-number-content="">173</span></div><div data-line-type="change-addition" data-column-number="174" data-line-index="173,173"><span data-line-number-content="">174</span></div><div data-line-type="change-addition" data-column-number="175" data-line-index="174,174"><span data-line-number-content="">175</span></div><div data-line-type="change-addition" data-column-number="176" data-line-index="175,175"><span data-line-number-content="">176</span></div><div data-line-type="change-addition" data-column-number="177" data-line-index="176,176"><span data-line-number-content="">177</span></div><div data-line-type="change-addition" data-column-number="178" data-line-index="177,177"><span data-line-number-content="">178</span></div><div data-line-type="change-addition" data-column-number="179" data-line-index="178,178"><span data-line-number-content="">179</span></div><div data-line-type="change-addition" data-column-number="180" data-line-index="179,179"><span data-line-number-content="">180</span></div><div data-line-type="change-addition" data-column-number="181" data-line-index="180,180"><span data-line-number-content="">181</span></div><div data-line-type="change-addition" data-column-number="182" data-line-index="181,181"><span data-line-number-content="">182</span></div><div data-line-type="change-addition" data-column-number="183" data-line-index="182,182"><span data-line-number-content="">183</span></div><div data-line-type="change-addition" data-column-number="184" data-line-index="183,183"><span data-line-number-content="">184</span></div><div data-line-type="change-addition" data-column-number="185" data-line-index="184,184"><span data-line-number-content="">185</span></div><div data-line-type="change-addition" data-column-number="186" data-line-index="185,185"><span data-line-number-content="">186</span></div><div data-line-type="change-addition" data-column-number="187" data-line-index="186,186"><span data-line-number-content="">187</span></div><div data-line-type="change-addition" data-column-number="188" data-line-index="187,187"><span data-line-number-content="">188</span></div><div data-line-type="change-addition" data-column-number="189" data-line-index="188,188"><span data-line-number-content="">189</span></div><div data-line-type="change-addition" data-column-number="190" data-line-index="189,189"><span data-line-number-content="">190</span></div><div data-line-type="change-addition" data-column-number="191" data-line-index="190,190"><span data-line-number-content="">191</span></div><div data-line-type="change-addition" data-column-number="192" data-line-index="191,191"><span data-line-number-content="">192</span></div><div data-line-type="change-addition" data-column-number="193" data-line-index="192,192"><span data-line-number-content="">193</span></div><div data-line-type="change-addition" data-column-number="194" data-line-index="193,193"><span data-line-number-content="">194</span></div><div data-line-type="change-addition" data-column-number="195" data-line-index="194,194"><span data-line-number-content="">195</span></div><div data-line-type="change-addition" data-column-number="196" data-line-index="195,195"><span data-line-number-content="">196</span></div><div data-line-type="change-addition" data-column-number="197" data-line-index="196,196"><span data-line-number-content="">197</span></div><div data-line-type="change-addition" data-column-number="198" data-line-index="197,197"><span data-line-number-content="">198</span></div><div data-line-type="change-addition" data-column-number="199" data-line-index="198,198"><span data-line-number-content="">199</span></div><div data-line-type="change-addition" data-column-number="200" data-line-index="199,199"><span data-line-number-content="">200</span></div><div data-line-type="change-addition" data-column-number="201" data-line-index="200,200"><span data-line-number-content="">201</span></div><div data-line-type="change-addition" data-column-number="202" data-line-index="201,201"><span data-line-number-content="">202</span></div><div data-line-type="change-addition" data-column-number="203" data-line-index="202,202"><span data-line-number-content="">203</span></div><div data-line-type="change-addition" data-column-number="204" data-line-index="203,203"><span data-line-number-content="">204</span></div><div data-line-type="change-addition" data-column-number="205" data-line-index="204,204"><span data-line-number-content="">205</span></div><div data-line-type="change-addition" data-column-number="206" data-line-index="205,205"><span data-line-number-content="">206</span></div><div data-line-type="change-addition" data-column-number="207" data-line-index="206,206"><span data-line-number-content="">207</span></div><div data-line-type="change-addition" data-column-number="208" data-line-index="207,207"><span data-line-number-content="">208</span></div><div data-line-type="change-addition" data-column-number="209" data-line-index="208,208"><span data-line-number-content="">209</span></div><div data-line-type="change-addition" data-column-number="210" data-line-index="209,209"><span data-line-number-content="">210</span></div><div data-line-type="change-addition" data-column-number="211" data-line-index="210,210"><span data-line-number-content="">211</span></div><div data-line-type="change-addition" data-column-number="212" data-line-index="211,211"><span data-line-number-content="">212</span></div><div data-line-type="change-addition" data-column-number="213" data-line-index="212,212"><span data-line-number-content="">213</span></div><div data-line-type="change-addition" data-column-number="214" data-line-index="213,213"><span data-line-number-content="">214</span></div><div data-line-type="change-addition" data-column-number="215" data-line-index="214,214"><span data-line-number-content="">215</span></div><div data-line-type="change-addition" data-column-number="216" data-line-index="215,215"><span data-line-number-content="">216</span></div><div data-line-type="change-addition" data-column-number="217" data-line-index="216,216"><span data-line-number-content="">217</span></div><div data-line-type="change-addition" data-column-number="218" data-line-index="217,217"><span data-line-number-content="">218</span></div><div data-line-type="change-addition" data-column-number="219" data-line-index="218,218"><span data-line-number-content="">219</span></div><div data-line-type="change-addition" data-column-number="220" data-line-index="219,219"><span data-line-number-content="">220</span></div><div data-line-type="change-addition" data-column-number="221" data-line-index="220,220"><span data-line-number-content="">221</span></div><div data-line-type="change-addition" data-column-number="222" data-line-index="221,221"><span data-line-number-content="">222</span></div><div data-line-type="change-addition" data-column-number="223" data-line-index="222,222"><span data-line-number-content="">223</span></div><div data-line-type="change-addition" data-column-number="224" data-line-index="223,223"><span data-line-number-content="">224</span></div><div data-line-type="change-addition" data-column-number="225" data-line-index="224,224"><span data-line-number-content="">225</span></div><div data-line-type="context" data-column-number="226" data-line-index="225,225"><span data-line-number-content="">226</span></div><div data-line-type="context" data-column-number="227" data-line-index="226,226"><span data-line-number-content="">227</span></div><div data-line-type="context" data-column-number="228" data-line-index="227,227"><span data-line-number-content="">228</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">116 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="345" data-line-index="344,344"><span data-line-number-content="">345</span></div><div data-line-type="context" data-column-number="346" data-line-index="345,345"><span data-line-number-content="">346</span></div><div data-line-type="context" data-column-number="347" data-line-index="346,346"><span data-line-number-content="">347</span></div><div data-line-type="change-addition" data-column-number="348" data-line-index="347,347"><span data-line-number-content="">348</span></div><div data-line-type="change-addition" data-column-number="349" data-line-index="348,348"><span data-line-number-content="">349</span></div><div data-line-type="context" data-column-number="350" data-line-index="349,349"><span data-line-number-content="">350</span></div><div data-line-type="context" data-column-number="351" data-line-index="350,350"><span data-line-number-content="">351</span></div><div data-line-type="context" data-column-number="352" data-line-index="351,351"><span data-line-number-content="">352</span></div><div data-line-type="change-addition" data-column-number="353" data-line-index="354,352"><span data-line-number-content="">353</span></div><div data-line-type="change-addition" data-column-number="354" data-line-index="355,353"><span data-line-number-content="">354</span></div><div data-line-type="change-addition" data-column-number="355" data-line-index="356,354"><span data-line-number-content="">355</span></div><div data-line-type="change-addition" data-column-number="356" data-line-index="357,355"><span data-line-number-content="">356</span></div><div data-line-type="change-addition" data-column-number="357" data-line-index="358,356"><span data-line-number-content="">357</span></div><div data-line-type="change-addition" data-column-number="358" data-line-index="359,357"><span data-line-number-content="">358</span></div><div data-line-type="change-addition" data-column-number="359" data-line-index="360,358"><span data-line-number-content="">359</span></div><div data-line-type="change-addition" data-column-number="360" data-line-index="361,359"><span data-line-number-content="">360</span></div><div data-line-type="change-addition" data-column-number="361" data-line-index="362,360"><span data-line-number-content="">361</span></div><div data-line-type="context" data-column-number="362" data-line-index="363,361"><span data-line-number-content="">362</span></div><div data-line-type="context" data-column-number="363" data-line-index="364,362"><span data-line-number-content="">363</span></div><div data-line-type="context" data-column-number="364" data-line-index="365,363"><span data-line-number-content="">364</span></div><div data-line-type="change-addition" data-column-number="365" data-line-index="366,364"><span data-line-number-content="">365</span></div><div data-line-type="context" data-column-number="366" data-line-index="367,365"><span data-line-number-content="">366</span></div><div data-line-type="context" data-column-number="367" data-line-index="368,366"><span data-line-number-content="">367</span></div><div data-line-type="context" data-column-number="368" data-line-index="369,367"><span data-line-number-content="">368</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="371" data-line-index="372,370"><span data-line-number-content="">371</span></div><div data-line-type="context" data-column-number="372" data-line-index="373,371"><span data-line-number-content="">372</span></div><div data-line-type="context" data-column-number="373" data-line-index="374,372"><span data-line-number-content="">373</span></div><div data-line-type="change-addition" data-column-number="374" data-line-index="375,373"><span data-line-number-content="">374</span></div><div data-line-type="context" data-column-number="375" data-line-index="376,374"><span data-line-number-content="">375</span></div><div data-line-type="context" data-column-number="376" data-line-index="377,375"><span data-line-number-content="">376</span></div><div data-line-type="context" data-column-number="377" data-line-index="378,376"><span data-line-number-content="">377</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="379" data-line-index="380,378"><span data-line-number-content="">379</span></div><div data-line-type="context" data-column-number="380" data-line-index="381,379"><span data-line-number-content="">380</span></div><div data-line-type="context" data-column-number="381" data-line-index="382,380"><span data-line-number-content="">381</span></div><div data-line-type="change-addition" data-column-number="382" data-line-index="383,381"><span data-line-number-content="">382</span></div><div data-line-type="context" data-column-number="383" data-line-index="384,382"><span data-line-number-content="">383</span></div><div data-line-type="change-addition" data-column-number="384" data-line-index="386,383"><span data-line-number-content="">384</span></div><div data-line-type="change-addition" data-column-number="385" data-line-index="387,384"><span data-line-number-content="">385</span></div><div data-line-type="context" data-column-number="386" data-line-index="388,385"><span data-line-number-content="">386</span></div><div data-line-type="context" data-column-number="387" data-line-index="389,386"><span data-line-number-content="">387</span></div><div data-line-type="change-addition" data-column-number="388" data-line-index="392,387"><span data-line-number-content="">388</span></div><div data-line-type="change-addition" data-column-number="389" data-line-index="393,388"><span data-line-number-content="">389</span></div><div data-line-type="change-addition" data-column-number="390" data-line-index="394,389"><span data-line-number-content="">390</span></div><div data-line-type="change-addition" data-column-number="391" data-line-index="395,390"><span data-line-number-content="">391</span></div><div data-line-type="context" data-column-number="392" data-line-index="396,391"><span data-line-number-content="">392</span></div><div data-line-type="change-addition" data-column-number="393" data-line-index="398,392"><span data-line-number-content="">393</span></div><div data-line-type="context" data-column-number="394" data-line-index="399,393"><span data-line-number-content="">394</span></div><div data-line-type="context" data-column-number="395" data-line-index="400,394"><span data-line-number-content="">395</span></div><div data-line-type="context" data-column-number="396" data-line-index="401,395"><span data-line-number-content="">396</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">5 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="402" data-line-index="407,401"><span data-line-number-content="">402</span></div><div data-line-type="context" data-column-number="403" data-line-index="408,402"><span data-line-number-content="">403</span></div><div data-line-type="context" data-column-number="404" data-line-index="409,403"><span data-line-number-content="">404</span></div><div data-line-type="change-addition" data-column-number="405" data-line-index="411,404"><span data-line-number-content="">405</span></div><div data-line-type="change-addition" data-column-number="406" data-line-index="412,405"><span data-line-number-content="">406</span></div><div data-line-type="change-addition" data-column-number="407" data-line-index="413,406"><span data-line-number-content="">407</span></div><div data-line-type="change-addition" data-column-number="408" data-line-index="414,407"><span data-line-number-content="">408</span></div><div data-line-type="change-addition" data-column-number="409" data-line-index="415,408"><span data-line-number-content="">409</span></div><div data-line-type="change-addition" data-column-number="410" data-line-index="416,409"><span data-line-number-content="">410</span></div><div data-line-type="change-addition" data-column-number="411" data-line-index="417,410"><span data-line-number-content="">411</span></div><div data-line-type="change-addition" data-column-number="412" data-line-index="418,411"><span data-line-number-content="">412</span></div><div data-line-type="change-addition" data-column-number="413" data-line-index="419,412"><span data-line-number-content="">413</span></div><div data-line-type="change-addition" data-column-number="414" data-line-index="420,413"><span data-line-number-content="">414</span></div><div data-line-type="change-addition" data-column-number="415" data-line-index="421,414"><span data-line-number-content="">415</span></div><div data-line-type="change-addition" data-column-number="416" data-line-index="422,415"><span data-line-number-content="">416</span></div><div data-line-type="change-addition" data-column-number="417" data-line-index="423,416"><span data-line-number-content="">417</span></div><div data-line-type="change-addition" data-column-number="418" data-line-index="424,417"><span data-line-number-content="">418</span></div><div data-line-type="change-addition" data-column-number="419" data-line-index="425,418"><span data-line-number-content="">419</span></div><div data-line-type="change-addition" data-column-number="420" data-line-index="426,419"><span data-line-number-content="">420</span></div><div data-line-type="context" data-column-number="421" data-line-index="427,420"><span data-line-number-content="">421</span></div><div data-line-type="context" data-column-number="422" data-line-index="428,421"><span data-line-number-content="">422</span></div><div data-line-type="context" data-column-number="423" data-line-index="429,422"><span data-line-number-content="">423</span></div><div data-line-type="change-addition" data-column-number="424" data-line-index="430,423"><span data-line-number-content="">424</span></div><div data-line-type="change-addition" data-column-number="425" data-line-index="431,424"><span data-line-number-content="">425</span></div><div data-line-type="change-addition" data-column-number="426" data-line-index="432,425"><span data-line-number-content="">426</span></div><div data-line-type="change-addition" data-column-number="427" data-line-index="433,426"><span data-line-number-content="">427</span></div><div data-line-type="change-addition" data-column-number="428" data-line-index="434,427"><span data-line-number-content="">428</span></div><div data-line-type="change-addition" data-column-number="429" data-line-index="435,428"><span data-line-number-content="">429</span></div><div data-line-type="change-addition" data-column-number="430" data-line-index="436,429"><span data-line-number-content="">430</span></div><div data-line-type="change-addition" data-column-number="431" data-line-index="437,430"><span data-line-number-content="">431</span></div><div data-line-type="change-addition" data-column-number="432" data-line-index="438,431"><span data-line-number-content="">432</span></div><div data-line-type="context" data-column-number="433" data-line-index="439,432"><span data-line-number-content="">433</span></div><div data-line-type="context" data-column-number="434" data-line-index="440,433"><span data-line-number-content="">434</span></div><div data-line-type="context" data-column-number="435" data-line-index="441,434"><span data-line-number-content="">435</span></div><div data-line-type="context" data-column-number="436" data-line-index="442,435"><span data-line-number-content="">436</span></div><div data-line-type="context" data-column-number="437" data-line-index="443,436"><span data-line-number-content="">437</span></div><div data-line-type="change-addition" data-column-number="438" data-line-index="445,437"><span data-line-number-content="">438</span></div><div data-line-type="context" data-column-number="439" data-line-index="446,438"><span data-line-number-content="">439</span></div><div data-line-type="context" data-column-number="440" data-line-index="447,439"><span data-line-number-content="">440</span></div><div data-line-type="change-addition" data-column-number="441" data-line-index="449,440"><span data-line-number-content="">441</span></div><div data-line-type="context" data-column-number="442" data-line-index="450,441"><span data-line-number-content="">442</span></div><div data-line-type="context" data-column-number="443" data-line-index="451,442"><span data-line-number-content="">443</span></div><div data-line-type="context" data-column-number="444" data-line-index="452,443"><span data-line-number-content="">444</span></div><div data-line-type="context" data-column-number="445" data-line-index="453,444"><span data-line-number-content="">445</span></div><div data-line-type="context" data-column-number="446" data-line-index="454,445"><span data-line-number-content="">446</span></div><div data-line-type="context" data-column-number="447" data-line-index="455,446"><span data-line-number-content="">447</span></div><div data-line-type="change-addition" data-column-number="448" data-line-index="457,447"><span data-line-number-content="">448</span></div><div data-line-type="context" data-column-number="449" data-line-index="458,448"><span data-line-number-content="">449</span></div><div data-line-type="context" data-column-number="450" data-line-index="459,449"><span data-line-number-content="">450</span></div><div data-line-type="context" data-column-number="451" data-line-index="460,450"><span data-line-number-content="">451</span></div><div data-line-type="change-addition" data-column-number="452" data-line-index="462,451"><span data-line-number-content="">452</span></div><div data-line-type="context" data-column-number="453" data-line-index="463,452"><span data-line-number-content="">453</span></div><div data-line-type="context" data-column-number="454" data-line-index="464,453"><span data-line-number-content="">454</span></div><div data-line-type="context" data-column-number="455" data-line-index="465,454"><span data-line-number-content="">455</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="457" data-line-index="467,456"><span data-line-number-content="">457</span></div><div data-line-type="context" data-column-number="458" data-line-index="468,457"><span data-line-number-content="">458</span></div><div data-line-type="context" data-column-number="459" data-line-index="469,458"><span data-line-number-content="">459</span></div><div data-line-type="change-addition" data-column-number="460" data-line-index="470,459"><span data-line-number-content="">460</span></div><div data-line-type="context" data-column-number="461" data-line-index="471,460"><span data-line-number-content="">461</span></div><div data-line-type="context" data-column-number="462" data-line-index="472,461"><span data-line-number-content="">462</span></div><div data-line-type="context" data-column-number="463" data-line-index="473,462"><span data-line-number-content="">463</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">37 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="501" data-line-index="511,500"><span data-line-number-content="">501</span></div><div data-line-type="context" data-column-number="502" data-line-index="512,501"><span data-line-number-content="">502</span></div><div data-line-type="context" data-column-number="503" data-line-index="513,502"><span data-line-number-content="">503</span></div><div data-line-type="change-addition" data-column-number="504" data-line-index="514,503"><span data-line-number-content="">504</span></div><div data-line-type="change-addition" data-column-number="505" data-line-index="515,504"><span data-line-number-content="">505</span></div><div data-line-type="change-addition" data-column-number="506" data-line-index="516,505"><span data-line-number-content="">506</span></div><div data-line-type="change-addition" data-column-number="507" data-line-index="517,506"><span data-line-number-content="">507</span></div><div data-line-type="context" data-column-number="508" data-line-index="518,507"><span data-line-number-content="">508</span></div><div data-line-type="change-addition" data-column-number="509" data-line-index="520,508"><span data-line-number-content="">509</span></div><div data-line-type="context" data-column-number="510" data-line-index="521,509"><span data-line-number-content="">510</span></div><div data-line-type="change-addition" data-column-number="511" data-line-index="523,510"><span data-line-number-content="">511</span></div><div data-line-type="change-addition" data-column-number="512" data-line-index="524,511"><span data-line-number-content="">512</span></div><div data-line-type="context" data-column-number="513" data-line-index="525,512"><span data-line-number-content="">513</span></div><div data-line-type="context" data-column-number="514" data-line-index="526,513"><span data-line-number-content="">514</span></div><div data-line-type="context" data-column-number="515" data-line-index="527,514"><span data-line-number-content="">515</span></div><div data-line-type="change-addition" data-column-number="516" data-line-index="528,515"><span data-line-number-content="">516</span></div><div data-line-type="change-addition" data-column-number="517" data-line-index="529,516"><span data-line-number-content="">517</span></div><div data-line-type="change-addition" data-column-number="518" data-line-index="530,517"><span data-line-number-content="">518</span></div><div data-line-type="change-addition" data-column-number="519" data-line-index="531,518"><span data-line-number-content="">519</span></div><div data-line-type="context" data-column-number="520" data-line-index="532,519"><span data-line-number-content="">520</span></div><div data-line-type="change-addition" data-column-number="521" data-line-index="534,520"><span data-line-number-content="">521</span></div><div data-line-type="change-addition" data-column-number="522" data-line-index="535,521"><span data-line-number-content="">522</span></div><div data-line-type="context" data-column-number="523" data-line-index="536,522"><span data-line-number-content="">523</span></div><div data-line-type="context" data-column-number="524" data-line-index="537,523"><span data-line-number-content="">524</span></div><div data-line-type="context" data-column-number="525" data-line-index="538,524"><span data-line-number-content="">525</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="529" data-line-index="542,528"><span data-line-number-content="">529</span></div><div data-line-type="context" data-column-number="530" data-line-index="543,529"><span data-line-number-content="">530</span></div><div data-line-type="context" data-column-number="531" data-line-index="544,530"><span data-line-number-content="">531</span></div><div data-line-type="change-addition" data-column-number="532" data-line-index="546,531"><span data-line-number-content="">532</span></div><div data-line-type="context" data-column-number="533" data-line-index="547,532"><span data-line-number-content="">533</span></div><div data-line-type="context" data-column-number="534" data-line-index="548,533"><span data-line-number-content="">534</span></div><div data-line-type="context" data-column-number="535" data-line-index="549,534"><span data-line-number-content="">535</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="539" data-line-index="553,538"><span data-line-number-content="">539</span></div><div data-line-type="context" data-column-number="540" data-line-index="554,539"><span data-line-number-content="">540</span></div><div data-line-type="context" data-column-number="541" data-line-index="555,540"><span data-line-number-content="">541</span></div><div data-line-type="change-addition" data-column-number="542" data-line-index="556,541"><span data-line-number-content="">542</span></div><div data-line-type="change-addition" data-column-number="543" data-line-index="557,542"><span data-line-number-content="">543</span></div><div data-line-type="change-addition" data-column-number="544" data-line-index="558,543"><span data-line-number-content="">544</span></div><div data-line-type="change-addition" data-column-number="545" data-line-index="559,544"><span data-line-number-content="">545</span></div><div data-line-type="change-addition" data-column-number="546" data-line-index="560,545"><span data-line-number-content="">546</span></div><div data-line-type="change-addition" data-column-number="547" data-line-index="561,546"><span data-line-number-content="">547</span></div><div data-line-type="change-addition" data-column-number="548" data-line-index="562,547"><span data-line-number-content="">548</span></div><div data-line-type="change-addition" data-column-number="549" data-line-index="563,548"><span data-line-number-content="">549</span></div><div data-line-type="change-addition" data-column-number="550" data-line-index="564,549"><span data-line-number-content="">550</span></div><div data-line-type="change-addition" data-column-number="551" data-line-index="565,550"><span data-line-number-content="">551</span></div><div data-line-type="change-addition" data-column-number="552" data-line-index="566,551"><span data-line-number-content="">552</span></div><div data-line-type="change-addition" data-column-number="553" data-line-index="567,552"><span data-line-number-content="">553</span></div><div data-line-type="change-addition" data-column-number="554" data-line-index="568,553"><span data-line-number-content="">554</span></div><div data-line-type="change-addition" data-column-number="555" data-line-index="569,554"><span data-line-number-content="">555</span></div><div data-line-type="change-addition" data-column-number="556" data-line-index="570,555"><span data-line-number-content="">556</span></div><div data-line-type="change-addition" data-column-number="557" data-line-index="571,556"><span data-line-number-content="">557</span></div><div data-line-type="change-addition" data-column-number="558" data-line-index="572,557"><span data-line-number-content="">558</span></div><div data-line-type="change-addition" data-column-number="559" data-line-index="573,558"><span data-line-number-content="">559</span></div><div data-line-type="change-addition" data-column-number="560" data-line-index="574,559"><span data-line-number-content="">560</span></div><div data-line-type="change-addition" data-column-number="561" data-line-index="575,560"><span data-line-number-content="">561</span></div><div data-line-type="change-addition" data-column-number="562" data-line-index="576,561"><span data-line-number-content="">562</span></div><div data-line-type="context" data-column-number="563" data-line-index="577,562"><span data-line-number-content="">563</span></div><div data-line-type="context" data-column-number="564" data-line-index="578,563"><span data-line-number-content="">564</span></div><div data-line-type="context" data-column-number="565" data-line-index="579,564"><span data-line-number-content="">565</span></div></div><div data-content="" style="grid-row: span 286"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">72 unmodified lines</span></div></div></div><div data-line="73" data-alt-line="73" data-line-type="context" data-line-index="72,72"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="74" data-alt-line="74" data-line-type="context" data-line-index="73,73"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="75" data-alt-line="75" data-line-type="context" data-line-index="74,74">
|
||
</div><div data-line="76" data-line-type="change-addition" data-line-index="75,75"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cachedByteCount: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="77" data-line-type="change-addition" data-line-index="76,76"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="78" data-line-type="change-addition" data-line-index="77,77"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">reduce</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> +</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">data</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="79" data-line-type="change-addition" data-line-index="78,78"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="80" data-line-type="change-addition" data-line-index="79,79"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="81" data-line-type="change-addition" data-line-index="80,80">
|
||
</div><div data-line="82" data-alt-line="76" data-line-type="context" data-line-index="81,81"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">at</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> start</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="83" data-alt-line="77" data-line-type="context" data-line-index="82,82"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">data.isEmpty </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="84" data-alt-line="78" data-line-type="context" data-line-index="83,83"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line="123" data-alt-line="117" data-line-type="context" data-line-index="122,122"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="124" data-alt-line="118" data-line-type="context" data-line-index="123,123"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="125" data-alt-line="119" data-line-type="context" data-line-index="124,124">
|
||
</div><div data-line="126" data-line-type="change-addition" data-line-index="125,125"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="127" data-line-type="change-addition" data-line-index="126,126"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="128" data-line-type="change-addition" data-line-index="127,127"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.start</span></div><div data-line="129" data-line-type="change-addition" data-line-index="128,128"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missing: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="130" data-line-type="change-addition" data-line-index="129,129">
|
||
</div><div data-line="131" data-line-type="change-addition" data-line-index="130,130"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">where</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="132" data-line-type="change-addition" data-line-index="131,131"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"><=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="133" data-line-type="change-addition" data-line-index="132,132"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> break</span></div><div data-line="134" data-line-type="change-addition" data-line-index="133,133"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="135" data-line-type="change-addition" data-line-index="134,134"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="136" data-line-type="change-addition" data-line-index="135,135"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missing.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range.end, segment.range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)))</span></div><div data-line="137" data-line-type="change-addition" data-line-index="136,136"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="138" data-line-type="change-addition" data-line-index="137,137"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="139" data-line-type="change-addition" data-line-index="138,138"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cursor, segment.range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="140" data-line-type="change-addition" data-line-index="139,139"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="141" data-line-type="change-addition" data-line-index="140,140"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="142" data-line-type="change-addition" data-line-index="141,141"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> break</span></div><div data-line="143" data-line-type="change-addition" data-line-index="142,142"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="144" data-line-type="change-addition" data-line-index="143,143"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="145" data-line-type="change-addition" data-line-index="144,144">
|
||
</div><div data-line="146" data-line-type="change-addition" data-line-index="145,145"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"><=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="147" data-line-type="change-addition" data-line-index="146,146"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missing.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="148" data-line-type="change-addition" data-line-index="147,147"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="149" data-line-type="change-addition" data-line-index="148,148"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missing</span></div><div data-line="150" data-line-type="change-addition" data-line-index="149,149"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="151" data-line-type="change-addition" data-line-index="150,150"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="152" data-line-type="change-addition" data-line-index="151,151">
|
||
</div><div data-line="153" data-alt-line="120" data-line-type="context" data-line-index="152,152"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">keeping</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="154" data-alt-line="121" data-line-type="context" data-line-index="153,153"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="155" data-alt-line="122" data-line-type="context" data-line-index="154,154"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">compactMap</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line="168" data-alt-line="135" data-line-type="context" data-line-index="167,167"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="169" data-alt-line="136" data-line-type="context" data-line-index="168,168"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="170" data-alt-line="137" data-line-type="context" data-line-index="169,169">
|
||
</div><div data-line="171" data-line-type="change-addition" data-line-index="170,170"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">toByteBudget</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> byteBudget</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preserving</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> protectedRanges</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">])</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="172" data-line-type="change-addition" data-line-index="171,171"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="173" data-line-type="change-addition" data-line-index="172,172"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteBudget </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="174" data-line-type="change-addition" data-line-index="173,173"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">\.range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="175" data-line-type="change-addition" data-line-index="174,174"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removeAll</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="176" data-line-type="change-addition" data-line-index="175,175"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted</span></div><div data-line="177" data-line-type="change-addition" data-line-index="176,176"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="178" data-line-type="change-addition" data-line-index="177,177">
|
||
</div><div data-line="179" data-line-type="change-addition" data-line-index="178,178"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> totalBytes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">reduce</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> +</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">data</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="180" data-line-type="change-addition" data-line-index="179,179"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> totalBytes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteBudget </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="181" data-line-type="change-addition" data-line-index="180,180"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> []</span></div><div data-line="182" data-line-type="change-addition" data-line-index="181,181"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="183" data-line-type="change-addition" data-line-index="182,182">
|
||
</div><div data-line="184" data-line-type="change-addition" data-line-index="183,183"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="185" data-line-type="change-addition" data-line-index="184,184"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> while</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> totalBytes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteBudget,</span></div><div data-line="186" data-line-type="change-addition" data-line-index="185,185"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> index </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictionCandidateIndex</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protectedRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> protectedRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="187" data-line-type="change-addition" data-line-index="186,186"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> removed </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">remove</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> index</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="188" data-line-type="change-addition" data-line-index="187,187"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> totalBytes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removed.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">data</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="189" data-line-type="change-addition" data-line-index="188,188"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removed.range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="190" data-line-type="change-addition" data-line-index="189,189"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="191" data-line-type="change-addition" data-line-index="190,190"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted</span></div><div data-line="192" data-line-type="change-addition" data-line-index="191,191"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="193" data-line-type="change-addition" data-line-index="192,192"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="194" data-line-type="change-addition" data-line-index="193,193">
|
||
</div><div data-line="195" data-line-type="change-addition" data-line-index="194,194"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictionCandidateIndex</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protectedRanges</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">])</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="196" data-line-type="change-addition" data-line-index="195,195"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestIndex: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="197" data-line-type="change-addition" data-line-index="196,196"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestDistance: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .min</span></div><div data-line="198" data-line-type="change-addition" data-line-index="197,197">
|
||
</div><div data-line="199" data-line-type="change-addition" data-line-index="198,198"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">index, segment</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">enumerated</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="200" data-line-type="change-addition" data-line-index="199,199"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRanges.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">where</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.overlapsOrTouches</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">segment.range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> })</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="201" data-line-type="change-addition" data-line-index="200,200"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> continue</span></div><div data-line="202" data-line-type="change-addition" data-line-index="201,201"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="203" data-line-type="change-addition" data-line-index="202,202">
|
||
</div><div data-line="204" data-line-type="change-addition" data-line-index="203,203"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> distance </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRanges</span></div><div data-line="205" data-line-type="change-addition" data-line-index="204,204"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeDistance</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">from</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> segment.range, to</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="206" data-line-type="change-addition" data-line-index="205,205"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.start</span></div><div data-line="207" data-line-type="change-addition" data-line-index="206,206"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> distance </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestDistance </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="208" data-line-type="change-addition" data-line-index="207,207"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestDistance </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> distance</span></div><div data-line="209" data-line-type="change-addition" data-line-index="208,208"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestIndex </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> index</span></div><div data-line="210" data-line-type="change-addition" data-line-index="209,209"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="211" data-line-type="change-addition" data-line-index="210,210"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="212" data-line-type="change-addition" data-line-index="211,211">
|
||
</div><div data-line="213" data-line-type="change-addition" data-line-index="212,212"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestIndex</span></div><div data-line="214" data-line-type="change-addition" data-line-index="213,213"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="215" data-line-type="change-addition" data-line-index="214,214">
|
||
</div><div data-line="216" data-line-type="change-addition" data-line-index="215,215"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeDistance</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">from</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">to</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> protectedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="217" data-line-type="change-addition" data-line-index="216,216"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">overlapsOrTouches</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protectedRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="218" data-line-type="change-addition" data-line-index="217,217"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span></div><div data-line="219" data-line-type="change-addition" data-line-index="218,218"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="220" data-line-type="change-addition" data-line-index="219,219"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"><</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRange.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="221" data-line-type="change-addition" data-line-index="220,220"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRange.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end</span></div><div data-line="222" data-line-type="change-addition" data-line-index="221,221"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="223" data-line-type="change-addition" data-line-index="222,222"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRange.end</span></div><div data-line="224" data-line-type="change-addition" data-line-index="223,223"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="225" data-line-type="change-addition" data-line-index="224,224">
|
||
</div><div data-line="226" data-alt-line="138" data-line-type="context" data-line-index="225,225"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mergeSegments</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="227" data-alt-line="139" data-line-type="context" data-line-index="226,226"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">segments.isEmpty </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="228" data-alt-line="140" data-line-type="context" data-line-index="227,227"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">116 unmodified lines</span></div></div></div><div data-line="345" data-alt-line="257" data-line-type="context" data-line-index="344,344"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> durationProvider: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> TimeInterval</span></div><div data-line="346" data-alt-line="258" data-line-type="context" data-line-index="345,345"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchChunkSize: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="347" data-alt-line="259" data-line-type="context" data-line-index="346,346"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseChunkSize: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="348" data-line-type="change-addition" data-line-index="347,347"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> seekPrimeBehindBytes: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="349" data-line-type="change-addition" data-line-index="348,348"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cacheByteBudget: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span></div><div data-line="350" data-alt-line="260" data-line-type="context" data-line-index="349,349"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask: Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"><</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Void</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, Never</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>?</span></div><div data-line="351" data-alt-line="261" data-line-type="context" data-line-index="350,350"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="352" data-alt-line="262" data-line-type="context" data-line-index="351,351"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="353" data-line-type="change-addition" data-line-index="354,352"><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentSeekRange: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></span></div><div data-line="354" data-line-type="change-addition" data-line-index="355,353"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentForegroundRange</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></span></div><div data-line="355" data-line-type="change-addition" data-line-index="356,354">
|
||
</div><div data-line="356" data-line-type="change-addition" data-line-index="357,355"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="357" data-line-type="change-addition" data-line-index="358,356"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPRangeRemoteFetcher,</span></div><div data-line="358" data-line-type="change-addition" data-line-index="359,357"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="359" data-line-type="change-addition" data-line-index="360,358"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">@</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">escaping</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> TimeInterval,</span></div><div data-line="360" data-line-type="change-addition" data-line-index="361,359"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheByteBudget</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="361" data-line-type="change-addition" data-line-index="362,360"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="362" data-alt-line="265" data-line-type="context" data-line-index="363,361"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher</span></div><div data-line="363" data-alt-line="266" data-line-type="context" data-line-index="364,362"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> contentLength</span></div><div data-line="364" data-alt-line="267" data-line-type="context" data-line-index="365,363"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> durationProvider</span></div><div data-line="365" data-line-type="change-addition" data-line-index="366,364"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">cacheByteBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cacheByteBudget</span></div><div data-line="366" data-alt-line="268" data-line-type="context" data-line-index="367,365"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="367" data-alt-line="269" data-line-type="context" data-line-index="368,366">
|
||
</div><div data-line="368" data-alt-line="270" data-line-type="context" data-line-index="369,367"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> deinit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line="371" data-alt-line="273" data-line-type="context" data-line-index="372,370">
|
||
</div><div data-line="372" data-alt-line="274" data-line-type="context" data-line-index="373,371"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> requestedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> throws</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="373" data-alt-line="275" data-line-type="context" data-line-index="374,372"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">requestedRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="374" data-line-type="change-addition" data-line-index="375,373"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentForegroundRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded</span></div><div data-line="375" data-alt-line="276" data-line-type="context" data-line-index="376,374"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="376" data-alt-line="277" data-line-type="context" data-line-index="377,375"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="377" data-alt-line="278" data-line-type="context" data-line-index="378,376"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=hit range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="379" data-alt-line="280" data-line-type="context" data-line-index="380,378"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data</span></div><div data-line="380" data-alt-line="281" data-line-type="context" data-line-index="381,379"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="381" data-alt-line="282" data-line-type="context" data-line-index="382,380">
|
||
</div><div data-line="382" data-line-type="change-addition" data-line-index="383,381"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">missingRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="383" data-alt-line="283" data-line-type="context" data-line-index="384,382"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="384" data-line-type="change-addition" data-line-index="386,383"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missKind </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges.count </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> &&</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">bounded</span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "uncached"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> :</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "partial-miss"</span></span></div><div data-line="385" data-line-type="change-addition" data-line-index="387,384"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">missKind</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> missing=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">missingRanges.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">joined</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ","</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="386" data-alt-line="285" data-line-type="context" data-line-index="388,385"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="387" data-alt-line="286" data-line-type="context" data-line-index="389,386"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetchIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forForegroundRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="388" data-line-type="change-addition" data-line-index="392,387"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRange </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges </span></span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></span></div><div data-line="389" data-line-type="change-addition" data-line-index="393,388"><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRange</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="390" data-line-type="change-addition" data-line-index="394,389"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRange.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="391" data-line-type="change-addition" data-line-index="395,390"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="392" data-alt-line="289" data-line-type="context" data-line-index="396,391"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="393" data-line-type="change-addition" data-line-index="398,392"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></span></div><div data-line="394" data-alt-line="291" data-line-type="context" data-line-index="399,393"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="395" data-alt-line="292" data-line-type="context" data-line-index="400,394">
|
||
</div><div data-line="396" data-alt-line="293" data-line-type="context" data-line-index="401,395"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> responseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> requestedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">5 unmodified lines</span></div></div></div><div data-line="402" data-alt-line="299" data-line-type="context" data-line-index="407,401"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="403" data-alt-line="300" data-line-type="context" data-line-index="408,402">
|
||
</div><div data-line="404" data-alt-line="301" data-line-type="context" data-line-index="409,403"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="405" data-line-type="change-addition" data-line-index="411,404"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="406" data-line-type="change-addition" data-line-index="412,405"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="407" data-line-type="change-addition" data-line-index="413,406">
|
||
</div><div data-line="408" data-line-type="change-addition" data-line-index="414,407"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchForSeek</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="409" data-line-type="change-addition" data-line-index="415,408"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seekPrimeWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="410" data-line-type="change-addition" data-line-index="416,409"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentSeekRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window</span></div><div data-line="411" data-line-type="change-addition" data-line-index="417,410"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="412" data-line-type="change-addition" data-line-index="418,411"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset,</span></div><div data-line="413" data-line-type="change-addition" data-line-index="419,412"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="414" data-line-type="change-addition" data-line-index="420,413"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> explicitWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window,</span></div><div data-line="415" data-line-type="change-addition" data-line-index="421,414"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span></div><div data-line="416" data-line-type="change-addition" data-line-index="422,415"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="417" data-line-type="change-addition" data-line-index="423,416"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="418" data-line-type="change-addition" data-line-index="424,417">
|
||
</div><div data-line="419" data-line-type="change-addition" data-line-index="425,418"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seekPrimeWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="420" data-line-type="change-addition" data-line-index="426,419"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, minimumBehind</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seekPrimeBehindBytes</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="421" data-alt-line="303" data-line-type="context" data-line-index="427,420"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="422" data-alt-line="304" data-line-type="context" data-line-index="428,421">
|
||
</div><div data-line="423" data-alt-line="305" data-line-type="context" data-line-index="429,422"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forceRestart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="424" data-line-type="change-addition" data-line-index="430,423"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> forceRestart, startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="425" data-line-type="change-addition" data-line-index="431,424"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="426" data-line-type="change-addition" data-line-index="432,425">
|
||
</div><div data-line="427" data-line-type="change-addition" data-line-index="433,426"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="428" data-line-type="change-addition" data-line-index="434,427"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="429" data-line-type="change-addition" data-line-index="435,428"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> forceRestart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="430" data-line-type="change-addition" data-line-index="436,429"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> explicitWindow</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="431" data-line-type="change-addition" data-line-index="437,430"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span></div><div data-line="432" data-line-type="change-addition" data-line-index="438,431"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="433" data-alt-line="306" data-line-type="context" data-line-index="439,432"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">forceRestart, activePrefetchWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.isCancelled </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="434" data-alt-line="307" data-line-type="context" data-line-index="440,433"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="435" data-alt-line="308" data-line-type="context" data-line-index="441,434"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="436" data-alt-line="309" data-line-type="context" data-line-index="442,435">
|
||
</div><div data-line="437" data-alt-line="310" data-line-type="context" data-line-index="443,436"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="438" data-line-type="change-addition" data-line-index="445,437"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">explicitWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="439" data-alt-line="312" data-line-type="context" data-line-index="446,438"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window</span></div><div data-line="440" data-alt-line="313" data-line-type="context" data-line-index="447,439"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> offset</span></div><div data-line="441" data-line-type="change-addition" data-line-index="449,440"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="442" data-alt-line="315" data-line-type="context" data-line-index="450,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasData</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="443" data-alt-line="316" data-line-type="context" data-line-index="451,442"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="444" data-alt-line="317" data-line-type="context" data-line-index="452,443"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="445" data-alt-line="318" data-line-type="context" data-line-index="453,444"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="446" data-alt-line="319" data-line-type="context" data-line-index="454,445"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="447" data-alt-line="320" data-line-type="context" data-line-index="455,446">
|
||
</div><div data-line="448" data-line-type="change-addition" data-line-index="457,447"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Task</span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">priority</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">userInitiated</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> :</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">utility</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> </span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">weak</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">] </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="449" data-alt-line="322" data-line-type="context" data-line-index="458,448"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="450" data-alt-line="323" data-line-type="context" data-line-index="459,449"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="451" data-alt-line="324" data-line-type="context" data-line-index="460,450"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="452" data-line-type="change-addition" data-line-index="462,451"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window, preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="453" data-alt-line="326" data-line-type="context" data-line-index="463,452"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">Task.isCancelled </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="454" data-alt-line="327" data-line-type="context" data-line-index="464,453"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="455" data-alt-line="328" data-line-type="context" data-line-index="465,454"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="457" data-alt-line="330" data-line-type="context" data-line-index="467,456"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> do</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="458" data-alt-line="331" data-line-type="context" data-line-index="468,457"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="459" data-alt-line="332" data-line-type="context" data-line-index="469,458"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="460" data-line-type="change-addition" data-line-index="470,459"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="461" data-alt-line="333" data-line-type="context" data-line-index="471,460"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="462" data-alt-line="334" data-line-type="context" data-line-index="472,461"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] fetched range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunk.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunk.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> bytes=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">data.count</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="463" data-alt-line="335" data-line-type="context" data-line-index="473,462"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">37 unmodified lines</span></div></div></div><div data-line="501" data-alt-line="373" data-line-type="context" data-line-index="511,500"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="502" data-alt-line="374" data-line-type="context" data-line-index="512,501">
|
||
</div><div data-line="503" data-alt-line="375" data-line-type="context" data-line-index="513,502"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="504" data-line-type="change-addition" data-line-index="514,503"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, minimumBehind</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="505" data-line-type="change-addition" data-line-index="515,504"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="506" data-line-type="change-addition" data-line-index="516,505">
|
||
</div><div data-line="507" data-line-type="change-addition" data-line-index="517,506"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">minimumBehind</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="508" data-alt-line="376" data-line-type="context" data-line-index="518,507"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedBytesPerSecond</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="509" data-line-type="change-addition" data-line-index="520,508"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> behind </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">minimumBehind</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 30</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="510" data-alt-line="378" data-line-type="context" data-line-index="521,509"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ahead </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 2</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 60</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="511" data-line-type="change-addition" data-line-index="523,510"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> raw </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> behind, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ahead</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="512" data-line-type="change-addition" data-line-index="524,511"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> raw.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkEnd</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> raw.end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="513" data-alt-line="380" data-line-type="context" data-line-index="525,512"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="514" data-alt-line="381" data-line-type="context" data-line-index="526,513">
|
||
</div><div data-line="515" data-alt-line="382" data-line-type="context" data-line-index="527,514"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="516" data-line-type="change-addition" data-line-index="528,515"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window, preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="517" data-line-type="change-addition" data-line-index="529,516"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="518" data-line-type="change-addition" data-line-index="530,517">
|
||
</div><div data-line="519" data-line-type="change-addition" data-line-index="531,518"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">startsAtWindowStart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="520" data-alt-line="383" data-line-type="context" data-line-index="532,519"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> boundedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.start, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.end, offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="521" data-line-type="change-addition" data-line-index="534,520"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">windowStart</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="522" data-line-type="change-addition" data-line-index="535,521"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> startsAtWindowStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> windowStart </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> boundedOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="523" data-alt-line="385" data-line-type="context" data-line-index="536,522"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="524" data-alt-line="386" data-line-type="context" data-line-index="537,523">
|
||
</div><div data-line="525" data-alt-line="387" data-line-type="context" data-line-index="538,524"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line="529" data-alt-line="391" data-line-type="context" data-line-index="542,528"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="530" data-alt-line="392" data-line-type="context" data-line-index="543,529"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="531" data-alt-line="393" data-line-type="context" data-line-index="544,530">
|
||
</div><div data-line="532" data-line-type="change-addition" data-line-index="546,531"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">windowStart</span></span></div><div data-line="533" data-alt-line="395" data-line-type="context" data-line-index="547,532"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> while</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"><</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="534" data-alt-line="396" data-line-type="context" data-line-index="548,533"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="535" data-alt-line="397" data-line-type="context" data-line-index="549,534"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line="539" data-alt-line="401" data-line-type="context" data-line-index="553,538"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="540" data-alt-line="402" data-line-type="context" data-line-index="554,539"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="541" data-alt-line="403" data-line-type="context" data-line-index="555,540">
|
||
</div><div data-line="542" data-line-type="change-addition" data-line-index="556,541"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="543" data-line-type="change-addition" data-line-index="557,542"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> headerRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="544" data-line-type="change-addition" data-line-index="558,543"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> tailStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="545" data-line-type="change-addition" data-line-index="559,544"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> tailRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> tailStart, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="546" data-line-type="change-addition" data-line-index="560,545"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [range, recentSeekRange, recentForegroundRange, activePrefetchWindow, headerRange, tailRange].</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">compactMap</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="547" data-line-type="change-addition" data-line-index="561,546"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">toByteBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheByteBudget, preserving</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> protectedRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="548" data-line-type="change-addition" data-line-index="562,547"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="549" data-line-type="change-addition" data-line-index="563,548"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">evicted.isEmpty </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="550" data-line-type="change-addition" data-line-index="564,549"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] evicted reason=budget ranges=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">evicted.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">joined</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ","</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> protected=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">protectedRanges.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">joined</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ","</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="551" data-line-type="change-addition" data-line-index="565,550"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="552" data-line-type="change-addition" data-line-index="566,551"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="553" data-line-type="change-addition" data-line-index="567,552"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="554" data-line-type="change-addition" data-line-index="568,553">
|
||
</div><div data-line="555" data-line-type="change-addition" data-line-index="569,554"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="556" data-line-type="change-addition" data-line-index="570,555"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">/</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="557" data-line-type="change-addition" data-line-index="571,556"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="558" data-line-type="change-addition" data-line-index="572,557">
|
||
</div><div data-line="559" data-line-type="change-addition" data-line-index="573,558"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkEnd</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="560" data-line-type="change-addition" data-line-index="574,559"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> +</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="561" data-line-type="change-addition" data-line-index="575,560"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="562" data-line-type="change-addition" data-line-index="576,561">
|
||
</div><div data-line="563" data-alt-line="404" data-line-type="context" data-line-index="577,562"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedBytesPerSecond</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="564" data-alt-line="405" data-line-type="context" data-line-index="578,563"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="565" data-alt-line="406" data-line-type="context" data-line-index="579,564"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div></div></code></pre></section><section class="diff-file"><h3>Dreamio/VLCNativePlaybackBackend.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
|
||
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
|
||
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
|
||
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
|
||
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
|
||
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
|
||
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
|
||
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
|
||
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
|
||
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
|
||
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
|
||
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
|
||
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
|
||
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
|
||
</symbol>
|
||
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
|
||
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
|
||
@layer theme {
|
||
|
||
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
|
||
@layer rendered {
|
||
:host {
|
||
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
|
||
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
|
||
}
|
||
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Dreamio/VLCNativePlaybackBackend.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-2</span><span data-additions-count="">+9</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 30"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">150 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="151" data-line-index="150,150"><span data-line-number-content="">151</span></div><div data-line-type="context" data-column-number="152" data-line-index="151,151"><span data-line-number-content="">152</span></div><div data-line-type="context" data-column-number="153" data-line-index="152,152"><span data-line-number-content="">153</span></div><div data-line-type="change-deletion" data-column-number="154" data-line-index="153,153"><span data-line-number-content="">154</span></div><div data-line-type="context" data-column-number="155" data-line-index="155,154"><span data-line-number-content="">155</span></div><div data-line-type="context" data-column-number="156" data-line-index="156,155"><span data-line-number-content="">156</span></div><div data-line-type="context" data-column-number="157" data-line-index="157,156"><span data-line-number-content="">157</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">13 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="171" data-line-index="171,170"><span data-line-number-content="">171</span></div><div data-line-type="context" data-column-number="172" data-line-index="172,171"><span data-line-number-content="">172</span></div><div data-line-type="context" data-column-number="173" data-line-index="173,172"><span data-line-number-content="">173</span></div><div data-line-type="change-deletion" data-column-number="174" data-line-index="174,173"><span data-line-number-content="">174</span></div><div data-line-type="context" data-column-number="175" data-line-index="176,174"><span data-line-number-content="">175</span></div><div data-line-type="context" data-column-number="176" data-line-index="177,175"><span data-line-number-content="">176</span></div><div data-line-type="context" data-column-number="177" data-line-index="178,176"><span data-line-number-content="">177</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">426 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="604" data-line-index="605,603"><span data-line-number-content="">604</span></div><div data-line-type="context" data-column-number="605" data-line-index="606,604"><span data-line-number-content="">605</span></div><div data-line-type="context" data-column-number="606" data-line-index="607,605"><span data-line-number-content="">606</span></div><div data-gutter-buffer="buffer" data-buffer-size="7" style="grid-row: span 7;min-height:calc(7 * 1lh);"></div><div data-line-type="context" data-column-number="607" data-line-index="615,613"><span data-line-number-content="">607</span></div><div data-line-type="context" data-column-number="608" data-line-index="616,614"><span data-line-number-content="">608</span></div><div data-line-type="context" data-column-number="609" data-line-index="617,615"><span data-line-number-content="">609</span></div></div><div data-content="" style="grid-row: span 30"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">150 unmodified lines</span></div></div></div><div data-line="151" data-alt-line="151" data-line-type="context" data-line-index="150,150"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="152" data-alt-line="152" data-line-type="context" data-line-index="151,151"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="153" data-alt-line="153" data-line-type="context" data-line-index="152,152"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> clamped </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, position</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="154" data-line-type="change-deletion" data-line-index="153,153"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetch</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamped</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="155" data-alt-line="155" data-line-type="context" data-line-index="155,154"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="156" data-alt-line="156" data-line-type="context" data-line-index="156,155"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamped</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="157" data-alt-line="157" data-line-type="context" data-line-index="157,156"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] seek targetPosition=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">clamped</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> byteOffset=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> mode=local-cache"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">13 unmodified lines</span></div></div></div><div data-line="171" data-alt-line="171" data-line-type="context" data-line-index="171,170"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">duration, currentTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="172" data-alt-line="172" data-line-type="context" data-line-index="172,171"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="173" data-alt-line="173" data-line-type="context" data-line-index="173,172"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextPosition </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Float</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nextTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">/</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> duration</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="174" data-line-type="change-deletion" data-line-index="174,173"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetch</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> nextPosition</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="175" data-alt-line="175" data-line-type="context" data-line-index="176,174"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="176" data-alt-line="176" data-line-type="context" data-line-index="177,175"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> nextPosition</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="177" data-alt-line="177" data-line-type="context" data-line-index="178,176"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] jump seconds=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">seconds</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> target=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">nextTime</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> byteOffset=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> mode=local-cache"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">426 unmodified lines</span></div></div></div><div data-line="604" data-alt-line="604" data-line-type="context" data-line-index="605,603"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> canImport</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">MobileVLCKit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="605" data-alt-line="605" data-line-type="context" data-line-index="606,604"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">extension</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> VLCNativePlaybackBackend</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> VLCMediaPlayerDelegate </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="606" data-alt-line="606" data-line-type="context" data-line-index="607,605"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mediaPlayerStateChanged</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> aNotification</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Notification</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="7" style="grid-row: span 7;min-height:calc(7 * 1lh)"></div><div data-line="607" data-alt-line="614" data-line-type="context" data-line-index="615,613"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="608" data-alt-line="615" data-line-type="context" data-line-index="616,614"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> logPlaybackStateIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">stateName</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">mediaPlayer.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">state</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="609" data-alt-line="616" data-line-type="context" data-line-index="617,615"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 30"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">150 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="151" data-line-index="150,150"><span data-line-number-content="">151</span></div><div data-line-type="context" data-column-number="152" data-line-index="151,151"><span data-line-number-content="">152</span></div><div data-line-type="context" data-column-number="153" data-line-index="152,152"><span data-line-number-content="">153</span></div><div data-line-type="change-addition" data-column-number="154" data-line-index="154,153"><span data-line-number-content="">154</span></div><div data-line-type="context" data-column-number="155" data-line-index="155,154"><span data-line-number-content="">155</span></div><div data-line-type="context" data-column-number="156" data-line-index="156,155"><span data-line-number-content="">156</span></div><div data-line-type="context" data-column-number="157" data-line-index="157,156"><span data-line-number-content="">157</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">13 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="171" data-line-index="171,170"><span data-line-number-content="">171</span></div><div data-line-type="context" data-column-number="172" data-line-index="172,171"><span data-line-number-content="">172</span></div><div data-line-type="context" data-column-number="173" data-line-index="173,172"><span data-line-number-content="">173</span></div><div data-line-type="change-addition" data-column-number="174" data-line-index="175,173"><span data-line-number-content="">174</span></div><div data-line-type="context" data-column-number="175" data-line-index="176,174"><span data-line-number-content="">175</span></div><div data-line-type="context" data-column-number="176" data-line-index="177,175"><span data-line-number-content="">176</span></div><div data-line-type="context" data-column-number="177" data-line-index="178,176"><span data-line-number-content="">177</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">426 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="604" data-line-index="605,603"><span data-line-number-content="">604</span></div><div data-line-type="context" data-column-number="605" data-line-index="606,604"><span data-line-number-content="">605</span></div><div data-line-type="context" data-column-number="606" data-line-index="607,605"><span data-line-number-content="">606</span></div><div data-line-type="change-addition" data-column-number="607" data-line-index="608,606"><span data-line-number-content="">607</span></div><div data-line-type="change-addition" data-column-number="608" data-line-index="609,607"><span data-line-number-content="">608</span></div><div data-line-type="change-addition" data-column-number="609" data-line-index="610,608"><span data-line-number-content="">609</span></div><div data-line-type="change-addition" data-column-number="610" data-line-index="611,609"><span data-line-number-content="">610</span></div><div data-line-type="change-addition" data-column-number="611" data-line-index="612,610"><span data-line-number-content="">611</span></div><div data-line-type="change-addition" data-column-number="612" data-line-index="613,611"><span data-line-number-content="">612</span></div><div data-line-type="change-addition" data-column-number="613" data-line-index="614,612"><span data-line-number-content="">613</span></div><div data-line-type="context" data-column-number="614" data-line-index="615,613"><span data-line-number-content="">614</span></div><div data-line-type="context" data-column-number="615" data-line-index="616,614"><span data-line-number-content="">615</span></div><div data-line-type="context" data-column-number="616" data-line-index="617,615"><span data-line-number-content="">616</span></div></div><div data-content="" style="grid-row: span 30"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">150 unmodified lines</span></div></div></div><div data-line="151" data-alt-line="151" data-line-type="context" data-line-index="150,150"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="152" data-alt-line="152" data-line-type="context" data-line-index="151,151"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="153" data-alt-line="153" data-line-type="context" data-line-index="152,152"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> clamped </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, position</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="154" data-line-type="change-addition" data-line-index="154,153"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchForSeek</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamped</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="155" data-alt-line="155" data-line-type="context" data-line-index="155,154"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="156" data-alt-line="156" data-line-type="context" data-line-index="156,155"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamped</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="157" data-alt-line="157" data-line-type="context" data-line-index="157,156"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] seek targetPosition=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">clamped</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> byteOffset=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> mode=local-cache"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">13 unmodified lines</span></div></div></div><div data-line="171" data-alt-line="171" data-line-type="context" data-line-index="171,170"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">duration, currentTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="172" data-alt-line="172" data-line-type="context" data-line-index="172,171"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="173" data-alt-line="173" data-line-type="context" data-line-index="173,172"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextPosition </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Float</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nextTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">/</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> duration</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="174" data-line-type="change-addition" data-line-index="175,173"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchForSeek</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> nextPosition</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="175" data-alt-line="175" data-line-type="context" data-line-index="176,174"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="176" data-alt-line="176" data-line-type="context" data-line-index="177,175"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> nextPosition</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="177" data-alt-line="177" data-line-type="context" data-line-index="178,176"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] jump seconds=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">seconds</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> target=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">nextTime</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> byteOffset=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> mode=local-cache"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">426 unmodified lines</span></div></div></div><div data-line="604" data-alt-line="604" data-line-type="context" data-line-index="605,603"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> canImport</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">MobileVLCKit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="605" data-alt-line="605" data-line-type="context" data-line-index="606,604"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">extension</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> VLCNativePlaybackBackend</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> VLCMediaPlayerDelegate </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="606" data-alt-line="606" data-line-type="context" data-line-index="607,605"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mediaPlayerStateChanged</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> aNotification</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Notification</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="607" data-line-type="change-addition" data-line-index="608,606"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> @</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">MainActor</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">weak</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> in</span></div><div data-line="608" data-line-type="change-addition" data-line-index="609,607"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">handleMediaPlayerStateChanged</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="609" data-line-type="change-addition" data-line-index="610,608"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="610" data-line-type="change-addition" data-line-index="611,609"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="611" data-line-type="change-addition" data-line-index="612,610">
|
||
</div><div data-line="612" data-line-type="change-addition" data-line-index="613,611"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> @</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">MainActor</span></div><div data-line="613" data-line-type="change-addition" data-line-index="614,612"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> handleMediaPlayerStateChanged</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="614" data-alt-line="607" data-line-type="context" data-line-index="615,613"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="615" data-alt-line="608" data-line-type="context" data-line-index="616,614"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> logPlaybackStateIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">stateName</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">mediaPlayer.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">state</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="616" data-alt-line="609" data-line-type="context" data-line-index="617,615"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div></div></code></pre></section><section class="diff-file"><h3>Tests/StreamResolverTests.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
|
||
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
|
||
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
|
||
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
|
||
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
|
||
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
|
||
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
|
||
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
|
||
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
|
||
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
|
||
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
|
||
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
|
||
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
|
||
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
|
||
</symbol>
|
||
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
|
||
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
|
||
@layer theme {
|
||
|
||
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
|
||
@layer rendered {
|
||
:host {
|
||
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
|
||
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
|
||
}
|
||
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Tests/StreamResolverTests.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-2</span><span data-additions-count="">+71</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 101"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="35" data-line-index="34,34"><span data-line-number-content="">35</span></div><div data-line-type="context" data-column-number="36" data-line-index="35,35"><span data-line-number-content="">36</span></div><div data-line-type="context" data-column-number="37" data-line-index="36,36"><span data-line-number-content="">37</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="38" data-line-index="38,38"><span data-line-number-content="">38</span></div><div data-line-type="context" data-column-number="39" data-line-index="39,39"><span data-line-number-content="">39</span></div><div data-gutter-buffer="buffer" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh);"></div><div data-line-type="context" data-column-number="40" data-line-index="42,42"><span data-line-number-content="">40</span></div><div data-line-type="context" data-column-number="41" data-line-index="43,43"><span data-line-number-content="">41</span></div><div data-line-type="context" data-column-number="42" data-line-index="44,44"><span data-line-number-content="">42</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">291 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="334" data-line-index="336,336"><span data-line-number-content="">334</span></div><div data-line-type="context" data-column-number="335" data-line-index="337,337"><span data-line-number-content="">335</span></div><div data-line-type="context" data-column-number="336" data-line-index="338,338"><span data-line-number-content="">336</span></div><div data-gutter-buffer="buffer" data-buffer-size="22" style="grid-row: span 22;min-height:calc(22 * 1lh);"></div><div data-line-type="context" data-column-number="337" data-line-index="361,361"><span data-line-number-content="">337</span></div><div data-line-type="context" data-column-number="338" data-line-index="362,362"><span data-line-number-content="">338</span></div><div data-line-type="context" data-column-number="339" data-line-index="363,363"><span data-line-number-content="">339</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">28 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="368" data-line-index="392,392"><span data-line-number-content="">368</span></div><div data-line-type="context" data-column-number="369" data-line-index="393,393"><span data-line-number-content="">369</span></div><div data-line-type="context" data-column-number="370" data-line-index="394,394"><span data-line-number-content="">370</span></div><div data-gutter-buffer="buffer" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh);"></div><div data-line-type="context" data-column-number="371" data-line-index="439,439"><span data-line-number-content="">371</span></div><div data-line-type="context" data-column-number="372" data-line-index="440,440"><span data-line-number-content="">372</span></div><div data-line-type="context" data-column-number="373" data-line-index="441,441"><span data-line-number-content="">373</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">32 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="406" data-line-index="474,474"><span data-line-number-content="">406</span></div><div data-line-type="context" data-column-number="407" data-line-index="475,475"><span data-line-number-content="">407</span></div><div data-line-type="context" data-column-number="408" data-line-index="476,476"><span data-line-number-content="">408</span></div><div data-line-type="change-deletion" data-column-number="409" data-line-index="477,477"><span data-line-number-content="">409</span></div><div data-line-type="change-deletion" data-column-number="410" data-line-index="478,478"><span data-line-number-content="">410</span></div><div data-line-type="context" data-column-number="411" data-line-index="481,479"><span data-line-number-content="">411</span></div><div data-line-type="context" data-column-number="412" data-line-index="482,480"><span data-line-number-content="">412</span></div><div data-line-type="context" data-column-number="413" data-line-index="483,481"><span data-line-number-content="">413</span></div></div><div data-content="" style="grid-row: span 101"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line="35" data-alt-line="35" data-line-type="context" data-line-index="34,34"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreHitPartialHitAndMiss</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="36" data-alt-line="36" data-line-type="context" data-line-index="35,35"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreEvictsOutsideWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="37" data-alt-line="37" data-line-type="context" data-line-index="36,36"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreTrimsOverlappingWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="38" data-alt-line="39" data-line-type="context" data-line-index="38,38"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSessionCapsResponseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="39" data-alt-line="40" data-line-type="context" data-line-index="39,39"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchPrioritizesSeekOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh)"></div><div data-line="40" data-alt-line="43" data-line-type="context" data-line-index="42,42"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="41" data-alt-line="44" data-line-type="context" data-line-index="43,43"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeProbeFallsBackWhenServerIgnoresRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="42" data-alt-line="45" data-line-type="context" data-line-index="44,44"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeFetcherPreservesHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">291 unmodified lines</span></div></div></div><div data-line="334" data-alt-line="337" data-line-type="context" data-line-index="336,336"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">store.data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 5</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected trimmed bytes outside the window to be evicted"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="335" data-alt-line="338" data-line-type="context" data-line-index="337,337"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="336" data-alt-line="339" data-line-type="context" data-line-index="338,338">
|
||
</div><div data-content-buffer="" data-buffer-size="22" style="grid-row: span 22;min-height:calc(22 * 1lh)"></div><div data-line="337" data-alt-line="362" data-line-type="context" data-line-index="361,361"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSessionCapsResponseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="338" data-alt-line="363" data-line-type="context" data-line-index="362,362"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="339" data-alt-line="364" data-line-type="context" data-line-index="363,363"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">28 unmodified lines</span></div></div></div><div data-line="368" data-alt-line="393" data-line-type="context" data-line-index="392,392"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ])</span></div><div data-line="369" data-alt-line="394" data-line-type="context" data-line-index="393,393"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="370" data-alt-line="395" data-line-type="context" data-line-index="394,394">
|
||
</div><div data-content-buffer="" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh)"></div><div data-line="371" data-alt-line="440" data-line-type="context" data-line-index="439,439"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="372" data-alt-line="441" data-line-type="context" data-line-index="440,440"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="373" data-alt-line="442" data-line-type="context" data-line-index="441,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">32 unmodified lines</span></div></div></div><div data-line="406" data-alt-line="475" data-line-type="context" data-line-index="474,474"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="407" data-alt-line="476" data-line-type="context" data-line-index="475,475"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=51818977-52867552"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected foreground VLC range to be fetched"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="408" data-alt-line="477" data-line-type="context" data-line-index="476,476"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="409" data-line-type="change-deletion" data-line-index="477,477"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">51936225</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="410" data-line-type="change-deletion" data-line-index="478,478"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch to restart near VLC's foreground range, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="411" data-alt-line="480" data-line-type="context" data-line-index="481,479"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="412" data-alt-line="481" data-line-type="context" data-line-index="482,480"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="413" data-alt-line="482" data-line-type="context" data-line-index="483,481"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 101"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="35" data-line-index="34,34"><span data-line-number-content="">35</span></div><div data-line-type="context" data-column-number="36" data-line-index="35,35"><span data-line-number-content="">36</span></div><div data-line-type="context" data-column-number="37" data-line-index="36,36"><span data-line-number-content="">37</span></div><div data-line-type="change-addition" data-column-number="38" data-line-index="37,37"><span data-line-number-content="">38</span></div><div data-line-type="context" data-column-number="39" data-line-index="38,38"><span data-line-number-content="">39</span></div><div data-line-type="context" data-column-number="40" data-line-index="39,39"><span data-line-number-content="">40</span></div><div data-line-type="change-addition" data-column-number="41" data-line-index="40,40"><span data-line-number-content="">41</span></div><div data-line-type="change-addition" data-column-number="42" data-line-index="41,41"><span data-line-number-content="">42</span></div><div data-line-type="context" data-column-number="43" data-line-index="42,42"><span data-line-number-content="">43</span></div><div data-line-type="context" data-column-number="44" data-line-index="43,43"><span data-line-number-content="">44</span></div><div data-line-type="context" data-column-number="45" data-line-index="44,44"><span data-line-number-content="">45</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">291 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="337" data-line-index="336,336"><span data-line-number-content="">337</span></div><div data-line-type="context" data-column-number="338" data-line-index="337,337"><span data-line-number-content="">338</span></div><div data-line-type="context" data-column-number="339" data-line-index="338,338"><span data-line-number-content="">339</span></div><div data-line-type="change-addition" data-column-number="340" data-line-index="339,339"><span data-line-number-content="">340</span></div><div data-line-type="change-addition" data-column-number="341" data-line-index="340,340"><span data-line-number-content="">341</span></div><div data-line-type="change-addition" data-column-number="342" data-line-index="341,341"><span data-line-number-content="">342</span></div><div data-line-type="change-addition" data-column-number="343" data-line-index="342,342"><span data-line-number-content="">343</span></div><div data-line-type="change-addition" data-column-number="344" data-line-index="343,343"><span data-line-number-content="">344</span></div><div data-line-type="change-addition" data-column-number="345" data-line-index="344,344"><span data-line-number-content="">345</span></div><div data-line-type="change-addition" data-column-number="346" data-line-index="345,345"><span data-line-number-content="">346</span></div><div data-line-type="change-addition" data-column-number="347" data-line-index="346,346"><span data-line-number-content="">347</span></div><div data-line-type="change-addition" data-column-number="348" data-line-index="347,347"><span data-line-number-content="">348</span></div><div data-line-type="change-addition" data-column-number="349" data-line-index="348,348"><span data-line-number-content="">349</span></div><div data-line-type="change-addition" data-column-number="350" data-line-index="349,349"><span data-line-number-content="">350</span></div><div data-line-type="change-addition" data-column-number="351" data-line-index="350,350"><span data-line-number-content="">351</span></div><div data-line-type="change-addition" data-column-number="352" data-line-index="351,351"><span data-line-number-content="">352</span></div><div data-line-type="change-addition" data-column-number="353" data-line-index="352,352"><span data-line-number-content="">353</span></div><div data-line-type="change-addition" data-column-number="354" data-line-index="353,353"><span data-line-number-content="">354</span></div><div data-line-type="change-addition" data-column-number="355" data-line-index="354,354"><span data-line-number-content="">355</span></div><div data-line-type="change-addition" data-column-number="356" data-line-index="355,355"><span data-line-number-content="">356</span></div><div data-line-type="change-addition" data-column-number="357" data-line-index="356,356"><span data-line-number-content="">357</span></div><div data-line-type="change-addition" data-column-number="358" data-line-index="357,357"><span data-line-number-content="">358</span></div><div data-line-type="change-addition" data-column-number="359" data-line-index="358,358"><span data-line-number-content="">359</span></div><div data-line-type="change-addition" data-column-number="360" data-line-index="359,359"><span data-line-number-content="">360</span></div><div data-line-type="change-addition" data-column-number="361" data-line-index="360,360"><span data-line-number-content="">361</span></div><div data-line-type="context" data-column-number="362" data-line-index="361,361"><span data-line-number-content="">362</span></div><div data-line-type="context" data-column-number="363" data-line-index="362,362"><span data-line-number-content="">363</span></div><div data-line-type="context" data-column-number="364" data-line-index="363,363"><span data-line-number-content="">364</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">28 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="393" data-line-index="392,392"><span data-line-number-content="">393</span></div><div data-line-type="context" data-column-number="394" data-line-index="393,393"><span data-line-number-content="">394</span></div><div data-line-type="context" data-column-number="395" data-line-index="394,394"><span data-line-number-content="">395</span></div><div data-line-type="change-addition" data-column-number="396" data-line-index="395,395"><span data-line-number-content="">396</span></div><div data-line-type="change-addition" data-column-number="397" data-line-index="396,396"><span data-line-number-content="">397</span></div><div data-line-type="change-addition" data-column-number="398" data-line-index="397,397"><span data-line-number-content="">398</span></div><div data-line-type="change-addition" data-column-number="399" data-line-index="398,398"><span data-line-number-content="">399</span></div><div data-line-type="change-addition" data-column-number="400" data-line-index="399,399"><span data-line-number-content="">400</span></div><div data-line-type="change-addition" data-column-number="401" data-line-index="400,400"><span data-line-number-content="">401</span></div><div data-line-type="change-addition" data-column-number="402" data-line-index="401,401"><span data-line-number-content="">402</span></div><div data-line-type="change-addition" data-column-number="403" data-line-index="402,402"><span data-line-number-content="">403</span></div><div data-line-type="change-addition" data-column-number="404" data-line-index="403,403"><span data-line-number-content="">404</span></div><div data-line-type="change-addition" data-column-number="405" data-line-index="404,404"><span data-line-number-content="">405</span></div><div data-line-type="change-addition" data-column-number="406" data-line-index="405,405"><span data-line-number-content="">406</span></div><div data-line-type="change-addition" data-column-number="407" data-line-index="406,406"><span data-line-number-content="">407</span></div><div data-line-type="change-addition" data-column-number="408" data-line-index="407,407"><span data-line-number-content="">408</span></div><div data-line-type="change-addition" data-column-number="409" data-line-index="408,408"><span data-line-number-content="">409</span></div><div data-line-type="change-addition" data-column-number="410" data-line-index="409,409"><span data-line-number-content="">410</span></div><div data-line-type="change-addition" data-column-number="411" data-line-index="410,410"><span data-line-number-content="">411</span></div><div data-line-type="change-addition" data-column-number="412" data-line-index="411,411"><span data-line-number-content="">412</span></div><div data-line-type="change-addition" data-column-number="413" data-line-index="412,412"><span data-line-number-content="">413</span></div><div data-line-type="change-addition" data-column-number="414" data-line-index="413,413"><span data-line-number-content="">414</span></div><div data-line-type="change-addition" data-column-number="415" data-line-index="414,414"><span data-line-number-content="">415</span></div><div data-line-type="change-addition" data-column-number="416" data-line-index="415,415"><span data-line-number-content="">416</span></div><div data-line-type="change-addition" data-column-number="417" data-line-index="416,416"><span data-line-number-content="">417</span></div><div data-line-type="change-addition" data-column-number="418" data-line-index="417,417"><span data-line-number-content="">418</span></div><div data-line-type="change-addition" data-column-number="419" data-line-index="418,418"><span data-line-number-content="">419</span></div><div data-line-type="change-addition" data-column-number="420" data-line-index="419,419"><span data-line-number-content="">420</span></div><div data-line-type="change-addition" data-column-number="421" data-line-index="420,420"><span data-line-number-content="">421</span></div><div data-line-type="change-addition" data-column-number="422" data-line-index="421,421"><span data-line-number-content="">422</span></div><div data-line-type="change-addition" data-column-number="423" data-line-index="422,422"><span data-line-number-content="">423</span></div><div data-line-type="change-addition" data-column-number="424" data-line-index="423,423"><span data-line-number-content="">424</span></div><div data-line-type="change-addition" data-column-number="425" data-line-index="424,424"><span data-line-number-content="">425</span></div><div data-line-type="change-addition" data-column-number="426" data-line-index="425,425"><span data-line-number-content="">426</span></div><div data-line-type="change-addition" data-column-number="427" data-line-index="426,426"><span data-line-number-content="">427</span></div><div data-line-type="change-addition" data-column-number="428" data-line-index="427,427"><span data-line-number-content="">428</span></div><div data-line-type="change-addition" data-column-number="429" data-line-index="428,428"><span data-line-number-content="">429</span></div><div data-line-type="change-addition" data-column-number="430" data-line-index="429,429"><span data-line-number-content="">430</span></div><div data-line-type="change-addition" data-column-number="431" data-line-index="430,430"><span data-line-number-content="">431</span></div><div data-line-type="change-addition" data-column-number="432" data-line-index="431,431"><span data-line-number-content="">432</span></div><div data-line-type="change-addition" data-column-number="433" data-line-index="432,432"><span data-line-number-content="">433</span></div><div data-line-type="change-addition" data-column-number="434" data-line-index="433,433"><span data-line-number-content="">434</span></div><div data-line-type="change-addition" data-column-number="435" data-line-index="434,434"><span data-line-number-content="">435</span></div><div data-line-type="change-addition" data-column-number="436" data-line-index="435,435"><span data-line-number-content="">436</span></div><div data-line-type="change-addition" data-column-number="437" data-line-index="436,436"><span data-line-number-content="">437</span></div><div data-line-type="change-addition" data-column-number="438" data-line-index="437,437"><span data-line-number-content="">438</span></div><div data-line-type="change-addition" data-column-number="439" data-line-index="438,438"><span data-line-number-content="">439</span></div><div data-line-type="context" data-column-number="440" data-line-index="439,439"><span data-line-number-content="">440</span></div><div data-line-type="context" data-column-number="441" data-line-index="440,440"><span data-line-number-content="">441</span></div><div data-line-type="context" data-column-number="442" data-line-index="441,441"><span data-line-number-content="">442</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">32 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="475" data-line-index="474,474"><span data-line-number-content="">475</span></div><div data-line-type="context" data-column-number="476" data-line-index="475,475"><span data-line-number-content="">476</span></div><div data-line-type="context" data-column-number="477" data-line-index="476,476"><span data-line-number-content="">477</span></div><div data-line-type="change-addition" data-column-number="478" data-line-index="479,477"><span data-line-number-content="">478</span></div><div data-line-type="change-addition" data-column-number="479" data-line-index="480,478"><span data-line-number-content="">479</span></div><div data-line-type="context" data-column-number="480" data-line-index="481,479"><span data-line-number-content="">480</span></div><div data-line-type="context" data-column-number="481" data-line-index="482,480"><span data-line-number-content="">481</span></div><div data-line-type="context" data-column-number="482" data-line-index="483,481"><span data-line-number-content="">482</span></div></div><div data-content="" style="grid-row: span 101"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line="35" data-alt-line="35" data-line-type="context" data-line-index="34,34"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreHitPartialHitAndMiss</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="36" data-alt-line="36" data-line-type="context" data-line-index="35,35"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreEvictsOutsideWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="37" data-alt-line="37" data-line-type="context" data-line-index="36,36"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreTrimsOverlappingWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="38" data-line-type="change-addition" data-line-index="37,37"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreEvictsByBudgetWhilePreservingUsefulRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="39" data-alt-line="38" data-line-type="context" data-line-index="38,38"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSessionCapsResponseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="40" data-alt-line="39" data-line-type="context" data-line-index="39,39"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchPrioritizesSeekOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="41" data-line-type="change-addition" data-line-index="40,40"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSeekPrimingIncludesObservedVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="42" data-line-type="change-addition" data-line-index="41,41"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchUsesGlobalChunkBoundaries</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="43" data-alt-line="40" data-line-type="context" data-line-index="42,42"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="44" data-alt-line="41" data-line-type="context" data-line-index="43,43"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeProbeFallsBackWhenServerIgnoresRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="45" data-alt-line="42" data-line-type="context" data-line-index="44,44"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeFetcherPreservesHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">291 unmodified lines</span></div></div></div><div data-line="337" data-alt-line="334" data-line-type="context" data-line-index="336,336"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">store.data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 5</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected trimmed bytes outside the window to be evicted"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="338" data-alt-line="335" data-line-type="context" data-line-index="337,337"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="339" data-alt-line="336" data-line-type="context" data-line-index="338,338">
|
||
</div><div data-line="340" data-line-type="change-addition" data-line-index="339,339"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreEvictsByBudgetWhilePreservingUsefulRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="341" data-line-type="change-addition" data-line-index="340,340"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> SparseHTTPByteRangeStore</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="342" data-line-type="change-addition" data-line-index="341,341">
|
||
</div><div data-line="343" data-line-type="change-addition" data-line-index="342,342"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="344" data-line-type="change-addition" data-line-index="343,343"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 2</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 100</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="345" data-line-type="change-addition" data-line-index="344,344"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 3</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="346" data-line-type="change-addition" data-line-index="345,345">
|
||
</div><div data-line="347" data-line-type="change-addition" data-line-index="346,346"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="348" data-line-type="change-addition" data-line-index="347,347"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> toByteBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 8</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="349" data-line-type="change-addition" data-line-index="348,348"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preserving</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span></div><div data-line="350" data-line-type="change-addition" data-line-index="349,349"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 3</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="351" data-line-type="change-addition" data-line-index="350,350"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 190</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 210</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="352" data-line-type="change-addition" data-line-index="351,351"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ]</span></div><div data-line="353" data-line-type="change-addition" data-line-index="352,352"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="354" data-line-type="change-addition" data-line-index="353,353">
|
||
</div><div data-line="355" data-line-type="change-addition" data-line-index="354,354"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evicted, [HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 100</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 103</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="356" data-line-type="change-addition" data-line-index="355,355"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">store.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">cachedRanges</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, [</span></div><div data-line="357" data-line-type="change-addition" data-line-index="356,356"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 3</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="358" data-line-type="change-addition" data-line-index="357,357"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 203</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="359" data-line-type="change-addition" data-line-index="358,358"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="360" data-line-type="change-addition" data-line-index="359,359"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="361" data-line-type="change-addition" data-line-index="360,360">
|
||
</div><div data-line="362" data-alt-line="337" data-line-type="context" data-line-index="361,361"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSessionCapsResponseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="363" data-alt-line="338" data-line-type="context" data-line-index="362,362"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="364" data-alt-line="339" data-line-type="context" data-line-index="363,363"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">28 unmodified lines</span></div></div></div><div data-line="393" data-alt-line="368" data-line-type="context" data-line-index="392,392"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ])</span></div><div data-line="394" data-alt-line="369" data-line-type="context" data-line-index="393,393"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="395" data-alt-line="370" data-line-type="context" data-line-index="394,394">
|
||
</div><div data-line="396" data-line-type="change-addition" data-line-index="395,395"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSeekPrimingIncludesObservedVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="397" data-line-type="change-addition" data-line-index="396,396"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="398" data-line-type="change-addition" data-line-index="397,397"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="399" data-line-type="change-addition" data-line-index="398,398"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 711_080_522</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="400" data-line-type="change-addition" data-line-index="399,399"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="401" data-line-type="change-addition" data-line-index="400,400"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="402" data-line-type="change-addition" data-line-index="401,401">
|
||
</div><div data-line="403" data-line-type="change-addition" data-line-index="402,402"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> estimatedOffset: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_615_760</span></div><div data-line="404" data-line-type="change-addition" data-line-index="403,403"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> firstVLCRequest </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_942_432</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_991_007</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="405" data-line-type="change-addition" data-line-index="404,404"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">seekPrimeWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="406" data-line-type="change-addition" data-line-index="405,405"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="407" data-line-type="change-addition" data-line-index="406,406"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window,</span></div><div data-line="408" data-line-type="change-addition" data-line-index="407,407"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedOffset,</span></div><div data-line="409" data-line-type="change-addition" data-line-index="408,408"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span></div><div data-line="410" data-line-type="change-addition" data-line-index="409,409"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="411" data-line-type="change-addition" data-line-index="410,410">
|
||
</div><div data-line="412" data-line-type="change-addition" data-line-index="411,411"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunkContainingVLCStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">firstIndex</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">firstVLCRequest.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="413" data-line-type="change-addition" data-line-index="412,412"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunkContainingEstimatedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">firstIndex</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">estimatedOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="414" data-line-type="change-addition" data-line-index="413,413">
|
||
</div><div data-line="415" data-line-type="change-addition" data-line-index="414,414"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunkContainingVLCStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected seek priming to include VLC's first request start"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="416" data-line-type="change-addition" data-line-index="415,415"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunkContainingEstimatedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected seek priming to include the estimated offset"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="417" data-line-type="change-addition" data-line-index="416,416"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="418" data-line-type="change-addition" data-line-index="417,417"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunkContainingVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> <=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunkContainingEstimatedOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="419" data-line-type="change-addition" data-line-index="418,418"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "Expected bytes behind the seek target to be primed before ahead chunks"</span></div><div data-line="420" data-line-type="change-addition" data-line-index="419,419"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="421" data-line-type="change-addition" data-line-index="420,420"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunkContainingVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_860_928</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_909_503</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="422" data-line-type="change-addition" data-line-index="421,421"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="423" data-line-type="change-addition" data-line-index="422,422">
|
||
</div><div data-line="424" data-line-type="change-addition" data-line-index="423,423"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchUsesGlobalChunkBoundaries</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="425" data-line-type="change-addition" data-line-index="424,424"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="426" data-line-type="change-addition" data-line-index="425,425"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="427" data-line-type="change-addition" data-line-index="426,426"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 711_080_522</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="428" data-line-type="change-addition" data-line-index="427,427"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="429" data-line-type="change-addition" data-line-index="428,428"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="430" data-line-type="change-addition" data-line-index="429,429">
|
||
</div><div data-line="431" data-line-type="change-addition" data-line-index="430,430"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="432" data-line-type="change-addition" data-line-index="431,431"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_278_260</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 216_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="433" data-line-type="change-addition" data-line-index="432,432"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_615_760</span></div><div data-line="434" data-line-type="change-addition" data-line-index="433,433"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="435" data-line-type="change-addition" data-line-index="434,434">
|
||
</div><div data-line="436" data-line-type="change-addition" data-line-index="435,435"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks.allSatisfy </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">%</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch chunk starts to use stable global 1 MB boundaries: </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunks</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="437" data-line-type="change-addition" data-line-index="436,436"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_860_928</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_909_503</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="438" data-line-type="change-addition" data-line-index="437,437"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="439" data-line-type="change-addition" data-line-index="438,438">
|
||
</div><div data-line="440" data-alt-line="371" data-line-type="context" data-line-index="439,439"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="441" data-alt-line="372" data-line-type="context" data-line-index="440,440"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="442" data-alt-line="373" data-line-type="context" data-line-index="441,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">32 unmodified lines</span></div></div></div><div data-line="475" data-alt-line="406" data-line-type="context" data-line-index="474,474"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="476" data-alt-line="407" data-line-type="context" data-line-index="475,475"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=51818977-52867552"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected foreground VLC range to be fetched"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="477" data-alt-line="408" data-line-type="context" data-line-index="476,476"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="478" data-line-type="change-addition" data-line-index="479,477"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">52428800</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="479" data-line-type="change-addition" data-line-index="480,478"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch to restart </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">on a global chunk boundary </span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">near VLC's foreground range, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="480" data-alt-line="411" data-line-type="context" data-line-index="481,479"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="481" data-alt-line="412" data-line-type="context" data-line-index="482,480"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="482" data-alt-line="413" data-line-type="context" data-line-index="483,481"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div></div></code></pre></section></section>
|
||
<section class="panel"><h2>Expected Impact for End-Users</h2><p>Short backward or forward skips in MKV/direct-file playback should resume with fewer full foreground misses, especially when VLC asks slightly before Dreamio’s estimated byte position.</p></section>
|
||
<section class="panel"><h2>Validation</h2><ul><li>Ran <code>swiftc -parse-as-library Tests/StreamResolverTests.swift Dreamio/StreamCandidate.swift Dreamio/StreamResolver.swift Dreamio/ProgressiveHTTPRangeCache.swift Dreamio/ExternalSubtitleTrackParser.swift -o /tmp/StreamResolverTests && /tmp/StreamResolverTests</code>: passed.</li><li>Ran <code>DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcodebuild -workspace Dreamio.xcworkspace -scheme Dreamio -configuration Debug -sdk iphonesimulator build</code>: passed.</li></ul></section>
|
||
<section class="panel"><h2>Issues, Limitations, and Mitigations</h2><ul><li>No device playback check was run in this turn, so real MobileVLCKit timing still needs confirmation on hardware.</li><li>The cache remains memory-only. The 64 MB budget limits growth while retaining the ranges most likely to matter after seeks and MKV index probes.</li><li>The existing MobileVLCKit/OpenGLES warning is treated as internal unless it persists after the main-actor cleanup.</li></ul></section>
|
||
<section class="panel"><h2>Follow-up Work</h2><ul><li>Manually test MKV skip behavior on device and compare DEBUG logs for post-seek <code>hit</code>, <code>partial-miss</code>, and <code>uncached</code> reads.</li><li>Consider exposing cache budget tuning if device memory pressure shows up in longer playback sessions.</li><li>Track any persistent VLCOpenGLES2VideoView warnings separately with device logs if they continue.</li></ul></section>
|
||
<section class="panel"><h2>New Changes as of 2026-05-26 00:40 EDT</h2><h3>Summary of changes</h3><p>Adjusted the cache to follow VLC's actual foreground read area even when those reads are hits, and changed foreground partial misses to fetch stable aligned chunks synchronously.</p><h3>Why this change was made</h3><p>Device logs showed a backward jump estimating byte <code>15936567</code>, while VLC continued reading from about <code>27165812</code> through the warmed cache. Because those reads were hits, prefetch stayed near the estimate until VLC reached the cache edge and began partial misses.</p><h3>Code diffs</h3><section class="diff-file"><h3>Dreamio/ProgressiveHTTPRangeCache.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
|
||
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
|
||
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
|
||
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
|
||
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
|
||
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
|
||
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
|
||
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
|
||
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
|
||
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
|
||
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
|
||
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
|
||
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
|
||
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
|
||
</symbol>
|
||
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
|
||
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
|
||
@layer theme {
|
||
|
||
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
|
||
@layer rendered {
|
||
:host {
|
||
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
|
||
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
|
||
}
|
||
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Dreamio/ProgressiveHTTPRangeCache.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-2</span><span data-additions-count="">+32</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 60"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">375 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="376" data-line-index="375,375"><span data-line-number-content="">376</span></div><div data-line-type="context" data-column-number="377" data-line-index="376,376"><span data-line-number-content="">377</span></div><div data-line-type="context" data-column-number="378" data-line-index="377,377"><span data-line-number-content="">378</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="379" data-line-index="379,379"><span data-line-number-content="">379</span></div><div data-line-type="context" data-column-number="380" data-line-index="380,380"><span data-line-number-content="">380</span></div><div data-line-type="context" data-column-number="381" data-line-index="381,381"><span data-line-number-content="">381</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="386" data-line-index="386,386"><span data-line-number-content="">386</span></div><div data-line-type="context" data-column-number="387" data-line-index="387,387"><span data-line-number-content="">387</span></div><div data-line-type="context" data-column-number="388" data-line-index="388,388"><span data-line-number-content="">388</span></div><div data-line-type="change-deletion" data-column-number="389" data-line-index="389,389"><span data-line-number-content="">389</span></div><div data-line-type="change-deletion" data-column-number="390" data-line-index="390,390"><span data-line-number-content="">390</span></div><div data-gutter-buffer="buffer" data-buffer-size="5" style="grid-row: span 5;min-height:calc(5 * 1lh);"></div><div data-line-type="context" data-column-number="391" data-line-index="398,396"><span data-line-number-content="">391</span></div><div data-line-type="context" data-column-number="392" data-line-index="399,397"><span data-line-number-content="">392</span></div><div data-line-type="context" data-column-number="393" data-line-index="400,398"><span data-line-number-content="">393</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">106 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="500" data-line-index="507,505"><span data-line-number-content="">500</span></div><div data-line-type="context" data-column-number="501" data-line-index="508,506"><span data-line-number-content="">501</span></div><div data-line-type="context" data-column-number="502" data-line-index="509,507"><span data-line-number-content="">502</span></div><div data-gutter-buffer="buffer" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh);"></div><div data-line-type="context" data-column-number="503" data-line-index="522,520"><span data-line-number-content="">503</span></div><div data-line-type="context" data-column-number="504" data-line-index="523,521"><span data-line-number-content="">504</span></div><div data-line-type="context" data-column-number="505" data-line-index="524,522"><span data-line-number-content="">505</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">33 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="539" data-line-index="558,556"><span data-line-number-content="">539</span></div><div data-line-type="context" data-column-number="540" data-line-index="559,557"><span data-line-number-content="">540</span></div><div data-line-type="context" data-column-number="541" data-line-index="560,558"><span data-line-number-content="">541</span></div><div data-gutter-buffer="buffer" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh);"></div><div data-line-type="context" data-column-number="542" data-line-index="573,571"><span data-line-number-content="">542</span></div><div data-line-type="context" data-column-number="543" data-line-index="574,572"><span data-line-number-content="">543</span></div><div data-line-type="context" data-column-number="544" data-line-index="575,573"><span data-line-number-content="">544</span></div></div><div data-content="" style="grid-row: span 60"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">375 unmodified lines</span></div></div></div><div data-line="376" data-alt-line="376" data-line-type="context" data-line-index="375,375"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="377" data-alt-line="377" data-line-type="context" data-line-index="376,376"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=hit range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="378" data-alt-line="378" data-line-type="context" data-line-index="377,377"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="379" data-alt-line="380" data-line-type="context" data-line-index="379,379"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data</span></div><div data-line="380" data-alt-line="381" data-line-type="context" data-line-index="380,380"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="381" data-alt-line="382" data-line-type="context" data-line-index="381,381">
|
||
</div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line="386" data-alt-line="387" data-line-type="context" data-line-index="386,386"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="387" data-alt-line="388" data-line-type="context" data-line-index="387,387"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetchIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forForegroundRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="388" data-alt-line="389" data-line-type="context" data-line-index="388,388"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRange </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="389" data-line-type="change-deletion" data-line-index="389,389"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">missingRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></span></div><div data-line="390" data-line-type="change-deletion" data-line-index="390,390"><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRange.start</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="5" style="grid-row: span 5;min-height:calc(5 * 1lh)"></div><div data-line="391" data-alt-line="397" data-line-type="context" data-line-index="398,396"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="392" data-alt-line="398" data-line-type="context" data-line-index="399,397"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="393" data-alt-line="399" data-line-type="context" data-line-index="400,398"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">106 unmodified lines</span></div></div></div><div data-line="500" data-alt-line="506" data-line-type="context" data-line-index="507,505"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="501" data-alt-line="507" data-line-type="context" data-line-index="508,506"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="502" data-alt-line="508" data-line-type="context" data-line-index="509,507">
|
||
</div><div data-content-buffer="" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh)"></div><div data-line="503" data-alt-line="521" data-line-type="context" data-line-index="522,520"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="504" data-alt-line="522" data-line-type="context" data-line-index="523,521"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, minimumBehind</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="505" data-alt-line="523" data-line-type="context" data-line-index="524,522"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">33 unmodified lines</span></div></div></div><div data-line="539" data-alt-line="557" data-line-type="context" data-line-index="558,556"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="540" data-alt-line="558" data-line-type="context" data-line-index="559,557"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="541" data-alt-line="559" data-line-type="context" data-line-index="560,558">
|
||
</div><div data-content-buffer="" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh)"></div><div data-line="542" data-alt-line="572" data-line-type="context" data-line-index="573,571"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="543" data-alt-line="573" data-line-type="context" data-line-index="574,572"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> headerRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="544" data-alt-line="574" data-line-type="context" data-line-index="575,573"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> tailStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 60"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">375 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="376" data-line-index="375,375"><span data-line-number-content="">376</span></div><div data-line-type="context" data-column-number="377" data-line-index="376,376"><span data-line-number-content="">377</span></div><div data-line-type="context" data-column-number="378" data-line-index="377,377"><span data-line-number-content="">378</span></div><div data-line-type="change-addition" data-column-number="379" data-line-index="378,378"><span data-line-number-content="">379</span></div><div data-line-type="context" data-column-number="380" data-line-index="379,379"><span data-line-number-content="">380</span></div><div data-line-type="context" data-column-number="381" data-line-index="380,380"><span data-line-number-content="">381</span></div><div data-line-type="context" data-column-number="382" data-line-index="381,381"><span data-line-number-content="">382</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="387" data-line-index="386,386"><span data-line-number-content="">387</span></div><div data-line-type="context" data-column-number="388" data-line-index="387,387"><span data-line-number-content="">388</span></div><div data-line-type="context" data-column-number="389" data-line-index="388,388"><span data-line-number-content="">389</span></div><div data-line-type="change-addition" data-column-number="390" data-line-index="391,389"><span data-line-number-content="">390</span></div><div data-line-type="change-addition" data-column-number="391" data-line-index="392,390"><span data-line-number-content="">391</span></div><div data-line-type="change-addition" data-column-number="392" data-line-index="393,391"><span data-line-number-content="">392</span></div><div data-line-type="change-addition" data-column-number="393" data-line-index="394,392"><span data-line-number-content="">393</span></div><div data-line-type="change-addition" data-column-number="394" data-line-index="395,393"><span data-line-number-content="">394</span></div><div data-line-type="change-addition" data-column-number="395" data-line-index="396,394"><span data-line-number-content="">395</span></div><div data-line-type="change-addition" data-column-number="396" data-line-index="397,395"><span data-line-number-content="">396</span></div><div data-line-type="context" data-column-number="397" data-line-index="398,396"><span data-line-number-content="">397</span></div><div data-line-type="context" data-column-number="398" data-line-index="399,397"><span data-line-number-content="">398</span></div><div data-line-type="context" data-column-number="399" data-line-index="400,398"><span data-line-number-content="">399</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">106 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="506" data-line-index="507,505"><span data-line-number-content="">506</span></div><div data-line-type="context" data-column-number="507" data-line-index="508,506"><span data-line-number-content="">507</span></div><div data-line-type="context" data-column-number="508" data-line-index="509,507"><span data-line-number-content="">508</span></div><div data-line-type="change-addition" data-column-number="509" data-line-index="510,508"><span data-line-number-content="">509</span></div><div data-line-type="change-addition" data-column-number="510" data-line-index="511,509"><span data-line-number-content="">510</span></div><div data-line-type="change-addition" data-column-number="511" data-line-index="512,510"><span data-line-number-content="">511</span></div><div data-line-type="change-addition" data-column-number="512" data-line-index="513,511"><span data-line-number-content="">512</span></div><div data-line-type="change-addition" data-column-number="513" data-line-index="514,512"><span data-line-number-content="">513</span></div><div data-line-type="change-addition" data-column-number="514" data-line-index="515,513"><span data-line-number-content="">514</span></div><div data-line-type="change-addition" data-column-number="515" data-line-index="516,514"><span data-line-number-content="">515</span></div><div data-line-type="change-addition" data-column-number="516" data-line-index="517,515"><span data-line-number-content="">516</span></div><div data-line-type="change-addition" data-column-number="517" data-line-index="518,516"><span data-line-number-content="">517</span></div><div data-line-type="change-addition" data-column-number="518" data-line-index="519,517"><span data-line-number-content="">518</span></div><div data-line-type="change-addition" data-column-number="519" data-line-index="520,518"><span data-line-number-content="">519</span></div><div data-line-type="change-addition" data-column-number="520" data-line-index="521,519"><span data-line-number-content="">520</span></div><div data-line-type="context" data-column-number="521" data-line-index="522,520"><span data-line-number-content="">521</span></div><div data-line-type="context" data-column-number="522" data-line-index="523,521"><span data-line-number-content="">522</span></div><div data-line-type="context" data-column-number="523" data-line-index="524,522"><span data-line-number-content="">523</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">33 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="557" data-line-index="558,556"><span data-line-number-content="">557</span></div><div data-line-type="context" data-column-number="558" data-line-index="559,557"><span data-line-number-content="">558</span></div><div data-line-type="context" data-column-number="559" data-line-index="560,558"><span data-line-number-content="">559</span></div><div data-line-type="change-addition" data-column-number="560" data-line-index="561,559"><span data-line-number-content="">560</span></div><div data-line-type="change-addition" data-column-number="561" data-line-index="562,560"><span data-line-number-content="">561</span></div><div data-line-type="change-addition" data-column-number="562" data-line-index="563,561"><span data-line-number-content="">562</span></div><div data-line-type="change-addition" data-column-number="563" data-line-index="564,562"><span data-line-number-content="">563</span></div><div data-line-type="change-addition" data-column-number="564" data-line-index="565,563"><span data-line-number-content="">564</span></div><div data-line-type="change-addition" data-column-number="565" data-line-index="566,564"><span data-line-number-content="">565</span></div><div data-line-type="change-addition" data-column-number="566" data-line-index="567,565"><span data-line-number-content="">566</span></div><div data-line-type="change-addition" data-column-number="567" data-line-index="568,566"><span data-line-number-content="">567</span></div><div data-line-type="change-addition" data-column-number="568" data-line-index="569,567"><span data-line-number-content="">568</span></div><div data-line-type="change-addition" data-column-number="569" data-line-index="570,568"><span data-line-number-content="">569</span></div><div data-line-type="change-addition" data-column-number="570" data-line-index="571,569"><span data-line-number-content="">570</span></div><div data-line-type="change-addition" data-column-number="571" data-line-index="572,570"><span data-line-number-content="">571</span></div><div data-line-type="context" data-column-number="572" data-line-index="573,571"><span data-line-number-content="">572</span></div><div data-line-type="context" data-column-number="573" data-line-index="574,572"><span data-line-number-content="">573</span></div><div data-line-type="context" data-column-number="574" data-line-index="575,573"><span data-line-number-content="">574</span></div></div><div data-content="" style="grid-row: span 60"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">375 unmodified lines</span></div></div></div><div data-line="376" data-alt-line="376" data-line-type="context" data-line-index="375,375"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="377" data-alt-line="377" data-line-type="context" data-line-index="376,376"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=hit range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="378" data-alt-line="378" data-line-type="context" data-line-index="377,377"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="379" data-line-type="change-addition" data-line-index="378,378"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchAheadIfForegroundMoved</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">to</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="380" data-alt-line="379" data-line-type="context" data-line-index="379,379"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data</span></div><div data-line="381" data-alt-line="380" data-line-type="context" data-line-index="380,380"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="382" data-alt-line="381" data-line-type="context" data-line-index="381,381">
|
||
</div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line="387" data-alt-line="386" data-line-type="context" data-line-index="386,386"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="388" data-alt-line="387" data-line-type="context" data-line-index="387,387"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetchIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forForegroundRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="389" data-alt-line="388" data-line-type="context" data-line-index="388,388"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRange </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="390" data-line-type="change-addition" data-line-index="391,389"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetchRange </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">covering</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> where</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasData</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetchRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></span></div><div data-line="391" data-line-type="change-addition" data-line-index="392,390"><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetchRange</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="392" data-line-type="change-addition" data-line-index="393,391"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetchRange.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="393" data-line-type="change-addition" data-line-index="394,392"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="394" data-line-type="change-addition" data-line-index="395,393"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] foreground fetched range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">fetchRange.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">fetchRange.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> bytes=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">data.count</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="395" data-line-type="change-addition" data-line-index="396,394"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="396" data-line-type="change-addition" data-line-index="397,395"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="397" data-alt-line="391" data-line-type="context" data-line-index="398,396"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="398" data-alt-line="392" data-line-type="context" data-line-index="399,397"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="399" data-alt-line="393" data-line-type="context" data-line-index="400,398"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">106 unmodified lines</span></div></div></div><div data-line="506" data-alt-line="500" data-line-type="context" data-line-index="507,505"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="507" data-alt-line="501" data-line-type="context" data-line-index="508,506"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="508" data-alt-line="502" data-line-type="context" data-line-index="509,507">
|
||
</div><div data-line="509" data-line-type="change-addition" data-line-index="510,508"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchAheadIfForegroundMoved</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">to</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="510" data-line-type="change-addition" data-line-index="511,509"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="511" data-line-type="change-addition" data-line-index="512,510"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset,</span></div><div data-line="512" data-line-type="change-addition" data-line-index="513,511"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> abs</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> >=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseChunkSize </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="513" data-line-type="change-addition" data-line-index="514,512"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="514" data-line-type="change-addition" data-line-index="515,513"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="515" data-line-type="change-addition" data-line-index="516,514"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="516" data-line-type="change-addition" data-line-index="517,515"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] prefetch follow-foreground from=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">preferredOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> to=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="517" data-line-type="change-addition" data-line-index="518,516"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="518" data-line-type="change-addition" data-line-index="519,517"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="519" data-line-type="change-addition" data-line-index="520,518"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="520" data-line-type="change-addition" data-line-index="521,519">
|
||
</div><div data-line="521" data-alt-line="503" data-line-type="context" data-line-index="522,520"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="522" data-alt-line="504" data-line-type="context" data-line-index="523,521"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, minimumBehind</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="523" data-alt-line="505" data-line-type="context" data-line-index="524,522"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">33 unmodified lines</span></div></div></div><div data-line="557" data-alt-line="539" data-line-type="context" data-line-index="558,556"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="558" data-alt-line="540" data-line-type="context" data-line-index="559,557"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="559" data-alt-line="541" data-line-type="context" data-line-index="560,558">
|
||
</div><div data-line="560" data-line-type="change-addition" data-line-index="561,559"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">covering</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="561" data-line-type="change-addition" data-line-index="562,560"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="562" data-line-type="change-addition" data-line-index="563,561"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="563" data-line-type="change-addition" data-line-index="564,562"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="564" data-line-type="change-addition" data-line-index="565,563"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> while</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"><=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="565" data-line-type="change-addition" data-line-index="566,564"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="566" data-line-type="change-addition" data-line-index="567,565"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="567" data-line-type="change-addition" data-line-index="568,566"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="568" data-line-type="change-addition" data-line-index="569,567"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="569" data-line-type="change-addition" data-line-index="570,568"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="570" data-line-type="change-addition" data-line-index="571,569"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="571" data-line-type="change-addition" data-line-index="572,570">
|
||
</div><div data-line="572" data-alt-line="542" data-line-type="context" data-line-index="573,571"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="573" data-alt-line="543" data-line-type="context" data-line-index="574,572"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> headerRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="574" data-alt-line="544" data-line-type="context" data-line-index="575,573"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> tailStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div></div></code></pre></section><section class="diff-file"><h3>Tests/StreamResolverTests.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
|
||
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
|
||
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
|
||
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
|
||
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
|
||
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
|
||
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
|
||
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
|
||
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
|
||
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
|
||
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
|
||
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
|
||
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
|
||
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
|
||
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
|
||
</symbol>
|
||
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
|
||
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
|
||
</symbol>
|
||
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
|
||
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
|
||
@layer theme {
|
||
|
||
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
|
||
@layer rendered {
|
||
:host {
|
||
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
|
||
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
|
||
}
|
||
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Tests/StreamResolverTests.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-1</span><span data-additions-count="">+59</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 88"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">39 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="40" data-line-index="39,39"><span data-line-number-content="">40</span></div><div data-line-type="context" data-column-number="41" data-line-index="40,40"><span data-line-number-content="">41</span></div><div data-line-type="context" data-column-number="42" data-line-index="41,41"><span data-line-number-content="">42</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="43" data-line-index="43,43"><span data-line-number-content="">43</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="44" data-line-index="45,45"><span data-line-number-content="">44</span></div><div data-line-type="context" data-column-number="45" data-line-index="46,46"><span data-line-number-content="">45</span></div><div data-line-type="context" data-column-number="46" data-line-index="47,47"><span data-line-number-content="">46</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">390 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="437" data-line-index="438,438"><span data-line-number-content="">437</span></div><div data-line-type="context" data-column-number="438" data-line-index="439,439"><span data-line-number-content="">438</span></div><div data-line-type="context" data-column-number="439" data-line-index="440,440"><span data-line-number-content="">439</span></div><div data-gutter-buffer="buffer" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh);"></div><div data-line-type="context" data-column-number="440" data-line-index="453,453"><span data-line-number-content="">440</span></div><div data-line-type="context" data-column-number="441" data-line-index="454,454"><span data-line-number-content="">441</span></div><div data-line-type="context" data-column-number="442" data-line-index="455,455"><span data-line-number-content="">442</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">30 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="473" data-line-index="486,486"><span data-line-number-content="">473</span></div><div data-line-type="context" data-column-number="474" data-line-index="487,487"><span data-line-number-content="">474</span></div><div data-line-type="context" data-column-number="475" data-line-index="488,488"><span data-line-number-content="">475</span></div><div data-line-type="change-deletion" data-column-number="476" data-line-index="489,489"><span data-line-number-content="">476</span></div><div data-line-type="context" data-column-number="477" data-line-index="491,490"><span data-line-number-content="">477</span></div><div data-line-type="context" data-column-number="478" data-line-index="492,491"><span data-line-number-content="">478</span></div><div data-line-type="context" data-column-number="479" data-line-index="493,492"><span data-line-number-content="">479</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="482" data-line-index="496,495"><span data-line-number-content="">482</span></div><div data-line-type="context" data-column-number="483" data-line-index="497,496"><span data-line-number-content="">483</span></div><div data-line-type="context" data-column-number="484" data-line-index="498,497"><span data-line-number-content="">484</span></div><div data-gutter-buffer="buffer" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh);"></div><div data-line-type="context" data-column-number="485" data-line-index="543,542"><span data-line-number-content="">485</span></div><div data-line-type="context" data-column-number="486" data-line-index="544,543"><span data-line-number-content="">486</span></div><div data-line-type="context" data-column-number="487" data-line-index="545,544"><span data-line-number-content="">487</span></div></div><div data-content="" style="grid-row: span 88"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">39 unmodified lines</span></div></div></div><div data-line="40" data-alt-line="40" data-line-type="context" data-line-index="39,39"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchPrioritizesSeekOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="41" data-alt-line="41" data-line-type="context" data-line-index="40,40"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSeekPrimingIncludesObservedVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="42" data-alt-line="42" data-line-type="context" data-line-index="41,41"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchUsesGlobalChunkBoundaries</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="43" data-alt-line="44" data-line-type="context" data-line-index="43,43"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="44" data-alt-line="46" data-line-type="context" data-line-index="45,45"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeProbeFallsBackWhenServerIgnoresRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="45" data-alt-line="47" data-line-type="context" data-line-index="46,46"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeFetcherPreservesHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="46" data-alt-line="48" data-line-type="context" data-line-index="47,47"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"StreamResolverTests passed"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">390 unmodified lines</span></div></div></div><div data-line="437" data-alt-line="439" data-line-type="context" data-line-index="438,438"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_860_928</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_909_503</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="438" data-alt-line="440" data-line-type="context" data-line-index="439,439"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="439" data-alt-line="441" data-line-type="context" data-line-index="440,440">
|
||
</div><div data-content-buffer="" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh)"></div><div data-line="440" data-alt-line="454" data-line-type="context" data-line-index="453,453"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="441" data-alt-line="455" data-line-type="context" data-line-index="454,454"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="442" data-alt-line="456" data-line-type="context" data-line-index="455,455"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">30 unmodified lines</span></div></div></div><div data-line="473" data-alt-line="487" data-line-type="context" data-line-index="486,486"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="474" data-alt-line="488" data-line-type="context" data-line-index="487,487">
|
||
</div><div data-line="475" data-alt-line="489" data-line-type="context" data-line-index="488,488"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="476" data-line-type="change-deletion" data-line-index="489,489"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">51818977-52867552</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected foreground VLC </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">range</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> to </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">be fetched</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="477" data-alt-line="491" data-line-type="context" data-line-index="491,490"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="478" data-alt-line="492" data-line-type="context" data-line-index="492,491"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=52428800-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="479" data-alt-line="493" data-line-type="context" data-line-index="493,492"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch to restart on a global chunk boundary near VLC's foreground range, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line="482" data-alt-line="496" data-line-type="context" data-line-index="496,495"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="483" data-alt-line="497" data-line-type="context" data-line-index="497,496"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="484" data-alt-line="498" data-line-type="context" data-line-index="498,497">
|
||
</div><div data-content-buffer="" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh)"></div><div data-line="485" data-alt-line="543" data-line-type="context" data-line-index="543,542"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> byteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fromHeader</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> header</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="486" data-alt-line="544" data-line-type="context" data-line-index="544,543"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> value </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> header.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">replacingOccurrences</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">of</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "bytes="</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, with</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ""</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="487" data-alt-line="545" data-line-type="context" data-line-index="545,544"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pieces </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> value.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">split</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "-"</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, maxSplits</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 88"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">39 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="40" data-line-index="39,39"><span data-line-number-content="">40</span></div><div data-line-type="context" data-column-number="41" data-line-index="40,40"><span data-line-number-content="">41</span></div><div data-line-type="context" data-column-number="42" data-line-index="41,41"><span data-line-number-content="">42</span></div><div data-line-type="change-addition" data-column-number="43" data-line-index="42,42"><span data-line-number-content="">43</span></div><div data-line-type="context" data-column-number="44" data-line-index="43,43"><span data-line-number-content="">44</span></div><div data-line-type="change-addition" data-column-number="45" data-line-index="44,44"><span data-line-number-content="">45</span></div><div data-line-type="context" data-column-number="46" data-line-index="45,45"><span data-line-number-content="">46</span></div><div data-line-type="context" data-column-number="47" data-line-index="46,46"><span data-line-number-content="">47</span></div><div data-line-type="context" data-column-number="48" data-line-index="47,47"><span data-line-number-content="">48</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">390 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="439" data-line-index="438,438"><span data-line-number-content="">439</span></div><div data-line-type="context" data-column-number="440" data-line-index="439,439"><span data-line-number-content="">440</span></div><div data-line-type="context" data-column-number="441" data-line-index="440,440"><span data-line-number-content="">441</span></div><div data-line-type="change-addition" data-column-number="442" data-line-index="441,441"><span data-line-number-content="">442</span></div><div data-line-type="change-addition" data-column-number="443" data-line-index="442,442"><span data-line-number-content="">443</span></div><div data-line-type="change-addition" data-column-number="444" data-line-index="443,443"><span data-line-number-content="">444</span></div><div data-line-type="change-addition" data-column-number="445" data-line-index="444,444"><span data-line-number-content="">445</span></div><div data-line-type="change-addition" data-column-number="446" data-line-index="445,445"><span data-line-number-content="">446</span></div><div data-line-type="change-addition" data-column-number="447" data-line-index="446,446"><span data-line-number-content="">447</span></div><div data-line-type="change-addition" data-column-number="448" data-line-index="447,447"><span data-line-number-content="">448</span></div><div data-line-type="change-addition" data-column-number="449" data-line-index="448,448"><span data-line-number-content="">449</span></div><div data-line-type="change-addition" data-column-number="450" data-line-index="449,449"><span data-line-number-content="">450</span></div><div data-line-type="change-addition" data-column-number="451" data-line-index="450,450"><span data-line-number-content="">451</span></div><div data-line-type="change-addition" data-column-number="452" data-line-index="451,451"><span data-line-number-content="">452</span></div><div data-line-type="change-addition" data-column-number="453" data-line-index="452,452"><span data-line-number-content="">453</span></div><div data-line-type="context" data-column-number="454" data-line-index="453,453"><span data-line-number-content="">454</span></div><div data-line-type="context" data-column-number="455" data-line-index="454,454"><span data-line-number-content="">455</span></div><div data-line-type="context" data-column-number="456" data-line-index="455,455"><span data-line-number-content="">456</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">30 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="487" data-line-index="486,486"><span data-line-number-content="">487</span></div><div data-line-type="context" data-column-number="488" data-line-index="487,487"><span data-line-number-content="">488</span></div><div data-line-type="context" data-column-number="489" data-line-index="488,488"><span data-line-number-content="">489</span></div><div data-line-type="change-addition" data-column-number="490" data-line-index="490,489"><span data-line-number-content="">490</span></div><div data-line-type="context" data-column-number="491" data-line-index="491,490"><span data-line-number-content="">491</span></div><div data-line-type="context" data-column-number="492" data-line-index="492,491"><span data-line-number-content="">492</span></div><div data-line-type="context" data-column-number="493" data-line-index="493,492"><span data-line-number-content="">493</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="496" data-line-index="496,495"><span data-line-number-content="">496</span></div><div data-line-type="context" data-column-number="497" data-line-index="497,496"><span data-line-number-content="">497</span></div><div data-line-type="context" data-column-number="498" data-line-index="498,497"><span data-line-number-content="">498</span></div><div data-line-type="change-addition" data-column-number="499" data-line-index="499,498"><span data-line-number-content="">499</span></div><div data-line-type="change-addition" data-column-number="500" data-line-index="500,499"><span data-line-number-content="">500</span></div><div data-line-type="change-addition" data-column-number="501" data-line-index="501,500"><span data-line-number-content="">501</span></div><div data-line-type="change-addition" data-column-number="502" data-line-index="502,501"><span data-line-number-content="">502</span></div><div data-line-type="change-addition" data-column-number="503" data-line-index="503,502"><span data-line-number-content="">503</span></div><div data-line-type="change-addition" data-column-number="504" data-line-index="504,503"><span data-line-number-content="">504</span></div><div data-line-type="change-addition" data-column-number="505" data-line-index="505,504"><span data-line-number-content="">505</span></div><div data-line-type="change-addition" data-column-number="506" data-line-index="506,505"><span data-line-number-content="">506</span></div><div data-line-type="change-addition" data-column-number="507" data-line-index="507,506"><span data-line-number-content="">507</span></div><div data-line-type="change-addition" data-column-number="508" data-line-index="508,507"><span data-line-number-content="">508</span></div><div data-line-type="change-addition" data-column-number="509" data-line-index="509,508"><span data-line-number-content="">509</span></div><div data-line-type="change-addition" data-column-number="510" data-line-index="510,509"><span data-line-number-content="">510</span></div><div data-line-type="change-addition" data-column-number="511" data-line-index="511,510"><span data-line-number-content="">511</span></div><div data-line-type="change-addition" data-column-number="512" data-line-index="512,511"><span data-line-number-content="">512</span></div><div data-line-type="change-addition" data-column-number="513" data-line-index="513,512"><span data-line-number-content="">513</span></div><div data-line-type="change-addition" data-column-number="514" data-line-index="514,513"><span data-line-number-content="">514</span></div><div data-line-type="change-addition" data-column-number="515" data-line-index="515,514"><span data-line-number-content="">515</span></div><div data-line-type="change-addition" data-column-number="516" data-line-index="516,515"><span data-line-number-content="">516</span></div><div data-line-type="change-addition" data-column-number="517" data-line-index="517,516"><span data-line-number-content="">517</span></div><div data-line-type="change-addition" data-column-number="518" data-line-index="518,517"><span data-line-number-content="">518</span></div><div data-line-type="change-addition" data-column-number="519" data-line-index="519,518"><span data-line-number-content="">519</span></div><div data-line-type="change-addition" data-column-number="520" data-line-index="520,519"><span data-line-number-content="">520</span></div><div data-line-type="change-addition" data-column-number="521" data-line-index="521,520"><span data-line-number-content="">521</span></div><div data-line-type="change-addition" data-column-number="522" data-line-index="522,521"><span data-line-number-content="">522</span></div><div data-line-type="change-addition" data-column-number="523" data-line-index="523,522"><span data-line-number-content="">523</span></div><div data-line-type="change-addition" data-column-number="524" data-line-index="524,523"><span data-line-number-content="">524</span></div><div data-line-type="change-addition" data-column-number="525" data-line-index="525,524"><span data-line-number-content="">525</span></div><div data-line-type="change-addition" data-column-number="526" data-line-index="526,525"><span data-line-number-content="">526</span></div><div data-line-type="change-addition" data-column-number="527" data-line-index="527,526"><span data-line-number-content="">527</span></div><div data-line-type="change-addition" data-column-number="528" data-line-index="528,527"><span data-line-number-content="">528</span></div><div data-line-type="change-addition" data-column-number="529" data-line-index="529,528"><span data-line-number-content="">529</span></div><div data-line-type="change-addition" data-column-number="530" data-line-index="530,529"><span data-line-number-content="">530</span></div><div data-line-type="change-addition" data-column-number="531" data-line-index="531,530"><span data-line-number-content="">531</span></div><div data-line-type="change-addition" data-column-number="532" data-line-index="532,531"><span data-line-number-content="">532</span></div><div data-line-type="change-addition" data-column-number="533" data-line-index="533,532"><span data-line-number-content="">533</span></div><div data-line-type="change-addition" data-column-number="534" data-line-index="534,533"><span data-line-number-content="">534</span></div><div data-line-type="change-addition" data-column-number="535" data-line-index="535,534"><span data-line-number-content="">535</span></div><div data-line-type="change-addition" data-column-number="536" data-line-index="536,535"><span data-line-number-content="">536</span></div><div data-line-type="change-addition" data-column-number="537" data-line-index="537,536"><span data-line-number-content="">537</span></div><div data-line-type="change-addition" data-column-number="538" data-line-index="538,537"><span data-line-number-content="">538</span></div><div data-line-type="change-addition" data-column-number="539" data-line-index="539,538"><span data-line-number-content="">539</span></div><div data-line-type="change-addition" data-column-number="540" data-line-index="540,539"><span data-line-number-content="">540</span></div><div data-line-type="change-addition" data-column-number="541" data-line-index="541,540"><span data-line-number-content="">541</span></div><div data-line-type="change-addition" data-column-number="542" data-line-index="542,541"><span data-line-number-content="">542</span></div><div data-line-type="context" data-column-number="543" data-line-index="543,542"><span data-line-number-content="">543</span></div><div data-line-type="context" data-column-number="544" data-line-index="544,543"><span data-line-number-content="">544</span></div><div data-line-type="context" data-column-number="545" data-line-index="545,544"><span data-line-number-content="">545</span></div></div><div data-content="" style="grid-row: span 88"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">39 unmodified lines</span></div></div></div><div data-line="40" data-alt-line="40" data-line-type="context" data-line-index="39,39"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchPrioritizesSeekOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="41" data-alt-line="41" data-line-type="context" data-line-index="40,40"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSeekPrimingIncludesObservedVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="42" data-alt-line="42" data-line-type="context" data-line-index="41,41"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchUsesGlobalChunkBoundaries</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="43" data-line-type="change-addition" data-line-index="42,42"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissFetchesAlignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="44" data-alt-line="43" data-line-type="context" data-line-index="43,43"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="45" data-line-type="change-addition" data-line-index="44,44"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheHitFollowsActualPostSeekReadArea</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="46" data-alt-line="44" data-line-type="context" data-line-index="45,45"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeProbeFallsBackWhenServerIgnoresRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="47" data-alt-line="45" data-line-type="context" data-line-index="46,46"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeFetcherPreservesHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="48" data-alt-line="46" data-line-type="context" data-line-index="47,47"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"StreamResolverTests passed"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">390 unmodified lines</span></div></div></div><div data-line="439" data-alt-line="437" data-line-type="context" data-line-index="438,438"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_860_928</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_909_503</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="440" data-alt-line="438" data-line-type="context" data-line-index="439,439"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="441" data-alt-line="439" data-line-type="context" data-line-index="440,440">
|
||
</div><div data-line="442" data-line-type="change-addition" data-line-index="441,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissFetchesAlignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="443" data-line-type="change-addition" data-line-index="442,442"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="444" data-line-type="change-addition" data-line-index="443,443"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="445" data-line-type="change-addition" data-line-index="444,444"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 711_080_522</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="446" data-line-type="change-addition" data-line-index="445,445"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="447" data-line-type="change-addition" data-line-index="446,446"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="448" data-line-type="change-addition" data-line-index="447,447">
|
||
</div><div data-line="449" data-line-type="change-addition" data-line-index="448,448"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">alignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">covering</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 48_234_649</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 49_185_907</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="450" data-line-type="change-addition" data-line-index="449,449">
|
||
</div><div data-line="451" data-line-type="change-addition" data-line-index="450,450"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks, [HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 48_234_496</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 49_283_071</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="452" data-line-type="change-addition" data-line-index="451,451"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="453" data-line-type="change-addition" data-line-index="452,452">
|
||
</div><div data-line="454" data-alt-line="440" data-line-type="context" data-line-index="453,453"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="455" data-alt-line="441" data-line-type="context" data-line-index="454,454"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="456" data-alt-line="442" data-line-type="context" data-line-index="455,455"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">30 unmodified lines</span></div></div></div><div data-line="487" data-alt-line="473" data-line-type="context" data-line-index="486,486"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="488" data-alt-line="474" data-line-type="context" data-line-index="487,487">
|
||
</div><div data-line="489" data-alt-line="475" data-line-type="context" data-line-index="488,488"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="490" data-line-type="change-addition" data-line-index="490,489"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">51380224-52428799</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected foreground VLC </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">miss</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> to </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">fetch aligned cache chunks</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="491" data-alt-line="477" data-line-type="context" data-line-index="491,490"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="492" data-alt-line="478" data-line-type="context" data-line-index="492,491"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=52428800-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="493" data-alt-line="479" data-line-type="context" data-line-index="493,492"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch to restart on a global chunk boundary near VLC's foreground range, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line="496" data-alt-line="482" data-line-type="context" data-line-index="496,495"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="497" data-alt-line="483" data-line-type="context" data-line-index="497,496"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="498" data-alt-line="484" data-line-type="context" data-line-index="498,497">
|
||
</div><div data-line="499" data-line-type="change-addition" data-line-index="499,498"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheHitFollowsActualPostSeekReadArea</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="500" data-line-type="change-addition" data-line-index="500,499"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-hit-follow-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="501" data-line-type="change-addition" data-line-index="501,500"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="502" data-line-type="change-addition" data-line-index="502,501"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> request </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="503" data-line-type="change-addition" data-line-index="503,502"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> request.value</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forHTTPHeaderField</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "Range"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ""</span></div><div data-line="504" data-line-type="change-addition" data-line-index="504,503"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="505" data-line-type="change-addition" data-line-index="505,504"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="506" data-line-type="change-addition" data-line-index="506,505"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="507" data-line-type="change-addition" data-line-index="507,506"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> byteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fromHeader</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range, contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 80_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="508" data-line-type="change-addition" data-line-index="508,507"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> response </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPURLResponse</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="509" data-line-type="change-addition" data-line-index="509,508"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> request.url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="510" data-line-type="change-addition" data-line-index="510,509"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> statusCode</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 206</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="511" data-line-type="change-addition" data-line-index="511,510"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> httpVersion</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="512" data-line-type="change-addition" data-line-index="512,511"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> headerFields</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Content-Range"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "bytes </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteRange.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteRange.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">/80000000"</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span></div><div data-line="513" data-line-type="change-addition" data-line-index="513,512"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )!</span></div><div data-line="514" data-line-type="change-addition" data-line-index="514,513"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteRange.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">length</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, response</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="515" data-line-type="change-addition" data-line-index="515,514"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="516" data-line-type="change-addition" data-line-index="516,515">
|
||
</div><div data-line="517" data-line-type="change-addition" data-line-index="517,516"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="518" data-line-type="change-addition" data-line-index="518,517"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="519" data-line-type="change-addition" data-line-index="519,518"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://cdn.example.test/movie.mp4"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="520" data-line-type="change-addition" data-line-index="520,519"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">],</span></div><div data-line="521" data-line-type="change-addition" data-line-index="521,520"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> session</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mockSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="522" data-line-type="change-addition" data-line-index="522,521"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="523" data-line-type="change-addition" data-line-index="523,522"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 80_000_000</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="524" data-line-type="change-addition" data-line-index="524,523"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 100</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="525" data-line-type="change-addition" data-line-index="525,524"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="526" data-line-type="change-addition" data-line-index="526,525"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> defer</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="527" data-line-type="change-addition" data-line-index="527,526"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="528" data-line-type="change-addition" data-line-index="528,527"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="529" data-line-type="change-addition" data-line-index="529,528">
|
||
</div><div data-line="530" data-line-type="change-addition" data-line-index="530,529"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">store</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 7</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 27_165_812</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="531" data-line-type="change-addition" data-line-index="531,530"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchForSeek</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 15_936_567</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="532" data-line-type="change-addition" data-line-index="532,531"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> _ </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 27_165_812</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 28_214_387</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="533" data-line-type="change-addition" data-line-index="533,532"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 100_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="534" data-line-type="change-addition" data-line-index="534,533">
|
||
</div><div data-line="535" data-line-type="change-addition" data-line-index="535,534"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="536" data-line-type="change-addition" data-line-index="536,535"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="537" data-line-type="change-addition" data-line-index="537,536"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=27262976-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="538" data-line-type="change-addition" data-line-index="538,537"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected a cache hit far from the seek estimate to restart prefetch near VLC's real read area, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="539" data-line-type="change-addition" data-line-index="539,538"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="540" data-line-type="change-addition" data-line-index="540,539"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="541" data-line-type="change-addition" data-line-index="541,540"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="542" data-line-type="change-addition" data-line-index="542,541">
|
||
</div><div data-line="543" data-alt-line="485" data-line-type="context" data-line-index="543,542"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> byteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fromHeader</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> header</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="544" data-alt-line="486" data-line-type="context" data-line-index="544,543"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> value </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> header.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">replacingOccurrences</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">of</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "bytes="</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, with</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ""</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="545" data-alt-line="487" data-line-type="context" data-line-index="545,544"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pieces </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> value.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">split</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "-"</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, maxSplits</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div></div></code></pre></section><h3>Related issues or PRs</h3><p>Beads issue <code>dreamio-mi1</code>.</p></section>
|
||
</main>
|
||
</body>
|
||
</html> |