From 6af8fa6da8cb4f3b97ba52a5e8a24aa4beea54c6 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 21 Jul 2026 19:14:20 +0200 Subject: [PATCH] feat: add lab-rv32i-c-gpio-edges-debounce card --- .gitignore | 12 + Makefile | 65 + README.md | 67 + crt0.S | 24 + doc/generated/.gitkeep | 1 + doc/generated/main.tex | 553 ++++ doc/pdf/.gitkeep | 1 + ...1-72e2cbba-4658-5de2-a0dc-8b600ee3f7b0.pdf | Bin 0 -> 279603 bytes json/card_source.json | 823 +++++ json/card_spec.json | 302 ++ scripts/render_card_layouts.sh | 10 + scripts/render_new_pdf.sh | 13 + src/tasks/c13_common.h | 74 + src/tasks/task01_gpio_polling.c | 51 + src/tasks/task02_gpio_rising_irq.c | 92 + src/tasks/task03_gpio_quiet_window.c | 152 + src/tasks/task04_raw_c_superloop.c | 181 ++ tests/test_card.sh | 38 + tests/test_hazard3.sh | 109 + web/app.css | 1 + web/app.js | 61 + web/card-data.json | 2706 +++++++++++++++++ web/index.html | 15 + web/style.css | 39 + 24 files changed, 5390 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 crt0.S create mode 100644 doc/generated/.gitkeep create mode 100644 doc/generated/main.tex create mode 100644 doc/pdf/.gitkeep create mode 100644 doc/pdf/mpabi-inf-c-13-gpio-edges-debounce-v00.01-72e2cbba-4658-5de2-a0dc-8b600ee3f7b0.pdf create mode 100644 json/card_source.json create mode 100644 json/card_spec.json create mode 100755 scripts/render_card_layouts.sh create mode 100755 scripts/render_new_pdf.sh create mode 100644 src/tasks/c13_common.h create mode 100644 src/tasks/task01_gpio_polling.c create mode 100644 src/tasks/task02_gpio_rising_irq.c create mode 100644 src/tasks/task03_gpio_quiet_window.c create mode 100644 src/tasks/task04_raw_c_superloop.c create mode 100755 tests/test_card.sh create mode 100755 tests/test_hazard3.sh create mode 100644 web/app.css create mode 100644 web/app.js create mode 100644 web/card-data.json create mode 100644 web/index.html create mode 100644 web/style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3f3d03 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +/build/ +/doc/generated/* +!/doc/generated/.gitkeep +!/doc/generated/main.tex +*.aux +*.fdb_latexmk +*.fls +*.log +*.out +*.upa +*.upb + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..42f8458 --- /dev/null +++ b/Makefile @@ -0,0 +1,65 @@ +RISCV_PREFIX ?= riscv64-unknown-elf- +CC := $(RISCV_PREFIX)gcc +OBJCOPY := $(RISCV_PREFIX)objcopy +OBJDUMP := $(RISCV_PREFIX)objdump +SIZE := $(RISCV_PREFIX)size + +RV_ENV_ROOT ?= /home/user/dev/edu/rv32i-hazard3-student-env +H3_COMMON ?= $(RV_ENV_ROOT)/vendor/Hazard3/test/sim/common +H3_INIT ?= $(H3_COMMON)/init.S +H3_IRQ_DISPATCH ?= $(H3_COMMON)/irq_dispatch.S +LDSCRIPT ?= $(H3_COMMON)/link_hazard3.ld +MEMOPS ?= $(RV_ENV_ROOT)/vendor/lab-runtime/memops.c + +BUILD_ROOT ?= build +TASKS := task01_gpio_polling task02_gpio_rising_irq task03_gpio_quiet_window task04_raw_c_superloop +ARCH ?= rv32i_zicsr_zifencei +ABI ?= ilp32 +CFLAGS := -std=gnu11 -march=$(ARCH) -mabi=$(ABI) -nostdlib -nostartfiles \ + -ffreestanding -fno-builtin -fno-stack-protector -fno-pic -mno-relax \ + -O0 -g3 -fno-omit-frame-pointer -Wall -Wextra \ + -Isrc/tasks -isystem $(H3_COMMON) +LDFLAGS := -Wl,--no-relax -T$(LDSCRIPT) +LIBS := -lgcc + +.PHONY: all tasks test card-test clean check-support task1 task2 task3 task4 +all: tasks +tasks: $(TASKS) +task1: $(word 1,$(TASKS)) +task2: $(word 2,$(TASKS)) +task3: $(word 3,$(TASKS)) +task4: $(word 4,$(TASKS)) +test: tasks + ./tests/test_hazard3.sh +card-test: + ./tests/test_card.sh + +check-support: + @test -f "$(H3_INIT)" + @test -f "$(H3_IRQ_DISPATCH)" + @test -f "$(H3_COMMON)/tb_gpio_io.h" + @test -f "$(H3_COMMON)/tb_uart_io.h" + @test -f "$(LDSCRIPT)" + @test -f "$(MEMOPS)" + +define TASK_RULES +$(1): $(BUILD_ROOT)/$(1)/prog.bin $(BUILD_ROOT)/$(1)/prog.lst + +$(BUILD_ROOT)/$(1)/prog.elf: crt0.S src/tasks/$(1).c src/tasks/c13_common.h $(H3_INIT) $(H3_IRQ_DISPATCH) $(LDSCRIPT) $(MEMOPS) | check-support + mkdir -p $$(@D) + $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(BUILD_ROOT)/$(1)/prog.map \ + -o $$@ $(H3_INIT) $(H3_IRQ_DISPATCH) crt0.S $(MEMOPS) src/tasks/$(1).c $(LIBS) + $(SIZE) -A -x $$@ + +$(BUILD_ROOT)/$(1)/prog.bin: $(BUILD_ROOT)/$(1)/prog.elf + $(OBJCOPY) -O binary $$< $$@ + +$(BUILD_ROOT)/$(1)/prog.lst: $(BUILD_ROOT)/$(1)/prog.elf + $(OBJDUMP) -d -S -M no-aliases,numeric $$< > $$@ +endef + +$(foreach task,$(TASKS),$(eval $(call TASK_RULES,$(task)))) + +clean: + rm -rf $(BUILD_ROOT) + diff --git a/README.md b/README.md new file mode 100644 index 0000000..fdf8d4b --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ +# C13 — GPIO, zbocza i debounce na RV32I/Hazard3 + +Karta zamyka serię raw C czterema wykonywalnymi przykładami: + +1. polling `DIR`, `OUT` i `IN` z kontrolowanym `TEST_IN`; +2. rising edge → GPIO `PENDING` → external IRQ18 → dispatcher → W1C; +3. bounce `1 → 0 → 1` i akceptacja dopiero po quiet window mierzonym `mtime`; +4. superloop łączący machine timer, UART RX IRQ16 i GPIO IRQ18. + +Programy są freestanding RV32I+Zicsr+Zifencei i wykonują się w RTL +Hazard3/Verilator. Nie ma modelu hostowego, RTOS, kolejki ani semafora. + +## Rejestry modelu + +GPIO zaczyna się pod `0xc0000300` i udostępnia `OUT`, `OUT_SET`, `OUT_CLR`, +`IN`, `TEST_IN`, `RISE_EN`, `FALL_EN`, `PENDING` W1C oraz `DIR`. GPIO używa +external IRQ18. UART0 używa external IRQ16, a machine timer standardowego +machine timer interrupt o `mcause=0x80000007`. + +`TEST_IN` i UART `TEST_RX` są wyłącznie bodźcami testbencha. Symulują zmianę +otoczenia bez TCP lub fizycznego pinu. Nie są rejestrami produkcyjnego GPIO, +nie opisują RP2350 i nie mogą znaleźć się w sterowniku fizycznej płytki. + +## Budowanie i test + +```sh +make tasks +./tests/test_hazard3.sh +``` + +Oracle sprawdza kod wyjścia, timeout, nieobsłużone pułapki i raportowane +rejestry. Dodatkowo niezależnie przelicza odstępy bounce, granicę quiet window +i obecność `mret` w handlerze machine timer. + +Bieżący pomiar RTL: + +- Task01: `DIR=1`, wejście zewnętrzne `2`, po ustawieniu wyjścia `IN=3`, + po wyzerowaniu `IN=0`; +- Task02: jeden IRQ18, `PENDING=0x4` w ISR, W1C usuwa źródło i ponowny wysoki + poziom nie tworzy nowego zbocza; +- Task03: czasy low `0x591`, `0x8ea`, `0xc43`, odstępy po `0x359`, quiet + `0x7d0`, akceptacja po `0x878`, bez wczesnej akceptacji; +- Task04: po jednym timer IRQ, UART16 i GPIO18, bajt `U`, trzy działania main, + `OUT=0x7`, widoczne `IN=0x17`. + +Wartości czasowe zależą od bieżącego RTL i buildu. Kontraktem są relacje: +dwa odstępy bounce są dodatnie i krótsze od quiet window, a akceptacja następuje +nie wcześniej niż quiet po ostatnim zboczu. + +## Podział odpowiedzialności + +W Task02–Task04 ISR potwierdza źródło i publikuje minimalny stan. Debounce oraz +aktualizacja wyjść należą do kodu normalnego. Task04 używa prostych flag +jednozdarzeniowych; nie jest odporną na dowolne przeciążenie kolejką zdarzeń. +To świadoma granica między raw C a kolejną serią FreeRTOS. + +## Karta + +```sh +./scripts/render_card_layouts.sh +./scripts/render_new_pdf.sh +./tests/test_card.sh +``` + +Każdy przykład ma dokładnie A1–A8. Tylko Task01.A3 jest N/D, ponieważ polling +nie ma mechanizmu dispatchu. + diff --git a/crt0.S b/crt0.S new file mode 100644 index 0000000..8521cf7 --- /dev/null +++ b/crt0.S @@ -0,0 +1,24 @@ + .text + .global _start + .type _start, @function + +_start: +.option push +.option norelax + la gp, __global_pointer$ +.option pop + + # common/init.S installed sp and mtvec before entering this startup. + la a0, __bss_start + la a1, __bss_end +1: + bgeu a0, a1, 2f + sb zero, 0(a0) + addi a0, a0, 1 + j 1b +2: + call main + tail _exit + + .size _start, .-_start + diff --git a/doc/generated/.gitkeep b/doc/generated/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/doc/generated/.gitkeep @@ -0,0 +1 @@ + diff --git a/doc/generated/main.tex b/doc/generated/main.tex new file mode 100644 index 0000000..0f10080 --- /dev/null +++ b/doc/generated/main.tex @@ -0,0 +1,553 @@ +% Generated from json/card_source.json by tools/render_card.py. +% Do not edit manually; update the JSON and regenerate. + +\documentclass[12pt,a4paper]{article} + +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage[utf8]{inputenc} +\usepackage[polish]{babel} +\usepackage{csquotes} +\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{eso-pic} +\usepackage{marginnote} +\usepackage{array} +\usepackage{tabularx} +\usepackage{graphicx} +\usepackage{pdflscape} +\usepackage{float} +\usepackage{silence} +\WarningFilter{soulutf8}{This package is obsolete} +\usepackage{pdfcomment} +\usepackage{enumitem} +\usepackage{needspace} +\usepackage{fancyhdr} +\usepackage{lastpage} +\usepackage{microtype} +\usepackage[most]{tcolorbox} +\usepackage{qrcode} +\IfFileExists{references.bib}{% + \usepackage[backend=biber,style=numeric,sorting=none]{biblatex}% + \addbibresource{references.bib}% +}{} + +\hypersetup{hidelinks} + +\IfFileExists{build-meta.tex}{% + \input{build-meta.tex}% +}{% + \newcommand{\BuildCommit}{lokalna}% +} + +\newcommand{\DocumentAuthor}{M. Pabiszczak} +\newcommand{\DocumentYear}{2026} +\newcommand{\CardSeries}{c} +\newcommand{\CardNumber}{13} +\newcommand{\CardCount}{13} +\newcommand{\CardSlug}{gpio-edges-debounce} +\newcommand{\CardVersion}{v00.01} +\newcommand{\DocumentUUID}{72e2cbba-4658-5de2-a0dc-8b600ee3f7b0} + +\newcommand{\EmptyCheck}{\(\square\)} +\newcommand{\EscAnswerLines}[1][3]{\par\noindent\dotfill\par\noindent\dotfill\par\noindent\dotfill} +\newcommand{\EscWriteRow}[1][2.8em]{\rule{0pt}{#1}} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0.45em} +\setlength{\headheight}{24mm} +\setlength{\headsep}{3mm} +\setlength{\footskip}{8mm} +\setlength{\marginparwidth}{1.5cm} +\setlength{\marginparsep}{0.25cm} +\renewcommand{\arraystretch}{1.22} +% Margin separator lines disabled for layout trial. + +\newcommand{\ESCPageResourceHeader}{% + \begingroup% + \setlength{\parskip}{0pt}% + \setlength{\fboxsep}{0pt}% + \setlength{\fboxrule}{0.35pt}% + \setlength{\arrayrulewidth}{0.35pt}% + \noindent\fbox{% + \begin{minipage}[c][23.5mm][c]{\dimexpr\textwidth-2\fboxrule\relax}% + \begin{minipage}[c][23mm][c]{24mm}\centering% + \href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-gpio-edges-debounce}{\qrcode[level=L,height=22mm]{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-gpio-edges-debounce}}% + \end{minipage}% + \vrule width0.35pt% + \begin{minipage}[c][23mm][c]{\dimexpr\linewidth-48mm-0.7pt\relax}% + \setlength{\tabcolsep}{0pt}% + \renewcommand{\arraystretch}{0}% + \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.15126050\linewidth-\arrayrulewidth\relax}|X@{}}% + \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries TITLE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries GPIO, zbocza i quiet-window debounce}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries VER.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.6}{6.8}\selectfont\ttfamily\bfseries v00.01}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries DATETIME}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 2026-07-20T00:00:00+02:00}\hspace{0.45mm}}\par} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.25210084\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14285714\linewidth-\arrayrulewidth\relax}|X@{}}% + \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries PROJECT}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries Freestanding C na RV32I}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SERIES}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries C · Freestanding RV32I and K\&R}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries CARD}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 13/13}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SHEET}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries \thepage/\pageref{LastPage}}\hspace{0.45mm}}\par} \\% + \end{tabularx}% + \par\nointerlineskip% + \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 72e2cbba-4658-5de2-a0dc-8b600ee3f7b0}\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 29e6021a-d033-5fbe-a5fc-ec03442ac68a}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR M. Pabiszczak}\hspace{0.35mm}}} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}X@{}}% + \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries GITEA} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-gpio-edges-debounce}{\nolinkurl{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-gpio-edges-debounce}}}} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}X@{}}% + \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries HTML} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/29e6021a-d033-5fbe-a5fc-ec03442ac68a}{\nolinkurl{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/29e6021a-d033-5fbe-a5fc-ec03442ac68a}}}} \\% + \end{tabularx}% + \end{minipage}% + \vrule width0.35pt% + \begin{minipage}[c][23mm][c]{24mm}\centering% + \href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/29e6021a-d033-5fbe-a5fc-ec03442ac68a}{\qrcode[level=L,height=22mm]{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/29e6021a-d033-5fbe-a5fc-ec03442ac68a}}% + \end{minipage}% + \end{minipage}% + }% + \endgroup% +} + +\pagestyle{fancy} +\fancyhf{} +\fancyhead[C]{\ESCPageResourceHeader} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} + +\newcommand{\ESCMarginTag}[4]{% + \hspace*{#1}\textcolor{#2}{#3~#4}% +} +\newcommand{\ESCSectionBlockStart}{% + \Needspace{8\baselineskip}% + \par\vspace{0.35em}% + \noindent\textcolor{black!28}{\rule{\textwidth}{0.35pt}}% + \par\vspace{0.15em}% +} +\newcommand{\ESCSectionBlockEnd}{% + \par\vspace{0.45em}% +} +\newcommand{\ESCTinyStepSeparator}{% + \par\vspace{0.10em}% + \noindent{\color{black!18}\leaders\hbox{\rule{0.60em}{0.22pt}\hspace{0.38em}}\hfill\kern0pt}% + \par\vspace{0.10em}% +} +\newtcolorbox{ESCTaskFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black,boxsep=0pt,left=1.4mm,right=1.4mm,top=0.8mm,bottom=0.8mm,colbacktitle=black!7,coltitle=black,title={\ttfamily\bfseries TASK\quad #1}} +\newtcolorbox{ESCBlockFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!55,boxsep=0pt,left=1.0mm,right=1.0mm,top=0.6mm,bottom=0.6mm,colbacktitle=black!4,coltitle=black,title={\ttfamily\bfseries BLOCK\quad #1}} +\newtcolorbox{ESCStepFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!28,boxsep=0pt,left=0.8mm,right=0.8mm,top=0.45mm,bottom=0.45mm,colbacktitle=black!2,coltitle=black,title={\ttfamily STEP\quad #1}} +\newtcolorbox{ESCConclusionFrame}{enhanced,breakable,arc=0pt,boxrule=0.45pt,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 WNIOSEK}} + +\newcommand{\ESCLearningTreeWidget}{% + \reversemarginpar + \marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\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~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń uruchamia obrazy RV32I z limitem cykli, odczytuje rejestry MMIO i kontrolera przerwań,\textCR przelicza czasy bounce i sprawdza, że main, a nie ISR, wykonuje politykę debounce oraz\textCR aktualizuje wyjścia.}}\par% + \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% + \end{minipage}% + }% + \end{minipage}% + ]{} + \normalmarginpar + + \marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \hspace*{0.28em}\textcolor{green!50!black}{EN~LOCAL~EN~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń dla każdego zdarzenia wskazuje osobno source, pending, enable, decyzję dispatchera,\textCR minimalny efekt ISR i późniejszy efekt normalnego kodu.}}\par% + \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~KW~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% + \end{minipage}% + }% + \end{minipage}% + } + +} + +\begin{document} +\sloppy + +\vspace{1.0em} +\noindent{\Large\bfseries Cel karty}\par +\vspace{0.35em} +Uczeń rozdziela fizyczny lub modelowany poziom wejścia, detekcję zbocza, zatrzaśnięty pending, maskowanie kontrolera, wybór handlera i efekt wykonywany później przez main. Potrafi zrealizować quiet-window debounce oraz połączyć timer, UART i GPIO w końcowym superloop bez RTOS. + +\vspace{0.8em} +\noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} +\vspace{0.7em} +\noindent{\Large\bfseries Zakres i zachowane przykłady}\par +\vspace{0.35em} +Cztery przykłady wykonują się na centralnym modelu RTL Hazard3. TEST\_IN i UART TEST\_RX są jawnie wyłącznie bodźcami testbencha. Karta nie udaje modelu RP2350 ani fizycznego pinu. Task01 dowodzi DIR/OUT/IN przez polling, Task02 pełnej ścieżki rising-edge IRQ18 z W1C, Task03 krótkiego ISR i decyzji debounce w main, a Task04 współpracy machine timer, UART IRQ16 i GPIO IRQ18.\par\textbf{Układ każdego przykładu:} pełny profil A1--A8; widok N/D ma jawny powód, a diagram nie jest wymagany, gdy tekst daje lepszy dowód. +\vspace{0.55em} +\small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{1.10cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.50cm}@{}} +\textbf{Typ} & \textbf{Task} & \textbf{Idea} & \textbf{Waga} \\ \hline +\hline +\textbf{\texttt{POLL}} & \textbf{\texttt{Task01}} & \textbf{kierunek, latch wyjścia i testbench-only bodziec wejścia} & \textbf{kluczowe} \\ \hline +\hline +\textbf{\texttt{IRQ18}} & \textbf{\texttt{Task02}} & \textbf{zbocze, pending peryferium, kontroler i resume} & \textbf{kluczowe} \\ \hline +\hline +\textbf{\texttt{DBNC}} & \textbf{\texttt{Task03}} & \textbf{krótki ISR, mtime i decyzja stabilności w main} & \textbf{kluczowe} \\ \hline +\hline +\textbf{\texttt{LOOP}} & \textbf{\texttt{Task04}} & \textbf{trzy źródła, dwa dispatchery, flagi i efekty main} & \textbf{kluczowe} \\ \hline +\end{tabularx} +\normalsize + + +\vspace{0.8em} +\noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} + +\clearpage + +\ESCSectionBlockStart +\section{1 — Rejestr modelu nie jest fizycznym pinem} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +GPIO modelu zaczyna się pod adresem \texttt{0xc0000300}. \texttt{DIR} wybiera kierunek, \texttt{OUT/OUT\_SET/OUT\_CLR} sterują zatrzaśnięciem wyjściowym, a \texttt{IN} pokazuje wyjścia dla pinów ustawionych jako output i bodziec zewnętrzny dla pinów input. \texttt{RISE\_EN} i \texttt{FALL\_EN} wybierają wykrywane zbocza, a \texttt{PENDING} zatrzaskuje je do zapisu W1C. + +\texttt{TEST\_IN} istnieje tylko po stronie laboratorium. Pozwala programowi testowemu wywołać zmianę otoczenia bez fizycznego przewodu. Produkcyjny sterownik czyta \texttt{IN}; nie powinien zawierać zapisu do takiego fixture'u. +\ESCSectionBlockEnd + +\ESCSectionBlockStart +\section{2 — Source, pending i enable to trzy różne fakty} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +Zmiana 0 na 1 jest source dla detektora rising edge. Włączony bit \texttt{RISE\_EN} pozwala zatrzasnąć bit w \texttt{PENDING}; ten bit utrzymuje poziomową linię GPIO external IRQ18. Kontroler Hazard3 osobno ma per-line enable, priorytet oraz globalne bramki \texttt{mie.MEIE} i \texttt{mstatus.MIE}. Dispatcher odczytuje aktywny numer i wywołuje handler z tablicy. + +W1C usuwa źródło poziomowego żądania po stronie peryferium. Sam powrót z handlera, odczyt \texttt{PENDING} ani zamknięcie maski nie potwierdzają zdarzenia. +\ESCSectionBlockEnd + +\ESCSectionBlockStart +\section{3 — Debounce jest decyzją czasu w main} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +ISR Task03 robi tylko trzy rzeczy: zapisuje czas i poziom, potwierdza pending przez W1C oraz na końcu publikuje licznik. Main obserwuje kandydata i akceptuje go dopiero wtedy, gdy od ostatniego zbocza minęło quiet window oraz bieżący poziom nadal odpowiada kandydatowi. Każde nowe zbocze przesuwa początek okna. + +Sekwencja \texttt{1--0--1} jest kontrolowanym bounce. Oba odstępy są krótsze od 2000 taktów, dlatego żaden z trzech bezpośrednich odczytów nie może zaakceptować stanu. To polityka aplikacji, nie funkcja kontrolera przerwań. +\ESCSectionBlockEnd + +\ESCSectionBlockStart +\section{4 — Superloop jest granicą serii raw C} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +Task04 łączy machine timer, UART0 RX external IRQ16 i GPIO external IRQ18. ISR-y publikują flagi, a main konsumuje je i ustawia trzy różne bity wyjściowe. Flaga może skleić wiele produkcji, więc nie jest kolejką; zachowanie liczby i kolejności zdarzeń należy do następnej serii FreeRTOS. +\ESCSectionBlockEnd + +\clearpage +\ESCSectionBlockStart +\section{Zadania — zachowane przykłady w profilu A1–A8} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +\begin{ESCTaskFrame}{TASK01 · Polling DIR, OUT i IN} +{\scriptsize\ttfamily 223fada6-43e4-532a-9c9b-e17445857214}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — dwa źródła widocznego IN} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task01_gpio_polling.c}.\par Dla bitu z \texttt{DIR=1} widoczne \texttt{IN} pochodzi z latcha \texttt{OUT}; dla \texttt{DIR=0} pochodzi z modelowanego wejścia. \texttt{TEST\_IN} zmienia tylko tę drugą część i jest bodźcem laboratorium, nie pinem RP2350. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — pin0 output, pin1 input} +Maska 0x1 wybiera pin wyjściowy, a 0x2 wejściowy. Rejestry SET i CLR modyfikują latch bez read--modify--write. Jeden odczyt \texttt{IN} składa oba widoki, dlatego przy obu stanach wysokich wynosi 0x3. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · N/D} +\textbf{N/D.} Task01 wyłącza detektory zboczy i przerwania; każdy krok jest bezpośrednim pollingiem MMIO, bez ISR, callbacku ani wyboru handlera. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — kontrolowany round trip poziomów} +Po external high program widzi 0x2. SET pinu0 daje OUT=0x1 i IN=0x3. CLR pinu0 oraz TEST\_IN=0 kończą sekwencję IN=0. Te liczby są bitowymi relacjami modelu, nie numerami pinów konkretnej płytki. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — configure, stimulate, sample, clear} +Program wyłącza edge enable, czyści pending, ustawia kierunek i stan początkowy. Następnie podaje bodziec wejściowy, próbkuje, ustawia output, próbkuje ponownie i zeruje oba źródła. Każdy pomiar następuje po odpowiadającym mu zapisie MMIO. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — 0x2 → 0x3 → 0x0} +Widoczny stan portu przechodzi kolejno przez tylko input high, oba bity high i oba low. Kierunek pozostaje 0x1 przez cały eksperyment, a pending pozostaje pusty. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — rzeczywiste transakcje pod 0xc0000300} +Log RTL raportuje 1,2,1,3,0 i pass=1. Listing powinien pokazać osobne zapisy do offsetów DIR, TEST\_IN, OUT\_SET i OUT\_CLR oraz odczyty IN; nie ma wejścia do wspólnego dispatchera external IRQ. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — polling z jawną granicą fixture} +Wzorzec produkcyjny konfiguruje kierunek i czyta wejście lub steruje wyjściem. Warstwa testowa może dostarczyć osobny mechanizm wstrzyknięcia, ale jego nazwa, dokumentacja i lokalizacja muszą uniemożliwiać pomylenie z rejestrem sprzętu. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Przewidź cztery wartości: IN po ustawieniu zewnętrznego pinu 1, OUT po ustawieniu pinu 0, IN przy obu wysokich i IN po wyzerowaniu. Wyjaśnij, dlaczego zapis TEST\_IN jest dozwolony tylko w fixture testbencha. +\par\textbf{Evidence:} Tabela DIR/OUT/IN przed uruchomieniem, log wykonania RTL Hazard3 z kodem wyjścia, odczyt rejestrów MMIO i wniosek oddzielający fixture TEST\_IN od produkcyjnego API GPIO. +\par\textbf{Acceptance:} Oracle: dir=1, external\_high=2, out\_after\_set=1, both\_high=3, final\_in=0, pass=1 i kod wyjścia 0. PENDING pozostaje 0, ponieważ detektory zboczy są wyłączone. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK01 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: DIR, OUT i kolejne wartości IN}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Granica modelu: TEST\_IN kontra fizyczny pin}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\clearpage +\begin{ESCTaskFrame}{TASK02 · Rising edge, IRQ18 i W1C} +{\scriptsize\ttfamily 93fb66db-d0ac-5fc2-811e-5b28e072a346}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — zbocze tworzy zatrzaśnięty fakt} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task02_gpio_rising_irq.c}.\par Bodziec TEST\_IN zmienia pin2 z 0 na 1. Włączony bit RISE\_EN tworzy bit 0x4 w GPIO PENDING, a ten utrzymuje external IRQ18. TEST\_IN jest sztuczny, lecz dalsza ścieżka przez kontroler i rdzeń jest rzeczywistą ścieżką modelu RTL. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — dwa pending i tablica handlerów} +Pierwszy pending leży w peryferium jako maska pinów. Drugi jest widokiem aktywnej linii 18 w kontrolerze Hazard3. Tablica \texttt{\_external\_irq\_table[18]} przechowuje adres zwykłej funkcji handlera. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — external vector wybiera linię 18} +\texttt{mtvec} wybiera wspólny vector machine external interrupt. \texttt{irq\_dispatch.S} odczytuje aktywną linię z \texttt{meinext}, indeksuje tablicę i wykonuje pośredni \texttt{jalr} do handlera GPIO. Handler potwierdza, że bieżący numer to 18. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — jedno zbocze, jedno wznowienie} +Program celowo generuje edge przy zamkniętym globalnym MIE. Dzięki temu może najpierw zmierzyć oba pending jako 1. Po otwarciu MIE oczekuje dokładnie jednego handlera, W1C, obu pending równych 0 i wykonania kodu resume. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — source → pending → enable → dispatch → W1C} +0→1 ustawia GPIO PENDING. Włączona linia18, MEIE i później MIE dopuszczają trap. Dispatcher wybiera handler18; ISR próbkuje maskę i poziom, zapisuje tę maskę do PENDING jako W1C, a dopiero potem publikuje count. Main wraca i mierzy stan 0. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — IDLE, LATCHED, HANDLING, ACKED, RESUMED} +IDLE ma input low i pending 0. Rising edge tworzy LATCHED. Otwarcie MIE prowadzi do HANDLING. Zapis W1C tworzy ACKED, a powrót dispatchera RESUMED. Ponowne high pozostaje ACKED, ponieważ nie zaszła zmiana 0→1. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — 0x4 w GPIO i 18 w kontrolerze} +Raport daje count=1, irq=0x12, source/controller przed 1, pending w ISR 0x4, oba pending po 0 i same-level 0. Listing ma zawierać handler GPIO oraz wspólny dispatcher zakończony \texttt{mret}. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — acknowledge peripheral before publish} +Dla poziomowego IRQ najpierw ustal i usuń przyczynę po stronie peryferium, a dopiero potem publikuj zakończenie dla main. Zamknięcie maski może odłożyć obsługę, ale nie jest potwierdzeniem zdarzenia. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Rozpisz ścieżkę od zmiany TEST\_IN 0→1 do wznowienia main. Zaznacz GPIO PENDING, pending linii 18 w kontrolerze, dwa poziomy enable, decyzję dispatchera, zapis W1C i efekt ponownego podania tego samego poziomu. +\par\textbf{Evidence:} Przewidywany łańcuch source--pending--enable--dispatch--effect, log RTL z IRQ18 i stanami przed/po, listing wspólnego dispatchera oraz wniosek wyjaśniający W1C i brak drugiego zbocza dla high→high. +\par\textbf{Acceptance:} Jeden handler IRQ18 widzi PENDING=0x4 i poziom high. GPIO source oraz controller pending są 1 przed globalnym enable i 0 po W1C; high→high nie tworzy nowego pending, resume=1, pass=1. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK02 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: pending GPIO i kontrolera przed/po ISR}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód dispatchu IRQ18 i zapisu W1C}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\clearpage +\begin{ESCTaskFrame}{TASK03 · Quiet-window debounce po trzech zboczach} +{\scriptsize\ttfamily a2e3b023-04f1-5863-a4e0-360b5ec69b89}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — IRQ rejestruje zmianę, nie intencję użytkownika} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task03_gpio_quiet_window.c}.\par Trzy przejścia TEST\_IN modelują bounce, nie trzy świadome naciśnięcia. Kontroler potrafi zgłosić rising i falling edge, lecz nie zna quiet window ani znaczenia stabilnego przycisku. Ta semantyka należy do kodu normalnego. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — historia ISR i kandydat main} +ISR zapisuje trzy pary \texttt{level,time}, a osobno publikuje ostatni poziom, ostatni czas i count. Main utrzymuje seen count, candidate level oraz candidate time. Krytyczna sekcja chroni snapshot 64-bitowego czasu na RV32. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — każde włączone zbocze wybiera GPIO18} +RISE\_EN i FALL\_EN pozwalają trzem przejściom utworzyć pending. External dispatcher trzy razy wybiera wpis 18 i wywołuje ten sam krótki handler. Numer ostatniego handlera oraz count=3 są dowodem decyzji, nie sam fakt zapisu TEST\_IN. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — restart okna po każdym bounce} +Po każdym nowym count main zastępuje candidate time czasem ostatniego zbocza. Natychmiastowe próby dają early=0. Dopiero stabilny high utrzymany przez co najmniej 2000 taktów daje accepted=1. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — ISR publish, main observe, wait, validate} +ISR czyta pending, poziom i mtime, zapisuje rekord, wykonuje W1C i na końcu zwiększa count. Main atomowo pobiera publikację, aktualizuje kandydata, mierzy wiek oraz porównuje bieżący IN. Nowe zbocze wraca do początku okna. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — HIGH?, LOW?, HIGH?, STABLE\_HIGH} +Pierwsze high jest kandydatem, low unieważnia go, a drugie high tworzy nowego kandydata. Żaden stan z wiekiem mniejszym niż quiet nie jest zaakceptowany. STABLE\_HIGH powstaje dopiero po pełnym oknie bez kolejnego IRQ. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — dwa bounce gapy krótsze od 0x7d0} +Bieżący RTL raportuje czasy low 0x591, 0x8ea, 0xc43, czyli oba gapy 0x359. Akceptacja następuje po 0x878 od ostatniego edge. Konkretne czasy zależą od buildu; oracle niezależnie sprawdza tylko relacje gap=quiet. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — timestamp in ISR, policy in consumer} +ISR powinien szybko potwierdzić sprzęt i opublikować minimalne dane. Konsument może wtedy zmieniać quiet window, politykę akceptacji lub raportowanie bez wydłużania czasu blokowania innych przerwań. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Dla sekwencji poziomów 1,0,1 oblicz oba odstępy i porównaj z quiet=2000. Wyjaśnij, dlaczego ISR publikuje czas, lecz nie akceptuje przycisku, oraz jak nowe zbocze restartuje okno ciszy. +\par\textbf{Evidence:} Przewidywana sekwencja kandydatów, log RTL z trzema czasami i poziomami, niezależne przeliczenie gapów oraz accepted\_after i wniosek przypisujący politykę debounce do main. +\par\textbf{Acceptance:} Poziomy 1,0,1, count=3 i IRQ18. Oba gapy są dodatnie i mniejsze od quiet=2000; early=0, accepted=1, zaakceptowany poziom high, accepted\_after >= quiet i pass=1. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK03 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: trzy poziomy, czasy i gapy}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód quiet window i miejsca decyzji w main}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\clearpage +\begin{ESCTaskFrame}{TASK04 · Timer + UART16 + GPIO18 bez RTOS} +{\scriptsize\ttfamily ebb18b6a-cf31-5595-9901-ac2ac870296f}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — trzy usługi, wspólny czas CPU} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task04_raw_c_superloop.c}.\par Machine timer pochodzi z mtime>=mtimecmp, UART16 z niepustego RX FIFO przy włączonym RX IRQ, a GPIO18 z rising edge zatrzaśniętego w PENDING. TEST\_RX i TEST\_IN tworzą tylko bodźce; logika timer/UART/GPIO po nich jest rzeczywistym modelem RTL. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — trzy publikacje i trzy bity efektu} +Każda usługa ma licznik ISR, payload i flagę. Main ma osobny licznik konsumpcji. Bity OUT 0,1,2 reprezentują odpowiednio efekt GPIO, UART i timera, więc końcowe 0x7 dowodzi wykonania trzech gałęzi bez ukrywania ich w jednej sumie. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — slot 7 oraz external 16/18} +Machine timer cause 7 trafia bezpośrednio do \texttt{isr\_machine\_timer} i wraca przez \texttt{mret}. Machine external vector trafia do wspólnego dispatchera; \texttt{meinext} wybiera wpis 16 dla UART albo 18 dla GPIO i wykonuje \texttt{jalr}. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — efekt dopiero po konsumpcji flagi} +UART handler publikuje U, GPIO handler high, a timer handler tick. Żaden ISR nie ustawia aplikacyjnego bitu OUT. Superloop atomowo zabiera flagę i dopiero jego trzy gałęzie ustawiają 0x2, 0x1 i 0x4. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — source → pending → dispatch → ISR → main} +Timer: comparator→MTIP→slot7→tick flag→bit2. UART: RX FIFO→IRQ16→external dispatcher→read DATA i flag→bit1. GPIO: edge→PENDING→IRQ18→dispatcher→W1C i flag→bit0. Main używa WFI tylko wtedy, gdy nadal brakuje któregoś efektu. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — trzy niezależne PRODUCED/CONSUMED} +Każda usługa przechodzi IDLE→PRODUCED w ISR i PRODUCED→CONSUMED w main. Stan końcowy wymaga trzech liczników konsumpcji równych 1. Flaga wraca do 0, ale licznik zachowuje dowód przejścia. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — cause 7, linie 16/18 i OUT 0x7} +Raport daje timer count 1 i mcause 0x80000007, UART count 1/irq 0x10/byte 0x55, GPIO count 1/irq 0x12/high oraz trzy main actions po 1. OUT=0x7, a IN=0x17 dodaje widoczny wysoki pin wejściowy 0x10. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — ISR-to-main flags with an explicit ceiling} +Jednokomórkowa flaga jest poprawna tylko wtedy, gdy wystarcza informacja co najmniej jedno zdarzenie. Nie zachowuje liczby ani kolejności wielu produkcji. Ten sufit jest powodem przejścia do kolejek i tasków FreeRTOS, a nie pretekstem do nazywania flagi kolejką. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Dla timer tick, bajtu U i rising edge narysuj trzy osobne ścieżki source--pending--enable--dispatcher--ISR--flag--main effect. Wyjaśnij, dlaczego trzy flagi nie są kolejką i jakie ograniczenie przechodzi do serii FreeRTOS. +\par\textbf{Evidence:} Trzy przewidywane ścieżki zdarzeń, log RTL z numerami przerwań i licznikami, listing machine-timer oraz external dispatchera, końcowe OUT/IN i wniosek o granicy flag jednozdarzeniowych. +\par\textbf{Acceptance:} Po jednym timer IRQ z mcause=0x80000007, UART IRQ16 z bajtem 0x55 i GPIO IRQ18 z high. Main konsumuje każdą flagę raz, ustawia trzy bity, OUT=0x7, IN=0x17, pass=1. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK04 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Log RTL: timer, UART16, GPIO18 i efekty main}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Dowód dwóch dispatcherów i końcowego OUT/IN}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\ESCSectionBlockEnd + +\end{document} diff --git a/doc/pdf/.gitkeep b/doc/pdf/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/doc/pdf/.gitkeep @@ -0,0 +1 @@ + diff --git a/doc/pdf/mpabi-inf-c-13-gpio-edges-debounce-v00.01-72e2cbba-4658-5de2-a0dc-8b600ee3f7b0.pdf b/doc/pdf/mpabi-inf-c-13-gpio-edges-debounce-v00.01-72e2cbba-4658-5de2-a0dc-8b600ee3f7b0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5fcd9924aadbdedb7fa2113aea213578fcb4c96d GIT binary patch literal 279603 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�VxH0TAmYCoz>vSJN%CV1kcRo|zwtO=$U1(Px9 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 EK -> KW", + "description": "Kod C, ABI i obserwacja RV32I." + }, + { + "id": "ogolne", + "label": "OG", + "side": "right", + "tree": "WE -> EN -> KW", + "description": "Przewidywanie, pomiar i wniosek." + } + ] + }, + "learning_effects": { + "C13.EN01": { + "bloom_level": "Analiza", + "label": "Od poziomu wejścia do efektu aplikacji", + "text": "Uczeń dla każdego zdarzenia wskazuje osobno source, pending, enable, decyzję dispatchera, minimalny efekt ISR i późniejszy efekt normalnego kodu.", + "assessment_criteria": [ + "C13.KW01" + ] + }, + "C13.EK01": { + "bloom_level": "Zastosowanie", + "label": "Dowód na GPIO/UART/timer RTL", + "text": "Uczeń uruchamia obrazy RV32I z limitem cykli, odczytuje rejestry MMIO i kontrolera przerwań, przelicza czasy bounce i sprawdza, że main, a nie ISR, wykonuje politykę debounce oraz aktualizuje wyjścia.", + "assessment_criteria": [ + "C13.KW01" + ] + } + }, + "assessment_criteria": { + "C13.KW01": { + "text": "Cztery programy kończą się kodem 0 bez timeoutu i nieobsłużonej pułapki. Task01 daje DIR=1 oraz sekwencję IN 2,3,0. Task02 ma jeden IRQ18, PENDING=0x4 w handlerze, source i controller pending 1 przed obsługą oraz 0 po W1C. Task03 zapisuje poziomy 1,0,1, oba odstępy dodatnie i krótsze od quiet=2000, zero wczesnych akceptacji i jedną akceptację po co najmniej quiet. Task04 ma po jednym timer IRQ, UART16 i GPIO18, trzy efekty main, OUT=0x7 oraz IN=0x17.", + "learning_effects": [ + "C13.EN01", + "C13.EK01" + ] + } + }, + "educational_requirements": { + "C13.WE01": { + "text": "Obsługa GPIO i zdarzeń w raw C z jawną granicą bodźca testbench, krótkim ISR, W1C, synchronizacją z main i bez przypisywania modelowi właściwości RP2350.", + "label": "RV32I/Hazard3: polling GPIO, external IRQ18, debounce i końcowy superloop raw C", + "learning_effects": [ + "C13.EN01", + "C13.EK01" + ], + "learning_tree": { + "schema": "we-learning-tree.v1", + "policy": "Najpierw przewidywanie, następnie wykonanie i odczyt dowodu.", + "ogolne": [ + { + "effect_ref": "C13.EN01", + "display": "EN C13 01", + "source": "LOCAL", + "official": "C", + "local": "01", + "kind": "EN", + "tree_id": "C13.WE01.OG.LOCAL.C.01", + "text": "Uczeń dla każdego zdarzenia wskazuje osobno source, pending, enable, decyzję dispatchera, minimalny efekt ISR i późniejszy efekt normalnego kodu.", + "kw": [ + { + "criterion_ref": "C13.KW01", + "display": "KW C13 01", + "source": "LOCAL", + "kind": "KW", + "official": "C", + "local": "01", + "text": "Kod, przewidywanie i pomiar tworzą jeden dowód." + } + ] + } + ], + "zawodowe": [ + { + "effect_ref": "C13.EK01", + "display": "EK C13 01", + "source": "LOCAL", + "official": "C", + "local": "01", + "kind": "EK", + "tree_id": "C13.WE01.TECH.LOCAL.C.01", + "text": "Uczeń uruchamia obrazy RV32I z limitem cykli, odczytuje rejestry MMIO i kontrolera przerwań, przelicza czasy bounce i sprawdza, że main, a nie ISR, wykonuje politykę debounce oraz aktualizuje wyjścia.", + "kw": [ + { + "criterion_ref": "C13.KW01", + "display": "KW C13 01", + "source": "LOCAL", + "kind": "KW", + "official": "C", + "local": "01", + "text": "Kod, przewidywanie i pomiar tworzą jeden dowód." + } + ] + } + ] + } + } + }, + "sections": [ + { + "title": "1 — Rejestr modelu nie jest fizycznym pinem", + "order": 10, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "GPIO modelu zaczyna się pod adresem \\texttt{0xc0000300}. \\texttt{DIR} wybiera kierunek, \\texttt{OUT/OUT\\_SET/OUT\\_CLR} sterują zatrzaśnięciem wyjściowym, a \\texttt{IN} pokazuje wyjścia dla pinów ustawionych jako output i bodziec zewnętrzny dla pinów input. \\texttt{RISE\\_EN} i \\texttt{FALL\\_EN} wybierają wykrywane zbocza, a \\texttt{PENDING} zatrzaskuje je do zapisu W1C.\n\n\\texttt{TEST\\_IN} istnieje tylko po stronie laboratorium. Pozwala programowi testowemu wywołać zmianę otoczenia bez fizycznego przewodu. Produkcyjny sterownik czyta \\texttt{IN}; nie powinien zawierać zapisu do takiego fixture'u.", + "educational_requirement_refs": [ + "C13.WE01" + ], + "learning_effect_refs": [ + "C13.EN01", + "C13.EK01" + ], + "assessment_criterion_refs": [ + "C13.KW01" + ] + }, + { + "title": "2 — Source, pending i enable to trzy różne fakty", + "order": 20, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "Zmiana 0 na 1 jest source dla detektora rising edge. Włączony bit \\texttt{RISE\\_EN} pozwala zatrzasnąć bit w \\texttt{PENDING}; ten bit utrzymuje poziomową linię GPIO external IRQ18. Kontroler Hazard3 osobno ma per-line enable, priorytet oraz globalne bramki \\texttt{mie.MEIE} i \\texttt{mstatus.MIE}. Dispatcher odczytuje aktywny numer i wywołuje handler z tablicy.\n\nW1C usuwa źródło poziomowego żądania po stronie peryferium. Sam powrót z handlera, odczyt \\texttt{PENDING} ani zamknięcie maski nie potwierdzają zdarzenia.", + "educational_requirement_refs": [ + "C13.WE01" + ], + "learning_effect_refs": [ + "C13.EN01", + "C13.EK01" + ], + "assessment_criterion_refs": [ + "C13.KW01" + ] + }, + { + "title": "3 — Debounce jest decyzją czasu w main", + "order": 30, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "ISR Task03 robi tylko trzy rzeczy: zapisuje czas i poziom, potwierdza pending przez W1C oraz na końcu publikuje licznik. Main obserwuje kandydata i akceptuje go dopiero wtedy, gdy od ostatniego zbocza minęło quiet window oraz bieżący poziom nadal odpowiada kandydatowi. Każde nowe zbocze przesuwa początek okna.\n\nSekwencja \\texttt{1--0--1} jest kontrolowanym bounce. Oba odstępy są krótsze od 2000 taktów, dlatego żaden z trzech bezpośrednich odczytów nie może zaakceptować stanu. To polityka aplikacji, nie funkcja kontrolera przerwań.", + "educational_requirement_refs": [ + "C13.WE01" + ], + "learning_effect_refs": [ + "C13.EN01", + "C13.EK01" + ], + "assessment_criterion_refs": [ + "C13.KW01" + ] + }, + { + "title": "4 — Superloop jest granicą serii raw C", + "order": 40, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "Task04 łączy machine timer, UART0 RX external IRQ16 i GPIO external IRQ18. ISR-y publikują flagi, a main konsumuje je i ustawia trzy różne bity wyjściowe. Flaga może skleić wiele produkcji, więc nie jest kolejką; zachowanie liczby i kolejności zdarzeń należy do następnej serii FreeRTOS.", + "educational_requirement_refs": [ + "C13.WE01" + ], + "learning_effect_refs": [ + "C13.EN01", + "C13.EK01" + ], + "assessment_criterion_refs": [ + "C13.KW01" + ] + }, + { + "title": "Zadania — zachowane przykłady w profilu A1–A8", + "order": 50, + "content_kind": "tasks", + "page_orientation": "portrait", + "task_refs": [ + "task01", + "task02", + "task03", + "task04" + ], + "educational_requirement_refs": [ + "C13.WE01" + ], + "learning_effect_refs": [ + "C13.EN01", + "C13.EK01" + ], + "assessment_criterion_refs": [ + "C13.KW01" + ] + } + ], + "tasks": { + "task01": { + "title": "Polling DIR, OUT i IN", + "uuid": "223fada6-43e4-532a-9c9b-e17445857214", + "prompt_tex": "Przewidź cztery wartości: IN po ustawieniu zewnętrznego pinu 1, OUT po ustawieniu pinu 0, IN przy obu wysokich i IN po wyzerowaniu. Wyjaśnij, dlaczego zapis TEST\\_IN jest dozwolony tylko w fixture testbencha.", + "criterion": "Oracle: dir=1, external_high=2, out_after_set=1, both_high=3, final_in=0, pass=1 i kod wyjścia 0. PENDING pozostaje 0, ponieważ detektory zboczy są wyłączone.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — dwa źródła widocznego IN", + "content_tex": "Dla bitu z \\texttt{DIR=1} widoczne \\texttt{IN} pochodzi z latcha \\texttt{OUT}; dla \\texttt{DIR=0} pochodzi z modelowanego wejścia. \\texttt{TEST\\_IN} zmienia tylko tę drugą część i jest bodźcem laboratorium, nie pinem RP2350." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — pin0 output, pin1 input", + "content_tex": "Maska 0x1 wybiera pin wyjściowy, a 0x2 wejściowy. Rejestry SET i CLR modyfikują latch bez read--modify--write. Jeden odczyt \\texttt{IN} składa oba widoki, dlatego przy obu stanach wysokich wynosi 0x3." + }, + { + "id": "A3", + "status": "unavailable", + "title": "DISPATCH", + "reason": "Task01 wyłącza detektory zboczy i przerwania; każdy krok jest bezpośrednim pollingiem MMIO, bez ISR, callbacku ani wyboru handlera." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — kontrolowany round trip poziomów", + "content_tex": "Po external high program widzi 0x2. SET pinu0 daje OUT=0x1 i IN=0x3. CLR pinu0 oraz TEST\\_IN=0 kończą sekwencję IN=0. Te liczby są bitowymi relacjami modelu, nie numerami pinów konkretnej płytki." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — configure, stimulate, sample, clear", + "content_tex": "Program wyłącza edge enable, czyści pending, ustawia kierunek i stan początkowy. Następnie podaje bodziec wejściowy, próbkuje, ustawia output, próbkuje ponownie i zeruje oba źródła. Każdy pomiar następuje po odpowiadającym mu zapisie MMIO." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — 0x2 → 0x3 → 0x0", + "content_tex": "Widoczny stan portu przechodzi kolejno przez tylko input high, oba bity high i oba low. Kierunek pozostaje 0x1 przez cały eksperyment, a pending pozostaje pusty." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — rzeczywiste transakcje pod 0xc0000300", + "content_tex": "Log RTL raportuje 1,2,1,3,0 i pass=1. Listing powinien pokazać osobne zapisy do offsetów DIR, TEST\\_IN, OUT\\_SET i OUT\\_CLR oraz odczyty IN; nie ma wejścia do wspólnego dispatchera external IRQ." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — polling z jawną granicą fixture", + "content_tex": "Wzorzec produkcyjny konfiguruje kierunek i czyta wejście lub steruje wyjściem. Warstwa testowa może dostarczyć osobny mechanizm wstrzyknięcia, ale jego nazwa, dokumentacja i lokalizacja muszą uniemożliwiać pomylenie z rejestrem sprzętu." + } + ], + "flow": [ + { + "kind": "block", + "id": "task01.a1", + "title": "A1 CONTEXT · AKTYWNE — dwa źródła widocznego IN", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task01_gpio_polling.c}.\\par Dla bitu z \\texttt{DIR=1} widoczne \\texttt{IN} pochodzi z latcha \\texttt{OUT}; dla \\texttt{DIR=0} pochodzi z modelowanego wejścia. \\texttt{TEST\\_IN} zmienia tylko tę drugą część i jest bodźcem laboratorium, nie pinem RP2350." + }, + { + "kind": "block", + "id": "task01.a2", + "title": "A2 STRUCTURE · AKTYWNE — pin0 output, pin1 input", + "content_tex": "Maska 0x1 wybiera pin wyjściowy, a 0x2 wejściowy. Rejestry SET i CLR modyfikują latch bez read--modify--write. Jeden odczyt \\texttt{IN} składa oba widoki, dlatego przy obu stanach wysokich wynosi 0x3." + }, + { + "kind": "block", + "id": "task01.a3", + "title": "A3 DISPATCH · N/D", + "content_tex": "\\textbf{N/D.} Task01 wyłącza detektory zboczy i przerwania; każdy krok jest bezpośrednim pollingiem MMIO, bez ISR, callbacku ani wyboru handlera." + }, + { + "kind": "block", + "id": "task01.a4", + "title": "A4 APPLICATION · AKTYWNE — kontrolowany round trip poziomów", + "content_tex": "Po external high program widzi 0x2. SET pinu0 daje OUT=0x1 i IN=0x3. CLR pinu0 oraz TEST\\_IN=0 kończą sekwencję IN=0. Te liczby są bitowymi relacjami modelu, nie numerami pinów konkretnej płytki." + }, + { + "kind": "block", + "id": "task01.a5", + "title": "A5 FLOW · AKTYWNE — configure, stimulate, sample, clear", + "content_tex": "Program wyłącza edge enable, czyści pending, ustawia kierunek i stan początkowy. Następnie podaje bodziec wejściowy, próbkuje, ustawia output, próbkuje ponownie i zeruje oba źródła. Każdy pomiar następuje po odpowiadającym mu zapisie MMIO." + }, + { + "kind": "block", + "id": "task01.a6", + "title": "A6 STATE · AKTYWNE — 0x2 → 0x3 → 0x0", + "content_tex": "Widoczny stan portu przechodzi kolejno przez tylko input high, oba bity high i oba low. Kierunek pozostaje 0x1 przez cały eksperyment, a pending pozostaje pusty." + }, + { + "kind": "block", + "id": "task01.a7", + "title": "A7 RUNTIME · AKTYWNE — rzeczywiste transakcje pod 0xc0000300", + "content_tex": "Log RTL raportuje 1,2,1,3,0 i pass=1. Listing powinien pokazać osobne zapisy do offsetów DIR, TEST\\_IN, OUT\\_SET i OUT\\_CLR oraz odczyty IN; nie ma wejścia do wspólnego dispatchera external IRQ." + }, + { + "kind": "block", + "id": "task01.a8", + "title": "A8 PATTERNS · AKTYWNE — polling z jawną granicą fixture", + "content_tex": "Wzorzec produkcyjny konfiguruje kierunek i czyta wejście lub steruje wyjściem. Warstwa testowa może dostarczyć osobny mechanizm wstrzyknięcia, ale jego nazwa, dokumentacja i lokalizacja muszą uniemożliwiać pomylenie z rejestrem sprzętu." + }, + { + "kind": "exercise", + "id": "task01.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Przewidź cztery wartości: IN po ustawieniu zewnętrznego pinu 1, OUT po ustawieniu pinu 0, IN przy obu wysokich i IN po wyzerowaniu. Wyjaśnij, dlaczego zapis TEST\\_IN jest dozwolony tylko w fixture testbencha.", + "evidence_tex": "Tabela DIR/OUT/IN przed uruchomieniem, log wykonania RTL Hazard3 z kodem wyjścia, odczyt rejestrów MMIO i wniosek oddzielający fixture TEST\\_IN od produkcyjnego API GPIO.", + "criterion": "Oracle: dir=1, external_high=2, out_after_set=1, both_high=3, final_in=0, pass=1 i kod wyjścia 0. PENDING pozostaje 0, ponieważ detektory zboczy są wyłączone." + }, + { + "kind": "block", + "id": "task01.worksheet", + "title": "TASK01 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Log RTL: DIR, OUT i kolejne wartości IN}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Granica modelu: TEST\\_IN kontra fizyczny pin}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C13.WE01" + ], + "learning_effect_refs": [ + "C13.EN01", + "C13.EK01" + ], + "assessment_criterion_ref": "C13.KW01" + }, + "task02": { + "title": "Rising edge, IRQ18 i W1C", + "uuid": "93fb66db-d0ac-5fc2-811e-5b28e072a346", + "prompt_tex": "Rozpisz ścieżkę od zmiany TEST\\_IN 0→1 do wznowienia main. Zaznacz GPIO PENDING, pending linii 18 w kontrolerze, dwa poziomy enable, decyzję dispatchera, zapis W1C i efekt ponownego podania tego samego poziomu.", + "criterion": "Jeden handler IRQ18 widzi PENDING=0x4 i poziom high. GPIO source oraz controller pending są 1 przed globalnym enable i 0 po W1C; high→high nie tworzy nowego pending, resume=1, pass=1.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — zbocze tworzy zatrzaśnięty fakt", + "content_tex": "Bodziec TEST\\_IN zmienia pin2 z 0 na 1. Włączony bit RISE\\_EN tworzy bit 0x4 w GPIO PENDING, a ten utrzymuje external IRQ18. TEST\\_IN jest sztuczny, lecz dalsza ścieżka przez kontroler i rdzeń jest rzeczywistą ścieżką modelu RTL." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — dwa pending i tablica handlerów", + "content_tex": "Pierwszy pending leży w peryferium jako maska pinów. Drugi jest widokiem aktywnej linii 18 w kontrolerze Hazard3. Tablica \\texttt{\\_external\\_irq\\_table[18]} przechowuje adres zwykłej funkcji handlera." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — external vector wybiera linię 18", + "content_tex": "\\texttt{mtvec} wybiera wspólny vector machine external interrupt. \\texttt{irq\\_dispatch.S} odczytuje aktywną linię z \\texttt{meinext}, indeksuje tablicę i wykonuje pośredni \\texttt{jalr} do handlera GPIO. Handler potwierdza, że bieżący numer to 18." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — jedno zbocze, jedno wznowienie", + "content_tex": "Program celowo generuje edge przy zamkniętym globalnym MIE. Dzięki temu może najpierw zmierzyć oba pending jako 1. Po otwarciu MIE oczekuje dokładnie jednego handlera, W1C, obu pending równych 0 i wykonania kodu resume." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — source → pending → enable → dispatch → W1C", + "content_tex": "0→1 ustawia GPIO PENDING. Włączona linia18, MEIE i później MIE dopuszczają trap. Dispatcher wybiera handler18; ISR próbkuje maskę i poziom, zapisuje tę maskę do PENDING jako W1C, a dopiero potem publikuje count. Main wraca i mierzy stan 0." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — IDLE, LATCHED, HANDLING, ACKED, RESUMED", + "content_tex": "IDLE ma input low i pending 0. Rising edge tworzy LATCHED. Otwarcie MIE prowadzi do HANDLING. Zapis W1C tworzy ACKED, a powrót dispatchera RESUMED. Ponowne high pozostaje ACKED, ponieważ nie zaszła zmiana 0→1." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — 0x4 w GPIO i 18 w kontrolerze", + "content_tex": "Raport daje count=1, irq=0x12, source/controller przed 1, pending w ISR 0x4, oba pending po 0 i same-level 0. Listing ma zawierać handler GPIO oraz wspólny dispatcher zakończony \\texttt{mret}." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — acknowledge peripheral before publish", + "content_tex": "Dla poziomowego IRQ najpierw ustal i usuń przyczynę po stronie peryferium, a dopiero potem publikuj zakończenie dla main. Zamknięcie maski może odłożyć obsługę, ale nie jest potwierdzeniem zdarzenia." + } + ], + "flow": [ + { + "kind": "block", + "id": "task02.a1", + "title": "A1 CONTEXT · AKTYWNE — zbocze tworzy zatrzaśnięty fakt", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task02_gpio_rising_irq.c}.\\par Bodziec TEST\\_IN zmienia pin2 z 0 na 1. Włączony bit RISE\\_EN tworzy bit 0x4 w GPIO PENDING, a ten utrzymuje external IRQ18. TEST\\_IN jest sztuczny, lecz dalsza ścieżka przez kontroler i rdzeń jest rzeczywistą ścieżką modelu RTL." + }, + { + "kind": "block", + "id": "task02.a2", + "title": "A2 STRUCTURE · AKTYWNE — dwa pending i tablica handlerów", + "content_tex": "Pierwszy pending leży w peryferium jako maska pinów. Drugi jest widokiem aktywnej linii 18 w kontrolerze Hazard3. Tablica \\texttt{\\_external\\_irq\\_table[18]} przechowuje adres zwykłej funkcji handlera." + }, + { + "kind": "block", + "id": "task02.a3", + "title": "A3 DISPATCH · AKTYWNE — external vector wybiera linię 18", + "content_tex": "\\texttt{mtvec} wybiera wspólny vector machine external interrupt. \\texttt{irq\\_dispatch.S} odczytuje aktywną linię z \\texttt{meinext}, indeksuje tablicę i wykonuje pośredni \\texttt{jalr} do handlera GPIO. Handler potwierdza, że bieżący numer to 18." + }, + { + "kind": "block", + "id": "task02.a4", + "title": "A4 APPLICATION · AKTYWNE — jedno zbocze, jedno wznowienie", + "content_tex": "Program celowo generuje edge przy zamkniętym globalnym MIE. Dzięki temu może najpierw zmierzyć oba pending jako 1. Po otwarciu MIE oczekuje dokładnie jednego handlera, W1C, obu pending równych 0 i wykonania kodu resume." + }, + { + "kind": "block", + "id": "task02.a5", + "title": "A5 FLOW · AKTYWNE — source → pending → enable → dispatch → W1C", + "content_tex": "0→1 ustawia GPIO PENDING. Włączona linia18, MEIE i później MIE dopuszczają trap. Dispatcher wybiera handler18; ISR próbkuje maskę i poziom, zapisuje tę maskę do PENDING jako W1C, a dopiero potem publikuje count. Main wraca i mierzy stan 0." + }, + { + "kind": "block", + "id": "task02.a6", + "title": "A6 STATE · AKTYWNE — IDLE, LATCHED, HANDLING, ACKED, RESUMED", + "content_tex": "IDLE ma input low i pending 0. Rising edge tworzy LATCHED. Otwarcie MIE prowadzi do HANDLING. Zapis W1C tworzy ACKED, a powrót dispatchera RESUMED. Ponowne high pozostaje ACKED, ponieważ nie zaszła zmiana 0→1." + }, + { + "kind": "block", + "id": "task02.a7", + "title": "A7 RUNTIME · AKTYWNE — 0x4 w GPIO i 18 w kontrolerze", + "content_tex": "Raport daje count=1, irq=0x12, source/controller przed 1, pending w ISR 0x4, oba pending po 0 i same-level 0. Listing ma zawierać handler GPIO oraz wspólny dispatcher zakończony \\texttt{mret}." + }, + { + "kind": "block", + "id": "task02.a8", + "title": "A8 PATTERNS · AKTYWNE — acknowledge peripheral before publish", + "content_tex": "Dla poziomowego IRQ najpierw ustal i usuń przyczynę po stronie peryferium, a dopiero potem publikuj zakończenie dla main. Zamknięcie maski może odłożyć obsługę, ale nie jest potwierdzeniem zdarzenia." + }, + { + "kind": "exercise", + "id": "task02.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Rozpisz ścieżkę od zmiany TEST\\_IN 0→1 do wznowienia main. Zaznacz GPIO PENDING, pending linii 18 w kontrolerze, dwa poziomy enable, decyzję dispatchera, zapis W1C i efekt ponownego podania tego samego poziomu.", + "evidence_tex": "Przewidywany łańcuch source--pending--enable--dispatch--effect, log RTL z IRQ18 i stanami przed/po, listing wspólnego dispatchera oraz wniosek wyjaśniający W1C i brak drugiego zbocza dla high→high.", + "criterion": "Jeden handler IRQ18 widzi PENDING=0x4 i poziom high. GPIO source oraz controller pending są 1 przed globalnym enable i 0 po W1C; high→high nie tworzy nowego pending, resume=1, pass=1." + }, + { + "kind": "block", + "id": "task02.worksheet", + "title": "TASK02 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Log RTL: pending GPIO i kontrolera przed/po ISR}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Dowód dispatchu IRQ18 i zapisu W1C}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C13.WE01" + ], + "learning_effect_refs": [ + "C13.EN01", + "C13.EK01" + ], + "assessment_criterion_ref": "C13.KW01" + }, + "task03": { + "title": "Quiet-window debounce po trzech zboczach", + "uuid": "a2e3b023-04f1-5863-a4e0-360b5ec69b89", + "prompt_tex": "Dla sekwencji poziomów 1,0,1 oblicz oba odstępy i porównaj z quiet=2000. Wyjaśnij, dlaczego ISR publikuje czas, lecz nie akceptuje przycisku, oraz jak nowe zbocze restartuje okno ciszy.", + "criterion": "Poziomy 1,0,1, count=3 i IRQ18. Oba gapy są dodatnie i mniejsze od quiet=2000; early=0, accepted=1, zaakceptowany poziom high, accepted_after >= quiet i pass=1.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — IRQ rejestruje zmianę, nie intencję użytkownika", + "content_tex": "Trzy przejścia TEST\\_IN modelują bounce, nie trzy świadome naciśnięcia. Kontroler potrafi zgłosić rising i falling edge, lecz nie zna quiet window ani znaczenia stabilnego przycisku. Ta semantyka należy do kodu normalnego." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — historia ISR i kandydat main", + "content_tex": "ISR zapisuje trzy pary \\texttt{level,time}, a osobno publikuje ostatni poziom, ostatni czas i count. Main utrzymuje seen count, candidate level oraz candidate time. Krytyczna sekcja chroni snapshot 64-bitowego czasu na RV32." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — każde włączone zbocze wybiera GPIO18", + "content_tex": "RISE\\_EN i FALL\\_EN pozwalają trzem przejściom utworzyć pending. External dispatcher trzy razy wybiera wpis 18 i wywołuje ten sam krótki handler. Numer ostatniego handlera oraz count=3 są dowodem decyzji, nie sam fakt zapisu TEST\\_IN." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — restart okna po każdym bounce", + "content_tex": "Po każdym nowym count main zastępuje candidate time czasem ostatniego zbocza. Natychmiastowe próby dają early=0. Dopiero stabilny high utrzymany przez co najmniej 2000 taktów daje accepted=1." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — ISR publish, main observe, wait, validate", + "content_tex": "ISR czyta pending, poziom i mtime, zapisuje rekord, wykonuje W1C i na końcu zwiększa count. Main atomowo pobiera publikację, aktualizuje kandydata, mierzy wiek oraz porównuje bieżący IN. Nowe zbocze wraca do początku okna." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — HIGH?, LOW?, HIGH?, STABLE_HIGH", + "content_tex": "Pierwsze high jest kandydatem, low unieważnia go, a drugie high tworzy nowego kandydata. Żaden stan z wiekiem mniejszym niż quiet nie jest zaakceptowany. STABLE\\_HIGH powstaje dopiero po pełnym oknie bez kolejnego IRQ." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — dwa bounce gapy krótsze od 0x7d0", + "content_tex": "Bieżący RTL raportuje czasy low 0x591, 0x8ea, 0xc43, czyli oba gapy 0x359. Akceptacja następuje po 0x878 od ostatniego edge. Konkretne czasy zależą od buildu; oracle niezależnie sprawdza tylko relacje gap=quiet." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — timestamp in ISR, policy in consumer", + "content_tex": "ISR powinien szybko potwierdzić sprzęt i opublikować minimalne dane. Konsument może wtedy zmieniać quiet window, politykę akceptacji lub raportowanie bez wydłużania czasu blokowania innych przerwań." + } + ], + "flow": [ + { + "kind": "block", + "id": "task03.a1", + "title": "A1 CONTEXT · AKTYWNE — IRQ rejestruje zmianę, nie intencję użytkownika", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task03_gpio_quiet_window.c}.\\par Trzy przejścia TEST\\_IN modelują bounce, nie trzy świadome naciśnięcia. Kontroler potrafi zgłosić rising i falling edge, lecz nie zna quiet window ani znaczenia stabilnego przycisku. Ta semantyka należy do kodu normalnego." + }, + { + "kind": "block", + "id": "task03.a2", + "title": "A2 STRUCTURE · AKTYWNE — historia ISR i kandydat main", + "content_tex": "ISR zapisuje trzy pary \\texttt{level,time}, a osobno publikuje ostatni poziom, ostatni czas i count. Main utrzymuje seen count, candidate level oraz candidate time. Krytyczna sekcja chroni snapshot 64-bitowego czasu na RV32." + }, + { + "kind": "block", + "id": "task03.a3", + "title": "A3 DISPATCH · AKTYWNE — każde włączone zbocze wybiera GPIO18", + "content_tex": "RISE\\_EN i FALL\\_EN pozwalają trzem przejściom utworzyć pending. External dispatcher trzy razy wybiera wpis 18 i wywołuje ten sam krótki handler. Numer ostatniego handlera oraz count=3 są dowodem decyzji, nie sam fakt zapisu TEST\\_IN." + }, + { + "kind": "block", + "id": "task03.a4", + "title": "A4 APPLICATION · AKTYWNE — restart okna po każdym bounce", + "content_tex": "Po każdym nowym count main zastępuje candidate time czasem ostatniego zbocza. Natychmiastowe próby dają early=0. Dopiero stabilny high utrzymany przez co najmniej 2000 taktów daje accepted=1." + }, + { + "kind": "block", + "id": "task03.a5", + "title": "A5 FLOW · AKTYWNE — ISR publish, main observe, wait, validate", + "content_tex": "ISR czyta pending, poziom i mtime, zapisuje rekord, wykonuje W1C i na końcu zwiększa count. Main atomowo pobiera publikację, aktualizuje kandydata, mierzy wiek oraz porównuje bieżący IN. Nowe zbocze wraca do początku okna." + }, + { + "kind": "block", + "id": "task03.a6", + "title": "A6 STATE · AKTYWNE — HIGH?, LOW?, HIGH?, STABLE_HIGH", + "content_tex": "Pierwsze high jest kandydatem, low unieważnia go, a drugie high tworzy nowego kandydata. Żaden stan z wiekiem mniejszym niż quiet nie jest zaakceptowany. STABLE\\_HIGH powstaje dopiero po pełnym oknie bez kolejnego IRQ." + }, + { + "kind": "block", + "id": "task03.a7", + "title": "A7 RUNTIME · AKTYWNE — dwa bounce gapy krótsze od 0x7d0", + "content_tex": "Bieżący RTL raportuje czasy low 0x591, 0x8ea, 0xc43, czyli oba gapy 0x359. Akceptacja następuje po 0x878 od ostatniego edge. Konkretne czasy zależą od buildu; oracle niezależnie sprawdza tylko relacje gap=quiet." + }, + { + "kind": "block", + "id": "task03.a8", + "title": "A8 PATTERNS · AKTYWNE — timestamp in ISR, policy in consumer", + "content_tex": "ISR powinien szybko potwierdzić sprzęt i opublikować minimalne dane. Konsument może wtedy zmieniać quiet window, politykę akceptacji lub raportowanie bez wydłużania czasu blokowania innych przerwań." + }, + { + "kind": "exercise", + "id": "task03.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Dla sekwencji poziomów 1,0,1 oblicz oba odstępy i porównaj z quiet=2000. Wyjaśnij, dlaczego ISR publikuje czas, lecz nie akceptuje przycisku, oraz jak nowe zbocze restartuje okno ciszy.", + "evidence_tex": "Przewidywana sekwencja kandydatów, log RTL z trzema czasami i poziomami, niezależne przeliczenie gapów oraz accepted\\_after i wniosek przypisujący politykę debounce do main.", + "criterion": "Poziomy 1,0,1, count=3 i IRQ18. Oba gapy są dodatnie i mniejsze od quiet=2000; early=0, accepted=1, zaakceptowany poziom high, accepted_after >= quiet i pass=1." + }, + { + "kind": "block", + "id": "task03.worksheet", + "title": "TASK03 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Log RTL: trzy poziomy, czasy i gapy}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Dowód quiet window i miejsca decyzji w main}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C13.WE01" + ], + "learning_effect_refs": [ + "C13.EN01", + "C13.EK01" + ], + "assessment_criterion_ref": "C13.KW01" + }, + "task04": { + "title": "Timer + UART16 + GPIO18 bez RTOS", + "uuid": "ebb18b6a-cf31-5595-9901-ac2ac870296f", + "prompt_tex": "Dla timer tick, bajtu U i rising edge narysuj trzy osobne ścieżki source--pending--enable--dispatcher--ISR--flag--main effect. Wyjaśnij, dlaczego trzy flagi nie są kolejką i jakie ograniczenie przechodzi do serii FreeRTOS.", + "criterion": "Po jednym timer IRQ z mcause=0x80000007, UART IRQ16 z bajtem 0x55 i GPIO IRQ18 z high. Main konsumuje każdą flagę raz, ustawia trzy bity, OUT=0x7, IN=0x17, pass=1.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — trzy usługi, wspólny czas CPU", + "content_tex": "Machine timer pochodzi z mtime>=mtimecmp, UART16 z niepustego RX FIFO przy włączonym RX IRQ, a GPIO18 z rising edge zatrzaśniętego w PENDING. TEST\\_RX i TEST\\_IN tworzą tylko bodźce; logika timer/UART/GPIO po nich jest rzeczywistym modelem RTL." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — trzy publikacje i trzy bity efektu", + "content_tex": "Każda usługa ma licznik ISR, payload i flagę. Main ma osobny licznik konsumpcji. Bity OUT 0,1,2 reprezentują odpowiednio efekt GPIO, UART i timera, więc końcowe 0x7 dowodzi wykonania trzech gałęzi bez ukrywania ich w jednej sumie." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — slot 7 oraz external 16/18", + "content_tex": "Machine timer cause 7 trafia bezpośrednio do \\texttt{isr\\_machine\\_timer} i wraca przez \\texttt{mret}. Machine external vector trafia do wspólnego dispatchera; \\texttt{meinext} wybiera wpis 16 dla UART albo 18 dla GPIO i wykonuje \\texttt{jalr}." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — efekt dopiero po konsumpcji flagi", + "content_tex": "UART handler publikuje U, GPIO handler high, a timer handler tick. Żaden ISR nie ustawia aplikacyjnego bitu OUT. Superloop atomowo zabiera flagę i dopiero jego trzy gałęzie ustawiają 0x2, 0x1 i 0x4." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — source → pending → dispatch → ISR → main", + "content_tex": "Timer: comparator→MTIP→slot7→tick flag→bit2. UART: RX FIFO→IRQ16→external dispatcher→read DATA i flag→bit1. GPIO: edge→PENDING→IRQ18→dispatcher→W1C i flag→bit0. Main używa WFI tylko wtedy, gdy nadal brakuje któregoś efektu." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — trzy niezależne PRODUCED/CONSUMED", + "content_tex": "Każda usługa przechodzi IDLE→PRODUCED w ISR i PRODUCED→CONSUMED w main. Stan końcowy wymaga trzech liczników konsumpcji równych 1. Flaga wraca do 0, ale licznik zachowuje dowód przejścia." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — cause 7, linie 16/18 i OUT 0x7", + "content_tex": "Raport daje timer count 1 i mcause 0x80000007, UART count 1/irq 0x10/byte 0x55, GPIO count 1/irq 0x12/high oraz trzy main actions po 1. OUT=0x7, a IN=0x17 dodaje widoczny wysoki pin wejściowy 0x10." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — ISR-to-main flags with an explicit ceiling", + "content_tex": "Jednokomórkowa flaga jest poprawna tylko wtedy, gdy wystarcza informacja co najmniej jedno zdarzenie. Nie zachowuje liczby ani kolejności wielu produkcji. Ten sufit jest powodem przejścia do kolejek i tasków FreeRTOS, a nie pretekstem do nazywania flagi kolejką." + } + ], + "flow": [ + { + "kind": "block", + "id": "task04.a1", + "title": "A1 CONTEXT · AKTYWNE — trzy usługi, wspólny czas CPU", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task04_raw_c_superloop.c}.\\par Machine timer pochodzi z mtime>=mtimecmp, UART16 z niepustego RX FIFO przy włączonym RX IRQ, a GPIO18 z rising edge zatrzaśniętego w PENDING. TEST\\_RX i TEST\\_IN tworzą tylko bodźce; logika timer/UART/GPIO po nich jest rzeczywistym modelem RTL." + }, + { + "kind": "block", + "id": "task04.a2", + "title": "A2 STRUCTURE · AKTYWNE — trzy publikacje i trzy bity efektu", + "content_tex": "Każda usługa ma licznik ISR, payload i flagę. Main ma osobny licznik konsumpcji. Bity OUT 0,1,2 reprezentują odpowiednio efekt GPIO, UART i timera, więc końcowe 0x7 dowodzi wykonania trzech gałęzi bez ukrywania ich w jednej sumie." + }, + { + "kind": "block", + "id": "task04.a3", + "title": "A3 DISPATCH · AKTYWNE — slot 7 oraz external 16/18", + "content_tex": "Machine timer cause 7 trafia bezpośrednio do \\texttt{isr\\_machine\\_timer} i wraca przez \\texttt{mret}. Machine external vector trafia do wspólnego dispatchera; \\texttt{meinext} wybiera wpis 16 dla UART albo 18 dla GPIO i wykonuje \\texttt{jalr}." + }, + { + "kind": "block", + "id": "task04.a4", + "title": "A4 APPLICATION · AKTYWNE — efekt dopiero po konsumpcji flagi", + "content_tex": "UART handler publikuje U, GPIO handler high, a timer handler tick. Żaden ISR nie ustawia aplikacyjnego bitu OUT. Superloop atomowo zabiera flagę i dopiero jego trzy gałęzie ustawiają 0x2, 0x1 i 0x4." + }, + { + "kind": "block", + "id": "task04.a5", + "title": "A5 FLOW · AKTYWNE — source → pending → dispatch → ISR → main", + "content_tex": "Timer: comparator→MTIP→slot7→tick flag→bit2. UART: RX FIFO→IRQ16→external dispatcher→read DATA i flag→bit1. GPIO: edge→PENDING→IRQ18→dispatcher→W1C i flag→bit0. Main używa WFI tylko wtedy, gdy nadal brakuje któregoś efektu." + }, + { + "kind": "block", + "id": "task04.a6", + "title": "A6 STATE · AKTYWNE — trzy niezależne PRODUCED/CONSUMED", + "content_tex": "Każda usługa przechodzi IDLE→PRODUCED w ISR i PRODUCED→CONSUMED w main. Stan końcowy wymaga trzech liczników konsumpcji równych 1. Flaga wraca do 0, ale licznik zachowuje dowód przejścia." + }, + { + "kind": "block", + "id": "task04.a7", + "title": "A7 RUNTIME · AKTYWNE — cause 7, linie 16/18 i OUT 0x7", + "content_tex": "Raport daje timer count 1 i mcause 0x80000007, UART count 1/irq 0x10/byte 0x55, GPIO count 1/irq 0x12/high oraz trzy main actions po 1. OUT=0x7, a IN=0x17 dodaje widoczny wysoki pin wejściowy 0x10." + }, + { + "kind": "block", + "id": "task04.a8", + "title": "A8 PATTERNS · AKTYWNE — ISR-to-main flags with an explicit ceiling", + "content_tex": "Jednokomórkowa flaga jest poprawna tylko wtedy, gdy wystarcza informacja co najmniej jedno zdarzenie. Nie zachowuje liczby ani kolejności wielu produkcji. Ten sufit jest powodem przejścia do kolejek i tasków FreeRTOS, a nie pretekstem do nazywania flagi kolejką." + }, + { + "kind": "exercise", + "id": "task04.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Dla timer tick, bajtu U i rising edge narysuj trzy osobne ścieżki source--pending--enable--dispatcher--ISR--flag--main effect. Wyjaśnij, dlaczego trzy flagi nie są kolejką i jakie ograniczenie przechodzi do serii FreeRTOS.", + "evidence_tex": "Trzy przewidywane ścieżki zdarzeń, log RTL z numerami przerwań i licznikami, listing machine-timer oraz external dispatchera, końcowe OUT/IN i wniosek o granicy flag jednozdarzeniowych.", + "criterion": "Po jednym timer IRQ z mcause=0x80000007, UART IRQ16 z bajtem 0x55 i GPIO IRQ18 z high. Main konsumuje każdą flagę raz, ustawia trzy bity, OUT=0x7, IN=0x17, pass=1." + }, + { + "kind": "block", + "id": "task04.worksheet", + "title": "TASK04 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Log RTL: timer, UART16, GPIO18 i efekty main}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Dowód dwóch dispatcherów i końcowego OUT/IN}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C13.WE01" + ], + "learning_effect_refs": [ + "C13.EN01", + "C13.EK01" + ], + "assessment_criterion_ref": "C13.KW01" + } + }, + "tasks_order": [ + "task01", + "task02", + "task03", + "task04" + ] +} diff --git a/json/card_spec.json b/json/card_spec.json new file mode 100644 index 0000000..271a0d8 --- /dev/null +++ b/json/card_spec.json @@ -0,0 +1,302 @@ +{ + "card": { + "number": "13", + "slug": "gpio-edges-debounce", + "title": "GPIO, zbocza i quiet-window debounce", + "topic": "RV32I/Hazard3: polling GPIO, external IRQ18, debounce i końcowy superloop raw C", + "status": "Gotowa", + "version": "v00.01", + "revision_date": "2026-07-20T00:00:00+02:00", + "level": "Rok 1 · C13 · RV32I/Hazard3" + }, + "front": { + "goal": "Uczeń rozdziela fizyczny lub modelowany poziom wejścia, detekcję zbocza, zatrzaśnięty pending, maskowanie kontrolera, wybór handlera i efekt wykonywany później przez main. Potrafi zrealizować quiet-window debounce oraz połączyć timer, UART i GPIO w końcowym superloop bez RTOS.", + "scope": "Cztery przykłady wykonują się na centralnym modelu RTL Hazard3. TEST\u005c_IN i UART TEST\u005c_RX są jawnie wyłącznie bodźcami testbencha. Karta nie udaje modelu RP2350 ani fizycznego pinu. Task01 dowodzi DIR/OUT/IN przez polling, Task02 pełnej ścieżki rising-edge IRQ18 z W1C, Task03 krótkiego ISR i decyzji debounce w main, a Task04 współpracy machine timer, UART IRQ16 i GPIO IRQ18.", + "scope_note": "Każdy przykład ma dokładnie A1–A8. Widok N/D występuje tylko wtedy, gdy dany mechanizm naprawdę nie istnieje." + }, + "scope_headers": ["Typ", "Task", "Idea", "Waga"], + "learning": { + "reasoning_label": "Od poziomu wejścia do efektu aplikacji", + "reasoning": "Uczeń dla każdego zdarzenia wskazuje osobno source, pending, enable, decyzję dispatchera, minimalny efekt ISR i późniejszy efekt normalnego kodu.", + "practice_label": "Dowód na GPIO/UART/timer RTL", + "practice": "Uczeń uruchamia obrazy RV32I z limitem cykli, odczytuje rejestry MMIO i kontrolera przerwań, przelicza czasy bounce i sprawdza, że main, a nie ISR, wykonuje politykę debounce oraz aktualizuje wyjścia.", + "criterion": "Cztery programy kończą się kodem 0 bez timeoutu i nieobsłużonej pułapki. Task01 daje DIR=1 oraz sekwencję IN 2,3,0. Task02 ma jeden IRQ18, PENDING=0x4 w handlerze, source i controller pending 1 przed obsługą oraz 0 po W1C. Task03 zapisuje poziomy 1,0,1, oba odstępy dodatnie i krótsze od quiet=2000, zero wczesnych akceptacji i jedną akceptację po co najmniej quiet. Task04 ma po jednym timer IRQ, UART16 i GPIO18, trzy efekty main, OUT=0x7 oraz IN=0x17.", + "requirement": "Obsługa GPIO i zdarzeń w raw C z jawną granicą bodźca testbench, krótkim ISR, W1C, synchronizacją z main i bez przypisywania modelowi właściwości RP2350." + }, + "sections": [ + { + "title": "1 — Rejestr modelu nie jest fizycznym pinem", + "content_tex": "GPIO modelu zaczyna się pod adresem \u005ctexttt{0xc0000300}. \u005ctexttt{DIR} wybiera kierunek, \u005ctexttt{OUT/OUT\u005c_SET/OUT\u005c_CLR} sterują zatrzaśnięciem wyjściowym, a \u005ctexttt{IN} pokazuje wyjścia dla pinów ustawionych jako output i bodziec zewnętrzny dla pinów input. \u005ctexttt{RISE\u005c_EN} i \u005ctexttt{FALL\u005c_EN} wybierają wykrywane zbocza, a \u005ctexttt{PENDING} zatrzaskuje je do zapisu W1C.\n\n\u005ctexttt{TEST\u005c_IN} istnieje tylko po stronie laboratorium. Pozwala programowi testowemu wywołać zmianę otoczenia bez fizycznego przewodu. Produkcyjny sterownik czyta \u005ctexttt{IN}; nie powinien zawierać zapisu do takiego fixture'u." + }, + { + "title": "2 — Source, pending i enable to trzy różne fakty", + "content_tex": "Zmiana 0 na 1 jest source dla detektora rising edge. Włączony bit \u005ctexttt{RISE\u005c_EN} pozwala zatrzasnąć bit w \u005ctexttt{PENDING}; ten bit utrzymuje poziomową linię GPIO external IRQ18. Kontroler Hazard3 osobno ma per-line enable, priorytet oraz globalne bramki \u005ctexttt{mie.MEIE} i \u005ctexttt{mstatus.MIE}. Dispatcher odczytuje aktywny numer i wywołuje handler z tablicy.\n\nW1C usuwa źródło poziomowego żądania po stronie peryferium. Sam powrót z handlera, odczyt \u005ctexttt{PENDING} ani zamknięcie maski nie potwierdzają zdarzenia." + }, + { + "title": "3 — Debounce jest decyzją czasu w main", + "content_tex": "ISR Task03 robi tylko trzy rzeczy: zapisuje czas i poziom, potwierdza pending przez W1C oraz na końcu publikuje licznik. Main obserwuje kandydata i akceptuje go dopiero wtedy, gdy od ostatniego zbocza minęło quiet window oraz bieżący poziom nadal odpowiada kandydatowi. Każde nowe zbocze przesuwa początek okna.\n\nSekwencja \u005ctexttt{1--0--1} jest kontrolowanym bounce. Oba odstępy są krótsze od 2000 taktów, dlatego żaden z trzech bezpośrednich odczytów nie może zaakceptować stanu. To polityka aplikacji, nie funkcja kontrolera przerwań." + }, + { + "title": "4 — Superloop jest granicą serii raw C", + "content_tex": "Task04 łączy machine timer, UART0 RX external IRQ16 i GPIO external IRQ18. ISR-y publikują flagi, a main konsumuje je i ustawia trzy różne bity wyjściowe. Flaga może skleić wiele produkcji, więc nie jest kolejką; zachowanie liczby i kolejności zdarzeń należy do następnej serii FreeRTOS." + } + ], + "tasks": [ + { + "id": "task01", + "source": "src/tasks/task01_gpio_polling.c", + "chapter": "POLL", + "title": "Polling DIR, OUT i IN", + "idea_tex": "kierunek, latch wyjścia i testbench-only bodziec wejścia", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Przewidź cztery wartości: IN po ustawieniu zewnętrznego pinu 1, OUT po ustawieniu pinu 0, IN przy obu wysokich i IN po wyzerowaniu. Wyjaśnij, dlaczego zapis TEST\u005c_IN jest dozwolony tylko w fixture testbencha.", + "evidence_tex": "Tabela DIR/OUT/IN przed uruchomieniem, log wykonania RTL Hazard3 z kodem wyjścia, odczyt rejestrów MMIO i wniosek oddzielający fixture TEST\u005c_IN od produkcyjnego API GPIO.", + "worksheet_step2": "Log RTL: DIR, OUT i kolejne wartości IN", + "worksheet_step3": "Granica modelu: TEST\u005c_IN kontra fizyczny pin", + "criterion": "Oracle: dir=1, external_high=2, out_after_set=1, both_high=3, final_in=0, pass=1 i kod wyjścia 0. PENDING pozostaje 0, ponieważ detektory zboczy są wyłączone.", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — dwa źródła widocznego IN", + "content_tex": "Dla bitu z \u005ctexttt{DIR=1} widoczne \u005ctexttt{IN} pochodzi z latcha \u005ctexttt{OUT}; dla \u005ctexttt{DIR=0} pochodzi z modelowanego wejścia. \u005ctexttt{TEST\u005c_IN} zmienia tylko tę drugą część i jest bodźcem laboratorium, nie pinem RP2350." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — pin0 output, pin1 input", + "content_tex": "Maska 0x1 wybiera pin wyjściowy, a 0x2 wejściowy. Rejestry SET i CLR modyfikują latch bez read--modify--write. Jeden odczyt \u005ctexttt{IN} składa oba widoki, dlatego przy obu stanach wysokich wynosi 0x3." + }, + { + "id": "A3", + "status": "unavailable", + "title": "DISPATCH", + "reason": "Task01 wyłącza detektory zboczy i przerwania; każdy krok jest bezpośrednim pollingiem MMIO, bez ISR, callbacku ani wyboru handlera." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — kontrolowany round trip poziomów", + "content_tex": "Po external high program widzi 0x2. SET pinu0 daje OUT=0x1 i IN=0x3. CLR pinu0 oraz TEST\u005c_IN=0 kończą sekwencję IN=0. Te liczby są bitowymi relacjami modelu, nie numerami pinów konkretnej płytki." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — configure, stimulate, sample, clear", + "content_tex": "Program wyłącza edge enable, czyści pending, ustawia kierunek i stan początkowy. Następnie podaje bodziec wejściowy, próbkuje, ustawia output, próbkuje ponownie i zeruje oba źródła. Każdy pomiar następuje po odpowiadającym mu zapisie MMIO." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — 0x2 → 0x3 → 0x0", + "content_tex": "Widoczny stan portu przechodzi kolejno przez tylko input high, oba bity high i oba low. Kierunek pozostaje 0x1 przez cały eksperyment, a pending pozostaje pusty." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — rzeczywiste transakcje pod 0xc0000300", + "content_tex": "Log RTL raportuje 1,2,1,3,0 i pass=1. Listing powinien pokazać osobne zapisy do offsetów DIR, TEST\u005c_IN, OUT\u005c_SET i OUT\u005c_CLR oraz odczyty IN; nie ma wejścia do wspólnego dispatchera external IRQ." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — polling z jawną granicą fixture", + "content_tex": "Wzorzec produkcyjny konfiguruje kierunek i czyta wejście lub steruje wyjściem. Warstwa testowa może dostarczyć osobny mechanizm wstrzyknięcia, ale jego nazwa, dokumentacja i lokalizacja muszą uniemożliwiać pomylenie z rejestrem sprzętu." + } + ] + }, + { + "id": "task02", + "source": "src/tasks/task02_gpio_rising_irq.c", + "chapter": "IRQ18", + "title": "Rising edge, IRQ18 i W1C", + "idea_tex": "zbocze, pending peryferium, kontroler i resume", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Rozpisz ścieżkę od zmiany TEST\u005c_IN 0→1 do wznowienia main. Zaznacz GPIO PENDING, pending linii 18 w kontrolerze, dwa poziomy enable, decyzję dispatchera, zapis W1C i efekt ponownego podania tego samego poziomu.", + "evidence_tex": "Przewidywany łańcuch source--pending--enable--dispatch--effect, log RTL z IRQ18 i stanami przed/po, listing wspólnego dispatchera oraz wniosek wyjaśniający W1C i brak drugiego zbocza dla high→high.", + "worksheet_step2": "Log RTL: pending GPIO i kontrolera przed/po ISR", + "worksheet_step3": "Dowód dispatchu IRQ18 i zapisu W1C", + "criterion": "Jeden handler IRQ18 widzi PENDING=0x4 i poziom high. GPIO source oraz controller pending są 1 przed globalnym enable i 0 po W1C; high→high nie tworzy nowego pending, resume=1, pass=1.", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — zbocze tworzy zatrzaśnięty fakt", + "content_tex": "Bodziec TEST\u005c_IN zmienia pin2 z 0 na 1. Włączony bit RISE\u005c_EN tworzy bit 0x4 w GPIO PENDING, a ten utrzymuje external IRQ18. TEST\u005c_IN jest sztuczny, lecz dalsza ścieżka przez kontroler i rdzeń jest rzeczywistą ścieżką modelu RTL." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — dwa pending i tablica handlerów", + "content_tex": "Pierwszy pending leży w peryferium jako maska pinów. Drugi jest widokiem aktywnej linii 18 w kontrolerze Hazard3. Tablica \u005ctexttt{\u005c_external\u005c_irq\u005c_table[18]} przechowuje adres zwykłej funkcji handlera." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — external vector wybiera linię 18", + "content_tex": "\u005ctexttt{mtvec} wybiera wspólny vector machine external interrupt. \u005ctexttt{irq\u005c_dispatch.S} odczytuje aktywną linię z \u005ctexttt{meinext}, indeksuje tablicę i wykonuje pośredni \u005ctexttt{jalr} do handlera GPIO. Handler potwierdza, że bieżący numer to 18." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — jedno zbocze, jedno wznowienie", + "content_tex": "Program celowo generuje edge przy zamkniętym globalnym MIE. Dzięki temu może najpierw zmierzyć oba pending jako 1. Po otwarciu MIE oczekuje dokładnie jednego handlera, W1C, obu pending równych 0 i wykonania kodu resume." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — source → pending → enable → dispatch → W1C", + "content_tex": "0→1 ustawia GPIO PENDING. Włączona linia18, MEIE i później MIE dopuszczają trap. Dispatcher wybiera handler18; ISR próbkuje maskę i poziom, zapisuje tę maskę do PENDING jako W1C, a dopiero potem publikuje count. Main wraca i mierzy stan 0." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — IDLE, LATCHED, HANDLING, ACKED, RESUMED", + "content_tex": "IDLE ma input low i pending 0. Rising edge tworzy LATCHED. Otwarcie MIE prowadzi do HANDLING. Zapis W1C tworzy ACKED, a powrót dispatchera RESUMED. Ponowne high pozostaje ACKED, ponieważ nie zaszła zmiana 0→1." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — 0x4 w GPIO i 18 w kontrolerze", + "content_tex": "Raport daje count=1, irq=0x12, source/controller przed 1, pending w ISR 0x4, oba pending po 0 i same-level 0. Listing ma zawierać handler GPIO oraz wspólny dispatcher zakończony \u005ctexttt{mret}." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — acknowledge peripheral before publish", + "content_tex": "Dla poziomowego IRQ najpierw ustal i usuń przyczynę po stronie peryferium, a dopiero potem publikuj zakończenie dla main. Zamknięcie maski może odłożyć obsługę, ale nie jest potwierdzeniem zdarzenia." + } + ] + }, + { + "id": "task03", + "source": "src/tasks/task03_gpio_quiet_window.c", + "chapter": "DBNC", + "title": "Quiet-window debounce po trzech zboczach", + "idea_tex": "krótki ISR, mtime i decyzja stabilności w main", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Dla sekwencji poziomów 1,0,1 oblicz oba odstępy i porównaj z quiet=2000. Wyjaśnij, dlaczego ISR publikuje czas, lecz nie akceptuje przycisku, oraz jak nowe zbocze restartuje okno ciszy.", + "evidence_tex": "Przewidywana sekwencja kandydatów, log RTL z trzema czasami i poziomami, niezależne przeliczenie gapów oraz accepted\u005c_after i wniosek przypisujący politykę debounce do main.", + "worksheet_step2": "Log RTL: trzy poziomy, czasy i gapy", + "worksheet_step3": "Dowód quiet window i miejsca decyzji w main", + "criterion": "Poziomy 1,0,1, count=3 i IRQ18. Oba gapy są dodatnie i mniejsze od quiet=2000; early=0, accepted=1, zaakceptowany poziom high, accepted_after >= quiet i pass=1.", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — IRQ rejestruje zmianę, nie intencję użytkownika", + "content_tex": "Trzy przejścia TEST\u005c_IN modelują bounce, nie trzy świadome naciśnięcia. Kontroler potrafi zgłosić rising i falling edge, lecz nie zna quiet window ani znaczenia stabilnego przycisku. Ta semantyka należy do kodu normalnego." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — historia ISR i kandydat main", + "content_tex": "ISR zapisuje trzy pary \u005ctexttt{level,time}, a osobno publikuje ostatni poziom, ostatni czas i count. Main utrzymuje seen count, candidate level oraz candidate time. Krytyczna sekcja chroni snapshot 64-bitowego czasu na RV32." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — każde włączone zbocze wybiera GPIO18", + "content_tex": "RISE\u005c_EN i FALL\u005c_EN pozwalają trzem przejściom utworzyć pending. External dispatcher trzy razy wybiera wpis 18 i wywołuje ten sam krótki handler. Numer ostatniego handlera oraz count=3 są dowodem decyzji, nie sam fakt zapisu TEST\u005c_IN." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — restart okna po każdym bounce", + "content_tex": "Po każdym nowym count main zastępuje candidate time czasem ostatniego zbocza. Natychmiastowe próby dają early=0. Dopiero stabilny high utrzymany przez co najmniej 2000 taktów daje accepted=1." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — ISR publish, main observe, wait, validate", + "content_tex": "ISR czyta pending, poziom i mtime, zapisuje rekord, wykonuje W1C i na końcu zwiększa count. Main atomowo pobiera publikację, aktualizuje kandydata, mierzy wiek oraz porównuje bieżący IN. Nowe zbocze wraca do początku okna." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — HIGH?, LOW?, HIGH?, STABLE_HIGH", + "content_tex": "Pierwsze high jest kandydatem, low unieważnia go, a drugie high tworzy nowego kandydata. Żaden stan z wiekiem mniejszym niż quiet nie jest zaakceptowany. STABLE\u005c_HIGH powstaje dopiero po pełnym oknie bez kolejnego IRQ." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — dwa bounce gapy krótsze od 0x7d0", + "content_tex": "Bieżący RTL raportuje czasy low 0x591, 0x8ea, 0xc43, czyli oba gapy 0x359. Akceptacja następuje po 0x878 od ostatniego edge. Konkretne czasy zależą od buildu; oracle niezależnie sprawdza tylko relacje gap=quiet." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — timestamp in ISR, policy in consumer", + "content_tex": "ISR powinien szybko potwierdzić sprzęt i opublikować minimalne dane. Konsument może wtedy zmieniać quiet window, politykę akceptacji lub raportowanie bez wydłużania czasu blokowania innych przerwań." + } + ] + }, + { + "id": "task04", + "source": "src/tasks/task04_raw_c_superloop.c", + "chapter": "LOOP", + "title": "Timer + UART16 + GPIO18 bez RTOS", + "idea_tex": "trzy źródła, dwa dispatchery, flagi i efekty main", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Dla timer tick, bajtu U i rising edge narysuj trzy osobne ścieżki source--pending--enable--dispatcher--ISR--flag--main effect. Wyjaśnij, dlaczego trzy flagi nie są kolejką i jakie ograniczenie przechodzi do serii FreeRTOS.", + "evidence_tex": "Trzy przewidywane ścieżki zdarzeń, log RTL z numerami przerwań i licznikami, listing machine-timer oraz external dispatchera, końcowe OUT/IN i wniosek o granicy flag jednozdarzeniowych.", + "worksheet_step2": "Log RTL: timer, UART16, GPIO18 i efekty main", + "worksheet_step3": "Dowód dwóch dispatcherów i końcowego OUT/IN", + "criterion": "Po jednym timer IRQ z mcause=0x80000007, UART IRQ16 z bajtem 0x55 i GPIO IRQ18 z high. Main konsumuje każdą flagę raz, ustawia trzy bity, OUT=0x7, IN=0x17, pass=1.", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — trzy usługi, wspólny czas CPU", + "content_tex": "Machine timer pochodzi z mtime>=mtimecmp, UART16 z niepustego RX FIFO przy włączonym RX IRQ, a GPIO18 z rising edge zatrzaśniętego w PENDING. TEST\u005c_RX i TEST\u005c_IN tworzą tylko bodźce; logika timer/UART/GPIO po nich jest rzeczywistym modelem RTL." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — trzy publikacje i trzy bity efektu", + "content_tex": "Każda usługa ma licznik ISR, payload i flagę. Main ma osobny licznik konsumpcji. Bity OUT 0,1,2 reprezentują odpowiednio efekt GPIO, UART i timera, więc końcowe 0x7 dowodzi wykonania trzech gałęzi bez ukrywania ich w jednej sumie." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — slot 7 oraz external 16/18", + "content_tex": "Machine timer cause 7 trafia bezpośrednio do \u005ctexttt{isr\u005c_machine\u005c_timer} i wraca przez \u005ctexttt{mret}. Machine external vector trafia do wspólnego dispatchera; \u005ctexttt{meinext} wybiera wpis 16 dla UART albo 18 dla GPIO i wykonuje \u005ctexttt{jalr}." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — efekt dopiero po konsumpcji flagi", + "content_tex": "UART handler publikuje U, GPIO handler high, a timer handler tick. Żaden ISR nie ustawia aplikacyjnego bitu OUT. Superloop atomowo zabiera flagę i dopiero jego trzy gałęzie ustawiają 0x2, 0x1 i 0x4." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — source → pending → dispatch → ISR → main", + "content_tex": "Timer: comparator→MTIP→slot7→tick flag→bit2. UART: RX FIFO→IRQ16→external dispatcher→read DATA i flag→bit1. GPIO: edge→PENDING→IRQ18→dispatcher→W1C i flag→bit0. Main używa WFI tylko wtedy, gdy nadal brakuje któregoś efektu." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — trzy niezależne PRODUCED/CONSUMED", + "content_tex": "Każda usługa przechodzi IDLE→PRODUCED w ISR i PRODUCED→CONSUMED w main. Stan końcowy wymaga trzech liczników konsumpcji równych 1. Flaga wraca do 0, ale licznik zachowuje dowód przejścia." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — cause 7, linie 16/18 i OUT 0x7", + "content_tex": "Raport daje timer count 1 i mcause 0x80000007, UART count 1/irq 0x10/byte 0x55, GPIO count 1/irq 0x12/high oraz trzy main actions po 1. OUT=0x7, a IN=0x17 dodaje widoczny wysoki pin wejściowy 0x10." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — ISR-to-main flags with an explicit ceiling", + "content_tex": "Jednokomórkowa flaga jest poprawna tylko wtedy, gdy wystarcza informacja co najmniej jedno zdarzenie. Nie zachowuje liczby ani kolejności wielu produkcji. Ten sufit jest powodem przejścia do kolejek i tasków FreeRTOS, a nie pretekstem do nazywania flagi kolejką." + } + ] + } + ] +} diff --git a/scripts/render_card_layouts.sh b/scripts/render_card_layouts.sh new file mode 100755 index 0000000..e8f3248 --- /dev/null +++ b/scripts/render_card_layouts.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh +set -eu + +script_dir=$(CDPATH= cd "$(dirname "$0")" && pwd) +repo_root=$(CDPATH= cd "$script_dir/.." && pwd) +layouts_root=$repo_root/../../../tools/card-layouts + +python3 "$layouts_root/tools/build_kr_c_card.py" "$repo_root" +exec python3 "$layouts_root/tools/render_card.py" "$repo_root" "$@" + diff --git a/scripts/render_new_pdf.sh b/scripts/render_new_pdf.sh new file mode 100755 index 0000000..5d1787d --- /dev/null +++ b/scripts/render_new_pdf.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env sh +set -eu + +script_dir=$(CDPATH= cd "$(dirname "$0")" && pwd) +repo_root=$(CDPATH= cd "$script_dir/.." && pwd) +layouts_root=$repo_root/../../../tools/card-layouts + +if git -C "$repo_root" rev-parse --verify HEAD >/dev/null 2>&1; then + exec "$layouts_root/tools/render_card_pdf_preserving.sh" "$repo_root" +fi +GITEA_SHA=0000000000000000000000000000000000000000 \ + exec "$layouts_root/tools/render_card_pdf_preserving.sh" "$repo_root" + diff --git a/src/tasks/c13_common.h b/src/tasks/c13_common.h new file mode 100644 index 0000000..ac64aa9 --- /dev/null +++ b/src/tasks/c13_common.h @@ -0,0 +1,74 @@ +#ifndef C13_COMMON_H +#define C13_COMMON_H + +#include +#include + +#include "hazard3_irq.h" +#include "tb_cxxrtl_io.h" +#include "tb_gpio_io.h" +#include "tb_uart_io.h" + +#define C13_UART_INDEX 0u +#define C13_UART_IRQ (TB_UART_EXTERNAL_IRQ_BASE + C13_UART_INDEX) +#define C13_GPIO_IRQ TB_GPIO_EXTERNAL_IRQ +#define C13_MACHINE_TIMER_CAUSE UINT32_C(0x80000007) + +static inline __attribute__((always_inline)) uint64_t c13_timer_read64(void) +{ + uint32_t high_before; + uint32_t low; + uint32_t high_after; + + do { + high_before = mm_timer->mtimeh; + low = mm_timer->mtime; + high_after = mm_timer->mtimeh; + } while (high_before != high_after); + + return ((uint64_t)high_after << 32) | low; +} + +static inline __attribute__((always_inline)) void c13_timer_set_compare(uint64_t value) +{ + mm_timer->mtimecmph = UINT32_MAX; + mm_timer->mtimecmp = (uint32_t)value; + mm_timer->mtimecmph = (uint32_t)(value >> 32); +} + +static inline void c13_wait_ticks(uint64_t ticks) +{ + const uint64_t deadline = c13_timer_read64() + ticks; + while (c13_timer_read64() < deadline) { + __asm__ volatile("nop"); + } +} + +static inline bool c13_wait_for(volatile uint32_t *value, uint32_t expected) +{ + for (uint32_t spin = 0; spin < 100000u; ++spin) { + if (*value == expected) { + return true; + } + __asm__ volatile("nop"); + } + return false; +} + +static inline void c13_report_u32(const char *label, uint32_t value) +{ + tb_puts(label); + tb_put_u32(value); +} + +static inline void c13_external_disable(void) +{ + global_irq_enable(false); + external_irq_enable(false); + h3irq_enable(C13_UART_IRQ, false); + h3irq_enable(C13_GPIO_IRQ, false); + tb_uart_rx_irq_enable(C13_UART_INDEX, false); +} + +#endif + diff --git a/src/tasks/task01_gpio_polling.c b/src/tasks/task01_gpio_polling.c new file mode 100644 index 0000000..bf186c0 --- /dev/null +++ b/src/tasks/task01_gpio_polling.c @@ -0,0 +1,51 @@ +#include "c13_common.h" + +#define TASK01_OUTPUT_PIN (UINT32_C(1) << 0) +#define TASK01_INPUT_PIN (UINT32_C(1) << 1) + +volatile uint32_t g_task01_dir; +volatile uint32_t g_task01_out_after_set; +volatile uint32_t g_task01_in_external_high; +volatile uint32_t g_task01_in_both_high; +volatile uint32_t g_task01_in_final; +volatile uint32_t g_task01_pass; + +int main(void) +{ + c13_external_disable(); + tb_gpio_write(TB_GPIO_RISE_EN, 0u); + tb_gpio_write(TB_GPIO_FALL_EN, 0u); + tb_gpio_write(TB_GPIO_PENDING, UINT32_MAX); + + tb_gpio_write(TB_GPIO_DIR, TASK01_OUTPUT_PIN); + tb_gpio_write(TB_GPIO_OUT_CLR, TASK01_OUTPUT_PIN); + tb_gpio_test_set_input(TASK01_INPUT_PIN); + + g_task01_dir = tb_gpio_read(TB_GPIO_DIR); + g_task01_in_external_high = tb_gpio_read(TB_GPIO_IN); + + tb_gpio_write(TB_GPIO_OUT_SET, TASK01_OUTPUT_PIN); + g_task01_out_after_set = tb_gpio_read(TB_GPIO_OUT); + g_task01_in_both_high = tb_gpio_read(TB_GPIO_IN); + + tb_gpio_write(TB_GPIO_OUT_CLR, TASK01_OUTPUT_PIN); + tb_gpio_test_set_input(0u); + g_task01_in_final = tb_gpio_read(TB_GPIO_IN); + + g_task01_pass = + g_task01_dir == TASK01_OUTPUT_PIN && + g_task01_in_external_high == TASK01_INPUT_PIN && + (g_task01_out_after_set & TASK01_OUTPUT_PIN) != 0u && + g_task01_in_both_high == (TASK01_OUTPUT_PIN | TASK01_INPUT_PIN) && + g_task01_in_final == 0u && + tb_gpio_read(TB_GPIO_PENDING) == 0u; + + c13_report_u32("T01 dir=", g_task01_dir); + c13_report_u32("T01 external_high=", g_task01_in_external_high); + c13_report_u32("T01 out_after_set=", g_task01_out_after_set); + c13_report_u32("T01 both_high=", g_task01_in_both_high); + c13_report_u32("T01 final_in=", g_task01_in_final); + c13_report_u32("T01 pass=", g_task01_pass); + return g_task01_pass ? 0 : 1; +} + diff --git a/src/tasks/task02_gpio_rising_irq.c b/src/tasks/task02_gpio_rising_irq.c new file mode 100644 index 0000000..ee4cb08 --- /dev/null +++ b/src/tasks/task02_gpio_rising_irq.c @@ -0,0 +1,92 @@ +#include "c13_common.h" + +#define TASK02_INPUT_PIN (UINT32_C(1) << 2) + +volatile uint32_t g_task02_irq_count; +volatile uint32_t g_task02_irq_number; +volatile uint32_t g_task02_pending_in_handler; +volatile uint32_t g_task02_level_in_handler; +volatile uint32_t g_task02_gpio_pending_before; +volatile uint32_t g_task02_controller_pending_before; +volatile uint32_t g_task02_gpio_pending_after; +volatile uint32_t g_task02_controller_pending_after; +volatile uint32_t g_task02_same_level_pending; +volatile uint32_t g_task02_resumed; +volatile uint32_t g_task02_pass; + +void task02_gpio_handler(void) +{ + const uint32_t pending = tb_gpio_read(TB_GPIO_PENDING); + + g_task02_irq_number = (uint32_t)h3irq_get_current_irq(); + g_task02_pending_in_handler = pending; + g_task02_level_in_handler = tb_gpio_read(TB_GPIO_IN) & TASK02_INPUT_PIN; + tb_gpio_write(TB_GPIO_PENDING, pending); /* W1C: acknowledge the source. */ + g_task02_irq_count = g_task02_irq_count + 1u; +} + +int main(void) +{ + c13_external_disable(); + tb_gpio_write(TB_GPIO_DIR, 0u); + tb_gpio_write(TB_GPIO_RISE_EN, 0u); + tb_gpio_write(TB_GPIO_FALL_EN, 0u); + tb_gpio_write(TB_GPIO_PENDING, UINT32_MAX); + tb_gpio_test_set_input(0u); + + h3irq_set_handler(C13_GPIO_IRQ, task02_gpio_handler); + h3irq_set_priority(C13_GPIO_IRQ, 2u); + h3irq_enable(C13_GPIO_IRQ, true); + external_irq_enable(true); + tb_gpio_write(TB_GPIO_RISE_EN, TASK02_INPUT_PIN); + + /* TEST_IN is laboratory stimulus; the resulting IRQ18 path is real in RTL. */ + tb_gpio_test_set_input(TASK02_INPUT_PIN); + c13_wait_ticks(32u); + g_task02_gpio_pending_before = + (tb_gpio_read(TB_GPIO_PENDING) & TASK02_INPUT_PIN) != 0u; + g_task02_controller_pending_before = h3irq_pending(C13_GPIO_IRQ) ? 1u : 0u; + + global_irq_enable(true); + const bool handled = c13_wait_for(&g_task02_irq_count, 1u); + g_task02_resumed = handled ? 1u : 0u; + global_irq_enable(false); + c13_wait_ticks(32u); + + g_task02_gpio_pending_after = + (tb_gpio_read(TB_GPIO_PENDING) & TASK02_INPUT_PIN) != 0u; + g_task02_controller_pending_after = h3irq_pending(C13_GPIO_IRQ) ? 1u : 0u; + + /* Repeating the same high level is not a second rising edge. */ + tb_gpio_test_set_input(TASK02_INPUT_PIN); + c13_wait_ticks(32u); + g_task02_same_level_pending = + (tb_gpio_read(TB_GPIO_PENDING) & TASK02_INPUT_PIN) != 0u; + + g_task02_pass = handled && + g_task02_irq_count == 1u && + g_task02_irq_number == C13_GPIO_IRQ && + g_task02_pending_in_handler == TASK02_INPUT_PIN && + g_task02_level_in_handler == TASK02_INPUT_PIN && + g_task02_gpio_pending_before == 1u && + g_task02_controller_pending_before == 1u && + g_task02_gpio_pending_after == 0u && + g_task02_controller_pending_after == 0u && + g_task02_same_level_pending == 0u && + g_task02_resumed == 1u; + + c13_external_disable(); + tb_gpio_write(TB_GPIO_RISE_EN, 0u); + c13_report_u32("T02 count=", g_task02_irq_count); + c13_report_u32("T02 irq=", g_task02_irq_number); + c13_report_u32("T02 source_before=", g_task02_gpio_pending_before); + c13_report_u32("T02 controller_before=", g_task02_controller_pending_before); + c13_report_u32("T02 pending_in_handler=", g_task02_pending_in_handler); + c13_report_u32("T02 source_after=", g_task02_gpio_pending_after); + c13_report_u32("T02 controller_after=", g_task02_controller_pending_after); + c13_report_u32("T02 same_level_pending=", g_task02_same_level_pending); + c13_report_u32("T02 resumed=", g_task02_resumed); + c13_report_u32("T02 pass=", g_task02_pass); + return g_task02_pass ? 0 : 1; +} + diff --git a/src/tasks/task03_gpio_quiet_window.c b/src/tasks/task03_gpio_quiet_window.c new file mode 100644 index 0000000..2943732 --- /dev/null +++ b/src/tasks/task03_gpio_quiet_window.c @@ -0,0 +1,152 @@ +#include "c13_common.h" + +#define TASK03_INPUT_PIN (UINT32_C(1) << 3) +#define TASK03_EDGE_COUNT 3u +#define TASK03_BOUNCE_GAP UINT64_C(160) +#define TASK03_QUIET UINT64_C(2000) + +volatile uint32_t g_task03_irq_count; +volatile uint32_t g_task03_irq_number; +volatile uint32_t g_task03_edge_level[TASK03_EDGE_COUNT]; +volatile uint64_t g_task03_edge_time[TASK03_EDGE_COUNT]; +volatile uint32_t g_task03_last_level; +volatile uint64_t g_task03_last_edge_time; +volatile uint32_t g_task03_early_accepts; +volatile uint32_t g_task03_accepted_count; +volatile uint32_t g_task03_accepted_level; +volatile uint64_t g_task03_accept_time; +volatile uint32_t g_task03_pass; + +static uint32_t g_seen_irq_count; +static uint32_t g_candidate_level; +static uint64_t g_candidate_time; + +void task03_gpio_handler(void) +{ + const uint32_t pending = tb_gpio_read(TB_GPIO_PENDING); + const uint32_t level = (tb_gpio_read(TB_GPIO_IN) & TASK03_INPUT_PIN) != 0u; + const uint64_t timestamp = c13_timer_read64(); + const uint32_t index = g_task03_irq_count; + + g_task03_irq_number = (uint32_t)h3irq_get_current_irq(); + if (index < TASK03_EDGE_COUNT) { + g_task03_edge_level[index] = level; + g_task03_edge_time[index] = timestamp; + } + g_task03_last_level = level; + g_task03_last_edge_time = timestamp; + tb_gpio_write(TB_GPIO_PENDING, pending); /* Short ISR: W1C and publish. */ + g_task03_irq_count = index + 1u; +} + +static bool debounce_try_accept(void) +{ + uint32_t irq_count; + uint32_t level; + uint64_t edge_time; + uint64_t now; + + /* Snapshot the ISR publication without pretending a volatile uint64_t is atomic. */ + global_irq_enable(false); + irq_count = g_task03_irq_count; + level = g_task03_last_level; + edge_time = g_task03_last_edge_time; + global_irq_enable(true); + + if (irq_count != g_seen_irq_count) { + g_seen_irq_count = irq_count; + g_candidate_level = level; + g_candidate_time = edge_time; + } + + now = c13_timer_read64(); + if (g_seen_irq_count != 0u && + g_task03_accepted_count == 0u && + now - g_candidate_time >= TASK03_QUIET && + (((tb_gpio_read(TB_GPIO_IN) & TASK03_INPUT_PIN) != 0u) == + (g_candidate_level != 0u))) { + g_task03_accepted_level = g_candidate_level; + g_task03_accept_time = now; + g_task03_accepted_count = 1u; + return true; + } + return false; +} + +int main(void) +{ + bool edge1; + bool edge2; + bool edge3; + + c13_external_disable(); + tb_gpio_write(TB_GPIO_DIR, 0u); + tb_gpio_write(TB_GPIO_RISE_EN, 0u); + tb_gpio_write(TB_GPIO_FALL_EN, 0u); + tb_gpio_write(TB_GPIO_PENDING, UINT32_MAX); + tb_gpio_test_set_input(0u); + + h3irq_set_handler(C13_GPIO_IRQ, task03_gpio_handler); + h3irq_set_priority(C13_GPIO_IRQ, 2u); + h3irq_enable(C13_GPIO_IRQ, true); + external_irq_enable(true); + tb_gpio_write(TB_GPIO_RISE_EN, TASK03_INPUT_PIN); + tb_gpio_write(TB_GPIO_FALL_EN, TASK03_INPUT_PIN); + global_irq_enable(true); + + tb_gpio_test_set_input(TASK03_INPUT_PIN); /* press */ + edge1 = c13_wait_for(&g_task03_irq_count, 1u); + g_task03_early_accepts += debounce_try_accept() ? 1u : 0u; + c13_wait_ticks(TASK03_BOUNCE_GAP); + + tb_gpio_test_set_input(0u); /* bounce low */ + edge2 = c13_wait_for(&g_task03_irq_count, 2u); + g_task03_early_accepts += debounce_try_accept() ? 1u : 0u; + c13_wait_ticks(TASK03_BOUNCE_GAP); + + tb_gpio_test_set_input(TASK03_INPUT_PIN); /* stable high */ + edge3 = c13_wait_for(&g_task03_irq_count, 3u); + g_task03_early_accepts += debounce_try_accept() ? 1u : 0u; + + while (c13_timer_read64() - g_task03_last_edge_time < TASK03_QUIET) { + __asm__ volatile("nop"); + } + (void)debounce_try_accept(); + global_irq_enable(false); + + g_task03_pass = edge1 && edge2 && edge3 && + g_task03_irq_count == TASK03_EDGE_COUNT && + g_task03_irq_number == C13_GPIO_IRQ && + g_task03_edge_level[0] == 1u && + g_task03_edge_level[1] == 0u && + g_task03_edge_level[2] == 1u && + g_task03_edge_time[0] < g_task03_edge_time[1] && + g_task03_edge_time[1] < g_task03_edge_time[2] && + g_task03_edge_time[1] - g_task03_edge_time[0] < TASK03_QUIET && + g_task03_edge_time[2] - g_task03_edge_time[1] < TASK03_QUIET && + g_task03_early_accepts == 0u && + g_task03_accepted_count == 1u && + g_task03_accepted_level == 1u && + g_task03_accept_time - g_task03_edge_time[2] >= TASK03_QUIET && + (tb_gpio_read(TB_GPIO_PENDING) & TASK03_INPUT_PIN) == 0u; + + c13_external_disable(); + tb_gpio_write(TB_GPIO_RISE_EN, 0u); + tb_gpio_write(TB_GPIO_FALL_EN, 0u); + c13_report_u32("T03 count=", g_task03_irq_count); + c13_report_u32("T03 level0=", g_task03_edge_level[0]); + c13_report_u32("T03 level1=", g_task03_edge_level[1]); + c13_report_u32("T03 level2=", g_task03_edge_level[2]); + c13_report_u32("T03 time0_low=", (uint32_t)g_task03_edge_time[0]); + c13_report_u32("T03 time1_low=", (uint32_t)g_task03_edge_time[1]); + c13_report_u32("T03 time2_low=", (uint32_t)g_task03_edge_time[2]); + c13_report_u32("T03 gap01=", (uint32_t)(g_task03_edge_time[1] - g_task03_edge_time[0])); + c13_report_u32("T03 gap12=", (uint32_t)(g_task03_edge_time[2] - g_task03_edge_time[1])); + c13_report_u32("T03 quiet=", (uint32_t)TASK03_QUIET); + c13_report_u32("T03 accepted_after=", (uint32_t)(g_task03_accept_time - g_task03_edge_time[2])); + c13_report_u32("T03 early=", g_task03_early_accepts); + c13_report_u32("T03 accepted=", g_task03_accepted_count); + c13_report_u32("T03 pass=", g_task03_pass); + return g_task03_pass ? 0 : 1; +} + diff --git a/src/tasks/task04_raw_c_superloop.c b/src/tasks/task04_raw_c_superloop.c new file mode 100644 index 0000000..5fa82d9 --- /dev/null +++ b/src/tasks/task04_raw_c_superloop.c @@ -0,0 +1,181 @@ +#include "c13_common.h" + +#define TASK04_GPIO_INPUT (UINT32_C(1) << 4) +#define TASK04_GPIO_EFFECT (UINT32_C(1) << 0) +#define TASK04_UART_EFFECT (UINT32_C(1) << 1) +#define TASK04_TIMER_EFFECT (UINT32_C(1) << 2) +#define TASK04_TIMER_PERIOD UINT64_C(10000) + +volatile uint32_t g_task04_timer_irq_count; +volatile uint32_t g_task04_timer_flag; +volatile uint32_t g_task04_timer_mcause; +volatile uint64_t g_task04_timer_deadline; +volatile uint64_t g_task04_timer_observed; + +volatile uint32_t g_task04_uart_irq_count; +volatile uint32_t g_task04_uart_irq_number; +volatile uint32_t g_task04_uart_byte; +volatile uint32_t g_task04_uart_flag; + +volatile uint32_t g_task04_gpio_irq_count; +volatile uint32_t g_task04_gpio_irq_number; +volatile uint32_t g_task04_gpio_level; +volatile uint32_t g_task04_gpio_flag; + +volatile uint32_t g_task04_main_timer_actions; +volatile uint32_t g_task04_main_uart_actions; +volatile uint32_t g_task04_main_gpio_actions; +volatile uint32_t g_task04_final_out; +volatile uint32_t g_task04_final_in; +volatile uint32_t g_task04_pass; + +void __attribute__((interrupt("machine"))) isr_machine_timer(void) +{ + const uint64_t observed = c13_timer_read64(); + + g_task04_timer_mcause = read_csr(mcause); + g_task04_timer_observed = observed; + g_task04_timer_deadline += TASK04_TIMER_PERIOD; + c13_timer_set_compare(g_task04_timer_deadline); + g_task04_timer_flag = 1u; + g_task04_timer_irq_count = g_task04_timer_irq_count + 1u; +} + +void task04_uart_handler(void) +{ + g_task04_uart_irq_number = (uint32_t)h3irq_get_current_irq(); + g_task04_uart_byte = *tb_uart_reg(C13_UART_INDEX, TB_UART_DATA) & 0xffu; + g_task04_uart_flag = 1u; + g_task04_uart_irq_count = g_task04_uart_irq_count + 1u; +} + +void task04_gpio_handler(void) +{ + const uint32_t pending = tb_gpio_read(TB_GPIO_PENDING); + + g_task04_gpio_irq_number = (uint32_t)h3irq_get_current_irq(); + g_task04_gpio_level = + (tb_gpio_read(TB_GPIO_IN) & TASK04_GPIO_INPUT) != 0u; + tb_gpio_write(TB_GPIO_PENDING, pending); + g_task04_gpio_flag = 1u; + g_task04_gpio_irq_count = g_task04_gpio_irq_count + 1u; +} + +static uint32_t take_flag(volatile uint32_t *flag) +{ + uint32_t value; + + global_irq_enable(false); + value = *flag; + *flag = 0u; + global_irq_enable(true); + return value; +} + +int main(void) +{ + const uint32_t output_mask = + TASK04_GPIO_EFFECT | TASK04_UART_EFFECT | TASK04_TIMER_EFFECT; + + global_irq_enable(false); + timer_irq_enable(false); + external_irq_enable(false); + tb_uart_rx_irq_enable(C13_UART_INDEX, false); + h3irq_enable(C13_UART_IRQ, false); + h3irq_enable(C13_GPIO_IRQ, false); + c13_timer_set_compare(UINT64_MAX); + + tb_gpio_write(TB_GPIO_DIR, output_mask); + tb_gpio_write(TB_GPIO_OUT_CLR, output_mask); + tb_gpio_write(TB_GPIO_RISE_EN, 0u); + tb_gpio_write(TB_GPIO_FALL_EN, 0u); + tb_gpio_write(TB_GPIO_PENDING, UINT32_MAX); + tb_gpio_test_set_input(0u); + + h3irq_set_handler(C13_UART_IRQ, task04_uart_handler); + h3irq_set_handler(C13_GPIO_IRQ, task04_gpio_handler); + h3irq_set_priority(C13_UART_IRQ, 1u); + h3irq_set_priority(C13_GPIO_IRQ, 2u); + h3irq_enable(C13_UART_IRQ, true); + h3irq_enable(C13_GPIO_IRQ, true); + external_irq_enable(true); + tb_uart_rx_irq_enable(C13_UART_INDEX, true); + tb_gpio_write(TB_GPIO_RISE_EN, TASK04_GPIO_INPUT); + + g_task04_timer_deadline = c13_timer_read64() + TASK04_TIMER_PERIOD; + c13_timer_set_compare(g_task04_timer_deadline); + timer_irq_enable(true); + global_irq_enable(true); + + /* Both writes are testbench stimuli, not production peripheral registers. */ + tb_uart_test_inject_rx(C13_UART_INDEX, (uint8_t)'U'); + tb_gpio_test_set_input(TASK04_GPIO_INPUT); + + while (g_task04_main_timer_actions == 0u || + g_task04_main_uart_actions == 0u || + g_task04_main_gpio_actions == 0u) { + if (take_flag(&g_task04_uart_flag) != 0u) { + if (g_task04_uart_byte == (uint32_t)'U') { + tb_gpio_write(TB_GPIO_OUT_SET, TASK04_UART_EFFECT); + } + g_task04_main_uart_actions++; + } + if (take_flag(&g_task04_gpio_flag) != 0u) { + if (g_task04_gpio_level != 0u) { + tb_gpio_write(TB_GPIO_OUT_SET, TASK04_GPIO_EFFECT); + } + g_task04_main_gpio_actions++; + } + if (take_flag(&g_task04_timer_flag) != 0u) { + tb_gpio_write(TB_GPIO_OUT_SET, TASK04_TIMER_EFFECT); + g_task04_main_timer_actions++; + } + if (g_task04_main_timer_actions == 0u || + g_task04_main_uart_actions == 0u || + g_task04_main_gpio_actions == 0u) { + __asm__ volatile("wfi" ::: "memory"); + } + } + + global_irq_enable(false); + timer_irq_enable(false); + c13_timer_set_compare(UINT64_MAX); + c13_external_disable(); + tb_gpio_write(TB_GPIO_RISE_EN, 0u); + + g_task04_final_out = tb_gpio_read(TB_GPIO_OUT) & output_mask; + g_task04_final_in = tb_gpio_read(TB_GPIO_IN) & + (output_mask | TASK04_GPIO_INPUT); + g_task04_pass = + g_task04_timer_irq_count == 1u && + g_task04_timer_mcause == C13_MACHINE_TIMER_CAUSE && + g_task04_timer_observed >= g_task04_timer_deadline - TASK04_TIMER_PERIOD && + g_task04_uart_irq_count == 1u && + g_task04_uart_irq_number == C13_UART_IRQ && + g_task04_uart_byte == (uint32_t)'U' && + g_task04_gpio_irq_count == 1u && + g_task04_gpio_irq_number == C13_GPIO_IRQ && + g_task04_gpio_level == 1u && + g_task04_main_timer_actions == 1u && + g_task04_main_uart_actions == 1u && + g_task04_main_gpio_actions == 1u && + g_task04_final_out == output_mask && + g_task04_final_in == (output_mask | TASK04_GPIO_INPUT); + + c13_report_u32("T04 timer_irq=", g_task04_timer_irq_count); + c13_report_u32("T04 timer_mcause=", g_task04_timer_mcause); + c13_report_u32("T04 uart_irq=", g_task04_uart_irq_count); + c13_report_u32("T04 uart_number=", g_task04_uart_irq_number); + c13_report_u32("T04 uart_byte=", g_task04_uart_byte); + c13_report_u32("T04 gpio_irq=", g_task04_gpio_irq_count); + c13_report_u32("T04 gpio_number=", g_task04_gpio_irq_number); + c13_report_u32("T04 gpio_level=", g_task04_gpio_level); + c13_report_u32("T04 main_timer=", g_task04_main_timer_actions); + c13_report_u32("T04 main_uart=", g_task04_main_uart_actions); + c13_report_u32("T04 main_gpio=", g_task04_main_gpio_actions); + c13_report_u32("T04 final_out=", g_task04_final_out); + c13_report_u32("T04 final_in=", g_task04_final_in); + c13_report_u32("T04 pass=", g_task04_pass); + return g_task04_pass ? 0 : 1; +} + diff --git a/tests/test_card.sh b/tests/test_card.sh new file mode 100755 index 0000000..4c32b76 --- /dev/null +++ b/tests/test_card.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +tmp_dir="$(mktemp -d /tmp/c13-card.XXXXXX)" +cleanup() { + rm -rf -- "$tmp_dir" +} +trap cleanup EXIT HUP INT TERM + +"$root/scripts/render_card_layouts.sh" >/dev/null +"$root/scripts/render_new_pdf.sh" >/dev/null + +pdf="$(find "$root/doc/pdf" -maxdepth 1 -type f \ + -name 'mpabi-inf-c-13-gpio-edges-debounce-*.pdf' -print -quit)" +test -n "$pdf" +qpdf --check "$pdf" >/dev/null +pdftotext -layout "$pdf" "$tmp_dir/card.txt" + +blocks="$(rg -o 'A[1-8] (CONTEXT|STRUCTURE|DISPATCH|APPLICATION|FLOW|STATE|RUNTIME|PATTERNS)' \ + "$tmp_dir/card.txt" | wc -l)" +test "$blocks" -eq 32 + +awk 'BEGIN { RS="\f" } { compact=$0; gsub(/[[:space:]]/, "", compact); if (length(compact) < 100) exit 1 }' \ + "$tmp_dir/card.txt" || { echo "FAIL: empty PDF page" >&2; exit 1; } +awk 'BEGIN { RS="\f" } \ + /A[1-8] (CONTEXT|STRUCTURE|DISPATCH|APPLICATION|FLOW|STATE|RUNTIME|PATTERNS)/ && !/TASK0[1-4]/ { exit 1 }' \ + "$tmp_dir/card.txt" || { echo "FAIL: anonymous A1-A8 page" >&2; exit 1; } + +jq -e ' + .tasks_order == ["task01", "task02", "task03", "task04"] and + all(.tasks[]; + [.viewpoints[].id] == ["A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8"] and + all(.viewpoints[]; .status == "enabled" or .status == "unavailable")) +' "$root/json/card_source.json" >/dev/null +node --check "$root/web/app.js" +printf 'PASS card: 4 tasks, 32 A blocks, valid PDF, no empty/anonymous page\n' + diff --git a/tests/test_hazard3.sh b/tests/test_hazard3.sh new file mode 100755 index 0000000..9e704e7 --- /dev/null +++ b/tests/test_hazard3.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +env_root="${RV_ENV_ROOT:-/home/user/dev/edu/rv32i-hazard3-student-env}" +tb="${HAZARD3_TB:-$env_root/vendor/Hazard3/test/sim/tb_verilator/tb}" +objdump="${RISCV_PREFIX:-riscv64-unknown-elf-}objdump" + +test -x "$tb" +make -C "$root" -s tasks "RV_ENV_ROOT=$env_root" + +run_task() { + local task="$1" + shift + local log="$root/build/$task/oracle.log" + "$tb" --bin "$root/build/$task/prog.bin" --cycles 1000000 \ + --cpuret --logfile "$log" + if grep -Eq 'Unhandled trap|Max cycles reached' "$log"; then + printf 'FAIL %s: trap or timeout\n' "$task" >&2 + sed -n '1,180p' "$log" >&2 + return 1 + fi + local expected + for expected in "$@"; do + grep -Fqx "$expected" "$log" || { + printf 'FAIL %s: missing <%s>\n' "$task" "$expected" >&2 + sed -n '1,180p' "$log" >&2 + return 1 + } + done + printf 'PASS Hazard3 oracle: %s\n' "$task" +} + +run_task task01_gpio_polling \ + 'T01 dir=00000001' \ + 'T01 external_high=00000002' \ + 'T01 out_after_set=00000001' \ + 'T01 both_high=00000003' \ + 'T01 final_in=00000000' \ + 'T01 pass=00000001' + +run_task task02_gpio_rising_irq \ + 'T02 count=00000001' \ + 'T02 irq=00000012' \ + 'T02 source_before=00000001' \ + 'T02 controller_before=00000001' \ + 'T02 pending_in_handler=00000004' \ + 'T02 source_after=00000000' \ + 'T02 controller_after=00000000' \ + 'T02 same_level_pending=00000000' \ + 'T02 resumed=00000001' \ + 'T02 pass=00000001' + +run_task task03_gpio_quiet_window \ + 'T03 count=00000003' \ + 'T03 level0=00000001' \ + 'T03 level1=00000000' \ + 'T03 level2=00000001' \ + 'T03 quiet=000007d0' \ + 'T03 early=00000000' \ + 'T03 accepted=00000001' \ + 'T03 pass=00000001' + +run_task task04_raw_c_superloop \ + 'T04 timer_irq=00000001' \ + 'T04 timer_mcause=80000007' \ + 'T04 uart_irq=00000001' \ + 'T04 uart_number=00000010' \ + 'T04 uart_byte=00000055' \ + 'T04 gpio_irq=00000001' \ + 'T04 gpio_number=00000012' \ + 'T04 gpio_level=00000001' \ + 'T04 main_timer=00000001' \ + 'T04 main_uart=00000001' \ + 'T04 main_gpio=00000001' \ + 'T04 final_out=00000007' \ + 'T04 final_in=00000017' \ + 'T04 pass=00000001' + +# Independent arithmetic oracle for debounce; do not trust only program pass. +t03_log="$root/build/task03_gpio_quiet_window/oracle.log" +mapfile -t times < <(sed -n 's/^T03 time[0-2]_low=//p' "$t03_log") +mapfile -t gaps < <(sed -n 's/^T03 gap[01][12]=//p' "$t03_log") +quiet_hex="$(sed -n 's/^T03 quiet=//p' "$t03_log")" +accepted_hex="$(sed -n 's/^T03 accepted_after=//p' "$t03_log")" +[[ ${#times[@]} -eq 3 && ${#gaps[@]} -eq 2 ]] +quiet=$((16#$quiet_hex)) +accepted_after=$((16#$accepted_hex)) +for i in 0 1; do + first=$((16#${times[$i]})) + second=$((16#${times[$((i + 1))]})) + gap=$((16#${gaps[$i]})) + (( second > first && second - first == gap && gap < quiet )) || { + echo "FAIL task03: invalid bounce interval $i" >&2 + exit 1 + } +done +(( accepted_after >= quiet )) || { + echo "FAIL task03: accepted before the quiet window" >&2 + exit 1 +} + +# The machine-timer handler must return from a trap, not as a normal function. +"$objdump" -d "$root/build/task04_raw_c_superloop/prog.elf" | + sed -n '/:/,/^$/p' | + grep -Eq '[[:space:]]mret$' + +printf 'PASS independent oracle: edge/W1C relations, debounce timing, ISR mret\n' + diff --git a/web/app.css b/web/app.css new file mode 100644 index 0000000..eac8d78 --- /dev/null +++ b/web/app.css @@ -0,0 +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}} diff --git a/web/app.js b/web/app.js new file mode 100644 index 0000000..c1573ef --- /dev/null +++ b/web/app.js @@ -0,0 +1,61 @@ +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||!(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<\/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(` +`).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(); +/*! Bundled license information: + +react/cjs/react.production.min.js: + (** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +scheduler/cjs/scheduler.production.min.js: + (** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +react-dom/cjs/react-dom.production.min.js: + (** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +react/cjs/react-jsx-runtime.production.min.js: + (** + * @license React + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) +*/ diff --git a/web/card-data.json b/web/card-data.json new file mode 100644 index 0000000..88a1125 --- /dev/null +++ b/web/card-data.json @@ -0,0 +1,2706 @@ +{ + "schema": "esc-card-react-view.v1", + "card": { + "id": "mpabi-inf-c-13-gpio-edges-debounce", + "series": "c", + "series_title": "C · Freestanding RV32I and K&R", + "number": "13", + "count": "13", + "slug": "gpio-edges-debounce", + "title": "GPIO, zbocza i quiet-window debounce", + "topic": "RV32I/Hazard3: polling GPIO, external IRQ18, debounce i końcowy superloop raw C", + "project": "Freestanding C na RV32I", + "subject": "Informatyka", + "level": "Rok 1 · C13 · RV32I/Hazard3", + "revision_date": "2026-07-20T00:00:00+02:00", + "status": "Gotowa", + "version": "v00.01", + "uuid": "72e2cbba-4658-5de2-a0dc-8b600ee3f7b0", + "author": "M. Pabiszczak", + "year": "2026" + }, + "library": { + "schema": "stem-card-library.v2", + "workspace": "edu", + "subjects": [ + { + "id": "inf", + "title": "INF · Informatyka", + "current": false, + "levels": [ + { + "id": "year-1", + "title": "Rok 1", + "current": false, + "series": [ + { + "id": "console-bash", + "title": "Bash · Console Tools", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "L01", + "title": "BusyBox — the Swiss Army Knife", + "repo": "lab-console-busybox", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L02", + "title": "Tmux — sessions, windows and panes", + "repo": "lab-console-tmux", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L03", + "title": "Neovim — navigation and editing", + "repo": "lab-console-neovim", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L04", + "title": "Git Basics I — status, add and commit", + "repo": "lab-console-git-basics-1", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L05", + "title": "Git Basics II — log, diff and restore", + "repo": "lab-console-git-basics-2", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L06", + "title": "Git Branching I — branch, switch and merge", + "repo": "lab-console-git-branching-1", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L07", + "title": "Git Branching II — rebase and conflicts", + "repo": "lab-console-git-branching-2", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L08", + "title": "Docker Fundamentals", + "repo": "lab-console-docker", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "rv32i-asm", + "title": "ASM · RV32I From Blinker to RISC-V", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "L01", + "title": "Number Systems and Storage", + "repo": "lab-rv32i-asm-number-systems", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L02", + "title": "FPGA Bring-up and Programming", + "repo": "lab-rv32i-asm-fpga-bringup", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L03", + "title": "Blinker and Synchronous Logic", + "repo": "lab-rv32i-asm-blinker", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L04", + "title": "The RISC-V ISA and Instruction Decoder", + "repo": "lab-rv32i-asm-decoder", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L05", + "title": "ALU and the Verilog Assembler", + "repo": "lab-rv32i-asm-alu", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L06", + "title": "Control Flow — Jumps and Branches", + "repo": "lab-rv32i-asm-control-flow", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L07", + "title": "Addresses and Memory", + "repo": "lab-rv32i-asm-addresses-memory", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L08", + "title": "Subroutines and the RISC-V ABI", + "repo": "lab-rv32i-asm-subroutines-abi", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L09", + "title": "Load and Store", + "repo": "lab-rv32i-asm-load-store", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "c", + "title": "C · Freestanding RV32I and K&R", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "C01", + "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", + "available": true, + "current": false, + "number": "01", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Ręczna implementacja RV32I ASM" + }, + { + "id": "task02", + "title": "Referencyjna implementacja w C" + }, + { + "id": "task03", + "title": "ASM wyemitowany przez GCC" + } + ] + }, + { + "id": "C02", + "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", + "available": true, + "current": false, + "number": "02", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Wynik strlen w .bss" + }, + { + "id": "task02", + "title": "Wynik i napis w .data" + }, + { + "id": "task03", + "title": "Nieużyta tablica lokalna" + }, + { + "id": "task04", + "title": "Użyta tablica lokalna i stack frame" + } + ] + }, + { + "id": "C03", + "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", + "available": true, + "current": false, + "number": "03", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Argument i wynik bez powrotu z main" + }, + { + "id": "task02", + "title": "Pełny stack frame i zachowanie ra" + } + ] + }, + { + "id": "C04", + "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", + "available": true, + "current": false, + "number": "04", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Nazwy i stałe symboliczne" + }, + { + "id": "task02", + "title": "Typy i zakresy" + }, + { + "id": "task03", + "title": "Stałe, długość i enum" + }, + { + "id": "task04", + "title": "Deklaracje, inicjalizacja i const" + }, + { + "id": "task05", + "title": "Arytmetyka i rok przestępny" + }, + { + "id": "task06", + "title": "Porównania i logika" + }, + { + "id": "task07", + "title": "Konwersje: atoi, lower i htoi" + }, + { + "id": "task08", + "title": "Inkrementacja i operacje na napisach" + }, + { + "id": "task09", + "title": "Operatory bitowe" + }, + { + "id": "task10", + "title": "Przypisania i bitcount" + }, + { + "id": "task11", + "title": "Operator warunkowy" + }, + { + "id": "task12", + "title": "Priorytet i kolejność obliczeń" + } + ] + }, + { + "id": "C05", + "title": "Control Flow", + "repo": "lab-rv32i-c-control-flow", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/7512361d-e5e6-5c08-ab18-8be29dacdc10", + "available": true, + "current": false, + "number": "05", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Instrukcje i bloki" + }, + { + "id": "task02", + "title": "if-else i dangling else" + }, + { + "id": "task03", + "title": "else-if i wyszukiwanie binarne" + }, + { + "id": "task04", + "title": "switch: escape i unescape" + }, + { + "id": "task05", + "title": "while, for i Shell sort" + }, + { + "id": "task06", + "title": "do-while i itoa" + }, + { + "id": "task07", + "title": "break i continue" + }, + { + "id": "task08", + "title": "goto i etykiety" + } + ] + }, + { + "id": "C06", + "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", + "available": true, + "current": false, + "number": "06", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Funkcje i strindex" + }, + { + "id": "task02", + "title": "double i atof z wykładnikiem" + }, + { + "id": "task03", + "title": "Zewnętrzny stos RPN" + }, + { + "id": "task04", + "title": "Scope i extern" + }, + { + "id": "task05", + "title": "Nagłówki i prototypy" + }, + { + "id": "task06", + "title": "Static storage" + }, + { + "id": "task07", + "title": "Zmienne register" + }, + { + "id": "task08", + "title": "Struktura blokowa" + }, + { + "id": "task09", + "title": "Inicjalizacja" + }, + { + "id": "task10", + "title": "Rekurencja i quicksort" + }, + { + "id": "task11", + "title": "Preprocesor i makra" + } + ] + }, + { + "id": "C07", + "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", + "available": true, + "current": false, + "number": "07", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "task01" + }, + { + "id": "task02", + "title": "task02" + }, + { + "id": "task03", + "title": "task03" + }, + { + "id": "task04", + "title": "K&R 5.4 -- Linear Memory Allocator" + }, + { + "id": "task05", + "title": "task05" + }, + { + "id": "task06", + "title": "task06" + }, + { + "id": "task07", + "title": "task07" + }, + { + "id": "task08", + "title": "task08" + }, + { + "id": "task09", + "title": "task09" + }, + { + "id": "task10", + "title": "task10" + }, + { + "id": "task11", + "title": "task11" + }, + { + "id": "task12", + "title": "task12" + } + ] + }, + { + "id": "C08", + "title": "Structures and Linked State", + "repo": "lab-rv32i-c-structures", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f60fbba3-a788-5f1e-bc24-52af82f227c9", + "available": true, + "current": false, + "number": "08", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Układ BlockHeader" + }, + { + "id": "task02", + "title": "Nagłówek, payload i odzyskanie właściciela" + }, + { + "id": "task03", + "title": "Intruzywna lista wolnych bloków" + }, + { + "id": "task04", + "title": "Wyrównana arena dwóch bloków" + } + ] + }, + { + "id": "C09", + "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", + "available": true, + "current": false, + "number": "09", + "version": "v00.01", + "status": "planned", + "tasks": [ + { + "id": "task01", + "title": "strlen z libc bez sterty" + }, + { + "id": "task02", + "title": "Kontrolowany brak dostawcy sbrk" + }, + { + "id": "task03", + "title": "Bounded sbrk i atomowy błąd" + }, + { + "id": "task04", + "title": "Wyrównany smalloc append-only" + }, + { + "id": "task05", + "title": "malloc/free picolibc jako czarna skrzynka" + } + ] + }, + { + "id": "C10", + "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", + "available": true, + "current": false, + "number": "10", + "version": "v00.01", + "status": "planned", + "tasks": [ + { + "id": "task01", + "title": "ECALL i wznowienie pod mepc+4" + }, + { + "id": "task02", + "title": "Machine software IRQ i clear źródła" + }, + { + "id": "task03", + "title": "Macierz pending, MSIE i MIE" + } + ] + }, + { + "id": "C11", + "title": "Machine Timer and Periodic Work", + "repo": "lab-rv32i-c-timer", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "C12", + "title": "UART — polling and interrupts", + "repo": "lab-rv32i-c-uart", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/64f7c516-78b1-58ee-8619-a82d7061079f", + "available": true, + "current": false, + "number": "12", + "version": "v00.01", + "status": "planned", + "tasks": [ + { + "id": "task01", + "title": "Polling jednego bajtu" + }, + { + "id": "task02", + "title": "Odbiór R przez external IRQ 16" + }, + { + "id": "task03", + "title": "Jednokomórkowa skrzynka drop-newest" + } + ] + }, + { + "id": "C13", + "title": "GPIO, Edges and Debounce", + "repo": "lab-rv32i-c-gpio", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + } + ] + } + ] + }, + { + "id": "year-2", + "title": "Rok 2", + "current": false, + "series": [ + { + "id": "cpp", + "title": "C++", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "CPP01", + "title": "Translation Units, Linkage and Namespaces", + "repo": "lab-cpp-build-namespaces", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP02", + "title": "Classes, Encapsulation and Invariants", + "repo": "lab-cpp-classes-invariants", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP03", + "title": "Construction, Destruction and RAII", + "repo": "lab-cpp-lifetime-raii", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP04", + "title": "References, const and Value Categories", + "repo": "lab-cpp-references-const", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP05", + "title": "Copy, Move and the Rule of Zero/Five", + "repo": "lab-cpp-copy-move", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP06", + "title": "Ownership and Resource Types", + "repo": "lab-cpp-ownership", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP07", + "title": "Function and Class Templates", + "repo": "lab-cpp-templates", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP08", + "title": "Static Polymorphism and CRTP", + "repo": "lab-cpp-static-polymorphism", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP09", + "title": "Inheritance, Interfaces and Dynamic Dispatch", + "repo": "lab-cpp-dynamic-polymorphism", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP10", + "title": "Operator Overloading and Strong Types", + "repo": "lab-cpp-strong-types", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP11", + "title": "Containers, Iterators and Algorithms", + "repo": "lab-cpp-containers-iterators", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP12", + "title": "Lambdas, Function Objects and Callables", + "repo": "lab-cpp-lambdas-callables", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP13", + "title": "Error Models with and without Exceptions", + "repo": "lab-cpp-error-models", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP14", + "title": "Object Layout, ABI and Binary Evidence", + "repo": "lab-cpp-abi-evidence", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP15", + "title": "Resource-type Integration Project", + "repo": "lab-cpp-resource-integration", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "freertos-c", + "title": "FreeRTOS C", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "FC01", + "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", + "available": true, + "current": false, + "number": "01", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Predict and prove reusable heap_4 blocks" + } + ] + }, + { + "id": "FC02", + "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", + "available": true, + "current": false, + "number": "02", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Pierwszy task FreeRTOS — callback, context, TCB i stos" + } + ] + }, + { + "id": "FC03", + "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", + "available": true, + "current": false, + "number": "03", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Kontrolowany eksperyment schedulera FreeRTOS" + } + ] + }, + { + "id": "FC04", + "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", + "available": true, + "current": false, + "number": "04", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Delay, blokowanie, zawieszenie i self-delete" + } + ] + }, + { + "id": "FC05", + "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", + "available": true, + "current": false, + "number": "05", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Kolejka długości 1: empty, full, copy i FIFO" + } + ] + }, + { + "id": "FC06", + "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", + "available": true, + "current": false, + "number": "06", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "One-shot, auto-reload i timer daemon" + } + ] + }, + { + "id": "FC07", + "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", + "available": true, + "current": false, + "number": "07", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "External IRQ → FromISR semaphore → high-priority task" + } + ] + }, + { + "id": "FC08", + "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", + "available": true, + "current": false, + "number": "08", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Low/Medium/High: ownership i dziedziczenie priorytetu" + } + ] + }, + { + "id": "FC09", + "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", + "available": true, + "current": false, + "number": "09", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "ALL-ready i trzyosobowa bariera" + } + ] + }, + { + "id": "FC10", + "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", + "available": true, + "current": false, + "number": "10", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Count, overwrite i bit flags na jednym slocie" + } + ] + }, + { + "id": "FC11", + "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", + "available": true, + "current": false, + "number": "11", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Same behavior, two storage policies" + } + ] + }, + { + "id": "FC12", + "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", + "available": true, + "current": false, + "number": "12", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Diagnose before changing the program" + } + ] + }, + { + "id": "FC13", + "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", + "available": true, + "current": false, + "number": "13", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Build and prove a bounded UART RX pipeline" + } + ] + }, + { + "id": "FC14", + "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", + "available": true, + "current": false, + "number": "14", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Prove one machine-timer event from ISR to daemon GPIO work" + } + ] + }, + { + "id": "FC15", + "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", + "available": true, + "current": false, + "number": "15", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Prove one complete FreeRTOS C architecture" + } + ] + } + ] + }, + { + "id": "freertos-cpp", + "title": "FreeRTOS C++", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "K02", + "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", + "available": true, + "current": false, + "number": "02", + "version": "v00.04", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "C++ Task wrapper — OOP i debugowanie cyklu życia" + } + ] + }, + { + "id": "K03", + "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", + "available": true, + "current": false, + "number": "03", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Vector V1 — transfer własności i powrót heapu" + } + ] + }, + { + "id": "K04", + "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", + "available": true, + "current": false, + "number": "04", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Osiem snapshotów decyzji schedulera" + } + ] + }, + { + "id": "K05", + "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", + "available": true, + "current": false, + "number": "05", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Fragmentacja, koalescencja i historyczny watermark" + } + ] + }, + { + "id": "K06", + "title": "MemoryResource and FreeRtosAllocator", + "repo": "lab-rv32i-freertos-allocator-resource", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/1af48a2e-8564-4e18-8115-b2c0208169d6", + "available": true, + "current": false, + "number": "06", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Dwa zasoby, jeden typed allocator" + } + ] + }, + { + "id": "K07", + "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", + "available": true, + "current": false, + "number": "07", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Stabilny obiekt przez statyczny trampoline" + } + ] + }, + { + "id": "K08", + "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", + "available": true, + "current": false, + "number": "08", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Dwie polityki storage i pełna oś delete" + } + ] + }, + { + "id": "K09", + "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", + "available": true, + "current": false, + "number": "09", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Fasada kernela i restore na każdej ścieżce" + } + ] + }, + { + "id": "K10", + "title": "Queue and StaticQueue", + "repo": "lab-rv32i-freertos-queue", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/66967c2d-bb34-4344-8064-f54d06cce47a", + "available": true, + "current": false, + "number": "10", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Typed byte-copy queue z dwiema politykami storage" + } + ] + }, + { + "id": "K11", + "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", + "available": true, + "current": false, + "number": "11", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "LockGuard i zmierzone priority inheritance" + } + ] + }, + { + "id": "K12", + "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", + "available": true, + "current": false, + "number": "12", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Semaphore slots i jednoodbiorcza notification" + } + ] + }, + { + "id": "K13", + "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", + "available": true, + "current": false, + "number": "13", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Typed EventGroup i trzy źródła stanu" + } + ] + }, + { + "id": "K14", + "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", + "available": true, + "current": false, + "number": "14", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Static one-shot i periodic timer na daemon tasku" + } + ] + }, + { + "id": "K15", + "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", + "available": true, + "current": false, + "number": "15", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "UART queue i GPIO notify z realnego IRQ" + } + ] + }, + { + "id": "K16", + "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", + "available": true, + "current": false, + "number": "16", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "End-to-end RTOS service i evidence report" + } + ] + } + ] + }, + { + "id": "posix-threads", + "title": "POSIX Threads", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "PT01", + "title": "Process and Thread Execution Context", + "repo": "lab-posix-process-thread", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT02", + "title": "pthread_create, pthread_join and Lifecycle", + "repo": "lab-posix-pthread-create-join", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT03", + "title": "Arguments, Return Values and Ownership", + "repo": "lab-posix-thread-arguments", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT04", + "title": "Data Races and the Happens-before Question", + "repo": "lab-posix-data-races", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT05", + "title": "Mutex, Critical Section and Deadlock", + "repo": "lab-posix-mutex", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT06", + "title": "Condition Variables and Predicates", + "repo": "lab-posix-condition-variable", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT07", + "title": "Bounded Producer–Consumer Queue", + "repo": "lab-posix-producer-consumer", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT08", + "title": "POSIX Semaphores", + "repo": "lab-posix-semaphore", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT09", + "title": "Reader–Writer Lock", + "repo": "lab-posix-rwlock", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT10", + "title": "C Atomics and Memory Ordering", + "repo": "lab-posix-atomics", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT11", + "title": "Cancellation, Cleanup and Safe Shutdown", + "repo": "lab-posix-cancellation-cleanup", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT12", + "title": "Thread-local Storage", + "repo": "lab-posix-thread-local", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT13", + "title": "Scheduling Policy, Priority and Affinity", + "repo": "lab-posix-scheduling", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT14", + "title": "GDB, Sanitizers and Race Evidence", + "repo": "lab-posix-thread-debugging", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT15", + "title": "POSIX Threads vs FreeRTOS Integration", + "repo": "lab-posix-freertos-comparison", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "oop", + "title": "OOP and Design Patterns", + "current": false, + "catalog_only": true, + "role": "reference", + "status": "", + "cards": [ + { + "id": "OOP01", + "title": "Strategy — Replaceable Behaviour", + "repo": "lab-cpp-oop-strategy", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "design", + "tasks": [] + }, + { + "id": "OOP02", + "title": "Adapter — Stable Boundary", + "repo": "lab-cpp-oop-adapter", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP03", + "title": "Template Method — Fixed Skeleton", + "repo": "lab-cpp-oop-template-method", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP04", + "title": "Static vs Dynamic Dispatch", + "repo": "lab-cpp-oop-dispatch", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP05", + "title": "RAII and Ownership", + "repo": "lab-cpp-oop-raii", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP06", + "title": "State — Explicit Behaviour", + "repo": "lab-cpp-oop-state", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP07", + "title": "Facade — Subsystem Boundary", + "repo": "lab-cpp-oop-facade", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP08", + "title": "Command — Request as Object", + "repo": "lab-cpp-oop-command", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP09", + "title": "Observer — Subscription and Telemetry", + "repo": "lab-cpp-oop-observer", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP10", + "title": "Factory Method — Resource Policy", + "repo": "lab-cpp-oop-factory-method", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP11", + "title": "Builder — Valid Configuration", + "repo": "lab-cpp-oop-builder", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP12", + "title": "Decorator — Measurement and Diagnostics", + "repo": "lab-cpp-oop-decorator", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP13", + "title": "Composite — Component Tree", + "repo": "lab-cpp-oop-composite", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP14", + "title": "Chain of Responsibility", + "repo": "lab-cpp-oop-chain", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP15", + "title": "Pattern-language Integration", + "repo": "lab-cpp-oop-integration", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + } + ] + }, + { + "id": "year-3", + "title": "Rok 3 · plan", + "current": false, + "series": [ + { + "id": "modern-cpp-stl", + "title": "Modern C++ / STL", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + }, + { + "id": "std-threads", + "title": "std::thread / std::jthread", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + }, + { + "id": "boost-asio", + "title": "Boost.Asio", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + }, + { + "id": "oop", + "title": "OOP and Design Patterns", + "current": false, + "catalog_only": true, + "role": "reference", + "status": "", + "cards": [ + { + "id": "OOP01", + "title": "Strategy — Replaceable Behaviour", + "repo": "lab-cpp-oop-strategy", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "design", + "tasks": [] + }, + { + "id": "OOP02", + "title": "Adapter — Stable Boundary", + "repo": "lab-cpp-oop-adapter", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP03", + "title": "Template Method — Fixed Skeleton", + "repo": "lab-cpp-oop-template-method", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP04", + "title": "Static vs Dynamic Dispatch", + "repo": "lab-cpp-oop-dispatch", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP05", + "title": "RAII and Ownership", + "repo": "lab-cpp-oop-raii", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP06", + "title": "State — Explicit Behaviour", + "repo": "lab-cpp-oop-state", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP07", + "title": "Facade — Subsystem Boundary", + "repo": "lab-cpp-oop-facade", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP08", + "title": "Command — Request as Object", + "repo": "lab-cpp-oop-command", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP09", + "title": "Observer — Subscription and Telemetry", + "repo": "lab-cpp-oop-observer", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP10", + "title": "Factory Method — Resource Policy", + "repo": "lab-cpp-oop-factory-method", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP11", + "title": "Builder — Valid Configuration", + "repo": "lab-cpp-oop-builder", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP12", + "title": "Decorator — Measurement and Diagnostics", + "repo": "lab-cpp-oop-decorator", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP13", + "title": "Composite — Component Tree", + "repo": "lab-cpp-oop-composite", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP14", + "title": "Chain of Responsibility", + "repo": "lab-cpp-oop-chain", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP15", + "title": "Pattern-language Integration", + "repo": "lab-cpp-oop-integration", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + } + ] + }, + { + "id": "year-4", + "title": "Rok 4 · plan", + "current": false, + "series": [ + { + "id": "transformers-gpu", + "title": "Transformers on GPU", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + } + ] + } + ] + }, + { + "id": "fiz", + "title": "FIZ · Fizyka", + "current": false, + "levels": [ + { + "id": "all", + "title": "Katalog", + "current": false, + "series": [ + { + "id": "fiz", + "title": "Fizyka", + "current": false, + "catalog_only": false, + "role": "", + "status": "", + "cards": [ + { + "id": "ruch-1d", + "title": "Ruch 1D", + "repo": "ruch-1d", + "href": "", + "available": false, + "current": false, + "number": "", + "version": "", + "status": "", + "tasks": [] + }, + { + "id": "ruch-2d", + "title": "Ruch 2D", + "repo": "ruch-2d", + "href": "", + "available": false, + "current": false, + "number": "", + "version": "", + "status": "", + "tasks": [] + }, + { + "id": "ruch-po-okregu", + "title": "Ruch po okręgu", + "repo": "ruch-po-okregu", + "href": "", + "available": false, + "current": false, + "number": "", + "version": "", + "status": "", + "tasks": [] + } + ] + } + ] + } + ] + } + ] + }, + "total_pages": 9, + "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\n\n\n\n\n\n\n\n\n\n\n\n
TITLEGPIO, zbocza i quiet-window debounce
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C na RV32I
SERIESC · Freestanding RV32I and K&R
CARD13/13
SHEET1/9
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID72e2cbba-4658-5de2-a0dc-8b600ee3f7b0CARD UUID29e6021a-d033-5fbe-a5fc-ec03442ac68aAUTHOR  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
", + "left_margin_html": "
TECH
", + "right_margin_html": "
OG
", + "goal_title": "Cel karty", + "goal_html": "

