From 10a8be72e3acc77609a1a4251bc31a8b952ff2ba Mon Sep 17 00:00:00 2001 From: user Date: Tue, 21 Jul 2026 19:14:19 +0200 Subject: [PATCH] chore: preserve current FreeRTOS and C card updates --- README.md | 26 +- doc/assets/a2-structure.png | Bin 28865 -> 32039 bytes doc/assets/a2-structure.puml | 31 +- doc/assets/a2-structure.svg | 125 +- doc/assets/a5-flow.png | Bin 32508 -> 32050 bytes doc/assets/a5-flow.puml | 26 +- doc/assets/a5-flow.svg | 90 +- doc/assets/a6-state.png | Bin 25695 -> 26162 bytes doc/assets/a6-state.puml | 22 +- doc/assets/a6-state.svg | 78 +- doc/assets/a7-runtime.png | Bin 14247 -> 14236 bytes doc/assets/a7-runtime.puml | 6 +- doc/assets/a7-runtime.svg | 66 +- doc/card-plan.md | 40 +- doc/generated/main.tex | 64 +- doc/hazard3-iteration-plan.md | 102 ++ doc/main.tex | 42 +- ...1-87e48095-7793-54e3-9230-4e61d31bd459.pdf | Bin 347521 -> 359521 bytes doc/stan-prac.md | 160 +- json/card_source.json | 683 ++++++-- json/card_spec.json | 750 ++++++--- src/tasks/task03_freertos_heap4.c | 161 +- tests/check_task03_elf.sh | 9 +- tests/test_host.sh | 2 +- tools/card-action.sh | 8 +- web/app.css | 2 +- web/app.js | 22 +- web/card-data.json | 1461 +++++++++++------ web/figures/a2-structure.puml | 31 +- web/figures/a2-structure.svg | 125 +- web/figures/a5-flow.puml | 26 +- web/figures/a5-flow.svg | 90 +- web/figures/a6-state.puml | 22 +- web/figures/a6-state.svg | 78 +- web/figures/a7-runtime.puml | 6 +- web/figures/a7-runtime.svg | 66 +- web/style.css | 8 +- 37 files changed, 2857 insertions(+), 1571 deletions(-) create mode 100644 doc/hazard3-iteration-plan.md diff --git a/README.md b/README.md index 96c0f87..9e86ceb 100644 --- a/README.md +++ b/README.md @@ -76,11 +76,29 @@ stemctl debug rp2350 freertos heap4 3 --device /dev/bus/usb/BBB/DDD ## Debugowanie Task 3 -Automatyczny start: `heap4_fragmented_checkpoint`. +Automatyczny start: `heap4_reset_checkpoint`. Karta prowadzi po ośmiu +powtarzalnych stanach jednego procesu: + +| Event | Symbol | Najważniejszy dowód Hazard3 | +|---|---|---| +| E01 | `heap4_reset_checkpoint` | `free=largest=4080`, 1 blok | +| E02 | `heap4_alloc_a_checkpoint` | A(24), `consumed=48`, `free=4032` | +| E03 | `heap4_alloc_b_checkpoint` | B(40), `consumed=64`, `free=3968` | +| E04 | `heap4_alloc_c_checkpoint` | C(16), `consumed=32`, `free=3936` | +| E05 | `heap4_free_a_checkpoint` | `free=3984`, 2 bloki | +| E06 | `heap4_fragmented_checkpoint` | `free=4016`, 2 bloki, `free>largest` | +| E07 | `heap4_coalesced_checkpoint` | `free=largest=4080`, 1 blok | +| E08 | `task03_debug_checkpoint` | OOM `NULL`, hook=1, asserts=0, PASS=1 | + +`BlockLink_t` ma na RV32 8 B, ale port wymaga wyrównania 16 B, dlatego +`xHeapStructSize` wynosi 16 B. To rozróżnienie tłumaczy zużycie 48/64/32 B. ```gdb p g_fragmented_stats p g_final_stats +p g_a_consumed +p g_b_consumed +p g_c_consumed p xFreeBytesRemaining p xMinimumEverFreeBytesRemaining p xStart @@ -91,6 +109,12 @@ b pvPortMalloc b vPortFree ``` +Scalanie sprawdzamy z replay E06: zatrzymujemy się przed `vPortFree(g_b)`, +ustawiamy tymczasowy breakpoint na `prvInsertBlockIntoFreeList` i krokujemy. +Upstream V11.3.0 scala najpierw poprzedni/lewy, a potem następny/prawy blok. +Pełna macierz kroków diagramów jest w +[`doc/hazard3-iteration-plan.md`](doc/hazard3-iteration-plan.md). + W UI: Termdebug po lewej; źródło i listing po prawej; bash pod Neovimem. `F5` continue, `F9` breakpoint, `F10` next, `F11` step, `Shift-F11` finish, `F8` stepi, `:StudentStack`, `:StudentMemory`, `:StudentLst`. diff --git a/doc/assets/a2-structure.png b/doc/assets/a2-structure.png index 2f802e8e1f3f805296c6596d39f66f7de8e482d8..a2715c6587af02a8e22dbf0df35facf68b385cf3 100644 GIT binary patch literal 32039 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 literal 28865 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Ó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 IjA_vS0;FUB@&Et; diff --git a/doc/assets/a2-structure.puml b/doc/assets/a2-structure.puml index 262ad72..b8bcce8 100644 --- a/doc/assets/a2-structure.puml +++ b/doc/assets/a2-structure.puml @@ -8,41 +8,46 @@ skinparam defaultFontSize 10 skinparam classBorderColor #2c7794 skinparam classBackgroundColor #edf6fa skinparam ArrowColor #8095a1 -title A2 STRUCTURE — in-band metadata and address order +title A2 STRUCTURE — RV32 header, split and two-sided coalescing class "01 Block header" as HEADER { next : BlockLink_t* size : size_t + raw sizeof = 8 bytes on RV32 + aligned xHeapStructSize = 16 } class "Allocated block" as ALLOC { - 02 header + 13 byte request - aligned total = 32 bytes + 02 A: header + 24 byte request + aligned total = 48 bytes payload begins after header } class "03 Free remainder" as REM { own header - size = 224 bytes + free = 4032 bytes after A } HEADER *-- ALLOC : precedes payload -ALLOC -down-> REM : split preserves 256 +ALLOC -down-> REM : first-fit + split class "04 Address-ordered free list" as LIST { previous < inserted < current + A < B < C+tail } -class "05 Right neighbour" as RIGHT { - block + block.size == current +class "05 Previous / left neighbour" as LEFT { + previous + previous.size == inserted + merge previous first } -class "06 Left neighbour" as LEFT { - previous + previous.size == block +class "06 Next / right neighbour" as RIGHT { + merged + merged.size == current + merge next second } REM -down-> LIST : insert by address -LIST -down-> RIGHT : join first -RIGHT -down-> LEFT : then join left +LIST -down-> LEFT : heap_4 tests first +LEFT -down-> RIGHT : then tests next note right of LIST -Ordering makes both physical -neighbours locally visible. +Address order exposes both physical +neighbours without scanning the arena. end note @enduml diff --git a/doc/assets/a2-structure.svg b/doc/assets/a2-structure.svg index cc49cc7..bd54938 100644 --- a/doc/assets/a2-structure.svg +++ b/doc/assets/a2-structure.svg @@ -1,63 +1,68 @@ -A2 STRUCTURE — in-band metadata and address order01 Block headernext : BlockLink_t*size : size_tAllocated block02 header + 13 byte requestaligned total = 32 bytespayload begins after header03 Free remainderown headersize = 224 bytes04 Address-ordered free listprevious < inserted < current05 Right neighbourblock + block.size == current06 Left neighbourprevious + previous.size == blockOrdering makes both physicalneighbours locally visible.precedes payloadsplit preserves 256insert by addressjoin firstthen join left01 Block headernext : BlockLink_t*size : size_traw sizeof = 8 bytes on RV32aligned xHeapStructSize = 16Allocated block02 A: header + 24 byte requestaligned total = 48 bytespayload begins after header03 Free remainderown headerfree = 4032 bytes after A04 Address-ordered free listprevious < inserted < currentA < B < C+tail05 Previous / left neighbourprevious + previous.size == insertedmerge previous first06 Next / right neighbourmerged + merged.size == currentmerge next secondAddress order exposes both physicalneighbours without scanning the arena.precedes payloadfirst-fit + splitinsert by addressheap_4 tests firstthen tests next01 RESETinitial free = 408002 ALLOC A24 byte payloadfirst-fit + split03 ALLOC B / C40 + 16 byte payloadafter = 395204 FREE A / CB remains allocated05 E01 FRAGMENTED2 free blockscurrent > largest06 FREE Binsert by addressjoin right + left07 E02 COALESCED1 free blockfinal = initial08 OOM CHECKNULL · hook=1asserts=0 · PASS=1pvPortMallocsplit remaindervPortFreeheap statscontinuecoalesceoversized request01 E01 RESET1 block · free=4080raw header=8 · aligned=1602 E02 ALLOC A(24)consumed=48free=403203 E03 ALLOC B(40)consumed=64free=396804 E04 ALLOC C(16)consumed=32free=393605 E05 FREE A2 free blocksfree=398406 E06 FREE C2 blocks · fragmentedfree=401607 E07 FREE Bmerge left + right1 block · free=408008 E08 OOM / VERIFYNULL · hook=1asserts=0 · PASS=1pvPortMallocsplit remaindersplit remaindervPortFree(A)vPortFree(C)vPortFree(B)oversized request Free : 01 one list node -Free --> Allocated : 02 first-fit + split\ncurrent free decreases -Allocated --> Fragmented : free A and C -Fragmented : 03 two free blocks +[*] --> Free : 01 E01 one list node +Free --> Allocated : 02 E04 A+B+C allocated\ncurrent free = 3936 +Allocated --> Fragmented : E05 free A\nE06 free C +Fragmented : 03 E06 two free blocks Fragmented : sum free > largest block -Fragmented --> Coalesced : free B\naddress-order joins neighbours -Coalesced : 04 one free block -Coalesced : current free = initial free -Coalesced --> OOMChecked : request > arena -OOMChecked : NULL + hook once +Fragmented --> Coalesced : 04 E07 free B\nmerge previous, then next +Coalesced : one free block +Coalesced : current = largest = initial +Coalesced --> OOMChecked : 05 E08 request > arena +OOMChecked : NULL · hook=1 · PASS=1 OOMChecked --> [*] -state "05 minimum-ever" as MIN +state "minimum-ever" as MIN Allocated -right-> MIN : records low watermark Fragmented -right-> MIN : does not rise Coalesced -right-> MIN : history remains diff --git a/doc/assets/a6-state.svg b/doc/assets/a6-state.svg index 12a9095..8c07583 100644 --- a/doc/assets/a6-state.svg +++ b/doc/assets/a6-state.svg @@ -1,42 +1,42 @@ -A6 STATE — block state and heap statisticsFreeAllocatedFragmented03 two free blockssum free > largest blockCoalesced04 one free blockcurrent free = initial freeOOMCheckedNULL + hook once05 minimum-ever01 one list node02 first-fit + splitcurrent free decreasesfree A and Cfree Baddress-order joins neighboursrequest > arenarecords low watermarkdoes not risehistory remains01 E01 one list node02 E04 A+B+C allocatedcurrent free = 3936E05 free AE06 free C04 E07 free Bmerge previous, then next05 E08 request > arenarecords low watermarkdoes not risehistory remains ELF : compile + link ELF --> E1 : reset / load / replay diff --git a/doc/assets/a7-runtime.svg b/doc/assets/a7-runtime.svg index 62a80d5..0d55821 100644 --- a/doc/assets/a7-runtime.svg +++ b/doc/assets/a7-runtime.svg @@ -1,36 +1,36 @@ -A7 RUNTIME — one artifact, two checkpoints, one proof«source»01 task03 CA/B/C experiment«artifact»02 ELF + imageheap_4 symbols«checkpoint E01»03 fragmentedblocks=2 · aligned=1«memory»04 ucHeap[4096]headers + payload«checkpoint E02»05 coalescedfinal=initial · blocks=1OOM=1 · PASS=1compile + linkreset / load / replayinspect bytescontinue«source»01 task03 CA/B/C experiment«artifact»02 ELF + imageheap_4 symbols«checkpoint E06»03 fragmentedblocks=2 · free>largest«memory»04 ucHeap[4096]headers + payload«checkpoint E08»05 verifiedfinal=initial · blocks=1OOM=1 · PASS=1compile + linkreset / load / replayinspect bytescontinue C vPortFree(B) 1. wstaw B pomiędzy A i C według adresu; - 2. jeśli end(B) == addr(C), połącz B+C; - 3. jeśli end(A) == addr(BC), połącz A+BC; + 2. jeśli end(A) == addr(B), połącz A+B; + 3. jeśli end(AB) == addr(C), połącz AB+C; wynik: [ ABC:144 FREE ] free list: A -> END @@ -126,26 +126,32 @@ Uczeń przed odsłonięciem rysuje listę i wpisuje `2 -> 1`, `96 -> 144` oraz ```text RESET/INIT + -> heap4_reset_checkpoint # E01: 4080 B -> ALLOC A(24) + -> heap4_alloc_a_checkpoint # E02: 4032 B -> ALLOC B(40) + -> heap4_alloc_b_checkpoint # E03: 3968 B -> ALLOC C(16) + -> heap4_alloc_c_checkpoint # E04: 3936 B -> FREE A + -> heap4_free_a_checkpoint # E05: 3984 B, 2 bloki -> FREE C - -> heap4_fragmented_checkpoint # 2 free blocks + -> heap4_fragmented_checkpoint # E06: 4016 B, 2 bloki -> FREE B + -> heap4_coalesced_checkpoint # E07: 4080 B, 1 blok -> OOM request - -> task03_debug_checkpoint # 1 free block, pass=1 + -> task03_debug_checkpoint # E08: NULL, hook=1, pass=1 ``` -Uczeń zapisuje tylko relacje, ponieważ dokładne bajty zależą od ABI i -konfiguracji: +Na Hazard3 `sizeof(BlockLink_t)=8`, ale `portBYTE_ALIGNMENT=16`, dlatego +`xHeapStructSize=16`. Główny replay ma stałe, testowane wartości: -| Obserwacja | Oczekiwany związek | +| Obserwacja | Oczekiwany wynik RV32/Hazard3 | | --- | --- | -| po trzech alokacjach | `after_allocations < initial_free` | -| stan pofragmentowany | `free_blocks == 2`, `largest < total_free` | -| po `free(B)` | `final_free == initial_free`, `free_blocks == 1` | -| low-water mark | `minimum_ever <= after_allocations` i nie rośnie po free | +| E01--E04 | `4080 -> 4032 -> 3968 -> 3936`, zużycie `48/64/32` | +| E05--E06 | `3984 -> 4016`, nadal 2 bloki i `largest < total_free` | +| E07 | `final_free == initial_free == 4080`, `free_blocks == 1` | +| low-water mark | `minimum_ever == 3936` i nie rośnie po free | | OOM | wynik `NULL`, hook `1`, brak uszkodzenia listy | Minimalny dowód w GDB: @@ -153,6 +159,9 @@ Minimalny dowód w GDB: ```gdb p g_fragmented_stats p g_final_stats +p g_a_consumed +p g_b_consumed +p g_c_consumed p xFreeBytesRemaining p xMinimumEverFreeBytesRemaining p xStart @@ -160,6 +169,9 @@ p pxEnd x/96bx ucHeap ``` +Szczegółowe mapowanie wszystkich diagramów do kodu, replay i dowodów zawiera +[`hazard3-iteration-plan.md`](hazard3-iteration-plan.md). + ## Kryterium zaliczenia Uczeń zalicza lekcję, jeżeli: diff --git a/doc/generated/main.tex b/doc/generated/main.tex index 3130740..941a7bf 100644 --- a/doc/generated/main.tex +++ b/doc/generated/main.tex @@ -11,7 +11,7 @@ \usepackage{amsmath} \usepackage{amssymb} \usepackage{xcolor} -\usepackage[a4paper,left=2.15cm,right=2.15cm,top=0.5cm,bottom=0.5cm,headheight=24mm,headsep=3mm,includehead]{geometry} +\usepackage[a4paper,left=2.15cm,right=2.15cm,top=0.5cm,bottom=1cm,headheight=24mm,headsep=3mm,includehead,includefoot]{geometry} \usepackage{eso-pic} \usepackage{marginnote} \usepackage{array} @@ -42,13 +42,15 @@ \newcommand{\BuildCommit}{lokalna}% } -\newcommand{\DocumentAuthor}{M. Pabiszczak} +\newcommand{\DocumentAuthor}{Mateusz Pabiszczak} \newcommand{\DocumentYear}{2026} \newcommand{\CardSeries}{freertos-c} +\newcommand{\CardSeriesTitle}{FreeRTOS C} \newcommand{\CardNumber}{01} \newcommand{\CardCount}{15} \newcommand{\CardSlug}{heap4-mechanics} \newcommand{\CardVersion}{v00.01} +\newcommand{\CardStatus}{Gotowa} \newcommand{\DocumentUUID}{87e48095-7793-54e3-9230-4e61d31bd459} \newcommand{\EmptyCheck}{\(\square\)} @@ -92,7 +94,7 @@ \hrule height0.35pt% \nointerlineskip% \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.05882353\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.05042017\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14705882\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.09243697\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|X@{}}% - \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SUBJ.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries Inf.}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries PROG.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries CORE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SCOPE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries LEVEL}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries POS.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries GITEA UUID}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily 87e48095-7793-54e3-9230-4e61d31bd459}\hspace{0.35mm}}\par\nointerlineskip\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries CARD UUID} {\fontsize{3.4}{3.75}\selectfont\ttfamily aea09ab7-9bfd-5368-8d1b-c8724871c1a7}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR M. Pabiszczak}\hspace{0.35mm}}} \\% + \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SUBJ.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries Inf.}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries PROG.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries CORE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SCOPE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries LEVEL}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries POS.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries GITEA UUID}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily 87e48095-7793-54e3-9230-4e61d31bd459}\hspace{0.35mm}}\par\nointerlineskip\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries CARD UUID} {\fontsize{3.4}{3.75}\selectfont\ttfamily aea09ab7-9bfd-5368-8d1b-c8724871c1a7}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR Mateusz Pabiszczak}\hspace{0.35mm}}} \\% \end{tabularx}% \par\nointerlineskip% \hrule height0.35pt% @@ -119,8 +121,11 @@ \pagestyle{fancy} \fancyhf{} \fancyhead[C]{\ESCPageResourceHeader} +\fancyfoot[L]{{\fontsize{6.4}{7.0}\selectfont\ttfamily UUID \DocumentUUID}} +\fancyfoot[C]{{\fontsize{6.4}{7.0}\selectfont\ttfamily \DocumentAuthor}} +\fancyfoot[R]{{\fontsize{6.4}{7.0}\selectfont\ttfamily STRONA \thepage/\pageref{LastPage}}} \renewcommand{\headrulewidth}{0pt} -\renewcommand{\footrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.35pt} \newcommand{\ESCMarginTag}[4]{% \hspace*{#1}\textcolor{#2}{#3~#4}% @@ -155,7 +160,7 @@ {\bfseries\textcolor{black!65}{TECH}\par}% \vspace{0.08em}% \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% - \hspace*{0.28em}\textcolor{orange!85!black}{EK~LOCAL~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń odtwarza dwa checkpointy Hazard3 i odróżnia current free, largest free block oraz\textCR minimum-ever.}}\par% + \hspace*{0.28em}\textcolor{orange!85!black}{EK~LOCAL~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń odtwarza osiem checkpointów Hazard3 i odróżnia current free, largest free block oraz\textCR minimum-ever.}}\par% \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Łączy kod, diagram i zweryfikowany dowód.}}\par% \end{minipage}% }% @@ -197,10 +202,10 @@ Uczeń przechodzi od liniowego kursora z K\&R 5.4 do wielokrotnego użycia tej s \vspace{0.35em} Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdziwe FreeRTOS-Kernel V11.3.0 heap\_4 na RV32I/Hazard3 i dowodzi fragmentacji, pełnego scalenia, minimum-ever oraz kontrolowanego OOM. \vspace{0.55em} -\small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{0.85cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.45cm}>{\raggedright\arraybackslash}p{1.75cm}>{\ttfamily\raggedright\arraybackslash}p{1.50cm}@{}} +\small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{1.10cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.50cm}>{\raggedright\arraybackslash}p{1.75cm}>{\ttfamily\raggedright\arraybackslash}p{1.50cm}@{}} \textbf{Lekcja} & \textbf{Task} & \textbf{Najważniejsza idea} & \textbf{Priorytet} & \textbf{Status} & \textbf{Version} \\ \hline \hline -\multicolumn{1}{|l|}{\textbf{\texttt{FC01}}} & \multicolumn{1}{l|}{\textbf{\texttt{Task01}}} & \multicolumn{1}{l|}{\textbf{headers, address-ordered free list, first-fit, split, coalescing and heap statistics}} & \multicolumn{1}{l|}{\textbf{główny}} & \multicolumn{1}{l|}{\textbf{opracowane}} & \multicolumn{1}{l|}{\textbf{\texttt{v00.01}}} \\ \hline +\textbf{\texttt{FC01}} & \textbf{\texttt{Task01}} & \textbf{headers, address-ordered free list, first-fit, split, coalescing and heap statistics} & \textbf{główny} & \textbf{opracowane} & \textbf{\texttt{v00.01}} \\ \hline \end{tabularx} \normalsize @@ -219,6 +224,10 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz \caption{A1 CONTEXT — od żądania aplikacji do rzeczywistych bajtów ucHeap. — część 1/1 (r1 c1).} \label{fig:a1-context} \end{figure} +\Needspace{6\baselineskip} +\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}] +Aplikacja korzysta z publicznego API, heap\_4 zarządza jedną areną, a Hazard3 pokazuje jej rzeczywisty stan. +\end{tcolorbox} \ESCSectionBlockEnd \clearpage @@ -227,10 +236,14 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz \vspace{0.35em} \begin{figure}[H] \centering - \includegraphics[width=0.44697\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a2-structure.png}} + \includegraphics[width=0.47273\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a2-structure.png}} \caption{A2 STRUCTURE — metadane wewnątrz areny i adresowo uporządkowana lista. — część 1/1 (r1 c1).} \label{fig:a2-structure} \end{figure} +\Needspace{6\baselineskip} +\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}] +Każdy blok ma nagłówek, a tylko wolne bloki wykorzystują wskaźnik next do budowy listy uporządkowanej adresami. +\end{tcolorbox} \ESCSectionBlockEnd \clearpage @@ -240,10 +253,14 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz \vspace{0.35em} \begin{figure}[H] \centering - \includegraphics[width=0.86277\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a5-flow.png}} + \includegraphics[width=0.86383\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a5-flow.png}} \caption{A5 FLOW — inicjalizacja, A/B/C, fragmentacja, dwustronne scalenie i OOM. — część 1/1 (r1 c1).} \label{fig:a5-flow} \end{figure} +\Needspace{6\baselineskip} +\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}] +Jeden przebieg A/B/C przechodzi od pustej areny przez trzy przydziały i dwa wolne obszary do ponownie scalonego bloku. +\end{tcolorbox} \ESCSectionBlockEnd \end{landscape} @@ -253,10 +270,14 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz \vspace{0.35em} \begin{figure}[H] \centering - \includegraphics[width=0.52424\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a6-state.png}} + \includegraphics[width=0.48636\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a6-state.png}} \caption{A6 STATE — wolny, przydzielony, rozdzielony, scalony oraz minimum-ever. — część 1/1 (r1 c1).} \label{fig:a6-state} \end{figure} +\Needspace{6\baselineskip} +\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}] +Bieżąca liczba wolnych bajtów może rosnąć po free, ale minimum-ever pozostaje historycznym minimum. +\end{tcolorbox} \ESCSectionBlockEnd \clearpage @@ -270,6 +291,10 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz \caption{A7 RUNTIME — kod, ELF, checkpoint, pamięć i statystyki jednego przebiegu. — część 1/1 (r1 c1).} \label{fig:a7-runtime} \end{figure} +\Needspace{6\baselineskip} +\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}] +Ten sam artefakt łączy źródło, symbole ELF, osiem checkpointów, pamięć ucHeap i końcowe asercje. +\end{tcolorbox} \ESCSectionBlockEnd \end{landscape} @@ -281,20 +306,23 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz {\scriptsize\ttfamily aea09ab7-9bfd-5368-8d1b-c8724871c1a7}\par \begin{ESCBlockFrame}{A — przewidywanie} Przejdź przez model nagłówka, split i porządek adresowy przed uruchomieniem prawdziwego heap\_4. -\begin{ESCStepFrame}{size · Policz rozmiar bloku.} -Dodaj nagłówek do 13 bajtów i wyrównaj wynik do ośmiu. +\begin{ESCStepFrame}{size · Policz rozmiary całych bloków.} +Rozróżnij surowy BlockLink\_t (8 bajtów) od xHeapStructSize (16 bajtów), dodaj nagłówek do żądań 24, 40 i 16 bajtów, a następnie wyrównaj wynik do 16. \end{ESCStepFrame} \begin{ESCStepFrame}{list · Narysuj listę po free(A,C).} Zaznacz, dlaczego przydzielony B rozdziela dwa wolne obszary. \end{ESCStepFrame} \end{ESCBlockFrame} \begin{ESCBlockFrame}{B — replay Hazard3} -Powiąż diagram z dwoma deterministycznymi checkpointami. -\begin{ESCStepFrame}{fragmented · Sprawdź E01.} -Porównaj liczbę wolnych bloków, największy blok i bieżące wolne bajty. +Powiąż każdy stan diagramu z deterministycznym checkpointem E01--E08. +\begin{ESCStepFrame}{allocate · Sprawdź E01--E04.} +Potwierdź wartości 4080, 4032, 3968 i 3936 oraz zużycie 48/64/32 bajtów. \end{ESCStepFrame} -\begin{ESCStepFrame}{coalesced · Sprawdź E02.} -Udowodnij pełne scalenie, zachowanie minimum-ever i kontrolowany OOM. +\begin{ESCStepFrame}{release · Sprawdź E05--E07.} +Porównaj liczbę wolnych bloków i udowodnij scalenie poprzedniego, a potem następnego sąsiada. +\end{ESCStepFrame} +\begin{ESCStepFrame}{verify · Sprawdź E08.} +Udowodnij zachowanie minimum-ever, kontrolowany OOM, brak asercji i PASS=1. \end{ESCStepFrame} \end{ESCBlockFrame} \begin{ESCBlockFrame}{Ćwiczenie · Ćwiczenie — ta sama suma, inna użyteczność} @@ -302,7 +330,7 @@ Zaproponuj dwa układy wolnych bloków o tej samej sumie bajtów, ale tylko jede \par\textbf{Evidence:} Dwa diagramy listy, suma wolnych bajtów, rozmiar największego bloku i wynik pvPortMalloc. \par\textbf{Acceptance:} Uczeń nie utożsamia sumy wolnej pamięci z możliwością pojedynczego dużego przydziału. \end{ESCBlockFrame} -\tcblower\textbf{Task acceptance:} Model 13 -> 32 bajty; poprawna predykcja dwóch wolnych bloków po free(A,C) i jednego po free(B); final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1. +\tcblower\textbf{Task acceptance:} Na RV32 BlockLink\_t ma 8 bajtów, lecz 16-bajtowe wyrównanie portu daje xHeapStructSize=16; A/B/C zużywają 48/64/32 bajty; po free(A,C) są dwa wolne bloki, po free(B) jeden; final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1. \end{ESCTaskFrame} \begin{ESCConclusionFrame} heap\_4 odzyskuje pamięć dzięki metadanym w arenie, adresowo uporządkowanej liście i scalaniu sąsiadów. Suma wolnych bajtów nie zastępuje informacji o największym bloku, a minimum-ever jest historią, nie bieżącym stanem. diff --git a/doc/hazard3-iteration-plan.md b/doc/hazard3-iteration-plan.md new file mode 100644 index 0000000..3d237eb --- /dev/null +++ b/doc/hazard3-iteration-plan.md @@ -0,0 +1,102 @@ +# FC01 — plan iteracji diagramów w Hazard3 + +## Zasada + +Kursor porusza się po diagramie, nie po przypadkowych liniach programu. +Każda kotwica ma jeden z dwóch kontraktów: + +- `CODE` — otwiera właściwe źródło lub dowód ELF; nie uruchamia programu; +- `RUN` — odtwarza program od czystego resetu do wskazanego checkpointu, + ustawia Neovima i udostępnia zestaw wyrażeń GDB. + +Ten sam snapshot może wystąpić w kilku perspektywach. Nie powtarza to +eksperymentu: A2 pyta o strukturę, A6 o stan, a A7 o jakość dowodu. + +## A1 CONTEXT — granice odpowiedzialności + +| Step | Tryb | Otwórz | Pytanie kontrolne | +|---|---|---|---| +| 01 Application | CODE | `main()` | Czy aplikacja dotyka metadanych allocatora? | +| 02 FreeRTOS API | CODE | wywołania `pvPortMalloc`, `vPortFree`, stats | Gdzie kończy się publiczny kontrakt? | +| 03 heap_4 | CODE | upstream `heap_4.c` | Które funkcje wybierają, dzielą i scalają blok? | +| 04 ucHeap | CODE | definicja `ucHeap[4096]` | Gdzie fizycznie leżą nagłówki i payload? | +| 05 Hazard3 | CODE | test symboli ELF | Czy debugujemy dokładnie artefakt z karty? | + +A1 nie ma checkpointu: opisuje architekturę, a nie zdarzenie runtime. + +## A2 STRUCTURE — nagłówek, split i scalenie + +| Step | Tryb / replay | Obserwuj | Warunek zaliczenia | +|---|---|---|---| +| 01 Header | CODE | `BlockLink_t`, `portBYTE_ALIGNMENT` | raw header=8 B, alignment=16 B, `xHeapStructSize`=16 B | +| 02 Alignment | RUN E02 | `g_a`, `g_a_consumed` | A jest wyrównane, cały blok zużywa 48 B | +| 03 Split | RUN E02 | `g_after_a_stats` | pozostaje 1 wolny blok i 4032 B | +| 04 Address order | RUN E06 | `g_a`, `g_b`, `g_c`, stats | adresy rosną, a B rozdziela 2 wolne obszary | +| 05 Merge previous | RUN E06 + step | `pxIterator`, `pxBlockToInsert` | poprzedni/lewy blok jest testowany i scalany pierwszy | +| 06 Merge next | RUN E06 + step | powiększony blok i `pxNextFreeBlock` | następny/prawy blok jest scalany drugi | + +Dla kroków 05–06 po replay E06: + +```gdb +tbreak prvInsertBlockIntoFreeList +continue # wykonaj vPortFree(g_b) +p pxIterator +p pxBlockToInsert +next # test poprzedniego/lewego sąsiada +next # test następnego/prawego sąsiada +``` + +## A5 FLOW — pełny przebieg + +| Event | Operacja | Wartości RV32/Hazard3 | Dowód | +|---|---|---|---| +| E01 | reset/init | free=4080 | 1 blok, largest=4080 | +| E02 | alloc A(24) | consumed=48, free=4032 | A != NULL, aligned=1 | +| E03 | alloc B(40) | consumed=64, free=3968 | B != NULL, aligned=1 | +| E04 | alloc C(16) | consumed=32, free=3936 | C != NULL, aligned=1 | +| E05 | free A | free=3984 | 2 wolne bloki | +| E06 | free C | free=4016 | 2 bloki, free > largest | +| E07 | free B | free=largest=4080 | 1 wolny blok, minimum-ever=3936 | +| E08 | oversized alloc | NULL | hook=1, asserts=0, layout=1, PASS=1 | + +Każdy Enter na A5 wykonuje czysty replay do dokładnie jednego eventu. Nie +kontynuujemy stanu pozostałego po poprzednim kroku. + +## A6 STATE — znaczenie liczników + +| Step | Replay | Hipoteza | +|---|---|---| +| 01 Free | E01 | current free i largest są równe | +| 02 Allocated | E04 | przydziały zmniejszają current free do 3936 | +| 03 Fragmented | E06 | total free może być większe od largest | +| 04 Coalesced | E07 | current, largest i initial znów są równe | +| 05 Minimum-ever | E08 | minimum-ever pozostaje 3936 mimo odzyskania areny | + +## A7 RUNTIME — jakość dowodu + +| Step | Tryb / replay | Co musi znaleźć się w dowodzie | +|---|---|---| +| 01 Source | CODE | blob źródła eksperymentu | +| 02 ELF | CODE | SHA artefaktu i symbole upstream/checkpointów | +| 03 Fragmented | RUN E06 | PC, 2 bloki, free=4016, largest 1} \\ -16--27 & Task 3 RUN & dwa checkpointy prawdziwego \texttt{heap\_4.c} na Pico 2 W \\ +16--27 & Task 3 RUN & osiem checkpointów E01--E08 prawdziwego \texttt{heap\_4.c} \\ 27--30 & wyjście & odróżnić total free, largest free i minimum-ever \\ \bottomrule \end{tabularx} @@ -209,8 +209,9 @@ po: A:144 -> END blocks=1 total=144 largest=144 \end{lstlisting} Porządek po adresie sprawia, że fizycznych sąsiadów można sprawdzić podczas -jednego wstawienia. To jest mechanizm funkcji -\texttt{prvInsertBlockIntoFreeList()} z \texttt{heap\_4.c}. +jednego wstawienia. Uproszczony Task 2 scala prawą, a następnie lewą stronę. +Właściwy \texttt{prvInsertBlockIntoFreeList()} z FreeRTOS V11.3.0 wykonuje +te same dwa testy w kolejności: poprzedni/lewy, następnie kolejny/prawy blok. \section{Task 3 — jedyny centralny RUN (11 minut)} @@ -224,17 +225,21 @@ stemctl debug rp2350 freertos heap4 3 --device /dev/bus/usb/BBB/DDD \begin{lstlisting} RESET/INIT - -> ALLOC A(24) -> ALLOC B(40) -> ALLOC C(16) - -> FREE A -> FREE C - -> heap4_fragmented_checkpoint # STOP 1 - -> FREE B -> OOM request - -> task03_debug_checkpoint # STOP 2 + -> heap4_reset_checkpoint # E01: free=4080 + -> heap4_alloc_a_checkpoint # E02: free=4032, used=48 + -> heap4_alloc_b_checkpoint # E03: free=3968, used=64 + -> heap4_alloc_c_checkpoint # E04: free=3936, used=32 + -> heap4_free_a_checkpoint # E05: free=3984, blocks=2 + -> heap4_fragmented_checkpoint # E06: free=4016, blocks=2 + -> heap4_coalesced_checkpoint # E07: free=4080, blocks=1 + -> task03_debug_checkpoint # E08: OOM, hook, PASS \end{lstlisting} -\textbf{STOP 1:} zapisz liczbę bloków, sumę i largest. Przed \texttt{F5} -przewidź, co zmieni \texttt{FREE B}. - -\textbf{STOP 2:} sprawdź odzyskanie areny, minimum-ever, OOM i hook. +\textbf{E01--E04:} sprawdź, że zużycie obejmuje wyrównany nagłówek całego +bloku, a nie tylko payload. \textbf{E05--E06:} porównaj sumę wolną z largest. +Przed przejściem z E06 do E07 ustaw tymczasowy breakpoint na +\texttt{prvInsertBlockIntoFreeList()} i sprawdź oba testy sąsiedztwa. +\textbf{E07--E08:} potwierdź odzyskanie areny, minimum-ever, OOM i hook. \newpage \section{Dowód na Pico 2 W / RP2350} @@ -248,11 +253,14 @@ realną pamięć SRAM, w której obserwujemy ten sam algorytm. \begin{lstlisting} p g_fragmented_stats p g_final_stats +p g_a_consumed +p g_b_consumed +p g_c_consumed p xFreeBytesRemaining p xMinimumEverFreeBytesRemaining p xStart p pxEnd -x/96bx ucHeap +x/160bx ucHeap \end{lstlisting} \subsection*{Tabela obserwacji} @@ -263,10 +271,10 @@ Wielkość & Odczyt & Warunek \\ \midrule \texttt{initial\_free} & \blank{2.3cm} & punkt odniesienia \\ \texttt{after\_allocations} & \blank{2.3cm} & mniejsze niż initial \\ -STOP 1: free blocks & \blank{2.3cm} & równe 2 \\ -STOP 1: total / largest & \blank{2.3cm} & largest mniejsze niż total \\ -STOP 2: final free & \blank{2.3cm} & równe initial \\ -STOP 2: free blocks & \blank{2.3cm} & równe 1 \\ +E06: free blocks & \blank{2.3cm} & równe 2 \\ +E06: total / largest & \blank{2.3cm} & largest mniejsze niż total \\ +E07: final free & \blank{2.3cm} & równe initial \\ +E07: free blocks & \blank{2.3cm} & równe 1 \\ minimum-ever & \blank{2.3cm} & nie rośnie po free \\ OOM / hook / asserts / pass & \blank{2.3cm} & \texttt{1 / 1 / 0 / 1} \\ \bottomrule diff --git a/doc/pdf/mpabi-inf-freertos-c-01-heap4-mechanics-v00.01-87e48095-7793-54e3-9230-4e61d31bd459.pdf b/doc/pdf/mpabi-inf-freertos-c-01-heap4-mechanics-v00.01-87e48095-7793-54e3-9230-4e61d31bd459.pdf index 6f53776bdda1067bfe2d30fbed9a915916ded6ce..83da598a761177c22e65e10362265c068b19190d 100644 GIT binary patch delta 235518 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⁢h?n10B7#u2v%d}V8ujY!d`BX|_nt+Y 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 WDVp*CB18`EFA)t-NhzTy3IAUVfqgRo delta 223874 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 M!jh4RDTu@V7Ym97%K!iX diff --git a/doc/stan-prac.md b/doc/stan-prac.md index b29a965..83771cd 100644 --- a/doc/stan-prac.md +++ b/doc/stan-prac.md @@ -1,133 +1,51 @@ -# K01 `heap4` — punkt zatrzymania +# FC01 `heap_4` — stan weryfikacji -## Stan repozytorium +## Stan na 2026-07-20 -- Data: `2026-07-14`. -- Commit bazowy: `8aee0b104c4f6e6ffef119ab6f57a3e724144221`. -- Gałąź robocza: `work/list-first-rp2350-debug`. -- Zmienione źródła: brak. -- Zmieniona karta PDF: brak. -- Lokalny stan `.stem/`: wygenerowany przez testy `stemctl`, nie jest częścią karty. -- Review Claude: nieukończony; dwie sesje CLI nie zwróciły wyniku i zostały zatrzymane. +Karta ma jeden centralny eksperyment na niezmodyfikowanym +`heap_4.c` z FreeRTOS-Kernel V11.3.0. Przebieg jest podzielony na osiem +deterministycznych checkpointów E01–E08 i działa na RV32I/Hazard3. -## Potwierdzone +## Potwierdzone na Hazard3 -- [x] `make host` buduje 10/10 programów. -- [x] Wszystkie programy hostowe uruchamiają się z kodem `0`. -- [x] `make tasks RV_ENV_ROOT=...` buduje 10/10 ELF dla RV32I. -- [x] `stemctl test native-amd64 freertos heap4 10` przechodzi. -- [x] RP2350 Probe jest wykrywany bez `sudo` po wejściu do grupy `rpdebug`. -- [x] OpenOCD wykrywa `rp2350.rv0` i `rp2350.rv1`. -- [x] Oba rdzenie raportują `XLEN=32`. -- [ ] Nie wykonano testu programu K01 na RTL Hazard3. -- [ ] Nie wgrano programu K01 na fizyczny RP2350. +| Event | Stan | Dowód | +|---|---|---| +| E01 | arena po inicjalizacji | `free=largest=4080`, 1 blok | +| E02 | `alloc A(24)` | zużyto 48, zostało 4032 | +| E03 | `alloc B(40)` | zużyto 64, zostało 3968 | +| E04 | `alloc C(16)` | zużyto 32, zostało 3936 | +| E05 | `free(A)` | 3984, 2 wolne bloki | +| E06 | `free(C)` | 4016, 2 bloki, `free > largest` | +| E07 | `free(B)` | `free=largest=4080`, 1 blok | +| E08 | kontrolowany OOM | `NULL`, hook=1, asserts=0, PASS=1 | -## Wyniki bazowe — host AMD64 +Na RV32 `sizeof(BlockLink_t) == 8`, ale `portBYTE_ALIGNMENT == 16`, więc +prywatne `xHeapStructSize == 16`. To wyjaśnia zużycie 48/64/32 bajtów. -| Task | Wynik | -|---|---| -| 01 | `header=16 aligned=16 allocated=1 total=32 user=16` | -| 02 | `free=136 largest=80 count=3` | -| 03 | `offset=0 free=144 end_last=1` | -| 04 | `r1=24 r9=32 r17=40 delta=7` | -| 05 | `ok=1 allocated=120 remaining=0` | -| 06 | `allocated=48 split=128 nodes=1` | -| 07 | `order=1 count=3 total=120` | -| 08 | `count=1 size=160 merged_right=1` | -| 09 | `heap=256 adjusted=248 dynamic=1 host_trace=1` | -| 10 | `ok=1 nodes=1 free=240 min=144` | +## Diagramy i iteracja -## Braki P0 +- A1 CONTEXT: pięć kroków CODE — granice odpowiedzialności. +- A2 STRUCTURE: jeden krok CODE i pięć kroków RUN — nagłówek, split, + lista adresowa oraz scalenie lewego i prawego sąsiada. +- A5 FLOW: osiem kroków RUN mapowanych 1:1 na E01–E08. +- A6 STATE: pięć reprezentatywnych stanów E01, E04, E06, E07 i E08. +- A7 RUNTIME: tożsamość źródła/ELF, pamięć `ucHeap` i końcowy werdykt. +- A3, A4 i A8 są jawnie pominięte, ponieważ dublowałyby A2/A5. -- [ ] Dodać `stem-card.yaml`. -- [ ] Obsłużyć targety: - - [ ] `native` / `native-amd64`; - - [ ] `hazard3-baremetal` / `hazard3-sim`; - - [ ] `rp2350-rv` / fizyczny Hazard3. -- [ ] Naprawić `stemctl test hazard3-sim freertos heap4 10`. - - Stan obecny: `Legacy Hazard3 card/task is unsupported`. -- [ ] Dodać asercje wyniku. - - Stan obecny: każdy `main()` zwraca `0` niezależnie od wartości `g_*`. -- [ ] Dodać automatyczne porównanie wyników AMD64 i RV32. -- [ ] Dodać bezpieczne sprawdzanie przepełnienia rozmiaru żądania. -- [ ] Sprawdzić wyrównanie buforów używanych jako `HeapBlock`. -- [ ] Nie dereferencjonować wyniku alokacji przed sprawdzeniem `p != NULL`. +Szczegółowa kolejność komend, obserwacji i kryteriów znajduje się w +[`hazard3-iteration-plan.md`](hazard3-iteration-plan.md). -## Braki debug +## Wykonane testy -- [ ] K10: dodać jawne checkpointy: - - [ ] `INIT`; - - [ ] `ALLOC_A`; - - [ ] `ALLOC_B`; - - [ ] `FREE_A`; - - [ ] `ALLOC_C`; - - [ ] `ALLOC_REJECTED`; - - [ ] `FREE_B`; - - [ ] `FREE_C`; - - [ ] `DONE`. -- [ ] K10: zapisywać przy checkpointcie: - - [ ] numer zdarzenia; - - [ ] adres bloku; - - [ ] liczbę wolnych bloków; - - [ ] sumę wolnej pamięci; - - [ ] minimum wolnej pamięci; - - [ ] status `RUNNING/PASS/FAIL`. -- [ ] Simulator: - - [ ] breakpoint na funkcji checkpointu; - - [ ] inspekcja listy i pamięci; - - [ ] bez obiecywania watchpointów — szybki stub obsługuje obecnie breakpointy wykonania. -- [ ] RP2350: - - [ ] OpenOCD `target/rp2350-riscv.cfg`; - - [ ] breakpoint `main`; - - [ ] sprzętowy watchpoint na numerze zdarzenia/statusie; - - [ ] porównanie adresów i wyników z symulatorem; - - [ ] Termdebug i DAP na tym samym ELF. +- testy hostowe Task 1–3; +- budowa RV32I i kontrola symboli ELF; +- Hazard3 RTL: zakończenie kodem 0 po 27308 cyklach; +- osiem checkpointów obecnych w ELF; +- walidacja JSON i odwołań `code_ref`/`snapshot_ref`; +- kontrola PlantUML, SVG, HTML, TeX i siedmiostronicowego PDF; +- TypeScript/React typecheck generatora. -## Braki materiału - -- [ ] Zmniejszyć udział prozy. -- [ ] Zastąpić akapity: - - [ ] listami kontrolnymi; - - [ ] tabelami wartości; - - [ ] komendami do skopiowania; - - [ ] punktami zatrzymania GDB; - - [ ] kryteriami zaliczenia. -- [ ] Szablon każdego taska: - - [ ] `Cel` — maksymalnie 3 punkty; - - [ ] `Uruchom` — komendy; - - [ ] `Zatrzymaj` — breakpoint/watchpoint; - - [ ] `Obserwuj` — symbole i pamięć; - - [ ] `Oczekuj` — wartości host/RV32; - - [ ] `Zmień` — jeden eksperyment; - - [ ] `Zaliczenie` — mierzalna checklista. -- [ ] Przenieść pełne listingi C/ASM do dodatku. -- [ ] Pierwsze strony PDF przeznaczyć na kartę prowadzącego i przebieg lekcji. - -## Kolejność wznowienia K01 - -1. Zamknąć wymagania w bezpośrednim poprzedniku `inf/structures`. -2. Dodać testy wyniku do K01. -3. Dodać kontrakt `stem-card.yaml`. -4. Uruchomić 10/10 tasków na Hazard3 RTL. -5. Dodać checkpointy K10. -6. Zbudować K10 dla `rp2350-rv`. -7. Wgrać i debugować K10 przez JTAG. -8. Przebudować README/PDF do formatu list-first. -9. Wykonać końcowy review techniczny i dydaktyczny. - -## Bezpośredni poprzednik - -- Seria: `inf`. -- Karta: `structures`. -- Repozytorium: `lab-rv32i-c-structures`. -- Przejście wymagane przed K01: - - [ ] `struct` i `typedef`; - - [ ] struktura samoreferencyjna; - - [ ] pole `next`; - - [ ] przejście po liście; - - [ ] wstawianie elementu; - - [ ] wartownik; - - [ ] `sizeof`, padding i wyrównanie na AMD64/RV32; - - [ ] niezmienniki listy; - - [ ] obserwacja w GDB. +## Pozostaje poza zakresem tej iteracji +- próba na fizycznym RP2350/Pico 2 W; +- commit i publikacja — wymagają osobnego polecenia. diff --git a/json/card_source.json b/json/card_source.json index 9decc8c..d5e6d3d 100644 --- a/json/card_source.json +++ b/json/card_source.json @@ -17,7 +17,7 @@ "status": "Gotowa", "version": "v00.01", "uuid": "87e48095-7793-54e3-9230-4e61d31bd459", - "author": "M. Pabiszczak", + "author": "Mateusz Pabiszczak", "year": "2026" }, "generated": { @@ -39,7 +39,7 @@ { "id": "A2", "label": "STRUCTURE", - "subtitle": "headers and address order", + "subtitle": "RV32 header, split and address order", "status": "enabled", "target_label": "fig:a2-structure" }, @@ -55,7 +55,7 @@ "label": "APPLICATION", "subtitle": "experiment is already explicit", "status": "unavailable", - "reason": "The concrete A/B/C allocation experiment is completely represented by A5 and its two runtime checkpoints." + "reason": "The concrete A/B/C allocation experiment is completely represented by the eight-state replay in A5." }, { "id": "A5", @@ -87,35 +87,37 @@ } ], "debug_strategies": { - "code.model": { - "id": "code.model", + "code.boundary": { + "id": "code.boundary", "kind": "code", "action": "open", "expected_observations": [ - "requested size includes header and alignment", - "free list is ordered by block address" + "application code calls only the public FreeRTOS allocation API", + "the selected heap implementation is linked below that API" ], "assertions": [ - "payload begins after the header", - "split preserves the total arena size" + "the application never edits allocator metadata", + "Hazard3 observes the same ucHeap object named by the ELF" ], "evidence_fields": [ "code_ref", - "header bytes", - "wanted bytes", - "block address" + "public symbol", + "arena symbol", + "target profile" ], "prerequisites": [ "K&R 5.4 linear allocator complete" ], "layout": [ - "header", - "payload", - "remainder", - "address-ordered list" + "application", + "FreeRTOS API", + "heap_4", + "ucHeap", + "Hazard3" ], "commands": [ - "rg -n 'ModelBlock|align_up|insert_and_coalesce' src/tasks" + "rg -n 'pvPortMalloc|vPortFree|vPortGetHeapStats|ucHeap' src/tasks/task03_freertos_heap4.c", + "rg -n 'TASK03_KERNEL_SOURCES|HEAP4_SOURCE' Makefile" ] }, "code.heap4": { @@ -146,7 +148,45 @@ "pxEnd" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "rg -n 'BlockLink_t|prvHeapInit|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' ${FREERTOS_KERNEL_PATH:-/opt/FreeRTOS-Kernel}/portable/MemMang/heap_4.c" + ] + }, + "run.timeline": { + "id": "run.timeline", + "kind": "run", + "action": "replay", + "expected_observations": [ + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" + ], + "assertions": [ + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" + ], + "evidence_fields": [ + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" + ], + "prerequisites": [ + "clean Hazard3 RAM", + "task03 image loaded" + ], + "layout": [ + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" + ], + "commands": [ + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" ] }, "run.fragmented": { @@ -180,7 +220,43 @@ "commands": [ "break heap4_fragmented_checkpoint", "print g_fragmented_stats", - "x/64bx ucHeap" + "print g_fragmented_free", + "x/96bx ucHeap" + ] + }, + "run.coalescing": { + "id": "run.coalescing", + "kind": "run", + "action": "replay", + "expected_observations": [ + "the replay stops after free(C), immediately before free(B)", + "inside prvInsertBlockIntoFreeList the previous block is merged before the next block" + ], + "assertions": [ + "pxIterator < pxBlockToInsert < pxIterator->pxNextFreeBlock", + "the left adjacency test is evaluated before the right adjacency test" + ], + "evidence_fields": [ + "pxIterator", + "pxBlockToInsert", + "left end address", + "right start address" + ], + "prerequisites": [ + "task01.fragmented replay ready" + ], + "layout": [ + "application call vPortFree(g_b)", + "prvInsertBlockIntoFreeList", + "free-list links", + "ucHeap addresses" + ], + "commands": [ + "tbreak prvInsertBlockIntoFreeList", + "continue", + "print pxIterator", + "print pxBlockToInsert", + "next" ] }, "run.coalesced": { @@ -193,15 +269,14 @@ ], "assertions": [ "final free equals initial free", - "minimum-ever does not rise after free", - "oversized allocation returns NULL and calls the hook once" + "one free block is also the largest block", + "minimum-ever does not rise after free" ], "evidence_fields": [ "final free", "largest block", "minimum-ever", - "OOM hook", - "PASS" + "free blocks" ], "prerequisites": [ "fragmented checkpoint reached" @@ -213,8 +288,46 @@ "PASS" ], "commands": [ - "break task03_debug_checkpoint", + "break heap4_coalesced_checkpoint", "print g_final_stats", + "print g_final_free", + "print g_minimum_ever_free" + ] + }, + "run.verified": { + "id": "run.verified", + "kind": "run", + "action": "replay", + "expected_observations": [ + "the oversized request returns NULL", + "the malloc-failed hook runs once without corrupting the recovered arena" + ], + "assertions": [ + "g_oom_is_null equals 1", + "g_malloc_failed_hooks equals 1", + "g_assert_failures equals 0", + "g_task03_pass equals 1" + ], + "evidence_fields": [ + "OOM result", + "hook count", + "assert count", + "PASS" + ], + "prerequisites": [ + "coalesced checkpoint reproducible" + ], + "layout": [ + "final stats", + "OOM result", + "hook", + "PASS" + ], + "commands": [ + "break task03_debug_checkpoint", + "print g_too_large", + "print g_malloc_failed_hooks", + "print g_assert_failures", "print g_task03_pass" ] }, @@ -228,7 +341,8 @@ ], "assertions": [ "pvPortMalloc and vPortFree are present", - "prvInsertBlockIntoFreeList is present" + "prvInsertBlockIntoFreeList is present", + "all eight replay checkpoint symbols are present" ], "evidence_fields": [ "source blob", @@ -252,7 +366,7 @@ "template": "templates/karta-klasyczna.json", "title_block": { "category": "KARTA PRACY · INFORMATYKA", - "prepared_by": "M. Pabiszczak", + "prepared_by": "Mateusz Pabiszczak", "prepared_on": "2026-07-20T00:00:00+02:00", "title": "heap_4: From Linear Cursor to Reusable Blocks", "url": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/aea09ab7-9bfd-5368-8d1b-c8724871c1a7", @@ -328,7 +442,7 @@ "FC01.EK01": { "bloom_level": "Zastosowanie", "label": "Fragmentacja i odzyskanie areny", - "text": "Uczeń odtwarza dwa checkpointy Hazard3 i odróżnia current free, largest free block oraz minimum-ever.", + "text": "Uczeń odtwarza osiem checkpointów Hazard3 i odróżnia current free, largest free block oraz minimum-ever.", "assessment_criteria": [ "FC01.KW01" ] @@ -336,7 +450,7 @@ }, "assessment_criteria": { "FC01.KW01": { - "text": "Model 13 -> 32 bajty; poprawna predykcja dwóch wolnych bloków po free(A,C) i jednego po free(B); final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.", + "text": "Na RV32 BlockLink_t ma 8 bajtów, lecz 16-bajtowe wyrównanie portu daje xHeapStructSize=16; A/B/C zużywają 48/64/32 bajty; po free(A,C) są dwa wolne bloki, po free(B) jeden; final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.", "learning_effects": [ "FC01.EN01", "FC01.EK01" @@ -386,7 +500,7 @@ "local": "01", "kind": "EK", "tree_id": "FC01.WE01.TECH.LOCAL.RTOS.01", - "text": "Uczeń odtwarza dwa checkpointy Hazard3 i odróżnia current free, largest free block oraz minimum-ever.", + "text": "Uczeń odtwarza osiem checkpointów Hazard3 i odróżnia current free, largest free block oraz minimum-ever.", "kw": [ { "criterion_ref": "FC01.KW01", @@ -408,11 +522,11 @@ "semantics": "deterministic-replay", "artifact": { "source": "src/tasks/task03_freertos_heap4.c", - "source_git_blob": "a73eb936ad3896bc212fe7fcc1e9918e4430746e", + "source_git_blob": "14ee8fedf1eec198c6b373e2805e07825c3fd0ed", "elf": "build/task03_freertos_heap4/prog.elf", - "hazard3_elf_sha256": "6a7b20ad3447d0877e7ecff39087653e32f4931e2364bdc2ea533bf5d70f7854", + "hazard3_elf_sha256": "91af9f1169945abe4b16037ded2b8047253bf33f4ea6823f46a427ec17d3d4fa", "hazard3_image": "build/task03_freertos_heap4/prog.bin", - "hazard3_image_sha256": "c9d9b45546305671fa6172156fbfc58b90b145fe952e3b7cfe8cce0da0f5e7dd" + "hazard3_image_sha256": "0d943814bb518fefda254f1cdf3771e4104ba1ad9e5f31bb04e672b5015ce31a" }, "targets": { "hazard3-sim": { @@ -422,8 +536,151 @@ } }, "items": { - "task01.fragmented": { + "task01.reset": { "event_id": "E01", + "stop": { + "symbol": "heap4_reset_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_initial_stats.xNumberOfFreeBlocks", + "equals": 1 + }, + { + "expr": "g_initial_stats.xSizeOfLargestFreeBlockInBytes == g_initial_free", + "equals": 1 + }, + { + "expr": "g_initial_free", + "equals": 4080 + } + ] + } + }, + "task01.alloc-a": { + "event_id": "E02", + "stop": { + "symbol": "heap4_alloc_a_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_a != 0", + "equals": 1 + }, + { + "expr": "g_a_aligned", + "equals": 1 + }, + { + "expr": "g_a_consumed", + "equals": 48 + }, + { + "expr": "g_after_a_stats.xNumberOfFreeBlocks", + "equals": 1 + }, + { + "expr": "g_after_a_free", + "equals": 4032 + } + ] + } + }, + "task01.alloc-b": { + "event_id": "E03", + "stop": { + "symbol": "heap4_alloc_b_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_b != 0", + "equals": 1 + }, + { + "expr": "g_b_aligned", + "equals": 1 + }, + { + "expr": "g_b_consumed", + "equals": 64 + }, + { + "expr": "g_after_b_free < g_after_a_free", + "equals": 1 + }, + { + "expr": "g_after_b_free", + "equals": 3968 + } + ] + } + }, + "task01.alloc-c": { + "event_id": "E04", + "stop": { + "symbol": "heap4_alloc_c_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_c != 0", + "equals": 1 + }, + { + "expr": "g_c_aligned", + "equals": 1 + }, + { + "expr": "g_c_consumed", + "equals": 32 + }, + { + "expr": "g_allocations_aligned", + "equals": 1 + }, + { + "expr": "g_after_allocations", + "equals": 3936 + } + ] + } + }, + "task01.free-a": { + "event_id": "E05", + "stop": { + "symbol": "heap4_free_a_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_after_free_a_stats.xNumberOfFreeBlocks", + "equals": 2 + }, + { + "expr": "g_after_free_a == g_after_allocations + g_a_consumed", + "equals": 1 + }, + { + "expr": "g_after_free_a_stats.xAvailableHeapSpaceInBytes > g_after_free_a_stats.xSizeOfLargestFreeBlockInBytes", + "equals": 1 + }, + { + "expr": "g_after_free_a", + "equals": 3984 + } + ] + } + }, + "task01.fragmented": { + "event_id": "E06", "stop": { "symbol": "heap4_fragmented_checkpoint", "offset": 0 @@ -435,20 +692,24 @@ "equals": 2 }, { - "expr": "g_initial_free > g_after_allocations", + "expr": "g_fragmented_free == g_after_free_a + g_c_consumed", "equals": 1 }, { - "expr": "g_allocations_aligned", + "expr": "g_fragmented_stats.xAvailableHeapSpaceInBytes > g_fragmented_stats.xSizeOfLargestFreeBlockInBytes", "equals": 1 + }, + { + "expr": "g_fragmented_free", + "equals": 4016 } ] } }, "task01.coalesced": { - "event_id": "E02", + "event_id": "E07", "stop": { - "symbol": "task03_debug_checkpoint", + "symbol": "heap4_coalesced_checkpoint", "offset": 0 }, "verify": { @@ -461,13 +722,48 @@ "expr": "g_final_free == g_initial_free", "equals": 1 }, + { + "expr": "g_final_stats.xSizeOfLargestFreeBlockInBytes == g_initial_free", + "equals": 1 + }, + { + "expr": "g_minimum_ever_free <= g_after_allocations", + "equals": 1 + }, + { + "expr": "g_final_free", + "equals": 4080 + } + ] + } + }, + "task01.verified": { + "event_id": "E08", + "stop": { + "symbol": "task03_debug_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ { "expr": "g_oom_is_null", "equals": 1 }, + { + "expr": "g_malloc_failed_hooks", + "equals": 1 + }, + { + "expr": "g_assert_failures", + "equals": 0 + }, { "expr": "g_task03_pass", "equals": 1 + }, + { + "expr": "g_rv32_layout_expected", + "equals": 1 } ] } @@ -529,9 +825,9 @@ "number": 1, "label": "aplikacja żąda i zwalnia bajty", "mode": "CODE", - "strategy_ref": "code.heap4", + "strategy_ref": "code.boundary", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:78", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", "description": "Aplikacja zna wyłącznie publiczne API i wskaźniki payloadu.", "evidence": "trzy żądania 24, 40 i 16 bajtów" }, @@ -540,9 +836,9 @@ "number": 2, "label": "FreeRTOS wystawia malloc, free i statystyki", "mode": "CODE", - "strategy_ref": "code.heap4", + "strategy_ref": "code.boundary", "svg_label": "02", - "code_ref": "src/tasks/task03_freertos_heap4.c:90", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", "description": "API oddziela eksperyment od prywatnej listy bloków.", "evidence": "pvPortMalloc, vPortFree, vPortGetHeapStats" }, @@ -553,16 +849,16 @@ "mode": "CODE", "strategy_ref": "code.heap4", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:70", - "description": "Prywatny mechanizm wybiera, dzieli i scala wolne bloki.", - "evidence": "reset i inicjalizacja listy" + "code_ref": "UPSTREAM.md:1", + "description": "Prywatny mechanizm wybiera, dzieli i scala wolne bloki; strategia otwiera prawdziwy heap_4.c.", + "evidence": "prvHeapInit i prvInsertBlockIntoFreeList" }, { "id": "arena", "number": 4, "label": "ucHeap jest jedną ograniczoną areną", "mode": "CODE", - "strategy_ref": "code.heap4", + "strategy_ref": "code.boundary", "svg_label": "04", "code_ref": "src/tasks/task03_freertos_heap4.c:11", "description": "Metadane i payload znajdują się w tej samej statycznej tablicy.", @@ -614,8 +910,8 @@ "alignment": 1, "split": 1, "address-order": 1, - "right-join": 1, - "left-join": 1 + "left-join": 1, + "right-join": 1 } }, "interactive": { @@ -639,68 +935,78 @@ { "id": "header", "number": 1, - "label": "nagłówek przechowuje next i size", + "label": "nagłówek RV32 przechowuje next i size", "mode": "CODE", - "strategy_ref": "code.model", + "strategy_ref": "code.heap4", "svg_label": "01", - "code_ref": "src/tasks/heap4_model.h:11", - "description": "ModelBlock pokazuje minimalny kontrakt metadanych heap_4.", - "evidence": "dwa słowa metadanych" + "code_ref": "UPSTREAM.md:1", + "description": "Prawdziwy BlockLink_t zawiera wskaźnik i size_t, po 4 bajty na RV32; port wyrównuje nagłówek do 16 bajtów.", + "evidence": "sizeof(BlockLink_t)=8; portBYTE_ALIGNMENT=16; xHeapStructSize=16" }, { "id": "alignment", "number": 2, - "label": "żądanie obejmuje nagłówek i wyrównanie", - "mode": "CODE", - "strategy_ref": "code.model", + "label": "A(24) obejmuje nagłówek i wyrównanie", + "mode": "RUN", + "event_id": "E02", + "strategy_ref": "run.timeline", "svg_label": "02", - "code_ref": "src/tasks/task01_first_fit_split.c:3", - "description": "13 bajtów payloadu zajmuje 32 bajty całego bloku.", - "evidence": "header=16, wanted=32" + "code_ref": "src/tasks/task03_freertos_heap4.c:137", + "snapshot_ref": "task01.alloc-a", + "description": "Różnica licznika wolnych bajtów mierzy cały blok, nie sam payload.", + "evidence": "g_a_consumed = 48; g_a_aligned = 1" }, { "id": "split", "number": 3, "label": "split pozostawia osobny wolny blok", - "mode": "CODE", - "strategy_ref": "code.model", + "mode": "RUN", + "event_id": "E02", + "strategy_ref": "run.timeline", "svg_label": "03", - "code_ref": "src/tasks/task01_first_fit_split.c:43", - "description": "Reszta zachowuje własny nagłówek i trafia na listę wolnych.", - "evidence": "32 + 224 = 256" + "code_ref": "src/tasks/task03_freertos_heap4.c:137", + "snapshot_ref": "task01.alloc-a", + "description": "Po pierwszym first-fit pozostała część areny nadal jest jednym wolnym blokiem.", + "evidence": "free = 4032; free blocks = 1" }, { "id": "address-order", "number": 4, "label": "lista jest uporządkowana rosnącymi adresami", - "mode": "CODE", - "strategy_ref": "code.model", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.fragmented", "svg_label": "04", - "code_ref": "src/tasks/task02_address_order_coalesce.c:29", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", + "snapshot_ref": "task01.fragmented", "description": "Pozycja w liście ujawnia bezpośredniego poprzednika i następnika.", - "evidence": "previous < block < current" - }, - { - "id": "right-join", - "number": 5, - "label": "blok scala się z prawym sąsiadem", - "mode": "CODE", - "strategy_ref": "code.model", - "svg_label": "05", - "code_ref": "src/tasks/task02_address_order_coalesce.c:40", - "description": "Koniec zwalnianego bloku równy adresowi current oznacza ciągłość.", - "evidence": "block + size == current" + "evidence": "g_a < g_b < g_c; dwa wolne obszary" }, { "id": "left-join", + "number": 5, + "label": "heap_4 scala najpierw poprzedni blok", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.coalescing", + "svg_label": "05", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", + "snapshot_ref": "task01.fragmented", + "description": "Replay E06, tymczasowy breakpoint i step w prywatnej funkcji pokazują pierwszy test ciągłości.", + "evidence": "previous + previous.size == inserted" + }, + { + "id": "right-join", "number": 6, - "label": "wynik scala się z lewym sąsiadem", - "mode": "CODE", - "strategy_ref": "code.model", + "label": "następnie scala prawy blok", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.coalescing", "svg_label": "06", - "code_ref": "src/tasks/task02_address_order_coalesce.c:48", - "description": "Drugi test domyka dwustronne scalanie w jeden blok.", - "evidence": "previous + size == block" + "code_ref": "src/tasks/task03_freertos_heap4.c:173", + "snapshot_ref": "task01.fragmented", + "description": "Drugi test wykorzystuje już powiększony lewy blok i domyka scalenie areny.", + "evidence": "merged + merged.size == current" } ] } @@ -715,7 +1021,7 @@ "content_kind": "prose", "asset_page_mode": "one-per-page", "page_orientation": "landscape", - "content_tex": "Uczeń najpierw przewiduje liczbę wolnych bloków. RUN odtwarza dwa stabilne stany: po zwolnieniu A i C oraz po zwolnieniu B.", + "content_tex": "Uczeń przewiduje układ bloków, a następnie odtwarza osiem deterministycznych stanów tego samego przebiegu Hazard3.", "assets": [ { "path": "assets/a5-flow.png", @@ -735,10 +1041,10 @@ "step_tiles": { "reset": 1, "alloc-a": 1, - "alloc-bc": 1, - "free-ac": 1, + "alloc-b": 1, + "alloc-c": 1, + "free-a": 1, "fragmented": 1, - "free-b": 1, "coalesced": 1, "oom": 1 } @@ -765,93 +1071,105 @@ "id": "reset", "number": 1, "label": "reset i inicjalizacja areny", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E01", + "strategy_ref": "run.timeline", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:70", - "description": "Pierwsze małe żądanie inicjalizuje sentinele i listę.", - "evidence": "initial free = 4080" + "code_ref": "src/tasks/task03_freertos_heap4.c:127", + "snapshot_ref": "task01.reset", + "description": "Próbne żądanie inicjalizuje sentinele; po jego zwolnieniu arena ma jeden blok.", + "evidence": "free = largest = 4080; blocks = 1" }, { "id": "alloc-a", "number": 2, "label": "first-fit przydziela A", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E02", + "strategy_ref": "run.timeline", "svg_label": "02", - "code_ref": "src/tasks/task03_freertos_heap4.c:78", + "code_ref": "src/tasks/task03_freertos_heap4.c:137", + "snapshot_ref": "task01.alloc-a", "description": "Pierwszy wystarczający blok zostaje rozdzielony.", - "evidence": "A payload = 24" + "evidence": "A=24; consumed=48; free=4032" }, { - "id": "alloc-bc", + "id": "alloc-b", "number": 3, - "label": "kolejne split tworzą B i C", - "mode": "CODE", - "strategy_ref": "code.heap4", + "label": "kolejny split tworzy B", + "mode": "RUN", + "event_id": "E03", + "strategy_ref": "run.timeline", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:79", - "description": "B i C zajmują kolejne fragmenty tego samego wolnego bloku.", - "evidence": "after allocations = 3952" + "code_ref": "src/tasks/task03_freertos_heap4.c:145", + "snapshot_ref": "task01.alloc-b", + "description": "B zajmuje następny fragment tej samej reszty.", + "evidence": "B=40; consumed=64; free=3968" }, { - "id": "free-ac", + "id": "alloc-c", "number": 4, - "label": "zwolnij A i C, pozostaw B", - "mode": "CODE", - "strategy_ref": "code.heap4", + "label": "trzeci split tworzy C", + "mode": "RUN", + "event_id": "E04", + "strategy_ref": "run.timeline", "svg_label": "04", - "code_ref": "src/tasks/task03_freertos_heap4.c:88", - "description": "C scala się z prawą resztą, ale B oddziela ją od A.", - "evidence": "dwa wolne bloki" + "code_ref": "src/tasks/task03_freertos_heap4.c:153", + "snapshot_ref": "task01.alloc-c", + "description": "A, B i C są wyrównane, a za nimi pozostaje jedna wolna reszta.", + "evidence": "C=16; consumed=32; free=3936" + }, + { + "id": "free-a", + "number": 5, + "label": "zwolnij A, pozostaw B i C", + "mode": "RUN", + "event_id": "E05", + "strategy_ref": "run.timeline", + "svg_label": "05", + "code_ref": "src/tasks/task03_freertos_heap4.c:163", + "snapshot_ref": "task01.free-a", + "description": "Wolny A i końcowa reszta są rozdzielone przez B i C.", + "evidence": "blocks=2; free=3984" }, { "id": "fragmented", - "number": 5, - "label": "checkpoint fragmentacji", - "mode": "RUN", - "event_id": "E01", - "strategy_ref": "run.fragmented", - "svg_label": "05", - "code_ref": "src/tasks/task03_freertos_heap4.c:91", - "snapshot_ref": "task01.fragmented", - "description": "GDB zatrzymuje program przy dwóch wolnych blokach.", - "evidence": "xNumberOfFreeBlocks = 2" - }, - { - "id": "free-b", "number": 6, - "label": "zwolnij B między dwoma sąsiadami", - "mode": "CODE", - "strategy_ref": "code.heap4", + "label": "zwolnij C, pozostaw B", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.fragmented", "svg_label": "06", - "code_ref": "src/tasks/task03_freertos_heap4.c:93", - "description": "Wstawienie adresowe umożliwia dwa testy ciągłości.", - "evidence": "A + B + C + reszta są ciągłe" + "code_ref": "src/tasks/task03_freertos_heap4.c:168", + "snapshot_ref": "task01.fragmented", + "description": "C scala się z prawą resztą, ale B nadal rozdziela dwa wolne obszary.", + "evidence": "blocks=2; free=4016; free>largest" }, { "id": "coalesced", "number": 7, - "label": "arena wraca do jednego bloku", + "label": "zwolnij B i scal oba sąsiednie bloki", "mode": "RUN", - "event_id": "E02", + "event_id": "E07", "strategy_ref": "run.coalesced", "svg_label": "07", - "code_ref": "src/tasks/task03_freertos_heap4.c:96", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", "snapshot_ref": "task01.coalesced", - "description": "Finalne statystyki dowodzą pełnego odzyskania areny.", - "evidence": "final free = initial free; blocks = 1" + "description": "Scalenie lewego, a potem prawego sąsiada przywraca jeden blok.", + "evidence": "free=largest=initial=4080; blocks=1" }, { "id": "oom", "number": 8, "label": "zbyt duże żądanie kończy się NULL", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E08", + "strategy_ref": "run.verified", "svg_label": "08", - "code_ref": "src/tasks/task03_freertos_heap4.c:98", + "code_ref": "src/tasks/task03_freertos_heap4.c:179", + "snapshot_ref": "task01.verified", "description": "Kontrolowany OOM nie narusza listy i wywołuje hook dokładnie raz.", - "evidence": "NULL, hooks=1, asserts=0" + "evidence": "NULL; hooks=1; asserts=0; PASS=1" } ] } @@ -913,33 +1231,37 @@ "id": "free", "number": 1, "label": "wolny blok należy do listy", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E01", + "strategy_ref": "run.timeline", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:70", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", + "snapshot_ref": "task01.reset", "description": "Stan początkowy zawiera jeden największy wolny blok.", - "evidence": "initial free = largest free" + "evidence": "initial free = largest free = 4080" }, { "id": "allocated", "number": 2, "label": "przydzielony blok znika z listy wolnych", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E04", + "strategy_ref": "run.timeline", "svg_label": "02", - "code_ref": "src/tasks/task03_freertos_heap4.c:78", + "code_ref": "src/tasks/task03_freertos_heap4.c:153", + "snapshot_ref": "task01.alloc-c", "description": "Payload jest wyrównany, a bieżąca wolna pamięć maleje.", - "evidence": "all payload pointers aligned" + "evidence": "all payload pointers aligned; free=3936" }, { "id": "fragmented-state", "number": 3, "label": "dwa wolne bloki nie są jednym dużym blokiem", "mode": "RUN", - "event_id": "E01", + "event_id": "E06", "strategy_ref": "run.fragmented", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:90", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", "snapshot_ref": "task01.fragmented", "description": "Suma wolnego miejsca nie gwarantuje jednego dużego przydziału.", "evidence": "free blocks = 2" @@ -949,10 +1271,10 @@ "number": 4, "label": "scalenie przywraca jeden największy blok", "mode": "RUN", - "event_id": "E02", + "event_id": "E07", "strategy_ref": "run.coalesced", "svg_label": "04", - "code_ref": "src/tasks/task03_freertos_heap4.c:94", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", "snapshot_ref": "task01.coalesced", "description": "Current free i largest wracają do wartości początkowej.", "evidence": "free blocks = 1" @@ -961,10 +1283,12 @@ "id": "minimum-ever", "number": 5, "label": "minimum-ever zachowuje najniższy poziom", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E08", + "strategy_ref": "run.verified", "svg_label": "05", - "code_ref": "src/tasks/task03_freertos_heap4.c:95", + "code_ref": "src/tasks/task03_freertos_heap4.c:179", + "snapshot_ref": "task01.verified", "description": "Historyczne minimum nie zwiększa się po odzyskaniu pamięci.", "evidence": "minimum-ever <= after allocations" } @@ -1017,7 +1341,7 @@ "block": { "id": "a7", "label": "A7 RUNTIME", - "description": "Ten sam artefakt łączy źródło, symbole ELF, dwa checkpointy, pamięć ucHeap i końcowe asercje." + "description": "Ten sam artefakt łączy źródło, symbole ELF, osiem checkpointów, pamięć ucHeap i końcowe asercje." }, "phases": [ { @@ -1031,7 +1355,7 @@ "mode": "CODE", "strategy_ref": "code.identity", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:62", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", "description": "Blob źródła jest częścią tożsamości karty.", "evidence": "source git blob" }, @@ -1051,22 +1375,24 @@ "number": 3, "label": "checkpoint pokazuje dwa wolne bloki", "mode": "RUN", - "event_id": "E01", + "event_id": "E06", "strategy_ref": "run.fragmented", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:91", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", "snapshot_ref": "task01.fragmented", "description": "Neovim, GDB i pamięć zatrzymują się na tym samym stanie.", - "evidence": "blocks=2 and aligned=1" + "evidence": "blocks=2 and free>largest" }, { "id": "memory", "number": 4, "label": "ucHeap ujawnia nagłówki i payload", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.fragmented", "svg_label": "04", "code_ref": "src/tasks/task03_freertos_heap4.c:11", + "snapshot_ref": "task01.fragmented", "description": "Widok bajtów łączy diagram z realnym układem areny.", "evidence": "aligned arena and in-band metadata" }, @@ -1075,11 +1401,11 @@ "number": 5, "label": "checkpoint końcowy dowodzi odzyskania", "mode": "RUN", - "event_id": "E02", - "strategy_ref": "run.coalesced", + "event_id": "E08", + "strategy_ref": "run.verified", "svg_label": "05", - "code_ref": "src/tasks/task03_freertos_heap4.c:111", - "snapshot_ref": "task01.coalesced", + "code_ref": "src/tasks/task03_freertos_heap4.c:179", + "snapshot_ref": "task01.verified", "description": "Jedna ramka łączy stats, OOM, hook i PASS.", "evidence": "final=initial, blocks=1, pass=1" } @@ -1103,8 +1429,8 @@ "task01": { "title": "Predict and prove reusable heap_4 blocks", "uuid": "aea09ab7-9bfd-5368-8d1b-c8724871c1a7", - "prompt_tex": "Przewidź układ bloków po alloc A/B/C, następnie po free(A,C) i free(B). Odtwórz oba checkpointy i udowodnij, że arena została scalona bez utraty minimum-ever.", - "criterion": "Model 13 -> 32 bajty; poprawna predykcja dwóch wolnych bloków po free(A,C) i jednego po free(B); final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.", + "prompt_tex": "Przewidź układ bloków po alloc A/B/C, następnie po free(A), free(C) i free(B). Odtwórz checkpointy E01--E08 i udowodnij, że arena została scalona bez utraty minimum-ever.", + "criterion": "Na RV32 BlockLink_t ma 8 bajtów, lecz 16-bajtowe wyrównanie portu daje xHeapStructSize=16; A/B/C zużywają 48/64/32 bajty; po free(A,C) są dwa wolne bloki, po free(B) jeden; final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.", "conclusion_tex": "heap\\_4 odzyskuje pamięć dzięki metadanym w arenie, adresowo uporządkowanej liście i scalaniu sąsiadów. Suma wolnych bajtów nie zastępuje informacji o największym bloku, a minimum-ever jest historią, nie bieżącym stanem.", "flow": [ { @@ -1115,8 +1441,8 @@ "steps": [ { "id": "size", - "title": "Policz rozmiar bloku.", - "content_tex": "Dodaj nagłówek do 13 bajtów i wyrównaj wynik do ośmiu." + "title": "Policz rozmiary całych bloków.", + "content_tex": "Rozróżnij surowy BlockLink\\_t (8 bajtów) od xHeapStructSize (16 bajtów), dodaj nagłówek do żądań 24, 40 i 16 bajtów, a następnie wyrównaj wynik do 16." }, { "id": "list", @@ -1129,17 +1455,22 @@ "kind": "block", "id": "replay", "title": "B — replay Hazard3", - "content_tex": "Powiąż diagram z dwoma deterministycznymi checkpointami.", + "content_tex": "Powiąż każdy stan diagramu z deterministycznym checkpointem E01--E08.", "steps": [ { - "id": "fragmented", - "title": "Sprawdź E01.", - "content_tex": "Porównaj liczbę wolnych bloków, największy blok i bieżące wolne bajty." + "id": "allocate", + "title": "Sprawdź E01--E04.", + "content_tex": "Potwierdź wartości 4080, 4032, 3968 i 3936 oraz zużycie 48/64/32 bajtów." }, { - "id": "coalesced", - "title": "Sprawdź E02.", - "content_tex": "Udowodnij pełne scalenie, zachowanie minimum-ever i kontrolowany OOM." + "id": "release", + "title": "Sprawdź E05--E07.", + "content_tex": "Porównaj liczbę wolnych bloków i udowodnij scalenie poprzedniego, a potem następnego sąsiada." + }, + { + "id": "verify", + "title": "Sprawdź E08.", + "content_tex": "Udowodnij zachowanie minimum-ever, kontrolowany OOM, brak asercji i PASS=1." } ] }, diff --git a/json/card_spec.json b/json/card_spec.json index 74ca110..383a9dc 100644 --- a/json/card_spec.json +++ b/json/card_spec.json @@ -22,7 +22,7 @@ { "id": "A2", "label": "STRUCTURE", - "subtitle": "headers and address order", + "subtitle": "RV32 header, split and address order", "status": "enabled" }, { @@ -37,7 +37,7 @@ "label": "APPLICATION", "subtitle": "experiment is already explicit", "status": "unavailable", - "reason": "The concrete A/B/C allocation experiment is completely represented by A5 and its two runtime checkpoints." + "reason": "The concrete A/B/C allocation experiment is completely represented by the eight-state replay in A5." }, { "id": "A5", @@ -72,50 +72,40 @@ }, "strategies": [ { - "id": "code.model", + "id": "code.boundary", "kind": "code", + "expected_observations": [ + "application code calls only the public FreeRTOS allocation API", + "the selected heap implementation is linked below that API" + ], + "assertions": [ + "the application never edits allocator metadata", + "Hazard3 observes the same ucHeap object named by the ELF" + ], + "evidence_fields": [ + "code_ref", + "public symbol", + "arena symbol", + "target profile" + ], "prerequisites": [ "K&R 5.4 linear allocator complete" ], "layout": [ - "header", - "payload", - "remainder", - "address-ordered list" + "application", + "FreeRTOS API", + "heap_4", + "ucHeap", + "Hazard3" ], "commands": [ - "rg -n 'ModelBlock|align_up|insert_and_coalesce' src/tasks" - ], - "expected_observations": [ - "requested size includes header and alignment", - "free list is ordered by block address" - ], - "assertions": [ - "payload begins after the header", - "split preserves the total arena size" - ], - "evidence_fields": [ - "code_ref", - "header bytes", - "wanted bytes", - "block address" + "rg -n 'pvPortMalloc|vPortFree|vPortGetHeapStats|ucHeap' src/tasks/task03_freertos_heap4.c", + "rg -n 'TASK03_KERNEL_SOURCES|HEAP4_SOURCE' Makefile" ] }, { "id": "code.heap4", "kind": "code", - "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" - ], - "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" - ], - "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" - ], "expected_observations": [ "heap_4 keeps metadata inside the arena", "free blocks form one address-ordered intrusive list" @@ -129,26 +119,60 @@ "list link", "block size", "arena address" + ], + "prerequisites": [ + "FreeRTOS-Kernel V11.3.0 available" + ], + "layout": [ + "ucHeap", + "BlockLink_t", + "xStart", + "pxEnd" + ], + "commands": [ + "rg -n 'BlockLink_t|prvHeapInit|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' ${FREERTOS_KERNEL_PATH:-/opt/FreeRTOS-Kernel}/portable/MemMang/heap_4.c" ] }, { - "id": "run.fragmented", + "id": "run.timeline", "kind": "run", + "expected_observations": [ + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" + ], + "assertions": [ + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" + ], + "evidence_fields": [ + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" + ], "prerequisites": [ "clean Hazard3 RAM", "task03 image loaded" ], "layout": [ - "source", - "free-list stats", - "ucHeap memory", - "registers" + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" ], "commands": [ - "break heap4_fragmented_checkpoint", - "print g_fragmented_stats", - "x/64bx ucHeap" - ], + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" + ] + }, + { + "id": "run.fragmented", + "kind": "run", "expected_observations": [ "A and C are free while B remains allocated", "the free list contains two blocks" @@ -162,11 +186,76 @@ "largest block", "free bytes", "heap bytes" + ], + "prerequisites": [ + "clean Hazard3 RAM", + "task03 image loaded" + ], + "layout": [ + "source", + "free-list stats", + "ucHeap memory", + "registers" + ], + "commands": [ + "break heap4_fragmented_checkpoint", + "print g_fragmented_stats", + "print g_fragmented_free", + "x/96bx ucHeap" + ] + }, + { + "id": "run.coalescing", + "kind": "run", + "expected_observations": [ + "the replay stops after free(C), immediately before free(B)", + "inside prvInsertBlockIntoFreeList the previous block is merged before the next block" + ], + "assertions": [ + "pxIterator < pxBlockToInsert < pxIterator->pxNextFreeBlock", + "the left adjacency test is evaluated before the right adjacency test" + ], + "evidence_fields": [ + "pxIterator", + "pxBlockToInsert", + "left end address", + "right start address" + ], + "prerequisites": [ + "task01.fragmented replay ready" + ], + "layout": [ + "application call vPortFree(g_b)", + "prvInsertBlockIntoFreeList", + "free-list links", + "ucHeap addresses" + ], + "commands": [ + "tbreak prvInsertBlockIntoFreeList", + "continue", + "print pxIterator", + "print pxBlockToInsert", + "next" ] }, { "id": "run.coalesced", "kind": "run", + "expected_observations": [ + "freeing B joins both neighbours", + "the arena returns to one reusable block" + ], + "assertions": [ + "final free equals initial free", + "one free block is also the largest block", + "minimum-ever does not rise after free" + ], + "evidence_fields": [ + "final free", + "largest block", + "minimum-ever", + "free blocks" + ], "prerequisites": [ "fragmented checkpoint reached" ], @@ -177,30 +266,66 @@ "PASS" ], "commands": [ - "break task03_debug_checkpoint", + "break heap4_coalesced_checkpoint", "print g_final_stats", - "print g_task03_pass" - ], + "print g_final_free", + "print g_minimum_ever_free" + ] + }, + { + "id": "run.verified", + "kind": "run", "expected_observations": [ - "freeing B joins both neighbours", - "the arena returns to one reusable block" + "the oversized request returns NULL", + "the malloc-failed hook runs once without corrupting the recovered arena" ], "assertions": [ - "final free equals initial free", - "minimum-ever does not rise after free", - "oversized allocation returns NULL and calls the hook once" + "g_oom_is_null equals 1", + "g_malloc_failed_hooks equals 1", + "g_assert_failures equals 0", + "g_task03_pass equals 1" ], "evidence_fields": [ - "final free", - "largest block", - "minimum-ever", - "OOM hook", + "OOM result", + "hook count", + "assert count", "PASS" + ], + "prerequisites": [ + "coalesced checkpoint reproducible" + ], + "layout": [ + "final stats", + "OOM result", + "hook", + "PASS" + ], + "commands": [ + "break task03_debug_checkpoint", + "print g_too_large", + "print g_malloc_failed_hooks", + "print g_assert_failures", + "print g_task03_pass" ] }, { "id": "code.identity", "kind": "code", + "expected_observations": [ + "upstream heap_4 symbols are linked", + "checkpoint and ucHeap symbols remain observable" + ], + "assertions": [ + "pvPortMalloc and vPortFree are present", + "prvInsertBlockIntoFreeList is present", + "all eight replay checkpoint symbols are present" + ], + "evidence_fields": [ + "source blob", + "ELF SHA256", + "image SHA256", + "symbol" + ], "prerequisites": [ "built ELF" ], @@ -211,26 +336,155 @@ ], "commands": [ "tests/check_task03_elf.sh build/task03_freertos_heap4/prog.elf" - ], - "expected_observations": [ - "upstream heap_4 symbols are linked", - "checkpoint and ucHeap symbols remain observable" - ], - "assertions": [ - "pvPortMalloc and vPortFree are present", - "prvInsertBlockIntoFreeList is present" - ], - "evidence_fields": [ - "source blob", - "ELF SHA256", - "image SHA256", - "symbol" ] } ], "checkpoints": { - "task01.fragmented": { + "task01.reset": { "event_id": "E01", + "stop": { + "symbol": "heap4_reset_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_initial_stats.xNumberOfFreeBlocks", + "equals": 1 + }, + { + "expr": "g_initial_stats.xSizeOfLargestFreeBlockInBytes == g_initial_free", + "equals": 1 + }, + { + "expr": "g_initial_free", + "equals": 4080 + } + ] + } + }, + "task01.alloc-a": { + "event_id": "E02", + "stop": { + "symbol": "heap4_alloc_a_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_a != 0", + "equals": 1 + }, + { + "expr": "g_a_aligned", + "equals": 1 + }, + { + "expr": "g_a_consumed", + "equals": 48 + }, + { + "expr": "g_after_a_stats.xNumberOfFreeBlocks", + "equals": 1 + }, + { + "expr": "g_after_a_free", + "equals": 4032 + } + ] + } + }, + "task01.alloc-b": { + "event_id": "E03", + "stop": { + "symbol": "heap4_alloc_b_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_b != 0", + "equals": 1 + }, + { + "expr": "g_b_aligned", + "equals": 1 + }, + { + "expr": "g_b_consumed", + "equals": 64 + }, + { + "expr": "g_after_b_free < g_after_a_free", + "equals": 1 + }, + { + "expr": "g_after_b_free", + "equals": 3968 + } + ] + } + }, + "task01.alloc-c": { + "event_id": "E04", + "stop": { + "symbol": "heap4_alloc_c_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_c != 0", + "equals": 1 + }, + { + "expr": "g_c_aligned", + "equals": 1 + }, + { + "expr": "g_c_consumed", + "equals": 32 + }, + { + "expr": "g_allocations_aligned", + "equals": 1 + }, + { + "expr": "g_after_allocations", + "equals": 3936 + } + ] + } + }, + "task01.free-a": { + "event_id": "E05", + "stop": { + "symbol": "heap4_free_a_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ + { + "expr": "g_after_free_a_stats.xNumberOfFreeBlocks", + "equals": 2 + }, + { + "expr": "g_after_free_a == g_after_allocations + g_a_consumed", + "equals": 1 + }, + { + "expr": "g_after_free_a_stats.xAvailableHeapSpaceInBytes > g_after_free_a_stats.xSizeOfLargestFreeBlockInBytes", + "equals": 1 + }, + { + "expr": "g_after_free_a", + "equals": 3984 + } + ] + } + }, + "task01.fragmented": { + "event_id": "E06", "stop": { "symbol": "heap4_fragmented_checkpoint", "offset": 0 @@ -242,20 +496,24 @@ "equals": 2 }, { - "expr": "g_initial_free > g_after_allocations", + "expr": "g_fragmented_free == g_after_free_a + g_c_consumed", "equals": 1 }, { - "expr": "g_allocations_aligned", + "expr": "g_fragmented_stats.xAvailableHeapSpaceInBytes > g_fragmented_stats.xSizeOfLargestFreeBlockInBytes", "equals": 1 + }, + { + "expr": "g_fragmented_free", + "equals": 4016 } ] } }, "task01.coalesced": { - "event_id": "E02", + "event_id": "E07", "stop": { - "symbol": "task03_debug_checkpoint", + "symbol": "heap4_coalesced_checkpoint", "offset": 0 }, "verify": { @@ -268,13 +526,48 @@ "expr": "g_final_free == g_initial_free", "equals": 1 }, + { + "expr": "g_final_stats.xSizeOfLargestFreeBlockInBytes == g_initial_free", + "equals": 1 + }, + { + "expr": "g_minimum_ever_free <= g_after_allocations", + "equals": 1 + }, + { + "expr": "g_final_free", + "equals": 4080 + } + ] + } + }, + "task01.verified": { + "event_id": "E08", + "stop": { + "symbol": "task03_debug_checkpoint", + "offset": 0 + }, + "verify": { + "expressions": [ { "expr": "g_oom_is_null", "equals": 1 }, + { + "expr": "g_malloc_failed_hooks", + "equals": 1 + }, + { + "expr": "g_assert_failures", + "equals": 0 + }, { "expr": "g_task03_pass", "equals": 1 + }, + { + "expr": "g_rv32_layout_expected", + "equals": 1 } ] } @@ -306,9 +599,9 @@ "number": 1, "label": "aplikacja żąda i zwalnia bajty", "mode": "CODE", - "strategy_ref": "code.heap4", + "strategy_ref": "code.boundary", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:78", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", "description": "Aplikacja zna wyłącznie publiczne API i wskaźniki payloadu.", "evidence": "trzy żądania 24, 40 i 16 bajtów" }, @@ -317,9 +610,9 @@ "number": 2, "label": "FreeRTOS wystawia malloc, free i statystyki", "mode": "CODE", - "strategy_ref": "code.heap4", + "strategy_ref": "code.boundary", "svg_label": "02", - "code_ref": "src/tasks/task03_freertos_heap4.c:90", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", "description": "API oddziela eksperyment od prywatnej listy bloków.", "evidence": "pvPortMalloc, vPortFree, vPortGetHeapStats" }, @@ -330,16 +623,16 @@ "mode": "CODE", "strategy_ref": "code.heap4", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:70", - "description": "Prywatny mechanizm wybiera, dzieli i scala wolne bloki.", - "evidence": "reset i inicjalizacja listy" + "code_ref": "UPSTREAM.md:1", + "description": "Prywatny mechanizm wybiera, dzieli i scala wolne bloki; strategia otwiera prawdziwy heap_4.c.", + "evidence": "prvHeapInit i prvInsertBlockIntoFreeList" }, { "id": "arena", "number": 4, "label": "ucHeap jest jedną ograniczoną areną", "mode": "CODE", - "strategy_ref": "code.heap4", + "strategy_ref": "code.boundary", "svg_label": "04", "code_ref": "src/tasks/task03_freertos_heap4.c:11", "description": "Metadane i payload znajdują się w tej samej statycznej tablicy.", @@ -385,68 +678,78 @@ { "id": "header", "number": 1, - "label": "nagłówek przechowuje next i size", + "label": "nagłówek RV32 przechowuje next i size", "mode": "CODE", - "strategy_ref": "code.model", + "strategy_ref": "code.heap4", "svg_label": "01", - "code_ref": "src/tasks/heap4_model.h:11", - "description": "ModelBlock pokazuje minimalny kontrakt metadanych heap_4.", - "evidence": "dwa słowa metadanych" + "code_ref": "UPSTREAM.md:1", + "description": "Prawdziwy BlockLink_t zawiera wskaźnik i size_t, po 4 bajty na RV32; port wyrównuje nagłówek do 16 bajtów.", + "evidence": "sizeof(BlockLink_t)=8; portBYTE_ALIGNMENT=16; xHeapStructSize=16" }, { "id": "alignment", "number": 2, - "label": "żądanie obejmuje nagłówek i wyrównanie", - "mode": "CODE", - "strategy_ref": "code.model", + "label": "A(24) obejmuje nagłówek i wyrównanie", + "mode": "RUN", + "event_id": "E02", + "strategy_ref": "run.timeline", "svg_label": "02", - "code_ref": "src/tasks/task01_first_fit_split.c:3", - "description": "13 bajtów payloadu zajmuje 32 bajty całego bloku.", - "evidence": "header=16, wanted=32" + "code_ref": "src/tasks/task03_freertos_heap4.c:137", + "snapshot_ref": "task01.alloc-a", + "description": "Różnica licznika wolnych bajtów mierzy cały blok, nie sam payload.", + "evidence": "g_a_consumed = 48; g_a_aligned = 1" }, { "id": "split", "number": 3, "label": "split pozostawia osobny wolny blok", - "mode": "CODE", - "strategy_ref": "code.model", + "mode": "RUN", + "event_id": "E02", + "strategy_ref": "run.timeline", "svg_label": "03", - "code_ref": "src/tasks/task01_first_fit_split.c:43", - "description": "Reszta zachowuje własny nagłówek i trafia na listę wolnych.", - "evidence": "32 + 224 = 256" + "code_ref": "src/tasks/task03_freertos_heap4.c:137", + "snapshot_ref": "task01.alloc-a", + "description": "Po pierwszym first-fit pozostała część areny nadal jest jednym wolnym blokiem.", + "evidence": "free = 4032; free blocks = 1" }, { "id": "address-order", "number": 4, "label": "lista jest uporządkowana rosnącymi adresami", - "mode": "CODE", - "strategy_ref": "code.model", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.fragmented", "svg_label": "04", - "code_ref": "src/tasks/task02_address_order_coalesce.c:29", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", + "snapshot_ref": "task01.fragmented", "description": "Pozycja w liście ujawnia bezpośredniego poprzednika i następnika.", - "evidence": "previous < block < current" - }, - { - "id": "right-join", - "number": 5, - "label": "blok scala się z prawym sąsiadem", - "mode": "CODE", - "strategy_ref": "code.model", - "svg_label": "05", - "code_ref": "src/tasks/task02_address_order_coalesce.c:40", - "description": "Koniec zwalnianego bloku równy adresowi current oznacza ciągłość.", - "evidence": "block + size == current" + "evidence": "g_a < g_b < g_c; dwa wolne obszary" }, { "id": "left-join", + "number": 5, + "label": "heap_4 scala najpierw poprzedni blok", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.coalescing", + "svg_label": "05", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", + "snapshot_ref": "task01.fragmented", + "description": "Replay E06, tymczasowy breakpoint i step w prywatnej funkcji pokazują pierwszy test ciągłości.", + "evidence": "previous + previous.size == inserted" + }, + { + "id": "right-join", "number": 6, - "label": "wynik scala się z lewym sąsiadem", - "mode": "CODE", - "strategy_ref": "code.model", + "label": "następnie scala prawy blok", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.coalescing", "svg_label": "06", - "code_ref": "src/tasks/task02_address_order_coalesce.c:48", - "description": "Drugi test domyka dwustronne scalanie w jeden blok.", - "evidence": "previous + size == block" + "code_ref": "src/tasks/task03_freertos_heap4.c:173", + "snapshot_ref": "task01.fragmented", + "description": "Drugi test wykorzystuje już powiększony lewy blok i domyka scalenie areny.", + "evidence": "merged + merged.size == current" } ] } @@ -461,7 +764,7 @@ "order": 50, "orientation": "landscape", "description": "Jeden przebieg A/B/C przechodzi od pustej areny przez trzy przydziały i dwa wolne obszary do ponownie scalonego bloku.", - "content_tex": "Uczeń najpierw przewiduje liczbę wolnych bloków. RUN odtwarza dwa stabilne stany: po zwolnieniu A i C oraz po zwolnieniu B.", + "content_tex": "Uczeń przewiduje układ bloków, a następnie odtwarza osiem deterministycznych stanów tego samego przebiegu Hazard3.", "assets": [ { "stem": "a5-flow", @@ -469,7 +772,6 @@ "caption": "A5 FLOW — inicjalizacja, A/B/C, fragmentacja, dwustronne scalenie i OOM.", "label": "fig:a5-flow", "alt": "A5 · pełny przebieg heap_4", - "diagram_kind": "sequence", "phases": [ { "id": "replay", @@ -479,97 +781,110 @@ "id": "reset", "number": 1, "label": "reset i inicjalizacja areny", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E01", + "strategy_ref": "run.timeline", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:70", - "description": "Pierwsze małe żądanie inicjalizuje sentinele i listę.", - "evidence": "initial free = 4080" + "code_ref": "src/tasks/task03_freertos_heap4.c:127", + "snapshot_ref": "task01.reset", + "description": "Próbne żądanie inicjalizuje sentinele; po jego zwolnieniu arena ma jeden blok.", + "evidence": "free = largest = 4080; blocks = 1" }, { "id": "alloc-a", "number": 2, "label": "first-fit przydziela A", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E02", + "strategy_ref": "run.timeline", "svg_label": "02", - "code_ref": "src/tasks/task03_freertos_heap4.c:78", + "code_ref": "src/tasks/task03_freertos_heap4.c:137", + "snapshot_ref": "task01.alloc-a", "description": "Pierwszy wystarczający blok zostaje rozdzielony.", - "evidence": "A payload = 24" + "evidence": "A=24; consumed=48; free=4032" }, { - "id": "alloc-bc", + "id": "alloc-b", "number": 3, - "label": "kolejne split tworzą B i C", - "mode": "CODE", - "strategy_ref": "code.heap4", + "label": "kolejny split tworzy B", + "mode": "RUN", + "event_id": "E03", + "strategy_ref": "run.timeline", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:79", - "description": "B i C zajmują kolejne fragmenty tego samego wolnego bloku.", - "evidence": "after allocations = 3952" + "code_ref": "src/tasks/task03_freertos_heap4.c:145", + "snapshot_ref": "task01.alloc-b", + "description": "B zajmuje następny fragment tej samej reszty.", + "evidence": "B=40; consumed=64; free=3968" }, { - "id": "free-ac", + "id": "alloc-c", "number": 4, - "label": "zwolnij A i C, pozostaw B", - "mode": "CODE", - "strategy_ref": "code.heap4", + "label": "trzeci split tworzy C", + "mode": "RUN", + "event_id": "E04", + "strategy_ref": "run.timeline", "svg_label": "04", - "code_ref": "src/tasks/task03_freertos_heap4.c:88", - "description": "C scala się z prawą resztą, ale B oddziela ją od A.", - "evidence": "dwa wolne bloki" + "code_ref": "src/tasks/task03_freertos_heap4.c:153", + "snapshot_ref": "task01.alloc-c", + "description": "A, B i C są wyrównane, a za nimi pozostaje jedna wolna reszta.", + "evidence": "C=16; consumed=32; free=3936" + }, + { + "id": "free-a", + "number": 5, + "label": "zwolnij A, pozostaw B i C", + "mode": "RUN", + "event_id": "E05", + "strategy_ref": "run.timeline", + "svg_label": "05", + "code_ref": "src/tasks/task03_freertos_heap4.c:163", + "snapshot_ref": "task01.free-a", + "description": "Wolny A i końcowa reszta są rozdzielone przez B i C.", + "evidence": "blocks=2; free=3984" }, { "id": "fragmented", - "number": 5, - "label": "checkpoint fragmentacji", - "mode": "RUN", - "event_id": "E01", - "strategy_ref": "run.fragmented", - "svg_label": "05", - "code_ref": "src/tasks/task03_freertos_heap4.c:91", - "snapshot_ref": "task01.fragmented", - "description": "GDB zatrzymuje program przy dwóch wolnych blokach.", - "evidence": "xNumberOfFreeBlocks = 2" - }, - { - "id": "free-b", "number": 6, - "label": "zwolnij B między dwoma sąsiadami", - "mode": "CODE", - "strategy_ref": "code.heap4", + "label": "zwolnij C, pozostaw B", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.fragmented", "svg_label": "06", - "code_ref": "src/tasks/task03_freertos_heap4.c:93", - "description": "Wstawienie adresowe umożliwia dwa testy ciągłości.", - "evidence": "A + B + C + reszta są ciągłe" + "code_ref": "src/tasks/task03_freertos_heap4.c:168", + "snapshot_ref": "task01.fragmented", + "description": "C scala się z prawą resztą, ale B nadal rozdziela dwa wolne obszary.", + "evidence": "blocks=2; free=4016; free>largest" }, { "id": "coalesced", "number": 7, - "label": "arena wraca do jednego bloku", + "label": "zwolnij B i scal oba sąsiednie bloki", "mode": "RUN", - "event_id": "E02", + "event_id": "E07", "strategy_ref": "run.coalesced", "svg_label": "07", - "code_ref": "src/tasks/task03_freertos_heap4.c:96", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", "snapshot_ref": "task01.coalesced", - "description": "Finalne statystyki dowodzą pełnego odzyskania areny.", - "evidence": "final free = initial free; blocks = 1" + "description": "Scalenie lewego, a potem prawego sąsiada przywraca jeden blok.", + "evidence": "free=largest=initial=4080; blocks=1" }, { "id": "oom", "number": 8, "label": "zbyt duże żądanie kończy się NULL", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E08", + "strategy_ref": "run.verified", "svg_label": "08", - "code_ref": "src/tasks/task03_freertos_heap4.c:98", + "code_ref": "src/tasks/task03_freertos_heap4.c:179", + "snapshot_ref": "task01.verified", "description": "Kontrolowany OOM nie narusza listy i wywołuje hook dokładnie raz.", - "evidence": "NULL, hooks=1, asserts=0" + "evidence": "NULL; hooks=1; asserts=0; PASS=1" } ] } - ] + ], + "diagram_kind": "sequence" } ] }, @@ -597,33 +912,37 @@ "id": "free", "number": 1, "label": "wolny blok należy do listy", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E01", + "strategy_ref": "run.timeline", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:70", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", + "snapshot_ref": "task01.reset", "description": "Stan początkowy zawiera jeden największy wolny blok.", - "evidence": "initial free = largest free" + "evidence": "initial free = largest free = 4080" }, { "id": "allocated", "number": 2, "label": "przydzielony blok znika z listy wolnych", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E04", + "strategy_ref": "run.timeline", "svg_label": "02", - "code_ref": "src/tasks/task03_freertos_heap4.c:78", + "code_ref": "src/tasks/task03_freertos_heap4.c:153", + "snapshot_ref": "task01.alloc-c", "description": "Payload jest wyrównany, a bieżąca wolna pamięć maleje.", - "evidence": "all payload pointers aligned" + "evidence": "all payload pointers aligned; free=3936" }, { "id": "fragmented-state", "number": 3, "label": "dwa wolne bloki nie są jednym dużym blokiem", "mode": "RUN", - "event_id": "E01", + "event_id": "E06", "strategy_ref": "run.fragmented", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:90", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", "snapshot_ref": "task01.fragmented", "description": "Suma wolnego miejsca nie gwarantuje jednego dużego przydziału.", "evidence": "free blocks = 2" @@ -633,10 +952,10 @@ "number": 4, "label": "scalenie przywraca jeden największy blok", "mode": "RUN", - "event_id": "E02", + "event_id": "E07", "strategy_ref": "run.coalesced", "svg_label": "04", - "code_ref": "src/tasks/task03_freertos_heap4.c:94", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", "snapshot_ref": "task01.coalesced", "description": "Current free i largest wracają do wartości początkowej.", "evidence": "free blocks = 1" @@ -645,10 +964,12 @@ "id": "minimum-ever", "number": 5, "label": "minimum-ever zachowuje najniższy poziom", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E08", + "strategy_ref": "run.verified", "svg_label": "05", - "code_ref": "src/tasks/task03_freertos_heap4.c:95", + "code_ref": "src/tasks/task03_freertos_heap4.c:179", + "snapshot_ref": "task01.verified", "description": "Historyczne minimum nie zwiększa się po odzyskaniu pamięci.", "evidence": "minimum-ever <= after allocations" } @@ -664,7 +985,7 @@ "title": "Dowód w Hazard3 i ELF", "order": 70, "orientation": "landscape", - "description": "Ten sam artefakt łączy źródło, symbole ELF, dwa checkpointy, pamięć ucHeap i końcowe asercje.", + "description": "Ten sam artefakt łączy źródło, symbole ELF, osiem checkpointów, pamięć ucHeap i końcowe asercje.", "content_tex": "Snapshot jest dowodem tylko wtedy, gdy zawiera tożsamość artefaktu, pozycję programu i wartości, które rozstrzygają hipotezę.", "assets": [ { @@ -685,7 +1006,7 @@ "mode": "CODE", "strategy_ref": "code.identity", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:62", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", "description": "Blob źródła jest częścią tożsamości karty.", "evidence": "source git blob" }, @@ -705,22 +1026,24 @@ "number": 3, "label": "checkpoint pokazuje dwa wolne bloki", "mode": "RUN", - "event_id": "E01", + "event_id": "E06", "strategy_ref": "run.fragmented", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:91", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", "snapshot_ref": "task01.fragmented", "description": "Neovim, GDB i pamięć zatrzymują się na tym samym stanie.", - "evidence": "blocks=2 and aligned=1" + "evidence": "blocks=2 and free>largest" }, { "id": "memory", "number": 4, "label": "ucHeap ujawnia nagłówki i payload", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.fragmented", "svg_label": "04", "code_ref": "src/tasks/task03_freertos_heap4.c:11", + "snapshot_ref": "task01.fragmented", "description": "Widok bajtów łączy diagram z realnym układem areny.", "evidence": "aligned arena and in-band metadata" }, @@ -729,11 +1052,11 @@ "number": 5, "label": "checkpoint końcowy dowodzi odzyskania", "mode": "RUN", - "event_id": "E02", - "strategy_ref": "run.coalesced", + "event_id": "E08", + "strategy_ref": "run.verified", "svg_label": "05", - "code_ref": "src/tasks/task03_freertos_heap4.c:111", - "snapshot_ref": "task01.coalesced", + "code_ref": "src/tasks/task03_freertos_heap4.c:179", + "snapshot_ref": "task01.verified", "description": "Jedna ramka łączy stats, OOM, hook i PASS.", "evidence": "final=initial, blocks=1, pass=1" } @@ -748,14 +1071,14 @@ "model_label": "Model bloków heap_4", "model": "Uczeń wyjaśnia nagłówek, wyrównanie, first-fit, split, adresową listę wolnych bloków i dwustronne coalescing.", "replay_label": "Fragmentacja i odzyskanie areny", - "replay": "Uczeń odtwarza dwa checkpointy Hazard3 i odróżnia current free, largest free block oraz minimum-ever.", - "criterion": "Model 13 -> 32 bajty; poprawna predykcja dwóch wolnych bloków po free(A,C) i jednego po free(B); final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.", + "replay": "Uczeń odtwarza osiem checkpointów Hazard3 i odróżnia current free, largest free block oraz minimum-ever.", + "criterion": "Na RV32 BlockLink_t ma 8 bajtów, lecz 16-bajtowe wyrównanie portu daje xHeapStructSize=16; A/B/C zużywają 48/64/32 bajty; po free(A,C) są dwa wolne bloki, po free(B) jeden; final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.", "requirement": "Analiza i weryfikacja mechaniki dynamicznej alokacji heap_4 w FreeRTOS C na RV32I/Hazard3." }, "task": { "short_label": "mechanika heap_4", "title": "Predict and prove reusable heap_4 blocks", - "prompt_tex": "Przewidź układ bloków po alloc A/B/C, następnie po free(A,C) i free(B). Odtwórz oba checkpointy i udowodnij, że arena została scalona bez utraty minimum-ever.", + "prompt_tex": "Przewidź układ bloków po alloc A/B/C, następnie po free(A), free(C) i free(B). Odtwórz checkpointy E01--E08 i udowodnij, że arena została scalona bez utraty minimum-ever.", "conclusion_tex": "heap\\_4 odzyskuje pamięć dzięki metadanym w arenie, adresowo uporządkowanej liście i scalaniu sąsiadów. Suma wolnych bajtów nie zastępuje informacji o największym bloku, a minimum-ever jest historią, nie bieżącym stanem.", "flow": [ { @@ -766,8 +1089,8 @@ "steps": [ { "id": "size", - "title": "Policz rozmiar bloku.", - "content_tex": "Dodaj nagłówek do 13 bajtów i wyrównaj wynik do ośmiu." + "title": "Policz rozmiary całych bloków.", + "content_tex": "Rozróżnij surowy BlockLink\\_t (8 bajtów) od xHeapStructSize (16 bajtów), dodaj nagłówek do żądań 24, 40 i 16 bajtów, a następnie wyrównaj wynik do 16." }, { "id": "list", @@ -780,17 +1103,22 @@ "kind": "block", "id": "replay", "title": "B — replay Hazard3", - "content_tex": "Powiąż diagram z dwoma deterministycznymi checkpointami.", + "content_tex": "Powiąż każdy stan diagramu z deterministycznym checkpointem E01--E08.", "steps": [ { - "id": "fragmented", - "title": "Sprawdź E01.", - "content_tex": "Porównaj liczbę wolnych bloków, największy blok i bieżące wolne bajty." + "id": "allocate", + "title": "Sprawdź E01--E04.", + "content_tex": "Potwierdź wartości 4080, 4032, 3968 i 3936 oraz zużycie 48/64/32 bajtów." }, { - "id": "coalesced", - "title": "Sprawdź E02.", - "content_tex": "Udowodnij pełne scalenie, zachowanie minimum-ever i kontrolowany OOM." + "id": "release", + "title": "Sprawdź E05--E07.", + "content_tex": "Porównaj liczbę wolnych bloków i udowodnij scalenie poprzedniego, a potem następnego sąsiada." + }, + { + "id": "verify", + "title": "Sprawdź E08.", + "content_tex": "Udowodnij zachowanie minimum-ever, kontrolowany OOM, brak asercji i PASS=1." } ] }, diff --git a/src/tasks/task03_freertos_heap4.c b/src/tasks/task03_freertos_heap4.c index a73eb93..14ee8fe 100644 --- a/src/tasks/task03_freertos_heap4.c +++ b/src/tasks/task03_freertos_heap4.c @@ -10,16 +10,37 @@ uint8_t ucHeap[configTOTAL_HEAP_SIZE] __attribute__((aligned(portBYTE_ALIGNMENT))); +HeapStats_t g_initial_stats; +HeapStats_t g_after_a_stats; +HeapStats_t g_after_b_stats; +HeapStats_t g_after_allocations_stats; +HeapStats_t g_after_free_a_stats; HeapStats_t g_fragmented_stats; HeapStats_t g_final_stats; volatile size_t g_initial_free; +volatile size_t g_after_a_free; +volatile size_t g_after_b_free; volatile size_t g_after_allocations; +volatile size_t g_after_free_a; +volatile size_t g_fragmented_free; volatile size_t g_final_free; volatile size_t g_minimum_ever_free; +volatile size_t g_a_consumed; +volatile size_t g_b_consumed; +volatile size_t g_c_consumed; +void * volatile g_probe; +void * volatile g_a; +void * volatile g_b; +void * volatile g_c; +void * volatile g_too_large; +volatile int g_a_aligned; +volatile int g_b_aligned; +volatile int g_c_aligned; volatile int g_allocations_aligned; volatile int g_oom_is_null; volatile int g_malloc_failed_hooks; volatile int g_assert_failures; +volatile int g_rv32_layout_expected; volatile int g_task03_pass; void vApplicationMallocFailedHook(void) @@ -45,6 +66,41 @@ BaseType_t xTaskResumeAll(void) } #endif +__attribute__((noinline)) void heap4_reset_checkpoint(void) +{ +#if defined(__GNUC__) + __asm__ volatile("" ::: "memory"); +#endif +} + +__attribute__((noinline)) void heap4_alloc_a_checkpoint(void) +{ +#if defined(__GNUC__) + __asm__ volatile("" ::: "memory"); +#endif +} + +__attribute__((noinline)) void heap4_alloc_b_checkpoint(void) +{ +#if defined(__GNUC__) + __asm__ volatile("" ::: "memory"); +#endif +} + +__attribute__((noinline)) void heap4_alloc_c_checkpoint(void) +{ +#if defined(__GNUC__) + __asm__ volatile("" ::: "memory"); +#endif +} + +__attribute__((noinline)) void heap4_free_a_checkpoint(void) +{ +#if defined(__GNUC__) + __asm__ volatile("" ::: "memory"); +#endif +} + __attribute__((noinline)) void heap4_fragmented_checkpoint(void) { #if defined(__GNUC__) @@ -52,6 +108,13 @@ __attribute__((noinline)) void heap4_fragmented_checkpoint(void) #endif } +__attribute__((noinline)) void heap4_coalesced_checkpoint(void) +{ +#if defined(__GNUC__) + __asm__ volatile("" ::: "memory"); +#endif +} + __attribute__((noinline)) void task03_debug_checkpoint(void) { #if defined(__GNUC__) @@ -61,48 +124,88 @@ __attribute__((noinline)) void task03_debug_checkpoint(void) int main(void) { - void *probe; - void *a; - void *b; - void *c; - void *too_large; - vPortHeapResetState(); - probe = pvPortMalloc(1U); - if (probe != NULL) + g_probe = pvPortMalloc(1U); + if (g_probe != NULL) { - vPortFree(probe); + vPortFree(g_probe); } g_initial_free = xPortGetFreeHeapSize(); + vPortGetHeapStats(&g_initial_stats); + heap4_reset_checkpoint(); - a = pvPortMalloc(24U); - b = pvPortMalloc(40U); - c = pvPortMalloc(16U); + g_a = pvPortMalloc(24U); + g_after_a_free = xPortGetFreeHeapSize(); + g_a_consumed = g_initial_free - g_after_a_free; + g_a_aligned = + g_a != NULL && ((uintptr_t)g_a % portBYTE_ALIGNMENT) == 0U; + vPortGetHeapStats(&g_after_a_stats); + heap4_alloc_a_checkpoint(); + + g_b = pvPortMalloc(40U); + g_after_b_free = xPortGetFreeHeapSize(); + g_b_consumed = g_after_a_free - g_after_b_free; + g_b_aligned = + g_b != NULL && ((uintptr_t)g_b % portBYTE_ALIGNMENT) == 0U; + vPortGetHeapStats(&g_after_b_stats); + heap4_alloc_b_checkpoint(); + + g_c = pvPortMalloc(16U); g_after_allocations = xPortGetFreeHeapSize(); + g_c_consumed = g_after_b_free - g_after_allocations; + g_c_aligned = + g_c != NULL && ((uintptr_t)g_c % portBYTE_ALIGNMENT) == 0U; g_allocations_aligned = - a != NULL && b != NULL && c != NULL && - ((uintptr_t)a % portBYTE_ALIGNMENT) == 0U && - ((uintptr_t)b % portBYTE_ALIGNMENT) == 0U && - ((uintptr_t)c % portBYTE_ALIGNMENT) == 0U; + g_a_aligned && g_b_aligned && g_c_aligned; + vPortGetHeapStats(&g_after_allocations_stats); + heap4_alloc_c_checkpoint(); - vPortFree(a); - vPortFree(c); + vPortFree(g_a); + g_after_free_a = xPortGetFreeHeapSize(); + vPortGetHeapStats(&g_after_free_a_stats); + heap4_free_a_checkpoint(); + + vPortFree(g_c); + g_fragmented_free = xPortGetFreeHeapSize(); vPortGetHeapStats(&g_fragmented_stats); heap4_fragmented_checkpoint(); - vPortFree(b); + vPortFree(g_b); g_final_free = xPortGetFreeHeapSize(); g_minimum_ever_free = xPortGetMinimumEverFreeHeapSize(); vPortGetHeapStats(&g_final_stats); + heap4_coalesced_checkpoint(); - too_large = pvPortMalloc(configTOTAL_HEAP_SIZE * 2U); - g_oom_is_null = too_large == NULL; + g_too_large = pvPortMalloc(configTOTAL_HEAP_SIZE * 2U); + g_oom_is_null = g_too_large == NULL; +#if defined(__riscv) && (__riscv_xlen == 32) + g_rv32_layout_expected = + portBYTE_ALIGNMENT == 16U && + g_initial_free == 4080U && + g_after_a_free == 4032U && g_a_consumed == 48U && + g_after_b_free == 3968U && g_b_consumed == 64U && + g_after_allocations == 3936U && g_c_consumed == 32U && + g_after_free_a == 3984U && + g_fragmented_free == 4016U && + g_final_free == 4080U; +#else + g_rv32_layout_expected = 1; +#endif g_task03_pass = - probe != NULL && g_allocations_aligned && + g_probe != NULL && g_allocations_aligned && + g_rv32_layout_expected && + g_initial_stats.xNumberOfFreeBlocks == 1U && + g_after_a_free < g_initial_free && + g_after_b_free < g_after_a_free && g_initial_free > g_after_allocations && + g_after_free_a > g_after_allocations && + g_fragmented_free > g_after_free_a && g_final_free == g_initial_free && g_minimum_ever_free <= g_after_allocations && + g_after_free_a_stats.xNumberOfFreeBlocks == 2U && g_fragmented_stats.xNumberOfFreeBlocks == 2U && + g_fragmented_stats.xAvailableHeapSpaceInBytes > + g_fragmented_stats.xSizeOfLargestFreeBlockInBytes && g_final_stats.xNumberOfFreeBlocks == 1U && g_final_stats.xSizeOfLargestFreeBlockInBytes == g_initial_free && g_oom_is_null && g_malloc_failed_hooks == 1 && @@ -111,11 +214,15 @@ int main(void) task03_debug_checkpoint(); #if defined(HOST_PRINTF) - printf("initial=%zu after=%zu fragmented=%zu final=%zu min=%zu " - "aligned=%d oom=%d hooks=%d asserts=%d pass=%d\n", - g_initial_free, g_after_allocations, - g_fragmented_stats.xNumberOfFreeBlocks, g_final_free, - g_minimum_ever_free, g_allocations_aligned, g_oom_is_null, + printf("initial=%zu after_a=%zu after_b=%zu after_c=%zu " + "free_a=%zu fragmented=%zu final=%zu min=%zu " + "consumed=%zu/%zu/%zu aligned=%d oom=%d hooks=%d " + "asserts=%d pass=%d\n", + g_initial_free, g_after_a_free, g_after_b_free, + g_after_allocations, g_after_free_a, g_fragmented_free, + g_final_free, g_minimum_ever_free, + g_a_consumed, g_b_consumed, g_c_consumed, + g_allocations_aligned, g_oom_is_null, g_malloc_failed_hooks, g_assert_failures, g_task03_pass); #endif return g_task03_pass ? 0 : 1; diff --git a/tests/check_task03_elf.sh b/tests/check_task03_elf.sh index 304a752..fd4dcf2 100755 --- a/tests/check_task03_elf.sh +++ b/tests/check_task03_elf.sh @@ -8,8 +8,13 @@ objdump="${prefix}objdump" test -s "$elf" for symbol in pvPortMalloc vPortFree prvInsertBlockIntoFreeList ucHeap \ - heap4_fragmented_checkpoint task03_debug_checkpoint g_task03_pass; do + heap4_reset_checkpoint heap4_alloc_a_checkpoint \ + heap4_alloc_b_checkpoint heap4_alloc_c_checkpoint \ + heap4_free_a_checkpoint heap4_fragmented_checkpoint \ + heap4_coalesced_checkpoint task03_debug_checkpoint \ + g_initial_stats g_after_allocations_stats g_fragmented_stats \ + g_final_stats g_rv32_layout_expected g_task03_pass; do "$nm" -a "$elf" | grep -E "[[:space:]]${symbol}$" >/dev/null done "$objdump" -d "$elf" | grep -E 'addi[[:space:]]+sp,sp,-' >/dev/null -printf 'PASS Task 3 links upstream heap_4 and observable checkpoints: %s\n' "$elf" +printf 'PASS Task 3 links upstream heap_4 and eight observable checkpoints: %s\n' "$elf" diff --git a/tests/test_host.sh b/tests/test_host.sh index 322dc3b..a0a53ba 100755 --- a/tests/test_host.sh +++ b/tests/test_host.sh @@ -19,4 +19,4 @@ check_output "$root/host-build/task01_first_fit_split/prog" \ check_output "$root/host-build/task02_address_order_coalesce/prog" \ 'before_nodes=2 before_total=96 before_largest=48 after_nodes=1 after_total=144 after_largest=144 pass=1' check_output "$root/host-build/task03_freertos_heap4/prog" \ - 'initial=4080 after=3952 fragmented=2 final=4080 min=3952 aligned=1 oom=1 hooks=1 asserts=0 pass=1' + 'initial=4080 after_a=4040 after_b=3984 after_c=3952 free_a=3992 fragmented=4024 final=4080 min=3952 consumed=40/56/32 aligned=1 oom=1 hooks=1 asserts=0 pass=1' diff --git a/tools/card-action.sh b/tools/card-action.sh index 1a99120..f26f8db 100755 --- a/tools/card-action.sh +++ b/tools/card-action.sh @@ -105,6 +105,9 @@ build_native() { rv_env_root() { if [[ -n "${RV_ENV_ROOT:-}" ]]; then printf '%s\n' "$RV_ENV_ROOT" + elif [[ -f "$root/vendor/Hazard3/test/sim/common/init.S" && \ + -f "$root/vendor/lab-runtime/memops.c" ]]; then + printf '%s\n' "$root" elif [[ -d /opt/rv-env ]]; then printf '%s\n' /opt/rv-env else @@ -123,6 +126,9 @@ build_hazard3() { "FREERTOS_KERNEL_PATH=$kernel" PROFILE=observe >&2 || return elf="$build_dir/$task_stem/prog.elf" test -s "$elf" + if [[ "$task_number" -eq 3 ]]; then + "$root/tests/check_task03_elf.sh" "$elf" >&2 + fi copy_artifact "$elf" copy_artifact "${elf%.elf}.bin" copy_artifact "${elf%.elf}.lst" @@ -283,7 +289,7 @@ configure_debug_view() { export STEM_DEBUG_MEMORY_EXPR='&g_coalesce_arena' STEM_DEBUG_MEMORY_LENGTH=160 ;; 3) - export STEM_DEBUG_INITIAL_BREAK=heap4_fragmented_checkpoint + export STEM_DEBUG_INITIAL_BREAK=heap4_reset_checkpoint export STEM_DEBUG_MEMORY_EXPR='ucHeap' STEM_DEBUG_MEMORY_LENGTH=160 ;; esac diff --git a/web/app.css b/web/app.css index eac8d78..388a0ab 100644 --- a/web/app.css +++ b/web/app.css @@ -1 +1 @@ -.paper{display:flex;flex-direction:column;gap:3.3cm}.paper>.sheet,.paper>.sheet-spread>.sheet{width:210mm;height:297mm;min-height:297mm;max-height:297mm;margin:0 auto;overflow:hidden}.paper>.sheet.sheet--landscape,.paper>.sheet-spread>.sheet.sheet--landscape{width:297mm;min-width:297mm;max-width:297mm;height:210mm;min-height:210mm;max-height:210mm}.paper>.sheet>.sheet-content,.paper>.sheet-spread>.sheet>.sheet-content{height:297mm;min-height:297mm;max-height:297mm;overflow-x:hidden;overflow-y:hidden}.paper>.sheet.sheet--landscape>.sheet-content,.paper>.sheet-spread>.sheet.sheet--landscape>.sheet-content{height:210mm;min-height:210mm;max-height:210mm}.sheet-spread{display:contents}.paper.is-diagram-spread .sheet-spread{display:grid;grid-template-columns:repeat(var(--spread-columns, 1),max-content);width:max-content;max-width:none;margin:0 auto;align-items:flex-start;gap:2mm;zoom:var(--spread-fit-scale, 1)}.paper.is-diagram-spread .sheet-spread>.sheet{flex:0 0 auto}.viewer-chrome{position:sticky;top:0;z-index:80;width:100%}.viewer-action-toast{position:absolute;z-index:12;right:9px;bottom:9px;max-width:min(720px,calc(100vw - 18px));box-sizing:border-box;overflow:hidden;border:1px solid #42b8e7;border-radius:3px;background:#102c38ee;color:#dff7ff;padding:5px 9px;box-shadow:0 4px 14px #0007;text-overflow:ellipsis;white-space:nowrap;font:750 10px/1.25 ui-monospace,monospace}.viewer-chrome .topbar{position:sticky;top:0;z-index:90}.viewpoint-bar{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:1px;min-height:31px;border-top:1px solid #9aa8ae;border-bottom:1px solid #718087;background:#718087;box-shadow:0 2px 5px #0002}.viewpoint-bar button{position:relative;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:5px;min-width:0;border:0;background:#f7f9fa;color:#1f3038;padding:5px 7px;text-align:left;cursor:pointer}.viewpoint-bar button:hover,.viewpoint-bar button:focus-visible{z-index:1;background:#e9f3f7;outline:2px solid #287495;outline-offset:-2px}.viewpoint-bar button[aria-current=location]{background:#dcecf3;box-shadow:inset 0 -3px #167ca4}.viewpoint-bar button>span{color:#1b6785;font:850 10px/1 ui-monospace,monospace}.viewpoint-bar button>strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:750 10px/1.1 system-ui,sans-serif}.viewpoint-bar button.is-unavailable{background:#eef0f1;color:#5d686d;cursor:not-allowed}.viewpoint-bar button.is-unavailable>span{color:#68747a}.viewpoint-bar button.is-unavailable>small{border:1px solid #9da7ab;border-radius:2px;padding:1px 3px;font:750 7px/1 ui-monospace,monospace}.card-library-toggle{display:inline-flex;align-items:center;flex:none;height:28px;gap:6px;border:1px solid #6e7d84;border-radius:3px;background:#f6f8f9;color:#26373f;padding:2px 8px;font:750 11px/1 ui-monospace,monospace;cursor:pointer}.card-library-toggle:hover,.card-library-toggle:focus-visible{border-color:#1d7799;background:#edf7fa;outline:none}.card-library-toggle.is-active{border-color:#126d8f;background:#174f67;color:#fff}.card-library-toggle-icon{font:700 16px/1 system-ui,sans-serif}.card-library-toggle kbd{color:#267697;font:inherit}.card-library-toggle.is-active kbd{color:#aee9ff}:root{--side-panel-top: 36px;--side-panel-width: min(960px, calc(100vw - 28px) );--side-panel-trigger-length: 56px}.side-panel-dock{position:fixed;z-index:240;top:var(--side-panel-top);bottom:0;width:0;pointer-events:none}.side-panel-dock--left{left:0}.side-panel-dock--right{right:0}.side-panel-rail{position:fixed;z-index:243;top:calc(var(--side-panel-top) + 8px);display:flex;width:13px;flex-direction:column;gap:10px;pointer-events:auto}.side-panel-dock--left .side-panel-rail{left:0}.side-panel-dock--right .side-panel-rail{right:0}.side-panel-trigger{--side-panel-accent: #167ca4;position:relative;display:grid;width:13px;height:var(--side-panel-trigger-length);place-items:center;border:0;border-radius:0;background:transparent;padding:0;cursor:pointer}.side-panel-trigger:before{content:"";display:block;width:3px;height:calc(var(--side-panel-trigger-length) - 8px);border-radius:999px;background:var(--side-panel-accent);box-shadow:0 0 0 1px #ffffff73,0 3px 10px -5px var(--side-panel-accent);opacity:.78;transition:width .14s ease,opacity .14s ease,box-shadow .14s ease}.side-panel-trigger:hover:before,.side-panel-trigger:focus-visible:before,.side-panel-trigger.is-open:before{width:4px;opacity:1}.side-panel-trigger.is-pinned:before{width:5px;box-shadow:0 0 0 1px #ffffff9e,0 3px 12px -4px var(--side-panel-accent)}.side-panel-trigger:focus-visible{outline:2px solid var(--side-panel-accent);outline-offset:-2px}.side-panel-trigger>span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.side-panel{position:fixed;z-index:241;top:var(--side-panel-top);bottom:0;display:flex;width:var(--side-panel-width);max-width:calc(100vw - 20px);box-sizing:border-box;flex-direction:column;overflow:hidden;border-color:#819098;background:#f7f9fa;color:#17252c;pointer-events:none;transition:transform .18s cubic-bezier(.22,.78,.24,1);will-change:transform}.side-panel-dock--left .side-panel{left:0;border-right:1px solid #819098;box-shadow:15px 0 34px -24px #101b218c;transform:translate(calc(-100% - 14px))}.side-panel-dock--right .side-panel{right:0;border-left:1px solid #819098;box-shadow:-15px 0 34px -24px #101b218c;transform:translate(calc(100% + 14px))}.side-panel.is-open{transform:translate(0);pointer-events:auto}.side-panel:after{content:"";position:absolute;top:10px;width:4px;height:48px;border-radius:999px;background:var(--side-panel-accent);pointer-events:none}.side-panel-dock--left .side-panel:after{right:-2px}.side-panel-dock--right .side-panel:after{left:-2px}.side-panel-header{display:flex;min-height:38px;box-sizing:border-box;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid #aebbc1;background:#e7edef;padding:4px 7px 4px 10px}.side-panel-header>div:first-child{display:flex;min-width:0;align-items:baseline;gap:7px}.side-panel-header small{color:#52666f;font:600 16px/1 ui-monospace,monospace;letter-spacing:.08em}.side-panel-header strong{overflow:hidden;color:#11191d;text-overflow:ellipsis;white-space:nowrap;font:600 16px/1.2 system-ui,sans-serif}.side-panel-actions{display:flex;flex:none;gap:4px}.side-panel-actions button{display:grid;min-width:38px;height:24px;place-items:center;border:1px solid #8b999f;border-radius:3px;background:#fff;color:#26373f;padding:0 6px;font:650 16px/1 ui-monospace,monospace;cursor:pointer}.side-panel-actions button:last-child{min-width:24px;padding:0;font-size:18px}.side-panel-actions button:hover,.side-panel-actions button:focus-visible,.side-panel-actions button.is-pinned{border-color:var(--side-panel-accent);background:#edf7fa;outline:none}.side-panel-body,.card-library-panel{display:flex;min-height:0;flex:1;flex-direction:column;overflow:hidden}.card-library-header{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:18px 18px 15px;border-bottom:1px solid #bdc9ce;background:#e8eef1}.card-library-header small{color:#52666f;font:600 16px/1.25 ui-monospace,monospace;letter-spacing:.09em;text-transform:uppercase}.card-library-header h2{margin:4px 0 2px;font:750 22px/1.15 system-ui,sans-serif}.card-library-header p{margin:0;color:#607078;font:500 16px/1.35 system-ui,sans-serif}.card-library-header>button{display:grid;width:34px;height:34px;place-items:center;flex:none;border:1px solid #77878e;border-radius:3px;background:#fff;color:#25353c;padding:0;font:25px/1 system-ui,sans-serif;cursor:pointer}.card-library-header>button:hover,.card-library-header>button:focus-visible{border-color:#126d8f;background:#edf7fa;outline:2px solid #85c5dc;outline-offset:1px}.card-library-tree{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:6px 0 18px;scrollbar-color:#8a9aa1 #edf1f3}.card-library-tree details{border:0}.card-library-tree summary{display:grid;grid-template-columns:14px minmax(0,1fr) auto;align-items:center;gap:6px;min-height:30px;box-sizing:border-box;padding:5px 10px 5px 4px;list-style:none;cursor:pointer;user-select:none}.card-library-tree summary::-webkit-details-marker{display:none}.card-library-tree summary:hover,.card-library-tree summary:focus-visible{background:#eaf1f4;outline:none}.card-library-branch{color:#25363d;font:16px/1 ui-monospace,monospace;transform:rotate(-90deg);transition:transform .12s ease}.card-library-tree details[open]>summary .card-library-branch{transform:rotate(0)}.card-library-tree summary strong,.card-library-tree summary small{display:block}.card-library-tree summary strong{color:#070a0b;font:550 16px/1.3 system-ui,sans-serif}.card-library-tree summary small{margin-top:2px;color:#303b40;font:500 16px/1.25 ui-monospace,monospace;letter-spacing:.04em}.card-library-tree summary output{min-width:22px;color:#26363d;padding:0 2px;text-align:center;font:550 16px/1.2 ui-monospace,monospace}.card-library-subject>summary{min-height:42px;border-bottom:1px solid #9eacb2;background:#dfe8ec;padding:7px 14px}.card-library-subject>summary:hover,.card-library-subject>summary:focus-visible{background:#d5e1e5}.card-library-subject>summary strong{color:#000;font:600 16px/1.3 system-ui,sans-serif}.card-library-subject>summary small{color:#28353a;font:500 16px/1.25 ui-monospace,monospace}.card-library-level-list{margin-left:18px;border-left:1px solid #8e9da4}.card-library-level>summary{min-height:38px;border-bottom:1px solid #cbd4d8;padding-left:8px}.card-library-level>summary strong{color:#000;font:550 16px/1.3 system-ui,sans-serif}.card-library-series-list{margin-left:18px;border-left:1px solid #a5b1b6;padding:2px 0 6px}.card-library-series>summary{min-height:34px;padding-left:8px}.card-library-series>summary strong{color:#000;font:550 16px/1.3 system-ui,sans-serif}.card-library-series>summary small{color:#26343a;font:500 16px/1.25 ui-monospace,monospace}.card-library-cards,.card-library-tasks{list-style:none;margin-top:0;margin-bottom:2px;padding:0}.card-library-cards{margin-left:18px;border-left:1px solid #bac3c7}.card-library-card-entry{margin:0}.card-library-card{display:grid;grid-template-columns:19px minmax(0,1fr) auto;align-items:start;gap:5px;min-height:38px;box-sizing:border-box;border:0;border-left:3px solid transparent;color:#000;padding:5px 8px 5px 3px;text-decoration:none}.card-library-node{color:#536168;font:16px/1.35 ui-monospace,monospace}.card-library-card-copy,.card-library-card-copy strong,.card-library-card-copy>span{display:block;min-width:0}.card-library-card-copy strong{color:#000;font:550 16px/1.3 ui-monospace,monospace}.card-library-card-copy>span{margin-top:2px;color:#0b0d0e;font:500 16px/1.35 system-ui,sans-serif;white-space:normal}.card-library-card-meta{display:flex;align-items:flex-end;flex-direction:column;gap:2px}.card-library-card-meta small{color:#26343a;font:500 16px/1.25 ui-monospace,monospace}.card-library-card.is-available{cursor:pointer}.card-library-card.is-available:hover,.card-library-card.is-available:focus-visible{background:#eaf5f8;outline:none}.card-library-card.is-current{border-left-color:#16769b;background:#dff1f7}.card-library-card.is-current:hover,.card-library-card.is-current:focus-visible{background:#cfeaf3;outline:1px solid #5ba9c4;outline-offset:-1px}.card-library-card.is-unavailable{color:#000}.card-library-card.is-unavailable .card-library-card-copy strong,.card-library-card.is-unavailable .card-library-card-meta small{color:#1d292e}.card-library-card.is-unavailable .card-library-card-copy>span{color:#0b0d0e}.card-library-tasks{margin-left:36px;border-left:1px solid #c3cacc}.card-library-tasks li>a,.card-library-tasks li>span{display:grid;grid-template-columns:19px auto minmax(0,1fr);gap:5px;align-items:start;color:#000;padding:4px 8px 5px 3px;text-decoration:none}.card-library-tasks li>a:hover,.card-library-tasks li>a:focus-visible{background:#eaf5f8;outline:none}.card-library-tasks strong{color:#000;font:550 16px/1.35 ui-monospace,monospace}.card-library-tasks li>a>span:last-child,.card-library-tasks li>span>span:last-child{color:#111;font:500 16px/1.35 system-ui,sans-serif}.card-library-footer{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:10px 16px;border-top:1px solid #bdc9ce;background:#edf1f3;color:#5a6a72;font:500 16px/1.3 system-ui,sans-serif}.card-library-footer span{display:inline-flex;align-items:center;gap:4px}.card-library-footer i{width:7px;height:7px;border-radius:50%;background:#929da2}.card-library-footer i.is-online{background:#26815b}.card-library-footer kbd{margin-left:auto;border:1px solid #a2afb5;border-radius:2px;background:#fff;padding:2px 5px;font:600 16px/1 ui-monospace,monospace}.card-library-treegrid{min-height:0;flex:1;overflow:auto;margin:8px;border:1px solid rgb(31 35 40 / 18%);border-radius:6px;background:#fff;scrollbar-color:#93a2a8 #edf1f2;scrollbar-width:thin}.card-library-treegrid-row{display:grid;min-width:760px;min-height:38px;box-sizing:border-box;grid-template-columns:minmax(500px,1fr) 110px 120px;align-items:stretch;border-bottom:1px solid rgb(31 35 40 / 9%);color:#273941;font:500 16px/1.25 ui-monospace,monospace}.card-library-treegrid-row>[role=gridcell],.card-library-treegrid-row>[role=columnheader]{display:flex;min-width:0;align-items:center;overflow:hidden;padding:7px 9px;text-overflow:ellipsis;white-space:nowrap}.card-library-treegrid-row>[role=gridcell]+[role=gridcell],.card-library-treegrid-row>[role=columnheader]+[role=columnheader]{border-left:1px solid rgb(31 35 40 / 9%)}.card-library-treegrid-head{position:sticky;z-index:3;top:0;min-height:34px;border-bottom-color:#1f232833;background:#eef1f2;color:#3e525b;font-weight:700;letter-spacing:.045em}.card-library-treegrid-row:not(.card-library-treegrid-head):hover{background:#1f23280a}.card-library-treegrid-row.is-subject{background:#dfe8e5}.card-library-treegrid-row.is-level{background:#f5f8f8}.card-library-treegrid-row.is-series{background:#f9fbfb}.card-library-treegrid-row.is-card{min-height:42px;background:#fff}.card-library-treegrid-row.is-task{background:#fbfcfc}.card-library-treegrid-row.is-current{box-shadow:inset 3px 0 #1680a5;background:#e1f1f6}.card-library-tree-title{gap:6px;padding-left:calc(8px + (var(--card-library-depth, 0) * 21px))!important;font-family:system-ui,sans-serif}.card-library-tree-expander{display:inline-grid;width:24px;height:24px;flex:none;place-items:center;border:0;background:transparent;color:#405961;padding:0;font:18px/1 ui-monospace,monospace;cursor:pointer}.card-library-tree-expander:hover,.card-library-tree-expander:focus-visible{background:#165d6b1a;color:#165d6b;outline:1px solid rgb(22 93 107 / 28%)}.card-library-tree-expander.is-empty{cursor:default}.card-library-tree-link,.card-library-tree-label{display:flex;min-width:0;align-items:baseline;gap:7px;overflow:hidden;color:#10181c;text-decoration:none;white-space:nowrap}.card-library-tree-link:hover,.card-library-tree-link:focus-visible{color:#075d7c;outline:none;text-decoration:underline;text-underline-offset:2px}.card-library-tree-link strong,.card-library-tree-label strong{flex:none;color:inherit;font:700 16px/1.25 ui-monospace,monospace}.card-library-tree-link>span,.card-library-tree-label>span{min-width:0;overflow:hidden;color:inherit;text-overflow:ellipsis;white-space:nowrap;font:500 16px/1.25 system-ui,sans-serif}.card-library-treegrid-row.is-subject .card-library-tree-label strong,.card-library-treegrid-row.is-level .card-library-tree-label strong,.card-library-treegrid-row.is-series .card-library-tree-label strong{font-family:system-ui,sans-serif;font-weight:650}.card-library-tree-state{display:inline-flex;min-width:76px;min-height:24px;box-sizing:border-box;align-items:center;justify-content:center;border:1px solid transparent;border-radius:5px;color:#33474f;padding:2px 7px;font:650 14px/1 ui-monospace,monospace;white-space:nowrap}.card-library-tree-state[data-state=current]{border-color:#3184a0;background:#e9f5f8;color:#075d7c}.card-library-tree-state[data-state=online]{border-color:#4b9a7a;background:#edf8f2;color:#176144}.card-library-tree-state[data-state=plan]{border-color:#c59a49;background:#fff7e5;color:#775313}.card-library-treegrid-row.is-unavailable .card-library-tree-label,.card-library-treegrid-row.is-unavailable .card-library-tree-label strong{color:#10181c}.side-toc,.side-progress{min-height:0;flex:1;overflow-y:auto;background:#fff;color:#11191d}.side-toc>header,.side-progress>header{padding:16px 18px 13px;border-bottom:1px solid #bdc9ce;background:#f0f4f5}.side-toc>header small,.side-progress>header small{color:#53666f;font:750 9px/1 ui-monospace,monospace;letter-spacing:.08em}.side-toc>header h2,.side-progress>header h2{margin:4px 0 0;color:#10181c;font:750 21px/1.15 system-ui,sans-serif}.side-toc ol{margin:0;padding:7px 0 20px;list-style:none}.side-toc li{border-bottom:1px solid #e2e7e9}.side-toc a{display:grid;grid-template-columns:34px minmax(0,1fr);gap:9px;align-items:baseline;padding:10px 16px;color:#11191d;text-decoration:none}.side-toc a:hover,.side-toc a:focus-visible{background:#eaf5f8;outline:none}.side-toc a span{color:#267493;font:800 10px/1 ui-monospace,monospace}.side-toc a strong{font:650 13px/1.3 system-ui,sans-serif}.side-progress-summary{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:16px;border:1px solid #b6c2c7;background:#f4f7f8;padding:14px;font:650 13px/1.3 system-ui,sans-serif}.side-progress-summary strong{color:#1d617b;font:850 20px/1 ui-monospace,monospace}.side-progress-links{display:grid;gap:8px;padding:0 16px 18px}.side-progress-links a{border:1px solid #87979e;border-radius:3px;background:#fff;color:#174f67;padding:10px 12px;text-decoration:none;font:700 12px/1.2 system-ui,sans-serif}.side-progress-links a:hover,.side-progress-links a:focus-visible{border-color:#167ca4;background:#edf7fa;outline:none}.side-progress-error{margin:0 16px 14px;border-left:3px solid #a52d2d;background:#fff1f1;color:#7d1f1f;padding:8px 10px;font:12px/1.35 system-ui,sans-serif}.classroom-panel{display:flex;min-height:0;flex:1;flex-direction:column;overflow:hidden;background:#f7f9fa;color:#11191d}.classroom-treegrid{min-height:0;flex:1;overflow:auto;margin:8px;border:1px solid rgb(31 35 40 / 18%);border-radius:6px;background:#fff;scrollbar-color:#93a2a8 #edf1f2;scrollbar-width:thin}.classroom-treegrid-row{display:grid;min-width:920px;box-sizing:border-box;grid-template-columns:minmax(410px,1fr) 100px 150px 150px 110px;align-items:center;border-bottom:1px solid rgb(31 35 40 / 8%);color:#273941;font:500 16px/1.25 ui-monospace,monospace}.classroom-treegrid-row>[role=gridcell],.classroom-treegrid-row>[role=columnheader]{min-width:0;overflow:hidden;padding:8px;text-overflow:ellipsis;white-space:nowrap}.classroom-treegrid-row>[role=gridcell]+[role=gridcell],.classroom-treegrid-row>[role=columnheader]+[role=columnheader]{border-left:1px solid rgb(31 35 40 / 8%)}.classroom-treegrid-head{position:sticky;z-index:2;top:0;border-bottom-color:#1f23282e;background:#eef1f2;color:#3e525b;font-weight:650;letter-spacing:.04em}.classroom-node-row:hover{background:#1f23280a}.classroom-node-row.is-class{background:#dfe8e5}.classroom-node-row.is-student{background:#f8faf9}.classroom-node-row.is-task{background:#edf3f5}.classroom-node-row.is-block,.classroom-node-row.is-exercises{background:#f5f7f8}.classroom-node-row.is-phase{background:#fafbfb}.classroom-node-title{display:flex;align-items:center;gap:6px;padding-left:calc(8px + (var(--classroom-depth, 0) * 20px))!important;font-family:system-ui,sans-serif}.classroom-node-title strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:500}.classroom-node-row.is-class .classroom-node-title strong,.classroom-node-row.is-student .classroom-node-title strong,.classroom-node-row.is-task .classroom-node-title strong{font-weight:650}.classroom-expander{display:inline-grid;width:24px;height:24px;flex:none;place-items:center;border:0;background:transparent;color:#405961;padding:0;font:18px/1 ui-monospace,monospace;cursor:pointer}.classroom-expander:hover,.classroom-expander:focus-visible{background:#165d6b1a;color:#165d6b;outline:1px solid rgb(22 93 107 / 28%)}.classroom-expander.is-empty{cursor:default}.classroom-status,.classroom-sync,.classroom-visit,.classroom-commit{display:inline-flex;min-width:92px;box-sizing:border-box;align-items:center;justify-content:center;border:1px solid;border-radius:5px;padding:4px 6px;font:550 16px/1 ui-monospace,monospace;letter-spacing:.015em}.classroom-status[data-status=online]{border-color:#6b9a87;background:#e7f4ee;color:#155e43}.classroom-status[data-status=away]{border-color:#baa06a;background:#fff5d9;color:#765510}.classroom-status[data-status=offline]{border-color:#a5afb3;background:#f0f2f3;color:#596970}.classroom-status[data-status=error]{border-color:#bd7b7b;background:#fff0f0;color:#8c2929}.classroom-sync[data-sync=follow]{border-color:#6c98aa;background:#e8f3f7;color:#155c77}.classroom-sync[data-sync=paused]{border-color:#baa06a;background:#fff6df;color:#765510}.classroom-sync[data-sync=local]{border-color:#9a86ae;background:#f4eef9;color:#65427c}.classroom-visit[data-visit=present],.classroom-commit[data-commit=committed]{border-color:#6b9a87;background:#e7f4ee;color:#155e43}.classroom-visit[data-visit=missed],.classroom-commit[data-commit=missing]{border-color:#bd7b7b;background:#fff0f0;color:#8c2929}.classroom-visit[data-visit=pending],.classroom-commit[data-commit=working]{border-color:#baa06a;background:#fff6df;color:#765510}.classroom-legend{display:flex;flex:none;flex-wrap:wrap;gap:7px 12px;border-top:1px solid #aebbc1;background:#edf1f2;padding:9px 11px;color:#485c65;font:500 16px/1.35 system-ui,sans-serif}.classroom-legend span{display:inline-flex;align-items:center;gap:4px}.classroom-legend i{width:12px;height:12px;border:1px solid #73858c;border-radius:50%;background:#aeb7bb}.classroom-legend i[data-status=online]{border-color:#3e7c63;background:#45a27b}.classroom-legend i[data-status=away]{border-color:#a0782d;background:#dcae51}.classroom-legend i[data-status=offline]{border-color:#859399;background:#b6c0c4}.classroom-legend b{color:#65427c;font:600 16px/1 ui-monospace,monospace}.viewer-chrome.is-nvim-fit{display:flex;width:100%;height:100vh;height:100dvh;max-height:100dvh;flex-direction:column;overflow:hidden;background:#11171a}.viewer-chrome.is-nvim-fit .topbar,.viewer-chrome.is-nvim-fit .viewpoint-bar,.viewer-chrome.is-nvim-fit .allocator-panel{flex:none}.viewer-chrome.is-nvim-fit .nvim-panel{display:flex;min-height:0;flex:1;flex-direction:column}.viewer-chrome.is-nvim-fit .nvim-screen-scroll{min-height:0;height:auto!important;flex:1}.viewer-chrome.is-nvim-fit .nvim-resize-handle{display:none}.viewer-chrome.is-nvim-fit .nvim-screen-stage{width:100%;height:100%;margin:0;zoom:1}.viewer-chrome.is-nvim-fit .nvim-screen-content{right:1mm;overflow:hidden;scrollbar-width:none}.viewer-chrome.is-nvim-fit .nvim-screen-grid{display:flex;width:100%;min-height:0;height:100%;align-items:center;justify-content:center}.viewer-chrome.is-nvim-fit .nvim-screen{width:auto!important;height:auto!important;max-width:100%;max-height:100%}.viewer-chrome.is-nvim-fit .nvim-screen-content::-webkit-scrollbar{display:none}.topbar-nvim-section{display:flex;align-items:center;min-width:0;gap:6px}.nvim-toolbar-boundary{flex:none;color:#6f7d83;font:700 14px/1 ui-monospace,monospace}.nvim-toolbar-context{flex:none;width:5ch;color:#263238;font:800 12px/1 ui-monospace,monospace;letter-spacing:.08em;text-align:center}.nvim-toolbar-actions{display:flex;align-items:center;gap:3px}.nvim-toolbar-button{display:inline-flex;align-items:center}.nvim-toolbar-key{flex:0 0 2ch;color:#267697;font:inherit;text-align:center}.nvim-toolbar-label{flex:0 0 5ch;max-width:5ch;overflow:hidden;text-align:left;white-space:nowrap}.topbar-nvim-meta{display:flex;align-items:baseline;min-width:0;max-width:min(44vw,720px);gap:6px}.topbar-nvim-meta strong,.topbar-nvim-meta small{overflow:auto;text-overflow:ellipsis;white-space:nowrap}.topbar-nvim-meta strong{color:#263238;font:700 12px/1.25 system-ui,sans-serif}.topbar-nvim-meta small{color:#66747a;font:500 10px/1.25 system-ui,sans-serif}.viewer-nvim-toggle{border:1px solid #68747a;border-radius:3px;background:#fff;color:#263238;padding:2px 8px;font:650 16px/1.3 system-ui,sans-serif;cursor:pointer}.viewer-nvim-toggle[aria-pressed=true]{border-color:#267697;background:#eaf6fb;color:#174d64}.allocator-panel{width:100%;box-sizing:border-box;border-top:1px solid #40515a;border-bottom:1px solid #40515a;background:#f7f9f5;color:#182127;box-shadow:0 4px 12px #0002;font:11px/1.25 system-ui,sans-serif}.allocator-panel>header{display:grid;grid-template-columns:125px minmax(260px,auto) 1fr;gap:8px;align-items:baseline;min-height:22px;padding:3px 8px;border-bottom:1px solid #b7c1c4;background:#e8eef0}.allocator-panel>header>span{color:#166987;font:800 9px/1.2 ui-monospace,monospace;letter-spacing:.06em}.allocator-panel>header>strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:750 11px/1.2 ui-monospace,monospace}.allocator-panel>header>small{overflow:hidden;color:#536168;text-overflow:ellipsis;white-space:nowrap}.allocator-panel-body{display:grid;grid-template-columns:230px minmax(420px,1fr) minmax(310px,.8fr);gap:9px;align-items:stretch;padding:5px 8px 7px}.allocator-metrics{display:grid;grid-template-columns:1fr 1fr;gap:3px 8px;margin:0}.allocator-metrics>div{min-width:0;border-left:2px solid #8ea2ab;padding-left:5px}.allocator-metrics dt{color:#627077;font:750 7px/1.2 ui-monospace,monospace;letter-spacing:.05em}.allocator-metrics dd{margin:1px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:700 10px/1.2 ui-monospace,monospace}.allocator-arena-view{min-width:0}.allocator-arena-view.is-inactive{opacity:.42}.allocator-arena-labels{display:flex;justify-content:space-between;gap:8px;margin-bottom:3px;color:#536168;font:700 8px/1.2 ui-monospace,monospace}.allocator-arena-labels strong{color:#075f80}.allocator-pinned-arena{position:relative;display:grid;grid-template-columns:repeat(var(--allocator-size),minmax(2px,1fr));height:32px;border:1px solid #28343a;background:#fff}.allocator-pinned-arena i{min-width:0;border-right:1px solid #e1e5e6;background:#fbfcfc}.allocator-pinned-arena i:nth-child(8n){border-right-color:#87969d}.allocator-pinned-arena i.is-allocated{border-right-color:#b2d8e6;background:#43a8ce}.allocator-cursor{position:absolute;z-index:2;top:-4px;bottom:-4px;width:2px;background:#d02d25;transform:translate(-1px);box-shadow:0 0 0 1px #fff9}.allocator-cursor:before{content:"allocp";position:absolute;top:1px;left:4px;color:#8d1d17;font:800 7px/1 ui-monospace,monospace}.allocator-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 7px;min-width:0}.allocator-facts>div{display:flex;min-width:0;justify-content:space-between;gap:5px;border-bottom:1px dotted #b4bec2}.allocator-facts span{overflow:hidden;color:#46565e;text-overflow:ellipsis;white-space:nowrap}.allocator-facts code{overflow:hidden;color:#142e39;text-overflow:ellipsis;white-space:nowrap;font:700 9px/1.3 ui-monospace,monospace}.allocator-facts p{grid-column:1 / -1;margin:0;color:#647278}.nvim-panel{width:100%;box-sizing:border-box;border-bottom:1px solid #52616a;background:var(--desk, #eee);color:#e7eef1;box-shadow:0 5px 16px #0004;font:12px/1.3 system-ui,sans-serif}.nvim-status{flex:none;border:1px solid #66757c;border-radius:999px;padding:1px 6px;color:#c9d3d8;font:750 9px/1.35 ui-monospace,monospace;letter-spacing:.04em}.nvim-status--connected,.nvim-status--ready{border-color:#31a86d;background:#173b2a;color:#8aefb7}.nvim-status--connecting,.nvim-status--replaying,.nvim-status--verifying{border-color:#c38f2a;background:#3e321b;color:#ffd47d}.nvim-status--failed,.nvim-status--offline,.nvim-status--unselected{border-color:#a34b4b;background:#3b2020;color:#faa}.nvim-control-indicator{flex:none;border:1px solid #60747e;border-radius:3px;background:#222e34;color:#b9c6cc;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.04em;white-space:nowrap;cursor:pointer}.nvim-control-indicator.is-active{border-color:#3cb3e2;background:#17465a;color:#d9f5ff}.nvim-control-indicator.is-engaged{box-shadow:inset 0 0 0 1px #8ee4ff}.nvim-work-indicator{flex:none;border:1px solid #7a878d;border-radius:3px;background:#f4f6f7;color:#56646a;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap;cursor:pointer}.nvim-work-indicator.is-active{border-color:#cf3d31;background:#fff0ee;color:#9f241b}.nvim-work-indicator.is-engaged{box-shadow:inset 0 0 0 1px #cf3d31}.nvim-work-indicator:disabled{border-color:#a8b0b4;background:#e6e9ea;color:#7c878c;cursor:not-allowed;opacity:.8}.nvim-height-toggle{flex:none;border:1px solid #75848b;border-radius:3px;background:#f4f6f7;color:#425159;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap;cursor:pointer}.nvim-height-toggle.is-active{border-color:#267697;background:#eaf6fb;color:#174d64}.topbar-nvim-section .nvim-toolbar-button{flex:0 0 9.5ch;width:9.5ch;min-width:9.5ch;max-width:9.5ch;height:24px;box-sizing:border-box;justify-content:flex-start;gap:.55ch;padding:2px .55ch;font:750 12px/1 ui-monospace,monospace;letter-spacing:0}.nvim-shortcut-strip{flex:none;color:#536168;font:650 10px/1.2 ui-monospace,monospace;white-space:nowrap}.nvim-shortcut-strip kbd{color:#263238;font:inherit}.nvim-screen-scroll{position:relative;width:100%;box-sizing:border-box;height:var(--nvim-panel-height, 75vh);max-height:none;min-height:240px;overflow:auto;overscroll-behavior:contain;background:var(--desk, #eee);outline:none;scrollbar-color:#58666d #171d20}.nvim-screen-stage{position:relative;width:210mm;margin:0 auto;background:#fff;zoom:var(--viewer-canvas-scale)}.nvim-screen-surface{position:absolute;inset:0 4mm;box-sizing:border-box;padding:1mm;background:#fff}.nvim-screen-frame{position:relative;height:100%;box-sizing:border-box;border:1px solid #267697;background:#101315;box-shadow:0 0 0 3px #000}.nvim-screen-scroll[data-sync=on] .nvim-screen-frame{border-color:#35b9ef}.nvim-screen-scroll[data-control=true] .nvim-screen-frame{box-shadow:0 0 0 3px #cf3d31}.nvim-screen-scroll[data-control=true]{cursor:text}.nvim-screen-content{position:absolute;inset:1mm -5mm 1mm 1mm;overflow-x:hidden;overflow-y:scroll;overscroll-behavior:contain;background:transparent;scrollbar-width:thin;scrollbar-color:#829097 #fff}.nvim-screen-grid{width:calc(100% - 6mm);min-height:100%;background:#101315}.nvim-screen-content::-webkit-scrollbar{width:.8mm}.nvim-screen-content::-webkit-scrollbar-track{background:#fff}.nvim-screen-content::-webkit-scrollbar-thumb{border:.12mm solid #fff;border-radius:99px;background:#829097}.nvim-screen-content::-webkit-scrollbar-thumb:hover{background:#aeb9be}.nvim-screen{display:block;max-width:none;margin:0;outline:none;image-rendering:auto}.nvim-screen:focus{box-shadow:none}.nvim-screen-empty{position:absolute;inset:0;display:grid;place-content:center;gap:5px;padding:16px;color:#9cabb2;text-align:center}.nvim-screen-empty strong{color:#e0e8eb;font:750 11px/1.3 ui-monospace,monospace}.nvim-resize-handle{position:relative;width:100%;height:12px;border-top:1px solid #46565e;background:#182126;cursor:ns-resize;touch-action:none}.nvim-resize-handle:after{content:"";position:absolute;top:4px;left:50%;width:min(160px,22vw);height:3px;border-radius:999px;background:#6c7e87;transform:translate(-50%)}.nvim-resize-handle:hover,.nvim-resize-handle:focus-visible{background:#23323a;outline:none}.nvim-resize-handle:hover:after,.nvim-resize-handle:focus-visible:after{background:#35b9ef}.shortcut-help-backdrop{position:fixed;z-index:200;inset:0;display:grid;place-items:center;padding:20px;background:#10171dcc}.shortcut-help{width:min(680px,calc(100vw - 40px));max-height:calc(100vh - 40px);overflow:auto;border:1px solid #71818a;border-radius:6px;background:#f8fafb;color:#172127;box-shadow:0 18px 60px #0008;font:14px/1.4 system-ui,sans-serif}.shortcut-help>header{display:flex;align-items:start;justify-content:space-between;gap:16px;padding:16px 18px;border-bottom:1px solid #c8d1d5;background:#e8eef1}.shortcut-help header small{color:#52646d;font:750 10px/1.2 ui-monospace,monospace;letter-spacing:.08em}.shortcut-help h2{margin:4px 0 0;font-size:17px}.shortcut-help header button{width:32px;height:32px;border:1px solid #71818a;border-radius:3px;background:#fff;font:22px/1 system-ui,sans-serif;cursor:pointer}.shortcut-help dl{margin:0;padding:10px 18px}.shortcut-help dl>div{display:grid;grid-template-columns:minmax(180px,.8fr) 1.5fr;gap:14px;align-items:center;padding:8px 0;border-bottom:1px solid #dde3e6}.shortcut-help dt,.shortcut-help dd{margin:0}.shortcut-help kbd{display:inline-block;border:1px solid #839198;border-bottom-width:2px;border-radius:3px;background:#fff;padding:3px 7px;font:700 12px/1.2 ui-monospace,monospace}.shortcut-help>p{margin:0;padding:4px 18px 16px;color:#526068}.memory-react{border:1px solid #555;background:#fff;font:14px/1.35 system-ui,sans-serif;padding:10px;color:#1b1b1b}.memory-react>header{display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid #bbb;padding-bottom:7px}.memory-react>header small{display:block;margin-bottom:2px;color:#555;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.08em}.memory-react h3{font-size:15px;margin:0}.memory-actions{display:flex;gap:5px;flex-wrap:wrap;justify-content:flex-end}.memory-actions button{border:1px solid #777;background:#fff;padding:4px 8px;cursor:pointer}.memory-actions button[aria-pressed=true]{background:#dff3fb;border-color:#237da1;font-weight:700}.memory-lanes{display:grid;grid-template-columns:repeat(auto-fit,minmax(125px,1fr));gap:6px;margin:8px 0}.memory-lane{min-width:0;display:flex;flex-direction:column;align-items:stretch;gap:3px;border:1px solid #999;background:#fafafa;padding:7px;text-align:left}.memory-lane.compile{background:#fff8dc}.memory-lane.bss{background:#edf7fb}.memory-lane.stack{background:#f3f8ef}.memory-lane.registers{background:#f4f4f4}.memory-lane.text{background:#f7f0fa}.memory-lane>b{font-size:11px;letter-spacing:.04em}.memory-lane button{border:1px solid transparent;background:transparent;padding:3px;text-align:left;cursor:pointer}.memory-lane button:hover,.memory-lane button.active{border-color:#238bb7;background:#fff}.memory-lane code{font-size:10px;white-space:normal}.arena-wrap{margin:12px 0 6px}.arena-label{display:flex;justify-content:space-between;margin-bottom:4px}.arena{--allocp: 0;--arena-size: 64;position:relative;display:grid;grid-template-columns:repeat(var(--arena-size),1fr);height:40px;border:1px solid #222;margin-bottom:28px}.arena i{border-right:1px solid #ddd}.arena .allocp{position:absolute;left:calc(var(--allocp) / var(--arena-size) * 100%);top:43px;transform:translate(-50%);color:#087da8;font:700 11px/1.2 ui-monospace,monospace;white-space:nowrap}.memory-stage{border-top:1px solid #ddd;padding-top:7px;margin:0}.memory-inspector{display:grid;grid-template-columns:auto 1fr;gap:2px 10px;margin-top:7px;padding:7px;border-left:3px solid #238bb7;background:#f5fbfd}.memory-inspector strong{grid-row:1/3}.memory-inspector code{font-size:11px}.memory-inspector span{font-size:12px}.asset-static-fallback{display:none}.uml-react{border:1px solid #555;background:#fff;font:13px/1.35 system-ui,sans-serif;color:#1b1b1b}.uml-react>header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;border-bottom:1px solid #bbb;background:#fafafa}.uml-react>header small{display:block;color:#555;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.06em}.uml-react h3{margin:2px 0 0;font-size:15px}.uml-actions{display:flex;gap:3px;flex-wrap:wrap;justify-content:flex-end}.uml-actions button{border:1px solid #aaa;border-radius:2px;background:#fcfcfc;color:#444;padding:2px 6px;font:600 10px/1.25 ui-monospace,monospace;cursor:pointer}.uml-actions button:hover{border-color:#64879a;background:#f5fafc}.uml-actions button[data-completed=true]{border-color:#62a47f;background:#edf8f1;color:#14613a}.uml-actions button[aria-pressed=true]{border-color:#287495;background:#edf7fb;color:#174d64;box-shadow:inset 0 0 0 1px #b9dce9}.uml-canvas{display:block;overflow-x:hidden;overflow-y:visible;box-sizing:border-box;padding:8px 10px;text-align:center}.uml-svg-host{width:max-content;min-width:100%}.uml-canvas img,.uml-svg-host svg{display:block;width:auto!important;max-width:none!important;height:auto!important;max-height:none;margin-inline:auto;object-fit:contain}.uml-svg-host{cursor:pointer}.uml-svg-host.is-tiled{position:relative;width:var(--uml-tile-page-width);min-width:var(--uml-tile-page-width);height:var(--uml-tile-page-height);overflow:hidden;cursor:default}.uml-svg-host.is-tiled>svg{position:absolute;top:var(--uml-tile-top);left:var(--uml-tile-left);margin:0}.uml-static-crop{position:absolute;top:var(--uml-tile-top);left:var(--uml-tile-left);overflow:hidden}.uml-static-crop>img{display:block;max-width:none!important;max-height:none!important;margin:0!important;object-fit:fill!important;transform-origin:0 0}.uml-tile-part{display:inline-block;margin-left:.65em;color:#607985;font:650 9px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap}.uml-phase-actions>span{display:inline-flex;align-items:center;border:1px solid #9eb2bd;border-radius:2px;background:#f1f5f7;color:#3d5967;padding:2px 6px;font:700 10px/1.25 ui-monospace,monospace}.uml-stage-region{cursor:pointer;transition:fill .14s ease,stroke .14s ease,stroke-width .14s ease}.uml-stage-region-completed.uml-stage-region-bg{fill:#e7f6ed!important;fill-opacity:1!important;stroke:#258154!important;stroke-width:3px!important}.uml-stage-region-completed.uml-stage-region-outline{stroke:#258154!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-bg{fill:#e7f6fc!important;fill-opacity:1!important;stroke:#187ea7!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-outline{stroke:#187ea7!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-completed.uml-stage-region-bg{fill:#e7f6ed!important}.uml-stage-region:focus{outline:none;stroke:#005f87!important;stroke-width:4px!important}.uml-inline-warning{display:block;padding-top:5px;color:#8b2d20;font-size:11px}.uml-stage{display:grid;grid-template-columns:auto 1fr;gap:3px 10px;margin:0 8px 8px;padding:8px;border-left:3px solid #315f78;background:#eef7fb}.uml-stage strong{grid-row:1/3}.uml-stage code{grid-column:2;font-size:11px}.uml-approval{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 8px 8px;padding-top:6px;border-top:1px solid #d2d2d2;color:#555;font-size:11px}.uml-approval button{flex:0 0 auto;border:1px solid #477a5d;border-radius:2px;background:#edf8f1;color:#174e30;padding:3px 7px;font:600 10px/1.25 system-ui,sans-serif;cursor:pointer}.uml-approval button:disabled{border-color:#bbb;background:#f3f3f3;color:#888;cursor:not-allowed}.uml-react>.uml-snapshot-header{display:block;padding:5px 8px 4px}.uml-header-first-line{display:flex;align-items:center;justify-content:space-between;gap:10px}.uml-header-first-line h3{flex:1 1 auto;min-width:0;margin:0;color:#20282c;text-align:left;font-size:12px;line-height:1.25}.uml-header-first-line h3>span{color:#245f7a;font-family:ui-monospace,monospace;letter-spacing:.04em}.uml-header-description{max-width:620px;margin:2px 0 0;color:#555;text-align:left;font-size:8px}.uml-header-navigation{display:flex;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:6px}.uml-page-continuation{display:inline-flex;flex:0 0 auto;align-items:center;gap:2px;min-height:22px;border:1px solid #86a5b3;border-radius:3px;background:#edf7fa;padding:1px 5px;color:#126b8c;font:850 15px/1 ui-monospace,monospace;animation:uml-continuation-pulse 1.15s ease-in-out infinite alternate}.uml-page-continuation i{display:inline-grid;min-width:14px;place-items:center;font-style:normal}@keyframes uml-continuation-pulse{0%{border-color:#9fb5be;background:#f6fafb;color:#4c7180;box-shadow:none}to{border-color:#167ca4;background:#dff2f8;color:#075c7c;box-shadow:0 0 0 2px #8dcde433}}@media(prefers-reduced-motion:reduce){.uml-page-continuation{animation:none}}.uml-phase-actions,.uml-step-actions{display:flex;align-items:center;flex-wrap:wrap;gap:3px}.uml-phase-actions{flex:0 0 auto;flex-wrap:nowrap;justify-content:flex-end;white-space:nowrap}.uml-phase-actions button,.uml-step-actions button,.uml-edit-toggle,.uml-snapshot-cursor button{border:1px solid #aaa;border-radius:2px;background:#fff;color:#444;cursor:pointer;font:600 9px/1.2 ui-monospace,monospace}.uml-edit-toggle{min-width:42px;padding:3px 7px;border:1px solid #8a9ca5;border-radius:2px;background:#f7f9fa;color:#334d59;cursor:pointer;font:750 9px/1.2 ui-monospace,monospace;letter-spacing:.04em}.uml-edit-toggle.is-active{border-color:#b56b16;background:#fff3df;color:#713c00;box-shadow:inset 0 0 0 1px #f0c78f}.uml-phase-actions button{padding:3px 7px}.uml-phase-actions button[aria-pressed=true]{border-color:#287495;background:#edf7fb;color:#174d64}.uml-step-actions{min-height:0;padding:0;border:0;background:transparent}.uml-step-actions>span{margin-right:4px;color:#555;font:700 9px/1.2 ui-monospace,monospace}.uml-step-actions button{min-width:25px;padding:2px 4px}.uml-step-actions button[data-completed=true]{border-color:#62a47f;background:#edf8f1;color:#14613a}.uml-step-actions button[aria-pressed=true]{border-color:#287495;background:#287495;color:#fff}.uml-step-actions button[data-mode=CODE]:after,.uml-step-actions button[data-mode=RUN]:after{margin-left:3px;font-size:7px;letter-spacing:.02em}.uml-step-actions button[data-mode=CODE]:after{content:"C"}.uml-step-actions button[data-mode=RUN]:after{content:"R"}.uml-snapshot-layout{background:#fff;border-bottom:1px solid #ddd}.uml-step-canvas{min-width:0}.uml-step-canvas .uml-svg-host svg{max-height:none}.uml-step-hit{cursor:pointer;fill:transparent}.uml-step-hit-active{fill:#3ea6ce!important;fill-opacity:.08!important}.uml-step-element{transition:fill .12s ease,stroke .12s ease,stroke-width .12s ease}line.uml-step-element-completed:not(.uml-step-element-active){stroke:#258154!important;stroke-width:1.8px!important}polygon.uml-step-element-completed:not(.uml-step-element-active){fill:#258154!important;stroke:#258154!important}text.uml-step-element-completed:not(.uml-step-element-active){fill:#1d7049!important}line.uml-step-element-active{stroke:#087ca8!important;stroke-width:2.6px!important}polygon.uml-step-element-active{fill:#087ca8!important;stroke:#087ca8!important}text.uml-step-element-active{fill:#075d7d!important;font-weight:700!important}.uml-step-hit:focus{outline:none;stroke:#bd554d;stroke-width:.8px;stroke-dasharray:3 3}.uml-class-svg-active>g>*:not(.uml-class-focus-region):not(.uml-class-step-hit):not(.uml-layout-hit):not(.uml-layout-resize){opacity:.62;transition:opacity .12s ease}.uml-class-svg-active .uml-step-element:not(.uml-step-element-active){opacity:.98!important}.uml-class-svg-active text.uml-step-element-tone-a:not(.uml-step-element-active){fill:#174f69!important}.uml-class-svg-active text.uml-step-element-tone-b:not(.uml-step-element-active){fill:#586581!important}.uml-class-svg-active rect.uml-step-element-tone-a:not(.uml-step-element-active){fill:#eaf5f8!important;stroke:#3f7890!important}.uml-class-svg-active rect.uml-step-element-tone-b:not(.uml-step-element-active){fill:#f2eef8!important;stroke:#7b86a1!important}.uml-class-svg-active path.uml-step-element-tone-a:not(.uml-step-element-active),.uml-class-svg-active line.uml-step-element-tone-a:not(.uml-step-element-active),.uml-class-svg-active polygon.uml-step-element-tone-a:not(.uml-step-element-active){stroke:#3f7890!important}.uml-class-svg-active path.uml-step-element-tone-b:not(.uml-step-element-active),.uml-class-svg-active line.uml-step-element-tone-b:not(.uml-step-element-active),.uml-class-svg-active polygon.uml-step-element-tone-b:not(.uml-step-element-active){stroke:#7b86a1!important}.uml-class-svg-active .uml-step-element-active{opacity:1!important}.uml-class-svg-active text.uml-step-element-active{fill:#b42318!important;font-weight:700!important}.uml-class-svg-active path.uml-step-element-active,.uml-class-svg-active line.uml-step-element-active,.uml-class-svg-active polygon.uml-step-element-active,.uml-class-svg-active rect.uml-step-element-active{stroke:#bd554d!important;stroke-width:1.35px!important}.uml-class-svg-active polygon.uml-step-element-active{fill:#bd554d!important}.uml-class-focus-region{display:none}.uml-step-canvas.is-layout-editing{position:relative;touch-action:none;background-color:#fbfcfd;background-image:linear-gradient(#7d98a20d 1px,transparent 1px),linear-gradient(90deg,#7d98a20d 1px,transparent 1px);background-size:12px 12px}.uml-layout-editing .uml-step-hit,.uml-layout-editing .uml-class-focus-region{pointer-events:none}.uml-layout-hit{fill:#4e9ec4;fill-opacity:.035;stroke:#247a9e;stroke-width:1.1px;stroke-dasharray:5 3;vector-effect:non-scaling-stroke;cursor:grab;pointer-events:all}.uml-layout-hit:hover{fill-opacity:.09;stroke-width:1.6px}.uml-layout-hit.is-selected{fill:#f7a928;fill-opacity:.08;stroke:#b66b00;stroke-width:1.8px;stroke-dasharray:none}.uml-layout-hit:active{cursor:grabbing}.uml-layout-resize{fill:#fff;stroke:#b66b00;stroke-width:1.5px;vector-effect:non-scaling-stroke;cursor:nwse-resize;pointer-events:all}.uml-layout-editor{display:grid;grid-template-columns:minmax(140px,.8fr) minmax(240px,1.8fr) minmax(260px,1.4fr);gap:7px 10px;align-items:end;padding:8px 10px 9px;border-top:2px solid #b97822;background:#f7f5f0;color:#26343a;text-align:left;font:10px/1.3 system-ui,sans-serif}.uml-layout-editor-title{grid-column:1/-1;display:flex;align-items:baseline;gap:9px}.uml-layout-editor-title strong{color:#713c00;font:800 11px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-layout-editor-title span{color:#65737a}.uml-layout-editor-title b{margin-left:auto;color:#9c2f1b;font-size:9px}.uml-layout-editor label{display:grid;gap:2px;color:#52636b;font:700 8px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-layout-editor input,.uml-layout-editor select,.uml-layout-editor textarea{box-sizing:border-box;width:100%;min-width:0;border:1px solid #9ca9ae;border-radius:2px;background:#fff;color:#172126;padding:4px 5px;font:10px/1.25 ui-monospace,monospace;text-transform:none}.uml-layout-editor textarea{resize:vertical;line-height:1.35}.uml-layout-number-grid,.uml-layout-style-grid{display:grid;gap:5px}.uml-layout-number-grid{grid-template-columns:repeat(4,minmax(48px,1fr))}.uml-layout-style-grid{grid-template-columns:repeat(5,minmax(54px,1fr))}.uml-layout-editor-text{align-self:stretch}.uml-layout-editor input[type=color]{min-height:27px;padding:2px}.uml-layout-editor-actions{grid-column:1/-1;display:flex;gap:5px}.uml-layout-editor-actions button{border:1px solid #87979f;border-radius:2px;background:#fff;color:#283940;padding:4px 8px;cursor:pointer;font:700 9px/1.2 ui-monospace,monospace}.uml-layout-editor-actions button.is-primary{border-color:#287495;background:#287495;color:#fff}.uml-layout-editor-actions button.is-danger{margin-left:auto;border-color:#a26156;color:#812b1c}.uml-layout-editor-actions button:disabled{opacity:.45;cursor:not-allowed}.uml-layout-editor output{grid-column:1/-1;min-height:1.2em;color:#52636b;font:9px/1.25 ui-monospace,monospace}@media(max-width:900px){.uml-layout-editor{grid-template-columns:1fr}.uml-layout-editor-title,.uml-layout-editor-actions,.uml-layout-editor output{grid-column:1}}@media print{.uml-edit-toggle,.uml-layout-editor,.uml-layout-hit,.uml-layout-resize{display:none!important}}.uml-snapshot-panel{display:grid;gap:8px;min-width:0;padding:8px;background:#fafafa;font-size:10px}.uml-snapshot-panel>header{display:flex;justify-content:space-between;gap:8px;align-items:center}.uml-snapshot-panel>header>div:first-child>span,.uml-snapshot-panel>header>div:first-child>strong{display:block}.uml-snapshot-panel>header>div:first-child>span{color:#5a5a5a;font:700 9px/1.2 ui-monospace,monospace}.uml-snapshot-panel>header>div:first-child>strong{font-size:12px}.uml-snapshot-panel>header>div:first-child>strong code{display:inline-block;min-width:24px;color:#075d7d}.uml-snapshot-cursor{display:flex;align-items:center;gap:4px}.uml-snapshot-cursor button{width:23px;height:23px;padding:0}.uml-snapshot-cursor button:disabled{opacity:.35;cursor:default}.uml-snapshot-cursor output{min-width:34px;text-align:center;font:700 9px/1 ui-monospace,monospace}.uml-snapshot-description{margin:0;color:#333}.uml-snapshot-panel section{min-width:0;border:1px solid #d0d0d0;background:#fff;padding:7px}.uml-snapshot-panel h4{margin:0 0 4px;color:#315f78;font:700 9px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-state-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;min-width:0}.uml-snapshot-registers dl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:3px;margin:0}.uml-snapshot-registers dl>div{display:grid;grid-template-columns:auto 1fr;gap:5px;min-width:0;padding:2px 4px;border-left:2px solid #bbb;background:#f6f6f6}.uml-snapshot-registers dl>div.primary{grid-column:1/-1;border-color:#287495;background:#edf7fb}.uml-snapshot-registers dt{color:#555;font-weight:700}.uml-snapshot-registers dd,.uml-snapshot-variables dd,.uml-snapshot-memory dd{min-width:0;margin:0;overflow-wrap:anywhere;text-align:right;font:600 9px/1.25 ui-monospace,monospace}.uml-snapshot-variables dl{display:grid;gap:3px;margin:0}.uml-snapshot-variables dl>div{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:5px;padding:3px 5px;border-left:2px solid #5f899b;background:#f5f8f9}.uml-snapshot-variables dt{font-weight:700}.uml-snapshot-variables dt small{display:block;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-variables [data-state=uninitialised],.uml-stack-lane article[data-state=uninitialised]{color:#777;background:#f5f5f5}.uml-snapshot-variables [data-state=uninitialised] dt:after,.uml-stack-lane article[data-state=uninitialised]>strong:after{content:" ?";color:#9a6a00}.uml-arena-snapshot>div{position:relative;height:10px;border:1px solid #666;background:repeating-linear-gradient(90deg,#fff 0 7px,#eee 7px 8px)}.uml-arena-snapshot>div span{display:block;height:100%;background:#b8ddeb}.uml-arena-snapshot>div i{position:absolute;top:-3px;bottom:-3px;width:2px;background:#075d7d;transform:translate(-1px)}.uml-arena-snapshot>p{display:grid;grid-template-columns:1fr auto 1fr;gap:4px;margin:3px 0;font-size:8px}.uml-arena-snapshot>p code:last-child{text-align:right}.uml-arena-bytes{display:block;margin-bottom:4px;overflow-wrap:anywhere;color:#666;font-size:8px}.uml-snapshot-memory dl{display:grid;gap:2px;margin:0}.uml-snapshot-memory dl>div{display:grid;grid-template-columns:1fr auto;gap:4px;padding-top:2px;border-top:1px solid #eee}.uml-snapshot-memory dt{font-weight:700}.uml-snapshot-memory dt small{display:block;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-stack>header{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.uml-snapshot-stack>header>p{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px 9px;margin:0;color:#555;font-size:8px}.uml-stack-axis{display:flex;justify-content:space-between;gap:8px;margin:3px 89px 2px;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-stack-lane{display:flex;align-items:stretch;min-width:0;overflow-x:auto;border:1px solid #66757c;background:#eef1f2}.uml-stack-boundary{display:grid;place-content:center;flex:0 1 82px;min-width:64px;padding:5px;background:#273941;color:#fff;text-align:center;font:700 8px/1.25 ui-monospace,monospace}.uml-stack-boundary small{color:#a9d9eb;font-size:8px;text-transform:uppercase}.uml-stack-gap{display:grid;place-content:center;flex:.7 1 70px;min-width:60px;min-height:52px;border-right:1px dashed #9da8ad;color:#78858b;text-align:center;font:8px/1.2 ui-monospace,monospace}.uml-stack-gap strong,.uml-stack-gap small{display:block}.uml-stack-gap strong{color:#52636b}.uml-stack-gap small{color:#78858b;font-size:8px}.uml-stack-lane article{display:grid;align-content:center;flex:1 1 92px;min-width:76px;padding:5px 7px;border-right:1px solid #9da8ad;background:#fff;text-align:center}.uml-stack-lane article[data-state=initialised]{border-top:3px solid #2c8060}.uml-stack-lane article[data-state=saved]{border-top:3px solid #6d7196;background:#f7f6fb}.uml-stack-lane article strong,.uml-stack-lane article code,.uml-stack-lane article small{display:block;overflow-wrap:anywhere}.uml-stack-lane article strong{font:700 9px/1.2 ui-monospace,monospace}.uml-stack-lane article code{margin:2px 0;color:#1f4555;font-size:8px}.uml-stack-lane article small{color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-observation p{margin:0 0 3px}.uml-snapshot-observation small{display:block;overflow-wrap:anywhere;color:#666;font:8px/1.3 ui-monospace,monospace}.task-conclusion{margin:8px 0 0;padding:7px 9px;border:1px solid #315f78;background:#f3f9fc}.task-conclusion>strong{display:block;margin-bottom:3px;color:#315f78;font:700 10px/1.2 ui-monospace,monospace}.task-conclusion p{margin:0}.asset-source-link{display:inline-block;margin:5px 0;color:#315f78;font:600 11px/1.3 system-ui,sans-serif}.section-sheet--asset .section-heading{align-items:baseline;margin:0 0 1.5mm}.section-sheet--asset .section-heading .section-index{margin-right:4mm;color:#68757b;font-size:10px;font-weight:600}.section-sheet--asset .section-heading .section-title{color:#20282c;font:750 13px/1.2 system-ui,sans-serif}.section-sheet--asset .card-section>p{max-width:110ch;margin:0 0 2mm;color:#58656b;font:9px/1.3 system-ui,sans-serif}.section-sheet--asset .card-asset{margin-top:2mm}.lesson-progress-control{display:inline-flex;align-items:center;margin-right:7px;padding:2px 7px;border:1px solid #8c8c8c;border-radius:12px;background:#fff;cursor:pointer}.lesson-progress-control:disabled{cursor:wait;opacity:.6}.lesson-progress-control[data-status=approved]{background:#e7f6ed;border-color:#18794e}.lesson-progress-topbar{display:flex;flex:none;align-items:center;gap:5px;min-width:0;padding-left:7px;border-left:1px solid #a9b3b8;color:#33444c;font:650 10px/1.2 system-ui,sans-serif;white-space:nowrap}.lesson-progress-topbar strong{color:#52636b;font:800 9px/1 ui-monospace,monospace;letter-spacing:.05em}.lesson-progress-topbar output{min-width:3.8ch;border:1px solid #91a1a8;border-radius:999px;background:#fff;padding:2px 6px;color:#1e566e;text-align:center;font:800 9px/1 ui-monospace,monospace}.lesson-progress-topbar a{color:#245f7a;text-decoration:none}.lesson-progress-topbar a:hover,.lesson-progress-topbar a:focus-visible{text-decoration:underline}.lesson-progress-error{color:#9b1c1c;font-weight:900}.step-row{display:flex;align-items:center;margin:4px 0}.section-anchor{position:relative;top:-45px}.app-load-error{max-width:760px;margin:10vh auto;padding:24px;border:1px solid #9b1c1c;background:#fff;font-family:system-ui,sans-serif}.app-load-error pre{white-space:pre-wrap}@media(max-width:800px){.viewpoint-bar{grid-template-columns:repeat(4,minmax(0,1fr))}.viewpoint-bar button{min-height:28px}.card-library-toggle>span:last-child{display:none}.card-library-toggle{gap:4px;padding-inline:6px}.topbar-nvim-meta{display:none}.topbar-nvim-section .nvim-control-indicator{max-width:42vw;overflow:hidden;text-overflow:ellipsis}.nvim-shortcut-strip,.nvim-work-indicator{display:none}.allocator-panel>header{grid-template-columns:auto 1fr}.allocator-panel>header>small{display:none}.allocator-panel-body{grid-template-columns:1fr}.allocator-metrics,.allocator-facts{display:none}.memory-lanes{grid-template-columns:1fr 1fr}.memory-react>header,.uml-react>header{align-items:flex-start;flex-direction:column}.uml-header-first-line,.uml-header-navigation{width:100%;align-items:flex-start;flex-direction:column}.uml-header-navigation{gap:4px}.memory-actions{justify-content:flex-start}.uml-snapshot-layout{display:block}.uml-step-canvas{border:0}.uml-phase-actions{width:100%;justify-content:flex-end}.uml-state-grid{grid-template-columns:1fr}.uml-snapshot-stack>header{align-items:flex-start;flex-direction:column}.uml-snapshot-stack>header>p{justify-content:flex-start}.uml-stack-axis{margin-right:0;margin-left:0}}@media print{@page card-portrait{size:A4 portrait;margin:0}@page card-landscape{size:A4 landscape;margin:0}.sheet--portrait{page:card-portrait}.sheet--landscape{page:card-landscape}.paper{display:block;gap:0}.paper>.sheet,.paper>.sheet>.sheet-content,.paper>.sheet-spread>.sheet,.paper>.sheet-spread>.sheet>.sheet-content{height:auto;min-height:0;max-height:none;overflow:visible}.sheet-spread{display:contents!important}.viewer-chrome,.side-panel-dock,.memory-react{display:none!important}.asset-static-fallback{display:block!important;width:100%}.uml-actions,.uml-phase-actions,.uml-step-actions,.uml-snapshot-panel,.uml-stage,.uml-approval,.asset-source-link,.lesson-progress-topbar,.lesson-progress-control,.uml-page-continuation{display:none!important}} +.paper{display:flex;flex-direction:column;gap:3.3cm}.paper>.sheet,.paper>.sheet-spread>.sheet{width:210mm;height:297mm;min-height:297mm;max-height:297mm;margin:0 auto;overflow:hidden}.paper>.sheet.sheet--landscape,.paper>.sheet-spread>.sheet.sheet--landscape{width:297mm;min-width:297mm;max-width:297mm;height:210mm;min-height:210mm;max-height:210mm}.paper>.sheet>.sheet-content,.paper>.sheet-spread>.sheet>.sheet-content{box-sizing:border-box;height:297mm;min-height:297mm;max-height:297mm;overflow-x:hidden;overflow-y:hidden}.paper>.sheet.sheet--landscape>.sheet-content,.paper>.sheet-spread>.sheet.sheet--landscape>.sheet-content{height:210mm;min-height:210mm;max-height:210mm}.page-resource-footer{position:absolute;z-index:4;right:21.5mm;bottom:3mm;left:21.5mm;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:8px;min-height:5mm;border-top:.35mm solid #252525;background:#fff;padding-top:1.2mm;color:#68747a;font:650 7px/1.15 ui-monospace,monospace}.page-resource-footer__uuid{overflow:hidden;color:#4d5d65;text-align:left;text-overflow:ellipsis;white-space:nowrap;font:inherit}.page-resource-footer__author{color:#4d5d65;text-align:center;white-space:nowrap}.page-resource-footer__page{color:#283940;text-align:right;white-space:nowrap}.sheet-spread{display:contents}.paper.is-diagram-spread .sheet-spread{display:grid;grid-template-columns:repeat(var(--spread-columns, 1),max-content);width:max-content;max-width:none;margin:0 auto;align-items:flex-start;gap:2mm;zoom:var(--spread-fit-scale, 1)}.paper.is-diagram-spread .sheet-spread>.sheet{flex:0 0 auto}.viewer-chrome{position:sticky;top:0;z-index:80;width:100%}.viewer-action-toast{position:absolute;z-index:12;right:9px;bottom:9px;max-width:min(720px,calc(100vw - 18px));box-sizing:border-box;overflow:hidden;border:1px solid #42b8e7;border-radius:3px;background:#102c38ee;color:#dff7ff;padding:5px 9px;box-shadow:0 4px 14px #0007;text-overflow:ellipsis;white-space:nowrap;font:750 10px/1.25 ui-monospace,monospace}.viewer-chrome .topbar{position:sticky;top:0;z-index:90}.viewpoint-bar{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:1px;min-height:31px;border-top:1px solid #9aa8ae;border-bottom:1px solid #718087;background:#718087;box-shadow:0 2px 5px #0002}.viewpoint-bar button{position:relative;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:5px;min-width:0;border:0;background:#f7f9fa;color:#1f3038;padding:5px 7px;text-align:left;cursor:pointer}.viewpoint-bar button:hover,.viewpoint-bar button:focus-visible{z-index:1;background:#e9f3f7;outline:2px solid #287495;outline-offset:-2px}.viewpoint-bar button[aria-current=location]{background:#dcecf3;box-shadow:inset 0 -3px #167ca4}.viewpoint-bar button>span{color:#1b6785;font:850 10px/1 ui-monospace,monospace}.viewpoint-bar button>strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:750 10px/1.1 system-ui,sans-serif}.viewpoint-bar button.is-unavailable{background:#eef0f1;color:#5d686d;cursor:not-allowed}.viewpoint-bar button.is-unavailable>span{color:#68747a}.viewpoint-bar button.is-unavailable>small{border:1px solid #9da7ab;border-radius:2px;padding:1px 3px;font:750 7px/1 ui-monospace,monospace}.card-library-toggle{display:inline-flex;align-items:center;flex:none;height:28px;gap:6px;border:1px solid #6e7d84;border-radius:3px;background:#f6f8f9;color:#26373f;padding:2px 8px;font:750 11px/1 ui-monospace,monospace;cursor:pointer}.card-library-toggle:hover,.card-library-toggle:focus-visible{border-color:#1d7799;background:#edf7fa;outline:none}.card-library-toggle.is-active{border-color:#126d8f;background:#174f67;color:#fff}.card-library-toggle-icon{font:700 16px/1 system-ui,sans-serif}.card-library-toggle kbd{color:#267697;font:inherit}.card-library-toggle.is-active kbd{color:#aee9ff}.runtime-source-selector{display:inline-flex;align-items:center;flex:none;height:28px;box-sizing:border-box;gap:5px;border:1px solid #6e7d84;border-radius:3px;background:#edf2f4;color:#44545b;padding-left:7px;font:750 9px/1 ui-monospace,monospace;letter-spacing:.05em}.runtime-source-selector select{height:26px;min-width:17ch;max-width:19ch;border:0;border-left:1px solid #a8b4b9;border-radius:0 2px 2px 0;background:#fff;color:#174f67;padding:2px 22px 2px 7px;font:800 10px/1 ui-monospace,monospace;cursor:pointer}.runtime-source-selector select:hover,.runtime-source-selector select:focus-visible{background:#edf7fa;outline:2px solid #287495;outline-offset:-2px}.runtime-source-selector option:disabled{color:#7d898e}:root{--side-panel-top: 36px;--side-panel-width: min(960px, calc(100vw - 28px) );--side-panel-trigger-length: 56px}.side-panel-dock{position:fixed;z-index:240;top:var(--side-panel-top);bottom:0;width:0;pointer-events:none}.side-panel-dock--left{left:0}.side-panel-dock--right{right:0}.side-panel-rail{position:fixed;z-index:243;top:calc(var(--side-panel-top) + 8px);display:flex;width:13px;flex-direction:column;gap:10px;pointer-events:auto}.side-panel-dock--left .side-panel-rail{left:0}.side-panel-dock--right .side-panel-rail{right:0}.side-panel-trigger{--side-panel-accent: #167ca4;position:relative;display:grid;width:13px;height:var(--side-panel-trigger-length);place-items:center;border:0;border-radius:0;background:transparent;padding:0;cursor:pointer}.side-panel-trigger:before{content:"";display:block;width:3px;height:calc(var(--side-panel-trigger-length) - 8px);border-radius:999px;background:var(--side-panel-accent);box-shadow:0 0 0 1px #ffffff73,0 3px 10px -5px var(--side-panel-accent);opacity:.78;transition:width .14s ease,opacity .14s ease,box-shadow .14s ease}.side-panel-trigger:hover:before,.side-panel-trigger:focus-visible:before,.side-panel-trigger.is-open:before{width:4px;opacity:1}.side-panel-trigger.is-pinned:before{width:5px;box-shadow:0 0 0 1px #ffffff9e,0 3px 12px -4px var(--side-panel-accent)}.side-panel-trigger:focus-visible{outline:2px solid var(--side-panel-accent);outline-offset:-2px}.side-panel-trigger>span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.side-panel{position:fixed;z-index:241;top:var(--side-panel-top);bottom:0;display:flex;width:var(--side-panel-width);max-width:calc(100vw - 20px);box-sizing:border-box;flex-direction:column;overflow:hidden;border-color:#819098;background:#f7f9fa;color:#17252c;pointer-events:none;transition:transform .18s cubic-bezier(.22,.78,.24,1);will-change:transform}.side-panel-dock--left .side-panel{left:0;border-right:1px solid #819098;box-shadow:15px 0 34px -24px #101b218c;transform:translate(calc(-100% - 14px))}.side-panel-dock--right .side-panel{right:0;border-left:1px solid #819098;box-shadow:-15px 0 34px -24px #101b218c;transform:translate(calc(100% + 14px))}.side-panel.is-open{transform:translate(0);pointer-events:auto}.side-panel:after{content:"";position:absolute;top:10px;width:4px;height:48px;border-radius:999px;background:var(--side-panel-accent);pointer-events:none}.side-panel-dock--left .side-panel:after{right:-2px}.side-panel-dock--right .side-panel:after{left:-2px}.side-panel-header{display:flex;min-height:38px;box-sizing:border-box;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid #aebbc1;background:#e7edef;padding:4px 7px 4px 10px}.side-panel-header>div:first-child{display:flex;min-width:0;align-items:baseline;gap:7px}.side-panel-header small{color:#52666f;font:600 16px/1 ui-monospace,monospace;letter-spacing:.08em}.side-panel-header strong{overflow:hidden;color:#11191d;text-overflow:ellipsis;white-space:nowrap;font:600 16px/1.2 system-ui,sans-serif}.side-panel-actions{display:flex;flex:none;gap:4px}.side-panel-actions button{display:grid;min-width:38px;height:24px;place-items:center;border:1px solid #8b999f;border-radius:3px;background:#fff;color:#26373f;padding:0 6px;font:650 16px/1 ui-monospace,monospace;cursor:pointer}.side-panel-actions button:last-child{min-width:24px;padding:0;font-size:18px}.side-panel-actions button:hover,.side-panel-actions button:focus-visible,.side-panel-actions button.is-pinned{border-color:var(--side-panel-accent);background:#edf7fa;outline:none}.side-panel-body,.card-library-panel{display:flex;min-height:0;flex:1;flex-direction:column;overflow:hidden}.card-library-header{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:18px 18px 15px;border-bottom:1px solid #bdc9ce;background:#e8eef1}.card-library-header small{color:#52666f;font:600 16px/1.25 ui-monospace,monospace;letter-spacing:.09em;text-transform:uppercase}.card-library-header h2{margin:4px 0 2px;font:750 22px/1.15 system-ui,sans-serif}.card-library-header p{margin:0;color:#607078;font:500 16px/1.35 system-ui,sans-serif}.card-library-header>button{display:grid;width:34px;height:34px;place-items:center;flex:none;border:1px solid #77878e;border-radius:3px;background:#fff;color:#25353c;padding:0;font:25px/1 system-ui,sans-serif;cursor:pointer}.card-library-header>button:hover,.card-library-header>button:focus-visible{border-color:#126d8f;background:#edf7fa;outline:2px solid #85c5dc;outline-offset:1px}.card-library-tree{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:6px 0 18px;scrollbar-color:#8a9aa1 #edf1f3}.card-library-tree details{border:0}.card-library-tree summary{display:grid;grid-template-columns:14px minmax(0,1fr) auto;align-items:center;gap:6px;min-height:30px;box-sizing:border-box;padding:5px 10px 5px 4px;list-style:none;cursor:pointer;user-select:none}.card-library-tree summary::-webkit-details-marker{display:none}.card-library-tree summary:hover,.card-library-tree summary:focus-visible{background:#eaf1f4;outline:none}.card-library-branch{color:#25363d;font:16px/1 ui-monospace,monospace;transform:rotate(-90deg);transition:transform .12s ease}.card-library-tree details[open]>summary .card-library-branch{transform:rotate(0)}.card-library-tree summary strong,.card-library-tree summary small{display:block}.card-library-tree summary strong{color:#070a0b;font:550 16px/1.3 system-ui,sans-serif}.card-library-tree summary small{margin-top:2px;color:#303b40;font:500 16px/1.25 ui-monospace,monospace;letter-spacing:.04em}.card-library-tree summary output{min-width:22px;color:#26363d;padding:0 2px;text-align:center;font:550 16px/1.2 ui-monospace,monospace}.card-library-subject>summary{min-height:42px;border-bottom:1px solid #9eacb2;background:#dfe8ec;padding:7px 14px}.card-library-subject>summary:hover,.card-library-subject>summary:focus-visible{background:#d5e1e5}.card-library-subject>summary strong{color:#000;font:600 16px/1.3 system-ui,sans-serif}.card-library-subject>summary small{color:#28353a;font:500 16px/1.25 ui-monospace,monospace}.card-library-level-list{margin-left:18px;border-left:1px solid #8e9da4}.card-library-level>summary{min-height:38px;border-bottom:1px solid #cbd4d8;padding-left:8px}.card-library-level>summary strong{color:#000;font:550 16px/1.3 system-ui,sans-serif}.card-library-series-list{margin-left:18px;border-left:1px solid #a5b1b6;padding:2px 0 6px}.card-library-series>summary{min-height:34px;padding-left:8px}.card-library-series>summary strong{color:#000;font:550 16px/1.3 system-ui,sans-serif}.card-library-series>summary small{color:#26343a;font:500 16px/1.25 ui-monospace,monospace}.card-library-cards,.card-library-tasks{list-style:none;margin-top:0;margin-bottom:2px;padding:0}.card-library-cards{margin-left:18px;border-left:1px solid #bac3c7}.card-library-card-entry{margin:0}.card-library-card{display:grid;grid-template-columns:19px minmax(0,1fr) auto;align-items:start;gap:5px;min-height:38px;box-sizing:border-box;border:0;border-left:3px solid transparent;color:#000;padding:5px 8px 5px 3px;text-decoration:none}.card-library-node{color:#536168;font:16px/1.35 ui-monospace,monospace}.card-library-card-copy,.card-library-card-copy strong,.card-library-card-copy>span{display:block;min-width:0}.card-library-card-copy strong{color:#000;font:550 16px/1.3 ui-monospace,monospace}.card-library-card-copy>span{margin-top:2px;color:#0b0d0e;font:500 16px/1.35 system-ui,sans-serif;white-space:normal}.card-library-card-meta{display:flex;align-items:flex-end;flex-direction:column;gap:2px}.card-library-card-meta small{color:#26343a;font:500 16px/1.25 ui-monospace,monospace}.card-library-card.is-available{cursor:pointer}.card-library-card.is-available:hover,.card-library-card.is-available:focus-visible{background:#eaf5f8;outline:none}.card-library-card.is-current{border-left-color:#16769b;background:#dff1f7}.card-library-card.is-current:hover,.card-library-card.is-current:focus-visible{background:#cfeaf3;outline:1px solid #5ba9c4;outline-offset:-1px}.card-library-card.is-unavailable{color:#000}.card-library-card.is-unavailable .card-library-card-copy strong,.card-library-card.is-unavailable .card-library-card-meta small{color:#1d292e}.card-library-card.is-unavailable .card-library-card-copy>span{color:#0b0d0e}.card-library-tasks{margin-left:36px;border-left:1px solid #c3cacc}.card-library-tasks li>a,.card-library-tasks li>span{display:grid;grid-template-columns:19px auto minmax(0,1fr);gap:5px;align-items:start;color:#000;padding:4px 8px 5px 3px;text-decoration:none}.card-library-tasks li>a:hover,.card-library-tasks li>a:focus-visible{background:#eaf5f8;outline:none}.card-library-tasks strong{color:#000;font:550 16px/1.35 ui-monospace,monospace}.card-library-tasks li>a>span:last-child,.card-library-tasks li>span>span:last-child{color:#111;font:500 16px/1.35 system-ui,sans-serif}.card-library-footer{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:10px 16px;border-top:1px solid #bdc9ce;background:#edf1f3;color:#5a6a72;font:500 16px/1.3 system-ui,sans-serif}.card-library-footer span{display:inline-flex;align-items:center;gap:4px}.card-library-footer i{width:7px;height:7px;border-radius:50%;background:#929da2}.card-library-footer i.is-online{background:#26815b}.card-library-footer kbd{margin-left:auto;border:1px solid #a2afb5;border-radius:2px;background:#fff;padding:2px 5px;font:600 16px/1 ui-monospace,monospace}.card-library-treegrid{min-height:0;flex:1;overflow:auto;margin:8px;border:1px solid rgb(31 35 40 / 18%);border-radius:6px;background:#fff;scrollbar-color:#93a2a8 #edf1f2;scrollbar-width:thin}.card-library-treegrid-row{display:grid;min-width:760px;min-height:38px;box-sizing:border-box;grid-template-columns:minmax(500px,1fr) 110px 120px;align-items:stretch;border-bottom:1px solid rgb(31 35 40 / 9%);color:#273941;font:500 16px/1.25 ui-monospace,monospace}.card-library-treegrid-row>[role=gridcell],.card-library-treegrid-row>[role=columnheader]{display:flex;min-width:0;align-items:center;overflow:hidden;padding:7px 9px;text-overflow:ellipsis;white-space:nowrap}.card-library-treegrid-row>[role=gridcell]+[role=gridcell],.card-library-treegrid-row>[role=columnheader]+[role=columnheader]{border-left:1px solid rgb(31 35 40 / 9%)}.card-library-treegrid-head{position:sticky;z-index:3;top:0;min-height:34px;border-bottom-color:#1f232833;background:#eef1f2;color:#3e525b;font-weight:700;letter-spacing:.045em}.card-library-treegrid-row:not(.card-library-treegrid-head):hover{background:#1f23280a}.card-library-treegrid-row.is-subject{background:#dfe8e5}.card-library-treegrid-row.is-level{background:#f5f8f8}.card-library-treegrid-row.is-series{background:#f9fbfb}.card-library-treegrid-row.is-card{min-height:42px;background:#fff}.card-library-treegrid-row.is-task{background:#fbfcfc}.card-library-treegrid-row.is-current{box-shadow:inset 3px 0 #1680a5;background:#e1f1f6}.card-library-tree-title{gap:6px;padding-left:calc(8px + (var(--card-library-depth, 0) * 21px))!important;font-family:system-ui,sans-serif}.card-library-tree-expander{display:inline-grid;width:24px;height:24px;flex:none;place-items:center;border:0;background:transparent;color:#405961;padding:0;font:18px/1 ui-monospace,monospace;cursor:pointer}.card-library-tree-expander:hover,.card-library-tree-expander:focus-visible{background:#165d6b1a;color:#165d6b;outline:1px solid rgb(22 93 107 / 28%)}.card-library-tree-expander.is-empty{cursor:default}.card-library-tree-link,.card-library-tree-label{display:flex;min-width:0;align-items:baseline;gap:7px;overflow:hidden;color:#10181c;text-decoration:none;white-space:nowrap}.card-library-tree-link:hover,.card-library-tree-link:focus-visible{color:#075d7c;outline:none;text-decoration:underline;text-underline-offset:2px}.card-library-tree-link strong,.card-library-tree-label strong{flex:none;color:inherit;font:700 16px/1.25 ui-monospace,monospace}.card-library-tree-link>span,.card-library-tree-label>span{min-width:0;overflow:hidden;color:inherit;text-overflow:ellipsis;white-space:nowrap;font:500 16px/1.25 system-ui,sans-serif}.card-library-treegrid-row.is-subject .card-library-tree-label strong,.card-library-treegrid-row.is-level .card-library-tree-label strong,.card-library-treegrid-row.is-series .card-library-tree-label strong{font-family:system-ui,sans-serif;font-weight:650}.card-library-tree-state{display:inline-flex;min-width:76px;min-height:24px;box-sizing:border-box;align-items:center;justify-content:center;border:1px solid transparent;border-radius:5px;color:#33474f;padding:2px 7px;font:650 14px/1 ui-monospace,monospace;white-space:nowrap}.card-library-tree-state[data-state=current]{border-color:#3184a0;background:#e9f5f8;color:#075d7c}.card-library-tree-state[data-state=online]{border-color:#4b9a7a;background:#edf8f2;color:#176144}.card-library-tree-state[data-state=plan]{border-color:#c59a49;background:#fff7e5;color:#775313}.card-library-treegrid-row.is-unavailable .card-library-tree-label,.card-library-treegrid-row.is-unavailable .card-library-tree-label strong{color:#10181c}.side-toc,.side-progress{min-height:0;flex:1;overflow-y:auto;background:#fff;color:#11191d}.side-toc>header,.side-progress>header{padding:16px 18px 13px;border-bottom:1px solid #bdc9ce;background:#f0f4f5}.side-toc>header small,.side-progress>header small{color:#53666f;font:750 9px/1 ui-monospace,monospace;letter-spacing:.08em}.side-toc>header h2,.side-progress>header h2{margin:4px 0 0;color:#10181c;font:750 21px/1.15 system-ui,sans-serif}.side-toc ol{margin:0;padding:7px 0 20px;list-style:none}.side-toc li{border-bottom:1px solid #e2e7e9}.side-toc a{display:grid;grid-template-columns:34px minmax(0,1fr);gap:9px;align-items:baseline;padding:10px 16px;color:#11191d;text-decoration:none}.side-toc a:hover,.side-toc a:focus-visible{background:#eaf5f8;outline:none}.side-toc a span{color:#267493;font:800 10px/1 ui-monospace,monospace}.side-toc a strong{font:650 13px/1.3 system-ui,sans-serif}.side-progress-summary{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:16px;border:1px solid #b6c2c7;background:#f4f7f8;padding:14px;font:650 13px/1.3 system-ui,sans-serif}.side-progress-summary strong{color:#1d617b;font:850 20px/1 ui-monospace,monospace}.side-progress-links{display:grid;gap:8px;padding:0 16px 18px}.side-progress-links a{border:1px solid #87979e;border-radius:3px;background:#fff;color:#174f67;padding:10px 12px;text-decoration:none;font:700 12px/1.2 system-ui,sans-serif}.side-progress-links a:hover,.side-progress-links a:focus-visible{border-color:#167ca4;background:#edf7fa;outline:none}.side-progress-error{margin:0 16px 14px;border-left:3px solid #a52d2d;background:#fff1f1;color:#7d1f1f;padding:8px 10px;font:12px/1.35 system-ui,sans-serif}.classroom-panel{display:flex;min-height:0;flex:1;flex-direction:column;overflow:hidden;background:#f7f9fa;color:#11191d}.classroom-treegrid{min-height:0;flex:1;overflow:auto;margin:8px;border:1px solid rgb(31 35 40 / 18%);border-radius:6px;background:#fff;scrollbar-color:#93a2a8 #edf1f2;scrollbar-width:thin}.classroom-treegrid-row{display:grid;min-width:920px;box-sizing:border-box;grid-template-columns:minmax(410px,1fr) 100px 150px 150px 110px;align-items:center;border-bottom:1px solid rgb(31 35 40 / 8%);color:#273941;font:500 16px/1.25 ui-monospace,monospace}.classroom-treegrid-row>[role=gridcell],.classroom-treegrid-row>[role=columnheader]{min-width:0;overflow:hidden;padding:8px;text-overflow:ellipsis;white-space:nowrap}.classroom-treegrid-row>[role=gridcell]+[role=gridcell],.classroom-treegrid-row>[role=columnheader]+[role=columnheader]{border-left:1px solid rgb(31 35 40 / 8%)}.classroom-treegrid-head{position:sticky;z-index:2;top:0;border-bottom-color:#1f23282e;background:#eef1f2;color:#3e525b;font-weight:650;letter-spacing:.04em}.classroom-node-row:hover{background:#1f23280a}.classroom-node-row.is-class{background:#dfe8e5}.classroom-node-row.is-student{background:#f8faf9}.classroom-node-row.is-task{background:#edf3f5}.classroom-node-row.is-block,.classroom-node-row.is-exercises{background:#f5f7f8}.classroom-node-row.is-phase{background:#fafbfb}.classroom-node-title{display:flex;align-items:center;gap:6px;padding-left:calc(8px + (var(--classroom-depth, 0) * 20px))!important;font-family:system-ui,sans-serif}.classroom-node-title strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:500}.classroom-node-row.is-class .classroom-node-title strong,.classroom-node-row.is-student .classroom-node-title strong,.classroom-node-row.is-task .classroom-node-title strong{font-weight:650}.classroom-expander{display:inline-grid;width:24px;height:24px;flex:none;place-items:center;border:0;background:transparent;color:#405961;padding:0;font:18px/1 ui-monospace,monospace;cursor:pointer}.classroom-expander:hover,.classroom-expander:focus-visible{background:#165d6b1a;color:#165d6b;outline:1px solid rgb(22 93 107 / 28%)}.classroom-expander.is-empty{cursor:default}.classroom-status,.classroom-sync,.classroom-visit,.classroom-commit{display:inline-flex;min-width:92px;box-sizing:border-box;align-items:center;justify-content:center;border:1px solid;border-radius:5px;padding:4px 6px;font:550 16px/1 ui-monospace,monospace;letter-spacing:.015em}.classroom-status[data-status=online]{border-color:#6b9a87;background:#e7f4ee;color:#155e43}.classroom-status[data-status=away]{border-color:#baa06a;background:#fff5d9;color:#765510}.classroom-status[data-status=offline]{border-color:#a5afb3;background:#f0f2f3;color:#596970}.classroom-status[data-status=error]{border-color:#bd7b7b;background:#fff0f0;color:#8c2929}.classroom-sync[data-sync=follow]{border-color:#6c98aa;background:#e8f3f7;color:#155c77}.classroom-sync[data-sync=paused]{border-color:#baa06a;background:#fff6df;color:#765510}.classroom-sync[data-sync=local]{border-color:#9a86ae;background:#f4eef9;color:#65427c}.classroom-visit[data-visit=present],.classroom-commit[data-commit=committed]{border-color:#6b9a87;background:#e7f4ee;color:#155e43}.classroom-visit[data-visit=missed],.classroom-commit[data-commit=missing]{border-color:#bd7b7b;background:#fff0f0;color:#8c2929}.classroom-visit[data-visit=pending],.classroom-commit[data-commit=working]{border-color:#baa06a;background:#fff6df;color:#765510}.classroom-legend{display:flex;flex:none;flex-wrap:wrap;gap:7px 12px;border-top:1px solid #aebbc1;background:#edf1f2;padding:9px 11px;color:#485c65;font:500 16px/1.35 system-ui,sans-serif}.classroom-legend span{display:inline-flex;align-items:center;gap:4px}.classroom-legend i{width:12px;height:12px;border:1px solid #73858c;border-radius:50%;background:#aeb7bb}.classroom-legend i[data-status=online]{border-color:#3e7c63;background:#45a27b}.classroom-legend i[data-status=away]{border-color:#a0782d;background:#dcae51}.classroom-legend i[data-status=offline]{border-color:#859399;background:#b6c0c4}.classroom-legend b{color:#65427c;font:600 16px/1 ui-monospace,monospace}.viewer-chrome.is-nvim-fit{display:flex;width:100%;height:100vh;height:100dvh;max-height:100dvh;flex-direction:column;overflow:hidden;background:#11171a}.viewer-chrome.is-nvim-fit .topbar,.viewer-chrome.is-nvim-fit .viewpoint-bar,.viewer-chrome.is-nvim-fit .allocator-panel{flex:none}.viewer-chrome.is-nvim-fit .nvim-panel{display:flex;min-height:0;flex:1;flex-direction:column}.viewer-chrome.is-nvim-fit .nvim-screen-scroll{min-height:0;height:auto!important;flex:1}.viewer-chrome.is-nvim-fit .nvim-resize-handle{display:none}.viewer-chrome.is-nvim-fit .nvim-screen-stage{width:100%;height:100%;margin:0;zoom:1}.viewer-chrome.is-nvim-fit .nvim-screen-content{right:1mm;overflow:hidden;scrollbar-width:none}.viewer-chrome.is-nvim-fit .nvim-screen-grid{display:flex;width:100%;min-height:0;height:100%;align-items:center;justify-content:center}.viewer-chrome.is-nvim-fit .nvim-screen{width:auto!important;height:auto!important;max-width:100%;max-height:100%}.viewer-chrome.is-nvim-fit .nvim-screen-content::-webkit-scrollbar{display:none}.topbar-nvim-section{display:flex;align-items:center;min-width:0;gap:6px}.nvim-toolbar-boundary{flex:none;color:#6f7d83;font:700 14px/1 ui-monospace,monospace}.nvim-toolbar-context{flex:none;width:5ch;color:#263238;font:800 12px/1 ui-monospace,monospace;letter-spacing:.08em;text-align:center}.nvim-toolbar-actions{display:flex;align-items:center;gap:3px}.nvim-toolbar-button{display:inline-flex;align-items:center}.nvim-toolbar-key{flex:0 0 2ch;color:#267697;font:inherit;text-align:center}.nvim-toolbar-label{flex:0 0 5ch;max-width:5ch;overflow:hidden;text-align:left;white-space:nowrap}.topbar-nvim-meta{display:flex;align-items:baseline;min-width:0;max-width:min(44vw,720px);gap:6px}.topbar-nvim-meta strong,.topbar-nvim-meta small{overflow:auto;text-overflow:ellipsis;white-space:nowrap}.topbar-nvim-meta strong{color:#263238;font:700 12px/1.25 system-ui,sans-serif}.topbar-nvim-meta small{color:#66747a;font:500 10px/1.25 system-ui,sans-serif}.viewer-nvim-toggle{border:1px solid #68747a;border-radius:3px;background:#fff;color:#263238;padding:2px 8px;font:650 16px/1.3 system-ui,sans-serif;cursor:pointer}.viewer-nvim-toggle[aria-pressed=true]{border-color:#267697;background:#eaf6fb;color:#174d64}.allocator-panel{width:100%;box-sizing:border-box;border-top:1px solid #40515a;border-bottom:1px solid #40515a;background:#f7f9f5;color:#182127;box-shadow:0 4px 12px #0002;font:11px/1.25 system-ui,sans-serif}.allocator-panel>header{display:grid;grid-template-columns:125px minmax(260px,auto) 1fr;gap:8px;align-items:baseline;min-height:22px;padding:3px 8px;border-bottom:1px solid #b7c1c4;background:#e8eef0}.allocator-panel>header>span{color:#166987;font:800 9px/1.2 ui-monospace,monospace;letter-spacing:.06em}.allocator-panel>header>strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:750 11px/1.2 ui-monospace,monospace}.allocator-panel>header>small{overflow:hidden;color:#536168;text-overflow:ellipsis;white-space:nowrap}.allocator-panel-body{display:grid;grid-template-columns:230px minmax(420px,1fr) minmax(310px,.8fr);gap:9px;align-items:stretch;padding:5px 8px 7px}.allocator-metrics{display:grid;grid-template-columns:1fr 1fr;gap:3px 8px;margin:0}.allocator-metrics>div{min-width:0;border-left:2px solid #8ea2ab;padding-left:5px}.allocator-metrics dt{color:#627077;font:750 7px/1.2 ui-monospace,monospace;letter-spacing:.05em}.allocator-metrics dd{margin:1px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:700 10px/1.2 ui-monospace,monospace}.allocator-arena-view{min-width:0}.allocator-arena-view.is-inactive{opacity:.42}.allocator-arena-labels{display:flex;justify-content:space-between;gap:8px;margin-bottom:3px;color:#536168;font:700 8px/1.2 ui-monospace,monospace}.allocator-arena-labels strong{color:#075f80}.allocator-pinned-arena{position:relative;display:grid;grid-template-columns:repeat(var(--allocator-size),minmax(2px,1fr));height:32px;border:1px solid #28343a;background:#fff}.allocator-pinned-arena i{min-width:0;border-right:1px solid #e1e5e6;background:#fbfcfc}.allocator-pinned-arena i:nth-child(8n){border-right-color:#87969d}.allocator-pinned-arena i.is-allocated{border-right-color:#b2d8e6;background:#43a8ce}.allocator-cursor{position:absolute;z-index:2;top:-4px;bottom:-4px;width:2px;background:#d02d25;transform:translate(-1px);box-shadow:0 0 0 1px #fff9}.allocator-cursor:before{content:"allocp";position:absolute;top:1px;left:4px;color:#8d1d17;font:800 7px/1 ui-monospace,monospace}.allocator-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 7px;min-width:0}.allocator-facts>div{display:flex;min-width:0;justify-content:space-between;gap:5px;border-bottom:1px dotted #b4bec2}.allocator-facts span{overflow:hidden;color:#46565e;text-overflow:ellipsis;white-space:nowrap}.allocator-facts code{overflow:hidden;color:#142e39;text-overflow:ellipsis;white-space:nowrap;font:700 9px/1.3 ui-monospace,monospace}.allocator-facts p{grid-column:1 / -1;margin:0;color:#647278}.nvim-panel{width:100%;box-sizing:border-box;border-bottom:1px solid #52616a;background:var(--desk, #eee);color:#e7eef1;box-shadow:0 5px 16px #0004;font:12px/1.3 system-ui,sans-serif}.nvim-status{flex:none;border:1px solid #66757c;border-radius:999px;padding:1px 6px;color:#c9d3d8;font:750 9px/1.35 ui-monospace,monospace;letter-spacing:.04em}.nvim-status--connected,.nvim-status--ready{border-color:#31a86d;background:#173b2a;color:#8aefb7}.nvim-status--connecting,.nvim-status--replaying,.nvim-status--verifying{border-color:#c38f2a;background:#3e321b;color:#ffd47d}.nvim-status--failed,.nvim-status--offline,.nvim-status--unselected{border-color:#a34b4b;background:#3b2020;color:#faa}.nvim-control-indicator{flex:none;border:1px solid #60747e;border-radius:3px;background:#222e34;color:#b9c6cc;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.04em;white-space:nowrap;cursor:pointer}.nvim-control-indicator.is-active{border-color:#3cb3e2;background:#17465a;color:#d9f5ff}.nvim-control-indicator.is-engaged{box-shadow:inset 0 0 0 1px #8ee4ff}.nvim-work-indicator{flex:none;border:1px solid #7a878d;border-radius:3px;background:#f4f6f7;color:#56646a;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap;cursor:pointer}.nvim-work-indicator.is-active{border-color:#cf3d31;background:#fff0ee;color:#9f241b}.nvim-work-indicator.is-engaged{box-shadow:inset 0 0 0 1px #cf3d31}.nvim-work-indicator:disabled{border-color:#a8b0b4;background:#e6e9ea;color:#7c878c;cursor:not-allowed;opacity:.8}.nvim-height-toggle{flex:none;border:1px solid #75848b;border-radius:3px;background:#f4f6f7;color:#425159;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap;cursor:pointer}.nvim-height-toggle.is-active{border-color:#267697;background:#eaf6fb;color:#174d64}.topbar-nvim-section .nvim-toolbar-button{flex:0 0 9.5ch;width:9.5ch;min-width:9.5ch;max-width:9.5ch;height:24px;box-sizing:border-box;justify-content:flex-start;gap:.55ch;padding:2px .55ch;font:750 12px/1 ui-monospace,monospace;letter-spacing:0}.nvim-shortcut-strip{flex:none;color:#536168;font:650 10px/1.2 ui-monospace,monospace;white-space:nowrap}.nvim-shortcut-strip kbd{color:#263238;font:inherit}.nvim-screen-scroll{position:relative;width:100%;box-sizing:border-box;height:var(--nvim-panel-height, 75vh);max-height:none;min-height:240px;overflow:auto;overscroll-behavior:contain;background:var(--desk, #eee);outline:none;scrollbar-color:#58666d #171d20}.nvim-screen-stage{position:relative;width:210mm;margin:0 auto;background:#fff;zoom:var(--viewer-canvas-scale)}.nvim-screen-surface{position:absolute;inset:0 4mm;box-sizing:border-box;padding:1mm;background:#fff}.nvim-screen-frame{position:relative;height:100%;box-sizing:border-box;border:1px solid #267697;background:#101315;box-shadow:0 0 0 3px #000}.nvim-screen-scroll[data-sync=on] .nvim-screen-frame{border-color:#35b9ef}.nvim-screen-scroll[data-control=true] .nvim-screen-frame{box-shadow:0 0 0 3px #cf3d31}.nvim-screen-scroll[data-control=true]{cursor:text}.nvim-screen-content{position:absolute;inset:1mm -5mm 1mm 1mm;overflow-x:hidden;overflow-y:scroll;overscroll-behavior:contain;background:transparent;scrollbar-width:thin;scrollbar-color:#829097 #fff}.nvim-screen-grid{width:calc(100% - 6mm);min-height:100%;background:#101315}.nvim-screen-content::-webkit-scrollbar{width:.8mm}.nvim-screen-content::-webkit-scrollbar-track{background:#fff}.nvim-screen-content::-webkit-scrollbar-thumb{border:.12mm solid #fff;border-radius:99px;background:#829097}.nvim-screen-content::-webkit-scrollbar-thumb:hover{background:#aeb9be}.nvim-screen{display:block;max-width:none;margin:0;outline:none;image-rendering:auto}.nvim-screen:focus{box-shadow:none}.nvim-screen-empty{position:absolute;inset:0;display:grid;place-content:center;gap:5px;padding:16px;color:#9cabb2;text-align:center}.nvim-screen-empty strong{color:#e0e8eb;font:750 11px/1.3 ui-monospace,monospace}.nvim-resize-handle{position:relative;width:100%;height:12px;border-top:1px solid #46565e;background:#182126;cursor:ns-resize;touch-action:none}.nvim-resize-handle:after{content:"";position:absolute;top:4px;left:50%;width:min(160px,22vw);height:3px;border-radius:999px;background:#6c7e87;transform:translate(-50%)}.nvim-resize-handle:hover,.nvim-resize-handle:focus-visible{background:#23323a;outline:none}.nvim-resize-handle:hover:after,.nvim-resize-handle:focus-visible:after{background:#35b9ef}.shortcut-help-backdrop{position:fixed;z-index:200;inset:0;display:grid;place-items:center;padding:20px;background:#10171dcc}.shortcut-help{width:min(680px,calc(100vw - 40px));max-height:calc(100vh - 40px);overflow:auto;border:1px solid #71818a;border-radius:6px;background:#f8fafb;color:#172127;box-shadow:0 18px 60px #0008;font:14px/1.4 system-ui,sans-serif}.shortcut-help>header{display:flex;align-items:start;justify-content:space-between;gap:16px;padding:16px 18px;border-bottom:1px solid #c8d1d5;background:#e8eef1}.shortcut-help header small{color:#52646d;font:750 10px/1.2 ui-monospace,monospace;letter-spacing:.08em}.shortcut-help h2{margin:4px 0 0;font-size:17px}.shortcut-help header button{width:32px;height:32px;border:1px solid #71818a;border-radius:3px;background:#fff;font:22px/1 system-ui,sans-serif;cursor:pointer}.shortcut-help dl{margin:0;padding:10px 18px}.shortcut-help dl>div{display:grid;grid-template-columns:minmax(180px,.8fr) 1.5fr;gap:14px;align-items:center;padding:8px 0;border-bottom:1px solid #dde3e6}.shortcut-help dt,.shortcut-help dd{margin:0}.shortcut-help kbd{display:inline-block;border:1px solid #839198;border-bottom-width:2px;border-radius:3px;background:#fff;padding:3px 7px;font:700 12px/1.2 ui-monospace,monospace}.shortcut-help>p{margin:0;padding:4px 18px 16px;color:#526068}.memory-react{border:1px solid #555;background:#fff;font:14px/1.35 system-ui,sans-serif;padding:10px;color:#1b1b1b}.memory-react>header{display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid #bbb;padding-bottom:7px}.memory-react>header small{display:block;margin-bottom:2px;color:#555;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.08em}.memory-react h3{font-size:15px;margin:0}.memory-actions{display:flex;gap:5px;flex-wrap:wrap;justify-content:flex-end}.memory-actions button{border:1px solid #777;background:#fff;padding:4px 8px;cursor:pointer}.memory-actions button[aria-pressed=true]{background:#dff3fb;border-color:#237da1;font-weight:700}.memory-lanes{display:grid;grid-template-columns:repeat(auto-fit,minmax(125px,1fr));gap:6px;margin:8px 0}.memory-lane{min-width:0;display:flex;flex-direction:column;align-items:stretch;gap:3px;border:1px solid #999;background:#fafafa;padding:7px;text-align:left}.memory-lane.compile{background:#fff8dc}.memory-lane.bss{background:#edf7fb}.memory-lane.stack{background:#f3f8ef}.memory-lane.registers{background:#f4f4f4}.memory-lane.text{background:#f7f0fa}.memory-lane>b{font-size:11px;letter-spacing:.04em}.memory-lane button{border:1px solid transparent;background:transparent;padding:3px;text-align:left;cursor:pointer}.memory-lane button:hover,.memory-lane button.active{border-color:#238bb7;background:#fff}.memory-lane code{font-size:10px;white-space:normal}.arena-wrap{margin:12px 0 6px}.arena-label{display:flex;justify-content:space-between;margin-bottom:4px}.arena{--allocp: 0;--arena-size: 64;position:relative;display:grid;grid-template-columns:repeat(var(--arena-size),1fr);height:40px;border:1px solid #222;margin-bottom:28px}.arena i{border-right:1px solid #ddd}.arena .allocp{position:absolute;left:calc(var(--allocp) / var(--arena-size) * 100%);top:43px;transform:translate(-50%);color:#087da8;font:700 11px/1.2 ui-monospace,monospace;white-space:nowrap}.memory-stage{border-top:1px solid #ddd;padding-top:7px;margin:0}.memory-inspector{display:grid;grid-template-columns:auto 1fr;gap:2px 10px;margin-top:7px;padding:7px;border-left:3px solid #238bb7;background:#f5fbfd}.memory-inspector strong{grid-row:1/3}.memory-inspector code{font-size:11px}.memory-inspector span{font-size:12px}.asset-static-fallback{display:none}.uml-react{border:1px solid #555;background:#fff;font:13px/1.35 system-ui,sans-serif;color:#1b1b1b}.uml-react>header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;border-bottom:1px solid #bbb;background:#fafafa}.uml-react>header small{display:block;color:#555;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.06em}.uml-react h3{margin:2px 0 0;font-size:15px}.uml-actions{display:flex;gap:3px;flex-wrap:wrap;justify-content:flex-end}.uml-actions button{border:1px solid #aaa;border-radius:2px;background:#fcfcfc;color:#444;padding:2px 6px;font:600 10px/1.25 ui-monospace,monospace;cursor:pointer}.uml-actions button:hover{border-color:#64879a;background:#f5fafc}.uml-actions button[data-completed=true]{border-color:#62a47f;background:#edf8f1;color:#14613a}.uml-actions button[aria-pressed=true]{border-color:#287495;background:#edf7fb;color:#174d64;box-shadow:inset 0 0 0 1px #b9dce9}.uml-canvas{display:block;overflow-x:hidden;overflow-y:visible;box-sizing:border-box;padding:8px 10px;text-align:center}.uml-svg-host{width:max-content;min-width:100%}.uml-canvas img,.uml-svg-host svg{display:block;width:auto!important;max-width:none!important;height:auto!important;max-height:none;margin-inline:auto;object-fit:contain}.uml-svg-host{cursor:pointer}.uml-svg-host.is-tiled{position:relative;width:var(--uml-tile-page-width);min-width:var(--uml-tile-page-width);height:var(--uml-tile-page-height);overflow:hidden;cursor:default}.uml-svg-host.is-tiled>svg{position:absolute;top:var(--uml-tile-top);left:var(--uml-tile-left);margin:0}.uml-static-crop{position:absolute;top:var(--uml-tile-top);left:var(--uml-tile-left);overflow:hidden}.uml-static-crop>img{display:block;max-width:none!important;max-height:none!important;margin:0!important;object-fit:fill!important;transform-origin:0 0}.uml-tile-part{display:inline-block;margin-left:.65em;color:#607985;font:650 9px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap}.uml-phase-actions>span{display:inline-flex;align-items:center;border:1px solid #9eb2bd;border-radius:2px;background:#f1f5f7;color:#3d5967;padding:2px 6px;font:700 10px/1.25 ui-monospace,monospace}.uml-stage-region{cursor:pointer;transition:fill .14s ease,stroke .14s ease,stroke-width .14s ease}.uml-stage-region-completed.uml-stage-region-bg{fill:#e7f6ed!important;fill-opacity:1!important;stroke:#258154!important;stroke-width:3px!important}.uml-stage-region-completed.uml-stage-region-outline{stroke:#258154!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-bg{fill:#e7f6fc!important;fill-opacity:1!important;stroke:#187ea7!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-outline{stroke:#187ea7!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-completed.uml-stage-region-bg{fill:#e7f6ed!important}.uml-stage-region:focus{outline:none;stroke:#005f87!important;stroke-width:4px!important}.uml-inline-warning{display:block;padding-top:5px;color:#8b2d20;font-size:11px}.uml-stage{display:grid;grid-template-columns:auto 1fr;gap:3px 10px;margin:0 8px 8px;padding:8px;border-left:3px solid #315f78;background:#eef7fb}.uml-stage strong{grid-row:1/3}.uml-stage code{grid-column:2;font-size:11px}.uml-approval{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 8px 8px;padding-top:6px;border-top:1px solid #d2d2d2;color:#555;font-size:11px}.uml-approval button{flex:0 0 auto;border:1px solid #477a5d;border-radius:2px;background:#edf8f1;color:#174e30;padding:3px 7px;font:600 10px/1.25 system-ui,sans-serif;cursor:pointer}.uml-approval button:disabled{border-color:#bbb;background:#f3f3f3;color:#888;cursor:not-allowed}.uml-react>.uml-snapshot-header{display:block;padding:5px 8px 4px}.uml-header-first-line{display:flex;align-items:center;justify-content:space-between;gap:10px}.uml-header-first-line h3{flex:1 1 auto;min-width:0;margin:0;color:#20282c;text-align:left;font-size:12px;line-height:1.25}.uml-header-first-line h3>span{color:#245f7a;font-family:ui-monospace,monospace;letter-spacing:.04em}.uml-header-description{max-width:620px;margin:2px 0 0;color:#555;text-align:left;font-size:8px}.uml-after-description{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:baseline;gap:4mm;margin-top:3mm;border:1px solid #b8c2c7;border-left:1.2mm solid #2b7898;background:#f7fafb;padding:2.2mm 3mm;color:#26363e;text-align:left}.uml-after-description strong{color:#245f7a;font:800 8px/1.25 ui-monospace,monospace;letter-spacing:.06em;text-transform:uppercase}.uml-after-description p{margin:0;font:400 10px/1.35 system-ui,sans-serif}.uml-header-navigation{display:flex;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:6px}.uml-page-continuation{display:inline-flex;flex:0 0 auto;align-items:center;gap:2px;min-height:22px;border:1px solid #86a5b3;border-radius:3px;background:#edf7fa;padding:1px 5px;color:#126b8c;font:850 15px/1 ui-monospace,monospace;animation:uml-continuation-pulse 1.15s ease-in-out infinite alternate}.uml-page-continuation i{display:inline-grid;min-width:14px;place-items:center;font-style:normal}@keyframes uml-continuation-pulse{0%{border-color:#9fb5be;background:#f6fafb;color:#4c7180;box-shadow:none}to{border-color:#167ca4;background:#dff2f8;color:#075c7c;box-shadow:0 0 0 2px #8dcde433}}@media(prefers-reduced-motion:reduce){.uml-page-continuation{animation:none}}.uml-phase-actions,.uml-step-actions{display:flex;align-items:center;flex-wrap:wrap;gap:3px}.uml-phase-actions{flex:0 0 auto;flex-wrap:nowrap;justify-content:flex-end;white-space:nowrap}.uml-phase-actions button,.uml-step-actions button,.uml-edit-toggle,.uml-snapshot-cursor button{border:1px solid #aaa;border-radius:2px;background:#fff;color:#444;cursor:pointer;font:600 9px/1.2 ui-monospace,monospace}.uml-edit-toggle{min-width:42px;padding:3px 7px;border:1px solid #8a9ca5;border-radius:2px;background:#f7f9fa;color:#334d59;cursor:pointer;font:750 9px/1.2 ui-monospace,monospace;letter-spacing:.04em}.uml-edit-toggle.is-active{border-color:#b56b16;background:#fff3df;color:#713c00;box-shadow:inset 0 0 0 1px #f0c78f}.uml-phase-actions button{padding:3px 7px}.uml-phase-actions button[aria-pressed=true]{border-color:#287495;background:#edf7fb;color:#174d64}.uml-step-actions{min-height:0;padding:0;border:0;background:transparent}.uml-step-actions>span{margin-right:4px;color:#555;font:700 9px/1.2 ui-monospace,monospace}.uml-step-actions button{min-width:25px;padding:2px 4px}.uml-step-actions button[data-completed=true]{border-color:#62a47f;background:#edf8f1;color:#14613a}.uml-step-actions button[aria-pressed=true]{border-color:#287495;background:#287495;color:#fff}.uml-step-actions button[data-mode=CODE]:after,.uml-step-actions button[data-mode=RUN]:after{margin-left:3px;font-size:7px;letter-spacing:.02em}.uml-step-actions button[data-mode=CODE]:after{content:"C"}.uml-step-actions button[data-mode=RUN]:after{content:"R"}.uml-snapshot-layout{background:#fff;border-bottom:1px solid #ddd}.uml-step-canvas{min-width:0}.uml-step-canvas .uml-svg-host svg{max-height:none}.uml-step-hit{cursor:pointer;fill:transparent}.uml-step-hit-active{fill:#3ea6ce!important;fill-opacity:.08!important}.uml-step-element{transition:fill .12s ease,stroke .12s ease,stroke-width .12s ease}line.uml-step-element-completed:not(.uml-step-element-active){stroke:#258154!important;stroke-width:1.8px!important}polygon.uml-step-element-completed:not(.uml-step-element-active){fill:#258154!important;stroke:#258154!important}text.uml-step-element-completed:not(.uml-step-element-active){fill:#1d7049!important}line.uml-step-element-active{stroke:#087ca8!important;stroke-width:2.6px!important}polygon.uml-step-element-active{fill:#087ca8!important;stroke:#087ca8!important}text.uml-step-element-active{fill:#075d7d!important;font-weight:700!important}.uml-step-hit:focus{outline:none;stroke:#bd554d;stroke-width:.8px;stroke-dasharray:3 3}.uml-class-svg-active>g>*:not(.uml-class-focus-region):not(.uml-class-step-hit):not(.uml-layout-hit):not(.uml-layout-resize){opacity:.62;transition:opacity .12s ease}.uml-class-svg-active .uml-step-element:not(.uml-step-element-active){opacity:.98!important}.uml-class-svg-active text.uml-step-element-tone-a:not(.uml-step-element-active){fill:#174f69!important}.uml-class-svg-active text.uml-step-element-tone-b:not(.uml-step-element-active){fill:#586581!important}.uml-class-svg-active rect.uml-step-element-tone-a:not(.uml-step-element-active){fill:#eaf5f8!important;stroke:#3f7890!important}.uml-class-svg-active rect.uml-step-element-tone-b:not(.uml-step-element-active){fill:#f2eef8!important;stroke:#7b86a1!important}.uml-class-svg-active path.uml-step-element-tone-a:not(.uml-step-element-active),.uml-class-svg-active line.uml-step-element-tone-a:not(.uml-step-element-active),.uml-class-svg-active polygon.uml-step-element-tone-a:not(.uml-step-element-active){stroke:#3f7890!important}.uml-class-svg-active path.uml-step-element-tone-b:not(.uml-step-element-active),.uml-class-svg-active line.uml-step-element-tone-b:not(.uml-step-element-active),.uml-class-svg-active polygon.uml-step-element-tone-b:not(.uml-step-element-active){stroke:#7b86a1!important}.uml-class-svg-active .uml-step-element-active{opacity:1!important}.uml-class-svg-active text.uml-step-element-active{fill:#b42318!important;font-weight:700!important}.uml-class-svg-active path.uml-step-element-active,.uml-class-svg-active line.uml-step-element-active,.uml-class-svg-active polygon.uml-step-element-active,.uml-class-svg-active rect.uml-step-element-active{stroke:#bd554d!important;stroke-width:1.35px!important}.uml-class-svg-active polygon.uml-step-element-active{fill:#bd554d!important}.uml-class-focus-region{display:none}.uml-step-canvas.is-layout-editing{position:relative;touch-action:none;background-color:#fbfcfd;background-image:linear-gradient(#7d98a20d 1px,transparent 1px),linear-gradient(90deg,#7d98a20d 1px,transparent 1px);background-size:12px 12px}.uml-layout-editing .uml-step-hit,.uml-layout-editing .uml-class-focus-region{pointer-events:none}.uml-layout-hit{fill:#4e9ec4;fill-opacity:.035;stroke:#247a9e;stroke-width:1.1px;stroke-dasharray:5 3;vector-effect:non-scaling-stroke;cursor:grab;pointer-events:all}.uml-layout-hit:hover{fill-opacity:.09;stroke-width:1.6px}.uml-layout-hit.is-selected{fill:#f7a928;fill-opacity:.08;stroke:#b66b00;stroke-width:1.8px;stroke-dasharray:none}.uml-layout-hit:active{cursor:grabbing}.uml-layout-resize{fill:#fff;stroke:#b66b00;stroke-width:1.5px;vector-effect:non-scaling-stroke;cursor:nwse-resize;pointer-events:all}.uml-layout-editor{display:grid;grid-template-columns:minmax(140px,.8fr) minmax(240px,1.8fr) minmax(260px,1.4fr);gap:7px 10px;align-items:end;padding:8px 10px 9px;border-top:2px solid #b97822;background:#f7f5f0;color:#26343a;text-align:left;font:10px/1.3 system-ui,sans-serif}.uml-layout-editor-title{grid-column:1/-1;display:flex;align-items:baseline;gap:9px}.uml-layout-editor-title strong{color:#713c00;font:800 11px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-layout-editor-title span{color:#65737a}.uml-layout-editor-title b{margin-left:auto;color:#9c2f1b;font-size:9px}.uml-layout-editor label{display:grid;gap:2px;color:#52636b;font:700 8px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-layout-editor input,.uml-layout-editor select,.uml-layout-editor textarea{box-sizing:border-box;width:100%;min-width:0;border:1px solid #9ca9ae;border-radius:2px;background:#fff;color:#172126;padding:4px 5px;font:10px/1.25 ui-monospace,monospace;text-transform:none}.uml-layout-editor textarea{resize:vertical;line-height:1.35}.uml-layout-number-grid,.uml-layout-style-grid{display:grid;gap:5px}.uml-layout-number-grid{grid-template-columns:repeat(4,minmax(48px,1fr))}.uml-layout-style-grid{grid-template-columns:repeat(5,minmax(54px,1fr))}.uml-layout-editor-text{align-self:stretch}.uml-layout-editor input[type=color]{min-height:27px;padding:2px}.uml-layout-editor-actions{grid-column:1/-1;display:flex;gap:5px}.uml-layout-editor-actions button{border:1px solid #87979f;border-radius:2px;background:#fff;color:#283940;padding:4px 8px;cursor:pointer;font:700 9px/1.2 ui-monospace,monospace}.uml-layout-editor-actions button.is-primary{border-color:#287495;background:#287495;color:#fff}.uml-layout-editor-actions button.is-danger{margin-left:auto;border-color:#a26156;color:#812b1c}.uml-layout-editor-actions button:disabled{opacity:.45;cursor:not-allowed}.uml-layout-editor output{grid-column:1/-1;min-height:1.2em;color:#52636b;font:9px/1.25 ui-monospace,monospace}@media(max-width:900px){.uml-layout-editor{grid-template-columns:1fr}.uml-layout-editor-title,.uml-layout-editor-actions,.uml-layout-editor output{grid-column:1}}@media print{.uml-edit-toggle,.uml-layout-editor,.uml-layout-hit,.uml-layout-resize{display:none!important}}.uml-snapshot-panel{display:grid;gap:8px;min-width:0;padding:8px;background:#fafafa;font-size:10px}.uml-snapshot-panel>header{display:flex;justify-content:space-between;gap:8px;align-items:center}.uml-snapshot-panel>header>div:first-child>span,.uml-snapshot-panel>header>div:first-child>strong{display:block}.uml-snapshot-panel>header>div:first-child>span{color:#5a5a5a;font:700 9px/1.2 ui-monospace,monospace}.uml-snapshot-panel>header>div:first-child>strong{font-size:12px}.uml-snapshot-panel>header>div:first-child>strong code{display:inline-block;min-width:24px;color:#075d7d}.uml-snapshot-cursor{display:flex;align-items:center;gap:4px}.uml-snapshot-cursor button{width:23px;height:23px;padding:0}.uml-snapshot-cursor button:disabled{opacity:.35;cursor:default}.uml-snapshot-cursor output{min-width:34px;text-align:center;font:700 9px/1 ui-monospace,monospace}.uml-snapshot-description{margin:0;color:#333}.uml-snapshot-panel section{min-width:0;border:1px solid #d0d0d0;background:#fff;padding:7px}.uml-snapshot-panel h4{margin:0 0 4px;color:#315f78;font:700 9px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-state-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;min-width:0}.uml-snapshot-registers dl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:3px;margin:0}.uml-snapshot-registers dl>div{display:grid;grid-template-columns:auto 1fr;gap:5px;min-width:0;padding:2px 4px;border-left:2px solid #bbb;background:#f6f6f6}.uml-snapshot-registers dl>div.primary{grid-column:1/-1;border-color:#287495;background:#edf7fb}.uml-snapshot-registers dt{color:#555;font-weight:700}.uml-snapshot-registers dd,.uml-snapshot-variables dd,.uml-snapshot-memory dd{min-width:0;margin:0;overflow-wrap:anywhere;text-align:right;font:600 9px/1.25 ui-monospace,monospace}.uml-snapshot-variables dl{display:grid;gap:3px;margin:0}.uml-snapshot-variables dl>div{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:5px;padding:3px 5px;border-left:2px solid #5f899b;background:#f5f8f9}.uml-snapshot-variables dt{font-weight:700}.uml-snapshot-variables dt small{display:block;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-variables [data-state=uninitialised],.uml-stack-lane article[data-state=uninitialised]{color:#777;background:#f5f5f5}.uml-snapshot-variables [data-state=uninitialised] dt:after,.uml-stack-lane article[data-state=uninitialised]>strong:after{content:" ?";color:#9a6a00}.uml-arena-snapshot>div{position:relative;height:10px;border:1px solid #666;background:repeating-linear-gradient(90deg,#fff 0 7px,#eee 7px 8px)}.uml-arena-snapshot>div span{display:block;height:100%;background:#b8ddeb}.uml-arena-snapshot>div i{position:absolute;top:-3px;bottom:-3px;width:2px;background:#075d7d;transform:translate(-1px)}.uml-arena-snapshot>p{display:grid;grid-template-columns:1fr auto 1fr;gap:4px;margin:3px 0;font-size:8px}.uml-arena-snapshot>p code:last-child{text-align:right}.uml-arena-bytes{display:block;margin-bottom:4px;overflow-wrap:anywhere;color:#666;font-size:8px}.uml-snapshot-memory dl{display:grid;gap:2px;margin:0}.uml-snapshot-memory dl>div{display:grid;grid-template-columns:1fr auto;gap:4px;padding-top:2px;border-top:1px solid #eee}.uml-snapshot-memory dt{font-weight:700}.uml-snapshot-memory dt small{display:block;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-stack>header{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.uml-snapshot-stack>header>p{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px 9px;margin:0;color:#555;font-size:8px}.uml-stack-axis{display:flex;justify-content:space-between;gap:8px;margin:3px 89px 2px;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-stack-lane{display:flex;align-items:stretch;min-width:0;overflow-x:auto;border:1px solid #66757c;background:#eef1f2}.uml-stack-boundary{display:grid;place-content:center;flex:0 1 82px;min-width:64px;padding:5px;background:#273941;color:#fff;text-align:center;font:700 8px/1.25 ui-monospace,monospace}.uml-stack-boundary small{color:#a9d9eb;font-size:8px;text-transform:uppercase}.uml-stack-gap{display:grid;place-content:center;flex:.7 1 70px;min-width:60px;min-height:52px;border-right:1px dashed #9da8ad;color:#78858b;text-align:center;font:8px/1.2 ui-monospace,monospace}.uml-stack-gap strong,.uml-stack-gap small{display:block}.uml-stack-gap strong{color:#52636b}.uml-stack-gap small{color:#78858b;font-size:8px}.uml-stack-lane article{display:grid;align-content:center;flex:1 1 92px;min-width:76px;padding:5px 7px;border-right:1px solid #9da8ad;background:#fff;text-align:center}.uml-stack-lane article[data-state=initialised]{border-top:3px solid #2c8060}.uml-stack-lane article[data-state=saved]{border-top:3px solid #6d7196;background:#f7f6fb}.uml-stack-lane article strong,.uml-stack-lane article code,.uml-stack-lane article small{display:block;overflow-wrap:anywhere}.uml-stack-lane article strong{font:700 9px/1.2 ui-monospace,monospace}.uml-stack-lane article code{margin:2px 0;color:#1f4555;font-size:8px}.uml-stack-lane article small{color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-observation p{margin:0 0 3px}.uml-snapshot-observation small{display:block;overflow-wrap:anywhere;color:#666;font:8px/1.3 ui-monospace,monospace}.task-conclusion{margin:8px 0 0;padding:7px 9px;border:1px solid #315f78;background:#f3f9fc}.task-conclusion>strong{display:block;margin-bottom:3px;color:#315f78;font:700 10px/1.2 ui-monospace,monospace}.task-conclusion p{margin:0}.section-sheet--asset .section-heading{align-items:baseline;margin:0 0 1.5mm}.section-sheet--asset .section-heading .section-index{margin-right:4mm;color:#68757b;font-size:10px;font-weight:600}.section-sheet--asset .section-heading .section-title{color:#20282c;font:750 13px/1.2 system-ui,sans-serif}.section-sheet--asset .card-section>p{max-width:110ch;margin:0 0 2mm;color:#58656b;font:9px/1.3 system-ui,sans-serif}.section-sheet--asset .card-asset{margin-top:2mm}.lesson-progress-control{display:inline-flex;align-items:center;margin-right:7px;padding:2px 7px;border:1px solid #8c8c8c;border-radius:12px;background:#fff;cursor:pointer}.lesson-progress-control:disabled{cursor:wait;opacity:.6}.lesson-progress-control[data-status=approved]{background:#e7f6ed;border-color:#18794e}.lesson-progress-topbar{display:flex;flex:none;align-items:center;gap:5px;min-width:0;padding-left:7px;border-left:1px solid #a9b3b8;color:#33444c;font:650 10px/1.2 system-ui,sans-serif;white-space:nowrap}.lesson-progress-topbar strong{color:#52636b;font:800 9px/1 ui-monospace,monospace;letter-spacing:.05em}.lesson-progress-topbar output{min-width:3.8ch;border:1px solid #91a1a8;border-radius:999px;background:#fff;padding:2px 6px;color:#1e566e;text-align:center;font:800 9px/1 ui-monospace,monospace}.lesson-progress-topbar a{color:#245f7a;text-decoration:none}.lesson-progress-topbar a:hover,.lesson-progress-topbar a:focus-visible{text-decoration:underline}.lesson-progress-error{color:#9b1c1c;font-weight:900}.step-row{display:flex;align-items:center;margin:4px 0}.section-anchor{position:relative;top:-45px}.app-load-error{max-width:760px;margin:10vh auto;padding:24px;border:1px solid #9b1c1c;background:#fff;font-family:system-ui,sans-serif}.app-load-error pre{white-space:pre-wrap}@media(max-width:800px){.viewpoint-bar{grid-template-columns:repeat(4,minmax(0,1fr))}.viewpoint-bar button{min-height:28px}.card-library-toggle>span:last-child{display:none}.card-library-toggle{gap:4px;padding-inline:6px}.topbar-nvim-meta{display:none}.topbar-nvim-section .nvim-control-indicator{max-width:42vw;overflow:hidden;text-overflow:ellipsis}.nvim-shortcut-strip,.nvim-work-indicator{display:none}.allocator-panel>header{grid-template-columns:auto 1fr}.allocator-panel>header>small{display:none}.allocator-panel-body{grid-template-columns:1fr}.allocator-metrics,.allocator-facts{display:none}.memory-lanes{grid-template-columns:1fr 1fr}.memory-react>header,.uml-react>header{align-items:flex-start;flex-direction:column}.uml-header-first-line,.uml-header-navigation{width:100%;align-items:flex-start;flex-direction:column}.uml-header-navigation{gap:4px}.memory-actions{justify-content:flex-start}.uml-snapshot-layout{display:block}.uml-step-canvas{border:0}.uml-phase-actions{width:100%;justify-content:flex-end}.uml-state-grid{grid-template-columns:1fr}.uml-snapshot-stack>header{align-items:flex-start;flex-direction:column}.uml-snapshot-stack>header>p{justify-content:flex-start}.uml-stack-axis{margin-right:0;margin-left:0}}@media print{@page card-portrait{size:A4 portrait;margin:0}@page card-landscape{size:A4 landscape;margin:0}.sheet--portrait{page:card-portrait}.sheet--landscape{page:card-landscape}.paper{display:block;gap:0}.paper>.sheet,.paper>.sheet>.sheet-content,.paper>.sheet-spread>.sheet,.paper>.sheet-spread>.sheet>.sheet-content{height:auto;min-height:0;max-height:none;overflow:visible}.sheet-spread{display:contents!important}.viewer-chrome,.side-panel-dock,.memory-react{display:none!important}.asset-static-fallback{display:block!important;width:100%}.uml-actions,.uml-phase-actions,.uml-step-actions,.uml-snapshot-panel,.uml-stage,.uml-approval,.lesson-progress-topbar,.lesson-progress-control,.uml-page-continuation{display:none!important}.uml-after-description{break-inside:avoid}} diff --git a/web/app.js b/web/app.js index c1573ef..77bf0cb 100644 --- a/web/app.js +++ b/web/app.js @@ -1,18 +1,18 @@ -var Pp=Object.create;var ks=Object.defineProperty;var Tp=Object.getOwnPropertyDescriptor;var Mp=Object.getOwnPropertyNames;var Rp=Object.getPrototypeOf,Op=Object.prototype.hasOwnProperty;var $t=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var $p=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Mp(t))!Op.call(e,o)&&o!==n&&ks(e,o,{get:()=>t[o],enumerable:!(r=Tp(t,o))||r.enumerable});return e};var bo=(e,t,n)=>(n=e!=null?Pp(Rp(e)):{},$p(t||!e||!e.__esModule?ks(n,"default",{value:e,enumerable:!0}):n,e));var Rs=$t(W=>{"use strict";var xr=Symbol.for("react.element"),Ip=Symbol.for("react.portal"),Fp=Symbol.for("react.fragment"),Dp=Symbol.for("react.strict_mode"),jp=Symbol.for("react.profiler"),Up=Symbol.for("react.provider"),Vp=Symbol.for("react.context"),Bp=Symbol.for("react.forward_ref"),Hp=Symbol.for("react.suspense"),Kp=Symbol.for("react.memo"),Wp=Symbol.for("react.lazy"),Ss=Symbol.iterator;function Gp(e){return e===null||typeof e!="object"?null:(e=Ss&&e[Ss]||e["@@iterator"],typeof e=="function"?e:null)}var _s={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Cs=Object.assign,Ls={};function Vn(e,t,n){this.props=e,this.context=t,this.refs=Ls,this.updater=n||_s}Vn.prototype.isReactComponent={};Vn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Vn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function zs(){}zs.prototype=Vn.prototype;function Qi(e,t,n){this.props=e,this.context=t,this.refs=Ls,this.updater=n||_s}var qi=Qi.prototype=new zs;qi.constructor=Qi;Cs(qi,Vn.prototype);qi.isPureReactComponent=!0;var Ns=Array.isArray,As=Object.prototype.hasOwnProperty,Xi={current:null},Ps={key:!0,ref:!0,__self:!0,__source:!0};function Ts(e,t,n){var r,o={},i=null,l=null;if(t!=null)for(r in t.ref!==void 0&&(l=t.ref),t.key!==void 0&&(i=""+t.key),t)As.call(t,r)&&!Ps.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(s===1)o.children=n;else if(1{"use strict";Os.exports=Rs()});var Ks=$t(le=>{"use strict";function nl(e,t){var n=e.length;e.push(t);e:for(;0>>1,o=e[r];if(0>>1;rEo(s,n))uEo(d,s)?(e[r]=d,e[u]=n,r=u):(e[r]=s,e[l]=n,r=l);else if(uEo(d,n))e[r]=d,e[u]=n,r=u;else break e}}return t}function Eo(e,t){var n=e.sortIndex-t.sortIndex;return n!==0?n:e.id-t.id}typeof performance=="object"&&typeof performance.now=="function"?($s=performance,le.unstable_now=function(){return $s.now()}):(Ji=Date,Is=Ji.now(),le.unstable_now=function(){return Ji.now()-Is});var $s,Ji,Is,At=[],Zt=[],Zp=1,mt=null,Oe=3,Lo=!1,kn=!1,wr=!1,js=typeof setTimeout=="function"?setTimeout:null,Us=typeof clearTimeout=="function"?clearTimeout:null,Fs=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function rl(e){for(var t=wt(Zt);t!==null;){if(t.callback===null)Co(Zt);else if(t.startTime<=e)Co(Zt),t.sortIndex=t.expirationTime,nl(At,t);else break;t=wt(Zt)}}function ol(e){if(wr=!1,rl(e),!kn)if(wt(At)!==null)kn=!0,ll(il);else{var t=wt(Zt);t!==null&&al(ol,t.startTime-e)}}function il(e,t){kn=!1,wr&&(wr=!1,Us(kr),kr=-1),Lo=!0;var n=Oe;try{for(rl(t),mt=wt(At);mt!==null&&(!(mt.expirationTime>t)||e&&!Hs());){var r=mt.callback;if(typeof r=="function"){mt.callback=null,Oe=mt.priorityLevel;var o=r(mt.expirationTime<=t);t=le.unstable_now(),typeof o=="function"?mt.callback=o:mt===wt(At)&&Co(At),rl(t)}else Co(At);mt=wt(At)}if(mt!==null)var i=!0;else{var l=wt(Zt);l!==null&&al(ol,l.startTime-t),i=!1}return i}finally{mt=null,Oe=n,Lo=!1}}var zo=!1,_o=null,kr=-1,Vs=5,Bs=-1;function Hs(){return!(le.unstable_now()-Bse||125r?(e.sortIndex=n,nl(Zt,e),wt(At)===null&&e===wt(Zt)&&(wr?(Us(kr),kr=-1):wr=!0,al(ol,n-r))):(e.sortIndex=o,nl(At,e),kn||Lo||(kn=!0,ll(il))),e};le.unstable_shouldYield=Hs;le.unstable_wrapCallback=function(e){var t=Oe;return function(){var n=Oe;Oe=t;try{return e.apply(this,arguments)}finally{Oe=n}}}});var Gs=$t((uh,Ws)=>{"use strict";Ws.exports=Ks()});var Xd=$t(lt=>{"use strict";var Jp=No(),ot=Gs();function z(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Al=Object.prototype.hasOwnProperty,em=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,Ys={},Qs={};function tm(e){return Al.call(Qs,e)?!0:Al.call(Ys,e)?!1:em.test(e)?Qs[e]=!0:(Ys[e]=!0,!1)}function nm(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function rm(e,t,n,r){if(t===null||typeof t>"u"||nm(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function We(e,t,n,r,o,i,l){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=l}var Me={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Me[e]=new We(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Me[t]=new We(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Me[e]=new We(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Me[e]=new We(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Me[e]=new We(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Me[e]=new We(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Me[e]=new We(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Me[e]=new We(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Me[e]=new We(e,5,!1,e.toLowerCase(),null,!1,!1)});var ka=/[\-:]([a-z])/g;function Sa(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ka,Sa);Me[t]=new We(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ka,Sa);Me[t]=new We(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ka,Sa);Me[t]=new We(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Me[e]=new We(e,1,!1,e.toLowerCase(),null,!1,!1)});Me.xlinkHref=new We("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Me[e]=new We(e,1,!1,e.toLowerCase(),null,!0,!0)});function Na(e,t,n,r){var o=Me.hasOwnProperty(t)?Me[t]:null;(o!==null?o.type!==0:r||!(2()=>(t||e((t={exports:{}}).exports,t),t.exports);var Up=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Fp(t))!jp.call(e,o)&&o!==n&&Ss(e,o,{get:()=>t[o],enumerable:!(r=$p(t,o))||r.enumerable});return e};var wo=(e,t,n)=>(n=e!=null?Op(Dp(e)):{},Up(t||!e||!e.__esModule?Ss(n,"default",{value:e,enumerable:!0}):n,e));var Is=jt(Y=>{"use strict";var xr=Symbol.for("react.element"),Vp=Symbol.for("react.portal"),Bp=Symbol.for("react.fragment"),Hp=Symbol.for("react.strict_mode"),Kp=Symbol.for("react.profiler"),Wp=Symbol.for("react.provider"),Gp=Symbol.for("react.context"),Yp=Symbol.for("react.forward_ref"),Qp=Symbol.for("react.suspense"),qp=Symbol.for("react.memo"),Xp=Symbol.for("react.lazy"),Ns=Symbol.iterator;function Zp(e){return e===null||typeof e!="object"?null:(e=Ns&&e[Ns]||e["@@iterator"],typeof e=="function"?e:null)}var Cs={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Ls=Object.assign,zs={};function Un(e,t,n){this.props=e,this.context=t,this.refs=zs,this.updater=n||Cs}Un.prototype.isReactComponent={};Un.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Un.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function As(){}As.prototype=Un.prototype;function Xi(e,t,n){this.props=e,this.context=t,this.refs=zs,this.updater=n||Cs}var Zi=Xi.prototype=new As;Zi.constructor=Xi;Ls(Zi,Un.prototype);Zi.isPureReactComponent=!0;var Es=Array.isArray,Ps=Object.prototype.hasOwnProperty,Ji={current:null},Ts={key:!0,ref:!0,__self:!0,__source:!0};function Rs(e,t,n){var r,o={},i=null,l=null;if(t!=null)for(r in t.ref!==void 0&&(l=t.ref),t.key!==void 0&&(i=""+t.key),t)Ps.call(t,r)&&!Ts.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(s===1)o.children=n;else if(1{"use strict";Os.exports=Is()});var Ws=jt(ie=>{"use strict";function ol(e,t){var n=e.length;e.push(t);e:for(;0>>1,o=e[r];if(0<_o(o,t))e[r]=t,e[n]=o,n=r;else break e}}function Nt(e){return e.length===0?null:e[0]}function Lo(e){if(e.length===0)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,i=o>>>1;r_o(s,n))u_o(d,s)?(e[r]=d,e[u]=n,r=u):(e[r]=s,e[l]=n,r=l);else if(u_o(d,n))e[r]=d,e[u]=n,r=u;else break e}}return t}function _o(e,t){var n=e.sortIndex-t.sortIndex;return n!==0?n:e.id-t.id}typeof performance=="object"&&typeof performance.now=="function"?($s=performance,ie.unstable_now=function(){return $s.now()}):(tl=Date,Fs=tl.now(),ie.unstable_now=function(){return tl.now()-Fs});var $s,tl,Fs,Tt=[],en=[],rm=1,pt=null,De=3,zo=!1,Sn=!1,kr=!1,Us=typeof setTimeout=="function"?setTimeout:null,Vs=typeof clearTimeout=="function"?clearTimeout:null,Ds=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function il(e){for(var t=Nt(en);t!==null;){if(t.callback===null)Lo(en);else if(t.startTime<=e)Lo(en),t.sortIndex=t.expirationTime,ol(Tt,t);else break;t=Nt(en)}}function ll(e){if(kr=!1,il(e),!Sn)if(Nt(Tt)!==null)Sn=!0,sl(al);else{var t=Nt(en);t!==null&&ul(ll,t.startTime-e)}}function al(e,t){Sn=!1,kr&&(kr=!1,Vs(Sr),Sr=-1),zo=!0;var n=De;try{for(il(t),pt=Nt(Tt);pt!==null&&(!(pt.expirationTime>t)||e&&!Ks());){var r=pt.callback;if(typeof r=="function"){pt.callback=null,De=pt.priorityLevel;var o=r(pt.expirationTime<=t);t=ie.unstable_now(),typeof o=="function"?pt.callback=o:pt===Nt(Tt)&&Lo(Tt),il(t)}else Lo(Tt);pt=Nt(Tt)}if(pt!==null)var i=!0;else{var l=Nt(en);l!==null&&ul(ll,l.startTime-t),i=!1}return i}finally{pt=null,De=n,zo=!1}}var Ao=!1,Co=null,Sr=-1,Bs=5,Hs=-1;function Ks(){return!(ie.unstable_now()-Hse||125r?(e.sortIndex=n,ol(en,e),Nt(Tt)===null&&e===Nt(en)&&(kr?(Vs(Sr),Sr=-1):kr=!0,ul(ll,n-r))):(e.sortIndex=o,ol(Tt,e),Sn||zo||(Sn=!0,sl(al))),e};ie.unstable_shouldYield=Ks;ie.unstable_wrapCallback=function(e){var t=De;return function(){var n=De;De=t;try{return e.apply(this,arguments)}finally{De=n}}}});var Ys=jt((Sh,Gs)=>{"use strict";Gs.exports=Ws()});var Zd=jt(lt=>{"use strict";var om=Eo(),ot=Ys();function L(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Tl=Object.prototype.hasOwnProperty,im=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,Qs={},qs={};function lm(e){return Tl.call(qs,e)?!0:Tl.call(Qs,e)?!1:im.test(e)?qs[e]=!0:(Qs[e]=!0,!1)}function am(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function sm(e,t,n,r){if(t===null||typeof t>"u"||am(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Qe(e,t,n,r,o,i,l){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=l}var Fe={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Fe[e]=new Qe(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Fe[t]=new Qe(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Fe[e]=new Qe(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Fe[e]=new Qe(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Fe[e]=new Qe(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Fe[e]=new Qe(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Fe[e]=new Qe(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Fe[e]=new Qe(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Fe[e]=new Qe(e,5,!1,e.toLowerCase(),null,!1,!1)});var Na=/[\-:]([a-z])/g;function Ea(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Na,Ea);Fe[t]=new Qe(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Na,Ea);Fe[t]=new Qe(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Na,Ea);Fe[t]=new Qe(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Fe[e]=new Qe(e,1,!1,e.toLowerCase(),null,!1,!1)});Fe.xlinkHref=new Qe("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Fe[e]=new Qe(e,1,!1,e.toLowerCase(),null,!0,!0)});function _a(e,t,n,r){var o=Fe.hasOwnProperty(t)?Fe[t]:null;(o!==null?o.type!==0:r||!(2s||o[l]!==i[s]){var u=` -`+o[l].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}while(1<=l&&0<=s);break}}}finally{ul=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Pr(e):""}function om(e){switch(e.tag){case 5:return Pr(e.type);case 16:return Pr("Lazy");case 13:return Pr("Suspense");case 19:return Pr("SuspenseList");case 0:case 2:case 15:return e=cl(e.type,!1),e;case 11:return e=cl(e.type.render,!1),e;case 1:return e=cl(e.type,!0),e;default:return""}}function Rl(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Wn:return"Fragment";case Kn:return"Portal";case Pl:return"Profiler";case Ea:return"StrictMode";case Tl:return"Suspense";case Ml:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case nc:return(e.displayName||"Context")+".Consumer";case tc:return(e._context.displayName||"Context")+".Provider";case _a:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Ca:return t=e.displayName||null,t!==null?t:Rl(e.type)||"Memo";case en:t=e._payload,e=e._init;try{return Rl(e(t))}catch{}}return null}function im(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Rl(t);case 8:return t===Ea?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function gn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function oc(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function lm(e){var t=oc(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(l){r=""+l,i.call(this,l)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(l){r=""+l},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Po(e){e._valueTracker||(e._valueTracker=lm(e))}function ic(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=oc(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function ii(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ol(e,t){var n=t.checked;return ve({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Xs(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=gn(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function lc(e,t){t=t.checked,t!=null&&Na(e,"checked",t,!1)}function $l(e,t){lc(e,t);var n=gn(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Il(e,t.type,n):t.hasOwnProperty("defaultValue")&&Il(e,t.type,gn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Zs(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Il(e,t,n){(t!=="number"||ii(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Tr=Array.isArray;function rr(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o"+t.valueOf().toString()+"",t=To.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Kr(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Or={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},am=["Webkit","ms","Moz","O"];Object.keys(Or).forEach(function(e){am.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Or[t]=Or[e]})});function cc(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Or.hasOwnProperty(e)&&Or[e]?(""+t).trim():t+"px"}function dc(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=cc(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var sm=ve({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function jl(e,t){if(t){if(sm[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(z(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(z(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(z(61))}if(t.style!=null&&typeof t.style!="object")throw Error(z(62))}}function Ul(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Vl=null;function La(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Bl=null,or=null,ir=null;function tu(e){if(e=uo(e)){if(typeof Bl!="function")throw Error(z(280));var t=e.stateNode;t&&(t=Mi(t),Bl(e.stateNode,e.type,t))}}function pc(e){or?ir?ir.push(e):ir=[e]:or=e}function mc(){if(or){var e=or,t=ir;if(ir=or=null,tu(e),t)for(e=0;e>>=0,e===0?32:31-(xm(e)/bm|0)|0}var Mo=64,Ro=4194304;function Mr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ui(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,i=e.pingedLanes,l=n&268435455;if(l!==0){var s=l&~o;s!==0?r=Mr(s):(i&=l,i!==0&&(r=Mr(i)))}else l=n&~o,l!==0?r=Mr(l):i!==0&&(r=Mr(i));if(r===0)return 0;if(t!==0&&t!==r&&(t&o)===0&&(o=r&-r,i=t&-t,o>=i||o===16&&(i&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function ao(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-_t(t),e[t]=n}function Nm(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Ir),cu=" ",du=!1;function Mc(e,t){switch(e){case"keyup":return Zm.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Rc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Gn=!1;function ef(e,t){switch(e){case"compositionend":return Rc(t);case"keypress":return t.which!==32?null:(du=!0,cu);case"textInput":return e=t.data,e===cu&&du?null:e;default:return null}}function tf(e,t){if(Gn)return e==="compositionend"||!$a&&Mc(e,t)?(e=Pc(),qo=Ma=on=null,Gn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=fu(n)}}function Fc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Fc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dc(){for(var e=window,t=ii();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ii(e.document)}return t}function Ia(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function df(e){var t=Dc(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Fc(n.ownerDocument.documentElement,n)){if(r!==null&&Ia(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=r.end===void 0?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=gu(n,i);var l=gu(n,r);o&&l&&(e.rangeCount!==1||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==l.node||e.focusOffset!==l.offset)&&(t=t.createRange(),t.setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(l.node,l.offset)):(t.setEnd(l.node,l.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Yn=null,Ql=null,Dr=null,ql=!1;function hu(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ql||Yn==null||Yn!==ii(r)||(r=Yn,"selectionStart"in r&&Ia(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Dr&&Xr(Dr,r)||(Dr=r,r=pi(Ql,"onSelect"),0Xn||(e.current=na[Xn],na[Xn]=null,Xn--)}function ae(e,t){Xn++,na[Xn]=e.current,e.current=t}var hn={},De=vn(hn),Xe=vn(!1),An=hn;function cr(e,t){var n=e.type.contextTypes;if(!n)return hn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o={},i;for(i in n)o[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Ze(e){return e=e.childContextTypes,e!=null}function fi(){de(Xe),de(De)}function Eu(e,t,n){if(De.current!==hn)throw Error(z(168));ae(De,t),ae(Xe,n)}function Yc(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var o in r)if(!(o in t))throw Error(z(108,im(e)||"Unknown",o));return ve({},n,r)}function gi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||hn,An=De.current,ae(De,e),ae(Xe,Xe.current),!0}function _u(e,t,n){var r=e.stateNode;if(!r)throw Error(z(169));n?(e=Yc(e,t,An),r.__reactInternalMemoizedMergedChildContext=e,de(Xe),de(De),ae(De,e)):de(Xe),ae(Xe,n)}var Ft=null,Ri=!1,wl=!1;function Qc(e){Ft===null?Ft=[e]:Ft.push(e)}function wf(e){Ri=!0,Qc(e)}function xn(){if(!wl&&Ft!==null){wl=!0;var e=0,t=ee;try{var n=Ft;for(ee=1;e>=l,o-=l,Dt=1<<32-_t(t)+o|n<R?(j=T,T=null):j=T.sibling;var I=g(p,T,h[R],k);if(I===null){T===null&&(T=j);break}e&&T&&I.alternate===null&&t(p,T),c=i(I,c,R),P===null?C=I:P.sibling=I,P=I,T=j}if(R===h.length)return n(p,T),pe&&Sn(p,R),C;if(T===null){for(;RR?(j=T,T=null):j=T.sibling;var ke=g(p,T,I.value,k);if(ke===null){T===null&&(T=j);break}e&&T&&ke.alternate===null&&t(p,T),c=i(ke,c,R),P===null?C=ke:P.sibling=ke,P=ke,T=j}if(I.done)return n(p,T),pe&&Sn(p,R),C;if(T===null){for(;!I.done;R++,I=h.next())I=y(p,I.value,k),I!==null&&(c=i(I,c,R),P===null?C=I:P.sibling=I,P=I);return pe&&Sn(p,R),C}for(T=r(p,T);!I.done;R++,I=h.next())I=f(T,p,R,I.value,k),I!==null&&(e&&I.alternate!==null&&T.delete(I.key===null?R:I.key),c=i(I,c,R),P===null?C=I:P.sibling=I,P=I);return e&&T.forEach(function(re){return t(p,re)}),pe&&Sn(p,R),C}function _(p,c,h,k){if(typeof h=="object"&&h!==null&&h.type===Wn&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Ao:e:{for(var C=h.key,P=c;P!==null;){if(P.key===C){if(C=h.type,C===Wn){if(P.tag===7){n(p,P.sibling),c=o(P,h.props.children),c.return=p,p=c;break e}}else if(P.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===en&&zu(C)===P.type){n(p,P.sibling),c=o(P,h.props),c.ref=Cr(p,P,h),c.return=p,p=c;break e}n(p,P);break}else t(p,P);P=P.sibling}h.type===Wn?(c=zn(h.props.children,p.mode,k,h.key),c.return=p,p=c):(k=oi(h.type,h.key,h.props,null,p.mode,k),k.ref=Cr(p,c,h),k.return=p,p=k)}return l(p);case Kn:e:{for(P=h.key;c!==null;){if(c.key===P)if(c.tag===4&&c.stateNode.containerInfo===h.containerInfo&&c.stateNode.implementation===h.implementation){n(p,c.sibling),c=o(c,h.children||[]),c.return=p,p=c;break e}else{n(p,c);break}else t(p,c);c=c.sibling}c=zl(h,p.mode,k),c.return=p,p=c}return l(p);case en:return P=h._init,_(p,c,P(h._payload),k)}if(Tr(h))return E(p,c,h,k);if(Sr(h))return b(p,c,h,k);Ko(p,h)}return typeof h=="string"&&h!==""||typeof h=="number"?(h=""+h,c!==null&&c.tag===6?(n(p,c.sibling),c=o(c,h),c.return=p,p=c):(n(p,c),c=Ll(h,p.mode,k),c.return=p,p=c),l(p)):n(p,c)}return _}var pr=Jc(!0),ed=Jc(!1),vi=vn(null),xi=null,er=null,Ua=null;function Va(){Ua=er=xi=null}function Ba(e){var t=vi.current;de(vi),e._currentValue=t}function ia(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function ar(e,t){xi=e,Ua=er=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(qe=!0),e.firstContext=null)}function vt(e){var t=e._currentValue;if(Ua!==e)if(e={context:e,memoizedValue:t,next:null},er===null){if(xi===null)throw Error(z(308));er=e,xi.dependencies={lanes:0,firstContext:e}}else er=er.next=e;return t}var _n=null;function Ha(e){_n===null?_n=[e]:_n.push(e)}function td(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,Ha(t)):(n.next=o.next,o.next=n),t.interleaved=n,Ht(e,r)}function Ht(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var tn=!1;function Ka(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function nd(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ut(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function dn(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(Y&2)!==0){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Ht(e,n)}return o=r.interleaved,o===null?(t.next=t,Ha(r)):(t.next=o.next,o.next=t),r.interleaved=t,Ht(e,n)}function Zo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Aa(e,n)}}function Au(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var o=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var l={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?o=i=l:i=i.next=l,n=n.next}while(n!==null);i===null?o=i=t:i=i.next=t}else o=i=t;n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function bi(e,t,n,r){var o=e.updateQueue;tn=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,s=o.shared.pending;if(s!==null){o.shared.pending=null;var u=s,d=u.next;u.next=null,l===null?i=d:l.next=d,l=u;var m=e.alternate;m!==null&&(m=m.updateQueue,s=m.lastBaseUpdate,s!==l&&(s===null?m.firstBaseUpdate=d:s.next=d,m.lastBaseUpdate=u))}if(i!==null){var y=o.baseState;l=0,m=d=u=null,s=i;do{var g=s.lane,f=s.eventTime;if((r&g)===g){m!==null&&(m=m.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var E=e,b=s;switch(g=t,f=n,b.tag){case 1:if(E=b.payload,typeof E=="function"){y=E.call(f,y,g);break e}y=E;break e;case 3:E.flags=E.flags&-65537|128;case 0:if(E=b.payload,g=typeof E=="function"?E.call(f,y,g):E,g==null)break e;y=ve({},y,g);break e;case 2:tn=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,g=o.effects,g===null?o.effects=[s]:g.push(s))}else f={eventTime:f,lane:g,tag:s.tag,payload:s.payload,callback:s.callback,next:null},m===null?(d=m=f,u=y):m=m.next=f,l|=g;if(s=s.next,s===null){if(s=o.shared.pending,s===null)break;g=s,s=g.next,g.next=null,o.lastBaseUpdate=g,o.shared.pending=null}}while(!0);if(m===null&&(u=y),o.baseState=u,o.firstBaseUpdate=d,o.lastBaseUpdate=m,t=o.shared.interleaved,t!==null){o=t;do l|=o.lane,o=o.next;while(o!==t)}else i===null&&(o.shared.lanes=0);Mn|=l,e.lanes=l,e.memoizedState=y}}function Pu(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Sl.transition;Sl.transition={};try{e(!1),t()}finally{ee=n,Sl.transition=r}}function xd(){return xt().memoizedState}function Ef(e,t,n){var r=mn(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},bd(e))wd(t,n);else if(n=td(e,t,n,r),n!==null){var o=Ke();Ct(n,e,r,o),kd(n,t,r)}}function _f(e,t,n){var r=mn(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(bd(e))wd(t,o);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var l=t.lastRenderedState,s=i(l,n);if(o.hasEagerState=!0,o.eagerState=s,Lt(s,l)){var u=t.interleaved;u===null?(o.next=o,Ha(t)):(o.next=u.next,u.next=o),t.interleaved=o;return}}catch{}finally{}n=td(e,t,o,r),n!==null&&(o=Ke(),Ct(n,e,r,o),kd(n,t,r))}}function bd(e){var t=e.alternate;return e===ye||t!==null&&t===ye}function wd(e,t){jr=ki=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function kd(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Aa(e,n)}}var Si={readContext:vt,useCallback:$e,useContext:$e,useEffect:$e,useImperativeHandle:$e,useInsertionEffect:$e,useLayoutEffect:$e,useMemo:$e,useReducer:$e,useRef:$e,useState:$e,useDebugValue:$e,useDeferredValue:$e,useTransition:$e,useMutableSource:$e,useSyncExternalStore:$e,useId:$e,unstable_isNewReconciler:!1},Cf={readContext:vt,useCallback:function(e,t){return Tt().memoizedState=[e,t===void 0?null:t],e},useContext:vt,useEffect:Mu,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,ei(4194308,4,fd.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ei(4194308,4,e,t)},useInsertionEffect:function(e,t){return ei(4,2,e,t)},useMemo:function(e,t){var n=Tt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Tt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Ef.bind(null,ye,e),[r.memoizedState,e]},useRef:function(e){var t=Tt();return e={current:e},t.memoizedState=e},useState:Tu,useDebugValue:Ja,useDeferredValue:function(e){return Tt().memoizedState=e},useTransition:function(){var e=Tu(!1),t=e[0];return e=Nf.bind(null,e[1]),Tt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ye,o=Tt();if(pe){if(n===void 0)throw Error(z(407));n=n()}else{if(n=t(),Ae===null)throw Error(z(349));(Tn&30)!==0||ld(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Mu(sd.bind(null,r,i,e),[e]),r.flags|=2048,io(9,ad.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Tt(),t=Ae.identifierPrefix;if(pe){var n=jt,r=Dt;n=(r&~(1<<32-_t(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=ro++,0")&&(u=u.replace("",e.displayName)),u}while(1<=l&&0<=s);break}}}finally{dl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Tr(e):""}function um(e){switch(e.tag){case 5:return Tr(e.type);case 16:return Tr("Lazy");case 13:return Tr("Suspense");case 19:return Tr("SuspenseList");case 0:case 2:case 15:return e=pl(e.type,!1),e;case 11:return e=pl(e.type.render,!1),e;case 1:return e=pl(e.type,!0),e;default:return""}}function Ol(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Kn:return"Fragment";case Hn:return"Portal";case Rl:return"Profiler";case Ca:return"StrictMode";case Ml:return"Suspense";case Il:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case rc:return(e.displayName||"Context")+".Consumer";case nc:return(e._context.displayName||"Context")+".Provider";case La:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case za:return t=e.displayName||null,t!==null?t:Ol(e.type)||"Memo";case nn:t=e._payload,e=e._init;try{return Ol(e(t))}catch{}}return null}function cm(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Ol(t);case 8:return t===Ca?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function yn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function ic(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function dm(e){var t=ic(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(l){r=""+l,i.call(this,l)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(l){r=""+l},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function To(e){e._valueTracker||(e._valueTracker=dm(e))}function lc(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=ic(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function li(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function $l(e,t){var n=t.checked;return xe({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Zs(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=yn(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function ac(e,t){t=t.checked,t!=null&&_a(e,"checked",t,!1)}function Fl(e,t){ac(e,t);var n=yn(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Dl(e,t.type,n):t.hasOwnProperty("defaultValue")&&Dl(e,t.type,yn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Js(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Dl(e,t,n){(t!=="number"||li(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Rr=Array.isArray;function nr(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o"+t.valueOf().toString()+"",t=Ro.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Wr(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Or={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},pm=["Webkit","ms","Moz","O"];Object.keys(Or).forEach(function(e){pm.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Or[t]=Or[e]})});function dc(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Or.hasOwnProperty(e)&&Or[e]?(""+t).trim():t+"px"}function pc(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=dc(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var mm=xe({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Vl(e,t){if(t){if(mm[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(L(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(L(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(L(61))}if(t.style!=null&&typeof t.style!="object")throw Error(L(62))}}function Bl(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Hl=null;function Aa(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Kl=null,rr=null,or=null;function nu(e){if(e=co(e)){if(typeof Kl!="function")throw Error(L(280));var t=e.stateNode;t&&(t=Mi(t),Kl(e.stateNode,e.type,t))}}function mc(e){rr?or?or.push(e):or=[e]:rr=e}function fc(){if(rr){var e=rr,t=or;if(or=rr=null,nu(e),t)for(e=0;e>>=0,e===0?32:31-(Nm(e)/Em|0)|0}var Mo=64,Io=4194304;function Mr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ci(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,i=e.pingedLanes,l=n&268435455;if(l!==0){var s=l&~o;s!==0?r=Mr(s):(i&=l,i!==0&&(r=Mr(i)))}else l=n&~o,l!==0?r=Mr(l):i!==0&&(r=Mr(i));if(r===0)return 0;if(t!==0&&t!==r&&(t&o)===0&&(o=r&-r,i=t&-t,o>=i||o===16&&(i&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function so(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-zt(t),e[t]=n}function zm(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Fr),du=" ",pu=!1;function Mc(e,t){switch(e){case"keyup":return rf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ic(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Wn=!1;function lf(e,t){switch(e){case"compositionend":return Ic(t);case"keypress":return t.which!==32?null:(pu=!0,du);case"textInput":return e=t.data,e===du&&pu?null:e;default:return null}}function af(e,t){if(Wn)return e==="compositionend"||!Fa&&Mc(e,t)?(e=Tc(),Xo=Ia=an=null,Wn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=gu(n)}}function Dc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Dc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function jc(){for(var e=window,t=li();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=li(e.document)}return t}function Da(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function hf(e){var t=jc(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Dc(n.ownerDocument.documentElement,n)){if(r!==null&&Da(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=r.end===void 0?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=hu(n,i);var l=hu(n,r);o&&l&&(e.rangeCount!==1||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==l.node||e.focusOffset!==l.offset)&&(t=t.createRange(),t.setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(l.node,l.offset)):(t.setEnd(l.node,l.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Gn=null,Xl=null,jr=null,Zl=!1;function yu(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Zl||Gn==null||Gn!==li(r)||(r=Gn,"selectionStart"in r&&Da(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),jr&&Zr(jr,r)||(jr=r,r=mi(Xl,"onSelect"),0qn||(e.current=oa[qn],oa[qn]=null,qn--)}function le(e,t){qn++,oa[qn]=e.current,e.current=t}var vn={},Be=xn(vn),Ze=xn(!1),Pn=vn;function ur(e,t){var n=e.type.contextTypes;if(!n)return vn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o={},i;for(i in n)o[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Je(e){return e=e.childContextTypes,e!=null}function gi(){pe(Ze),pe(Be)}function _u(e,t,n){if(Be.current!==vn)throw Error(L(168));le(Be,t),le(Ze,n)}function Qc(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var o in r)if(!(o in t))throw Error(L(108,cm(e)||"Unknown",o));return xe({},n,r)}function hi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||vn,Pn=Be.current,le(Be,e),le(Ze,Ze.current),!0}function Cu(e,t,n){var r=e.stateNode;if(!r)throw Error(L(169));n?(e=Qc(e,t,Pn),r.__reactInternalMemoizedMergedChildContext=e,pe(Ze),pe(Be),le(Be,e)):pe(Ze),le(Ze,n)}var Vt=null,Ii=!1,Sl=!1;function qc(e){Vt===null?Vt=[e]:Vt.push(e)}function _f(e){Ii=!0,qc(e)}function wn(){if(!Sl&&Vt!==null){Sl=!0;var e=0,t=ne;try{var n=Vt;for(ne=1;e>=l,o-=l,Bt=1<<32-zt(t)+o|n<z?(U=P,P=null):U=P.sibling;var F=g(p,P,h[z],w);if(F===null){P===null&&(P=U);break}e&&P&&F.alternate===null&&t(p,P),c=i(F,c,z),A===null?C=F:A.sibling=F,A=F,P=U}if(z===h.length)return n(p,P),fe&&Nn(p,z),C;if(P===null){for(;zz?(U=P,P=null):U=P.sibling;var ae=g(p,P,F.value,w);if(ae===null){P===null&&(P=U);break}e&&P&&ae.alternate===null&&t(p,P),c=i(ae,c,z),A===null?C=ae:A.sibling=ae,A=ae,P=U}if(F.done)return n(p,P),fe&&Nn(p,z),C;if(P===null){for(;!F.done;z++,F=h.next())F=y(p,F.value,w),F!==null&&(c=i(F,c,z),A===null?C=F:A.sibling=F,A=F);return fe&&Nn(p,z),C}for(P=r(p,P);!F.done;z++,F=h.next())F=f(P,p,z,F.value,w),F!==null&&(e&&F.alternate!==null&&P.delete(F.key===null?z:F.key),c=i(F,c,z),A===null?C=F:A.sibling=F,A=F);return e&&P.forEach(function(me){return t(p,me)}),fe&&Nn(p,z),C}function _(p,c,h,w){if(typeof h=="object"&&h!==null&&h.type===Kn&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Po:e:{for(var C=h.key,A=c;A!==null;){if(A.key===C){if(C=h.type,C===Kn){if(A.tag===7){n(p,A.sibling),c=o(A,h.props.children),c.return=p,p=c;break e}}else if(A.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===nn&&Au(C)===A.type){n(p,A.sibling),c=o(A,h.props),c.ref=Lr(p,A,h),c.return=p,p=c;break e}n(p,A);break}else t(p,A);A=A.sibling}h.type===Kn?(c=An(h.props.children,p.mode,w,h.key),c.return=p,p=c):(w=ii(h.type,h.key,h.props,null,p.mode,w),w.ref=Lr(p,c,h),w.return=p,p=w)}return l(p);case Hn:e:{for(A=h.key;c!==null;){if(c.key===A)if(c.tag===4&&c.stateNode.containerInfo===h.containerInfo&&c.stateNode.implementation===h.implementation){n(p,c.sibling),c=o(c,h.children||[]),c.return=p,p=c;break e}else{n(p,c);break}else t(p,c);c=c.sibling}c=Pl(h,p.mode,w),c.return=p,p=c}return l(p);case nn:return A=h._init,_(p,c,A(h._payload),w)}if(Rr(h))return S(p,c,h,w);if(Nr(h))return b(p,c,h,w);Wo(p,h)}return typeof h=="string"&&h!==""||typeof h=="number"?(h=""+h,c!==null&&c.tag===6?(n(p,c.sibling),c=o(c,h),c.return=p,p=c):(n(p,c),c=Al(h,p.mode,w),c.return=p,p=c),l(p)):n(p,c)}return _}var dr=ed(!0),td=ed(!1),bi=xn(null),xi=null,Jn=null,Ba=null;function Ha(){Ba=Jn=xi=null}function Ka(e){var t=bi.current;pe(bi),e._currentValue=t}function aa(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function lr(e,t){xi=e,Ba=Jn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(Xe=!0),e.firstContext=null)}function yt(e){var t=e._currentValue;if(Ba!==e)if(e={context:e,memoizedValue:t,next:null},Jn===null){if(xi===null)throw Error(L(308));Jn=e,xi.dependencies={lanes:0,firstContext:e}}else Jn=Jn.next=e;return t}var Cn=null;function Wa(e){Cn===null?Cn=[e]:Cn.push(e)}function nd(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,Wa(t)):(n.next=o.next,o.next=n),t.interleaved=n,Yt(e,r)}function Yt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var rn=!1;function Ga(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function rd(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Kt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function mn(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(X&2)!==0){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Yt(e,n)}return o=r.interleaved,o===null?(t.next=t,Wa(r)):(t.next=o.next,o.next=t),r.interleaved=t,Yt(e,n)}function Jo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ta(e,n)}}function Pu(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var o=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var l={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?o=i=l:i=i.next=l,n=n.next}while(n!==null);i===null?o=i=t:i=i.next=t}else o=i=t;n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function wi(e,t,n,r){var o=e.updateQueue;rn=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,s=o.shared.pending;if(s!==null){o.shared.pending=null;var u=s,d=u.next;u.next=null,l===null?i=d:l.next=d,l=u;var m=e.alternate;m!==null&&(m=m.updateQueue,s=m.lastBaseUpdate,s!==l&&(s===null?m.firstBaseUpdate=d:s.next=d,m.lastBaseUpdate=u))}if(i!==null){var y=o.baseState;l=0,m=d=u=null,s=i;do{var g=s.lane,f=s.eventTime;if((r&g)===g){m!==null&&(m=m.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var S=e,b=s;switch(g=t,f=n,b.tag){case 1:if(S=b.payload,typeof S=="function"){y=S.call(f,y,g);break e}y=S;break e;case 3:S.flags=S.flags&-65537|128;case 0:if(S=b.payload,g=typeof S=="function"?S.call(f,y,g):S,g==null)break e;y=xe({},y,g);break e;case 2:rn=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,g=o.effects,g===null?o.effects=[s]:g.push(s))}else f={eventTime:f,lane:g,tag:s.tag,payload:s.payload,callback:s.callback,next:null},m===null?(d=m=f,u=y):m=m.next=f,l|=g;if(s=s.next,s===null){if(s=o.shared.pending,s===null)break;g=s,s=g.next,g.next=null,o.lastBaseUpdate=g,o.shared.pending=null}}while(!0);if(m===null&&(u=y),o.baseState=u,o.firstBaseUpdate=d,o.lastBaseUpdate=m,t=o.shared.interleaved,t!==null){o=t;do l|=o.lane,o=o.next;while(o!==t)}else i===null&&(o.shared.lanes=0);Mn|=l,e.lanes=l,e.memoizedState=y}}function Tu(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=El.transition;El.transition={};try{e(!1),t()}finally{ne=n,El.transition=r}}function xd(){return vt().memoizedState}function Af(e,t,n){var r=gn(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},wd(e))kd(t,n);else if(n=nd(e,t,n,r),n!==null){var o=Ye();At(n,e,r,o),Sd(n,t,r)}}function Pf(e,t,n){var r=gn(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(wd(e))kd(t,o);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var l=t.lastRenderedState,s=i(l,n);if(o.hasEagerState=!0,o.eagerState=s,Pt(s,l)){var u=t.interleaved;u===null?(o.next=o,Wa(t)):(o.next=u.next,u.next=o),t.interleaved=o;return}}catch{}finally{}n=nd(e,t,o,r),n!==null&&(o=Ye(),At(n,e,r,o),Sd(n,t,r))}}function wd(e){var t=e.alternate;return e===be||t!==null&&t===be}function kd(e,t){Ur=Si=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Sd(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ta(e,n)}}var Ni={readContext:yt,useCallback:je,useContext:je,useEffect:je,useImperativeHandle:je,useInsertionEffect:je,useLayoutEffect:je,useMemo:je,useReducer:je,useRef:je,useState:je,useDebugValue:je,useDeferredValue:je,useTransition:je,useMutableSource:je,useSyncExternalStore:je,useId:je,unstable_isNewReconciler:!1},Tf={readContext:yt,useCallback:function(e,t){return Mt().memoizedState=[e,t===void 0?null:t],e},useContext:yt,useEffect:Mu,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,ti(4194308,4,gd.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ti(4194308,4,e,t)},useInsertionEffect:function(e,t){return ti(4,2,e,t)},useMemo:function(e,t){var n=Mt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Mt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Af.bind(null,be,e),[r.memoizedState,e]},useRef:function(e){var t=Mt();return e={current:e},t.memoizedState=e},useState:Ru,useDebugValue:ts,useDeferredValue:function(e){return Mt().memoizedState=e},useTransition:function(){var e=Ru(!1),t=e[0];return e=zf.bind(null,e[1]),Mt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=be,o=Mt();if(fe){if(n===void 0)throw Error(L(407));n=n()}else{if(n=t(),Te===null)throw Error(L(349));(Rn&30)!==0||ad(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Mu(ud.bind(null,r,i,e),[e]),r.flags|=2048,lo(9,sd.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Mt(),t=Te.identifierPrefix;if(fe){var n=Ht,r=Bt;n=(r&~(1<<32-zt(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=oo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),n==="select"&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[Mt]=t,e[eo]=r,Td(e,t,!1,!1),t.stateNode=e;e:{switch(l=Ul(n,r),n){case"dialog":ce("cancel",e),ce("close",e),o=r;break;case"iframe":case"object":case"embed":ce("load",e),o=r;break;case"video":case"audio":for(o=0;ogr&&(t.flags|=128,r=!0,Lr(i,!1),t.lanes=4194304)}else{if(!r)if(e=wi(l),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Lr(i,!0),i.tail===null&&i.tailMode==="hidden"&&!l.alternate&&!pe)return Ie(t),null}else 2*we()-i.renderingStartTime>gr&&n!==1073741824&&(t.flags|=128,r=!0,Lr(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(n=i.last,n!==null?n.sibling=l:t.child=l,i.last=l)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=we(),t.sibling=null,n=he.current,ae(he,r?n&1|2:n&1),t):(Ie(t),null);case 22:case 23:return is(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(tt&1073741824)!==0&&(Ie(t),t.subtreeFlags&6&&(t.flags|=8192)):Ie(t),null;case 24:return null;case 25:return null}throw Error(z(156,t.tag))}function Of(e,t){switch(Da(t),t.tag){case 1:return Ze(t.type)&&fi(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return mr(),de(Xe),de(De),Ya(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Ga(t),null;case 13:if(de(he),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(z(340));dr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return de(he),null;case 4:return mr(),null;case 10:return Ba(t.type._context),null;case 22:case 23:return is(),null;case 24:return null;default:return null}}var Go=!1,Fe=!1,$f=typeof WeakSet=="function"?WeakSet:Set,$=null;function tr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){be(e,t,r)}else n.current=null}function fa(e,t,n){try{n()}catch(r){be(e,t,r)}}var Hu=!1;function If(e,t){if(Xl=ci,e=Dc(),Ia(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var l=0,s=-1,u=-1,d=0,m=0,y=e,g=null;t:for(;;){for(var f;y!==n||o!==0&&y.nodeType!==3||(s=l+o),y!==i||r!==0&&y.nodeType!==3||(u=l+r),y.nodeType===3&&(l+=y.nodeValue.length),(f=y.firstChild)!==null;)g=y,y=f;for(;;){if(y===e)break t;if(g===n&&++d===o&&(s=l),g===i&&++m===r&&(u=l),(f=y.nextSibling)!==null)break;y=g,g=y.parentNode}y=f}n=s===-1||u===-1?null:{start:s,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(Zl={focusedElem:e,selectionRange:n},ci=!1,$=t;$!==null;)if(t=$,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,$=e;else for(;$!==null;){t=$;try{var E=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(E!==null){var b=E.memoizedProps,_=E.memoizedState,p=t.stateNode,c=p.getSnapshotBeforeUpdate(t.elementType===t.type?b:St(t.type,b),_);p.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var h=t.stateNode.containerInfo;h.nodeType===1?h.textContent="":h.nodeType===9&&h.documentElement&&h.removeChild(h.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(z(163))}}catch(k){be(t,t.return,k)}if(e=t.sibling,e!==null){e.return=t.return,$=e;break}$=t.return}return E=Hu,Hu=!1,E}function Ur(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var o=r=r.next;do{if((o.tag&e)===e){var i=o.destroy;o.destroy=void 0,i!==void 0&&fa(t,n,i)}o=o.next}while(o!==r)}}function Ii(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ga(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Od(e){var t=e.alternate;t!==null&&(e.alternate=null,Od(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Mt],delete t[eo],delete t[ta],delete t[xf],delete t[bf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function $d(e){return e.tag===5||e.tag===3||e.tag===4}function Ku(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||$d(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ha(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=mi));else if(r!==4&&(e=e.child,e!==null))for(ha(e,t,n),e=e.sibling;e!==null;)ha(e,t,n),e=e.sibling}function ya(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ya(e,t,n),e=e.sibling;e!==null;)ya(e,t,n),e=e.sibling}var Pe=null,Nt=!1;function Jt(e,t,n){for(n=n.child;n!==null;)Id(e,t,n),n=n.sibling}function Id(e,t,n){if(Rt&&typeof Rt.onCommitFiberUnmount=="function")try{Rt.onCommitFiberUnmount(zi,n)}catch{}switch(n.tag){case 5:Fe||tr(n,t);case 6:var r=Pe,o=Nt;Pe=null,Jt(e,t,n),Pe=r,Nt=o,Pe!==null&&(Nt?(e=Pe,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Pe.removeChild(n.stateNode));break;case 18:Pe!==null&&(Nt?(e=Pe,n=n.stateNode,e.nodeType===8?bl(e.parentNode,n):e.nodeType===1&&bl(e,n),Qr(e)):bl(Pe,n.stateNode));break;case 4:r=Pe,o=Nt,Pe=n.stateNode.containerInfo,Nt=!0,Jt(e,t,n),Pe=r,Nt=o;break;case 0:case 11:case 14:case 15:if(!Fe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){o=r=r.next;do{var i=o,l=i.destroy;i=i.tag,l!==void 0&&((i&2)!==0||(i&4)!==0)&&fa(n,t,l),o=o.next}while(o!==r)}Jt(e,t,n);break;case 1:if(!Fe&&(tr(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){be(n,t,s)}Jt(e,t,n);break;case 21:Jt(e,t,n);break;case 22:n.mode&1?(Fe=(r=Fe)||n.memoizedState!==null,Jt(e,t,n),Fe=r):Jt(e,t,n);break;default:Jt(e,t,n)}}function Wu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new $f),t.forEach(function(r){var o=Wf.bind(null,e,r);n.has(r)||(n.add(r),r.then(o,o))})}}function kt(e,t){var n=t.deletions;if(n!==null)for(var r=0;ro&&(o=l),r&=~i}if(r=o,r=we()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Df(r/1960))-r,10e?16:e,ln===null)var r=!1;else{if(e=ln,ln=null,_i=0,(Y&6)!==0)throw Error(z(331));var o=Y;for(Y|=4,$=e.current;$!==null;){var i=$,l=i.child;if(($.flags&16)!==0){var s=i.deletions;if(s!==null){for(var u=0;uwe()-rs?Ln(e,0):ns|=n),Je(e,t)}function Kd(e,t){t===0&&((e.mode&1)===0?t=1:(t=Ro,Ro<<=1,(Ro&130023424)===0&&(Ro=4194304)));var n=Ke();e=Ht(e,t),e!==null&&(ao(e,t,n),Je(e,n))}function Kf(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Kd(e,n)}function Wf(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(z(314))}r!==null&&r.delete(t),Kd(e,n)}var Wd;Wd=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Xe.current)qe=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return qe=!1,Mf(e,t,n);qe=(e.flags&131072)!==0}else qe=!1,pe&&(t.flags&1048576)!==0&&qc(t,yi,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;ti(e,t),e=t.pendingProps;var o=cr(t,De.current);ar(t,n),o=qa(null,t,r,e,o,n);var i=Xa();return t.flags|=1,typeof o=="object"&&o!==null&&typeof o.render=="function"&&o.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ze(r)?(i=!0,gi(t)):i=!1,t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,Ka(t),o.updater=$i,t.stateNode=o,o._reactInternals=t,aa(t,r,e,n),t=ca(null,t,r,!0,i,n)):(t.tag=0,pe&&i&&Fa(t),He(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(ti(e,t),e=t.pendingProps,o=r._init,r=o(r._payload),t.type=r,o=t.tag=Yf(r),e=St(r,e),o){case 0:t=ua(null,t,r,e,n);break e;case 1:t=Uu(null,t,r,e,n);break e;case 11:t=Du(null,t,r,e,n);break e;case 14:t=ju(null,t,r,St(r.type,e),n);break e}throw Error(z(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),ua(e,t,r,o,n);case 1:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),Uu(e,t,r,o,n);case 3:e:{if(zd(t),e===null)throw Error(z(387));r=t.pendingProps,i=t.memoizedState,o=i.element,nd(e,t),bi(t,r,null,n);var l=t.memoizedState;if(r=l.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){o=fr(Error(z(423)),t),t=Vu(e,t,r,n,o);break e}else if(r!==o){o=fr(Error(z(424)),t),t=Vu(e,t,r,n,o);break e}else for(nt=cn(t.stateNode.containerInfo.firstChild),rt=t,pe=!0,Et=null,n=ed(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(dr(),r===o){t=Kt(e,t,n);break e}He(e,t,r,n)}t=t.child}return t;case 5:return rd(t),e===null&&oa(t),r=t.type,o=t.pendingProps,i=e!==null?e.memoizedProps:null,l=o.children,Jl(r,o)?l=null:i!==null&&Jl(r,i)&&(t.flags|=32),Ld(e,t),He(e,t,l,n),t.child;case 6:return e===null&&oa(t),null;case 13:return Ad(e,t,n);case 4:return Wa(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=pr(t,null,r,n):He(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),Du(e,t,r,o,n);case 7:return He(e,t,t.pendingProps,n),t.child;case 8:return He(e,t,t.pendingProps.children,n),t.child;case 12:return He(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,l=o.value,ae(vi,r._currentValue),r._currentValue=l,i!==null)if(Lt(i.value,l)){if(i.children===o.children&&!Xe.current){t=Kt(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var s=i.dependencies;if(s!==null){l=i.child;for(var u=s.firstContext;u!==null;){if(u.context===r){if(i.tag===1){u=Ut(-1,n&-n),u.tag=2;var d=i.updateQueue;if(d!==null){d=d.shared;var m=d.pending;m===null?u.next=u:(u.next=m.next,m.next=u),d.pending=u}}i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),ia(i.return,n,t),s.lanes|=n;break}u=u.next}}else if(i.tag===10)l=i.type===t.type?null:i.child;else if(i.tag===18){if(l=i.return,l===null)throw Error(z(341));l.lanes|=n,s=l.alternate,s!==null&&(s.lanes|=n),ia(l,n,t),l=i.sibling}else l=i.child;if(l!==null)l.return=i;else for(l=i;l!==null;){if(l===t){l=null;break}if(i=l.sibling,i!==null){i.return=l.return,l=i;break}l=l.return}i=l}He(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,ar(t,n),o=vt(o),r=r(o),t.flags|=1,He(e,t,r,n),t.child;case 14:return r=t.type,o=St(r,t.pendingProps),o=St(r.type,o),ju(e,t,r,o,n);case 15:return _d(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),ti(e,t),t.tag=1,Ze(r)?(e=!0,gi(t)):e=!1,ar(t,n),Sd(t,r,o),aa(t,r,o,n),ca(null,t,r,!0,e,n);case 19:return Pd(e,t,n);case 22:return Cd(e,t,n)}throw Error(z(156,t.tag))};function Gd(e,t){return bc(e,t)}function Gf(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ht(e,t,n,r){return new Gf(e,t,n,r)}function as(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Yf(e){if(typeof e=="function")return as(e)?1:0;if(e!=null){if(e=e.$$typeof,e===_a)return 11;if(e===Ca)return 14}return 2}function fn(e,t){var n=e.alternate;return n===null?(n=ht(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function oi(e,t,n,r,o,i){var l=2;if(r=e,typeof e=="function")as(e)&&(l=1);else if(typeof e=="string")l=5;else e:switch(e){case Wn:return zn(n.children,o,i,t);case Ea:l=8,o|=8;break;case Pl:return e=ht(12,n,t,o|2),e.elementType=Pl,e.lanes=i,e;case Tl:return e=ht(13,n,t,o),e.elementType=Tl,e.lanes=i,e;case Ml:return e=ht(19,n,t,o),e.elementType=Ml,e.lanes=i,e;case rc:return Di(n,o,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case tc:l=10;break e;case nc:l=9;break e;case _a:l=11;break e;case Ca:l=14;break e;case en:l=16,r=null;break e}throw Error(z(130,e==null?e:typeof e,""))}return t=ht(l,n,t,o),t.elementType=e,t.type=r,t.lanes=i,t}function zn(e,t,n,r){return e=ht(7,e,r,t),e.lanes=n,e}function Di(e,t,n,r){return e=ht(22,e,r,t),e.elementType=rc,e.lanes=n,e.stateNode={isHidden:!1},e}function Ll(e,t,n){return e=ht(6,e,null,t),e.lanes=n,e}function zl(e,t,n){return t=ht(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Qf(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=pl(0),this.expirationTimes=pl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=pl(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function ss(e,t,n,r,o,i,l,s,u){return e=new Qf(e,t,n,s,u),t===1?(t=1,i===!0&&(t|=8)):t=0,i=ht(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ka(i),e}function qf(e,t,n){var r=3{"use strict";function Zd(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Zd)}catch(e){console.error(e)}}Zd(),Jd.exports=Xd()});var np=$t(ps=>{"use strict";var tp=ep();ps.createRoot=tp.createRoot,ps.hydrateRoot=tp.hydrateRoot;var ph});var op=$t(Hi=>{"use strict";var tg=No(),ng=Symbol.for("react.element"),rg=Symbol.for("react.fragment"),og=Object.prototype.hasOwnProperty,ig=tg.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,lg={key:!0,ref:!0,__self:!0,__source:!0};function rp(e,t,n){var r,o={},i=null,l=null;n!==void 0&&(i=""+n),t.key!==void 0&&(i=""+t.key),t.ref!==void 0&&(l=t.ref);for(r in t)og.call(t,r)&&!lg.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)o[r]===void 0&&(o[r]=t[r]);return{$$typeof:ng,type:e,key:i,ref:l,props:o,_owner:ig.current}}Hi.Fragment=rg;Hi.jsx=rp;Hi.jsxs=rp});var ms=$t((yh,ip)=>{"use strict";ip.exports=op()});var N=bo(No(),1),bp=bo(np(),1);var a=bo(ms(),1),wp={hidden:"UKRYTY",connecting:"\u0141\u0104CZENIE",connected:"ONLINE \xB7 LIVE",replaying:"ONLINE \xB7 REPLAY",verifying:"ONLINE \xB7 WERYFIKACJA",ready:"ONLINE \xB7 GOTOWY",failed:"ONLINE \xB7 B\u0141\u0104D STANU",offline:"OFFLINE \xB7 ZAPIS",unselected:"OFFLINE \xB7 BRAK CELU"},lp=.25,Fn=1,ap=4;function ag(e){let t=window.getComputedStyle(e).overflowY;return t==="auto"||t==="scroll"||t==="hidden"||t==="clip"}function kp(e){let t=e.getBoundingClientRect(),n=e.offsetHeight||e.clientHeight,r=n>0?t.height/n:1,o=t.top+e.clientTop*r;return{top:o,bottom:o+e.clientHeight*r}}function Sp(e){let t=document.querySelector(".viewer-chrome");if(t?.classList.contains("is-nvim-fit"))return null;let n=0,r=window.innerHeight;if(t){let o=t.getBoundingClientRect(),i=e.getBoundingClientRect();o.lefti.left&&o.bottom>0&&o.topFn?{top:n,bottom:r}:null}function sg(e){let t=Sp(e);if(!t)return null;let{top:n,bottom:r}=t;for(let o=e.parentElement;o&&o!==document.body&&o!==document.documentElement;o=o.parentElement){if(!ag(o))continue;let i=kp(o);n=Math.max(n,i.top),r=Math.min(r,i.bottom)}return r-n>Fn?{top:n,bottom:r}:null}function Gi(){return document.scrollingElement??document.documentElement}function ug(e){let t=[];for(let r=e.parentElement;r&&r!==document.body&&r!==document.documentElement;r=r.parentElement){let o=window.getComputedStyle(r).overflowY;(o==="auto"||o==="scroll")&&r.scrollHeight-r.clientHeight>1&&t.push(r)}let n=Gi();return t.includes(n)||t.push(n),t}function cg(e){if(e===Gi())return 1;let t=e.getBoundingClientRect(),n=e.offsetHeight||e.clientHeight,r=n>0?t.height/n:1;return Number.isFinite(r)&&r>0?r:1}function Ki(e,t){let n=e.style.scrollBehavior;e.style.scrollBehavior="auto",t.left!=null&&(e.scrollLeft=t.left),t.top!=null&&(e.scrollTop=t.top),e.style.scrollBehavior=n}function dg(e,t){let n=e.closest(".sheet-content");if(!n)return 0;let r=kp(n),o=0;if(r.bottom<=t.top?o=r.bottom-t.bottom:r.top>=t.bottom&&(o=r.top-t.top),Math.abs(o)<=Fn)return 0;let i=Gi(),l=i.scrollTop,s=Math.max(0,i.scrollHeight-i.clientHeight);return Ki(i,{top:Math.max(0,Math.min(s,l+o))}),i.scrollTop-l}function sp(e,t){let n=t;for(let r of ug(e)){if(Math.abs(n)<=Fn)break;let o=cg(r),i=Math.max(0,r.scrollHeight-r.clientHeight),l=r.scrollTop,s=Math.max(0,Math.min(i,l+n/o));Ki(r,{top:s}),n-=(r.scrollTop-l)*o}return t-n}function up(e,t){let n=e.getBoundingClientRect(),r=(n.top+n.bottom)/2,o=t.bottom-t.top,i=t.top+o*lp,l=t.bottom-o*lp;return rl?r-l:0}var Yt=({html:e,className:t})=>(0,a.jsx)("div",{className:t,dangerouslySetInnerHTML:{__html:e}});function Np(e,t){e.setAttribute("preserveAspectRatio","xMinYMin meet"),t&&(e.setAttribute("viewBox",`${t.x} ${t.y} ${t.width} ${t.height}`),e.setAttribute("width",`${t.width}px`),e.setAttribute("height",`${t.height}px`),e.dataset.tileIndex=String(t.index),e.dataset.tileRow=String(t.row),e.dataset.tileColumn=String(t.column))}function pg(e){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9_.:-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,120)||"uml-element"}function gs(e){let t=e;if(typeof t.getBBox!="function")return null;try{let n=t.getBBox();return[n.x,n.y,n.width,n.height].every(Number.isFinite)?{x:n.x,y:n.y,width:n.width,height:n.height}:null}catch{return null}}function mg(e){let t=gs(e);if(!t)return null;let n=Number(e.dataset.umlLayoutOriginX),r=Number(e.dataset.umlLayoutOriginY),o=Number(e.dataset.umlLayoutDx),i=Number(e.dataset.umlLayoutDy),l=Number(e.dataset.umlLayoutSx),s=Number(e.dataset.umlLayoutSy);return[n,r,o,i,l,s].every(Number.isFinite)?{x:n+(t.x-n)*l+o,y:r+(t.y-r)*s+i,width:t.width*l,height:t.height*s}:t}function Ep(e){e.dataset.umlLayoutRemembered!=="true"&&(e.dataset.umlLayoutRemembered="true",e.dataset.umlLayoutOriginalTransform=e.getAttribute("transform")??"",e.dataset.umlLayoutOriginalVisibility=e.getAttribute("visibility")??"",e.dataset.umlLayoutOriginalStyle=e.getAttribute("style")??"",e instanceof SVGTextElement&&(e.dataset.umlLayoutOriginalText=e.textContent??"",e.dataset.umlLayoutOriginalX=e.getAttribute("x")??"",e.dataset.umlLayoutOriginalTextAnchor=e.getAttribute("text-anchor")??"",e.dataset.umlLayoutOriginalFontFamily=e.getAttribute("font-family")??"",e.dataset.umlLayoutOriginalFontSize=e.getAttribute("font-size")??"",e.dataset.umlLayoutOriginalFontWeight=e.getAttribute("font-weight")??""),e instanceof SVGRectElement&&(e.dataset.umlLayoutOriginalFill=e.getAttribute("fill")??"",e.dataset.umlLayoutOriginalStroke=e.getAttribute("stroke")??"",e.dataset.umlLayoutOriginalStrokeWidth=e.getAttribute("stroke-width")??""))}function fg(e){e.querySelectorAll(".uml-layout-hit,.uml-layout-resize,.uml-layout-generated").forEach(t=>t.remove()),e.querySelectorAll("[data-uml-layout-remembered='true']").forEach(t=>{let n=(r,o)=>{o?t.setAttribute(r,o):t.removeAttribute(r)};n("transform",t.dataset.umlLayoutOriginalTransform),n("visibility",t.dataset.umlLayoutOriginalVisibility),n("style",t.dataset.umlLayoutOriginalStyle),t instanceof SVGTextElement&&(t.textContent=t.dataset.umlLayoutOriginalText??"",n("x",t.dataset.umlLayoutOriginalX),n("text-anchor",t.dataset.umlLayoutOriginalTextAnchor),n("font-family",t.dataset.umlLayoutOriginalFontFamily),n("font-size",t.dataset.umlLayoutOriginalFontSize),n("font-weight",t.dataset.umlLayoutOriginalFontWeight)),t instanceof SVGRectElement&&(n("fill",t.dataset.umlLayoutOriginalFill),n("stroke",t.dataset.umlLayoutOriginalStroke),n("stroke-width",t.dataset.umlLayoutOriginalStrokeWidth)),delete t.dataset.umlLayoutOriginX,delete t.dataset.umlLayoutOriginY,delete t.dataset.umlLayoutDx,delete t.dataset.umlLayoutDy,delete t.dataset.umlLayoutSx,delete t.dataset.umlLayoutSy,delete t.dataset.umlLayoutId})}function gg(e,t){let n=e.querySelector(":scope > g")??e,r=Array.from(n.children).filter(s=>s instanceof SVGElement),o=r.filter(s=>s instanceof SVGRectElement).map(s=>({rect:s,box:gs(s)})).filter(s=>!!(s.box&&s.box.width>=30&&s.box.height>=14)).sort((s,u)=>s.box.width*s.box.height-u.box.width*u.box.height),i=new Map;for(let s of r){let u=gs(s);if(!u)continue;let d=u.x+u.width/2,m=u.y+u.height/2,y=o.find(({box:g})=>d>=g.x-.5&&d<=g.x+g.width+.5&&m>=g.y-.5&&m<=g.y+g.height+.5);y&&i.set(s,y.rect)}let l=new Set;return o.map(({rect:s,box:u},d)=>{let m=r.filter(c=>i.get(c)===s);m.includes(s)||m.unshift(s);let y=m.filter(c=>c instanceof SVGTextElement).sort((c,h)=>Number(c.getAttribute("y"))-Number(h.getAttribute("y"))),g=(y[0]?.textContent??s.id??`element-${d+1}`).trim(),f=/^(\d{1,3})\b/.exec(g)?.[1]?.padStart(2,"0"),E=s.id||(f?t.get(f):"")||g,b=pg(E),_=b,p=2;for(;l.has(_);)_=`${b}-${p++}`;return l.add(_),m.forEach(Ep),{id:_,box:u,rect:s,members:m,texts:y}})}function po(e){let t=e.texts[0],n=e.rect.getAttribute("style")??"",r=i=>new RegExp(`${i}\\s*:\\s*([^;]+)`,"i").exec(n)?.[1]?.trim(),o=Number(t?.getAttribute("font-size")??12);return{...e.box,z:0,scale:1,rotation:0,text:{title:(e.texts[0]?.textContent??"").trim(),description:e.texts.slice(1).map(i=>(i.textContent??"").trim()).join(` -`),lines:e.texts.map(i=>(i.textContent??"").trim()),font_family:t?.getAttribute("font-family")??"Monospace",font_size:Number.isFinite(o)?o:12,font_weight:Number(t?.getAttribute("font-weight")??400)||400,align:"left"},style:{fill:e.rect.getAttribute("fill")??r("fill")??"#edf6fa",stroke:e.rect.getAttribute("stroke")??r("stroke")??"#2c7794",stroke_width:Number(e.rect.getAttribute("stroke-width")??r("stroke-width")??1.5)}}}function hg(e,t){let n=Math.max(12,Number(t.width)||e.box.width),r=Math.max(12,Number(t.height)||e.box.height),o=Number.isFinite(Number(t.x))?Number(t.x):e.box.x,i=Number.isFinite(Number(t.y))?Number(t.y):e.box.y,l=n/Math.max(1,e.box.width),s=r/Math.max(1,e.box.height),u=o-e.box.x,d=i-e.box.y,m=`translate(${u} ${d}) translate(${e.box.x} ${e.box.y}) scale(${l} ${s}) translate(${-e.box.x} ${-e.box.y})`;e.members.forEach(f=>{Ep(f);let E=f.dataset.umlLayoutOriginalTransform??"";f.setAttribute("transform",`${m}${E?` ${E}`:""}`),f.dataset.umlLayoutOriginX=String(e.box.x),f.dataset.umlLayoutOriginY=String(e.box.y),f.dataset.umlLayoutDx=String(u),f.dataset.umlLayoutDy=String(d),f.dataset.umlLayoutSx=String(l),f.dataset.umlLayoutSy=String(s),f.dataset.umlLayoutId=e.id});let y=t.text??{},g=y.lines??[y.title??"",...y.description?y.description.split(` -`):[]];e.texts.forEach((f,E)=>{E(e.tile?.page_height??0)?"landscape":"portrait",scale:1},elements:{},relations:{}}}function hs(e){if(!e)return{};let t=e.column===1&&e.columns>1?e.page_width-e.width:e.column===e.columns?0:Math.max(0,(e.page_width-e.width)/2),n=e.row===1&&e.rows>1?e.page_height-e.height:e.row===e.rows?0:Math.max(0,(e.page_height-e.height)/2);return{"--uml-tile-page-width":`${e.page_width}px`,"--uml-tile-page-height":`${e.page_height}px`,"--uml-tile-left":`${t}px`,"--uml-tile-top":`${n}px`}}function yg({html:e}){return(0,a.jsx)(Yt,{html:e})}function vg(e){let t=e.spread_count??1;if(t<=1)return null;let n=Math.max(1,Math.min(t,e.spread_index??1)),r=Math.max(1,Math.min(t,e.spread_columns??1)),o=n-1,i=Math.floor(o/r),l=o%r;return{left:l>0,right:l+10,down:n+r<=t,index:n,count:t}}function _p({continuation:e}){if(!e)return null;let t=[e.left&&["left","\u2190","kontynuacja po lewej"],e.up&&["up","\u2191","kontynuacja powy\u017Cej"],e.down&&["down","\u2193","kontynuacja poni\u017Cej"],e.right&&["right","\u2192","kontynuacja po prawej"]].filter(Boolean);return(0,a.jsx)("span",{className:"uml-page-continuation","aria-label":`Logiczny diagram: strona ${e.index} z ${e.count}`,title:`Ten sam diagram \xB7 strona ${e.index}/${e.count}`,children:t.map(([n,r,o])=>(0,a.jsx)("i",{"data-direction":n,"aria-label":o,children:r},n))})}function cp({side:e,html:t}){return(0,a.jsx)("aside",{className:`pdf-margin ${e}`,dangerouslySetInnerHTML:{__html:t}})}function ys({header:e,left:t="",right:n="",children:r,className:o=""}){return(0,a.jsx)("article",{className:`sheet ${o}`,children:(0,a.jsxs)("div",{className:"sheet-content",children:[(0,a.jsx)(yg,{html:e}),(0,a.jsx)(cp,{side:"left",html:t}),(0,a.jsx)("section",{className:"pdf-main card-section",children:r}),(0,a.jsx)(cp,{side:"right",html:n})]})})}function xg({viewpoints:e}){let t=e.filter(i=>i.status==="enabled"&&i.target_id),[n,r]=(0,N.useState)(t[0]?.id??"");(0,N.useEffect)(()=>{if(!t.length)return;let i=0,l=()=>{window.cancelAnimationFrame(i),i=window.requestAnimationFrame(()=>{let s=document.querySelector(".viewer-chrome")?.getBoundingClientRect().bottom??0,u=t.map(m=>({viewpoint:m,element:document.getElementById(m.target_id)})).filter(m=>!!m.element);if(!u.length)return;let d=u.reduce((m,y)=>{let g=Math.abs(y.element.getBoundingClientRect().top-s-18);return g{window.cancelAnimationFrame(i),window.removeEventListener("scroll",l),window.removeEventListener("resize",l)}},[e]);let o=i=>{if(i.status!=="enabled"||!i.target_id)return;let l=document.getElementById(i.target_id);if(!l)return;let u=document.querySelector(".viewer-chrome")?.getBoundingClientRect().height??0;r(i.id),window.scrollTo({top:Math.max(0,window.scrollY+l.getBoundingClientRect().top-u-8),behavior:"smooth"})};return(0,a.jsx)("nav",{className:"viewpoint-bar","aria-label":"Perspektywy architektury A1\u2013A8",children:e.map(i=>{let l=i.status==="unavailable";return(0,a.jsxs)("button",{type:"button",className:l?"is-unavailable":"","aria-current":!l&&n===i.id?"location":void 0,disabled:l,title:l?i.reason:i.subtitle,onClick:()=>o(i),children:[(0,a.jsx)("span",{children:i.id}),(0,a.jsx)("strong",{children:i.label}),l&&(0,a.jsx)("small",{children:"N/D"})]},i.id)})})}function bg({toc:e,libraryAvailable:t,libraryOpen:n,setLibraryOpen:r,scale:o,setScale:i,nvimVisible:l,setNvimVisible:s,nvimSyncMode:u,setNvimSyncMode:d,nvimControlMode:m,setNvimControlMode:y,nvimExpanded:g,setNvimExpanded:f,nvimFit:E,setNvimFit:b,allocatorVisible:_,setAllocatorVisible:p,hasAllocatorModel:c,diagramSpread:h,setDiagramSpread:k,hasDiagramSpread:C,nvimSummary:P,progress:T,progressError:R}){return(0,a.jsx)("nav",{className:"topbar",children:(0,a.jsxs)("div",{className:"topbar-inner",children:[t&&(0,a.jsxs)("button",{type:"button",className:`card-library-toggle${n?" is-active":""}`,"aria-controls":"side-panel-left-library","aria-expanded":n,"aria-label":n?"Alt+0: zamknij serie i karty":"Alt+0: poka\u017C serie i karty",title:n?"Alt+0 \xB7 Zamknij serie i karty":"Alt+0 \xB7 Serie i karty",onClick:()=>r(!n),children:[(0,a.jsx)("span",{"aria-hidden":"true",className:"card-library-toggle-icon",children:"\u2630"}),(0,a.jsx)("kbd",{children:"A0"}),(0,a.jsx)("span",{children:"KARTY"})]}),(0,a.jsxs)("details",{children:[(0,a.jsx)("summary",{children:"Spis tre\u015Bci"}),(0,a.jsx)("div",{className:"toc-links",children:e.map(j=>(0,a.jsx)("a",{href:`#${j.id}`,children:j.label},j.id))})]}),(0,a.jsxs)("div",{className:"topbar-nvim-section","aria-label":"Panel Neovima",children:[(0,a.jsx)("span",{className:"nvim-toolbar-boundary","aria-hidden":"true",children:"|"}),(0,a.jsx)("span",{className:"nvim-toolbar-context",children:"NVIM"}),(0,a.jsxs)("div",{className:"nvim-toolbar-actions","aria-label":"Narz\u0119dzia okna Neovima",children:[(0,a.jsxs)("button",{className:"viewer-nvim-toggle nvim-toolbar-button","aria-label":l?"Alt+1: ukryj Neovim":"Alt+1: poka\u017C Neovim",title:l?"Alt+1 \xB7 Ukryj Neovim":"Alt+1 \xB7 Poka\u017C Neovim","aria-pressed":l,onClick:()=>s(!l),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A1"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"PANEL"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-control-indicator nvim-toolbar-button${P.syncMode?" is-active":""}${P.syncReady?" is-engaged":""}`,"aria-label":`Alt+2: synchronizacja ${u?"w\u0142\u0105czona":"wy\u0142\u0105czona"}`,title:`Alt+2 \xB7 SYNC ${u?"ON":"OFF"}`,"aria-pressed":u,onClick:()=>d(!u),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A2"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"SYNC"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-work-indicator nvim-toolbar-button${m?" is-active":""}${P.controlEnabled?" is-engaged":""}`,"aria-label":`Alt+3: sterowanie ${u?m?"w\u0142\u0105czone":"wy\u0142\u0105czone":"niedost\u0119pne"}`,title:u?`Alt+3 \xB7 Sterowanie ${m?"ON":"OFF"}`:"Alt+3 \xB7 Sterowanie wymaga SYNC ON","aria-pressed":m,disabled:!u,onClick:()=>y(!m),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A3"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"CTRL"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${g?" is-active":""}`,"aria-label":`Alt+4: ${g?"przywr\xF3\u0107 normaln\u0105 wysoko\u015B\u0107":"ustaw wysoki panel"}`,title:g?"Alt+4 \xB7 Normalna wysoko\u015B\u0107":"Alt+4 \xB7 Wysoki panel 90%","aria-pressed":g,onClick:()=>f(!g),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A4"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"HIGH"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${E?" is-active":""}`,"aria-label":`Alt+5: automatyczne dopasowanie ${E?"w\u0142\u0105czone":"wy\u0142\u0105czone"}`,title:E?"Alt+5 \xB7 Wy\u0142\u0105cz auto-fit":"Alt+5 \xB7 Poka\u017C ca\u0142y Neovim","aria-pressed":E,onClick:()=>b(!E),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A5"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"FIT"})]}),c&&(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${_?" is-active":""}`,"aria-label":`Alt+6: model alokatora ${_?"przypi\u0119ty":"ukryty"}`,title:_?"Alt+6 \xB7 Ukryj model alokatora":"Alt+6 \xB7 Przypnij model alokatora","aria-pressed":_,onClick:()=>p(!_),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A6"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"MODEL"})]}),C&&(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${h?" is-active":""}`,"aria-label":`Alt+7: diagram UML ${h?"jako osobne kartki A4":"jako po\u0142\u0105czony spread"}`,title:h?"Alt+7 \xB7 Osobne kartki A4":"Alt+7 \xB7 Po\u0142\u0105cz strony UML","aria-pressed":h,onClick:()=>k(!h),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A7"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"UML"})]})]}),(0,a.jsx)("span",{className:"nvim-toolbar-boundary","aria-hidden":"true",children:"|"}),l&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:`nvim-status nvim-status--${P.state}`,children:wp[P.state]}),(0,a.jsxs)("span",{className:"topbar-nvim-meta",title:P.message,children:[(0,a.jsx)("strong",{children:P.instance??"Neovim MCP"}),P.detail&&(0,a.jsx)("small",{children:P.detail})]}),(0,a.jsxs)("span",{className:"nvim-shortcut-strip","aria-label":"Skr\xF3ty panelu Neovima",children:[(0,a.jsx)("kbd",{children:"F1"})," reset \xB7 ",(0,a.jsx)("kbd",{children:"F2"})," sync \xB7 ",(0,a.jsx)("kbd",{children:"Alt+W"})," okna \xB7 ",(0,a.jsx)("kbd",{children:"F12"})," skr\xF3ty"]})]})]}),(0,a.jsx)(Gg,{progress:T,error:R}),(0,a.jsxs)("div",{className:"viewer-zoom-controls",children:[(0,a.jsxs)("output",{className:"viewer-zoom-status",children:["P\u0142\xF3tno ",Math.round(o*100),"% \xB7 Tre\u015B\u0107 100%"]}),(0,a.jsx)("button",{className:"viewer-zoom-reset",onClick:()=>i(2.18),children:"Reset zoom"})]})]})})}function dp(e,t){for(let n of e.sections)for(let r of n.assets){let o=r.interactive;if(!(o?.kind!=="uml-sequence"||!o.phases?.length)&&!(t?.task.id&&o.task?.id!==t.task.id)&&!(t?.block.id&&o.block?.id!==t.block.id))for(let i of o.phases){if(t?.phase.id&&i.id!==t.phase.id)continue;let l=t?.step.id?i.steps.find(s=>s.id===t.step.id):i.steps[0];if(l)return{task:o.task??null,block:o.block??null,phase:{id:i.id,label:i.label},step:l,focusLevel:t?.focus_level??"step",activate:!1}}}return null}function wg({visible:e,model:t}){let[n,r]=(0,N.useState)(null);if((0,N.useEffect)(()=>{let g=f=>{r(f.detail??null)};return window.addEventListener("stem:nvim-step",g),r(dp(t)),fetch("/api/navigation/current",{cache:"no-store"}).then(f=>f.ok?f.json():Promise.reject()).then(f=>{let E=dp(t,f.current??null);E&&r(E)}).catch(()=>{}),()=>window.removeEventListener("stem:nvim-step",g)},[t]),!e)return null;let o=n?.focusLevel??"card",i=n?.step.snapshot?.memory.arena,l=!!(n&&o!=="card"&&o!=="task"),s=Math.max(1,Number(i?.size_bytes??64)),u=i?.offset==null?null:Math.max(0,Math.min(s,Number(i.offset))),d=i?.bytes.trim().split(/\s+/).filter(Boolean)??[],m=Math.min(s,64),y=n?[...(n.step.snapshot?.memory.items??[]).map(g=>({name:g.name,value:g.value})),...(n.step.snapshot?.frame.fields??[]).map(g=>({name:g.name,value:g.value}))].filter((g,f,E)=>E.findIndex(b=>b.name===g.name)===f).slice(0,8):[];return(0,a.jsxs)("section",{className:"allocator-panel","aria-label":"Przypi\u0119ty model alokatora",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("span",{children:"ALLOCATOR \xB7 PINNED"}),(0,a.jsx)("strong",{children:n?`${n.phase.label} \xB7 ${String(n.step.number).padStart(2,"0")} ${n.step.label}`:"Oczekiwanie na diagram UML"}),(0,a.jsx)("small",{children:l?n.step.snapshot?.description??n.step.description:"Wybierz co najmniej BLOCK. F2 wybierze jego pierwszy krok i wykona synchronizacj\u0119."})]}),(0,a.jsxs)("div",{className:"allocator-panel-body",children:[(0,a.jsxs)("dl",{className:"allocator-metrics",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"FOCUS"}),(0,a.jsx)("dd",{children:o.toUpperCase()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"BASE"}),(0,a.jsx)("dd",{children:i?.base??"\u2014"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"ALLOCP"}),(0,a.jsx)("dd",{children:i?.cursor??"\u2014"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"USED / FREE"}),(0,a.jsx)("dd",{children:u==null?"\u2014":`${u} / ${s-u} B`})]})]}),(0,a.jsxs)("div",{className:`allocator-arena-view${l?"":" is-inactive"}`,children:[(0,a.jsxs)("div",{className:"allocator-arena-labels",children:[(0,a.jsx)("span",{children:"allocbuf[0]"}),(0,a.jsx)("strong",{children:u==null?"allocp jeszcze nieustawiony":`offset ${u}`}),(0,a.jsxs)("span",{children:["allocbuf[",s-1,"]"]})]}),(0,a.jsxs)("div",{className:"allocator-pinned-arena",style:{"--allocator-size":m},children:[Array.from({length:m},(g,f)=>(0,a.jsx)("i",{className:u!=null&&f(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{children:g.name}),(0,a.jsx)("code",{children:g.value})]},g.name)):(0,a.jsx)("p",{children:"Brak snapshotu."})})]})]})}var Wi=()=>({text:" ",highlight:0});function pp(e=1,t=1){return{width:e,height:t,cells:Array.from({length:t},()=>Array.from({length:e},Wi)),highlights:new Map,foreground:15263976,background:1053461,cursor:{row:0,column:0}}}function kg(e,t,n){if(t<=0||n<=0)return;let r=e.cells;e.width=t,e.height=n,e.cells=Array.from({length:n},(o,i)=>Array.from({length:t},(l,s)=>r[i]?.[s]??Wi()))}function Cp(e){return`stem-card:nvim-grid:${e}`}function Sg(e,t){if(t.width<=1||t.height<=1)return;let n={schema:"stem-nvim-grid.v1",snapshot_ref:e,saved_at:new Date().toISOString(),width:t.width,height:t.height,cells:t.cells.map(r=>r.map(o=>[o.text,o.highlight])),highlights:Array.from(t.highlights.entries()),foreground:t.foreground,background:t.background,cursor:{...t.cursor}};try{localStorage.setItem(Cp(e),JSON.stringify(n))}catch{}}function Lp(e,t){try{return e?.schema!=="stem-nvim-grid.v1"||e.snapshot_ref!==t||!Number.isInteger(e.width)||!Number.isInteger(e.height)||e.width<2||e.height<2||e.width>400||e.height>200||e.cells.length!==e.height?null:{width:e.width,height:e.height,cells:e.cells.map(n=>n.map(([r,o])=>({text:typeof r=="string"?r:" ",highlight:Number.isInteger(o)?o:0}))),highlights:new Map(e.highlights),foreground:e.foreground,background:e.background,cursor:e.cursor}}catch{return null}}function Ng(e){try{return Lp(JSON.parse(localStorage.getItem(Cp(e))??"null"),e)}catch{return null}}async function mp(e){let t=e.snapshot_ref;if(!t)return null;let n=Ng(t);if(n)return n;let r=e.view?.recorded_grid_ref;if(!r||/^(?:[a-z]+:|\/\/)/i.test(r))return null;try{let o=await fetch(r,{cache:"no-store"});return o.ok?Lp(await o.json(),t):null}catch{return null}}var Eg=[1842207,12590120,3064446,16106001,1997028,9978299,702940,12631996,6184036,15545147,5759881,16311388,5349887,12607947,5231357,16184820];function go(e){let t=Number(e);if(!Number.isInteger(t)||t<0||t>255)return;if(t<16)return Eg[t];if(t<232){let r=t-16,o=[0,95,135,175,215,255],i=o[Math.floor(r/36)],l=o[Math.floor(r%36/6)],s=o[r%6];return i<<16|l<<8|s}let n=8+(t-232)*10;return n<<16|n<<8|n}function _g(e){if(!e||typeof e!="object")return null;let t=e;return Object.keys(t).length?{...t,foreground:go(t.foreground),background:go(t.background),special:go(t.special)}:null}function Cg(e){if(!e||typeof e!="object")return null;let t=e;return Object.keys(t).length?{...t}:null}function Lg(e,t){for(let n of t){if(!Array.isArray(n)||typeof n[0]!="string")continue;let r=n[0],o=n.slice(1);for(let i of o)if(Array.isArray(i)){if(r==="grid_resize"){let[l,s,u]=i.map(Number);l===1&&kg(e,s,u)}else if(r==="default_colors_set"){let l=Number(i[0]),s=Number(i[1]),u=l>=0?l:go(i[3]),d=s>=0?s:go(i[4]);typeof u=="number"&&Number.isFinite(u)&&u>=0&&(e.foreground=u),typeof d=="number"&&Number.isFinite(d)&&d>=0&&(e.background=d)}else if(r==="hl_attr_define"){let l=Number(i[0]),s=_g(i[2])??Cg(i[1]);Number.isInteger(l)&&s&&typeof s=="object"&&e.highlights.set(l,s)}else if(r==="grid_clear"&&Number(i[0])===1)e.cells=Array.from({length:e.height},()=>Array.from({length:e.width},Wi));else if(r==="grid_cursor_goto"&&Number(i[0])===1)e.cursor={row:Number(i[1]),column:Number(i[2])};else if(r==="grid_line"&&Number(i[0])===1){let l=Number(i[1]),s=Number(i[2]),u=i[3];if(!e.cells[l]||!Array.isArray(u))continue;let d=0;for(let m of u){if(!Array.isArray(m))continue;let y=typeof m[0]=="string"?m[0]:" ";Number.isInteger(m[1])&&(d=Number(m[1]));let g=Number.isInteger(m[2])?Number(m[2]):1;for(let f=0;f=0&&(e.cells[l][s]={text:y,highlight:d}),s+=1}}else if(r==="grid_scroll"&&Number(i[0])===1){let l=Number(i[1]),s=Number(i[2]),u=Number(i[3]),d=Number(i[4]),m=Number(i[5]),y=Number(i[6]),g=e.cells.map(f=>f.map(E=>({...E})));for(let f=l;f=l&&b=u&&_i.text||" ").join(""),r=[],o=0;for(;o=n&&t.cursor.rowR.column-T.column||T.row-R.row):["asm","reg","memory"].includes(C??"")&&k.sort((T,R)=>T.column-R.column||T.row-R.row);let P=k[Math.max(0,Number(d.occurrence??1)-1)];m=P?.row??-1,y=P?.column??-1,f=d.text.length}if(m<0||y<0||m>=t.height||y>=t.width)continue;let E=Math.max(0,Number(d.padding_cells??1)),b=Math.max(0,y-E)*i,_=Math.max(0,m-E)*l,p=Math.min(t.width-y+E,f+E*2)*i,c=Math.min(t.height-m+E,g+E*2)*l,h=s[u.tone??"danger"];if(o.strokeStyle=h,o.lineWidth=2,u.shape==="underline"?(o.beginPath(),o.moveTo(b,_+c-2),o.lineTo(b+p,_+c-2),o.stroke()):o.strokeRect(b+1,_+1,Math.max(1,p-2),Math.max(1,c-2)),u.label){o.font="700 10px system-ui, sans-serif";let k=o.measureText(u.label).width+8;o.fillStyle=h,o.fillRect(b+1,Math.max(0,_-15),k,14),o.fillStyle="#fff",o.fillText(u.label,b+5,Math.max(10,_-4))}}}function Tg(e){if(e.nativeEvent.isComposing||e.metaKey)return null;let n={Enter:"CR",Escape:"Esc",Backspace:"BS",Delete:"Del",Tab:"Tab",ArrowLeft:"Left",ArrowRight:"Right",ArrowUp:"Up",ArrowDown:"Down",Home:"Home",End:"End",PageUp:"PageUp",PageDown:"PageDown",Insert:"Insert"}[e.key]??(/^F\d{1,2}$/.test(e.key)?e.key:null),r=[e.ctrlKey?"C":"",e.altKey?"M":"",e.shiftKey&&n?"S":""].filter(Boolean).join("-");return n?`<${r?`${r}-`:""}${n}>`:e.key.length!==1?null:e.ctrlKey||e.altKey?`<${r}-${e.key==="<"?"lt":e.key}>`:e.key==="<"?"":e.key}function Mg({visible:e,syncMode:t,controlMode:n,expanded:r,fit:o,scale:i,onSummaryChange:l}){let s=(0,N.useRef)(null),u=(0,N.useRef)(null),d=(0,N.useRef)(null),m=(0,N.useRef)(0),y=(0,N.useRef)(0),g=(0,N.useRef)(0),f=(0,N.useRef)(pp()),E=(0,N.useRef)(null),b=(0,N.useRef)(null),_=(0,N.useRef)(null),p=(0,N.useRef)(0),c=(0,N.useRef)(null),h=(0,N.useRef)(null),[k,C]=(0,N.useState)(null),[P,T]=(0,N.useState)(!1),[R,j]=(0,N.useState)(0),[I,ke]=(0,N.useState)(!1),[re,G]=(0,N.useState)(()=>{let A=Number(localStorage.getItem("stem-card-nvim-height-vh"));return Number.isFinite(A)&&A>=25&&A<=90?A:75}),[U,Le]=(0,N.useState)({state:"hidden"}),[Ne,Q]=(0,N.useState)({state:"idle"}),et=Ne.state==="replaying"||Ne.state==="verifying",Ge=t&&U.state==="connected"&&!et,je=n&&I&&U.state==="connected"&&!et,me=()=>{s.current&&Pg(s.current,f.current,_.current===b.current?.step.snapshot_ref?b.current?.step.view?.annotations??[]:[])},Dn=()=>{m.current||(m.current=window.requestAnimationFrame(()=>{m.current=0,me()}))};if((0,N.useEffect)(()=>{let A=F=>{let B=F.detail;b.current=B,C(B),_.current=null;let te=B.step.snapshot_ref;if(U.state!=="connected"&&te&&mp(B.step).then(ie=>{!ie||b.current?.step.snapshot_ref!==te||(f.current=ie,T(!0),_.current=te,Q({state:"idle",snapshot_ref:te,message:"Pokazano ostatni zapisany, zweryfikowany ekran."}),me())}),me(),!B.activate)return;let at=B.step.mode??"RUN",zt=async()=>{if(!B.step.code_ref)return null;let ie=await fetch("/api/nvim/open",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({code_ref:B.step.code_ref,actor:document.documentElement.dataset.cardClientId??"browser"})}),q=await ie.json().catch(()=>({}));if(!ie.ok)throw new Error(q.message??q.error??`HTTP ${ie.status}`);return q};if(at==="CODE"||!te){zt().then(()=>{Q({state:"ready",phase:"code",message:B.step.code_ref?`Otwarto ${B.step.code_ref}; program nie zosta\u0142 zrestartowany.`:"Krok CODE nie ma przypisanego code_ref."})}).catch(ie=>{Q({state:"failed",phase:"code",message:ie instanceof Error?ie.message:String(ie)})});return}if(!e||U.state!=="connected"){Q({state:"failed",snapshot_ref:te,message:"Cel jest offline; pozostaje zapisany wynik tego kroku."});return}let Ee=zt(),ne=Math.max(p.current+1,Date.now());p.current=ne,c.current?.abort();let st=new AbortController;c.current=st,Q({state:"replaying",phase:"dispatch",generation:ne,snapshot_ref:te,message:"Resetuj\u0119 cel i odtwarzam wykonanie do wybranego kroku."});let Ye=0,wn=async()=>{try{let ie=await fetch("/api/checkpoint/status",{cache:"no-store",signal:st.signal});if(!ie.ok)return;let q=await ie.json(),bt=q.active?.generation===ne?q.active:null;if(!bt||p.current!==ne)return;Q({state:bt.phase==="verify"?"verifying":"replaying",phase:bt.phase,generation:ne,snapshot_ref:te,message:bt.message})}catch{}};Ye=window.setInterval(wn,120),wn(),Ee.then(()=>fetch("/api/checkpoint/activate",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({snapshot_ref:te,generation:ne}),signal:st.signal})).then(async ie=>{let q=await ie.json();if(p.current!==ne)return;if(!ie.ok||q.status!=="ready")throw new Error(q.message??`Replay zako\u0144czy\u0142 si\u0119 kodem HTTP ${ie.status}.`);let bt=d.current;if(bt?.readyState!==WebSocket.OPEN)throw new Error("Replay zako\u0144czony, ale most Neovima jest offline.");let fe=y.current;bt.send(JSON.stringify({type:"refresh"}));let Qt=Date.now()+1800;for(;y.current<=fe&&Date.now()window.setTimeout(qt,20));if(y.current<=fe)throw new Error("Neovim nie potwierdzi\u0142 pe\u0142nego redraw po replay.");if(p.current!==ne)return;_.current=te,Q({state:"ready",phase:q.phase,generation:ne,snapshot_ref:te,message:q.message??"Stan maszyny zosta\u0142 odtworzony i zweryfikowany."}),Sg(te,f.current),me(),await new Promise(qt=>window.requestAnimationFrame(()=>qt()));let jn=s.current;if(jn&&b.current?.step.snapshot_ref===te)try{fetch("/api/evidence",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:document.documentElement.dataset.cardClientId??"browser",snapshot_ref:te,event_id:B.step.event_id??null,strategy_ref:B.step.strategy_ref??null,code_ref:B.step.code_ref??null,caption:`${String(B.step.number).padStart(2,"0")} ${B.step.label}`,data_url:jn.toDataURL("image/png")})}).catch(()=>{})}catch{}}).catch(ie=>{st.signal.aborted||p.current!==ne||(mp(B.step).then(q=>{!q||b.current?.step.snapshot_ref!==te||(f.current=q,T(!0),_.current=te,me())}),Q({state:"failed",generation:ne,snapshot_ref:te,message:ie instanceof Error?ie.message:String(ie)}))}).finally(()=>{window.clearInterval(Ye),c.current===st&&(c.current=null)})};return window.addEventListener("stem:nvim-step",A),()=>{window.removeEventListener("stem:nvim-step",A),c.current?.abort()}},[U.state,e]),(0,N.useEffect)(()=>{localStorage.setItem("stem-card-nvim-height-vh",re.toFixed(2))},[re]),(0,N.useEffect)(()=>{let A=window.requestAnimationFrame(me);return()=>window.cancelAnimationFrame(A)},[r,o,i]),(0,N.useEffect)(()=>{let A=()=>{let F=d.current;F?.readyState===WebSocket.OPEN&&F.send(JSON.stringify({type:"refresh"})),me()};return window.addEventListener("stem:nvim-refresh",A),()=>window.removeEventListener("stem:nvim-refresh",A)},[]),(0,N.useEffect)(()=>{let A=U.state;U.state==="connected"&&(A=Ne.state==="idle"?"connected":Ne.state),l({state:A,message:Ne.message??U.message,instance:U.target?.instance??U.target?.container_name,detail:[U.target?.profile??k?.step.view?.connection_ref,k?`${String(k.step.number).padStart(2,"0")} ${k.step.label}`:void 0,Ne.phase].filter(Boolean).join(" \xB7 "),syncMode:t,syncReady:Ge,controlMode:n,controlEnabled:je,screenCursor:{...f.current.cursor},grid:{columns:f.current.width,rows:f.current.height}})},[k,Ne,je,n,R,l,U,t,Ge]),(0,N.useEffect)(()=>()=>window.clearTimeout(g.current),[]),(0,N.useEffect)(()=>{if(!je)return;let A=F=>{let B=d.current;if(B?.readyState!==WebSocket.OPEN)return;if(F.altKey&&!F.ctrlKey&&!F.metaKey&&F.key.toLowerCase()==="w"){F.preventDefault(),F.stopImmediatePropagation(),F.repeat||B.send(JSON.stringify({type:"input",keys:""}));return}let te={ArrowLeft:"h",ArrowDown:"j",ArrowUp:"k",ArrowRight:"l"};F.altKey&&!F.ctrlKey&&!F.metaKey&&te[F.key]&&(F.preventDefault(),F.stopImmediatePropagation(),F.repeat||B.send(JSON.stringify({type:"input",keys:`${te[F.key]}`})))};return window.addEventListener("keydown",A,!0),()=>window.removeEventListener("keydown",A,!0)},[je]),(0,N.useEffect)(()=>{if(!e||!t){d.current?.close(),d.current=null,ke(!1),Le(e?{state:"offline",message:"SYNC OFF: pokazuj\u0119 zapisany ekran bez po\u0142\u0105czenia z kontenerem."}:{state:"hidden"});return}let A=!1,F=0,B=()=>{if(A)return;let te=window.location.protocol==="https:"?"wss:":"ws:",at=new WebSocket(`${te}//${window.location.host}/api/nvim-ui`);d.current=at,Le({state:"connecting"}),at.addEventListener("message",zt=>{try{let Ee=JSON.parse(String(zt.data));if(Ee.type==="status"){typeof Ee.epoch=="string"&&E.current&&E.current!==Ee.epoch&&(f.current=pp(),T(!1),_.current=null),typeof Ee.epoch=="string"&&(E.current=Ee.epoch),Le(Ee);return}Ee.type==="redraw"&&Array.isArray(Ee.events)&&(Lg(f.current,Ee.events),f.current.width>1&&f.current.height>1&&T(!0),Ee.events.some(ne=>Array.isArray(ne)&&ne[0]==="flush")&&(y.current+=1,Dn(),g.current||(g.current=window.setTimeout(()=>{g.current=0,j(ne=>ne+1)},120))))}catch{}}),at.addEventListener("close",()=>{d.current===at&&(d.current=null),A||(F=window.setTimeout(B,1200))}),at.addEventListener("error",()=>{Le(zt=>({...zt,state:"offline",message:"Most Neovima jest chwilowo niedost\u0119pny."}))})};return B(),()=>{A=!0,window.clearTimeout(F),window.cancelAnimationFrame(m.current),m.current=0,d.current?.close(),d.current=null}},[t,e]),!e)return null;let xe=A=>{let F=d.current;F?.readyState===WebSocket.OPEN&&F.send(JSON.stringify(A))},bn=A=>{let F=A.currentTarget.getBoundingClientRect();return{row:Math.max(0,Math.min(f.current.height-1,Math.floor((A.clientY-F.top)/F.height*f.current.height))),column:Math.max(0,Math.min(f.current.width-1,Math.floor((A.clientX-F.left)/F.width*f.current.width)))}},se=A=>[A.shiftKey?"S":"",A.ctrlKey?"C":"",A.altKey?"A":""].filter(Boolean).join("-");return(0,a.jsxs)("section",{className:"nvim-panel","aria-label":"Neovim po\u0142\u0105czony z kontenerem",onWheel:A=>{A.stopPropagation();let F=A.target;(!(F instanceof Element)||!F.closest(".nvim-screen-scroll"))&&A.preventDefault()},children:[(0,a.jsxs)("div",{ref:u,className:"nvim-screen-scroll",style:o?void 0:{height:`${r?90:re}vh`},"data-sync":t?"on":"off","data-control":je?"true":"false",tabIndex:0,onPointerEnter:A=>{ke(!0),A.currentTarget.focus({preventScroll:!0})},onPointerLeave:A=>{ke(!1),A.currentTarget.blur()},onMouseDown:A=>A.currentTarget.focus({preventScroll:!0}),onKeyDown:A=>{if(!je)return;let F=Tg(A);F&&(A.preventDefault(),A.stopPropagation(),xe({type:"input",keys:F}))},children:[(0,a.jsx)("div",{className:"nvim-screen-stage",style:o?void 0:{height:`${(r?90:re)/Math.max(i,.25)}vh`},children:(0,a.jsx)("div",{className:"nvim-screen-surface",children:(0,a.jsx)("div",{className:"nvim-screen-frame",children:(0,a.jsx)("div",{className:"nvim-screen-content",children:(0,a.jsx)("div",{className:"nvim-screen-grid",children:(0,a.jsx)("canvas",{ref:s,className:"nvim-screen",tabIndex:-1,"aria-label":je?"Interaktywny ekran Neovima":"Ekran Neovima",onMouseDown:A=>{if(!je||U.state!=="connected")return;A.preventDefault();let F=bn(A),B=A.button===1?"middle":A.button===2?"right":"left";xe({type:"mouse",button:B,action:"press",modifier:se(A),...F})},onMouseUp:A=>{if(!je||U.state!=="connected")return;A.preventDefault();let F=bn(A),B=A.button===1?"middle":A.button===2?"right":"left";xe({type:"mouse",button:B,action:"release",modifier:se(A),...F})},onWheel:A=>{if(!je||U.state!=="connected")return;A.preventDefault();let F=bn(A);xe({type:"mouse",button:"wheel",action:A.deltaY<0?"up":"down",modifier:se(A),...F})},onContextMenu:A=>je&&A.preventDefault()})})})})})}),!P&&(0,a.jsxs)("div",{className:"nvim-screen-empty",children:[(0,a.jsx)("strong",{children:wp[U.state]}),(0,a.jsx)("span",{children:U.message??"Oczekiwanie na ekran Neovima lub zapisany stan kroku."})]})]}),(0,a.jsx)("div",{className:"nvim-resize-handle",role:"separator","aria-label":"Zmie\u0144 wysoko\u015B\u0107 panelu Neovima","aria-orientation":"horizontal","aria-valuemin":25,"aria-valuemax":90,"aria-valuenow":Math.round(re),tabIndex:0,title:"Przeci\u0105gnij, aby zmieni\u0107 wysoko\u015B\u0107. Dwuklik: 75%.",onPointerDown:A=>{A.preventDefault(),h.current={y:A.clientY,heightVh:re},A.currentTarget.setPointerCapture(A.pointerId)},onPointerMove:A=>{let F=h.current;if(!F)return;let B=(A.clientY-F.y)/window.innerHeight*100;G(Math.max(25,Math.min(90,F.heightVh+B)))},onPointerUp:A=>{h.current=null,A.currentTarget.hasPointerCapture(A.pointerId)&&A.currentTarget.releasePointerCapture(A.pointerId)},onPointerCancel:()=>{h.current=null},onDoubleClick:()=>G(75),onKeyDown:A=>{if(A.key==="ArrowUp"||A.key==="ArrowDown"){A.preventDefault();let F=A.key==="ArrowUp"?-2:2;G(B=>Math.max(25,Math.min(90,B+F)))}else A.key==="Home"&&(A.preventDefault(),G(75))}})]})}function Rg({column:e,row:t}){return e==="chapter"||e==="task"||e==="version"?(0,a.jsx)("td",{children:(0,a.jsx)("code",{children:t[e]})}):e==="idea"?(0,a.jsx)("td",{dangerouslySetInnerHTML:{__html:t.idea_html}}):e==="status"?(0,a.jsx)("td",{children:(0,a.jsx)("span",{className:"scope-status","data-status":t.status,title:t.status,children:t.status_label})}):(0,a.jsx)("td",{children:t[e]})}function Og({front:e}){let t=e.scope_columns??["chapter","task","idea","priority"];return(0,a.jsxs)(ys,{header:e.header_html,left:e.left_margin_html,right:e.right_margin_html,className:"front-sheet",children:[(0,a.jsxs)("section",{className:"front-scope front-goal",children:[(0,a.jsx)("h2",{children:e.goal_title}),(0,a.jsx)(Yt,{html:e.goal_html})]}),(0,a.jsxs)("section",{className:"front-scope front-card-scope",children:[(0,a.jsx)("h2",{children:e.scope_title}),e.scope_html&&(0,a.jsx)(Yt,{html:e.scope_html}),(0,a.jsx)("div",{className:"scope-table-wrap",children:(0,a.jsxs)("table",{className:"scope-table scope-table--task",children:[(0,a.jsx)("thead",{children:(0,a.jsx)("tr",{children:e.scope_headers.map(n=>(0,a.jsx)("th",{children:n},n))})}),(0,a.jsx)("tbody",{children:e.scope_rows.map(n=>(0,a.jsx)("tr",{className:n.key?"scope-row--key":"",children:t.map(r=>(0,a.jsx)(Rg,{column:r,row:n},r))},`${n.chapter}-${n.task}`))})]})})]})]})}function $g({taskRef:e,step:t}){return(0,a.jsxs)("li",{id:`${e}-${t.id}`,children:[(0,a.jsx)("strong",{children:t.title}),(0,a.jsx)(Yt,{html:t.content_html})]})}function Ig({taskRef:e,block:t}){let n=t.kind==="exercise"?"\u0106wiczenie":"Block";return(0,a.jsxs)("section",{className:`task-block task-block--${t.kind}`,id:`${e}-${t.id}`,"data-stem-nav":"block",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("span",{children:n}),(0,a.jsx)("h4",{children:t.title})]}),(0,a.jsx)(Yt,{html:t.content_html}),t.steps.length>0&&(0,a.jsx)("ol",{className:"block-steps",children:t.steps.map(r=>(0,a.jsx)($g,{taskRef:e,step:r},r.id))})]})}function Fg({task:e}){return e.flow.length?(0,a.jsxs)("article",{className:"task-flow",id:e.ref,"data-stem-nav":"task",children:[(0,a.jsxs)("header",{className:"task-flow-header",children:[(0,a.jsx)("span",{children:e.ref.toUpperCase()}),(0,a.jsx)("h3",{children:e.title}),e.uuid&&(0,a.jsx)("code",{children:e.uuid})]}),e.flow.map(t=>(0,a.jsx)(Ig,{taskRef:e.ref,block:t},t.id)),(0,a.jsxs)("footer",{children:[(0,a.jsx)("strong",{children:"Task acceptance:"})," ",e.criterion]})]}):(0,a.jsxs)("article",{className:"task-legacy",id:e.ref,"data-stem-nav":"task",children:[(0,a.jsx)("strong",{children:e.ref.toUpperCase()}),(0,a.jsx)(Yt,{html:e.prompt_html??""}),(0,a.jsxs)("footer",{children:[(0,a.jsx)("strong",{children:"Task acceptance:"})," ",e.criterion]})]})}var fp={compile:"KOMPILACJA",bss:".BSS",stack:"STOS",registers:"REJESTRY",text:".TEXT"},gp=["#9bcfe2","#c4dfc0","#f4c889","#d2b6dc"];function Dg({config:e,title:t}){let n=e.arena_size??64,r=e.allocations??[5,7],o=e.symbols??[],i=`${e.storage_key??"allocator-memory-flow"}-stage`,[l,s]=(0,N.useState)(()=>Math.min(r.length,Number(localStorage.getItem(i)??0))),[u,d]=(0,N.useState)(o[0]?.id??"");(0,N.useEffect)(()=>localStorage.setItem(i,String(l)),[l,i]);let m=r.slice(0,l).reduce((_,p)=>_+p,0),y=o.find(_=>_.id===u)??o[0],g=Array.from({length:n},(_,p)=>p),f=_=>{let p=0;for(let c=0;co.some(p=>p.area===_));return(0,a.jsxs)("div",{className:"memory-react","aria-label":`Interaktywny diagram: ${t}`,children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"INTERAKTYWNY MODEL PAMI\u0118CI"}),(0,a.jsx)("h3",{children:t})]}),(0,a.jsxs)("div",{className:"memory-actions",children:[(0,a.jsx)("button",{"aria-pressed":l===0,onClick:()=>s(0),children:"definicje / reset"}),r.map((_,p)=>(0,a.jsxs)("button",{"aria-pressed":l===p+1,onClick:()=>s(p+1),children:["alloc(",_,")"]},`${_}-${p}`))]})]}),(0,a.jsx)("div",{className:"memory-lanes",children:b.map(_=>(0,a.jsxs)("section",{className:`memory-lane ${_}`,children:[(0,a.jsx)("b",{children:fp[_]}),o.filter(p=>p.area===_).map(p=>(0,a.jsx)("button",{className:u===p.id?"active":"",onClick:()=>d(p.id),children:(0,a.jsx)("code",{children:p.declaration})},p.id))]},_))}),(0,a.jsxs)("div",{className:"arena-wrap",children:[(0,a.jsxs)("div",{className:"arena-label",children:[(0,a.jsxs)("code",{children:["allocbuf[",n,"]"]}),(0,a.jsxs)("span",{children:["u\u017Cyte ",m," B / wolne ",n-m," B"]})]}),(0,a.jsxs)("div",{className:"arena",style:{"--allocp":m,"--arena-size":n},children:[g.map(_=>{let p=f(_);return(0,a.jsx)("i",{style:p>=0?{background:gp[p%gp.length]}:void 0},_)}),(0,a.jsxs)("span",{className:"allocp",children:["allocp \u2191 ",m]})]})]}),(0,a.jsxs)("p",{className:"memory-stage",children:[(0,a.jsxs)("strong",{children:[l+1,"/",r.length+1]})," ",(0,a.jsx)("code",{children:E})]}),y&&(0,a.jsxs)("aside",{className:"memory-inspector",children:[(0,a.jsx)("strong",{children:y.id}),(0,a.jsx)("code",{children:y.declaration}),(0,a.jsx)("span",{children:y.description})]})]})}function jg({config:e,asset:t,progress:n,onSetStatus:r}){let o=e.stages??[],i=`${e.storage_key??t.label}-uml-stage`,l=(0,N.useRef)(null),[s,u]=(0,N.useState)(""),[d,m]=(0,N.useState)(!1),[y,g]=(0,N.useState)(!1),[f,E]=(0,N.useState)(()=>Math.max(0,Math.min(o.length-1,Number(localStorage.getItem(i)??0))));(0,N.useEffect)(()=>localStorage.setItem(i,String(f)),[f,i]),(0,N.useEffect)(()=>{let c=!0;return m(!1),fetch(t.href,{cache:"no-store"}).then(h=>{if(!h.ok)throw new Error(`HTTP ${h.status}`);return h.text()}).then(h=>{let k=new DOMParser().parseFromString(h,"image/svg+xml"),C=k.documentElement;if(C.nodeName.toLowerCase()!=="svg"||k.querySelector("parsererror"))throw new Error("Niepoprawny SVG");k.querySelectorAll("script, foreignObject").forEach(P=>P.remove()),Np(C,t.tile),c&&u(C.outerHTML)}).catch(()=>{c&&m(!0)}),()=>{c=!1}},[t.href,t.tile]),(0,N.useEffect)(()=>{let c=l.current?.querySelector("svg");if(!c)return;c.setAttribute("role","img"),c.setAttribute("aria-label",t.alt),c.querySelectorAll("[data-uml-stage]").forEach(C=>{C.classList.remove("uml-stage-region","uml-stage-region-bg","uml-stage-region-outline","uml-stage-region-active","uml-stage-region-completed"),C.removeAttribute("data-uml-stage"),C.removeAttribute("data-uml-stage-label"),C.removeAttribute("role"),C.removeAttribute("tabindex"),C.removeAttribute("aria-label")});let h=Array.from(c.querySelectorAll("text")),k=Array.from(c.querySelectorAll("rect"));o.forEach((C,P)=>{if(!C.svg_label)return;let T=h.find(G=>(G.textContent??"").trim().startsWith(C.svg_label)),R=Number(T?.getAttribute("y"));if(!T||!Number.isFinite(R))return;let j=k.map(G=>{let U=Number(G.getAttribute("y")),Le=Number(G.getAttribute("height")),Ne=Number(G.getAttribute("width")),Q=G.getAttribute("style")??"",et=Number(Q.match(/stroke-width:\s*([\d.]+)/)?.[1]??G.getAttribute("stroke-width")??0);return{rect:G,y:U,height:Le,width:Ne,strokeWidth:et,area:Ne*Le}}).filter(({y:G,height:U,width:Le,strokeWidth:Ne})=>Number.isFinite(G)&&Number.isFinite(U)&&Number.isFinite(Le)&&Ne>=2&&G<=R&&G+U>=R).sort((G,U)=>G.area-U.area),I=j[0];if(!I)return;let ke=j.filter(({y:G,height:U,width:Le})=>Math.abs(G-I.y)<.1&&Math.abs(U-I.height)<.1&&Math.abs(Le-I.width)<.1),re=!!(C.progress_id&&n?.items?.[C.progress_id]?.status==="approved");ke.forEach(({rect:G},U)=>{let Le=G.getAttribute("fill")!=="none";G.dataset.umlStage=String(P),G.dataset.umlStageLabel=C.label,G.classList.add("uml-stage-region",Le?"uml-stage-region-bg":"uml-stage-region-outline"),G.classList.toggle("uml-stage-region-active",P===f),G.classList.toggle("uml-stage-region-completed",re),U===0&&(G.setAttribute("role","button"),G.setAttribute("tabindex","0"),G.setAttribute("aria-label",`Poka\u017C etap ${C.label}`))})})},[t.alt,n,f,o,s]);let b=(c,h)=>{let k=l.current?.querySelector("svg");if(!k)return;let C=Array.from(k.querySelectorAll(".uml-stage-region-bg[data-uml-stage]")).filter(T=>{let R=T.getBoundingClientRect();return c>=R.left&&c<=R.right&&h>=R.top&&h<=R.bottom}).sort((T,R)=>{let j=T.getBoundingClientRect(),I=R.getBoundingClientRect();return j.width*j.height-I.width*I.height})[0],P=Number(C?.dataset.umlStage);Number.isInteger(P)&&E(P)},_=c=>{if(c.key!=="Enter"&&c.key!==" ")return;let h=c.target,k=Number(h.dataset?.umlStage);Number.isInteger(k)&&(c.preventDefault(),E(k))},p=o[f];return(0,a.jsxs)("div",{className:"uml-react",children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"KANONICZNY DIAGRAM UML \xB7 PLANTUML"}),(0,a.jsx)("h3",{children:"Reset i dwa przydzia\u0142y liniowe"})]}),(0,a.jsx)("div",{className:"uml-actions",children:o.map((c,h)=>(0,a.jsxs)("button",{"aria-pressed":f===h,"data-completed":c.progress_id&&n?.items?.[c.progress_id]?.status==="approved"?"true":"false",onClick:()=>E(h),children:[c.progress_id&&n?.items?.[c.progress_id]?.status==="approved"&&(0,a.jsx)("span",{"aria-hidden":"true",children:"\u2713 "}),c.label]},c.id))})]}),(0,a.jsxs)("div",{ref:l,className:"uml-canvas",onClick:c=>b(c.clientX,c.clientY),onKeyDown:_,children:[s?(0,a.jsx)("div",{className:`uml-svg-host${t.tile?" is-tiled":""}`,style:hs(t.tile),dangerouslySetInnerHTML:{__html:s}}):(0,a.jsx)("img",{src:t.href,alt:t.alt}),d&&(0,a.jsx)("span",{className:"uml-inline-warning",children:"Widok statyczny \u2014 nie uda\u0142o si\u0119 wczyta\u0107 interaktywnego SVG."})]}),p&&(0,a.jsxs)("aside",{className:"uml-stage",children:[(0,a.jsx)("strong",{children:p.label}),(0,a.jsx)("span",{children:p.description}),p.code_ref&&(0,a.jsx)("code",{children:p.code_ref})]}),p?.progress_id&&(0,a.jsxs)("footer",{className:"uml-approval",children:[(0,a.jsx)("span",{children:n?.items?.[p.progress_id]?.status==="approved"?"Ten stan jest zatwierdzony i zapisany w JSON-ie zaj\u0119\u0107.":"Kursor wybiera stan; zatwierdzenie zapisuje go w JSON-ie zaj\u0119\u0107."}),(0,a.jsx)("button",{disabled:!n||y,onClick:async()=>{if(!p.progress_id||!n)return;let c=n.items?.[p.progress_id]?.status==="approved";g(!0);try{await r(p.progress_id,c?"pending":"approved")}finally{g(!1)}},children:y?"Zapisywanie\u2026":n?.items?.[p.progress_id]?.status==="approved"?"Cofnij zatwierdzenie":"Zatwierd\u017A stan"})]})]})}function Ug({config:e,asset:t,progress:n,onSetStatus:r,continuation:o}){let i=e.phases??[],l=i.flatMap(x=>x.steps.map(S=>({phase:x,step:S}))),s=`${e.storage_key??t.label}-uml-step`,u=`${e.storage_key??t.label}-navigation-level`,d=(0,N.useRef)(null),m=(0,N.useRef)(null),y=(0,N.useRef)(new Map),g=(0,N.useRef)(null),f=(0,N.useRef)(0),E=(0,N.useRef)(!1),b=(0,N.useRef)(null),_=(0,N.useRef)(!0),[p,c]=(0,N.useState)(""),[h,k]=(0,N.useState)(!1),[C,P]=(0,N.useState)(!1),[T,R]=(0,N.useState)(null),[j,I]=(0,N.useState)(null),[ke,re]=(0,N.useState)(!1),[G,U]=(0,N.useState)(""),[Le,Ne]=(0,N.useState)(!1),[Q,et]=(0,N.useState)(null),[Ge,je]=(0,N.useState)([]),[me,Dn]=(0,N.useState)(0),[xe,bn]=(0,N.useState)(()=>Math.max(0,Math.min(l.length-1,Number(localStorage.getItem(s)??0)))),[se,A]=(0,N.useState)(()=>{let x=localStorage.getItem(u);return x==="card"||x==="task"||x==="block"||x==="phase"||x==="step"||x==="snapshot"?x:"step"});(0,N.useEffect)(()=>localStorage.setItem(s,String(xe)),[xe,s]),(0,N.useEffect)(()=>localStorage.setItem(u,se),[se,u]),(0,N.useEffect)(()=>{let x=!0;return k(!1),fetch(t.href,{cache:"no-store"}).then(S=>{if(!S.ok)throw new Error(`HTTP ${S.status}`);return S.text()}).then(S=>{let M=new DOMParser().parseFromString(S,"image/svg+xml"),O=M.documentElement;if(O.nodeName.toLowerCase()!=="svg"||M.querySelector("parsererror"))throw new Error("Niepoprawny SVG");M.querySelectorAll("script, foreignObject").forEach(v=>v.remove()),Np(O,t.tile),x&&c(O.outerHTML)}).catch(()=>{x&&k(!0)}),()=>{x=!1}},[t.href,t.tile]),(0,N.useEffect)(()=>{let x=!0,S=fs(t,e);if(U("Wczytywanie uk\u0142adu\u2026"),Ne(!1),!t.source_href)return R(S),I(S),U("Brak \u017Ar\xF3d\u0142a PlantUML \u2014 zapis wy\u0142\u0105czony."),()=>{x=!1};let M=t.source_href.replace(/\.puml(?:\?.*)?$/,".layout.json");return fetch(`/api/uml-layout?source=${encodeURIComponent(t.source_href)}`,{cache:"no-store"}).then(async O=>{if(!O.ok)throw new Error(`HTTP ${O.status}`);return O.json()}).catch(async()=>{let O=await fetch(M,{cache:"no-store"});return O.ok?{layout:await O.json(),source_digest:"",stale:!1}:{layout:null,source_digest:"",stale:!1}}).then(O=>{if(!x)return;let v=O.layout??fs(t,e,O.source_digest??"");R(v),I(v),re(!1),Ne(!!O.stale),U(O.layout?"Uk\u0142ad wczytany z JSON.":"Uk\u0142ad PlantUML \u2014 brak r\u0119cznych zmian.")}).catch(O=>{x&&(R(S),I(S),U(`Nie wczytano uk\u0142adu: ${O instanceof Error?O.message:String(O)}`))}),()=>{x=!1}},[t.source_href,t.label,e.block?.id,e.task?.id]),(0,N.useEffect)(()=>{let x=m.current?.querySelector("svg");if(!x||!j)return;fg(x);let S=new Map(l.map(({step:L})=>[String(L.number).padStart(2,"0"),L.id])),M=gg(x,S),O=new Map(M.map(L=>[L.id,L]));y.current=O;let v=M.map(L=>L.id);je(L=>L.join("\0")===v.join("\0")?L:v),M.forEach(L=>{let H=j.elements[L.id];H&&hg(L,H)});let w=x.viewBox.baseVal;(j.canvas.width<=0||j.canvas.height<=0)&&I(L=>L&&{...L,canvas:{...L.canvas,width:w?.width||Number(x.getAttribute("width")?.replace("px",""))||0,height:w?.height||Number(x.getAttribute("height")?.replace("px",""))||0}})},[l,p,j]),(0,N.useEffect)(()=>{let x=m.current?.querySelector("svg");if(!x)return;let S=e.kind==="uml-class"&&x.contains(document.activeElement);x.setAttribute("role","img"),x.setAttribute("aria-label",t.alt),x.classList.toggle("uml-class-svg",e.kind==="uml-class"),x.classList.toggle("uml-class-svg-active",e.kind==="uml-class"&&se!=="card"),x.querySelectorAll(".uml-step-hit, .uml-class-focus-region").forEach(K=>K.remove()),x.querySelectorAll("[data-uml-step-element]").forEach(K=>{K.classList.remove("uml-step-element","uml-step-element-active","uml-step-element-completed","uml-step-element-tone-a","uml-step-element-tone-b"),K.removeAttribute("data-uml-step-element"),K.removeAttribute("data-uml-step-claim-area")});let M=Array.from(x.querySelectorAll("text")),O=Array.from(x.querySelectorAll("line")),v=Array.from(x.querySelectorAll("polygon"));if(e.kind==="uml-class"){let K=V=>V?mg(V):null,X=V=>{if(!V.length)return null;let oe=Math.min(...V.map(J=>J.x)),ct=Math.min(...V.map(J=>J.y)),Ue=Math.max(...V.map(J=>J.x+J.width)),ue=Math.max(...V.map(J=>J.y+J.height));return{x:oe,y:ct,width:Ue-oe,height:ue-ct}},D=Array.from(x.querySelectorAll("g > *")),Z=Array.from(x.querySelectorAll("[id]"));l.forEach(({step:V},oe)=>{let ct=V.svg_label??String(V.number).padStart(2,"0"),Ue=M.find(ge=>(ge.textContent??"").trim().startsWith(ct));if(!Ue)return;let ue=K(Ue);if(!ue)return;let J=Number(Ue.getAttribute("y")),Re=M.filter(ge=>Number.isFinite(J)&&Math.abs(Number(ge.getAttribute("y"))-J)<.8),Ve=V.svg_target?Z.find(ge=>ge.id===V.svg_target||ge.id.startsWith(`${V.svg_target}-`))??null:null,dt=K(Ve)??X(Re.map(ge=>K(ge)).filter(ge=>ge!==null))??ue,vr=Ve?.tagName.toLowerCase()==="rect",vs=Ve?[Ve,Ue]:Re;vr&&D.forEach(ge=>{let Xt=K(ge);if(!Xt||ge===Ve)return;let bs=Xt.x+Xt.width/2,ws=Xt.y+Xt.height/2;bs>=dt.x&&bs<=dt.x+dt.width&&ws>=dt.y&&ws<=dt.y+dt.height&&vs.push(ge)});let Ap=!!(V.progress_id&&n?.items?.[V.progress_id]?.status==="approved"),xs=Math.max(1,dt.width*dt.height);vs.forEach(ge=>{let Xt=Number(ge.dataset.umlStepClaimArea);Number.isFinite(Xt)&&Xt{let D=K.svg_label??String(K.number).padStart(2,"0"),Z=M.find(J=>(J.textContent??"").trim()===D),V=Number(Z?.getAttribute("y"));if(!Z||!Number.isFinite(V))return;let oe=V+5,ct=!!(K.progress_id&&n?.items?.[K.progress_id]?.status==="approved"),Ue=M.filter(J=>Math.abs(Number(J.getAttribute("y"))-V)<.8);Ue.push(...O.filter(J=>{let Re=Number(J.getAttribute("y1")),Ve=Number(J.getAttribute("y2"));return Number.isFinite(Re)&&Number.isFinite(Ve)&&Math.abs(Re-Ve)<.8&&Math.abs((Re+Ve)/2-oe)<=14})),Ue.push(...v.filter(J=>{let Re=(J.getAttribute("points")??"").trim().split(/\s+/).map(vr=>Number(vr.split(",")[1])).filter(Number.isFinite);if(!Re.length)return!1;let Ve=Math.min(...Re),dt=Math.max(...Re);return dt-Ve<=16&&Math.abs((Ve+dt)/2-oe)<=14})),Ue.forEach(J=>{J.dataset.umlStepElement=String(X),J.classList.add("uml-step-element"),J.classList.toggle("uml-step-element-active",X===xe),J.classList.toggle("uml-step-element-completed",ct)});let ue=document.createElementNS("http://www.w3.org/2000/svg","rect");ue.setAttribute("x",String(L)),ue.setAttribute("y",String(V-12)),ue.setAttribute("width",String(H)),ue.setAttribute("height","31"),ue.setAttribute("fill","transparent"),ue.setAttribute("pointer-events","all"),ue.setAttribute("role","button"),ue.setAttribute("tabindex","0"),ue.setAttribute("aria-label",`Poka\u017C krok ${String(K.number).padStart(2,"0")}: ${K.label}`),ue.dataset.umlStep=String(X),ue.classList.add("uml-step-hit"),ue.classList.toggle("uml-step-hit-active",se!=="card"&&X===xe),ue.classList.toggle("uml-step-hit-completed",ct),x.appendChild(ue)})},[t.alt,e.kind,l,se,n,xe,p,j]),(0,N.useEffect)(()=>{let x=m.current?.querySelector("svg");if(x&&(x.querySelectorAll(".uml-layout-hit,.uml-layout-resize").forEach(S=>S.remove()),x.classList.toggle("uml-layout-editing",C),!(!C||!j)))for(let S of y.current.values()){let M=j.elements[S.id]??po(S),O=document.createElementNS("http://www.w3.org/2000/svg","rect");O.setAttribute("x",String(M.x)),O.setAttribute("y",String(M.y)),O.setAttribute("width",String(Math.max(12,M.width))),O.setAttribute("height",String(Math.max(12,M.height))),O.setAttribute("tabindex","0"),O.setAttribute("role","button"),O.setAttribute("aria-label",`Edytuj element UML ${S.id}`),O.dataset.umlLayoutId=S.id,O.dataset.umlLayoutAction="move",O.classList.add("uml-layout-hit"),S.id===Q&&O.classList.add("is-selected");let v=document.createElementNS("http://www.w3.org/2000/svg","title");if(v.textContent=`${S.id} \xB7 przeci\u0105gnij, aby zmieni\u0107 po\u0142o\u017Cenie`,O.appendChild(v),x.appendChild(O),S.id===Q){let w=Math.max(8,Math.min(14,Math.min(M.width,M.height)*.1)),L=document.createElementNS("http://www.w3.org/2000/svg","rect");L.setAttribute("x",String(M.x+M.width-w/2)),L.setAttribute("y",String(M.y+M.height-w/2)),L.setAttribute("width",String(w)),L.setAttribute("height",String(w)),L.dataset.umlLayoutId=S.id,L.dataset.umlLayoutAction="resize",L.classList.add("uml-layout-resize"),x.appendChild(L)}}},[p,C,j,Q,Ge]),(0,N.useEffect)(()=>{C&&(!Q||!y.current.has(Q))&&et(Ge[0]??null)},[C,Ge,Q]),(0,N.useEffect)(()=>{if(me===0||f.current===me)return;let x=!1,S=0,M=v=>{if(x)return;let w=m.current?.querySelector(`.uml-step-hit[data-uml-step="${xe}"]`);if(!w)return;if(document.querySelector(".viewer-chrome")?.classList.contains("is-nvim-fit")){f.current=me;return}let H=Sp(w);if(!H){f.current=me;return}let K=sg(w);if(!K){let Z=dg(w,H),V=Z===0?up(w,H):0,oe=Z===0?sp(w,V):Z;if(vFn){S=window.requestAnimationFrame(()=>M(v+1));return}f.current=me;return}let X=up(w,K);if(Math.abs(X)<=Fn){f.current=me;return}let D=sp(w,X);if(vFn){S=window.requestAnimationFrame(()=>M(v+1));return}f.current=me},O=window.requestAnimationFrame(()=>M(0));return()=>{x=!0,window.cancelAnimationFrame(O),window.cancelAnimationFrame(S)}},[me,xe,p]);let F=(x,S,M=se,O=!0)=>{let v={task:e.task??null,block:e.block??null,phase:{id:x.phase.id,label:x.phase.label},step:x.step,focusLevel:M,activate:S&&document.documentElement.dataset.nvimSyncMode==="on"},w=()=>{window.dispatchEvent(new CustomEvent("stem:nvim-step",{detail:v}))};if(!O){w();return}let L=fetch("/api/navigation/current",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({task:v.task,block:v.block,phase:v.phase,step:{id:v.step.id,number:v.step.number,label:v.step.label,mode:v.step.mode??(v.step.snapshot_ref?"RUN":"CODE"),code_ref:v.step.code_ref??null,event_id:v.step.event_id??null,strategy_ref:v.step.strategy_ref??null},snapshot_ref:v.step.snapshot_ref??null,focus_level:v.focusLevel,sync_requested:!!v.activate,actor:document.documentElement.dataset.cardClientId??"browser"})});v.activate?L.then(w,w):(w(),L.catch(()=>{}))},B=(x,S=!1,M=se,O=!0)=>{let v=Math.max(0,Math.min(l.length-1,x)),w=l[v];if(w){if(A(M),v===xe){F(w,S,M,O);return}Dn(L=>L+1),E.current=S,b.current=M,_.current=O,bn(v)}},te=(x,S)=>{let M=m.current?.querySelector("svg"),O=M?.getScreenCTM();if(!M||!O)return null;let v=M.createSVGPoint();return v.x=x,v.y=S,v.matrixTransform(O.inverse())},at=x=>{if(!C||!j)return;let S=x.target?.closest(".uml-layout-hit[data-uml-layout-id],.uml-layout-resize[data-uml-layout-id]"),M=S?.dataset.umlLayoutId,O=M?y.current.get(M):null,v=te(x.clientX,x.clientY);if(!M||!O||!v)return;x.preventDefault(),x.stopPropagation();let w=j.elements[M]??po(O);g.current={id:M,action:S?.dataset.umlLayoutAction==="resize"?"resize":"move",pointerId:x.pointerId,startX:v.x,startY:v.y,initial:w},et(M),I(L=>L&&{...L,elements:{...L.elements,[M]:w}}),x.currentTarget.setPointerCapture(x.pointerId)},zt=x=>{let S=g.current;if(!S||S.pointerId!==x.pointerId)return;let M=te(x.clientX,x.clientY);if(!M)return;x.preventDefault();let O=M.x-S.startX,v=M.y-S.startY,w=S.action==="resize"?{...S.initial,width:Math.max(24,S.initial.width+O),height:Math.max(18,S.initial.height+v)}:{...S.initial,x:S.initial.x+O,y:S.initial.y+v};I(L=>L&&{...L,elements:{...L.elements,[S.id]:w}}),re(!0)},Ee=x=>{let S=g.current;!S||S.pointerId!==x.pointerId||(g.current=null,x.currentTarget.hasPointerCapture(x.pointerId)&&x.currentTarget.releasePointerCapture(x.pointerId))},ne=(x,S)=>{let M=y.current.get(x);M&&(I(O=>{if(!O)return O;let v=O.elements[x]??po(M);return{...O,elements:{...O.elements,[x]:S(v)}}}),re(!0))},st=async()=>{if(!j||!t.source_href)return;let x=Object.fromEntries(Array.from(y.current.values()).map(M=>[M.id,j.elements[M.id]??po(M)])),S={...j,elements:x};U("Zapisywanie uk\u0142adu\u2026");try{let M=await fetch("/api/uml-layout",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({source:t.source_href,layout:S,actor:document.documentElement.dataset.cardClientId??"browser"})});if(!M.ok)throw new Error((await M.json().catch(()=>null))?.message??`HTTP ${M.status}`);let O=await M.json();R(O.layout),I(O.layout),re(!1),Ne(!1),U(`Zapisano ${Object.keys(O.layout.elements).length} element\xF3w w JSON.`)}catch(M){U(`B\u0142\u0105d zapisu: ${M instanceof Error?M.message:String(M)}`)}},Ye=()=>{T&&(I(T),re(!1),U("Przywr\xF3cono ostatnio zapisany uk\u0142ad."))},wn=async()=>{if(!(!t.source_href||!window.confirm("Usun\u0105\u0107 r\u0119czny uk\u0142ad i wr\xF3ci\u0107 do geometrii PlantUML?"))){U("Resetowanie uk\u0142adu\u2026");try{let x=await fetch(`/api/uml-layout?source=${encodeURIComponent(t.source_href)}&actor=${encodeURIComponent(document.documentElement.dataset.cardClientId??"browser")}`,{method:"DELETE"});if(!x.ok)throw new Error(`HTTP ${x.status}`);let S=fs(t,e,T?.source_digest??"");R(S),I(S),re(!1),et(null),U("Przywr\xF3cono automatyczny uk\u0142ad PlantUML.")}catch(x){U(`B\u0142\u0105d resetu: ${x instanceof Error?x.message:String(x)}`)}}},ie=(x,S)=>{if(C)return;let M=Array.from(m.current?.querySelectorAll(".uml-step-hit[data-uml-step]")??[]).filter(v=>{let w=v.getBoundingClientRect();return x>=w.left&&x<=w.right&&S>=w.top&&S<=w.bottom}).sort((v,w)=>{let L=v.getBoundingClientRect(),H=w.getBoundingClientRect();return Math.abs(S-(L.top+L.bottom)/2)-Math.abs(S-(H.top+H.bottom)/2)}),O=Number(M[0]?.dataset.umlStep);Number.isInteger(O)&&B(O,!1,"step")},q=x=>{if(C||x.key!=="Enter"&&x.key!==" ")return;let S=x.target,M=Number(S.dataset?.umlStep);Number.isInteger(M)&&(x.preventDefault(),B(M,x.key==="Enter","step"))},bt=x=>{let S=l.findIndex(M=>M.phase.id===x.id);S>=0&&B(S,!1,"phase")},fe=l[xe];if((0,N.useEffect)(()=>{fe&&(F(fe,E.current,b.current??se,_.current),E.current=!1,b.current=null,_.current=!0)},[fe?.phase.id,fe?.step.id,e.block]),(0,N.useEffect)(()=>{let x=S=>{let M=S.detail;if(!M||e.task?.id&&M.task.id!==e.task.id||e.block?.id&&M.block.id!==e.block.id)return;let O=l.findIndex(v=>v.phase.id===M.phase.id&&v.step.id===M.step.id);if(O<0){A("card");return}B(O,!1,M.focus_level,!1)};return window.addEventListener("stem:navigation-command",x),()=>window.removeEventListener("stem:navigation-command",x)},[e.block?.id,e.task?.id,l,se,xe]),(0,N.useEffect)(()=>{let x=S=>{if(S.metaKey||C||S.target?.closest("input, textarea, select, [contenteditable='true']"))return;let O=d.current;if(!O)return;let v=Array.from(document.querySelectorAll("[data-stem-nav='uml-block']")),w=window.innerHeight/2;if(v.sort((D,Z)=>{let V=D.getBoundingClientRect(),oe=Z.getBoundingClientRect();return Math.abs((V.top+V.bottom)/2-w)-Math.abs((oe.top+oe.bottom)/2-w)})[0]!==O)return;if(S.key==="Enter"&&S.ctrlKey&&!S.altKey&&!S.shiftKey){if(!fe?.step.progress_id||!n)return;S.preventDefault(),S.stopPropagation();let D=n.items?.[fe.step.progress_id]?.status==="approved";r(fe.step.progress_id,D?"pending":"approved");return}if(S.key==="Enter"&&!S.altKey&&!S.shiftKey){if(!fe)return;S.preventDefault(),S.stopPropagation(),F(fe,!0,se);return}let H=["card","task","block","phase","step","snapshot"];if((S.key==="ArrowLeft"||S.key==="ArrowRight"||S.key==="Escape")&&!S.altKey&&!S.ctrlKey&&!S.shiftKey){let D=S.key==="ArrowRight"?1:-1,Z=H[Math.max(0,Math.min(H.length-1,H.indexOf(se)+D))];S.preventDefault(),S.stopPropagation(),A(Z),fe&&F(fe,!1,Z);return}if(S.key!=="ArrowUp"&&S.key!=="ArrowDown"||se==="card"&&!S.altKey&&!S.ctrlKey&&!S.shiftKey)return;let K=S.key==="ArrowUp"?-1:1,X=se;if(S.altKey&&S.shiftKey&&!S.ctrlKey)X="snapshot";else if(S.ctrlKey&&S.shiftKey&&!S.altKey)X="step";else if(S.altKey&&!S.ctrlKey&&!S.shiftKey)X="task";else if(S.ctrlKey&&!S.altKey&&!S.shiftKey)X="block";else if(S.shiftKey&&!S.altKey&&!S.ctrlKey)X="phase";else if(S.altKey||S.ctrlKey||S.shiftKey)return;S.preventDefault(),S.stopPropagation(),fetch("/api/navigation/move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({level:X,delta:K,sync_requested:!1,actor:document.documentElement.dataset.cardClientId??"browser"})}).then(D=>D.ok?D.json():Promise.reject(new Error(`HTTP ${D.status}`))).then(D=>{D.current&&window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:D.current}))}).catch(()=>{})};return window.addEventListener("keydown",x),()=>window.removeEventListener("keydown",x)},[fe,l,se,r,n,C]),!fe)return null;let{phase:Qt,step:jn}=fe,qt=l.filter(x=>x.phase.id===Qt.id),ho=e.block?.label.match(/^A[1-8]\b/)?.[0]??"UML",yo=(e.title??e.block?.label??t.caption).replace(/^A[1-8]\s*[·—:-]\s*/i,""),Un=Q?y.current.get(Q)??null:null,ut=Un?j?.elements[Un.id]??po(Un):null;return(0,a.jsxs)("div",{ref:d,className:"uml-react uml-snapshot-react","data-stem-nav":"uml-block","data-task-id":e.task?.id,"data-block-id":e.block?.id,"data-navigation-level":se,children:[(0,a.jsxs)("header",{className:"uml-snapshot-header",children:[(0,a.jsxs)("div",{className:"uml-header-first-line",children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)("span",{children:ho})," \u2014 ",yo,t.tile&&(0,a.jsxs)("small",{className:"uml-tile-part",children:["cz\u0119\u015B\u0107 ",t.tile.index,"/",t.tile.count," \xB7 r",t.tile.row," c",t.tile.column]})]}),(0,a.jsxs)("div",{className:"uml-header-navigation",children:[(0,a.jsx)(_p,{continuation:o}),t.source_href&&(0,a.jsx)("button",{className:`uml-edit-toggle${C?" is-active":""}`,"aria-pressed":C,title:"R\u0119czna edycja po\u0142o\u017Cenia i parametr\xF3w blok\xF3w UML",onClick:()=>P(x=>!x),children:C?"ZAMKNIJ EDIT":"EDIT"}),(0,a.jsx)("div",{className:"uml-phase-actions","aria-label":"Fazy diagramu",children:i.map(x=>(0,a.jsx)("button",{"aria-pressed":Qt.id===x.id,onClick:()=>bt(x),children:x.label},x.id))}),(0,a.jsx)("div",{className:"uml-step-actions","aria-label":`Checkpointy fazy ${Qt.label}`,children:qt.map(x=>{let S=l.indexOf(x),M=!!(x.step.progress_id&&n?.items?.[x.step.progress_id]?.status==="approved");return(0,a.jsx)("button",{"aria-label":`Krok ${x.step.number}: ${x.step.label}`,"aria-pressed":se!=="card"&&S===xe,"data-completed":M?"true":"false","data-mode":x.step.mode??"RUN",title:`${x.step.mode??"RUN"} \xB7 ${x.step.label}`,onClick:()=>B(S),children:String(x.step.number).padStart(2,"0")},x.step.id)})})]})]}),e.block?.description&&(0,a.jsx)("p",{className:"uml-header-description",children:e.block.description})]}),(0,a.jsxs)("div",{className:"uml-snapshot-layout",children:[(0,a.jsxs)("div",{ref:m,className:`uml-canvas uml-step-canvas${C?" is-layout-editing":""}`,onClick:x=>ie(x.clientX,x.clientY),onKeyDown:q,onPointerDown:at,onPointerMove:zt,onPointerUp:Ee,onPointerCancel:Ee,children:[p?(0,a.jsx)("div",{className:`uml-svg-host${t.tile?" is-tiled":""}`,style:hs(t.tile),dangerouslySetInnerHTML:{__html:p}}):(0,a.jsx)("img",{src:t.href,alt:t.alt}),h&&(0,a.jsx)("span",{className:"uml-inline-warning",children:"Widok statyczny \u2014 wybierz krok przyciskiem nad diagramem."})]}),C&&j&&(0,a.jsxs)("aside",{className:"uml-layout-editor","aria-label":"Edytor uk\u0142adu UML",children:[(0,a.jsxs)("div",{className:"uml-layout-editor-title",children:[(0,a.jsx)("strong",{children:"UML layout"}),(0,a.jsx)("span",{children:ke?"niezapisane zmiany":"zapisany"}),Le&&(0,a.jsx)("b",{children:"\u0179r\xF3d\u0142o PlantUML zmieni\u0142o si\u0119"})]}),(0,a.jsxs)("label",{children:["Element",(0,a.jsx)("select",{value:Q??"",onChange:x=>et(x.target.value||null),children:Ge.map(x=>(0,a.jsx)("option",{value:x,children:x},x))})]}),Q&&ut&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"uml-layout-number-grid",children:["x","y","width","height"].map(x=>(0,a.jsxs)("label",{children:[x,(0,a.jsx)("input",{type:"number",step:"1",min:x==="width"||x==="height"?12:void 0,value:Math.round(ut[x]*100)/100,onChange:S=>ne(Q,M=>({...M,[x]:Number(S.target.value)}))})]},x))}),(0,a.jsxs)("label",{className:"uml-layout-editor-text",children:["Tekst bloku \u2014 jeden wiersz SVG na lini\u0119",(0,a.jsx)("textarea",{rows:Math.max(3,Math.min(10,ut.text?.lines?.length??3)),value:(ut.text?.lines??[]).join(` -`),onChange:x=>ne(Q,S=>({...S,text:{...S.text,title:x.target.value.split(` -`)[0]??"",description:x.target.value.split(` +`+i.stack}return{value:e,source:t,stack:o,digest:null}}function Ll(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function ca(e,t){try{console.error(t.value)}catch(n){setTimeout(function(){throw n})}}var If=typeof WeakMap=="function"?WeakMap:Map;function Ed(e,t,n){n=Kt(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){_i||(_i=!0,xa=r),ca(e,t)},n}function _d(e,t,n){n=Kt(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){ca(e,t)}}var i=e.stateNode;return i!==null&&typeof i.componentDidCatch=="function"&&(n.callback=function(){ca(e,t),typeof r!="function"&&(fn===null?fn=new Set([this]):fn.add(this));var l=t.stack;this.componentDidCatch(t.value,{componentStack:l!==null?l:""})}),n}function $u(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new If;var o=new Set;r.set(t,o)}else o=r.get(t),o===void 0&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Qf.bind(null,e,t,n),t.then(e,e))}function Fu(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Du(e,t,n,r,o){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=Kt(-1,1),t.tag=2,mn(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=o,e)}var Of=qt.ReactCurrentOwner,Xe=!1;function Ge(e,t,n,r){t.child=e===null?td(t,null,n,r):dr(t,e.child,n,r)}function ju(e,t,n,r,o){n=n.render;var i=t.ref;return lr(t,o),r=Za(e,t,n,r,i,o),n=Ja(),e!==null&&!Xe?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Qt(e,t,o)):(fe&&n&&ja(t),t.flags|=1,Ge(e,t,r,o),t.child)}function Uu(e,t,n,r,o){if(e===null){var i=n.type;return typeof i=="function"&&!us(i)&&i.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=i,Cd(e,t,i,r,o)):(e=ii(n.type,null,r,t,t.mode,o),e.ref=t.ref,e.return=t,t.child=e)}if(i=e.child,(e.lanes&o)===0){var l=i.memoizedProps;if(n=n.compare,n=n!==null?n:Zr,n(l,r)&&e.ref===t.ref)return Qt(e,t,o)}return t.flags|=1,e=hn(i,r),e.ref=t.ref,e.return=t,t.child=e}function Cd(e,t,n,r,o){if(e!==null){var i=e.memoizedProps;if(Zr(i,r)&&e.ref===t.ref)if(Xe=!1,t.pendingProps=r=i,(e.lanes&o)!==0)(e.flags&131072)!==0&&(Xe=!0);else return t.lanes=e.lanes,Qt(e,t,o)}return da(e,t,n,r,o)}function Ld(e,t,n){var r=t.pendingProps,o=r.children,i=e!==null?e.memoizedState:null;if(r.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},le(tr,tt),tt|=n;else{if((n&1073741824)===0)return e=i!==null?i.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,le(tr,tt),tt|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=i!==null?i.baseLanes:n,le(tr,tt),tt|=r}else i!==null?(r=i.baseLanes|n,t.memoizedState=null):r=n,le(tr,tt),tt|=r;return Ge(e,t,o,n),t.child}function zd(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function da(e,t,n,r,o){var i=Je(n)?Pn:Be.current;return i=ur(t,i),lr(t,o),n=Za(e,t,n,r,i,o),r=Ja(),e!==null&&!Xe?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Qt(e,t,o)):(fe&&r&&ja(t),t.flags|=1,Ge(e,t,n,o),t.child)}function Vu(e,t,n,r,o){if(Je(n)){var i=!0;hi(t)}else i=!1;if(lr(t,o),t.stateNode===null)ni(e,t),Nd(t,n,r),ua(t,n,r,o),r=!0;else if(e===null){var l=t.stateNode,s=t.memoizedProps;l.props=s;var u=l.context,d=n.contextType;typeof d=="object"&&d!==null?d=yt(d):(d=Je(n)?Pn:Be.current,d=ur(t,d));var m=n.getDerivedStateFromProps,y=typeof m=="function"||typeof l.getSnapshotBeforeUpdate=="function";y||typeof l.UNSAFE_componentWillReceiveProps!="function"&&typeof l.componentWillReceiveProps!="function"||(s!==r||u!==d)&&Ou(t,l,r,d),rn=!1;var g=t.memoizedState;l.state=g,wi(t,r,l,o),u=t.memoizedState,s!==r||g!==u||Ze.current||rn?(typeof m=="function"&&(sa(t,n,m,r),u=t.memoizedState),(s=rn||Iu(t,n,s,r,g,u,d))?(y||typeof l.UNSAFE_componentWillMount!="function"&&typeof l.componentWillMount!="function"||(typeof l.componentWillMount=="function"&&l.componentWillMount(),typeof l.UNSAFE_componentWillMount=="function"&&l.UNSAFE_componentWillMount()),typeof l.componentDidMount=="function"&&(t.flags|=4194308)):(typeof l.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=u),l.props=r,l.state=u,l.context=d,r=s):(typeof l.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{l=t.stateNode,rd(e,t),s=t.memoizedProps,d=t.type===t.elementType?s:_t(t.type,s),l.props=d,y=t.pendingProps,g=l.context,u=n.contextType,typeof u=="object"&&u!==null?u=yt(u):(u=Je(n)?Pn:Be.current,u=ur(t,u));var f=n.getDerivedStateFromProps;(m=typeof f=="function"||typeof l.getSnapshotBeforeUpdate=="function")||typeof l.UNSAFE_componentWillReceiveProps!="function"&&typeof l.componentWillReceiveProps!="function"||(s!==y||g!==u)&&Ou(t,l,r,u),rn=!1,g=t.memoizedState,l.state=g,wi(t,r,l,o);var S=t.memoizedState;s!==y||g!==S||Ze.current||rn?(typeof f=="function"&&(sa(t,n,f,r),S=t.memoizedState),(d=rn||Iu(t,n,d,r,g,S,u)||!1)?(m||typeof l.UNSAFE_componentWillUpdate!="function"&&typeof l.componentWillUpdate!="function"||(typeof l.componentWillUpdate=="function"&&l.componentWillUpdate(r,S,u),typeof l.UNSAFE_componentWillUpdate=="function"&&l.UNSAFE_componentWillUpdate(r,S,u)),typeof l.componentDidUpdate=="function"&&(t.flags|=4),typeof l.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof l.componentDidUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=4),typeof l.getSnapshotBeforeUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=S),l.props=r,l.state=S,l.context=u,r=d):(typeof l.componentDidUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=4),typeof l.getSnapshotBeforeUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=1024),r=!1)}return pa(e,t,n,r,i,o)}function pa(e,t,n,r,o,i){zd(e,t);var l=(t.flags&128)!==0;if(!r&&!l)return o&&Cu(t,n,!1),Qt(e,t,i);r=t.stateNode,Of.current=t;var s=l&&typeof n.getDerivedStateFromError!="function"?null:r.render();return t.flags|=1,e!==null&&l?(t.child=dr(t,e.child,null,i),t.child=dr(t,null,s,i)):Ge(e,t,s,i),t.memoizedState=r.state,o&&Cu(t,n,!0),t.child}function Ad(e){var t=e.stateNode;t.pendingContext?_u(e,t.pendingContext,t.pendingContext!==t.context):t.context&&_u(e,t.context,!1),Ya(e,t.containerInfo)}function Bu(e,t,n,r,o){return cr(),Va(o),t.flags|=256,Ge(e,t,n,r),t.child}var ma={dehydrated:null,treeContext:null,retryLane:0};function fa(e){return{baseLanes:e,cachePool:null,transitions:null}}function Pd(e,t,n){var r=t.pendingProps,o=ve.current,i=!1,l=(t.flags&128)!==0,s;if((s=l)||(s=e!==null&&e.memoizedState===null?!1:(o&2)!==0),s?(i=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(o|=1),le(ve,o&1),e===null)return la(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(l=r.children,e=r.fallback,i?(r=t.mode,i=t.child,l={mode:"hidden",children:l},(r&1)===0&&i!==null?(i.childLanes=0,i.pendingProps=l):i=ji(l,r,0,null),e=An(e,r,n,null),i.return=t,e.return=t,i.sibling=e,t.child=i,t.child.memoizedState=fa(n),t.memoizedState=ma,e):ns(t,l));if(o=e.memoizedState,o!==null&&(s=o.dehydrated,s!==null))return $f(e,t,l,r,s,o,n);if(i){i=r.fallback,l=t.mode,o=e.child,s=o.sibling;var u={mode:"hidden",children:r.children};return(l&1)===0&&t.child!==o?(r=t.child,r.childLanes=0,r.pendingProps=u,t.deletions=null):(r=hn(o,u),r.subtreeFlags=o.subtreeFlags&14680064),s!==null?i=hn(s,i):(i=An(i,l,n,null),i.flags|=2),i.return=t,r.return=t,r.sibling=i,t.child=r,r=i,i=t.child,l=e.child.memoizedState,l=l===null?fa(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},i.memoizedState=l,i.childLanes=e.childLanes&~n,t.memoizedState=ma,r}return i=e.child,e=i.sibling,r=hn(i,{mode:"visible",children:r.children}),(t.mode&1)===0&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function ns(e,t){return t=ji({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Go(e,t,n,r){return r!==null&&Va(r),dr(t,e.child,null,n),e=ns(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function $f(e,t,n,r,o,i,l){if(n)return t.flags&256?(t.flags&=-257,r=Ll(Error(L(422))),Go(e,t,l,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=ji({mode:"visible",children:r.children},o,0,null),i=An(i,o,l,null),i.flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,(t.mode&1)!==0&&dr(t,e.child,null,l),t.child.memoizedState=fa(l),t.memoizedState=ma,i);if((t.mode&1)===0)return Go(e,t,l,null);if(o.data==="$!"){if(r=o.nextSibling&&o.nextSibling.dataset,r)var s=r.dgst;return r=s,i=Error(L(419)),r=Ll(i,r,void 0),Go(e,t,l,r)}if(s=(l&e.childLanes)!==0,Xe||s){if(r=Te,r!==null){switch(l&-l){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}o=(o&(r.suspendedLanes|l))!==0?0:o,o!==0&&o!==i.retryLane&&(i.retryLane=o,Yt(e,o),At(r,e,o,-1))}return ss(),r=Ll(Error(L(421))),Go(e,t,l,r)}return o.data==="$?"?(t.flags|=128,t.child=e.child,t=qf.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,nt=pn(o.nextSibling),rt=t,fe=!0,Lt=null,e!==null&&(mt[ft++]=Bt,mt[ft++]=Ht,mt[ft++]=Tn,Bt=e.id,Ht=e.overflow,Tn=t),t=ns(t,r.children),t.flags|=4096,t)}function Hu(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),aa(e.return,t,n)}function zl(e,t,n,r,o){var i=e.memoizedState;i===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=o)}function Td(e,t,n){var r=t.pendingProps,o=r.revealOrder,i=r.tail;if(Ge(e,t,r.children,n),r=ve.current,(r&2)!==0)r=r&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Hu(e,n,t);else if(e.tag===19)Hu(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(le(ve,r),(t.mode&1)===0)t.memoizedState=null;else switch(o){case"forwards":for(n=t.child,o=null;n!==null;)e=n.alternate,e!==null&&ki(e)===null&&(o=n),n=n.sibling;n=o,n===null?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),zl(t,!1,o,n,i);break;case"backwards":for(n=null,o=t.child,t.child=null;o!==null;){if(e=o.alternate,e!==null&&ki(e)===null){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}zl(t,!0,n,null,i);break;case"together":zl(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function ni(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Qt(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),Mn|=t.lanes,(n&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(L(153));if(t.child!==null){for(e=t.child,n=hn(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=hn(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function Ff(e,t,n){switch(t.tag){case 3:Ad(t),cr();break;case 5:od(t);break;case 1:Je(t.type)&&hi(t);break;case 4:Ya(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;le(bi,r._currentValue),r._currentValue=o;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(le(ve,ve.current&1),t.flags|=128,null):(n&t.child.childLanes)!==0?Pd(e,t,n):(le(ve,ve.current&1),e=Qt(e,t,n),e!==null?e.sibling:null);le(ve,ve.current&1);break;case 19:if(r=(n&t.childLanes)!==0,(e.flags&128)!==0){if(r)return Td(e,t,n);t.flags|=128}if(o=t.memoizedState,o!==null&&(o.rendering=null,o.tail=null,o.lastEffect=null),le(ve,ve.current),r)break;return null;case 22:case 23:return t.lanes=0,Ld(e,t,n)}return Qt(e,t,n)}var Rd,ga,Md,Id;Rd=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}};ga=function(){};Md=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Ln($t.current);var i=null;switch(n){case"input":o=$l(e,o),r=$l(e,r),i=[];break;case"select":o=xe({},o,{value:void 0}),r=xe({},r,{value:void 0}),i=[];break;case"textarea":o=jl(e,o),r=jl(e,r),i=[];break;default:typeof o.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=fi)}Vl(n,r);var l;n=null;for(d in o)if(!r.hasOwnProperty(d)&&o.hasOwnProperty(d)&&o[d]!=null)if(d==="style"){var s=o[d];for(l in s)s.hasOwnProperty(l)&&(n||(n={}),n[l]="")}else d!=="dangerouslySetInnerHTML"&&d!=="children"&&d!=="suppressContentEditableWarning"&&d!=="suppressHydrationWarning"&&d!=="autoFocus"&&(Kr.hasOwnProperty(d)?i||(i=[]):(i=i||[]).push(d,null));for(d in r){var u=r[d];if(s=o?.[d],r.hasOwnProperty(d)&&u!==s&&(u!=null||s!=null))if(d==="style")if(s){for(l in s)!s.hasOwnProperty(l)||u&&u.hasOwnProperty(l)||(n||(n={}),n[l]="");for(l in u)u.hasOwnProperty(l)&&s[l]!==u[l]&&(n||(n={}),n[l]=u[l])}else n||(i||(i=[]),i.push(d,n)),n=u;else d==="dangerouslySetInnerHTML"?(u=u?u.__html:void 0,s=s?s.__html:void 0,u!=null&&s!==u&&(i=i||[]).push(d,u)):d==="children"?typeof u!="string"&&typeof u!="number"||(i=i||[]).push(d,""+u):d!=="suppressContentEditableWarning"&&d!=="suppressHydrationWarning"&&(Kr.hasOwnProperty(d)?(u!=null&&d==="onScroll"&&de("scroll",e),i||s===u||(i=[])):(i=i||[]).push(d,u))}n&&(i=i||[]).push("style",n);var d=i;(t.updateQueue=d)&&(t.flags|=4)}};Id=function(e,t,n,r){n!==r&&(t.flags|=4)};function zr(e,t){if(!fe)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Ue(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;o!==null;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags&14680064,r|=o.flags&14680064,o.return=e,o=o.sibling;else for(o=e.child;o!==null;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Df(e,t,n){var r=t.pendingProps;switch(Ua(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ue(t),null;case 1:return Je(t.type)&&gi(),Ue(t),null;case 3:return r=t.stateNode,pr(),pe(Ze),pe(Be),qa(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(Ko(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Lt!==null&&(Sa(Lt),Lt=null))),ga(e,t),Ue(t),null;case 5:Qa(t);var o=Ln(ro.current);if(n=t.type,e!==null&&t.stateNode!=null)Md(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(L(166));return Ue(t),null}if(e=Ln($t.current),Ko(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[It]=t,r[to]=i,e=(t.mode&1)!==0,n){case"dialog":de("cancel",r),de("close",r);break;case"iframe":case"object":case"embed":de("load",r);break;case"video":case"audio":for(o=0;o<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),n==="select"&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[It]=t,e[to]=r,Rd(e,t,!1,!1),t.stateNode=e;e:{switch(l=Bl(n,r),n){case"dialog":de("cancel",e),de("close",e),o=r;break;case"iframe":case"object":case"embed":de("load",e),o=r;break;case"video":case"audio":for(o=0;ofr&&(t.flags|=128,r=!0,zr(i,!1),t.lanes=4194304)}else{if(!r)if(e=ki(l),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),zr(i,!0),i.tail===null&&i.tailMode==="hidden"&&!l.alternate&&!fe)return Ue(t),null}else 2*ke()-i.renderingStartTime>fr&&n!==1073741824&&(t.flags|=128,r=!0,zr(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(n=i.last,n!==null?n.sibling=l:t.child=l,i.last=l)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=ke(),t.sibling=null,n=ve.current,le(ve,r?n&1|2:n&1),t):(Ue(t),null);case 22:case 23:return as(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(tt&1073741824)!==0&&(Ue(t),t.subtreeFlags&6&&(t.flags|=8192)):Ue(t),null;case 24:return null;case 25:return null}throw Error(L(156,t.tag))}function jf(e,t){switch(Ua(t),t.tag){case 1:return Je(t.type)&&gi(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return pr(),pe(Ze),pe(Be),qa(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Qa(t),null;case 13:if(pe(ve),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(L(340));cr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return pe(ve),null;case 4:return pr(),null;case 10:return Ka(t.type._context),null;case 22:case 23:return as(),null;case 24:return null;default:return null}}var Yo=!1,Ve=!1,Uf=typeof WeakSet=="function"?WeakSet:Set,O=null;function er(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){we(e,t,r)}else n.current=null}function ha(e,t,n){try{n()}catch(r){we(e,t,r)}}var Ku=!1;function Vf(e,t){if(Jl=di,e=jc(),Da(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var l=0,s=-1,u=-1,d=0,m=0,y=e,g=null;t:for(;;){for(var f;y!==n||o!==0&&y.nodeType!==3||(s=l+o),y!==i||r!==0&&y.nodeType!==3||(u=l+r),y.nodeType===3&&(l+=y.nodeValue.length),(f=y.firstChild)!==null;)g=y,y=f;for(;;){if(y===e)break t;if(g===n&&++d===o&&(s=l),g===i&&++m===r&&(u=l),(f=y.nextSibling)!==null)break;y=g,g=y.parentNode}y=f}n=s===-1||u===-1?null:{start:s,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(ea={focusedElem:e,selectionRange:n},di=!1,O=t;O!==null;)if(t=O,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,O=e;else for(;O!==null;){t=O;try{var S=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(S!==null){var b=S.memoizedProps,_=S.memoizedState,p=t.stateNode,c=p.getSnapshotBeforeUpdate(t.elementType===t.type?b:_t(t.type,b),_);p.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var h=t.stateNode.containerInfo;h.nodeType===1?h.textContent="":h.nodeType===9&&h.documentElement&&h.removeChild(h.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(L(163))}}catch(w){we(t,t.return,w)}if(e=t.sibling,e!==null){e.return=t.return,O=e;break}O=t.return}return S=Ku,Ku=!1,S}function Vr(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var o=r=r.next;do{if((o.tag&e)===e){var i=o.destroy;o.destroy=void 0,i!==void 0&&ha(t,n,i)}o=o.next}while(o!==r)}}function Fi(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ya(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Od(e){var t=e.alternate;t!==null&&(e.alternate=null,Od(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[It],delete t[to],delete t[ra],delete t[Nf],delete t[Ef])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function $d(e){return e.tag===5||e.tag===3||e.tag===4}function Wu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||$d(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function va(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=fi));else if(r!==4&&(e=e.child,e!==null))for(va(e,t,n),e=e.sibling;e!==null;)va(e,t,n),e=e.sibling}function ba(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ba(e,t,n),e=e.sibling;e!==null;)ba(e,t,n),e=e.sibling}var Oe=null,Ct=!1;function tn(e,t,n){for(n=n.child;n!==null;)Fd(e,t,n),n=n.sibling}function Fd(e,t,n){if(Ot&&typeof Ot.onCommitFiberUnmount=="function")try{Ot.onCommitFiberUnmount(Ai,n)}catch{}switch(n.tag){case 5:Ve||er(n,t);case 6:var r=Oe,o=Ct;Oe=null,tn(e,t,n),Oe=r,Ct=o,Oe!==null&&(Ct?(e=Oe,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Oe.removeChild(n.stateNode));break;case 18:Oe!==null&&(Ct?(e=Oe,n=n.stateNode,e.nodeType===8?kl(e.parentNode,n):e.nodeType===1&&kl(e,n),qr(e)):kl(Oe,n.stateNode));break;case 4:r=Oe,o=Ct,Oe=n.stateNode.containerInfo,Ct=!0,tn(e,t,n),Oe=r,Ct=o;break;case 0:case 11:case 14:case 15:if(!Ve&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){o=r=r.next;do{var i=o,l=i.destroy;i=i.tag,l!==void 0&&((i&2)!==0||(i&4)!==0)&&ha(n,t,l),o=o.next}while(o!==r)}tn(e,t,n);break;case 1:if(!Ve&&(er(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){we(n,t,s)}tn(e,t,n);break;case 21:tn(e,t,n);break;case 22:n.mode&1?(Ve=(r=Ve)||n.memoizedState!==null,tn(e,t,n),Ve=r):tn(e,t,n);break;default:tn(e,t,n)}}function Gu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Uf),t.forEach(function(r){var o=Xf.bind(null,e,r);n.has(r)||(n.add(r),r.then(o,o))})}}function Et(e,t){var n=t.deletions;if(n!==null)for(var r=0;ro&&(o=l),r&=~i}if(r=o,r=ke()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Hf(r/1960))-r,10e?16:e,sn===null)var r=!1;else{if(e=sn,sn=null,Ci=0,(X&6)!==0)throw Error(L(331));var o=X;for(X|=4,O=e.current;O!==null;){var i=O,l=i.child;if((O.flags&16)!==0){var s=i.deletions;if(s!==null){for(var u=0;uke()-is?zn(e,0):os|=n),et(e,t)}function Wd(e,t){t===0&&((e.mode&1)===0?t=1:(t=Io,Io<<=1,(Io&130023424)===0&&(Io=4194304)));var n=Ye();e=Yt(e,t),e!==null&&(so(e,t,n),et(e,n))}function qf(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Wd(e,n)}function Xf(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(L(314))}r!==null&&r.delete(t),Wd(e,n)}var Gd;Gd=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ze.current)Xe=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return Xe=!1,Ff(e,t,n);Xe=(e.flags&131072)!==0}else Xe=!1,fe&&(t.flags&1048576)!==0&&Xc(t,vi,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;ni(e,t),e=t.pendingProps;var o=ur(t,Be.current);lr(t,n),o=Za(null,t,r,e,o,n);var i=Ja();return t.flags|=1,typeof o=="object"&&o!==null&&typeof o.render=="function"&&o.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Je(r)?(i=!0,hi(t)):i=!1,t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,Ga(t),o.updater=$i,t.stateNode=o,o._reactInternals=t,ua(t,r,e,n),t=pa(null,t,r,!0,i,n)):(t.tag=0,fe&&i&&ja(t),Ge(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(ni(e,t),e=t.pendingProps,o=r._init,r=o(r._payload),t.type=r,o=t.tag=Jf(r),e=_t(r,e),o){case 0:t=da(null,t,r,e,n);break e;case 1:t=Vu(null,t,r,e,n);break e;case 11:t=ju(null,t,r,e,n);break e;case 14:t=Uu(null,t,r,_t(r.type,e),n);break e}throw Error(L(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:_t(r,o),da(e,t,r,o,n);case 1:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:_t(r,o),Vu(e,t,r,o,n);case 3:e:{if(Ad(t),e===null)throw Error(L(387));r=t.pendingProps,i=t.memoizedState,o=i.element,rd(e,t),wi(t,r,null,n);var l=t.memoizedState;if(r=l.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){o=mr(Error(L(423)),t),t=Bu(e,t,r,n,o);break e}else if(r!==o){o=mr(Error(L(424)),t),t=Bu(e,t,r,n,o);break e}else for(nt=pn(t.stateNode.containerInfo.firstChild),rt=t,fe=!0,Lt=null,n=td(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(cr(),r===o){t=Qt(e,t,n);break e}Ge(e,t,r,n)}t=t.child}return t;case 5:return od(t),e===null&&la(t),r=t.type,o=t.pendingProps,i=e!==null?e.memoizedProps:null,l=o.children,ta(r,o)?l=null:i!==null&&ta(r,i)&&(t.flags|=32),zd(e,t),Ge(e,t,l,n),t.child;case 6:return e===null&&la(t),null;case 13:return Pd(e,t,n);case 4:return Ya(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=dr(t,null,r,n):Ge(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:_t(r,o),ju(e,t,r,o,n);case 7:return Ge(e,t,t.pendingProps,n),t.child;case 8:return Ge(e,t,t.pendingProps.children,n),t.child;case 12:return Ge(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,l=o.value,le(bi,r._currentValue),r._currentValue=l,i!==null)if(Pt(i.value,l)){if(i.children===o.children&&!Ze.current){t=Qt(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var s=i.dependencies;if(s!==null){l=i.child;for(var u=s.firstContext;u!==null;){if(u.context===r){if(i.tag===1){u=Kt(-1,n&-n),u.tag=2;var d=i.updateQueue;if(d!==null){d=d.shared;var m=d.pending;m===null?u.next=u:(u.next=m.next,m.next=u),d.pending=u}}i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),aa(i.return,n,t),s.lanes|=n;break}u=u.next}}else if(i.tag===10)l=i.type===t.type?null:i.child;else if(i.tag===18){if(l=i.return,l===null)throw Error(L(341));l.lanes|=n,s=l.alternate,s!==null&&(s.lanes|=n),aa(l,n,t),l=i.sibling}else l=i.child;if(l!==null)l.return=i;else for(l=i;l!==null;){if(l===t){l=null;break}if(i=l.sibling,i!==null){i.return=l.return,l=i;break}l=l.return}i=l}Ge(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,lr(t,n),o=yt(o),r=r(o),t.flags|=1,Ge(e,t,r,n),t.child;case 14:return r=t.type,o=_t(r,t.pendingProps),o=_t(r.type,o),Uu(e,t,r,o,n);case 15:return Cd(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:_t(r,o),ni(e,t),t.tag=1,Je(r)?(e=!0,hi(t)):e=!1,lr(t,n),Nd(t,r,o),ua(t,r,o,n),pa(null,t,r,!0,e,n);case 19:return Td(e,t,n);case 22:return Ld(e,t,n)}throw Error(L(156,t.tag))};function Yd(e,t){return wc(e,t)}function Zf(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function gt(e,t,n,r){return new Zf(e,t,n,r)}function us(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Jf(e){if(typeof e=="function")return us(e)?1:0;if(e!=null){if(e=e.$$typeof,e===La)return 11;if(e===za)return 14}return 2}function hn(e,t){var n=e.alternate;return n===null?(n=gt(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function ii(e,t,n,r,o,i){var l=2;if(r=e,typeof e=="function")us(e)&&(l=1);else if(typeof e=="string")l=5;else e:switch(e){case Kn:return An(n.children,o,i,t);case Ca:l=8,o|=8;break;case Rl:return e=gt(12,n,t,o|2),e.elementType=Rl,e.lanes=i,e;case Ml:return e=gt(13,n,t,o),e.elementType=Ml,e.lanes=i,e;case Il:return e=gt(19,n,t,o),e.elementType=Il,e.lanes=i,e;case oc:return ji(n,o,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case nc:l=10;break e;case rc:l=9;break e;case La:l=11;break e;case za:l=14;break e;case nn:l=16,r=null;break e}throw Error(L(130,e==null?e:typeof e,""))}return t=gt(l,n,t,o),t.elementType=e,t.type=r,t.lanes=i,t}function An(e,t,n,r){return e=gt(7,e,r,t),e.lanes=n,e}function ji(e,t,n,r){return e=gt(22,e,r,t),e.elementType=oc,e.lanes=n,e.stateNode={isHidden:!1},e}function Al(e,t,n){return e=gt(6,e,null,t),e.lanes=n,e}function Pl(e,t,n){return t=gt(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function eg(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=fl(0),this.expirationTimes=fl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=fl(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function cs(e,t,n,r,o,i,l,s,u){return e=new eg(e,t,n,s,u),t===1?(t=1,i===!0&&(t|=8)):t=0,i=gt(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ga(i),e}function tg(e,t,n){var r=3{"use strict";function Jd(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Jd)}catch(e){console.error(e)}}Jd(),ep.exports=Zd()});var rp=jt(fs=>{"use strict";var np=tp();fs.createRoot=np.createRoot,fs.hydrateRoot=np.hydrateRoot;var _h});var ip=jt(Ki=>{"use strict";var lg=Eo(),ag=Symbol.for("react.element"),sg=Symbol.for("react.fragment"),ug=Object.prototype.hasOwnProperty,cg=lg.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,dg={key:!0,ref:!0,__self:!0,__source:!0};function op(e,t,n){var r,o={},i=null,l=null;n!==void 0&&(i=""+n),t.key!==void 0&&(i=""+t.key),t.ref!==void 0&&(l=t.ref);for(r in t)ug.call(t,r)&&!dg.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)o[r]===void 0&&(o[r]=t[r]);return{$$typeof:ag,type:e,key:i,ref:l,props:o,_owner:cg.current}}Ki.Fragment=sg;Ki.jsx=op;Ki.jsxs=op});var gs=jt((Ph,lp)=>{"use strict";lp.exports=ip()});var k=wo(Eo(),1),Sp=wo(rp(),1);var a=wo(gs(),1),Wi=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,pg="http://localhost:8080",Np="https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl",ap=["localhost","k3s_localhost","k3s_vps"],mg={localhost:"LOCALHOST",k3s_localhost:"K3S@LOCALHOST",k3s_vps:"K3S@VPS"};function sp(e){try{let t=new URL(String(e??""));return["http:","https:"].includes(t.protocol)?(t.search="",t.hash="",t.href.replace(/\/$/,"")):""}catch{return""}}function fg(){return window.location.pathname.split("/").filter(Boolean).find(e=>Wi.test(e))?.toLowerCase()??""}function gg(){let e=new URL(Np).host;return window.location.host===e?"k3s_vps":["localhost","127.0.0.1","::1"].includes(window.location.hostname)&&window.location.port==="8080"?"localhost":"k3s_localhost"}function hg(){let e=window.__STEM_CARD_RUNTIME__,t=ap.includes(e?.active_source)?e?.active_source:gg(),n=new Map(Array.isArray(e?.sources)?e.sources.map(o=>[o?.id,o]):[]),r=ap.map(o=>{let i=n.get(o),l=o==="localhost"?t===o?window.location.origin:pg:o==="k3s_vps"?Np:t===o?window.location.origin:"",s=sp(i?.base_url)||sp(l),u=t===o;return{id:o,label:String(i?.label||mg[o]),base_url:s,available:u||!!s&&i?.available!==!1,reason:String(i?.reason||(s?"":"\u0179r\xF3d\u0142o nie ma skonfigurowanego adresu"))}});return{schema:"stem.card-runtime/v1",default_source:"localhost",active_source:t,current_resource_uuid:String(e?.current_resource_uuid||fg()).toLowerCase(),sources:r}}function Ep(e,t,n=""){return!e.available||!e.base_url||!Wi.test(t)?"":`${e.base_url}/${t.toLowerCase()}/${n}`}function yg(e){let t=String(e.resource_uuid??"").toLowerCase();if(Wi.test(t))return t;for(let n of[e.local_href,e.href])try{let r=new URL(String(n??""),window.location.href).pathname.split("/").filter(Boolean).find(o=>Wi.test(o));if(r)return r.toLowerCase()}catch{}return""}function vg(e,t){return Ep(t,yg(e))||e.local_href||e.href}var _p={hidden:"UKRYTY",connecting:"\u0141\u0104CZENIE",connected:"ONLINE \xB7 LIVE",replaying:"ONLINE \xB7 REPLAY",verifying:"ONLINE \xB7 WERYFIKACJA",ready:"ONLINE \xB7 GOTOWY",failed:"ONLINE \xB7 B\u0141\u0104D STANU",offline:"OFFLINE \xB7 ZAPIS",unselected:"OFFLINE \xB7 BRAK CELU"},up=.25,Dn=1,cp=4;function bg(e){let t=window.getComputedStyle(e).overflowY;return t==="auto"||t==="scroll"||t==="hidden"||t==="clip"}function Cp(e){let t=e.getBoundingClientRect(),n=e.offsetHeight||e.clientHeight,r=n>0?t.height/n:1,o=t.top+e.clientTop*r;return{top:o,bottom:o+e.clientHeight*r}}function Lp(e){let t=document.querySelector(".viewer-chrome");if(t?.classList.contains("is-nvim-fit"))return null;let n=0,r=window.innerHeight;if(t){let o=t.getBoundingClientRect(),i=e.getBoundingClientRect();o.lefti.left&&o.bottom>0&&o.topDn?{top:n,bottom:r}:null}function xg(e){let t=Lp(e);if(!t)return null;let{top:n,bottom:r}=t;for(let o=e.parentElement;o&&o!==document.body&&o!==document.documentElement;o=o.parentElement){if(!bg(o))continue;let i=Cp(o);n=Math.max(n,i.top),r=Math.min(r,i.bottom)}return r-n>Dn?{top:n,bottom:r}:null}function Qi(){return document.scrollingElement??document.documentElement}function wg(e){let t=[];for(let r=e.parentElement;r&&r!==document.body&&r!==document.documentElement;r=r.parentElement){let o=window.getComputedStyle(r).overflowY;(o==="auto"||o==="scroll")&&r.scrollHeight-r.clientHeight>1&&t.push(r)}let n=Qi();return t.includes(n)||t.push(n),t}function kg(e){if(e===Qi())return 1;let t=e.getBoundingClientRect(),n=e.offsetHeight||e.clientHeight,r=n>0?t.height/n:1;return Number.isFinite(r)&&r>0?r:1}function Gi(e,t){let n=e.style.scrollBehavior;e.style.scrollBehavior="auto",t.left!=null&&(e.scrollLeft=t.left),t.top!=null&&(e.scrollTop=t.top),e.style.scrollBehavior=n}function Sg(e,t){let n=e.closest(".sheet-content");if(!n)return 0;let r=Cp(n),o=0;if(r.bottom<=t.top?o=r.bottom-t.bottom:r.top>=t.bottom&&(o=r.top-t.top),Math.abs(o)<=Dn)return 0;let i=Qi(),l=i.scrollTop,s=Math.max(0,i.scrollHeight-i.clientHeight);return Gi(i,{top:Math.max(0,Math.min(s,l+o))}),i.scrollTop-l}function dp(e,t){let n=t;for(let r of wg(e)){if(Math.abs(n)<=Dn)break;let o=kg(r),i=Math.max(0,r.scrollHeight-r.clientHeight),l=r.scrollTop,s=Math.max(0,Math.min(i,l+n/o));Gi(r,{top:s}),n-=(r.scrollTop-l)*o}return t-n}function pp(e,t){let n=e.getBoundingClientRect(),r=(n.top+n.bottom)/2,o=t.bottom-t.top,i=t.top+o*up,l=t.bottom-o*up;return rl?r-l:0}var Ft=({html:e,className:t})=>(0,a.jsx)("div",{className:t,dangerouslySetInnerHTML:{__html:e}});function zp(e,t){e.setAttribute("preserveAspectRatio","xMinYMin meet"),t&&(e.setAttribute("viewBox",`${t.x} ${t.y} ${t.width} ${t.height}`),e.setAttribute("width",`${t.width}px`),e.setAttribute("height",`${t.height}px`),e.dataset.tileIndex=String(t.index),e.dataset.tileRow=String(t.row),e.dataset.tileColumn=String(t.column))}function Ng(e){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9_.:-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,120)||"uml-element"}function ys(e){let t=e;if(typeof t.getBBox!="function")return null;try{let n=t.getBBox();return[n.x,n.y,n.width,n.height].every(Number.isFinite)?{x:n.x,y:n.y,width:n.width,height:n.height}:null}catch{return null}}function Eg(e){let t=ys(e);if(!t)return null;let n=Number(e.dataset.umlLayoutOriginX),r=Number(e.dataset.umlLayoutOriginY),o=Number(e.dataset.umlLayoutDx),i=Number(e.dataset.umlLayoutDy),l=Number(e.dataset.umlLayoutSx),s=Number(e.dataset.umlLayoutSy);return[n,r,o,i,l,s].every(Number.isFinite)?{x:n+(t.x-n)*l+o,y:r+(t.y-r)*s+i,width:t.width*l,height:t.height*s}:t}function Ap(e){e.dataset.umlLayoutRemembered!=="true"&&(e.dataset.umlLayoutRemembered="true",e.dataset.umlLayoutOriginalTransform=e.getAttribute("transform")??"",e.dataset.umlLayoutOriginalVisibility=e.getAttribute("visibility")??"",e.dataset.umlLayoutOriginalStyle=e.getAttribute("style")??"",e instanceof SVGTextElement&&(e.dataset.umlLayoutOriginalText=e.textContent??"",e.dataset.umlLayoutOriginalX=e.getAttribute("x")??"",e.dataset.umlLayoutOriginalTextAnchor=e.getAttribute("text-anchor")??"",e.dataset.umlLayoutOriginalFontFamily=e.getAttribute("font-family")??"",e.dataset.umlLayoutOriginalFontSize=e.getAttribute("font-size")??"",e.dataset.umlLayoutOriginalFontWeight=e.getAttribute("font-weight")??""),e instanceof SVGRectElement&&(e.dataset.umlLayoutOriginalFill=e.getAttribute("fill")??"",e.dataset.umlLayoutOriginalStroke=e.getAttribute("stroke")??"",e.dataset.umlLayoutOriginalStrokeWidth=e.getAttribute("stroke-width")??""))}function _g(e){e.querySelectorAll(".uml-layout-hit,.uml-layout-resize,.uml-layout-generated").forEach(t=>t.remove()),e.querySelectorAll("[data-uml-layout-remembered='true']").forEach(t=>{let n=(r,o)=>{o?t.setAttribute(r,o):t.removeAttribute(r)};n("transform",t.dataset.umlLayoutOriginalTransform),n("visibility",t.dataset.umlLayoutOriginalVisibility),n("style",t.dataset.umlLayoutOriginalStyle),t instanceof SVGTextElement&&(t.textContent=t.dataset.umlLayoutOriginalText??"",n("x",t.dataset.umlLayoutOriginalX),n("text-anchor",t.dataset.umlLayoutOriginalTextAnchor),n("font-family",t.dataset.umlLayoutOriginalFontFamily),n("font-size",t.dataset.umlLayoutOriginalFontSize),n("font-weight",t.dataset.umlLayoutOriginalFontWeight)),t instanceof SVGRectElement&&(n("fill",t.dataset.umlLayoutOriginalFill),n("stroke",t.dataset.umlLayoutOriginalStroke),n("stroke-width",t.dataset.umlLayoutOriginalStrokeWidth)),delete t.dataset.umlLayoutOriginX,delete t.dataset.umlLayoutOriginY,delete t.dataset.umlLayoutDx,delete t.dataset.umlLayoutDy,delete t.dataset.umlLayoutSx,delete t.dataset.umlLayoutSy,delete t.dataset.umlLayoutId})}function Cg(e,t){let n=e.querySelector(":scope > g")??e,r=Array.from(n.children).filter(s=>s instanceof SVGElement),o=r.filter(s=>s instanceof SVGRectElement).map(s=>({rect:s,box:ys(s)})).filter(s=>!!(s.box&&s.box.width>=30&&s.box.height>=14)).sort((s,u)=>s.box.width*s.box.height-u.box.width*u.box.height),i=new Map;for(let s of r){let u=ys(s);if(!u)continue;let d=u.x+u.width/2,m=u.y+u.height/2,y=o.find(({box:g})=>d>=g.x-.5&&d<=g.x+g.width+.5&&m>=g.y-.5&&m<=g.y+g.height+.5);y&&i.set(s,y.rect)}let l=new Set;return o.map(({rect:s,box:u},d)=>{let m=r.filter(c=>i.get(c)===s);m.includes(s)||m.unshift(s);let y=m.filter(c=>c instanceof SVGTextElement).sort((c,h)=>Number(c.getAttribute("y"))-Number(h.getAttribute("y"))),g=(y[0]?.textContent??s.id??`element-${d+1}`).trim(),f=/^(\d{1,3})\b/.exec(g)?.[1]?.padStart(2,"0"),S=s.id||(f?t.get(f):"")||g,b=Ng(S),_=b,p=2;for(;l.has(_);)_=`${b}-${p++}`;return l.add(_),m.forEach(Ap),{id:_,box:u,rect:s,members:m,texts:y}})}function mo(e){let t=e.texts[0],n=e.rect.getAttribute("style")??"",r=i=>new RegExp(`${i}\\s*:\\s*([^;]+)`,"i").exec(n)?.[1]?.trim(),o=Number(t?.getAttribute("font-size")??12);return{...e.box,z:0,scale:1,rotation:0,text:{title:(e.texts[0]?.textContent??"").trim(),description:e.texts.slice(1).map(i=>(i.textContent??"").trim()).join(` +`),lines:e.texts.map(i=>(i.textContent??"").trim()),font_family:t?.getAttribute("font-family")??"Monospace",font_size:Number.isFinite(o)?o:12,font_weight:Number(t?.getAttribute("font-weight")??400)||400,align:"left"},style:{fill:e.rect.getAttribute("fill")??r("fill")??"#edf6fa",stroke:e.rect.getAttribute("stroke")??r("stroke")??"#2c7794",stroke_width:Number(e.rect.getAttribute("stroke-width")??r("stroke-width")??1.5)}}}function Lg(e,t){let n=Math.max(12,Number(t.width)||e.box.width),r=Math.max(12,Number(t.height)||e.box.height),o=Number.isFinite(Number(t.x))?Number(t.x):e.box.x,i=Number.isFinite(Number(t.y))?Number(t.y):e.box.y,l=n/Math.max(1,e.box.width),s=r/Math.max(1,e.box.height),u=o-e.box.x,d=i-e.box.y,m=`translate(${u} ${d}) translate(${e.box.x} ${e.box.y}) scale(${l} ${s}) translate(${-e.box.x} ${-e.box.y})`;e.members.forEach(f=>{Ap(f);let S=f.dataset.umlLayoutOriginalTransform??"";f.setAttribute("transform",`${m}${S?` ${S}`:""}`),f.dataset.umlLayoutOriginX=String(e.box.x),f.dataset.umlLayoutOriginY=String(e.box.y),f.dataset.umlLayoutDx=String(u),f.dataset.umlLayoutDy=String(d),f.dataset.umlLayoutSx=String(l),f.dataset.umlLayoutSy=String(s),f.dataset.umlLayoutId=e.id});let y=t.text??{},g=y.lines??[y.title??"",...y.description?y.description.split(` +`):[]];e.texts.forEach((f,S)=>{S(e.tile?.page_height??0)?"landscape":"portrait",scale:1},elements:{},relations:{}}}function vs(e){if(!e)return{};let t=e.count===1,n=t?Math.max(0,(e.page_width-e.width)/2):e.column===1&&e.columns>1?e.page_width-e.width:e.column===e.columns?0:Math.max(0,(e.page_width-e.width)/2),r=t?0:e.row===1&&e.rows>1?e.page_height-e.height:e.row===e.rows?0:Math.max(0,(e.page_height-e.height)/2);return{"--uml-tile-page-width":`${e.page_width}px`,"--uml-tile-page-height":`${t?e.height:e.page_height}px`,"--uml-tile-left":`${n}px`,"--uml-tile-top":`${r}px`}}function zg({html:e}){return(0,a.jsx)(Ft,{html:e})}function Ag({html:e=""}){return e?(0,a.jsx)(Ft,{html:e}):null}function Pg(e){let t=e.spread_count??1;if(t<=1)return null;let n=Math.max(1,Math.min(t,e.spread_index??1)),r=Math.max(1,Math.min(t,e.spread_columns??1)),o=n-1,i=Math.floor(o/r),l=o%r;return{left:l>0,right:l+10,down:n+r<=t,index:n,count:t}}function Pp({continuation:e}){if(!e)return null;let t=[e.left&&["left","\u2190","kontynuacja po lewej"],e.up&&["up","\u2191","kontynuacja powy\u017Cej"],e.down&&["down","\u2193","kontynuacja poni\u017Cej"],e.right&&["right","\u2192","kontynuacja po prawej"]].filter(Boolean);return(0,a.jsx)("span",{className:"uml-page-continuation","aria-label":`Logiczny diagram: strona ${e.index} z ${e.count}`,title:`Ten sam diagram \xB7 strona ${e.index}/${e.count}`,children:t.map(([n,r,o])=>(0,a.jsx)("i",{"data-direction":n,"aria-label":o,children:r},n))})}function mp({side:e,html:t}){return(0,a.jsx)("aside",{className:`pdf-margin ${e}`,dangerouslySetInnerHTML:{__html:t}})}function bs({header:e,footer:t="",left:n="",right:r="",children:o,className:i=""}){return(0,a.jsx)("article",{className:`sheet ${i}`,children:(0,a.jsxs)("div",{className:"sheet-content",children:[(0,a.jsx)(zg,{html:e}),(0,a.jsx)(mp,{side:"left",html:n}),(0,a.jsx)("section",{className:"pdf-main card-section",children:o}),(0,a.jsx)(mp,{side:"right",html:r}),(0,a.jsx)(Ag,{html:t})]})})}function Tg({viewpoints:e}){let t=e.filter(i=>i.status==="enabled"&&i.target_id),[n,r]=(0,k.useState)(t[0]?.id??"");(0,k.useEffect)(()=>{if(!t.length)return;let i=0,l=()=>{window.cancelAnimationFrame(i),i=window.requestAnimationFrame(()=>{let s=document.querySelector(".viewer-chrome")?.getBoundingClientRect().bottom??0,u=t.map(m=>({viewpoint:m,element:document.getElementById(m.target_id)})).filter(m=>!!m.element);if(!u.length)return;let d=u.reduce((m,y)=>{let g=Math.abs(y.element.getBoundingClientRect().top-s-18);return g{window.cancelAnimationFrame(i),window.removeEventListener("scroll",l),window.removeEventListener("resize",l)}},[e]);let o=i=>{if(i.status!=="enabled"||!i.target_id)return;let l=document.getElementById(i.target_id);if(!l)return;let u=document.querySelector(".viewer-chrome")?.getBoundingClientRect().height??0;r(i.id),window.scrollTo({top:Math.max(0,window.scrollY+l.getBoundingClientRect().top-u-8),behavior:"smooth"})};return(0,a.jsx)("nav",{className:"viewpoint-bar","aria-label":"Perspektywy architektury A1\u2013A8",children:e.map(i=>{let l=i.status==="unavailable";return(0,a.jsxs)("button",{type:"button",className:l?"is-unavailable":"","aria-current":!l&&n===i.id?"location":void 0,disabled:l,title:l?i.reason:i.subtitle,onClick:()=>o(i),children:[(0,a.jsx)("span",{children:i.id}),(0,a.jsx)("strong",{children:i.label}),l&&(0,a.jsx)("small",{children:"N/D"})]},i.id)})})}function Rg({runtime:e,onSelect:t}){let n=e.sources.find(r=>r.id===e.active_source);return(0,a.jsxs)("label",{className:"runtime-source-selector","data-stem-source-selector":"true",title:n?.base_url||n?.reason||"Wyb\xF3r \u017Ar\xF3d\u0142a aplikacji",children:[(0,a.jsx)("span",{children:"\u0179R\xD3D\u0141O"}),(0,a.jsx)("select",{"aria-label":"\u0179r\xF3d\u0142o aplikacji",value:e.active_source,onChange:r=>t(r.currentTarget.value),children:e.sources.map(r=>(0,a.jsxs)("option",{value:r.id,disabled:!r.available,children:[r.label,r.available?"":" \xB7 BRAK"]},r.id))})]})}function Mg({toc:e,runtime:t,onSourceSelect:n,libraryAvailable:r,libraryOpen:o,setLibraryOpen:i,scale:l,setScale:s,nvimVisible:u,setNvimVisible:d,nvimSyncMode:m,setNvimSyncMode:y,nvimControlMode:g,setNvimControlMode:f,nvimExpanded:S,setNvimExpanded:b,nvimFit:_,setNvimFit:p,allocatorVisible:c,setAllocatorVisible:h,hasAllocatorModel:w,diagramSpread:C,setDiagramSpread:A,hasDiagramSpread:P,nvimSummary:z,progress:U,progressError:F}){return(0,a.jsx)("nav",{className:"topbar",children:(0,a.jsxs)("div",{className:"topbar-inner",children:[r&&(0,a.jsxs)("button",{type:"button",className:`card-library-toggle${o?" is-active":""}`,"aria-controls":"side-panel-left-library","aria-expanded":o,"aria-label":o?"Alt+0: zamknij serie i karty":"Alt+0: poka\u017C serie i karty",title:o?"Alt+0 \xB7 Zamknij serie i karty":"Alt+0 \xB7 Serie i karty",onClick:()=>i(!o),children:[(0,a.jsx)("span",{"aria-hidden":"true",className:"card-library-toggle-icon",children:"\u2630"}),(0,a.jsx)("kbd",{children:"A0"}),(0,a.jsx)("span",{children:"KARTY"})]}),(0,a.jsx)(Rg,{runtime:t,onSelect:n}),(0,a.jsxs)("details",{children:[(0,a.jsx)("summary",{children:"Spis tre\u015Bci"}),(0,a.jsx)("div",{className:"toc-links",children:e.map(ae=>(0,a.jsx)("a",{href:`#${ae.id}`,children:ae.label},ae.id))})]}),(0,a.jsxs)("div",{className:"topbar-nvim-section","aria-label":"Panel Neovima",children:[(0,a.jsx)("span",{className:"nvim-toolbar-boundary","aria-hidden":"true",children:"|"}),(0,a.jsx)("span",{className:"nvim-toolbar-context",children:"NVIM"}),(0,a.jsxs)("div",{className:"nvim-toolbar-actions","aria-label":"Narz\u0119dzia okna Neovima",children:[(0,a.jsxs)("button",{className:"viewer-nvim-toggle nvim-toolbar-button","aria-label":u?"Alt+1: ukryj Neovim":"Alt+1: poka\u017C Neovim",title:u?"Alt+1 \xB7 Ukryj Neovim":"Alt+1 \xB7 Poka\u017C Neovim","aria-pressed":u,onClick:()=>d(!u),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A1"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"PANEL"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-control-indicator nvim-toolbar-button${z.syncMode?" is-active":""}${z.syncReady?" is-engaged":""}`,"aria-label":`Alt+2: synchronizacja ${m?"w\u0142\u0105czona":"wy\u0142\u0105czona"}`,title:`Alt+2 \xB7 SYNC ${m?"ON":"OFF"}`,"aria-pressed":m,onClick:()=>y(!m),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A2"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"SYNC"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-work-indicator nvim-toolbar-button${g?" is-active":""}${z.controlEnabled?" is-engaged":""}`,"aria-label":`Alt+3: sterowanie ${m?g?"w\u0142\u0105czone":"wy\u0142\u0105czone":"niedost\u0119pne"}`,title:m?`Alt+3 \xB7 Sterowanie ${g?"ON":"OFF"}`:"Alt+3 \xB7 Sterowanie wymaga SYNC ON","aria-pressed":g,disabled:!m,onClick:()=>f(!g),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A3"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"CTRL"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${S?" is-active":""}`,"aria-label":`Alt+4: ${S?"przywr\xF3\u0107 normaln\u0105 wysoko\u015B\u0107":"ustaw wysoki panel"}`,title:S?"Alt+4 \xB7 Normalna wysoko\u015B\u0107":"Alt+4 \xB7 Wysoki panel 90%","aria-pressed":S,onClick:()=>b(!S),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A4"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"HIGH"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${_?" is-active":""}`,"aria-label":`Alt+5: automatyczne dopasowanie ${_?"w\u0142\u0105czone":"wy\u0142\u0105czone"}`,title:_?"Alt+5 \xB7 Wy\u0142\u0105cz auto-fit":"Alt+5 \xB7 Poka\u017C ca\u0142y Neovim","aria-pressed":_,onClick:()=>p(!_),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A5"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"FIT"})]}),w&&(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${c?" is-active":""}`,"aria-label":`Alt+6: model alokatora ${c?"przypi\u0119ty":"ukryty"}`,title:c?"Alt+6 \xB7 Ukryj model alokatora":"Alt+6 \xB7 Przypnij model alokatora","aria-pressed":c,onClick:()=>h(!c),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A6"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"MODEL"})]}),P&&(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${C?" is-active":""}`,"aria-label":`Alt+7: diagram UML ${C?"jako osobne kartki A4":"jako po\u0142\u0105czony spread"}`,title:C?"Alt+7 \xB7 Osobne kartki A4":"Alt+7 \xB7 Po\u0142\u0105cz strony UML","aria-pressed":C,onClick:()=>A(!C),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A7"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"UML"})]})]}),(0,a.jsx)("span",{className:"nvim-toolbar-boundary","aria-hidden":"true",children:"|"}),u&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:`nvim-status nvim-status--${z.state}`,children:_p[z.state]}),(0,a.jsxs)("span",{className:"topbar-nvim-meta",title:z.message,children:[(0,a.jsx)("strong",{children:z.instance??"Neovim MCP"}),z.detail&&(0,a.jsx)("small",{children:z.detail})]}),(0,a.jsxs)("span",{className:"nvim-shortcut-strip","aria-label":"Skr\xF3ty panelu Neovima",children:[(0,a.jsx)("kbd",{children:"F1"})," reset \xB7 ",(0,a.jsx)("kbd",{children:"F2"})," sync \xB7 ",(0,a.jsx)("kbd",{children:"Alt+W"})," okna \xB7 ",(0,a.jsx)("kbd",{children:"F12"})," skr\xF3ty"]})]})]}),(0,a.jsx)(ah,{progress:U,error:F}),(0,a.jsxs)("div",{className:"viewer-zoom-controls",children:[(0,a.jsxs)("output",{className:"viewer-zoom-status",children:["P\u0142\xF3tno ",Math.round(l*100),"% \xB7 Tre\u015B\u0107 100%"]}),(0,a.jsx)("button",{className:"viewer-zoom-reset",onClick:()=>s(2.18),children:"Reset zoom"})]})]})})}function fp(e,t){for(let n of e.sections)for(let r of n.assets){let o=r.interactive;if(!(o?.kind!=="uml-sequence"||!o.phases?.length)&&!(t?.task.id&&o.task?.id!==t.task.id)&&!(t?.block.id&&o.block?.id!==t.block.id))for(let i of o.phases){if(t?.phase.id&&i.id!==t.phase.id)continue;let l=t?.step.id?i.steps.find(s=>s.id===t.step.id):i.steps[0];if(l)return{task:o.task??null,block:o.block??null,phase:{id:i.id,label:i.label},step:l,focusLevel:t?.focus_level??"step",activate:!1}}}return null}function Ig({visible:e,model:t}){let[n,r]=(0,k.useState)(null);if((0,k.useEffect)(()=>{let g=f=>{r(f.detail??null)};return window.addEventListener("stem:nvim-step",g),r(fp(t)),fetch("/api/navigation/current",{cache:"no-store"}).then(f=>f.ok?f.json():Promise.reject()).then(f=>{let S=fp(t,f.current??null);S&&r(S)}).catch(()=>{}),()=>window.removeEventListener("stem:nvim-step",g)},[t]),!e)return null;let o=n?.focusLevel??"card",i=n?.step.snapshot?.memory.arena,l=!!(n&&o!=="card"&&o!=="task"),s=Math.max(1,Number(i?.size_bytes??64)),u=i?.offset==null?null:Math.max(0,Math.min(s,Number(i.offset))),d=i?.bytes.trim().split(/\s+/).filter(Boolean)??[],m=Math.min(s,64),y=n?[...(n.step.snapshot?.memory.items??[]).map(g=>({name:g.name,value:g.value})),...(n.step.snapshot?.frame.fields??[]).map(g=>({name:g.name,value:g.value}))].filter((g,f,S)=>S.findIndex(b=>b.name===g.name)===f).slice(0,8):[];return(0,a.jsxs)("section",{className:"allocator-panel","aria-label":"Przypi\u0119ty model alokatora",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("span",{children:"ALLOCATOR \xB7 PINNED"}),(0,a.jsx)("strong",{children:n?`${n.phase.label} \xB7 ${String(n.step.number).padStart(2,"0")} ${n.step.label}`:"Oczekiwanie na diagram UML"}),(0,a.jsx)("small",{children:l?n.step.snapshot?.description??n.step.description:"Wybierz co najmniej BLOCK. F2 wybierze jego pierwszy krok i wykona synchronizacj\u0119."})]}),(0,a.jsxs)("div",{className:"allocator-panel-body",children:[(0,a.jsxs)("dl",{className:"allocator-metrics",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"FOCUS"}),(0,a.jsx)("dd",{children:o.toUpperCase()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"BASE"}),(0,a.jsx)("dd",{children:i?.base??"\u2014"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"ALLOCP"}),(0,a.jsx)("dd",{children:i?.cursor??"\u2014"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"USED / FREE"}),(0,a.jsx)("dd",{children:u==null?"\u2014":`${u} / ${s-u} B`})]})]}),(0,a.jsxs)("div",{className:`allocator-arena-view${l?"":" is-inactive"}`,children:[(0,a.jsxs)("div",{className:"allocator-arena-labels",children:[(0,a.jsx)("span",{children:"allocbuf[0]"}),(0,a.jsx)("strong",{children:u==null?"allocp jeszcze nieustawiony":`offset ${u}`}),(0,a.jsxs)("span",{children:["allocbuf[",s-1,"]"]})]}),(0,a.jsxs)("div",{className:"allocator-pinned-arena",style:{"--allocator-size":m},children:[Array.from({length:m},(g,f)=>(0,a.jsx)("i",{className:u!=null&&f(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{children:g.name}),(0,a.jsx)("code",{children:g.value})]},g.name)):(0,a.jsx)("p",{children:"Brak snapshotu."})})]})]})}var Yi=()=>({text:" ",highlight:0});function gp(e=1,t=1){return{width:e,height:t,cells:Array.from({length:t},()=>Array.from({length:e},Yi)),highlights:new Map,foreground:15263976,background:1053461,cursor:{row:0,column:0}}}function Og(e,t,n){if(t<=0||n<=0)return;let r=e.cells;e.width=t,e.height=n,e.cells=Array.from({length:n},(o,i)=>Array.from({length:t},(l,s)=>r[i]?.[s]??Yi()))}function Tp(e){return`stem-card:nvim-grid:${e}`}function $g(e,t){if(t.width<=1||t.height<=1)return;let n={schema:"stem-nvim-grid.v1",snapshot_ref:e,saved_at:new Date().toISOString(),width:t.width,height:t.height,cells:t.cells.map(r=>r.map(o=>[o.text,o.highlight])),highlights:Array.from(t.highlights.entries()),foreground:t.foreground,background:t.background,cursor:{...t.cursor}};try{localStorage.setItem(Tp(e),JSON.stringify(n))}catch{}}function Rp(e,t){try{return e?.schema!=="stem-nvim-grid.v1"||e.snapshot_ref!==t||!Number.isInteger(e.width)||!Number.isInteger(e.height)||e.width<2||e.height<2||e.width>400||e.height>200||e.cells.length!==e.height?null:{width:e.width,height:e.height,cells:e.cells.map(n=>n.map(([r,o])=>({text:typeof r=="string"?r:" ",highlight:Number.isInteger(o)?o:0}))),highlights:new Map(e.highlights),foreground:e.foreground,background:e.background,cursor:e.cursor}}catch{return null}}function Fg(e){try{return Rp(JSON.parse(localStorage.getItem(Tp(e))??"null"),e)}catch{return null}}async function hp(e){let t=e.snapshot_ref;if(!t)return null;let n=Fg(t);if(n)return n;let r=e.view?.recorded_grid_ref;if(!r||/^(?:[a-z]+:|\/\/)/i.test(r))return null;try{let o=await fetch(r,{cache:"no-store"});return o.ok?Rp(await o.json(),t):null}catch{return null}}var Dg=[1842207,12590120,3064446,16106001,1997028,9978299,702940,12631996,6184036,15545147,5759881,16311388,5349887,12607947,5231357,16184820];function ho(e){let t=Number(e);if(!Number.isInteger(t)||t<0||t>255)return;if(t<16)return Dg[t];if(t<232){let r=t-16,o=[0,95,135,175,215,255],i=o[Math.floor(r/36)],l=o[Math.floor(r%36/6)],s=o[r%6];return i<<16|l<<8|s}let n=8+(t-232)*10;return n<<16|n<<8|n}function jg(e){if(!e||typeof e!="object")return null;let t=e;return Object.keys(t).length?{...t,foreground:ho(t.foreground),background:ho(t.background),special:ho(t.special)}:null}function Ug(e){if(!e||typeof e!="object")return null;let t=e;return Object.keys(t).length?{...t}:null}function Vg(e,t){for(let n of t){if(!Array.isArray(n)||typeof n[0]!="string")continue;let r=n[0],o=n.slice(1);for(let i of o)if(Array.isArray(i)){if(r==="grid_resize"){let[l,s,u]=i.map(Number);l===1&&Og(e,s,u)}else if(r==="default_colors_set"){let l=Number(i[0]),s=Number(i[1]),u=l>=0?l:ho(i[3]),d=s>=0?s:ho(i[4]);typeof u=="number"&&Number.isFinite(u)&&u>=0&&(e.foreground=u),typeof d=="number"&&Number.isFinite(d)&&d>=0&&(e.background=d)}else if(r==="hl_attr_define"){let l=Number(i[0]),s=jg(i[2])??Ug(i[1]);Number.isInteger(l)&&s&&typeof s=="object"&&e.highlights.set(l,s)}else if(r==="grid_clear"&&Number(i[0])===1)e.cells=Array.from({length:e.height},()=>Array.from({length:e.width},Yi));else if(r==="grid_cursor_goto"&&Number(i[0])===1)e.cursor={row:Number(i[1]),column:Number(i[2])};else if(r==="grid_line"&&Number(i[0])===1){let l=Number(i[1]),s=Number(i[2]),u=i[3];if(!e.cells[l]||!Array.isArray(u))continue;let d=0;for(let m of u){if(!Array.isArray(m))continue;let y=typeof m[0]=="string"?m[0]:" ";Number.isInteger(m[1])&&(d=Number(m[1]));let g=Number.isInteger(m[2])?Number(m[2]):1;for(let f=0;f=0&&(e.cells[l][s]={text:y,highlight:d}),s+=1}}else if(r==="grid_scroll"&&Number(i[0])===1){let l=Number(i[1]),s=Number(i[2]),u=Number(i[3]),d=Number(i[4]),m=Number(i[5]),y=Number(i[6]),g=e.cells.map(f=>f.map(S=>({...S})));for(let f=l;f=l&&b=u&&_i.text||" ").join(""),r=[],o=0;for(;o=n&&t.cursor.rowz.column-P.column||P.row-z.row):["asm","reg","memory"].includes(C??"")&&w.sort((P,z)=>P.column-z.column||P.row-z.row);let A=w[Math.max(0,Number(d.occurrence??1)-1)];m=A?.row??-1,y=A?.column??-1,f=d.text.length}if(m<0||y<0||m>=t.height||y>=t.width)continue;let S=Math.max(0,Number(d.padding_cells??1)),b=Math.max(0,y-S)*i,_=Math.max(0,m-S)*l,p=Math.min(t.width-y+S,f+S*2)*i,c=Math.min(t.height-m+S,g+S*2)*l,h=s[u.tone??"danger"];if(o.strokeStyle=h,o.lineWidth=2,u.shape==="underline"?(o.beginPath(),o.moveTo(b,_+c-2),o.lineTo(b+p,_+c-2),o.stroke()):o.strokeRect(b+1,_+1,Math.max(1,p-2),Math.max(1,c-2)),u.label){o.font="700 10px system-ui, sans-serif";let w=o.measureText(u.label).width+8;o.fillStyle=h,o.fillRect(b+1,Math.max(0,_-15),w,14),o.fillStyle="#fff",o.fillText(u.label,b+5,Math.max(10,_-4))}}}function Wg(e){if(e.nativeEvent.isComposing||e.metaKey)return null;let n={Enter:"CR",Escape:"Esc",Backspace:"BS",Delete:"Del",Tab:"Tab",ArrowLeft:"Left",ArrowRight:"Right",ArrowUp:"Up",ArrowDown:"Down",Home:"Home",End:"End",PageUp:"PageUp",PageDown:"PageDown",Insert:"Insert"}[e.key]??(/^F\d{1,2}$/.test(e.key)?e.key:null),r=[e.ctrlKey?"C":"",e.altKey?"M":"",e.shiftKey&&n?"S":""].filter(Boolean).join("-");return n?`<${r?`${r}-`:""}${n}>`:e.key.length!==1?null:e.ctrlKey||e.altKey?`<${r}-${e.key==="<"?"lt":e.key}>`:e.key==="<"?"":e.key}function Gg({visible:e,syncMode:t,controlMode:n,expanded:r,fit:o,scale:i,onSummaryChange:l}){let s=(0,k.useRef)(null),u=(0,k.useRef)(null),d=(0,k.useRef)(null),m=(0,k.useRef)(0),y=(0,k.useRef)(0),g=(0,k.useRef)(0),f=(0,k.useRef)(gp()),S=(0,k.useRef)(null),b=(0,k.useRef)(null),_=(0,k.useRef)(null),p=(0,k.useRef)(0),c=(0,k.useRef)(null),h=(0,k.useRef)(null),[w,C]=(0,k.useState)(null),[A,P]=(0,k.useState)(!1),[z,U]=(0,k.useState)(0),[F,ae]=(0,k.useState)(!1),[me,q]=(0,k.useState)(()=>{let T=Number(localStorage.getItem("stem-card-nvim-height-vh"));return Number.isFinite(T)&&T>=25&&T<=90?T:75}),[V,Re]=(0,k.useState)({state:"hidden"}),[Se,J]=(0,k.useState)({state:"idle"}),at=Se.state==="replaying"||Se.state==="verifying",bt=t&&V.state==="connected"&&!at,Me=n&&F&&V.state==="connected"&&!at,ge=()=>{s.current&&Kg(s.current,f.current,_.current===b.current?.step.snapshot_ref?b.current?.step.view?.annotations??[]:[])},yr=()=>{m.current||(m.current=window.requestAnimationFrame(()=>{m.current=0,ge()}))};if((0,k.useEffect)(()=>{let T=D=>{let G=D.detail;b.current=G,C(G),_.current=null;let te=G.step.snapshot_ref;if(V.state!=="connected"&&te&&hp(G.step).then(Q=>{!Q||b.current?.step.snapshot_ref!==te||(f.current=Q,P(!0),_.current=te,J({state:"idle",snapshot_ref:te,message:"Pokazano ostatni zapisany, zweryfikowany ekran."}),ge())}),ge(),!G.activate)return;let st=G.step.mode??"RUN",xt=async()=>{if(!G.step.code_ref)return null;let Q=await fetch("/api/nvim/open",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({code_ref:G.step.code_ref,actor:document.documentElement.dataset.cardClientId??"browser"})}),Ae=await Q.json().catch(()=>({}));if(!Q.ok)throw new Error(Ae.message??Ae.error??`HTTP ${Q.status}`);return Ae};if(st==="CODE"||!te){xt().then(()=>{J({state:"ready",phase:"code",message:G.step.code_ref?`Otwarto ${G.step.code_ref}; program nie zosta\u0142 zrestartowany.`:"Krok CODE nie ma przypisanego code_ref."})}).catch(Q=>{J({state:"failed",phase:"code",message:Q instanceof Error?Q.message:String(Q)})});return}if(!e||V.state!=="connected"){J({state:"failed",snapshot_ref:te,message:"Cel jest offline; pozostaje zapisany wynik tego kroku."});return}let ze=xt(),oe=Math.max(p.current+1,Date.now());p.current=oe,c.current?.abort();let wt=new AbortController;c.current=wt,J({state:"replaying",phase:"dispatch",generation:oe,snapshot_ref:te,message:"Resetuj\u0119 cel i odtwarzam wykonanie do wybranego kroku."});let kn=0,Dt=async()=>{try{let Q=await fetch("/api/checkpoint/status",{cache:"no-store",signal:wt.signal});if(!Q.ok)return;let Ae=await Q.json(),ut=Ae.active?.generation===oe?Ae.active:null;if(!ut||p.current!==oe)return;J({state:ut.phase==="verify"?"verifying":"replaying",phase:ut.phase,generation:oe,snapshot_ref:te,message:ut.message})}catch{}};kn=window.setInterval(Dt,120),Dt(),ze.then(()=>fetch("/api/checkpoint/activate",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({snapshot_ref:te,generation:oe}),signal:wt.signal})).then(async Q=>{let Ae=await Q.json();if(p.current!==oe)return;if(!Q.ok||Ae.status!=="ready")throw new Error(Ae.message??`Replay zako\u0144czy\u0142 si\u0119 kodem HTTP ${Q.status}.`);let ut=d.current;if(ut?.readyState!==WebSocket.OPEN)throw new Error("Replay zako\u0144czony, ale most Neovima jest offline.");let Ne=y.current;ut.send(JSON.stringify({type:"refresh"}));let Ee=Date.now()+1800;for(;y.current<=Ne&&Date.now()window.setTimeout(kt,20));if(y.current<=Ne)throw new Error("Neovim nie potwierdzi\u0142 pe\u0142nego redraw po replay.");if(p.current!==oe)return;_.current=te,J({state:"ready",phase:Ae.phase,generation:oe,snapshot_ref:te,message:Ae.message??"Stan maszyny zosta\u0142 odtworzony i zweryfikowany."}),$g(te,f.current),ge(),await new Promise(kt=>window.requestAnimationFrame(()=>kt()));let vr=s.current;if(vr&&b.current?.step.snapshot_ref===te)try{fetch("/api/evidence",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:document.documentElement.dataset.cardClientId??"browser",snapshot_ref:te,event_id:G.step.event_id??null,strategy_ref:G.step.strategy_ref??null,code_ref:G.step.code_ref??null,caption:`${String(G.step.number).padStart(2,"0")} ${G.step.label}`,data_url:vr.toDataURL("image/png")})}).catch(()=>{})}catch{}}).catch(Q=>{wt.signal.aborted||p.current!==oe||(hp(G.step).then(Ae=>{!Ae||b.current?.step.snapshot_ref!==te||(f.current=Ae,P(!0),_.current=te,ge())}),J({state:"failed",generation:oe,snapshot_ref:te,message:Q instanceof Error?Q.message:String(Q)}))}).finally(()=>{window.clearInterval(kn),c.current===wt&&(c.current=null)})};return window.addEventListener("stem:nvim-step",T),()=>{window.removeEventListener("stem:nvim-step",T),c.current?.abort()}},[V.state,e]),(0,k.useEffect)(()=>{localStorage.setItem("stem-card-nvim-height-vh",me.toFixed(2))},[me]),(0,k.useEffect)(()=>{let T=window.requestAnimationFrame(ge);return()=>window.cancelAnimationFrame(T)},[r,o,i]),(0,k.useEffect)(()=>{let T=()=>{let D=d.current;D?.readyState===WebSocket.OPEN&&D.send(JSON.stringify({type:"refresh"})),ge()};return window.addEventListener("stem:nvim-refresh",T),()=>window.removeEventListener("stem:nvim-refresh",T)},[]),(0,k.useEffect)(()=>{let T=V.state;V.state==="connected"&&(T=Se.state==="idle"?"connected":Se.state),l({state:T,message:Se.message??V.message,instance:V.target?.instance??V.target?.container_name,detail:[V.target?.profile??w?.step.view?.connection_ref,w?`${String(w.step.number).padStart(2,"0")} ${w.step.label}`:void 0,Se.phase].filter(Boolean).join(" \xB7 "),syncMode:t,syncReady:bt,controlMode:n,controlEnabled:Me,screenCursor:{...f.current.cursor},grid:{columns:f.current.width,rows:f.current.height}})},[w,Se,Me,n,z,l,V,t,bt]),(0,k.useEffect)(()=>()=>window.clearTimeout(g.current),[]),(0,k.useEffect)(()=>{if(!Me)return;let T=D=>{let G=d.current;if(G?.readyState!==WebSocket.OPEN)return;if(D.altKey&&!D.ctrlKey&&!D.metaKey&&D.key.toLowerCase()==="w"){D.preventDefault(),D.stopImmediatePropagation(),D.repeat||G.send(JSON.stringify({type:"input",keys:""}));return}let te={ArrowLeft:"h",ArrowDown:"j",ArrowUp:"k",ArrowRight:"l"};D.altKey&&!D.ctrlKey&&!D.metaKey&&te[D.key]&&(D.preventDefault(),D.stopImmediatePropagation(),D.repeat||G.send(JSON.stringify({type:"input",keys:`${te[D.key]}`})))};return window.addEventListener("keydown",T,!0),()=>window.removeEventListener("keydown",T,!0)},[Me]),(0,k.useEffect)(()=>{if(!e||!t){d.current?.close(),d.current=null,ae(!1),Re(e?{state:"offline",message:"SYNC OFF: pokazuj\u0119 zapisany ekran bez po\u0142\u0105czenia z kontenerem."}:{state:"hidden"});return}let T=!1,D=0,G=()=>{if(T)return;let te=window.location.protocol==="https:"?"wss:":"ws:",st=new WebSocket(`${te}//${window.location.host}/api/nvim-ui`);d.current=st,Re({state:"connecting"}),st.addEventListener("message",xt=>{try{let ze=JSON.parse(String(xt.data));if(ze.type==="status"){typeof ze.epoch=="string"&&S.current&&S.current!==ze.epoch&&(f.current=gp(),P(!1),_.current=null),typeof ze.epoch=="string"&&(S.current=ze.epoch),Re(ze);return}ze.type==="redraw"&&Array.isArray(ze.events)&&(Vg(f.current,ze.events),f.current.width>1&&f.current.height>1&&P(!0),ze.events.some(oe=>Array.isArray(oe)&&oe[0]==="flush")&&(y.current+=1,yr(),g.current||(g.current=window.setTimeout(()=>{g.current=0,U(oe=>oe+1)},120))))}catch{}}),st.addEventListener("close",()=>{d.current===st&&(d.current=null),T||(D=window.setTimeout(G,1200))}),st.addEventListener("error",()=>{Re(xt=>({...xt,state:"offline",message:"Most Neovima jest chwilowo niedost\u0119pny."}))})};return G(),()=>{T=!0,window.clearTimeout(D),window.cancelAnimationFrame(m.current),m.current=0,d.current?.close(),d.current=null}},[t,e]),!e)return null;let se=T=>{let D=d.current;D?.readyState===WebSocket.OPEN&&D.send(JSON.stringify(T))},Zt=T=>{let D=T.currentTarget.getBoundingClientRect();return{row:Math.max(0,Math.min(f.current.height-1,Math.floor((T.clientY-D.top)/D.height*f.current.height))),column:Math.max(0,Math.min(f.current.width-1,Math.floor((T.clientX-D.left)/D.width*f.current.width)))}},ue=T=>[T.shiftKey?"S":"",T.ctrlKey?"C":"",T.altKey?"A":""].filter(Boolean).join("-");return(0,a.jsxs)("section",{className:"nvim-panel","aria-label":"Neovim po\u0142\u0105czony z kontenerem",onWheel:T=>{T.stopPropagation();let D=T.target;(!(D instanceof Element)||!D.closest(".nvim-screen-scroll"))&&T.preventDefault()},children:[(0,a.jsxs)("div",{ref:u,className:"nvim-screen-scroll",style:o?void 0:{height:`${r?90:me}vh`},"data-sync":t?"on":"off","data-control":Me?"true":"false",tabIndex:0,onPointerEnter:T=>{ae(!0),T.currentTarget.focus({preventScroll:!0})},onPointerLeave:T=>{ae(!1),T.currentTarget.blur()},onMouseDown:T=>T.currentTarget.focus({preventScroll:!0}),onKeyDown:T=>{if(!Me)return;let D=Wg(T);D&&(T.preventDefault(),T.stopPropagation(),se({type:"input",keys:D}))},children:[(0,a.jsx)("div",{className:"nvim-screen-stage",style:o?void 0:{height:`${(r?90:me)/Math.max(i,.25)}vh`},children:(0,a.jsx)("div",{className:"nvim-screen-surface",children:(0,a.jsx)("div",{className:"nvim-screen-frame",children:(0,a.jsx)("div",{className:"nvim-screen-content",children:(0,a.jsx)("div",{className:"nvim-screen-grid",children:(0,a.jsx)("canvas",{ref:s,className:"nvim-screen",tabIndex:-1,"aria-label":Me?"Interaktywny ekran Neovima":"Ekran Neovima",onMouseDown:T=>{if(!Me||V.state!=="connected")return;T.preventDefault();let D=Zt(T),G=T.button===1?"middle":T.button===2?"right":"left";se({type:"mouse",button:G,action:"press",modifier:ue(T),...D})},onMouseUp:T=>{if(!Me||V.state!=="connected")return;T.preventDefault();let D=Zt(T),G=T.button===1?"middle":T.button===2?"right":"left";se({type:"mouse",button:G,action:"release",modifier:ue(T),...D})},onWheel:T=>{if(!Me||V.state!=="connected")return;T.preventDefault();let D=Zt(T);se({type:"mouse",button:"wheel",action:T.deltaY<0?"up":"down",modifier:ue(T),...D})},onContextMenu:T=>Me&&T.preventDefault()})})})})})}),!A&&(0,a.jsxs)("div",{className:"nvim-screen-empty",children:[(0,a.jsx)("strong",{children:_p[V.state]}),(0,a.jsx)("span",{children:V.message??"Oczekiwanie na ekran Neovima lub zapisany stan kroku."})]})]}),(0,a.jsx)("div",{className:"nvim-resize-handle",role:"separator","aria-label":"Zmie\u0144 wysoko\u015B\u0107 panelu Neovima","aria-orientation":"horizontal","aria-valuemin":25,"aria-valuemax":90,"aria-valuenow":Math.round(me),tabIndex:0,title:"Przeci\u0105gnij, aby zmieni\u0107 wysoko\u015B\u0107. Dwuklik: 75%.",onPointerDown:T=>{T.preventDefault(),h.current={y:T.clientY,heightVh:me},T.currentTarget.setPointerCapture(T.pointerId)},onPointerMove:T=>{let D=h.current;if(!D)return;let G=(T.clientY-D.y)/window.innerHeight*100;q(Math.max(25,Math.min(90,D.heightVh+G)))},onPointerUp:T=>{h.current=null,T.currentTarget.hasPointerCapture(T.pointerId)&&T.currentTarget.releasePointerCapture(T.pointerId)},onPointerCancel:()=>{h.current=null},onDoubleClick:()=>q(75),onKeyDown:T=>{if(T.key==="ArrowUp"||T.key==="ArrowDown"){T.preventDefault();let D=T.key==="ArrowUp"?-2:2;q(G=>Math.max(25,Math.min(90,G+D)))}else T.key==="Home"&&(T.preventDefault(),q(75))}})]})}function Yg({column:e,row:t}){return e==="chapter"||e==="task"||e==="version"?(0,a.jsx)("td",{children:(0,a.jsx)("code",{children:t[e]})}):e==="idea"?(0,a.jsx)("td",{dangerouslySetInnerHTML:{__html:t.idea_html}}):e==="status"?(0,a.jsx)("td",{children:(0,a.jsx)("span",{className:"scope-status","data-status":t.status,title:t.status,children:t.status_label})}):(0,a.jsx)("td",{children:t[e]})}function Qg({front:e}){let t=e.scope_columns??["chapter","task","idea","priority"];return(0,a.jsxs)(bs,{header:e.header_html,footer:e.footer_html,left:e.left_margin_html,right:e.right_margin_html,className:"front-sheet",children:[(0,a.jsxs)("section",{className:"front-scope front-goal",children:[(0,a.jsx)("h2",{children:e.goal_title}),(0,a.jsx)(Ft,{html:e.goal_html})]}),(0,a.jsxs)("section",{className:"front-scope front-card-scope",children:[(0,a.jsx)("h2",{children:e.scope_title}),e.scope_html&&(0,a.jsx)(Ft,{html:e.scope_html}),(0,a.jsx)("div",{className:"scope-table-wrap",children:(0,a.jsxs)("table",{className:"scope-table scope-table--task",children:[(0,a.jsx)("thead",{children:(0,a.jsx)("tr",{children:e.scope_headers.map(n=>(0,a.jsx)("th",{children:n},n))})}),(0,a.jsx)("tbody",{children:e.scope_rows.map(n=>(0,a.jsx)("tr",{className:n.key?"scope-row--key":"",children:t.map(r=>(0,a.jsx)(Yg,{column:r,row:n},r))},`${n.chapter}-${n.task}`))})]})})]})]})}function qg({taskRef:e,step:t}){return(0,a.jsxs)("li",{id:`${e}-${t.id}`,children:[(0,a.jsx)("strong",{children:t.title}),(0,a.jsx)(Ft,{html:t.content_html})]})}function Xg({taskRef:e,block:t}){let n=t.kind==="exercise"?"\u0106wiczenie":"Block";return(0,a.jsxs)("section",{className:`task-block task-block--${t.kind}`,id:`${e}-${t.id}`,"data-stem-nav":"block",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("span",{children:n}),(0,a.jsx)("h4",{children:t.title})]}),(0,a.jsx)(Ft,{html:t.content_html}),t.steps.length>0&&(0,a.jsx)("ol",{className:"block-steps",children:t.steps.map(r=>(0,a.jsx)(qg,{taskRef:e,step:r},r.id))})]})}function Zg({task:e}){return e.flow.length?(0,a.jsxs)("article",{className:"task-flow",id:e.ref,"data-stem-nav":"task",children:[(0,a.jsxs)("header",{className:"task-flow-header",children:[(0,a.jsx)("span",{children:e.ref.toUpperCase()}),(0,a.jsx)("h3",{children:e.title}),e.uuid&&(0,a.jsx)("code",{children:e.uuid})]}),e.flow.map(t=>(0,a.jsx)(Xg,{taskRef:e.ref,block:t},t.id)),(0,a.jsxs)("footer",{children:[(0,a.jsx)("strong",{children:"Task acceptance:"})," ",e.criterion]})]}):(0,a.jsxs)("article",{className:"task-legacy",id:e.ref,"data-stem-nav":"task",children:[(0,a.jsx)("strong",{children:e.ref.toUpperCase()}),(0,a.jsx)(Ft,{html:e.prompt_html??""}),(0,a.jsxs)("footer",{children:[(0,a.jsx)("strong",{children:"Task acceptance:"})," ",e.criterion]})]})}var yp={compile:"KOMPILACJA",bss:".BSS",stack:"STOS",registers:"REJESTRY",text:".TEXT"},vp=["#9bcfe2","#c4dfc0","#f4c889","#d2b6dc"];function Jg({config:e,title:t}){let n=e.arena_size??64,r=e.allocations??[5,7],o=e.symbols??[],i=`${e.storage_key??"allocator-memory-flow"}-stage`,[l,s]=(0,k.useState)(()=>Math.min(r.length,Number(localStorage.getItem(i)??0))),[u,d]=(0,k.useState)(o[0]?.id??"");(0,k.useEffect)(()=>localStorage.setItem(i,String(l)),[l,i]);let m=r.slice(0,l).reduce((_,p)=>_+p,0),y=o.find(_=>_.id===u)??o[0],g=Array.from({length:n},(_,p)=>p),f=_=>{let p=0;for(let c=0;co.some(p=>p.area===_));return(0,a.jsxs)("div",{className:"memory-react","aria-label":`Interaktywny diagram: ${t}`,children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"INTERAKTYWNY MODEL PAMI\u0118CI"}),(0,a.jsx)("h3",{children:t})]}),(0,a.jsxs)("div",{className:"memory-actions",children:[(0,a.jsx)("button",{"aria-pressed":l===0,onClick:()=>s(0),children:"definicje / reset"}),r.map((_,p)=>(0,a.jsxs)("button",{"aria-pressed":l===p+1,onClick:()=>s(p+1),children:["alloc(",_,")"]},`${_}-${p}`))]})]}),(0,a.jsx)("div",{className:"memory-lanes",children:b.map(_=>(0,a.jsxs)("section",{className:`memory-lane ${_}`,children:[(0,a.jsx)("b",{children:yp[_]}),o.filter(p=>p.area===_).map(p=>(0,a.jsx)("button",{className:u===p.id?"active":"",onClick:()=>d(p.id),children:(0,a.jsx)("code",{children:p.declaration})},p.id))]},_))}),(0,a.jsxs)("div",{className:"arena-wrap",children:[(0,a.jsxs)("div",{className:"arena-label",children:[(0,a.jsxs)("code",{children:["allocbuf[",n,"]"]}),(0,a.jsxs)("span",{children:["u\u017Cyte ",m," B / wolne ",n-m," B"]})]}),(0,a.jsxs)("div",{className:"arena",style:{"--allocp":m,"--arena-size":n},children:[g.map(_=>{let p=f(_);return(0,a.jsx)("i",{style:p>=0?{background:vp[p%vp.length]}:void 0},_)}),(0,a.jsxs)("span",{className:"allocp",children:["allocp \u2191 ",m]})]})]}),(0,a.jsxs)("p",{className:"memory-stage",children:[(0,a.jsxs)("strong",{children:[l+1,"/",r.length+1]})," ",(0,a.jsx)("code",{children:S})]}),y&&(0,a.jsxs)("aside",{className:"memory-inspector",children:[(0,a.jsx)("strong",{children:y.id}),(0,a.jsx)("code",{children:y.declaration}),(0,a.jsx)("span",{children:y.description})]})]})}function eh({config:e,asset:t,progress:n,onSetStatus:r}){let o=e.stages??[],i=`${e.storage_key??t.label}-uml-stage`,l=(0,k.useRef)(null),[s,u]=(0,k.useState)(""),[d,m]=(0,k.useState)(!1),[y,g]=(0,k.useState)(!1),[f,S]=(0,k.useState)(()=>Math.max(0,Math.min(o.length-1,Number(localStorage.getItem(i)??0))));(0,k.useEffect)(()=>localStorage.setItem(i,String(f)),[f,i]),(0,k.useEffect)(()=>{let c=!0;return m(!1),fetch(t.href,{cache:"no-store"}).then(h=>{if(!h.ok)throw new Error(`HTTP ${h.status}`);return h.text()}).then(h=>{let w=new DOMParser().parseFromString(h,"image/svg+xml"),C=w.documentElement;if(C.nodeName.toLowerCase()!=="svg"||w.querySelector("parsererror"))throw new Error("Niepoprawny SVG");w.querySelectorAll("script, foreignObject").forEach(A=>A.remove()),zp(C,t.tile),c&&u(C.outerHTML)}).catch(()=>{c&&m(!0)}),()=>{c=!1}},[t.href,t.tile]),(0,k.useEffect)(()=>{let c=l.current?.querySelector("svg");if(!c)return;c.setAttribute("role","img"),c.setAttribute("aria-label",t.alt),c.querySelectorAll("[data-uml-stage]").forEach(C=>{C.classList.remove("uml-stage-region","uml-stage-region-bg","uml-stage-region-outline","uml-stage-region-active","uml-stage-region-completed"),C.removeAttribute("data-uml-stage"),C.removeAttribute("data-uml-stage-label"),C.removeAttribute("role"),C.removeAttribute("tabindex"),C.removeAttribute("aria-label")});let h=Array.from(c.querySelectorAll("text")),w=Array.from(c.querySelectorAll("rect"));o.forEach((C,A)=>{if(!C.svg_label)return;let P=h.find(q=>(q.textContent??"").trim().startsWith(C.svg_label)),z=Number(P?.getAttribute("y"));if(!P||!Number.isFinite(z))return;let U=w.map(q=>{let V=Number(q.getAttribute("y")),Re=Number(q.getAttribute("height")),Se=Number(q.getAttribute("width")),J=q.getAttribute("style")??"",at=Number(J.match(/stroke-width:\s*([\d.]+)/)?.[1]??q.getAttribute("stroke-width")??0);return{rect:q,y:V,height:Re,width:Se,strokeWidth:at,area:Se*Re}}).filter(({y:q,height:V,width:Re,strokeWidth:Se})=>Number.isFinite(q)&&Number.isFinite(V)&&Number.isFinite(Re)&&Se>=2&&q<=z&&q+V>=z).sort((q,V)=>q.area-V.area),F=U[0];if(!F)return;let ae=U.filter(({y:q,height:V,width:Re})=>Math.abs(q-F.y)<.1&&Math.abs(V-F.height)<.1&&Math.abs(Re-F.width)<.1),me=!!(C.progress_id&&n?.items?.[C.progress_id]?.status==="approved");ae.forEach(({rect:q},V)=>{let Re=q.getAttribute("fill")!=="none";q.dataset.umlStage=String(A),q.dataset.umlStageLabel=C.label,q.classList.add("uml-stage-region",Re?"uml-stage-region-bg":"uml-stage-region-outline"),q.classList.toggle("uml-stage-region-active",A===f),q.classList.toggle("uml-stage-region-completed",me),V===0&&(q.setAttribute("role","button"),q.setAttribute("tabindex","0"),q.setAttribute("aria-label",`Poka\u017C etap ${C.label}`))})})},[t.alt,n,f,o,s]);let b=(c,h)=>{let w=l.current?.querySelector("svg");if(!w)return;let C=Array.from(w.querySelectorAll(".uml-stage-region-bg[data-uml-stage]")).filter(P=>{let z=P.getBoundingClientRect();return c>=z.left&&c<=z.right&&h>=z.top&&h<=z.bottom}).sort((P,z)=>{let U=P.getBoundingClientRect(),F=z.getBoundingClientRect();return U.width*U.height-F.width*F.height})[0],A=Number(C?.dataset.umlStage);Number.isInteger(A)&&S(A)},_=c=>{if(c.key!=="Enter"&&c.key!==" ")return;let h=c.target,w=Number(h.dataset?.umlStage);Number.isInteger(w)&&(c.preventDefault(),S(w))},p=o[f];return(0,a.jsxs)("div",{className:"uml-react",children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"KANONICZNY DIAGRAM UML \xB7 PLANTUML"}),(0,a.jsx)("h3",{children:"Reset i dwa przydzia\u0142y liniowe"})]}),(0,a.jsx)("div",{className:"uml-actions",children:o.map((c,h)=>(0,a.jsxs)("button",{"aria-pressed":f===h,"data-completed":c.progress_id&&n?.items?.[c.progress_id]?.status==="approved"?"true":"false",onClick:()=>S(h),children:[c.progress_id&&n?.items?.[c.progress_id]?.status==="approved"&&(0,a.jsx)("span",{"aria-hidden":"true",children:"\u2713 "}),c.label]},c.id))})]}),(0,a.jsxs)("div",{ref:l,className:"uml-canvas",onClick:c=>b(c.clientX,c.clientY),onKeyDown:_,children:[s?(0,a.jsx)("div",{className:`uml-svg-host${t.tile?" is-tiled":""}`,style:vs(t.tile),dangerouslySetInnerHTML:{__html:s}}):(0,a.jsx)("img",{src:t.href,alt:t.alt}),d&&(0,a.jsx)("span",{className:"uml-inline-warning",children:"Widok statyczny \u2014 nie uda\u0142o si\u0119 wczyta\u0107 interaktywnego SVG."})]}),p&&(0,a.jsxs)("aside",{className:"uml-stage",children:[(0,a.jsx)("strong",{children:p.label}),(0,a.jsx)("span",{children:p.description}),p.code_ref&&(0,a.jsx)("code",{children:p.code_ref})]}),p?.progress_id&&(0,a.jsxs)("footer",{className:"uml-approval",children:[(0,a.jsx)("span",{children:n?.items?.[p.progress_id]?.status==="approved"?"Ten stan jest zatwierdzony i zapisany w JSON-ie zaj\u0119\u0107.":"Kursor wybiera stan; zatwierdzenie zapisuje go w JSON-ie zaj\u0119\u0107."}),(0,a.jsx)("button",{disabled:!n||y,onClick:async()=>{if(!p.progress_id||!n)return;let c=n.items?.[p.progress_id]?.status==="approved";g(!0);try{await r(p.progress_id,c?"pending":"approved")}finally{g(!1)}},children:y?"Zapisywanie\u2026":n?.items?.[p.progress_id]?.status==="approved"?"Cofnij zatwierdzenie":"Zatwierd\u017A stan"})]})]})}function th({config:e,asset:t,progress:n,onSetStatus:r,continuation:o}){let i=e.phases??[],l=i.flatMap(v=>v.steps.map(x=>({phase:v,step:x}))),s=`${e.storage_key??t.label}-uml-step`,u=`${e.storage_key??t.label}-navigation-level`,d=(0,k.useRef)(null),m=(0,k.useRef)(null),y=(0,k.useRef)(new Map),g=(0,k.useRef)(null),f=(0,k.useRef)(0),S=(0,k.useRef)(!1),b=(0,k.useRef)(null),_=(0,k.useRef)(!0),[p,c]=(0,k.useState)(""),[h,w]=(0,k.useState)(!1),[C,A]=(0,k.useState)(!1),[P,z]=(0,k.useState)(null),[U,F]=(0,k.useState)(null),[ae,me]=(0,k.useState)(!1),[q,V]=(0,k.useState)(""),[Re,Se]=(0,k.useState)(!1),[J,at]=(0,k.useState)(null),[bt,Me]=(0,k.useState)([]),[ge,yr]=(0,k.useState)(0),[se,Zt]=(0,k.useState)(()=>Math.max(0,Math.min(l.length-1,Number(localStorage.getItem(s)??0)))),[ue,T]=(0,k.useState)(()=>{let v=localStorage.getItem(u);return v==="card"||v==="task"||v==="block"||v==="phase"||v==="step"||v==="snapshot"?v:"step"});(0,k.useEffect)(()=>localStorage.setItem(s,String(se)),[se,s]),(0,k.useEffect)(()=>localStorage.setItem(u,ue),[ue,u]),(0,k.useEffect)(()=>{let v=!0;return w(!1),fetch(t.href,{cache:"no-store"}).then(x=>{if(!x.ok)throw new Error(`HTTP ${x.status}`);return x.text()}).then(x=>{let R=new DOMParser().parseFromString(x,"image/svg+xml"),M=R.documentElement;if(M.nodeName.toLowerCase()!=="svg"||R.querySelector("parsererror"))throw new Error("Niepoprawny SVG");R.querySelectorAll("script, foreignObject").forEach($=>$.remove()),zp(M,t.tile),v&&c(M.outerHTML)}).catch(()=>{v&&w(!0)}),()=>{v=!1}},[t.href,t.tile]),(0,k.useEffect)(()=>{let v=!0,x=hs(t,e);if(V("Wczytywanie uk\u0142adu\u2026"),Se(!1),!t.source_href)return z(x),F(x),V("Brak \u017Ar\xF3d\u0142a PlantUML \u2014 zapis wy\u0142\u0105czony."),()=>{v=!1};let R=t.source_href.replace(/\.puml(?:\?.*)?$/,".layout.json");return fetch(`/api/uml-layout?source=${encodeURIComponent(t.source_href)}`,{cache:"no-store"}).then(async M=>{if(!M.ok)throw new Error(`HTTP ${M.status}`);return M.json()}).catch(async()=>{let M=await fetch(R,{cache:"no-store"});return M.ok?{layout:await M.json(),source_digest:"",stale:!1}:{layout:null,source_digest:"",stale:!1}}).then(M=>{if(!v)return;let $=M.layout??hs(t,e,M.source_digest??"");z($),F($),me(!1),Se(!!M.stale),V(M.layout?"Uk\u0142ad wczytany z JSON.":"Uk\u0142ad PlantUML \u2014 brak r\u0119cznych zmian.")}).catch(M=>{v&&(z(x),F(x),V(`Nie wczytano uk\u0142adu: ${M instanceof Error?M.message:String(M)}`))}),()=>{v=!1}},[t.source_href,t.label,e.block?.id,e.task?.id]),(0,k.useEffect)(()=>{let v=m.current?.querySelector("svg");if(!v||!U)return;_g(v);let x=new Map(l.map(({step:j})=>[String(j.number).padStart(2,"0"),j.id])),R=Cg(v,x),M=new Map(R.map(j=>[j.id,j]));y.current=M;let $=R.map(j=>j.id);Me(j=>j.join("\0")===$.join("\0")?j:$),R.forEach(j=>{let E=U.elements[j.id];E&&Lg(j,E)});let H=v.viewBox.baseVal;(U.canvas.width<=0||U.canvas.height<=0)&&F(j=>j&&{...j,canvas:{...j.canvas,width:H?.width||Number(v.getAttribute("width")?.replace("px",""))||0,height:H?.height||Number(v.getAttribute("height")?.replace("px",""))||0}})},[l,p,U]),(0,k.useEffect)(()=>{let v=m.current?.querySelector("svg");if(!v)return;let x=e.kind==="uml-class"&&v.contains(document.activeElement);v.setAttribute("role","img"),v.setAttribute("aria-label",t.alt),v.classList.toggle("uml-class-svg",e.kind==="uml-class"),v.classList.toggle("uml-class-svg-active",e.kind==="uml-class"&&ue!=="card"),v.querySelectorAll(".uml-step-hit, .uml-class-focus-region").forEach(N=>N.remove()),v.querySelectorAll("[data-uml-step-element]").forEach(N=>{N.classList.remove("uml-step-element","uml-step-element-active","uml-step-element-completed","uml-step-element-tone-a","uml-step-element-tone-b"),N.removeAttribute("data-uml-step-element"),N.removeAttribute("data-uml-step-claim-area")});let R=Array.from(v.querySelectorAll("text")),M=Array.from(v.querySelectorAll("line")),$=Array.from(v.querySelectorAll("polygon"));if(e.kind==="uml-class"){let N=W=>W?Eg(W):null,I=W=>{if(!W.length)return null;let B=Math.min(...W.map(ee=>ee.x)),he=Math.min(...W.map(ee=>ee.y)),ce=Math.max(...W.map(ee=>ee.x+ee.width)),Z=Math.max(...W.map(ee=>ee.y+ee.height));return{x:B,y:he,width:ce-B,height:Z-he}},K=Array.from(v.querySelectorAll("g > *")),re=Array.from(v.querySelectorAll("[id]"));l.forEach(({step:W},B)=>{let he=W.svg_label??String(W.number).padStart(2,"0"),ce=R.find(ye=>(ye.textContent??"").trim().startsWith(he));if(!ce)return;let Z=N(ce);if(!Z)return;let ee=Number(ce.getAttribute("y")),He=R.filter(ye=>Number.isFinite(ee)&&Math.abs(Number(ye.getAttribute("y"))-ee)<.8),Ie=W.svg_target?re.find(ye=>ye.id===W.svg_target||ye.id.startsWith(`${W.svg_target}-`))??null:null,Ke=N(Ie)??I(He.map(ye=>N(ye)).filter(ye=>ye!==null))??Z,St=Ie?.tagName.toLowerCase()==="rect",br=Ie?[Ie,ce]:He;St&&K.forEach(ye=>{let Jt=N(ye);if(!Jt||ye===Ie)return;let ws=Jt.x+Jt.width/2,ks=Jt.y+Jt.height/2;ws>=Ke.x&&ws<=Ke.x+Ke.width&&ks>=Ke.y&&ks<=Ke.y+Ke.height&&br.push(ye)});let Ip=!!(W.progress_id&&n?.items?.[W.progress_id]?.status==="approved"),xs=Math.max(1,Ke.width*Ke.height);br.forEach(ye=>{let Jt=Number(ye.dataset.umlStepClaimArea);Number.isFinite(Jt)&&Jt{let K=N.svg_label??String(N.number).padStart(2,"0"),re=R.find(ee=>(ee.textContent??"").trim()===K),W=Number(re?.getAttribute("y"));if(!re||!Number.isFinite(W))return;let B=W+5,he=!!(N.progress_id&&n?.items?.[N.progress_id]?.status==="approved"),ce=R.filter(ee=>Math.abs(Number(ee.getAttribute("y"))-W)<.8);ce.push(...M.filter(ee=>{let He=Number(ee.getAttribute("y1")),Ie=Number(ee.getAttribute("y2"));return Number.isFinite(He)&&Number.isFinite(Ie)&&Math.abs(He-Ie)<.8&&Math.abs((He+Ie)/2-B)<=14})),ce.push(...$.filter(ee=>{let He=(ee.getAttribute("points")??"").trim().split(/\s+/).map(St=>Number(St.split(",")[1])).filter(Number.isFinite);if(!He.length)return!1;let Ie=Math.min(...He),Ke=Math.max(...He);return Ke-Ie<=16&&Math.abs((Ie+Ke)/2-B)<=14})),ce.forEach(ee=>{ee.dataset.umlStepElement=String(I),ee.classList.add("uml-step-element"),ee.classList.toggle("uml-step-element-active",I===se),ee.classList.toggle("uml-step-element-completed",he)});let Z=document.createElementNS("http://www.w3.org/2000/svg","rect");Z.setAttribute("x",String(j)),Z.setAttribute("y",String(W-12)),Z.setAttribute("width",String(E)),Z.setAttribute("height","31"),Z.setAttribute("fill","transparent"),Z.setAttribute("pointer-events","all"),Z.setAttribute("role","button"),Z.setAttribute("tabindex","0"),Z.setAttribute("aria-label",`Poka\u017C krok ${String(N.number).padStart(2,"0")}: ${N.label}`),Z.dataset.umlStep=String(I),Z.classList.add("uml-step-hit"),Z.classList.toggle("uml-step-hit-active",ue!=="card"&&I===se),Z.classList.toggle("uml-step-hit-completed",he),v.appendChild(Z)})},[t.alt,e.kind,l,ue,n,se,p,U]),(0,k.useEffect)(()=>{let v=m.current?.querySelector("svg");if(v&&(v.querySelectorAll(".uml-layout-hit,.uml-layout-resize").forEach(x=>x.remove()),v.classList.toggle("uml-layout-editing",C),!(!C||!U)))for(let x of y.current.values()){let R=U.elements[x.id]??mo(x),M=document.createElementNS("http://www.w3.org/2000/svg","rect");M.setAttribute("x",String(R.x)),M.setAttribute("y",String(R.y)),M.setAttribute("width",String(Math.max(12,R.width))),M.setAttribute("height",String(Math.max(12,R.height))),M.setAttribute("tabindex","0"),M.setAttribute("role","button"),M.setAttribute("aria-label",`Edytuj element UML ${x.id}`),M.dataset.umlLayoutId=x.id,M.dataset.umlLayoutAction="move",M.classList.add("uml-layout-hit"),x.id===J&&M.classList.add("is-selected");let $=document.createElementNS("http://www.w3.org/2000/svg","title");if($.textContent=`${x.id} \xB7 przeci\u0105gnij, aby zmieni\u0107 po\u0142o\u017Cenie`,M.appendChild($),v.appendChild(M),x.id===J){let H=Math.max(8,Math.min(14,Math.min(R.width,R.height)*.1)),j=document.createElementNS("http://www.w3.org/2000/svg","rect");j.setAttribute("x",String(R.x+R.width-H/2)),j.setAttribute("y",String(R.y+R.height-H/2)),j.setAttribute("width",String(H)),j.setAttribute("height",String(H)),j.dataset.umlLayoutId=x.id,j.dataset.umlLayoutAction="resize",j.classList.add("uml-layout-resize"),v.appendChild(j)}}},[p,C,U,J,bt]),(0,k.useEffect)(()=>{C&&(!J||!y.current.has(J))&&at(bt[0]??null)},[C,bt,J]),(0,k.useEffect)(()=>{if(ge===0||f.current===ge)return;let v=!1,x=0,R=$=>{if(v)return;let H=m.current?.querySelector(`.uml-step-hit[data-uml-step="${se}"]`);if(!H)return;if(document.querySelector(".viewer-chrome")?.classList.contains("is-nvim-fit")){f.current=ge;return}let E=Lp(H);if(!E){f.current=ge;return}let N=xg(H);if(!N){let re=Sg(H,E),W=re===0?pp(H,E):0,B=re===0?dp(H,W):re;if($Dn){x=window.requestAnimationFrame(()=>R($+1));return}f.current=ge;return}let I=pp(H,N);if(Math.abs(I)<=Dn){f.current=ge;return}let K=dp(H,I);if($Dn){x=window.requestAnimationFrame(()=>R($+1));return}f.current=ge},M=window.requestAnimationFrame(()=>R(0));return()=>{v=!0,window.cancelAnimationFrame(M),window.cancelAnimationFrame(x)}},[ge,se,p]);let D=(v,x,R=ue,M=!0)=>{let $={task:e.task??null,block:e.block??null,phase:{id:v.phase.id,label:v.phase.label},step:v.step,focusLevel:R,activate:x&&document.documentElement.dataset.nvimSyncMode==="on"},H=()=>{window.dispatchEvent(new CustomEvent("stem:nvim-step",{detail:$}))};if(!M){H();return}let j=fetch("/api/navigation/current",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({task:$.task,block:$.block,phase:$.phase,step:{id:$.step.id,number:$.step.number,label:$.step.label,mode:$.step.mode??($.step.snapshot_ref?"RUN":"CODE"),code_ref:$.step.code_ref??null,event_id:$.step.event_id??null,strategy_ref:$.step.strategy_ref??null},snapshot_ref:$.step.snapshot_ref??null,focus_level:$.focusLevel,sync_requested:!!$.activate,actor:document.documentElement.dataset.cardClientId??"browser"})});$.activate?j.then(H,H):(H(),j.catch(()=>{}))},G=(v,x=!1,R=ue,M=!0)=>{let $=Math.max(0,Math.min(l.length-1,v)),H=l[$];if(H){if(T(R),$===se){D(H,x,R,M);return}yr(j=>j+1),S.current=x,b.current=R,_.current=M,Zt($)}},te=(v,x)=>{let R=m.current?.querySelector("svg"),M=R?.getScreenCTM();if(!R||!M)return null;let $=R.createSVGPoint();return $.x=v,$.y=x,$.matrixTransform(M.inverse())},st=v=>{if(!C||!U)return;let x=v.target?.closest(".uml-layout-hit[data-uml-layout-id],.uml-layout-resize[data-uml-layout-id]"),R=x?.dataset.umlLayoutId,M=R?y.current.get(R):null,$=te(v.clientX,v.clientY);if(!R||!M||!$)return;v.preventDefault(),v.stopPropagation();let H=U.elements[R]??mo(M);g.current={id:R,action:x?.dataset.umlLayoutAction==="resize"?"resize":"move",pointerId:v.pointerId,startX:$.x,startY:$.y,initial:H},at(R),F(j=>j&&{...j,elements:{...j.elements,[R]:H}}),v.currentTarget.setPointerCapture(v.pointerId)},xt=v=>{let x=g.current;if(!x||x.pointerId!==v.pointerId)return;let R=te(v.clientX,v.clientY);if(!R)return;v.preventDefault();let M=R.x-x.startX,$=R.y-x.startY,H=x.action==="resize"?{...x.initial,width:Math.max(24,x.initial.width+M),height:Math.max(18,x.initial.height+$)}:{...x.initial,x:x.initial.x+M,y:x.initial.y+$};F(j=>j&&{...j,elements:{...j.elements,[x.id]:H}}),me(!0)},ze=v=>{let x=g.current;!x||x.pointerId!==v.pointerId||(g.current=null,v.currentTarget.hasPointerCapture(v.pointerId)&&v.currentTarget.releasePointerCapture(v.pointerId))},oe=(v,x)=>{let R=y.current.get(v);R&&(F(M=>{if(!M)return M;let $=M.elements[v]??mo(R);return{...M,elements:{...M.elements,[v]:x($)}}}),me(!0))},wt=async()=>{if(!U||!t.source_href)return;let v=Object.fromEntries(Array.from(y.current.values()).map(R=>[R.id,U.elements[R.id]??mo(R)])),x={...U,elements:v};V("Zapisywanie uk\u0142adu\u2026");try{let R=await fetch("/api/uml-layout",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({source:t.source_href,layout:x,actor:document.documentElement.dataset.cardClientId??"browser"})});if(!R.ok)throw new Error((await R.json().catch(()=>null))?.message??`HTTP ${R.status}`);let M=await R.json();z(M.layout),F(M.layout),me(!1),Se(!1),V(`Zapisano ${Object.keys(M.layout.elements).length} element\xF3w w JSON.`)}catch(R){V(`B\u0142\u0105d zapisu: ${R instanceof Error?R.message:String(R)}`)}},kn=()=>{P&&(F(P),me(!1),V("Przywr\xF3cono ostatnio zapisany uk\u0142ad."))},Dt=async()=>{if(!(!t.source_href||!window.confirm("Usun\u0105\u0107 r\u0119czny uk\u0142ad i wr\xF3ci\u0107 do geometrii PlantUML?"))){V("Resetowanie uk\u0142adu\u2026");try{let v=await fetch(`/api/uml-layout?source=${encodeURIComponent(t.source_href)}&actor=${encodeURIComponent(document.documentElement.dataset.cardClientId??"browser")}`,{method:"DELETE"});if(!v.ok)throw new Error(`HTTP ${v.status}`);let x=hs(t,e,P?.source_digest??"");z(x),F(x),me(!1),at(null),V("Przywr\xF3cono automatyczny uk\u0142ad PlantUML.")}catch(v){V(`B\u0142\u0105d resetu: ${v instanceof Error?v.message:String(v)}`)}}},Q=(v,x)=>{if(C)return;let R=Array.from(m.current?.querySelectorAll(".uml-step-hit[data-uml-step]")??[]).filter($=>{let H=$.getBoundingClientRect();return v>=H.left&&v<=H.right&&x>=H.top&&x<=H.bottom}).sort(($,H)=>{let j=$.getBoundingClientRect(),E=H.getBoundingClientRect();return Math.abs(x-(j.top+j.bottom)/2)-Math.abs(x-(E.top+E.bottom)/2)}),M=Number(R[0]?.dataset.umlStep);Number.isInteger(M)&&G(M,!1,"step")},Ae=v=>{if(C||v.key!=="Enter"&&v.key!==" ")return;let x=v.target,R=Number(x.dataset?.umlStep);Number.isInteger(R)&&(v.preventDefault(),G(R,v.key==="Enter","step"))},ut=v=>{let x=l.findIndex(R=>R.phase.id===v.id);x>=0&&G(x,!1,"phase")},Ne=l[se];if((0,k.useEffect)(()=>{Ne&&(D(Ne,S.current,b.current??ue,_.current),S.current=!1,b.current=null,_.current=!0)},[Ne?.phase.id,Ne?.step.id,e.block]),(0,k.useEffect)(()=>{let v=x=>{let R=x.detail;if(!R||e.task?.id&&R.task.id!==e.task.id||e.block?.id&&R.block.id!==e.block.id)return;let M=l.findIndex($=>$.phase.id===R.phase.id&&$.step.id===R.step.id);if(M<0){T("card");return}G(M,!1,R.focus_level,!1)};return window.addEventListener("stem:navigation-command",v),()=>window.removeEventListener("stem:navigation-command",v)},[e.block?.id,e.task?.id,l,ue,se]),(0,k.useEffect)(()=>{let v=x=>{if(x.metaKey||C||x.target?.closest("input, textarea, select, [contenteditable='true']"))return;let M=d.current;if(!M)return;let $=Array.from(document.querySelectorAll("[data-stem-nav='uml-block']")),H=window.innerHeight/2;if($.sort((K,re)=>{let W=K.getBoundingClientRect(),B=re.getBoundingClientRect();return Math.abs((W.top+W.bottom)/2-H)-Math.abs((B.top+B.bottom)/2-H)})[0]!==M)return;if(x.key==="Enter"&&x.ctrlKey&&!x.altKey&&!x.shiftKey){if(!Ne?.step.progress_id||!n)return;x.preventDefault(),x.stopPropagation();let K=n.items?.[Ne.step.progress_id]?.status==="approved";r(Ne.step.progress_id,K?"pending":"approved");return}if(x.key==="Enter"&&!x.altKey&&!x.shiftKey){if(!Ne)return;x.preventDefault(),x.stopPropagation(),D(Ne,!0,ue);return}let E=["card","task","block","phase","step","snapshot"];if((x.key==="ArrowLeft"||x.key==="ArrowRight"||x.key==="Escape")&&!x.altKey&&!x.ctrlKey&&!x.shiftKey){let K=x.key==="ArrowRight"?1:-1,re=E[Math.max(0,Math.min(E.length-1,E.indexOf(ue)+K))];x.preventDefault(),x.stopPropagation(),T(re),Ne&&D(Ne,!1,re);return}if(x.key!=="ArrowUp"&&x.key!=="ArrowDown"||ue==="card"&&!x.altKey&&!x.ctrlKey&&!x.shiftKey)return;let N=x.key==="ArrowUp"?-1:1,I=ue;if(x.altKey&&x.shiftKey&&!x.ctrlKey)I="snapshot";else if(x.ctrlKey&&x.shiftKey&&!x.altKey)I="step";else if(x.altKey&&!x.ctrlKey&&!x.shiftKey)I="task";else if(x.ctrlKey&&!x.altKey&&!x.shiftKey)I="block";else if(x.shiftKey&&!x.altKey&&!x.ctrlKey)I="phase";else if(x.altKey||x.ctrlKey||x.shiftKey)return;x.preventDefault(),x.stopPropagation(),fetch("/api/navigation/move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({level:I,delta:N,sync_requested:!1,actor:document.documentElement.dataset.cardClientId??"browser"})}).then(K=>K.ok?K.json():Promise.reject(new Error(`HTTP ${K.status}`))).then(K=>{K.current&&window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:K.current}))}).catch(()=>{})};return window.addEventListener("keydown",v),()=>window.removeEventListener("keydown",v)},[Ne,l,ue,r,n,C]),!Ne)return null;let{phase:Ee,step:vr}=Ne,kt=l.filter(v=>v.phase.id===Ee.id),yo=e.block?.label.match(/^A[1-8]\b/)?.[0]??"UML",vo=(e.title??e.block?.label??t.caption).replace(/^A[1-8]\s*[·—:-]\s*/i,""),jn=J?y.current.get(J)??null:null,ct=jn?U?.elements[jn.id]??mo(jn):null;return(0,a.jsxs)("div",{ref:d,className:"uml-react uml-snapshot-react","data-stem-nav":"uml-block","data-task-id":e.task?.id,"data-block-id":e.block?.id,"data-navigation-level":ue,children:[(0,a.jsx)("header",{className:"uml-snapshot-header",children:(0,a.jsxs)("div",{className:"uml-header-first-line",children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)("span",{children:yo})," \u2014 ",vo,t.tile&&(0,a.jsxs)("small",{className:"uml-tile-part",children:["cz\u0119\u015B\u0107 ",t.tile.index,"/",t.tile.count," \xB7 r",t.tile.row," c",t.tile.column]})]}),(0,a.jsxs)("div",{className:"uml-header-navigation",children:[(0,a.jsx)(Pp,{continuation:o}),t.source_href&&(0,a.jsx)("button",{className:`uml-edit-toggle${C?" is-active":""}`,"aria-pressed":C,title:"R\u0119czna edycja po\u0142o\u017Cenia i parametr\xF3w blok\xF3w UML",onClick:()=>A(v=>!v),children:C?"ZAMKNIJ EDIT":"EDIT"}),(0,a.jsx)("div",{className:"uml-phase-actions","aria-label":"Fazy diagramu",children:i.map(v=>(0,a.jsx)("button",{"aria-pressed":Ee.id===v.id,onClick:()=>ut(v),children:v.label},v.id))}),(0,a.jsx)("div",{className:"uml-step-actions","aria-label":`Checkpointy fazy ${Ee.label}`,children:kt.map(v=>{let x=l.indexOf(v),R=!!(v.step.progress_id&&n?.items?.[v.step.progress_id]?.status==="approved");return(0,a.jsx)("button",{"aria-label":`Krok ${v.step.number}: ${v.step.label}`,"aria-pressed":ue!=="card"&&x===se,"data-completed":R?"true":"false","data-mode":v.step.mode??"RUN",title:`${v.step.mode??"RUN"} \xB7 ${v.step.label}`,onClick:()=>G(x),children:String(v.step.number).padStart(2,"0")},v.step.id)})})]})]})}),(0,a.jsxs)("div",{className:"uml-snapshot-layout",children:[(0,a.jsxs)("div",{ref:m,className:`uml-canvas uml-step-canvas${C?" is-layout-editing":""}`,onClick:v=>Q(v.clientX,v.clientY),onKeyDown:Ae,onPointerDown:st,onPointerMove:xt,onPointerUp:ze,onPointerCancel:ze,children:[p?(0,a.jsx)("div",{className:`uml-svg-host${t.tile?" is-tiled":""}`,style:vs(t.tile),dangerouslySetInnerHTML:{__html:p}}):(0,a.jsx)("img",{src:t.href,alt:t.alt}),h&&(0,a.jsx)("span",{className:"uml-inline-warning",children:"Widok statyczny \u2014 wybierz krok przyciskiem nad diagramem."})]}),C&&U&&(0,a.jsxs)("aside",{className:"uml-layout-editor","aria-label":"Edytor uk\u0142adu UML",children:[(0,a.jsxs)("div",{className:"uml-layout-editor-title",children:[(0,a.jsx)("strong",{children:"UML layout"}),(0,a.jsx)("span",{children:ae?"niezapisane zmiany":"zapisany"}),Re&&(0,a.jsx)("b",{children:"\u0179r\xF3d\u0142o PlantUML zmieni\u0142o si\u0119"})]}),(0,a.jsxs)("label",{children:["Element",(0,a.jsx)("select",{value:J??"",onChange:v=>at(v.target.value||null),children:bt.map(v=>(0,a.jsx)("option",{value:v,children:v},v))})]}),J&&ct&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"uml-layout-number-grid",children:["x","y","width","height"].map(v=>(0,a.jsxs)("label",{children:[v,(0,a.jsx)("input",{type:"number",step:"1",min:v==="width"||v==="height"?12:void 0,value:Math.round(ct[v]*100)/100,onChange:x=>oe(J,R=>({...R,[v]:Number(x.target.value)}))})]},v))}),(0,a.jsxs)("label",{className:"uml-layout-editor-text",children:["Tekst bloku \u2014 jeden wiersz SVG na lini\u0119",(0,a.jsx)("textarea",{rows:Math.max(3,Math.min(10,ct.text?.lines?.length??3)),value:(ct.text?.lines??[]).join(` +`),onChange:v=>oe(J,x=>({...x,text:{...x.text,title:v.target.value.split(` +`)[0]??"",description:v.target.value.split(` `).slice(1).join(` -`),lines:x.target.value.split(` -`)}}))})]}),(0,a.jsxs)("div",{className:"uml-layout-style-grid",children:[(0,a.jsxs)("label",{children:["Font",(0,a.jsx)("input",{type:"number",min:"4",max:"96",step:"0.5",value:ut.text?.font_size??12,onChange:x=>ne(Q,S=>({...S,text:{...S.text,font_size:Number(x.target.value)}}))})]}),(0,a.jsxs)("label",{children:["Wyr\xF3wnanie",(0,a.jsxs)("select",{value:ut.text?.align??"left",onChange:x=>ne(Q,S=>({...S,text:{...S.text,align:x.target.value}})),children:[(0,a.jsx)("option",{value:"left",children:"left"}),(0,a.jsx)("option",{value:"center",children:"center"}),(0,a.jsx)("option",{value:"right",children:"right"})]})]}),(0,a.jsxs)("label",{children:["Wype\u0142nienie",(0,a.jsx)("input",{type:"color",value:ut.style?.fill??"#edf6fa",onChange:x=>ne(Q,S=>({...S,style:{...S.style,fill:x.target.value}}))})]}),(0,a.jsxs)("label",{children:["Obramowanie",(0,a.jsx)("input",{type:"color",value:ut.style?.stroke??"#2c7794",onChange:x=>ne(Q,S=>({...S,style:{...S.style,stroke:x.target.value}}))})]}),(0,a.jsxs)("label",{children:["Linia",(0,a.jsx)("input",{type:"number",min:"0.5",max:"12",step:"0.25",value:ut.style?.stroke_width??1.5,onChange:x=>ne(Q,S=>({...S,style:{...S.style,stroke_width:Number(x.target.value)}}))})]})]})]}),(0,a.jsxs)("div",{className:"uml-layout-editor-actions",children:[(0,a.jsx)("button",{className:"is-primary",disabled:!ke,onClick:()=>void st(),children:"Zapisz uk\u0142ad"}),(0,a.jsx)("button",{disabled:!ke,onClick:Ye,children:"Cofnij zmiany"}),(0,a.jsx)("button",{className:"is-danger",onClick:()=>void wn(),children:"Reset PlantUML"})]}),(0,a.jsx)("output",{children:G})]})]})]})}function Vg(e){return e.config.phases?.length?(0,a.jsx)(Ug,{...e}):(0,a.jsx)(jg,{...e})}function Bg({asset:e,continuation:t}){let n=e.tile;if(!n)return(0,a.jsx)("img",{src:e.href,alt:e.alt,loading:"lazy"});let r=e.diagram_block_label?.match(/^A[1-8]\b/)?.[0]??e.diagram_title?.match(/^A[1-8]\b/)?.[0]??e.caption.match(/^A[1-8]\b/)?.[0]??"UML",o=(e.diagram_title??e.caption).replace(/^A[1-8]\s*[·—:-]\s*/i,"");return(0,a.jsxs)("div",{className:"uml-react uml-snapshot-react uml-static-tile",children:[(0,a.jsxs)("header",{className:"uml-snapshot-header",children:[(0,a.jsxs)("div",{className:"uml-header-first-line",children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)("span",{children:r})," \u2014 ",o,(0,a.jsxs)("small",{className:"uml-tile-part",children:["cz\u0119\u015B\u0107 ",n.index,"/",n.count," \xB7 r",n.row," c",n.column]})]}),(0,a.jsxs)("div",{className:"uml-header-navigation",children:[(0,a.jsx)(_p,{continuation:t}),(0,a.jsx)("div",{className:"uml-phase-actions","aria-label":"Fazy logicznego diagramu",children:(e.diagram_phase_labels??[]).map(i=>(0,a.jsx)("span",{children:i},i))})]})]}),e.diagram_description&&(0,a.jsx)("p",{className:"uml-header-description",children:e.diagram_description})]}),(0,a.jsx)("div",{className:"uml-snapshot-layout",children:(0,a.jsx)("div",{className:"uml-canvas uml-step-canvas",children:(0,a.jsx)("div",{className:"uml-svg-host is-tiled is-static",style:hs(n),children:(0,a.jsx)("div",{className:"uml-static-crop",style:{width:`${n.width}px`,height:`${n.height}px`},children:(0,a.jsx)("img",{src:e.href,alt:e.alt,style:{width:`${n.full_width}px`,height:`${n.full_height}px`,transform:`translate(${-(n.x-n.full_x)}px, ${-(n.y-n.full_y)}px)`}})})})})})]})}function Hg({asset:e,number:t,progress:n,onSetStatus:r,continuation:o}){let i=e.interactive?.kind,l=!!i;return(0,a.jsxs)("figure",{className:`card-asset asset-${e.kind} ${l?"asset-interactive":""}`,id:e.label.replace(":","-"),children:[i==="uml-sequence"||i==="uml-class"?(0,a.jsx)(Vg,{config:e.interactive,asset:e,progress:n,onSetStatus:r,continuation:o}):i==="allocator-memory-flow"?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(Dg,{config:e.interactive,title:e.caption}),(0,a.jsx)("img",{className:"asset-static-fallback",src:e.href,alt:e.alt})]}):e.tile?(0,a.jsx)(Bg,{asset:e,continuation:o}):(0,a.jsx)("a",{href:e.href,target:"_blank",rel:"noopener",children:(0,a.jsx)("img",{src:e.href,alt:e.alt,loading:"lazy",style:{width:`${e.width*100}%`}})}),e.source_href&&(0,a.jsx)("a",{className:"asset-source-link",href:e.source_href,target:"_blank",rel:"noopener",children:"\u0179r\xF3d\u0142o PlantUML"}),(0,a.jsxs)("figcaption",{children:["Rys. ",e.figure_number??t,". ",e.caption]})]})}function Kg({steps:e,progress:t,onCycle:n}){if(!e.length)return null;let r={pending:"\u25CB niezatwierdzony",approved:"\u25CF zatwierdzony"};return(0,a.jsx)("div",{className:"step-map",children:e.map(o=>{let i=t?.items?.[o.id]?.status??"pending";return(0,a.jsxs)("div",{className:`step-row ${i==="approved"?"lesson-progress-completed":""}`,children:[(0,a.jsx)("button",{className:"lesson-progress-control","data-status":i,onClick:()=>n(o.id,i),disabled:!t,children:r[i]}),(0,a.jsx)("span",{className:"step-title",children:o.title})]},o.id)})})}function Wg({section:e,progress:t,onCycle:n,onSetStatus:r,figureOffset:o}){let i=vg(e);return(0,a.jsxs)(ys,{header:e.header_html,left:e.left_margin_html,right:e.right_margin_html,className:`section-sheet${e.assets.length?" section-sheet--asset":""} sheet--${e.page_orientation||"portrait"}`,children:[(0,a.jsx)("div",{id:e.id,className:"section-anchor"}),e.show_heading&&(0,a.jsxs)("h2",{className:"section-heading",children:[(0,a.jsx)("span",{className:"section-index",children:e.index}),(0,a.jsx)("span",{className:"section-title",children:e.title})]}),(0,a.jsx)(Kg,{steps:e.steps,progress:t,onCycle:n}),e.content_html&&(0,a.jsx)(Yt,{html:e.content_html}),(0,a.jsx)("div",{className:"tasks",children:e.tasks.map(l=>(0,a.jsx)(Fg,{task:l},l.ref))}),e.assets.map((l,s)=>(0,a.jsx)(Hg,{asset:l,number:o+s+1,progress:t,onSetStatus:r,continuation:i},l.label)),e.tasks.map(l=>l.conclusion_html&&(0,a.jsxs)("aside",{className:"task-conclusion",children:[(0,a.jsx)("strong",{children:"WNIOSEK"}),(0,a.jsx)(Yt,{html:l.conclusion_html})]},`${l.ref}-conclusion`))]})}function Gg({progress:e,error:t}){if(!e?.summary&&!t)return null;let n=e?.summary.counts;return(0,a.jsxs)("section",{className:"lesson-progress-topbar","aria-label":"Przebieg zaj\u0119\u0107",children:[(0,a.jsx)("strong",{children:"PRZEBIEG"}),n&&(0,a.jsxs)("output",{title:"Zatwierdzone kroki",children:[n.approved,"/",e.summary.total]}),t&&(0,a.jsx)("span",{className:"lesson-progress-error",title:t,children:"!"}),(0,a.jsx)("a",{href:"/api/report/teams.md",target:"_blank",rel:"noopener",title:"Otw\xF3rz raport do Teams",children:"Teams"}),(0,a.jsx)("a",{href:"/api/report/lesson.html",target:"_blank",rel:"noopener",title:"Otw\xF3rz \u015Blad lekcji ze zrzutami",children:"\u015Alad"})]})}var In=[{id:"u01",name:"Alicja Nowak",laptop:3,connection:"online",sync:"follow",position:"A5\xB708"},{id:"u02",name:"Bartosz Kowalski",laptop:7,connection:"online",sync:"follow",position:"A5\xB708"},{id:"u03",name:"Celina Wi\u015Bniewska",laptop:11,connection:"away",sync:"paused",position:"A5\xB705"},{id:"u04",name:"Dawid W\xF3jcik",laptop:14,connection:"offline",sync:"follow",position:"\u2014"},{id:"u05",name:"Emilia Kami\u0144ska",laptop:18,connection:"online",sync:"local",position:"A3\xB702"},{id:"u06",name:"Filip Lewandowski",laptop:22,connection:"error",sync:"follow",position:"A5\xB706"},{id:"u07",name:"Gabriela Zieli\u0144ska",laptop:24,connection:"online",sync:"follow",position:"A5\xB708"}];function Yg(e){let t=new Map,n=(r,o)=>{let i=r.trim()||"task",l=t.get(i);return l||(l={id:i,label:o.trim()||i.toUpperCase(),blocks:[],exercises:[]},t.set(i,l)),l};for(let r of e.sections){for(let o of r.assets){let i=o.interactive;if(!i?.task||!i.block)continue;let l=n(i.task.id,i.task.label),s=`diagram:${i.block.id}`,u=l.blocks.find(d=>d.id===s);u||(u={id:s,label:i.block.label,kind:"diagram",phases:[],steps:[]},l.blocks.push(u));for(let d of i.phases??[]){let m=u.phases.find(y=>y.id===d.id);m||(m={...d,steps:[]},u.phases.push(m));for(let y of d.steps)m.steps.some(g=>g.id===y.id)||m.steps.push(y)}}for(let o of r.tasks){let i=n(o.ref,o.title);i.label=o.title||i.label;for(let l of o.flow){if(l.kind==="exercise"){i.exercises.some(u=>u.id===l.id)||i.exercises.push(l);continue}let s=`flow:${l.id}`;i.blocks.some(u=>u.id===s)||i.blocks.push({id:s,label:l.title,kind:"flow",phases:[],steps:l.steps.map((u,d)=>({id:u.id,number:d+1,label:u.title,description:u.title,mode:"RUN"}))})}}}return[...t.values()]}function hp({side:e,panels:t,activeId:n,pinnedId:r,onActiveChange:o,onPinnedChange:i}){let l=(0,N.useRef)(0),s=t.find(f=>f.id===n)??null,u=(0,N.useCallback)(()=>{window.clearTimeout(l.current)},[]),d=(0,N.useCallback)(()=>{u(),!r&&(l.current=window.setTimeout(()=>o(null),150))},[u,o,r]),m=(0,N.useCallback)(f=>{u(),r||o(f)},[u,o,r]),y=(0,N.useCallback)(f=>{if(u(),r===f){i(null),o(null);return}i(f),o(f)},[u,o,i,r]),g=(0,N.useCallback)(()=>{u(),i(null),o(null)},[u,o,i]);return(0,N.useEffect)(()=>()=>window.clearTimeout(l.current),[]),t.length?(0,a.jsxs)("div",{className:`side-panel-dock side-panel-dock--${e}`,"data-side":e,children:[(0,a.jsx)("nav",{className:"side-panel-rail","aria-label":`Panele ${e==="left"?"lewe":"prawe"}`,children:t.map(f=>{let E=n===f.id,b=r===f.id;return(0,a.jsx)("button",{type:"button",className:`side-panel-trigger${E?" is-open":""}${b?" is-pinned":""}`,style:{"--side-panel-accent":f.accent},"aria-controls":`side-panel-${e}-${f.id}`,"aria-expanded":E,"aria-pressed":b,"aria-label":`${f.title}: ${b?"odpnij":"przypnij"} panel`,title:`${f.title} \xB7 ${b?"Fixed":"Auto"}`,onMouseEnter:()=>m(f.id),onMouseLeave:d,onFocus:()=>m(f.id),onClick:()=>y(f.id),children:(0,a.jsx)("span",{children:f.railLabel})},f.id)})}),(0,a.jsx)("aside",{id:s?`side-panel-${e}-${s.id}`:void 0,className:`side-panel${s?" is-open":""}`,"aria-hidden":!s,"aria-label":s?.title,style:s?{"--side-panel-accent":s.accent}:void 0,onMouseEnter:u,onMouseLeave:d,onFocusCapture:u,children:s&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("header",{className:"side-panel-header",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:e==="left"?"LEWY PANEL":"PRAWY PANEL"}),(0,a.jsx)("strong",{children:s.title})]}),(0,a.jsxs)("div",{className:"side-panel-actions",children:[(0,a.jsx)("button",{type:"button",className:r===s.id?"is-pinned":"",onClick:()=>y(s.id),title:r===s.id?"Tryb Fixed \u2014 kliknij, aby przej\u015B\u0107 do Auto":"Tryb Auto \u2014 kliknij, aby przypi\u0105\u0107",children:r===s.id?"Fixed":"Auto"}),(0,a.jsx)("button",{type:"button",onClick:g,"aria-label":`Zamknij ${s.title}`,children:"\xD7"})]})]}),(0,a.jsx)("div",{className:"side-panel-body",children:s.content})]})})]}):null}function fo({id:e,depth:t,kind:n,title:r,label:o,refValue:i,stateValue:l,stateKind:s,hasChildren:u=!1,expanded:d=!1,onToggle:m,href:y,current:g=!1,unavailable:f=!1,onNavigate:E}){let b=y?(0,a.jsx)("a",{className:"card-library-tree-link",href:y,onClick:E,"aria-current":g?"page":void 0,title:g?"Poka\u017C bie\u017C\u0105c\u0105 kart\u0119":`Otw\xF3rz: ${r}`,children:o}):(0,a.jsx)("span",{className:"card-library-tree-label",title:r,children:o});return(0,a.jsxs)("div",{className:`card-library-treegrid-row is-${n}${g?" is-current":""}${f?" is-unavailable":""}`,role:"row","aria-level":t+1,"aria-expanded":u?d:void 0,"aria-disabled":f||void 0,"data-node-id":e,style:{"--card-library-depth":t},children:[(0,a.jsxs)("span",{className:"card-library-tree-title",role:"gridcell",children:[u?(0,a.jsx)("button",{className:"card-library-tree-expander",type:"button",onClick:m,"aria-label":`${d?"Zwi\u0144":"Rozwi\u0144"}: ${r}`,children:d?"\u25BE":"\u25B8"}):(0,a.jsx)("span",{className:"card-library-tree-expander is-empty","aria-hidden":"true"}),b]}),(0,a.jsx)("span",{role:"gridcell",children:i}),(0,a.jsx)("span",{role:"gridcell",children:(0,a.jsx)("b",{className:"card-library-tree-state","data-state":s,children:l})})]})}function Qg({library:e,onNavigate:t}){if(!e)return null;let n=e.subjects.reduce((d,m)=>d+m.levels.reduce((y,g)=>y+g.series.length,0),0),r=e.subjects.reduce((d,m)=>d+m.levels.reduce((y,g)=>y+g.series.reduce((f,E)=>f+E.cards.filter(b=>b.available).length,0),0),0),o=e.subjects.reduce((d,m)=>d+m.levels.reduce((y,g)=>y+g.series.reduce((f,E)=>f+E.cards.length,0),0),0),[i,l]=(0,N.useState)(()=>{let d=new Set;return e.subjects.forEach(m=>{let y=`subject:${m.id}`;m.current&&d.add(y),m.levels.forEach(g=>{let f=`${y}:level:${g.id}`;g.current&&d.add(f),g.series.forEach(E=>{let b=`${f}:series:${E.id}`;E.current&&d.add(b),E.cards.forEach(_=>{_.current&&(_.tasks?.length??0)>0&&d.add(`${b}:card:${_.id}`)})})})}),d}),s=d=>i.has(d),u=d=>{l(m=>{let y=new Set(m);return y.has(d)?y.delete(d):y.add(d),y})};return(0,a.jsxs)("div",{className:"card-library-panel",children:[(0,a.jsxs)("div",{className:"card-library-treegrid",role:"treegrid","aria-label":"Serie, karty i taski","aria-colcount":3,children:[(0,a.jsxs)("div",{className:"card-library-treegrid-row card-library-treegrid-head",role:"row",children:[(0,a.jsx)("span",{role:"columnheader",children:"DRZEWO"}),(0,a.jsx)("span",{role:"columnheader",children:"REF"}),(0,a.jsx)("span",{role:"columnheader",children:"STATUS"})]}),e.subjects.map(d=>{let m=`subject:${d.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:m,depth:0,kind:"subject",title:d.title,label:(0,a.jsx)("strong",{children:d.title}),refValue:"PRZEDMIOT",stateValue:`${d.levels.length} POZ.`,hasChildren:d.levels.length>0,expanded:s(m),onToggle:()=>u(m)}),s(m)&&d.levels.map(y=>{let g=`${m}:level:${y.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:g,depth:1,kind:"level",title:y.title,label:(0,a.jsx)("strong",{children:y.title}),refValue:"ROK",stateValue:`${y.series.length} SERII`,hasChildren:y.series.length>0,expanded:s(g),onToggle:()=>u(g)}),s(g)&&y.series.map(f=>{let E=`${g}:series:${f.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:E,depth:2,kind:"series",title:f.title,label:(0,a.jsx)("strong",{children:f.title}),refValue:f.role==="reference"?"REF.":"SERIA",stateValue:`${f.cards.length} KART`,hasChildren:f.cards.length>0,expanded:s(E),onToggle:()=>u(E)}),s(E)&&f.cards.map(b=>{let _=`${E}:card:${b.id}`,p=b.tasks??[],c=b.current||b.available,h=b.current?"current":b.available?"online":"plan";return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:_,depth:3,kind:"card",title:`${b.id} \xB7 ${b.title}`,label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("strong",{children:b.id}),(0,a.jsx)("span",{children:b.title})]}),refValue:b.version||"\u2014",stateValue:b.current?"BIE\u017B\u0104CA":b.available?"ONLINE":"PLAN",stateKind:h,hasChildren:p.length>0,expanded:s(_),onToggle:()=>u(_),href:c?b.current?"#":b.href:void 0,current:b.current,unavailable:!c,onNavigate:t}),s(_)&&p.map(k=>{let C=b.current?`#${k.id}`:`${b.href}#${k.id}`;return(0,a.jsx)(fo,{id:`${_}:task:${k.id}`,depth:4,kind:"task",title:`${k.id.toUpperCase()} \xB7 ${k.title}`,label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("strong",{children:k.id.toUpperCase()}),(0,a.jsx)("span",{children:k.title})]}),refValue:"TASK",stateValue:c?"GOTOWY":"PLAN",stateKind:c?"online":"plan",href:c?C:void 0,unavailable:!c,onNavigate:t},`${_}:task:${k.id}`)})]},_)})]},E)})]},g)})]},m)})]}),(0,a.jsxs)("footer",{className:"card-library-footer",children:[(0,a.jsx)("span",{children:e.workspace||"STEM"}),(0,a.jsxs)("span",{children:[n," serii"]}),(0,a.jsxs)("span",{children:[(0,a.jsx)("i",{className:"is-online"})," ",r,"/",o," online"]}),(0,a.jsx)("kbd",{children:"Esc"})]})]})}function qg({toc:e,onNavigate:t}){return(0,a.jsxs)("nav",{className:"side-toc","aria-label":"Spis tre\u015Bci karty",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("small",{children:"KARTA PRACY"}),(0,a.jsx)("h2",{children:"Spis tre\u015Bci"})]}),(0,a.jsx)("ol",{children:e.map((n,r)=>(0,a.jsx)("li",{children:(0,a.jsxs)("a",{href:`#${n.id}`,onClick:t,children:[(0,a.jsx)("span",{children:String(r+1).padStart(2,"0")}),(0,a.jsx)("strong",{children:n.label})]})},n.id))})]})}function Xg({progress:e,error:t}){let n=e?.summary?.counts;return(0,a.jsxs)("section",{className:"side-progress","aria-label":"Przebieg zaj\u0119\u0107 i raport",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("small",{children:"DOWODY I RAPORT"}),(0,a.jsx)("h2",{children:"Przebieg zaj\u0119\u0107"})]}),(0,a.jsxs)("div",{className:"side-progress-summary",children:[(0,a.jsx)("span",{children:"Zatwierdzone kroki"}),(0,a.jsx)("strong",{children:n?`${n.approved}/${e.summary.total}`:"\u2014"})]}),t&&(0,a.jsx)("p",{className:"side-progress-error",children:t}),(0,a.jsxs)("div",{className:"side-progress-links",children:[(0,a.jsx)("a",{href:"/api/report/teams.md",target:"_blank",rel:"noopener",children:"Raport do Teams"}),(0,a.jsx)("a",{href:"/api/report/lesson.html",target:"_blank",rel:"noopener",children:"\u015Alad lekcji ze zrzutami"})]})]})}var Zg={online:"ONLINE",away:"ZAJ\u0118TY",offline:"OFFLINE",error:"B\u0141\u0104D"},Jg={follow:"SYNC",paused:"PAUZA",local:"LOKAL."},yp={present:"BY\u0141",missed:"NIE BY\u0141",pending:"OCZEK."},eh={committed:"COMMIT",working:"PRACA",missing:"BRAK"};function zp(e){let t=2166136261;for(let n=0;n>>0}function vp(e,t,n){let r=zp(`${e.id}:step:${t}`),o=r%8,i=o===0?"missed":o===1?"pending":"present",l=8+n*4+r%3,s=10+Math.floor(l/60),u=l%60,d=(e.laptop*7+r)%60;return{state:i,timestamp:i==="present"?`${String(s).padStart(2,"0")}:${String(u).padStart(2,"0")}:${String(d).padStart(2,"0")}`:"\u2014"}}function xp(e,t){let n=zp(`${e.id}:exercise:${t}`),r=n%6,o=r===0?"missing":r===1?"working":"committed";return{state:o,commit:o==="committed"?n.toString(16).padStart(8,"0").slice(0,7):"\u2014"}}function Gt({id:e,depth:t,title:n,kind:r,refValue:o,session:i,evidence:l,state:s,hasChildren:u=!1,expanded:d=!1,onToggle:m}){return(0,a.jsxs)("div",{className:`classroom-treegrid-row classroom-node-row is-${r}`,role:"row","aria-level":t+1,"aria-expanded":u?d:void 0,"data-node-id":e,style:{"--classroom-depth":t},children:[(0,a.jsxs)("span",{className:"classroom-node-title",role:"gridcell",title:n,children:[u?(0,a.jsx)("button",{className:"classroom-expander",type:"button",onClick:m,"aria-label":`${d?"Zwi\u0144":"Rozwi\u0144"}: ${n}`,children:d?"\u25BE":"\u25B8"}):(0,a.jsx)("span",{className:"classroom-expander is-empty","aria-hidden":"true"}),(0,a.jsx)("strong",{children:n})]}),(0,a.jsx)("span",{role:"gridcell",children:o}),(0,a.jsx)("span",{role:"gridcell",children:i}),(0,a.jsx)("span",{role:"gridcell",children:l}),(0,a.jsx)("span",{role:"gridcell",children:s})]})}function th({model:e}){let t=Yg(e),n=In[0]?.id,r=t[0]?.id,[o,i]=(0,N.useState)(()=>new Set(["class",...n?[`student:${n}`]:[],...n&&r?[`student:${n}:task:${r}`]:[]])),l=m=>o.has(m),s=m=>{i(y=>{let g=new Set(y);return g.has(m)?g.delete(m):g.add(m),g})},u=In.filter(m=>m.connection==="online"||m.connection==="away").length,d=In.filter(m=>m.sync==="follow").length;return(0,a.jsxs)("section",{className:"classroom-panel","aria-label":"Klasa i stanowiska uczni\xF3w",children:[(0,a.jsxs)("div",{className:"classroom-treegrid",role:"treegrid","aria-label":"Uczniowie, struktura karty, obecno\u015B\u0107 i commity","aria-colcount":5,children:[(0,a.jsxs)("div",{className:"classroom-treegrid-row classroom-treegrid-head",role:"row",children:[(0,a.jsx)("span",{role:"columnheader",children:"DRZEWO"}),(0,a.jsx)("span",{role:"columnheader",children:"REF"}),(0,a.jsx)("span",{role:"columnheader",children:"SESJA"}),(0,a.jsx)("span",{role:"columnheader",children:"DOW\xD3D"}),(0,a.jsx)("span",{role:"columnheader",children:"STAN"})]}),(0,a.jsx)(Gt,{id:"class",depth:0,kind:"class",title:"2TP \xB7 grupa A",refValue:`${In.length} ucz.`,session:`${u}/${In.length}`,evidence:`${d}/${In.length} SYNC`,state:`${t.length} TASK`,hasChildren:!0,expanded:l("class"),onToggle:()=>s("class")}),l("class")&&In.map(m=>{let y=`student:${m.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:y,depth:1,kind:"student",title:m.name,refValue:`L${String(m.laptop).padStart(2,"0")}`,session:(0,a.jsx)("b",{className:"classroom-status","data-status":m.connection,children:Zg[m.connection]}),evidence:(0,a.jsx)("b",{className:"classroom-sync","data-sync":m.sync,children:Jg[m.sync]}),state:m.position,hasChildren:t.length>0,expanded:l(y),onToggle:()=>s(y)}),l(y)&&t.map(g=>{let f=`${y}:task:${g.id}`,E=g.exercises.filter(b=>xp(m,b.id).state==="committed").length;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:f,depth:2,kind:"task",title:g.label,refValue:g.id.toUpperCase(),session:`${g.blocks.length} BLOCK`,evidence:`${E}/${g.exercises.length} COMMIT`,state:"TASK",hasChildren:g.blocks.length+g.exercises.length>0,expanded:l(f),onToggle:()=>s(f)}),l(f)&&g.blocks.map(b=>{let _=`${f}:block:${b.id}`,p=b.phases.length||b.steps.length;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:_,depth:3,kind:"block",title:b.label,refValue:b.kind==="diagram"?"BLOCK":"TASK BLOCK",session:`${p} ${b.phases.length?"PHASE":"STEP"}`,evidence:"\u2014",state:b.kind==="diagram"?"UML":"FLOW",hasChildren:p>0,expanded:l(_),onToggle:()=>s(_)}),l(_)&&b.phases.map(c=>{let h=`${_}:phase:${c.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:h,depth:4,kind:"phase",title:`PHASE \xB7 ${c.label}`,refValue:`${c.steps.length} STEP`,session:"\u2014",evidence:"\u2014",state:"PHASE",hasChildren:c.steps.length>0,expanded:l(h),onToggle:()=>s(h)}),l(h)&&c.steps.map(k=>{let C=vp(m,`${b.id}:${c.id}:${k.id}`,k.number);return(0,a.jsx)(Gt,{id:`${h}:step:${k.id}`,depth:5,kind:"step",title:`STEP ${String(k.number).padStart(2,"0")} \xB7 ${k.label}`,refValue:k.mode??"CODE",session:(0,a.jsx)("b",{className:"classroom-visit","data-visit":C.state,children:yp[C.state]}),evidence:C.timestamp,state:C.state==="present"?"OK":C.state==="missed"?"BRAK":"\u2014"},`${h}:step:${k.id}`)})]},h)}),l(_)&&b.steps.map(c=>{let h=vp(m,`${b.id}:${c.id}`,c.number);return(0,a.jsx)(Gt,{id:`${_}:step:${c.id}`,depth:4,kind:"step",title:`STEP ${String(c.number).padStart(2,"0")} \xB7 ${c.label}`,refValue:c.mode??"RUN",session:(0,a.jsx)("b",{className:"classroom-visit","data-visit":h.state,children:yp[h.state]}),evidence:h.timestamp,state:h.state==="present"?"OK":h.state==="missed"?"BRAK":"\u2014"},`${_}:step:${c.id}`)})]},_)}),l(f)&&g.exercises.length>0&&(()=>{let b=`${f}:exercises`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:b,depth:3,kind:"exercises",title:"EXERCISES",refValue:`${g.exercises.length} EX`,session:`${E}/${g.exercises.length}`,evidence:"GIT",state:E===g.exercises.length?"DONE":"TODO",hasChildren:!0,expanded:l(b),onToggle:()=>s(b)}),l(b)&&g.exercises.map(_=>{let p=xp(m,_.id);return(0,a.jsx)(Gt,{id:`${b}:${_.id}`,depth:4,kind:"exercise",title:`EXERCISE \xB7 ${_.title}`,refValue:_.id,session:(0,a.jsx)("b",{className:"classroom-commit","data-commit":p.state,children:eh[p.state]}),evidence:p.commit,state:p.state==="committed"?"DONE":p.state==="working"?"W TOKU":"TODO"},`${b}:${_.id}`)})]},b)})()]},f)})]},m.id)})]}),(0,a.jsxs)("footer",{className:"classroom-legend",children:[(0,a.jsxs)("span",{children:[(0,a.jsx)("b",{children:"BY\u0141"})," obecny przy omawianym STEP"]}),(0,a.jsxs)("span",{children:[(0,a.jsx)("b",{children:"COMMIT"})," rozwi\u0105zanie EXERCISE zapisane w Git"]})]})]})}function nh({open:e,onClose:t}){return e?(0,a.jsx)("div",{className:"shortcut-help-backdrop",role:"presentation",onMouseDown:t,children:(0,a.jsxs)("section",{className:"shortcut-help",role:"dialog","aria-modal":"true","aria-labelledby":"shortcut-help-title",onMouseDown:r=>r.stopPropagation(),children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"F12 \xB7 NAWIGACJA DYDAKTYCZNA"}),(0,a.jsx)("h2",{id:"shortcut-help-title",children:"CARD \u2192 TASK \u2192 BLOCK \u2192 PHASE \u2192 STEP \u2192 SNAPSHOT"})]}),(0,a.jsx)("button",{onClick:t,"aria-label":"Zamknij skorowidz",children:"\xD7"})]}),(0,a.jsx)("dl",{children:[["Alt + \u2191 / \u2193","poprzedni / nast\u0119pny TASK"],["Ctrl + \u2191 / \u2193","poprzedni / nast\u0119pny BLOCK"],["Shift + \u2191 / \u2193","poprzednia / nast\u0119pna PHASE"],["Ctrl + Shift + \u2191 / \u2193","poprzedni / nast\u0119pny STEP"],["Alt + Shift + \u2191 / \u2193","poprzedni / nast\u0119pny unikalny SNAPSHOT"],["\u2191 / \u2193","poprzedni / nast\u0119pny element aktywnego poziomu"],["\u2192","zejd\u017A poziom ni\u017Cej"],["\u2190 / Esc","wr\xF3\u0107 poziom wy\u017Cej"],["Enter","wybierz element; przy SYNC ON odtw\xF3rz stan"],["F1","reset aktualnego celu Neovima/kontenera"],["F2","synchronizuj cel z kursorem drzewa UML"],["Ctrl + `","maksymalizuj pane, dopasuj siatk\u0119 i od\u015Bwie\u017C Neovima"],["Ctrl + Enter","zatwierd\u017A lub cofnij zatwierdzenie kroku"],["Alt + 0","wysu\u0144 lub schowaj panel serii i kart"],["Alt + 1","poka\u017C lub ukryj panel Neovima"],["Alt + 2","prze\u0142\u0105cz SYNC OFF / SYNC ON"],["Alt + 3","uzbr\xF3j lub rozbr\xF3j sterowanie Neovimem"],["Alt + 4","wysoki panel 90% / zapisana wysoko\u015B\u0107 normalna"],["Alt + 5","dopasuj ca\u0142y ekran Neovima; wy\u0142\u0105cz r\u0119czny suwak"],["Alt + 6","przypnij lub ukryj model alokatora"],["Alt + 7","po\u0142\u0105cz segmenty UML w szeroki spread / wr\xF3\u0107 do A4"],["Alt + 3, potem najed\u017A","przeka\u017C klawiatur\u0119 i mysz do aktywnej sesji"],["Alt + W","prefiks polece\u0144 okien Neovima ()"],["Alt + strza\u0142ka","przejd\u017A do s\u0105siedniego okna Neovima"],["F12","poka\u017C lub ukryj ten skorowidz"]].map(([r,o])=>(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:(0,a.jsx)("kbd",{children:r})}),(0,a.jsx)("dd",{children:o})]},r))}),(0,a.jsx)("p",{children:"Przy SYNC ON wyb\xF3r stepu odtwarza i weryfikuje przypi\u0119ty stan maszyny. SYNC OFF nie resetuje debuggera. Po najechaniu panel przekazuje do Neovima wy\u0142\u0105cznie kontrolowane zdarzenia klawiatury i myszy, wi\u0119c mo\u017Cna normalnie kontynuowa\u0107 debugowanie."})]})}):null}function rh({model:e}){let t=!!e.has_allocator_model,n=(0,N.useRef)(null),r=(0,N.useRef)(null),o=(0,N.useRef)(`browser-${globalThis.crypto?.randomUUID?.()??Math.random().toString(36).slice(2)}`),i=(0,N.useRef)(0),l=(0,N.useRef)(0),s=(0,N.useRef)(!1),u=(0,N.useRef)(!1),d=(0,N.useRef)(0),m=(0,N.useRef)(0),y=(0,N.useRef)(0),[g,f]=(0,N.useState)(2.18),[E,b]=(0,N.useState)(()=>localStorage.getItem("stem-card-nvim-visible")!=="false"),[_,p]=(0,N.useState)(()=>localStorage.getItem("stem-card-nvim-sync-mode")==="true"),[c,h]=(0,N.useState)(()=>localStorage.getItem("stem-card-nvim-sync-mode")==="true"&&localStorage.getItem("stem-card-nvim-control-mode")==="true"),[k,C]=(0,N.useState)(!1),[P,T]=(0,N.useState)(!1),[R,j]=(0,N.useState)(()=>t&&localStorage.getItem("stem-card-allocator-visible")!=="false"),[I,ke]=(0,N.useState)(()=>{let v=localStorage.getItem("stem-card-diagram-spread");return v===null?!!e.has_spread:v==="true"}),[re,G]=(0,N.useState)({state:"hidden",syncMode:!1,syncReady:!1,controlMode:!1,controlEnabled:!1}),[U,Le]=(0,N.useState)(null),[Ne,Q]=(0,N.useState)(""),[et,Ge]=(0,N.useState)(null),[je,me]=(0,N.useState)(null),[Dn,xe]=(0,N.useState)(null),[bn,se]=(0,N.useState)(null),[A,F]=(0,N.useState)(!1),[B,te]=(0,N.useState)(""),[at,zt]=(0,N.useState)(()=>window.innerWidth),Ee=et==="library",ne=!!(et||Dn),st=(0,N.useCallback)(v=>{if(v){Ge("library"),me("library");return}Ge(w=>w==="library"?null:w),me(w=>w==="library"?null:w)},[]),Ye=(0,N.useCallback)(v=>{window.clearTimeout(y.current),te(v),y.current=window.setTimeout(()=>te(""),4200)},[]),wn=(0,N.useCallback)(async v=>{Ye(`${v} \xB7 wykonywanie\u2026`);try{let L=await fetch(v==="F1"?"/api/nvim/reset":"/api/navigation/sync",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:o.current})}),H=await L.json().catch(()=>({}));if(!L.ok)throw new Error(H.message??H.error??`HTTP ${L.status}`);v==="F2"&&H.current?(l.current=Math.max(l.current,Number(H.current.revision??0)),window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:H.current})),Ye(`F2 \xB7 ${String(H.current.step.number).padStart(2,"0")} ${H.current.step.label} \xB7 READY`)):Ye("F1 \xB7 reset przyj\u0119ty"),window.setTimeout(()=>window.dispatchEvent(new Event("stem:nvim-refresh")),120)}catch(w){Ye(`${v} \xB7 ${w instanceof Error?w.message:String(w)}`)}},[Ye]),ie=(0,N.useCallback)(async()=>{Ye("Ctrl+` \xB7 przeliczanie widoku\u2026");try{let v=await fetch("/api/nvim/redraw",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:o.current})}),w=await v.json().catch(()=>({}));if(!v.ok)throw new Error(w.message??w.error??`HTTP ${v.status}`);let L=w.external_ui?.grid,H=L?` \xB7 ${L.width}\xD7${L.height}`:"";Ye(`Ctrl+\` \xB7 widok od\u015Bwie\u017Cony${H}`),window.dispatchEvent(new Event("stem:nvim-refresh"))}catch(v){Ye(`Ctrl+\` \xB7 ${v instanceof Error?v.message:String(v)}`)}},[Ye]),q=(0,N.useCallback)(async v=>{try{let w=await fetch("/api/viewer/state",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({actor:o.current,viewer:v})});if(!w.ok)return;let L=await w.json();i.current=Math.max(i.current,Number(L.viewer?.revision??0))}catch{}},[]),bt=v=>{let w=Math.max(.25,Math.min(3,v));f(w),q({scale:w})};(0,N.useEffect)(()=>{document.documentElement.style.setProperty("--viewer-canvas-scale",g.toFixed(3))},[g]),(0,N.useEffect)(()=>{if(!I)return;let v=r.current;if(!v)return;let w=0,L=()=>{window.cancelAnimationFrame(w),w=window.requestAnimationFrame(()=>{v.scrollLeft=Math.max(0,(v.scrollWidth-v.clientWidth)/2)})},H=window.requestAnimationFrame(L);return window.addEventListener("resize",L),()=>{window.cancelAnimationFrame(H),window.cancelAnimationFrame(w),window.removeEventListener("resize",L)}},[I,g,at]),(0,N.useEffect)(()=>{let v=()=>zt(window.innerWidth);return window.addEventListener("resize",v),()=>window.removeEventListener("resize",v)},[]),(0,N.useEffect)(()=>{document.documentElement.dataset.nvimSyncMode=_?"on":"off"},[_]),(0,N.useEffect)(()=>{document.documentElement.dataset.cardClientId=o.current},[]);let fe=v=>{b(v),v||(C(!1),T(!1)),localStorage.setItem("stem-card-nvim-visible",String(v)),q({nvim:{visible:v,...v?{}:{expanded:!1,fit:!1}}})},Qt=v=>{let w=v&&_;h(w),localStorage.setItem("stem-card-nvim-control-mode",String(w)),q({nvim:{control:w}})},jn=v=>{p(v),localStorage.setItem("stem-card-nvim-sync-mode",String(v)),v||(h(!1),localStorage.setItem("stem-card-nvim-control-mode","false")),q({nvim:{sync:v,control:v?c:!1}})},qt=v=>{v&&fe(!0),v&&T(!1),C(v),q({nvim:{visible:v||E,expanded:v,fit:!1}})},ho=v=>{v&&(fe(!0),C(!1)),T(v),q({nvim:{visible:v||E,fit:v,expanded:!1}})},yo=v=>{let w=t&&v;j(w),localStorage.setItem("stem-card-allocator-visible",String(w)),q({allocator:{visible:w}})},Un=v=>{let w=!!(e.has_spread&&v);ke(w),localStorage.setItem("stem-card-diagram-spread",String(w))};(0,N.useEffect)(()=>{let v=0,w=window.requestAnimationFrame(()=>{v=window.requestAnimationFrame(()=>{window.dispatchEvent(new Event("stem:nvim-refresh"))})});return()=>{window.cancelAnimationFrame(w),window.cancelAnimationFrame(v)}},[k,P]),(0,N.useEffect)(()=>{fetch("/api/progress").then(v=>v.ok?v.json():Promise.reject(new Error(`HTTP ${v.status}`))).then(v=>Le(v.progress)).catch(v=>Q(`Post\u0119p dzia\u0142a tylko przez serwer karty (${v.message}).`))},[]),(0,N.useEffect)(()=>{let v=!1,w=!1,L={scale:g,viewport:{width:window.innerWidth,height:window.innerHeight},nvim:{visible:E,sync:_,control:c,expanded:k,fit:P},allocator:{visible:R}},H=D=>{let Z=D.nvim.visible&&D.nvim.fit,V=D.nvim.visible&&!Z&&D.nvim.expanded;f(Math.max(.25,Math.min(3,D.scale))),b(D.nvim.visible),p(D.nvim.sync),h(D.nvim.sync&&D.nvim.control),C(V),T(Z);let oe=t&&(D.allocator?.visible??!0);j(oe),localStorage.setItem("stem-card-nvim-visible",String(D.nvim.visible)),localStorage.setItem("stem-card-nvim-sync-mode",String(D.nvim.sync)),localStorage.setItem("stem-card-nvim-control-mode",String(D.nvim.sync&&D.nvim.control)),localStorage.setItem("stem-card-allocator-visible",String(oe));let ct=++m.current;s.current=!0,window.cancelAnimationFrame(d.current),d.current=window.requestAnimationFrame(()=>{if(ct!==m.current)return;let Ue=Gi();Ki(Ue,{left:D.scroll.x,top:D.scroll.y});let ue=Array.from(document.querySelectorAll(".paper .sheet")),Re=ue[Math.max(0,Math.min(ue.length-1,D.scroll.page_index))]?.querySelector(".sheet-content");Re&&Number.isFinite(D.scroll.sheet_scroll_top)&&Ki(Re,{top:D.scroll.sheet_scroll_top??0}),d.current=window.requestAnimationFrame(()=>{ct===m.current&&(s.current=!1,u.current&&(u.current=!1,window.dispatchEvent(new Event("stem:viewer-scroll-settled"))))})})},K=async()=>{try{let D=await fetch("/api/control/state",{cache:"no-store"});if(!D.ok||v)return;let Z=await D.json(),V=Z.viewer;w||(w=!0,Number(V?.revision??0)===0&&q(L)),V&&V.revision>i.current&&(i.current=V.revision,V.actor!==o.current&&H(V));let oe=Z.navigation;oe&&oe.revision>l.current&&(l.current=oe.revision,oe.actor!==o.current&&(s.current&&(u.current=!0),window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:oe}))))}catch{}};K();let X=window.setInterval(K,300);return()=>{v=!0,window.clearInterval(X),m.current+=1,window.cancelAnimationFrame(d.current),s.current=!1,u.current=!1}},[]),(0,N.useEffect)(()=>{q({nvim:{connection:re.state,screen_cursor:re.screenCursor,grid:re.grid}})},[re.grid?.columns,re.grid?.rows,re.screenCursor?.column,re.screenCursor?.row,re.state,q]),(0,N.useEffect)(()=>{let v=0,w=null,L=Array.from(document.querySelectorAll(".paper .sheet")),H=L.map(X=>X.querySelector(".sheet-content")).filter(X=>!!X),K=X=>{if(s.current)return;let D=X?.currentTarget;D instanceof HTMLElement&&D.classList.contains("sheet-content")&&(w=D),window.clearTimeout(v),v=window.setTimeout(()=>{let Z=w?.closest(".sheet"),V=Z?L.indexOf(Z):-1,oe=V>=0?V:L.reduce((Ue,ue,J)=>{let Re=ue.getBoundingClientRect(),Ve=Math.abs((Re.top+Re.bottom)/2-window.innerHeight/2);return Ve=0?w:L[oe]?.querySelector(".sheet-content")??null;q({scroll:{x:window.scrollX,y:window.scrollY,page_index:oe,sheet_scroll_top:ct?.scrollTop??0},viewport:{width:window.innerWidth,height:window.innerHeight}}),w=null},120)};return window.addEventListener("scroll",K,{passive:!0}),window.addEventListener("resize",K),window.addEventListener("stem:viewer-scroll-settled",K),H.forEach(X=>X.addEventListener("scroll",K,{passive:!0})),K(),()=>{window.clearTimeout(v),window.removeEventListener("scroll",K),window.removeEventListener("resize",K),window.removeEventListener("stem:viewer-scroll-settled",K),H.forEach(X=>X.removeEventListener("scroll",K))}},[q]),(0,N.useEffect)(()=>{let v=w=>{if(w.repeat)return;let L=w.altKey&&!w.ctrlKey&&!w.metaKey?w.code:"";if(L==="Digit0"&&e.library){w.preventDefault(),w.stopImmediatePropagation(),F(!1),st(!Ee);return}if(L==="Digit1"){w.preventDefault(),w.stopImmediatePropagation(),fe(!E);return}if(L==="Digit2"){w.preventDefault(),w.stopImmediatePropagation(),jn(!_);return}if(L==="Digit3"){if(w.preventDefault(),w.stopImmediatePropagation(),!_)return;fe(!0),Qt(!c);return}if(L==="Digit4"){w.preventDefault(),w.stopImmediatePropagation(),qt(!k);return}if(L==="Digit5"){w.preventDefault(),w.stopImmediatePropagation(),ho(!P);return}if(L==="Digit6"&&t){w.preventDefault(),w.stopImmediatePropagation(),yo(!R);return}if(L==="Digit7"&&e.has_spread){w.preventDefault(),w.stopImmediatePropagation(),Un(!I);return}if((w.key==="F1"||w.key==="F2")&&!w.altKey&&!w.ctrlKey&&!w.metaKey&&!w.shiftKey){w.preventDefault(),w.stopImmediatePropagation(),wn(w.key);return}if(w.ctrlKey&&!w.altKey&&!w.metaKey&&!w.shiftKey&&(w.code==="Backquote"||w.key==="`")){w.preventDefault(),w.stopImmediatePropagation(),ie();return}if(w.key==="F12"){w.preventDefault(),w.stopImmediatePropagation(),st(!1),Ge(null),me(null),xe(null),se(null),F(H=>!H);return}if(w.key==="Escape"&&(ne||A)){w.preventDefault(),w.stopImmediatePropagation(),Ge(null),me(null),xe(null),se(null),F(!1);return}};return window.addEventListener("keydown",v,!0),()=>window.removeEventListener("keydown",v,!0)},[R,I,t,Ee,e.has_spread,e.library,c,k,P,_,E,wn,ie,A,ne]),(0,N.useEffect)(()=>{let v=n.current?.querySelector(".topbar");if(!v)return;let w=()=>{document.documentElement.style.setProperty("--side-panel-top",`${Math.ceil(v.getBoundingClientRect().bottom)}px`)};w();let L=new ResizeObserver(w);return L.observe(v),window.addEventListener("resize",w),()=>{L.disconnect(),window.removeEventListener("resize",w),document.documentElement.style.removeProperty("--side-panel-top")}},[]),(0,N.useEffect)(()=>()=>window.clearTimeout(y.current),[]),(0,N.useEffect)(()=>{let v=w=>{!w.altKey||w.ctrlKey||(w.preventDefault(),f(L=>{let H=Math.max(.25,Math.min(3,L*Math.exp(-Math.max(-120,Math.min(120,w.deltaY))*.001)));return q({scale:H}),H}))};return window.addEventListener("wheel",v,{passive:!1}),()=>window.removeEventListener("wheel",v)},[q]);let ut=async(v,w)=>{try{let L=await fetch(`/api/progress/${encodeURIComponent(v)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({status:w})});if(!L.ok)throw new Error(await L.text());Le((await L.json()).progress),Q("")}catch(L){Q(`Nie zapisano post\u0119pu: ${L instanceof Error?L.message:String(L)}`)}},x=(v,w)=>{ut(v,{pending:"approved",approved:"pending"}[w])},S=0,M=e.sections.map(v=>{let w=S;return S+=v.assets.length,{section:v,figureOffset:w}}),O=[];return M.forEach(v=>{let w=v.section.spread_group??"",L=O[O.length-1];if(w&&L?.spreadGroup===w){L.pages.push(v);return}O.push({key:w||v.section.id,spreadGroup:w,spreadLabel:v.section.spread_label??"",spreadColumns:v.section.spread_columns??1,pages:[v]})}),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{ref:n,className:`viewer-chrome${k?" is-nvim-expanded":""}${P?" is-nvim-fit":""}`,children:[(0,a.jsx)(bg,{toc:e.toc,libraryAvailable:!!e.library,libraryOpen:Ee,setLibraryOpen:st,scale:g,setScale:bt,nvimVisible:E,setNvimVisible:fe,nvimSyncMode:_,setNvimSyncMode:jn,nvimControlMode:c,setNvimControlMode:Qt,nvimExpanded:k,setNvimExpanded:qt,nvimFit:P,setNvimFit:ho,allocatorVisible:R,setAllocatorVisible:yo,hasAllocatorModel:t,diagramSpread:I,setDiagramSpread:Un,hasDiagramSpread:!!e.has_spread,nvimSummary:re,progress:U,progressError:Ne}),e.viewpoints?.length?(0,a.jsx)(xg,{viewpoints:e.viewpoints}):null,(0,a.jsx)(wg,{visible:t&&R,model:e}),(0,a.jsx)(Mg,{visible:E,syncMode:_,controlMode:c,expanded:k,fit:P,scale:g,onSummaryChange:G}),B&&(0,a.jsx)("output",{className:"viewer-action-toast",children:B})]}),(0,a.jsxs)("main",{ref:r,className:`paper${I?" is-diagram-spread":""}`,children:[(0,a.jsx)(Og,{front:e.front}),O.map(v=>{let w=Array.from({length:Math.ceil(v.pages.length/v.spreadColumns)},(D,Z)=>v.pages.slice(Z*v.spreadColumns,(Z+1)*v.spreadColumns)),H=Math.max(1,...w.map(D=>D.reduce((Z,V)=>Z+(V.section.page_orientation==="landscape"?297:210),Math.max(0,D.length-1)*2)))*(96/25.4)*g,K=Math.min(1,Math.max(.25,(at-24)/H)),X=v.pages.map(({section:D,figureOffset:Z})=>(0,a.jsx)(Wg,{section:D,progress:U,onCycle:x,onSetStatus:ut,figureOffset:Z},D.id));return v.spreadGroup?(0,a.jsx)("section",{className:"sheet-spread","data-spread-group":v.spreadGroup,"aria-label":v.spreadLabel||"Wielostronicowy diagram UML",style:{"--spread-columns":v.spreadColumns,"--spread-fit-scale":K},children:X},v.key):X[0]}),e.dictionary&&(0,a.jsxs)(ys,{header:e.dictionary.header_html,className:"dictionary-sheet",children:[(0,a.jsx)("h2",{children:"S\u0142ownik WE/EN/EK/KW"}),(0,a.jsx)(Yt,{html:e.dictionary.content_html})]})]}),(0,a.jsx)(hp,{side:"left",panels:[...e.library?[{id:"library",railLabel:"K",title:"Serie i karty",accent:"#167ca4",content:(0,a.jsx)(Qg,{library:e.library,onNavigate:()=>st(!1)})}]:[],{id:"contents",railLabel:"S",title:"Spis tre\u015Bci",accent:"#16805d",content:(0,a.jsx)(qg,{toc:e.toc,onNavigate:()=>{Ge(null),me(null)}})}],activeId:et,pinnedId:je,onActiveChange:Ge,onPinnedChange:me}),(0,a.jsx)(hp,{side:"right",panels:[{id:"classroom",railLabel:"U",title:"Klasa i stanowiska",accent:"#267357",content:(0,a.jsx)(th,{model:e})},{id:"progress",railLabel:"R",title:"Przebieg i raport",accent:"#b45b26",content:(0,a.jsx)(Xg,{progress:U,error:Ne})}],activeId:Dn,pinnedId:bn,onActiveChange:xe,onPinnedChange:se}),(0,a.jsx)(nh,{open:A,onClose:()=>F(!1)})]})}async function oh(){let e=(0,bp.createRoot)(document.getElementById("root"));try{let t=await fetch("./card-data.json",{cache:"no-store"});if(!t.ok)throw new Error(`Nie mo\u017Cna wczyta\u0107 card-data.json: ${t.status}`);let n=await t.json();e.render((0,a.jsx)(rh,{model:n}))}catch(t){e.render((0,a.jsxs)("main",{className:"app-load-error",children:[(0,a.jsx)("h1",{children:"Nie uda\u0142o si\u0119 uruchomi\u0107 karty"}),(0,a.jsx)("pre",{children:t instanceof Error?t.message:String(t)})]}))}}oh(); +`),lines:v.target.value.split(` +`)}}))})]}),(0,a.jsxs)("div",{className:"uml-layout-style-grid",children:[(0,a.jsxs)("label",{children:["Font",(0,a.jsx)("input",{type:"number",min:"4",max:"96",step:"0.5",value:ct.text?.font_size??12,onChange:v=>oe(J,x=>({...x,text:{...x.text,font_size:Number(v.target.value)}}))})]}),(0,a.jsxs)("label",{children:["Wyr\xF3wnanie",(0,a.jsxs)("select",{value:ct.text?.align??"left",onChange:v=>oe(J,x=>({...x,text:{...x.text,align:v.target.value}})),children:[(0,a.jsx)("option",{value:"left",children:"left"}),(0,a.jsx)("option",{value:"center",children:"center"}),(0,a.jsx)("option",{value:"right",children:"right"})]})]}),(0,a.jsxs)("label",{children:["Wype\u0142nienie",(0,a.jsx)("input",{type:"color",value:ct.style?.fill??"#edf6fa",onChange:v=>oe(J,x=>({...x,style:{...x.style,fill:v.target.value}}))})]}),(0,a.jsxs)("label",{children:["Obramowanie",(0,a.jsx)("input",{type:"color",value:ct.style?.stroke??"#2c7794",onChange:v=>oe(J,x=>({...x,style:{...x.style,stroke:v.target.value}}))})]}),(0,a.jsxs)("label",{children:["Linia",(0,a.jsx)("input",{type:"number",min:"0.5",max:"12",step:"0.25",value:ct.style?.stroke_width??1.5,onChange:v=>oe(J,x=>({...x,style:{...x.style,stroke_width:Number(v.target.value)}}))})]})]})]}),(0,a.jsxs)("div",{className:"uml-layout-editor-actions",children:[(0,a.jsx)("button",{className:"is-primary",disabled:!ae,onClick:()=>void wt(),children:"Zapisz uk\u0142ad"}),(0,a.jsx)("button",{disabled:!ae,onClick:kn,children:"Cofnij zmiany"}),(0,a.jsx)("button",{className:"is-danger",onClick:()=>void Dt(),children:"Reset PlantUML"})]}),(0,a.jsx)("output",{children:q})]})]})]})}function nh(e){return e.config.phases?.length?(0,a.jsx)(th,{...e}):(0,a.jsx)(eh,{...e})}function rh({asset:e,continuation:t}){let n=e.tile;if(!n)return(0,a.jsx)("img",{src:e.href,alt:e.alt,loading:"lazy"});let r=e.diagram_block_label?.match(/^A[1-8]\b/)?.[0]??e.diagram_title?.match(/^A[1-8]\b/)?.[0]??e.caption.match(/^A[1-8]\b/)?.[0]??"UML",o=(e.diagram_title??e.caption).replace(/^A[1-8]\s*[·—:-]\s*/i,"");return(0,a.jsxs)("div",{className:"uml-react uml-snapshot-react uml-static-tile",children:[(0,a.jsx)("header",{className:"uml-snapshot-header",children:(0,a.jsxs)("div",{className:"uml-header-first-line",children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)("span",{children:r})," \u2014 ",o,(0,a.jsxs)("small",{className:"uml-tile-part",children:["cz\u0119\u015B\u0107 ",n.index,"/",n.count," \xB7 r",n.row," c",n.column]})]}),(0,a.jsxs)("div",{className:"uml-header-navigation",children:[(0,a.jsx)(Pp,{continuation:t}),(0,a.jsx)("div",{className:"uml-phase-actions","aria-label":"Fazy logicznego diagramu",children:(e.diagram_phase_labels??[]).map(i=>(0,a.jsx)("span",{children:i},i))})]})]})}),(0,a.jsx)("div",{className:"uml-snapshot-layout",children:(0,a.jsx)("div",{className:"uml-canvas uml-step-canvas",children:(0,a.jsx)("div",{className:"uml-svg-host is-tiled is-static",style:vs(n),children:(0,a.jsx)("div",{className:"uml-static-crop",style:{width:`${n.width}px`,height:`${n.height}px`},children:(0,a.jsx)("img",{src:e.href,alt:e.alt,style:{width:`${n.full_width}px`,height:`${n.full_height}px`,transform:`translate(${-(n.x-n.full_x)}px, ${-(n.y-n.full_y)}px)`}})})})})})]})}function oh({asset:e,number:t,progress:n,onSetStatus:r,continuation:o}){let i=e.interactive?.kind,l=!!i;return(0,a.jsxs)("figure",{className:`card-asset asset-${e.kind} ${l?"asset-interactive":""}`,id:e.label.replace(":","-"),children:[i==="uml-sequence"||i==="uml-class"?(0,a.jsx)(nh,{config:e.interactive,asset:e,progress:n,onSetStatus:r,continuation:o}):i==="allocator-memory-flow"?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(Jg,{config:e.interactive,title:e.caption}),(0,a.jsx)("img",{className:"asset-static-fallback",src:e.href,alt:e.alt})]}):e.tile?(0,a.jsx)(rh,{asset:e,continuation:o}):(0,a.jsx)("a",{href:e.href,target:"_blank",rel:"noopener",children:(0,a.jsx)("img",{src:e.href,alt:e.alt,loading:"lazy",style:{width:`${e.width*100}%`}})}),(0,a.jsxs)("figcaption",{children:["Rys. ",e.figure_number??t,". ",e.caption]}),e.diagram_description&&(0,a.jsxs)("aside",{className:"uml-after-description",children:[(0,a.jsx)("strong",{children:"Interpretacja"}),(0,a.jsx)("p",{children:e.diagram_description})]})]})}function ih({steps:e,progress:t,onCycle:n}){if(!e.length)return null;let r={pending:"\u25CB niezatwierdzony",approved:"\u25CF zatwierdzony"};return(0,a.jsx)("div",{className:"step-map",children:e.map(o=>{let i=t?.items?.[o.id]?.status??"pending";return(0,a.jsxs)("div",{className:`step-row ${i==="approved"?"lesson-progress-completed":""}`,children:[(0,a.jsx)("button",{className:"lesson-progress-control","data-status":i,onClick:()=>n(o.id,i),disabled:!t,children:r[i]}),(0,a.jsx)("span",{className:"step-title",children:o.title})]},o.id)})})}function lh({section:e,progress:t,onCycle:n,onSetStatus:r,figureOffset:o}){let i=Pg(e);return(0,a.jsxs)(bs,{header:e.header_html,footer:e.footer_html,left:e.left_margin_html,right:e.right_margin_html,className:`section-sheet${e.assets.length?" section-sheet--asset":""} sheet--${e.page_orientation||"portrait"}`,children:[(0,a.jsx)("div",{id:e.id,className:"section-anchor"}),e.show_heading&&(0,a.jsxs)("h2",{className:"section-heading",children:[(0,a.jsx)("span",{className:"section-index",children:e.index}),(0,a.jsx)("span",{className:"section-title",children:e.title})]}),(0,a.jsx)(ih,{steps:e.steps,progress:t,onCycle:n}),e.content_html&&(0,a.jsx)(Ft,{html:e.content_html}),(0,a.jsx)("div",{className:"tasks",children:e.tasks.map(l=>(0,a.jsx)(Zg,{task:l},l.ref))}),e.assets.map((l,s)=>(0,a.jsx)(oh,{asset:l,number:o+s+1,progress:t,onSetStatus:r,continuation:i},l.label)),e.tasks.map(l=>l.conclusion_html&&(0,a.jsxs)("aside",{className:"task-conclusion",children:[(0,a.jsx)("strong",{children:"WNIOSEK"}),(0,a.jsx)(Ft,{html:l.conclusion_html})]},`${l.ref}-conclusion`))]})}function ah({progress:e,error:t}){if(!e?.summary&&!t)return null;let n=e?.summary.counts;return(0,a.jsxs)("section",{className:"lesson-progress-topbar","aria-label":"Przebieg zaj\u0119\u0107",children:[(0,a.jsx)("strong",{children:"PRZEBIEG"}),n&&(0,a.jsxs)("output",{title:"Zatwierdzone kroki",children:[n.approved,"/",e.summary.total]}),t&&(0,a.jsx)("span",{className:"lesson-progress-error",title:t,children:"!"}),(0,a.jsx)("a",{href:"/api/report/teams.md",target:"_blank",rel:"noopener",title:"Otw\xF3rz raport do Teams",children:"Teams"}),(0,a.jsx)("a",{href:"/api/report/lesson.html",target:"_blank",rel:"noopener",title:"Otw\xF3rz \u015Blad lekcji ze zrzutami",children:"\u015Alad"})]})}var Fn=[{id:"u01",name:"Alicja Nowak",laptop:3,connection:"online",sync:"follow",position:"A5\xB708"},{id:"u02",name:"Bartosz Kowalski",laptop:7,connection:"online",sync:"follow",position:"A5\xB708"},{id:"u03",name:"Celina Wi\u015Bniewska",laptop:11,connection:"away",sync:"paused",position:"A5\xB705"},{id:"u04",name:"Dawid W\xF3jcik",laptop:14,connection:"offline",sync:"follow",position:"\u2014"},{id:"u05",name:"Emilia Kami\u0144ska",laptop:18,connection:"online",sync:"local",position:"A3\xB702"},{id:"u06",name:"Filip Lewandowski",laptop:22,connection:"error",sync:"follow",position:"A5\xB706"},{id:"u07",name:"Gabriela Zieli\u0144ska",laptop:24,connection:"online",sync:"follow",position:"A5\xB708"}];function sh(e){let t=new Map,n=(r,o)=>{let i=r.trim()||"task",l=t.get(i);return l||(l={id:i,label:o.trim()||i.toUpperCase(),blocks:[],exercises:[]},t.set(i,l)),l};for(let r of e.sections){for(let o of r.assets){let i=o.interactive;if(!i?.task||!i.block)continue;let l=n(i.task.id,i.task.label),s=`diagram:${i.block.id}`,u=l.blocks.find(d=>d.id===s);u||(u={id:s,label:i.block.label,kind:"diagram",phases:[],steps:[]},l.blocks.push(u));for(let d of i.phases??[]){let m=u.phases.find(y=>y.id===d.id);m||(m={...d,steps:[]},u.phases.push(m));for(let y of d.steps)m.steps.some(g=>g.id===y.id)||m.steps.push(y)}}for(let o of r.tasks){let i=n(o.ref,o.title);i.label=o.title||i.label;for(let l of o.flow){if(l.kind==="exercise"){i.exercises.some(u=>u.id===l.id)||i.exercises.push(l);continue}let s=`flow:${l.id}`;i.blocks.some(u=>u.id===s)||i.blocks.push({id:s,label:l.title,kind:"flow",phases:[],steps:l.steps.map((u,d)=>({id:u.id,number:d+1,label:u.title,description:u.title,mode:"RUN"}))})}}}return[...t.values()]}function bp({side:e,panels:t,activeId:n,pinnedId:r,onActiveChange:o,onPinnedChange:i}){let l=(0,k.useRef)(0),s=t.find(f=>f.id===n)??null,u=(0,k.useCallback)(()=>{window.clearTimeout(l.current)},[]),d=(0,k.useCallback)(()=>{u(),!r&&(l.current=window.setTimeout(()=>o(null),150))},[u,o,r]),m=(0,k.useCallback)(f=>{u(),r||o(f)},[u,o,r]),y=(0,k.useCallback)(f=>{if(u(),r===f){i(null),o(null);return}i(f),o(f)},[u,o,i,r]),g=(0,k.useCallback)(()=>{u(),i(null),o(null)},[u,o,i]);return(0,k.useEffect)(()=>()=>window.clearTimeout(l.current),[]),t.length?(0,a.jsxs)("div",{className:`side-panel-dock side-panel-dock--${e}`,"data-side":e,children:[(0,a.jsx)("nav",{className:"side-panel-rail","aria-label":`Panele ${e==="left"?"lewe":"prawe"}`,children:t.map(f=>{let S=n===f.id,b=r===f.id;return(0,a.jsx)("button",{type:"button",className:`side-panel-trigger${S?" is-open":""}${b?" is-pinned":""}`,style:{"--side-panel-accent":f.accent},"aria-controls":`side-panel-${e}-${f.id}`,"aria-expanded":S,"aria-pressed":b,"aria-label":`${f.title}: ${b?"odpnij":"przypnij"} panel`,title:`${f.title} \xB7 ${b?"Fixed":"Auto"}`,onMouseEnter:()=>m(f.id),onMouseLeave:d,onFocus:()=>m(f.id),onClick:()=>y(f.id),children:(0,a.jsx)("span",{children:f.railLabel})},f.id)})}),(0,a.jsx)("aside",{id:s?`side-panel-${e}-${s.id}`:void 0,className:`side-panel${s?" is-open":""}`,"aria-hidden":!s,"aria-label":s?.title,style:s?{"--side-panel-accent":s.accent}:void 0,onMouseEnter:u,onMouseLeave:d,onFocusCapture:u,children:s&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("header",{className:"side-panel-header",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:e==="left"?"LEWY PANEL":"PRAWY PANEL"}),(0,a.jsx)("strong",{children:s.title})]}),(0,a.jsxs)("div",{className:"side-panel-actions",children:[(0,a.jsx)("button",{type:"button",className:r===s.id?"is-pinned":"",onClick:()=>y(s.id),title:r===s.id?"Tryb Fixed \u2014 kliknij, aby przej\u015B\u0107 do Auto":"Tryb Auto \u2014 kliknij, aby przypi\u0105\u0107",children:r===s.id?"Fixed":"Auto"}),(0,a.jsx)("button",{type:"button",onClick:g,"aria-label":`Zamknij ${s.title}`,children:"\xD7"})]})]}),(0,a.jsx)("div",{className:"side-panel-body",children:s.content})]})})]}):null}function go({id:e,depth:t,kind:n,title:r,label:o,refValue:i,stateValue:l,stateKind:s,hasChildren:u=!1,expanded:d=!1,onToggle:m,href:y,current:g=!1,unavailable:f=!1,onNavigate:S}){let b=y?(0,a.jsx)("a",{className:"card-library-tree-link","data-stem-source-aware":"true",href:y,onClick:S,"aria-current":g?"page":void 0,title:g?"Poka\u017C bie\u017C\u0105c\u0105 kart\u0119":`Otw\xF3rz: ${r}`,children:o}):(0,a.jsx)("span",{className:"card-library-tree-label",title:r,children:o});return(0,a.jsxs)("div",{className:`card-library-treegrid-row is-${n}${g?" is-current":""}${f?" is-unavailable":""}`,role:"row","aria-level":t+1,"aria-expanded":u?d:void 0,"aria-disabled":f||void 0,"data-node-id":e,style:{"--card-library-depth":t},children:[(0,a.jsxs)("span",{className:"card-library-tree-title",role:"gridcell",children:[u?(0,a.jsx)("button",{className:"card-library-tree-expander",type:"button",onClick:m,"aria-label":`${d?"Zwi\u0144":"Rozwi\u0144"}: ${r}`,children:d?"\u25BE":"\u25B8"}):(0,a.jsx)("span",{className:"card-library-tree-expander is-empty","aria-hidden":"true"}),b]}),(0,a.jsx)("span",{role:"gridcell",children:i}),(0,a.jsx)("span",{role:"gridcell",children:(0,a.jsx)("b",{className:"card-library-tree-state","data-state":s,children:l})})]})}function uh({library:e,source:t,onNavigate:n}){if(!e)return null;let r=e.subjects.reduce((m,y)=>m+y.levels.reduce((g,f)=>g+f.series.length,0),0),o=e.subjects.reduce((m,y)=>m+y.levels.reduce((g,f)=>g+f.series.reduce((S,b)=>S+b.cards.filter(_=>_.available).length,0),0),0),i=e.subjects.reduce((m,y)=>m+y.levels.reduce((g,f)=>g+f.series.reduce((S,b)=>S+b.cards.length,0),0),0),[l,s]=(0,k.useState)(()=>{let m=new Set;return e.subjects.forEach(y=>{let g=`subject:${y.id}`;y.current&&m.add(g),y.levels.forEach(f=>{let S=`${g}:level:${f.id}`;f.current&&m.add(S),f.series.forEach(b=>{let _=`${S}:series:${b.id}`;b.current&&m.add(_),b.cards.forEach(p=>{p.current&&(p.tasks?.length??0)>0&&m.add(`${_}:card:${p.id}`)})})})}),m}),u=m=>l.has(m),d=m=>{s(y=>{let g=new Set(y);return g.has(m)?g.delete(m):g.add(m),g})};return(0,a.jsxs)("div",{className:"card-library-panel",children:[(0,a.jsxs)("div",{className:"card-library-treegrid",role:"treegrid","aria-label":"Serie, karty i taski","aria-colcount":3,children:[(0,a.jsxs)("div",{className:"card-library-treegrid-row card-library-treegrid-head",role:"row",children:[(0,a.jsx)("span",{role:"columnheader",children:"DRZEWO"}),(0,a.jsx)("span",{role:"columnheader",children:"REF"}),(0,a.jsx)("span",{role:"columnheader",children:"STATUS"})]}),e.subjects.map(m=>{let y=`subject:${m.id}`;return(0,a.jsxs)(k.default.Fragment,{children:[(0,a.jsx)(go,{id:y,depth:0,kind:"subject",title:m.title,label:(0,a.jsx)("strong",{children:m.title}),refValue:"PRZEDMIOT",stateValue:`${m.levels.length} POZ.`,hasChildren:m.levels.length>0,expanded:u(y),onToggle:()=>d(y)}),u(y)&&m.levels.map(g=>{let f=`${y}:level:${g.id}`;return(0,a.jsxs)(k.default.Fragment,{children:[(0,a.jsx)(go,{id:f,depth:1,kind:"level",title:g.title,label:(0,a.jsx)("strong",{children:g.title}),refValue:"ROK",stateValue:`${g.series.length} SERII`,hasChildren:g.series.length>0,expanded:u(f),onToggle:()=>d(f)}),u(f)&&g.series.map(S=>{let b=`${f}:series:${S.id}`;return(0,a.jsxs)(k.default.Fragment,{children:[(0,a.jsx)(go,{id:b,depth:2,kind:"series",title:S.title,label:(0,a.jsx)("strong",{children:S.title}),refValue:S.role==="reference"?"REF.":"SERIA",stateValue:`${S.cards.length} KART`,hasChildren:S.cards.length>0,expanded:u(b),onToggle:()=>d(b)}),u(b)&&S.cards.map(_=>{let p=`${b}:card:${_.id}`,c=_.tasks??[],h=_.current||_.available,w=vg(_,t),C=_.current?"current":_.available?"online":"plan";return(0,a.jsxs)(k.default.Fragment,{children:[(0,a.jsx)(go,{id:p,depth:3,kind:"card",title:`${_.id} \xB7 ${_.title}`,label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("strong",{children:_.id}),(0,a.jsx)("span",{children:_.title})]}),refValue:_.version||"\u2014",stateValue:_.current?"BIE\u017B\u0104CA":_.available?"ONLINE":"PLAN",stateKind:C,hasChildren:c.length>0,expanded:u(p),onToggle:()=>d(p),href:h?_.current?"#":w:void 0,current:_.current,unavailable:!h,onNavigate:n}),u(p)&&c.map(A=>{let P=_.current?`#${A.id}`:`${w}#${A.id}`;return(0,a.jsx)(go,{id:`${p}:task:${A.id}`,depth:4,kind:"task",title:`${A.id.toUpperCase()} \xB7 ${A.title}`,label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("strong",{children:A.id.toUpperCase()}),(0,a.jsx)("span",{children:A.title})]}),refValue:"TASK",stateValue:h?"GOTOWY":"PLAN",stateKind:h?"online":"plan",href:h?P:void 0,unavailable:!h,onNavigate:n},`${p}:task:${A.id}`)})]},p)})]},b)})]},f)})]},y)})]}),(0,a.jsxs)("footer",{className:"card-library-footer",children:[(0,a.jsx)("span",{children:e.workspace||"STEM"}),(0,a.jsxs)("span",{children:[r," serii"]}),(0,a.jsxs)("span",{children:[(0,a.jsx)("i",{className:"is-online"})," ",o,"/",i," online"]}),(0,a.jsx)("kbd",{children:"Esc"})]})]})}function ch({toc:e,onNavigate:t}){return(0,a.jsxs)("nav",{className:"side-toc","aria-label":"Spis tre\u015Bci karty",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("small",{children:"KARTA PRACY"}),(0,a.jsx)("h2",{children:"Spis tre\u015Bci"})]}),(0,a.jsx)("ol",{children:e.map((n,r)=>(0,a.jsx)("li",{children:(0,a.jsxs)("a",{href:`#${n.id}`,onClick:t,children:[(0,a.jsx)("span",{children:String(r+1).padStart(2,"0")}),(0,a.jsx)("strong",{children:n.label})]})},n.id))})]})}function dh({progress:e,error:t}){let n=e?.summary?.counts;return(0,a.jsxs)("section",{className:"side-progress","aria-label":"Przebieg zaj\u0119\u0107 i raport",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("small",{children:"DOWODY I RAPORT"}),(0,a.jsx)("h2",{children:"Przebieg zaj\u0119\u0107"})]}),(0,a.jsxs)("div",{className:"side-progress-summary",children:[(0,a.jsx)("span",{children:"Zatwierdzone kroki"}),(0,a.jsx)("strong",{children:n?`${n.approved}/${e.summary.total}`:"\u2014"})]}),t&&(0,a.jsx)("p",{className:"side-progress-error",children:t}),(0,a.jsxs)("div",{className:"side-progress-links",children:[(0,a.jsx)("a",{href:"/api/report/teams.md",target:"_blank",rel:"noopener",children:"Raport do Teams"}),(0,a.jsx)("a",{href:"/api/report/lesson.html",target:"_blank",rel:"noopener",children:"\u015Alad lekcji ze zrzutami"})]})]})}var ph={online:"ONLINE",away:"ZAJ\u0118TY",offline:"OFFLINE",error:"B\u0141\u0104D"},mh={follow:"SYNC",paused:"PAUZA",local:"LOKAL."},xp={present:"BY\u0141",missed:"NIE BY\u0141",pending:"OCZEK."},fh={committed:"COMMIT",working:"PRACA",missing:"BRAK"};function Mp(e){let t=2166136261;for(let n=0;n>>0}function wp(e,t,n){let r=Mp(`${e.id}:step:${t}`),o=r%8,i=o===0?"missed":o===1?"pending":"present",l=8+n*4+r%3,s=10+Math.floor(l/60),u=l%60,d=(e.laptop*7+r)%60;return{state:i,timestamp:i==="present"?`${String(s).padStart(2,"0")}:${String(u).padStart(2,"0")}:${String(d).padStart(2,"0")}`:"\u2014"}}function kp(e,t){let n=Mp(`${e.id}:exercise:${t}`),r=n%6,o=r===0?"missing":r===1?"working":"committed";return{state:o,commit:o==="committed"?n.toString(16).padStart(8,"0").slice(0,7):"\u2014"}}function Xt({id:e,depth:t,title:n,kind:r,refValue:o,session:i,evidence:l,state:s,hasChildren:u=!1,expanded:d=!1,onToggle:m}){return(0,a.jsxs)("div",{className:`classroom-treegrid-row classroom-node-row is-${r}`,role:"row","aria-level":t+1,"aria-expanded":u?d:void 0,"data-node-id":e,style:{"--classroom-depth":t},children:[(0,a.jsxs)("span",{className:"classroom-node-title",role:"gridcell",title:n,children:[u?(0,a.jsx)("button",{className:"classroom-expander",type:"button",onClick:m,"aria-label":`${d?"Zwi\u0144":"Rozwi\u0144"}: ${n}`,children:d?"\u25BE":"\u25B8"}):(0,a.jsx)("span",{className:"classroom-expander is-empty","aria-hidden":"true"}),(0,a.jsx)("strong",{children:n})]}),(0,a.jsx)("span",{role:"gridcell",children:o}),(0,a.jsx)("span",{role:"gridcell",children:i}),(0,a.jsx)("span",{role:"gridcell",children:l}),(0,a.jsx)("span",{role:"gridcell",children:s})]})}function gh({model:e}){let t=sh(e),n=Fn[0]?.id,r=t[0]?.id,[o,i]=(0,k.useState)(()=>new Set(["class",...n?[`student:${n}`]:[],...n&&r?[`student:${n}:task:${r}`]:[]])),l=m=>o.has(m),s=m=>{i(y=>{let g=new Set(y);return g.has(m)?g.delete(m):g.add(m),g})},u=Fn.filter(m=>m.connection==="online"||m.connection==="away").length,d=Fn.filter(m=>m.sync==="follow").length;return(0,a.jsxs)("section",{className:"classroom-panel","aria-label":"Klasa i stanowiska uczni\xF3w",children:[(0,a.jsxs)("div",{className:"classroom-treegrid",role:"treegrid","aria-label":"Uczniowie, struktura karty, obecno\u015B\u0107 i commity","aria-colcount":5,children:[(0,a.jsxs)("div",{className:"classroom-treegrid-row classroom-treegrid-head",role:"row",children:[(0,a.jsx)("span",{role:"columnheader",children:"DRZEWO"}),(0,a.jsx)("span",{role:"columnheader",children:"REF"}),(0,a.jsx)("span",{role:"columnheader",children:"SESJA"}),(0,a.jsx)("span",{role:"columnheader",children:"DOW\xD3D"}),(0,a.jsx)("span",{role:"columnheader",children:"STAN"})]}),(0,a.jsx)(Xt,{id:"class",depth:0,kind:"class",title:"2TP \xB7 grupa A",refValue:`${Fn.length} ucz.`,session:`${u}/${Fn.length}`,evidence:`${d}/${Fn.length} SYNC`,state:`${t.length} TASK`,hasChildren:!0,expanded:l("class"),onToggle:()=>s("class")}),l("class")&&Fn.map(m=>{let y=`student:${m.id}`;return(0,a.jsxs)(k.default.Fragment,{children:[(0,a.jsx)(Xt,{id:y,depth:1,kind:"student",title:m.name,refValue:`L${String(m.laptop).padStart(2,"0")}`,session:(0,a.jsx)("b",{className:"classroom-status","data-status":m.connection,children:ph[m.connection]}),evidence:(0,a.jsx)("b",{className:"classroom-sync","data-sync":m.sync,children:mh[m.sync]}),state:m.position,hasChildren:t.length>0,expanded:l(y),onToggle:()=>s(y)}),l(y)&&t.map(g=>{let f=`${y}:task:${g.id}`,S=g.exercises.filter(b=>kp(m,b.id).state==="committed").length;return(0,a.jsxs)(k.default.Fragment,{children:[(0,a.jsx)(Xt,{id:f,depth:2,kind:"task",title:g.label,refValue:g.id.toUpperCase(),session:`${g.blocks.length} BLOCK`,evidence:`${S}/${g.exercises.length} COMMIT`,state:"TASK",hasChildren:g.blocks.length+g.exercises.length>0,expanded:l(f),onToggle:()=>s(f)}),l(f)&&g.blocks.map(b=>{let _=`${f}:block:${b.id}`,p=b.phases.length||b.steps.length;return(0,a.jsxs)(k.default.Fragment,{children:[(0,a.jsx)(Xt,{id:_,depth:3,kind:"block",title:b.label,refValue:b.kind==="diagram"?"BLOCK":"TASK BLOCK",session:`${p} ${b.phases.length?"PHASE":"STEP"}`,evidence:"\u2014",state:b.kind==="diagram"?"UML":"FLOW",hasChildren:p>0,expanded:l(_),onToggle:()=>s(_)}),l(_)&&b.phases.map(c=>{let h=`${_}:phase:${c.id}`;return(0,a.jsxs)(k.default.Fragment,{children:[(0,a.jsx)(Xt,{id:h,depth:4,kind:"phase",title:`PHASE \xB7 ${c.label}`,refValue:`${c.steps.length} STEP`,session:"\u2014",evidence:"\u2014",state:"PHASE",hasChildren:c.steps.length>0,expanded:l(h),onToggle:()=>s(h)}),l(h)&&c.steps.map(w=>{let C=wp(m,`${b.id}:${c.id}:${w.id}`,w.number);return(0,a.jsx)(Xt,{id:`${h}:step:${w.id}`,depth:5,kind:"step",title:`STEP ${String(w.number).padStart(2,"0")} \xB7 ${w.label}`,refValue:w.mode??"CODE",session:(0,a.jsx)("b",{className:"classroom-visit","data-visit":C.state,children:xp[C.state]}),evidence:C.timestamp,state:C.state==="present"?"OK":C.state==="missed"?"BRAK":"\u2014"},`${h}:step:${w.id}`)})]},h)}),l(_)&&b.steps.map(c=>{let h=wp(m,`${b.id}:${c.id}`,c.number);return(0,a.jsx)(Xt,{id:`${_}:step:${c.id}`,depth:4,kind:"step",title:`STEP ${String(c.number).padStart(2,"0")} \xB7 ${c.label}`,refValue:c.mode??"RUN",session:(0,a.jsx)("b",{className:"classroom-visit","data-visit":h.state,children:xp[h.state]}),evidence:h.timestamp,state:h.state==="present"?"OK":h.state==="missed"?"BRAK":"\u2014"},`${_}:step:${c.id}`)})]},_)}),l(f)&&g.exercises.length>0&&(()=>{let b=`${f}:exercises`;return(0,a.jsxs)(k.default.Fragment,{children:[(0,a.jsx)(Xt,{id:b,depth:3,kind:"exercises",title:"EXERCISES",refValue:`${g.exercises.length} EX`,session:`${S}/${g.exercises.length}`,evidence:"GIT",state:S===g.exercises.length?"DONE":"TODO",hasChildren:!0,expanded:l(b),onToggle:()=>s(b)}),l(b)&&g.exercises.map(_=>{let p=kp(m,_.id);return(0,a.jsx)(Xt,{id:`${b}:${_.id}`,depth:4,kind:"exercise",title:`EXERCISE \xB7 ${_.title}`,refValue:_.id,session:(0,a.jsx)("b",{className:"classroom-commit","data-commit":p.state,children:fh[p.state]}),evidence:p.commit,state:p.state==="committed"?"DONE":p.state==="working"?"W TOKU":"TODO"},`${b}:${_.id}`)})]},b)})()]},f)})]},m.id)})]}),(0,a.jsxs)("footer",{className:"classroom-legend",children:[(0,a.jsxs)("span",{children:[(0,a.jsx)("b",{children:"BY\u0141"})," obecny przy omawianym STEP"]}),(0,a.jsxs)("span",{children:[(0,a.jsx)("b",{children:"COMMIT"})," rozwi\u0105zanie EXERCISE zapisane w Git"]})]})]})}function hh({open:e,onClose:t}){return e?(0,a.jsx)("div",{className:"shortcut-help-backdrop",role:"presentation",onMouseDown:t,children:(0,a.jsxs)("section",{className:"shortcut-help",role:"dialog","aria-modal":"true","aria-labelledby":"shortcut-help-title",onMouseDown:r=>r.stopPropagation(),children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"F12 \xB7 NAWIGACJA DYDAKTYCZNA"}),(0,a.jsx)("h2",{id:"shortcut-help-title",children:"CARD \u2192 TASK \u2192 BLOCK \u2192 PHASE \u2192 STEP \u2192 SNAPSHOT"})]}),(0,a.jsx)("button",{onClick:t,"aria-label":"Zamknij skorowidz",children:"\xD7"})]}),(0,a.jsx)("dl",{children:[["Alt + \u2191 / \u2193","poprzedni / nast\u0119pny TASK"],["Ctrl + \u2191 / \u2193","poprzedni / nast\u0119pny BLOCK"],["Shift + \u2191 / \u2193","poprzednia / nast\u0119pna PHASE"],["Ctrl + Shift + \u2191 / \u2193","poprzedni / nast\u0119pny STEP"],["Alt + Shift + \u2191 / \u2193","poprzedni / nast\u0119pny unikalny SNAPSHOT"],["\u2191 / \u2193","poprzedni / nast\u0119pny element aktywnego poziomu"],["\u2192","zejd\u017A poziom ni\u017Cej"],["\u2190 / Esc","wr\xF3\u0107 poziom wy\u017Cej"],["Enter","wybierz element; przy SYNC ON odtw\xF3rz stan"],["F1","reset aktualnego celu Neovima/kontenera"],["F2","synchronizuj cel z kursorem drzewa UML"],["Ctrl + `","maksymalizuj pane, dopasuj siatk\u0119 i od\u015Bwie\u017C Neovima"],["Ctrl + Enter","zatwierd\u017A lub cofnij zatwierdzenie kroku"],["Alt + 0","wysu\u0144 lub schowaj panel serii i kart"],["Alt + 1","poka\u017C lub ukryj panel Neovima"],["Alt + 2","prze\u0142\u0105cz SYNC OFF / SYNC ON"],["Alt + 3","uzbr\xF3j lub rozbr\xF3j sterowanie Neovimem"],["Alt + 4","wysoki panel 90% / zapisana wysoko\u015B\u0107 normalna"],["Alt + 5","dopasuj ca\u0142y ekran Neovima; wy\u0142\u0105cz r\u0119czny suwak"],["Alt + 6","przypnij lub ukryj model alokatora"],["Alt + 7","po\u0142\u0105cz segmenty UML w szeroki spread / wr\xF3\u0107 do A4"],["Alt + 3, potem najed\u017A","przeka\u017C klawiatur\u0119 i mysz do aktywnej sesji"],["Alt + W","prefiks polece\u0144 okien Neovima ()"],["Alt + strza\u0142ka","przejd\u017A do s\u0105siedniego okna Neovima"],["F12","poka\u017C lub ukryj ten skorowidz"]].map(([r,o])=>(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:(0,a.jsx)("kbd",{children:r})}),(0,a.jsx)("dd",{children:o})]},r))}),(0,a.jsx)("p",{children:"Przy SYNC ON wyb\xF3r stepu odtwarza i weryfikuje przypi\u0119ty stan maszyny. SYNC OFF nie resetuje debuggera. Po najechaniu panel przekazuje do Neovima wy\u0142\u0105cznie kontrolowane zdarzenia klawiatury i myszy, wi\u0119c mo\u017Cna normalnie kontynuowa\u0107 debugowanie."})]})}):null}function yh({model:e}){let t=!!e.has_allocator_model,[n]=(0,k.useState)(hg),r=n.sources.find(E=>E.id===n.active_source)??n.sources[0],o=(0,k.useRef)(null),i=(0,k.useRef)(null),l=(0,k.useRef)(`browser-${globalThis.crypto?.randomUUID?.()??Math.random().toString(36).slice(2)}`),s=(0,k.useRef)(0),u=(0,k.useRef)(0),d=(0,k.useRef)(!1),m=(0,k.useRef)(!1),y=(0,k.useRef)(0),g=(0,k.useRef)(0),f=(0,k.useRef)(0),[S,b]=(0,k.useState)(2.18),[_,p]=(0,k.useState)(()=>localStorage.getItem("stem-card-nvim-visible")!=="false"),[c,h]=(0,k.useState)(()=>localStorage.getItem("stem-card-nvim-sync-mode")==="true"),[w,C]=(0,k.useState)(()=>localStorage.getItem("stem-card-nvim-sync-mode")==="true"&&localStorage.getItem("stem-card-nvim-control-mode")==="true"),[A,P]=(0,k.useState)(!1),[z,U]=(0,k.useState)(!1),[F,ae]=(0,k.useState)(()=>t&&localStorage.getItem("stem-card-allocator-visible")!=="false"),[me,q]=(0,k.useState)(()=>{let E=localStorage.getItem("stem-card-diagram-spread");return E===null?!!e.has_spread:E==="true"}),[V,Re]=(0,k.useState)({state:"hidden",syncMode:!1,syncReady:!1,controlMode:!1,controlEnabled:!1}),[Se,J]=(0,k.useState)(null),[at,bt]=(0,k.useState)(""),[Me,ge]=(0,k.useState)(null),[yr,se]=(0,k.useState)(null),[Zt,ue]=(0,k.useState)(null),[T,D]=(0,k.useState)(null),[G,te]=(0,k.useState)(!1),[st,xt]=(0,k.useState)(""),[ze,oe]=(0,k.useState)(()=>window.innerWidth),wt=Me==="library",kn=!!(Me||Zt),Dt=(0,k.useCallback)(E=>{if(E){ge("library"),se("library");return}ge(N=>N==="library"?null:N),se(N=>N==="library"?null:N)},[]),Q=(0,k.useCallback)(E=>{window.clearTimeout(f.current),xt(E),f.current=window.setTimeout(()=>xt(""),4200)},[]),Ae=(0,k.useCallback)(E=>{let N=n.sources.find(K=>K.id===E);if(!N?.available||!N.base_url){Q(`${N?.label??E} \xB7 \u017Ar\xF3d\u0142o niedost\u0119pne`);return}if(N.id===n.active_source)return;let I=Ep(N,n.current_resource_uuid,window.location.hash);if(!I){Q(`${N.label} \xB7 karta nie ma UUID zasobu`);return}window.location.assign(I)},[n,Q]),ut=(0,k.useCallback)(async E=>{Q(`${E} \xB7 wykonywanie\u2026`);try{let I=await fetch(E==="F1"?"/api/nvim/reset":"/api/navigation/sync",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:l.current})}),K=await I.json().catch(()=>({}));if(!I.ok)throw new Error(K.message??K.error??`HTTP ${I.status}`);E==="F2"&&K.current?(u.current=Math.max(u.current,Number(K.current.revision??0)),window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:K.current})),Q(`F2 \xB7 ${String(K.current.step.number).padStart(2,"0")} ${K.current.step.label} \xB7 READY`)):Q("F1 \xB7 reset przyj\u0119ty"),window.setTimeout(()=>window.dispatchEvent(new Event("stem:nvim-refresh")),120)}catch(N){Q(`${E} \xB7 ${N instanceof Error?N.message:String(N)}`)}},[Q]),Ne=(0,k.useCallback)(async()=>{Q("Ctrl+` \xB7 przeliczanie widoku\u2026");try{let E=await fetch("/api/nvim/redraw",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:l.current})}),N=await E.json().catch(()=>({}));if(!E.ok)throw new Error(N.message??N.error??`HTTP ${E.status}`);let I=N.external_ui?.grid,K=I?` \xB7 ${I.width}\xD7${I.height}`:"";Q(`Ctrl+\` \xB7 widok od\u015Bwie\u017Cony${K}`),window.dispatchEvent(new Event("stem:nvim-refresh"))}catch(E){Q(`Ctrl+\` \xB7 ${E instanceof Error?E.message:String(E)}`)}},[Q]),Ee=(0,k.useCallback)(async E=>{try{let N=await fetch("/api/viewer/state",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({actor:l.current,viewer:E})});if(!N.ok)return;let I=await N.json();s.current=Math.max(s.current,Number(I.viewer?.revision??0))}catch{}},[]),vr=E=>{let N=Math.max(.25,Math.min(3,E));b(N),Ee({scale:N})};(0,k.useEffect)(()=>{document.documentElement.style.setProperty("--viewer-canvas-scale",S.toFixed(3))},[S]),(0,k.useEffect)(()=>{if(!me)return;let E=i.current;if(!E)return;let N=0,I=()=>{window.cancelAnimationFrame(N),N=window.requestAnimationFrame(()=>{E.scrollLeft=Math.max(0,(E.scrollWidth-E.clientWidth)/2)})},K=window.requestAnimationFrame(I);return window.addEventListener("resize",I),()=>{window.cancelAnimationFrame(K),window.cancelAnimationFrame(N),window.removeEventListener("resize",I)}},[me,S,ze]),(0,k.useEffect)(()=>{let E=()=>oe(window.innerWidth);return window.addEventListener("resize",E),()=>window.removeEventListener("resize",E)},[]),(0,k.useEffect)(()=>{document.documentElement.dataset.nvimSyncMode=c?"on":"off"},[c]),(0,k.useEffect)(()=>{document.documentElement.dataset.cardClientId=l.current},[]);let kt=E=>{p(E),E||(P(!1),U(!1)),localStorage.setItem("stem-card-nvim-visible",String(E)),Ee({nvim:{visible:E,...E?{}:{expanded:!1,fit:!1}}})},yo=E=>{let N=E&&c;C(N),localStorage.setItem("stem-card-nvim-control-mode",String(N)),Ee({nvim:{control:N}})},vo=E=>{h(E),localStorage.setItem("stem-card-nvim-sync-mode",String(E)),E||(C(!1),localStorage.setItem("stem-card-nvim-control-mode","false")),Ee({nvim:{sync:E,control:E?w:!1}})},jn=E=>{E&&kt(!0),E&&U(!1),P(E),Ee({nvim:{visible:E||_,expanded:E,fit:!1}})},ct=E=>{E&&(kt(!0),P(!1)),U(E),Ee({nvim:{visible:E||_,fit:E,expanded:!1}})},v=E=>{let N=t&&E;ae(N),localStorage.setItem("stem-card-allocator-visible",String(N)),Ee({allocator:{visible:N}})},x=E=>{let N=!!(e.has_spread&&E);q(N),localStorage.setItem("stem-card-diagram-spread",String(N))};(0,k.useEffect)(()=>{let E=0,N=window.requestAnimationFrame(()=>{E=window.requestAnimationFrame(()=>{window.dispatchEvent(new Event("stem:nvim-refresh"))})});return()=>{window.cancelAnimationFrame(N),window.cancelAnimationFrame(E)}},[A,z]),(0,k.useEffect)(()=>{fetch("/api/progress").then(E=>E.ok?E.json():Promise.reject(new Error(`HTTP ${E.status}`))).then(E=>J(E.progress)).catch(E=>bt(`Post\u0119p dzia\u0142a tylko przez serwer karty (${E.message}).`))},[]),(0,k.useEffect)(()=>{let E=!1,N=!1,I={scale:S,viewport:{width:window.innerWidth,height:window.innerHeight},nvim:{visible:_,sync:c,control:w,expanded:A,fit:z},allocator:{visible:F}},K=B=>{let he=B.nvim.visible&&B.nvim.fit,ce=B.nvim.visible&&!he&&B.nvim.expanded;b(Math.max(.25,Math.min(3,B.scale))),p(B.nvim.visible),h(B.nvim.sync),C(B.nvim.sync&&B.nvim.control),P(ce),U(he);let Z=t&&(B.allocator?.visible??!0);ae(Z),localStorage.setItem("stem-card-nvim-visible",String(B.nvim.visible)),localStorage.setItem("stem-card-nvim-sync-mode",String(B.nvim.sync)),localStorage.setItem("stem-card-nvim-control-mode",String(B.nvim.sync&&B.nvim.control)),localStorage.setItem("stem-card-allocator-visible",String(Z));let ee=++g.current;d.current=!0,window.cancelAnimationFrame(y.current),y.current=window.requestAnimationFrame(()=>{if(ee!==g.current)return;let He=Qi();Gi(He,{left:B.scroll.x,top:B.scroll.y});let Ie=Array.from(document.querySelectorAll(".paper .sheet")),St=Ie[Math.max(0,Math.min(Ie.length-1,B.scroll.page_index))]?.querySelector(".sheet-content");St&&Number.isFinite(B.scroll.sheet_scroll_top)&&Gi(St,{top:B.scroll.sheet_scroll_top??0}),y.current=window.requestAnimationFrame(()=>{ee===g.current&&(d.current=!1,m.current&&(m.current=!1,window.dispatchEvent(new Event("stem:viewer-scroll-settled"))))})})},re=async()=>{try{let B=await fetch("/api/control/state",{cache:"no-store"});if(!B.ok||E)return;let he=await B.json(),ce=he.viewer;N||(N=!0,Number(ce?.revision??0)===0&&Ee(I)),ce&&ce.revision>s.current&&(s.current=ce.revision,ce.actor!==l.current&&K(ce));let Z=he.navigation;Z&&Z.revision>u.current&&(u.current=Z.revision,Z.actor!==l.current&&(d.current&&(m.current=!0),window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:Z}))))}catch{}};re();let W=window.setInterval(re,300);return()=>{E=!0,window.clearInterval(W),g.current+=1,window.cancelAnimationFrame(y.current),d.current=!1,m.current=!1}},[]),(0,k.useEffect)(()=>{Ee({nvim:{connection:V.state,screen_cursor:V.screenCursor,grid:V.grid}})},[V.grid?.columns,V.grid?.rows,V.screenCursor?.column,V.screenCursor?.row,V.state,Ee]),(0,k.useEffect)(()=>{let E=0,N=null,I=Array.from(document.querySelectorAll(".paper .sheet")),K=I.map(W=>W.querySelector(".sheet-content")).filter(W=>!!W),re=W=>{if(d.current)return;let B=W?.currentTarget;B instanceof HTMLElement&&B.classList.contains("sheet-content")&&(N=B),window.clearTimeout(E),E=window.setTimeout(()=>{let he=N?.closest(".sheet"),ce=he?I.indexOf(he):-1,Z=ce>=0?ce:I.reduce((He,Ie,Ke)=>{let St=Ie.getBoundingClientRect(),br=Math.abs((St.top+St.bottom)/2-window.innerHeight/2);return br=0?N:I[Z]?.querySelector(".sheet-content")??null;Ee({scroll:{x:window.scrollX,y:window.scrollY,page_index:Z,sheet_scroll_top:ee?.scrollTop??0},viewport:{width:window.innerWidth,height:window.innerHeight}}),N=null},120)};return window.addEventListener("scroll",re,{passive:!0}),window.addEventListener("resize",re),window.addEventListener("stem:viewer-scroll-settled",re),K.forEach(W=>W.addEventListener("scroll",re,{passive:!0})),re(),()=>{window.clearTimeout(E),window.removeEventListener("scroll",re),window.removeEventListener("resize",re),window.removeEventListener("stem:viewer-scroll-settled",re),K.forEach(W=>W.removeEventListener("scroll",re))}},[Ee]),(0,k.useEffect)(()=>{let E=N=>{if(N.repeat)return;let I=N.altKey&&!N.ctrlKey&&!N.metaKey?N.code:"";if(I==="Digit0"&&e.library){N.preventDefault(),N.stopImmediatePropagation(),te(!1),Dt(!wt);return}if(I==="Digit1"){N.preventDefault(),N.stopImmediatePropagation(),kt(!_);return}if(I==="Digit2"){N.preventDefault(),N.stopImmediatePropagation(),vo(!c);return}if(I==="Digit3"){if(N.preventDefault(),N.stopImmediatePropagation(),!c)return;kt(!0),yo(!w);return}if(I==="Digit4"){N.preventDefault(),N.stopImmediatePropagation(),jn(!A);return}if(I==="Digit5"){N.preventDefault(),N.stopImmediatePropagation(),ct(!z);return}if(I==="Digit6"&&t){N.preventDefault(),N.stopImmediatePropagation(),v(!F);return}if(I==="Digit7"&&e.has_spread){N.preventDefault(),N.stopImmediatePropagation(),x(!me);return}if((N.key==="F1"||N.key==="F2")&&!N.altKey&&!N.ctrlKey&&!N.metaKey&&!N.shiftKey){N.preventDefault(),N.stopImmediatePropagation(),ut(N.key);return}if(N.ctrlKey&&!N.altKey&&!N.metaKey&&!N.shiftKey&&(N.code==="Backquote"||N.key==="`")){N.preventDefault(),N.stopImmediatePropagation(),Ne();return}if(N.key==="F12"){N.preventDefault(),N.stopImmediatePropagation(),Dt(!1),ge(null),se(null),ue(null),D(null),te(K=>!K);return}if(N.key==="Escape"&&(kn||G)){N.preventDefault(),N.stopImmediatePropagation(),ge(null),se(null),ue(null),D(null),te(!1);return}};return window.addEventListener("keydown",E,!0),()=>window.removeEventListener("keydown",E,!0)},[F,me,t,wt,e.has_spread,e.library,w,A,z,c,_,ut,Ne,G,kn]),(0,k.useEffect)(()=>{let E=o.current?.querySelector(".topbar");if(!E)return;let N=()=>{document.documentElement.style.setProperty("--side-panel-top",`${Math.ceil(E.getBoundingClientRect().bottom)}px`)};N();let I=new ResizeObserver(N);return I.observe(E),window.addEventListener("resize",N),()=>{I.disconnect(),window.removeEventListener("resize",N),document.documentElement.style.removeProperty("--side-panel-top")}},[]),(0,k.useEffect)(()=>()=>window.clearTimeout(f.current),[]),(0,k.useEffect)(()=>{let E=N=>{!N.altKey||N.ctrlKey||(N.preventDefault(),b(I=>{let K=Math.max(.25,Math.min(3,I*Math.exp(-Math.max(-120,Math.min(120,N.deltaY))*.001)));return Ee({scale:K}),K}))};return window.addEventListener("wheel",E,{passive:!1}),()=>window.removeEventListener("wheel",E)},[Ee]);let R=async(E,N)=>{try{let I=await fetch(`/api/progress/${encodeURIComponent(E)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({status:N})});if(!I.ok)throw new Error(await I.text());J((await I.json()).progress),bt("")}catch(I){bt(`Nie zapisano post\u0119pu: ${I instanceof Error?I.message:String(I)}`)}},M=(E,N)=>{R(E,{pending:"approved",approved:"pending"}[N])},$=0,H=e.sections.map(E=>{let N=$;return $+=E.assets.length,{section:E,figureOffset:N}}),j=[];return H.forEach(E=>{let N=E.section.spread_group??"",I=j[j.length-1];if(N&&I?.spreadGroup===N){I.pages.push(E);return}j.push({key:N||E.section.id,spreadGroup:N,spreadLabel:E.section.spread_label??"",spreadColumns:E.section.spread_columns??1,pages:[E]})}),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{ref:o,className:`viewer-chrome${A?" is-nvim-expanded":""}${z?" is-nvim-fit":""}`,children:[(0,a.jsx)(Mg,{toc:e.toc,runtime:n,onSourceSelect:Ae,libraryAvailable:!!e.library,libraryOpen:wt,setLibraryOpen:Dt,scale:S,setScale:vr,nvimVisible:_,setNvimVisible:kt,nvimSyncMode:c,setNvimSyncMode:vo,nvimControlMode:w,setNvimControlMode:yo,nvimExpanded:A,setNvimExpanded:jn,nvimFit:z,setNvimFit:ct,allocatorVisible:F,setAllocatorVisible:v,hasAllocatorModel:t,diagramSpread:me,setDiagramSpread:x,hasDiagramSpread:!!e.has_spread,nvimSummary:V,progress:Se,progressError:at}),e.viewpoints?.length?(0,a.jsx)(Tg,{viewpoints:e.viewpoints}):null,(0,a.jsx)(Ig,{visible:t&&F,model:e}),(0,a.jsx)(Gg,{visible:_,syncMode:c,controlMode:w,expanded:A,fit:z,scale:S,onSummaryChange:Re}),st&&(0,a.jsx)("output",{className:"viewer-action-toast",children:st})]}),(0,a.jsxs)("main",{ref:i,className:`paper${me?" is-diagram-spread":""}`,children:[(0,a.jsx)(Qg,{front:e.front}),j.map(E=>{let N=Array.from({length:Math.ceil(E.pages.length/E.spreadColumns)},(B,he)=>E.pages.slice(he*E.spreadColumns,(he+1)*E.spreadColumns)),K=Math.max(1,...N.map(B=>B.reduce((he,ce)=>he+(ce.section.page_orientation==="landscape"?297:210),Math.max(0,B.length-1)*2)))*(96/25.4)*S,re=Math.min(1,Math.max(.25,(ze-24)/K)),W=E.pages.map(({section:B,figureOffset:he})=>(0,a.jsx)(lh,{section:B,progress:Se,onCycle:M,onSetStatus:R,figureOffset:he},B.id));return E.spreadGroup?(0,a.jsx)("section",{className:"sheet-spread","data-spread-group":E.spreadGroup,"aria-label":E.spreadLabel||"Wielostronicowy diagram UML",style:{"--spread-columns":E.spreadColumns,"--spread-fit-scale":re},children:W},E.key):W[0]}),e.dictionary&&(0,a.jsxs)(bs,{header:e.dictionary.header_html,footer:e.dictionary.footer_html,className:"dictionary-sheet",children:[(0,a.jsx)("h2",{children:"S\u0142ownik WE/EN/EK/KW"}),(0,a.jsx)(Ft,{html:e.dictionary.content_html})]})]}),(0,a.jsx)(bp,{side:"left",panels:[...e.library?[{id:"library",railLabel:"K",title:"Serie i karty",accent:"#167ca4",content:(0,a.jsx)(uh,{library:e.library,source:r,onNavigate:()=>Dt(!1)})}]:[],{id:"contents",railLabel:"S",title:"Spis tre\u015Bci",accent:"#16805d",content:(0,a.jsx)(ch,{toc:e.toc,onNavigate:()=>{ge(null),se(null)}})}],activeId:Me,pinnedId:yr,onActiveChange:ge,onPinnedChange:se}),(0,a.jsx)(bp,{side:"right",panels:[{id:"classroom",railLabel:"U",title:"Klasa i stanowiska",accent:"#267357",content:(0,a.jsx)(gh,{model:e})},{id:"progress",railLabel:"R",title:"Przebieg i raport",accent:"#b45b26",content:(0,a.jsx)(dh,{progress:Se,error:at})}],activeId:Zt,pinnedId:T,onActiveChange:ue,onPinnedChange:D}),(0,a.jsx)(hh,{open:G,onClose:()=>te(!1)})]})}async function vh(){let e=(0,Sp.createRoot)(document.getElementById("root"));try{let t=await fetch("./card-data.json",{cache:"no-store"});if(!t.ok)throw new Error(`Nie mo\u017Cna wczyta\u0107 card-data.json: ${t.status}`);let n=await t.json();e.render((0,a.jsx)(yh,{model:n}))}catch(t){e.render((0,a.jsxs)("main",{className:"app-load-error",children:[(0,a.jsx)("h1",{children:"Nie uda\u0142o si\u0119 uruchomi\u0107 karty"}),(0,a.jsx)("pre",{children:t instanceof Error?t.message:String(t)})]}))}}vh(); /*! Bundled license information: react/cjs/react.production.min.js: diff --git a/web/card-data.json b/web/card-data.json index 314f001..ef1a3f4 100644 --- a/web/card-data.json +++ b/web/card-data.json @@ -16,7 +16,7 @@ "status": "Gotowa", "version": "v00.01", "uuid": "87e48095-7793-54e3-9230-4e61d31bd459", - "author": "M. Pabiszczak", + "author": "Mateusz Pabiszczak", "year": "2026" }, "library": { @@ -46,6 +46,8 @@ "title": "BusyBox — the Swiss Army Knife", "repo": "lab-console-busybox", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "01", @@ -58,6 +60,8 @@ "title": "Tmux — sessions, windows and panes", "repo": "lab-console-tmux", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "02", @@ -70,6 +74,8 @@ "title": "Neovim — navigation and editing", "repo": "lab-console-neovim", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "03", @@ -82,6 +88,8 @@ "title": "Git Basics I — status, add and commit", "repo": "lab-console-git-basics-1", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "04", @@ -94,6 +102,8 @@ "title": "Git Basics II — log, diff and restore", "repo": "lab-console-git-basics-2", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "05", @@ -106,6 +116,8 @@ "title": "Git Branching I — branch, switch and merge", "repo": "lab-console-git-branching-1", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "06", @@ -118,6 +130,8 @@ "title": "Git Branching II — rebase and conflicts", "repo": "lab-console-git-branching-2", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "07", @@ -130,6 +144,8 @@ "title": "Docker Fundamentals", "repo": "lab-console-docker", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "08", @@ -152,6 +168,8 @@ "title": "Number Systems and Storage", "repo": "lab-rv32i-asm-number-systems", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "01", @@ -164,6 +182,8 @@ "title": "FPGA Bring-up and Programming", "repo": "lab-rv32i-asm-fpga-bringup", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "02", @@ -176,6 +196,8 @@ "title": "Blinker and Synchronous Logic", "repo": "lab-rv32i-asm-blinker", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "03", @@ -188,6 +210,8 @@ "title": "The RISC-V ISA and Instruction Decoder", "repo": "lab-rv32i-asm-decoder", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "04", @@ -200,6 +224,8 @@ "title": "ALU and the Verilog Assembler", "repo": "lab-rv32i-asm-alu", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "05", @@ -212,6 +238,8 @@ "title": "Control Flow — Jumps and Branches", "repo": "lab-rv32i-asm-control-flow", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "06", @@ -224,6 +252,8 @@ "title": "Addresses and Memory", "repo": "lab-rv32i-asm-addresses-memory", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "07", @@ -236,6 +266,8 @@ "title": "Subroutines and the RISC-V ABI", "repo": "lab-rv32i-asm-subroutines-abi", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "08", @@ -248,6 +280,8 @@ "title": "Load and Store", "repo": "lab-rv32i-asm-load-store", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "09", @@ -270,6 +304,8 @@ "title": "ASM, C and GCC", "repo": "lab-rv32i-strlen-asm-c-gcc", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/852fa3c7-8329-583a-a244-b639d2e04495", + "local_href": "/852fa3c7-8329-583a-a244-b639d2e04495/", + "resource_uuid": "852fa3c7-8329-583a-a244-b639d2e04495", "available": true, "current": false, "number": "01", @@ -295,6 +331,8 @@ "title": ".bss, .data and static storage", "repo": "lab-rv32i-strlen-bss-data-stack", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/74afa921-fb51-5017-bcdb-f6e84fb444d8", + "local_href": "/74afa921-fb51-5017-bcdb-f6e84fb444d8/", + "resource_uuid": "74afa921-fb51-5017-bcdb-f6e84fb444d8", "available": true, "current": false, "number": "02", @@ -324,6 +362,8 @@ "title": "ABI and Stack Frame", "repo": "lab-rv32i-strlen-abi-stack", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/72b22a0a-3297-5d75-a6ff-d1af48132d6c", + "local_href": "/72b22a0a-3297-5d75-a6ff-d1af48132d6c/", + "resource_uuid": "72b22a0a-3297-5d75-a6ff-d1af48132d6c", "available": true, "current": false, "number": "03", @@ -345,6 +385,8 @@ "title": "Types, Operators and Expressions", "repo": "lab-rv32i-c-types-operators-expressions", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/7818aa68-4983-5aca-bf7f-541cfce5c601", + "local_href": "/7818aa68-4983-5aca-bf7f-541cfce5c601/", + "resource_uuid": "7818aa68-4983-5aca-bf7f-541cfce5c601", "available": true, "current": false, "number": "04", @@ -406,6 +448,8 @@ "title": "Control Flow", "repo": "lab-rv32i-c-control-flow", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/7512361d-e5e6-5c08-ab18-8be29dacdc10", + "local_href": "/7512361d-e5e6-5c08-ab18-8be29dacdc10/", + "resource_uuid": "7512361d-e5e6-5c08-ab18-8be29dacdc10", "available": true, "current": false, "number": "05", @@ -451,6 +495,8 @@ "title": "Functions and Program Structure", "repo": "lab-rv32i-c-functions-program-structure", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/9667818d-b691-501d-817c-b58be4cbd594", + "local_href": "/9667818d-b691-501d-817c-b58be4cbd594/", + "resource_uuid": "9667818d-b691-501d-817c-b58be4cbd594", "available": true, "current": false, "number": "06", @@ -508,6 +554,8 @@ "title": "Pointers, Arrays and Linear Allocator", "repo": "lab-rv32i-c-pointers-arrays", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/98dbe323-c624-53d6-9fe2-4ee688c44b38", + "local_href": "/98dbe323-c624-53d6-9fe2-4ee688c44b38/", + "resource_uuid": "98dbe323-c624-53d6-9fe2-4ee688c44b38", "available": true, "current": false, "number": "07", @@ -569,6 +617,8 @@ "title": "Structures and Linked State", "repo": "lab-rv32i-c-structures", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f60fbba3-a788-5f1e-bc24-52af82f227c9", + "local_href": "/f60fbba3-a788-5f1e-bc24-52af82f227c9/", + "resource_uuid": "f60fbba3-a788-5f1e-bc24-52af82f227c9", "available": true, "current": false, "number": "08", @@ -598,6 +648,8 @@ "title": "smalloc, sbrk and minimal libc", "repo": "lab-rv32i-c-smalloc-sbrk-libc", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0", + "local_href": "/8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0/", + "resource_uuid": "8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0", "available": true, "current": false, "number": "09", @@ -631,6 +683,8 @@ "title": "RV32I Traps and Interrupt Control", "repo": "lab-rv32i-c-interrupts", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8fb9c110-557b-5081-8ae2-a56800f872e8", + "local_href": "/8fb9c110-557b-5081-8ae2-a56800f872e8/", + "resource_uuid": "8fb9c110-557b-5081-8ae2-a56800f872e8", "available": true, "current": false, "number": "10", @@ -656,6 +710,8 @@ "title": "Machine Timer and Periodic Work", "repo": "lab-rv32i-c-timer", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "11", @@ -668,6 +724,8 @@ "title": "UART — polling and interrupts", "repo": "lab-rv32i-c-uart", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/64f7c516-78b1-58ee-8619-a82d7061079f", + "local_href": "/64f7c516-78b1-58ee-8619-a82d7061079f/", + "resource_uuid": "64f7c516-78b1-58ee-8619-a82d7061079f", "available": true, "current": false, "number": "12", @@ -693,6 +751,8 @@ "title": "GPIO, Edges and Debounce", "repo": "lab-rv32i-c-gpio", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "13", @@ -722,6 +782,8 @@ "title": "Translation Units, Linkage and Namespaces", "repo": "lab-cpp-build-namespaces", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "01", @@ -734,6 +796,8 @@ "title": "Classes, Encapsulation and Invariants", "repo": "lab-cpp-classes-invariants", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "02", @@ -746,6 +810,8 @@ "title": "Construction, Destruction and RAII", "repo": "lab-cpp-lifetime-raii", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "03", @@ -758,6 +824,8 @@ "title": "References, const and Value Categories", "repo": "lab-cpp-references-const", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "04", @@ -770,6 +838,8 @@ "title": "Copy, Move and the Rule of Zero/Five", "repo": "lab-cpp-copy-move", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "05", @@ -782,6 +852,8 @@ "title": "Ownership and Resource Types", "repo": "lab-cpp-ownership", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "06", @@ -794,6 +866,8 @@ "title": "Function and Class Templates", "repo": "lab-cpp-templates", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "07", @@ -806,6 +880,8 @@ "title": "Static Polymorphism and CRTP", "repo": "lab-cpp-static-polymorphism", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "08", @@ -818,6 +894,8 @@ "title": "Inheritance, Interfaces and Dynamic Dispatch", "repo": "lab-cpp-dynamic-polymorphism", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "09", @@ -830,6 +908,8 @@ "title": "Operator Overloading and Strong Types", "repo": "lab-cpp-strong-types", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "10", @@ -842,6 +922,8 @@ "title": "Containers, Iterators and Algorithms", "repo": "lab-cpp-containers-iterators", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "11", @@ -854,6 +936,8 @@ "title": "Lambdas, Function Objects and Callables", "repo": "lab-cpp-lambdas-callables", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "12", @@ -866,6 +950,8 @@ "title": "Error Models with and without Exceptions", "repo": "lab-cpp-error-models", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "13", @@ -878,6 +964,8 @@ "title": "Object Layout, ABI and Binary Evidence", "repo": "lab-cpp-abi-evidence", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "14", @@ -890,6 +978,8 @@ "title": "Resource-type Integration Project", "repo": "lab-cpp-resource-integration", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "15", @@ -912,6 +1002,8 @@ "title": "heap_4: From Linear Cursor to Reusable Blocks", "repo": "lab-rv32i-freertos-heap4", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/aea09ab7-9bfd-5368-8d1b-c8724871c1a7", + "local_href": "/aea09ab7-9bfd-5368-8d1b-c8724871c1a7/", + "resource_uuid": "aea09ab7-9bfd-5368-8d1b-c8724871c1a7", "available": true, "current": true, "number": "01", @@ -929,6 +1021,8 @@ "title": "First Task, TCB and Task Stack", "repo": "lab-rv32i-freertos-c-first-task", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/a2538a1a-3c37-4c14-a6ea-db5aba8fd038", + "local_href": "/a2538a1a-3c37-4c14-a6ea-db5aba8fd038/", + "resource_uuid": "a2538a1a-3c37-4c14-a6ea-db5aba8fd038", "available": true, "current": false, "number": "02", @@ -946,6 +1040,8 @@ "title": "Tick, Scheduler, Priorities and Time Slicing", "repo": "lab-rv32i-freertos-c-scheduler", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/2214a13f-34c6-40a1-a561-70a00ec98285", + "local_href": "/2214a13f-34c6-40a1-a561-70a00ec98285/", + "resource_uuid": "2214a13f-34c6-40a1-a561-70a00ec98285", "available": true, "current": false, "number": "03", @@ -963,6 +1059,8 @@ "title": "Delay, Blocking and Task States", "repo": "lab-rv32i-freertos-c-delay-state", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/4a7ef04c-ab08-5783-9192-5b02a90f05f8", + "local_href": "/4a7ef04c-ab08-5783-9192-5b02a90f05f8/", + "resource_uuid": "4a7ef04c-ab08-5783-9192-5b02a90f05f8", "available": true, "current": false, "number": "04", @@ -980,6 +1078,8 @@ "title": "Queues and Byte-copy Semantics", "repo": "lab-rv32i-freertos-c-queue", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8ee8f36a-471b-51bc-97b8-e204bd541c61", + "local_href": "/8ee8f36a-471b-51bc-97b8-e204bd541c61/", + "resource_uuid": "8ee8f36a-471b-51bc-97b8-e204bd541c61", "available": true, "current": false, "number": "05", @@ -997,6 +1097,8 @@ "title": "Software Timers and the Daemon Task", "repo": "lab-rv32i-freertos-c-software-timers", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/ab188300-f03d-5ddb-8316-b9534876a5bc", + "local_href": "/ab188300-f03d-5ddb-8316-b9534876a5bc/", + "resource_uuid": "ab188300-f03d-5ddb-8316-b9534876a5bc", "available": true, "current": false, "number": "06", @@ -1014,6 +1116,8 @@ "title": "Interrupt-safe API and Semaphore Handoff", "repo": "lab-rv32i-freertos-c-isr-semaphore", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/a6da1075-8d1f-5615-b0e6-0fc33e59e1e3", + "local_href": "/a6da1075-8d1f-5615-b0e6-0fc33e59e1e3/", + "resource_uuid": "a6da1075-8d1f-5615-b0e6-0fc33e59e1e3", "available": true, "current": false, "number": "07", @@ -1031,6 +1135,8 @@ "title": "Critical Sections, Mutexes and Priority Inheritance", "repo": "lab-rv32i-freertos-c-resource-management", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/2392f81a-ed6c-510b-86b5-06c5e2f1c6aa", + "local_href": "/2392f81a-ed6c-510b-86b5-06c5e2f1c6aa/", + "resource_uuid": "2392f81a-ed6c-510b-86b5-06c5e2f1c6aa", "available": true, "current": false, "number": "08", @@ -1048,6 +1154,8 @@ "title": "Event Groups and Multi-event Synchronization", "repo": "lab-rv32i-freertos-c-event-groups", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/3f4c1b8b-d54b-58d5-b92d-87a7233cbd9f", + "local_href": "/3f4c1b8b-d54b-58d5-b92d-87a7233cbd9f/", + "resource_uuid": "3f4c1b8b-d54b-58d5-b92d-87a7233cbd9f", "available": true, "current": false, "number": "09", @@ -1065,6 +1173,8 @@ "title": "Direct-to-task Notifications", "repo": "lab-rv32i-freertos-c-notifications", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/3b57334e-2c35-5207-a51d-9321906db078", + "local_href": "/3b57334e-2c35-5207-a51d-9321906db078/", + "resource_uuid": "3b57334e-2c35-5207-a51d-9321906db078", "available": true, "current": false, "number": "10", @@ -1082,6 +1192,8 @@ "title": "Static Allocation and Bounded Storage", "repo": "lab-rv32i-freertos-c-static-allocation", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f4d7caf3-d665-5a2d-b9eb-39a120a64ff7", + "local_href": "/f4d7caf3-d665-5a2d-b9eb-39a120a64ff7/", + "resource_uuid": "f4d7caf3-d665-5a2d-b9eb-39a120a64ff7", "available": true, "current": false, "number": "11", @@ -1099,6 +1211,8 @@ "title": "Assertions, Hooks, Stack Checks and Runtime Diagnostics", "repo": "lab-rv32i-freertos-c-diagnostics", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/c3027314-85a4-5e4a-af13-0939c7467a62", + "local_href": "/c3027314-85a4-5e4a-af13-0939c7467a62/", + "resource_uuid": "c3027314-85a4-5e4a-af13-0939c7467a62", "available": true, "current": false, "number": "12", @@ -1116,6 +1230,8 @@ "title": "UART Interrupt-to-task Pipeline", "repo": "lab-rv32i-freertos-c-uart", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/6a838fd1-ab1b-52b6-baaf-659120a4d60a", + "local_href": "/6a838fd1-ab1b-52b6-baaf-659120a4d60a/", + "resource_uuid": "6a838fd1-ab1b-52b6-baaf-659120a4d60a", "available": true, "current": false, "number": "13", @@ -1133,6 +1249,8 @@ "title": "GPIO, Hardware Timer and Deferred Work", "repo": "lab-rv32i-freertos-c-gpio-timer", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/0cc561df-bf81-5bba-9df1-c872d5b42eb8", + "local_href": "/0cc561df-bf81-5bba-9df1-c872d5b42eb8/", + "resource_uuid": "0cc561df-bf81-5bba-9df1-c872d5b42eb8", "available": true, "current": false, "number": "14", @@ -1150,6 +1268,8 @@ "title": "Integrated Deterministic FreeRTOS C Application", "repo": "lab-rv32i-freertos-c-integration", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/fe92efeb-3c38-5975-86d8-ed630e1ad3bb", + "local_href": "/fe92efeb-3c38-5975-86d8-ed630e1ad3bb/", + "resource_uuid": "fe92efeb-3c38-5975-86d8-ed630e1ad3bb", "available": true, "current": false, "number": "15", @@ -1177,6 +1297,8 @@ "title": "C++ Task Wrapper, CRTP and Lifecycle", "repo": "lab-rv32i-freertos-task-stack-vector", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/948ce9fd-3d0c-5721-a0ae-ef422008fec8", + "local_href": "/948ce9fd-3d0c-5721-a0ae-ef422008fec8/", + "resource_uuid": "948ce9fd-3d0c-5721-a0ae-ef422008fec8", "available": true, "current": false, "number": "02", @@ -1194,6 +1316,8 @@ "title": "Vector V1 — Destructor, Move, Ownership and RAII", "repo": "lab-rv32i-freertos-vector-raii", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/de1a2818-4c30-5760-8b31-255114f82e90", + "local_href": "/de1a2818-4c30-5760-8b31-255114f82e90/", + "resource_uuid": "de1a2818-4c30-5760-8b31-255114f82e90", "available": true, "current": false, "number": "03", @@ -1211,6 +1335,8 @@ "title": "Scheduler States, Priorities and Typed Ticks", "repo": "lab-rv32i-freertos-scheduler-states", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/853a7dd7-b00b-4f4a-96e8-c160fc5bb04a", + "local_href": "/853a7dd7-b00b-4f4a-96e8-c160fc5bb04a/", + "resource_uuid": "853a7dd7-b00b-4f4a-96e8-c160fc5bb04a", "available": true, "current": false, "number": "04", @@ -1228,6 +1354,8 @@ "title": "C++ Heap Bridge, Heap Models and HeapStats", "repo": "lab-rv32i-freertos-heap-models", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/c456b505-dc5c-4894-b832-bb4c5afd0feb", + "local_href": "/c456b505-dc5c-4894-b832-bb4c5afd0feb/", + "resource_uuid": "c456b505-dc5c-4894-b832-bb4c5afd0feb", "available": true, "current": false, "number": "05", @@ -1245,6 +1373,8 @@ "title": "MemoryResource and FreeRtosAllocator", "repo": "lab-rv32i-freertos-allocator-resource", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/1af48a2e-8564-4e18-8115-b2c0208169d6", + "local_href": "/1af48a2e-8564-4e18-8115-b2c0208169d6/", + "resource_uuid": "1af48a2e-8564-4e18-8115-b2c0208169d6", "available": true, "current": false, "number": "06", @@ -1262,6 +1392,8 @@ "title": "TaskHandle_t, Explicit Start and Static Trampoline", "repo": "lab-rv32i-freertos-task-wrapper", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/9bffead0-4341-4350-806d-e975b1a3a08f", + "local_href": "/9bffead0-4341-4350-806d-e975b1a3a08f/", + "resource_uuid": "9bffead0-4341-4350-806d-e975b1a3a08f", "available": true, "current": false, "number": "07", @@ -1279,6 +1411,8 @@ "title": "DynamicTask, StaticTask, Deletion and Lifetime", "repo": "lab-rv32i-freertos-static-task", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/d9e45417-a37f-487c-813f-fc7a44d4b4f3", + "local_href": "/d9e45417-a37f-487c-813f-fc7a44d4b4f3/", + "resource_uuid": "d9e45417-a37f-487c-813f-fc7a44d4b4f3", "available": true, "current": false, "number": "08", @@ -1296,6 +1430,8 @@ "title": "Scheduler Facade and Scoped Kernel Guards", "repo": "lab-rv32i-freertos-kernel-facade", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/6a2ab068-17e7-4bfa-b726-2df37787ed69", + "local_href": "/6a2ab068-17e7-4bfa-b726-2df37787ed69/", + "resource_uuid": "6a2ab068-17e7-4bfa-b726-2df37787ed69", "available": true, "current": false, "number": "09", @@ -1313,6 +1449,8 @@ "title": "Queue and StaticQueue", "repo": "lab-rv32i-freertos-queue", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/66967c2d-bb34-4344-8064-f54d06cce47a", + "local_href": "/66967c2d-bb34-4344-8064-f54d06cce47a/", + "resource_uuid": "66967c2d-bb34-4344-8064-f54d06cce47a", "available": true, "current": false, "number": "10", @@ -1330,6 +1468,8 @@ "title": "Mutex, LockGuard and Priority Inheritance", "repo": "lab-rv32i-freertos-mutex", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/34d7ad61-6b03-4922-8e58-b8b98316e5f7", + "local_href": "/34d7ad61-6b03-4922-8e58-b8b98316e5f7/", + "resource_uuid": "34d7ad61-6b03-4922-8e58-b8b98316e5f7", "available": true, "current": false, "number": "11", @@ -1347,6 +1487,8 @@ "title": "Semaphores and Task Notifications", "repo": "lab-rv32i-freertos-semaphore-notify", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/fcb6107c-268f-4e86-a8cc-092e5875f6f0", + "local_href": "/fcb6107c-268f-4e86-a8cc-092e5875f6f0/", + "resource_uuid": "fcb6107c-268f-4e86-a8cc-092e5875f6f0", "available": true, "current": false, "number": "12", @@ -1364,6 +1506,8 @@ "title": "EventGroup and Coordinated State", "repo": "lab-rv32i-freertos-event-group", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/5fbcd7c6-3a73-4cd2-b76c-bdb016d1daaa", + "local_href": "/5fbcd7c6-3a73-4cd2-b76c-bdb016d1daaa/", + "resource_uuid": "5fbcd7c6-3a73-4cd2-b76c-bdb016d1daaa", "available": true, "current": false, "number": "13", @@ -1381,6 +1525,8 @@ "title": "Software Timer and the Timer Daemon Task", "repo": "lab-rv32i-freertos-sw-timer", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/78db37df-63e5-4c5b-80ce-f73a411f0b50", + "local_href": "/78db37df-63e5-4c5b-80ce-f73a411f0b50/", + "resource_uuid": "78db37df-63e5-4c5b-80ce-f73a411f0b50", "available": true, "current": false, "number": "14", @@ -1398,6 +1544,8 @@ "title": "Explicit FromISR, UART and GPIO Wrappers", "repo": "lab-rv32i-freertos-isr-drivers", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/02f6cd71-5c85-4883-a237-1d4ba08d9469", + "local_href": "/02f6cd71-5c85-4883-a237-1d4ba08d9469/", + "resource_uuid": "02f6cd71-5c85-4883-a237-1d4ba08d9469", "available": true, "current": false, "number": "15", @@ -1415,6 +1563,8 @@ "title": "Integrated Real-time Application and Evidence", "repo": "lab-rv32i-freertos-integration", "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/05b4f486-a27c-455d-a315-f4e51a4c66b3", + "local_href": "/05b4f486-a27c-455d-a315-f4e51a4c66b3/", + "resource_uuid": "05b4f486-a27c-455d-a315-f4e51a4c66b3", "available": true, "current": false, "number": "16", @@ -1442,6 +1592,8 @@ "title": "Process and Thread Execution Context", "repo": "lab-posix-process-thread", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "01", @@ -1454,6 +1606,8 @@ "title": "pthread_create, pthread_join and Lifecycle", "repo": "lab-posix-pthread-create-join", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "02", @@ -1466,6 +1620,8 @@ "title": "Arguments, Return Values and Ownership", "repo": "lab-posix-thread-arguments", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "03", @@ -1478,6 +1634,8 @@ "title": "Data Races and the Happens-before Question", "repo": "lab-posix-data-races", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "04", @@ -1490,6 +1648,8 @@ "title": "Mutex, Critical Section and Deadlock", "repo": "lab-posix-mutex", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "05", @@ -1502,6 +1662,8 @@ "title": "Condition Variables and Predicates", "repo": "lab-posix-condition-variable", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "06", @@ -1514,6 +1676,8 @@ "title": "Bounded Producer–Consumer Queue", "repo": "lab-posix-producer-consumer", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "07", @@ -1526,6 +1690,8 @@ "title": "POSIX Semaphores", "repo": "lab-posix-semaphore", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "08", @@ -1538,6 +1704,8 @@ "title": "Reader–Writer Lock", "repo": "lab-posix-rwlock", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "09", @@ -1550,6 +1718,8 @@ "title": "C Atomics and Memory Ordering", "repo": "lab-posix-atomics", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "10", @@ -1562,6 +1732,8 @@ "title": "Cancellation, Cleanup and Safe Shutdown", "repo": "lab-posix-cancellation-cleanup", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "11", @@ -1574,6 +1746,8 @@ "title": "Thread-local Storage", "repo": "lab-posix-thread-local", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "12", @@ -1586,6 +1760,8 @@ "title": "Scheduling Policy, Priority and Affinity", "repo": "lab-posix-scheduling", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "13", @@ -1598,6 +1774,8 @@ "title": "GDB, Sanitizers and Race Evidence", "repo": "lab-posix-thread-debugging", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "14", @@ -1610,6 +1788,8 @@ "title": "POSIX Threads vs FreeRTOS Integration", "repo": "lab-posix-freertos-comparison", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "15", @@ -1632,6 +1812,8 @@ "title": "Strategy — Replaceable Behaviour", "repo": "lab-cpp-oop-strategy", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "01", @@ -1644,6 +1826,8 @@ "title": "Adapter — Stable Boundary", "repo": "lab-cpp-oop-adapter", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "02", @@ -1656,6 +1840,8 @@ "title": "Template Method — Fixed Skeleton", "repo": "lab-cpp-oop-template-method", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "03", @@ -1668,6 +1854,8 @@ "title": "Static vs Dynamic Dispatch", "repo": "lab-cpp-oop-dispatch", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "04", @@ -1680,6 +1868,8 @@ "title": "RAII and Ownership", "repo": "lab-cpp-oop-raii", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "05", @@ -1692,6 +1882,8 @@ "title": "State — Explicit Behaviour", "repo": "lab-cpp-oop-state", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "06", @@ -1704,6 +1896,8 @@ "title": "Facade — Subsystem Boundary", "repo": "lab-cpp-oop-facade", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "07", @@ -1716,6 +1910,8 @@ "title": "Command — Request as Object", "repo": "lab-cpp-oop-command", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "08", @@ -1728,6 +1924,8 @@ "title": "Observer — Subscription and Telemetry", "repo": "lab-cpp-oop-observer", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "09", @@ -1740,6 +1938,8 @@ "title": "Factory Method — Resource Policy", "repo": "lab-cpp-oop-factory-method", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "10", @@ -1752,6 +1952,8 @@ "title": "Builder — Valid Configuration", "repo": "lab-cpp-oop-builder", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "11", @@ -1764,6 +1966,8 @@ "title": "Decorator — Measurement and Diagnostics", "repo": "lab-cpp-oop-decorator", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "12", @@ -1776,6 +1980,8 @@ "title": "Composite — Component Tree", "repo": "lab-cpp-oop-composite", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "13", @@ -1788,6 +1994,8 @@ "title": "Chain of Responsibility", "repo": "lab-cpp-oop-chain", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "14", @@ -1800,6 +2008,8 @@ "title": "Pattern-language Integration", "repo": "lab-cpp-oop-integration", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "15", @@ -1856,6 +2066,8 @@ "title": "Strategy — Replaceable Behaviour", "repo": "lab-cpp-oop-strategy", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "01", @@ -1868,6 +2080,8 @@ "title": "Adapter — Stable Boundary", "repo": "lab-cpp-oop-adapter", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "02", @@ -1880,6 +2094,8 @@ "title": "Template Method — Fixed Skeleton", "repo": "lab-cpp-oop-template-method", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "03", @@ -1892,6 +2108,8 @@ "title": "Static vs Dynamic Dispatch", "repo": "lab-cpp-oop-dispatch", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "04", @@ -1904,6 +2122,8 @@ "title": "RAII and Ownership", "repo": "lab-cpp-oop-raii", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "05", @@ -1916,6 +2136,8 @@ "title": "State — Explicit Behaviour", "repo": "lab-cpp-oop-state", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "06", @@ -1928,6 +2150,8 @@ "title": "Facade — Subsystem Boundary", "repo": "lab-cpp-oop-facade", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "07", @@ -1940,6 +2164,8 @@ "title": "Command — Request as Object", "repo": "lab-cpp-oop-command", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "08", @@ -1952,6 +2178,8 @@ "title": "Observer — Subscription and Telemetry", "repo": "lab-cpp-oop-observer", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "09", @@ -1964,6 +2192,8 @@ "title": "Factory Method — Resource Policy", "repo": "lab-cpp-oop-factory-method", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "10", @@ -1976,6 +2206,8 @@ "title": "Builder — Valid Configuration", "repo": "lab-cpp-oop-builder", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "11", @@ -1988,6 +2220,8 @@ "title": "Decorator — Measurement and Diagnostics", "repo": "lab-cpp-oop-decorator", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "12", @@ -2000,6 +2234,8 @@ "title": "Composite — Component Tree", "repo": "lab-cpp-oop-composite", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "13", @@ -2012,6 +2248,8 @@ "title": "Chain of Responsibility", "repo": "lab-cpp-oop-chain", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "14", @@ -2024,6 +2262,8 @@ "title": "Pattern-language Integration", "repo": "lab-cpp-oop-integration", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "15", @@ -2076,6 +2316,8 @@ "title": "Ruch 1D", "repo": "ruch-1d", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "", @@ -2088,6 +2330,8 @@ "title": "Ruch 2D", "repo": "ruch-2d", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "", @@ -2100,6 +2344,8 @@ "title": "Ruch po okręgu", "repo": "ruch-po-okregu", "href": "", + "local_href": "", + "resource_uuid": "", "available": false, "current": false, "number": "", @@ -2117,8 +2363,9 @@ }, "total_pages": 7, "front": { - "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET1/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  M. Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", - "left_margin_html": "
TECH
", + "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET1/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  Mateusz Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "footer_html": "
UUID 87e48095-7793-54e3-9230-4e61d31bd459Mateusz PabiszczakSTRONA 1/7
", + "left_margin_html": "
TECH
", "right_margin_html": "
OG
", "goal_title": "Cel karty", "goal_html": "

Uczeń przechodzi od liniowego kursora z K&R 5.4 do wielokrotnego użycia tej samej areny: rozpoznaje nagłówek bloku, first-fit, split oraz dwustronne scalanie wolnych bloków w heap_4.

", @@ -2160,7 +2407,8 @@ "title": "A1 — Od liniowego kursora do odzyskiwalnej areny", "show_heading": false, "toc_entry": true, - "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET2/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  M. Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET2/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  Mateusz Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "footer_html": "
UUID 87e48095-7793-54e3-9230-4e61d31bd459Mateusz PabiszczakSTRONA 2/7
", "left_margin_html": "
TECH
-
", "right_margin_html": "
OG
-
", "content_html": "", @@ -2199,9 +2447,9 @@ "number": 1, "label": "aplikacja żąda i zwalnia bajty", "mode": "CODE", - "strategy_ref": "code.heap4", + "strategy_ref": "code.boundary", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:78", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", "description": "Aplikacja zna wyłącznie publiczne API i wskaźniki payloadu.", "evidence": "trzy żądania 24, 40 i 16 bajtów", "strategy": { @@ -2209,32 +2457,34 @@ "kind": "code", "action": "open", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "application code calls only the public FreeRTOS allocation API", + "the selected heap implementation is linked below that API" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "the application never edits allocator metadata", + "Hazard3 observes the same ucHeap object named by the ELF" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "code_ref", + "public symbol", + "arena symbol", + "target profile" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "K&R 5.4 linear allocator complete" ], "layout": [ + "application", + "FreeRTOS API", + "heap_4", "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "Hazard3" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "rg -n 'pvPortMalloc|vPortFree|vPortGetHeapStats|ucHeap' src/tasks/task03_freertos_heap4.c", + "rg -n 'TASK03_KERNEL_SOURCES|HEAP4_SOURCE' Makefile" ], - "template_id": "code.heap4" + "template_id": "code.boundary" } }, { @@ -2242,9 +2492,9 @@ "number": 2, "label": "FreeRTOS wystawia malloc, free i statystyki", "mode": "CODE", - "strategy_ref": "code.heap4", + "strategy_ref": "code.boundary", "svg_label": "02", - "code_ref": "src/tasks/task03_freertos_heap4.c:90", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", "description": "API oddziela eksperyment od prywatnej listy bloków.", "evidence": "pvPortMalloc, vPortFree, vPortGetHeapStats", "strategy": { @@ -2252,32 +2502,34 @@ "kind": "code", "action": "open", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "application code calls only the public FreeRTOS allocation API", + "the selected heap implementation is linked below that API" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "the application never edits allocator metadata", + "Hazard3 observes the same ucHeap object named by the ELF" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "code_ref", + "public symbol", + "arena symbol", + "target profile" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "K&R 5.4 linear allocator complete" ], "layout": [ + "application", + "FreeRTOS API", + "heap_4", "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "Hazard3" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "rg -n 'pvPortMalloc|vPortFree|vPortGetHeapStats|ucHeap' src/tasks/task03_freertos_heap4.c", + "rg -n 'TASK03_KERNEL_SOURCES|HEAP4_SOURCE' Makefile" ], - "template_id": "code.heap4" + "template_id": "code.boundary" } }, { @@ -2287,9 +2539,9 @@ "mode": "CODE", "strategy_ref": "code.heap4", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:70", - "description": "Prywatny mechanizm wybiera, dzieli i scala wolne bloki.", - "evidence": "reset i inicjalizacja listy", + "code_ref": "UPSTREAM.md:1", + "description": "Prywatny mechanizm wybiera, dzieli i scala wolne bloki; strategia otwiera prawdziwy heap_4.c.", + "evidence": "prvHeapInit i prvInsertBlockIntoFreeList", "strategy": { "id": "task01/a1/boundary/allocator", "kind": "code", @@ -2318,7 +2570,7 @@ "pxEnd" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "rg -n 'BlockLink_t|prvHeapInit|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' ${FREERTOS_KERNEL_PATH:-/opt/FreeRTOS-Kernel}/portable/MemMang/heap_4.c" ], "template_id": "code.heap4" } @@ -2328,7 +2580,7 @@ "number": 4, "label": "ucHeap jest jedną ograniczoną areną", "mode": "CODE", - "strategy_ref": "code.heap4", + "strategy_ref": "code.boundary", "svg_label": "04", "code_ref": "src/tasks/task03_freertos_heap4.c:11", "description": "Metadane i payload znajdują się w tej samej statycznej tablicy.", @@ -2338,32 +2590,34 @@ "kind": "code", "action": "open", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "application code calls only the public FreeRTOS allocation API", + "the selected heap implementation is linked below that API" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "the application never edits allocator metadata", + "Hazard3 observes the same ucHeap object named by the ELF" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "code_ref", + "public symbol", + "arena symbol", + "target profile" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "K&R 5.4 linear allocator complete" ], "layout": [ + "application", + "FreeRTOS API", + "heap_4", "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "Hazard3" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "rg -n 'pvPortMalloc|vPortFree|vPortGetHeapStats|ucHeap' src/tasks/task03_freertos_heap4.c", + "rg -n 'TASK03_KERNEL_SOURCES|HEAP4_SOURCE' Makefile" ], - "template_id": "code.heap4" + "template_id": "code.boundary" } }, { @@ -2386,7 +2640,8 @@ ], "assertions": [ "pvPortMalloc and vPortFree are present", - "prvInsertBlockIntoFreeList is present" + "prvInsertBlockIntoFreeList is present", + "all eight replay checkpoint symbols are present" ], "evidence_fields": [ "source blob", @@ -2460,7 +2715,8 @@ "title": "A2 — Nagłówek, payload i lista wolnych bloków", "show_heading": false, "toc_entry": true, - "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET3/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  M. Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET3/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  Mateusz Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "footer_html": "
UUID 87e48095-7793-54e3-9230-4e61d31bd459Mateusz PabiszczakSTRONA 3/7
", "left_margin_html": "
TECH
-
", "right_margin_html": "
OG
-
", "content_html": "", @@ -2497,259 +2753,295 @@ { "id": "header", "number": 1, - "label": "nagłówek przechowuje next i size", + "label": "nagłówek RV32 przechowuje next i size", "mode": "CODE", - "strategy_ref": "code.model", + "strategy_ref": "code.heap4", "svg_label": "01", - "code_ref": "src/tasks/heap4_model.h:11", - "description": "ModelBlock pokazuje minimalny kontrakt metadanych heap_4.", - "evidence": "dwa słowa metadanych", + "code_ref": "UPSTREAM.md:1", + "description": "Prawdziwy BlockLink_t zawiera wskaźnik i size_t, po 4 bajty na RV32; port wyrównuje nagłówek do 16 bajtów.", + "evidence": "sizeof(BlockLink_t)=8; portBYTE_ALIGNMENT=16; xHeapStructSize=16", "strategy": { "id": "task01/a2/blocks/header", "kind": "code", "action": "open", "expected_observations": [ - "requested size includes header and alignment", - "free list is ordered by block address" + "heap_4 keeps metadata inside the arena", + "free blocks form one address-ordered intrusive list" ], "assertions": [ - "payload begins after the header", - "split preserves the total arena size" + "allocated bit is stored in the size field", + "xStart and pxEnd are sentinels" ], "evidence_fields": [ - "code_ref", - "header bytes", - "wanted bytes", - "block address" + "symbol", + "list link", + "block size", + "arena address" ], "prerequisites": [ - "K&R 5.4 linear allocator complete" + "FreeRTOS-Kernel V11.3.0 available" ], "layout": [ - "header", - "payload", - "remainder", - "address-ordered list" + "ucHeap", + "BlockLink_t", + "xStart", + "pxEnd" ], "commands": [ - "rg -n 'ModelBlock|align_up|insert_and_coalesce' src/tasks" + "rg -n 'BlockLink_t|prvHeapInit|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' ${FREERTOS_KERNEL_PATH:-/opt/FreeRTOS-Kernel}/portable/MemMang/heap_4.c" ], - "template_id": "code.model" + "template_id": "code.heap4" } }, { "id": "alignment", "number": 2, - "label": "żądanie obejmuje nagłówek i wyrównanie", - "mode": "CODE", - "strategy_ref": "code.model", + "label": "A(24) obejmuje nagłówek i wyrównanie", + "mode": "RUN", + "event_id": "E02", + "strategy_ref": "run.timeline", "svg_label": "02", - "code_ref": "src/tasks/task01_first_fit_split.c:3", - "description": "13 bajtów payloadu zajmuje 32 bajty całego bloku.", - "evidence": "header=16, wanted=32", + "code_ref": "src/tasks/task03_freertos_heap4.c:137", + "snapshot_ref": "task01.alloc-a", + "description": "Różnica licznika wolnych bajtów mierzy cały blok, nie sam payload.", + "evidence": "g_a_consumed = 48; g_a_aligned = 1", "strategy": { "id": "task01/a2/blocks/alignment", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "requested size includes header and alignment", - "free list is ordered by block address" + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" ], "assertions": [ - "payload begins after the header", - "split preserves the total arena size" + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" ], "evidence_fields": [ - "code_ref", - "header bytes", - "wanted bytes", - "block address" + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" ], "prerequisites": [ - "K&R 5.4 linear allocator complete" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "header", - "payload", - "remainder", - "address-ordered list" + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" ], "commands": [ - "rg -n 'ModelBlock|align_up|insert_and_coalesce' src/tasks" + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" ], - "template_id": "code.model" + "template_id": "run.timeline" } }, { "id": "split", "number": 3, "label": "split pozostawia osobny wolny blok", - "mode": "CODE", - "strategy_ref": "code.model", + "mode": "RUN", + "event_id": "E02", + "strategy_ref": "run.timeline", "svg_label": "03", - "code_ref": "src/tasks/task01_first_fit_split.c:43", - "description": "Reszta zachowuje własny nagłówek i trafia na listę wolnych.", - "evidence": "32 + 224 = 256", + "code_ref": "src/tasks/task03_freertos_heap4.c:137", + "snapshot_ref": "task01.alloc-a", + "description": "Po pierwszym first-fit pozostała część areny nadal jest jednym wolnym blokiem.", + "evidence": "free = 4032; free blocks = 1", "strategy": { "id": "task01/a2/blocks/split", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "requested size includes header and alignment", - "free list is ordered by block address" + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" ], "assertions": [ - "payload begins after the header", - "split preserves the total arena size" + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" ], "evidence_fields": [ - "code_ref", - "header bytes", - "wanted bytes", - "block address" + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" ], "prerequisites": [ - "K&R 5.4 linear allocator complete" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "header", - "payload", - "remainder", - "address-ordered list" + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" ], "commands": [ - "rg -n 'ModelBlock|align_up|insert_and_coalesce' src/tasks" + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" ], - "template_id": "code.model" + "template_id": "run.timeline" } }, { "id": "address-order", "number": 4, "label": "lista jest uporządkowana rosnącymi adresami", - "mode": "CODE", - "strategy_ref": "code.model", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.fragmented", "svg_label": "04", - "code_ref": "src/tasks/task02_address_order_coalesce.c:29", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", + "snapshot_ref": "task01.fragmented", "description": "Pozycja w liście ujawnia bezpośredniego poprzednika i następnika.", - "evidence": "previous < block < current", + "evidence": "g_a < g_b < g_c; dwa wolne obszary", "strategy": { "id": "task01/a2/blocks/address-order", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "requested size includes header and alignment", - "free list is ordered by block address" + "A and C are free while B remains allocated", + "the free list contains two blocks" ], "assertions": [ - "payload begins after the header", - "split preserves the total arena size" + "xNumberOfFreeBlocks equals 2", + "current free bytes exceed the largest free block" ], "evidence_fields": [ - "code_ref", - "header bytes", - "wanted bytes", - "block address" + "free blocks", + "largest block", + "free bytes", + "heap bytes" ], "prerequisites": [ - "K&R 5.4 linear allocator complete" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "header", - "payload", - "remainder", - "address-ordered list" + "source", + "free-list stats", + "ucHeap memory", + "registers" ], "commands": [ - "rg -n 'ModelBlock|align_up|insert_and_coalesce' src/tasks" + "break heap4_fragmented_checkpoint", + "print g_fragmented_stats", + "print g_fragmented_free", + "x/96bx ucHeap" ], - "template_id": "code.model" - } - }, - { - "id": "right-join", - "number": 5, - "label": "blok scala się z prawym sąsiadem", - "mode": "CODE", - "strategy_ref": "code.model", - "svg_label": "05", - "code_ref": "src/tasks/task02_address_order_coalesce.c:40", - "description": "Koniec zwalnianego bloku równy adresowi current oznacza ciągłość.", - "evidence": "block + size == current", - "strategy": { - "id": "task01/a2/blocks/right-join", - "kind": "code", - "action": "open", - "expected_observations": [ - "requested size includes header and alignment", - "free list is ordered by block address" - ], - "assertions": [ - "payload begins after the header", - "split preserves the total arena size" - ], - "evidence_fields": [ - "code_ref", - "header bytes", - "wanted bytes", - "block address" - ], - "prerequisites": [ - "K&R 5.4 linear allocator complete" - ], - "layout": [ - "header", - "payload", - "remainder", - "address-ordered list" - ], - "commands": [ - "rg -n 'ModelBlock|align_up|insert_and_coalesce' src/tasks" - ], - "template_id": "code.model" + "template_id": "run.fragmented" } }, { "id": "left-join", - "number": 6, - "label": "wynik scala się z lewym sąsiadem", - "mode": "CODE", - "strategy_ref": "code.model", - "svg_label": "06", - "code_ref": "src/tasks/task02_address_order_coalesce.c:48", - "description": "Drugi test domyka dwustronne scalanie w jeden blok.", - "evidence": "previous + size == block", + "number": 5, + "label": "heap_4 scala najpierw poprzedni blok", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.coalescing", + "svg_label": "05", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", + "snapshot_ref": "task01.fragmented", + "description": "Replay E06, tymczasowy breakpoint i step w prywatnej funkcji pokazują pierwszy test ciągłości.", + "evidence": "previous + previous.size == inserted", "strategy": { "id": "task01/a2/blocks/left-join", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "requested size includes header and alignment", - "free list is ordered by block address" + "the replay stops after free(C), immediately before free(B)", + "inside prvInsertBlockIntoFreeList the previous block is merged before the next block" ], "assertions": [ - "payload begins after the header", - "split preserves the total arena size" + "pxIterator < pxBlockToInsert < pxIterator->pxNextFreeBlock", + "the left adjacency test is evaluated before the right adjacency test" ], "evidence_fields": [ - "code_ref", - "header bytes", - "wanted bytes", - "block address" + "pxIterator", + "pxBlockToInsert", + "left end address", + "right start address" ], "prerequisites": [ - "K&R 5.4 linear allocator complete" + "task01.fragmented replay ready" ], "layout": [ - "header", - "payload", - "remainder", - "address-ordered list" + "application call vPortFree(g_b)", + "prvInsertBlockIntoFreeList", + "free-list links", + "ucHeap addresses" ], "commands": [ - "rg -n 'ModelBlock|align_up|insert_and_coalesce' src/tasks" + "tbreak prvInsertBlockIntoFreeList", + "continue", + "print pxIterator", + "print pxBlockToInsert", + "next" ], - "template_id": "code.model" + "template_id": "run.coalescing" + } + }, + { + "id": "right-join", + "number": 6, + "label": "następnie scala prawy blok", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.coalescing", + "svg_label": "06", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", + "snapshot_ref": "task01.fragmented", + "description": "Drugi test wykorzystuje już powiększony lewy blok i domyka scalenie areny.", + "evidence": "merged + merged.size == current", + "strategy": { + "id": "task01/a2/blocks/right-join", + "kind": "run", + "action": "replay", + "expected_observations": [ + "the replay stops after free(C), immediately before free(B)", + "inside prvInsertBlockIntoFreeList the previous block is merged before the next block" + ], + "assertions": [ + "pxIterator < pxBlockToInsert < pxIterator->pxNextFreeBlock", + "the left adjacency test is evaluated before the right adjacency test" + ], + "evidence_fields": [ + "pxIterator", + "pxBlockToInsert", + "left end address", + "right start address" + ], + "prerequisites": [ + "task01.fragmented replay ready" + ], + "layout": [ + "application call vPortFree(g_b)", + "prvInsertBlockIntoFreeList", + "free-list links", + "ucHeap addresses" + ], + "commands": [ + "tbreak prvInsertBlockIntoFreeList", + "continue", + "print pxIterator", + "print pxBlockToInsert", + "next" + ], + "template_id": "run.coalescing" } } ] @@ -2765,11 +3057,11 @@ "columns": 1, "x": 0.0, "y": 0.0, - "width": 295.0, + "width": 312.0, "height": 620.0, "full_x": 0.0, "full_y": 0.0, - "full_width": 295.0, + "full_width": 312.0, "full_height": 620.0, "page_width": 660.0, "page_height": 760.0, @@ -2805,7 +3097,8 @@ "title": "A5 — First-fit, fragmentacja i pełne scalenie", "show_heading": false, "toc_entry": true, - "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET4/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  M. Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET4/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  Mateusz Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "footer_html": "
UUID 87e48095-7793-54e3-9230-4e61d31bd459Mateusz PabiszczakSTRONA 4/7
", "left_margin_html": "
TECH
-
", "right_margin_html": "
OG
-
", "content_html": "", @@ -2843,186 +3136,274 @@ "id": "reset", "number": 1, "label": "reset i inicjalizacja areny", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E01", + "strategy_ref": "run.timeline", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:70", - "description": "Pierwsze małe żądanie inicjalizuje sentinele i listę.", - "evidence": "initial free = 4080", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", + "snapshot_ref": "task01.reset", + "description": "Próbne żądanie inicjalizuje sentinele; po jego zwolnieniu arena ma jeden blok.", + "evidence": "free = largest = 4080; blocks = 1", "strategy": { "id": "task01/a5/replay/reset", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" ], - "template_id": "code.heap4" + "template_id": "run.timeline" } }, { "id": "alloc-a", "number": 2, "label": "first-fit przydziela A", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E02", + "strategy_ref": "run.timeline", "svg_label": "02", - "code_ref": "src/tasks/task03_freertos_heap4.c:78", + "code_ref": "src/tasks/task03_freertos_heap4.c:137", + "snapshot_ref": "task01.alloc-a", "description": "Pierwszy wystarczający blok zostaje rozdzielony.", - "evidence": "A payload = 24", + "evidence": "A=24; consumed=48; free=4032", "strategy": { "id": "task01/a5/replay/alloc-a", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" ], - "template_id": "code.heap4" + "template_id": "run.timeline" } }, { - "id": "alloc-bc", + "id": "alloc-b", "number": 3, - "label": "kolejne split tworzą B i C", - "mode": "CODE", - "strategy_ref": "code.heap4", + "label": "kolejny split tworzy B", + "mode": "RUN", + "event_id": "E03", + "strategy_ref": "run.timeline", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:79", - "description": "B i C zajmują kolejne fragmenty tego samego wolnego bloku.", - "evidence": "after allocations = 3952", + "code_ref": "src/tasks/task03_freertos_heap4.c:145", + "snapshot_ref": "task01.alloc-b", + "description": "B zajmuje następny fragment tej samej reszty.", + "evidence": "B=40; consumed=64; free=3968", "strategy": { - "id": "task01/a5/replay/alloc-bc", - "kind": "code", - "action": "open", + "id": "task01/a5/replay/alloc-b", + "kind": "run", + "action": "replay", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" ], - "template_id": "code.heap4" + "template_id": "run.timeline" } }, { - "id": "free-ac", + "id": "alloc-c", "number": 4, - "label": "zwolnij A i C, pozostaw B", - "mode": "CODE", - "strategy_ref": "code.heap4", + "label": "trzeci split tworzy C", + "mode": "RUN", + "event_id": "E04", + "strategy_ref": "run.timeline", "svg_label": "04", - "code_ref": "src/tasks/task03_freertos_heap4.c:88", - "description": "C scala się z prawą resztą, ale B oddziela ją od A.", - "evidence": "dwa wolne bloki", + "code_ref": "src/tasks/task03_freertos_heap4.c:153", + "snapshot_ref": "task01.alloc-c", + "description": "A, B i C są wyrównane, a za nimi pozostaje jedna wolna reszta.", + "evidence": "C=16; consumed=32; free=3936", "strategy": { - "id": "task01/a5/replay/free-ac", - "kind": "code", - "action": "open", + "id": "task01/a5/replay/alloc-c", + "kind": "run", + "action": "replay", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" ], - "template_id": "code.heap4" + "template_id": "run.timeline" + } + }, + { + "id": "free-a", + "number": 5, + "label": "zwolnij A, pozostaw B i C", + "mode": "RUN", + "event_id": "E05", + "strategy_ref": "run.timeline", + "svg_label": "05", + "code_ref": "src/tasks/task03_freertos_heap4.c:163", + "snapshot_ref": "task01.free-a", + "description": "Wolny A i końcowa reszta są rozdzielone przez B i C.", + "evidence": "blocks=2; free=3984", + "strategy": { + "id": "task01/a5/replay/free-a", + "kind": "run", + "action": "replay", + "expected_observations": [ + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" + ], + "assertions": [ + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" + ], + "evidence_fields": [ + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" + ], + "prerequisites": [ + "clean Hazard3 RAM", + "task03 image loaded" + ], + "layout": [ + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" + ], + "commands": [ + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" + ], + "template_id": "run.timeline" } }, { "id": "fragmented", - "number": 5, - "label": "checkpoint fragmentacji", + "number": 6, + "label": "zwolnij C, pozostaw B", "mode": "RUN", - "event_id": "E01", + "event_id": "E06", "strategy_ref": "run.fragmented", - "svg_label": "05", - "code_ref": "src/tasks/task03_freertos_heap4.c:91", + "svg_label": "06", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", "snapshot_ref": "task01.fragmented", - "description": "GDB zatrzymuje program przy dwóch wolnych blokach.", - "evidence": "xNumberOfFreeBlocks = 2", + "description": "C scala się z prawą resztą, ale B nadal rozdziela dwa wolne obszary.", + "evidence": "blocks=2; free=4016; free>largest", "strategy": { "id": "task01/a5/replay/fragmented", "kind": "run", @@ -3054,66 +3435,24 @@ "commands": [ "break heap4_fragmented_checkpoint", "print g_fragmented_stats", - "x/64bx ucHeap" + "print g_fragmented_free", + "x/96bx ucHeap" ], "template_id": "run.fragmented" } }, - { - "id": "free-b", - "number": 6, - "label": "zwolnij B między dwoma sąsiadami", - "mode": "CODE", - "strategy_ref": "code.heap4", - "svg_label": "06", - "code_ref": "src/tasks/task03_freertos_heap4.c:93", - "description": "Wstawienie adresowe umożliwia dwa testy ciągłości.", - "evidence": "A + B + C + reszta są ciągłe", - "strategy": { - "id": "task01/a5/replay/free-b", - "kind": "code", - "action": "open", - "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" - ], - "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" - ], - "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" - ], - "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" - ], - "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" - ], - "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" - ], - "template_id": "code.heap4" - } - }, { "id": "coalesced", "number": 7, - "label": "arena wraca do jednego bloku", + "label": "zwolnij B i scal oba sąsiednie bloki", "mode": "RUN", - "event_id": "E02", + "event_id": "E07", "strategy_ref": "run.coalesced", "svg_label": "07", - "code_ref": "src/tasks/task03_freertos_heap4.c:96", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", "snapshot_ref": "task01.coalesced", - "description": "Finalne statystyki dowodzą pełnego odzyskania areny.", - "evidence": "final free = initial free; blocks = 1", + "description": "Scalenie lewego, a potem prawego sąsiada przywraca jeden blok.", + "evidence": "free=largest=initial=4080; blocks=1", "strategy": { "id": "task01/a5/replay/coalesced", "kind": "run", @@ -3124,15 +3463,14 @@ ], "assertions": [ "final free equals initial free", - "minimum-ever does not rise after free", - "oversized allocation returns NULL and calls the hook once" + "one free block is also the largest block", + "minimum-ever does not rise after free" ], "evidence_fields": [ "final free", "largest block", "minimum-ever", - "OOM hook", - "PASS" + "free blocks" ], "prerequisites": [ "fragmented checkpoint reached" @@ -3144,9 +3482,10 @@ "PASS" ], "commands": [ - "break task03_debug_checkpoint", + "break heap4_coalesced_checkpoint", "print g_final_stats", - "print g_task03_pass" + "print g_final_free", + "print g_minimum_ever_free" ], "template_id": "run.coalesced" } @@ -3155,43 +3494,51 @@ "id": "oom", "number": 8, "label": "zbyt duże żądanie kończy się NULL", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E08", + "strategy_ref": "run.verified", "svg_label": "08", - "code_ref": "src/tasks/task03_freertos_heap4.c:98", + "code_ref": "src/tasks/task03_freertos_heap4.c:179", + "snapshot_ref": "task01.verified", "description": "Kontrolowany OOM nie narusza listy i wywołuje hook dokładnie raz.", - "evidence": "NULL, hooks=1, asserts=0", + "evidence": "NULL; hooks=1; asserts=0; PASS=1", "strategy": { "id": "task01/a5/replay/oom", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "the oversized request returns NULL", + "the malloc-failed hook runs once without corrupting the recovered arena" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "g_oom_is_null equals 1", + "g_malloc_failed_hooks equals 1", + "g_assert_failures equals 0", + "g_task03_pass equals 1" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "OOM result", + "hook count", + "assert count", + "PASS" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "coalesced checkpoint reproducible" ], "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "final stats", + "OOM result", + "hook", + "PASS" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "break task03_debug_checkpoint", + "print g_too_large", + "print g_malloc_failed_hooks", + "print g_assert_failures", + "print g_task03_pass" ], - "template_id": "code.heap4" + "template_id": "run.verified" } } ] @@ -3207,22 +3554,22 @@ "columns": 1, "x": 0.0, "y": 0.0, - "width": 811.0, - "height": 263.0, + "width": 812.0, + "height": 236.0, "full_x": 0.0, "full_y": 0.0, - "full_width": 811.0, - "full_height": 263.0, + "full_width": 812.0, + "full_height": 236.0, "page_width": 940.0, "page_height": 560.0, "overview": true, "step_ids": [ "alloc-a", - "alloc-bc", + "alloc-b", + "alloc-c", "coalesced", "fragmented", - "free-ac", - "free-b", + "free-a", "oom", "reset" ] @@ -3249,7 +3596,8 @@ "title": "A6 — Stan bloku a stan statystyk", "show_heading": false, "toc_entry": true, - "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET5/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  M. Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET5/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  Mateusz Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "footer_html": "
UUID 87e48095-7793-54e3-9230-4e61d31bd459Mateusz PabiszczakSTRONA 5/7
", "left_margin_html": "
TECH
-
", "right_margin_html": "
OG
-
", "content_html": "", @@ -3287,86 +3635,104 @@ "id": "free", "number": 1, "label": "wolny blok należy do listy", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E01", + "strategy_ref": "run.timeline", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:70", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", + "snapshot_ref": "task01.reset", "description": "Stan początkowy zawiera jeden największy wolny blok.", - "evidence": "initial free = largest free", + "evidence": "initial free = largest free = 4080", "strategy": { "id": "task01/a6/state/free", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" ], - "template_id": "code.heap4" + "template_id": "run.timeline" } }, { "id": "allocated", "number": 2, "label": "przydzielony blok znika z listy wolnych", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E04", + "strategy_ref": "run.timeline", "svg_label": "02", - "code_ref": "src/tasks/task03_freertos_heap4.c:78", + "code_ref": "src/tasks/task03_freertos_heap4.c:153", + "snapshot_ref": "task01.alloc-c", "description": "Payload jest wyrównany, a bieżąca wolna pamięć maleje.", - "evidence": "all payload pointers aligned", + "evidence": "all payload pointers aligned; free=3936", "strategy": { "id": "task01/a6/state/allocated", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "every checkpoint is reached from a clean reset with the same ELF", + "free bytes change by the aligned whole-block size, not by payload alone" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "A, B and C are aligned", + "the free-byte sequence is strictly decreasing during allocation" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "payload pointer", + "consumed bytes", + "available bytes", + "free-list statistics" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "current checkpoint", + "source call", + "heap statistics", + "ucHeap memory" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "print g_initial_free", + "print g_after_a_free", + "print g_after_b_free", + "print g_after_allocations", + "print g_a_consumed", + "print g_b_consumed", + "print g_c_consumed" ], - "template_id": "code.heap4" + "template_id": "run.timeline" } }, { @@ -3374,10 +3740,10 @@ "number": 3, "label": "dwa wolne bloki nie są jednym dużym blokiem", "mode": "RUN", - "event_id": "E01", + "event_id": "E06", "strategy_ref": "run.fragmented", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:90", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", "snapshot_ref": "task01.fragmented", "description": "Suma wolnego miejsca nie gwarantuje jednego dużego przydziału.", "evidence": "free blocks = 2", @@ -3412,7 +3778,8 @@ "commands": [ "break heap4_fragmented_checkpoint", "print g_fragmented_stats", - "x/64bx ucHeap" + "print g_fragmented_free", + "x/96bx ucHeap" ], "template_id": "run.fragmented" } @@ -3422,10 +3789,10 @@ "number": 4, "label": "scalenie przywraca jeden największy blok", "mode": "RUN", - "event_id": "E02", + "event_id": "E07", "strategy_ref": "run.coalesced", "svg_label": "04", - "code_ref": "src/tasks/task03_freertos_heap4.c:94", + "code_ref": "src/tasks/task03_freertos_heap4.c:173", "snapshot_ref": "task01.coalesced", "description": "Current free i largest wracają do wartości początkowej.", "evidence": "free blocks = 1", @@ -3439,15 +3806,14 @@ ], "assertions": [ "final free equals initial free", - "minimum-ever does not rise after free", - "oversized allocation returns NULL and calls the hook once" + "one free block is also the largest block", + "minimum-ever does not rise after free" ], "evidence_fields": [ "final free", "largest block", "minimum-ever", - "OOM hook", - "PASS" + "free blocks" ], "prerequisites": [ "fragmented checkpoint reached" @@ -3459,9 +3825,10 @@ "PASS" ], "commands": [ - "break task03_debug_checkpoint", + "break heap4_coalesced_checkpoint", "print g_final_stats", - "print g_task03_pass" + "print g_final_free", + "print g_minimum_ever_free" ], "template_id": "run.coalesced" } @@ -3470,43 +3837,51 @@ "id": "minimum-ever", "number": 5, "label": "minimum-ever zachowuje najniższy poziom", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E08", + "strategy_ref": "run.verified", "svg_label": "05", - "code_ref": "src/tasks/task03_freertos_heap4.c:95", + "code_ref": "src/tasks/task03_freertos_heap4.c:179", + "snapshot_ref": "task01.verified", "description": "Historyczne minimum nie zwiększa się po odzyskaniu pamięci.", "evidence": "minimum-ever <= after allocations", "strategy": { "id": "task01/a6/state/minimum-ever", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "the oversized request returns NULL", + "the malloc-failed hook runs once without corrupting the recovered arena" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "g_oom_is_null equals 1", + "g_malloc_failed_hooks equals 1", + "g_assert_failures equals 0", + "g_task03_pass equals 1" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "OOM result", + "hook count", + "assert count", + "PASS" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "coalesced checkpoint reproducible" ], "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "final stats", + "OOM result", + "hook", + "PASS" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "break task03_debug_checkpoint", + "print g_too_large", + "print g_malloc_failed_hooks", + "print g_assert_failures", + "print g_task03_pass" ], - "template_id": "code.heap4" + "template_id": "run.verified" } } ] @@ -3522,11 +3897,11 @@ "columns": 1, "x": 0.0, "y": 0.0, - "width": 346.0, + "width": 321.0, "height": 600.0, "full_x": 0.0, "full_y": 0.0, - "full_width": 346.0, + "full_width": 321.0, "full_height": 600.0, "page_width": 660.0, "page_height": 760.0, @@ -3561,7 +3936,8 @@ "title": "A7 — Dowód w Hazard3 i ELF", "show_heading": false, "toc_entry": true, - "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET6/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  M. Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET6/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  Mateusz Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "footer_html": "
UUID 87e48095-7793-54e3-9230-4e61d31bd459Mateusz PabiszczakSTRONA 6/7
", "left_margin_html": "
TECH
-
", "right_margin_html": "
OG
-
", "content_html": "", @@ -3588,7 +3964,7 @@ "block": { "id": "a7", "label": "A7 RUNTIME", - "description": "Ten sam artefakt łączy źródło, symbole ELF, dwa checkpointy, pamięć ucHeap i końcowe asercje." + "description": "Ten sam artefakt łączy źródło, symbole ELF, osiem checkpointów, pamięć ucHeap i końcowe asercje." }, "phases": [ { @@ -3602,7 +3978,7 @@ "mode": "CODE", "strategy_ref": "code.identity", "svg_label": "01", - "code_ref": "src/tasks/task03_freertos_heap4.c:62", + "code_ref": "src/tasks/task03_freertos_heap4.c:127", "description": "Blob źródła jest częścią tożsamości karty.", "evidence": "source git blob", "strategy": { @@ -3615,7 +3991,8 @@ ], "assertions": [ "pvPortMalloc and vPortFree are present", - "prvInsertBlockIntoFreeList is present" + "prvInsertBlockIntoFreeList is present", + "all eight replay checkpoint symbols are present" ], "evidence_fields": [ "source blob", @@ -3657,7 +4034,8 @@ ], "assertions": [ "pvPortMalloc and vPortFree are present", - "prvInsertBlockIntoFreeList is present" + "prvInsertBlockIntoFreeList is present", + "all eight replay checkpoint symbols are present" ], "evidence_fields": [ "source blob", @@ -3684,13 +4062,13 @@ "number": 3, "label": "checkpoint pokazuje dwa wolne bloki", "mode": "RUN", - "event_id": "E01", + "event_id": "E06", "strategy_ref": "run.fragmented", "svg_label": "03", - "code_ref": "src/tasks/task03_freertos_heap4.c:91", + "code_ref": "src/tasks/task03_freertos_heap4.c:168", "snapshot_ref": "task01.fragmented", "description": "Neovim, GDB i pamięć zatrzymują się na tym samym stanie.", - "evidence": "blocks=2 and aligned=1", + "evidence": "blocks=2 and free>largest", "strategy": { "id": "task01/a7/evidence/fragmented-runtime", "kind": "run", @@ -3722,7 +4100,8 @@ "commands": [ "break heap4_fragmented_checkpoint", "print g_fragmented_stats", - "x/64bx ucHeap" + "print g_fragmented_free", + "x/96bx ucHeap" ], "template_id": "run.fragmented" } @@ -3731,43 +4110,49 @@ "id": "memory", "number": 4, "label": "ucHeap ujawnia nagłówki i payload", - "mode": "CODE", - "strategy_ref": "code.heap4", + "mode": "RUN", + "event_id": "E06", + "strategy_ref": "run.fragmented", "svg_label": "04", "code_ref": "src/tasks/task03_freertos_heap4.c:11", + "snapshot_ref": "task01.fragmented", "description": "Widok bajtów łączy diagram z realnym układem areny.", "evidence": "aligned arena and in-band metadata", "strategy": { "id": "task01/a7/evidence/memory", - "kind": "code", - "action": "open", + "kind": "run", + "action": "replay", "expected_observations": [ - "heap_4 keeps metadata inside the arena", - "free blocks form one address-ordered intrusive list" + "A and C are free while B remains allocated", + "the free list contains two blocks" ], "assertions": [ - "allocated bit is stored in the size field", - "xStart and pxEnd are sentinels" + "xNumberOfFreeBlocks equals 2", + "current free bytes exceed the largest free block" ], "evidence_fields": [ - "symbol", - "list link", - "block size", - "arena address" + "free blocks", + "largest block", + "free bytes", + "heap bytes" ], "prerequisites": [ - "FreeRTOS-Kernel V11.3.0 available" + "clean Hazard3 RAM", + "task03 image loaded" ], "layout": [ - "ucHeap", - "BlockLink_t", - "xStart", - "pxEnd" + "source", + "free-list stats", + "ucHeap memory", + "registers" ], "commands": [ - "rg -n 'BlockLink_t|prvInsertBlockIntoFreeList|pvPortMalloc|vPortFree' vendor/FreeRTOS-Kernel/portable/MemMang/heap_4.c" + "break heap4_fragmented_checkpoint", + "print g_fragmented_stats", + "print g_fragmented_free", + "x/96bx ucHeap" ], - "template_id": "code.heap4" + "template_id": "run.fragmented" } }, { @@ -3775,11 +4160,11 @@ "number": 5, "label": "checkpoint końcowy dowodzi odzyskania", "mode": "RUN", - "event_id": "E02", - "strategy_ref": "run.coalesced", + "event_id": "E08", + "strategy_ref": "run.verified", "svg_label": "05", - "code_ref": "src/tasks/task03_freertos_heap4.c:111", - "snapshot_ref": "task01.coalesced", + "code_ref": "src/tasks/task03_freertos_heap4.c:179", + "snapshot_ref": "task01.verified", "description": "Jedna ramka łączy stats, OOM, hook i PASS.", "evidence": "final=initial, blocks=1, pass=1", "strategy": { @@ -3787,36 +4172,38 @@ "kind": "run", "action": "replay", "expected_observations": [ - "freeing B joins both neighbours", - "the arena returns to one reusable block" + "the oversized request returns NULL", + "the malloc-failed hook runs once without corrupting the recovered arena" ], "assertions": [ - "final free equals initial free", - "minimum-ever does not rise after free", - "oversized allocation returns NULL and calls the hook once" + "g_oom_is_null equals 1", + "g_malloc_failed_hooks equals 1", + "g_assert_failures equals 0", + "g_task03_pass equals 1" ], "evidence_fields": [ - "final free", - "largest block", - "minimum-ever", - "OOM hook", + "OOM result", + "hook count", + "assert count", "PASS" ], "prerequisites": [ - "fragmented checkpoint reached" + "coalesced checkpoint reproducible" ], "layout": [ "final stats", - "minimum-ever", - "OOM hook", + "OOM result", + "hook", "PASS" ], "commands": [ "break task03_debug_checkpoint", - "print g_final_stats", + "print g_too_large", + "print g_malloc_failed_hooks", + "print g_assert_failures", "print g_task03_pass" ], - "template_id": "run.coalesced" + "template_id": "run.verified" } } ] @@ -3851,7 +4238,7 @@ }, "diagram_title": "A7 · dowód runtime heap_4", "diagram_block_label": "A7 RUNTIME", - "diagram_description": "Ten sam artefakt łączy źródło, symbole ELF, dwa checkpointy, pamięć ucHeap i końcowe asercje.", + "diagram_description": "Ten sam artefakt łączy źródło, symbole ELF, osiem checkpointów, pamięć ucHeap i końcowe asercje.", "diagram_phase_labels": [ "ARTIFACT / CHECKPOINT / MEMORY / ASSERTION" ] @@ -3871,7 +4258,8 @@ "title": "Task01 — mechanika heap_4", "show_heading": true, "toc_entry": true, - "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET7/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  M. Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "header_html": "
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TITLEheap_4: From Linear Cursor to Reusable Blocks
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C nad FreeRTOS
SERIESFreeRTOS C
CARD01/15
SHEET7/7
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID87e48095-7793-54e3-9230-4e61d31bd459CARD UUIDaea09ab7-9bfd-5368-8d1b-c8724871c1a7AUTHOR  Mateusz Pabiszczak
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
", + "footer_html": "
UUID 87e48095-7793-54e3-9230-4e61d31bd459Mateusz PabiszczakSTRONA 7/7
", "left_margin_html": "
TECH
-
", "right_margin_html": "
OG
-
", "content_html": "", @@ -3880,9 +4268,9 @@ "ref": "task01", "title": "Predict and prove reusable heap_4 blocks", "uuid": "aea09ab7-9bfd-5368-8d1b-c8724871c1a7", - "criterion": "Model 13 -> 32 bajty; poprawna predykcja dwóch wolnych bloków po free(A,C) i jednego po free(B); final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.", + "criterion": "Na RV32 BlockLink_t ma 8 bajtów, lecz 16-bajtowe wyrównanie portu daje xHeapStructSize=16; A/B/C zużywają 48/64/32 bajty; po free(A,C) są dwa wolne bloki, po free(B) jeden; final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.", "conclusion_html": "

heap_4 odzyskuje pamięć dzięki metadanym w arenie, adresowo uporządkowanej liście i scalaniu sąsiadów. Suma wolnych bajtów nie zastępuje informacji o największym bloku, a minimum-ever jest historią, nie bieżącym stanem.

", - "prompt_html": "

Przewidź układ bloków po alloc A/B/C, następnie po free(A,C) i free(B). Odtwórz oba checkpointy i udowodnij, że arena została scalona bez utraty minimum-ever.

", + "prompt_html": "

Przewidź układ bloków po alloc A/B/C, następnie po free(A), free(C) i free(B). Odtwórz checkpointy E01-E08 i udowodnij, że arena została scalona bez utraty minimum-ever.

", "flow": [ { "id": "predict", @@ -3892,8 +4280,8 @@ "steps": [ { "id": "size", - "title": "Policz rozmiar bloku.", - "content_html": "

Dodaj nagłówek do 13 bajtów i wyrównaj wynik do ośmiu.

" + "title": "Policz rozmiary całych bloków.", + "content_html": "

Rozróżnij surowy BlockLink_t (8 bajtów) od xHeapStructSize (16 bajtów), dodaj nagłówek do żądań 24, 40 i 16 bajtów, a następnie wyrównaj wynik do 16.

" }, { "id": "list", @@ -3906,17 +4294,22 @@ "id": "replay", "kind": "block", "title": "B — replay Hazard3", - "content_html": "

Powiąż diagram z dwoma deterministycznymi checkpointami.

", + "content_html": "

Powiąż każdy stan diagramu z deterministycznym checkpointem E01-E08.

", "steps": [ { - "id": "fragmented", - "title": "Sprawdź E01.", - "content_html": "

Porównaj liczbę wolnych bloków, największy blok i bieżące wolne bajty.

" + "id": "allocate", + "title": "Sprawdź E01--E04.", + "content_html": "

Potwierdź wartości 4080, 4032, 3968 i 3936 oraz zużycie 48/64/32 bajtów.

" }, { - "id": "coalesced", - "title": "Sprawdź E02.", - "content_html": "

Udowodnij pełne scalenie, zachowanie minimum-ever i kontrolowany OOM.

" + "id": "release", + "title": "Sprawdź E05--E07.", + "content_html": "

Porównaj liczbę wolnych bloków i udowodnij scalenie poprzedniego, a potem następnego sąsiada.

" + }, + { + "id": "verify", + "title": "Sprawdź E08.", + "content_html": "

Udowodnij zachowanie minimum-ever, kontrolowany OOM, brak asercji i PASS=1.

" } ] }, @@ -3952,7 +4345,7 @@ { "id": "A2", "label": "STRUCTURE", - "subtitle": "headers and address order", + "subtitle": "RV32 header, split and address order", "status": "enabled", "target_label": "fig:a2-structure", "target_id": "fig-a2-structure" @@ -3970,7 +4363,7 @@ "label": "APPLICATION", "subtitle": "experiment is already explicit", "status": "unavailable", - "reason": "The concrete A/B/C allocation experiment is completely represented by A5 and its two runtime checkpoints.", + "reason": "The concrete A/B/C allocation experiment is completely represented by the eight-state replay in A5.", "target_id": "" }, { diff --git a/web/figures/a2-structure.puml b/web/figures/a2-structure.puml index 262ad72..b8bcce8 100644 --- a/web/figures/a2-structure.puml +++ b/web/figures/a2-structure.puml @@ -8,41 +8,46 @@ skinparam defaultFontSize 10 skinparam classBorderColor #2c7794 skinparam classBackgroundColor #edf6fa skinparam ArrowColor #8095a1 -title A2 STRUCTURE — in-band metadata and address order +title A2 STRUCTURE — RV32 header, split and two-sided coalescing class "01 Block header" as HEADER { next : BlockLink_t* size : size_t + raw sizeof = 8 bytes on RV32 + aligned xHeapStructSize = 16 } class "Allocated block" as ALLOC { - 02 header + 13 byte request - aligned total = 32 bytes + 02 A: header + 24 byte request + aligned total = 48 bytes payload begins after header } class "03 Free remainder" as REM { own header - size = 224 bytes + free = 4032 bytes after A } HEADER *-- ALLOC : precedes payload -ALLOC -down-> REM : split preserves 256 +ALLOC -down-> REM : first-fit + split class "04 Address-ordered free list" as LIST { previous < inserted < current + A < B < C+tail } -class "05 Right neighbour" as RIGHT { - block + block.size == current +class "05 Previous / left neighbour" as LEFT { + previous + previous.size == inserted + merge previous first } -class "06 Left neighbour" as LEFT { - previous + previous.size == block +class "06 Next / right neighbour" as RIGHT { + merged + merged.size == current + merge next second } REM -down-> LIST : insert by address -LIST -down-> RIGHT : join first -RIGHT -down-> LEFT : then join left +LIST -down-> LEFT : heap_4 tests first +LEFT -down-> RIGHT : then tests next note right of LIST -Ordering makes both physical -neighbours locally visible. +Address order exposes both physical +neighbours without scanning the arena. end note @enduml diff --git a/web/figures/a2-structure.svg b/web/figures/a2-structure.svg index cc49cc7..bd54938 100644 --- a/web/figures/a2-structure.svg +++ b/web/figures/a2-structure.svg @@ -1,63 +1,68 @@ -A2 STRUCTURE — in-band metadata and address order01 Block headernext : BlockLink_t*size : size_tAllocated block02 header + 13 byte requestaligned total = 32 bytespayload begins after header03 Free remainderown headersize = 224 bytes04 Address-ordered free listprevious < inserted < current05 Right neighbourblock + block.size == current06 Left neighbourprevious + previous.size == blockOrdering makes both physicalneighbours locally visible.precedes payloadsplit preserves 256insert by addressjoin firstthen join left01 Block headernext : BlockLink_t*size : size_traw sizeof = 8 bytes on RV32aligned xHeapStructSize = 16Allocated block02 A: header + 24 byte requestaligned total = 48 bytespayload begins after header03 Free remainderown headerfree = 4032 bytes after A04 Address-ordered free listprevious < inserted < currentA < B < C+tail05 Previous / left neighbourprevious + previous.size == insertedmerge previous first06 Next / right neighbourmerged + merged.size == currentmerge next secondAddress order exposes both physicalneighbours without scanning the arena.precedes payloadfirst-fit + splitinsert by addressheap_4 tests firstthen tests next01 RESETinitial free = 408002 ALLOC A24 byte payloadfirst-fit + split03 ALLOC B / C40 + 16 byte payloadafter = 395204 FREE A / CB remains allocated05 E01 FRAGMENTED2 free blockscurrent > largest06 FREE Binsert by addressjoin right + left07 E02 COALESCED1 free blockfinal = initial08 OOM CHECKNULL · hook=1asserts=0 · PASS=1pvPortMallocsplit remaindervPortFreeheap statscontinuecoalesceoversized request01 E01 RESET1 block · free=4080raw header=8 · aligned=1602 E02 ALLOC A(24)consumed=48free=403203 E03 ALLOC B(40)consumed=64free=396804 E04 ALLOC C(16)consumed=32free=393605 E05 FREE A2 free blocksfree=398406 E06 FREE C2 blocks · fragmentedfree=401607 E07 FREE Bmerge left + right1 block · free=408008 E08 OOM / VERIFYNULL · hook=1asserts=0 · PASS=1pvPortMallocsplit remaindersplit remaindervPortFree(A)vPortFree(C)vPortFree(B)oversized request Free : 01 one list node -Free --> Allocated : 02 first-fit + split\ncurrent free decreases -Allocated --> Fragmented : free A and C -Fragmented : 03 two free blocks +[*] --> Free : 01 E01 one list node +Free --> Allocated : 02 E04 A+B+C allocated\ncurrent free = 3936 +Allocated --> Fragmented : E05 free A\nE06 free C +Fragmented : 03 E06 two free blocks Fragmented : sum free > largest block -Fragmented --> Coalesced : free B\naddress-order joins neighbours -Coalesced : 04 one free block -Coalesced : current free = initial free -Coalesced --> OOMChecked : request > arena -OOMChecked : NULL + hook once +Fragmented --> Coalesced : 04 E07 free B\nmerge previous, then next +Coalesced : one free block +Coalesced : current = largest = initial +Coalesced --> OOMChecked : 05 E08 request > arena +OOMChecked : NULL · hook=1 · PASS=1 OOMChecked --> [*] -state "05 minimum-ever" as MIN +state "minimum-ever" as MIN Allocated -right-> MIN : records low watermark Fragmented -right-> MIN : does not rise Coalesced -right-> MIN : history remains diff --git a/web/figures/a6-state.svg b/web/figures/a6-state.svg index 12a9095..8c07583 100644 --- a/web/figures/a6-state.svg +++ b/web/figures/a6-state.svg @@ -1,42 +1,42 @@ -A6 STATE — block state and heap statisticsFreeAllocatedFragmented03 two free blockssum free > largest blockCoalesced04 one free blockcurrent free = initial freeOOMCheckedNULL + hook once05 minimum-ever01 one list node02 first-fit + splitcurrent free decreasesfree A and Cfree Baddress-order joins neighboursrequest > arenarecords low watermarkdoes not risehistory remains01 E01 one list node02 E04 A+B+C allocatedcurrent free = 3936E05 free AE06 free C04 E07 free Bmerge previous, then next05 E08 request > arenarecords low watermarkdoes not risehistory remains ELF : compile + link ELF --> E1 : reset / load / replay diff --git a/web/figures/a7-runtime.svg b/web/figures/a7-runtime.svg index 62a80d5..0d55821 100644 --- a/web/figures/a7-runtime.svg +++ b/web/figures/a7-runtime.svg @@ -1,36 +1,36 @@ -A7 RUNTIME — one artifact, two checkpoints, one proof«source»01 task03 CA/B/C experiment«artifact»02 ELF + imageheap_4 symbols«checkpoint E01»03 fragmentedblocks=2 · aligned=1«memory»04 ucHeap[4096]headers + payload«checkpoint E02»05 coalescedfinal=initial · blocks=1OOM=1 · PASS=1compile + linkreset / load / replayinspect bytescontinue«source»01 task03 CA/B/C experiment«artifact»02 ELF + imageheap_4 symbols«checkpoint E06»03 fragmentedblocks=2 · free>largest«memory»04 ucHeap[4096]headers + payload«checkpoint E08»05 verifiedfinal=initial · blocks=1OOM=1 · PASS=1compile + linkreset / load / replayinspect bytescontinue