Cargo.lock | 69 +++ apps/ios/Snowbound.xcodeproj/project.pbxproj | 4 - apps/ios/Snowbound/App.swift | 21 +- apps/ios/Snowbound/CanvasView.swift | 184 ++++++-- apps/ios/Snowbound/ICloud.swift | 6 + apps/ios/Snowbound/Lists.swift | 141 ++++-- apps/ios/Snowbound/Notebooks.swift | 110 +++-- apps/ios/Snowbound/PageViewController.swift | 48 ++- apps/ios/Snowbound/Prototypes.swift | 241 +++++++++++ apps/ios/Snowbound/Script.swift | 8 +- apps/ios/Snowbound/Server.swift | 6 - arc/canvas.md | 5 + arc/file-format.md | 18 +- arc/platforms.md | 28 +- arc/sync.md | 10 +- corpus/m6/native-page-direction-03/ORACLE.md | 7 +- corpus/notebook-package/README.md | 27 ++ corpus/notebook-package/candidate/Packed.onepkg | Bin 0 -> 3416 bytes corpus/notebook-package/candidate/Unpacked/Group/Inner.one | Bin 0 -> 6032 bytes corpus/notebook-package/candidate/Unpacked/Group/Open Notebook.onetoc2 | Bin 0 -> 4120 bytes corpus/notebook-package/candidate/Unpacked/New Section 1.one | Bin 0 -> 6024 bytes corpus/notebook-package/candidate/Unpacked/Open Notebook.onetoc2 | Bin 0 -> 6120 bytes corpus/notebook-package/cold/commands.jsonl | 3 + corpus/notebook-package/cold/machine.json | 1 + corpus/notebook-package/cold/notebook/Group/Inner.one | Bin 0 -> 6032 bytes corpus/notebook-package/cold/notebook/Group/Open Notebook.onetoc2 | Bin 0 -> 4120 bytes corpus/notebook-package/cold/notebook/New Section 1.one | Bin 0 -> 6024 bytes corpus/notebook-package/cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 6120 bytes corpus/notebook-package/cold/read/environment.json | 7 + corpus/notebook-package/cold/read/hierarchy.xml | 2 + corpus/notebook-package/cold/read/page-000.navigation.json | 13 + corpus/notebook-package/cold/read/page-000.png | Bin 0 -> 40349 bytes corpus/notebook-package/cold/read/page-000.xml | 2 + corpus/notebook-package/cold/read/page-001.navigation.json | 13 + corpus/notebook-package/cold/read/page-001.png | Bin 0 -> 40196 bytes corpus/notebook-package/cold/read/page-001.xml | 2 + corpus/notebook-package/cold/read/payloads.json | 3 + corpus/notebook-package/cold/run.json | 18 + corpus/notebook-package/cold/scripts/cold.ps1 | 27 ++ corpus/notebook-package/cold/scripts/read.ps1 | 144 +++++++ corpus/notebook-package/cold/source.json | 26 ++ corpus/notebook-package/cold/teardown.json | 1 + corpus/notebook-package/native/Lab.onepkg | Bin 0 -> 6309 bytes corpus/notebook-package/onenote-unpacked/hierarchy.xml | 2 + corpus/notebook-package/onenote-unpacked/unpack-dialog.png | Bin 0 -> 71668 bytes corpus/notebook-package/onenote-unpacked/unpacked.png | Bin 0 -> 43855 bytes corpus/notebook-package/save-as/candidate/Inner copy.one | Bin 0 -> 6032 bytes corpus/notebook-package/save-as/candidate/Inside.one | Bin 0 -> 6032 bytes corpus/notebook-package/save-as/cold/commands.jsonl | 3 + corpus/notebook-package/save-as/cold/machine.json | 1 + corpus/notebook-package/save-as/cold/notebook/Inner copy.one | Bin 0 -> 6032 bytes corpus/notebook-package/save-as/cold/notebook/Inside.one | Bin 0 -> 6032 bytes corpus/notebook-package/save-as/cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 4880 bytes corpus/notebook-package/save-as/cold/read/environment.json | 7 + corpus/notebook-package/save-as/cold/read/hierarchy.xml | 2 + corpus/notebook-package/save-as/cold/read/page-000.navigation.json | 13 + corpus/notebook-package/save-as/cold/read/page-000.png | Bin 0 -> 40347 bytes corpus/notebook-package/save-as/cold/read/page-000.xml | 2 + corpus/notebook-package/save-as/cold/read/page-001.navigation.json | 13 + corpus/notebook-package/save-as/cold/read/page-001.png | Bin 0 -> 40217 bytes corpus/notebook-package/save-as/cold/read/page-001.xml | 2 + corpus/notebook-package/save-as/cold/read/payloads.json | 3 + corpus/notebook-package/save-as/cold/run.json | 18 + corpus/notebook-package/save-as/cold/scripts/cold.ps1 | 27 ++ corpus/notebook-package/save-as/cold/scripts/read.ps1 | 144 +++++++ corpus/notebook-package/save-as/cold/source.json | 14 + corpus/notebook-package/save-as/cold/teardown.json | 1 + corpus/protected-edit/README.md | 4 +- corpus/protected-sections/README.md | 58 +++ corpus/protected-sections/candidate/notebook/Changed.one | Bin 0 -> 26248 bytes corpus/protected-sections/candidate/notebook/Conflicted.one | Bin 0 -> 44384 bytes corpus/protected-sections/candidate/notebook/Edited.one | Bin 0 -> 28952 bytes corpus/protected-sections/candidate/notebook/New Section 1.one | Bin 0 -> 6064 bytes corpus/protected-sections/candidate/notebook/Open Notebook.onetoc2 | Bin 0 -> 8520 bytes corpus/protected-sections/candidate/notebook/Protected.one | Bin 0 -> 22976 bytes corpus/protected-sections/candidate/notebook/Removed.one | Bin 0 -> 19656 bytes corpus/protected-sections/candidate/passwords.json | 7 + corpus/protected-sections/cold/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + corpus/protected-sections/cold/before-read/environment.json | 7 + corpus/protected-sections/cold/before-read/hierarchy.xml | 2 + corpus/protected-sections/cold/before-read/page-000.xml | 10 + corpus/protected-sections/cold/before-read/page-001.xml | 2 + corpus/protected-sections/cold/before-read/page-002.xml | 2 + corpus/protected-sections/cold/before-read/page-003.xml | 2 + corpus/protected-sections/cold/before-read/payloads.json | 10 + corpus/protected-sections/cold/commands.jsonl | 11 + corpus/protected-sections/cold/machine.json | 1 + corpus/protected-sections/cold/notebook/Changed.one | Bin 0 -> 29336 bytes corpus/protected-sections/cold/notebook/Conflicted.one | Bin 0 -> 47472 bytes corpus/protected-sections/cold/notebook/Edited.one | Bin 0 -> 41312 bytes corpus/protected-sections/cold/notebook/New Section 1.one | Bin 0 -> 7512 bytes corpus/protected-sections/cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 8520 bytes corpus/protected-sections/cold/notebook/Protected.one | Bin 0 -> 26064 bytes corpus/protected-sections/cold/notebook/Removed.one | Bin 0 -> 22560 bytes corpus/protected-sections/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + corpus/protected-sections/cold/read/environment.json | 7 + corpus/protected-sections/cold/read/hierarchy.xml | 2 + corpus/protected-sections/cold/read/page-000.xml | 13 + corpus/protected-sections/cold/read/page-001.xml | 11 + corpus/protected-sections/cold/read/page-002.xml | 2 + corpus/protected-sections/cold/read/page-003.xml | 2 + corpus/protected-sections/cold/read/page-004.xml | 2 + corpus/protected-sections/cold/read/page-005.xml | 10 + corpus/protected-sections/cold/read/page-006.xml | 2 + corpus/protected-sections/cold/read/page-007.xml | 2 + corpus/protected-sections/cold/read/page-008.xml | 2 + corpus/protected-sections/cold/read/page-009.xml | 10 + corpus/protected-sections/cold/read/page-010.xml | 2 + corpus/protected-sections/cold/read/page-011.xml | 2 + corpus/protected-sections/cold/read/page-012.xml | 2 + corpus/protected-sections/cold/read/page-013.xml | 2 + corpus/protected-sections/cold/read/page-014.xml | 2 + corpus/protected-sections/cold/read/page-015.xml | 11 + corpus/protected-sections/cold/read/payloads.json | 42 ++ corpus/protected-sections/cold/run.json | 18 + corpus/protected-sections/cold/scripts/cold.ps1 | 27 ++ corpus/protected-sections/cold/scripts/read.ps1 | 144 +++++++ corpus/protected-sections/cold/source.json | 44 ++ corpus/protected-sections/cold/teardown.json | 1 + corpus/protected-sections/cold/unlock-Changed.json | 13 + corpus/protected-sections/cold/unlock-Changed.png | Bin 0 -> 40416 bytes corpus/protected-sections/cold/unlock-Conflicted.json | 13 + corpus/protected-sections/cold/unlock-Conflicted.png | Bin 0 -> 40655 bytes corpus/protected-sections/cold/unlock-Edited.json | 13 + corpus/protected-sections/cold/unlock-Edited.png | Bin 0 -> 40619 bytes corpus/protected-sections/cold/unlock-Protected.json | 13 + corpus/protected-sections/cold/unlock-Protected.png | Bin 0 -> 40939 bytes corpus/protected-sections/manifest.json | 10 + corpus/protected-sections/native/changed.one | Bin 0 -> 27064 bytes corpus/protected-sections/native/observed/onenote-change-password.png | Bin 0 -> 60960 bytes corpus/protected-sections/native/observed/onenote-locked-page.png | Bin 0 -> 48538 bytes corpus/protected-sections/native/observed/onenote-options-lock-after.png | Bin 0 -> 52296 bytes corpus/protected-sections/native/observed/onenote-options-passwords.png | Bin 0 -> 49725 bytes corpus/protected-sections/native/observed/onenote-pane-protected.png | Bin 0 -> 57542 bytes corpus/protected-sections/native/observed/onenote-relocks-after-remote-password-change.png | Bin 0 -> 59276 bytes corpus/protected-sections/native/observed/onenote-remove-password.png | Bin 0 -> 60664 bytes corpus/protected-sections/native/observed/onenote-search-locked.png | Bin 0 -> 44611 bytes corpus/protected-sections/native/observed/onenote-set-password.png | Bin 0 -> 60679 bytes corpus/protected-sections/native/observed/onenote-tags-locked.png | Bin 0 -> 52933 bytes corpus/protected-sections/native/observed/onenote-tags-unlocked.png | Bin 0 -> 54819 bytes corpus/protected-sections/native/observed/onenote-unlock-dialog.png | Bin 0 -> 49704 bytes corpus/protected-sections/native/observed/onenote-unlock-wrong.png | Bin 0 -> 50432 bytes corpus/protected-sections/native/observed/onenote-unlocked-shows-locked-append.png | Bin 0 -> 64768 bytes corpus/protected-sections/native/protected.one | Bin 0 -> 25848 bytes corpus/protected-sections/native/removed.one | Bin 0 -> 20152 bytes corpus/protected-sections/native/snowbound-changed-then-onenote-edit.one | Bin 0 -> 30664 bytes corpus/protected-sections/source/synthetic.one | Bin 0 -> 31512 bytes corpus/recycle-bin-view/README.md | 19 + corpus/recycle-bin-view/candidate/after/New Section 1.one | Bin 0 -> 10768 bytes corpus/recycle-bin-view/candidate/after/OneNote_RecycleBin/OneNote_DeletedPages.one | Bin 0 -> 14816 bytes corpus/recycle-bin-view/candidate/after/OneNote_RecycleBin/Open Notebook.onetoc2 | Bin 0 -> 6440 bytes corpus/recycle-bin-view/candidate/after/Open Notebook.onetoc2 | Bin 0 -> 11160 bytes corpus/recycle-bin-view/candidate/after/Restored.one | Bin 0 -> 6120 bytes corpus/recycle-bin-view/candidate/before/New Section 1.one | Bin 0 -> 6024 bytes corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Back.one | Bin 0 -> 6072 bytes corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Copied.one | Bin 0 -> 6072 bytes corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Emptied.one | Bin 0 -> 6120 bytes corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/OneNote_DeletedPages.one | Bin 0 -> 10816 bytes corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Open Notebook.onetoc2 | Bin 0 -> 5880 bytes corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Purged.one | Bin 0 -> 6072 bytes corpus/recycle-bin-view/candidate/before/OneNote_RecycleBin/Restored.one | Bin 0 -> 6120 bytes corpus/recycle-bin-view/candidate/before/Open Notebook.onetoc2 | Bin 0 -> 10656 bytes corpus/recycle-bin-view/cold/after/commands.jsonl | 3 + corpus/recycle-bin-view/cold/after/machine.json | 1 + corpus/recycle-bin-view/cold/after/notebook/New Section 1.one | Bin 0 -> 10768 bytes corpus/recycle-bin-view/cold/after/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one | Bin 0 -> 14816 bytes corpus/recycle-bin-view/cold/after/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 | Bin 0 -> 6440 bytes corpus/recycle-bin-view/cold/after/notebook/Open Notebook.onetoc2 | Bin 0 -> 11160 bytes corpus/recycle-bin-view/cold/after/notebook/Restored.one | Bin 0 -> 6120 bytes corpus/recycle-bin-view/cold/after/read/environment.json | 7 + corpus/recycle-bin-view/cold/after/read/hierarchy.xml | 2 + corpus/recycle-bin-view/cold/after/read/page-000.navigation.json | 13 + corpus/recycle-bin-view/cold/after/read/page-000.png | Bin 0 -> 41556 bytes corpus/recycle-bin-view/cold/after/read/page-000.xml | 2 + corpus/recycle-bin-view/cold/after/read/page-001.navigation.json | 13 + corpus/recycle-bin-view/cold/after/read/page-001.png | Bin 0 -> 42087 bytes corpus/recycle-bin-view/cold/after/read/page-001.xml | 2 + corpus/recycle-bin-view/cold/after/read/page-002.navigation.json | 13 + corpus/recycle-bin-view/cold/after/read/page-002.png | Bin 0 -> 41199 bytes corpus/recycle-bin-view/cold/after/read/page-002.xml | 2 + corpus/recycle-bin-view/cold/after/read/page-003.navigation.json | 13 + corpus/recycle-bin-view/cold/after/read/page-003.png | Bin 0 -> 41982 bytes corpus/recycle-bin-view/cold/after/read/page-003.xml | 2 + corpus/recycle-bin-view/cold/after/read/payloads.json | 3 + corpus/recycle-bin-view/cold/after/run.json | 18 + corpus/recycle-bin-view/cold/after/scripts/cold.ps1 | 27 ++ corpus/recycle-bin-view/cold/after/scripts/read.ps1 | 144 +++++++ corpus/recycle-bin-view/cold/after/source.json | 32 ++ corpus/recycle-bin-view/cold/after/teardown.json | 1 + corpus/recycle-bin-view/cold/before/commands.jsonl | 3 + corpus/recycle-bin-view/cold/before/machine.json | 1 + corpus/recycle-bin-view/cold/before/notebook/New Section 1.one | Bin 0 -> 6024 bytes corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Back.one | Bin 0 -> 6072 bytes corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Copied.one | Bin 0 -> 6072 bytes corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Emptied.one | Bin 0 -> 6120 bytes corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/OneNote_DeletedPages.one | Bin 0 -> 10816 bytes corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Open Notebook.onetoc2 | Bin 0 -> 5880 bytes corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Purged.one | Bin 0 -> 6072 bytes corpus/recycle-bin-view/cold/before/notebook/OneNote_RecycleBin/Restored.one | Bin 0 -> 6120 bytes corpus/recycle-bin-view/cold/before/notebook/Open Notebook.onetoc2 | Bin 0 -> 10656 bytes corpus/recycle-bin-view/cold/before/read/environment.json | 7 + corpus/recycle-bin-view/cold/before/read/hierarchy.xml | 2 + corpus/recycle-bin-view/cold/before/read/page-000.navigation.json | 13 + corpus/recycle-bin-view/cold/before/read/page-000.png | Bin 0 -> 45162 bytes corpus/recycle-bin-view/cold/before/read/page-000.xml | 2 + corpus/recycle-bin-view/cold/before/read/page-001.navigation.json | 13 + corpus/recycle-bin-view/cold/before/read/page-001.png | Bin 0 -> 44960 bytes corpus/recycle-bin-view/cold/before/read/page-001.xml | 2 + corpus/recycle-bin-view/cold/before/read/page-002.navigation.json | 13 + corpus/recycle-bin-view/cold/before/read/page-002.png | Bin 0 -> 45643 bytes corpus/recycle-bin-view/cold/before/read/page-002.xml | 2 + corpus/recycle-bin-view/cold/before/read/page-003.navigation.json | 13 + corpus/recycle-bin-view/cold/before/read/page-003.png | Bin 0 -> 39793 bytes corpus/recycle-bin-view/cold/before/read/page-003.xml | 2 + corpus/recycle-bin-view/cold/before/read/page-004.navigation.json | 13 + corpus/recycle-bin-view/cold/before/read/page-004.png | Bin 0 -> 45220 bytes corpus/recycle-bin-view/cold/before/read/page-004.xml | 2 + corpus/recycle-bin-view/cold/before/read/page-005.navigation.json | 13 + corpus/recycle-bin-view/cold/before/read/page-005.png | Bin 0 -> 45709 bytes corpus/recycle-bin-view/cold/before/read/page-005.xml | 2 + corpus/recycle-bin-view/cold/before/read/page-006.navigation.json | 13 + corpus/recycle-bin-view/cold/before/read/page-006.png | Bin 0 -> 45579 bytes corpus/recycle-bin-view/cold/before/read/page-006.xml | 2 + corpus/recycle-bin-view/cold/before/read/page-007.navigation.json | 13 + corpus/recycle-bin-view/cold/before/read/page-007.png | Bin 0 -> 44905 bytes corpus/recycle-bin-view/cold/before/read/page-007.xml | 2 + corpus/recycle-bin-view/cold/before/read/page-008.navigation.json | 13 + corpus/recycle-bin-view/cold/before/read/page-008.png | Bin 0 -> 44843 bytes corpus/recycle-bin-view/cold/before/read/page-008.xml | 2 + corpus/recycle-bin-view/cold/before/read/payloads.json | 3 + corpus/recycle-bin-view/cold/before/run.json | 18 + corpus/recycle-bin-view/cold/before/scripts/cold.ps1 | 27 ++ corpus/recycle-bin-view/cold/before/scripts/read.ps1 | 144 +++++++ corpus/recycle-bin-view/cold/before/source.json | 56 +++ corpus/recycle-bin-view/cold/before/teardown.json | 1 + corpus/rtl-page/README.md | 19 + corpus/rtl-page/candidate/Open Notebook.onetoc2 | Bin 0 -> 1612 bytes corpus/rtl-page/candidate/synthetic.one | Bin 0 -> 45760 bytes corpus/rtl-page/cold/commands.jsonl | 3 + corpus/rtl-page/cold/machine.json | 1 + corpus/rtl-page/cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 3780 bytes corpus/rtl-page/cold/notebook/synthetic.one | Bin 0 -> 45760 bytes corpus/rtl-page/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment | 1 + corpus/rtl-page/cold/read/environment.json | 7 + corpus/rtl-page/cold/read/hierarchy.xml | 2 + corpus/rtl-page/cold/read/page-000.navigation.json | 13 + corpus/rtl-page/cold/read/page-000.png | Bin 0 -> 43273 bytes corpus/rtl-page/cold/read/page-000.xml | 31 ++ corpus/rtl-page/cold/read/payloads.json | 10 + corpus/rtl-page/cold/run.json | 18 + corpus/rtl-page/cold/scripts/cold.ps1 | 27 ++ corpus/rtl-page/cold/scripts/read.ps1 | 144 +++++++ corpus/rtl-page/cold/source.json | 14 + corpus/rtl-page/cold/teardown.json | 1 + crates/canvas/Cargo.toml | 4 + crates/canvas/examples/reading_inventory.rs | 382 +++++++++++++++++ crates/canvas/examples/unsupported_inventory.rs | 49 ++- crates/canvas/src/conflict.rs | 44 +- crates/canvas/src/date.rs | 2 +- crates/canvas/src/document.rs | 10 +- crates/canvas/src/editor.rs | 248 +++++------ crates/canvas/src/editor/equation.rs | 12 +- crates/canvas/src/editor/format.rs | 152 +++---- crates/canvas/src/editor/ink.rs | 78 ++-- crates/canvas/src/editor/link.rs | 35 +- crates/canvas/src/editor/ops.rs | 31 +- crates/canvas/src/editor/page.rs | 65 ++- crates/canvas/src/editor/recording.rs | 4 +- crates/canvas/src/editor/space.rs | 23 +- crates/canvas/src/editor/table.rs | 196 ++++----- crates/canvas/src/gpu/page.rs | 155 +++---- crates/canvas/src/gpu/page/background.rs | 15 +- crates/canvas/src/gpu/page/picture.rs | 8 +- crates/canvas/src/interaction/accessibility.rs | 2 + crates/canvas/src/interaction/mod.rs | 128 +++--- crates/canvas/src/interaction/scroll.rs | 42 +- crates/canvas/src/interaction/tests.rs | 14 + crates/canvas/src/language.rs | 2 +- crates/canvas/src/layout.rs | 30 +- crates/canvas/src/lib.rs | 11 + crates/canvas/src/math.rs | 8 +- crates/canvas/src/outline.rs | 52 +-- crates/canvas/src/reading.rs | 638 +++++++++++++++++++++++++++ crates/canvas/src/search.rs | 65 +-- crates/canvas/src/spelling.rs | 12 +- crates/canvas/tests/reading.rs | 90 ++++ crates/canvas/tests/rtl_page.rs | 188 ++++++++ crates/draw/Cargo.toml | 16 +- crates/draw/src/draw.hlsl | 153 +++++++ crates/draw/src/edit.rs | 18 +- crates/draw/src/lib.rs | 22 +- crates/draw/src/render.rs | 355 ++++++++------- crates/draw/src/render/d3d11.rs | 585 +++++++++++++++++++++++++ crates/draw/src/render/dual.rs | 131 ++++-- crates/draw/src/render/dxbc/compile.ps1 | 52 +++ crates/draw/src/render/dxbc/draw.fragment.dxbc | Bin 0 -> 11252 bytes crates/draw/src/render/dxbc/draw.vertex.dxbc | Bin 0 -> 1204 bytes crates/draw/src/render/dxbc/translucent.fragment.dxbc | Bin 0 -> 960 bytes crates/draw/src/render/dxbc/translucent.vertex.dxbc | Bin 0 -> 612 bytes crates/draw/src/render/gl.rs | 220 ++++------ crates/draw/src/render/icon.rs | 82 +--- crates/draw/src/render/pdf.rs | 69 ++- crates/draw/src/render/translucent.hlsl | 21 + crates/draw/src/render/webgpu.rs | 346 +++++++-------- crates/mobile/Cargo.toml | 2 + crates/mobile/include/snowbound.h | 5 + crates/mobile/src/lib.rs | 159 ++++--- crates/mobile/src/library.rs | 249 +++++++---- crates/mobile/src/tests.rs | 26 +- crates/notebook/Cargo.toml | 10 +- crates/notebook/README.md | 65 ++- crates/notebook/examples/document.rs | 11 - crates/notebook/examples/keystroke_probe.rs | 1 + crates/notebook/examples/open_probe.rs | 1 + crates/notebook/examples/save_probe.rs | 1 + crates/notebook/src/background.rs | 17 +- crates/notebook/src/base.rs | 14 + crates/notebook/src/discover.rs | 59 ++- crates/notebook/src/discover/source.rs | 6 +- crates/notebook/src/lib.rs | 116 +++-- crates/notebook/src/location.rs | 2 +- crates/notebook/src/migrate.rs | 1 + crates/notebook/src/package.rs | 236 ++++++++++ crates/notebook/src/queue.rs | 181 ++++++-- crates/notebook/src/recovery.rs | 33 +- crates/notebook/src/session.rs | 452 +++++++++++++++----- crates/notebook/src/session/tests.rs | 123 ++++++ crates/notebook/src/sidecar/tests.rs | 4 + crates/notebook/src/smb/mod.rs | 31 +- crates/notebook/src/smb/tests.rs | 51 ++- crates/notebook/src/sync.rs | 60 +-- crates/notebook/src/worker.rs | 1 + crates/notebook/src/working.rs | 119 +++--- crates/notebook/tests/cache.rs | 4 +- crates/notebook/tests/package.rs | 265 ++++++++++++ crates/notebook/tests/protected.rs | 735 +++++++++++++++++++++++++++----- crates/notebook/tests/support/page_schedule.rs | 50 +-- crates/onestore/Cargo.toml | 15 +- crates/onestore/README.md | 70 +-- crates/onestore/examples/scratch_dump.rs | 53 --- crates/onestore/src/active.rs | 11 +- crates/onestore/src/commit.rs | 57 ++- crates/onestore/src/create.rs | 62 ++- crates/onestore/src/document.rs | 5 - crates/onestore/src/identity.rs | 54 +++ crates/onestore/src/lib.rs | 5 +- crates/onestore/src/objects.rs | 11 +- crates/onestore/src/op/content.rs | 2 +- crates/onestore/src/op/lower.rs | 1 + crates/onestore/src/page/mod.rs | 5 + crates/onestore/src/protected/crypto.rs | 162 +++++-- crates/onestore/src/protected/mod.rs | 624 ++++++++++++++++----------- crates/onestore/src/section.rs | 210 +++++---- crates/onestore/src/section/versions.rs | 51 +-- crates/onestore/src/toc.rs | 24 +- crates/onestore/src/write.rs | 296 +++++++------ crates/onestore/tests/protected.rs | 445 ++++++++++++------- crates/snowbound/Cargo.toml | 2 + crates/snowbound/assets/icons/info.svg | 10 + crates/snowbound/assets/icons/warning.svg | 8 + crates/snowbound/linux/onenote.xml | 1 + crates/snowbound/linux/package.sh | 30 +- crates/snowbound/src/aqua.rs | 25 +- crates/snowbound/src/art.rs | 2 + crates/snowbound/src/commands.rs | 129 +++++- crates/snowbound/src/conflict_render.rs | 2 +- crates/snowbound/src/desktop_linux.rs | 2 +- crates/snowbound/src/history.rs | 86 ++-- crates/snowbound/src/icloud_linux.rs | 6 +- crates/snowbound/src/icloud_macos.rs | 9 +- crates/snowbound/src/keys.rs | 9 +- crates/snowbound/src/library.rs | 350 +++++++++------ crates/snowbound/src/link.rs | 17 +- crates/snowbound/src/linux.rs | 82 ++-- crates/snowbound/src/macos.rs | 78 ++-- crates/snowbound/src/main.rs | 557 ++++++++++++++---------- crates/snowbound/src/manage.rs | 80 ++-- crates/snowbound/src/media_linux.rs | 24 +- crates/snowbound/src/menubar.rs | 12 + crates/snowbound/src/menus.rs | 149 ++++++- crates/snowbound/src/navigation.rs | 1 + crates/snowbound/src/options.rs | 66 +++ crates/snowbound/src/pane.rs | 2 +- crates/snowbound/src/prefetch.rs | 13 + crates/snowbound/src/print.rs | 195 +++++++-- crates/snowbound/src/properties.rs | 20 +- crates/snowbound/src/protection.rs | 642 ++++++++++++++++++++++++++++ crates/snowbound/src/recycle.rs | 393 +++++++++++++++++ crates/snowbound/src/rename.rs | 6 +- crates/snowbound/src/save_as.rs | 271 ++++++++++++ crates/snowbound/src/search.rs | 72 ++-- crates/snowbound/src/settings.rs | 26 ++ crates/snowbound/src/sidebar.rs | 58 ++- crates/snowbound/src/spell_linux.rs | 7 +- crates/snowbound/src/surface_gl.rs | 22 +- crates/snowbound/src/surface_windows.rs | 90 ++-- crates/snowbound/src/sync.rs | 525 ++++++++++++++++++----- crates/snowbound/src/tags.rs | 24 +- crates/snowbound/src/themes.rs | 17 +- crates/snowbound/src/undo.rs | 112 +++-- crates/snowbound/src/unpack.rs | 235 ++++++++++ crates/snowbound/src/unread.rs | 431 +++++++++++++++++++ crates/snowbound/src/update.rs | 285 +++++++++++-- crates/snowbound/src/windows.rs | 118 ++++- crates/snowbound/tests/replay.rs | 98 +++++ crates/ui/src/layout.rs | 17 +- crates/ui/src/lib.rs | 62 +-- crates/ui/src/popup.rs | 151 +++---- crates/ui/src/shell.rs | 24 +- crates/ui/src/tests.rs | 6 +- crates/ui/src/text.rs | 15 +- crates/ui/src/theme.rs | 8 +- crates/ui/src/widgets.rs | 40 +- fuzz/Cargo.lock | 240 +++++++++++ fuzz/Cargo.toml | 2 +- fuzz/fuzz_targets/canvas_editor.rs | 48 +-- fuzz/fuzz_targets/offline_model.rs | 3 + fuzz/fuzz_targets/offline_page.rs | 3 + fuzz/fuzz_targets/protected.rs | 20 +- fuzz/fuzz_targets/protected_write.rs | 73 ++-- platform/linux/ar.sh | 2 + platform/linux/cargo.sh | 23 + platform/linux/cc.sh | 8 + platform/snow-leopard/Cargo.lock | 1 + platform/snow-leopard/probe/src/render.rs | 4 +- platform/snow-leopard/probe/src/text.rs | 4 +- tools/RELEASE.md | 32 +- tools/TESTING.md | 43 ++ tools/canvas/README.md | 2 + tools/canvas/build_macos.py | 5 +- tools/ci.py | 448 +++++++++++++++++++ tools/document_model.py | 12 +- tools/native/protected.ps1 | 42 ++ tools/native_protected.py | 63 +++ tools/release.py | 73 +++- tools/test_notebook_package.py | 113 +++++ tools/test_protected_sections.py | 131 ++++++ tools/test_recycle_bin_view.py | 68 +++ tools/test_release.py | 22 + tools/test_rtl_page.py | 31 ++ tools/verify-document.py | 23 +- 441 files changed, 15917 insertions(+), 4456 deletions(-)