Uczeń rozdziela fizyczny lub modelowany poziom wejścia, detekcję zbocza, zatrzaśnięty pending, maskowanie kontrolera, wybór handlera i efekt wykonywany później przez main. Potrafi zrealizować quiet-window debounce oraz połączyć timer, UART i GPIO w końcowym superloop bez RTOS.

", + "scope_title": "Zakres i zachowane przykłady", + "scope_html": "

Cztery przykłady wykonują się na centralnym modelu RTL Hazard3. TEST_IN i UART TEST_RX są jawnie wyłącznie bodźcami testbencha. Karta nie udaje modelu RP2350 ani fizycznego pinu. Task01 dowodzi DIR/OUT/IN przez polling, Task02 pełnej ścieżki rising-edge IRQ18 z W1C, Task03 krótkiego ISR i decyzji debounce w main, a Task04 współpracy machine timer, UART IRQ16 i GPIO IRQ18. Układ każdego przykładu: pełny profil A1-A8; widok N/D ma jawny powód, a diagram nie jest wymagany, gdy tekst daje lepszy dowód.

", + "scope_columns": [ + "chapter", + "task", + "idea", + "priority" + ], + "scope_headers": [ + "Typ", + "Task", + "Idea", + "Waga" + ], + "scope_rows": [ + { + "chapter": "POLL", + "task": "Task01", + "idea_html": "

kierunek, latch wyjścia i testbench-only bodziec wejścia

", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + }, + { + "chapter": "IRQ18", + "task": "Task02", + "idea_html": "

zbocze, pending peryferium, kontroler i resume

", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + }, + { + "chapter": "DBNC", + "task": "Task03", + "idea_html": "

krótki ISR, mtime i decyzja stabilności w main

", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + }, + { + "chapter": "LOOP", + "task": "Task04", + "idea_html": "

trzy źródła, dwa dispatchery, flagi i efekty main

", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + } + ] + }, + "sections": [ + { + "id": "section-1-content", + "index": 1, + "title": "1 — Rejestr modelu nie jest fizycznym pinem", + "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\n\n\n\n\n\n\n\n\n\n\n\n
TITLEGPIO, zbocza i quiet-window debounce
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C na RV32I
SERIESC · Freestanding RV32I and K&R
CARD13/13
SHEET2/9
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID72e2cbba-4658-5de2-a0dc-8b600ee3f7b0CARD UUID29e6021a-d033-5fbe-a5fc-ec03442ac68aAUTHOR  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
", + "left_margin_html": "
TECH
", + "right_margin_html": "
OG
", + "content_html": "

GPIO modelu zaczyna się pod adresem 0xc0000300. DIR wybiera kierunek, OUT/OUT_SET/OUT_CLR sterują zatrzaśnięciem wyjściowym, a IN pokazuje wyjścia dla pinów ustawionych jako output i bodziec zewnętrzny dla pinów input. RISE_EN i FALL_EN wybierają wykrywane zbocza, a PENDING zatrzaskuje je do zapisu W1C.

\n

TEST_IN istnieje tylko po stronie laboratorium. Pozwala programowi testowemu wywołać zmianę otoczenia bez fizycznego przewodu. Produkcyjny sterownik czyta IN; nie powinien zawierać zapisu do takiego fixture'u.

", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-2-content", + "index": 2, + "title": "2 — Source, pending i enable to trzy różne fakty", + "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\n\n\n\n\n\n\n\n\n\n\n\n
TITLEGPIO, zbocza i quiet-window debounce
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C na RV32I
SERIESC · Freestanding RV32I and K&R
CARD13/13
SHEET3/9
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID72e2cbba-4658-5de2-a0dc-8b600ee3f7b0CARD UUID29e6021a-d033-5fbe-a5fc-ec03442ac68aAUTHOR  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
", + "left_margin_html": "
TECH
", + "right_margin_html": "
OG
", + "content_html": "

Zmiana 0 na 1 jest source dla detektora rising edge. Włączony bit RISE_EN pozwala zatrzasnąć bit w PENDING; ten bit utrzymuje poziomową linię GPIO external IRQ18. Kontroler Hazard3 osobno ma per-line enable, priorytet oraz globalne bramki mie.MEIE i mstatus.MIE. Dispatcher odczytuje aktywny numer i wywołuje handler z tablicy.

\n

W1C usuwa źródło poziomowego żądania po stronie peryferium. Sam powrót z handlera, odczyt PENDING ani zamknięcie maski nie potwierdzają zdarzenia.

", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-3-content", + "index": 3, + "title": "3 — Debounce jest decyzją czasu w main", + "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\n\n\n\n\n\n\n\n\n\n\n\n
TITLEGPIO, zbocza i quiet-window debounce
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C na RV32I
SERIESC · Freestanding RV32I and K&R
CARD13/13
SHEET4/9
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID72e2cbba-4658-5de2-a0dc-8b600ee3f7b0CARD UUID29e6021a-d033-5fbe-a5fc-ec03442ac68aAUTHOR  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
", + "left_margin_html": "
TECH
", + "right_margin_html": "
OG
", + "content_html": "

ISR Task03 robi tylko trzy rzeczy: zapisuje czas i poziom, potwierdza pending przez W1C oraz na końcu publikuje licznik. Main obserwuje kandydata i akceptuje go dopiero wtedy, gdy od ostatniego zbocza minęło quiet window oraz bieżący poziom nadal odpowiada kandydatowi. Każde nowe zbocze przesuwa początek okna.

\n

Sekwencja 1-0-1 jest kontrolowanym bounce. Oba odstępy są krótsze od 2000 taktów, dlatego żaden z trzech bezpośrednich odczytów nie może zaakceptować stanu. To polityka aplikacji, nie funkcja kontrolera przerwań.

", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-4-content", + "index": 4, + "title": "4 — Superloop jest granicą serii raw C", + "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\n\n\n\n\n\n\n\n\n\n\n\n
TITLEGPIO, zbocza i quiet-window debounce
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C na RV32I
SERIESC · Freestanding RV32I and K&R
CARD13/13
SHEET5/9
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID72e2cbba-4658-5de2-a0dc-8b600ee3f7b0CARD UUID29e6021a-d033-5fbe-a5fc-ec03442ac68aAUTHOR  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
", + "left_margin_html": "
TECH
", + "right_margin_html": "
OG
", + "content_html": "

Task04 łączy machine timer, UART0 RX external IRQ16 i GPIO external IRQ18. ISR-y publikują flagi, a main konsumuje je i ustawia trzy różne bity wyjściowe. Flaga może skleić wiele produkcji, więc nie jest kolejką; zachowanie liczby i kolejności zdarzeń należy do następnej serii FreeRTOS.

", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-5-task01", + "index": 5, + "title": "TASK01 — Polling DIR, OUT i IN", + "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\n\n\n\n\n\n\n\n\n\n\n\n
TITLEGPIO, zbocza i quiet-window debounce
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C na RV32I
SERIESC · Freestanding RV32I and K&R
CARD13/13
SHEET6/9
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID72e2cbba-4658-5de2-a0dc-8b600ee3f7b0CARD UUID29e6021a-d033-5fbe-a5fc-ec03442ac68aAUTHOR  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
", + "left_margin_html": "
TECH
", + "right_margin_html": "
OG
", + "content_html": "", + "tasks": [ + { + "ref": "task01", + "title": "Polling DIR, OUT i IN", + "uuid": "223fada6-43e4-532a-9c9b-e17445857214", + "criterion": "Oracle: dir=1, external_high=2, out_after_set=1, both_high=3, final_in=0, pass=1 i kod wyjścia 0. PENDING pozostaje 0, ponieważ detektory zboczy są wyłączone.", + "conclusion_html": "", + "prompt_html": "

Przewidź cztery wartości: IN po ustawieniu zewnętrznego pinu 1, OUT po ustawieniu pinu 0, IN przy obu wysokich i IN po wyzerowaniu. Wyjaśnij, dlaczego zapis TEST_IN jest dozwolony tylko w fixture testbencha.

", + "flow": [ + { + "id": "task01.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — dwa źródła widocznego IN", + "content_html": "

Zachowany przykład: \\nolinkurl{src/tasks/task01_gpio_polling.c}. Dla bitu z DIR=1 widoczne IN pochodzi z latcha OUT; dla DIR=0 pochodzi z modelowanego wejścia. TEST_IN zmienia tylko tę drugą część i jest bodźcem laboratorium, nie pinem RP2350.

", + "steps": [] + }, + { + "id": "task01.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — pin0 output, pin1 input", + "content_html": "

Maska 0x1 wybiera pin wyjściowy, a 0x2 wejściowy. Rejestry SET i CLR modyfikują latch bez read-modify-write. Jeden odczyt IN składa oba widoki, dlatego przy obu stanach wysokich wynosi 0x3.

", + "steps": [] + }, + { + "id": "task01.a3", + "kind": "block", + "title": "A3 DISPATCH · N/D", + "content_html": "

N/D. Task01 wyłącza detektory zboczy i przerwania; każdy krok jest bezpośrednim pollingiem MMIO, bez ISR, callbacku ani wyboru handlera.

", + "steps": [] + }, + { + "id": "task01.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — kontrolowany round trip poziomów", + "content_html": "

Po external high program widzi 0x2. SET pinu0 daje OUT=0x1 i IN=0x3. CLR pinu0 oraz TEST_IN=0 kończą sekwencję IN=0. Te liczby są bitowymi relacjami modelu, nie numerami pinów konkretnej płytki.

", + "steps": [] + }, + { + "id": "task01.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — configure, stimulate, sample, clear", + "content_html": "

Program wyłącza edge enable, czyści pending, ustawia kierunek i stan początkowy. Następnie podaje bodziec wejściowy, próbkuje, ustawia output, próbkuje ponownie i zeruje oba źródła. Każdy pomiar następuje po odpowiadającym mu zapisie MMIO.

", + "steps": [] + }, + { + "id": "task01.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — 0x2 → 0x3 → 0x0", + "content_html": "

Widoczny stan portu przechodzi kolejno przez tylko input high, oba bity high i oba low. Kierunek pozostaje 0x1 przez cały eksperyment, a pending pozostaje pusty.

", + "steps": [] + }, + { + "id": "task01.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — rzeczywiste transakcje pod 0xc0000300", + "content_html": "

Log RTL raportuje 1,2,1,3,0 i pass=1. Listing powinien pokazać osobne zapisy do offsetów DIR, TEST_IN, OUT_SET i OUT_CLR oraz odczyty IN; nie ma wejścia do wspólnego dispatchera external IRQ.

", + "steps": [] + }, + { + "id": "task01.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — polling z jawną granicą fixture", + "content_html": "

Wzorzec produkcyjny konfiguruje kierunek i czyta wejście lub steruje wyjściem. Warstwa testowa może dostarczyć osobny mechanizm wstrzyknięcia, ale jego nazwa, dokumentacja i lokalizacja muszą uniemożliwiać pomylenie z rejestrem sprzętu.

", + "steps": [] + }, + { + "id": "task01.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task01.worksheet", + "kind": "block", + "title": "TASK01 · Zapis dowodu ucznia", + "content_html": "

1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Log RTL: DIR, OUT i kolejne wartości IN \\noindent \\noindent 3. Granica modelu: TEST_IN kontra fizyczny pin \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-6-task02", + "index": 6, + "title": "TASK02 — Rising edge, IRQ18 i W1C", + "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\n\n\n\n\n\n\n\n\n\n\n\n
TITLEGPIO, zbocza i quiet-window debounce
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C na RV32I
SERIESC · Freestanding RV32I and K&R
CARD13/13
SHEET7/9
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID72e2cbba-4658-5de2-a0dc-8b600ee3f7b0CARD UUID29e6021a-d033-5fbe-a5fc-ec03442ac68aAUTHOR  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
", + "left_margin_html": "
TECH
", + "right_margin_html": "
OG
", + "content_html": "", + "tasks": [ + { + "ref": "task02", + "title": "Rising edge, IRQ18 i W1C", + "uuid": "93fb66db-d0ac-5fc2-811e-5b28e072a346", + "criterion": "Jeden handler IRQ18 widzi PENDING=0x4 i poziom high. GPIO source oraz controller pending są 1 przed globalnym enable i 0 po W1C; high→high nie tworzy nowego pending, resume=1, pass=1.", + "conclusion_html": "", + "prompt_html": "

Rozpisz ścieżkę od zmiany TEST_IN 0→1 do wznowienia main. Zaznacz GPIO PENDING, pending linii 18 w kontrolerze, dwa poziomy enable, decyzję dispatchera, zapis W1C i efekt ponownego podania tego samego poziomu.

", + "flow": [ + { + "id": "task02.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — zbocze tworzy zatrzaśnięty fakt", + "content_html": "

Zachowany przykład: \\nolinkurl{src/tasks/task02_gpio_rising_irq.c}. Bodziec TEST_IN zmienia pin2 z 0 na 1. Włączony bit RISE_EN tworzy bit 0x4 w GPIO PENDING, a ten utrzymuje external IRQ18. TEST_IN jest sztuczny, lecz dalsza ścieżka przez kontroler i rdzeń jest rzeczywistą ścieżką modelu RTL.

", + "steps": [] + }, + { + "id": "task02.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — dwa pending i tablica handlerów", + "content_html": "

Pierwszy pending leży w peryferium jako maska pinów. Drugi jest widokiem aktywnej linii 18 w kontrolerze Hazard3. Tablica _external_irq_table[18] przechowuje adres zwykłej funkcji handlera.

", + "steps": [] + }, + { + "id": "task02.a3", + "kind": "block", + "title": "A3 DISPATCH · AKTYWNE — external vector wybiera linię 18", + "content_html": "

mtvec wybiera wspólny vector machine external interrupt. irq_dispatch.S odczytuje aktywną linię z meinext, indeksuje tablicę i wykonuje pośredni jalr do handlera GPIO. Handler potwierdza, że bieżący numer to 18.

", + "steps": [] + }, + { + "id": "task02.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — jedno zbocze, jedno wznowienie", + "content_html": "

Program celowo generuje edge przy zamkniętym globalnym MIE. Dzięki temu może najpierw zmierzyć oba pending jako 1. Po otwarciu MIE oczekuje dokładnie jednego handlera, W1C, obu pending równych 0 i wykonania kodu resume.

", + "steps": [] + }, + { + "id": "task02.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — source → pending → enable → dispatch → W1C", + "content_html": "

0→1 ustawia GPIO PENDING. Włączona linia18, MEIE i później MIE dopuszczają trap. Dispatcher wybiera handler18; ISR próbkuje maskę i poziom, zapisuje tę maskę do PENDING jako W1C, a dopiero potem publikuje count. Main wraca i mierzy stan 0.

", + "steps": [] + }, + { + "id": "task02.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — IDLE, LATCHED, HANDLING, ACKED, RESUMED", + "content_html": "

IDLE ma input low i pending 0. Rising edge tworzy LATCHED. Otwarcie MIE prowadzi do HANDLING. Zapis W1C tworzy ACKED, a powrót dispatchera RESUMED. Ponowne high pozostaje ACKED, ponieważ nie zaszła zmiana 0→1.

", + "steps": [] + }, + { + "id": "task02.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — 0x4 w GPIO i 18 w kontrolerze", + "content_html": "

Raport daje count=1, irq=0x12, source/controller przed 1, pending w ISR 0x4, oba pending po 0 i same-level 0. Listing ma zawierać handler GPIO oraz wspólny dispatcher zakończony mret.

", + "steps": [] + }, + { + "id": "task02.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — acknowledge peripheral before publish", + "content_html": "

Dla poziomowego IRQ najpierw ustal i usuń przyczynę po stronie peryferium, a dopiero potem publikuj zakończenie dla main. Zamknięcie maski może odłożyć obsługę, ale nie jest potwierdzeniem zdarzenia.

", + "steps": [] + }, + { + "id": "task02.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task02.worksheet", + "kind": "block", + "title": "TASK02 · Zapis dowodu ucznia", + "content_html": "

1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Log RTL: pending GPIO i kontrolera przed/po ISR \\noindent \\noindent 3. Dowód dispatchu IRQ18 i zapisu W1C \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-7-task03", + "index": 7, + "title": "TASK03 — Quiet-window debounce po trzech zboczach", + "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\n\n\n\n\n\n\n\n\n\n\n\n
TITLEGPIO, zbocza i quiet-window debounce
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C na RV32I
SERIESC · Freestanding RV32I and K&R
CARD13/13
SHEET8/9
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID72e2cbba-4658-5de2-a0dc-8b600ee3f7b0CARD UUID29e6021a-d033-5fbe-a5fc-ec03442ac68aAUTHOR  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
", + "left_margin_html": "
TECH
", + "right_margin_html": "
OG
", + "content_html": "", + "tasks": [ + { + "ref": "task03", + "title": "Quiet-window debounce po trzech zboczach", + "uuid": "a2e3b023-04f1-5863-a4e0-360b5ec69b89", + "criterion": "Poziomy 1,0,1, count=3 i IRQ18. Oba gapy są dodatnie i mniejsze od quiet=2000; early=0, accepted=1, zaakceptowany poziom high, accepted_after >= quiet i pass=1.", + "conclusion_html": "", + "prompt_html": "

Dla sekwencji poziomów 1,0,1 oblicz oba odstępy i porównaj z quiet=2000. Wyjaśnij, dlaczego ISR publikuje czas, lecz nie akceptuje przycisku, oraz jak nowe zbocze restartuje okno ciszy.

", + "flow": [ + { + "id": "task03.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — IRQ rejestruje zmianę, nie intencję użytkownika", + "content_html": "

Zachowany przykład: \\nolinkurl{src/tasks/task03_gpio_quiet_window.c}. Trzy przejścia TEST_IN modelują bounce, nie trzy świadome naciśnięcia. Kontroler potrafi zgłosić rising i falling edge, lecz nie zna quiet window ani znaczenia stabilnego przycisku. Ta semantyka należy do kodu normalnego.

", + "steps": [] + }, + { + "id": "task03.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — historia ISR i kandydat main", + "content_html": "

ISR zapisuje trzy pary level,time, a osobno publikuje ostatni poziom, ostatni czas i count. Main utrzymuje seen count, candidate level oraz candidate time. Krytyczna sekcja chroni snapshot 64-bitowego czasu na RV32.

", + "steps": [] + }, + { + "id": "task03.a3", + "kind": "block", + "title": "A3 DISPATCH · AKTYWNE — każde włączone zbocze wybiera GPIO18", + "content_html": "

RISE_EN i FALL_EN pozwalają trzem przejściom utworzyć pending. External dispatcher trzy razy wybiera wpis 18 i wywołuje ten sam krótki handler. Numer ostatniego handlera oraz count=3 są dowodem decyzji, nie sam fakt zapisu TEST_IN.

", + "steps": [] + }, + { + "id": "task03.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — restart okna po każdym bounce", + "content_html": "

Po każdym nowym count main zastępuje candidate time czasem ostatniego zbocza. Natychmiastowe próby dają early=0. Dopiero stabilny high utrzymany przez co najmniej 2000 taktów daje accepted=1.

", + "steps": [] + }, + { + "id": "task03.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — ISR publish, main observe, wait, validate", + "content_html": "

ISR czyta pending, poziom i mtime, zapisuje rekord, wykonuje W1C i na końcu zwiększa count. Main atomowo pobiera publikację, aktualizuje kandydata, mierzy wiek oraz porównuje bieżący IN. Nowe zbocze wraca do początku okna.

", + "steps": [] + }, + { + "id": "task03.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — HIGH?, LOW?, HIGH?, STABLE_HIGH", + "content_html": "

Pierwsze high jest kandydatem, low unieważnia go, a drugie high tworzy nowego kandydata. Żaden stan z wiekiem mniejszym niż quiet nie jest zaakceptowany. STABLE_HIGH powstaje dopiero po pełnym oknie bez kolejnego IRQ.

", + "steps": [] + }, + { + "id": "task03.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — dwa bounce gapy krótsze od 0x7d0", + "content_html": "

Bieżący RTL raportuje czasy low 0x591, 0x8ea, 0xc43, czyli oba gapy 0x359. Akceptacja następuje po 0x878 od ostatniego edge. Konkretne czasy zależą od buildu; oracle niezależnie sprawdza tylko relacje gap<quiet i accepted_after>=quiet.

", + "steps": [] + }, + { + "id": "task03.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — timestamp in ISR, policy in consumer", + "content_html": "

ISR powinien szybko potwierdzić sprzęt i opublikować minimalne dane. Konsument może wtedy zmieniać quiet window, politykę akceptacji lub raportowanie bez wydłużania czasu blokowania innych przerwań.

", + "steps": [] + }, + { + "id": "task03.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task03.worksheet", + "kind": "block", + "title": "TASK03 · Zapis dowodu ucznia", + "content_html": "

1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Log RTL: trzy poziomy, czasy i gapy \\noindent \\noindent 3. Dowód quiet window i miejsca decyzji w main \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-8-task04", + "index": 8, + "title": "TASK04 — Timer + UART16 + GPIO18 bez RTOS", + "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\n\n\n\n\n\n\n\n\n\n\n\n
TITLEGPIO, zbocza i quiet-window debounce
VER.v00.01
DATETIME2026-07-20T00:00:00+02:00
PROJECTFreestanding C na RV32I
SERIESC · Freestanding RV32I and K&R
CARD13/13
SHEET9/9
SUBJ.Inf.
PROG.
CORE
SCOPE
LEVEL
POS.
GITEA UUID72e2cbba-4658-5de2-a0dc-8b600ee3f7b0CARD UUID29e6021a-d033-5fbe-a5fc-ec03442ac68aAUTHOR  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
", + "left_margin_html": "
TECH
", + "right_margin_html": "
OG
", + "content_html": "", + "tasks": [ + { + "ref": "task04", + "title": "Timer + UART16 + GPIO18 bez RTOS", + "uuid": "ebb18b6a-cf31-5595-9901-ac2ac870296f", + "criterion": "Po jednym timer IRQ z mcause=0x80000007, UART IRQ16 z bajtem 0x55 i GPIO IRQ18 z high. Main konsumuje każdą flagę raz, ustawia trzy bity, OUT=0x7, IN=0x17, pass=1.", + "conclusion_html": "", + "prompt_html": "

Dla timer tick, bajtu U i rising edge narysuj trzy osobne ścieżki source-pending-enable-dispatcher-ISR-flag-main effect. Wyjaśnij, dlaczego trzy flagi nie są kolejką i jakie ograniczenie przechodzi do serii FreeRTOS.

", + "flow": [ + { + "id": "task04.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — trzy usługi, wspólny czas CPU", + "content_html": "

Zachowany przykład: \\nolinkurl{src/tasks/task04_raw_c_superloop.c}. Machine timer pochodzi z mtime>=mtimecmp, UART16 z niepustego RX FIFO przy włączonym RX IRQ, a GPIO18 z rising edge zatrzaśniętego w PENDING. TEST_RX i TEST_IN tworzą tylko bodźce; logika timer/UART/GPIO po nich jest rzeczywistym modelem RTL.

", + "steps": [] + }, + { + "id": "task04.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — trzy publikacje i trzy bity efektu", + "content_html": "

Każda usługa ma licznik ISR, payload i flagę. Main ma osobny licznik konsumpcji. Bity OUT 0,1,2 reprezentują odpowiednio efekt GPIO, UART i timera, więc końcowe 0x7 dowodzi wykonania trzech gałęzi bez ukrywania ich w jednej sumie.

", + "steps": [] + }, + { + "id": "task04.a3", + "kind": "block", + "title": "A3 DISPATCH · AKTYWNE — slot 7 oraz external 16/18", + "content_html": "

Machine timer cause 7 trafia bezpośrednio do isr_machine_timer i wraca przez mret. Machine external vector trafia do wspólnego dispatchera; meinext wybiera wpis 16 dla UART albo 18 dla GPIO i wykonuje jalr.

", + "steps": [] + }, + { + "id": "task04.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — efekt dopiero po konsumpcji flagi", + "content_html": "

UART handler publikuje U, GPIO handler high, a timer handler tick. Żaden ISR nie ustawia aplikacyjnego bitu OUT. Superloop atomowo zabiera flagę i dopiero jego trzy gałęzie ustawiają 0x2, 0x1 i 0x4.

", + "steps": [] + }, + { + "id": "task04.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — source → pending → dispatch → ISR → main", + "content_html": "

Timer: comparator→MTIP→slot7→tick flag→bit2. UART: RX FIFO→IRQ16→external dispatcher→read DATA i flag→bit1. GPIO: edge→PENDING→IRQ18→dispatcher→W1C i flag→bit0. Main używa WFI tylko wtedy, gdy nadal brakuje któregoś efektu.

", + "steps": [] + }, + { + "id": "task04.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — trzy niezależne PRODUCED/CONSUMED", + "content_html": "

Każda usługa przechodzi IDLE→PRODUCED w ISR i PRODUCED→CONSUMED w main. Stan końcowy wymaga trzech liczników konsumpcji równych 1. Flaga wraca do 0, ale licznik zachowuje dowód przejścia.

", + "steps": [] + }, + { + "id": "task04.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — cause 7, linie 16/18 i OUT 0x7", + "content_html": "

Raport daje timer count 1 i mcause 0x80000007, UART count 1/irq 0x10/byte 0x55, GPIO count 1/irq 0x12/high oraz trzy main actions po 1. OUT=0x7, a IN=0x17 dodaje widoczny wysoki pin wejściowy 0x10.

", + "steps": [] + }, + { + "id": "task04.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — ISR-to-main flags with an explicit ceiling", + "content_html": "

Jednokomórkowa flaga jest poprawna tylko wtedy, gdy wystarcza informacja co najmniej jedno zdarzenie. Nie zachowuje liczby ani kolejności wielu produkcji. Ten sufit jest powodem przejścia do kolejek i tasków FreeRTOS, a nie pretekstem do nazywania flagi kolejką.

", + "steps": [] + }, + { + "id": "task04.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task04.worksheet", + "kind": "block", + "title": "TASK04 · Zapis dowodu ucznia", + "content_html": "

1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Log RTL: timer, UART16, GPIO18 i efekty main \\noindent \\noindent 3. Dowód dwóch dispatcherów i końcowego OUT/IN \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + } + ], + "viewpoints": [], + "has_spread": false, + "has_allocator_model": false, + "dictionary": null, + "toc": [ + { + "id": "section-1-content", + "label": "1. 1 — Rejestr modelu nie jest fizycznym pinem" + }, + { + "id": "section-2-content", + "label": "2. 2 — Source, pending i enable to trzy różne fakty" + }, + { + "id": "section-3-content", + "label": "3. 3 — Debounce jest decyzją czasu w main" + }, + { + "id": "section-4-content", + "label": "4. 4 — Superloop jest granicą serii raw C" + }, + { + "id": "section-5-task01", + "label": "5. TASK01 — Polling DIR, OUT i IN" + }, + { + "id": "section-6-task02", + "label": "6. TASK02 — Rising edge, IRQ18 i W1C" + }, + { + "id": "section-7-task03", + "label": "7. TASK03 — Quiet-window debounce po trzech zboczach" + }, + { + "id": "section-8-task04", + "label": "8. TASK04 — Timer + UART16 + GPIO18 bez RTOS" + } + ] +} diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..8f9f9f5 --- /dev/null +++ b/web/index.html @@ -0,0 +1,15 @@ + + + + + + + Karta pracy + + + + +
+ + + diff --git a/web/style.css b/web/style.css new file mode 100644 index 0000000..8adf3e2 --- /dev/null +++ b/web/style.css @@ -0,0 +1,39 @@ + +:root{--ink:#111;--muted:#666;--line:#b9b9b9;--line-soft:#dddddd;--paper:#fff;--desk:#eeeeee;--og:#008000;--tech:#d36b00;--kw:#0018c8;--we:#e00000;--viewer-canvas-scale:1;--viewer-content-scale:1} +*{box-sizing:border-box} html{scroll-behavior:smooth} body{margin:0;background:var(--desk);color:var(--ink);font-family:"Latin Modern Roman","LM Roman 12",Georgia,"Times New Roman",serif;line-height:1.25} +.topbar{position:sticky;top:0;z-index:20;background:rgba(245,245,245,.94);border-bottom:1px solid #d0d0d0;padding:3px 0;font-family:system-ui,-apple-system,Segoe UI,sans-serif} +.topbar-inner{width:calc(100% - 8px);max-width:none;margin:0 4px;display:flex;align-items:center;justify-content:space-between;gap:6px}.topbar details{min-width:0;flex:1}.topbar summary{cursor:pointer;font-size:16px;line-height:1.35;font-weight:650}.toc-links{display:flex;flex-wrap:wrap;gap:6px;margin-top:5px}.toc-links a{font-size:16px;color:#333;text-decoration:none;border:1px solid #ccc;background:white;border-radius:3px;padding:2px 5px}.viewer-zoom-controls{display:flex;align-items:center;gap:7px;flex:none}.viewer-zoom-status{font:600 16px/1.4 ui-monospace,SFMono-Regular,Consolas,monospace;color:#444;white-space:nowrap}.viewer-zoom-reset{border:1px solid #bbb;border-radius:3px;background:#fff;color:#333;padding:1px 6px;font:600 16px/1.35 system-ui,-apple-system,Segoe UI,sans-serif;cursor:pointer}.viewer-zoom-reset:hover{background:#eee}.viewer-zoom-reset:focus-visible{outline:2px solid #555;outline-offset:1px} +.paper{padding:18px 12px 44px;overflow-x:auto}.sheet{position:relative;width:210mm;min-height:297mm;margin:0 auto 18px;background:var(--paper);box-shadow:0 2px 12px rgba(0,0,0,.13);display:block;padding:0;overflow:visible;zoom:var(--viewer-canvas-scale)}.sheet-content{position:relative;width:100%;min-height:297mm;padding:13mm 21.5mm 15mm;transform:scale(var(--sheet-effective-scale,1));transform-origin:top left}.resource-header-enabled .sheet-content{padding-top:5mm}.sheet-content>.page-resource-header{margin-bottom:3mm} +@media(max-width:900px){.sheet{height:auto}}@media print{.sheet{height:auto}} +.pdf-main{min-width:0;width:100%}.running-header{display:flex;justify-content:space-between;gap:18px;align-items:flex-end;border-bottom:1px solid #111;padding-bottom:3px;margin-bottom:26px;font-size:15px}.running-header span{white-space:nowrap} +.hero h1{font-size:24px;line-height:1.15;margin:0 0 4px;border-bottom:1px solid #111;padding-bottom:4px}.hero .byline{float:right;margin-top:-31px;font-size:15px} +.meta{clear:both;display:grid;grid-template-columns:148px minmax(0,1fr);gap:4px 18px;padding:34px 0 24px;border-bottom:1px solid #111;font-size:17px}.meta dt{color:#333}.meta dd{margin:0;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace} +.front-scope{padding:0 0 3mm;border-bottom:1px solid var(--line-soft)}.front-scope h2{font-size:24px;line-height:1.15;margin:0 0 3mm}.front-scope p{font-size:16px} +.scope-table-wrap{margin:3mm 0;overflow:hidden}.scope-table{width:100%;border-collapse:collapse;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:1.22}.scope-table th,.scope-table td{border:0;border-bottom:1px solid #888;padding:4px 7px;text-align:left;vertical-align:top}.scope-table th{border-bottom:2px solid #555;background:#f3f3f3;font-weight:700}.scope-table th:first-child,.scope-table td:first-child{width:7%}.scope-table--task th:nth-child(2),.scope-table--task td:nth-child(2){width:11%}.scope-table--task th:nth-child(4),.scope-table--task td:nth-child(4){width:19%}.scope-table--task th:nth-child(5),.scope-table--task td:nth-child(5){width:14%}.scope-table--task th:nth-child(6),.scope-table--task td:nth-child(6){width:10%}.scope-table tr.scope-row--key td{font-weight:700;background:#f4f4f4;border-top:2px solid #111;border-bottom:2px solid #111}.scope-table tr.scope-row--key td:first-child{border-left:2px solid #111}.scope-table tr.scope-row--key td:last-child{border-right:2px solid #111}.scope-table td p{font:inherit;margin:0}.scope-table code{font-size:inherit}.scope-status{display:inline-block;white-space:nowrap;border:1px solid #aaa;border-radius:2px;padding:1px 4px;font-weight:600;background:#f5f5f5}.scope-status[data-status="in-progress"]{border-color:#307da1;background:#eaf5fa;color:#174f69}.scope-status[data-status="ready"]{border-color:#4c7d56;background:#edf6ee;color:#295b33}.scope-status[data-status="draft"],.scope-status[data-status="review"]{border-color:#9a7932;background:#faf4e5;color:#694f16}.scope-status[data-status="blocked"]{border-color:#9c4b4b;background:#faeded;color:#712f2f} +.card-section h2{font-size:24px;line-height:1.15;margin:0 0 4mm}.section-heading{display:flex;align-items:flex-start;gap:0}.section-heading .section-index{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:23px;margin-right:12mm;font-weight:400}.section-heading .section-title{min-width:0}.task-identity{margin-left:auto;padding-left:22px;text-align:right;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:10px;line-height:1.25;color:#555;white-space:nowrap}.task-identity strong,.task-identity-name,.task-identity code{display:block}.task-identity strong{font-size:12px;color:#111}.task-identity-name{max-width:240px;overflow:hidden;text-overflow:ellipsis}.task-identity code{font-size:9px;color:#777} +p{font-size:16px;margin:0 0 3mm}.pdf-main ul{font-size:16px;margin:2mm 0 3mm 7mm;padding:0}.pdf-main li{margin:1.2mm 0} +.pdf-margin{position:absolute;top:34mm;width:18mm;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:5px;line-height:1.12;color:#333;max-height:245mm;overflow:hidden}.pdf-margin.left{left:2mm;text-align:left}.pdf-margin.right{right:2mm;text-align:left} +.margin-title{font-weight:700;color:#666;margin-bottom:3px;letter-spacing:.02em}.margin-list{display:flex;flex-direction:column;align-items:flex-start}.margin-tag{display:block;margin:0 0 1px;padding:0;border:0;background:transparent;font:inherit;line-height:inherit;text-align:left;cursor:pointer;margin-left:var(--indent)}.margin-tag.we{color:var(--we)}.margin-tag.og,.margin-tag.tech{color:var(--og)}.margin-tag.kw{color:var(--kw)}.margin-tag .local{color:#777}.margin-tag:hover{text-decoration:underline}.margin-empty{color:#aaa} +.step-map{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:1.3;color:#5c5c5c;background:transparent;border:0;border-top:1px solid #cfcfcf;border-bottom:1px solid #e0e0e0;border-radius:0;padding:8px 0;margin:0 0 16px}.step-map summary{cursor:pointer;font-weight:400;color:#555} +.tree-legend{display:flex;flex-wrap:wrap;gap:4px;margin:7px 0}.steps{display:grid;gap:6px}.step-row{border-top:1px dashed #c9c9c9;padding-top:6px}.step-row:first-child{border-top:0}.step-title span{font-weight:700;margin-right:7px}.step-trees{display:flex;flex-wrap:wrap;gap:4px;margin-top:3px}.step-refs{display:flex;flex-wrap:wrap;gap:6px;margin-top:3px}.step-refs a{font-size:10px;color:#666} +.tree-token{font:10px/1 "Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;border:1px solid #c8c8c8;background:#fff;border-radius:3px;padding:3px 5px;cursor:pointer}.tree-token.active{background:#111;color:white;border-color:#111} +.equation{display:grid;grid-template-columns:1fr auto;align-items:center;gap:14px;margin:18px 0;padding:4px 0;background:transparent;border:0}.equation .display{font-size:17px}.equation-number{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:15px} +figure{margin:24px 0;text-align:center}figure img{max-width:100%;display:block;margin:0 auto;border:0;border-radius:0}figcaption{font-size:14px;color:#444;margin-top:8px;text-align:left}.card-asset.asset-screenshot img{border:1px solid #aaa}.card-asset a{display:block;cursor:zoom-in} +.table-wrap{overflow:auto;margin:14px 0}table{border-collapse:collapse;width:100%;font-size:16px}th,td{border:1px solid #111;padding:5px 8px;text-align:left;vertical-align:top}th{font-weight:400;background:white} +.empty-check{display:inline-block;width:1em;height:1em;border:1px solid #111;vertical-align:-.12em}.answer-line,.dotfill{display:block;border-bottom:1px dotted #111;height:1.45em;min-width:10em}.write-row{display:block;min-height:2.8em} +code{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace}.tasks{font-size:16px}.task-legacy{margin:2.5mm 0}.task-legacy>strong{display:block;font:700 10px/1.2 "Latin Modern Mono",ui-monospace,monospace;color:#555}.task-flow{border:1px solid #222;margin:1mm 0 2mm;background:#fff}.task-flow-header{display:grid;grid-template-columns:auto 1fr auto;align-items:baseline;gap:6px;padding:5px 7px;background:#eaeaea;border-bottom:1px solid #222}.task-flow-header span{font:700 10px/1.2 "Latin Modern Mono",ui-monospace,monospace;color:#222}.task-flow-header h3{font-size:18px;margin:0}.task-flow-header code{font-size:8px;color:#555}.task-block{margin:6px 7px;padding:5px 6px;border:1px solid #777;background:#fff}.task-block header,.task-exercise header{display:flex;align-items:baseline;gap:5px;margin-bottom:3px}.task-block header span,.task-exercise header span{font:700 9px/1.2 "Latin Modern Mono",ui-monospace,monospace;text-transform:uppercase;color:#555}.task-block h4,.task-exercise h4{font-size:16px;margin:0}.block-steps{margin:4px 0 0 16px!important;padding:0;display:grid;gap:3px}.block-steps li{margin:0;border:1px solid #b9b9b9;padding:4px 5px;background:#fff}.block-steps li::marker{font-family:"Latin Modern Mono",ui-monospace,monospace;font-weight:700}.block-steps li p:last-child{margin-bottom:0}.task-exercise{margin:6px 7px;border:1px solid #777;border-left:1px solid #222;padding:5px 6px;background:#fafafa}.task-exercise header{flex-wrap:wrap}.exercise-based-on{margin-left:auto;font-size:8px;color:#777}.exercise-evidence{border-top:1px dashed #bbb;margin-top:5px;padding-top:4px}.exercise-evidence>strong{font-size:11px;text-transform:uppercase}.exercise-criterion{font-size:13px;margin:4px 0 0}.task-flow>footer{padding:5px 7px;border-top:1px solid #222;font-size:12px;background:#f6f6f6}.task-conclusion{margin:8px 0;padding:7px 9px;border:1px solid #315f78;background:#f3f9fc}.task-conclusion>strong{display:block;margin-bottom:3px;font:700 10px/1.2 "Latin Modern Mono",ui-monospace,monospace;color:#315f78}.task-conclusion p{margin:0}.we-block{border-top:1px solid #ddd;padding:8px 0}.we-block summary{cursor:pointer}.dictionary-sheet .pdf-margin{display:none} +.inspector{position:fixed;right:14px;bottom:14px;width:min(360px,calc(100vw - 28px));max-height:46vh;overflow:auto;background:white;border:1px solid #cfcfcf;box-shadow:0 4px 18px rgba(0,0,0,.18);border-radius:6px;padding:12px;font-family:system-ui,-apple-system,Segoe UI,sans-serif;font-size:13px;z-index:30}.inspector h2{font-size:14px;margin:0 0 8px}.inspector .empty{color:#777}.tree-card h3{font-size:15px;margin:6px 0}.tree-card code{display:inline-block;margin:4px 0}.tree-card .line{font-weight:700}.tree-card .line.OG{color:var(--og)}.tree-card .line.TECH{color:var(--tech)}.kw-list{padding-left:18px}.kw-list code{color:var(--kw)} +@media(max-width:900px){.sheet{display:block;min-height:0}.sheet-content{min-height:0;padding:26px 18px}.pdf-margin{position:static;max-height:none;overflow:visible;margin:10px 0;padding:8px;border:1px solid #ddd}.pdf-margin.left{border-left:3px solid var(--tech)}.pdf-margin.right{border-left:3px solid var(--og)}.hero .byline{float:none;margin:0 0 14px}.meta{grid-template-columns:1fr}.section-heading{flex-wrap:wrap}.task-identity{width:100%;padding:6px 0 0}.inspector{position:static;width:auto;max-height:none;margin:0 12px 18px}.topbar{position:sticky;top:0}.viewer-zoom-status{font-size:16px}} +@media print{html,body{background:white}.topbar,.inspector{display:none}.paper{padding:0}.sheet{position:relative;display:block;width:auto;min-height:0;margin:0;box-shadow:none;break-after:page;padding:0;overflow:visible;zoom:1!important}.sheet-content{position:relative;width:auto;min-height:0;padding:0;transform:none!important}.sheet:last-child{break-after:auto}.resource-header-enabled .sheet-content{padding:0}.sheet-content>.page-resource-header,.sheet-content>.page-resource-footer{display:none!important}.pdf-margin{position:absolute;top:0;width:18mm;max-height:none;overflow:hidden;margin:0;padding:0;border:0}.pdf-margin.left{left:-19.5mm}.pdf-margin.right{right:-19.5mm}.task-block,.task-exercise,.block-steps li,figure{break-inside:avoid}} + +.page-resource-header{width:100%;height:24mm;min-height:24mm;max-height:24mm;background:#fff;color:#111;overflow:hidden;font-family:ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;line-height:1.08} +.resource-header-table{width:100%;height:100%;border-collapse:collapse;table-layout:fixed;border:1px solid #111}.resource-header-table>tbody>tr{height:100%}.resource-header-center{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-header-grid{display:grid;grid-template-rows:3fr 3fr 3fr 2fr 2fr;width:100%;height:100%}.resource-header-row{display:grid;min-width:0;min-height:0}.resource-header-field{display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;gap:.08mm;min-width:0;padding:.28mm .55mm;border-right:1px solid #888;border-bottom:1px solid #aaa;overflow:hidden;white-space:nowrap}.resource-header-row .resource-header-field:last-child{border-right:0}.resource-header-row:last-child .resource-header-field{border-bottom:0}.resource-header-field a{display:flex;flex-direction:column;align-items:flex-start;gap:.08mm;min-width:0;color:#111;text-decoration:none}.resource-label{align-self:flex-start;font:800 3.2pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;text-transform:uppercase;flex:none}.resource-value{align-self:flex-end;max-width:100%;text-align:right;font:700 6.4pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.resource-header-field--title .resource-value{font-size:7.7pt;font-weight:800}.resource-header-field--emphasis .resource-value{font-size:6.6pt;font-weight:800}.resource-header-field--compact{gap:.05mm;padding:.2mm .2mm}.resource-header-field--compact .resource-label{font-size:2.85pt}.resource-header-field--compact .resource-value{font-size:4.45pt}.resource-header-field--identity{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:.15mm;padding:.12mm .45mm;font:700 3.55pt/1.1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--identity>span{display:flex;align-items:baseline;gap:.3mm;min-width:0}.resource-header-field--identity b{font-weight:800;flex:none}.resource-header-field--identity .resource-identity-value{margin-left:auto;text-align:right}.resource-header-field--identity .resource-author{margin-left:auto;text-align:right}.resource-header-field--url-row{display:flex;align-items:stretch;justify-content:center;padding:.2mm .55mm}.resource-header-field--url-row a{display:block;overflow:hidden;text-overflow:clip;font:700 4.9pt/1.05 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--url-row b{font-weight:800} +.resource-qr-cell{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-qr-cell--left{border-right:1px solid #777}.resource-qr-cell--right{border-left:1px solid #777}.resource-qr{box-sizing:border-box;width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:.4mm;color:#333;text-decoration:none}.resource-qr .title-qr{display:block;width:22mm;height:22mm;max-width:22mm;max-height:22mm;flex:none}.resource-qr-empty{text-align:center}.resource-qr-empty span,.resource-qr-empty strong{display:block;font:600 5pt/1.15 ui-monospace,SFMono-Regular,Consolas,monospace} + +@page{ + size:A4; + margin:29mm 21.5mm 5mm; + @top-left{content:"";width:24mm;height:24mm;box-sizing:border-box;padding:0;border:1px solid #111;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:22mm 22mm;vertical-align:middle;text-align:center;font:0/0 sans-serif;color:transparent;background-image:url("data:image/svg+xml;base64,PHN2ZyBjbGFzcz0idGl0bGUtcXIiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iS29kIFFSOiBodHRwczovL3pzbC1naXRlYS5tcGFiaS5wbC9lZHUtaW5mL2xhYi1ydjMyaS1jLWdwaW8tZWRnZXMtZGVib3VuY2UiIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgd2lkdGg9Jzg1LjAzOTE5NnB0JyBoZWlnaHQ9Jzg1LjAzOTE5NnB0JyB2aWV3Qm94PSctNzIuMDAwMDA0IC03Mi4wMDAwMDQgODUuMDM5MTk2IDg1LjAzOTE5Nic+CjxnIGlkPSdwYWdlMSc+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU5LjExNTI3OCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM1LjkyMjc2OScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMy4zNDU4MjQnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTUuMzA3MjA3JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEyLjczMDI2MScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNS4zMDgzNTYnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02OS40MjMwNTknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctNjkuNDIzMDU5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUxLjM4NDQ0MicgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00OC44MDc0OTYnIHk9Jy02OS40MjMwNTknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSctNjkuNDIzMDU5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM1LjkyMjc2OScgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMy4zNDU4MjQnIHk9Jy02OS40MjMwNTknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzAuNzY4ODc5JyB5PSctNjkuNDIzMDU5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy02OS40MjMwNTknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTIuNzMwMjYxJyB5PSctNjkuNDIzMDU5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTY5LjQyMzA1OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02Ni44NDYxMTQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy02Ni44NDYxMTQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUxLjM4NDQ0MicgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9Jy02Ni44NDYxMTQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIzLjAzODA0MycgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9Jy02Ni44NDYxMTQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nLTY2Ljg0NjExNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzUuMzA4MzU2JyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNjYuODQ2MTE0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTYxLjY5MjIyMycgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM1LjkyMjc2OScgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMy4zNDU4MjQnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjMuMDM4MDQzJyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIwLjQ2MTA5NycgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSctNjQuMjY5MTY4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy02NC4yNjkxNjgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc1LjMwODM1NicgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTY0LjI2OTE2OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUxLjM4NDQ0MicgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00OC44MDc0OTYnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzMuMzQ1ODI0JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjUuNjE0OTg4JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIwLjQ2MTA5NycgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTYxLjY5MjIyMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctNjEuNjkyMjIzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNS4zMDgzNTYnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScxMC40NjIyNDcnIHk9Jy02MS42OTIyMjMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNTkuMTE1Mjc4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU2LjUzODMzMicgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9Jy01OS4xMTUyNzgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSctNTkuMTE1Mjc4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctNTkuMTE1Mjc4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM1LjkyMjc2OScgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMy4zNDU4MjQnIHk9Jy01OS4xMTUyNzgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzAuNzY4ODc5JyB5PSctNTkuMTE1Mjc4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy01OS4xMTUyNzgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctNTkuMTE1Mjc4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTU5LjExNTI3OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU5LjExNTI3OCcgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ2LjIzMDU1MScgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzAuNzY4ODc5JyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTUuMzA3MjA3JyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctNTYuNTM4MzMyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNS4zMDgzNTYnIHk9Jy01Ni41MzgzMzInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTU2LjUzODMzMicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9Jy01My45NjEzODcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSctNTMuOTYxMzg3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQzLjY1MzYwNScgeT0nLTUzLjk2MTM4NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMy4zNDU4MjQnIHk9Jy01My45NjEzODcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctNTMuOTYxMzg3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTUzLjk2MTM4NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy01My45NjEzODcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctNTMuOTYxMzg3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTUzLjk2MTM4NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy01My45NjEzODcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctNTMuOTYxMzg3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02OS40MjMwNTknIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU2LjUzODMzMicgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01My45NjEzODcnIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzMuMzQ1ODI0JyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTUxLjM4NDQ0MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzUuMzA4MzU2JyB5PSctNTEuMzg0NDQyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9Jy01MS4zODQ0NDInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY5LjQyMzA1OScgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU5LjExNTI3OCcgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00OC44MDc0OTYnIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy00OC44MDc0OTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTUuMzA3MjA3JyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03LjU3NjM3MScgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTQ4LjgwNzQ5NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNDguODA3NDk2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02OS40MjMwNTknIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTYxLjY5MjIyMycgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01OS4xMTUyNzgnIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUzLjk2MTM4NycgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00My42NTM2MDUnIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDEuMDc2NjYnIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzAuNzY4ODc5JyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjMuMDM4MDQzJyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIwLjQ2MTA5NycgeT0nLTQ2LjIzMDU1MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctNDYuMjMwNTUxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScxMC40NjIyNDcnIHk9Jy00Ni4yMzA1NTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY5LjQyMzA1OScgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy00My42NTM2MDUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTkuMTE1Mjc4JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ni4yMzA1NTEnIHk9Jy00My42NTM2MDUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy00My42NTM2MDUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTQzLjY1MzYwNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzcuODg1MzAxJyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNDMuNjUzNjA1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY5LjQyMzA1OScgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU2LjUzODMzMicgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUxLjM4NDQ0MicgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ2LjIzMDU1MScgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQzLjY1MzYwNScgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcuNTc2MzcxJyB5PSctNDEuMDc2NjYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9Jy00MS4wNzY2NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PSctNDEuMDc2NjYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nLTQxLjA3NjY2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNDEuMDc2NjYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQzLjY1MzYwNScgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjMuMDM4MDQzJyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIwLjQ2MTA5NycgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctMzguNDk5NzE1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNS4zMDgzNTYnIHk9Jy0zOC40OTk3MTUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTM4LjQ5OTcxNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTkuMTE1Mjc4JyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU2LjUzODMzMicgeT0nLTM1LjkyMjc2OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01My45NjEzODcnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTM1LjkyMjc2OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00My42NTM2MDUnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTM1LjkyMjc2OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSctMzUuOTIyNzY5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy0zNS45MjI3NjknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTM1LjkyMjc2OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01OS4xMTUyNzgnIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTMuOTYxMzg3JyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQzLjY1MzYwNScgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMzLjM0NTgyNCcgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTUuMzA3MjA3JyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTMzLjM0NTgyNCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctMzMuMzQ1ODI0JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9Jy0zMy4zNDU4MjQnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY5LjQyMzA1OScgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU5LjExNTI3OCcgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjMuMDM4MDQzJyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTIuNzMwMjYxJyB5PSctMzAuNzY4ODc5JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03LjU3NjM3MScgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTMwLjc2ODg3OScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScxMC40NjIyNDcnIHk9Jy0zMC43Njg4NzknIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctMjguMTkxOTMzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTI4LjE5MTkzMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01OS4xMTUyNzgnIHk9Jy0yOC4xOTE5MzMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctMjguMTkxOTMzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTI4LjE5MTkzMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ni4yMzA1NTEnIHk9Jy0yOC4xOTE5MzMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDEuMDc2NjYnIHk9Jy0yOC4xOTE5MzMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctMjguMTkxOTMzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTI4LjE5MTkzMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy0yOC4xOTE5MzMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNy41NzYzNzEnIHk9Jy0yOC4xOTE5MzMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nLTI4LjE5MTkzMycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzUuMzA4MzU2JyB5PSctMjguMTkxOTMzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTI1LjYxNDk4OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9Jy0yNS42MTQ5ODgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTYxLjY5MjIyMycgeT0nLTI1LjYxNDk4OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01OS4xMTUyNzgnIHk9Jy0yNS42MTQ5ODgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTI1LjYxNDk4OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ni4yMzA1NTEnIHk9Jy0yNS42MTQ5ODgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTI1LjYxNDk4OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy0yNS42MTQ5ODgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTUuMzA3MjA3JyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcuNTc2MzcxJyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9Jy0yNS42MTQ5ODgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nLTI1LjYxNDk4OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzcuODg1MzAxJyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctMjUuNjE0OTg4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTIzLjAzODA0MycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01My45NjEzODcnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTIzLjAzODA0MycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjAuNDYxMDk3JyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTIzLjAzODA0MycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSctMjMuMDM4MDQzJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy0yMy4wMzgwNDMnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMjAuNDYxMDk3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY5LjQyMzA1OScgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9Jy0yMC40NjEwOTcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctMjAuNDYxMDk3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ2LjIzMDU1MScgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy0yMC40NjEwOTcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzUuOTIyNzY5JyB5PSctMjAuNDYxMDk3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy0yMC40NjEwOTcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctMjAuNDYxMDk3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03LjU3NjM3MScgeT0nLTIwLjQ2MTA5NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctMjAuNDYxMDk3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9Jy0yMC40NjEwOTcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctMTcuODg0MTUyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTkuMTE1Mjc4JyB5PSctMTcuODg0MTUyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTUzLjk2MTM4NycgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ni4yMzA1NTEnIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSctMTcuODg0MTUyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctMTcuODg0MTUyJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNy41NzYzNzEnIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9Jy0xNy44ODQxNTInIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc1LjMwODM1NicgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTE3Ljg4NDE1MicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTYxLjY5MjIyMycgeT0nLTE1LjMwNzIwNycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTMuOTYxMzg3JyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nLTE1LjMwNzIwNycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjUuNjE0OTg4JyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIzLjAzODA0MycgeT0nLTE1LjMwNzIwNycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE1LjMwNzIwNycgeT0nLTE1LjMwNzIwNycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy0xNS4zMDcyMDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMi40MjI0OCcgeT0nLTE1LjMwNzIwNycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctMTUuMzA3MjA3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY5LjQyMzA1OScgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctMTIuNzMwMjYxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU5LjExNTI3OCcgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00OC44MDc0OTYnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzguNDk5NzE1JyB5PSctMTIuNzMwMjYxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMzLjM0NTgyNCcgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjAuNDYxMDk3JyB5PSctMTIuNzMwMjYxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNC45OTk0MjUnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSctMTIuNzMwMjYxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy0xMi43MzAyNjEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLTEyLjczMDI2MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTYxLjY5MjIyMycgeT0nLTEwLjE1MzMxNicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDYuMjMwNTUxJyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM4LjQ5OTcxNScgeT0nLTEwLjE1MzMxNicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIwLjQ2MTA5NycgeT0nLTEwLjE1MzMxNicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcuNTc2MzcxJyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSctMTAuMTUzMzE2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy0xMC4xNTMzMTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctNy41NzYzNzEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSctNy41NzYzNzEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSctNy41NzYzNzEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDEuMDc2NjYnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNS4zMDcyMDcnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9Jy03LjU3NjM3MScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PSctNy41NzYzNzEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc1LjMwODM1NicgeT0nLTcuNTc2MzcxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctNy41NzYzNzEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjkuNDIzMDU5JyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjEuNjkyMjIzJyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTkuMTE1Mjc4JyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDEuMDc2NjYnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMC40NjEwOTcnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMC4xNTMzMTYnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00Ljk5OTQyNScgeT0nLTQuOTk5NDI1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nLTQuOTk5NDI1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy00Ljk5OTQyNScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzcuODg1MzAxJyB5PSctNC45OTk0MjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQxLjA3NjY2JyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM1LjkyMjc2OScgeT0nLTIuNDIyNDgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzMuMzQ1ODI0JyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zMC43Njg4NzknIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nLTIuNDIyNDgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjUuNjE0OTg4JyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yMy4wMzgwNDMnIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nLTIuNDIyNDgnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9Jy0yLjQyMjQ4JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PSctMi40MjI0OCcgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjYuODQ2MTE0JyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY0LjI2OTE2OCcgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ2LjIzMDU1MScgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00My42NTM2MDUnIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMzguNDk5NzE1JyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM1LjkyMjc2OScgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yOC4xOTE5MzMnIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjMuMDM4MDQzJyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIwLjQ2MTA5NycgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTAuMTUzMzE2JyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcuNTc2MzcxJyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PScuMTU0NDY1JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMi43MzE0MTEnIHk9Jy4xNTQ0NjUnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzEwLjQ2MjI0NycgeT0nLjE1NDQ2NScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU2LjUzODMzMicgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTEuMzg0NDQyJyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zNS45MjI3NjknIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nMi43MzE0MTEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQuOTk5NDI1JyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yLjQyMjQ4JyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy4xNTQ0NjUnIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nNy44ODUzMDEnIHk9JzIuNzMxNDExJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nMTAuNDYyMjQ3JyB5PScyLjczMTQxMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzUuMzA4MzU2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTY2Ljg0NjExNCcgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNjQuMjY5MTY4JyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9JzUuMzA4MzU2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTU2LjUzODMzMicgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDguODA3NDk2JyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9JzUuMzA4MzU2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI4LjE5MTkzMycgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjAuNDYxMDk3JyB5PSc1LjMwODM1NicgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xNy44ODQxNTInIHk9JzUuMzA4MzU2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNy41NzYzNzEnIHk9JzUuMzA4MzU2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLjE1NDQ2NScgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScyLjczMTQxMScgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nNS4zMDgzNTYnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScxMC40NjIyNDcnIHk9JzUuMzA4MzU2JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nNy44ODUzMDEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNTYuNTM4MzMyJyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9JzcuODg1MzAxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTQ4LjgwNzQ5NicgeT0nNy44ODUzMDEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctNDMuNjUzNjA1JyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0zOC40OTk3MTUnIHk9JzcuODg1MzAxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMzLjM0NTgyNCcgeT0nNy44ODUzMDEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMjguMTkxOTMzJyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0yNS42MTQ5ODgnIHk9JzcuODg1MzAxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIwLjQ2MTA5NycgeT0nNy44ODUzMDEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMTcuODg0MTUyJyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy0xMi43MzAyNjEnIHk9JzcuODg1MzAxJyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nNy44ODUzMDEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSctMi40MjI0OCcgeT0nNy44ODUzMDEnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PScuMTU0NDY1JyB5PSc3Ljg4NTMwMScgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02OS40MjMwNTknIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02Ni44NDYxMTQnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02NC4yNjkxNjgnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy02MS42OTIyMjMnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01OS4xMTUyNzgnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01Ni41MzgzMzInIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy01MS4zODQ0NDInIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00My42NTM2MDUnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9Jy00MS4wNzY2NicgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTM1LjkyMjc2OScgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMzLjM0NTgyNCcgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTMwLjc2ODg3OScgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTI1LjYxNDk4OCcgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIzLjAzODA0MycgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTE3Ljg4NDE1MicgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTEwLjE1MzMxNicgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPHJlY3QgeD0nLTIuNDIyNDgnIHk9JzEwLjQ2MjI0NycgaGVpZ2h0PScyLjU3Njk0NScgd2lkdGg9JzIuNTc2OTQ1Jy8+CjxyZWN0IHg9JzIuNzMxNDExJyB5PScxMC40NjIyNDcnIGhlaWdodD0nMi41NzY5NDUnIHdpZHRoPScyLjU3Njk0NScvPgo8cmVjdCB4PSc3Ljg4NTMwMScgeT0nMTAuNDYyMjQ3JyBoZWlnaHQ9JzIuNTc2OTQ1JyB3aWR0aD0nMi41NzY5NDUnLz4KPC9nPgo8L3N2Zz4=")} + @top-center{content:" TITLE VER. DATETIME \A \A GPIO, zbocza i quiet-window debounce v00.01 2026-07-20T00:00:00+02:00 \A PROJECT SERIES CARD SHEET \A \A Freestanding C na RV32I C · Freestanding RV32I and K&R 13/13 " counter(page) "/" counter(pages) " \A SUBJ. PROG. CORE SCOPE LEVEL POS. GITEA UUID 72e2cbba-4658-5de2-a0dc-8b600ee3f7b0\A CARD UUID 29e6021a-d033-5fbe-a5fc-ec03442ac68a AUTHOR M. Pabiszczak\A Inf. — — — — — \A \A GITEA https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-gpio-edges-debounce \A \A HTML https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/29e6021a-d033-5fbe-a5fc-ec03442ac68a ";width:119mm;height:24mm;box-sizing:border-box;padding:.2mm .7mm 0;border-block:1px solid #111;background-color:#fff;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMTkgMjQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxyZWN0IHdpZHRoPSIxMTkiIGhlaWdodD0iMjQiIGZpbGw9IndoaXRlIi8+PHBhdGggZD0iTTAgNS41Mzg0NkgxMTkgTTAgMTEuMDc2OUgxMTkgTTAgMTYuNjE1NEgxMTkgTTAgMjAuMzA3N0gxMTkgTTU5LjUgMFY1LjUzODQ2IE03Ny41IDBWNS41Mzg0NiBNNTkuNSA1LjUzODQ2VjExLjA3NjkgTTg5LjUgNS41Mzg0NlYxMS4wNzY5IE0xMDYuNSA1LjUzODQ2VjExLjA3NjkgTTcgMTEuMDc2OVYxNi42MTU0IE0xMyAxMS4wNzY5VjE2LjYxNTQgTTMwLjUgMTEuMDc2OVYxNi42MTU0IE00MS41IDExLjA3NjlWMTYuNjE1NCBNNTAuNSAxMS4wNzY5VjE2LjYxNTQgTTU5LjUgMTEuMDc2OVYxNi42MTU0IiBmaWxsPSJub25lIiBzdHJva2U9IiM4ODgiIHN0cm9rZS13aWR0aD0iMC4xNCIvPjwvc3ZnPg==");background-repeat:no-repeat;background-position:center;background-size:100% 100%;white-space:pre;vertical-align:top;text-align:left;font:700 5.2px/1.81538mm ui-monospace,SFMono-Regular,Consolas,monospace;letter-spacing:-.02px;color:#111;overflow:hidden} + @top-right{content:"";width:24mm;height:24mm;box-sizing:border-box;padding:0;border:1px solid #111;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:22mm 22mm;vertical-align:middle;text-align:center;font:0/0 sans-serif;color:transparent;background-image:url("data:image/svg+xml;base64,PHN2ZyBjbGFzcz0idGl0bGUtcXIiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iS29kIFFSOiBodHRwczovL2RjZTdmYjlkLTdiMmYtNWQ0OS05NmEyLTNhMzBkMzA3MGI4NC5tcGFiaS5wbC8yOWU2MDIxYS1kMDMzLTVmYmUtYTVmYy1lYzAzNDQyYWM2OGEiIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgd2lkdGg9Jzg1LjAzOTIyN3B0JyBoZWlnaHQ9Jzg1LjAzOTIyN3B0JyB2aWV3Qm94PSctNzIuMDAwMDA0IC03Mi4wMDAwMDQgODUuMDM5MjI3IDg1LjAzOTIyNyc+CjxnIGlkPSdwYWdlMSc+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTU1LjkxMTUwMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTU1LjkxMTUwMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTU1LjkxMTUwMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTU1LjkxMTUwMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Ni43MTgwNzInIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Ni43MTgwNzInIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjAuNTA4MjE3JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTMwLjYyOTU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTMwLjYyOTU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Ni43MTgwNzInIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01LjM0NzYzNycgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctOS45NDQzNTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01LjM0NzYzNycgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMyLjkyNzkyNycgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMyLjkyNzkyNycgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjAuNTA4MjE3JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8L2c+Cjwvc3ZnPg==")} +}