diff --git a/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml new file mode 100644 index 0000000000..971bc98a0c --- /dev/null +++ b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md +2026-08-12-collapsed-sidebar-shared-entry-motion.md: c5bc18973db693cf9ba60800fbcf7720593dbad5 +2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md: b87ef6322d548061cc2e29c0e8f9896098c09041 diff --git a/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md new file mode 100644 index 0000000000..c5bc18973d --- /dev/null +++ b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md @@ -0,0 +1,33 @@ +# Agent Note: Collapsed sidebar upper controls share one entry motion + +Status: implemented +Archived: 2026-08-12 + +English | [中文](2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md) + +## Problem + +The collapsed sidebar rail renders four upper controls owned by two packages: the shell owns the toggle and New Session, while the workspace region owns add and search. Their opacity timing matched, but their geometry did not. Right-aligned controls moved with the narrowing column while left-aligned controls stayed fixed, so add appeared slower than search even under the same fade. + +The bottom settings control has a different role. It is pinned to the rail foot and must not join the upper controls' horizontal entry. + +## Decision + +At the rail settle point, the four upper 36px controls start from one left-anchored layout and share one `150ms` animation from `translateX(49px)` to their final 10px inset. The shell applies the translation to its toggle and New Session seats and once to the workspace region, so add and search inherit the same path without nested transforms. Opacity uses the same animation timeline. + +The settings seat uses a separate opacity-only keyframe with the same duration and easing. A page that starts collapsed renders the rail without an entry animation, and reduced-motion mode disables both keyframes. + +## Alternatives considered + +**Keep every rail control fixed at its final inset.** This removes the mismatch, but it also removes the requested horizontal entry from the four upper controls. + +**Animate each workspace button independently.** This would duplicate shell timing inside `ui-workspace` and could apply both a region and child transform. Translating the registered region once keeps animation ownership in the sidebar shell. + +**Translate the settings control with the upper controls.** Rejected because settings is a bottom-pinned foot action, not part of the upper control sequence. + +## Consequences + +- Toggle, New Session, add, and search follow the same horizontal coordinates throughout collapse. +- Settings fades at its final horizontal coordinate. +- Static collapsed renders retain their final geometry without startup motion. +- Style tests pin the shared animation assignments, translation distance, base anchors, and settings exception. diff --git a/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md new file mode 100644 index 0000000000..b87ef6322d --- /dev/null +++ b/.agents/notes/archived/bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md @@ -0,0 +1,33 @@ +# Agent Note: 收起侧�的上方控件共用�一进入动画 + +Status: implemented +Archived: 2026-08-12 + +[English](2026-08-12-collapsed-sidebar-shared-entry-motion.md) | 中文 + +## Problem + +收起侧�轨�的四个上方控件由两个包渲染:外壳�有侧�切�与新建会�,Workspace 区域�有添加和�索。它们的�明度时�相�,但几何行为��。�对�控件会���窄而移动,左对�控件则���动,因此添加�使使用相�淡入,视觉上�比�索慢。 + +底部设置控件承担��角色。它固定在轨�页脚,�能�与上方控件的横�进入。 + +## Decision + +轨���时,四个 36px 上方控件从�一个左对�布局开始,共用一段 `150ms` 动画,从 `translateX(49px)` 移动到最终 10px 内边�。外壳把�移分别应用于侧�切��新建会�,并�对 Workspace 区域应用一次,因此添加与�索会继承�一路径,�产生嵌套��。�明度使用�一�动画时间线。 + +设置控件使用时长与缓动相��但�改��明度的独立关键帧。页��始�为收起状�时�会播放进入动画;�少动�效果模�会�用两段关键帧。 + +## Alternatives considered + +**把�个轨�控件固定在最终内边�。** 这能消除�一致,但也会移除四个上方控件所需的横�进入效果。 + +**分别为�个 Workspace 按钮添加动画。** 这会在 `ui-workspace` 中��外壳时�,还�能�时应用区域与�控件��。�移动一次已注册区域,�以让动画继续由侧�外壳�有。 + +**让设置控件�上方控件一起移动。** �予采纳,因为设置是固定在底部的页脚�作,�属于上方控件�列。 + +## Consequences + +- 侧�切��新建会��添加与�索在整个收起过程中使用相�横�标。 +- 设置在最终横�标上淡入。 +- ��收起渲染��最终几何,�播放�动动画。 +- 样�测试固定共用动画分���移�离�基础锚点与设置例外。 diff --git a/.agents/notes/archived/manifest.json b/.agents/notes/archived/manifest.json index a8377c346f..f8786470c7 100644 --- a/.agents/notes/archived/manifest.json +++ b/.agents/notes/archived/manifest.json @@ -97,6 +97,9 @@ "bug-fix/2026-08-10-web-favicon-dark-mode.i18n.yaml": "sha256:859c4399f9a017a68ba89552fdafa05e73c0599d94cee9551c84ea5b749a14f3", "bug-fix/2026-08-10-web-favicon-dark-mode.md": "sha256:4d17e247abd76ae3aed5fb4e075fd66a2838292f89f7021c82a79fe37ed905e6", "bug-fix/2026-08-10-web-favicon-dark-mode.zh.md": "sha256:7bbff8a3b7061c127afcc75cd2a8043b02a999b78c0180edd8f7e4807fcfe71d", + "bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.i18n.yaml": "sha256:3ce4f6e39e173fc304bf64deca9c95bcddc1dbb492e065ca8c267a7a40788588", + "bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.md": "sha256:7b169aa4543edfc965de5a8b7b9e60aa9d9d5218693cd0b57908e2d482280723", + "bug-fix/2026-08-12-collapsed-sidebar-shared-entry-motion.zh.md": "sha256:88db36c698800bf55c3c7531d6f92665576d978c29c15ff7d74215fb93376cb1", "feature/2026-06-14-acp-agent-client-protocol.i18n.yaml": "sha256:006795baa43ae962a8d125cc0f1e9f134bc2ee9fb758b6e7669e3fa0126e1918", "feature/2026-06-14-acp-agent-client-protocol.md": "sha256:6828c0af74bb3fb96206ca6b21c0e56a000b50e4744aad4bc2c05092f3a5a31b", "feature/2026-06-14-acp-agent-client-protocol.zh.md": "sha256:ba104e841a1fb84edbd3b6c8119d50445b7785255a7a8d13bb9ac8a2cb4d2e69", diff --git a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.i18n.yaml index f07afccac7..106164a71c 100644 --- a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-13-capability-seams.md -2026-06-13-capability-seams.md: efb000631c6dfe91ab648b102a14a27c30d790b4 -2026-06-13-capability-seams.zh.md: bf6571dfa5c3a90f856480bc22c6560ed65b3e77 +2026-06-13-capability-seams.md: 2a166278ea454895177fa12b58f5493276f19cd1 +2026-06-13-capability-seams.zh.md: 0874af5826960ab9e718eb07b00c12b446edfd78 diff --git a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.md b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.md index efb000631c..2a166278ea 100644 --- a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.md +++ b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.md @@ -1,4 +1,4 @@ -# Agent Note: Capability seams — Service Definition / Service provider / Consumer roles +# Agent Note: Capability seams — Service Definition / Service Provider / Consumer roles Status: implemented @@ -15,16 +15,18 @@ This is distinct from "who provides vs. needs a capability at runtime", which Co A swappable capability has **three roles**: 1. **Service Definition** — the Cordis `Service` and vocabulary types owning `ctx.` and depending only on the vocabulary the contract needs (e.g. `dsh-shell`: `ShellExecutor`, `ShellRunResult`, `ShellProcess`). A definition may be an abstract class or a concrete registry service; it is never a TypeScript `interface`. -2. **Service provider** — a plugin that supplies or registers an implementation (e.g. `dsh-bash-local`: subprocesses, process-group kills, spill-file truncation). Sandboxed and remote providers are sibling packages implementing or registering against the same Service Definition. +2. **Service Provider** — a plugin that supplies or registers an implementation (e.g. `dsh-bash-local`: subprocesses, process-group kills, spill-file truncation). Sandboxed and remote providers are sibling packages implementing or registering against the same Service Definition. 3. **Consumer** — what the model and plugins program against (e.g. `dsh-tool-bash`: the `bash` schema, with background handles registered into the generic job runtime). Consumers inject the service key and never import provider-specific types. -Service providers and Consumers then evolve independently: a sandboxed executor replaces `dsh-bash-local` without touching a tool schema. +The role names use title case: **Service Definition**, **Service Provider**, and **Consumer**. Generic uses of `provider` and `consumer` remain lowercase. -Roles normally use separate packages when they evolve independently, but the split is not mandatory when the roles are genuinely one concern: the LLM seam folds Service Definition and Consumer into `dsh-llm` (the Consumer is the loop itself, not a swappable schema surface) with adapters as Service provider packages. Don't split preemptively — a capability with one conceivable provider and one Consumer stays one package until a second appears. +Service Providers and Consumers then evolve independently: a sandboxed executor replaces `dsh-bash-local` without touching a tool schema. + +Roles normally use separate packages when they evolve independently, but the split is not mandatory when the roles are genuinely one concern: the LLM seam folds Service Definition and Consumer into `dsh-llm` (the Consumer is the loop itself, not a swappable schema surface) with adapters as Service Provider packages. Don't split preemptively — a capability with one conceivable provider and one Consumer stays one package until a second appears. ## Terminology: "seam" names the trio, not the interface -A **seam** is the whole capability — the three roles together: a **Service Definition** (the Cordis `Service` that owns `ctx.` and the vocabulary), one or more **Service providers**, and one or more **Consumers**. `packages/shell` is the canonical example — `dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`. A package may own multiple roles, but one role alone is not the seam. The term "seam" is reserved for this complete capability; name a constituent by its role, class, service, contract, or extension point. The [glossary](../../../../docs/glossary.md#capability-seam) is the canonical entry. +A **seam** is the whole capability — the three roles together: a **Service Definition** (the Cordis `Service` that owns `ctx.` and the vocabulary), one or more **Service Providers**, and one or more **Consumers**. `packages/shell` is the canonical example — `dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`. A package may own multiple roles, but one role alone is not the seam. The term "seam" is reserved for this complete capability; name a constituent by its role, class, service, contract, or extension point. The [glossary](../../../../docs/glossary.md#capability-seam) is the canonical entry. ## Alternatives considered @@ -33,4 +35,4 @@ A **seam** is the whole capability — the three roles together: a **Service Def ## Consequences -Separating roles adds packages and boilerplate (`package.json`, `tsconfig`, README, and injection wiring). In return, Service providers and Consumers ship and version independently, and a new backend never risks the model-facing contract. [AGENTS.md](../../../../AGENTS.md) and [architecture.md](../../../../docs/architecture.md) carry the rule; the bash trio is the reference template. This Agent Note records why independently changing roles normally split while genuinely shared concerns may remain folded. +Separating roles adds packages and boilerplate (`package.json`, `tsconfig`, README, and injection wiring). In return, Service Providers and Consumers ship and version independently, and a new backend never risks the model-facing contract. [AGENTS.md](../../../../AGENTS.md) and [architecture.md](../../../../docs/architecture.md) carry the rule; the bash trio is the reference template. This Agent Note records why independently changing roles normally split while genuinely shared concerns may remain folded. diff --git a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md index bf6571dfa5..0874af5826 100644 --- a/.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-13-capability-seams.zh.md @@ -1,4 +1,4 @@ -# Agent Note: 能力 seam——Service Definition / Service provider / Consumer 角色 +# Agent Note: 能力 seam——Service Definition / Service Provider / Consumer 角色 Status: implemented @@ -15,22 +15,24 @@ harness 具有�替�的能力:当�是 bash 执行,未�会有沙箱化 一项�替�的能力包�**三个角色**: 1. **Service Definition**——拥有 `ctx.` 的 Cordis `Service` 和�汇类型,仅�赖约定所需的�汇(例如 `dsh-shell`:`ShellExecutor`�`ShellRunResult`�`ShellProcess`)。Service Definition �以是抽象类,也�以是具体的注册表�务;��是 TypeScript `interface`。 -2. **Service provider**——�供或注册实现的�件(例如 `dsh-bash-local`:�进程�进程组 kill�spill 文件截断)。沙箱化和远程 Service provider 是���一 Service Definition 实现或注册的兄弟包。 -3. **Consumer**——模型和�件编程所��的内容(例如 `dsh-tool-bash`:`bash` schema,���柄注册到通用任务�行时)。Consumer 注入�务键,从�导入 Service provider 特有的类型。 +2. **Service Provider**——�供或注册实现的�件(例如 `dsh-bash-local`:�进程�进程组 kill�spill 文件截断)。沙箱化和远程 Service Provider 是���一 Service Definition 实现或注册的兄弟包。 +3. **Consumer**——模型和�件编程所��的内容(例如 `dsh-tool-bash`:`bash` schema,���柄注册到通用任务�行时)。Consumer 注入�务键,从�导入 Service Provider 特有的类型。 -Service provider 与 Consumer 由此独立演进:沙箱化执行器替� `dsh-bash-local` 时无需触碰任何工具 schema。 +角色�使用标题�大�写:**Service Definition**�**Service Provider** 和 **Consumer**。泛指的 `provider` 和 `consumer` �使用�写。 -当角色独立演进时,通常使用��的包;但当�角色确实属于�一个关注点时,并�必须拆分:LLM(大语言模型) seam 将 Service Definition 和 Consumer �并为 `dsh-llm`(Consumer 是 agent loop(智能体循环)本身,而��替�的 schema 接�),适�器作为 Service provider 包。��预防性地拆分——如果一项能力�有一��设想的 Service provider 和一个 Consumer,就��为一个包,直到出现第二个。 +Service Provider 与 Consumer 由此独立演进:沙箱化执行器替� `dsh-bash-local` 时无需触碰任何工具 schema。 + +当角色独立演进时,通常使用��的包;但当�角色确实属于�一个关注点时,并�必须拆分:LLM(大语言模型) seam 将 Service Definition 和 Consumer �并为 `dsh-llm`(Consumer 是 agent loop(智能体循环)本身,而��替�的 schema 接�),适�器作为 Service Provider 包。��预防性地拆分——如果一项能力�有一��设想的 Service Provider 和一个 Consumer,就��为一个包,直到出现第二个。 ## 术语:seam 指三者组�,而�接� -一个 **seam** 是完整的能力——三个角色�在一起:**Service Definition**(拥有 `ctx.` 和�汇的 Cordis `Service`)�一个或多个 **Service provider**,以�一个或多个 **Consumer**。`packages/shell` 是规范范例——`dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`。一个包�以承担多个角色,但�个角色本身�是 seam。「seam�一�严格�留给这�完整能力;命�其中一个组�部分时,应使用其角色�类��务�约定或扩展点。[术语表](../../../../docs/glossary.md#capability-seam)是规范�目。 +一个 **seam** 是完整的能力——三个角色�在一起:**Service Definition**(拥有 `ctx.` 和�汇的 Cordis `Service`)�一个或多个 **Service Provider**,以�一个或多个 **Consumer**。`packages/shell` 是规范范例——`dsh-shell` / `dsh-bash-local`+`dsh-bash-sandbox` / `dsh-tool-bash`。一个包�以承担多个角色,但�个角色本身�是 seam。「seam�一�严格�留给这�完整能力;命�其中一个组�部分时,应使用其角色�类��务�约定或扩展点。[术语表](../../../../docs/glossary.md#capability-seam)是规范�目。 ## 曾考虑的替代方案 -- **始终�并�角色**:�决。因为它会�新耦�独立�化的 Service Definition�Service provider 和 Consumer。 +- **始终�并�角色**:�决。因为它会�新耦�独立�化的 Service Definition�Service Provider 和 Consumer。 - **`@cordisjs/plugin-capability`**:这是完全��的维度。它是一个���能力*安全*�务(具���加继承,通过 `ctx.capability.test` 针对会�检测这些��),是延�的���沙箱工作(`tools/pre-execute` deny/ask 门)的候选方案,�是替�实现的机制。混淆这两个「能力�概念正是本 Agent Note 所指出的陷阱。 ## �果 -分离角色会增加包和样�代�(`package.json`�`tsconfig`�README 和注入接线)。��的是:Service provider 与 Consumer 独立�布和版本管�,新�端永远�会波���模型的约定。[AGENTS.md](../../../../AGENTS.md) 和 [architecture.md](../../../../docs/architecture.md) 载有这项规则;bash 三件套是�考模�。本 Agent Note 记录为什么独立�化的角色通常需�拆分,而确实共享的关注点�以���并。 +分离角色会增加包和样�代�(`package.json`�`tsconfig`�README 和注入接线)。��的是:Service Provider 与 Consumer 独立�布和版本管�,新�端永远�会波���模型的约定。[AGENTS.md](../../../../AGENTS.md) 和 [architecture.md](../../../../docs/architecture.md) 载有这项规则;bash 三件套是�考模�。本 Agent Note 记录为什么独立�化的角色通常需�拆分,而确实共享的关注点�以���并。 diff --git a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.i18n.yaml index fc070d7c3a..9898684b9e 100644 --- a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md -2026-06-17-filesystem-capability-seam.md: 953ef0eaafe8f654bf55c3e5c4208560243c3d0b -2026-06-17-filesystem-capability-seam.zh.md: 1073226594acbe8c1c596bb4b2dcc959b20c0769 +2026-06-17-filesystem-capability-seam.md: 6265aebf5e7ffdd4ec4dc0083aa55adb34ee78a1 +2026-06-17-filesystem-capability-seam.zh.md: 024421ed59fa1e6c29bcc12ab51f69ac19a0c231 diff --git a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md index 953ef0eaaf..6265aebf5e 100644 --- a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md +++ b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.md @@ -53,7 +53,7 @@ The filesystem seam uses the same dependency direction as the bash trio: `@deepseek-ai/dsh-tool-fs` depends on `@deepseek-ai/dsh-fs`, `@deepseek-ai/dsh-tools`, `@deepseek-ai/dsh-system-prompt`, and `cordis`. It registers model-facing tools and prompt sections. It must not import `node:fs`, `node:path`, or `@deepseek-ai/dsh-fs-local`; filesystem execution always goes through `ctx.fs`. If the implementation needs concrete agent or session helper types, those dependencies belong in `tool-fs`; they must not leak back into `dsh-fs`. -The root `tool-fs` plugin registers the full filesystem tool suite (`read`, `write`, and `edit`) by composing the per-tool registration helpers. It injects `fs` and never imports a Service provider package. +The root `tool-fs` plugin registers the full filesystem tool suite (`read`, `write`, and `edit`) by composing the per-tool registration helpers. It injects `fs` and never imports a Service Provider package. ## `ctx.fs` contract @@ -139,7 +139,7 @@ The defensive-pattern classes this repo has been bitten by are pinned directly: ## Alternatives considered - **Model-facing tools directly over `node:fs`** — the tool package would own execution policy, path resolution, atomic writes, text decoding, and edit semantics at once, coupling the three independently-changing concerns the Problem names and churning schemas on any backend swap. -- **One combined `dsh-fs-tools` package** — the pre-seam shape; rejected for the same Service Definition / Service provider / Consumer split as bash, and the combined name never became public API. +- **One combined `dsh-fs-tools` package** — the pre-seam shape; rejected for the same Service Definition / Service Provider / Consumer split as bash, and the combined name never became public API. - **Observed-state on `ctx.fs`** — the shape this Agent Note first landed; superseded by [the split-fs-seam Agent Note](../simplification/2026-06-26-fsspec-style-fs-seam.md) and [the event-gate Agent Note](2026-06-26-file-context-as-event-gate.md): a sandboxed/remote backend must not inherit model-facing observation policy, so the provider keeps only the version token and the optional version-guarded mutation. ## Consequences diff --git a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.zh.md b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.zh.md index 1073226594..024421ed59 100644 --- a/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-17-filesystem-capability-seam.zh.md @@ -53,7 +53,7 @@ Consumer 包仅�赖 Service Definition 包,从��赖 `dsh-fs-local`。需 `@deepseek-ai/dsh-tool-fs` �赖 `@deepseek-ai/dsh-fs`�`@deepseek-ai/dsh-tools`�`@deepseek-ai/dsh-system-prompt` 和 `cordis`。它注册��模型的工具和�示�段�。它�止导入 `node:fs`�`node:path` 或 `@deepseek-ai/dsh-fs-local`;文件系统执行始终通过 `ctx.fs`。如果实现需�具体的 agent(智能体)或会�辅助类型,这些�赖属于 `tool-fs`;它们�止回�到 `dsh-fs` 中。 -根 `tool-fs` �件通过组��工具的注册辅助函数�注册完整的文件系统工具套件(`read`�`write` 和 `edit`)。它注入 `fs`,从�导入 Service provider 包。 +根 `tool-fs` �件通过组��工具的注册辅助函数�注册完整的文件系统工具套件(`read`�`write` 和 `edit`)。它注入 `fs`,从�导入 Service Provider 包。 ## `ctx.fs` 约定 @@ -139,7 +139,7 @@ Consumer 包仅�赖 Service Definition 包,从��赖 `dsh-fs-local`。需 ## 曾考虑的替代方案 - **��模型的工具直接基于 `node:fs`**:工具包将�时承担执行策略�路径解��原�写入�文本解�和编辑语义,耦�问题部分所列的三个独立�化的关注点,且任何�端替�都会�动 schema。 -- **�一�并包 `dsh-fs-tools`**:seam 之�的形�;以与 bash 相�的 Service Definition / Service provider / Consumer 拆分�由�决,且�并�称从未�为公开 API。 +- **�一�并包 `dsh-fs-tools`**:seam 之�的形�;以与 bash 相�的 Service Definition / Service Provider / Consumer 拆分�由�决,且�并�称从未�为公开 API。 - **观测状�放在 `ctx.fs` 上**:本 Agent Note 最��地的形�;被 [拆分文件系统 seam Agent Note](../simplification/2026-06-26-fsspec-style-fs-seam.md) 和 [事件门控 Agent Note](2026-06-26-file-context-as-event-gate.md) �代:沙箱/远程�端�应继承��模型的观测策略,因此�供方��留版本令牌和�选的版本守护�更。 ## �果 diff --git a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.i18n.yaml index d3c3a774bd..0ecda2484f 100644 --- a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md -2026-06-18-agent-lifecycle-and-ownership-contracts.md: f0f9f90b15dee9155cfb1e8c772503642ff34be3 -2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md: a5f6ca10dbe7c71281cccdaf83fff95139ad2d79 +2026-06-18-agent-lifecycle-and-ownership-contracts.md: 9bc558bfce75892b0ebdb80e9f8735d440cabaf4 +2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md: 65e0018c3f2ba56043898050c8e0b49929f8e7e7 diff --git a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md index f0f9f90b15..9bc558bfce 100644 --- a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md +++ b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.md @@ -37,7 +37,7 @@ These invariants hold and are pinned by tests: ## Session owner tokens are unique among live agents -The bash owner-token comparison relies on the shared `Agent.id`/`SessionId` being unique among live agents. Concurrent same-ID operations may both prepare privately, but publication enters the session and agent in order; `SessionStore.enter()` rejects a duplicate live session id, and every losing transaction rolls its private state back. A programmatic caller therefore cannot publish two live agents with one session token. The access *policy* (token comparison) stays in `tool-bash` (the Consumer); the bash capability keeps `owner` opaque and never interprets it — the correct Service Definition / Service provider / Consumer split. +The bash owner-token comparison relies on the shared `Agent.id`/`SessionId` being unique among live agents. Concurrent same-ID operations may both prepare privately, but publication enters the session and agent in order; `SessionStore.enter()` rejects a duplicate live session id, and every losing transaction rolls its private state back. A programmatic caller therefore cannot publish two live agents with one session token. The access *policy* (token comparison) stays in `tool-bash` (the Consumer); the bash capability keeps `owner` opaque and never interprets it — the correct Service Definition / Service Provider / Consumer split. ## Alternatives considered diff --git a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md index a5f6ca10db..65e0018c3f 100644 --- a/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-18-agent-lifecycle-and-ownership-contracts.zh.md @@ -37,7 +37,7 @@ ACP(Agent Client Protocol)与 tool-bash 的若干�制是�一个所有� ## 会�所有者令牌在存活 agent 中唯一 -bash 所有者 token 比较�赖共享的 `Agent.id`/`SessionId` 在存活 agent 中唯一。并�的� ID �作�以都�下准备,但�布时会�次登记会�和 agent;`SessionStore.enter()` 拒���的存活会� id,�个失败事务都回滚自己的�有状�。因此程�化调用方无法�布两个共享�一会� token 的存活 agent。访问*策略*(token 比较)留在 Consumer `tool-bash`;bash 能力�存储��明的 `owner` 字符串且从�解释它——这是正确的 Service Definition / Service provider / Consumer 拆分。 +bash 所有者 token 比较�赖共享的 `Agent.id`/`SessionId` 在存活 agent 中唯一。并�的� ID �作�以都�下准备,但�布时会�次登记会�和 agent;`SessionStore.enter()` 拒���的存活会� id,�个失败事务都回滚自己的�有状�。因此程�化调用方无法�布两个共享�一会� token 的存活 agent。访问*策略*(token 比较)留在 Consumer `tool-bash`;bash 能力�存储��明的 `owner` 字符串且从�解释它——这是正确的 Service Definition / Service Provider / Consumer 拆分。 ## 曾考虑的替代方案 diff --git a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.i18n.yaml index 877a53e0ac..b7e2678928 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-20-branded-ids.md -2026-06-20-branded-ids.md: 6bf68c9b6b6dea8317992bcb6f694a8ee141f048 -2026-06-20-branded-ids.zh.md: 11a78df609888fdf917246940c12463373ff2de3 +2026-06-20-branded-ids.md: 29b258b21240c92e74051339f0939a8e70933099 +2026-06-20-branded-ids.zh.md: 288125764d4b279c79b7469080bb0c9f2efdc709 diff --git a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.md b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.md index 6bf68c9b6b..29b258b212 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.md +++ b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.md @@ -46,7 +46,7 @@ export function OwnerToken(id: string): OwnerToken { ### Why not typing `owner` as `SessionId`? -The obvious shortcut is to type `owner` as `SessionId` directly — it always *is* one. We reject that. The bash executor seam is a capability seam (Service Definition `dsh-shell`, Service provider `dsh-bash-local`, Consumer `dsh-tool-bash`) and its owner token is *documented as deliberately opaque*: the executor "never interprets it (no access policy lives in the seam — that is the consumer's job)" (`packages/shell/shell/src/types.ts`). Typing the Service Definition's field as `SessionId` would import `dsh-session`'s vocabulary into a package that must not know what an owner token *means* — it would couple a generic execution backend to the session model and contradict the opaque-token design. A sandboxed or remote executor that replaces `dsh-bash-local` should not inherit a session dependency. The distinct `OwnerToken` brand keeps the seam decoupled: `dsh-shell` knows only "an owner is some opaque branded token," and the `dsh-tool-bash` consumer — which already decides the access policy — is the single boundary that casts its `SessionId` into an `OwnerToken`. The brand still delivers the safety win (you cannot pass a `BashTaskId` or a raw string where an owner is expected) without the coupling. +The obvious shortcut is to type `owner` as `SessionId` directly — it always *is* one. We reject that. The bash executor seam is a capability seam (Service Definition `dsh-shell`, Service Provider `dsh-bash-local`, Consumer `dsh-tool-bash`) and its owner token is *documented as deliberately opaque*: the executor "never interprets it (no access policy lives in the seam — that is the consumer's job)" (`packages/shell/shell/src/types.ts`). Typing the Service Definition's field as `SessionId` would import `dsh-session`'s vocabulary into a package that must not know what an owner token *means* — it would couple a generic execution backend to the session model and contradict the opaque-token design. A sandboxed or remote executor that replaces `dsh-bash-local` should not inherit a session dependency. The distinct `OwnerToken` brand keeps the seam decoupled: `dsh-shell` knows only "an owner is some opaque branded token," and the `dsh-tool-bash` consumer — which already decides the access policy — is the single boundary that casts its `SessionId` into an `OwnerToken`. The brand still delivers the safety win (you cannot pass a `BashTaskId` or a raw string where an owner is expected) without the coupling. ## Out of scope / possible extensions @@ -64,6 +64,6 @@ The landed invariants: `BashTaskId` and `OwnerToken` are defined in `dsh-shell` ## Consequences -- **Mechanical churn across two surfaces.** Propagating brands touches the bash seam (Service Definition + Service provider + Consumer) and the ACP session-id surface plus the persistence coordinator. The churn is broad but low-severity: a missed site is a compile error, not a silent bug. The change is observably type-only — no snapshot or e2e behavioral diff. It sits next to the [unified agent/session identity decision](../simplification/2026-06-20-unify-agent-and-session-id.md) because both touch the session-id / owner-token boundary; `OwnerToken` stays distinct from the unified id for the decoupling reason above. +- **Mechanical churn across two surfaces.** Propagating brands touches the bash seam (Service Definition + Service Provider + Consumer) and the ACP session-id surface plus the persistence coordinator. The churn is broad but low-severity: a missed site is a compile error, not a silent bug. The change is observably type-only — no snapshot or e2e behavioral diff. It sits next to the [unified agent/session identity decision](../simplification/2026-06-20-unify-agent-and-session-id.md) because both touch the session-id / owner-token boundary; `OwnerToken` stays distinct from the unified id for the decoupling reason above. - **Brands do not validate.** A brand is a confusability guard, not a correctness proof: a *wrong* session id that is still a well-formed string passes the type checker exactly as before. This decision does not close that gap (see Out of scope) — it only stops the *category* error of passing the wrong *kind* of id. - **The "where to stop" line stays a judgment call.** Branding `BashTaskId` but not `ToolName`, `OwnerToken` but not `ModelId`, is a taste call about which strings "could plausibly be confused." Reasonable reviewers may want more or fewer; the policy in `brand.ts` is the tie-breaker, and this decision errs toward the ids that are model-facing or used for access control. diff --git a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.zh.md b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.zh.md index 11a78df609..288125764d 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-branded-ids.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-20-branded-ids.zh.md @@ -46,7 +46,7 @@ export function OwnerToken(id: string): OwnerToken { ### 为什么�把 `owner` 类型标注为 `SessionId`? -显而易�的�径是直接把 `owner` 类型标注为 `SessionId`——它确实*总是*一个会� id。我们�决这个方案。bash 执行器 seam 是能力 seam(Service Definition `dsh-shell`�Service provider `dsh-bash-local`�Consumer `dsh-tool-bash`),其 owner token 被*明确记录为刻���明*:执行器「从�解释它(seam 中没有访问策略——那是消费方的�责)�(`packages/shell/shell/src/types.ts`)。把 Service Definition 的字段类型标注为 `SessionId`,会把 `dsh-session` 的�汇引入一个�应知� owner token *�义*的包——这会让通用执行�端耦�会�模型,并�背��明 token 的设计。�代 `dsh-bash-local` 的沙箱化执行器或远程执行器�应继承会��赖。独立的 `OwnerToken` brand 使 seam ��解耦:`dsh-shell` �知�「owner 是��带 brand 的��明 token�,而已�决定访问策略的 `dsh-tool-bash` 消费方,是把其 `SessionId` cast 为 `OwnerToken` 的唯一边界。该 brand �带�安全收益(�能把 `BashTaskId` 或裸 string 传到 owner �置),且�引入耦�。 +显而易�的�径是直接把 `owner` 类型标注为 `SessionId`——它确实*总是*一个会� id。我们�决这个方案。bash 执行器 seam 是能力 seam(Service Definition `dsh-shell`�Service Provider `dsh-bash-local`�Consumer `dsh-tool-bash`),其 owner token 被*明确记录为刻���明*:执行器「从�解释它(seam 中没有访问策略——那是消费方的�责)�(`packages/shell/shell/src/types.ts`)。把 Service Definition 的字段类型标注为 `SessionId`,会把 `dsh-session` 的�汇引入一个�应知� owner token *�义*的包——这会让通用执行�端耦�会�模型,并�背��明 token 的设计。�代 `dsh-bash-local` 的沙箱化执行器或远程执行器�应继承会��赖。独立的 `OwnerToken` brand 使 seam ��解耦:`dsh-shell` �知�「owner 是��带 brand 的��明 token�,而已�决定访问策略的 `dsh-tool-bash` 消费方,是把其 `SessionId` cast 为 `OwnerToken` 的唯一边界。该 brand �带�安全收益(�能把 `BashTaskId` 或裸 string 传到 owner �置),且�引入耦�。 ## �在范围内 / �能的扩展 @@ -64,6 +64,6 @@ export function OwnerToken(id: string): OwnerToken { ## �果 -- **两个接��的机械性改动。** 传播 brand 涉� bash seam(Service Definition + Service provider + Consumer)以� ACP 会� id 接�和�久化�调器。改动�广但严�度低:��的�置是编译错误而��默 bug。从�观察行为看,这是一项纯类型�更——无快照或 e2e 行为差异。它与[统一 agent/会�标识决策](../simplification/2026-06-20-unify-agent-and-session-id.md)相邻,因为二者都触�会� id / owner-token 边界;`OwnerToken` 出于上述解耦�由�与统一�的 id ��独立。 +- **两个接��的机械性改动。** 传播 brand 涉� bash seam(Service Definition + Service Provider + Consumer)以� ACP 会� id 接�和�久化�调器。改动�广但严�度低:��的�置是编译错误而��默 bug。从�观察行为看,这是一项纯类型�更——无快照或 e2e 行为差异。它与[统一 agent/会�标识决策](../simplification/2026-06-20-unify-agent-and-session-id.md)相邻,因为二者都触�会� id / owner-token 边界;`OwnerToken` 出于上述解耦�由�与统一�的 id ��独立。 - **Brand ��校验。** Brand 是混淆防护,�是正确性�明:一个*错误的*会� id ���是格�正确的 string,就和以�一样能通过类型检查器。本决策�关闭这个缺�(�「�在范围内�)——它�阻止这类*类别*错误:传入错误*�类*的 id。 - **「在哪里�下��是判断题。** 为 `BashTaskId` 加 brand 但�为 `ToolName` 加,为 `OwnerToken` 加但�为 `ModelId` 加,是对哪些 string「�能被混淆�的�味判断。��的评审者�能想�更多或更少;`brand.ts` 中的策略是�决��,本决策倾�于��模型或用于访问控制的 id。 diff --git a/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml index 3480f0b231..477c6df3ae 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.md 2026-06-20-generic-long-running-tool-runtime.md: 7db43323dd83f8e99698a7163412c9b33a607dfb -2026-06-20-generic-long-running-tool-runtime.zh.md: fe12ef264d294224fcfaf503ba958fa90c782347 +2026-06-20-generic-long-running-tool-runtime.zh.md: efd306cc8d3b82749635dde302af45235c27b431 diff --git a/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md b/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md index fe12ef264d..efd306cc8d 100644 --- a/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.zh.md @@ -19,13 +19,13 @@ Status: implemented 长时间�行工具是生产方。`dsh-tool-bash` 将 `ShellProcess` 适�为增�输出与进程�消;`dsh-tool-subagent` 将��行适�为最终输出与��行释放。bash 与 subagent 能力 seam ��独立,��赖会�或任务注册表。 -`JobRegistry` 是 `@deepseek-ai/dsh-jobs` 中的 Service Definition;进程内 Service provider 是 `@deepseek-ai/dsh-jobs-local` 中的 `LocalJobRegistry`(该拆分记录在[任务注册表约定 Agent Note](2026-07-26-job-registry-seam.md)中)。 +`JobRegistry` 是 `@deepseek-ai/dsh-jobs` 中的 Service Definition;进程内 Service Provider 是 `@deepseek-ai/dsh-jobs-local` 中的 `LocalJobRegistry`(该拆分记录在[任务注册表约定 Agent Note](2026-07-26-job-registry-seam.md)中)。 ## �行时约定 字�类型�[任务�系统页�](../../../../docs/subsystems/jobs.md)。生产方调用 `ctx.jobs.start()`,传入 kind�label��选的所属 `Agent`��选的正数 `outputLimitBytes` 与一个 `run()` 函数。�行时会在调用 `run()` �完�所有�能失败的预检工作,并且�调用一次。`run()` 返回钩��,注册过程�会�执行�能失败的步骤而直接�交;生产方无法�动没有�收集 job id 的工作。 -进程内 Service provider 还拥有有界准入,其�由记录在[有界��任务准入决策](../bug-fix/2026-08-11-bounded-background-job-admission.md)中。它的 `maxConcurrentJobsPerOwner` �置必须是正的安全整数,默认值为 `10`;`start()` 从 `running` 与 `stopping` 记录派生�个确切 `Agent` 对象的活动数�,而全部无 owner 任务共享一个�务级桶。容�拒��生在 `run()` 与 id 分�之�,处于 stopping 的任务�有在生产方 `done` 结算时�释放��。Service provider �排队或抢�任务,也��留第二份��计数。 +进程内 Service Provider 还拥有有界准入,其�由记录在[有界��任务准入决策](../bug-fix/2026-08-11-bounded-background-job-admission.md)中。它的 `maxConcurrentJobsPerOwner` �置必须是正的安全整数,默认值为 `10`;`start()` 从 `running` 与 `stopping` 记录派生�个确切 `Agent` 对象的活动数�,而全部无 owner 任务共享一个�务级桶。容�拒��生在 `run()` 与 id 分�之�,处于 stopping 的任务�有在生产方 `done` 结算时�释放��。Service Provider �排队或抢�任务,也��留第二份��计数。 `outputLimitBytes` 是生产方拥有的呈现策略,而�注册表缓冲区。注册表校验该值,并将其原样投影到 `JobSnapshot`;通用任务控制器添加自身的状�或通知元数��,�将该上�应用于完整的��模型输出。�略该值时��现有控制器行为,因此�行时�会�无关的生产方类别施加��默认值。 @@ -57,7 +57,7 @@ job id 在�行时全局��且�预测,因此注册表会授��次访 `JobRegistry` �供: -- `start(spec)`:�过预检与 Service provider 准入的原�注册。 +- `start(spec)`:�过预检与 Service Provider 准入的原�注册。 - `get(id, caller?)` 和 `list(caller?)`:�消费�快照。 - `read(id, caller?)`:消费��增�或幂等的最终结果。 - `kill(id, caller?, reason?)`:�消。 diff --git a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.i18n.yaml index 03dd8d5694..bc92549f44 100644 --- a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md -2026-06-24-web-capability-seam.md: 6e81650e2d7286fc3c9df1e740ba9ccbf30118df -2026-06-24-web-capability-seam.zh.md: b91a4470999fd66ec7178326fcfb5247ff83a2e0 +2026-06-24-web-capability-seam.md: 7e7b09f19864bd2ad8ad9d69579c1d5c79600cde +2026-06-24-web-capability-seam.zh.md: d6051eec498edb640773ba367038581cebd1f654 diff --git a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md index 6e81650e2d..7e7b09f198 100644 --- a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md +++ b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md @@ -38,7 +38,7 @@ The seam deliberately exposes no observation surface — no registry-change even ## Package topology -The three-package Service Definition / Service provider / Consumer split follows bash and filesystem, but the *interface* package is closer to the LLM seam. `LlmRuntime` (`packages/llm/llm/src/index.ts`) is a name-keyed provider registry: `registerAdapter(models, adapter)` stores adapters in a `Map`, returns a disposer, throws `DUPLICATE_ADAPTER` on duplicate keys, and throws `NO_ADAPTER` at resolution time. `ctx.web` follows that registry shape, but has two capability kinds and a richer selection policy (a configured provider id, or auto-select when exactly one usable provider is registered), so the `WebError` an execution throws can explain why a search or fetch capability cannot run. +The three-package Service Definition / Service Provider / Consumer split follows bash and filesystem, but the *interface* package is closer to the LLM seam. `LlmRuntime` (`packages/llm/llm/src/index.ts`) is a name-keyed provider registry: `registerAdapter(models, adapter)` stores adapters in a `Map`, returns a disposer, throws `DUPLICATE_ADAPTER` on duplicate keys, and throws `NO_ADAPTER` at resolution time. `ctx.web` follows that registry shape, but has two capability kinds and a richer selection policy (a configured provider id, or auto-select when exactly one usable provider is registered), so the `WebError` an execution throws can explain why a search or fetch capability cannot run. The dependency direction mirrors bash and filesystem: diff --git a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.zh.md b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.zh.md index b91a447099..d6051eec49 100644 --- a/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.zh.md @@ -38,7 +38,7 @@ Web 访问是一个一等能力 seam,�循[能力 seam Agent Note](2026-06-13 ## 包拓扑 -由三个包构�的 Service Definition / Service provider / Consumer 拆分沿用 bash 和 filesystem 的模�,但*接�*包更接近 LLM(大语言模型) seam。`LlmRuntime`(`packages/llm/llm/src/index.ts`)是一个按�称键控的�供方注册表:`registerAdapter(models, adapter)` 将适�器存入 `Map`�返回 disposer�对��键抛出 `DUPLICATE_ADAPTER`�在解�时抛出 `NO_ADAPTER`。`ctx.web` 沿用该注册表形状,但有两�能力类别和更丰富的选择策略(�置的�供方 id,或在�好�有一个�用�供方注册时自动选择),因此执行时抛出的 `WebError` 能解释�索或 fetch 能力为何无法�行。 +由三个包构�的 Service Definition / Service Provider / Consumer 拆分沿用 bash 和 filesystem 的模�,但*接�*包更接近 LLM(大语言模型) seam。`LlmRuntime`(`packages/llm/llm/src/index.ts`)是一个按�称键控的�供方注册表:`registerAdapter(models, adapter)` 将适�器存入 `Map`�返回 disposer�对��键抛出 `DUPLICATE_ADAPTER`�在解�时抛出 `NO_ADAPTER`。`ctx.web` 沿用该注册表形状,但有两�能力类别和更丰富的选择策略(�置的�供方 id,或在�好�有一个�用�供方注册时自动选择),因此执行时抛出的 `WebError` 能解释�索或 fetch 能力为何无法�行。 �赖方�与 bash 和 filesystem 一致: diff --git a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.i18n.yaml index 384a870dd0..aad3aa26f0 100644 --- a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md -2026-07-07-tool-call-timeout-policy.md: 20ca57cee4cd3ae51e7bfb8af1d2a1f8c7edd743 -2026-07-07-tool-call-timeout-policy.zh.md: 5b91c29f5492a36bbd023a892f0f2f8dd857ae53 +2026-07-07-tool-call-timeout-policy.md: ce414e541f8e374dd48e46d68cb00121e0004247 +2026-07-07-tool-call-timeout-policy.zh.md: 6fe3c979a3c4e7b7a6ed803a47af45ad32d52cce diff --git a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md index 20ca57cee4..ce414e541f 100644 --- a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md +++ b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.md @@ -16,7 +16,7 @@ Tool-call timeout is a policy that applies only to model-facing tool execution, - `@deepseek-ai/dsh-timeout` remains the shared library that owns `deadline()` and `timeoutOf()`. - `@deepseek-ai/dsh-tools` has an around-dispatch waterfall, `tools/execute`, between `tools/pre-execute` and `tools/post-execute`. -- The [repository naming contract](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md) names `@deepseek-ai/dsh-tool-call-timeout-policy` for the exact operation it limits. The plugin reads each tool's declared `timeoutMs` from the runtime and wraps a call that has one by deriving a new `exec.signal`. +- The [repository naming contract](2026-08-11-repository-naming-contract-and-rename-ledger.md) names `@deepseek-ai/dsh-tool-call-timeout-policy` for the exact operation it limits. The plugin reads each tool's declared `timeoutMs` from the runtime and wraps a call that has one by deriving a new `exec.signal`. The execution pipeline is: diff --git a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.zh.md b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.zh.md index 5b91c29f54..6fe3c979a3 100644 --- a/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-07-tool-call-timeout-policy.zh.md @@ -16,7 +16,7 @@ Status: implemented - `@deepseek-ai/dsh-timeout` �是拥有 `deadline()` 和 `timeoutOf()` 的共享库。 - `@deepseek-ai/dsh-tools` 在 `tools/pre-execute` 和 `tools/post-execute` 之间有一个环绕分�的 waterfall(瀑布�事件)`tools/execute`。 -- [仓库命�约定](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md)使用 `@deepseek-ai/dsh-tool-call-timeout-policy`,准确说明该策略所�制的�作。�件从 runtime 读��个工具声明的 `timeoutMs`,并通过派生新的 `exec.signal` �包装有此声明的调用。 +- [仓库命�约定](2026-08-11-repository-naming-contract-and-rename-ledger.md)使用 `@deepseek-ai/dsh-tool-call-timeout-policy`,准确说明该策略所�制的�作。�件从 runtime 读��个工具声明的 `timeoutMs`,并通过派生新的 `exec.signal` �包装有此声明的调用。 执行�水线如下: diff --git a/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.i18n.yaml index a79104468c..3f4683f480 100644 --- a/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.md -2026-07-14-provider-routed-llm-adapters.md: e1eaf52f21481a7c65e85effb7607b16f9b0ffdd -2026-07-14-provider-routed-llm-adapters.zh.md: 4e620408dabffc8368293635613afb5778b6e822 +2026-07-14-provider-routed-llm-adapters.md: 78c8d6788006c503b532ff2bbddd30342415f0a4 +2026-07-14-provider-routed-llm-adapters.zh.md: 5e73cab5f1f2b1296c9a486d1c833e95bb5674a0 diff --git a/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.md b/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.md index e1eaf52f21..78c8d67880 100644 --- a/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.md +++ b/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.md @@ -40,9 +40,9 @@ pi-ai's common stream options do not expose stop sequences. `dsh-llm-pi-ai` reje Assistant messages carry the request's `provider` and `model`, plus an optional JSON-serializable adapter replay state. A successful `assistant/message` session event records those fields and `deriveMessages()` returns them with the assistant message. User, system, context, and tool-result messages carry no assistant route fields. The provider/model fields are authoritative loop data; an adapter owns only its opaque replay-state payload. -A terminal successful `finish` chunk may carry replay state, and `BlockAssembler` retains it alongside usage and finish reason. The loop attaches that state to the assembled assistant message's model source without exposing a response-rewrite hook. Error and aborted responses do not produce a normal assistant message and therefore do not enter future model history. +A terminal successful `finish` chunk may carry replay state as a `ReplayEnvelope`: opaque response-level metadata plus optional per-block entries aligned with the emitted block sequence. `BlockAssembler` makes one keep/drop decision for content and metadata — when max-token assembly drops a tool call, the envelope loses the entry at the same position — so the state the loop attaches to the assembled assistant message's model source always describes the stored blocks, per the [max-token replay-state alignment decision](../bug-fix/2026-08-15-max-token-replay-state-alignment.md). The loop exposes no response-rewrite hook. Error and aborted responses do not produce a normal assistant message and therefore do not enter future model history. -The pi-ai replay state is a versioned, minimal projection of its successful `AssistantMessage`: source API/provider/model, response id/model, stop reason, and index-aligned text, thinking, and tool-call signatures. It does not duplicate text or tool arguments already carried by Harness content blocks, and it omits diagnostics, timestamps, usage, and errors. On a later request, `LlmRuntime` gives replay state to the target adapter only when the historical provider and target provider are currently owned by the same adapter instance. That adapter combines the logged Harness content with replay state when it can restore the historical response, and owns any required cross-model or cross-provider conversion. An adapter receiving replay state with an unknown version or mismatched block shape fails explicitly; a different adapter receives only provider-neutral content plus provider/model fields. +The pi-ai replay state fills that envelope with a versioned, minimal projection of its successful `AssistantMessage`: a response half (source API/provider/model, response id/model, stop reason) and per-block text, thinking, and tool-call signatures. It does not duplicate text or tool arguments already carried by Harness content blocks, and it omits diagnostics, timestamps, usage, and errors. On a later request, `LlmRuntime` gives replay state to the target adapter only when the historical provider and target provider are currently owned by the same adapter instance. That adapter combines the logged Harness content with replay state when it can restore the historical response, and owns any required cross-model or cross-provider conversion. Durable content stays authoritative: an adapter receiving replay state it cannot use — an unknown kind or version, malformed metadata, or a block shape that no longer matches the content — degrades that message to provider-neutral conversion with a diagnostic; a different adapter receives only provider-neutral content plus provider/model fields. This state is model-visible replay input and therefore follows the existing [reconstructable-request rule](2026-07-05-reconstructable-requests.md): it is present in both the terminal `finish` chunk and the assembled `assistant/message` model source that drives derivation. Resume and fork preserve it verbatim. Compaction that shadows the assistant message also removes its replay state from the active surface; the summary is ordinary provider-neutral content. diff --git a/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.zh.md b/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.zh.md index 4e620408da..5e73cab5f1 100644 --- a/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-14-provider-routed-llm-adapters.zh.md @@ -40,9 +40,9 @@ pi-ai 的通用�选项�支��止�列。若 Harness `stop` 选项已定 助手消��带请求的 `provider` 和 `model`,以��选的 JSON ��列化适�器回放状�。�功的 `assistant/message` 会�事件记录这些字段,`deriveMessages()` 返回助手消�时也会包�它们。用户�系统�上下文与工具结果消���带助手路由字段。�供方/模型字段是 agent loop 的��数�;适�器仅拥有其��明回放状� payload。 -�功的终止 `finish` 分片�以�带回放状�,`BlockAssembler` 会将其与 token 用�和结�原因一起�留。agent loop 会把该状�附加到已组装助手消�的模型��中,但�公开�应改写钩�。错误或中止�应�会生�正常助手消�,因此�会进入�续模型历�。 +�功的终止 `finish` 分片�以以 `ReplayEnvelope` 形��带回放状�:��明的�应级元数�,加上与�射��列对�的�选���目。`BlockAssembler` 对内容与元数���一次�留/丢弃决定——max-token 组装丢弃工具调用时,数��一�置的�目一并丢弃——因此 agent loop 附加到已组装助手消�模型��中的状�始终�述存储的�,� [max-token 回放状�对�决定](../bug-fix/2026-08-15-max-token-replay-state-alignment.md)。agent loop �公开�应改写钩�。错误或中止�应�会生�正常助手消�,因此�会进入�续模型历�。 -pi-ai 回放状�是其�功 `AssistantMessage` 的带版本最�投影,包�� API/�供方/模型��应 ID/模型��止原因,以�按索引对�的文本签��thinking 签�和工具调用签�。它�会�� Harness 内容�中已有的文本或工具�数,也�包�诊断信��时间戳�用�或错误。�续请求中,�有历��供方和目标�供方当�归�一个适�器实例所有时,`LlmRuntime` �会把回放状�交给目标适�器。适�器在能够��历��应时,将 Harness 记录的内容与回放状�组�,并负责所需的跨模型或跨�供方转�。适�器收到未知版本或�形状�匹�的回放状�时会显�失败;其他适�器�能收到�供方无关的内容以��供方/模型字段。 +pi-ai 回放状�用其�功 `AssistantMessage` 的带版本最�投影填充该结构:一个�应�区(� API/�供方/模型��应 ID/模型��止原因),以���的文本签��thinking 签�和工具调用签�。它�会�� Harness 内容�中已有的文本或工具�数,也�包�诊断信��时间戳�用�或错误。�续请求中,�有历��供方和目标�供方当�归�一个适�器实例所有时,`LlmRuntime` �会把回放状�交给目标适�器。适�器在能够��历��应时,将 Harness 记录的内容与回放状�组�,并负责所需的跨模型或跨�供方转�。�久化内容����:适�器收到无法使用的回放状�——未知 kind 或版本�格�错误的元数��或与内容��匹�的�结构——会把该消��级为�供方无关转�并带出诊断;其他适�器�能收到�供方无关的内容以��供方/模型字段。 该状�属于模型��的回放输入,因此�循现有的[请求��建规则](2026-07-05-reconstructable-requests.md):它�时存在于终止 `finish` 分片和驱动派生的已组装 `assistant/message` 模型��中。��和 fork 会原样�留该状�。压缩(compaction)�蔽助手消�时,也会从活动 surface 中移除其回放状�;摘�属于普通的�供方无关内容。 diff --git a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.i18n.yaml index 7e8eb5c17d..48967a6faa 100644 --- a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md -2026-07-24-adapter-owned-reasoning-effort-capabilities.md: f71a15626b97090a89f071e552a12b1f89173620 -2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md: 6e8c99f98107e2855aa7cb7ea759544013d0ea8a +2026-07-24-adapter-owned-reasoning-effort-capabilities.md: f59e5d351970e785e6ade32797f1c1a5dd9e2591 +2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md: 6e657a90e8ef3cd400a3e252f728bb1aadd9f4f2 diff --git a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md index f71a15626b..f59e5d3519 100644 --- a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md +++ b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.md @@ -14,7 +14,7 @@ Reasoning strength was adapter configuration only, so a conversation could not d `LlmCallConfig` and `GenerateOptions` carry the optional effort. The agent loop prepares the post-`agent/request` config under the active turn signal before writing `request/header`, so defaults and dynamic changes are model-visible only after becoming durable facts. The prepared call retains the exact adapter registration across asynchronous exact-model resolution, durable header logging, and dispatch; direct `LlmRuntime.stream()` calls likewise capture their final registration before awaiting resolution. A route with no registered adapter retains its proposed config so an `llm/stream` middleware can own and short-circuit it; terminal dispatch still rejects an unhandled route. A resumed loop retains the logged effort only when its initial provider/model route is unchanged; a route change discards the previous model's opaque id. -The native DeepSeek adapter advertises `off`, `high`, and `max` when deployment policy permits thinking, and defaults to the configured effort or `high`. Its adapter-owned `off` maps to `thinking.type: disabled` with no `reasoning_effort`; `high` and `max` enable thinking and carry their official wire effort. A `thinking: disabled` deployment publishes only `off` and rejects attempts to enable thinking before provider I/O. The pi-ai adapter publishes each exact model's `getSupportedThinkingLevels()` result unchanged, including `off`, preserves an absent profile default as a provider default, and leaves provider wire-value mapping inside pi-ai. Its common stream options represent `off` by omitting `reasoning`, as required by pi-ai's own API. +The native DeepSeek adapter advertises `off`, `low`, `high`, and `max` when deployment policy permits thinking, and defaults to the configured effort or `high`. Its adapter-owned `off` maps to `thinking.type: disabled` with no `reasoning_effort`; `low`, `high`, and `max` enable thinking and carry their same-named official wire effort. A `thinking: disabled` deployment publishes only `off` and rejects attempts to enable thinking before provider I/O. The pi-ai adapter publishes each exact model's `getSupportedThinkingLevels()` result unchanged, including `off`, preserves an absent profile default as a provider default, and leaves provider wire-value mapping inside pi-ai. Its common stream options represent `off` by omitting `reasoning`, as required by pi-ai's own API. ## Alternatives considered diff --git a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md index 6e8c99f981..6e657a90e8 100644 --- a/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-24-adapter-owned-reasoning-effort-capabilities.zh.md @@ -14,7 +14,7 @@ Status: implemented `LlmCallConfig` 和 `GenerateOptions` �带�选的推�强度。agent loop 在活跃轮次信�的控制下准备 `agent/request` 处�完��的�置,�写入 `request/header`,因此默认值和动��更�有�为�久化事实��对模型��。准备完�的调用在异步确切模型解��请求头�久记录和分派全程�留�一项确切的适�器注册;直接调用 `LlmRuntime.stream()` 时,也会在等待解���获最终的适�器注册。没有已注册适�器的路由会�留原定�置,使 `llm/stream` 中间件�以接管并短路该请求;若�未得到处�,最终分�会拒�该路由。���的 agent loop 仅在�始�供方/模型路由未�时�留日志中记录的推�强度;如果路由�生�化,则丢弃上一模型的��明 ID。 -当部署策略�许�考时,原生 DeepSeek 适�器声明 `off`�`high` 和 `max`,默认使用�置指定的推�强度,若未�置则使用 `high`。由适�器�有的 `off` 映射为 `thinking.type: disabled`,且�带 `reasoning_effort`;`high` 和 `max` 会�用�考并�带�自的官方�议强度值。�置为 `thinking: disabled` 的部署仅声明 `off`,并会在�供方 I/O �拒��用�考的�试。pi-ai 适�器原样�布�个确切模型的 `getSupportedThinkingLevels()` 结果,其中包括 `off`;profile 未指定默认值时�留�供方默认行为,并将�供方�议值的映射留在 pi-ai 内部。按照 pi-ai 自身 API 的�求,其通用�选项通过�略 `reasoning` �表示 `off`。 +当部署策略�许�考时,原生 DeepSeek 适�器声明 `off`�`low`�`high` 和 `max`,默认使用�置指定的推�强度,若未�置则使用 `high`。由适�器�有的 `off` 映射为 `thinking.type: disabled`,且�带 `reasoning_effort`;`low`�`high` 和 `max` 会�用�考并�带�自的��官方�议强度值。�置为 `thinking: disabled` 的部署仅声明 `off`,并会在�供方 I/O �拒��用�考的�试。pi-ai 适�器原样�布�个确切模型的 `getSupportedThinkingLevels()` 结果,其中包括 `off`;profile 未指定默认值时�留�供方默认行为,并将�供方�议值的映射留在 pi-ai 内部。按照 pi-ai 自身 API 的�求,其通用�选项通过�略 `reasoning` �表示 `off`。 ## 备选方案 diff --git a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.i18n.yaml index dfc3a79832..5d60dee0d3 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md -2026-07-26-job-registry-seam.md: 5a77e8e8098a135dd25abeb11c68127fd9f1b4e9 -2026-07-26-job-registry-seam.zh.md: fdc0912eca0b7ba01241137020e8e028c5480e2f +2026-07-26-job-registry-seam.md: b4a8a66ef63f1a4955e2497cad2d0d0b1ef138ec +2026-07-26-job-registry-seam.zh.md: ebab92029ddb9edd4c7085eef0d8cc83e9289bd9 diff --git a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md index 5a77e8e809..b4a8a66ef6 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md +++ b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.md @@ -6,17 +6,17 @@ English | [中文](2026-07-26-job-registry-seam.zh.md) ## Problem -The [background-job runtime](2026-06-20-generic-long-running-tool-runtime.md) shipped `JobRegistry` as one concrete package: `@deepseek-ai/dsh-jobs` owned both the `ctx.jobs` contract every producer and controller programs against and the process-local provider (the in-memory store, settlement bookkeeping, owner-cleanup effects, teardown). That bundling recouples the two rates of change the repository's [capability-seam rule](2026-06-13-capability-seams.md) separates: swapping the registry's storage or lifecycle backend would churn the same package whose types and `ctx.jobs` API producers (`dsh-tool-bash`, `dsh-tool-terminal`, `dsh-tool-subagent`), the controller (`dsh-tool-jobs`), and `JobKindMap` extenders import. Every other swappable capability in the harness — bash, pty, fs, skill, subagent, web, session persistence — already carries the Service Definition / Service provider / Consumer split; the job registry was the remaining `core`-mode exception, guarded only by a `TODO(job-service-backend)` comment. +The [background-job runtime](2026-06-20-generic-long-running-tool-runtime.md) shipped `JobRegistry` as one concrete package: `@deepseek-ai/dsh-jobs` owned both the `ctx.jobs` contract every producer and controller programs against and the process-local provider (the in-memory store, settlement bookkeeping, owner-cleanup effects, teardown). That bundling recouples the two rates of change the repository's [capability-seam rule](2026-06-13-capability-seams.md) separates: swapping the registry's storage or lifecycle backend would churn the same package whose types and `ctx.jobs` API producers (`dsh-tool-bash`, `dsh-tool-terminal`, `dsh-tool-subagent`), the controller (`dsh-tool-jobs`), and `JobKindMap` extenders import. Every other swappable capability in the harness — bash, pty, fs, skill, subagent, web, session persistence — already carries the Service Definition / Service Provider / Consumer split; the job registry was the remaining `core`-mode exception, guarded only by a `TODO(job-service-backend)` comment. ## Decision `jobs/` is now a three-package capability family in the bash-trio shape: -- **`@deepseek-ai/dsh-jobs` (Service Definition)** — the abstract `JobRegistry extends Service` owning `ctx.jobs`, the nine-method contract (`start`, `list`, `get`, `read`, `kill`, `wait`, `onJobDone`, `onJobsChanged`, `attachController`), all vocabulary types (`JobId`, `JobKindMap`, `JobStart`, `JobHooks`, `JobOutcome`, `JobSnapshot`, `JobRead`, `JobDoneListener`), and the snapshot invariant companion. The class-level JSDoc states the semantics every Service provider owes: registrations outlive producer and controller fibers, owned access is session-fenced, settlement is first-wins with contained listeners, and `start` refuses work while no attached job controller serves the spec's owner (controllers and listeners are scope-layered, so one process-wide registry answers both questions per owner). -- **`@deepseek-ai/dsh-jobs-local` (Service provider)** — `LocalJobRegistry`, the process-local registry: the in-memory store, per-kind id counters, waiter bookkeeping, `TASK_WAIT_TIMEOUT` deadline code, owner-cleanup effects, force-fail teardown, and the default-10 configurable admission policy. Admission derives `running` plus `stopping` capacity from the same records per exact owner, with one unowned bucket; it adds no public count or second state owner. The `dsh-timeout` dependency and Schemastery-owned provider config live here; the Service Definition package has no provider dependencies. +- **`@deepseek-ai/dsh-jobs` (Service Definition)** — the abstract `JobRegistry extends Service` owning `ctx.jobs`, the nine-method contract (`start`, `list`, `get`, `read`, `kill`, `wait`, `onJobDone`, `onJobsChanged`, `attachController`), all vocabulary types (`JobId`, `JobKindMap`, `JobStart`, `JobHooks`, `JobOutcome`, `JobSnapshot`, `JobRead`, `JobDoneListener`), and the snapshot invariant companion. The class-level JSDoc states the semantics every Service Provider owes: registrations outlive producer and controller fibers, owned access is session-fenced, settlement is first-wins with contained listeners, and `start` refuses work while no attached job controller serves the spec's owner (controllers and listeners are scope-layered, so one process-wide registry answers both questions per owner). +- **`@deepseek-ai/dsh-jobs-local` (Service Provider)** — `LocalJobRegistry`, the process-local registry: the in-memory store, per-kind id counters, waiter bookkeeping, `TASK_WAIT_TIMEOUT` deadline code, owner-cleanup effects, force-fail teardown, and the default-10 configurable admission policy. Admission derives `running` plus `stopping` capacity from the same records per exact owner, with one unowned bucket; it adds no public count or second state owner. The `dsh-timeout` dependency and Schemastery-owned provider config live here; the Service Definition package has no provider dependencies. - **`@deepseek-ai/dsh-tool-jobs` (Consumer)** — unchanged; it injects `'jobs'` and never imports provider types. -Compositions load `dsh-jobs-local` where they previously loaded `dsh-jobs` (the CLI cordis.yml row, `agent-spine-demo`, test harnesses, the tool-catalog generator boot). Producer misconfiguration diagnostics ("background jobs unavailable: load …") name `dsh-jobs` — the Service Definition package that declares the absent `ctx.jobs` service — and the Service Definition package's own APIs (its README and the direct-mount fence) point at Service providers, so the producer message stays correct when another backend becomes the recommended default. Producers, `JobKindMap` declaration merges, and the controller keep importing `@deepseek-ai/dsh-jobs` only. +Compositions load `dsh-jobs-local` where they previously loaded `dsh-jobs` (the CLI cordis.yml row, `agent-spine-demo`, test harnesses, the tool-catalog generator boot). Producer misconfiguration diagnostics ("background jobs unavailable: load …") name `dsh-jobs` — the Service Definition package that declares the absent `ctx.jobs` service — and the Service Definition package's own APIs (its README and the direct-mount fence) point at Service Providers, so the producer message stays correct when another backend becomes the recommended default. Producers, `JobKindMap` declaration merges, and the controller keep importing `@deepseek-ai/dsh-jobs` only. The seam keeps the in-process contract semantics unchanged: `JobStart.run()` still passes callbacks and exact `Agent` objects, so a durable or cross-process backend still has design work to do before it can satisfy this Service Definition (identity, restart, ownership, observation). The split moves that future work out of every Consumer's dependency graph; it does not pre-design the backend. @@ -30,6 +30,6 @@ The seam keeps the in-process contract semantics unchanged: `JobStart.run()` sti ## Consequences -Bought: the job registry now matches the repository-wide seam shape; a durable, remote, or instrumented registry is a sibling Service provider implementing nine abstract methods, and no producer, controller, or `JobKindMap` extender changes when one lands. The Service Definition README states the contract; the provider README owns the lifecycle bookkeeping facts. The registry behavior suite (owner cleanup, settlement, waits, teardown) lives with `dsh-jobs-local`; the Service Definition package keeps a stub-subclass test pinning registration under `ctx.jobs` and single-service duplication behavior, plus the probe-based invariant suite. +Bought: the job registry now matches the repository-wide seam shape; a durable, remote, or instrumented registry is a sibling Service Provider implementing nine abstract methods, and no producer, controller, or `JobKindMap` extender changes when one lands. The Service Definition README states the contract; the provider README owns the lifecycle bookkeeping facts. The registry behavior suite (owner cleanup, settlement, waits, teardown) lives with `dsh-jobs-local`; the Service Definition package keeps a stub-subclass test pinning registration under `ctx.jobs` and single-service duplication behavior, plus the probe-based invariant suite. -Cost: one more package (manifest, tsconfig, README, invariant companion), and compositions must name the Service provider package. `abstract` erases at runtime and this package name used to be the mountable registry, so the Service Definition constructor fails loudly when mounted directly — a stale composition row gets "load a Service provider such as @deepseek-ai/dsh-jobs-local" at load time instead of a half-registered `ctx.jobs` failing far from the misconfiguration. +Cost: one more package (manifest, tsconfig, README, invariant companion), and compositions must name the Service Provider package. `abstract` erases at runtime and this package name used to be the mountable registry, so the Service Definition constructor fails loudly when mounted directly — a stale composition row gets "load a Service Provider such as @deepseek-ai/dsh-jobs-local" at load time instead of a half-registered `ctx.jobs` failing far from the misconfiguration. diff --git a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.zh.md b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.zh.md index fdc0912eca..ebab92029d 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-26-job-registry-seam.zh.md @@ -6,30 +6,30 @@ Status: implemented ## 问题 -[��任务�行时](2026-06-20-generic-long-running-tool-runtime.md)交付时把 `JobRegistry` ��了�个具体包:`@deepseek-ai/dsh-jobs` 既拥有�个生产方和控制器��编程的 `ctx.jobs` 约定,也拥有进程内 Service provider(内存存储�结算簿记�所有者清� effect�拆除)。这��绑�新耦�了仓库[能力 seam 规则](2026-06-13-capability-seams.md)本�分离的两��化速率:一旦替�注册表的存储或生命周期�端,被�动的就是�一个包,而生产方(`dsh-tool-bash`�`dsh-tool-terminal`�`dsh-tool-subagent`)�控制器(`dsh-tool-jobs`)和 `JobKindMap` 扩展方正是从这个包导入类型与 `ctx.jobs` API。harness 中其余�项�替�能力——bash�pty�fs�skill(技能)�subagent�web�会��久化——都已具备 Service Definition / Service provider / Consumer 三分;任务注册表曾是仅剩的 `core` 模�例外,仅由一� `TODO(job-service-backend)` 注释把守。 +[��任务�行时](2026-06-20-generic-long-running-tool-runtime.md)交付时把 `JobRegistry` ��了�个具体包:`@deepseek-ai/dsh-jobs` 既拥有�个生产方和控制器��编程的 `ctx.jobs` 约定,也拥有进程内 Service Provider(内存存储�结算簿记�所有者清� effect�拆除)。这��绑�新耦�了仓库[能力 seam 规则](2026-06-13-capability-seams.md)本�分离的两��化速率:一旦替�注册表的存储或生命周期�端,被�动的就是�一个包,而生产方(`dsh-tool-bash`�`dsh-tool-terminal`�`dsh-tool-subagent`)�控制器(`dsh-tool-jobs`)和 `JobKindMap` 扩展方正是从这个包导入类型与 `ctx.jobs` API。harness 中其余�项�替�能力——bash�pty�fs�skill(技能)�subagent�web�会��久化——都已具备 Service Definition / Service Provider / Consumer 三分;任务注册表曾是仅剩的 `core` 模�例外,仅由一� `TODO(job-service-backend)` 注释把守。 ## 决策 `jobs/` 如今是一个 bash 三件套形�的三包能力家�: -- **`@deepseek-ai/dsh-jobs`(Service Definition)**——抽象的 `JobRegistry extends Service`,拥有 `ctx.jobs`��个方法的约定(`start`�`list`�`get`�`read`�`kill`�`wait`�`onJobDone`�`onJobsChanged`�`attachController`)�全部�汇类型(`JobId`�`JobKindMap`�`JobStart`�`JobHooks`�`JobOutcome`�`JobSnapshot`�`JobRead`�`JobDoneListener`),以�快照����套�件。类级 JSDoc 陈述了�个 Service provider 都必须兑现的语义:注册的存续期长于生产方与控制器的 fiber,有所有者的访问以会�为界,结算�循首次结果优先且监�器错误被隔离,并且当没有任何已附加的任务控制器�务于 spec 的所有者时 `start` 拒��动工作(控制器与监�器按 scope 分层,因此一个进程级注册表能�所有者地回答这两个问题)。 -- **`@deepseek-ai/dsh-jobs-local`(Service provider)**——`LocalJobRegistry`,�进程内注册表:内存存储�按 kind 划分的 id 计数器�等待方簿记�`TASK_WAIT_TIMEOUT` deadline 代��所有者清� effect�强制失败的拆除,以�默认值为 10 且��置的准入策略。准入从�一组记录中按确切 owner 派生 `running` 加 `stopping` 容�,并为无 owner 任务使用一个共享桶;它�新增公开计数或第二个状� owner。`dsh-timeout` �赖与由 Schemastery 管�的 Service provider �置都�于此包;Service Definition 包��任何�供方�赖。 +- **`@deepseek-ai/dsh-jobs`(Service Definition)**——抽象的 `JobRegistry extends Service`,拥有 `ctx.jobs`��个方法的约定(`start`�`list`�`get`�`read`�`kill`�`wait`�`onJobDone`�`onJobsChanged`�`attachController`)�全部�汇类型(`JobId`�`JobKindMap`�`JobStart`�`JobHooks`�`JobOutcome`�`JobSnapshot`�`JobRead`�`JobDoneListener`),以�快照����套�件。类级 JSDoc 陈述了�个 Service Provider 都必须兑现的语义:注册的存续期长于生产方与控制器的 fiber,有所有者的访问以会�为界,结算�循首次结果优先且监�器错误被隔离,并且当没有任何已附加的任务控制器�务于 spec 的所有者时 `start` 拒��动工作(控制器与监�器按 scope 分层,因此一个进程级注册表能�所有者地回答这两个问题)。 +- **`@deepseek-ai/dsh-jobs-local`(Service Provider)**——`LocalJobRegistry`,�进程内注册表:内存存储�按 kind 划分的 id 计数器�等待方簿记�`TASK_WAIT_TIMEOUT` deadline 代��所有者清� effect�强制失败的拆除,以�默认值为 10 且��置的准入策略。准入从�一组记录中按确切 owner 派生 `running` 加 `stopping` 容�,并为无 owner 任务使用一个共享桶;它�新增公开计数或第二个状� owner。`dsh-timeout` �赖与由 Schemastery 管�的 Service Provider �置都�于此包;Service Definition 包��任何�供方�赖。 - **`@deepseek-ai/dsh-tool-jobs`(Consumer)**——����;它注入 `'jobs'`,从�导入�供方类型。 -�组�在原先加载 `dsh-jobs` 的�置改为加载 `dsh-jobs-local`:CLI(命令行界�)的 cordis.yml �置项�`agent-spine-demo`��测试 harness,以�工具目录生�器的�动�程。生产方的�置错误诊断信�(「background jobs unavailable: load …�)点� `dsh-jobs`——�声明缺失的 `ctx.jobs` �务的 Service Definition 包;Service Definition 包自身的 API(其 README 与直接挂载防线)会指�� Service provider,因此当�一个�端日��为推�默认时,生产方的消��旧正确。生产方�`JobKindMap` 声明�并和控制器�然�导入 `@deepseek-ai/dsh-jobs`。 +�组�在原先加载 `dsh-jobs` 的�置改为加载 `dsh-jobs-local`:CLI(命令行界�)的 cordis.yml �置项�`agent-spine-demo`��测试 harness,以�工具目录生�器的�动�程。生产方的�置错误诊断信�(「background jobs unavailable: load …�)点� `dsh-jobs`——�声明缺失的 `ctx.jobs` �务的 Service Definition 包;Service Definition 包自身的 API(其 README 与直接挂载防线)会指�� Service Provider,因此当�一个�端日��为推�默认时,生产方的消��旧正确。生产方�`JobKindMap` 声明�并和控制器�然�导入 `@deepseek-ai/dsh-jobs`。 该 seam ��进程内约定语义��:`JobStart.run()` �然传入回调和确切的 `Agent` 对象,因此�久化或跨进程�端在能满足此 Service Definition 之��有设计工作��(身份����所有��观察)。这次拆分把该项未�工作移出了�个 Consumer 的�赖图;它并�预先设计�端。 ## 曾考虑的替代方案 -**在第二个�端出现之���具体�务(维�现状)。**这正是�行时 Agent Note 当�的立场:在第二个 Service provider 出现�抽� Service Definition,�能固化错误的边界。该方案�选,因为这�边界已��是臆测:�个�务方法�其语义自引入以�在�一次生产方集�中都��稳定,它们正是 `dsh-tool-jobs` 与�生产方已���编程的那套接�,而且仓库约定默认将�替�能力拆�三个包。剩余风险(�久化�端�能需��更约定)�因这次拆分而改�:无论拆分与�,这类�更都会�在 Service Definition 包里;而若维�现状,它们今天还会连带�动�个 Consumer 的�供方�赖。 +**在第二个�端出现之���具体�务(维�现状)。**这正是�行时 Agent Note 当�的立场:在第二个 Service Provider 出现�抽� Service Definition,�能固化错误的边界。该方案�选,因为这�边界已��是臆测:�个�务方法�其语义自引入以�在�一次生产方集�中都��稳定,它们正是 `dsh-tool-jobs` 与�生产方已���编程的那套接�,而且仓库约定默认将�替�能力拆�三个包。剩余风险(�久化�端�能需��更约定)�因这次拆分而改�:无论拆分与�,这类�更都会�在 Service Definition 包里;而若维�现状,它们今天还会连带�动�个 Consumer 的�供方�赖。 -**在�个包内仅抽� Service Definition(在具体类�导出一个抽象类)。**�决,因为它在�作层�并未分离任何东西:Consumer �然�赖�带 Service provider �其�赖项的那个包,而替��端若�把本地 Service provider 纳入自身�赖图,就�然无法�布。在这里,包边界�是独立演进的��。 +**在�个包内仅抽� Service Definition(在具体类�导出一个抽象类)。**�决,因为它在�作层�并未分离任何东西:Consumer �然�赖�带 Service Provider �其�赖项的那个包,而替��端若�把本地 Service Provider 纳入自身�赖图,就�然无法�布。在这里,包边界�是独立演进的��。 **拆出 `types.ts` 但让�务��具体。**基于�样的�由�决:类型并�是完整能力,`ctx.jobs` Service Definition �其方法约定�是。生产方需�的是�务键和语义,而��是类型形状。 ## �果 -��的是:任务注册表如今与全仓库通行的 seam 形�一致;�久化�远程或带�桩的注册表将是一个实现�个抽象方法的�级 Service provider,这样的注册表�地时,任何生产方�控制器或 `JobKindMap` 扩展方都无需改动。Service Definition 的 README 陈述约定;生命周期簿记方�的事实归 Service provider 的 README 所有。注册表行为测试套件(所有者清��结算�等待�拆除)� `dsh-jobs-local` 存放;Service Definition 包�留一个桩�类(stub subclass)测试,固定 `ctx.jobs` 下的注册行为与�一�务的��注册行为,外加基于探针的���测试套件。 +��的是:任务注册表如今与全仓库通行的 seam 形�一致;�久化�远程或带�桩的注册表将是一个实现�个抽象方法的�级 Service Provider,这样的注册表�地时,任何生产方�控制器或 `JobKindMap` 扩展方都无需改动。Service Definition 的 README 陈述约定;生命周期簿记方�的事实归 Service Provider 的 README 所有。注册表行为测试套件(所有者清��结算�等待�拆除)� `dsh-jobs-local` 存放;Service Definition 包�留一个桩�类(stub subclass)测试,固定 `ctx.jobs` 下的注册行为与�一�务的��注册行为,外加基于探针的���测试套件。 -代价是:多出一个包,�多一份 manifest(元数�清�)�tsconfig�README 与����套�件;�时�组�必须点� Service provider 包。`abstract` 在�行时会被擦除,而这个包�过去正是�挂载的具体注册表,因此直接挂载 Service Definition 时,其构造函数会明确报错——一�陈旧的组��置行会在加载时得到「load a Service provider such as @deepseek-ai/dsh-jobs-local�,而�是一个未完整注册的 `ctx.jobs` 在远离错误�置处�失败。 +代价是:多出一个包,�多一份 manifest(元数�清�)�tsconfig�README 与����套�件;�时�组�必须点� Service Provider 包。`abstract` 在�行时会被擦除,而这个包�过去正是�挂载的具体注册表,因此直接挂载 Service Definition 时,其构造函数会明确报错——一�陈旧的组��置行会在加载时得到「load a Service Provider such as @deepseek-ai/dsh-jobs-local�,而�是一个未完整注册的 `ctx.jobs` 在远离错误�置处�失败。 diff --git a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.i18n.yaml index 03c1e1092e..8422759a46 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md -2026-07-26-subprocess-seam.md: f738c5be517d7f915cf5cb0f42506339259c62a2 -2026-07-26-subprocess-seam.zh.md: 078648d1d676f2d5889df4ec5793de687713cbb9 +2026-07-26-subprocess-seam.md: aa7a989a0321760c9bc278df8356a57f4dd0d459 +2026-07-26-subprocess-seam.zh.md: 22de6774b866b9b7a0248dc7b06587f7f3235fdc diff --git a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md index f738c5be51..aa7a989a03 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md +++ b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.md @@ -13,7 +13,7 @@ English | [中文](2026-07-26-subprocess-seam.zh.md) A new `subprocess/` capability family owns "run and manage a process"; the bash family keeps "run a bash command" and consumes it: - **`@deepseek-ai/dsh-subprocess` (Service Definition)** — the abstract `SubprocessRuntime` owning `ctx.subprocess`: executable lookup, fully explicit ordinary spawns, and the terminal primitive added by the [portable execution-world decision](2026-07-28-portable-execution-world-consumers.md). Each stdio stream independently selects `'pipe'`, `'inherit'`, or bounded collection `{ maxBytes, spill? }`; stdin selects `'ignore'`, `'pipe'`, or `{ data }`. `SubprocessOutcome` carries exit facts with deliberately no timeout/cancel classification, while collected output remains on the handle after settlement. The Service Definition also owns process and terminal handles, the shared scrub, and `DSH_ENV_PREFIX`/`DshEnvironment`/`CollectedOutput`; `argv` is never shell-interpreted. -- **`@deepseek-ai/dsh-subprocess-local` (Service provider)** — `LocalSubprocessRuntime` over the former `run.ts` plumbing (`spawn.ts`) plus `node-pty`: detached groups, bounded collection and private spill files, executable lookup, foreground/session inspection, and disposal that terminates and joins every managed process. `terminate()` owns TERM→grace→KILL for the tree, `waitForExit()` observes tree liveness, and injected `taskkill /T` covers Windows. Ordinary and terminal spawns apply the Service Definition's case-insensitive `KEY`/`PASSWORD`/`SECRET`/`TOKEN` scrub before explicit env. The provider has no config; every limit arrives on the spec, while Bash and PTY presentation environment overrides stay in their Consumers. +- **`@deepseek-ai/dsh-subprocess-local` (Service Provider)** — `LocalSubprocessRuntime` over the former `run.ts` plumbing (`spawn.ts`) plus `node-pty`: detached groups, bounded collection and private spill files, executable lookup, foreground/session inspection, and disposal that terminates and joins every managed process. `terminate()` owns TERM→grace→KILL for the tree, `waitForExit()` observes tree liveness, and injected `taskkill /T` covers Windows. Ordinary and terminal spawns apply the Service Definition's case-insensitive `KEY`/`PASSWORD`/`SECRET`/`TOKEN` scrub before explicit env. The provider has no config; every limit arrives on the spec, while Bash and PTY presentation environment overrides stay in their Consumers. - **`dsh-bash-local` (Consumer)** — `inject: ['subprocess']`; maps each resolved `ShellExecSpec` onto a `SubprocessSpawnSpec` (`['bash', '-c', command]`), keeps its config, `resolve()` defaulting, fused-deadline `timedOut`/`aborted` classification, the `[stderr]`-marked background read merge with its consuming cursor, and the `onProcessDone` subclass hook. `dsh-bash-sandbox` is unchanged apart from redeclaring the inherited inject; it still wraps at the command-string level and re-enters the inherited spawn path. - **`dsh-shell` (Service Definition)** — re-exports the moved vocabulary from `dsh-subprocess`, so no bash Consumer changes an import; `ShellExecRequest`/`ShellExecSpec`/`ShellProcess` and the sandbox facts remain bash-owned. diff --git a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.zh.md b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.zh.md index 078648d1d6..22de6774b8 100644 --- a/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-26-subprocess-seam.zh.md @@ -13,7 +13,7 @@ Status: implemented 新的 `subprocess/` 能力家�拥有「�行并管�一个进程�;bash 家��留「�行一� bash 命令�,并�为�者的消费方: - **`@deepseek-ai/dsh-subprocess`(Service Definition)**——拥有 `ctx.subprocess` 的抽象 `SubprocessRuntime`:�执行文件查找�完全显�的普通 spawn,以�[�移�执行环境决策](2026-07-28-portable-execution-world-consumers.md)新增的终端原语。�� stdio �独立选择 `'pipe'`�`'inherit'` 或有界收集 `{ maxBytes, spill? }`;stdin 选择 `'ignore'`�`'pipe'` 或 `{ data }`。`SubprocessOutcome` �承载刻���超时��消分类的退出事实,收集输出在结算��留在�柄上。该 Service Definition 还拥有进程与终端�柄�共享凭�清除,以� `DSH_ENV_PREFIX`/`DshEnvironment`/`CollectedOutput`;`argv` ���过 shell 解释。 -- **`@deepseek-ai/dsh-subprocess-local`(Service provider)**——`LocalSubprocessRuntime` 构建在原 `run.ts` 管�(现为 `spawn.ts`)与 `node-pty` 之上:detached 进程组�有界收集与�有 spill 文件��执行文件查找����会�检查,以�终止�个�管进程并等待其退出的 dispose。`terminate()` 拥有��进程树的 TERM→宽�→KILL,`waitForExit()` 观察进程树存活性,�注入的 `taskkill /T` 覆盖 Windows。普通与终端 spawn 都先应用 Service Definition 对 `KEY`/`PASSWORD`/`SECRET`/`TOKEN` �区分大�写的清除,��并显� env。该 Service provider 没有�置;�项�制都� spec 到达,Bash 与 PTY 的呈现环境覆盖�归�自 Consumer 所有。 +- **`@deepseek-ai/dsh-subprocess-local`(Service Provider)**——`LocalSubprocessRuntime` 构建在原 `run.ts` 管�(现为 `spawn.ts`)与 `node-pty` 之上:detached 进程组�有界收集与�有 spill 文件��执行文件查找����会�检查,以�终止�个�管进程并等待其退出的 dispose。`terminate()` 拥有��进程树的 TERM→宽�→KILL,`waitForExit()` 观察进程树存活性,�注入的 `taskkill /T` 覆盖 Windows。普通与终端 spawn 都先应用 Service Definition 对 `KEY`/`PASSWORD`/`SECRET`/`TOKEN` �区分大�写的清除,��并显� env。该 Service Provider 没有�置;�项�制都� spec 到达,Bash 与 PTY 的呈现环境覆盖�归�自 Consumer 所有。 - **`dsh-bash-local`(Consumer)**——`inject: ['subprocess']`;把�个解��的 `ShellExecSpec` 映射为一个 `SubprocessSpawnSpec`(`['bash', '-c', command]`),并�留自身�置�`resolve()` 默认值补全�基于�� deadline 的 `timedOut`/`aborted` 分类�带 `[stderr]` 标记的��读��并�其消费游标,以� `onProcessDone` �类钩�。`dsh-bash-sandbox` 除了�新声明继承�的 inject 之外没有�化;它�在命令字符串层��包装,并�新进入继承的 spawn 路径。 - **`dsh-shell`(Service Definition)**——把�走的�汇从 `dsh-subprocess` �导出,因此没有任何 bash Consumer 需�改动导入;`ShellExecRequest`/`ShellExecSpec`/`ShellProcess` 与沙箱事实�归 bash 所有。 diff --git a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.i18n.yaml index 10e1fbef20..a81c4706e7 100644 --- a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md -2026-07-27-dispose-ladder-to-consumer.md: ab2afd313448438752e15e0f89230124cb95232f -2026-07-27-dispose-ladder-to-consumer.zh.md: b181b2c3286c42d85eb91ca9ac5acf624e5c7a28 +2026-07-27-dispose-ladder-to-consumer.md: 58d835864d2f6544152fdf09cf6e93380793a2ae +2026-07-27-dispose-ladder-to-consumer.zh.md: dc7413e85fa6e52de14f51fd175c7b37b43029a4 diff --git a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md index ab2afd3134..58d835864d 100644 --- a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md +++ b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.md @@ -14,10 +14,10 @@ The ladder moves to its one consumer. `dsh-subagent-acp` owns `disposeAcpChild(c ## Alternatives considered -**Keep the ladder on the handle as a convenience.** Rejected: a Service Definition method every Service provider must implement is not a convenience, it is contract surface — and this one encodes one consumer's cooperation shape (stdin-EOF-first) as if it were process vocabulary. The seam's own README already had to caveat that children quiescing on other signals need "their own tier-1", which is the admission that the ladder is policy. +**Keep the ladder on the handle as a convenience.** Rejected: a Service Definition method every Service Provider must implement is not a convenience, it is contract surface — and this one encodes one consumer's cooperation shape (stdin-EOF-first) as if it were process vocabulary. The seam's own README already had to caveat that children quiescing on other signals need "their own tier-1", which is the admission that the ladder is policy. **Move the ladder to a shared helper package.** Rejected: one consumer. A second out-of-process backend with the same stdin-EOF cooperation shape can lift `disposeAcpChild` to shared code when it exists; extracting now would recreate `dsh-subagent-subprocess`, the single-purpose library this change deleted. ## Consequences -Bought: the Service Definition is one method and one type smaller; Service providers owe four verbs and no teardown policy; the cooperative EOF window lives beside the ACP config field that tunes it, while the subprocess owner alone owns the termination window and final join. Cost: a future backend wanting EOF-first teardown writes ~20 lines against the verbs (or lifts the ACP helper); the ladder's tier tests live in the ACP suite, and the Service Definition suite pins the verbs the ladder composes (bounded `waitForExit` false before escalation and an unbounded whole-tree join after it) instead of the composed policy. +Bought: the Service Definition is one method and one type smaller; Service Providers owe four verbs and no teardown policy; the cooperative EOF window lives beside the ACP config field that tunes it, while the subprocess owner alone owns the termination window and final join. Cost: a future backend wanting EOF-first teardown writes ~20 lines against the verbs (or lifts the ACP helper); the ladder's tier tests live in the ACP suite, and the Service Definition suite pins the verbs the ladder composes (bounded `waitForExit` false before escalation and an unbounded whole-tree join after it) instead of the composed policy. diff --git a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.zh.md b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.zh.md index b181b2c328..dc7413e85f 100644 --- a/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-27-dispose-ladder-to-consumer.zh.md @@ -14,10 +14,10 @@ Status: implemented ## 曾考虑的替代方案 -**把阶梯作为便利方法留在�柄上。**�决:一个�个 Service provider 都必须实现的 Service Definition 方法�是便利,而是约定的一部分——而这一个把�一消费方的�作模�(stdin EOF 打头)当作进程�汇�编�。seam 自己的 README 早已�得�加注「�赖其他信��能完全�稳的�进程需�自己的第一阶�,这本身就是承认该阶梯是策略。 +**把阶梯作为便利方法留在�柄上。**�决:一个�个 Service Provider 都必须实现的 Service Definition 方法�是便利,而是约定的一部分——而这一个把�一消费方的�作模�(stdin EOF 打头)当作进程�汇�编�。seam 自己的 README 早已�得�加注「�赖其他信��能完全�稳的�进程需�自己的第一阶�,这本身就是承认该阶梯是策略。 **把阶梯移到共享辅助包。**�决:�有一个消费方。当第二个具有相� stdin EOF �作模�的进程外�端出现时,�以�把 `disposeAcpChild` ��为共享代�;现在抽��会�造 `dsh-subagent-subprocess`——本次�更删掉的那个�一用途库。 ## �果 -买到的:Service Definition 少了一个方法和一个类型;Service provider �欠四个动�,�欠拆�策略;�作� EOF 时间窗与调节它的 ACP �置字段�在一起,而终止时间窗与最终的整树退出等待仅由�进程责任方拥有。代价:未�想� EOF 打头拆�的�端需针对这些动�写约 20 行(或直接� ACP 的辅助函数);阶梯的层级测试�于 ACP 套件,Service Definition 套件转而钉�阶梯所组�的动�(�级�有界 `waitForExit` 返回�,�级�无界等待整棵进程树退出),而�组��的策略。 +买到的:Service Definition 少了一个方法和一个类型;Service Provider �欠四个动�,�欠拆�策略;�作� EOF 时间窗与调节它的 ACP �置字段�在一起,而终止时间窗与最终的整树退出等待仅由�进程责任方拥有。代价:未�想� EOF 打头拆�的�端需针对这些动�写约 20 行(或直接� ACP 的辅助函数);阶梯的层级测试�于 ACP 套件,Service Definition 套件转而钉�阶梯所组�的动�(�级�有界 `waitForExit` 返回�,�级�无界等待整棵进程树退出),而�组��的策略。 diff --git a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.i18n.yaml index 69bcf2af17..77bca2bb85 100644 --- a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-29-package-regrouping.md -2026-07-29-package-regrouping.md: 35042086503167d01edc1b3bfafdef92ba4781c5 -2026-07-29-package-regrouping.zh.md: 2dfd7ba85484008138f799ff60c406807a9ecf7f +2026-07-29-package-regrouping.md: 52a1fa28e4826daa7b0bb84a37be3c094fddb68c +2026-07-29-package-regrouping.zh.md: bef55544664f6e6daf391b33ef7224c00507a908 diff --git a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.md b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.md index 3504208650..52a1fa28e4 100644 --- a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.md +++ b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.md @@ -17,7 +17,7 @@ The north star for the regrouping: **closely clustered packages share a group.** ## Decision -Five regrouping decisions remain current; every other group keeps its prior boundary and contents (the dependency analysis confirmed the capability families — `shell/`, `terminal/`, `code-runtime/`, `sandbox/`, `subprocess/`, `fs/`, `lsp/`, `web/`, `skill/`, and the rest — were already drawn correctly). The original sixth decision collected the SDK project initializer, launcher tooling, and runtime JSON-RPC packages under `scaffold/`; [removing that unreleased toolchain](../simplification/2026-08-11-remove-sdk-project-toolchain.md) deleted the project tooling and moved the surviving runtime trio to `sdk/`. The later [repository naming contract](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md) owns the `shell/`, `terminal/`, and `extensions/` group names and the two package names that this decision deferred. +Five regrouping decisions remain current; every other group keeps its prior boundary and contents (the dependency analysis confirmed the capability families — `shell/`, `terminal/`, `code-runtime/`, `sandbox/`, `subprocess/`, `fs/`, `lsp/`, `web/`, `skill/`, and the rest — were already drawn correctly). The original sixth decision collected the SDK project initializer, launcher tooling, and runtime JSON-RPC packages under `scaffold/`; [removing that unreleased toolchain](../simplification/2026-08-11-remove-sdk-project-toolchain.md) deleted the project tooling and moved the surviving runtime trio to `sdk/`. The later [repository naming contract](2026-08-11-repository-naming-contract-and-rename-ledger.md) owns the `shell/`, `terminal/`, and `extensions/` group names and the two package names that this decision deferred. | Group | Members (folder names) | From | |---|---|---| @@ -37,7 +37,7 @@ Five regrouping decisions remain current; every other group keeps its prior boun ## Later naming decisions -The [repository naming contract](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md) resolves the two names that this move deliberately deferred. `@deepseek-ai/dsh-sdk-jsonrpc-server` names the JSON-RPC server half of the runtime SDK protocol. `@deepseek-ai/dsh-tool-call-timeout-policy` names the exact operation limited by the policy while keeping its `guard/timeout-policy/` home. Their release-blocking `FIXME` markers are removed with those renames. +The [repository naming contract](2026-08-11-repository-naming-contract-and-rename-ledger.md) resolves the two names that this move deliberately deferred. `@deepseek-ai/dsh-sdk-jsonrpc-server` names the JSON-RPC server half of the runtime SDK protocol. `@deepseek-ai/dsh-tool-call-timeout-policy` names the exact operation limited by the policy while keeping its `guard/timeout-policy/` home. Their release-blocking `FIXME` markers are removed with those renames. ## What the move touched diff --git a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.zh.md b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.zh.md index 2dfd7ba854..bef5554466 100644 --- a/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-29-package-regrouping.zh.md @@ -17,7 +17,7 @@ Status: implemented ## 决策 -五项�组决策�然有效;其余�个组都��先�的边界与内容��(�赖分�确认�能力家�——`shell/`�`terminal/`�`code-runtime/`�`sandbox/`�`subprocess/`�`fs/`�`lsp/`�`web/`�`skill/` �其余——本�就划得正确)。原本的第六项决策把 SDK 项目�始化器��动器工具与�行时 JSON-RPC 包汇集到 `scaffold/`;[移除这套未�布工具链](../simplification/2026-08-11-remove-sdk-project-toolchain.md)的决策删除了项目工具,并将存留的�行时三包移到 `sdk/`。�续的[仓库命�约定](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md)负责 `shell/`�`terminal/` 与 `extensions/` 组�,以�本决策曾推迟的两个包�。 +五项�组决策�然有效;其余�个组都��先�的边界与内容��(�赖分�确认�能力家�——`shell/`�`terminal/`�`code-runtime/`�`sandbox/`�`subprocess/`�`fs/`�`lsp/`�`web/`�`skill/` �其余——本�就划得正确)。原本的第六项决策把 SDK 项目�始化器��动器工具与�行时 JSON-RPC 包汇集到 `scaffold/`;[移除这套未�布工具链](../simplification/2026-08-11-remove-sdk-project-toolchain.md)的决策删除了项目工具,并将存留的�行时三包移到 `sdk/`。�续的[仓库命�约定](2026-08-11-repository-naming-contract-and-rename-ledger.md)负责 `shell/`�`terminal/` 与 `extensions/` 组�,以�本决策曾推迟的两个包�。 | 组 | �员(目录�) | �� | |---|---|---| @@ -37,7 +37,7 @@ Status: implemented ## �续命�决策 -[仓库命�约定](../../proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md)解决了本次移动有�推迟的两个�称。`@deepseek-ai/dsh-sdk-jsonrpc-server` 表示�行时 SDK �议的 JSON-RPC �务器一侧。`@deepseek-ai/dsh-tool-call-timeout-policy` 准确表示策略所�制的�作,�时�留其 `guard/timeout-policy/` 归属。这些�命�会一并移除阻塞�布的 `FIXME` 标记。 +[仓库命�约定](2026-08-11-repository-naming-contract-and-rename-ledger.md)解决了本次移动有�推迟的两个�称。`@deepseek-ai/dsh-sdk-jsonrpc-server` 表示�行时 SDK �议的 JSON-RPC �务器一侧。`@deepseek-ai/dsh-tool-call-timeout-policy` 准确表示策略所�制的�作,�时�留其 `guard/timeout-policy/` 归属。这些�命�会一并移除阻塞�布的 `FIXME` 标记。 ## 移动触�了什么 diff --git a/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.i18n.yaml index f11d779582..674bd5bd51 100644 --- a/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.md -2026-07-30-config-plane-boundaries.md: 2dfb527749e8dea54e037abc602af1611c3f9794 -2026-07-30-config-plane-boundaries.zh.md: 8b1ec3206237b7c2deafb743b62e697b3c452ffc +2026-07-30-config-plane-boundaries.md: aab0d7a80c2732b33637ec721a9ab7c1b50fce3f +2026-07-30-config-plane-boundaries.zh.md: fb069e6dd9f276c7cc0069695b388ef37a081ab4 diff --git a/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.md b/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.md index 2dfb527749..aab0d7a80c 100644 --- a/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.md +++ b/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.md @@ -6,6 +6,8 @@ English | [中文](2026-07-30-config-plane-boundaries.zh.md) > Scope: boundary hardening of the [web configuration plane](2026-07-30-web-config-plane.md) — which namespaces reach the wire, which callers reach them, and how an editor holding a partial, possibly stale view writes without destroying what it cannot see. +> The caller boundary, the redaction, and the revision fencing remain current. Restricting which namespaces reach the wire to the configurable-provider directory is superseded by the [plugin-owned settings surface](2026-08-12-plugin-owned-settings-surface.md), which serves every registered namespace. + ## Problem The plane worked and was reachable by more callers, and with more authority, than its design claimed. diff --git a/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.zh.md b/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.zh.md index 8b1ec32062..fb069e6dd9 100644 --- a/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-30-config-plane-boundaries.zh.md @@ -6,6 +6,8 @@ Status: implemented > 范围:对 [Web �置�](2026-07-30-web-config-plane.md)的边界加固——哪些 namespace 能抵达�议�哪些调用方能抵达它们,以�一个��有局部且�能陈旧的视图的编辑器该如何写入,��会�掉它看��的东西。 +> 调用方边界�脱�与 revision 设栅�然有效。把「哪些 namespace 能抵达�议��制为��置�供方目录这一�,已被[由�件自己拥有的设置表层](2026-08-12-plugin-owned-settings-surface.md)�代——�者�务�一个已注册的 namespace。 + ## 问题 这个�能用,但能触达它的调用方�以�它们所拥有的��,都比设计声称的更多。 diff --git a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.i18n.yaml b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.i18n.yaml index 32746bd58f..bcb20fd6c8 100644 --- a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md -2026-07-31-code-runtime-portable-identifier-seam.md: 7692660c5577a9d647e8c55c8e808c1293d03e4f -2026-07-31-code-runtime-portable-identifier-seam.zh.md: 668fb46a80737d0cbf0ea79e820f1baeb17c4a5c +2026-07-31-code-runtime-portable-identifier-seam.md: 6d75f0b0872a5d4b92403f597f5551276e2d7c9f +2026-07-31-code-runtime-portable-identifier-seam.zh.md: 68515d7a4d9d26d6c510654255d36b615afc2b7d diff --git a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md index 7692660c55..6d75f0b087 100644 --- a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md +++ b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.md @@ -8,11 +8,11 @@ English | [中文](2026-07-31-code-runtime-portable-identifier-seam.zh.md) The code-runtime seam promises that a binding-namespace list valid on one backend is valid on every backend, so a Code Mode consumer can hand the same bindings to any registered runtime without knowing its language. The first backend, `dsh-code-runtime-worker-thread`, privately owned the identifier rules that enforce part of that promise: an `IDENTIFIER` regex that allowed the JS-only `$`, a `RESERVED_WORDS` set holding only ECMAScript keywords, and a `RESERVED_ERROR_PROPERTIES` set of three JS `Error` slots. Those rules described the worker's own language, not the seam's portability contract. -A second backend written against a different language (CPython) would either re-declare its own rules — letting `lambda` pass the worker and fail Python, or `$tools` pass the worker and fail every non-JS backend — or import the worker's, inverting the dependency so a Service provider reached into a sibling Service provider. Neither keeps the portability promise real: it would hold only for the backend a caller happened to test against. +A second backend written against a different language (CPython) would either re-declare its own rules — letting `lambda` pass the worker and fail Python, or `$tools` pass the worker and fail every non-JS backend — or import the worker's, inverting the dependency so a Service Provider reached into a sibling Service Provider. Neither keeps the portability promise real: it would hold only for the backend a caller happened to test against. ## Decision -The Service Definition package (`@deepseek-ai/dsh-code-runtime`) exports the portable-identifier exclusion contract as four named constants, and every Service provider imports them rather than re-declaring: +The Service Definition package (`@deepseek-ai/dsh-code-runtime`) exports the portable-identifier exclusion contract as four named constants, and every Service Provider imports them rather than re-declaring: - `PORTABLE_RESERVED_WORDS` — the union of ECMAScript and Python reserved words. A namespace global or error-class name matching any is refused on all backends, so `lambda` is refused even though it is a legal JS parameter name. Adding a language widens this union, which is a deliberate breaking review of existing binding names. - `RESERVED_BINDING_GLOBALS` — globals some backend owns in the program's namespace: `console` (the worker's log capture), `__dsh_main__`/`__builtins__`/`__name__` (the Python bootstrap's wrapper and seeded module globals), and `__debug__` (not a seeded slot but a CPython compile-time constant that rejects assignment, so an injected global under that name is unreachable — the same portability split by a different mechanism). Refused everywhere so a namespace list cannot pick a name that works on one backend and collides on another. @@ -21,7 +21,7 @@ The Service Definition package (`@deepseek-ai/dsh-code-runtime`) exports the por The Service Definition also narrows the portable identifier subset to `[A-Za-z_][A-Za-z0-9_]*` (documented on `CodeBindingNamespace.global` and `CodeBindingErrorClass`), dropping the JS-only `$`. The worker consumes the shared constants directly under their exported names — `PORTABLE_RESERVED_WORDS` for both binding-global and error-class names, `RESERVED_BINDING_GLOBALS` for backend-owned slots, `RESERVED_ERROR_MEMBERS` plus `DUNDER_MEMBER` for error members — with no local re-alias; its `IDENTIFIER` regex loses `$`. -The constants live in the Service Definition even though the worker is the only shipped backend: the whole point is that the contract is language-agnostic and owned above any single language. A Service provider that violated it would be the bug, and the shared set is where a reviewer looks to see what "portable" means. +The constants live in the Service Definition even though the worker is the only shipped backend: the whole point is that the contract is language-agnostic and owned above any single language. A Service Provider that violated it would be the bug, and the shared set is where a reviewer looks to see what "portable" means. ## Scope @@ -33,7 +33,7 @@ This decision delivers only the Service Definition extension and the worker's ad **Each backend declares its own exclusions.** Rejected: it makes the portability promise per-backend. A binding list the caller tested on the worker could be refused by Python, which is exactly the split the seam exists to prevent. -**The Python backend imports the worker's constants.** Rejected: it inverts the dependency — the seam's Service providers would reach into a sibling implementation for a contract neither owns. The contract belongs above both, at the seam. +**The Python backend imports the worker's constants.** Rejected: it inverts the dependency — the seam's Service Providers would reach into a sibling implementation for a contract neither owns. The contract belongs above both, at the seam. **Keep `$` in the portable identifier subset.** Rejected: `$` is JS-only spelling. Allowing it would let `$tools` pass the worker and fail every non-JS backend, breaking portability for a purely cosmetic gain. diff --git a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.zh.md b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.zh.md index 668fb46a80..68515d7a4d 100644 --- a/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.zh.md +++ b/.agents/notes/implemented/architecture/2026-07-31-code-runtime-portable-identifier-seam.zh.md @@ -8,11 +8,11 @@ Status: implemented code-runtime seam 承诺:在一个�端上有效的绑定命�空间列表,在�个�端上都有效,因此 Code Mode 消费方�以把�一组绑定交给任何已注册的�行时,而�必知�它的语言。首个�端 `dsh-code-runtime-worker-thread` �自拥有了执行这项承诺一部分的标识符规则:一个�许 JS 专有 `$` 的 `IDENTIFIER` 正则�一个�� ECMAScript 关键字的 `RESERVED_WORDS` 集�,以�一个�三个 JS `Error` 槽�的 `RESERVED_ERROR_PROPERTIES` 集�。这些规则�述的是 worker 自身的语言,而� seam 的�移�性约定。 -一个针对��语言(CPython)编写的第二�端,�么�新声明自己的规则——让 `lambda` 通过 worker �在 Python 上失败,或让 `$tools` 通过 worker �在�个� JS �端上失败——�么导入 worker 的规则,从而�转�赖,使一个 Service provider 伸手进入�一个兄弟 Service provider。二者都无法让�移�承诺�真:它�对调用方�好测试过的那个�端�立。 +一个针对��语言(CPython)编写的第二�端,�么�新声明自己的规则——让 `lambda` 通过 worker �在 Python 上失败,或让 `$tools` 通过 worker �在�个� JS �端上失败——�么导入 worker 的规则,从而�转�赖,使一个 Service Provider 伸手进入�一个兄弟 Service Provider。二者都无法让�移�承诺�真:它�对调用方�好测试过的那个�端�立。 ## Decision -Service Definition 包(`@deepseek-ai/dsh-code-runtime`)以四个具�常�导出�移�标识符排除约定,�个 Service provider 导入它们而��新声明: +Service Definition 包(`@deepseek-ai/dsh-code-runtime`)以四个具�常�导出�移�标识符排除约定,�个 Service Provider 导入它们而��新声明: - `PORTABLE_RESERVED_WORDS`——ECMAScript 与 Python �留字的�集。任何命�空间 global 或 error-class �称匹�其中之一,都在所有�端上被拒�,因此 `lambda` �便是�法的 JS �数�也被拒�。新增一门语言�扩宽此�集,这是对现有绑定�称的一次有�的破�性�审。 - `RESERVED_BINDING_GLOBALS`——�个�端在程�命�空间中拥有的 global:`console`(worker 的日志�获)�`__dsh_main__`/`__builtins__`/`__name__`(Python bootstrap 的包装器与预置模� global),以� `__debug__`(�是 seed 的槽�,而是 CPython 编译期常�,赋值会被拒,故以该�注入的 global ��达——�一��移�性分裂,�是机制��)。在所有�端上被拒�,使命�空间列表无法选到一个在��端能用�在�一�端冲�的�称。 @@ -21,7 +21,7 @@ Service Definition 包(`@deepseek-ai/dsh-code-runtime`)以四个具�常� Service Definition �时把�移�标识符�集收窄为 `[A-Za-z_][A-Za-z0-9_]*`(记录在 `CodeBindingNamespace.global` 与 `CodeBindingErrorClass` 上),去掉 JS 专有的 `$`。worker 直接以这些常�的导出�称消费它们——binding-global 与 error-class �称用 `PORTABLE_RESERVED_WORDS`��端拥有槽�用 `RESERVED_BINDING_GLOBALS`�error member 用 `RESERVED_ERROR_MEMBERS` 加 `DUNDER_MEMBER`——��本地起别�;其 `IDENTIFIER` 正则去掉 `$`。 -尽管 worker 是唯一已交付的�端,这些常��置于 Service Definition:�点正是该约定与语言无关,且由高于任何�一语言的层级拥有。��它的 Service provider �是 bug,而共享集�正是�审者查看「�移���义的地方。 +尽管 worker 是唯一已交付的�端,这些常��置于 Service Definition:�点正是该约定与语言无关,且由高于任何�一语言的层级拥有。��它的 Service Provider �是 bug,而共享集�正是�审者查看「�移���义的地方。 ## Scope @@ -33,7 +33,7 @@ Service Definition �时把�移�标识符�集收窄为 `[A-Za-z_][A-Za-z0 **�个�端声明自己的排除集。** 拒�:这让�移�承诺����端�立。调用方在 worker 上测过的绑定列表�能被 Python 拒�,而这正是 seam 存在�防止的分裂。 -**Python �端导入 worker 的常�。** 拒�:这�转�赖——seam 的 Service provider 会为一个二者都�拥有的约定伸手进入兄弟实现。约定属于二者之上,� seam。 +**Python �端导入 worker 的常�。** 拒�:这�转�赖——seam 的 Service Provider 会为一个二者都�拥有的约定伸手进入兄弟实现。约定属于二者之上,� seam。 **在�移�标识符�集中�留 `$`。** 拒�:`$` 是 JS 专有拼写。�许它会让 `$tools` 通过 worker �在�个� JS �端上失败,为纯粹表�的好处破��移�性。 diff --git a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.i18n.yaml index b696b46749..205757eacc 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md -2026-08-10-product-subagent-providers-in-shared-host.md: 33b6eb6cf7a6c19e9ea71cdb7dc8881e8052ef24 -2026-08-10-product-subagent-providers-in-shared-host.zh.md: fd78c7a3fee4e4ee30d27d87c752e1a23576fd85 +2026-08-10-product-subagent-providers-in-shared-host.md: a747d641ae112d114912958c289fe00b592e6ea5 +2026-08-10-product-subagent-providers-in-shared-host.zh.md: fef69e8a2d18135cbc9d5f0d80134fa5701bbbd0 diff --git a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md index 33b6eb6cf7..a747d641ae 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md +++ b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.md @@ -12,21 +12,21 @@ The placement decision must preserve two independent facts. Loading a provider m ## Decision -Every shipped Profile loads the fixed `codex` and `claude-code` providers once through the base bundle's host plane. Loading either plugin only registers a dormant backend; the corresponding Codex or Claude process starts on the first actual delegation call. Agent Presets independently contribute ordinary `dsh-tool-subagent` rows for `subagent_codex` and `subagent_claude_code`, so a preset can expose neither tool, either one, or both without changing the provider registry. +Product providers remain process-scoped host-plane registrations. The [production-install exclusion decision](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md) supersedes only this note's former base-bundle installation choice: production `dsh-base` neither depends on nor mounts them. A Profile that opts in installs the selected provider package and mounts it once on the host plane. Loading either plugin only registers a dormant backend; the corresponding Codex or Claude process starts on the first actual delegation call. Agent Presets independently contribute ordinary `dsh-tool-subagent` rows for `subagent_codex` and `subagent_claude_code`, so a preset can expose neither tool, either one, or both without changing the provider registry. -This decision supersedes only the opt-in composition placement recorded by the provider-contract note. That note continues to own each product protocol, result mapping, cancellation, process-tree lifecycle, and evidence tiers. The [Agent Preset architecture](2026-08-03-per-session-agent-presets.md) continues to own the Host/Agent split, preset authoring, and the rule that edits affect only newly composed sessions. +This note continues to own why a mounted product provider belongs on the host plane while its model-facing tool belongs to an Agent Preset. The production-install exclusion decision owns which Profiles install those optional packages. The provider-contract note continues to own each product protocol, result mapping, cancellation, process-tree lifecycle, and evidence tiers. The [Agent Preset architecture](2026-08-03-per-session-agent-presets.md) continues to own the Host/Agent split, preset authoring, and the rule that edits affect only newly composed sessions. The providers use products already selected by the host environment. Codex starts `codex` from `PATH`; Claude Code resolves `claude` through the shared subprocess execution world and passes the exact path to the official SDK. Profile loading does not install a product, create product state, probe a version, test authentication, or add product-specific settings. Missing commands and product failures remain local to the attempted delegation. -The current base dependency closure still includes the Claude Agent SDK's optional platform CLI payload even though production resolves the host `claude`. Removing that unused payload belongs to the separate product installation-closure follow-up; this placement decision neither installs it dynamically nor treats it as the production executable. +Only a Profile that selects the Claude Code provider carries the Claude Agent SDK's optional platform CLI payload. Production still resolves the host `claude`; the SDK payload remains provider-package installation cost rather than the production executable. ## Verification -The base Loader test proves both provider names register exactly once and no product process starts during Profile boot. Real Agent Preset composition covers none, Codex-only, Claude-only, and both tool sets, including generation isolation after an authored preset changes. Keyless ACP snapshots pin the model-visible tool schemas for one and both products, while provider tests separately prove native executable resolution, failure, cancellation, and process-tree quiescence. +The base bundle test proves production `dsh-base` contains neither product provider dependency nor provider row. The Web composition explicitly mounts both optional providers and covers none, Codex-only, Claude-only, and both tool sets, including generation isolation after an authored preset changes. Package-owned Loader compositions prove the Codex-only and dual-provider opt-in paths register the selected providers without starting a product process. Keyless ACP snapshots pin the model-visible tool schemas for one and both products, while provider tests separately prove native executable resolution, failure, cancellation, and process-tree quiescence. ## Alternatives considered -**Keep product providers opt-in at the Profile layer.** This preserves a smaller default dependency closure, but a copied or agent-authored Preset row is not usable unless the person also discovers and edits a second composition layer. It leaves the general Preset entry incomplete for these otherwise ordinary tools. +**Keep product providers opt-in at the Profile layer.** This preserves a smaller default dependency closure but requires the user to edit both a Profile and a Preset. The production-install exclusion decision accepts that installation trade-off; this note retains the requirement that any selected provider is mounted once on the host plane rather than inside the preset. **Store global or per-Profile product enable switches.** A process switch competes with the Preset as owner of model-visible tools and cannot express two sessions using different combinations. Availability and authentication are deployment facts, not another persisted product state. @@ -36,6 +36,6 @@ The base Loader test proves both provider names register exactly once and no pro ## Consequences -A user manages both products through the same Agent Preset authoring path as other plugins, and each new session receives exactly the tools its chosen preset contributes. Every Profile carries two dormant provider registrations, so unused products consume package and module-loading footprint but no product process, login, model call, or product home. +A user installs each selected product provider in a Profile and exposes its tool through the same Agent Preset authoring path as other plugins. Each new session receives exactly the tools its chosen preset contributes. Profiles that do not select a product provider carry no corresponding package or module-loading footprint; loading a selected provider still starts no product process, login, model call, or product home. -The Host registry remains the single provider authority and each Preset remains the single model-tool authority. The trade-off is the current Claude SDK optional-payload installation cost, which stays explicitly deferred rather than being hidden behind another enable state or installer lifecycle. +The Host registry remains the single provider authority and each Preset remains the single model-tool authority. The trade-off is a two-layer opt-in: the Profile owns installation and host-plane registration, while the Preset owns per-agent exposure. Selecting the Claude provider also accepts its current SDK optional-payload installation cost. diff --git a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.zh.md b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.zh.md index fd78c7a3fe..fef69e8a2d 100644 --- a/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.zh.md +++ b/.agents/notes/implemented/architecture/2026-08-10-product-subagent-providers-in-shared-host.zh.md @@ -12,21 +12,21 @@ Status: implemented ## 决策 -�个��行版交付的 Profile 都会通过 base 组�包的宿主平�,把固定的 `codex` 与 `claude-code` �供方�加载一次。加载任一�件�会注册一个休眠�端;对应的 Codex 或 Claude 进程直到第一次实际委派调用时��动。Agent Preset 分别通过普通的 `dsh-tool-subagent` 行贡献 `subagent_codex` 与 `subagent_claude_code`,因此一个 preset �以�暴露任何工具��暴露其中一个或�时暴露两者,而无需更改�供方注册表。 +产��供方�是进程级的 host plane(宿主平�)注册。[生产安装排除决策](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md)��代本说明原先由 base bundle 安装�供方的选择:生产 `dsh-base` 既��赖也�挂载它们。选择产�集�的 Profile 会安装目标�供方包,并在 host plane 挂载一次。加载任一�件�会注册一个休眠�端;对应的 Codex 或 Claude 进程直到第一次实际委派调用时��动。Agent Preset 分别通过普通的 `dsh-tool-subagent` 行贡献 `subagent_codex` 与 `subagent_claude_code`,因此一个 preset �以�暴露任何工具��暴露其中一个或�时暴露两者,而无需更改�供方注册表。 -本决策仅�代�供方约定说明所记录的�原先由用户选择�用的组装�置。该说明�负责�个产�的�议�结果映射��消�进程树生命周期与��层级。[Agent Preset 架构](2026-08-03-per-session-agent-presets.md)�负责宿主与 agent 的划分�preset 创作,以�改动�影�新组装会�的规则。 +本说明继续负责解释为什么已�挂载的产��供方属于 host plane,而��模型的工具属于 Agent Preset。生产安装排除决策负责哪些 Profile 安装这些�选包。�供方约定说明继续负责�个产�的�议�结果映射��消�进程树生命周期与��层级。[Agent Preset 架构](2026-08-03-per-session-agent-presets.md)�负责宿主与 agent 的划分�preset 创作,以�改动�影�新组装会�的规则。 这些�供方使用宿主环境已�选定的产�。Codex �动 `codex`,该命令从 `PATH` 解�;Claude Code 通过共享的�进程执行世界解� `claude`,并把确切路径交给官方 SDK。加载 Profile �会安装产��创建产�状��探测版本�测试身份验�,也�会新增产�专属设置。命令缺失和产�故障�局�于�生问题的那次委派。 -当� base �赖闭包�包� Claude Agent SDK 的�选平� CLI(命令行界�)载�,尽管生产环境解�的是宿主�供的 `claude`。移除这份未使用载�属于独立的产�安装闭包�续项;本归属决策既�会动�安装它,也�会将它当作生产�执行文件。 +�有选择 Claude Code �供方的 Profile �会�带 Claude Agent SDK 的�选平� CLI(命令行界�)载�。生产环境�解�宿主�供的 `claude`;这份 SDK 载�是�供方包的安装�本,而�是生产�执行文件。 ## 验� -base Loader 测试�明两个�供方�称都�好注册一次,而且 Profile �动期间�会�动产�进程。真实 Agent Preset 组装覆盖�暴露任何工具�仅暴露 Codex�仅暴露 Claude 和�时暴露两者这四�工具集�,也覆盖自行创作的 preset �生改动�的代际隔离。无密钥 ACP(Agent Client Protocol)快照固定�个产�与两个产��时�用时的模型��工具 schema,�供方测试则�行�明原生�执行文件解��失败��消和进程树完全�稳。 +base bundle 测试�明生产 `dsh-base` 既�包�产��供方�赖,也�包��供方�置行。Web 组装显�挂载两个�选�供方,并覆盖�暴露任何工具�仅暴露 Codex�仅暴露 Claude 和�时暴露两者这四�工具集�,也覆盖自行创作的 preset �生改动�的代际隔离。由包负责的 Loader 组装�明 Codex-only 与��供方按需�用路径会注册选中的�供方,而�会�动产�进程。无密钥 ACP(Agent Client Protocol)快照固定�个产�与两个产��时�用时的模型��工具 schema,�供方测试则�行�明原生�执行文件解��失败��消和进程树完全�稳。 ## 考虑过的替代方案 -**将产��供方�留为 Profile 层的按需�用项。** 这样�缩�默认�赖闭包,但�制或由 agent 创作的 Preset 行无法直接使用,除�用户还�现并编辑第二个组装层。对于这些本�与其他工具无异的工具,通用 Preset 入���完整。 +**将产��供方�留为 Profile 层的按需�用项。** 这样�缩�默认�赖闭包,但�求用户�时编辑 Profile 与 Preset。生产安装排除决策接�这项安装��;本说明�留的�求是,任何被选中的�供方都在 host plane 挂载一次,而�是放入 preset。 **存储全局或按 Profile �置的产��用开关。** 进程级开关会与 Preset 争夺模型��工具的责任归属,也无法表示两个会�使用��组�。�用性与身份验�属于部署事实,并��一份需��久化的产�状�。 @@ -36,6 +36,6 @@ base Loader 测试�明两个�供方�称都�好注册一次,而且 Prof ## �果 -用户通过与其他�件相�的 Agent Preset 创作路径管�两个产�,�个新会��会获得其所选 preset 所贡献的工具。�个 Profile 都�带两个休眠的�供方注册,因此未使用的产�会产生包和模�加载开销,但�会�动产�进程�登录�调用模型或创建产�主目录。 +用户在 Profile 中安装�个被选中的产��供方,�通过与其他�件相�的 Agent Preset 创作路径暴露它的工具。�个新会��会获得其所选 preset 所贡献的工具。没有选择产��供方的 Profile �承担对应包或模�的加载开销;加载已选择的�供方��会�动产�进程�登录�调用模型或创建产�主目录。 -宿主注册表�是�供方的唯一��,�个 Preset �是模型工具的唯一��。代价是当� Claude SDK �选载�的安装�本继续被明确延期处�,而�会��在�一��用状�或安装程�生命周期之�。 +宿主注册表�是�供方的唯一��,�个 Preset �是模型工具的唯一��。代价是两层按需�用:Profile 负责安装与 host plane 注册,Preset 负责按 agent 暴露。选择 Claude �供方还会接�当� SDK �选载�的安装�本。 diff --git a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml similarity index 51% rename from .agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml rename to .agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml index 36e8bb9536..d683f9cea6 100644 --- a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml +++ b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.i18n.yaml @@ -1,6 +1,6 @@ # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: -# pnpm run verify-translation-pairing --write .agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md -2026-08-11-repository-naming-contract-and-rename-ledger.md: ad5a2061c40011b3f8c32ecbb62a0b545f82f9f6 -2026-08-11-repository-naming-contract-and-rename-ledger.zh.md: 8f1b3505f0cc16a6e3e6429b5924cabda231f00f +# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md +2026-08-11-repository-naming-contract-and-rename-ledger.md: 895a202256504690b0451e6c09f3fc4ea8e7f4db +2026-08-11-repository-naming-contract-and-rename-ledger.zh.md: 897d06d95b3a05fb53d36146fe1ac1f0e1330a7a diff --git a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md similarity index 87% rename from .agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md rename to .agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md index ad5a2061c4..895a202256 100644 --- a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md +++ b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md @@ -1,34 +1,34 @@ # Agent Note: Repository naming contract and pre-release rename ledger -Status: proposed +Status: implemented English | [中文](2026-08-11-repository-naming-contract-and-rename-ledger.zh.md) ## Problem -The repository has grown faster than some names. Several package names still describe the first implementation instead of the capability. Several classes use `Service` even when they are registries, runtimes, engines, controllers, or resolvers. Some `ctx` keys are singular for registries and plural for one engine. Some provider names say `local` when they use replaceable filesystem or subprocess services and can run in another execution world. +The repository had grown faster than some names. Several package names described the first implementation instead of the capability. Several classes used `Service` even when they were registries, runtimes, engines, controllers, or resolvers. Some `ctx` keys were singular for registries and plural for one engine. Some provider names said `local` even though they used replaceable filesystem or subprocess services and could run in another execution world. These names are not harmless. A name tells a contributor where a responsibility starts and stops. `Store` suggests data access. `Registry` suggests registrations and lookup. `Runtime` suggests live execution and lifecycle. When one word is used for all three, callers cannot tell which object owns policy, work, or state without reading the implementation. -The repository also uses `SDK` in two meanings. The supported Python and TypeScript clients use the JSON-RPC SDK protocol. The project as a whole is DeepSeek Harness, not an SDK project. The removed SDK project toolchain made the broad meaning obsolete, but current prose and names still preserve parts of it. +The repository also used `SDK` in two meanings. The supported Python and TypeScript clients use the JSON-RPC SDK protocol. The project as a whole is DeepSeek Harness, not an SDK project. The removed SDK project toolchain made the broad meaning obsolete, but prose and names preserved parts of it. -This is the last pre-release point at which repository-wide renames are cheap. Keeping weak names would turn accidental vocabulary into a compatibility contract. +The last pre-release window made repository-wide renames cheap. Keeping weak names would have turned accidental vocabulary into a compatibility contract. -## Proposal +## Decision -Apply the rename ledger in this note before the first tagged release. Change names only. Do not change package responsibilities, service boundaries, behavior, defaults, or data models in a rename change. If a name exposes a bad boundary, write a separate proposed Agent Note for that boundary change. +The repository uses every current name in this ledger. This decision changes names only; package responsibilities, service boundaries, behavior, defaults, and data models stay the same. A name that exposes a bad boundary requires a separate proposed Agent Note for that boundary change. -Each accepted family rename is atomic. Update its directory, npm package name, imports, Cordis plugin name, `ctx` key, public types, directly coupled event or tool identifiers, configuration, tests, fixtures, examples, generated references, and current documentation where the ledger names those surfaces. Do not leave an alias, compatibility package, duplicate service key, dual event name, or fallback parser. The repository is pre-release and rejects the old name. +Each renamed family has one vocabulary. Its directory, npm package name, imports, Cordis plugin name, `ctx` key, public types, directly coupled event or tool identifiers, configuration, tests, fixtures, examples, generated references, and current documentation use the current name where the ledger names those interfaces. No alias, compatibility package, duplicate service key, dual event name, or fallback parser remains. The repository rejects the old name. -Implementation can use more than one PR to keep review practical. One PR must not leave one family with two public vocabularies. The final state must satisfy the complete ledger. +No family exposes two public vocabularies. ### Use `SDK` for one thing -`SDK` means the JSON-RPC-based client/server protocol used by the supported Python and TypeScript SDKs. Keep `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and the wire identity `deepseek-harness-sdk-runtime`. Rename the JSON-RPC server into that family. Do not call DeepSeek Harness itself an SDK, and do not restore the removed project generator, launcher, helper, or launcher telemetry packages. +`SDK` means the JSON-RPC-based client/server protocol used by the supported Python and TypeScript SDKs. The repository keeps `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and the wire identity `deepseek-harness-sdk-runtime`; the JSON-RPC server belongs to the same family. DeepSeek Harness itself is not an SDK, and the removed project generator, launcher, helper, and launcher telemetry packages stay absent. -If accepted, this proposal will partially supersede three active decisions. It replaces the retained `bash/`, `pty/`, and `self-modification/` group names and both deferred package targets in the [package-regrouping decision](../../implemented/architecture/2026-07-29-package-regrouping.md). It replaces only the repository-wide SDK claim in the [SDK project toolchain removal](../../implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md), which remains the owner of the deletion and the surviving runtime SDK. It replaces only the package-name rationale in the [tool-call timeout policy](../../implemented/architecture/2026-07-07-tool-call-timeout-policy.md); the timeout mechanism and its `guard/timeout-policy/` home remain unchanged. +This decision partially supersedes three active decisions. It replaces the retained `bash/`, `pty/`, and `self-modification/` group names and both deferred package targets in the [package-regrouping decision](2026-07-29-package-regrouping.md). It replaces only the repository-wide SDK claim in the [SDK project toolchain removal](../simplification/2026-08-11-remove-sdk-project-toolchain.md), which remains the owner of the deletion and the surviving runtime SDK. It replaces only the package-name rationale in the [tool-call timeout policy](2026-07-07-tool-call-timeout-policy.md); the timeout mechanism and its `guard/timeout-policy/` home remain unchanged. -Other implemented notes that use a renamed package, path, or type are not superseded when their boundary and rationale remain intact. The implementation updates those factual names. It adds reciprocal links only where this proposal changes a decision; a proposal does not make current implemented notes describe unshipped names. +Other implemented notes that use a renamed package, path, or type are not superseded when their boundary and rationale remain intact. They carry the current factual names. The three partially superseded decisions link back to this decision. ### Name the role that exists @@ -68,7 +68,7 @@ The practical tests are direct. If callers mainly call `register()` and receive Keep a protocol or dialect name when it distinguishes implementations. Keep `Bash`, `Pwsh`, `JSON-RPC`, `SQLite`, `JSONL`, `OpenTelemetry`, `Claude Code`, and `E2B` where the implementation depends on that mechanism. Do not put `LLM` into a compaction backend name when every current backend already uses the LLM seam; `basic` is the honest neutral name until a more specific algorithm name exists. -Do not invent a `process sandbox` concept. The current `sandbox` family already names its product responsibility, and the accepted sweep does not change that boundary. +Do not invent a `process sandbox` concept. The current `sandbox` family already names its product responsibility. This decision does not change that responsibility. Use title case for initialisms inside PascalCase identifiers: `Ui`, `Llm`, `JsonRpc`, and `ApiProxy`. Use the conventional uppercase form in prose and package names where applicable: UI, LLM, JSON-RPC, and API. `Typert` is the exact product spelling in identifiers and prose; do not write `TypeRT`, `TypeRt`, or `Typert` with another internal split. @@ -76,15 +76,15 @@ Do not remove an intentional vendor qualifier to avoid repetition. `dsh-subagent ### Put the rule in project documentation -When the rename implementation lands, add the full role-word contract to the paired package-creation guide at `docs/cookbook/adding-a-package.md`. Add a short linked rule to `packages/AGENTS.md`. Update the terminology table and the root project description so `SDK` and `Typert` have one meaning. The Agent Note owns the rationale and rejected alternatives; the guide owns the rule contributors follow. +The paired package-creation guide at `docs/cookbook/adding-a-package.md` contains the full role-word contract, and `packages/AGENTS.md` links to it. The terminology table and root project description give `SDK` and `Typert` one meaning. This Agent Note owns the rationale and rejected alternatives; the guide owns the rule contributors follow. ## Rename ledger -The tables list public and repository-wide names. Private local variables follow the new vocabulary when they refer to the same role. A retained low-level or product-visible name is stated where a broad replacement would be wrong. +The tables record public and repository-wide renames. The `Current` column holds the current name. Private local variables use the same vocabulary when they refer to the same role. A retained low-level or product-visible name is stated where a broad replacement would be wrong. ### Runtime SDK -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-jsonrpc` | `@deepseek-ai/dsh-sdk-jsonrpc-server` | It is the server half of the SDK protocol. `jsonrpc` alone names an encoding; `sdk-jsonrpc-server` gives the family, mechanism, and role. | | `HarnessSdkServer` | `HarnessSdkJsonRpcServer` | The class is one JSON-RPC server implementation, not every possible SDK server. | @@ -93,7 +93,7 @@ Keep `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and `deepse ### Shell and terminal -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `packages/bash/` | `packages/shell/` | The group contains the dialect-neutral executor seam, Bash and PowerShell implementations, environment support, and shell tools. | | `@deepseek-ai/dsh-bash`, `ctx.bash` | `@deepseek-ai/dsh-shell`, `ctx.shell` | PowerShell already implements this seam. The capability is shell execution, not Bash. | @@ -113,7 +113,7 @@ Keep the Bash- and PowerShell-specific leaf packages, plugin ids, types, and too ### Language server and jobs -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-lsp-local` | `@deepseek-ai/dsh-lsp-stdio` | The provider speaks LSP over stdio through replaceable filesystem and subprocess services. It is not necessarily local. | | `packages/tasks/` | `packages/jobs/` | The family owns detached tool jobs. `jobs` is short and avoids collision with user task or todo concepts. | @@ -131,7 +131,7 @@ Keep the base LSP package, `ctx.lsp`, LSP protocol types, and the LSP tool. The ### Input triggers, tool presentation, permission presets, and user questions -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-client-ui-slash`, `ui-slash/` | `@deepseek-ai/dsh-client-ui-input-trigger`, `ui-input-trigger/` | The client handles `/`, `@`, keyboard arbitration, candidate menus, and programmatic launch. It is not only slash commands. | | `ctx.slash`, `SlashService`, `SlashController`, `SlashSource` | `ctx.inputTriggers`, `InputTriggerService`, `InputTriggerController`, `InputTriggerSource` | The names cover every supported trigger and keep the existing service, controller, and source roles. Coupled locale and public type names follow `InputTrigger`. | @@ -144,11 +144,11 @@ Keep the base LSP package, `ctx.lsp`, LSP protocol types, and the LSP tool. The | `ctx.userInteraction`, `UserInteractionService`, `UserInteractionProvider`, `UserInteractionError` | `ctx.userQuestions`, `UserQuestionService`, `UserQuestionProvider`, `UserQuestionError` | These names state the one supported interaction form. Keep `AskUserQuestion*`, the `ask_user_question` tool, and `@deepseek-ai/dsh-tool-ask-user`. | | `docs/subsystems/user-interaction.md` | `docs/subsystems/user-questions.md` | The page documents questions and answers only. | -Keep `/permission`, the `permissions` projection, the `permission` settings namespace, and `permission/preset`; they are accurate product or durable vocabulary. Keep the full `PermissionPresetSettingsController` name. Dropping `Preset` would remove the word that limits its authority. Plan a separate proposal to remove the `both` tool-presentation mode; this rename does not remove behavior. +Keep `/permission`, the `permissions` projection, the `permission` settings namespace, and `permission/preset`; they are accurate product or durable vocabulary. Keep the full `PermissionPresetSettingsController` name. Dropping `Preset` would remove the word that limits its authority. Removal of the `both` tool-presentation mode remains deferred to a separate proposal; this rename does not remove behavior. ### Typert, API gateway, and tools -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `packages/typert/type-meta/`, `@deepseek-ai/dsh-type-meta` | `typert/protocol/`, `@deepseek-ai/dsh-typert-protocol` | The package owns the Typert Remote protocol, decorators, bindings, codecs, lookups, and context contracts. It is not generic type metadata. | | `GatewayService` in the protocol package | `TypertRemoteService` | The base class marks a same-process service for Remote export. It is not the API gateway. | @@ -162,7 +162,7 @@ Keep `@deepseek-ai/dsh-tools` and `ctx.tools`. Keep `@deepseek-ai/dsh-api-gatewa ### Workspace instructions, telemetry, identity, and launch environment -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | Host `ctx.workspace` | Host `ctx.workspaceRegistry` | `WorkspaceRegistry` owns multiple workspaces, but Client `ctx.workspaces` already has an incompatible type. Both declarations merge into the same Cordis `Context` interface at compile time even though their runtime contexts are separate. The role suffix states the host service and avoids that collision. Keep `@deepseek-ai/dsh-workspace`, `WorkspaceRegistry`, `Workspace`, and `workspace.*` wire names. | | `@deepseek-ai/dsh-workspace-context`, `context/workspace-context/` | `@deepseek-ai/dsh-agent-instructions`, `context/agent-instructions/` | The package loads hierarchical `AGENTS.md` and `CLAUDE.md` files for the agent. It is not general workspace context. | @@ -181,7 +181,7 @@ Keep `@deepseek-ai/dsh-tools` and `ctx.tools`. Keep `@deepseek-ai/dsh-api-gatewa ### Schedule, workflow, goals, and compaction -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-tool-schedule`, `schedule/tool-schedule/`, plugin `tool-schedule` | `@deepseek-ai/dsh-schedule`, `schedule/schedule/`, plugin `schedule` | The package owns the durable Schedule domain, persistence barriers, management tools, timers, follow-ups, and runtime lifecycle. `tool-` describes only one part. | | `ScheduleOwner` | `ScheduleRuntime` | The per-agent object runs live timers, durable projection, dispatch, idle waits, and disposal. `Owner` does not state that execution role. Coupled private `owner*` names follow `runtime*`. | @@ -194,11 +194,11 @@ Keep `@deepseek-ai/dsh-tools` and `ctx.tools`. Keep `@deepseek-ai/dsh-api-gatewa | `@deepseek-ai/dsh-compact-basic`, `BasicCompactService`, public `BasicCompact*` | `@deepseek-ai/dsh-compaction-basic`, `BasicCompactionEngine`, corresponding `BasicCompaction*` | `basic` is plain but honest. `compaction-llm` adds no information because LLM use is already part of the current implementation family. | | `@deepseek-ai/dsh-compact-tool-result-prune`, `ToolResultPruneService`, `ctx.toolResultPrune` | `@deepseek-ai/dsh-compaction-tool-result-pruner`, `ToolResultPruner`, `ctx.toolResultPruner` | The plugin is an actor that prunes tool results. The noun `pruner` names that role. | -Keep `/compact`, the command package, and the rejected decision to preserve separate compaction definition and provider packages. The rename changes vocabulary, not that package boundary. +Keep `/compact`, the command package, and the separate compaction definition and provider packages. Merging those packages remains rejected. The rename changes vocabulary, not that package boundary. ### Settings, credentials, client modules, and small core roles -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | Abstract `Settings` | `SettingsProvider` | The class supplies settings through a replaceable capability. Keep the package, key, and events. | | `@deepseek-ai/dsh-settings-local`, `SettingsLocal` | `@deepseek-ai/dsh-settings-file`, `FileSettingsProvider` | The implementation is file-backed through the filesystem seam. `file` states the mechanism; `local` does not. | @@ -216,7 +216,7 @@ Keep `/compact`, the command package, and the rejected decision to preserve sepa ### Host web server, session data, and code execution -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `HttpServerService`, `ctx.httpServer` | `WebServer`, `ctx.webServer` | The server owns HTTP routes and WebSocket upgrade routes. `Web` leaves room for both; `Http` is too narrow here. Keep `packages/host/webserver`, `@deepseek-ai/dsh-host-webserver`, `WebRoute`, and `WebUpgradeRoute`. | | Documentation subsystem label `http-server` | `web-server` | The subsystem must use the same scope as the service. | @@ -233,7 +233,7 @@ Keep the complete session projection family and `SessionProjection*` vocabulary. ### Filesystem, skill, subagent, and web providers -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-fs-policy` | `@deepseek-ai/dsh-fs-observation-policy` | The package defines which filesystem observations authorize later effects. It is not the complete filesystem or sandbox policy. | | `FsPolicyExec` | `FsObservationActor` | The value names the actor whose observations and effects the policy relates. It does not execute the policy itself. | @@ -251,7 +251,7 @@ Keep `@deepseek-ai/dsh-subagent-dsh-sdk`, its provider id `dsh-sdk`, external AC ### Hooks, guards, plan mode, extensions, and diagnostics -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `@deepseek-ai/dsh-hooks-claude`, `ClaudeHookConfig`, `parseClaudeConfig`, dialect `claude` | `@deepseek-ai/dsh-hooks-claude-code`, `ClaudeCodeHookConfig`, `parseClaudeCodeConfig`, dialect `claude-code` | The hook bridge targets Claude Code, not every Anthropic or Claude product. | | `@deepseek-ai/dsh-repeat-tool-guard`, plugin/source `repeat-tool-guard` | `@deepseek-ai/dsh-repeat-tool-reminder`, plugin/source `repeat-tool-reminder` | The plugin adds a model reminder. It does not block or enforce a guard decision. | @@ -263,11 +263,11 @@ Keep `@deepseek-ai/dsh-subagent-dsh-sdk`, its provider id `dsh-sdk`, external AC | `InvariantService` | `InvariantRegistry` | The object owns registered invariant checks. Keep `@deepseek-ai/dsh-invariants` and `ctx.invariants`. | | `packages/client/test-runtime/` | `packages/test-support/client-runtime/` | The package is client test infrastructure. Keep its npm name if it already states that contract. | -Keep MCP, Todo, and the Plan Mode package, key, events, and tool names. The accepted change concerns the controller class, not the product feature. +Keep MCP, Todo, and the Plan Mode package, key, events, and tool names. This decision renames the controller class, not the product feature. ### Utilities, E2B, host, bundles, examples, and applications -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `util/paths/`, `@deepseek-ai/dsh-paths` | `util/home-paths/`, `@deepseek-ai/dsh-home-paths` | The helpers resolve paths under the Harness home. They are not a general path library. Keep the individual function names when they already state the returned path. | | `util/retention/`, `@deepseek-ai/dsh-retention` | `util/output-retention/`, `@deepseek-ai/dsh-output-retention` | The policy retains command and tool output. It is not a general data-retention framework. | @@ -281,7 +281,7 @@ Keep atomic-write, brand, native-command, timeout utility, directory-picker, `ds ### Client runtime and UI -| Current | Proposed | Reason | +| Former | Current | Reason | |---|---|---| | `SlotsService` | `SlotRegistry` | The object owns named slot declarations and registrations. | | `SessionsService` | `SessionRuntime` | The object owns live client session coordination, not a passive session list. | @@ -365,26 +365,22 @@ The following debated names stay unchanged because the current scope is accurate **Keep aliases for old names.** Rejected. No released consumer needs them. Aliases would preserve two vocabularies and make the first release carry a migration that never had a user. -## Acceptance criteria +## Verification -- Every mapping in the ledger is applied, or this proposal is amended before implementation to explain a changed decision. -- Each family has one public vocabulary. No compatibility package, re-export alias, duplicate `ctx` key within one Cordis context, dual plugin id, dual event id, old tool alias, or fallback parser remains. -- The change is rename-only. Runtime behavior, package boundaries, defaults, policy, durable semantics, and model behavior stay equivalent except where an identifier is itself visible. -- Package directories, npm names, imports, manifests, TypeScript references and paths, Cordis config, plugin ids, service keys, events, tools, RPC names, persisted names named by the ledger, fixtures, snapshots, examples, generated catalogs, and current prose agree with the new vocabulary. -- Current implemented Agent Notes are updated with factual name and path changes when the implementation lands. The package-regrouping note records the new group inventory and package targets, the SDK removal note does not call the repository an SDK, and the timeout-policy note records the new package-name rationale. Notes whose architectural decision remains current are not rewritten into new decisions. +- Every mapping in the ledger appears in the repository. Each family has one public vocabulary; no compatibility package, re-export alias, duplicate `ctx` key within one Cordis context, dual plugin id, dual event id, old tool alias, or fallback parser remains. +- Runtime behavior, package boundaries, defaults, policy, durable semantics, and model behavior remain equivalent except where an identifier is itself visible. +- Package directories, npm names, imports, manifests, TypeScript references and paths, Cordis config, plugin ids, service keys, events, tools, RPC names, persisted names named by the ledger, fixtures, snapshots, examples, generated catalogs, and current prose use the current vocabulary. +- Current implemented Agent Notes carry the factual name and path changes. The package-regrouping note records the group inventory and package targets, the SDK removal note reserves `SDK` for the runtime protocol, and the timeout-policy note records the package-name rationale. - The paired package-creation guide contains the role-word contract, `packages/AGENTS.md` links to it, the terminology table records the chosen words and `Typert` spelling, and root project prose calls the product DeepSeek Harness rather than DeepSeek Harness SDK. - The removed SDK project toolchain stays absent. -- Focused tests cover each renamed family; source-plane typecheck, build, package hygiene, generated-reference gates, snapshots affected by visible identifiers, translation pairing, `doc-sync`, and lint pass on the complete implementation. -- The proposed note moves to `implemented/` only after the full ledger and documentation contract are true. Its implementation form describes the final state, not a migration checklist. +- `pnpm run check:ci` covers source-plane typecheck, build, package hygiene, generated-reference checks, affected snapshots, translation pairing, `doc-sync`, and lint. Release-shaped Python runtime smokes and required CI cover packaged-runtime and platform paths. -## Risks +## Consequences -The sweep changes many imports, paths, configuration strings, generated references, and model-visible names. A missed string can compile but fail at load or replay time. Implementation must use both type-directed edits and exact old-name searches across source, config, tests, fixtures, docs, and generated inputs. +The repository has one vocabulary for each renamed family. Old on-disk names, wire values, tool names, and configuration entries named in the ledger do not work. An owning parser that can identify stale configuration fails clearly instead of accepting both forms. -Concurrent work will conflict with moved paths and renamed symbols. This is temporary pre-release cost. Splitting the implementation by coherent family can reduce review and merge conflicts, but each family must remain atomic. +Some names are longer. The extra word is intentional when it prevents a false claim about authority or mechanism. A long name remains wrong when every word does not constrain the role. -Some names will become longer. The extra word is intentional when it prevents a false claim about authority or mechanism. Long names are still a failure when every word does not constrain the role. +Role suffixes do not replace inspection of behavior. The package guide keeps the direct tests from this decision: inspect what callers do, what lifetime the object owns, and what failure or policy it controls. -The role words can be applied mechanically if reviewers check suffixes without checking behavior. The guide must keep the direct tests in this note: inspect what callers do, what lifetime the object owns, and what failure or policy it controls. - -Old on-disk names, wire values, tool names, and configuration entries named in the ledger will stop working. This is accepted before release. The implementation must fail clearly on stale configuration where the owning parser can identify it; it must not silently accept both forms. +Branches based on the former paths and symbols require conflict repair. This is a one-time pre-release cost of removing the old vocabulary without compatibility aliases. diff --git a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md similarity index 87% rename from .agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md rename to .agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md index 8f1b3505f0..897d06d95b 100644 --- a/.agents/notes/proposed/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md +++ b/.agents/notes/implemented/architecture/2026-08-11-repository-naming-contract-and-rename-ledger.zh.md @@ -1,34 +1,34 @@ # Agent Note: 仓库命�约定与预�布�命�清� -Status: proposed +Status: implemented [English](2026-08-11-repository-naming-contract-and-rename-ledger.md) | 中文 ## 问题 -仓库的�展速度超过了部分�称的演进速度。一些包��在�述最�的实现,而�所�供的能力。若干类�使实际承担注册表��行时�引擎�控制器或解�器的�责,�称�使用 `Service`。部分 `ctx` 键以�数命�注册表,�以�数命��个引擎。还有一些�供方明明通过�替�的文件系统或�进程�务工作,�以在�一执行环境中�行,�称�使用 `local`。 +仓库的�展速度曾超过部分�称的演进速度。一些包��述的是最�的实现,而�所�供的能力。若干类�使实际承担注册表��行时�引擎�控制器或解�器的�责,�称�使用 `Service`。部分 `ctx` 键以�数命�注册表,�以�数命��个引擎。还有一些�供方明明通过�替�的文件系统或�进程�务工作,�以在�一执行环境中�行,�称�使用 `local`。 这些�称并�无关紧�。�称会告诉贡献者一项�责从哪里开始�到哪里结�。`Store` 表示数�访问。`Registry` 表示注册与查找。`Runtime` 表示实时执行和生命周期。如果�一个��时表示这三者,调用方就必须阅读实现,�能判断哪个对象拥有策略�工作或状�。 -仓库还在两��义下使用 `SDK`。�支�的 Python 和 TypeScript 客户端使用 JSON-RPC SDK �议。项目整体是 DeepSeek Harness,而�是 SDK 项目。已移除的 SDK 项目工具链使宽泛的�义失去��,但现有文案和�称��留了部分旧用法。 +仓库还曾在两��义下使用 `SDK`。�支�的 Python 和 TypeScript 客户端使用 JSON-RPC SDK �议。项目整体是 DeepSeek Harness,而�是 SDK 项目。已移除的 SDK 项目工具链使宽泛的�义失去��,但文案和�称��留了部分旧用法。 -这是首次�布带标签版本之�,最�一个能够低�本完�仓库级�命�的时点。�留�义�清的�称,会让�然形�的�汇��兼容性约定。 +首次�布带标签版本之�的最�一个窗�,使仓库级�命���低�本完�。若继续�留�义�清的�称,�然形�的�汇就会��兼容性约定。 -## �案 +## 决策 -在首次�布带标签版本之�,应用本说明中的�命�清�。�更改�称,�得在�命��更中改�包�责��务边界�行为�默认值或数�模型。如果�个�称暴露出���的边界,应�写一份 proposed Agent Note,专门�议边界�更。 +仓库使用本清�中的全部当��称。本决策�更改�称;包�责��务边界�行为�默认值和数�模型����。如果�个�称暴露出���的边界,需��写一份 proposed Agent Note,专门�议边界�更。 -�组获准的系列�命�都必须原�完�。清�点��一表�时,应一并更新其目录�NPM 包��导入�Cordis �件�称�`ctx` 键�公开类型�直接耦�的事件或工具标识符��置�测试�fixture(测试�置数�)�示例�生�的�考资料以�当�文档。�得留下别��兼容包���的�务键���事件�称或回退解�器。仓库尚未�布,旧�称应被拒�。 +�个已�命�系列�有一套�汇。清�点��一接�时,其目录�NPM 包��导入�Cordis �件�称�`ctx` 键�公开类型�直接耦�的事件或工具标识符��置�测试�fixture(测试�置数�)�示例�生�的�考资料以�当�文档都使用当��称。仓库��留别��兼容包���的�务键���事件�称或回退解�器,并拒�旧�称。 -实现�以拆分为多个 PR(Pull Request),以��评审�行。任何一个 PR 都�得让�一系列�时存在两套公开�汇。最终状�必须满足完整清�。 +�一系列�会公开两套�汇。 ### `SDK` �表示一件事 -`SDK` 表示�支�的 Python 和 TypeScript SDK 所使用�基于 JSON-RPC 的客户端��务器�议。�留 `@deepseek-ai/dsh-sdk-client`�`@deepseek-ai/dsh-sdk-protocol` 和�议身份 `deepseek-harness-sdk-runtime`。将 JSON-RPC �务器�命�并纳入该系列。�得将 DeepSeek Harness 本身称为 SDK,也�得��已移除的项目生�器��动器�辅助工具或�动器�测包。 +`SDK` 表示�支�的 Python 和 TypeScript SDK 所使用�基于 JSON-RPC 的客户端��务器�议。仓库�留 `@deepseek-ai/dsh-sdk-client`�`@deepseek-ai/dsh-sdk-protocol` 和�议身份 `deepseek-harness-sdk-runtime`;JSON-RPC �务器属于�一系列。DeepSeek Harness 本身�是 SDK,已移除的项目生�器��动器�辅助工具和�动器�测包继续���存在。 -如果本�案获准,它将部分�代三项现行决策。它会替�[包�新分组决策](../../implemented/architecture/2026-07-29-package-regrouping.md)中�留的 `bash/`�`pty/` 和 `self-modification/` 组�,以�两项暂定包�。它�替�[移除 SDK 项目工具链](../../implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md)中将整个仓库称为 SDK 的说法;�者�负责说明删除范围和�留的�行时 SDK。它�替�[工具调用超时策略](../../implemented/architecture/2026-07-07-tool-call-timeout-policy.md)中的包��由;超时机制�其 `guard/timeout-policy/` 归属����。 +本决策部分�代三项现行决策。它替�[包�新分组决策](2026-07-29-package-regrouping.md)中�留的 `bash/`�`pty/` 和 `self-modification/` 组�,以�两项暂定包�。它�替�[移除 SDK 项目工具链](../simplification/2026-08-11-remove-sdk-project-toolchain.md)中将整个仓库称为 SDK 的说法;�者�负责说明删除范围和�留的�行时 SDK。它�替�[工具调用超时策略](2026-07-07-tool-call-timeout-policy.md)中的包��由;超时机制�其 `guard/timeout-policy/` 归属����。 -如果其他已实现说明中的包�路径或类型被�命�,而其边界和�由����,则本�案�会�代这些说明。实现阶段�更新其中的事实�称。�有本�案改�既有决策时�添加��链接;尚未获准的�案�会让现行的已实现说明���述未交付�称。 +如果其他已实现说明中的包�路径或类型被�命�,而其边界和�由����,则本决策�会�代这些说明。这些说明使用已实现的事实�称。三项被部分�代的决策都链接回本决策。 ### 按实际�责命� @@ -68,7 +68,7 @@ Status: proposed 如果�议或方言�称能够区分实现,就应�留。实现�赖相应机制时,�留 `Bash`�`Pwsh`�`JSON-RPC`�`SQLite`�`JSONL`�`OpenTelemetry`�`Claude Code` 和 `E2B`。�个当��端都已使用 LLM(大语言模型)seam 时,��在压缩�端�称中加入 `LLM`;在出现更具体的算法�称之�,`basic` �是如实且中性的�称。 -�得虚构 `process sandbox` 概念。当� `sandbox` 系列已�准确命�其产��责,获准的整体�命��会改�该边界。 +�得虚构 `process sandbox` 概念。当� `sandbox` 系列已�准确命�其产��责。本决策�改�该�责。 PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui`�`Llm`�`JsonRpc` 和 `ApiProxy`。在文案和适用的包�中使用惯例规定的全大写形�:UI�LLM�JSON-RPC 和 API。`Typert` 是标识符和文案中的唯一准确产�拼写;�得写� `TypeRT`�`TypeRt`,也�得对 `Typert` 作其他内部拆分。 @@ -76,15 +76,15 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### 将规则写入项目文档 -�命�实现�入时,应将完整的�责�约定加入�对的包创建指� `docs/cookbook/adding-a-package.md`。在 `packages/AGENTS.md` 中添加一�简短规则并链接到该指�。更新术语表和根项目说明,使 `SDK` 和 `Typert` �自�有一��义。Agent Note 负责记录�由和被�决的替代方案;指�负责记录贡献者应�循的规则。 +�对的包创建指� `docs/cookbook/adding-a-package.md` 包�完整的�责�约定,`packages/AGENTS.md` 链接到该约定。术语表和根项目说明使 `SDK` 和 `Typert` �自�有一��义。本 Agent Note 负责记录�由和被�决的替代方案;指�负责记录贡献者应�循的规则。 ## �命�清� -以下表格列出公开�称和仓库级�称。引用相��责的�有局部��也应采用新�汇。若宽泛替�并�正确,清�会明确指出�留的底层�称或产����称。 +以下表格记录公开�称和仓库级�称的�更。`当��称` �记录当��称。引用相��责的�有局部��也使用相��汇。若宽泛替�并�正确,清�会明确指出�留的底层�称或产����称。 ### �行时 SDK -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `@deepseek-ai/dsh-jsonrpc` | `@deepseek-ai/dsh-sdk-jsonrpc-server` | 它是 SDK �议的�务器端。�独使用 `jsonrpc` �说明编�;`sdk-jsonrpc-server` 则�时说明所属系列�机制和�责。 | | `HarnessSdkServer` | `HarnessSdkJsonRpcServer` | 该类是 JSON-RPC �务器的一�实现,并�代表所有�能的 SDK �务器。 | @@ -93,7 +93,7 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### Shell 与终端 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `packages/bash/` | `packages/shell/` | 该组包�方言无关的执行器 seam�Bash 和 PowerShell 实现�环境支�以� shell 工具。 | | `@deepseek-ai/dsh-bash`, `ctx.bash` | `@deepseek-ai/dsh-shell`, `ctx.shell` | PowerShell 已�实现该 seam。此项能力是 shell 执行,而�是 Bash。 | @@ -113,7 +113,7 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### 语言�务器与作业 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `@deepseek-ai/dsh-lsp-local` | `@deepseek-ai/dsh-lsp-stdio` | 该�供方通过�替�的文件系统和�进程�务,以 stdio 传输 LSP。它�一定在本地�行。 | | `packages/tasks/` | `packages/jobs/` | 该系列负责脱离���行的工具作业。`jobs` 简短,并���与用户任务或 todo 概念冲�。 | @@ -131,7 +131,7 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### 输入触�器�工具呈现���预设和用户问题 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `@deepseek-ai/dsh-client-ui-slash`, `ui-slash/` | `@deepseek-ai/dsh-client-ui-input-trigger`, `ui-input-trigger/` | 客户端处� `/`�`@`�键盘仲��候选��和程�化�动,并��处�斜�命令。 | | `ctx.slash`�`SlashService`�`SlashController`�`SlashSource` | `ctx.inputTriggers`�`InputTriggerService`�`InputTriggerController`�`InputTriggerSource` | 这些�称覆盖所有�支�的触�器,并�留现有的�务�控制器和���责。耦�的区域设置和公开类型�称也改用 `InputTrigger`。 | @@ -144,11 +144,11 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` | `ctx.userInteraction`, `UserInteractionService`, `UserInteractionProvider`, `UserInteractionError` | `ctx.userQuestions`, `UserQuestionService`, `UserQuestionProvider`, `UserQuestionError` | 这些�称说明唯一�支�的交互形�。�留 `AskUserQuestion*`�`ask_user_question` 工具和 `@deepseek-ai/dsh-tool-ask-user`。 | | `docs/subsystems/user-interaction.md` | `docs/subsystems/user-questions.md` | 该页��记录问题和答案。 | -�留 `/permission`�`permissions` 投影�`permission` 设置命�空间和 `permission/preset`;它们都是准确的产��汇或�久化�汇。�留完整�称 `PermissionPresetSettingsController`。删除 `Preset` 会去掉�定其��的�。�行制定�案以移除 `both` 工具呈现模�;本次�命��移除行为。 +�留 `/permission`�`permissions` 投影�`permission` 设置命�空间和 `permission/preset`;它们都是准确的产��汇或�久化�汇。�留完整�称 `PermissionPresetSettingsController`。删除 `Preset` 会去掉�定其��的�。移除 `both` 工具呈现模�的工作�推迟到�一份�案;本次�命��移除行为。 ### Typert�API 网关与工具 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `packages/typert/type-meta/`, `@deepseek-ai/dsh-type-meta` | `typert/protocol/`, `@deepseek-ai/dsh-typert-protocol` | 该包拥有 Typert Remote �议�装饰器�绑定�编解�器�查找逻辑和上下文约定。它�是通用类型元数�。 | | �议包中的 `GatewayService` | `TypertRemoteService` | 该基类标记�导出为 Remote 的�进程�务。它�是 API 网关。 | @@ -162,7 +162,7 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### 工作区指令��测�身份和�动环境 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | Host `ctx.workspace` | Host `ctx.workspaceRegistry` | `WorkspaceRegistry` 拥有多个工作区,但 Client `ctx.workspaces` 已�使用�兼容的类型。�使二者�行时上下文独立,两份声明�会在编译时�并进�一个 Cordis `Context` 接�。�责�缀明确指出 host �务,并��该冲�。�留 `@deepseek-ai/dsh-workspace`�`WorkspaceRegistry`�`Workspace` 和 `workspace.*` �议�称。 | | `@deepseek-ai/dsh-workspace-context`, `context/workspace-context/` | `@deepseek-ai/dsh-agent-instructions`, `context/agent-instructions/` | 该包为 agent(智能体)加载分层的 `AGENTS.md` 和 `CLAUDE.md` 文件。它并�通用工作区上下文。 | @@ -181,7 +181,7 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### 日程�工作��目标与压缩 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `@deepseek-ai/dsh-tool-schedule`�`schedule/tool-schedule/`��件 `tool-schedule` | `@deepseek-ai/dsh-schedule`�`schedule/schedule/`��件 `schedule` | 该包拥有�久 Schedule 领域��久化�障�管�工具�定时器��续轮次和�行时生命周期。`tool-` ��述其中一部分。 | | `ScheduleOwner` | `ScheduleRuntime` | 该� agent 对象�行实时定时器��久化投影�分派�空闲等待和资�释放。`Owner` 没有说明这一执行�责。耦�的�有 `owner*` �称也改用 `runtime*`。 | @@ -194,11 +194,11 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` | `@deepseek-ai/dsh-compact-basic`�`BasicCompactService`�公开的 `BasicCompact*` | `@deepseek-ai/dsh-compaction-basic`�`BasicCompactionEngine`�对应的 `BasicCompaction*` | `basic` 朴素但准确。`compaction-llm` 没有增加信�,因为当�实现系列已使用 LLM。 | | `@deepseek-ai/dsh-compact-tool-result-prune`, `ToolResultPruneService`, `ctx.toolResultPrune` | `@deepseek-ai/dsh-compaction-tool-result-pruner`, `ToolResultPruner`, `ctx.toolResultPruner` | 该�件是剪除工具结果的执行主体。�� `pruner` 说明了这一�责。 | -�留 `/compact`�命令包,以�维�压缩定义包与�供方包分离的既有决策。本次�命��改��汇,�改�该包边界。 +�留 `/compact`�命令包,以�相互独立的压缩定义包和�供方包。�并这些包的�议�被�决。本次�命��改��汇,�改�该包边界。 ### 设置�凭��客户端模�和较�的核心�责 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | 抽象类 `Settings` | `SettingsProvider` | 该类通过�替�能力�供设置。�留包�键和事件。 | | `@deepseek-ai/dsh-settings-local`, `SettingsLocal` | `@deepseek-ai/dsh-settings-file`, `FileSettingsProvider` | 该实现通过文件系统 seam 以文件为�端。`file` 说明机制,`local` 则�能。 | @@ -216,7 +216,7 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### Host Web �务器�会�数�与代�执行 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `HttpServerService`, `ctx.httpServer` | `WebServer`, `ctx.webServer` | 该�务器拥有 HTTP 路由和 WebSocket �级路由。`Web` �以�时涵盖两者;此处的 `Http` 作用域过窄。�留 `packages/host/webserver`�`@deepseek-ai/dsh-host-webserver`�`WebRoute` 和 `WebUpgradeRoute`。 | | 文档�系统标签 `http-server` | `web-server` | �系统标签必须与�务采用相�作用域。 | @@ -233,7 +233,7 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### 文件系统�skill�subagent 和 Web �供方 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `@deepseek-ai/dsh-fs-policy` | `@deepseek-ai/dsh-fs-observation-policy` | 该包定义哪些文件系统观察�以授��续�作。它�是完整的文件系统策略或沙箱策略。 | | `FsPolicyExec` | `FsObservationActor` | 该值表示策略所关�的观察与�作的执行主体。它本身�执行策略。 | @@ -251,7 +251,7 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### 钩��防护�Plan Mode�扩展与诊断 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `@deepseek-ai/dsh-hooks-claude`�`ClaudeHookConfig`�`parseClaudeConfig`,方言 `claude` | `@deepseek-ai/dsh-hooks-claude-code`�`ClaudeCodeHookConfig`�`parseClaudeCodeConfig`,方言 `claude-code` | 该钩�桥接�� Claude Code,而�所有 Anthropic 或 Claude 产�。 | | `@deepseek-ai/dsh-repeat-tool-guard`,�件��� `repeat-tool-guard` | `@deepseek-ai/dsh-repeat-tool-reminder`,�件��� `repeat-tool-reminder` | 该�件�模型添加�醒,并�阻止工具调用,也�执行防护决策。 | @@ -263,11 +263,11 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` | `InvariantService` | `InvariantRegistry` | 该对象拥有已注册的���检查。�留 `@deepseek-ai/dsh-invariants` 和 `ctx.invariants`。 | | `packages/client/test-runtime/` | `packages/test-support/client-runtime/` | 该包是客户端测试基础设施。如果现有 NPM �称已�说明这一约定,则予以�留。 | -�留 MCP�Todo�Plan Mode 包�键�事件和工具�称。获准的�更针对控制器类,而�是产�功能。 +�留 MCP�Todo�Plan Mode 包�键�事件和工具�称。本决策�命�控制器类,而�是产�功能。 ### 实用工具�E2B�Host�组�包�示例与应用 -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `util/paths/`, `@deepseek-ai/dsh-paths` | `util/home-paths/`, `@deepseek-ai/dsh-home-paths` | 这些辅助函数解� Harness 主目录下的路径,并�通用路径库。已准确说明返回路径的函数�����。 | | `util/retention/`, `@deepseek-ai/dsh-retention` | `util/output-retention/`, `@deepseek-ai/dsh-output-retention` | 该策略�留命令和工具输出,而�是通用数��留框架。 | @@ -281,7 +281,7 @@ PascalCase 标识符中的首字�缩略�使用首字�大写格�:`Ui` ### 客户端�行时与 UI -| 当��称 | �议�称 | �由 | +| 旧�称 | 当��称 | �由 | |---|---|---| | `SlotsService` | `SlotRegistry` | 该对象拥有具� slot 声明和注册项。 | | `SessionsService` | `SessionRuntime` | 该对象拥有实时客户端会��调�责,而�是被动的会�列表。 | @@ -365,26 +365,22 @@ PascalCase 标识符内部使用 `Ui`,��使用 `UI`。除�清�明确 **为旧�称�留别�。**�予采纳。没有已�布的消费方需�这些别�。别�会�留两套�汇,使首次�布�带一项从未有用户需�的�移。 -## 验收标准 +## 验� -- 应用清�中的�项映射;如果决策�生�化,则必须在实施�修订本�案并说明原因。 -- �个系列�有一套公开�汇。�一个 Cordis 上下文中�得留下兼容包��新导出别����的 `ctx` 键����件 id���事件 id�旧工具别�或回退解�器。 -- �更�能�命�。�行时行为�包边界�默认值�策略��久化语义和模型行为必须��等价,�有标识符本身��时除外。 -- 包目录�NPM �称�导入�manifest(元数�清�)�TypeScript 引用和路径�Cordis �置��件 id��务键�事件�工具�RPC �称�清�点�的�久化�称�fixture�快照�示例�生�的目录和当�文案都采用新�汇。 -- 实现�入时,以事实性�称和路径�更更新当�处于 implemented 状�的 Agent Note。包�新分组说明应记录新的分组清�和包�目标,SDK 移除说明�得�将仓库称为 SDK,超时策略说明应记录新的包��由。架构决策�然有效的说明,�得被�写为新的决策。 -- �对的包创建指�应包��责�约定,`packages/AGENTS.md` 应链接到该约定,术语表应记录选定用�和 `Typert` 拼写,根项目文案应将产�称为 DeepSeek Harness,而�是 DeepSeek Harness SDK。 +- 清�中的�项映射都出现在仓库中。�个系列�有一套公开�汇;�一个 Cordis 上下文中没有兼容包��新导出别����的 `ctx` 键����件 id���事件 id�旧工具别�或回退解�器。 +- �行时行为�包边界�默认值�策略��久化语义和模型行为��等价,�有标识符本身��时除外。 +- 包目录�NPM �称�导入�manifest(元数�清�)�TypeScript 引用和路径�Cordis �置��件 id��务键�事件�工具�RPC �称�清�点�的�久化�称�fixture�快照�示例�生�的目录和当�文案都使用已实现�汇。 +- 当�处于 implemented 状�的 Agent Note 使用事实�称和路径。包�新分组说明记录分组清�和包�目标,SDK 移除说明将 `SDK` �定为�行时�议,超时策略说明记录包��由。 +- �对的包创建指�包��责�约定,`packages/AGENTS.md` 链接到该约定,术语表记录选定用�和 `Typert` 拼写,根项目文案将产�称为 DeepSeek Harness,而�是 DeepSeek Harness SDK。 - 已移除的 SDK 项目工具链继续���存在。 -- �焦测试覆盖�个�命�系列;在完整实现上,�代�平�的类型检查�构建�包�生检查�生��考资料门�����标识符影�的快照�翻译�对�`doc-sync` 和 lint �应通过。 -- �有完整清�和文档约定全部�为事实�,�能将该 proposed 说明移入 `implemented/`。其实现版应�述最终状�,而�是�移检查清�。 +- `pnpm run check:ci` 覆盖�代�平�的类型检查�构建�包�生检查�生��考资料检查��影�的快照�翻译�对�`doc-sync` 和 lint。�布形�的 Python �行时冒烟测试和必需 CI 覆盖打包�行时与平�路径。 -## 风险 +## �果 -这轮整体�命�会更改大�导入�路径��置字符串�生�的�考资料和模型���称。��的字符串�能通过编译,�在加载或回放时失败。实现时必须结�类型驱动的修改,并在�代���置�测试�fixture�文档和生�输入中精确�索旧�称。 +仓库为�个�命�系列�留一套�汇。清�点�的旧�盘�称��议值�工具�称和�置项��工作。能够识别陈旧�置的所属解�器会明确报错,而�是�时接�两�形�。 -并行工作会与路径移动和符��命�产生冲�。这是�布�的临时�本。按�责一致的系列拆分实现,�以�低评审�本和�并冲�,但�个系列都必须��原�性。 +一些�称更长。�外增加的��有在防止误述��或机制时�有�义。如果�称中的��能全部�定�责,长�称�然错误。 -一些�称会�得更长。�外增加的��有在防止误述��或机制时�有�义。如果�称中的��能全部�定�责,长�称�然是失败的命�。 +�责�缀�能替代对行为的检查。包创建指��留本决策中的直接判断方�:检查调用方执行什么�作�对象拥有什么生命周期,以�对象控制什么失败或策略。 -如果评审人�检查�缀而�检查行为,�责�就会被机械套用。指�必须�留本说明中的直接判断方�:检查调用方执行什么�作�对象拥有什么生命周期,以�对象控制什么失败或策略。 - -清�点�的旧�盘�称��议值�工具�称和�置项将�止工作。�布�接�这一�果。如果负责解�的解�器能够识别陈旧�置,实现必须明确报错;�得�默接�两�形�。 +基于旧路径和旧符�的分支需�解决冲�。这是�布�移除旧�汇且��留兼容别�的一次性�本。 diff --git a/.agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.i18n.yaml new file mode 100644 index 0000000000..d77b2c75c7 --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.md +2026-08-12-plugin-owned-settings-surface.md: 3137cfe81ef3cb78a940f085c559ab4a7b62cce3 +2026-08-12-plugin-owned-settings-surface.zh.md: 8dd5e5ccebf1cfb80b55a615f6049dd391943bd7 diff --git a/.agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.md b/.agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.md new file mode 100644 index 0000000000..3137cfe81e --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.md @@ -0,0 +1,61 @@ +# Agent Note: Plugin-owned settings surface + +Status: implemented + +English | [中文](2026-08-12-plugin-owned-settings-surface.zh.md) + +## Problem + +A plugin that registered a settings namespace could not reach the browser configuration page, and both gates that stopped it lived in this repository. + +`packages/host/apiproxy` held two hardcoded namespace lists. `settings.describe` filtered its answer through them and every write checked them first, so a namespace outside them answered `settings-not-exposed` even when its owner had registered it. Adding a plugin to the configuration page therefore meant editing a package the plugin author does not own. + +The plugin configuration section rendered an unordered list of whatever cards were registered into `settings.plugin.item`. A card carried an opaque `id`, never the namespace it edited, so the section could not tell which served namespaces already had a home. That left every question about "who renders this namespace" unanswerable from the ledger the section could see. + +Together the two meant a user-authored plugin was configurable only by hand-editing `settings.yaml`. The [web plugin configuration note](../feature/2026-08-10-web-plugin-configuration.md) recorded the allowlist as deliberate, and the [config-plane boundaries note](2026-07-30-config-plane-boundaries.md) tied web-configurability to membership in the configurable-provider directory. Both conclusions blocked exactly the plugin authors the general seam was built for. + +## Decision + +**Registering is exposing.** The api-proxy serves every namespace `ctx.settings.describe()` returns and gates no write. `WEB_SETTINGS_NAMESPACES`, `PRODUCT_SETTINGS_NAMESPACES`, the union with `ctx.llm.listConfigurableProviders()`, and the `settings-not-exposed` error code are gone. A name no registration answers — unknown, or malformed and therefore unable to address one — folds into the seam's own `settings-rejected`, so the proxy contributes no boundary and no vocabulary of its own. + +**The settings seam is untouched.** Which client may read a namespace, and which page renders it, are facts about consumers; a Service Definition that carried either would let one Consumer dictate its contract. `SettingsRegisterOptions` gains nothing. + +**`settings.plugin.item` is keyed on the settings namespace.** The slot moved from `list` to `keyed`, the key being the namespace the card edits, following the `tool.call.toolview` precedent where each tool plugin registers its renderer under the tool name. A card declares `key`, not `id`/`order`. The slot is declared by the Plugins section's `configurable` tab, which owns the card list. + +**The tab drives dispatch from the served namespaces.** It reads `settings.describe` once, subscribes to the settings-document invalidation and to connection resets, and dispatches one key per served namespace. What renders is the intersection of two ledgers — namespaces a live Host plugin registered, and cards registered under those keys — computed in the tab's controller from the slot ledger (`ctx.slots.entries`, `ctx.slots.subscribe`) and the wire answer. + +Keying makes absence the signal, and that is what removes the bookkeeping the previous shape needed. A namespace another surface owns (`ui-theme`, `permission`, `llm-*`, `agent-presets`) has no card under its key, so it renders nothing without declaring anything anywhere. A card whose namespace this deployment does not serve is never dispatched, which also fixes the old empty-state defect: the tab counted registered cards, including ones rendering nothing, so a deployment exposing none showed an empty list instead of its empty line. + +**Nothing renders a form it was not given.** The tab supplies no fallback card. A plugin's browser half owns its card completely — chrome, controls, and copy — which is what the slot's `fallback` option would have replaced with a schema-reverse-rendered form. + +## What the allowlist protected + +The gate did keep one thing off the wire, and this note states it plainly because the decision has to survive the accurate version: a registered namespace the list did not name never had its resolved, `base`, or `user` values reach the browser at all. The plugin inventory page is not a substitute — `PluginInventoryEntry` carries `entryId`, `moduleName`, `enabled`, and `fiberPhase`, and its "configuration" row renders an enabled/disabled tag, never a stored value. + +What the gate was not is the boundary its position suggested. Every `settings.*` method sits in `PRIVILEGED_METHODS` (`packages/client/connection`), so a non-loopback or cross-origin request is refused with 403 before reaching this code; `role('secret')` fields are structurally stripped from every layer of every response; and the document the plane edits is the user's own `settings.yaml`, which the same settings page offers to open. The writes it did not block were also the consequential ones: `permission` (which can widen the approval preset) and `agent-presets` (which decides what a session mounts) were both already served. + +So the exposure this change actually adds, in this repository, is one namespace: `agent-default-model`, whose two fields name a provider and a model and which no browser half renders. A future namespace whose values genuinely must not cross the wire is answered per field by `role('secret')` — finer than a namespace switch, and already enforced. + +## Alternatives considered + +**A declaration on `settings.register()`** (`client: { surface: 'plugin-config' | 'custom', title, description }`), which the removed `WEB_SETTINGS_NAMESPACES` comment named as the intended direction. It keeps registration from crossing the transport by default and lets a plugin author self-serve in one line. Rejected because `surface` is browser-page vocabulary and `title`/`description` are presentation: a Service Definition carrying them is a seam shaped by one Consumer. Its fail-closed property is also worth less than it reads — see what the allowlist protected, above. + +**A separate exposure catalog**, a registry of its own that plugins join beside their settings registration, generalizing `ctx.llm.registerConfigurableProviders()`. Rejected because it makes one fact require two registrations that can drift: registering a namespace and forgetting the catalog entry produces a section nothing can edit, with no gate able to see the mistake. + +**A deny-list `Config` field on the api-proxy**, so a deployment could withhold a namespace. Rejected for having no consumer: every currently registered namespace is one a user may edit, and a genuinely sensitive field is answered per-field by `role('secret')`, which is the finer instrument. A namespace-wide switch invented ahead of its first use is the speculative option the package rules forbid. + +**A schema-driven generic card as the slot's `fallback`**, so a plugin with no browser half still got a form from `schema.toJSON()` (schemastery already carries `description`, `role`, `min`/`max`/`step` and serializes them). Rejected because client plugins load at runtime from mounted Loader entries, so a plugin author can ship a real card, and a reverse-rendered form was already judged worse than a hand-written one for the Models page. The `fallback` option remains available without a contract change if that judgment changes. + +**A client-side claim registry**, where each surface owning a namespace declares it so a generic card knows what is already covered. Rejected with the generic card: keyed dispatch already makes an unclaimed key render nothing, so the registry would restate what the slot ledger says. + +**Keeping the list slot and adding a namespace field to its options.** Rejected because the section would still enumerate entries rather than namespaces, keeping the empty-state defect and leaving a card for an uncomposed plugin to suppress itself. + +## Consequences + +A plugin distributed outside this repository is configurable from the settings page with no change here: it registers its namespace on the Host and its card under that key in the browser, and the section pairs the two. Cards now appear in card registration order rather than by hand-assigned `order`. That is stable for the cards this package registers, which install from one generator, and **not** stable across plugins: apply order between packages is unconstrained (`packages/client/AGENTS.md`), so several external cards can still reorder between boots. Ordering them needs an explicit key the section can sort on, which the keyed registration does not carry today. + +Deferred, and larger than this change: the redactor returns a `role('secret')` reachable only through a union, intersection, or transform verbatim (its own `TODO(settings-wire-redaction)`), and `schema.toJSON()` carries a secret's default. That gap predates this change, but serving every registered namespace widens its blast radius from schemas audited in this repository to any third-party schema, so the wire should refuse a namespace it cannot prove it can redact. Also deferred: an assembled-composition test of the headline capability — an overlay-mounted fixture plugin whose Host half registers a namespace and whose `dsh.client` half registers a card, asserted end-to-end. The current coverage proves each half separately; the shipped cards' unchanged output cannot prove the new path. + +The wire read the section adds is one `settings.describe` beside the per-scope reads the cards already make. Its invalidation is imprecise in one direction: the wire announces document commits and connection resets, not registrations, so a namespace registered after the section's read joins on the next commit or reconnect. + +Two frictions remain for an author outside this repository, both recorded in the section's README. The browser half must be a `dsh.client` package built in the client module system's lazy-CJS factory format, and the `clientBundle` preset that emits it lives in `packages/client/tsdown.client.ts` rather than a published package. The bundle-purity gate forbids importing this package's card chrome or staged-form model as values, so such a card reimplements staging and revision fencing. Sharing them would mean either publishing the preset or declaring a child slot inside the card so the section supplies the chrome; neither is built. diff --git a/.agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.zh.md b/.agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.zh.md new file mode 100644 index 0000000000..8dd5e5cceb --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-12-plugin-owned-settings-surface.zh.md @@ -0,0 +1,61 @@ +# Agent Note: 由�件自己拥有的设置表层 + +Status: implemented + +[English](2026-08-12-plugin-owned-settings-surface.md) | 中文 + +## Problem + +注册了 settings 命�空间的�件到�了�览器�置页,而拦�它的两�门都在本仓库里。 + +`packages/host/apiproxy` �有两份硬编�的命�空间清�。`settings.describe` 用它们过滤答�,�次写入也先对照它们,因此清�之外的命�空间�便其拥有方已注册,也�会得到 `settings-not-exposed`。于是把一个�件加进�置页,�味��改一个�件作者并�拥有的包。 + +�件�置分区渲染的是注册进 `settings.plugin.item` 的�片列表,无�。�片�带的是��明的 `id`,从�是它所编辑的命�空间,因此分区无从判断哪些被�务的命�空间已�有了归属。凡是"这个命�空间由�渲染"的问题,都无法从分区看得�的账本里得到答案。 + +两者相加,用户自己写的�件就�能�手改 `settings.yaml` ��置。[web �件�置 note](../feature/2026-08-10-web-plugin-configuration.md) 把白��记为刻�为之,[�置�边界 note](2026-07-30-config-plane-boundaries.md) 则把「�在 Web 上�置�绑定到��置�供方目录的�员资格。这两�结论��挡�了那个通用 seam 本���务的�件作者。 + +## Decision + +**注册�暴露。** api-proxy �务 `ctx.settings.describe()` 返回的�一个命�空间,写入�设门�。`WEB_SETTINGS_NAMESPACES`�`PRODUCT_SETTINGS_NAMESPACES`�与 `ctx.llm.listConfigurableProviders()` 的并集,以� `settings-not-exposed` 错误�,全部删除。没有任何注册应答的�字——未知的,或格��法因而根本无法寻�到注册的——都折�为 seam 自己的 `settings-rejected`,于是代�既�贡献边界,也�贡献自己的�汇。 + +**settings seam �动。** 哪个客户端�以读�个命�空间�哪个页�渲染它,都是关于 Consumer 的事实;Service Definition ���带其中之一,就等于让一个 Consumer 决定它的契约。`SettingsRegisterOptions` 一个字段都没加。 + +**`settings.plugin.item` 以 settings 命�空间为键。** 该 slot 从 `list` 改为 `keyed`,键就是�片所编辑的命�空间,沿用 `tool.call.toolview` 的先例——�个工具�件把自己的渲染器注册在工具�这个键上。�片声明 `key`,��声明 `id`/`order`。该 slot 由「�件�分区的 `configurable` 标签页声明,�片列表归它所有。 + +**标签页以被�务的命�空间驱动派�。** 它读�一次 `settings.describe`,订阅 settings 文档失效通知与连接�置,并为�个被�务的命�空间派�一个键。渲染出�的是两份账本的交集——存活 Host �件注册的命�空间,以�注册在这些键上的�片——由标签页的 controller 从 slot 账本(`ctx.slots.entries`�`ctx.slots.subscribe`)与�议答�算出。 + +以命�空间为键,让「缺席�本身�为信�,而这正是它消掉旧形�所需簿记的原因。归别的界�所有的命�空间(`ui-theme`�`permission`�`llm-*`�`agent-presets`)在其键上没有�片,于是什么都�渲染,且无需在任何地方声明任何东西。命�空间未被本部署�务的�片根本�会被派�,这�时修掉了旧的空�缺陷:标签页数的是已注册�片,其中包�那些什么都�渲染的,因此一个都�暴露的部署看到的是空列表,而�是它那行空�文案。 + +**�渲染任何未被交给它的表�。** 标签页��供兜底�片。�件的�览器�侧完整拥有自己的�片——外观�控件与文案——而这正是 slot 的 `fallback` 选项会用一份 schema ��渲染的表��代掉的东西。 + +## 白��实际护�了什么 + +这�门确实挡�了一样东西,本 note 如实写出,因为这个决策必须在准确版本下也站得�:�在��上的已注册命�空间,其 resolved�`base` 与 `user` 值根本�会抵达�览器。�件清�页�能替代它——`PluginInventoryEntry` �带的是 `entryId`�`moduleName`�`enabled` 与 `fiberPhase`,它那一行「configuration�渲染的是�用��用标签,从�是任何已存值。 + +这�门�是的,是它所处�置暗示的那�边界。�个 `settings.*` 方法都在 `PRIVILEGED_METHODS` 里(`packages/client/connection`),�回环或跨�请求在到达这段代�之�就以 403 被拒;`role('secret')` 字段在���应的�一层都被结构性剥离;而这个�所编辑的文档,本就是用户自己的 `settings.yaml`,�一个设置页还�供了打开它的入�。它没有挡�的写入,��是有分�的那些:`permission`(能放宽审批预设)与 `agent-presets`(决定一个会�挂载什么)本�就已被�务。 + +因此本次改动在本仓库实际新增的暴露�是一个命�空间:`agent-default-model`——它的两个字段指明一个�供方与一个模型,且没有任何�览器�侧渲染它。将�若�个命�空间的值确实�该跨越�议,由 `role('secret')` �字段作答:比整命�空间开关更精细,而且已�在执行。 + +## Alternatives considered + +**在 `settings.register()` 上加声明**(`client: { surface: 'plugin-config' | 'custom', title, description }`),这也是被删掉的 `WEB_SETTINGS_NAMESPACES` 注释所点�的既定方�。它让注册默认�跨越传输边界,并让�件作者一行代�自助。�决的原因是 `surface` 是�览器页�的�汇,而 `title`/`description` 属于呈现:Service Definition 一旦�带它们,就�了被�个 Consumer 塑形的 seam。它那� fail-closed 性质的价值也�如读起�那么高——�上文「白��实际护�了什么�。 + +**�设一份暴露目录**,�件在注册 settings 之外�加入这份自有注册表,�把 `ctx.llm.registerConfigurableProviders()` 一般化。�决的原因是它把一件事实拆�两处�能脱节的注册:注册了命�空间�忘了目录�目,产出的是一个�都编辑�了的分节,而没有任何门�看得�这个错误。 + +**给 api-proxy 加一个 deny-list `Config` 字段**,让部署方能扣下�个命�空间。因为没有消费者而�决:当��一个已注册的命�空间都是用户�以编辑的,而真正�感的字段由 `role('secret')` �字段作答,那是更精细的工具。在第一个用例出现之�就�明出�的整命�空间开关,正是包规则所�止的投机选项。 + +**把 schema 驱动的通用�片作为该 slot 的 `fallback`**,让没有�览器�侧的�件也能从 `schema.toJSON()` 得到一份表�(schemastery 本就�带 `description`�`role`�`min`/`max`/`step` 并将其�列化)。�决的原因是客户端�件按已挂载的 Loader entries 在�行时加载,�件作者完全�以交付一张真正的�片;而��渲染的表�在模型页那次已被判定�如手写。若这个判断日�改�,`fallback` 选项无需改动契约���用。 + +**客户端认领注册表**,让�个拥有�命�空间的界�声明它,好让通用�片知�哪些已�有人管。与通用�片一并�决:keyed 派�本就让无人认领的键什么都�渲染,这份注册表�会把 slot 账本已�说过的��说一�。 + +**�留 list slot,�给它的 options 加一个命�空间字段。** �决的原因是分区枚举的�是 entry 而�命�空间,空�缺陷照旧,未组装�件的�片也�需自我抑制。 + +## Consequences + +在本仓库之外分�的�件无需改动这里��从设置页�置:它在 Host 上注册自己的命�空间�在�览器里把�片注册在该键上,由分区把两者�对。�片现在按�片注册顺�出现,而���赖手工指定的 `order`。对本包注册的这几张�它是稳定的——它们从�一个 generator 安装;对**跨�件**的�片它并�稳定:包与包之间的 apply 顺�是无约�的(`packages/client/AGENTS.md`),因此多个外部�片��能在��次�动之间�排。�为它们定�,需�一个 section �排�的显�键,而 keyed 注册今天并��带。 + +以下延�,且都大于本次改动:脱�器对�能�由 union�intersection 或 transform 抵达的 `role('secret')` 原样返回(其自身的 `TODO(settings-wire-redaction)`),而 `schema.toJSON()` 会�带 secret 的默认值。该缺�早于本次改动,但�务�一个已注册命�空间,把它的影��从本仓库内�审计的 schema 扩大到任�第三方 schema,因此�议应当拒��务它无法�明�安全脱�的命�空间。�样延�的还有:对本次头�能力的组装�测试——用 overlay 挂载一个 fixture �件(Host �注册命�空间�`dsh.client` �注册�片)并在端到端断言。当�覆盖分别�明了两个�侧;已��片输出未�这一点,�明�了新路径。 + +分区新增的�议读�是一次 `settings.describe`,与�片�自已有的 per-scope 读�并列。它的失效通知在一个方�上�精确:�议通告的是文档�交与连接�置,而�注册行为,因此在分区读�之��被注册的命�空间,�等下一次�交或�连�会加入。 + +对仓库之外的作者�留有两处摩擦,�记在该分区的 README 里。�览器�侧必须是按客户端模�系统的 lazy-CJS factory 格�构建的 `dsh.client` 包,而产出它的 `clientBundle` 预设�于 `packages/client/tsdown.client.ts`,并�已�布的包。bundle 纯净度门��止以值的形�导入本包的�片外观与暂存表�模型,因此这样的�片��新实现暂存与 revision 设栅。�共享它们,�么�布该预设,�么在�片内部声明一层� slot 让分区�供外观;两者都尚未构建。 diff --git a/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.i18n.yaml b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.i18n.yaml new file mode 100644 index 0000000000..270d93300e --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.md +2026-08-13-session-content-search-opt-in.md: 2d14b2def00186c2957dc03ae712fbcb63d2c820 +2026-08-13-session-content-search-opt-in.zh.md: dbde561c82cebdbf51ad31b1cd22c908c8d0f327 diff --git a/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.md b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.md new file mode 100644 index 0000000000..2d14b2def0 --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.md @@ -0,0 +1,32 @@ +# Agent Note: Session content search ships opt-in through openAt never + +Status: implemented + +English | [中文](2026-08-13-session-content-search-opt-in.zh.md) + +## Problem + +The shipped bundles mounted the SQLite session-query provider with the full-text index live (`openAt: first-search`), so every default deployment carried a derived FTS index and the Web sidebar offered content search. Whether a deployment wants that index — its node:sqlite import, per-search source reconciliation, and derived storage — is a deployment choice, and the product default is to ship without it; the model-facing search tools were already opt-in and unmounted (the [not-shipped-default decision](../feature/2026-08-02-session-search-not-shipped-default.md)). + +Turning the capability off by unmounting the plugin row is not viable. `ApiProxyService` declares `sessionQuery` as a required injection, so without the provider the whole host API gateway stays unloaded and the Web GUI never boots. Session-log export traces subagent descendants through `ctx.sessionQuery.traceSession`, and a subagent fork resolves its Workspace through the same lineage trace — both would need optional-service guards plus a replacement lineage source, roughly tripling the change surface while losing exact reads everywhere. + +## Decision + +Content search is enforced off at the provider. `openAt: 'never'` is a third opening phase on `@deepseek-ai/dsh-session-query-sqlite`: `searchSessions` and `searchEvents` fail with the typed `SESSION_QUERY_SEARCH_DISABLED` code before any request normalization, node:sqlite is never imported or opened, and no source observation or reconciliation runs. Every inherited `ctx.sessionQuery` exact read, filter, and trace keeps working, so session export, fork Workspace inheritance, and title reads are unaffected. + +`SESSION_QUERY_SEARCH_DISABLED` joins the closed `SessionQueryErrorCode` taxonomy, and the `tool-session-query` service boundary maps it to the model-safe message `session search is disabled in this deployment`. + +The base bundle sets `openAt: never` on the `session-query-sqlite` row and the web bundle's restatement keeps it; enabling content search is a one-line `openAt` override (`first-search` or `startup`) in a later patch layer, typically with a durable `path`. The host `session.search` endpoint reports the provider failure through its existing error path, and the Web sidebar keeps its designed degradation: local title/workspace matching plus the content-search-unavailable notice. The CLI compat spec pins the shipped `openAt: never` rows, while the web e2e scaffold keeps content search enabled — its seeded-session scenarios navigate by content search, and those runs are the assembled coverage for the opt-in path. + +## Alternatives considered + +- **Unmount the plugin row** (`disabled: true` in the base patch): rejected — the api-gateway's required `sessionQuery` injection keeps the whole host API unloaded, and making that injection optional forces guards plus a header-walk lineage fallback in session export and fork resolution. +- **Disable at the consumers** (the host `session.search` endpoint or the sidebar): rejected — enforcement belongs to the operation that makes the decision; opt-in model tools or any other consumer would still reach the index. +- **A separate boolean beside `openAt`**: rejected — the opening phase already owns when SQLite starts; `never` extends the same axis instead of adding a second knob that can contradict it. + +## Consequences + +- Default deployments run no derived index: no node:sqlite import or experimental-SQLite startup warning, no reconciliation work, no derived database on disk. Sidebar search matches session titles and workspace names only. +- Search failures under the default are typed and stable rather than incidental, so callers distinguish a deployment choice from an index fault (`SESSION_QUERY_INDEX_FAILED`). +- Re-enabling content search is per-deployment configuration, not a code change, and restores the full FTS behavior unchanged. +- Compositions that mount the search tools without overriding `openAt` get the model-safe disabled message on every search call; enabling the tools implies enabling the index. diff --git a/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.zh.md b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.zh.md new file mode 100644 index 0000000000..dbde561c82 --- /dev/null +++ b/.agents/notes/implemented/architecture/2026-08-13-session-content-search-opt-in.zh.md @@ -0,0 +1,32 @@ +# Agent Note: 会�内容�索通过 openAt never 以 opt-in 方�交付 + +Status: implemented + +[English](2026-08-13-session-content-search-opt-in.md) | 中文 + +## 问题 + +交付的 bundle 之�以�用状�挂载 SQLite 会�查询�供方的全文索引(`openAt: first-search`),因此�个默认部署都�带一个派生 FTS 索引,Web 侧边��供内容�索。一个部署是�需�该索引——它的 node:sqlite 导入��次�索的��对账和派生存储——是部署自身的选择,产�默认��带它交付;��模型的�索工具此�已�是 opt-in 且未挂载(�[�默认交付决策](../feature/2026-08-02-session-search-not-shipped-default.md))。 + +通过�载�件行�关闭该能力��行。`ApiProxyService` 将 `sessionQuery` 声明为必需注入,没有该�供方时整个宿主 API 网关��未加载,Web GUI 无法�动。会�日志导出通过 `ctx.sessionQuery.traceSession` 追踪�代��代,�代�分�也通过�一血缘追踪解�其 Workspace——两者都需��选�务守�加一个替代血缘��,改动�大约扩大三�,�时使精确读�在所有地方消失。 + +## 决策 + +内容�索在�供方处强制关闭。`openAt: 'never'` 是 `@deepseek-ai/dsh-session-query-sqlite` 的第三个打开阶段:`searchSessions` 和 `searchEvents` 在任何请求规范化之�就以类型化的 `SESSION_QUERY_SEARCH_DISABLED` 代�失败,node:sqlite ��会被导入或打开,也��行任何��观察或对账。`ctx.sessionQuery` 上继承的全部精确读��过滤和跟踪���用,因此会�导出�分�的 Workspace 继承和标题读���影�。 + +`SESSION_QUERY_SEARCH_DISABLED` 加入�闭的 `SessionQueryErrorCode` 分类,`tool-session-query` 的�务边界将它映射为模型安全消� `session search is disabled in this deployment`。 + +base bundle 在 `session-query-sqlite` 行上设置 `openAt: never`,web bundle 的�述��该值;�用内容�索�需在�续 patch 层用一行覆盖 `openAt`(`first-search` 或 `startup`),通常�时�一个�久 `path`。宿主 `session.search` 端点沿现有错误路径报告�供方失败,Web 侧边���其既有�级:本地标题/工作区匹�加内容�索��用�示。CLI 兼容性测试固定交付的 `openAt: never` 行,而 Web e2e 脚手架��内容�索�用——其��会�场景通过内容�索导航,这些�行也是 opt-in 路径的装�级覆盖。 + +## 曾考虑的替代方案 + +- **�载�件行**(在 base patch 中 `disabled: true`)——�决:api-gateway 的必需 `sessionQuery` 注入会使整个宿主 API ��未加载,而把该注入改为�选需�守�加上会�导出与分�解�中的 header �历血缘回退。 +- **在消费方处关闭**(宿主 `session.search` 端点或侧边�)——�决:强制应由�出决定的�作执行;opt-in 的模型工具或任何其他消费方�会触达索引。 +- **在 `openAt` �增加独立布尔开关**——�决:打开阶段已�拥有"SQLite 何时�动"这一轴;`never` 延伸�一根轴,而�是增加一个�能与之矛盾的第二个旋钮。 + +## 结果 + +- 默认部署��行任何派生索引:没有 node:sqlite 导入或实验性 SQLite �动警告,没有对账工作,�盘上没有派生数�库。侧边��索�匹�会�标题和工作区�称。 +- 默认状�下的�索失败是类型化且稳定的,调用方�以把部署选择与索引故障(`SESSION_QUERY_INDEX_FAILED`)区分开。 +- �新�用内容�索是�部署�置而�代�改动,并原样��完整的 FTS 行为。 +- 挂载�索工具但未覆盖 `openAt` 的组�,�次�索调用都会得到模型安全的已�用消�;�用工具�味��时�用索引。 diff --git a/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.i18n.yaml index 92dcd28a7e..4c5e88d55e 100644 --- a/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.i18n.yaml +++ b/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.md -2026-07-31-composer-text-layers-share-one-scrollport.md: 6097779529f86e6d994296ae396f108c63f01abc -2026-07-31-composer-text-layers-share-one-scrollport.zh.md: 753d67d538d0c17512444639d60b7b5c8ff80e9a +2026-07-31-composer-text-layers-share-one-scrollport.md: d01231f706a7d3850ce1b3770ef351cb7e211384 +2026-07-31-composer-text-layers-share-one-scrollport.zh.md: 3ce8cc05dc57b05bb8c0bd903a0b64b12d4a6963 diff --git a/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.md b/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.md index 6097779529..d01231f706 100644 --- a/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.md +++ b/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.md @@ -24,6 +24,8 @@ One scrolling box, holding both layers. The browser then applies one offset to both layers, in the same frame, on the same compositor. The caret is bound to its glyphs by construction rather than by upkeep: there is no code to run, no event to wait for, and no state that can be one frame stale. The wheel-chaining handler stays, retargeted from the textarea to the scrollport, and remains the only listener on the box. +Safari's native text control has one engine exception: deleting across a soft-wrap threshold can retain the former line layout after the mirror shrinks. The [Safari soft-wrap recovery](2026-08-13-safari-textarea-soft-wrap-reflow.md) restores the zero-overflow invariant before paint without changing the one-scrollport design. + Two things the previous mechanism needed are gone with it: **The backdrop's trailing-line sentinel.** It existed to keep the two boxes' scroll extents equal — a textarea reserves a line box for the caret after a final newline while `white-space: pre-wrap` collapses a text node's trailing newline, so a draft ending in a newline made the backdrop one line shorter and clamped the mirrored offset a line above the caret. With one scrollport the backdrop's own extent decides nothing: the mirror div sizes the stack for both layers, both start at the same top, and a layer whose content ends earlier simply paints nothing on the last line. The shape is worth keeping in mind rather than the mechanism: it is the one that measured 628 against 652 when the two boxes had to agree on a height. diff --git a/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.zh.md b/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.zh.md index 753d67d538..3ce8cc05dc 100644 --- a/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-07-31-composer-text-layers-share-one-scrollport.zh.md @@ -24,6 +24,8 @@ composer 的文本由两层�放绘制(� [InputBar](../../../../packages/cl 于是�览器在�一帧��一个��器上,把�一个�移施加给两层。光标与字形的绑定�自结构本身,而�是�自�续维护:没有代��跑,没有事件�等,也没有任何状��能��一帧。滚轮接力处�器�留,�是从 textarea 改挂到滚动容器上,并且�是这个盒�上唯一的监�。 +Safari 的原生文本控件存在一个引擎例外:跨过软�行阈值的删除�能在镜�层收缩���留原先的行布局。[Safari 软�行��](2026-08-13-safari-textarea-soft-wrap-reflow.md)会在绘制���零溢出���,而�改��滚动容器设计。 + 上一版机制所需�的两样东西�它一起消失: **backdrop 的尾行哨兵。** 它的存在�是为了让两个盒�的滚动范围相等——textarea 会在末尾�行之�为光标�留一个行盒,而 `white-space: pre-wrap` 会折�文本节点的尾��行,因此以�行结尾的�稿会让 backdrop 少一行,把镜��移钳制在光标上方一行。改为�一滚动容器�,backdrop 自身的范围��决定任何事:镜�层为两层统一定高,两层顶端对�,内容更早结�的那一层�是在最�一行什么都�画。值得记�的是这类�稿形状而�是那套机制:正是它在「两个盒�必须就高度达�一致�的时代�出了 628 对 652。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml index 8a9b6236ae..ccae7043a7 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml +++ b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md -2026-08-04-composer-tab-gutter-reservation.md: 3b28c35c1f11676e41cabde76d1b0d16c688f034 -2026-08-04-composer-tab-gutter-reservation.zh.md: c357dd06c52a834c18d2e8a25246d4ad003db548 +2026-08-04-composer-tab-gutter-reservation.md: 8bd9fb2d86982d82b44a82c55b7303fcd9a5bf4d +2026-08-04-composer-tab-gutter-reservation.zh.md: 4b70aeb1d3777384907c345968971fcf75b3e74d diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md index 3b28c35c1f..8bd9fb2d86 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md +++ b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md @@ -14,13 +14,11 @@ So for as long as the transcript overflowed — the ordinary state of any sessio ## Decision -`.scrollBody` declares `scrollbar-gutter: stable` unconditionally, and the overlay branch declares the same box a scroll container on both axes — `overflow-x: hidden; overflow-y: auto` — instead of `overflow: hidden`. +`.scrollBody` declares `scrollbar-gutter: stable` for the Chat state, and the overlay branch overrides it with `scrollbar-gutter: auto` while staying a scroll container on both axes — `overflow-x: hidden; overflow-y: auto`. The reservation is Chat's alone: it holds the seat's content box at the same width whether or not the transcript overflows, so the card never jumps as a growing transcript starts to scroll, nor between the hero phase and the first scrolling turn. The overlay branch reserves nothing — the view owns its own scrollers, so a gutter there would only narrow the view's content — and its seat compensates for the bar instead ([the seat-width compensation](2026-08-12-composer-overlay-seat-width-compensation.md)). -The two halves are one change. The reservation is what makes both states measure against the same width; declaring the overlay branch a scroll container is what makes the reservation reach it. `stable` rather than `auto` because `auto` reserves only while the box actually overflows, and the difference between overflowing and not is precisely the difference between the two tabs — an `auto` gutter would state the bug rather than fix it. +`stable` rather than `auto` because `auto` reserves only while the box actually overflows, and the difference between overflowing and not is precisely the difference between Chat's two phases — an `auto` gutter would state the bug rather than fix it. -The overlay state is a scroll container that nothing scrolls: the view fills it (`flex: 1 1 0` with its own clip) and the seat is out of flow, so no gesture and no clipping behavior changes. What changes is which declarations the engine honours. WebKit applies `scrollbar-gutter` to an `overflow-y: auto` box and ignores it on a hidden one — measured on this app's own composer layers and recorded in [the composer scrollport note](2026-07-31-composer-text-layers-share-one-scrollport.md) — so a reservation left on a hidden box would hold in Chromium and silently not in Safari. - -The horizontal axis is declared rather than left to compute: a box that scrolls on one axis computes `visible` on the other to `auto`, and would grow a horizontal scrollbar of its own the first time a view's content reached past the column. +The reservation lives on an `overflow-y: auto` box, and that form is load-bearing: WebKit applies `scrollbar-gutter` to an `overflow-y: auto` box and ignores it on a hidden one — measured on this app's own composer layers and recorded in [the composer scrollport note](2026-07-31-composer-text-layers-share-one-scrollport.md) — so a reservation on a hidden box would hold in Chromium and silently not in Safari. The overlay branch keeps its `overflow-y: auto` form too, as a clipping box nothing scrolls out of: a single-axis scroller computes the other axis to `auto`, so the horizontal axis is declared `hidden` rather than left to compute, and would otherwise grow a horizontal scrollbar of its own the first time a view's content reached past the column. The reservation is worth what it costs only because the bar takes layout space here at all, which is not the browser's default behavior but this client's: `::-webkit-scrollbar` carries a width in ui-theme's sheet ([themed scrollbars](2026-07-28-themed-scrollbars-and-reserved-gutter.md)), and the sidebar's session list already reserves its own gutter for the same reason. @@ -37,7 +35,7 @@ The reservation is worth what it costs only because the bar takes layout space h ## Consequences - Chat's content column is permanently 8px narrower — in the hero phase and while the transcript is short as well, where no bar is drawn. That is the trade: one card position at every content height, instead of the widest possible column. -- The fix covers three transitions with one declaration, because all three are the same difference: Chat ↔ Trajectory, short ↔ scrolling transcript within Chat, and hero ↔ first scrolling turn. +- The card holds one position across three transitions, by two mechanisms: the reservation keeps Chat's seat at one width across its own phases (short ↔ scrolling transcript, hero ↔ first scrolling turn), and the overlay seat's compensation matches it on the Chat ↔ Trajectory transition ([the seat-width compensation](2026-08-12-composer-overlay-seat-width-compensation.md)). - The overlay state is now a scroll container. Nothing in it can overflow today; a future view that let its content exceed the column would scroll this box instead of clipping, and would need its own clip the way the Trajectory view already has one. - The committed golden records the reserved band, so a change to the sheet's `::-webkit-scrollbar` width — the value that decides how wide the reservation is — arrives as a reviewable diff in this scenario as well as in the sidebar's. @@ -45,6 +43,6 @@ The reservation is worth what it costs only because the bar takes layout space h `apps/web/tests/composer-tab-geometry.e2e.ts` measures the input card's rectangle in both tabs, at a viewport where the card sits at its width cap and one where it shrinks with the column, and asserts the two rectangles are the same rectangle. Only a real engine reports this: jsdom gives every element a zero-sized box and no scrollbar, so a unit spec could assert the declarations exist but not that the two states land in the same place. For the same reason no CSS-text spec accompanies it — it would restate the declarations without adding a fact the browser lane does not already establish. -The scenario launches chromium without Playwright's default `--hide-scrollbars`, which is load-bearing: under that argument a bar consumes no layout width, both tabs agree before this change as much as after it, and every comparison in the file holds vacuously. Measured, the pre-fix cascade leaves both bands at 0 under the argument, and at 8 and 0 with it dropped. +The scenario launches chromium without Playwright's default `--hide-scrollbars`, which is load-bearing: under that argument a bar consumes no layout width, so the tabs agree with and without the compensation and every comparison in the file holds vacuously. Measured, both bands sit at 0 under the argument and at 8 and 0 with it dropped. -The pre-fix cascade is then applied in the page — `scrollbar-gutter: auto` on the scroller, `overflow: hidden` on the overlay branch — and the same two tabs measured through it, which is what separates a card that does not move from a tab switch that never reached the layout. It reproduces the reported symptom as a number: 4px on each edge, half the 8px band. The golden records that control beside the fixed state, so the fixture carries the difference the change removes rather than only its absence. +The uncompensated cascade is then applied in the page — the overlay seat's `right` compensation dropped to 0 via `!important`, Chat's reservation untouched — and the same two tabs measured through it, which is what separates a card that does not move from a tab switch that never reached the layout. It reproduces the reported symptom as a number: 4px on each edge, half the 8px band. The golden records that control beside the fixed state, so the fixture carries the difference the change removes rather than only its absence. diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md index c357dd06c5..4b70aeb1d3 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.zh.md @@ -14,13 +14,11 @@ composer 座�在组件树中�有一个节点�一个�置,但它究竟 ## 决策 -`.scrollBody` 无�件声明 `scrollbar-gutter: stable`,overlay 分支则把�一个盒�在两个轴�上都声明为滚动容器——`overflow-x: hidden; overflow-y: auto`——而��是 `overflow: hidden`。 +`.scrollBody` 为 Chat 状�声明 `scrollbar-gutter: stable`,覆盖分支则将其覆盖为 `scrollbar-gutter: auto`,�时��为�轴滚动容器——`overflow-x: hidden; overflow-y: auto`。这�预留�属于 Chat:它让座�的内容盒在 transcript 是�溢出时都���一宽度,因此�片�会在 transcript 增长到开始滚动的那一刻跳动,也�会在 hero �与第一个�滚动轮次之间跳动。覆盖分支�预留任何槽�——视图自己滚动,槽��会白白收窄视图内容——它的座�改为补�滚动�宽度([座�宽度补�](2026-08-12-composer-overlay-seat-width-compensation.md))。 -这两�是�一处改动。预留使两�状��附于�一个宽度;把 overlay 分支声明为滚动容器,�使这�预留真正抵达它。选 `stable` 而� `auto`,是因为 `auto` �在盒�确实溢出时�预留,而「溢出与����就是两个标签页之间的那点差别——`auto` 的写法�是把缺陷�述一�,并�能修掉它。 +选 `stable` 而� `auto`,是因为 `auto` �在盒�确实溢出时�预留,而「溢出与����就是 Chat 两�相�之间的那点差别——`auto` 的写法�是把缺陷�述一�,并�能修掉它。 -overlay 状�是一个没有任何东西会去滚动它的滚动容器:视图把它填满(`flex: 1 1 0`,且自带�剪),座��在常规�中,因此没有任何手势与�剪行为�生�化。�化的是引擎会认哪些声明。WebKit 对 `overflow-y: auto` 的盒�应用 `scrollbar-gutter`,对 hidden 的盒�则忽略它——这是在本应用 composer 自身的图层上实测所得,并记录于 [composer 滚动视�记录](2026-07-31-composer-text-layers-share-one-scrollport.md)——所以把预留留在一个 hidden 盒�上,会在 Chromium 上�立,在 Safari 上悄无声�地��立。 - -横�轴是显�声明的,而�是交给推导:�轴滚动的盒�会把�一轴的 `visible` 计算为 `auto`,于是���个视图的内容第一次伸出列外,它就会长出自己的横�滚动�。 +这�预留�于 `overflow-y: auto` 的盒�上,而这个形�是承�的:WebKit 对 `overflow-y: auto` 的盒�应用 `scrollbar-gutter`,对 hidden 的盒�则忽略它——这是在本应用 composer 自身的图层上实测所得,并记录于 [composer 滚动视�记录](2026-07-31-composer-text-layers-share-one-scrollport.md)——所以把预留放在 hidden 盒�上,会在 Chromium 上�立,在 Safari 上悄无声�地��立。覆盖分支�样�留 `overflow-y: auto` 的形�,作为没有任何内容会滚出去的�剪盒:�轴滚动的盒�会把�一轴的 `visible` 计算为 `auto`,因此横�轴显�声明为 `hidden` 而�是交给推导,�则�个视图的内容第一次伸出列外时,它就会长出自己的横�滚动�。 这�预留之所以值回它的代价,��是滚动�在这里确实�布局空间——这并��览器的默认行为,而是本客户端的选择:ui-theme 的样�表给 `::-webkit-scrollbar` 声明了宽度([滚动�主题化](2026-07-28-themed-scrollbars-and-reserved-gutter.md)),侧边�的会�列表也正是出于�一原因预留了自己的滚动�槽。 @@ -37,7 +35,7 @@ overlay 状�是一个没有任何东西会去滚动它的滚动容器:视图 ## �果 - Chat 的内容列永久�窄 8px——hero �与 transcript 尚短�根本�绘制滚动�时�样如此。这就是这笔交易:以最宽的列���片在任何内容高度下都�有一个�置。 -- 一�声明覆盖三�切�,因为这三者本就是�一个差异:Chat ↔ Trajectory�Chat 内部 transcript 较短 ↔ transcript �滚动,以� hero ↔ 第一个�滚动轮次。 +- �片在三�切�下���一�置,由两�机制达�:预留让 Chat 的座�在自身�相�间���一宽度(transcript 较短 ↔ �滚动�hero ↔ 第一个�滚动轮次),Chat ↔ Trajectory 的切�则由覆盖座�的补��对�([座�宽度补�](2026-08-12-composer-overlay-seat-width-compensation.md))。 - overlay 状�现在是一个滚动容器。今天其中没有任何内容会溢出;将�若有视图�许自身内容超出会�列,这个盒�会滚动而�是�剪,那个视图就需�� Trajectory 视图那样自带�剪。 - �交的 golden 记录了预留�带,因此样�表中 `::-webkit-scrollbar` 宽度的�化——决定这�预留有多宽的那个值——会在本场景中与在侧边�场景中一样,以�评审的 diff 形�出现。 @@ -45,6 +43,6 @@ overlay 状�是一个没有任何东西会去滚动它的滚动容器:视图 `apps/web/tests/composer-tab-geometry.e2e.ts` 在两个标签页下测�输入�片的矩形,分别��片处于宽度上�的视�与�片�列收缩的视�,并断言这两个矩形是�一个矩形。�有真实引擎能报告这件事:jsdom 给�个元素的盒�尺寸都是零,也没有滚动�,因此�元测试�能断言那些声明存在,无法断言两�状��在�一�置。出于�一原因,本次没有附带读� CSS 文本的�元测试——它�会把声明�述一�,并�会补上�览器车�尚未确立的事实。 -该场景�动 chromium 时去掉了 Playwright 默认的 `--hide-scrollbars`,这一点是承�的:带上该�数时滚动���任何布局宽度,两个标签页在改动���样一致,文件中的�一处比较都会空洞地通过。实测:带上该�数时,改动�的层�让两�预留带的宽度都是 0;去掉它则分别是 8 与 0。 +该场景�动 chromium 时去掉了 Playwright 默认的 `--hide-scrollbars`,这一点是承�的:带上该�数时滚动���任何布局宽度,因此两个标签页在有补�与无补�时�样一致,文件中的�一处比较都会空洞地通过。实测:带上该�数时两�预留带的宽度都是 0;去掉它则分别是 8 与 0。 -��,改动�的层�会被注入页�——滚动容器上 `scrollbar-gutter: auto`,overlay 分支上 `overflow: hidden`——并在其下测��样的两个标签页,这正是把「�片确实没动�与「标签页切�根本没到达布局�区分开的那一步。它把上报的症状�现为一个数字:��边 4px,�是 8px 带宽的一�。golden 把这份对照与修��的状�并排记录,因此 fixture(测试�置数�)承载的是这次改动所消除的那个差值,而�仅仅是它的缺席。 +��,未补�的级�会被注入页�——通过 `!important` 把覆盖座�的 `right` 补��为 0,Chat 的预留����——并在其下测��样的两个标签页,这正是把「�片确实没动�与「标签页切�根本没到达布局�区分开的那一步。它把上报的症状�现为一个数字:��边 4px,�是 8px 带宽的一�。golden 把这份对照与修��的状�并排记录,因此 fixture(测试�置数�)承载的是这次改动所消除的那个差值,而�仅仅是它的缺席。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.i18n.yaml new file mode 100644 index 0000000000..96fb51ced0 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.md +2026-08-04-large-history-pagination-call-stack.md: 28c22121123a227c507c506683ae727d238d98bd +2026-08-04-large-history-pagination-call-stack.zh.md: 57dde9bdc0a4aa52e1af024eb606bf9258430fa7 diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.md b/.agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.md new file mode 100644 index 0000000000..28c2212112 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.md @@ -0,0 +1,27 @@ +# Agent Note: Large history provenance is scanned without argument expansion + +Status: implemented + +English | [中文](2026-08-04-large-history-pagination-call-stack.zh.md) + +## Problem + +A finalized assistant message can reference hundreds of thousands of streamed chunks through `sourceEventSeqs`. History pagination found the message group's first event with `Math.min(event.seq, ...sourceEventSeqs)`, so a valid session could exceed the JavaScript engine's function-argument limit and make `session.history` fail with HTTP 500. + +## Decision + +Pagination scans `sourceEventSeqs` and updates the earliest sequence number one element at a time. The algorithm remains linear in the provenance size and preserves the existing page boundary: a page starts before all recorded sources of its oldest included message. + +A regression test rejects multi-argument minimum calls and verifies that every provenance event remains on the page with its finalized message. This exercises the failure mechanism without making the default test suite allocate a production-sized chunk stream. + +## Alternatives considered + +- **Raise the JavaScript stack or argument limit** — rejected: the limit is engine- and deployment-dependent, and array expansion still makes valid history depend on an unrelated runtime ceiling. +- **Truncate `sourceEventSeqs` during pagination** — rejected: this could cut a page inside a message and violate replay grouping. +- **Cap streamed chunk count at the provider boundary** — rejected: providers may legitimately emit long streams, and pagination must handle every valid session representation. + +## Consequences + +- Large provenance arrays no longer make history pagination throw solely because of their length. +- Pagination semantics and wire responses are unchanged. +- This does not bound the byte size of a history page or the browser cost of replaying it; those performance concerns remain separate from the server-side call-stack failure. diff --git a/.agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.zh.md b/.agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.zh.md new file mode 100644 index 0000000000..57dde9bdc0 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-04-large-history-pagination-call-stack.zh.md @@ -0,0 +1,27 @@ +# Agent Note: 大规模历�记录的溯�信�通过扫�处�,���数展开 + +Status: implemented + +[English](2026-08-04-large-history-pagination-call-stack.md) | 中文 + +## 问题 + +一�已定稿的 assistant 消��以通过 `sourceEventSeqs` 引用数�万个��分片。历�记录分页使用 `Math.min(event.seq, ...sourceEventSeqs)` 查找消�组的首个事件,因此,有效会��能超出 JavaScript 引擎的函数�数数�上�,导致 `session.history` 以 HTTP 500 失败。 + +## 决策 + +分页逻辑�项扫� `sourceEventSeqs`,�次使用一个元素更新最早的��。该算法的��度相对溯�信�规模�为线性,并�留现有的页�边界:页�起点�于其所�最早消�的所有已记录��之�。 + +回归测试会拒�以多个�数调用�最�值的�法,并验��个溯�事件都会与其已定稿消��留在�一页中。这既覆盖了故障机制,也��默认测试套件分�生产规模的分片�。 + +## 考虑过的替代方案 + +- **�高 JavaScript 栈或�数上�**:�予采纳,因为该上��决于引擎和部署环境,而且数组展开�会让有效历�记录�制于无关的�行时上�。 +- **在分页时截断 `sourceEventSeqs`**:�予采纳,因为这�能会从消�中间切分页�,破�回放分组。 +- **在�供方边界�制��分片数�**:�予采纳,因为�供方�能会��地产生长�,而分页必须处��一�有效的会�表示。 + +## �果 + +- 大型溯�数组��仅因长度而使历�记录分页抛出异常。 +- 分页语义与�议�应����。 +- 本决策��制历�记录页�的字节大�,也��制�览器回放该页�的开销;这两项性能问题�与�务端调用栈故障分开处�。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.i18n.yaml index cca3debb14..0b27ea5d9f 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.i18n.yaml +++ b/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.md -2026-08-10-minimal-preset-owns-rl-composition.md: d83083de74f1d3203822d82e4e04560819412b48 -2026-08-10-minimal-preset-owns-rl-composition.zh.md: 36aeea0d8af6e371eddd6f09e36bb48a0348959e +2026-08-10-minimal-preset-owns-rl-composition.md: 65d24f9a03eedffac34f0c0141a8e2f643a48b7b +2026-08-10-minimal-preset-owns-rl-composition.zh.md: 72eaa0e5bba46743abd336e64316c886fa58631a diff --git a/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.md b/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.md index d83083de74..65d24f9a03 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.md +++ b/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.md @@ -14,13 +14,13 @@ The split also hid other drift. The preset mounted one-shot Bash rather than the The shipped Web `minimal` preset is the sole Web owner of the RL agent composition. It declares an entry-local PTY registry and local backend, persistent `bash` with the RL environment description and 300-second timeout, and `str_replace_editor`. Tool presentation remains a deployment choice. The later [bare two-tool runtime decision](../feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.md) supersedes this note's original compaction and filesystem-provider choices: the current preset mounts an entry-local `fs-local` provider and no compaction backend. The editor accepts no `requireAbsolutePath` setting because absolute paths are its unconditional contract. -The preset persona is exactly `You are a helpful software engineer assistant.` and sets `complete: true`. A complete `PromptSection` participates in ordinary assembly so tools, contexts, variables, and cooperative listeners still resolve; after the `system-prompt/assemble` waterfall, the prompt registry restores a detached copy of that section as the sole system-prompt section. Multiple effective complete sections reject assembly. This final registry constraint prevents harness identity, Web orientation, tool guidance, or an assembly listener from appending prompt text. +The preset persona is exactly `You are a helpful software engineer assistant.`, sets `complete: true`, and suppresses runtime context for its agent scope. A complete `PromptSection` participates in ordinary assembly so tools, variables, and cooperative listeners still resolve; after the `system-prompt/assemble` waterfall, the prompt registry restores a detached copy of that section as the sole system-prompt section and discards every dynamic context contribution. Multiple effective complete sections reject assembly. These final registry constraints prevent harness identity, Web orientation, tool guidance, an assembly listener, sandbox policy, approval policy, delegation, or another dynamic context provider from adding model input. The process-wide `core-web.cordis.yml` patch is absent. Browser UI, workspace attachment, persistence, subprocess, sandbox, permission, model routing, and other cross-session services remain host-owned. Selecting `minimal` changes one agent's model-facing composition and shadows the host filesystem provider only for that agent, without changing other sessions in the Web process. ## Verification -System-prompt and persona package tests prove final complete-section enforcement, including waterfall mutation and duplicate rejection. The shipped-preset composition test asserts the exact prompt, Bash description, absolute editor schema, and two-tool catalog under the default native presentation. The keyless Web replay sends a real request through a `minimal` agent while global identity, Web-orientation text, and a test section are registered, asserts the entry-local filesystem is bare and compaction is absent, then executes two persistent Bash calls to prove environment and cwd state survive and executes the editor through an absolute path. +System-prompt and persona package tests prove final complete-section and runtime-context suppression, including waterfall mutation and duplicate rejection. The shipped-preset composition test asserts the exact prompt, Bash description, absolute editor schema, and two-tool catalog under the default native presentation. The keyless Web replay sends a real request through a `minimal` agent while global identity, Web-orientation text, dynamic policy contexts, and a test section are registered, asserts that no runtime-context snapshot exists, the entry-local filesystem is bare, and compaction is absent, then executes two persistent Bash calls to prove environment and cwd state survive and executes the editor through an absolute path. The standalone [`minimal.cordis.yml`](../../../../examples/jsonrpc-agent/minimal.cordis.yml) is the complete two-tool composition for the bundled JSON-RPC runtime. The [bare two-tool runtime decision](../feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.md) owns its launch-specific environment configuration, bare filesystem, and absence of compaction. Its keyless SDK replay asserts the assembled system prompt and two-tool catalog, executes persistent Bash across calls, and exercises the editor; the Python SDK tutorial provides the runnable entry point. diff --git a/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.zh.md b/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.zh.md index 36aeea0d8a..72eaa0e5bb 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-08-10-minimal-preset-owns-rl-composition.zh.md @@ -14,13 +14,13 @@ Status: implemented �附的 Web `minimal` preset 是 RL agent 组�在 Web 中的唯一所有者。它声明 entry 本地的 PTY 注册表与本地�端�带 RL 环境�述且超时为 300 秒的�久 `bash`,以� `str_replace_editor`。工具呈现�由部署选择。�续的[裸�工具�行时决策](../feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.md)�代了本记录最�的压缩与文件系统�供方选择:当� preset 挂载 entry 本地的 `fs-local` �供方,�挂载压缩�端。编辑器�接� `requireAbsolutePath` 设置,因为�求�对路径是它的无�件约定。 -preset persona �好是 `You are a helpful software engineer assistant.`,并设置 `complete: true`。complete `PromptSection` �与常规组装,因此工具�上下文���和�作�监�器�会解�;`system-prompt/assemble` waterfall(瀑布�事件)结��,�示�注册表会将该段�的独立副本��为唯一的系统�示�段�。存在多个有效 complete 段时,组装会被拒�。这项最终注册表约��防止 harness 身份�Web 定��工具引导或组装监�器追加�示�文本。 +preset persona �好是 `You are a helpful software engineer assistant.`,它设置 `complete: true`,并为其 agent 作用域抑制 runtime context。complete `PromptSection` �与常规组装,因此工具���和�作�监�器�会解�;`system-prompt/assemble` waterfall(瀑布�事件)结��,�示�注册表会将该段�的独立副本��为唯一的系统�示�段�,并丢弃�个动�上下文贡献。存在多个有效 complete 段时,组装会被拒�。这些最终注册表约��防止 harness 身份�Web 定��工具引导�组装监�器�沙箱策略�批准策略�委派或其他动�上下文�供方添加模型输入。 进程级 `core-web.cordis.yml` patch ��存在。�览器 UI�workspace 附加��久化��进程�沙箱����模型路由�其他跨会��务�由宿主�有。选择 `minimal` 会改�一个 agent ��模型的组�,并且仅为该 agent �蔽宿主文件系统�供方,�会改� Web 进程中的其他会�。 ## 验� -系统�示�与 persona 包测试�明了 complete 段的最终约�,包括 waterfall 修改与��项拒�。交付 preset 组�测试在默认原生呈现下断言精确的�示��Bash �述��求�对路径的编辑器 schema 和�工具目录。无密钥 Web 回放通过 `minimal` agent ��一个真实请求,�时注册全局身份�Web 定�文本和一个测试段�;它断言 entry 本地文件系统是裸�端且压缩�存在,��执行两次�久 Bash 调用,�明环境与 cwd 状�能够�留,并通过�对路径执行编辑器。 +系统�示�与 persona 包测试�明了 complete 段最终约�与 runtime-context 抑制,包括 waterfall 修改与��项拒�。交付 preset 组�测试在默认原生呈现下断言精确的�示��Bash �述��求�对路径的编辑器 schema 和�工具目录。无密钥 Web 回放通过 `minimal` agent ��一个真实请求,�时注册全局身份�Web 定�文本�动�策略上下文和一个测试段�;它断言�存在 runtime-context 快照�entry 本地文件系统是裸�端且压缩�存在,��执行两次�久 Bash 调用,�明环境与 cwd 状�能够�留,并通过�对路径执行编辑器。 独立的 [`minimal.cordis.yml`](../../../../examples/jsonrpc-agent/minimal.cordis.yml) 是内置 JSON-RPC �行时的完整�工具组�。[裸�工具�行时决策](../feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.md)说明其�动方�专属的环境�置�裸文件系统和无压缩选择。其无密钥 SDK 回放会断言组装�的系统�示�与�工具目录,跨调用执行�久 Bash,并使用编辑器;Python SDK 教程�供��行的入�。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.i18n.yaml index 61be0dddfb..290ede1714 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.i18n.yaml +++ b/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.md 2026-08-11-bounded-background-job-admission.md: 8fa5bec07647947b730c436284da71b83deedb48 -2026-08-11-bounded-background-job-admission.zh.md: d827e07aacc7bc933474577214d94bab9fe5f5c3 +2026-08-11-bounded-background-job-admission.zh.md: 79e759041cbf9d6e12b444f47e9d9ef0aa218532 diff --git a/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.zh.md b/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.zh.md index d827e07aac..79e759041c 100644 --- a/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-08-11-bounded-background-job-admission.zh.md @@ -12,7 +12,7 @@ Status: implemented ## 决策 -`LocalJobRegistry` 拥有 `maxConcurrentJobsPerOwner` �置字段。它�接�正的安全整数,默认值为 `10`,并通过 Service provider 的 Cordis schema�typed `agent-spine-demo` 组�包与 ACP 应用�置�供。组�包�传输该值;其�义归进程内 Service provider 所有。 +`LocalJobRegistry` 拥有 `maxConcurrentJobsPerOwner` �置字段。它�接�正的安全整数,默认值为 `10`,并通过 Service Provider 的 Cordis schema�typed `agent-spine-demo` 组�包与 ACP 应用�置�供。组�包�传输该值;其�义归进程内 Service Provider 所有。 [通用任务�行时决策](../architecture/2026-06-20-generic-long-running-tool-runtime.md)拥有共享 Task 生命周期与控制 API;本记录�拥有进程内准入策略。 @@ -34,7 +34,7 @@ owner 与�务释放�留现有顺�:请求�消,在生产方释放资 ## 验� -任务 Service provider 测试覆盖默认与显�上��生产方执行�拒��id 计数器���`stopping` �����终�释放�确切 owner 隔离��会�替代对象�共享无 owner 桶��法�置�owner 清�和�务拆除。spine 与 ACP 组�测试固定 typed 转�。一� keyless ACP 回放以 1 为上��动真实 Loader 组�,�动一个真实�� Bash 进程,观察第二次�动返回��作错误,按返回的 job id �止第一个任务,并验�被拒�生产方的标记文件从未生�。 +任务 Service Provider 测试覆盖默认与显�上��生产方执行�拒��id 计数器���`stopping` �����终�释放�确切 owner 隔离��会�替代对象�共享无 owner 桶��法�置�owner 清�和�务拆除。spine 与 ACP 组�测试固定 typed 转�。一� keyless ACP 回放以 1 为上��动真实 Loader 组�,�动一个真实�� Bash 进程,观察第二次�动返回��作错误,按返回的 job id �止第一个任务,并验�被拒�生产方的标记文件从未生�。 ## 曾考虑的替代方案 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml new file mode 100644 index 0000000000..a1904a4b03 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md +2026-08-12-composer-overlay-seat-width-compensation.md: 0ec4d1272ac1adab5b724dccf44f567e15cc3368 +2026-08-12-composer-overlay-seat-width-compensation.zh.md: 2f66771240fe62e15c481342d55a82dd09cfb864 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md new file mode 100644 index 0000000000..0ec4d1272a --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md @@ -0,0 +1,39 @@ +# Agent Note: The overlay composer seat compensates for the bar instead of reserving a gutter + +Status: implemented + +English | [中文](2026-08-12-composer-overlay-seat-width-compensation.zh.md) + +## Problem + +The [composer-tab gutter reservation](2026-08-04-composer-tab-gutter-reservation.md) made the column's scroller reserve a scrollbar gutter unconditionally, so the composer seat measured the same width in Chat and in a view with a composer overlay. The cost was paid by every overlay view: the view's content column ended 8px short of the column's right edge, because the scroller reserved a gutter for a bar it never draws — the trajectory ledger owns its own scrollers and the outer box never scrolls. + +The trajectory table made that cost visible: its full-width row divider lines stopped 8px short of the pane edge, leaving a strip of whitespace at the right of every line and of the whole content column. + +## Decision + +The reservation now belongs to Chat alone. The overlay branch declares `scrollbar-gutter: auto`, so the view's content spans the full column; the overlay composer seat (absolutely positioned against the padding box) gives back the bar's width with `right: var(--dsh-scrollbar-width)`, so the input card still measures the same width as Chat's seat and does not move between tabs. + +The compensation value is not a literal: ui-theme's scrollbar.css defines `--dsh-scrollbar-width` (8px on the WebKit path) beside the `::-webkit-scrollbar` rule it mirrors, and the seat reads that variable. The scrollbar-styles spec pairs the variable with the mirrored rule and with the compensation consumer, so a change to the sheet's bar width without the variable — or to the variable without the consumer — fails the gate, not just review. + +## Alternatives considered + +**Keep the unconditional reservation and shrink every overlay view.** The pre-fix behavior. It keeps one declaration for both tabs but taxes every overlay view with an 8px content column, which the trajectory ledger surfaced as visible whitespace. Rejected because the overlay views own their scrolling; they should not pay for Chat's bar. + +**Reserve on the overlay branch too and let the view bleed into the gutter.** More moving parts for the same result: the gutter would still exist on a box that never scrolls, and the view would have to break out of the content box to reclaim its width. + +**Accept the 4px card shift.** Dropping the reservation without compensating the seat would move the input card on every tab switch, which is exactly the symptom the earlier note fixed. Rejected: the card position is a deliberate cross-tab invariant. + +**Inset the overlay seat by the bar's width.** The [gutter-reservation note](2026-08-04-composer-tab-gutter-reservation.md) rejected exactly this, and this note adopts it; what changed is the rejection's premise. The number was the engine's, not ours — the WebKit path draws the sheet's 8px bar while the Firefox path draws whatever `scrollbar-width: thin` resolves to — so a hardcoded inset would line the two states up in Chromium and drift elsewhere. The overlay branch reserved an engine-resolved gutter of its own back then, so an inset had to match that width exactly. Today the overlay branch reserves nothing, so the compensation is the overlay side's only mechanism, and the literal half of the rejection is answered by making the 8px a variable that mirrors the `::-webkit-scrollbar` rule in the same diff. The Firefox half remains: Chat reserves the engine-resolved width while the compensation stays fixed, and the residual drift where the two differ is recorded as an accepted cost in Consequences. + +## Consequences + +- Chat keeps its reserved gutter and its stable card position; nothing changes on that tab. +- Overlay views (trajectory) span the full column; the trajectory ledger's divider lines reach the pane edge. +- The input card still holds one horizontal position across the Chat and Trajectory tabs, now by two mechanisms instead of one: Chat reserves, the overlay seat compensates. +- Chat reserves the engine-resolved width while the overlay seat compensates a fixed 8px. Where the two differ — the Firefox path resolves `scrollbar-width: thin` per platform, and the e2e runs only on Chromium — the card drifts by half the difference on tab switch. Accepted residual cost, recorded here rather than asserted away: no measurement of the Firefox thin width on the target platforms exists in this change. +- `--dsh-scrollbar-width` becomes a public ui-theme variable read outside ui-theme; the scrollbar-styles spec pairs it with the mirrored `::-webkit-scrollbar` width rule and with the compensation consumer, closing the indirection-gate gap the variable would otherwise leave. + +## Testing + +`apps/web/tests/composer-tab-geometry.e2e.ts` still asserts the card holds its position across tabs and now also asserts the split: Chat's scroller keeps `scrollbar-gutter: stable` and a nonzero band, while the overlay branch resolves `auto` with a zero band. The control cascade changed with the mechanism: it now drops the seat's `right` compensation (instead of dropping a gutter Chat never had on that branch) and measures the same 4px shift, proving the equal rectangles are not a tab switch that never reached layout. The committed golden records both states. diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md new file mode 100644 index 0000000000..2f66771240 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.zh.md @@ -0,0 +1,39 @@ +# Agent Note: 覆盖视图的 composer 座�改为补�滚动�宽度,��预留滚动�槽 + +Status: implemented + +[English](2026-08-12-composer-overlay-seat-width-compensation.md) | 中文 + +## 问题 + +[composer 标签页滚动�槽预留](2026-08-04-composer-tab-gutter-reservation.md) 让会�列滚动容器无�件预留一�滚动�槽,使 composer 座�在 Chat 与带 composer 覆盖的视图中测得相�宽度。代价由�个覆盖视图承担:视图内容列比列�边缘窄 8px,因为滚动容器为一�它从�绘制的滚动�预留了槽——trajectory �账由视图内部自己的滚动容器滚动,外层盒�从�滚动。 + +trajectory 表格让这个代价显形:整行分隔线在���边缘� 8px 处�止,��线�侧以�整个内容列�侧都留下一�空白带。 + +## 决策 + +预留现在�属于 Chat。覆盖分支声明 `scrollbar-gutter: auto`,视图内容�满整列;覆盖分支的 composer 座�(相对 padding box �对定�)用 `right: var(--dsh-scrollbar-width)` 让出滚动�宽度,使输入��与 Chat 座�测得相�宽度,切�标签页时�移动。 + +补�值�是字��:ui-theme 的 scrollbar.css 在它镜�的 `::-webkit-scrollbar` 规则�定义 `--dsh-scrollbar-width`(WebKit 路径 8px),座�读�该��。scrollbar-styles 规格把该��与其镜�规则�以�补�消费者�对检查,因此样�表滚动�宽度一����步��——或��一����步消费者——都会让门�失败,而��是评审时�现。 + +## 备选方案 + +**�留无�件预留,压缩�个覆盖视图。** 修��行为。两个标签页一�声明,但�个覆盖视图都�付出 8px 内容列,trajectory �账将其显现为��空白。已拒�:覆盖视图自己滚动,�应为 Chat 的滚动�买�。 + +**覆盖分支也预留,并让视图渗入滚动�槽。** �样结果下更多活动部件:从�滚动的盒�上�存在滚动�槽,视图还得�破内容盒�能�回宽度。 + +**接� 4px �片�移。** 去掉预留��补�座�,会在�次切�标签页时移动输入�——正是�一份 note 修�的症状。已拒�:�片�置是刻���的跨标签页���。 + +**把 overlay 座�按滚动�宽度内缩。** [滚动�槽预留 note](2026-08-04-composer-tab-gutter-reservation.md) 当��决的正是这个方案,本 note 采纳了它;�的是�决的��。这个数字属于引擎而�属于我们——WebKit 路径绘制样�表里的 8px 滚动�,Firefox 路径绘制 `scrollbar-width: thin` 解�出的宽度——因此硬编�的内缩会让两�状�在 Chromium 上对��在别处继续漂移。当� overlay 分支自己预留的是引擎解�出的槽宽,内缩必须精确匹�那个宽度。如今 overlay 分支�预留任何槽�,补��为覆盖侧唯一的机制;�决的字��那一�,通过把 8px ��与 `::-webkit-scrollbar` 规则�处一个 diff 的���回应。Firefox 那一��然存在:Chat 预留引擎解�宽度,补���固定 8px,两者�等之处的残余漂移作为接�的代价记录在�果中。 + +## �果 + +- Chat �留滚动�槽与稳定的�片�置;该标签页无任何�化。 +- 覆盖视图(trajectory)�满整列;trajectory �账的分隔线到达���边缘。 +- 输入�在 Chat 与 Trajectory 标签页间����一水平�置,现在由两�机制而�一�达�:Chat 预留,覆盖座�补�。 +- Chat 预留引擎解�宽度,覆盖座�补�固定的 8px。两者�等之处——Firefox 路径按平�解� `scrollbar-width: thin`,而 e2e �在 Chromium 上�行——�片在切�标签页时会漂移�个差值。这是接�的残余代价,如实记录于此而�断言消除:本次改动并未�供目标平� Firefox thin 宽度的实测。 +- `--dsh-scrollbar-width` �为 ui-theme 对外�且被 ui-theme 之外读�的��;scrollbar-styles 规格把它与镜�的 `::-webkit-scrollbar` 宽度规则�以�补�消费者�对检查,补上了该��本会留下的间接层门�缺�。 + +## 测试 + +`apps/web/tests/composer-tab-geometry.e2e.ts` �断言输入�在标签页间���置,并新增断言拆分:Chat 滚动容器�� `scrollbar-gutter: stable` 与�零槽宽,覆盖分支解�为 `auto` 且槽宽为零。控制级��机制改�:现在移除座�的 `right` 补�(而�移除该分支上 Chat 从未有过的槽),测得�样的 4px �移,�明相等的矩形并�从未到达布局的标签页切�。�交的 golden 记录两�状�。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.i18n.yaml new file mode 100644 index 0000000000..1c650cc79c --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.md +2026-08-12-fix-pwsh-terminal-overlay-dup.md: 7a214ea093faf49141c66bfc2cbb065fbeb29825 +2026-08-12-fix-pwsh-terminal-overlay-dup.zh.md: 6d38ca58ad97e5ad04992e54a7938c9fea300863 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.md b/.agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.md new file mode 100644 index 0000000000..7a214ea093 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.md @@ -0,0 +1,55 @@ +# Agent Note: fix the pwsh terminal overlay duplicate-loader collision + +Status: implemented + +English | [中文](2026-08-12-fix-pwsh-terminal-overlay-dup.zh.md) + +## Problem + +`apps/web/tests/pwsh-terminal.e2e.ts` fails on every platform with `TypeError: duplicate loader entry id: tool-pwsh`, thrown from `vendor/loader/src/config/group.ts:64` while applying the web composition. The failing seed lane boots the full shipped bundle plus a test overlay, so the E2E never reaches its rendering assertion and every `check:ci:snapshot`/`test:web` run reports a red web test even though the feature under test is unrelated to the change under review. + +The web E2E scaffold applies an `extraOverlayPath` after the shipped Web surface and base patches. `pwsh-terminal.overlay.yml` used an `insert` block to add a `tool-pwsh` row: + +```yaml +- insert: + - id: pwsh-local + name: '@deepseek-ai/dsh-pwsh-local' + - id: tool-pwsh + name: '@deepseek-ai/dsh-tool-pwsh' +``` + +`insert` is correct only while `tool-pwsh` is absent from the composition. The id exists because `86b6979bdc` (refactor(bundle): fold the Windows shell platform layer into the base rows) moved both shell stacks into the base bundle with inverted platform gates — `packages/bundle/base/cordis.patch.yml` declares `tool-pwsh` with `disabled: !!js process.platform !== 'win32'`, so the row is present in the composition on every platform. Later, `42fc7c5ffb` (refactor(preset): gate tool-pwsh by platform alongside tool-bash) added a web-app patch row that disables `tool-pwsh` for surfaces that use presets; a patch row cannot introduce an id, so it is not the source of the collision. The overlay's `insert` delivers a second row with the same id in the same loader group, and the loader rejects the pair at boot. + +## Decision + +Replace the overlay's `insert` of `tool-pwsh` with a top-level id-targeted override: + +```yaml +- id: tool-pwsh + name: '@deepseek-ai/dsh-tool-pwsh' + disabled: false +``` + +The effective `tool-pwsh` state is a three-layer stack: the base row gates `disabled` on `process.platform !== 'win32'`, the web-app overlay sets `disabled: true` unconditionally for preset surfaces, and this lane's override clears it back to `disabled: false` regardless of platform. An `id`-targeted top-level override replaces the composed row; only an `insert` would collide. + +The lane also now disables `pwsh-sandbox` by id, symmetric with the existing `bash-sandbox` disable: the base gates `pwsh-sandbox` with `disabled: !!js process.platform !== 'win32'`, so on Windows it would otherwise mount beside the inserted `pwsh-local` and both would register the same executor service. Disabling it keeps `pwsh-local` the lone executor on every platform. + +The overlay header comment was updated to describe the full selection and the `tool-pwsh` inline comment now names the base row as the source of the id. + +## Alternatives considered + +**Keep the `insert` and change the web composition instead.** Rejected, because the shipped web composition should keep the host `tool-pwsh` row disabled for every surface that uses presets; the overlay is the lane that deliberately needs it, so the by-id enable belongs there. The base row itself cannot be removed either: it is the platform-gated shell-stack declaration shared by every bundle. + +**Enable `tool-pwsh` in the `insert` block.** Not possible: an `insert` of an id that already exists is the very duplicate being fixed. The row must be targeted by id, which is the top-level override form, not `insert`. + +**Patch `tool-pwsh` by id without setting `disabled: false`.** Insufficient: the web-app overlay sets `disabled: true` unconditionally, and the base row's platform gate only applies where the web-app override is absent, so an override that only restates `name` leaves the row disabled and the lane renders no terminal card. The `disabled: false` is required. + +**Only disable `bash-sandbox` and rely on the platform gate to keep `pwsh-sandbox` off.** Rejected: that holds on POSIX but breaks on Windows, where the base row leaves `pwsh-sandbox` enabled and it would collide with the inserted `pwsh-local` on the shared executor service. The lane's `pwsh-sandbox` disable keeps one executor on every platform. + +## Verification + +Reverting the fix (restoring the `insert` of `tool-pwsh`) reproduces the exact `duplicate loader entry id: tool-pwsh` boot failure, confirming the override is load-bearing. With the fix in place `pwsh-terminal.e2e.ts` passes 2/2 on the same head — this exercises the POSIX seam, where the seeded pwsh call renders through the enabled `tool-pwsh` and the inserted `pwsh-local`. The seed lane requires a usable `pwsh`, so it skips on hosts without one; a `pwsh` binary is present on this machine and the test ran. The Windows path (base `pwsh-sandbox` mounted beside the inserted `pwsh-local`) is not exercised by any CI lane, whose `test:web` runs only on Linux; the overlay disables `pwsh-sandbox` to keep that path composable if it ever runs on a Windows dev machine. + +## Consequences + +The web E2E seed lane that exercises PowerShell boot now composes instead of colliding, so `check:ci:snapshot` and `test:web` stop failing on the duplicate independently of the change under test. The pattern is general: a `--patch`/`extraOverlayPath` overlay must probe whether a row already exists in the bundle it augments before choosing `insert` over an id-targeted override; `insert` of an id that the base or shipped Web surface already declares is a boot-time duplicate. diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.zh.md new file mode 100644 index 0000000000..6d38ca58ad --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-fix-pwsh-terminal-overlay-dup.zh.md @@ -0,0 +1,55 @@ +# Agent Note:修� pwsh 终端 overlay 的�� loader 冲� + +Status: implemented + +[English](2026-08-12-fix-pwsh-terminal-overlay-dup.md) | 中文 + +## Problem + +`apps/web/tests/pwsh-terminal.e2e.ts` 在所有平�上都以 `TypeError: duplicate loader entry id: tool-pwsh` 失败,由 `vendor/loader/src/config/group.ts:64` 在应用 web 组�时抛出。该失败的 seed 通�会�动完整�布的 bundle 加一个测试 overlay,因此 E2E 永远到�了渲染断言,导致 `check:ci:snapshot` 与 `test:web` �次�行都报一个红的 web 测试,�便被测功能与评审中的改动无关。 + +web E2E scaffold 在已�布的 Web 表�与 base patches 之�应用 `extraOverlayPath`。`pwsh-terminal.overlay.yml` 用 `insert` �新增 `tool-pwsh` 行: + +```yaml +- insert: + - id: pwsh-local + name: '@deepseek-ai/dsh-pwsh-local' + - id: tool-pwsh + name: '@deepseek-ai/dsh-tool-pwsh' +``` + +`insert` 仅在组�中�存在 `tool-pwsh` 时�正确。该 id 存在是因为 `86b6979bdc`(refactor(bundle): fold the Windows shell platform layer into the base rows)把两套 shell 栈以互逆的平�门移进了 base bundle —— `packages/bundle/base/cordis.patch.yml` 声明 `tool-pwsh` 且 `disabled: !!js process.platform !== 'win32'`,于是该行在�个平�都存在于组�中。�� `42fc7c5ffb`(refactor(preset): gate tool-pwsh by platform alongside tool-bash)往 web-app patch 里加了一行对使用 preset 的表��用 `tool-pwsh` 的行;patch �能引入 id,因此它�是冲���。overlay 的 `insert` 于是在�一个 loader 组里��一个� id 的行,loader 在�动时拒�这对��。 + +## Decision + +把 overlay 对 `tool-pwsh` 的 `insert` 替��顶层按 id override: + +```yaml +- id: tool-pwsh + name: '@deepseek-ai/dsh-tool-pwsh' + disabled: false +``` + +有效的 `tool-pwsh` 状�是三层栈:base 行把 `disabled` 门在 `process.platform !== 'win32'` 上,web-app overlay 对 preset 表�无�件设 `disabled: true`,本通�的 override 无论平�都把 `disabled: false` 还回去。`id` 定�的顶层 override 替�组��的行;�有 `insert` �会相撞。 + +该通�现在也按 id �用 `pwsh-sandbox`,与既有的 `bash-sandbox` �用对称:base 以 `disabled: !!js process.platform !== 'win32'` 门� `pwsh-sandbox`,因此在 Windows 上它本会与�入的 `pwsh-local` 并存,两者会注册�一个 executor �务。�用它让 `pwsh-local` 在�个平�上都是唯一 executor。 + +overlay 头部注释已更新为完整�述选择,`tool-pwsh` 行内注释现在把 base 行标为该 id 的��。 + +## Alternatives considered + +**�留 `insert`�改 web 组�。** 拒�。已�布的 web 组�应在所有使用 preset 的表�上�� host `tool-pwsh` 行�用;overlay �是那�刻�需�该行的通�,因此按 id �用应放在那里。base 行本身也�能移除:它是所有 bundle 共享的平�门 shell 栈声明。 + +**在 `insert` �里�用 `tool-pwsh`。** ��行。对已存在的 id � `insert` 正是这里�修的��。该行必须按 id 定�,�顶层 override 形�,而� `insert`。 + +**�按 id 改 `tool-pwsh` 而�设 `disabled: false`。** �充分。web-app 无�件设 `disabled: true`,base 行的平�门�在 web-app override 缺失处生效,因此��申 `name` 的 override 会让行���用,通�渲染�出终端�。`disabled: false` 是必需的。 + +**��用 `bash-sandbox`��赖平�门让 `pwsh-sandbox` ��关闭。** 拒�。在 POSIX 上�立,但在 Windows 上会失败:base 行让 `pwsh-sandbox` �用,它会与�入的 `pwsh-local` 在共享 executor �务上相撞。本通��用 `pwsh-sandbox` 让�个平��有唯一 executor。 + +## Verification + +把修�还原(��对 `tool-pwsh` 的 `insert`)��现�样的 `duplicate loader entry id: tool-pwsh` �动失败,�实 override 是有效的。修���一 head 上 `pwsh-terminal.e2e.ts` 2/2 通过 —— 这作用于 POSIX seam,播�的 pwsh 调用��用的 `tool-pwsh` 与�入的 `pwsh-local` 渲染出�。该 seed 通�需��用的 `pwsh`,无此二进制的主机会跳过;本机有 `pwsh`,测试实际跑过。Windows 路径(base `pwsh-sandbox` 与�入的 `pwsh-local` 并存)没有任何 CI lane 覆盖,其 `test:web` �在 Linux 上跑;overlay �用 `pwsh-sandbox` 让该路径在真到 Windows 开�机�行时�组�。 + +## Consequences + +用于执行 PowerShell �动的 web E2E seed 通�现在能组�而�相撞,因此 `check:ci:snapshot` 与 `test:web` ��与被测改动无关地在该 duplicate 上失败。该模�具有通用性:`--patch`/`extraOverlayPath` overlay 在决定用 `insert` 还是按 id override 之�,必须探测目标 bundle 是�已存在该行;对已由 base 或已�布 Web 表�声明的 id � `insert`,是�动期��。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.i18n.yaml new file mode 100644 index 0000000000..140c7b9ae7 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.md +2026-08-12-resolve-store-pwsh-aliases.md: 20fe58e15e75462dc0a9ba76c7a1a94939f8a004 +2026-08-12-resolve-store-pwsh-aliases.zh.md: bbfa4616127a9dbdb6609fe2973283663de55b31 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.md b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.md new file mode 100644 index 0000000000..20fe58e15e --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.md @@ -0,0 +1,23 @@ +# Agent Note: Resolve Microsoft Store pwsh aliases + +Status: implemented + +English | [中文](2026-08-12-resolve-store-pwsh-aliases.zh.md) + +## Problem + +`resolvePwshPath` documented that Microsoft Store installs resolve through PATH, but its existence probe was `existsSync`, which stats a candidate and therefore follows reparse points. The Store's `%LOCALAPPDATA%\Microsoft\WindowsApps\pwsh.exe` is an app execution alias whose target directory ACL refuses stat (EACCES), so `existsSync` missed it and resolution silently fell through to Windows PowerShell 5.1 on hosts whose only PowerShell 7 is a Store install. + +## Decision + +`candidateExists` accepts a candidate that stats as a file or that lstat sees as a link-shaped reparse point, and `resolvePwshPath` uses it. Spawning the alias path works because CreateProcess resolves app execution aliases. A dangling link-shaped candidate is accepted so a broken pwsh fails loudly at spawn instead of silently downgrading to 5.1. + +## Alternatives considered + +**Probe the WindowsApps package directory directly.** The Store package path is versioned and ACL-hidden; hard-coding it duplicates packaging knowledge that PATH plus the alias already owns. + +**Keep the 5.1 fallback for stat failures.** Rejected: it silently runs a different shell than the one installed, which is the defect this note fixes. + +## Consequences + +Store-installed PowerShell 7 now resolves ahead of the 5.1 fallback on Windows; real-file candidates and non-Windows behavior are unchanged. The dangling-symlink unit test pins the stat/lstat split on every platform. diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.zh.md new file mode 100644 index 0000000000..bbfa461612 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-resolve-store-pwsh-aliases.zh.md @@ -0,0 +1,23 @@ +# Agent Note: 解� Microsoft Store 的 pwsh 别� + +Status: implemented + +[English](2026-08-12-resolve-store-pwsh-aliases.md) | 中文 + +## 问题 + +`resolvePwshPath` 声称 Store 安装� PATH 解�,但它的存在性探测用的是 `existsSync`,会对候选� stat�从而跟��解�点。Store 的 `%LOCALAPPDATA%\Microsoft\WindowsApps\pwsh.exe` 是 app execution alias,其目标目录的 ACL 拒� stat(EACCES),于是 `existsSync` 看�到它,解��默�到 Windows PowerShell 5.1——在这类「唯一的 PowerShell 7 是 Store 安装�的机器上就用了错误的 shell。 + +## 决策 + +`candidateExists` 接�「stat 为文件�或「lstat 为链接形��解�点�的候选,`resolvePwshPath` 改用它。spawn 别�路径�以工作,因为 CreateProcess 会解� app execution alias。悬空的链接形�候选�样被接�,让��的 pwsh 在 spawn 时�亮失败,而�是�默�级到 5.1。 + +## 考虑过的替代方案 + +**直接探测 WindowsApps 包目录。** Store 包路径带版本且被 ACL ��;硬编�它�是��了 PATH 加别�已�拥有的打包知识。 + +**对 stat 失败继续走 5.1 回退。** �决:它�默�行了一个并�所装的 shell,这正是本 note 修�的缺陷。 + +## �果 + +Windows 上 Store 安装的 PowerShell 7 现在先于 5.1 回退被解�;普通文件候选和� Windows 平�行为��。悬空 symlink �元测试在全部平�上钉� stat/lstat 的分裂行为。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.i18n.yaml new file mode 100644 index 0000000000..160f947daa --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.md +2026-08-12-unlink-fixture-junctions-before-delete.md: 4514a33d728866b817f4e9c1393f16c07976ed45 +2026-08-12-unlink-fixture-junctions-before-delete.zh.md: 3c212c052ab0303ccb8d31d2b310a365a1d8cc99 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.md b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.md new file mode 100644 index 0000000000..4514a33d72 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.md @@ -0,0 +1,23 @@ +# Agent Note: Unlink fixture junctions before recursive deletion + +Status: implemented + +English | [中文](2026-08-12-unlink-fixture-junctions-before-delete.zh.md) + +## Problem + +The install-lefthook and translation-pairing fixtures junction the repository's real `scripts/`, `node_modules`, and tsx package directories into fixture trees so installer probes resolve through them. Windows recursive deletion can treat a junction (a MOUNT_POINT reparse point) as a directory and follow it into its target; Git's `worktree remove` did exactly that and deleted the repository's tracked `scripts/` and tsx package (the incident's instrumentation pinned the deletion to that step). A fixture cleanup that trusts its deleter therefore deletes the repository's own sources instead of the fixture. + +## Decision + +`scripts/test-fixture-cleanup.ts` owns junction-safe fixture teardown: `unlinkFixtureLinks` walks a tree and unlinks every reparse point before `removeFixtureSafely` removes the now link-free tree (with Windows async-handle retries). Every affected `afterEach` and the pre-`worktree remove` hook call it. The general rule lives in `docs/defensive-patterns.md`: remove link-shaped paths with unlink, reserve recursive `rmSync` for known real directories. + +## Alternatives considered + +**Trust recursive deletion alone.** Rejected: whether a given deleter follows junctions is tool- and version-dependent, and one path through `git worktree remove` already destroyed tracked files; no cleanup may bet the repository on that behavior. + +**Copy instead of junctioning the real directories.** Rejected: the fixtures exist to probe the real installer paths through their real contents, so copies would stop exercising the boundary under test. + +## Consequences + +Fixture teardown can no longer reach repository sources through junctions. The extra walk is one lstat/unlink pass over small fixture trees. The data-destroying defect now has its durable why beside the defensive-patterns rule, and the helper is the shared teardown path for future junction fixtures. diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.zh.md new file mode 100644 index 0000000000..3c212c052a --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-fixture-junctions-before-delete.zh.md @@ -0,0 +1,23 @@ +# Agent Note: 递归删除�先解链 fixture junction + +Status: implemented + +[English](2026-08-12-unlink-fixture-junctions-before-delete.md) | 中文 + +## 问题 + +install-lefthook 与 translation-pairing 的 fixture 把仓库真实的 `scripts/`�`node_modules` 和 tsx 包目录用 junction 链进 fixture 树,让 installer 探测能穿�解�。Windows 的递归删除�能把 junction(MOUNT_POINT �解�点)当作目录并跟�进其目标;Git 的 `worktree remove` 正是这样删掉了仓库被跟踪的 `scripts/` 和 tsx 包(事故的�桩把删除定�到这一步)。因此,信任删除器的 fixture 清�删掉的是仓库自己的��,而�是 fixture。 + +## 决策 + +`scripts/test-fixture-cleanup.ts` 拥有 junction 安全的 fixture 拆除:`unlinkFixtureLinks` 先�历并解链所有�解�点,`removeFixtureSafely` �删除已无链接的树(带 Windows 异步�柄�试)。所有�影�的 `afterEach` 和 `worktree remove` �的钩�都调用它。通用规则记录在 `docs/defensive-patterns.md`:链接形�的路径用 unlink 删除,递归 `rmSync` �留给确知为真实目录的路径。 + +## 考虑过的替代方案 + +**�信任递归删除。** �决:特定删除器是�跟� junction �工具和版本而异,而 `git worktree remove` 这一�路径已�摧�过被跟踪文件;任何清�都�该拿仓库去赌这个行为。 + +**�制而�是 junction 真实目录。** �决:fixture 的�义就是用真实内容探测真实 installer 路径,�制�会失去被测边界。 + +## �果 + +fixture 拆除��能穿过 junction 触�仓库��。�外开销�是对�型 fixture 树的一趟 lstat/unlink。这个摧�数�的缺陷现在在 defensive-patterns 规则�有了�久化的原因,helper 也是未�所有 junction fixture 共享的拆除路径。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.i18n.yaml new file mode 100644 index 0000000000..0e53f1c748 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.md +2026-08-12-unlink-stale-profile-fallback-links.md: 32959eb1b83bcc290d1daa4e4a020a2721be489b +2026-08-12-unlink-stale-profile-fallback-links.zh.md: 1f4da12748c9b57c12bf41a740001d5df770beb6 diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.md b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.md new file mode 100644 index 0000000000..32959eb1b8 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.md @@ -0,0 +1,25 @@ +# Agent Note: Unlink stale profile fallback links instead of rmSync + +Status: implemented + +English | [中文](2026-08-12-unlink-stale-profile-fallback-links.zh.md) + +## Problem + +`healProfilesModuleFallback` re-points `$DSH_HOME/profiles/node_modules` entries when an installation moves, and Windows hosts keep those entries as junctions. `ensureSymlink` deleted a stale entry with `rmSync(link)`, but Node treats a junction as a directory for removal: without `recursive`, `rmSync` throws `ERR_FS_EISDIR`, so every launch from a moved installation or a second worktree crashed before booting. The `replaces a wrong symlink` unit test reproduces that crash on Windows at the exact removal call. + +## Decision + +`ensureSymlink` removes a stale link with `unlinkSync(link)`. `unlink` deletes the reparse point or symlink itself on every platform and never descends into the target, which preserves the function's fail-loud guarantee that a real directory is never deleted. The [profile-plugin-bundles decision](../architecture/2026-08-05-profile-plugin-bundles.md) keeps owning the fallback's two-anchor resolution; this note owns only the removal primitive. + +## Alternatives considered + +**`rmSync(link, { recursive: true })`.** On Node 24 this deletes the junction without following its target, but `recursive` would silently delete a real directory that replaced the link between the `lstat` guard and the removal, weakening the fail-loud contract that motivates the guard. + +**`rmdirSync(link)`.** Removes a junction on Windows as well, but it reads as directory removal for a link, and `unlinkSync` is the repository's existing junction-cleanup idiom. + +**Delete and recreate every entry unconditionally.** Correct but churns unchanged links on every launch and widens the concurrent-heal race window. + +## Consequences + +Windows launches heal moved or second-checkout installations instead of crashing with `ERR_FS_EISDIR`; POSIX behavior is unchanged because `unlinkSync` also unlinks plain symlinks. The existing `replaces a wrong symlink` test now passes on Windows where it previously reproduced the crash. Two concurrent healers deleting the same stale link still surface the second deletion as `ENOENT`, unchanged from the previous `rmSync` implementation. diff --git a/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.zh.md b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.zh.md new file mode 100644 index 0000000000..1f4da12748 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-12-unlink-stale-profile-fallback-links.zh.md @@ -0,0 +1,25 @@ +# Agent Note: 用 unlink 删除过期的 profile 回退链接而� rmSync + +Status: implemented + +[English](2026-08-12-unlink-stale-profile-fallback-links.md) | 中文 + +## 问题 + +`healProfilesModuleFallback` 在安装�置�移时会把 `$DSH_HOME/profiles/node_modules` 中的�目�新指�新目标,而 Windows 主机上这些�目是 junction。`ensureSymlink` 原先用 `rmSync(link)` 删除过期�目,但 Node 在删除时把 junction 当作目录处�:�带 `recursive` 的 `rmSync` 会抛 `ERR_FS_EISDIR`,于是从�移�的安装或第二个 worktree �动时,�次都会在应用引导�崩溃。`replaces a wrong symlink` �元测试在 Windows 上正好在该删除调用处�现了这一崩溃。 + +## 决策 + +`ensureSymlink` 改用 `unlinkSync(link)` 删除过期链接。`unlink` 在所有平�上都�删除�解�点或符�链接本身���进入目标目录,从而��该函数“真实目录永远�会被删除�的大声失败��。[profile-plugin-bundles 决策](../architecture/2026-08-05-profile-plugin-bundles.md)继续拥有回退目录的�锚点解�;本 note �拥有“用哪个删除原语�这一决定。 + +## 考虑过的替代方案 + +**`rmSync(link, { recursive: true })`。** Node 24 上它�删 junction��跟�目标,但 `recursive` 会在 `lstat` 守�与删除之间链接被替��真实目录时�默删除该目录,削弱守�存在所��的大声失败契约。 + +**`rmdirSync(link)`。** Windows 上�样能删 junction,但它读起��“删目录�,而 `unlinkSync` �是仓库现有的 junction 清�惯例。 + +**无�件删除并�建所有�目。** 正确,但�次�动都翻动未�化的链接,并扩大并�修�的竞�窗�。 + +## �果 + +Windows �动现在�以修��移�的安装或第二个 checkout,而�是以 `ERR_FS_EISDIR` 崩溃;POSIX 行为��,因为 `unlinkSync` �样能 unlink 普通符�链接。现有的 `replaces a wrong symlink` 测试在 Windows 上从�现崩溃�为通过。两个并� healer 删除�一过期链接时,第二次删除�会以 `ENOENT` 浮现,与原先的 `rmSync` 实现一致。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.i18n.yaml new file mode 100644 index 0000000000..2cd2577fc5 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md +2026-08-13-bounded-cold-blank-verification.md: bf8d167d742001ce65b3e96713a9603adb19603e +2026-08-13-bounded-cold-blank-verification.zh.md: 7cfef77a02308a8e75281877f8a774b41bb9559d diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md new file mode 100644 index 0000000000..bf8d167d74 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md @@ -0,0 +1,37 @@ +# Agent Note: Bound cold blank-session verification + +Status: implemented + +English | [中文](2026-08-13-bounded-cold-blank-verification.zh.md) + +## Problem + +The Web session tree hides blank Sessions and reuses the selected blank entry as New Session. Attached Sessions can derive blankness from their in-memory event log, but `session.list` normally avoids loading every cold log. Treating every materialized cold Session as non-blank exposes empty Sessions left by older versions. Treating a projection-cache `blank: true` as current can instead hide a real conversation after the log advances and the fail-soft cache remains stale. + +The same cold list used the JSONL artifact mtime for `updatedAt`. Opening a Session appends `session/end-seed`, so a pickup with no human prompt refreshed mtime and promoted that Session above recently used conversations. + +## Decision + +`dsh-host-apiproxy` registers `sessionListMetadata`, a projection containing `blank` and `lastPromptAt`. The attached summary folds the same functions directly over the live log. `blank` changes only from true to false on `turn/start`; `lastPromptAt` changes only on a `user/message` whose source kind is `user`. + +A cold summary trusts cached `blank: false`, because a checkpoint prefix containing `turn/start` remains non-blank. Cached `blank: true` and a cache miss do not prove the current log is blank. When persistence exposes a physical artifact through `locate()` and its observed size is at most the `coldBlankProbeMaxBytes` eligibility threshold (default 1 KiB per Session), the gateway calls `readFrom(id, 0)` and folds exact list metadata from the stored prefix. Files above the threshold, backends without a location, vanished artifacts, and failed reads all produce `blank: false`, keeping the Session visible. + +`updatedAt` is the later of `createdAt` and `lastPromptAt`. An eligible artifact read supplies exact `lastPromptAt` at no additional I/O cost; other cache misses or stale checkpoints order the Session too old rather than promoting it from an unrelated file write. After each asynchronous cold read, the gateway checks the live store again and replaces the cold result with an attached summary when another request resumed that Session meanwhile. + +## Alternatives considered + +**Trust cached `blank: true`.** Rejected because the projection cache deliberately permits a persisted log to advance beyond its checkpoint. A crash or fail-soft write failure after the first `turn/start` would hide a real conversation and could make the client reuse it as New Session. + +**Read every cold log.** Rejected because list latency and I/O would scale with total stored conversation bytes. The physical-size eligibility check targets small historical artifacts that can be checked cheaply and degrades larger unknowns toward visibility. It intentionally does not add a persistence operation solely to make the threshold atomic with the read: concurrent growth may increase one probe's read cost, but the additional events can only preserve visibility or change a blank result to non-blank. + +**Store blankness and recency in an authoritative persistence index.** Deferred because JSONL has an immutable first line and would require a second durable artifact with ordered updates, while SQLite would require a schema field. The broader exact-index design remains in the [last-activity proposal](../../proposed/architecture/2026-07-29-durable-last-activity-index.md). + +**Continue ordering JSONL by mtime.** Rejected because mtime records every artifact write, including pickup boundaries, rather than the latest human prompt. Its error direction promotes untouched Sessions to the front. + +## Consequences + +Existing small blank JSONL artifacts are hidden without depending on projection-cache availability, and a stale cache cannot hide a stored `turn/start`. A cold list may read each artifact whose observed physical size is within the configured threshold when its cache does not already prove non-blank. The default threshold compares compressed bytes for the shipped Zstandard JSONL backend. + +Blank artifacts above the threshold and blank Sessions on location-less backends remain visible. Missing or delayed recency cache entries for artifacts that are not read fall back to `createdAt`. These are conservative degradations: the UI may show an extra empty row or order a Session too low, but it does not hide a conversation or promote one because it was merely opened. + +The gateway-owned projection is an effect of the gateway fiber; unloading the gateway removes the key. Unit coverage pins exact-threshold eligibility, stale-true rejection, monotonic false reuse, exact small-log recency, live-attachment races, fallback direction, human-prompt recency, and fiber disposal. A keyless Web snapshot boots the shipped compressed JSONL composition, seeds a small cold blank artifact without a cache row, and verifies that the sidebar omits it. diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.zh.md b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.zh.md new file mode 100644 index 0000000000..7cfef77a02 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.zh.md @@ -0,0 +1,37 @@ +# Agent Note: 有界验�冷空白会� + +Status: implemented + +[English](2026-08-13-bounded-cold-blank-verification.md) | 中文 + +## Problem + +Web 会�树会��空白 Session,并把当�选中的空白项�用为 New Session。已附加 Session �以从内存事件日志派生空白状�,但 `session.list` 通常�会加载�一份冷日志。把所有已物化的冷 Session 都视为�空,会暴露旧版本留下的空 Session;�过�,把 projection cache 中的 `blank: true` 当�当�事实,则�能在日志已��进而 fail-soft cache �然陈旧时��真实对�。 + +�一份冷列表还曾用 JSONL 工件的 mtime 作为 `updatedAt`。打开 Session 会追加 `session/end-seed`,因此�使没有真人 prompt,�纯拾起也会刷新 mtime,并把该 Session ��到最近使用的对�之�。 + +## Decision + +`dsh-host-apiproxy` 注册 `sessionListMetadata` 投影,其中包� `blank` 与 `lastPromptAt`。已附加摘�直接用�一组函数折�实时日志。`blank` �在 `turn/start` 时从 true �调�为 false;`lastPromptAt` �在�� kind 为 `user` 的 `user/message` 上更新。 + +冷摘�信任缓存的 `blank: false`,因为已包� `turn/start` 的 checkpoint �缀会始终���空。缓存的 `blank: true` 和 cache miss 都无法�明当�日志为空。当 persistence 通过 `locate()` 暴露物�工件,且其观测大��超过 `coldBlankProbeMaxBytes` 资格阈值(默认�个 Session 1 KiB)时,网关调用 `readFrom(id, 0)`,从已存�缀折�精确列表元数�。超过阈值的文件���供�置的�端�已消失的工件和读�失败都产生 `blank: false`,让 Session ����。 + +`updatedAt` � `createdAt` 与 `lastPromptAt` 中较晚者。符�资格的工件读�无需�外 I/O ���供精确 `lastPromptAt`;其他 cache miss 或陈旧 checkpoint �会让 Session 排得�旧,而�会因无关的文件写入被��。�次异步冷读��,网关都会�次检查实时 store;若�一请求期间已��该 Session,则用已附加摘�替�冷结果。 + +## Alternatives considered + +**信任缓存的 `blank: true`。** 拒�,因为 projection cache 有��许�久日志�进到 checkpoint 之�。首个 `turn/start` 之�若�生崩溃或 fail-soft 写入失败,真实对�就会被��,客户端还�能把它�用为 New Session。 + +**读��一份冷日志。** 拒�,因为列表延迟与 I/O 会�所有已存对�的总字节数增长。物�大�资格检查�针对能够低�本核验的�型历�工件,更大的未知项则������级。该检查有��为“让阈值与读�原�化��独新增 persistence �作:并�增长�能增加一次探测的读��本,但新增事件�会����,或把空白结果改为�空。 + +**把空白状�与最近时间存入�� persistence index。** 暂缓,因为 JSONL 的首行���,需�增加带有顺�写入�求的第二份�久工件;SQLite 则需� schema 字段。更广泛的精确索引设计�由[最�活动�案](../../proposed/architecture/2026-07-29-durable-last-activity-index.md)负责。 + +**继续按 mtime 排� JSONL。** 拒�,因为 mtime 记录包括拾起边界在内的�一次工件写入,而�最近真人 prompt;其错误方�会把未��作的 Session ��到列表开头。 + +## Consequences + +既有的�型空白 JSONL 工件无需�赖 projection cache 是�存在��被��,陈旧 cache 也无法��已存的 `turn/start`。对于 cache 尚�能�明�空,且观测物�大�在�置阈值内的�个 Session,冷列表�能读�其工件。对默认交付的 Zstandard JSONL �端,该阈值比较压缩�的字节数。 + +超过阈值的空白工件,以��自��供�置的�端的空白 Session 会����。对于未被读�的工件,缺失或延迟的最近时间 cache 会回退到 `createdAt`。这些都是�守�级:UI �能多显示一�空记录,或把 Session 排得�低,但�会��真实对�,也�会因为�纯打开而把会���到��。 + +网关自有投影是网关 fiber 的 effect;�载网关会移除该 key。�元覆盖固定了临界大�资格�拒�陈旧 true��用�调 false��日志精确最近时间�实时附加竞��回退方��真人 prompt 最近时间和 fiber 销�。无密钥 Web snapshot 会�动�行版的压缩 JSONL 组�,在没有 cache row 的情况下播�一份�型冷空白工件,并验�侧��展示它。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.i18n.yaml new file mode 100644 index 0000000000..f5765160ac --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.md +2026-08-13-oauth-only-providers-withheld.md: 8c85c2900fd0af7c97a3ac8f04d3c6a2f469f8b0 +2026-08-13-oauth-only-providers-withheld.zh.md: 8f05d096a5d474407585bcbd84bd47da8a1abb2e diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.md b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.md new file mode 100644 index 0000000000..8c85c2900f --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.md @@ -0,0 +1,43 @@ +# Agent Note: The configurable-provider directory withholds OAuth-only providers + +Status: implemented + +English | [中文](2026-08-13-oauth-only-providers-withheld.zh.md) + +## Problem + +The Models page offered `openai-codex` like any other pi-ai route, with the placeholder every pi-ai provider carries: enter a key, or leave it blank to authenticate from the environment. Configuring it that way and sending a message failed the turn with `Provider is not configured: openai-codex`, reported as the adapter's catch-all `PI_AI_ERROR`. + +The posture the placeholder invited could not work on that route. pi-ai's `resolveProviderAuth` reaches an OAuth provider through one path — a credential already in the collection's `CredentialStore` — and has no ambient fallback for it, while `openai-codex` is the one installed provider declaring `auth.oauth` with no `auth.apiKey` beside it. `PiAiAdapter.current()` constructs its collection with `createModels()` and no options, so the store is pi-ai's default `InMemoryCredentialStore`: empty at every boot, and rebuilt from scratch each time a configuration change produces a new snapshot. No code here runs `Models.login()`, and pi-ai's library half does not read Codex's own `~/.codex/auth.json` either — its OAuth module is a PKCE login flow whose credential the *host* application persists, which is what the pi CLI supplies and this adapter does not. + +So the page advertised, with the keyless posture its own placeholder describes, a provider that has no keyless posture — and the failure named the configuration key rather than the missing capability. The one thing that does authenticate the route is a ChatGPT OAuth token pasted into the key field, which is not what the offer describes and expires with nothing here to refresh it. + +## Decision + +The directory offers only what this adapter can authenticate. `catalogProviderTakesApiKey(provider)` answers whether pi-ai's installed provider for a route declares an api-key method — the one method the harness can feed, since it resolves a key through its own credential seam and hands it over as the request's `apiKey` override — and `directoryEntries()` skips the catalog routes that fail it. + +OAuth support is not attempted. It needs a persistent credential store, a login flow, and a surface to run it from; none of those is a release-blocking fix, and shipping the offer without them is what produced the report. + +Two boundaries keep the withholding narrow: + +- **Catalog membership is unchanged.** `catalogProviderIds()` still answers what pi-ai ships, so the `declared` flag on a directory entry keeps meaning "no installed provider answers for this route" rather than "this route is not offered". +- **The profile half of the union is unconditional.** A route a settings document already names keeps its entry, so a stored `openai-codex` profile stays visible, editable, and deletable instead of being stranded in the document with nothing on the page to remove it. + +Resolution is untouched. A profile naming `apiKeyEnv` on an OAuth-only route still builds a working provider — `routeAuth` adds the harness api-key method beside the catalog's OAuth, and pi-ai's Codex API derives the account id from the token itself — so a deployment that writes one into `settings.yaml` or `cordis.yml` keeps that path. Enforcing the withholding in `resolveProfiles` instead would have refused such a profile at registration, and because `validate` runs at boot as well as at write time, a document already naming a keyless OAuth route would fail the whole namespace's registration rather than one provider. + +## Alternatives considered + +- **Rejecting a keyless OAuth-only route in `resolveProfiles`.** This is where the repo normally enforces a decision, and the directory filter is a surface that a `cordis.yml` entry bypasses. It was refused for the boot behavior above: an existing stored profile would take down every other route in the namespace with it, which for a release trades a one-provider defect for a total one. The gap is that the offer, not the capability, is what got fixed — a deployment can still hand-write the route it can no longer add from the page. +- **Keeping the offer and correcting only the placeholder text.** The field would then have to say the provider needs a login this build cannot run, which is a card whose only honest content is that it does not work. +- **Mapping `Provider is not configured` to a named `LlmError`.** Worth doing, and reachable for reasons this change does not remove — any api-key route left blank whose provider finds nothing in the process environment produces the same message. Deferred as a separate change: it improves a diagnostic rather than removing a broken offer. +- **Reading `~/.codex/auth.json` into a pi-ai `CredentialStore`.** It makes Codex work without a login flow, and pi-ai owns the refresh. It also binds the harness to another tool's private file format for one provider, which is a decision for the OAuth work rather than a release fix. + +## Consequences + +`openai-codex` disappears from the provider picker and from the directory the Models page joins; every other installed provider is unaffected, including the six that offer OAuth *beside* an api-key method (`anthropic`, `github-copilot`, `kimi-coding`, `openrouter`, `radius`, `xai`), which keep their entries and their key path. A future provider that ships OAuth alone is withheld automatically rather than by name. + +Two adjacent gaps remain and are recorded in the package README: a route naming no credential still resolves through the catalog provider's own discovery, which reads process environment variables only — not `~/.aws/credentials`, and not the harness credential seam — and the resulting failure is still the catch-all `PI_AI_ERROR`. + +## Testing + +Package tests pin both halves of the union: the withheld route is absent from `listConfigurableProviders()` while `anthropic` and `openai` stay, and a stored `openai-codex` profile still produces a full entry with `declared: false`. The existing resolution tests are unchanged and still pass, which is what shows the withholding did not narrow what a hand-written profile can serve. The `models-settings` and `onboarding-usable-provider` web e2e goldens lost exactly the `openai-codex` option line, recorded against the real assembled application. diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.zh.md b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.zh.md new file mode 100644 index 0000000000..8f05d096a5 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-oauth-only-providers-withheld.zh.md @@ -0,0 +1,43 @@ +# Agent Note:��置�供方目录���供仅以 OAuth 认�的�供方 + +Status: implemented + +[English](2026-08-13-oauth-only-providers-withheld.md) | 中文 + +## 问题 + +模型设置页把 `openai-codex` 当作普通 pi-ai 路由�供出�,�的还是�个 pi-ai �供方共用的那���文案:填入 API 密钥,或留空使用环境认�。照此�置���消�,本轮以 `Provider is not configured: openai-codex` 失败,并被适�器归入兜底的 `PI_AI_ERROR`。 + +��文案所邀请的那��置姿�在这�路由上��能工作。pi-ai 的 `resolveProviderAuth` 抵达 OAuth �供方�有一�路径——集�的 `CredentialStore` 里已�存�的凭�——对它没有任何 ambient 回退;而 `openai-codex` 正是已安装 catalog 中唯一�声明 `auth.oauth`�没有 `auth.apiKey` 的�供方。`PiAiAdapter.current()` 以�带�数的 `createModels()` 构造集�,于是用的是 pi-ai 默认的 `InMemoryCredentialStore`:�次�动都是空的,�次�置�更产生新快照时��建一份。本仓库没有任何�置调用 `Models.login()`;pi-ai 库这一�也�会去读 Codex 自己的 `~/.codex/auth.json`——它的 OAuth 模�是一套 PKCE 登录�程,凭�由*宿主*应用�久化,这正是 pi CLI �供�而本适�器没有�供的东西。 + +于是页�用自己��文案所�述的「留空�姿�,�供了一个根本没有「留空�姿�的�供方——而失败信�指�的是�置键,�是缺失的能力。唯一能让这�路由完�认�的,是把一个 ChatGPT OAuth token 粘进密钥框,那既�是这个�供所�述的用法,也会过期且这里没有任何环节会去刷新它。 + +## 决策 + +目录��供本适�器认得的东西。`catalogProviderTakesApiKey(provider)` 回答 pi-ai 为�路由安装的�供方是�声明了 api-key 方法——这是 harness 唯一能供给的方法,因为它通过自己的凭� seam 解�密钥,�作为请求的 `apiKey` 覆盖交给 pi-ai——`directoryEntries()` 跳过�满足它的 catalog 路由。 + +��试实现 OAuth。它需��久化凭�存储�登录�程,以��行登录的界�;这三样都�是�布阻塞项的修�,而在它们缺席时�把�供方摆出�,正是这次报告的�因。 + +两�边界把「��供�的范围收窄: + +- **catalog �员身份��。** `catalogProviderIds()` �回答 pi-ai 装了什么,因此目录�目上的 `declared` 标记�然表示「没有已安装�供方对应这�路由�,而�是「这�路由�被�供�。 +- **��的 profile 那一�无�件�留。** settings 文档已�写过的路由�留�目,因此已存储的 `openai-codex` profile �然����编辑��删除,而�会滞留在文档里�页�上�没有任何入�能移除它。 + +resolution 未被触动。在仅 OAuth 的路由上指定 `apiKeyEnv` 的 profile �会构造出�用的�供方——`routeAuth` 会在 catalog 的 OAuth �边补上 harness 的 api-key 方法,而 pi-ai 的 Codex API 从 token 本身推导 account id——因此把它写进 `settings.yaml` 或 `cordis.yml` 的部署�留这�路径。改为在 `resolveProfiles` 里强制拒�会在注册时就�掉这类 profile;�因为 `validate` 在�动时与写入时�样�行,一份已�写有无密钥 OAuth 路由的文档会让整个 namespace 注册失败,而��是一个�供方失败。 + +## 备选方案 + +- **在 `resolveProfiles` 里拒�无密钥的仅 OAuth 路由。** 这�是本仓库通常强制决策的�置,而目录过滤是一层 `cordis.yml` entry �以绕过的表�。因上述�动行为被�决:已存储的 profile 会连带拖垮该 namespace 中其他所有路由,对一次�布而言,这是拿一个�供方的缺陷��全体的缺陷。留下的缺�是:被修的是「�供�而�是「能力�——部署��手写一�页�上已�无法添加的路由。 +- **�留�供,�修正��文案。** 那么该输入框�能写「此�供方需�本构建无法�行的登录�,等于一张唯一诚实内容就是「它�能用�的�片。 +- **把 `Provider is not configured` 映射�具� `LlmError`。** 值得�,而且触�原因本次改动并未消除——任何留空密钥�其�供方�在进程环境里找�到东西的 api-key 路由,都会产生�一��。作为独立改动暂缓:它改进的是诊断,而�是移除一个�掉的�供。 +- **把 `~/.codex/auth.json` 读进 pi-ai 的 `CredentialStore`。** 这能让 Codex 在没有登录�程的情况下�用,刷新也由 pi-ai 负责。但它为一个�供方把 harness 绑定到�一个工具的�有文件格�上,这属于 OAuth 那项工作的决策,而�是�布期的修�。 + +## 影� + +`openai-codex` 从�供方选择器�以�模型设置页所 join 的目录中消失;其余已安装�供方一概��影�,包括在 api-key 方法*之外*��供 OAuth 的那六个(`anthropic`�`github-copilot`�`kimi-coding`�`openrouter`�`radius`�`xai`),它们�留�目也�留密钥路径。将�若出现�带 OAuth 的�供方,会被自动排除,而�是�列�。 + +两处相邻缺��在,并记录在包 README 中:�指定凭�的路由�走 catalog �供方自带的�现,而它�读进程环境��——�读 `~/.aws/credentials`,也�读 harness 凭� seam——且由此产生的失败�是兜底的 `PI_AI_ERROR`。 + +## 测试 + +包测试钉���的两�:�予�供的路由�出现在 `listConfigurableProviders()` 中,而 `anthropic` 与 `openai` �在;已存储的 `openai-codex` profile �产出完整�目且 `declared: false`。既有的 resolution 测试未改动且�然通过,这正是「��供�没有收窄手写 profile ��务范围的��。`models-settings` 与 `onboarding-usable-provider` 两� web e2e golden �好�少了 `openai-codex` 这一行选项,录自真实装�的应用。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.i18n.yaml new file mode 100644 index 0000000000..f7fde5254a --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.md +2026-08-13-safari-textarea-soft-wrap-reflow.md: fb264a8e6fbe24369584f2427bbb0c462b450ecf +2026-08-13-safari-textarea-soft-wrap-reflow.zh.md: 7f55a5260e825059e1f9a08db03f13e19484d14e diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.md b/.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.md new file mode 100644 index 0000000000..fb264a8e6f --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.md @@ -0,0 +1,47 @@ +# Agent Note: Safari textarea soft-wrap shrink recovery + +Status: implemented + +English | [中文](2026-08-13-safari-textarea-soft-wrap-reflow.zh.md) + +## Problem + +The composer keeps the caret and selection in a transparent native textarea while the backdrop paints visible glyphs and the hidden mirror determines the full draft height. The [single-scrollport decision](2026-07-31-composer-text-layers-share-one-scrollport.md) therefore depends on the textarea owning no scrollable overflow: after every draft commit, its `scrollHeight` and `clientHeight` are equal and its `scrollTop` is zero. + +Safari 26.5.2 can retain the textarea's former native line layout when Backspace moves a draft across a soft-wrap threshold at the same time that React updates the mirror. In the reproduced two-line-to-one-line transition, the mirror, backdrop, grow stack, and textarea box all become 28px high, but the textarea still reports `scrollHeight=52` and `scrollTop=20`. The caret remains in the stale native line while the backdrop correctly paints one line. + +The `color` declaration is not a layout input. Changing its inline style changes the computed color but leaves the stale `52/28/20` state intact. Editing the stylesheet rule happens to trigger broader rule invalidation and clears the state to `28/28/0`, which explains why Web Inspector makes the declaration appear causal. + +## Decision + +`InputBar` detects Safari once from the Apple vendor and the `Version/... Safari/...` user-agent form, while rejecting known alternate iOS browser tokens such as `CriOS`, `FxiOS`, `EdgiOS`, and `OPiOS`. A browser shell indistinguishable through these identity fields still has to violate the textarea overflow invariant before the recovery mutates layout. + +The native textarea change handler records whether an edit shortens the controlled draft. After that draft commits, a layout effect returns without reading geometry unless both the cached Safari identity and the native-shrink signal are present. It then checks the single-scrollport invariant: equal `scrollHeight` and `clientHeight` are settled and trigger no forced layout. A mismatch first changes the textarea's real height by one pixel, forces layout, restores the owned height, and forces layout again. This rebuilds Safari's native text-control layout without changing the value, selection, IME state, or undo transaction. + +The temporary native overflow can leave the draft scrollport's auto height at the former line count even after the textarea is correct. The recovery therefore repeats the one-pixel invalidation on `[data-input-scroll]` after repairing the textarea. Both elements return to their owned styles before paint; the settled one-line state is `scrollHeight=clientHeight=28`, `scrollTop=0`, and a 28px scrollport. + +## Verification + +Component tests synthesize Safari's stale metrics, assert the textarea-then-scrollport invalidation order, preserve selection, and prove that a growing native draft reads no geometry. Browser-identity tests cover desktop and mobile Safari, desktop Chromium, Chrome, Edge, and Opera on iOS, and an Apple web view. + +The assembled package is also exercised in Safari 26.5.2 through the native 51-character-to-50-character Backspace path. Playwright WebKit 26.5 settles correctly without the workaround in both the assembled app and a reduced page, so the repository's Chromium browser lane cannot reproduce this Safari application defect; the focused component test pins the engine state until an automatable Safari lane exists. + +## Alternatives considered + +**Change `color` or use `-webkit-text-fill-color`.** Rejected because inline color changes and transparent text fill leave the stale native geometry unchanged. Stylesheet-rule editing works only because its invalidation scope is broader than the declaration's paint semantics. + +**Set `scrollTop=0`.** Rejected because it moves the stale native content without rebuilding its two-line `scrollHeight`; the caret can become clipped instead of aligned. + +**Rewrite the textarea value.** Clearing and restoring the value rebuilds Safari's text control, but it mutates the editing state that owns IME composition and selection. The height invalidation leaves the value untouched. + +**Use `field-sizing: content`.** Rejected because Safari reproduces the stale two-line intrinsic height after the same deletion, and the composer still needs the mirror as the caret ruler and backdrop metric peer. + +**Invalidate only the textarea or only the scrollport.** Rejected because the textarea-only recovery clears `52/28/20` but can leave the scrollport at 52px, while the scrollport-only recovery leaves the textarea's native overflow untouched. The ordered pair is the smallest complete recovery. + +**Check geometry after every Safari draft commit.** Rejected because reading `scrollHeight` or `clientHeight` after React changes the mirror can synchronously lay out even a healthy growing draft. A native shortening signal limits the invariant read to edits that can produce the observed shrink defect. + +**Run the recovery in every browser.** Rejected because Chromium, Playwright WebKit, and Firefox maintain the invariant without forced layouts. The Safari identity and observed mismatch jointly bound the synchronous work. + +## Consequences + +Non-Safari browsers, programmatic draft updates, and native edits that do not shorten the draft perform no geometry read. A native Safari shortening reads the overflow invariant and pays the four forced layouts only when the textarea violates it. The exceptional path accepts rare local work before paint to preserve caret alignment, native editing semantics, and the single scrolling box. An equivalent stale state caused only by resize or sidebar width changes has not been observed and is outside this recovery trigger. The browser test gap remains explicit: real Safari evidence owns the engine defect, while deterministic component coverage owns the recovery and its browser gate. diff --git a/.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.zh.md b/.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.zh.md new file mode 100644 index 0000000000..7f55a5260e --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.zh.md @@ -0,0 +1,47 @@ +# Agent Note: Safari textarea 软�行收缩�� + +Status: implemented + +[English](2026-08-13-safari-textarea-soft-wrap-reflow.md) | 中文 + +## 问题 + +composer 把光标与选区留在�明的原生 textarea 中,由 backdrop 绘制��字形,并由��的镜�层决定完整�稿高度。因此,[�滚动容器决策](2026-07-31-composer-text-layers-share-one-scrollport.md)�赖 textarea ��有�滚动溢出:�次�稿�交�,它的 `scrollHeight` 与 `clientHeight` 相等,`scrollTop` 为零。 + +当 Backspace 让�稿跨过软�行阈值,�时 React 更新镜�层时,Safari 26.5.2 �能�留 textarea 原先的原生行布局。在�现出的两行�一行转�中,镜�层�backdrop�自增高栈和 textarea 盒都�为 28px 高,但 textarea �报告 `scrollHeight=52` 与 `scrollTop=20`。光标留在陈旧的原生行中,而 backdrop 已正确绘制为一行。 + +`color` 声明�是布局输入。修改 inline style 会改�计算�的颜色,�让陈旧的 `52/28/20` 状�����。编辑样�表规则会碰巧触�范围更广的规则失效,并把状�清为 `28/28/0`,这正是 Web Inspector 让该声明显得��因的原因。 + +## 决策 + +`InputBar` 通过 Apple vendor 与 `Version/... Safari/...` 形�的 user agent 一次性识别 Safari,�时排除 `CriOS`�`FxiOS`�`EdgiOS`�`OPiOS` 等已知的 iOS 其他�览器 token。仅凭这些 identity 字段无法区分的�览器壳�必须先�� textarea 溢出���,��逻辑�会修改布局。 + +原生 textarea change handler 会记录本次编辑是�缩短�控�稿。�稿�交�,除��时存在已缓存的 Safari identity 与原生缩短信�,�则 layout effect 会在读�几何�直接返回。��它�检查�滚动容器���:`scrollHeight` 与 `clientHeight` 相等�为稳定�,�会触�强制布局。出现差异时,逻辑先把 textarea 的实际高度改�一个�素,强制布局,���其自有高度并�次强制布局。这样无需改�值�选区�输入法组�状�或撤销事务,���建 Safari 的原生文本控件布局。 + +�使 textarea 已正确��,临时的原生溢出��能让�稿滚动容器的 auto 高度�在原行数。因此,��逻辑会在修� textarea �,对 `[data-input-scroll]` ��一次��素失效。两个元素都会在绘制����自拥有的样�;稳定的一行状�为 `scrollHeight=clientHeight=28`�`scrollTop=0`,滚动容器高度为 28px。 + +## 验� + +组件测试会�� Safari 的陈旧度�,断言先 textarea �滚动容器的失效顺�,�留选区,并�明原生�稿增长�会读�几何。�览器 identity 测试覆盖桌�与移动 Safari�桌� Chromium�iOS Chrome�Edge�Opera 和 Apple web view。 + +组装�的包还会在 Safari 26.5.2 中通过原生的 51 字符到 50 字符 Backspace 路径验�。Playwright WebKit 26.5 在组装应用与最�化页�中都无需本绕法��正确稳定,因此仓库的 Chromium �览器泳�无法�现这个 Safari 应用缺陷;在�自动化的 Safari 泳�出现之�,由�焦组件测试固定该引擎状�。 + +## 备选方案 + +**修改 `color` 或使用 `-webkit-text-fill-color`。** 被�决,因为 inline color 修改与�明 text fill 都�会改�陈旧的原生几何。编辑样�表规则之所以有效,�是因为其失效范围比该声明的绘制语义更广。 + +**设置 `scrollTop=0`。** 被�决,因为这�会移动陈旧的原生内容,�会�建其两行 `scrollHeight`;光标�能从错��为被�剪。 + +**�写 textarea 的值。** 清空���值能够�建 Safari 文本控件,但会改动拥有输入法组�与选区的编辑状�。高度失效�会触碰值。 + +**使用 `field-sizing: content`。** 被�决,因为相�删除� Safari 的两行固有高度�会陈旧,并且 composer �需�镜�层充当光标标尺与 backdrop 的度�对端。 + +**�让 textarea 或滚动容器失效。** 被�决,因为��� textarea 虽能清除 `52/28/20`,��能把滚动容器留在 52px;���滚动容器则�会改� textarea 的原生溢出。这个有�二元�作是最�的完整��。 + +**�次 Safari �稿�交�都检查几何。** 被�决,因为 React 改�镜�层�读� `scrollHeight` 或 `clientHeight`,�使�稿�康增长也�能�步执行布局。原生缩短信�把���读��制在�能产生已观测收缩缺陷的编辑中。 + +**在所有�览器中�行��逻辑。** 被�决,因为 Chromium�Playwright WebKit 与 Firefox 无需强制布局��维�该���。Safari identity 与已观测到的差异共��定�步工作范围。 + +## 影� + +� Safari �览器�程�化�稿更新,以��会缩短�稿的原生编辑都�会读�几何。Safari 的原生缩短会读�溢出���,并且仅在 textarea �����时承担四次强制布局。例外路径以绘制�的罕�局部工作��光标对��原生编辑语义与�一滚动盒。尚未观测到仅由 resize 或侧�宽度�化引�的�类陈旧状�,本��触�器也�覆盖它。�览器测试缺���显�:真实 Safari ��负责引擎缺陷,确定性的组件覆盖负责��逻辑与�览器门控。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.i18n.yaml new file mode 100644 index 0000000000..af691f1175 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.md +2026-08-15-max-token-replay-state-alignment.md: 256a64403a08377cf35ba645175698678eaa7f8b +2026-08-15-max-token-replay-state-alignment.zh.md: a24f3e194dca100d2ea0faf659b1868c605c26c1 diff --git a/.agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.md b/.agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.md new file mode 100644 index 0000000000..256a64403a --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.md @@ -0,0 +1,33 @@ +# Agent Note: Replay state aligns with assembled content by construction + +Status: implemented + +English | [中文](2026-08-15-max-token-replay-state-alignment.zh.md) + +## Problem + +pi-ai recorded one opaque replay blob per response, projected from the provider's native message, while `BlockAssembler.blocks()` separately dropped tool calls from a `max-tokens` response because a truncated call is unsafe to execute. The durable assistant message therefore stored transformed content next to metadata describing the untransformed native block list. The next request failed during history reconstruction with `INVALID_REPLAY_STATE: block count does not match assistant content`, and because the mismatch was already on disk, every later request on that session failed the same way — the session was permanently stuck. The root cause is structural: two representations of one response were snapshotted at different pipeline points, with their index alignment enforced only by a read-time hard error. + +## Decision + +Two changes, one per side of the durable boundary. + +**Write side — one keep/drop decision.** The finish chunk's `replayState` becomes a typed `ReplayEnvelope`: an opaque `response` half plus optional opaque per-block entries aligned with the emitted block sequence. `BlockAssembler` computes its keep/drop decision once and applies it to blocks and envelope entries together, so any transformation assembly performs — today's max-token tool-call drop or a future one — prunes the matching metadata by construction. Retained blocks keep their entries, so a truncated response keeps signatures for the reasoning and text it kept. An envelope whose entries do not match the emitted block count is discarded whole (a misemitting adapter must not publish misattributed metadata). pi-ai splits its former flat state into a version-2 response half and per-block signature entries. + +**Read side — durable content is authoritative.** `toPiAssistant` treats replay state as fidelity metadata, not as a load-bearing input: any state the reading build cannot use — another adapter's kind, another version (including the flat version-1 form already on disk), malformed metadata, or a block shape that no longer matches the content — degrades that one message to the existing foreign provider-neutral conversion and reports the `INVALID_REPLAY_STATE` diagnostic through the plugin's `onReplayDegrade` hook (a logger warning). The request proceeds. This is what lets sessions poisoned before this change continue instead of erroring forever, and it bounds every future divergence source to a fidelity loss on one message. + +## Verification + +Assembler unit tests prove pruning, misalignment discard, and pass-through for untransformed and per-block-free envelopes. pi-ai unit tests prove the version-2 envelope round-trip and that every formerly-throwing invalid-state case now degrades to foreign conversion with the diagnostic. An agent-loop regression drives a truncated text-plus-tool-call response through persistence and shows the follow-up request carrying the pruned envelope. Keyless real-composition tests boot `dsh-llm-pi-ai` through the Loader and prove a native continuation without `tool_calls` after truncation, and a successful continuation over a legacy flat-state message whose block count no longer matches. The authored keyless snapshot scenario `max-tokens-continue` pins the assembled application's durable log — truncated turn, pruned envelope on the stored message, continued turn — through the real ACP subprocess path. + +## Alternatives considered + +**Suppress the whole replay state when assembly drops a tool call.** Works for today's one transformation, but re-derives the drop condition beside `blocks()` (the two drift silently), discards valid signatures for the retained blocks, and leaves read-time divergence — legacy sessions on disk foremost — a hard error. + +**Keep the state and relax pi-ai's block-count validation to attach what fits.** Rejected: index-aligned signatures attached to a different block list would present false native history to the provider. Degrading attaches nothing. + +**Teach each adapter to rewrite its state after assembly.** Rejected as an adapter obligation with an opaque blob; the envelope moves exactly the needed structure — and nothing else — into shared vocabulary, and the assembler's single decision does the rewrite mechanically. + +## Consequences + +Continuing after a max-token response that included a tool call works, retains the kept blocks' native signatures, and replays as a native pi-ai message. Sessions recorded before this change replay their affected assistant messages as provider-neutral content (with a diagnostic) instead of failing the turn; on-disk `replayState` values changed shape under the pre-release no-compatibility stance, with the old flat form handled by the same degrade path. This supersedes the read-time hard-error rule in the [provider-routed adapter decision](../architecture/2026-07-14-provider-routed-llm-adapters.md) for unusable state; validation itself is unchanged and still precedes any native reconstruction. diff --git a/.agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.zh.md b/.agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.zh.md new file mode 100644 index 0000000000..a24f3e194d --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-15-max-token-replay-state-alignment.zh.md @@ -0,0 +1,33 @@ +# Agent Note: 回放状�与组装内容按构造对� + +Status: implemented + +[English](2026-08-15-max-token-replay-state-alignment.md) | 中文 + +## 问题 + +pi-ai 为�个�应记录一个从�供方原生消�投影而�的��明回放数�,而 `BlockAssembler.blocks()` 会�行从 `max-tokens` �应中丢弃工具调用,因为被截断的调用�能安全执行。�久化的 assistant 消�因此把���的内容与�述未��原生�清�的元数�存在一起。下一个请求在历��建阶段以 `INVALID_REPLAY_STATE: block count does not match assistant content` 失败;由于�一致已��盘,该会�之�的�个请求都以�样方�失败——会�被永久�死。根因是结构性的:�一�应的两�表示在�水线的���置�自�摄快照,其索引对���读�时的硬错误�维�。 + +## 决定 + +两处改动,�覆盖�久化边界的一侧。 + +**写侧——一次�留/丢弃决定。** finish 分片的 `replayState` �为有类型的 `ReplayEnvelope`:一个��明的 `response` �区,加上与�射��列对�的�选��明���目。`BlockAssembler` �计算一次�留/丢弃决定,并把它�时应用于�和���目,因此组装执行的任何��——今天的 max-token 工具调用丢弃或未�的其他��——都按构造�剪掉对应元数�。�留的��留其�目,所以被截断的�应�为其�留的推�(reasoning)与文本�有签�。�目数与�射�数�一致的数�整体丢弃(�射�当的适�器�得�布归属错误的元数�)。pi-ai 把原先的平铺状�拆为版本 2 的 response �区和��签��目。 + +**读侧——�久化内容是��记录。** `toPiAssistant` 把回放状�当作�真度元数�,而�承�输入:读�方无法使用的任何状�——其他适�器的 kind�其他版本(包括已�盘的平铺版本 1 形�)�格�错误的元数��或与内容��匹�的�结构——都把这一�消��级为既有的外��供方无关转�,并通过�件的 `onReplayDegrade` 钩�(logger 警告)上报 `INVALID_REPLAY_STATE` 诊断。请求继续执行。正是这一点让本次改动之�已被毒化的会�得以继续而�是永远报错,也把未�一切分��约�为��消�的�真度�失。 + +## 验� + +组装器�元测试�明�剪�错�丢弃�以�未��与无���目数�的�传。pi-ai �元测试�明版本 2 数�的往返,以�先��个抛错的无效状�用例现在都�级为外�转�并带出诊断。agent loop 回归用例驱动一个被截断的文本加工具调用�应穿过�久化,并�明�续请求�带�剪�的数�。无密钥真实组�测试通过 loader �动 `dsh-llm-pi-ai`,�明截断��带 `tool_calls` 的原生续�,以�在�数��匹�的旧平铺状�消�之上�功续�。手工编写的无密钥快照场景 `max-tokens-continue` 通过真实 ACP �进程路径钉�组装应用的�久化日志——截断轮次�存储消�上�剪�的数��以�继续的轮次。 + +## 已考虑的替代方案 + +**组装丢弃工具调用时抑制整个回放状�。** 对今天唯一的��有效,但在 `blocks()` �边�新推导丢弃�件(两处会无声漂移),丢掉�留�的有效签�,并让读�时的分�——首当其冲是已�盘的旧会�——�然是硬错误。 + +**�留状�并放宽 pi-ai 的�数校验�能贴多少贴多少。** �决:索引对�的签�贴到��的�清�上,会��供方呈现虚�的原生历�。�级则什么都�贴。 + +**让�个适�器在组装�改写自己的状�。** �决:这把义务压给�有��明数�的适�器;信��把�好需�的结构——�多一分——纳入共享�汇,组装器的�一决定��机械完�改写。 + +## 影� + +包�工具调用的 max-token �应之�的续��以工作,�留��有原生签�,并作为原生 pi-ai 消�回放。本次改动之�记录的会�,其�影�的 assistant 消�作为�供方无关内容回放(带诊断)而�是让轮次失败;`replayState` �盘形状在预�布无兼容承诺立场下�生�化,旧平铺形�由�一�级路径处�。对��用状�而言,这�代了[�供方路由适�器决定](../architecture/2026-07-14-provider-routed-llm-adapters.md)中读�时硬错误的规则;校验本身��,�先于任何原生�建执行。 diff --git a/.agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.i18n.yaml b/.agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.i18n.yaml new file mode 100644 index 0000000000..b981cd7c0b --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.md +2026-08-15-persistent-bash-keeps-controlled-prompt.md: 9ee71f2adc0d473c5490dbe2b29ce55c8377e275 +2026-08-15-persistent-bash-keeps-controlled-prompt.zh.md: 48b2cc323e745a184cefc9603d461fe8fb27e15e diff --git a/.agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.md b/.agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.md new file mode 100644 index 0000000000..9ee71f2adc --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.md @@ -0,0 +1,35 @@ +# Agent Note: Persistent bash keeps the backend's controlled prompt + +Status: implemented + +English | [中文](2026-08-15-persistent-bash-keeps-controlled-prompt.zh.md) + +## Problem + +`dsh-tool-bash-persistent` initialized its shell with `stty -echo; PS1='__DSH_PERSISTENT_BASH_PROMPT__ '`, overwriting the `PS1` that `dsh-terminal-bash` sets in the spawn environment. The backend's prompt readiness requires the printable tail after the OSC `133;D` marker to exactly equal the controlled prompt ([design](../feature/2026-07-16-persistent-pty-sessions.md)), so after initialization no send could ever settle through it. `PROMPT_COMMAND` survived the override, so the marker kept arriving and every send paid the silence tier plus handoff grace — 3.5 s per tool call under production defaults, 7.2 s for the first call because the initialization send degraded too, and an extra 3.5 s tail after every long command. macOS has no exact stdin-wait tier, and on Linux the exact probe cannot observe a sub-poll-interval command leaving its stdin wait, so the degradation applied to effectively every call. Package tests masked it by configuring `idleSilenceMs: 100`. + +The override existed to give the tool a known prompt for two consumers: a viewport-suffix fallback that detected "shell at a prompt without the end marker", and cosmetic stripping of prompt text from partial output. + +## Decision + +The backend owns its prompt protocol and repairs it itself: the controlled `PROMPT_COMMAND` re-asserts `PS1` after printing the marker, so any in-shell prompt override — this tool's former initialization, a model command, a sourced script — lasts zero prompts. This also protects providers that cannot report foreground state, where the exact prompt text is the only readiness evidence. + +The tool stops overwriting `PS1` (initialization is `stty -echo` alone) and replaces its viewport-suffix fallback with the seam's existing signal: a send that settles as `stdin_read` without the end marker in scrollback returns the captured partial output. The private prompt constant and its stripping are deleted; partial output may now end with the backend's own prompt text, which the tool cannot and should not know. + +## Alternatives considered + +**Fix only the tool, leaving `PROMPT_COMMAND` unchanged.** Rejected because the seam would stay silently fragile: any later consumer or model command that touches `PS1` reintroduces the 3.5 s degradation with no failing signal, and providers without foreground inspection lose their only readiness factor. + +**Import the controlled prompt into the tool.** Rejected because the prompt is one provider's protocol constant; a Consumer matching it would couple the tool to `dsh-terminal-bash` specifically, and any other mounted backend would break it again. + +**Drop the prompt-text factor from backend readiness.** Rejected because for providers whose `inspectForeground` reports nothing, marker-plus-text is the defense against command output that embeds the raw OSC marker sequence; weakening it trades a fast path for a false-settle risk. + +**Widen `handoffGraceMs`/`idleSilenceMs` tuning instead.** Rejected because no silence value fixes a dead fast path; it only rebalances how much every call overpays. + +## Consequences + +Measured on darwin with production defaults: raw sends settle in ~86 ms with the controlled prompt intact versus ~3540 ms after an override; tool calls drop from 7180/3560/3566 ms to 355/88/91 ms for spawn+init+echo, echo, and pwd. + +The `stdin_read` fallback is behavior, not only cosmetics: after `exec`, an interrupt, or an interactive foreground child whose stdin wait the provider proves (the Linux exact tier), the call now returns captured partial output instead of spinning to the command deadline. Where no provider proves the wait (macOS), an interactive child still runs to `timeoutMs` — recorded as a known limitation in the tool README. Partial output can carry the backend's trailing prompt; complete marker-delimited output is byte-identical to before, which the keyless jsonrpc-agent snapshots confirm. + +The loader-composition suite now sets `idleSilenceMs` above the send bound, so silence can settle nothing and every case fails if prompt readiness regresses; a real-PTY case overrides `PS1` in-shell and requires the next send to settle as `stdin_read` with the healed prompt. The self-repair cannot survive a command that overwrites `PROMPT_COMMAND` itself; the silence tier remains the bound there, unchanged from the prior design. diff --git a/.agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.zh.md b/.agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.zh.md new file mode 100644 index 0000000000..48b2cc323e --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-08-15-persistent-bash-keeps-controlled-prompt.zh.md @@ -0,0 +1,35 @@ +# Agent Note: �久 bash �留�端的�控�示符 + +Status: implemented + +[English](2026-08-15-persistent-bash-keeps-controlled-prompt.md) | 中文 + +## Problem + +`dsh-tool-bash-persistent` 用 `stty -echo; PS1='__DSH_PERSISTENT_BASH_PROMPT__ '` �始化其 shell,覆盖了 `dsh-terminal-bash` 在 spawn 环境中设定的 `PS1`。�端的�示符就绪检测�求 OSC `133;D` 标记之�的�打�尾部与�控�示符完全相等([设计](../feature/2026-07-16-persistent-pty-sessions.md)),因此�始化之�任何 send 都无法�由该路径结算。`PROMPT_COMMAND` 未被覆盖,标记��续到达,于是�次 send 都�支付�默层加交接宽�——生产默认值下�次工具调用 3.5 秒;首次调用 7.2 秒,因为�始化 send �样退化;��长命令结��还�多等 3.5 秒。macOS 没有精确 stdin 等待层,而 Linux 的精确探测无法观察到在一个轮询周期内完�的命令脱离其 stdin 等待,因此退化实际覆盖了几乎�次调用。包测试把 `idleSilenceMs` �� 100 毫秒,掩盖了该问题。 + +这个覆盖存在的目的是给工具一个已知�示符,�务两个消费点:用视��缀检测「shell 已回到�示符但没有结�标记�的回退判定,以�从部分输出中剥离�示符文本的美化。 + +## Decision + +�端拥有自己的�示符�议并自行修�:�控 `PROMPT_COMMAND` 在打�标记��新设定 `PS1`,因此任何 shell 内的�示符覆盖——本工具从�的�始化�模型命令�被 source 的脚本——都存活�到下一个�示符。这�时�护了无法报告��状�的�供方:在那里,确切的�示符文本是唯一的就绪��。 + +工具��覆盖 `PS1`(�始化�剩 `stty -echo`),并用 seam 已有的信�替�其视��缀回退:一次以 `stdin_read` 结算而 scrollback 中没有结�标记的 send,返回已�获的部分输出。�有�示符常��其剥离逻辑删除;部分输出现在�能以�端自己的�示符文本结尾,工具无法也�应知�该文本。 + +## Alternatives considered + +**�改工具,�动 `PROMPT_COMMAND`。** 被拒�:seam �然�默脆弱——之�任何触碰 `PS1` 的消费方或模型命令都会在没有失败信�的情况下�新引入 3.5 秒退化,且无��检查的�供方失去唯一的就绪因�。 + +**把�控�示符导入工具。** 被拒�:�示符是�个�供方的�议常�;Consumer 匹�它就把工具与 `dsh-terminal-bash` 具体耦�,�任何其他�端都会�次��。 + +**从�端就绪检测中去掉�示符文本因�。** 被拒�:对 `inspectForeground` 无法报告任何信�的�供方而言,标记加文本是对抗「命令输出中嵌入原始 OSC 标记�列�的防御;削弱它是拿误结算风险�快速路径。 + +**改为调大 `handoffGraceMs`/`idleSilenceMs`。** 被拒�:任何�默值都修�好已死的快速路径,�是�新分��次调用多付多少。 + +## Consequences + +darwin 上以生产默认值实测:�控�示符完好时裸 send 约 86 毫秒结算,覆盖�约 3540 毫秒;工具调用从 7180/3560/3566 毫秒(spawn+init+echo�echo�pwd)�至 355/88/91 毫秒。 + +`stdin_read` 回退是行为而��是美化:在 `exec`�中断,或�供方能�明其 stdin 等待的交互����进程(Linux 精确层)之�,调用现在返回已�获的部分输出,而�是空转到命令期�。没有�供方�明该等待时(macOS),交互��进程�会�行到 `timeoutMs`——已记入工具 README 的已知�制。部分输出�能带有�端的尾部�示符;由标记界定的完整输出与之��字节相�,无密钥 jsonrpc-agent 快照确认了这一点。 + +loader 组�套件现在把 `idleSilenceMs` 设在 send 上�之上,�默无法结算任何 send,�示符就绪一旦回归,�个用例都会失败;一个真实 PTY 用例在 shell 内覆盖 `PS1`,并�求下一次 send 以 `stdin_read` 结算且�示符已修�。自我修�无法在 `PROMPT_COMMAND` 本身被覆盖的命令�存活;那里�默层�是边界,与先�设计一致。 diff --git a/.agents/notes/implemented/feature/2026-06-15-code-mode.i18n.yaml b/.agents/notes/implemented/feature/2026-06-15-code-mode.i18n.yaml index 701a26bf10..7b213dc96f 100644 --- a/.agents/notes/implemented/feature/2026-06-15-code-mode.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-06-15-code-mode.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-06-15-code-mode.md -2026-06-15-code-mode.md: bc019c0b9acc6d834da41ceff2b1d1930fb34027 -2026-06-15-code-mode.zh.md: c19562b828089b6deeb048d30a08ce8681f150da +2026-06-15-code-mode.md: dbf77557c9f1aa59deed443b74ca3ef83137d773 +2026-06-15-code-mode.zh.md: 6f263d946cf7632a0747dcb61f3dd22105e21e0c diff --git a/.agents/notes/implemented/feature/2026-06-15-code-mode.md b/.agents/notes/implemented/feature/2026-06-15-code-mode.md index bc019c0b9a..dbf77557c9 100644 --- a/.agents/notes/implemented/feature/2026-06-15-code-mode.md +++ b/.agents/notes/implemented/feature/2026-06-15-code-mode.md @@ -19,7 +19,7 @@ Tool presentation belongs to the registry that owns tool visibility: implementin Three decisions, each elaborated in its own section below: 1. **Code Mode is a first-class presentation mode of `ToolRuntime`** (`dsh-tools`), selected by a validated `mode` config: `'native'` (the default, contributing the visible capability schemas), `'code'` (the registry contributes only its reserved `run_code` transport plus a generated SDK `.d.ts` in the system prompt), or `'both'` (native schemas and the transport + SDK). The registry constructs its canonical contribution at the source; the cooperative prompt-assembly result remains authoritative, and the logged request header records exactly that returned presentation. -2. **Code execution is a capability seam** — `packages/code-runtime/` contains the Service Definition package `@deepseek-ai/dsh-code-runtime`, which owns `ctx.codeRuntime` ([capability seams](../architecture/2026-06-13-capability-seams.md); Consumer = `dsh-tools`, with core-consumes-a-seam precedent in `agent-loop` → `dsh-llm`). The runtime knows nothing about tools: it is handed a program and named async bindings, runs the program, and reports `{ value, logs, error? }`. Language and substrate are backend properties, so a future Python or container backend is another Service provider package, not a redesign. +2. **Code execution is a capability seam** — `packages/code-runtime/` contains the Service Definition package `@deepseek-ai/dsh-code-runtime`, which owns `ctx.codeRuntime` ([capability seams](../architecture/2026-06-13-capability-seams.md); Consumer = `dsh-tools`, with core-consumes-a-seam precedent in `agent-loop` → `dsh-llm`). The runtime knows nothing about tools: it is handed a program and named async bindings, runs the program, and reports `{ value, logs, error? }`. Language and substrate are backend properties, so a future Python or container backend is another Service Provider package, not a redesign. 3. **The shipped implementation is `@deepseek-ai/dsh-code-runtime-worker-thread`**: one fresh Node worker thread per run, executing the model's TypeScript after type-strip, with bindings bridged over the message port, an empty environment, configurable heap/output/time caps, and hard termination. Its trust posture is bash-equivalent by design — no unsafe-acknowledgement flags — because the harness already ships `dsh-bash-local`, which executes arbitrary model-written shell commands with strictly *more* ambient authority. This note owns Code Mode's presentation, composition, isolation, and settlement foundation. The later [typed tool-return Agent Note](2026-07-20-code-mode-typed-tool-returns.md) owns the generated output map, canonical binding values, `ToolCallError`, and the lossless outer-output boundary. @@ -87,6 +87,8 @@ The worker runtime provides containment, not a security boundary: model code can The SDK instructs the model to write an async body in the loaded runtime's language (an erasable-TypeScript body by default; a Python `async` body under a Python runtime — see the [language-dispatch note](2026-07-31-code-mode-language-dispatch.md)), call tools through `await tools.name(args)`, catch rejected tool calls when needed, and return or log only the output that should re-enter context. Both flavors state the same contract in their own primitive: independent read-only calls MAY overlap under `Promise.all` (TypeScript) or `asyncio.gather` (Python), mutating calls run alone in submission order, and dependent work sequences with `await`. The declaration prefix can be as large as native schemas, especially in `'both'`, but remains stable for provider caching. +The transport's own `description` and both SDK instruction flavors open by naming `code` and `description` as the call's two required arguments. Prose that describes the call as passing a program leaves the second argument discoverable only through the parameter schema, and a model that emits `{code}` alone loses the whole written program to an `INVALID_ARGS` rejection. + ## Consequences Deployments switching to `'code'` must update any native-only `toolOrder`. Assembly listeners own the integrity of any rewritten protocol messages. Sub-dispatch starts in submission order under a bounded overlap pool, while per-call contexts retain their source, envelope, and metadata through the outer result. diff --git a/.agents/notes/implemented/feature/2026-06-15-code-mode.zh.md b/.agents/notes/implemented/feature/2026-06-15-code-mode.zh.md index c19562b828..6f263d946c 100644 --- a/.agents/notes/implemented/feature/2026-06-15-code-mode.zh.md +++ b/.agents/notes/implemented/feature/2026-06-15-code-mode.zh.md @@ -19,7 +19,7 @@ Cloudflare 的 [Code Mode](https://blog.cloudflare.com/code-mode/) �出了一 三项决策,�自在下方独立�节中展开: 1. **Code Mode 是 `ToolRuntime`(`dsh-tools`)的一等呈现模�**,通过�校验的 `mode` �置选择:`'native'`(默认,贡献��能力 schema)�`'code'`(注册表仅贡献其�留的 `run_code` 传输通�加一份生�的 SDK `.d.ts` 到系统�示�中)或 `'both'`(原生 schema 加传输通� + SDK)。注册表在�头构建其规范贡献;�作��示�组装的结果�具��性,记录在日志中的请求头精确�映该返回的呈现。 -2. **代�执行是一个能力 seam**——`packages/code-runtime/` 包� Service Definition 包 `@deepseek-ai/dsh-code-runtime`,拥有 `ctx.codeRuntime`([能力 seam](../architecture/2026-06-13-capability-seams.md);消费方 = `dsh-tools`,core 消费 seam 的先例� `agent-loop` → `dsh-llm`)。�行时对工具一无所知:它接收一段程�和命�的异步绑定,执行程�,报告 `{ value, logs, error? }`。语言和基底是�端属性,因此未�的 Python 或容器�端�是�一个 Service �供方包,而��新设计。 +2. **代�执行是一个能力 seam**——`packages/code-runtime/` 包� Service Definition 包 `@deepseek-ai/dsh-code-runtime`,拥有 `ctx.codeRuntime`([能力 seam](../architecture/2026-06-13-capability-seams.md);消费方 = `dsh-tools`,core 消费 seam 的先例� `agent-loop` → `dsh-llm`)。�行时对工具一无所知:它接收一段程�和命�的异步绑定,执行程�,报告 `{ value, logs, error? }`。语言和基底是�端属性,因此未�的 Python 或容器�端�是�一个 Service Provider 包,而��新设计。 3. **交付的实现是 `@deepseek-ai/dsh-code-runtime-worker-thread`**:�次�行 spawn 一个全新的 Node worker 线程,对模型的 TypeScript 进行 type-strip �执行,绑定通过消�端�桥接,环境为空,堆/输出/时间上���置,并支�硬终止。其信任姿�在设计上等�于 bash——无需 unsafe-acknowledgement flag——因为 harness 已�交付了 `dsh-bash-local`,�者以严格*更高*的环境��执行模型编写的任� shell 命令。 本说明负责定义 Code Mode 的呈现�组��隔离与结算基础。�续的[类型化工具返回值 Agent Note](2026-07-20-code-mode-typed-tool-returns.md)负责定义生�的输出映射�规范绑定值�`ToolCallError` 和无�外层输出边界。 @@ -87,6 +87,8 @@ worker �行时�能约�程�的�行,而�构�安全边界:模型 SDK 指示模型编写一个所加载�行时语言的异步函数体(默认�擦除 TypeScript;Python �行时下为 Python `async` 函数体——�[语言分� note](2026-07-31-code-mode-language-dispatch.md)),通过 `await tools.name(args)` 调用工具,在需�时�获被拒�的工具调用,并仅 return 或 log 应�新进入上下文的输出。两� flavor 用�自的原语陈述�一约定:相互独立的�读调用�以(MAY)在 `Promise.all`(TypeScript)或 `asyncio.gather`(Python)下��,有副作用的调用按�交顺��独�行,有�赖的工作用 `await` 排�。声明�缀�能与原生 schema 一样大,尤其在 `'both'` 下,但对�供方缓存��稳定。 +传输自身的 `description` 与两� flavor 的 SDK 说明都以点� `code` 和 `description` 这两个必填�数开头。把该调用�述�「传入一个程��的散文会让第二个�数�能从�数 schema 中�现,而��出 `{code}` 的模型会因 `INVALID_ARGS` 被拒,连�已写好的整个程�一起丢失。 + ## �果 切�到 `'code'` 的部署必须更新任何仅� native 的 `toolOrder`。组装监�器有责任维护任何被�写的�议消�的完整性。�分�在有界的��池下按�交顺��动,而�次调用的上下文会通过外层结果�留其 source�信�与元数�。 diff --git a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.i18n.yaml b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.i18n.yaml index dcb4d5e33a..1870906b95 100644 --- a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md -2026-06-18-compaction-capability-seam.md: 77ccd615a20524fad2a1ee47130ba2837d83c663 -2026-06-18-compaction-capability-seam.zh.md: a18e7593a5b654685a2e033dd2f0a721da74502e +2026-06-18-compaction-capability-seam.md: 71ea7144cd843364fd77db0dd2c8a0d1e8bab1ac +2026-06-18-compaction-capability-seam.zh.md: bd7ab06b3a012d83d3f918a3ebd5a553624780e9 diff --git a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md index 77ccd615a2..71ea7144cd 100644 --- a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md +++ b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md @@ -14,7 +14,7 @@ Two forces shape the design. First, compaction policy and reusable token measure ## Decision -### Compaction is a capability seam with separate Service Definition and Service provider roles +### Compaction is a capability seam with separate Service Definition and Service Provider roles Per the [capability-seams Agent Note](../architecture/2026-06-13-capability-seams.md), compaction ships as separate packages so the contract, the algorithm, and (later) the consumer API evolve independently: diff --git a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.zh.md b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.zh.md index a18e7593a5..bd7ab06b3a 100644 --- a/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.zh.md +++ b/.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.zh.md @@ -14,7 +14,7 @@ Status: implemented ## 决策 -### 压缩是一个能力 seam,Service Definition 与 Service �供方角色分离 +### 压缩是一个能力 seam,Service Definition 与 Service Provider 角色分离 �循[能力 seam Agent Note](../architecture/2026-06-13-capability-seams.md),压缩以独立包�布,使约定�算法和(�续的)消费方 API �自独立演进: diff --git a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.i18n.yaml b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.i18n.yaml index 431665bbb7..e8ece4d624 100644 --- a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md -2026-06-21-subagent-capability-seam.md: 337e1f8aaf8db8b9d41bbf0ad02f7f8a9468e4fb -2026-06-21-subagent-capability-seam.zh.md: f88ad5cfba5b7f364064ad6b82fc918bdf5d7ef3 +2026-06-21-subagent-capability-seam.md: fa3b4f570bfccdc849a38b3eda16c1c8dd7b1827 +2026-06-21-subagent-capability-seam.zh.md: b25fe64377f98af92dbccb87f755627926975ef2 diff --git a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md index 337e1f8aaf..fa3b4f570b 100644 --- a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md +++ b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md @@ -21,7 +21,7 @@ The harness has a long-deferred seam for **subagents** — an agent delegating w ### Why not the bash seam shape -The bash seam ([capability seams](../architecture/2026-06-13-capability-seams.md)) registers exactly one `ShellExecutor` per context; loading a second throws. That is correct for bash (one machine, one way to run a command) but wrong here: coexistence is the requirement. So the subagent service is a **named-provider registry** — each implementation registers under a unique name and a caller picks one by name — mirroring the **LLM adapter registry** (`LlmRuntime.registerAdapter`), not the single-service bash executor. The seam is still three-package (Service Definition / Service provider / Consumer); only the "one vs. many implementations" axis differs. +The bash seam ([capability seams](../architecture/2026-06-13-capability-seams.md)) registers exactly one `ShellExecutor` per context; loading a second throws. That is correct for bash (one machine, one way to run a command) but wrong here: coexistence is the requirement. So the subagent service is a **named-provider registry** — each implementation registers under a unique name and a caller picks one by name — mirroring the **LLM adapter registry** (`LlmRuntime.registerAdapter`), not the single-service bash executor. The seam is still three-package (Service Definition / Service Provider / Consumer); only the "one vs. many implementations" axis differs. ## Decision diff --git a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.zh.md b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.zh.md index f88ad5cfba..b25fe64377 100644 --- a/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.zh.md +++ b/.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.zh.md @@ -21,7 +21,7 @@ harness 有一个长期�置的 seam 用于 **subagent**:一个 agent 将工 ### 为何�采用 bash seam 的形状 -bash seam([能力 seam](../architecture/2026-06-13-capability-seams.md))在�个上下文中�注册�好一个 `ShellExecutor`;加载第二个会抛异常。这对 bash 是正确的(一�机器�一�执行命令的方�),但对这里是错误的:共存�是需求。因此 subagent �务是一个**命��供方注册表**——�个实现以唯一�称注册,调用方按�称选择——镜� **LLM(大语言模型)适�器注册表**(`LlmRuntime.registerAdapter`),而���务的 bash 执行器。seam �然是由三类包构�的结构(Service Definition / Service provider / Consumer);�是「一个 vs. 多个实现�这个维度��。 +bash seam([能力 seam](../architecture/2026-06-13-capability-seams.md))在�个上下文中�注册�好一个 `ShellExecutor`;加载第二个会抛异常。这对 bash 是正确的(一�机器�一�执行命令的方�),但对这里是错误的:共存�是需求。因此 subagent �务是一个**命��供方注册表**——�个实现以唯一�称注册,调用方按�称选择——镜� **LLM(大语言模型)适�器注册表**(`LlmRuntime.registerAdapter`),而���务的 bash 执行器。seam �然是由三类包构�的结构(Service Definition / Service Provider / Consumer);�是「一个 vs. 多个实现�这个维度��。 ## 决策 diff --git a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.i18n.yaml b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.i18n.yaml index 948301ca44..d066d73db4 100644 --- a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md -2026-07-05-dynamic-workflows.md: bf7b98891d19c31be7e1ca2763f98bb3668ab659 -2026-07-05-dynamic-workflows.zh.md: f3c06ae17e7cf185865d03e261e4e6bbabcabd1f +2026-07-05-dynamic-workflows.md: eff37365534cd41e46c98e20a5e763a233330647 +2026-07-05-dynamic-workflows.zh.md: 15aa8326958faebb53d33153b1c1537af199a4c5 diff --git a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md index bf7b98891d..eff3736553 100644 --- a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md +++ b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md @@ -10,7 +10,7 @@ The harness can delegate ONE task to ONE child (`dsh-tool-subagent`), but work t ## Decision -A workflow capability family at `packages/workflow/` in the bash seam shape (Service Definition / Service provider / Consumer), plus the structured-output foundation it needs on the subagent seam. +A workflow capability family at `packages/workflow/` in the bash seam shape (Service Definition / Service Provider / Consumer), plus the structured-output foundation it needs on the subagent seam. ### The script contract (Claude Code-compatible) diff --git a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.zh.md b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.zh.md index f3c06ae17e..15aa832695 100644 --- a/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.zh.md +++ b/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.zh.md @@ -10,7 +10,7 @@ harness �以通过 `dsh-tool-subagent` 将一个任务委派给一个� agent ## 决策 -在 `packages/workflow/` 下以 bash seam 的形�(Service Definition�Service provider�Consumer)�供一组工作�能力,以�它在 subagent seam 上所需的结构化输出基础。 +在 `packages/workflow/` 下以 bash seam 的形�(Service Definition�Service Provider�Consumer)�供一组工作�能力,以�它在 subagent seam 上所需的结构化输出基础。 ### 脚本约定(兼容 Claude Code) diff --git a/.agents/notes/implemented/feature/2026-07-06-approval-seam.i18n.yaml b/.agents/notes/implemented/feature/2026-07-06-approval-seam.i18n.yaml index 1033d13843..b04c952748 100644 --- a/.agents/notes/implemented/feature/2026-07-06-approval-seam.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-06-approval-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-06-approval-seam.md -2026-07-06-approval-seam.md: 5c62a175b0a96ecc8dd3f5b09b618b8e4d5e7612 -2026-07-06-approval-seam.zh.md: 091db8347e0a5bd5ee475809dde6b90d183d3112 +2026-07-06-approval-seam.md: ace41ebbb94cc24c2fdd3e7ae2d3a69b28b169af +2026-07-06-approval-seam.zh.md: 3e06c3ba26dd6d85555727dc0c62cbffe0a2a1da diff --git a/.agents/notes/implemented/feature/2026-07-06-approval-seam.md b/.agents/notes/implemented/feature/2026-07-06-approval-seam.md index 5c62a175b0..ace41ebbb9 100644 --- a/.agents/notes/implemented/feature/2026-07-06-approval-seam.md +++ b/.agents/notes/implemented/feature/2026-07-06-approval-seam.md @@ -97,7 +97,7 @@ Snapshots record allowed and rejected sandbox escalation through `session/reques - **An inline `tools/pre-execute` permission gate in the ACP bridge** — rejected: prompting for every bridge-owned call hardwires the asking policy into the transport, cannot serve a second asker (sandbox escalation happens after execution starts, with no pre-execute moment), and leaves hook-produced `ask` decisions without a shared mechanism. - **The generic user-questions seam (`ctx.userQuestions`)** — rejected as the approval mechanism: the two share a skeleton (route by agent, block for a human, handle absence), but approval's contract is narrower in every dimension that matters: a closed outcome vocabulary instead of free text, a protocol-native prompt attached to a tool call instead of a generic form, mandatory fail-closed absence, and audit events. Approval therefore does not ride the shipped `packages/interaction/user-questions` / `ask_user_question` elicitation path — an elicitation form is not a permission prompt, and a free-text answer is not a closed outcome; sharing provider plumbing stays open if the two ever converge. - **Static optional injection in `dsh-tools`** — rejected: the vendored cordis `Inject` type has no optional flag — the object form maps service names to intercept config, and a declared inject gates the fiber. `ctx.get('approval')` is the documented opportunistic-consumption pattern (the `tool-bash` owner-token lookup, the loop's persistence probe), reads presence per call, and degrades correctly across HMR without extra machinery. -- **The capability-seam three-package split** — rejected: Service Definition / Service provider / Consumer fits a seam whose Service provider is swappable (bash-local vs bash-sandbox). Here the service body is fixed mechanism and the variable part is listeners that live with their owners — splitting would manufacture a Service provider package with nothing in it ("don't split preemptively"). +- **The capability-seam three-package split** — rejected: Service Definition / Service Provider / Consumer fits a seam whose Service Provider is swappable (bash-local vs bash-sandbox). Here the service body is fixed mechanism and the variable part is listeners that live with their owners — splitting would manufacture a Service Provider package with nothing in it ("don't split preemptively"). - **Offering `allow_always` now** — rejected: the protocol can express it, but honoring it means designing grant storage, scope identity, and revocation (§ Deferred). Advertising an option the harness cannot honor manufactures doomed grants. ## Consequences diff --git a/.agents/notes/implemented/feature/2026-07-06-approval-seam.zh.md b/.agents/notes/implemented/feature/2026-07-06-approval-seam.zh.md index 091db8347e..3e06c3ba26 100644 --- a/.agents/notes/implemented/feature/2026-07-06-approval-seam.zh.md +++ b/.agents/notes/implemented/feature/2026-07-06-approval-seam.zh.md @@ -97,7 +97,7 @@ ACP 桥�应答其会�映射所拥有的精确 agent 对象。它�带既有 - **在 ACP 桥中内� `tools/pre-execute` ��门�**:�决。对桥拥有的�次调用都弹出�示,会将请求策略硬编�进传输层,无法�务第二个�起方(沙箱�级�生在执行开始之�,没有 pre-execute 时刻),且钩�产生的 `ask` 决策没有共享机制。 - **通用用户交互 seam(`ctx.userQuestions`)**:�决作为审批机制。二者骨架相似(按 agent 路由�阻塞等待人类�处�缺失),但审批的约定在�个关键维度上都更窄:�闭的结果�汇而�自由文本�附�在工具调用上的�议原生�示而�通用表��强制的缺失时失败关闭�以�审计事件。因此审批�走已交付的 `packages/interaction/user-questions` / `ask_user_question` 信��集路径——信��集表��是���示,自由文本应答�是�闭结果;如果二者将�趋�,共享�供方管��然开放。 - **`dsh-tools` 中的���选注入**:�决。vendor 的 Cordis `Inject` 类型没有 optional 标志——对象形�将�务�映射到拦截�置,声明的 inject 会阻塞 fiber。`ctx.get('approval')` 是文档化的机会性消费模�(`tool-bash` 的 owner-token 查找�loop 的�久化探测),按调用读�存在性,跨 HMR 正确�级,无需�外机制。 -- **能力 seam 的三包拆分**:�决。Service Definition/Service provider/Consumer 适� Service provider �替�的 seam(bash-local vs bash-sandbox)。此处�务体是固定机制,��部分是留在�自通�拥有者�件中的监�器——拆分�会制造一个空的 Service provider 包(「��预防性拆分�)。 +- **能力 seam 的三包拆分**:�决。Service Definition/Service Provider/Consumer 适� Service Provider �替�的 seam(bash-local vs bash-sandbox)。此处�务体是固定机制,��部分是留在�自通�拥有者�件中的监�器——拆分�会制造一个空的 Service Provider 包(「��预防性拆分�)。 - **现在就�供 `allow_always`**:�决。�议能表达它,但兑现它�味�设计授�存储�作用域标识和撤销(§ 延�)。展示 harness 无法兑现的选项�会制造注定失败的授�。 ## �果 diff --git a/.agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml b/.agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml index b3cba4dcb8..3cf7133534 100644 --- a/.agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-06-sandbox.md -2026-07-06-sandbox.md: 76733c619e3e34a6ee49c80aaf5c3bd4d48d82f7 -2026-07-06-sandbox.zh.md: 36ecbadd0589b4859389961aa52181de3f034dcc +2026-07-06-sandbox.md: 62c46c99a2283b03cf75d8823783367dd6b3473a +2026-07-06-sandbox.zh.md: 82c2e7962800c007a207f0204bf47cef01f79a36 diff --git a/.agents/notes/implemented/feature/2026-07-06-sandbox.md b/.agents/notes/implemented/feature/2026-07-06-sandbox.md index 76733c619e..62c46c99a2 100644 --- a/.agents/notes/implemented/feature/2026-07-06-sandbox.md +++ b/.agents/notes/implemented/feature/2026-07-06-sandbox.md @@ -54,7 +54,7 @@ OS subprocess confinement applies to the bash executor, including hook commands, Policy rides each CALL, not the provider: two consumers may confine under different policies at the same instant (bash under `read-only` while a confined child agent keeps its state directory writable), and an approved escalated retry is a new call with a wider policy — inexpressible under a config-fixed provider mode. -The seam confines SAME-WORLD subprocesses only: a backend shares the host's filesystem and kernel. Containers, microVMs, and remote executors are NOT backends of this seam — they replace the Service providers for whole capability seams (`ctx.shell`, `ctx.fs`) as environment-coherent groups, because an agent whose bash runs in a container while its fs tools write the host lives in two split worlds. +The seam confines SAME-WORLD subprocesses only: a backend shares the host's filesystem and kernel. Containers, microVMs, and remote executors are NOT backends of this seam — they replace the Service Providers for whole capability seams (`ctx.shell`, `ctx.fs`) as environment-coherent groups, because an agent whose bash runs in a container while its fs tools write the host lives in two split worlds. Left open, for the phase that needs them: whether network restriction arrives as a separate `network_mode` or merges into `sandbox_mode` once a runner enforces both, and whether `SandboxPolicy` grows extra writable-root grants now (the launcher already speaks `--rw `) or only when escalation needs them. @@ -199,7 +199,7 @@ Costs and accepted limits: In-repo precedents this design copies or contrasts with: -- [The capability-seams Agent Note](../architecture/2026-06-13-capability-seams.md) — the Service Definition / Service provider / Consumer split and the "don't split preemptively" timing rule the second consumer satisfied. +- [The capability-seams Agent Note](../architecture/2026-06-13-capability-seams.md) — the Service Definition / Service Provider / Consumer split and the "don't split preemptively" timing rule the second consumer satisfied. - The `dsh-shell` request/spec split ([the bash vocabulary catalog](../../../../docs/subsystems/shell.md)) — the complete `sandboxPolicy` rides its per-call carrier, and the explicit-`resolve()` defaulting convention. - [The approval seam Agent Note](2026-07-06-approval-seam.md) — the channel escalation asks through; its answerer waterfall, audit pair, and one-package rationale are recorded there. - [Event-sourced sessions](../architecture/2026-06-11-event-sourced-sessions.md) and [standalone log-only events](../simplification/2026-07-28-remove-synthetic-log-only-turns.md) — the log-as-store foundation the per-session modes fold over, and the explicit durability boundary the anchoring design obeys. diff --git a/.agents/notes/implemented/feature/2026-07-06-sandbox.zh.md b/.agents/notes/implemented/feature/2026-07-06-sandbox.zh.md index 36ecbadd05..82c2e79628 100644 --- a/.agents/notes/implemented/feature/2026-07-06-sandbox.zh.md +++ b/.agents/notes/implemented/feature/2026-07-06-sandbox.zh.md @@ -54,7 +54,7 @@ OS �进程约�适用于 bash 执行器(包括钩�命令),�续还 策略��次调用而��供方�带:两个消费方�以在�一时刻以��策略约�(bash 在 `read-only` 下�行,而一个�约�的� agent ��其状�目录�写),且�批准的�级�试是一次带有更宽策略的新调用——在�置固定的�供方模�下无法表达。 -该 seam 仅约�与宿主共享文件系统和内核的�进程。容器�microVM 和远程执行器�是此 seam 的�端——它们以环境一致的组替�整个能力 seam(`ctx.shell`�`ctx.fs`)的 Service provider,因为一个 bash 在容器中�行而 fs 工具写主机的 agent 生活在两个割裂的世界中。 +该 seam 仅约�与宿主共享文件系统和内核的�进程。容器�microVM 和远程执行器�是此 seam 的�端——它们以环境一致的组替�整个能力 seam(`ctx.shell`�`ctx.fs`)的 Service Provider,因为一个 bash 在容器中�行而 fs 工具写主机的 agent 生活在两个割裂的世界中。 留待需�时�决定:网络�制是作为独立的 `network_mode` 到�,还是在�个 runner �时强制两者��并进 `sandbox_mode`;以� `SandboxPolicy` 是现在就增加�外的�写根授�(launcher 已支� `--rw `),还是等到�级机制需�时�加。 @@ -199,7 +199,7 @@ fs/web/todo 在进程内执行,因此它们的沙箱语义是�自能力边 本设计�制或对比的仓库内先例: -- [能力 seam Agent Note](../architecture/2026-06-13-capability-seams.md)——Service Definition/Service provider/Consumer 拆分与「��过早拆分�的时机规则(第二个消费方满足了该规则)。 +- [能力 seam Agent Note](../architecture/2026-06-13-capability-seams.md)——Service Definition/Service Provider/Consumer 拆分与「��过早拆分�的时机规则(第二个消费方满足了该规则)。 - `dsh-shell` 的 request/spec 拆分([bash �汇目录](../../../../docs/subsystems/shell.md))——完整的 `sandboxPolicy` �载其按调用载体,以�显� `resolve()` 默认约定。 - [批准 seam Agent Note](2026-07-06-approval-seam.md)——�级请求通过的通�;其应答器 waterfall(瀑布�事件)�审计对和�包�由记录在那里。 - [事件溯�会�](../architecture/2026-06-11-event-sourced-sessions.md)与[独立纯日志事件](../simplification/2026-07-28-remove-synthetic-log-only-turns.md)——按会�模� fold 所�赖的日志�存储基础,以�锚定设计�守的显��久性边界。 diff --git a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.i18n.yaml b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.i18n.yaml index 40e2c6dd19..674176e65a 100644 --- a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md -2026-07-27-trajectory-inspection-ledger.md: 74ed1f8ec6f6efcbf77e9caec7e254cb114efbd9 -2026-07-27-trajectory-inspection-ledger.zh.md: be648cb73478037979fd941753129b7c68be5085 +2026-07-27-trajectory-inspection-ledger.md: 7f97bc395ed694a0a750d3b744cc9887834ef32f +2026-07-27-trajectory-inspection-ledger.zh.md: 34bb8741124c410fe06ec18bdde801caa987f4fb diff --git a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md index 74ed1f8ec6..7f97bc395e 100644 --- a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md +++ b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.md @@ -21,7 +21,7 @@ Trajectory has to make prose, machine payloads, token usage, timing, and nested - Call schemas come from the active recorded Request header. Keyless snapshot fixtures deliberately replace that catalog with the non-array `{{tools}}` token, which the durable inspection boundary treats as unavailable instead of attempting to project or fabricate schemas. - Selecting a record or Request opens an inspector inside Trajectory. Tabs and Summary sections follow the selected entity: Markdown messages expose rendered content, source fields, provider/model fields, and hierarchy views; tools add JSON payload/result and schema views; Requests add options, usage, timing, and result navigation. Scrollable Summary regions keep their scrollbar thumbs transparent until hover or `focus-within`, while retaining the scrollbar reservation and scroll behavior. Images render as media rather than serialized data. - Turn folding removes all rows after its first record and replaces them with a compact step/tool-call count; Assistant folding applies the same interaction to its tool-call descendants. Global controls fold or expand both levels. -- A long ledger initially positions the loaded tail at the bottom and mounts only the viewport's row window plus bounded overscan. Request-only separators join the next measurable virtual item, with a terminal separator retaining its own fixed clearance, so the virtualizer never owns a zero-height item. Semantic DOM-safe row keys and ARIA indexes expose identity independently from mount position. A tail with known older history virtualizes immediately even when its loaded projection is below the ordinary row threshold. Stable-key virtualizer anchoring preserves the visible item across prepends and appends; the manual scroll-height fallback applies only when completing pagination disables virtualization. Selection, timeline focus, folding, search, and bottom following address records by stable event or tool-call identity rather than requiring their DOM rows to exist. An explicit loading row covers records until initial positioning finishes and while an older Session page is pending. +- A long ledger initially positions the loaded tail at the bottom and mounts only the viewport's row window plus bounded overscan. Request-only separators join the next measurable virtual item, with a terminal separator retaining its own fixed clearance, so the virtualizer never owns a zero-height item. Semantic DOM-safe row keys and ARIA indexes expose identity independently from mount position. A tail with known older history virtualizes immediately even when its loaded projection is below the ordinary row threshold. Stable-key virtualizer anchoring preserves the visible item across prepends and appends; the manual scroll-height fallback applies only when completing pagination disables virtualization. Selection, timeline focus, folding, search, and bottom following address records by stable event or tool-call identity rather than requiring their DOM rows to exist. An explicit loading row covers records until initial positioning finishes. While an older Session prefix remains unloaded, an interactive first row precedes the loaded records and requests one older page; the same row becomes a disabled loading status for a pending page and disappears only when paging completes. - The separate Waterfall tab is removed. A fixed Overview above the ledger projects every loaded record with known `startedAt` onto three semantic timing lanes using its own duration. While an older prefix remains unloaded and the viewport includes the loaded domain's start, a neutral ellipsis control covers the truncated edge and loads one earlier page without assigning unknown history a fabricated duration; hovering that control suppresses the ordinary timeline cursor. Finalized Assistant spans divide the recorded interval at the first non-empty token delta, so distinct TTFT and decoding colors retain their actual ratio; incomplete timing falls back to one Assistant color. Hovering for 500 ms exposes exact start/end, total duration, TTFT, and decoding time without relying on the browser's native tooltip delay. Dragging left or right commits an inclusive interval filter: any record whose active interval overlaps either boundary remains visible, records without known timing leave the focused ledger, and clearing the selection restores the full loaded ledger. Wheel gestures zoom the time domain. A right-button click clears the interval selection; dragging instead pans an already zoomed viewport without mutating it. The Overview keeps the full time domain while focused so the selection can be resized or cleared without losing orientation. - Live history updates retain the ledger's bottom position only while the user is already following its tail. Scrolling upward clears that follow state, so streamed chunks and newly appended records do not interrupt inspection of earlier rows. Tail following and virtualizer measurement react to row keys and heights rather than content identity, so text-only stream frames neither discard the measurement cache nor repeat a DOM scroll write. - Token streaming updates only the matching Trajectory Assistant Context, while publication is coalesced to at most once per animation frame. The target snapshot preserves the existing stage, layout, Request numbering, Overview, and search inputs; completed Assistant State retains assembled blocks, timing, and usage rather than every raw chunk payload, while Session keeps the raw Event window. diff --git a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.zh.md b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.zh.md index be648cb734..34bb874112 100644 --- a/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.zh.md +++ b/.agents/notes/implemented/feature/2026-07-27-trajectory-inspection-ledger.zh.md @@ -21,7 +21,7 @@ Status: implemented - 调用 schema �自当�生效且已记录的请求头。无密钥快照 fixture(测试�置数�)有�将该目录替�为�数组 token `{{tools}}`,�久化检查边界会将其视为��用,而�是�试投影或虚构 schema。 - 选择记录或请求�,Trajectory 内部会打开检查器,其标签页和概述区域�实体类型�化:Markdown 消��供渲染内容���字段��供方�模型字段和层级视图;工具�供 JSON 载��结果和 schema 视图;请求�供选项�用��计时和结果跳转。�滚动的概述区域默认��滚动�滑��明,直到悬�或 `focus-within` 时�显示,�时�留滚动�预留空间和滚动行为。图片以媒体形�渲染,而�是显示为�列化数�。 - 折�轮次时�留其第一�记录,并用紧凑的步骤数和工具调用数替��续所有行;折�助手时对其工具调用�代应用相��作。全局控件会折�或展开这两个层级。 -- 长记录表�始时将已加载尾部置于底部,�挂载视�对应的行窗��有界的�外缓冲行。仅�请求的分隔行并入下一个具备�测高度的虚拟项,末尾分隔行则�留固定留白,因此虚拟化器�会管�零高度项。�安全用于 DOM 的语义行键与 ARIA 索引使标识��赖挂载�置。��已知尾部之��有更早历�,�使当�已加载投影低于常规行数阈值,也会立��用虚拟化。基于稳定键的虚拟化器锚定会在��补页和尾部追加时�留当���项;�有分页完�导致虚拟化�用时,�使用手动滚动高度兜底。选择�时间线�焦�折���索和末尾跟��按稳定的事件或工具调用标识定�,��求对应 DOM 行已存在。�始定�完��以�更早 Session 页��在等待时,明确的加载行会��真实记录。 +- 长记录表�始时将已加载尾部置于底部,�挂载视�对应的行窗��有界的�外缓冲行。仅�请求的分隔行并入下一个具备�测高度的虚拟项,末尾分隔行则�留固定留白,因此虚拟化器�会管�零高度项。�安全用于 DOM 的语义行键与 ARIA 索引使标识��赖挂载�置。��已知尾部之��有更早历�,�使当�已加载投影低于常规行数阈值,也会立��用虚拟化。基于稳定键的虚拟化器锚定会在��补页和尾部追加时�留当���项;�有分页完�导致虚拟化�用时,�使用手动滚动高度兜底。选择�时间线�焦�折���索和末尾跟��按稳定的事件或工具调用标识定�,��求对应 DOM 行已存在。�始定�完��,明确的加载行会��真实记录。更早的 Session �缀�未加载时,交互�首行�于已加载记录之�,�请求一页更早历�;页�加载期间,�一行会�为�用的加载状�,仅在分页完�时消失。 - 移除独立的 waterfall(瀑布�事件)标签页。固定在记录表上方的 Overview 区域将所有 `startedAt` 已知的已加载记录按�自耗时投影到三�语义计时轨�。�有更早�缀尚未加载且 viewport 包�已加载时间域起点时,中性的�略�控件会��截断边缘并加载一页更早历�,而�会为未知历�虚构耗时;悬�在该控件上会��普通的时间线光标。已完�的助手时间�以首个�空 token 增�为分界,用��颜色按真实比例表示 TTFT 与解�时间;计时�完整时退化为�一助手色。悬� 500 ms �会显示精确起止时刻�总耗时�TTFT 和解�时间,而��赖�览器原生 tooltip 的延迟。�左或��拖动会�交包�边界的区间筛选:任何活动区间与所选区间任一边界��的记录都会�留,计时未知的记录会从�焦�的记录表中移除,清除选择则��完整的已加载记录表。滚轮手势用于缩放时间域。�键�击会清除区间选择;�键拖动则�会平移已放大的 viewport,�会改�该选区。�焦�,Overview 区域��留完整时间范围,以便在�失去方�的情况下调整或清除选择。 - 实时历�更新仅在用户已�跟�记录表末尾时�留底部�置。�上滚动会清除跟�状�,因此��分�和新追加的记录�会打断对旧记录的检查。末尾跟�与虚拟化器测�仅�应行键和高度,而�内容标识,因此仅�文本的��帧既�会丢弃测�缓存,也�会��执行 DOM 滚动写入。 - token ��输出�更新命中的 Trajectory Assistant Context,�布则�并为�个 animation frame 最多一次。target snapshot 继续�供既有 stage�layout�请求编��Overview 与�索输入;已完�的 Assistant State ��留组装�的 blocks�计时与 usage,��留��原始 chunk payload,而 Session 继续�存原始 Event 窗�。 diff --git a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml index 354bc66050..7357dd353d 100644 --- a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md -2026-07-27-typescript-sdk-and-sdk-subagent-backend.md: 8b17603e5c90941778835befd84d114a3f3cd78b -2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md: fe5026871778bfcdcb85b71704d79e6fa678188d +2026-07-27-typescript-sdk-and-sdk-subagent-backend.md: 84314eaf5827464767666b1b9c65e105ea4e869a +2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md: 48f292514844d59d2084731b30bcb5ba7fb563d5 diff --git a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md index 8b17603e5c..84314eaf58 100644 --- a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md +++ b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.md @@ -10,7 +10,7 @@ The stdio JSON-RPC serving surface (`@deepseek-ai/dsh-sdk-jsonrpc-server`, the [ ## Decision -Three packages, layered exactly like the existing Python stack, plus one Service provider registration: +Three packages, layered exactly like the existing Python stack, plus one Service Provider registration: - **`@deepseek-ai/dsh-sdk-protocol`** (`packages/sdk/protocol/`) — the wire made shared and nominal. `JsonRpcLineTransport` moves here verbatim from `dsh-sdk-jsonrpc-server` (which now imports it), and `types.ts` names every payload the server speaks: `InitializeParams/Result`, `SessionPromptParams/Result`, the four notification payloads, and the `HarnessSdkRequestMap`/`HarnessSdkNotificationMap` indexes. The package root explicitly exports that complete interface and provides no source-module deep imports. The server's `notify()` call sites are typed against these named payloads, so server drift breaks compilation, not clients. One behavioral change: an error response now rejects with `JsonRpcResponseError` carrying the wire `code`/`data` (the Python client already preserved these; the old transport threw a bare `Error` with only the message). - **`@deepseek-ai/dsh-sdk-client`** (`packages/sdk/client/`) — the TypeScript twin of `python/sdk`: `HarnessClient` (spawn, frame, fan out notifications, typed error surfaces, close-to-quiescence via the shared dispose ladder) under `DeepSeekHarness`/`HarnessSession` (lazy start, memoized `initialize`, `run()` pairing one `session/prompt` with its `session.finished`). Its package-root consumer interface explicitly exports both client layers, caller-facing types, and the protocol-owned `JsonRpcResponseError`; source modules, normalization helpers, and the notification producer stay internal. `TurnResult.events` contains only the root session's typed events, while `notifications` retains session ids across the root and descendants discovered from `subagent.started`; session-tree scoping is client-side, mirroring `client.py`. Deliberate asymmetries with Python: the launch spec is explicit `command`/`args` (no bundled-runtime resolution — that is a distribution concern with no TS consumer yet); `env` replaces rather than merges (callers own credential policy; `scrubbedParentEnv` from the subprocess seam is one import away); `TurnResult` carries the structured `reason` (Python exposes only `status`); teardown walks a private stdin-EOF → SIGTERM → SIGKILL ladder to actual exit (the client runs outside any harness context, so it cannot ride `ctx.subprocess`). @@ -30,7 +30,7 @@ Four tiers, per [testing policy](../../../../docs/testing.md): ## Alternatives considered -**Import wire types from `dsh-sdk-jsonrpc-server` instead of extracting a protocol package.** Makes every SDK consumer (including `subagent-dsh-sdk`, which must not serve JSON-RPC) depend on the server plugin and its `dsh-agent`/`dsh-llm-deepseek` peer set, and leaves the notification payloads anonymous. The capability-seam rule (Service Definition / Service provider / Consumer as separate packages) already names this shape; the transport is genuinely two-sided. +**Import wire types from `dsh-sdk-jsonrpc-server` instead of extracting a protocol package.** Makes every SDK consumer (including `subagent-dsh-sdk`, which must not serve JSON-RPC) depend on the server plugin and its `dsh-agent`/`dsh-llm-deepseek` peer set, and leaves the notification payloads anonymous. The capability-seam rule (Service Definition / Service Provider / Consumer as separate packages) already names this shape; the transport is genuinely two-sided. **Have `subagent-dsh-sdk` speak raw JSON-RPC without the client SDK.** Duplicates the request/notification pairing, subscription fan-out, timeout, and teardown logic the SDK exists to own; the user's ask was explicitly a backend that *uses* the SDK, and the layering earns its keep by making the backend ~200 lines of policy over a reusable client. diff --git a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md index fe50268717..48f2925148 100644 --- a/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md +++ b/.agents/notes/implemented/feature/2026-07-27-typescript-sdk-and-sdk-subagent-backend.zh.md @@ -10,7 +10,7 @@ stdio JSON-RPC 对外�务接�(`@deepseek-ai/dsh-sdk-jsonrpc-server`,�[ ## 决策 -三个包,分层与既有 Python 栈完全一致,外加一个 Service provider 注册: +三个包,分层与既有 Python 栈完全一致,外加一个 Service Provider 注册: - **`@deepseek-ai/dsh-sdk-protocol`**(`packages/sdk/protocol/`)—— 把线�议��共享且具�。`JsonRpcLineTransport` 从 `dsh-sdk-jsonrpc-server` 原样移入(�者现在导入它),`types.ts` 为�务器所说的�个载�命�:`InitializeParams/Result`�`SessionPromptParams/Result`�四个通知载�,以� `HarnessSdkRequestMap`/`HarnessSdkNotificationMap` 索引。该包根显�导出这一完整接�,且��供指��模�的深层导入。�务器的 `notify()` 调用点以这些具�载�标注类型,�务器漂移会先破�编译而�是破�客户端。一处行为�化:错误�应现在以�带线上 `code`/`data` 的 `JsonRpcResponseError` 拒�(Python 客户端本就�留这些;旧传输�抛�带消�的裸 `Error`)。 - **`@deepseek-ai/dsh-sdk-client`**(`packages/sdk/client/`)—— `python/sdk` 的 TypeScript 孪生:`HarnessClient`(spawn�分帧�通知扇出�有类型的错误表���共享 dispose(资�释放)阶梯关闭至完全�稳)之上是 `DeepSeekHarness`/`HarnessSession`(惰性�动�记忆化 `initialize`�`run()` 把一个 `session/prompt` 与其 `session.finished` �对)。其包根消费方接�显�导出两层客户端���调用方的类型,以��议包所拥有的 `JsonRpcResponseError`;�模��规范化辅助函数和通知投递端都�留为内部实现。`TurnResult.events` �包�根会�的类型化事件,而 `notifications` 则�留根会��从 `subagent.started` �现的�代�自的会� id;基于 `subagent.started` 血缘边的会�树范围�定在客户端完�,镜� `client.py`。与 Python 的刻��对称:�动规格是显� `command`/`args`(无�绑�行时解�——那是尚无 TS 消费方的�行问题);`env` 整体替�而��并(凭�策略归调用方;subprocess seam 的 `scrubbedParentEnv` 一个 import �得);`TurnResult` �带结构化 `reason`(Python �暴露 `status`);拆除走�有的 stdin-EOF → SIGTERM → SIGKILL 阶梯直到真正退出(客户端�行在任何 harness 上下文之外,无法�乘 `ctx.subprocess`)。 @@ -30,7 +30,7 @@ stdio JSON-RPC 对外�务接�(`@deepseek-ai/dsh-sdk-jsonrpc-server`,�[ ## 考虑过的替代方案 -**从 `dsh-sdk-jsonrpc-server` 导入�议类型而�是���议包。** 会让�个 SDK 消费方(包括��能�供 JSON-RPC �务的 `subagent-dsh-sdk`)�赖�务器�件�其 `dsh-agent`/`dsh-llm-deepseek` peer 集�,且通知载��然匿�。能力 seam 规则(Service Definition/Service provider/Consumer 三个包分立)已�点�了这�形�;这个传输是货真价实的�边物。 +**从 `dsh-sdk-jsonrpc-server` 导入�议类型而�是���议包。** 会让�个 SDK 消费方(包括��能�供 JSON-RPC �务的 `subagent-dsh-sdk`)�赖�务器�件�其 `dsh-agent`/`dsh-llm-deepseek` peer 集�,且通知载��然匿�。能力 seam 规则(Service Definition/Service Provider/Consumer 三个包分立)已�点�了这�形�;这个传输是货真价实的�边物。 **让 `subagent-dsh-sdk` 直说裸 JSON-RPC�绕开客户端 SDK。** 会�制 SDK 存在�义所在的请求/通知�对�订阅扇出�超时与拆除逻辑;用户的�求明确是一个*使用* SDK 的�端,分层的回报是�端�为��用客户端之上约 200 行的纯策略。 diff --git a/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.i18n.yaml b/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.i18n.yaml index 5455415389..695a161749 100644 --- a/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.md -2026-07-30-current-sandbox-policy-context.md: ab231d19aec4852369c0f1a13fc50c69ab8128f1 -2026-07-30-current-sandbox-policy-context.zh.md: 4ac493dcfff5c286d569a46c34686dc4b8746618 +2026-07-30-current-sandbox-policy-context.md: b4c657ba52ff26e2e295e3635201424a155738d0 +2026-07-30-current-sandbox-policy-context.zh.md: bd32b021ef8622dc6843a163b21714a263bc8bed diff --git a/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.md b/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.md index ab231d19ae..b4c657ba52 100644 --- a/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.md +++ b/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.md @@ -12,7 +12,7 @@ The sandbox policy already enforced and logged each session's file-effect mode, `dsh-sandbox-policy`, the owner of mode and workspace-root resolution, registers one `sandbox:policy` cache-safe context contribution. Every agent request resolves the active session directly through `ctx.sandboxPolicy.resolve({ session })`; there is no denial-history scan or process-local “last told� state. -The policy contribution is capability-neutral and present for every agent session. It does not maintain a second inventory of mounted backends or tools; model-visible schemas remain the authority for available operations, while the context conditions its claims on any available operation that the DSH file sandbox enforces. The [capability-neutral policy context decision](../simplification/2026-07-31-capability-neutral-sandbox-policy-context.md) supersedes the earlier family-registration mechanism while retaining this note's cache-safe delivery and durable snapshot design. +The policy contribution is capability-neutral and available to every agent session by default. A composition may suppress the complete runtime-context channel when its model interface intentionally excludes dynamic context; this does not disable policy enforcement. The contribution does not maintain a second inventory of mounted backends or tools; model-visible schemas remain the authority for available operations, while the context conditions its claims on any available operation that the DSH file sandbox enforces. The [capability-neutral policy context decision](../simplification/2026-07-31-capability-neutral-sandbox-policy-context.md) supersedes the earlier family-registration mechanism while retaining this note's cache-safe delivery and durable snapshot design. The contribution states only facts shared by every enforcement dialect. `read-only` says an available sandbox-enforced operation cannot modify files in the standing mode and directs the model to try an available tool normally, then follow any denial and escalation guidance that tool returns. `workspace-write` states the canonical session workspace with non-exclusive wording and summarizes, without enumerating, that some platform temporary areas may also be writable. `danger-full-access` says the DSH file sandbox does not restrict file modifications by available operations. Backend-selected temporary paths, `/dev/null`, runner readiness, exact tool availability, and other policy domains are absent because `resolve()` cannot establish them at request assembly. diff --git a/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.zh.md b/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.zh.md index 4ac493dcff..bd32b021ef 100644 --- a/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.zh.md +++ b/.agents/notes/implemented/feature/2026-07-30-current-sandbox-policy-context.zh.md @@ -12,7 +12,7 @@ Status: implemented `dsh-sandbox-policy` 负责解�模�与工作区根目录,并注册一项缓存安全的 `sandbox:policy` 上下文贡献。�次 agent(智能体)请求都通过 `ctx.sandboxPolicy.resolve({ session })` 直接解�当�会�;�存在拒�历�扫�或进程本地的「上次告知�状�。 -该策略贡献��赖具体能力,并存在于�个 agent 会�中。它�会�行维护一份已挂载�端或工具清�;模型��的 schema �是�用�作的����,而上下文会将其声明�定在 DSH 文件沙箱所强制执行的任何�用�作上。[��赖具体能力的策略上下文决策](../simplification/2026-07-31-capability-neutral-sandbox-policy-context.md)�代了较早的家�注册机制,�时�留本 Agent Note 的缓存安全交付与�久快照设计。 +该策略贡献��赖具体能力,并默认�用于�个 agent 会�。当模型接�有�排除动�上下文时,组��以抑制完整的 runtime-context 通�;这�会�用策略强制机制。该贡献�会�行维护一份已挂载�端或工具清�;模型��的 schema �是�用�作的����,而上下文会将其声明�定在 DSH 文件沙箱所强制执行的任何�用�作上。[��赖具体能力的策略上下文决策](../simplification/2026-07-31-capability-neutral-sandbox-policy-context.md)�代了较早的家�注册机制,�时�留本 Agent Note 的缓存安全交付与�久快照设计。 该贡献�说明所有强制执行方言所共有的事实。`read-only` 表明�沙箱强制执行的�用�作在常驻模�下无法修改文件,并指示模型正常�试�用工具,���循该工具返回的任何拒�与��引导。`workspace-write` 用�排他措辞说明规范化的会�工作区,并概述�些平�临时区域�能也�写,而��一列举。`danger-full-access` 表明 DSH 文件沙箱�会�制�用�作修改文件。�端选择的临时路径�`/dev/null`�runner 就绪状��确切的工具�用情况和其他策略领域都�会出现,因为 `resolve()` 无法在请求组装时确定它们。 diff --git a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.i18n.yaml b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.i18n.yaml index 4f037737ff..5ef2099535 100644 --- a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md -2026-07-30-deepseek-onboarding-credential-setup.md: ebf5c66cffa8a7db90328dfcdd04e4134a78e3b1 -2026-07-30-deepseek-onboarding-credential-setup.zh.md: 3df63c59fd23acf32c16dac8f4ca373409ab2968 +2026-07-30-deepseek-onboarding-credential-setup.md: 823d10a723af70ec4ff51018b8b86198db0f5c29 +2026-07-30-deepseek-onboarding-credential-setup.zh.md: 7e8d79c23c4b1489bfd818c90558f36509635486 diff --git a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md index ebf5c66cff..823d10a723 100644 --- a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md +++ b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.md @@ -12,9 +12,9 @@ The [web configuration plane](../architecture/2026-07-30-web-config-plane.md) ma **One readiness projection owns both Models and onboarding facts.** `ui-settings-models` keeps a single store that joins `llm.providers({})`, redacted `settings.describe({})`, and batched `credentials.describe({refs})`. The onboarding projection selects the `deepseek-official` configurable-provider entry owned by the `llm-deepseek` namespace and empty settings path, reads the effective `apiKeyEnv`, and evaluates the matching credential descriptor. A live route with the same provider id but no matching configurable-provider declaration is adapter-absent for onboarding. A configured process-environment credential is ready and remains read-only. -**The settings shell contributes ordering and navigation, not provider policy.** `ui-settings` declares a root-scoped `settings.onboarding` list slot and mounts one ordered step at a time while the current surface is the empty Hero. The active registrant receives `complete()` and a private `openSection(id)` callback; completion transfers ownership to the next entry. `ui-settings-models` registers the DeepSeek step and its Models section through `slots.inject()`, so each contribution follows its declaration lifetime without making plugin load order a contract, and independently contributed dialogs cannot stack. The product-wide welcome step that precedes it is owned separately by [the versioned welcome decision](2026-07-30-versioned-gui-welcome-onboarding.md). +**The settings shell contributes ordering, not provider policy.** `ui-settings` declares a root-scoped `settings.onboarding` list slot and mounts one ordered step at a time while the current surface is the empty Hero. The active registrant receives `complete()` and a private `openSection(id)` callback; completion transfers ownership to the next entry. `ui-settings-models` registers the DeepSeek step, the preceding welcome notice, and its Models section through `slots.inject()`, so every contribution follows one client Cordis plugin's lifecycle and the dialogs cannot stack. Their common presentation is owned by the [shared-modal onboarding decision](2026-08-13-shared-modal-product-onboarding.md). -**The prompt routes to the one credential editor.** A mounted, active adapter with a resolved, writable, unconfigured reference presents one action that opens Settings on Models. The existing DeepSeek setup card there exclusively owns the password input, `credentials.set({ref, value})`, write failures, and post-write refresh; the onboarding overlay never holds or submits a secret. An unavailable settings or credential capability keeps its deployment diagnostic and routes to the same page, while an absent adapter remains skipped because navigation cannot mount a Cordis plugin. +**The prompt renders the existing credential editor inline.** A mounted, active adapter with a resolved, writable, unconfigured reference renders `ProviderEditor` in credential-only mode inside the shared onboarding modal. The same component owns the password input, validation, `credentials.set({ref, value})`, write failures, and post-write refresh; credential-only mode emits no provider-settings mutation. Configure later completes only this coordinator pass. An absent adapter remains skipped because the browser cannot mount a missing Cordis plugin. **Unavailable states do not capture the product.** An absent configurable-provider entry, inactive route, failed initial join, read-only deployment, or unresolved settings or credential capability completes the step without rendering because the onboarding action cannot repair that state. The Models page remains the deployment diagnostic and retry surface. Configure later completes a missing-credential step for the current mounted coordinator pass and writes no completion fact. Settings, credential, provider-topology, and connection invalidations all refresh the shared join, so an external credential update completes an open step without a reload. @@ -22,7 +22,7 @@ The [web configuration plane](../architecture/2026-07-30-web-config-plane.md) ma **A separate onboarding store and readiness RPC sequence** — rejected because it would create a second client-side interpretation of provider identity, settings paths, secret sidecars, credential references, and invalidation ordering beside the Models page. -**A second API-key editor inside onboarding** — rejected because the Models page already renders its DeepSeek setup card for exactly this state. Duplicating its secret draft, write errors, and configured-state convergence would add a second security-sensitive UI without another user capability. +**A standalone API-key implementation inside onboarding** — rejected because it would duplicate the Models editor's secret draft, validation, errors, and configured-state convergence. The modal renders the existing `ProviderEditor` in a constrained mode instead. **Writing the API key into provider settings** — rejected because a literal secret would enter the settings mutation path and whole-section replacement cannot safely reconstruct redacted values. Credential storage is already the product seam and supplies immediate invalidation. @@ -30,4 +30,4 @@ The [web configuration plane](../architecture/2026-07-30-web-config-plane.md) ma ## Consequences -The ordered flow leads from the product notice to the shipped adapter's existing editor without restarting: a keyless browser test boots the real Web composition under an isolated harness home, acknowledges the notice, follows the DeepSeek page to Models, stores a generated key through that page into the home's `.credentials.yaml`, verifies no key reaches DOM, ARIA, or browser console output, and confirms the running page reports configured. The full keyless Web replay lane also pins that a non-configurable replay route with the same provider id does not block unrelated journeys. Pure readiness and React tests pin managed-file and process-environment credentials, missing providers and capabilities, navigation, cancellation, external invalidation, and coordinator transfer. The flow deliberately inherits the configuration plane's documented base limitations rather than adding local secret storage, redaction, or settings replacement workarounds. +The ordered flow leads from the product notice to an inline key form without restarting: a keyless browser test boots the real Web composition under an isolated harness home, acknowledges the notice, stores a generated key from the shared modal into the home's `.credentials.yaml`, verifies no key reaches DOM, ARIA, or browser console output, and confirms the ordinary Models page reports configured. The full keyless Web replay lane also pins that a non-configurable replay route with the same provider id does not block unrelated journeys. Pure readiness and React tests pin managed-file and process-environment credentials, missing providers and capabilities, cancellation, external invalidation, and coordinator transfer. The flow deliberately inherits the configuration plane's documented base limitations rather than adding local secret storage, redaction, or settings replacement workarounds. diff --git a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.zh.md b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.zh.md index 3df63c59fd..7e8d79c23c 100644 --- a/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.zh.md +++ b/.agents/notes/implemented/feature/2026-07-30-deepseek-onboarding-credential-setup.zh.md @@ -12,9 +12,9 @@ Status: implemented **Models 与首次使用引导共享�一个就绪状�投影。**`ui-settings-models` 维护一个 store,把 `llm.providers({})`�脱��的 `settings.describe({})` 和批�调用的 `credentials.describe({refs})` �接为�一份状�。首次使用投影选�由 `llm-deepseek` namespace 与空 settings path �有的 `deepseek-official` ��置�供方�目,读�生效的 `apiKeyEnv`,并检查对应的凭��述符。� provider id 但没有匹���置�供方声明的存活路由,在首次使用引导中视为适�器缺失。通过进程环境�供的凭�若已�置,则判定为就绪并���读。 -**设置外壳�贡献排�与导航,��有�供方策略。** `ui-settings` 声明一个根作用域的 `settings.onboarding` list slot,并在当�界�为空白 Hero 时,�次�挂载一个有�步骤。当�注册方会收到 `complete()` 和�有 `openSection(id)` 回调;完�当�步骤�,所有�转交给下一项。`ui-settings-models` 通过 `slots.inject()` 注册 DeepSeek 步骤�其 Models 分区,使�项贡献都跟�自身的声明生命周期,�让�件加载顺��为约定;独立贡献的对�框也无法堆�。排在它之�的产�级欢迎步骤由[版本化欢迎决策](2026-07-30-versioned-gui-welcome-onboarding.md)�独�有。 +**设置外壳�贡献排�,��有�供方策略。** `ui-settings` 声明一个根作用域的 `settings.onboarding` list slot,并在当�界�为空白 Hero 时,�次�挂载一个有�步骤。当�注册方会收到 `complete()` 和�有 `openSection(id)` 回调;完�当�步骤�,所有�转交给下一项。`ui-settings-models` 通过 `slots.inject()` 注册 DeepSeek 步骤�排在它之�的欢迎声明� Models 分区,因此所有贡献都跟��一个 client Cordis �件的生命周期,两个弹窗也无法堆�。它们的共用展示由[共用弹窗引导决策](2026-08-13-shared-modal-product-onboarding.md)�有。 -**首次使用页��负责跳转到唯一的凭�编辑器。**适�器已挂载且处于活跃状�,其引用�解���写但尚未�置时,界�会显示一个�作按钮,用于打开「设置�的 Models 分区。该分区已有的 DeepSeek 设置�片全�负责密�输入框�`credentials.set({ref, value})`�写入失败处�和写入�刷新;首次使用页����有或�交 secret。 +**首次使用弹窗行内渲染既有凭�编辑器。** 适�器已挂载且处于活跃状�,其引用�解���写但尚未�置时,`ProviderEditor` 会以仅凭�模�渲染在共用引导弹窗中。�一个组件全�负责密�输入框�校验�`credentials.set({ref, value})`�写入失败处�和写入�刷新;仅凭�模��会�出�供方 settings �更。「���置��完��调器当�这一轮。适�器缺失时�跳过,因为�览器�能挂载缺失的 Cordis �件。 **��用状��会��产�。** ��置�供方�目缺失�路由�活跃��始�接失败�部署�读或设置�凭�能力无法解�时,都会直接完�而�渲染该步骤,因为首次使用引导无法修�这些状�。Models 页�是部署诊断与�试界�。「���置��会完��调器当�这一次缺少凭�的步骤,�写入任何完�状�。设置�凭���供方拓扑和连接失效事件都会刷新共享�接,因此外部凭�更新无需�新加载页���完�已打开的步骤。 @@ -22,7 +22,7 @@ Status: implemented **为首次使用引导�设 store 与就绪状� RPC 调用�列**:�予采用,因为这会在 Models 页之外,�建立一套客户端解释,用于判定�供方身份�设置路径�secret 槽�的伴�信��凭�引用�失效事件顺�。 -**在首次使用引导中增设第二个 API key 编辑器**:�予采用,因为 Models 页已为这一状�渲染 DeepSeek 设置�片。�制其中的 secret �稿�写入错误处�和已�置状�收敛会增加第二个安全�感的 UI,��会带�新的用户能力。 +**在首次使用引导中�独实现 API key 表�**:�予采用,因为这会�制 Models 编辑器的 secret �稿�校验�错误和已�置状�收敛。弹窗改为以��模�渲染既有 `ProviderEditor`。 **把 API key 写入�供方设置**:�予采用,因为字�� secret 会进入设置�更路径,而整个分节替�无法安全�建脱�值。凭�存储已�是产� seam,并能立��出失效事件。 @@ -30,4 +30,4 @@ Status: implemented ## �果 -有��程从产�声明页开始,无需����引导用户�往�产��供的适�器已有的编辑器:无密钥�览器测试在隔离的 harness 家目录下�动真实 Web 组�,确认声明��照 DeepSeek 页��往 Models,通过该页�把生�的密钥存入该目录的 `.credentials.yaml`,验�密钥未进入 DOM�ARIA 或�览器控制�输出,并确认�行中的页�报告已�置。完整的无密钥 Web 回放也固定了� id 的���置回放路由�会阻塞无关�程。纯就绪状�测试与 React 测试固化了�管文件凭�与进程环境凭���供方与能力缺失�导航��消�外部失效和�调器移交。该�程直接继承�置平�已记录的基础�制,�会�加局部的机密存储�脱�或设置替��通方案。 +有��程从产�声明页开始,无需����进入行内密钥表�:无密钥�览器测试在隔离的 harness 家目录下�动真实 Web 组�,确认声明�从共用弹窗把生�的密钥存入该目录的 `.credentials.yaml`,验�密钥未进入 DOM�ARIA 或�览器控制�输出,并确认普通 Models 页�报告已�置。完整的无密钥 Web 回放也固定了� id 的���置回放路由�会阻塞无关�程。纯就绪状�测试与 React 测试固化了�管文件凭�与进程环境凭���供方与能力缺失��消�外部失效和�调器移交。该�程直接继承�置平�已记录的基础�制,�会�加局部的机密存储�脱�或设置替��通方案。 diff --git a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml index abe1f687fb..630898f12a 100644 --- a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md -2026-07-30-versioned-gui-welcome-onboarding.md: 8897e28413df77d127a4d846f2a3e42789454490 -2026-07-30-versioned-gui-welcome-onboarding.zh.md: 9f5eb99033cd62154937808f26b0e1aa40966c9f +2026-07-30-versioned-gui-welcome-onboarding.md: 9c8684c0510c50c28e8ece53fd794844c771e496 +2026-07-30-versioned-gui-welcome-onboarding.zh.md: 52c35bf46e40afca1248bcbb94f38d7154f138a4 diff --git a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md index 8897e28413..9c8684c051 100644 --- a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md +++ b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.md @@ -10,15 +10,13 @@ The GUI's credential onboarding begins with a DeepSeek-specific readiness check, ## Decision -**The Settings shell coordinates ordered steps.** `settings.onboarding` remains a root-scoped list, but `ui-settings` projects its entry ids and order into one coordinator and mounts only the first incomplete step. The active registrant receives `complete()` and `openSection(id)`; no later step mounts until ownership transfers. The product welcome registers at order `-100`, while `ui-settings-models` retains only the conditional DeepSeek readiness and credential-routing step at order `0`. +**The Settings shell coordinates ordered steps.** `settings.onboarding` remains a root-scoped list, but `ui-settings` projects its entry ids and order into one coordinator and mounts only the first incomplete step. The active registrant receives `complete()` and `openSection(id)`; no later step mounts until ownership transfers. `ui-settings-models` now registers the restored welcome notice at order `-100` and the conditional DeepSeek credential step at order `0`; their current shared presentation is owned by the [shared-modal onboarding decision](2026-08-13-shared-modal-product-onboarding.md). -**Ownerless product onboarding belongs to `ui-settings-general`.** `src/onboarding-copy.ts` is the single editable source for the complete notice, the Continue label, and `WELCOME_NOTICE_VERSION`; both supported GUI locales intentionally render the same Chinese owner copy. Runtime locale dictionaries derive their welcome values from that file, and tests import the same owner instead of repeating paragraph text. The notice is browser UI only: it creates no Session event and contributes no model-visible content. The notice states that session telemetry is [disabled by default](2026-08-10-telemetry-default-off.md) and names the `FEEDBACK_ONLY` and `FULL` opt-in modes. +**The product welcome step is versioned and feature-owned.** The notice was historically removed by the [first-run beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md) and is now restored in `ui-settings-models` with new testing-stage copy. `ui-settings-general` still seats no onboarding step; the plugin that owns both current steps also owns the copy, store, and shared modal. -**Loopback acknowledgement is durable per Harness profile.** The Host half registers a `ui-onboarding` section in the user-settings seam, stored under the active `$DSH_HOME/settings.yaml`. The connection plugin publishes whether the current page uses a loopback authority as `ctx.connection.isLoopback`; hostname classification remains internal to the connection package, and other client plugins consume the service state instead of importing its implementation. A loopback browser shows the notice unless `welcomeNoticeVersion` equals the owner constant exactly. Continue applies one path mutation with the current version and calls `complete()` only after the Host commits it; a failed write leaves the notice open, and closing the page or process writes nothing. Bumping the constant intentionally makes every profile acknowledge the revised copy once. A non-loopback browser must not call the loopback-only settings API. It presents the same notice, but explicit Continue completes the step only in the current browser process; reload or a new process presents it again. +**The durable `ui-onboarding` section owns acknowledgement.** The Host half registers it in the user-settings seam under the active `$DSH_HOME/settings.yaml`; the current welcome store reads and writes `welcomeNoticeVersion` through the existing public settings API. The connection plugin publishes whether the current page uses a loopback authority as `ctx.connection.isLoopback`; hostname classification remains internal to the connection package, and other client plugins consume the service state instead of importing its implementation. The API proxy exposes this one product namespace through a closed allowlist beside configurable-provider namespaces, without treating its changes as model-catalog invalidations. -**Concurrent loopback views converge without stale replacement.** The acknowledgement write omits `expectedRevision` deliberately: every loopback tab writes the same version to one path, so the operation is idempotent and preserves sibling fields instead of rebuilding the section. `settings/document-updated` reaches the client as an invalidation — through `host/settings-changed` then, and forwarded verbatim now ([forwarded Remote events](../architecture/2026-08-10-remote-event-delivery.md)); an already mounted loopback tab refetches and advances when another tab or an external editor commits the current version. The API proxy exposes this one product namespace through a closed allowlist beside configurable-provider namespaces, without treating its changes as model-catalog invalidations. - -**Onboarding temporarily owns the viewport as one continuous stage.** A solid product surface replaces the complete application view through a body-level portal and marks the underlying app root inert; the exact required mask remains mounted behind that surface with `position:absolute`, zero left/right/bottom offsets, `top:80px`, `rgba(0, 0, 0, 0.24)`, and `backdrop-filter: blur(2px)`. Welcome and conditional credential setup render as successive pages in this stage instead of independent modals. Both pages reuse the Web UI's black `BrandWordmark`. The welcome page preserves the four authored paragraphs verbatim under the `内测声明` title; every paragraph uses one 16/28 body scale, and only the requested action clause inside the final paragraph receives a subtle 500 weight. A short staggered opacity/vertical entrance supplies pacing without blocking interaction and disappears under reduced motion. The title receives initial focus, Continue is the sole button, and no close, Escape, or mask-click path exists. +**Visible onboarding uses one shared modal contract.** Both current steps render through the same body-portaled `OnboardingModal`, and the underlying app root stays inert only while a dialog is visible. The shell renders no wrapper while a step loads its private facts. Explicit actions transfer coordinator ownership; Escape and mask clicks do not acknowledge or skip a step. ## Alternatives considered @@ -32,4 +30,4 @@ The GUI's credential onboarding begins with a DeepSeek-specific readiness check, ## Consequences -A fresh profile always sees the welcome notice before provider-specific onboarding; an already configured credential skips only the later DeepSeek step. On loopback, reloading after Continue stays past the acknowledged version, changing the owner version presents it again, and closing before Continue leaves the next launch unchanged. On non-loopback, Continue advances the live process without a privileged settings request and reload presents the notice again. Focused store and React tests pin both persistence modes, exact-version comparison, write failure, sole-action behavior, no-dismiss paths, coordinator ordering, conditional DeepSeek transfer, and HMR cleanup. The real Chromium scenario boots the shipped Web composition with an isolated harness home, verifies the exact mask geometry and computed styles, reloads before and after acknowledgement, continues into missing-credential setup, confirms an acknowledged-version mismatch returns while the credential is configured, and checks the browser console. +A fresh profile sees the current testing-stage notice, then the conditional DeepSeek key dialog when no provider is usable. Focused store and React tests pin exact-version acknowledgement, coordinator ordering, conditional transfer, shared modal behavior, and HMR cleanup. The real Chromium scenario boots the shipped Web composition with an isolated harness home, verifies both dialogs, writes the key through the existing credential boundary, and checks that no secret reaches the DOM, ARIA, or browser console. diff --git a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md index 9f5eb99033..52c35bf46e 100644 --- a/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md +++ b/.agents/notes/implemented/feature/2026-07-30-versioned-gui-welcome-onboarding.zh.md @@ -10,15 +10,13 @@ GUI 的凭�引导从 DeepSeek 专用的就绪状�检查开始,但内部测 ## 决策 -**设置外壳�调有�步骤。** `settings.onboarding` �是根作用域 list,但 `ui-settings` 会把其中��目的 id 和顺�投影到一个�调器中,并且�挂载第一个未完�的步骤。当�注册方会收到 `complete()` 和 `openSection(id)`;所有�转移�,�会挂载�续步骤。产�欢迎步骤的顺�为 `-100`,`ui-settings-models` 则��留顺�为 `0` 的 DeepSeek �件�就绪状�与凭�跳转步骤。 +**设置外壳�调有�步骤。** `settings.onboarding` �是根作用域 list,但 `ui-settings` 会把其中��目的 id 和顺�投影到一个�调器中,并且�挂载第一个未完�的步骤。当�注册方会收到 `complete()` 和 `openSection(id)`;所有�转移�,�会挂载�续步骤。`ui-settings-models` 现在以顺� `-100` 注册���的欢迎声明,以顺� `0` 注册 DeepSeek �件�凭�步骤;两者当�的共用展示由[共用弹窗引导决策](2026-08-13-shared-modal-product-onboarding.md)�有。 -**�属于�一功能的产�引导由 `ui-settings-general` �有。** `src/onboarding-copy.ts` 是完整通知�「继续�按钮文案和 `WELCOME_NOTICE_VERSION` 的唯一�编辑��;GUI 支�的两� locale 都有�渲染�一份中文所有者文案。�行时 locale 字典从该文件派生欢迎文案,测试也导入�一个所有者,而���段�文本。该通知�存在于�览器 UI:它�会创建会�事件,也�会贡献任何模型��内容。通知说明会��测[默认�用](2026-08-10-telemetry-default-off.md),并列出 `FEEDBACK_ONLY` 和 `FULL` 两�显��用模�。 +**产�欢迎步骤按版本管�并归功能�件所有。** 该声明曾由[移除首次�动内测声明](../simplification/2026-08-13-remove-first-run-beta-notice.md)历�决策移除,现在以新的测试阶段文案��在 `ui-settings-models` 中。`ui-settings-general` ��注册任何引导步骤;�有当�两个步骤的�件也�有文案�store 和共用弹窗。 -**loopback 确认状�按 Harness profile �久化。** 宿主端在 user-settings seam 中注册 `ui-onboarding` 分节,并存入当� `$DSH_HOME/settings.yaml`。connection �件通过 `ctx.connection.isLoopback` 统一�布当�页�是�使用 loopback authority;hostname 判定留在 connection 包内,其他客户端�件�消费�务状�,而�导入其实现。除� `welcomeNoticeVersion` 与文案所有者文件中的常�精确相等,�则 loopback �览器会显示通知。「继续�会以当�版本执行一次路径�更,并且仅在宿主端�交�功�调用 `complete()`;写入失败时通知��打开,关闭页�或进程则�会写入任何内容。更新该常�会有��求�个 profile 对修订�的文案�新确认一次。� loopback �览器�能调用仅� loopback 的 settings API;它�显示�一通知,但显�点击「继续��会在当��览器进程中完�该步骤,�新加载或新进程会�次显示通知。 +**�久化的 `ui-onboarding` 分节�有确认状�。** 宿主端在 user-settings seam 中注册它,存入当� `$DSH_HOME/settings.yaml`;当�欢迎 store 通过既有公开 settings API 读写其中的 `welcomeNoticeVersion`。connection �件通过 `ctx.connection.isLoopback` 统一�布当�页�是�使用 loopback authority;hostname 判定留在 connection 包内,其他客户端�件�消费�务状�,而�导入其实现。API Proxy 在��置�供方 namespace 之外,通过�闭的�许列表暴露这一个产� namespace,�时�会把它的�更视为模型目录失效事件。 -**并� loopback 视图无需陈旧的整体替���收敛。** 确认写入有��略 `expectedRevision`:�个 loopback 标签页都��一路径写入相�版本,因此该�作是幂等的,并会�留�级字段,而�是�建整个分节。`settings/document-updated` 以失效通知形�到达客户端——当时� `host/settings-changed`,现在则是原样转�([转�的 Remote 事件](../architecture/2026-08-10-remote-event-delivery.md));�一个标签页或外部编辑器�交当�版本�,已挂载的 loopback 标签页会�新拉�状�并推进。API Proxy(`@deepseek-ai/dsh-host-apiproxy`)在��置�供方 namespace 之外,通过�闭的�许列表暴露这一个产� namespace,�时�会把它的�更视为模型目录失效事件。 - -**引导�程会暂时接管视�,形�一个连续阶段。** 纯色产�界�通过挂载到 `body` 的 portal �代完整的应用视图,并将底层应用根节点标记为 inert;严格符��求的�罩�挂载在该界��方,并�留 `position:absolute`�left/right/bottom �移�为零�`top:80px`�`rgba(0, 0, 0, 0.24)` 和 `backdrop-filter: blur(2px)`。欢迎页和按�件显示的凭�设置页在这一阶段中�次呈现,而�是�自作为独立的模�窗�。两个页�都�用 Web UI 的黑色 `BrandWordmark`。欢迎页在 `内测声明` 标题下�字�留既定的四段文案;所有段�统一采用 16/28 的正文字�与行高,�有最�一段中指定的行动语�使用较为克制的 500 字�。短暂的错���明度与纵��移动画�造出节�感,但�会阻�交互,并会在用户�用�少动�效果时�用。�始焦点�在标题上,「继续�是唯一按钮,且�存在关闭�Escape 或点击�罩的退出路径。 +**��引导使用�一个弹窗契约。** 当�两个步骤都通过 body portal 的�一个 `OnboardingModal` 渲染,且�在弹窗��期间把下层应用根节点设为 inert。步骤加载�有事实时,外壳�渲染任何包装。明确�作会移交�调器所有�;Escape 和点击�罩都�会确认或跳过步骤。 ## 曾考虑的替代方案 @@ -32,4 +30,4 @@ GUI 的凭�引导从 DeepSeek 专用的就绪状�检查开始,但内部测 ## �果 -全新 profile 始终会在�供方专用引导之�看到欢迎通知;凭�已��置时,�会跳过�续 DeepSeek 步骤。在 loopback 上,点击「继续���新加载�会�次显示已确认版本,更改文案所有者文件中的版本值会让通知�新出现,而确认�关闭窗��会改�下次�动。在� loopback 上,「继续�会在��起��护 settings 请求的情况下推进当�进程,�新加载则�次显示通知。针对性的 store 与 React 测试固化了两��久化模��精确版本比较�写入失败��一�作���关闭路径��调器顺��按�件移交 DeepSeek 步骤和 HMR(热模�替�)清�行为。真实 Chromium 场景会使用隔离的 harness 家目录�动�产��供的 Web 组�,验��罩的精确几何尺寸和计算样�,在确认��分别�新加载,继续进入凭�缺失设置�程,确认凭�已�置时确认版本�匹��会使通知�新出现,并检查�览器控制�。 +全新 profile 会先看到当�测试阶段声明;当没有任何�用�供方时,�看到�件� DeepSeek 密钥弹窗。定� store 与 React 测试固定精确版本确认��调器顺���件�移交�共用弹窗行为与 HMR 清�。真实 Chromium 场景会在隔离的 harness 家目录下�动已�布 Web 组�,验�两个弹窗,通过既有凭�边界写入密钥,并检查 secret 未进入 DOM�ARIA 或�览器控制�。 diff --git a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.i18n.yaml b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.i18n.yaml index 1a4d923540..b9a8b2e9c8 100644 --- a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md -2026-08-02-session-search-not-shipped-default.md: c1bfd7f8e354a4480c5635619514fe782ea71d2c -2026-08-02-session-search-not-shipped-default.zh.md: 9b80c549425c26055700480dd57f1a0a7d01e4a8 +2026-08-02-session-search-not-shipped-default.md: 60d1f424d5a9029a00b3f195d1f6e6baf2790d1e +2026-08-02-session-search-not-shipped-default.zh.md: 221613ae1aef93cd72734e4c328d822a88b64227 diff --git a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md index c1bfd7f8e3..60d1f424d5 100644 --- a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md +++ b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.md @@ -12,7 +12,7 @@ The [shipped-roster decision](2026-07-31-even-out-shipped-tool-rosters.md) made The shipped TUI, Web, and headless surfaces do not mount `@deepseek-ai/dsh-tool-session-query`, and no shipped agent preset carries it. The consumer stays opt-in exactly as the model-facing-session-query-tools note describes: the ACP example's [`session-query.cordis.yml`](../../../../examples/acp-agent/session-query.cordis.yml) and its snapshot counterpart remain the mounted reference, and a custom composition can mount the package with the timeout and spill policies. -The `ctx.sessionQuery` service itself stays mounted. `session-query-sqlite` remains a base row — the TUI's `session-reference` consumes it for `/resume` — and the Web overlay keeps patching it to an in-memory index for the browser content search. Only the model-facing consumer is removed. +The `ctx.sessionQuery` service itself stays mounted. `session-query-sqlite` remains a base row — the TUI's `session-reference` consumes it for `/resume` — with its full-text index off by default (`openAt: never`; the [content-search opt-in decision](../architecture/2026-08-13-session-content-search-opt-in.md)), and the Web overlay keeps its in-memory values for deployments that enable content search. Only the model-facing consumer is removed. ## Alternatives considered diff --git a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.zh.md b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.zh.md index 9b80c54942..221613ae1a 100644 --- a/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.zh.md +++ b/.agents/notes/implemented/feature/2026-08-02-session-search-not-shipped-default.zh.md @@ -12,7 +12,7 @@ Status: implemented 交付的 TUI�Web 与无头 surface ��挂载 `@deepseek-ai/dsh-tool-session-query`,交付的 agent preset 也都�包�它。该消费方��� opt-in,与��模型的会�查询工具决策所述完全一致:ACP(Agent Client Protocol)示例的 [`session-query.cordis.yml`](../../../../examples/acp-agent/session-query.cordis.yml) �其快照对侧文件�是挂载�考,自定义组�也�以连�超时与 spill 策略一起挂载该包。 -`ctx.sessionQuery` �务本身��挂载。`session-query-sqlite` �是 base 的一行,TUI 的 `session-reference` 消费它�实现 `/resume`,Web overlay 也继续把它 patch �内存索引,供�览器内容�索使用。被移除的�有��模型的消费方。 +`ctx.sessionQuery` �务本身��挂载。`session-query-sqlite` �是 base 的一行,TUI 的 `session-reference` 消费它�实现 `/resume`;其全文索引默认关闭(`openAt: never`,�[内容�索 opt-in 决策](../architecture/2026-08-13-session-content-search-opt-in.md)),Web overlay �留内存索引�值,供�用内容�索的部署使用。被移除的�有��模型的消费方。 ## 曾考虑的替代方案 diff --git a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml index c390d514a3..48773ba819 100644 --- a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md -2026-08-04-claude-code-and-codex-subagent-backends.md: ccc96d6c998c4ab958a7eea1e502d036d16ec90d -2026-08-04-claude-code-and-codex-subagent-backends.zh.md: 5facbe79e7afccd9eccddac046cd97a60b50d25a +2026-08-04-claude-code-and-codex-subagent-backends.md: 666945c4d8039874729a7f9da34d9cf82bfd479d +2026-08-04-claude-code-and-codex-subagent-backends.zh.md: 35b8dd51f1c45200a495c68f19f055a224123263 diff --git a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md index ccc96d6c99..666945c4d8 100644 --- a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md +++ b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md @@ -12,24 +12,25 @@ The product integrations must not become second owners for task text, cwd, cance ## Decision -The harness publishes two sibling one-shot provider packages: `codex` and `claude-code`. This note owns their product protocols, result mapping, and process lifecycle; the [shared-profile-host placement decision](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md) supersedes the original opt-in composition placement. Loading either provider starts no product process, and each tool accepts only a standalone text task; product selection and background execution are not model arguments. +The harness publishes two sibling one-shot provider packages: `codex` and `claude-code`. This note owns their product protocols, result mapping, and process lifecycle; the [production-install exclusion decision](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md) owns their explicit Profile installation and host-plane placement, and the [product one-shot background decision](2026-08-12-product-subagent-one-shot-background-tasks.md) owns the model-visible scheduling choice. Loading either provider starts no product process, and each tool accepts only a standalone text task; product selection remains deployment configuration. -Both providers report `inheritsParentContext: false`, advertise no optional start capabilities, and pass the parent Session cwd without copying the parent conversation. Their documented tools disable background execution and use `maxDepth: 'provider-managed'`, leaving recursion policy with the out-of-process product instead of sending a limit the provider cannot enforce. Every call creates a fresh product process and a non-resumable product conversation. The shared subagent service continues to own request resolution, lifecycle events, result settlement, and foreground collection; the shared subprocess service owns credential scrubbing, process-tree termination, and whole-tree exit observation. +Both providers report `inheritsParentContext: false`, advertise no optional start capabilities, and pass the parent Session cwd without copying the parent conversation. Their documented tools use `backgroundMode: 'one-shot'` and `maxDepth: 'provider-managed'`: the consumer keeps foreground collection as the default and may place the same run in the generic Job runtime, while recursion policy stays with the out-of-process product. Every call creates a fresh product process and a non-resumable product conversation. `ctx.subagents` owns named-request resolution and paired lifecycle events; `dsh-tool-subagent` owns model-visible scheduling and foreground-versus-Job adaptation; `ctx.jobs` and `dsh-tool-jobs` own Job ids, state, output, controls, notices, and parent-owner cancellation; each product provider owns native result mapping, while `dsh-subprocess` owns credential scrubbing, process-tree termination, and whole-tree exit observation. ```text -fixed tool → shared subagent service → product provider → official product process - � final answer / explicit error / cancellation � terminal product fact - → foreground disposal → shared process-tree termination → whole-tree exit +fixed tool -> dsh-tool-subagent -> ctx.subagents -> product provider -> product process + foreground <- final product outcome + background -> ctx.jobs / dsh-tool-jobs -> Job id / state / notice / controls + both -> provider disposal -> dsh-subprocess -> whole-tree exit ``` ### Ownership and lifecycle -| Phase | Shared owner | Product-specific responsibility | Observable result | +| Layer | Owner | Responsibility | Observable result | | --- | --- | --- | --- | -| Resolve | `dsh-tool-subagent` and `ctx.subagents` | Validate the product's text-only input and derive native startup parameters | Unsupported context or malformed input fails before a run is published | -| Start | `dsh-subprocess` owns every acquired process tree | Reach the smallest native point at which the product conversation and process can both be controlled | `start()` publishes one existing `SubagentRun`, or cleans up and rejects | -| Run | The product owns its native protocol facts; the holder owns their mapping | Submit exactly one task and derive an existing shared stop reason; Codex uses `max-tokens` only for explicit context exhaustion | The parent receives only a final answer or an explicit failure | -| Dispose | The foreground consumer requests release; `dsh-subprocess` proves exit | Close the native protocol and express any best-effort native cancellation | Disposal is idempotent and returns only after the whole process tree exits | +| Delegation lifecycle | `ctx.subagents` | Resolve the named provider request and pair lifecycle events around the published `SubagentRun` | Unsupported context or malformed input fails before a run is published; start and terminal events remain paired | +| Scheduling and adaptation | `dsh-tool-subagent` | Interpret `run_in_background`, choose foreground collection or one-shot Job registration, and map the shared stop reason | Foreground returns the product outcome; background returns a Job id after registration | +| Job state and control | `ctx.jobs` and `dsh-tool-jobs` | Own Job state, output, cancellation, owner cleanup, completion notices, and model-facing controls | The exact parent can collect, list, or stop background work and receives its completion notice | +| Native run and teardown | Product provider and `dsh-subprocess` | Produce one native result, close the product protocol, request best-effort native cancellation, and prove process-tree exit | Foreground return and Job settlement both wait for idempotent disposal and whole-tree exit | ## Codex provider @@ -59,7 +60,7 @@ The credentialed Claude Code e2e uses the official DeepSeek Claude Code contract ## Distribution and evidence -Each product owns branch-complete package tests, a required keyless real-product spec, a Loader composition e2e, and a credentialed DeepSeek e2e. The keyless product tier uses the exact official distribution under test, a non-empty fake product key, an isolated temporary workspace and product home, and a loopback fixed-answer model. Missing product requests, wrong authentication, altered task text, a non-exact answer, a skipped real product, or a surviving managed handle fails the required test. The Loader tier boots the README-shaped user configuration, verifies both fixed foreground-only tools in one context, and starts neither product process. The credentialed tier starts the same production provider and real product with a runtime-only key, requires a unique nonce from the fixed official DeepSeek service, and proves quiescence again; it self-skips only when a local operator supplied no key, while trusted CI preflights the secret. +Each product owns branch-complete package tests, a required keyless real-product spec, a Loader composition e2e, and a credentialed DeepSeek e2e. The keyless product tier uses the exact official distribution under test, a non-empty fake product key, an isolated temporary workspace and product home, and a loopback fixed-answer model. Missing product requests, wrong authentication, altered task text, a non-exact answer, a skipped real product, or a surviving managed handle fails the required test. The Loader tier boots the README-shaped explicit Profile configuration, verifies both fixed one-shot tools expose optional background scheduling alongside generic Job controls, and starts neither product process. The credentialed tier starts the same production provider and real product with a runtime-only key, requires a unique nonce from the fixed official DeepSeek service, and proves quiescence again; it self-skips only when a local operator supplied no key, while trusted CI preflights the secret. The Codex evidence pins `@openai/codex@0.147.0` and `codex-cli 0.147.0`. Its real-product spec observes the exact Bearer key, original task, byte-exact final answer, unattended command rejection with no file side effect, local cancellation, and whole-tree exit. Production still supplies `codex` on `PATH`. @@ -83,12 +84,12 @@ The project owner's distribution authorization is scoped to the official `@anthr **Plugin-managed login, product home, models, settings, or permissions.** Those choices would create another authority beside each product's native configuration and enlarge a one-shot provider into account management. The providers expose only an explicit environment overlay and teardown grace; unattended interaction fails closed. -**Continuation, progress, background collection, and shared parent context.** The delivered user result is one self-contained task and one final answer. Product sessions, resume, follow-up, intermediate messages, parent transcript transfer, structured output, and background collection need separate user contracts and are not prebuilt. +**Continuation, progress, product-native background state, and shared parent context.** The provider payload remains one final answer for one self-contained task. The generic Job layer may add its id, status, notice, collection, and cancellation results, but product sessions, resume, follow-up, intermediate messages, parent transcript transfer, structured output, and provider-specific background state need separate user contracts and are not prebuilt. ## Consequences -Users delegate through two stable foreground tools backed by the official product integrations. Their Profile placement and per-Preset exposure are owned by the [shared-host placement decision](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md); this note's provider lifecycle keeps native settings and behavior while shared services retain the sole ownership of task settlement and process-tree quiescence. +Users delegate through two stable one-shot tools backed by the official product integrations. Explicit Profile installation and host-plane provider placement are owned by the [production-install exclusion decision](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md); per-Preset tool exposure and foreground-default optional Job scheduling are owned by the [product one-shot background decision](2026-08-12-product-subagent-one-shot-background-tasks.md). This note's provider lifecycle keeps native settings and behavior while shared services retain the sole ownership of job settlement and process-tree quiescence. -Every delegation pays for a fresh product process and independent model context, and only final text reaches the parent. Product-native configuration makes behavior depend on the deployment's installed product, account state, and workspace settings. Credentialed e2e runs also spend external API quota and depend on the official DeepSeek endpoint; deterministic protocol, failure, cancellation, and approval coverage remains in the keyless tier. The providers do not resume sessions, stream progress, accept new human interaction, roll back tool or file side effects, or impose a wall-clock timeout. +Every delegation pays for a fresh product process and independent model context. The product payload reaching the parent is final text only; background scheduling additionally exposes generic Job ids, status, completion notices, and collection or cancellation results. Product-native configuration makes behavior depend on the deployment's installed product, account state, and workspace settings. Credentialed e2e runs also spend external API quota and depend on the official DeepSeek endpoint; deterministic protocol, failure, cancellation, and approval coverage remains in the keyless tier. The providers do not resume sessions, stream progress, accept new human interaction, roll back tool or file side effects, or impose a wall-clock timeout. Compatibility is pinned by package-level unit coverage, keyless real-product loopback tests, credentialed DeepSeek nonce tests, public Loader composition, built-package and NodeNext consumer checks, generated documentation and notices, and the repository CI matrix. A supported product or DeepSeek endpoint/model baseline change must refresh those facts; production performs no separate runtime version probe. diff --git a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md index 5facbe79e7..35b8dd51f1 100644 --- a/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md +++ b/.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.zh.md @@ -12,24 +12,25 @@ Status: implemented ## 决策 -harness 交付两个�级的一次性�供方包:`codex` 与 `claude-code`。本说明负责它们的产��议�结果映射和进程生命周期;[共享 profile 宿主归属决策](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md)�代原先由用户选择�用的组装�置。加载任一�供方都�会�动产�进程,而且�个工具�接�独立文本任务;产�选择与��执行都�作为模型�数。 +harness 交付两个�级的一次性�供方包:`codex` 与 `claude-code`。本说明负责它们的产��议�结果映射和进程生命周期;[生产安装排除决策](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md)负责显� Profile 安装与 host plane(宿主平�)放置,[产�一次性��任务决策](2026-08-12-product-subagent-one-shot-background-tasks.md)负责模型��的调度选择。加载任一�供方都�会�动产�进程,而且�个工具�接�独立文本任务;产�选择�属于部署�置。 -这两个�供方都报告 `inheritsParentContext: false`,�声明任何�选的�动能力,并传递父会� cwd,但�会�制父级对�。文档所示的工具会�用��执行,并使用 `maxDepth: 'provider-managed'`,将递归策略留给进程外产�,而�是���供方无法强制执行的�制。�次调用都会创建一个全新的产�进程和一次��续接的产�对�。共享 subagent �务继续负责请求解��生命周期事件�结果结算和��收集;共享�进程�务负责凭�清洗�进程树终止以�整棵进程树的退出观测。 +这两个�供方都报告 `inheritsParentContext: false`,�声明任何�选的�动能力,并传递父会� cwd,但�会�制父级对�。文档所示的工具使用 `backgroundMode: 'one-shot'` 与 `maxDepth: 'provider-managed'`:消费方默认在��收集结果,也�把�一次�行放入通用 Job �行时,而递归策略�由进程外产�负责。�次调用都会创建一个全新的产�进程和一次��续接的产�对�。`ctx.subagents` 负责具�请求解�与�对生命周期事件;`dsh-tool-subagent` 负责模型��的调度以���与 Job 适�;`ctx.jobs` 和 `dsh-tool-jobs` 负责 Job id�状��输出�控制�通知与父级 owner �消;�产��供方负责原生结果映射,`dsh-subprocess` 则负责凭�清洗�进程树终止以�整棵进程树的退出观测。 ```text -fixed tool → shared subagent service → product provider → official product process - � final answer / explicit error / cancellation � terminal product fact - → foreground disposal → shared process-tree termination → whole-tree exit +fixed tool -> dsh-tool-subagent -> ctx.subagents -> product provider -> product process + foreground <- final product outcome + background -> ctx.jobs / dsh-tool-jobs -> Job id / state / notice / controls + both -> provider disposal -> dsh-subprocess -> whole-tree exit ``` ### 归属与生命周期 -| 阶段 | 共享责任方 | 产�特定�责 | �观察结果 | +| 层级 | 责任方 | �责 | �观察结果 | | --- | --- | --- | --- | -| 解� | `dsh-tool-subagent` 与 `ctx.subagents` | 验�产�的纯文本输入并推导原生�动�数 | ��支�的上下文或格�错误的输入会在�布�行�报错 | -| �动 | `dsh-subprocess` 负责�棵已获�的进程树 | 到达能够�时控制产�对�与进程的最�原生控制点 | `start()` �布一个已存在的 `SubagentRun`,�则清��拒�调用 | -| �行 | 产�负责其原生�议事实;�有方负责映射这些事实 | ��交一项任务,并推导出一�现有的共享�止原因;Codex 仅在明确�生上下文耗尽时使用 `max-tokens` | 父级�会收到最终回答或明确失败 | -| dispose(资�释放) | ��消费方请求释放;`dsh-subprocess` �明进程已退出 | 关闭原生�议,并�出尽力而为的原生�消请求 | 释放�作具有幂等性,且仅在整棵进程树退出��返回 | +| 委派生命周期 | `ctx.subagents` | 解�具��供方请求,并为已�布的 `SubagentRun` �对生命周期事件 | ��支�的上下文或格�错误的输入会在�布�行�报错;�动与终�事件���对 | +| 调度与适� | `dsh-tool-subagent` | 解释 `run_in_background`,选择��收集或 one-shot Job 登记,并映射共享�止原因 | ��返回产�结果;��在登记完��返回 Job id | +| Job 状�与控制 | `ctx.jobs` 与 `dsh-tool-jobs` | 负责 Job 状��输出��消�owner 清��完�通知与��模型的控制工具 | 准确父级�以收集�列出或�止��工作,并收到完�通知 | +| 原生�行与清� | 产��供方与 `dsh-subprocess` | 产生一个原生结果�关闭产��议�请求尽力而为的原生�消,并�明进程树退出 | ��返回与 Job 结算都会等待幂等资�释放和整棵进程树退出 | ## Codex �供方 @@ -59,7 +60,7 @@ Codex 0.147.0 使用 Responses �议,而 DeepSeek 的公开 OpenAI 兼容端 ## 分�与�� -�个产�都负责覆盖所有分支的包测试�一项必跑的无密钥真实产�测试�一项 Loader 组� e2e 和一项带密钥 DeepSeek e2e。无密钥产�层级使用被测的确切官方�行版��空的伪产�密钥�隔离的临时工作区与产�主目录,以�能返回固定答案的回环模型。产�请求缺失�身份验�错误�任务文本被改动�答案�完全一致�真实产�被跳过或�管�柄�存活,都会使这项必跑测试失败。Loader 层级会�动 README 所示形�的用户�置,在�一个上下文中验�两个固定且�支���执行的工具,并且�会�动任何产�进程。带密钥层级会使用仅在�行时�供的密钥�动�一生产�供方与真实产�,�求从固定的 DeepSeek 官方�务�得唯一�机数,并�次�明完全�稳;仅当本地�作者未�供密钥时�会自行跳过,而�信任的 CI 会预检该 secret。 +�个产�都负责覆盖所有分支的包测试�一项必跑的无密钥真实产�测试�一项 Loader 组� e2e 和一项带密钥 DeepSeek e2e。无密钥产�层级使用被测的确切官方�行版��空的伪产�密钥�隔离的临时工作区与产�主目录,以�能返回固定答案的回环模型。产�请求缺失�身份验�错误�任务文本被改动�答案�完全一致�真实产�被跳过或�管�柄�存活,都会使这项必跑测试失败。Loader 层级会�动 README 所示的显� Profile �置,在�一个上下文中验�两个固定一次性工具会与通用 Job 控制工具一起公开�选��调度,而且�会�动任何产�进程。带密钥层级会使用仅在�行时�供的密钥�动�一生产�供方与真实产�,�求从固定的 DeepSeek 官方�务�得唯一�机数,并�次�明完全�稳;仅当本地�作者未�供密钥时�会自行跳过,而�信任的 CI 会预检该 secret。 Codex ���定 `@openai/codex@0.147.0` 与 `codex-cli 0.147.0`。其真实产�测试会观测确切的 Bearer 密钥�原始任务��字节完全一致的最终回答��会产生文件副作用的无人值守命令拒��本地�消以�整棵进程树退出。生产环境��供 `codex`,并通过 `PATH` 解�。 @@ -83,12 +84,12 @@ Claude Code ���定 Agent SDK 0.3.220,并使用 SDK 按平�分�的 Cl **由�件管�登录�产�主目录�模型�设置或��。** 这些选择会在�个产�的原生�置之外建立�一套����,并将一次性�供方扩张为账户管�功能。�供方�公开显�环境覆盖项和清�宽�期;无人值守交互会以默认拒�方�失败。 -**续接�进度���收集和共享父级上下文。** 已交付的用户结果是一项自包�任务和一个最终回答。产�会������续交互�中间消��父级 transcript(文本记录)传递�结构化输出和��收集都需�独立的用户约定,当�实现�会预先构建这些功能。 +**续接�进度�产�原生��状�和共享父级上下文。** �供方载��是一项自包�任务的一个最终回答。通用 Job 层�以�外�供 id�状��通知�收集与�消结果,但产�会������续交互�中间消��父级 transcript(文本记录)传递�结构化输出和�供方专属��状�都需�独立的用户约定,当�实现�会预先构建这些功能。 ## �果 -用户通过官方产�集�支�的两个稳定��工具进行委派。它们在 Profile 中的归属和按 Preset 暴露方�由[共享宿主归属决策](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md)负责;本说明规定的�供方生命周期会�留原生设置与行为,而共享�务继续独�任务结算与进程树完全�稳的责任。 +用户通过官方产�集�支�的两个稳定一次性工具进行委派。显� Profile 安装与 host plane �供方放置由[生产安装排除决策](../simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md)负责;按 Preset 暴露工具以�默认��且�选通用 Job 的调度方�由[产�一次性��任务决策](2026-08-12-product-subagent-one-shot-background-tasks.md)负责。本说明规定的�供方生命周期会�留原生设置与行为,而共享�务继续独�作业结算与进程树完全�稳的责任。 -�次委派都�承担新建产�进程和独立模型上下文的开销,且�有最终文本会到达父级。产�原生�置使行为�决于部署环境中安装的产��账户状�和工作区设置。带密钥 e2e �行还会消耗外部 API ��,并�赖 DeepSeek 官方端点;对�议�失败��消与审批的确定性覆盖�由无密钥层级承担。�供方�会��会��以��方�传�进度�接�新的人工交互�回滚工具或文件副作用,也�会施加按实际�过时间触�的超时。 +�次委派都�承担新建产�进程和独立模型上下文的开销。到达父级的产�载���有最终文本;��调度还会�外公开通用 Job id�状��完�通知以�收集或�消结果。产�原生�置使行为�决于部署环境中安装的产��账户状�和工作区设置。带密钥 e2e �行还会消耗外部 API ��,并�赖 DeepSeek 官方端点;对�议�失败��消与审批的确定性覆盖�由无密钥层级承担。�供方�会��会��以��方�传�进度�接�新的人工交互�回滚工具或文件副作用,也�会施加按实际�过时间触�的超时。 兼容性由包级�元测试覆盖率�无密钥真实产�回环测试�带密钥 DeepSeek �机数测试�公开 Loader 组��已构建包与 NodeNext 消费方检查�生�的文档与声明以�仓库 CI 矩阵共��定。更改�支�的产�基线或 DeepSeek 端点�模型基线时必须刷新这些事实;生产环境�会�行执行�行时版本探测。 diff --git a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml index be70f91180..5a4552f5d0 100644 --- a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md -2026-08-10-telemetry-default-off.md: a4f0099565bb240cf62774fab2d5ad5f7de90e95 -2026-08-10-telemetry-default-off.zh.md: 8e2544eb7dee8b9bd6b8a4c81a28a8a03d3404d4 +2026-08-10-telemetry-default-off.md: 3f56817c9c23ec55f2173b66fa915ab05646b2a7 +2026-08-10-telemetry-default-off.zh.md: aa7b640f292713aa4e598f5ea1194f806dd6ae0d diff --git a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md index a4f0099565..3f56817c9c 100644 --- a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md +++ b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md @@ -14,7 +14,7 @@ Both feeds use `DSH_TELEMETRY_MODE` as their positive consent setting. Unset and The dsh-sdk launcher reads the same variable without parsing `cordis.yml` or booting Cordis. `FULL` permits reporting; `FEEDBACK_ONLY`, `DISABLED`, unset, and empty values deny it. Consent is frozen from the launching environment before the command runs, because `dsh-sdk start` loads a project `.env` and project code can mutate `process.env`: resolving afterwards would let a project grant reporting of its own configuration, which the [configuration source ownership decision](../architecture/2026-08-04-configuration-source-ownership.md) denies for the whole `DSH_*` namespace. An unsupported mode denies rather than throwing at that boundary, since telemetry may never change a command's result. This rule superseded the default-on launcher consent before the launcher and its proposal were deleted by the [SDK project toolchain removal](../simplification/2026-08-11-remove-sdk-project-toolchain.md). -The versioned Web welcome notice states that Session Log upload is off by default, names `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` and `DSH_TELEMETRY_MODE=FULL` as the two opt-in choices, and discloses that `FULL` also enables dsh-sdk command telemetry. Its version changes with that material privacy statement so every profile acknowledges the current copy. +The [CLI reference README](../../../../apps/cli/reference/README.md) documents the deployment stance: Session Log upload is off by default, `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` and `DSH_TELEMETRY_MODE=FULL` are the two opt-in choices, and explicitly enabled exports can contain complete session content. The restored [testing-stage onboarding notice](2026-08-13-shared-modal-product-onboarding.md) contains no telemetry copy, so the product still presents no prompt about enabling upload. ## Alternatives considered diff --git a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md index 8e2544eb7d..aa7b640f29 100644 --- a/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md +++ b/.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.zh.md @@ -14,7 +14,7 @@ DeepSeek Harness 有两路出站�测数��。在内测阶段,共享基础 dsh-sdk �动器读��一��,�解� `cordis.yml`,也��动 Cordis。`FULL` �许上报;`FEEDBACK_ONLY`�`DISABLED`�未设置和空值都会拒�。授�在命令执行�从�动环境冻结:`dsh-sdk start` 会加载项目 `.env`,项目代�也能修改 `process.env`,若在执行�解�,项目便能自行授�上报其自身�置,而[�置��所有�决策](../architecture/2026-08-04-configuration-source-ownership.md)对整个 `DSH_*` 命�空间�止这�行为。在该边界上,��支�的模�按拒�处�而�抛出,因为�测�得改�命令结果。此规则在�动器�其�案被[SDK 项目工具链移除决策](../simplification/2026-08-11-remove-sdk-project-toolchain.md)删除之�,仅�代了�动器默认�许上报的规则。 -带版本的 Web 欢迎通知说明会�日志上传默认关闭,将 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 和 `DSH_TELEMETRY_MODE=FULL` 列为两�显��用选项,并披露 `FULL` �时会�用 dsh-sdk 命令�测。其版本�这项��的��声明一��更,使�个 profile 都确认当�文案。 +[CLI reference README](../../../../apps/cli/reference/README.md) 记录了这一部署�径:会�日志上传默认关闭,`DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 和 `DSH_TELEMETRY_MODE=FULL` 是两�显��用选项,显�开��的导出�能包�完整会�内容。���的[测试阶段引导声明](2026-08-13-shared-modal-product-onboarding.md)�包��测文案,因此产����供任何关于开�上传的�示。 ## 考虑过的替代方案 diff --git a/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.i18n.yaml b/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.i18n.yaml index 8a9e7a0bda..6b4b469aba 100644 --- a/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.md -2026-08-10-web-plugin-configuration.md: bdb5a3cbddabb516a0921abc00f1be97be4d17d7 -2026-08-10-web-plugin-configuration.zh.md: ed8ced71ed50063f9b1702ff2a6601271712f910 +2026-08-10-web-plugin-configuration.md: 218d5ed4536c489f89cb53c62c457a988e451b7e +2026-08-10-web-plugin-configuration.zh.md: 999e785699741084e1e230c4a240a0605491cb04 diff --git a/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.md b/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.md index bdb5a3cbdd..218d5ed453 100644 --- a/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.md +++ b/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.md @@ -4,6 +4,8 @@ Status: implemented English | [中文](2026-08-10-web-plugin-configuration.zh.md) +> The three sections, the layering, and the staged-save form remain current. The Host allowlist and the unkeyed card list are superseded by the [plugin-owned settings surface](../architecture/2026-08-12-plugin-owned-settings-surface.md): every registered namespace is served, and cards are keyed on the namespace they edit. + ## Problem Everything a plugin can be configured with lived in `cordis.yml`. A user who wanted a longer shell timeout, a different search endpoint, or fewer parallel tool calls had to find the composition file, know its shape, and restart — while the Models page had shown for months that a settings namespace can be edited from the browser and take effect immediately. diff --git a/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.zh.md b/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.zh.md index ed8ced71ed..999e785699 100644 --- a/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.zh.md +++ b/.agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.zh.md @@ -4,6 +4,8 @@ Status: implemented [English](2026-08-10-web-plugin-configuration.md) | 中文 +> 三个分节�分层解�与暂存�存表��然有效。Host 白��与无键�片列表已被[由�件自己拥有的设置表层](../architecture/2026-08-12-plugin-owned-settings-surface.md)�代:�一个已注册的命�空间都被�务,�片以它所编辑的命�空间为键。 + ## 问题 �件的一切��置项都�存在于 `cordis.yml`。想�更长的 shell 超时���的�索端点或更少的并行工具调用,用户必须找到组装文件�了解它的形状,然���——而 Models 页几个月�一直在�明:settings 命�空间�以在�览器里编辑并立�生效。 diff --git a/.agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.i18n.yaml b/.agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.i18n.yaml new file mode 100644 index 0000000000..e403530fec --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.md +2026-08-11-collapsible-ask-user-question-card.md: 5c7e62749e63a6042285b79751c400ba09038b49 +2026-08-11-collapsible-ask-user-question-card.zh.md: 5f4b5851e4b595e634841bf87827db70fe928afb diff --git a/.agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.md b/.agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.md new file mode 100644 index 0000000000..5c7e62749e --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.md @@ -0,0 +1,32 @@ +# Agent Note: Collapsible Ask-User Question Card + +Status: implemented + +English | [中文](2026-08-11-collapsible-ask-user-question-card.zh.md) + +## Problem + +`dsh`'s ask-user takeover renders the pending question set as a bottom card capped at `min(60vh, 520px)`, so a long batch or a user who wants to re-read the conversation above before deciding has no way to reduce the card — the conversation above becomes hard to read because only a few lines peek out at the top. + +## Decision + +Add a minimize/maximize toggle to the question card header, next to the existing dismiss action. Collapsing hides the option body and the footer actions, leaving a header strip (eyebrow, title, both icon buttons) so the user still sees that a question is pending; expanding restores the full card. + +- State lives in `QuestionFlow` local state (`minimized`), so drafts and the current question index survive collapse/expand — nothing is re-derived or reset, and the answers already picked remain submit-ready. +- The toggle is a plain `IconChevronDownOutline14` / `IconChevronUpOutline14` pair on the existing 24px icon-button grid; `aria-expanded` reflects the card state and the label flips between `nav.minimize` / `nav.maximize` (the collapsed button reads "expand" for screen readers). +- While minimized the option body and footer are unmounted (`{!minimized && ...}`), so no hidden interactive surface remains in the a11y tree. +- The collapse button is disabled while a submit/cancel is in flight (`busy !== null`), matching the dismiss button's existing guard. +- CSS: `.cardMinimized` drops the `max-height` cap and hides `.body` / `.footer`; `.header` gains bottom padding so the strip is not cramped. +- Scope: only the generic question flow (`QuestionFlow`) gets the toggle. The plan-review card (`PlanReviewPanel`) is a different shape (one decision over one plan) and keeps its current layout. + +## Consequences + +- Users can shrink the question card to read the conversation, then expand to answer — drafts and position are preserved because the state lives in the flow component, not in the DOM. +- The minimize action is visually adjacent to dismiss; both share the icon button style, so the header stays balanced. +- Product copy additions are confined to the `question` locale namespace (`nav.minimize` / `nav.maximize`), paired zh/en per the dictionary contract. + +## Alternatives considered + +- **Auto-collapse on scroll**: collapsing the card when the user scrolls the conversation would reclaim space without a button, but it fights the user mid-interaction and hides the pending-question signal unexpectedly; an explicit toggle keeps the decision with the user. +- **Resizable card**: a drag handle would let users size the card freely, but it is more machinery than the ask needs and does not address "I want the card out of the way entirely". +- **Persisting the collapsed state per session**: nice-to-have, but the ask is per-interaction; persisting adds storage and sync complexity without a clear win for this surface. diff --git a/.agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.zh.md b/.agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.zh.md new file mode 100644 index 0000000000..5f4b5851e4 --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-11-collapsible-ask-user-question-card.zh.md @@ -0,0 +1,32 @@ +# Agent Note: �收起的�问�片 + +Status: implemented + +[English](2026-08-11-collapsible-ask-user-question-card.md) | 中文 + +## Problem + +`dsh` 的 ask-user 接管界�把待回答的问题组渲染为底部�片,高度上�为 `min(60vh, 520px)`;当问题批次较长�或用户想先阅读上方的会�记录�决定时,�片会�满大部分视�且无法缩�——上方会�几乎被��,�能看到顶部几行。 + +## Decision + +在�问�片头部(现有的"放弃整组问题"按钮�)增加收起/展开切�按钮。收起时��选项主体和底部�作区,��留一�头部(eyebrow�标题�两个图标按钮),用户�能看到"有未答问题"的信�;展开���完整�片。 + +- 状�存放在 `QuestionFlow` 的本地 state(`minimized`),因此收起/展开�会丢失�稿和当�题目索引——已选答案��直接�交。 +- 切�按钮使用 `IconChevronDownOutline14` / `IconChevronUpOutline14`,�用现有 24px 图标按钮网格;`aria-expanded` �映�片状�,文案在 `nav.minimize` / `nav.maximize` 之间切�(收起�按钮对读�器显示为"展开")。 +- 收起时选项主体和底部通过 `{!minimized && ...}` �载,a11y 树中�残留��的�交互�。 +- �交/�消进行中(`busy !== null`)时收起按钮�用,与现有放弃按钮的守�一致。 +- CSS:`.cardMinimized` 去掉 `max-height` 上�并�� `.body` / `.footer`;`.header` 增加底部 padding,��折��过于局促。 +- 范围:�有通用�问�(`QuestionFlow`)获得该切�。计划评审�片(`PlanReviewPanel`)是�一�形�(对一个计划�一次决策),��现有布局。 + +## Consequences + +- 用户�以缩��问�片以阅读会�,�展开作答——�稿和�置因状�存放在�程组件中而得以�留。 +- 收起动作紧邻放弃按钮,二者共用图标按钮样�,头部��平衡。 +- 新增产�文案仅�在 `question` locale 命�空间(`nav.minimize` / `nav.maximize`),按字典契约中英�对。 + +## Alternatives considered + +- **滚动时自动收起**:用户滚动会�时自动折��片�以�空间,但会在交互中途与用户对抗,并�外��"待答问题"信�;显�切�把决定�交给用户。 +- **�拖拽调整大�**:拖拽手柄让用户自由调整�片大�,但比需求所需的机制更��,也没有解决"让�片完全让开"的诉求。 +- **按会��久化折�状�**:锦上添花,但�问是�次交互;�久化引入存储与�步��度,对这个界�没有明确收益。 diff --git a/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.i18n.yaml b/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.i18n.yaml index 8133a3f08a..2907d9c241 100644 --- a/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.i18n.yaml +++ b/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.md -2026-08-11-minimal-profiles-bare-two-tool-runtime.md: 92d00a77de3e378abccc2ea67ba38a0cc76e0eca -2026-08-11-minimal-profiles-bare-two-tool-runtime.zh.md: 1528b241436171145839240c7415ef18acab337f +2026-08-11-minimal-profiles-bare-two-tool-runtime.md: 2f26dda5ddc905076dbc2f6c681f462973bde793 +2026-08-11-minimal-profiles-bare-two-tool-runtime.zh.md: ffdd8f0ddb86535468dbcb4384a6ba18c97b7124 diff --git a/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.md b/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.md index 92d00a77de..2f26dda5dd 100644 --- a/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.md +++ b/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.md @@ -12,7 +12,7 @@ The two launch paths also have different configuration owners. Web mounts a per- ## Decision -Both shipped minimal profiles expose exactly persistent `bash` and `str_replace_editor`, mount no context-compaction provider, and run the editor against `@deepseek-ai/dsh-fs-local`. The Web preset isolates `ctx.fs` inside the agent entry and mounts `fs-local` beside the editor, so other Web agents retain the host filesystem provider. Its persona remains the fixed complete prompt owned by the earlier [minimal-preset composition decision](../bug-fix/2026-08-10-minimal-preset-owns-rl-composition.md). +Both shipped minimal profiles expose exactly persistent `bash` and `str_replace_editor`, mount no context-compaction provider, suppress every `dsh-system-prompt` runtime-context contribution for fresh sessions, and run the editor against `@deepseek-ai/dsh-fs-local`. The Web preset isolates `ctx.fs` inside the agent entry and mounts `fs-local` beside the editor, so other Web agents retain the host filesystem provider. Its persona remains the fixed complete prompt owned by the earlier [minimal-preset composition decision](../bug-fix/2026-08-10-minimal-preset-owns-rl-composition.md) and applies runtime-context suppression only to that agent scope. The standalone spine forwards the same setting to its process-owned system-prompt service. Sandbox and approval services remain mounted and enforce their policies; only their model-facing dynamic context is absent. The standalone [`minimal.cordis.yml`](../../../../examples/jsonrpc-agent/minimal.cordis.yml) remains a complete JSON-RPC process composition. It mounts `dsh-sdk-jsonrpc-server`, the local PTY and subprocess services required by persistent Bash, `fs-local`, the two tool consumers, and uncompressed JSONL persistence. It does not mount `token-meter`, `compaction-basic`, `fs-sandbox`, or `fs-observation-policy`. Persistent Bash still consumes the deployment's danger-full-access sandbox policy; the editor is not confined by that policy. @@ -20,9 +20,9 @@ The standalone [`minimal.cordis.yml`](../../../../examples/jsonrpc-agent/minimal ## Verification -The Web replay boots the complete Web host, creates the agent through the preset service, and asserts that the scoped filesystem is bare, no scoped compaction service exists, and the assembled request contains exactly the fixed prompt and two tools. It then executes persistent Bash and the editor against the real scoped services. +The Web replay boots the complete Web host, creates the agent through the preset service, and asserts that the scoped filesystem is bare, no scoped compaction service exists, no system-prompt-owned runtime-context message was appended, and the assembled request contains exactly the fixed prompt and two tools. It then executes persistent Bash and the editor against the real scoped services. -The SDK replay boots the real JSON-RPC agent process through the SDK client, injects an environment-selected prompt, asserts the assembled prompt and exact two-tool catalog, and executes both tools. Python SDK bundled-runtime coverage initializes the standalone configuration through each available packaged carrier with environment-selected model, model capacity, and prompt values. Cordis validation checks that both configurations resolve their declared plugins and configuration fields. +The SDK replay boots the real JSON-RPC agent process through the SDK client, injects an environment-selected prompt, asserts the assembled prompt, exact two-tool catalog, and absence of every system-prompt-owned runtime-context message, and executes both tools. Python SDK bundled-runtime coverage initializes the standalone configuration through each available packaged carrier with environment-selected model, model capacity, and prompt values. Cordis validation checks that both configurations resolve their declared plugins and configuration fields. ## Alternatives considered @@ -36,4 +36,4 @@ The SDK replay boots the real JSON-RPC agent process through the SDK client, inj ## Consequences -Minimal sessions never summarize or replace earlier history; callers must keep turns within the selected model's context capacity. The editor can address any absolute path visible to the runtime process, independently of the persistent shell's sandbox policy. The two launch paths share their model-facing tool and no-compaction guarantees while retaining different prompt and model configuration appropriate to their owners. The Python SDK path continues to communicate only through the bundled stdio JSON-RPC runtime. +Minimal sessions never summarize or replace earlier history and never add a runtime-context snapshot; callers must keep turns within the selected model's context capacity and must not rely on model-visible narration of standing sandbox or approval policy. The editor can address any absolute path visible to the runtime process, independently of the persistent shell's sandbox policy. The two launch paths share their model-facing tool, no-context, and no-compaction guarantees while retaining different prompt and model configuration appropriate to their owners. The Python SDK path continues to communicate only through the bundled stdio JSON-RPC runtime. diff --git a/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.zh.md b/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.zh.md index 1528b24143..ffdd8f0ddb 100644 --- a/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.zh.md +++ b/.agents/notes/implemented/feature/2026-08-11-minimal-profiles-bare-two-tool-runtime.zh.md @@ -12,7 +12,7 @@ Web `minimal` preset 与独立 JSON-RPC minimal 组�对外�供�久 `bash` ## 决策 -两��附 minimal profile 都�对外�供�久 `bash` 与 `str_replace_editor`,�挂载上下文压缩�供方,并让编辑器使用 `@deepseek-ai/dsh-fs-local`。Web preset 在 agent entry 内隔离 `ctx.fs`,将 `fs-local` 与编辑器一起挂载,因此其他 Web agent �使用宿主文件系统�供方。其 persona 继续采用较早的 [minimal preset 组�决策](../bug-fix/2026-08-10-minimal-preset-owns-rl-composition.md)所拥有的固定 complete �示�。 +两��附 minimal profile 都�对外�供�久 `bash` 与 `str_replace_editor`,�挂载上下文压缩�供方,为新建会�抑制�个 `dsh-system-prompt` runtime-context 贡献,并让编辑器使用 `@deepseek-ai/dsh-fs-local`。Web preset 在 agent entry 内隔离 `ctx.fs`,将 `fs-local` 与编辑器一起挂载,因此其他 Web agent �使用宿主文件系统�供方。其 persona 继续采用较早的 [minimal preset 组�决策](../bug-fix/2026-08-10-minimal-preset-owns-rl-composition.md)所拥有的固定 complete �示�,并仅为该 agent 作用域实施 runtime-context 抑制。独立 spine 将�一设置转�给其进程拥有的 system-prompt �务。沙箱与批准�务���挂载并强制其策略;�有它们��模型的动�上下文缺席。 独立的 [`minimal.cordis.yml`](../../../../examples/jsonrpc-agent/minimal.cordis.yml) �是完整的 JSON-RPC 进程组�。它挂载 `dsh-sdk-jsonrpc-server`��久 Bash 所需的本地 PTY 和�进程�务�`fs-local`�两个工具消费方,以�未压缩的 JSONL �久化。它�挂载 `token-meter`�`compaction-basic`�`fs-sandbox` 或 `fs-observation-policy`。�久 Bash �消费部署的 danger-full-access 沙箱策略;编辑器��该策略�制。 @@ -20,9 +20,9 @@ Web `minimal` preset 与独立 JSON-RPC minimal 组�对外�供�久 `bash` ## 验� -Web 回放会�动完整 Web 宿主,通过 preset �务创建 agent,并断言作用域文件系统为裸�端��存在作用域压缩�务,而且组装请求�包�固定�示�与两个工具。��,它通过真实作用域�务执行�久 Bash 和编辑器。 +Web 回放会�动完整 Web 宿主,通过 preset �务创建 agent,并断言作用域文件系统为裸�端��存在作用域压缩�务�没有追加 system-prompt 拥有的 runtime-context 消�,而且组装请求�包�固定�示�与两个工具。��,它通过真实作用域�务执行�久 Bash 和编辑器。 -SDK 回放通过 SDK 客户端�动真实 JSON-RPC agent 进程,注入由环境选择的�示�,断言组装�示�与精确�工具目录,并执行两个工具。Python SDK 内置�行时覆盖会通过���用的打包载体,使用环境选择的模型�模型容�和�示�值�始化独立�置。Cordis 校验会检查两份�置能�解�声明的�件和�置字段。 +SDK 回放通过 SDK 客户端�动真实 JSON-RPC agent 进程,注入由环境选择的�示�,断言组装�示�与精确�工具目录,�外断言�存在任何 system-prompt 拥有的 runtime-context 消�,并执行两个工具。Python SDK 内置�行时覆盖会通过���用的打包载体,使用环境选择的模型�模型容�和�示�值�始化独立�置。Cordis 校验会检查两份�置能�解�声明的�件和�置字段。 ## 考虑过的替代方案 @@ -36,4 +36,4 @@ SDK 回放通过 SDK 客户端�动真实 JSON-RPC agent 进程,注入由环 ## �果 -Minimal 会��会摘�或替�较早历�;调用方必须让会�轮次��在所选模型的上下文容�内。编辑器�以访问�行时进程��的任何�对路径,且���久 shell 沙箱策略影�。两��动路径共享��模型的工具与无压缩��,�时�留适��自所有者的���示�和模型�置。Python SDK 路径继续仅通过内置 stdio JSON-RPC �行时通信。 +Minimal 会��会摘�或替�较早历�,也�会添加 runtime-context 快照;调用方必须让会�轮次��在所选模型的上下文容�内,且�得�赖模型��的常驻沙箱或批准策略说明。编辑器�以访问�行时进程��的任何�对路径,且���久 shell 沙箱策略影�。两��动路径共享��模型的工具�无上下文与无压缩��,�时�留适��自所有者的���示�和模型�置。Python SDK 路径继续仅通过内置 stdio JSON-RPC �行时通信。 diff --git a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml new file mode 100644 index 0000000000..2310e148a0 --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md +2026-08-12-product-subagent-one-shot-background-tasks.md: b8865cf94852396c32dd6da996bc9f5c2c7d806b +2026-08-12-product-subagent-one-shot-background-tasks.zh.md: bbc18ebb6cf0de1b04f0c2a10ddf51cea282c24e diff --git a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md new file mode 100644 index 0000000000..b8865cf948 --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.md @@ -0,0 +1,70 @@ +# Agent Note: Product one-shot subagents use generic background Jobs + +Status: implemented + +English | [中文](2026-08-12-product-subagent-one-shot-background-tasks.zh.md) + +## Problem + +The Codex and Claude Code providers already run one self-contained task and return one final answer, while `dsh-tool-subagent` already adapts any one-shot provider to the generic background Job runtime. The shipped product-tool rows disabled that route, so an agent could only wait for the product answer even when the delegation was independent of its next action. + +Exposing background execution must not add a product session, product-specific job state, another cancellation owner, or another result protocol. The same provider run must remain responsible for one native process or query and one final answer, while the existing Job registry remains responsible for ids, collection, cancellation, owner cleanup, and completion notices. + +## Decision + +Production `dsh` does not install the optional product providers. A Profile that opts in installs and mounts `dsh-subagent-codex`, `dsh-subagent-claude-code`, or both once on the host plane. The `standard`, `code`, and `cordis` Agent Presets configure the corresponding dormant tool rows with `backgroundMode: one-shot`; removing a row's `disabled` field exposes the existing optional `run_in_background` argument to agents composed from that preset. Omission or `false` waits in the foreground; explicit `true` returns a parent-owned Job id after synchronous Job preflight and registration, without waiting for provider startup or completion. + +The [generic one-shot background adapter](2026-07-08-background-subagent-tasks.md) owns background registration and settlement. It starts the same [`SubagentRun`](2026-06-21-subagent-capability-seam.md), uses a Job-owned cancellation signal across provider startup and execution, waits for `run.result` and `run.dispose()`, maps the terminal result into the Job, and lets `job_output`, `job_list`, `job_kill`, and the existing completion notice expose that state. The [product provider decision](2026-08-04-claude-code-and-codex-subagent-backends.md) continues to own native protocols, answer selection, local cancellation, and process-tree quiescence. + +No provider configuration, service interface, event, wire field, persistence format, or product identifier is added. Foreground and background differ only in which existing consumer waits for the same one-shot run. + +### Ownership and lifecycle + +```text +product tool call + -> omitted / false: tool call waits -> final answer or error -> run disposal + -> true: Job preflight + owner cleanup + -> starter begins provider startup under Job-owned signal + -> Job record/id published and returned (startup remains pending) + -> provider result + run disposal -> Job settlement + notice + -> job_output reads / job_kill cancels + -> parent disposal: Job owner cleanup cancels -> run disposal -> process exit +``` + +| Fact or resource | Owner | Product-tool responsibility | Observable result | +| --- | --- | --- | --- | +| Product provider installation and registration | Explicit Profile | Install the optional provider package and mount it once on the host plane | The provider name is available without adding its package to every production `dsh` install | +| Product selection and exposure | Agent Preset | Bind one fixed tool name to one fixed provider | Enabling one row exposes only that product tool | +| Foreground or background choice | `dsh-tool-subagent` | Resolve `run_in_background` under `one-shot` policy | Omission is foreground; explicit `true` returns a Job id | +| Job id, state, output, cancellation, and notice | `ctx.jobs` and `dsh-tool-jobs` | Register and present the existing one-shot run | Generic job tools collect or stop the run for the exact parent | +| Native answer and process quiescence | Product provider and `dsh-subprocess` | Produce one final result and release one process tree | Job settlement and foreground return both wait for disposal | + +## Published composition + +The production base keeps both optional product providers out of its dependency closure. An opting-in Profile installs and mounts either or both providers once on the host plane. Each full preset keeps both product-tool rows disabled and contributes the generic Job controls to its own agent scope, while the base host owns the shared Job registry. A user copies a preset and removes `disabled` from the matching product rows after the Profile provider is present; no product process starts during composition. + +A standalone custom composition that enables one-shot background execution must provide the product provider plus the complete generic Job capability: `dsh-jobs-local` as the Job provider and `dsh-tool-jobs` as the model-facing consumer. A Profile based on `dsh-base` already has the Job capability and adds only the optional product provider before enabling the preset tool row. A product tool without the Job runtime can still execute in the foreground, but an explicit background request fails the existing Job preflight instead of publishing an uncollectable id. + +The ACP product compositions use the same fixed product rows and generic job controls. Their keyless schema snapshots expose `description`, `prompt`, and optional `run_in_background` for each enabled product tool without invoking Codex, Claude Code, or an external model. + +## Verification + +The Web composition test explicitly mounts both optional providers from the repository examples dependency anchor, then boots four user-preset variants—neither product, Codex, Claude Code, and both—and checks that each enabled product tool exposes `run_in_background` alongside `job_output`, `job_list`, and `job_kill`. The two package-owned Loader compositions run with an empty `PATH`, inspect the same schemas and controls, and prove that explicit provider loading starts no product process. ACP keyless snapshots pin the assembled explicit product schemas, while the existing `dsh-tool-subagent` and job suites pin foreground defaulting, Job registration, final-output collection, cancellation, completion notices, owner disposal, and provider disposal. + +## Alternatives considered + +**Keep the product tools foreground-only.** This preserves the smallest schema but prevents agents from scheduling independent product work even though the generic one-shot Job adapter already owns the required lifecycle. + +**Make product delegations background by default.** A one-shot Job requires later collection, unlike a continuable child with its own durable conversation id and settlement delivery. Foreground remains the compatible default, and background remains an explicit scheduling choice. + +**Use Codex or Claude Code native session state as the background owner.** That would create provider-specific ids, status, cancellation, and recovery semantics beside the generic Job registry. The providers remain one-shot result producers and keep native ids private. + +**Add product-specific output, wait, or kill tools.** Separate controls would duplicate the generic job protocol and teach a different collection workflow for each provider. The existing `job_*` tools already cover the required operations. + +**Add continuable product sessions at the same time.** Resume, follow-up, progress, and persisted product sessions require new product contracts and lifecycle ownership. This decision exposes only the already implemented one-shot background route. + +## Consequences + +Agents can continue useful work while Codex or Claude Code handles an independent one-shot task, then collect the final answer or cancel it through the same Job controls used by other background producers. Foreground callers retain their existing result and error behavior. + +Every product delegation still starts a fresh native process or query, produces final text as its only product payload, and ends with provider disposal and whole-tree exit. A background call additionally exposes the generic Job id, status, completion notice, and collection or cancellation results. Background Jobs are process-local and parent-owned: they do not survive parent disposal, do not expose intermediate product activity, and do not make a product conversation resumable. Production installs do not pay for either product integration unless a Profile explicitly installs it; any composition that exposes the background argument must also keep the generic Job provider and controls available. diff --git a/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md new file mode 100644 index 0000000000..bbc18ebb6c --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-12-product-subagent-one-shot-background-tasks.zh.md @@ -0,0 +1,70 @@ +# Agent Note: 产� one-shot subagent 使用通用�� Job + +Status: implemented + +[English](2026-08-12-product-subagent-one-shot-background-tasks.md) | 中文 + +## 问题 + +Codex 与 Claude Code �供方已�能够�行一项自包�任务并返回一个最终回答,而 `dsh-tool-subagent` 也已�能够把任� one-shot �供方接入通用�� Job �行时。�附产�工具行�用了这�路径,因此�使委托与 agent 的下一步�作彼此独立,agent 也�能等待产�回答。 + +公开��执行�得增加产�会��产�专属作业状���一�消责任方或�一结果�议。�一个�供方�行必须继续负责一个原生进程或 query 和一个最终回答,而现有作业注册表继续负责 id�收集��消�owner 清�与完�通知。 + +## 决策 + +生产 `dsh` �安装�选产��供方。选择�用产�集�的 Profile 会安装 `dsh-subagent-codex`�`dsh-subagent-claude-code` 或两者,并在 host plane(宿主平�)�挂载一次。`standard`�`code` 与 `cordis` Agent Preset 使用 `backgroundMode: one-shot` �置相应的休眠工具行;删除�一行的 `disabled` 字段�,现有�选�数 `run_in_background` 会�由该 preset 组装的 agent 公开。�略该�数或传入 `false` 时会在��等待;显�传入 `true` 时会在�步完� Job 预检与登记�返回由父级拥有的 Job id,而�会等待�供方�动或完�。 + +[通用 one-shot ��适�器](2026-07-08-background-subagent-tasks.md)负责��登记与结算。它会�动�一个 [`SubagentRun`](2026-06-21-subagent-capability-seam.md),让 Job 自有的�消信�覆盖�供方�动与执行,等待 `run.result` 和 `run.dispose()`,把终�结果映射进 Job,并由 `job_output`�`job_list`�`job_kill` 与现有完�通知公开该状�。[产��供方决策](2026-08-04-claude-code-and-codex-subagent-backends.md)继续负责原生�议�答案选择�本地�消与进程树完全�稳。 + +本决策�新增�供方�置��务接��事件��议字段��久化格�或产�标识符。��与��的区别仅在于由哪个现有消费方等待�一个 one-shot �行。 + +### 归属与生命周期 + +```text +product tool call + -> omitted / false: tool call waits -> final answer or error -> run disposal + -> true: Job preflight + owner cleanup + -> starter begins provider startup under Job-owned signal + -> Job record/id published and returned (startup remains pending) + -> provider result + run disposal -> Job settlement + notice + -> job_output reads / job_kill cancels + -> parent disposal: Job owner cleanup cancels -> run disposal -> process exit +``` + +| 事实或资� | 责任方 | 产�工具�责 | �观察结果 | +| --- | --- | --- | --- | +| 产��供方安装与登记 | 显� Profile | 安装�选�供方包,并在 host plane 挂载一次 | �供方�称�用,但�会让�次生产 `dsh` 安装都包�该包 | +| 产�选择与公开 | Agent Preset | 把一个固定工具�绑定到一个固定�供方 | �用一行�会公开对应产�工具 | +| ��或��选择 | `dsh-tool-subagent` | 按 `one-shot` 策略解� `run_in_background` | �略�数时在���行;显�传入 `true` 时返回 Job id | +| Job id�状��输出��消与通知 | `ctx.jobs` 与 `dsh-tool-jobs` | 登记并展示现有 one-shot �行 | 通用作业工具为准确父级收集或�止�行 | +| 原生答案与进程完全�稳 | 产��供方与 `dsh-subprocess` | 产生一个最终结果并释放一棵进程树 | Job 结算与��返回都会等待资�释放 | + +## �布组装 + +生产 base �让两个�选产��供方进入�赖闭包。选择�用产�集�的 Profile 会在 host plane 安装并挂载任一或两个�供方。�个完整 preset 让两个产�工具行���用,并把通用 Job 控制工具贡献到自身 agent 作用域;base host 负责共享 Job 注册表。Profile �供方存在�,用户�制一个 preset,�从对应产�行删除 `disabled`;组装期间�会�动产�进程。 + +独立自定义组装若�用 one-shot ��执行,就必须�时�供产��供方与完整通用 Job 能力:由 `dsh-jobs-local` 充当 Job �供方,由 `dsh-tool-jobs` 充当��模型的消费方。基于 `dsh-base` 的 Profile 已具备 Job 能力,�需在�用 preset 工具行�新增�选产��供方。没有 Job �行时的产�工具��在��执行,但显���请求会在现有 Job 预检中失败,�会�布无法收集的 id。 + +ACP 产�组装使用相�的固定产�行与通用作业控制工具。其无密钥 schema 快照会为�个已�用产�工具公开 `description`�`prompt` 和�选的 `run_in_background`,而�会调用 Codex�Claude Code 或外部模型。 + +## 验� + +Web 组装测试会从仓库 examples �赖锚点显�挂载两个�选�供方,��动四�用户 preset �体——��用产����用 Codex���用 Claude Code,以��时�用两者——并检查�个已�用产�工具都会与 `job_output`�`job_list` 和 `job_kill` 一起公开 `run_in_background`。两个由包负责的 Loader 组装会在空 `PATH` 下�行,检查相� schema 与控制工具,并�明显�加载�供方�会�动产�进程。ACP 无密钥快照会固定显�组装�的产� schema,而现有 `dsh-tool-subagent` 与作业测试套件会固定��默认值�Job 登记�最终输出收集��消�完�通知�owner 资�释放与�供方资�释放。 + +## 曾考虑的替代方案 + +**让产�工具继续�支����行。** 这�方案�留最� schema,�会阻止 agent 调度独立产�工作,�使通用 one-shot Job 适�器已�负责所需生命周期。 + +**让产�委托默认在���行。** one-shot Job 需��续收集,这��于拥有自身�久会� id 与结算交付的�续接�级。��继续作为兼容默认值,��继续作为显�调度选择。 + +**让 Codex 或 Claude Code 原生会�状�负责��生命周期。** 这会在通用作业注册表之外建立�供方专属 id�状���消与��语义。�供方继续�产生 one-shot 结果,并把原生 id ��为�有事实。 + +**增加产�专属 output�wait 或 kill 工具。** 独立控制工具会�制通用作业�议,并为�个�供方教授��的收集工作�。现有 `job_*` 工具已�覆盖所需�作。 + +**�时增加�续接产�会�。** ����续交互�进度与�久化产�会�需�新的产�约定和生命周期归属。本决策�公开已�实现的 one-shot ��路径。 + +## �果 + +agent �以在 Codex 或 Claude Code 处�独立 one-shot 任务时继续推进其他工作,��通过其他�� producer 共用的 Job 控制工具收集最终回答或�消�行。��调用方继续获得既有结果与错误行为。 + +�次产�委托�会�动一个全新的原生进程或 query,把最终文本作为唯一产�载�,并以�供方资�释放和整棵进程树退出结�。��调用还会�外公开通用 Job id�状��完�通知以�收集或�消结果。�� Job 仅存在于当�进程且由父级拥有:它�会在父级资�释放�继续存活,�会公开产�中间活动,也�会让产�对��得���。�有 Profile 显�安装产�集�时,生产安装�承担对应�本;公开���数的任何组装还必须让通用 Job �供方与控制工具���用。 diff --git a/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.i18n.yaml b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.i18n.yaml new file mode 100644 index 0000000000..abf480f6b2 --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.md +2026-08-13-shared-modal-product-onboarding.md: 771b6675ea170c5001fca7c880f6c246e19fe7f1 +2026-08-13-shared-modal-product-onboarding.zh.md: ebbcb73344b531e90a6d27641f25fa9961d572ac diff --git a/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.md b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.md new file mode 100644 index 0000000000..771b6675ea --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.md @@ -0,0 +1,33 @@ +# Agent Note: Shared-modal product onboarding + +Status: implemented + +English | [中文](2026-08-13-shared-modal-product-onboarding.zh.md) + +## Problem + +First-run onboarding mixed two interaction models: a viewport takeover for product context and a credential prompt that redirected users into Settings before they could enter a key. That made a short, ordered flow feel like two unrelated surfaces and left onboarding UI ownership split across packages. The product still needs a versioned testing-stage notice before provider setup, but restoring it must not add a second independent overlay or change the Host settings and credential boundaries. + +## Decision + +**One existing client Cordis plugin owns both shipped steps.** `ui-settings-models` registers `welcome-notice` at order `-100` and `deepseek-official` at order `0` in `settings.onboarding`. The shell continues to mount only the first incomplete entry, so the dialogs cannot stack. No additional client package or plugin row is introduced. + +**Both steps share one modal component.** `OnboardingModal` wraps the existing ui-primitives `Modal`, supplies the common title and content geometry, and owns `#root` inert for exactly the visible lifetime. Escape and mask clicks do not silently complete mandatory onboarding; each step exposes only its explicit actions. A step still loading private facts returns `null`, so it paints and blocks nothing. + +**The welcome notice reuses the existing durable field.** Its exact copy and version live in `onboarding-copy.ts`. Loopback clients compare and write `ui-onboarding.welcomeNoticeVersion` through the existing settings API, and only Continue acknowledges the current version. Remote clients retain the existing process-local fallback because the settings namespace is loopback-only. No Host schema, API-proxy allowlist, or persistence implementation changes. + +**The credential dialog reuses the existing editor and write boundary.** The Models join still decides whether any provider is usable. When the official DeepSeek reference is writable and missing, `ProviderEditor` renders in credential-only mode inside the shared modal. It validates the key and calls the existing `credentials.set`; it does not mutate provider settings. Save and continue waits for the write and refreshed readiness, while Configure later completes only the current coordinator pass. + +## Alternatives considered + +**Separate client plugins for the notice and credential steps.** Rejected because the product asks for one client Cordis plugin and the two surfaces share copy, ordering, modal chrome, and invalidation ownership. + +**Move acknowledgement or credential logic into a new Host API.** Rejected because both backend contracts already express the required state and writes. A new endpoint would widen scope without changing user capability. + +**Keep the credential step as navigation into Models.** Rejected because the key is the only required first-run field, and the existing editor can expose that write safely without sending the user through a second dialog. + +**Keep the former full-viewport stage.** Rejected because the requested onboarding is a pair of dialogs over the current app, and the common ui-primitives modal already provides the appropriate portal, mask, and accessibility contract. + +## Consequences + +A fresh loopback profile sees the specified internal-testing notice, then an inline DeepSeek key dialog only when no provider is usable. Acknowledgement remains versioned in `settings.yaml`, secrets remain write-only in `.credentials.yaml`, and already-ready or unsupported deployments render no onboarding chrome while readiness loads. The Models package now owns product-onboarding presentation as well as provider configuration; its README and browser coverage make that broader responsibility explicit. This decision restores a concise testing-stage notice after the historical [full-viewport beta notice removal](../simplification/2026-08-13-remove-first-run-beta-notice.md) without restoring that notice's telemetry copy or takeover layout. diff --git a/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.zh.md b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.zh.md new file mode 100644 index 0000000000..ebbcb73344 --- /dev/null +++ b/.agents/notes/implemented/feature/2026-08-13-shared-modal-product-onboarding.zh.md @@ -0,0 +1,33 @@ +# Agent Note: 共用弹窗的产�引导 + +Status: implemented + +[English](2026-08-13-shared-modal-product-onboarding.md) | 中文 + +## 问题 + +首次使用引导混用了两�交互:产�背景说明�满整个视�,凭��示则先把用户带进「设置�,之��能输入密钥。一个很短的有��程因此�两个互�相关的界�,引导 UI 的归属也分散在多个包中。产��需�在�供方�置之�显示版本化的测试阶段声明,但��它�能增加第二个独立浮层,也�能改� Host 的设置与凭�边界。 + +## 决策 + +**由�一个既有 client Cordis �件�有两个已�布步骤。** `ui-settings-models` 在 `settings.onboarding` 中以顺� `-100` 注册 `welcome-notice`,以顺� `0` 注册 `deepseek-official`。外壳�然�挂载第一个未完��目,因此两个弹窗�会堆�。�新增 client 包或�件�置行。 + +**两个步骤共用�一个弹窗组件。** `OnboardingModal` 包装既有 ui-primitives `Modal`,�供统一的标题和内容布局,并�在��期间�有 `#root` 的 inert 状�。Escape 和�罩点击�会�默完�强制引导;�个步骤�暴露自己的明确�作。步骤�在加载�有事实时返回 `null`,因此�会绘制或阻塞界�。 + +**欢迎声明�用既有�久化字段。** 完整文案与版本由 `onboarding-copy.ts` �有。回环客户端通过既有 settings API 比较和写入 `ui-onboarding.welcomeNoticeVersion`,且�有点击「继续��确认当�版本。远程客户端继续使用既有的进程内回退,因为该 settings namespace 仅�回环访问。�改� Host schema�API Proxy �许列表或�久化实现。 + +**凭�弹窗�用既有编辑器与写入边界。** Models �接�负责判断是�已有任��用�供方。当 DeepSeek 官方引用�写但缺失时,`ProviderEditor` 以仅凭�模�渲染在共用弹窗中。它校验密钥并调用既有 `credentials.set`,�会修改�供方设置。「�存并继续�会等待写入与就绪状�刷新;「���置��完��调器当�这一轮。 + +## 曾考虑的替代方案 + +**让声明与凭�步骤分别�为 client �件。** �采用:产��求�使用一个 client Cordis �件,且两个界�共享文案�顺��弹窗框架与失效刷新归属。 + +**把确认或凭�逻辑移入新的 Host API。** �采用:两个既有�端契约已�能表达所需状�与写入;新增 endpoint �会扩大范围,�会增加用户能力。 + +**继续从凭�步骤跳转到 Models。** �采用:首次使用唯一必填的是密钥,既有编辑器�以安全暴露这项写入,无需�把用户�进第二个对�框。 + +**�留此��满视�的展示层。** �采用:本次需�的是�加在当�应用上的两个弹窗,既有 ui-primitives modal 已�供�适的 portal��罩与无障�契约。 + +## �果 + +新的回环 profile 会先看到指定的内测声明;仅当没有任何�用�供方时,之��会出现行内 DeepSeek 密钥弹窗。确认�按版本写入 `settings.yaml`,secret �以�写方�存入 `.credentials.yaml`,已就绪或无法修�的部署在加载判定期间�会渲染任何引导框架。Models 包现在�时�有产�引导展示与�供方�置;README 和�览器覆盖明确记录了这项扩展�的�责。本决策在历�上的[全�内测声明移除](../simplification/2026-08-13-remove-first-run-beta-notice.md)之���简�的测试阶段声明,但�会��那份声明中的�测文案或接管�布局。 diff --git a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.i18n.yaml b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.i18n.yaml index b75b7f8ac5..9dd1c72ec5 100644 --- a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.i18n.yaml +++ b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md -2026-06-11-vendor-cordis-as-source.md: ccc1289c8a0feadc08d80a3b6e8dc674c1b87bc4 -2026-06-11-vendor-cordis-as-source.zh.md: 4b30ba7684c75bf5eadc0d7c58990ced5355e8f0 +2026-06-11-vendor-cordis-as-source.md: 265966ad0a28900f511efb3091889081d56db2b4 +2026-06-11-vendor-cordis-as-source.zh.md: af8c640e2164c2f14183b29f371e234e59035180 diff --git a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md index ccc1289c8a..265966ad0a 100644 --- a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md +++ b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.md @@ -6,7 +6,7 @@ English | [中文](2026-06-11-vendor-cordis-as-source.zh.md) ## Problem -DeepSeek Harness SDK is built on the Cordis framework. Cordis core was at 4.0.0-rc.6 (a release candidate) when this repo started; the harness depends on framework internals (fiber lifecycle, effect disposal, waterfall dispatch) whose exact behavior matters to the agent loop's correctness guarantees. +DeepSeek Harness is built on the Cordis framework. Cordis core was at 4.0.0-rc.6 (a release candidate) when this repo started; the harness depends on framework internals (fiber lifecycle, effect disposal, waterfall dispatch) whose exact behavior matters to the agent loop's correctness guarantees. ## Decision diff --git a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.zh.md b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.zh.md index 4b30ba7684..af8c640e21 100644 --- a/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.zh.md +++ b/.agents/notes/implemented/process/2026-06-11-vendor-cordis-as-source.zh.md @@ -6,7 +6,7 @@ Status: implemented ## 问题 -DeepSeek Harness SDK 构建于 Cordis 框架之上。本仓库�动时,Cordis core 处于 4.0.0-rc.6(一个候选�布版本);harness �赖框架内部实现(fiber 生命周期�dispose(资�释放)�waterfall(瀑布�事件)分�),其确切行为直接关系到 agent loop(智能体循环)的正确性��。 +DeepSeek Harness 构建于 Cordis 框架之上。本仓库�动时,Cordis core 处于 4.0.0-rc.6(一个候选�布版本);harness �赖框架内部实现(fiber 生命周期�dispose(资�释放)�waterfall(瀑布�事件)分�),其确切行为直接关系到 agent loop(智能体循环)的正确性��。 ## 决策 diff --git a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.i18n.yaml b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.i18n.yaml index df27661306..8d2b2035b0 100644 --- a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.i18n.yaml +++ b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md -2026-07-02-tool-schema-catalog.md: 5ae396d0942379f625b6e0ccb89030d8a34c2283 -2026-07-02-tool-schema-catalog.zh.md: 278a9e17dc9f8462ea70694f67ae7944a43765aa +2026-07-02-tool-schema-catalog.md: 21192b8caff386058008eed1417ef78c678190f7 +2026-07-02-tool-schema-catalog.zh.md: 66c01a5ea9f233cf22ef7ebc467c031692bde002 diff --git a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md index 5ae396d094..21192b8caf 100644 --- a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md +++ b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.md @@ -29,7 +29,7 @@ Booting has a cost the AST pass did not: there is no source declaration set to e ### A hand-maintained boot manifest is the irreducible policy -The filesystem discovers the tool-package inventory and the completeness guard rejects omissions. `TOOL_PACKAGES` still owns an explicit boot recipe for each package because required Service providers and config are policy, not facts that can be inferred safely from layout or injection names. +The filesystem discovers the tool-package inventory and the completeness guard rejects omissions. `TOOL_PACKAGES` still owns an explicit boot recipe for each package because required Service Providers and config are policy, not facts that can be inferred safely from layout or injection names. ### Scope diff --git a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.zh.md b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.zh.md index 278a9e17dc..66c01a5ea9 100644 --- a/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.zh.md +++ b/.agents/notes/implemented/process/2026-07-02-tool-schema-catalog.zh.md @@ -29,7 +29,7 @@ Cordis 目录是纯 TypeScript AST �历,因为�个事件/�务�都是 ### 手动维护的�动 manifest 是无法�去的策略 -文件系统负责�现工具包清�,完整性守�负责拒���。`TOOL_PACKAGES` �然为�个包�有一份显�的�动�方,因为所需的�务�供方和�置属于策略,�是能从目录布局或注入�称安全推断的事实。 +文件系统负责�现工具包清�,完整性守�负责拒���。`TOOL_PACKAGES` �然为�个包�有一份显�的�动�方,因为所需的 Service Provider 和�置属于策略,�是能从目录布局或注入�称安全推断的事实。 ### 范围 diff --git a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml index 314705f776..4580a534c5 100644 --- a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml +++ b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md -2026-07-22-evidence-based-larger-hosted-runners.md: 84c951809891b4936549a2f429dc7efc99833c1b -2026-07-22-evidence-based-larger-hosted-runners.zh.md: bb5b585da26ffd15b5a1096cd40293f64fb69c79 +2026-07-22-evidence-based-larger-hosted-runners.md: e0d919851d99eac6539a25c63c9baeb49f76335f +2026-07-22-evidence-based-larger-hosted-runners.zh.md: 673bd7643506f022b640d14918dd7c883fb60e36 diff --git a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md index 84c9518098..e0d919851d 100644 --- a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md +++ b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.md @@ -52,7 +52,7 @@ The process-bound coverage project contains exactly five suite files. Thirty-two Complete serial Linux, macOS, and Windows references run only when `master` moves. Pull requests use the enterprise required path plus standard-hosted compatibility jobs, while other larger-runner sizes run only by manual dispatch. -An additional serial Linux reference runs on the in-house self-hosted pool (`vm-backup` label: a 64-core VM with six always-on systemd-managed runner instances) on every `master` push. It is a hot-standby drill, not a required check: each run re-proves that the persistent VM can execute the complete unsharded aggregate. The actual switch is pre-wired: the three required Linux jobs resolve their pool through the writer-manageable `DSH_CI_FAILOVER` repository variable, so an outage response is setting one variable and re-running — no merge, which would be deadlocked behind the failing checks themselves ([runbook](2026-07-26-ci-failover-runbook.md)). The standby lane is push-triggered, so it always executes the base branch's workflow definition. Under failover, however, `pull_request` jobs do reach these runners with the PR merge ref's own workflow definition — the trust boundary is repository membership (the repository is private with forking disabled, and the selectors exclude Dependabot), as the [failover runbook](2026-07-26-ci-failover-runbook.md) records. +An additional serial Linux reference runs on the in-house self-hosted pool (`vm-backup` label: a 64-core VM with six always-on systemd-managed runner instances) on every `master` push. It is a hot-standby drill, not a required check: each run re-proves that the persistent VM can execute the complete unsharded aggregate. The actual switch is pre-wired: the three required Linux jobs resolve their pool through the writer-manageable `DSH_CI_FAILOVER_LINUX` repository variable, so an outage response is setting one variable and re-running — no merge, which would be deadlocked behind the failing checks themselves ([runbook](2026-07-26-ci-failover-runbook.md)). The standby lane is push-triggered, so it always executes the base branch's workflow definition. Under failover, however, `pull_request` jobs do reach these runners with the PR merge ref's own workflow definition — the trust boundary is repository membership (the repository is private with forking disabled, and the selectors exclude Dependabot), as the [failover runbook](2026-07-26-ci-failover-runbook.md) records. ## Alternatives considered diff --git a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md index bb5b585da2..673bd76435 100644 --- a/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md +++ b/.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.zh.md @@ -52,7 +52,7 @@ Windows 仓库工作在超过 16 核�收益很�,但 32 核池�以让完 �有在 `master` 移动时,��行完整的 Linux�macOS 和 Windows 串行�考。拉�请求使用�业级�行器必需路径和标准托管兼容性作业,其他大型�行器规格仅通过手动触��行。 -�有一�串行 Linux �考在�次 `master` 推�时�行于公�自有的自托管池(`vm-backup` 标签:一� 64 核虚拟机,�行 6 个常驻的 systemd 管��行器实例)。它是热备演练而�必需检查:�次�行都�新�明这��久化虚拟机能够执行完整的未分片���程。实际切�机制已预先布线:三个必需 Linux 作业通过写入���有者�管�的仓库�� `DSH_CI_FAILOVER` 解��行器池,因此故障�应就是设置一个��并�跑——无需�并(�并本身会被正在失败的检查阻塞,形�死�)([切�手册](2026-07-26-ci-failover-runbook.md))。该热备通�由 push 触�,执行的始终是基础分支自身的工作�定义。但需�注�:故障切�期间,`pull_request` 作业确实会带� PR merge 引用自带的工作�定义到达这些�行器——信任边界是仓库�员资格(仓库为�有且�用 fork,选择器排除 Dependabot),详�[故障切�手册](2026-07-26-ci-failover-runbook.md)的记录。 +�有一�串行 Linux �考在�次 `master` 推�时�行于公�自有的自托管池(`vm-backup` 标签:一� 64 核虚拟机,�行 6 个常驻的 systemd 管��行器实例)。它是热备演练而�必需检查:�次�行都�新�明这��久化虚拟机能够执行完整的未分片���程。实际切�机制已预先布线:三个必需 Linux 作业通过写入���有者�管�的仓库�� `DSH_CI_FAILOVER_LINUX` 解��行器池,因此故障�应就是设置一个��并�跑——无需�并(�并本身会被正在失败的检查阻塞,形�死�)([切�手册](2026-07-26-ci-failover-runbook.md))。该热备通�由 push 触�,执行的始终是基础分支自身的工作�定义。但需�注�:故障切�期间,`pull_request` 作业确实会带� PR merge 引用自带的工作�定义到达这些�行器——信任边界是仓库�员资格(仓库为�有且�用 fork,选择器排除 Dependabot),详�[故障切�手册](2026-07-26-ci-failover-runbook.md)的记录。 ## 曾考虑的替代方案 diff --git a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.i18n.yaml b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.i18n.yaml index ed819bc19e..2dd42d87db 100644 --- a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.i18n.yaml +++ b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md -2026-07-26-ci-failover-runbook.md: 90ef2905bec86911697e552c0c1eac96ea0d3a18 -2026-07-26-ci-failover-runbook.zh.md: 5c8fd0e90ae31e3622ae6b49217591a54b84c351 +2026-07-26-ci-failover-runbook.md: b4522e623ffb76f3fd33d242b21c2d1d9ff2eadf +2026-07-26-ci-failover-runbook.zh.md: 58ba7ffee013d38f06afe097362f5c23f04b8121 diff --git a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md index 90ef2905be..b4522e623f 100644 --- a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md +++ b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md @@ -6,11 +6,11 @@ English | [中文](2026-07-26-ci-failover-runbook.zh.md) ## Problem -The three required Linux worker jobs in [CI](../../../../.github/workflows/ci.yml) (`node 24 / static`, `node 24 / coverage`, `node 24 / snapshots and artifacts`) run on the hosted enterprise 32-core pools; the required verdict job that aggregates them (`all checks passed`) runs on standard `ubuntu-latest`; the independent native Windows job (`windows node 24 / native complete`) runs on the hosted `dsh-windows-2025-16core` larger runner. When the enterprise pools degrade — jobs queue indefinitely or the enterprise labels vanish — every open pull request becomes unmergeable, and the ordinary recovery of merging a fix is itself deadlocked behind the very required checks that cannot run. **Scope: this switch recovers an enterprise Linux-pool outage AND a hosted Windows-pool outage.** The verdict's other required dependencies (`node-compat`, `python-sdk`, `windows`) stay on standard hosted runners by design (the portable boundary); in a broader GitHub-hosted capacity failure that also takes out the standard pools, those dependencies still block `all checks passed`. An outage therefore needs a switch any responder with repository write access can throw without merging anything. +The three required Linux worker jobs in [CI](../../../../.github/workflows/ci.yml) (`node 24 / static`, `node 24 / coverage`, `node 24 / snapshots and artifacts`) run on the hosted enterprise 32-core pools; the required verdict job that aggregates them (`all checks passed`) runs on standard `ubuntu-latest`; the independent native Windows job (`windows node 24 / native complete`) runs on the hosted `dsh-windows-2025-16core` larger runner. When the enterprise pools degrade — jobs queue indefinitely or the enterprise labels vanish — every open pull request becomes unmergeable, and the ordinary recovery of merging a fix is itself deadlocked behind the very required checks that cannot run. **Scope: two independent switches, one per platform.** `DSH_CI_FAILOVER_LINUX` recovers an enterprise Linux-pool outage (the three required Linux workers plus the `all checks passed` verdict); `DSH_CI_FAILOVER_WINDOWS` recovers a hosted Windows-pool outage (the native Windows job). A Linux-pool outage need not retarget the native Windows job and vice versa. The verdict's other required dependencies (`node-compat`, `python-sdk`, `windows`) stay on standard hosted runners by design (the portable boundary); in a broader GitHub-hosted capacity failure that also takes out the standard pools, those dependencies still block `all checks passed`. An outage therefore needs a switch any responder with repository write access can throw without merging anything. ## Decision -Each of the three required Linux worker jobs, the independent native Windows job, and the `all checks passed` verdict job — which would otherwise stay queued on the failed pool even after every worker passed — resolves its runner pool through the `DSH_CI_FAILOVER` repository variable. Unset (normal), they run on the hosted enterprise pools. Set to `selfhosted` by any repository writer, all five retarget onto the in-house self-hosted pools: the Linux jobs and verdict onto the `vm-backup` pool, coverage and snapshot concurrency drop to shared-VM bounds, and the hosted-path pnpm cache restores are skipped; the native Windows job onto the `dsh-win-ci` pool. The switch is writer-manageable repository state, not a merge, so it works while every check is red. The in-house pools' readiness is continuously re-proven by the `serial / linux (self-hosted standby)` and `serial / windows (self-hosted standby)` lanes, which run the complete unsharded aggregates on every master push. +Each of the three required Linux worker jobs, the independent native Windows job, and the `all checks passed` verdict job — which would otherwise stay queued on the failed pool even after every worker passed — resolves its runner pool through a repository variable, and the switch is split by platform so an outage on one platform does not retarget the other. The three Linux workers and the `all checks passed` verdict (whose `needs` are the required Linux workers and which runs on the `vm-backup` pool) resolve through `DSH_CI_FAILOVER_LINUX`; the native Windows job resolves through `DSH_CI_FAILOVER_WINDOWS`. Unset (normal), they run on the hosted enterprise pools. Set to `selfhosted` by any repository writer, the corresponding jobs retarget onto the in-house self-hosted pool: under `DSH_CI_FAILOVER_LINUX`, the Linux jobs and verdict move onto the `vm-backup` pool, coverage and snapshot concurrency drop to shared-VM bounds, and the hosted-path pnpm cache restores are skipped; under `DSH_CI_FAILOVER_WINDOWS`, the native Windows job moves onto the `dsh-win-ci` pool. Each switch is writer-manageable repository state, not a merge, so it works while every check is red. The in-house pools' readiness is continuously re-proven by the `serial / linux (self-hosted standby)` and `serial / windows (self-hosted standby)` lanes, which run the complete unsharded aggregates on every master push. `ci.yml` exempts exactly one event from `cancel-in-progress` (`${{ github.event_name != 'push' }}`), so one master push does not cancel the drill still running from the previous one. Each drill runs its complete unsharded aggregate with one gate worker, which takes longer than the interval between master merges; under unconditional cancellation a drill is superseded before reaching a verdict and the lane yields no readiness evidence for a responder to check. @@ -28,13 +28,15 @@ The decision belongs at workflow level because cancellation applies to the whole ### Switch (any repository writer, ~1 minute, no merge) -1. Repository **Settings → Secrets and variables → Actions → Variables → New repository variable**: name `DSH_CI_FAILOVER`, value `selfhosted`. +The two switches are independent: flip only the one whose platform is degraded. + +1. Repository **Settings → Secrets and variables → Actions → Variables → New repository variable**: name `DSH_CI_FAILOVER_LINUX` (Linux pool outage) or `DSH_CI_FAILOVER_WINDOWS` (Windows pool outage), value `selfhosted`. 2. Retrigger the required jobs so they re-resolve their pool. Jobs already **queued** for the hosted labels do not retarget and cannot be re-run in place, so for the documented indefinite-queue outage, cancel the stuck run and re-run all jobs, or push a new commit; "Re-run failed jobs" only helps once a job has actually failed rather than queued. -3. That is the entire switch. Under failover the workflow also, automatically: drops `DSH_COVERAGE_MAX_WORKERS` to 8 and `DSH_SNAPSHOT_MAX_CONCURRENCY` to 12 (sized for six always-on instances: worst case 6 × 8 = 48 coverage workers on the 64-core VM) (shared-VM contention bounds), and skips the hosted-path pnpm cache restores (the VM's persistent store serves warm installs). +3. That is the entire switch. Under Linux failover the workflow also, automatically: drops `DSH_COVERAGE_MAX_WORKERS` to 8 and `DSH_SNAPSHOT_MAX_CONCURRENCY` to 12 (sized for six always-on instances: worst case 6 × 8 = 48 coverage workers on the 64-core VM) (shared-VM contention bounds), and skips the hosted-path pnpm cache restores (the VM's persistent store serves warm installs). The Windows switch has no such concurrency or cache branches; it only retargets the native Windows job's pool. -#**Dependabot exception.** All five selectors deliberately exclude `dependabot[bot]`: under failover, Dependabot PRs stay queued for the hosted pool rather than executing dependency-supplied code on the persistent VMs. A Dependabot PR that remains queued during an outage is expected behavior, not a failed switch; it completes when the hosted pool recovers. +#**Dependabot exception.** Both switches' selectors deliberately exclude `dependabot[bot]`: under failover, Dependabot PRs stay queued for the hosted pool rather than executing dependency-supplied code on the persistent VMs. A Dependabot PR that remains queued during an outage is expected behavior, not a failed switch; it completes when the hosted pool recovers. -**Who can flip the variable.** GitHub's API lets any collaborator with write access manage repository variables, so the switch is writer-level, not strictly admin-only. In this repository's trust model that is not an escalation: the runner groups admit all workflows of this private, fork-disabled repository (a deliberate trade to make PR-ref failover possible at all), so any writer could already reach the VMs by pushing a branch workflow. The boundary against untrusted code is repository membership; the variable only routes work for members. +**Who can flip the variable.** GitHub's API lets any collaborator with write access manage repository variables, so each switch is writer-level, not strictly admin-only. In this repository's trust model that is not an escalation: the runner groups admit all workflows of this private, fork-disabled repository (a deliberate trade to make PR-ref failover possible at all), so any writer could already reach the VMs by pushing a branch workflow. The boundary against untrusted code is repository membership; the variables only route work for members. ## Capacity during failover @@ -43,18 +45,18 @@ Six always-on instances absorb normal PR traffic (the pool's steady-state load i ### Switch back -Delete the `DSH_CI_FAILOVER` variable (or set it to anything other than `selfhosted`). New runs resolve back to the hosted enterprise pools. Remove any extra instances that were registered during the incident. +Delete the `DSH_CI_FAILOVER_LINUX` or `DSH_CI_FAILOVER_WINDOWS` variable (or set it to anything other than `selfhosted`). New runs resolve back to the hosted enterprise pools. Remove any extra instances that were registered during the incident. ### Trust boundary -The variable is writer-manageable repository state; a pull request event itself can neither set it nor read a different value into effect, and the selector expressions live in workflow definitions. Note that under failover, `pull_request` runs execute the PR merge ref's own workflow definition — the boundary against untrusted code is repository membership (private, forking disabled, Dependabot excluded by the selectors), not the variable. Note on runner-group policy: pinning the runner group to the master-ref workflow is **incompatible** with this failover — the four failover jobs are `pull_request` runs evaluated from PR merge refs, and a master-pinned group leaves them queued (observed live on 2026-07-27; the group was widened to all workflows of this repository to unblock the switch). A stricter runner-side policy therefore costs PR failover; the shipped posture accepts repository-scoped, all-workflow group access. +The variables are writer-manageable repository state; a pull request event itself can neither set them nor read a different value into effect, and the selector expressions live in workflow definitions. Note that under failover, `pull_request` runs execute the PR merge ref's own workflow definition — the boundary against untrusted code is repository membership (private, forking disabled, Dependabot excluded by the selectors), not the variable. Note on runner-group policy: pinning the runner group to the master-ref workflow is **incompatible** with this failover — the five failover jobs are `pull_request` runs evaluated from PR merge refs, and a master-pinned group leaves them queued (observed live on 2026-07-27; the group was widened to all workflows of this repository to unblock the switch). A stricter runner-side policy therefore costs PR failover; the shipped posture accepts repository-scoped, all-workflow group access. ## Alternatives considered **Merge a workflow change to switch pools.** Rejected because the outage that motivates the switch is exactly the state in which no PR can merge: the required checks are the ones failing. A repository variable is writer-manageable state that takes effect on re-run without a merge. -**Keep the self-hosted pool always in the required path.** Rejected because it trades hosted-pool availability for the in-house VM's, moving a single point of failure rather than adding a fallback. The variable keeps the hosted pools primary and the self-hosted pool a proven, one-action standby. +**Keep the self-hosted pool always in the required path.** Rejected because it trades hosted-pool availability for the in-house VM's, moving a single point of failure rather than adding a fallback. The variables keep the hosted pools primary and the self-hosted pools proven, one-action standbys; splitting them by platform means an outage on one platform does not retarget the other. ## Consequences -Recovering from a hosted-pool outage is a single variable (any writer) plus a re-run, with no merge on the critical path. The cost is a second runner topology to keep working: the standby lane exercises it on every master push so the failover target never goes stale, and the concurrency and cache-restore branches in `ci.yml` carry a `selfhosted` leg that must stay in step with the hosted leg. +Recovering from a hosted-pool outage is flipping the affected platform's variable (any writer) plus a re-run, with no merge on the critical path. The cost is a second runner topology per platform to keep working: the standby lanes exercise them on every master push so the failover targets never go stale, and the concurrency and cache-restore branches in `ci.yml` carry a `selfhosted` leg (Linux only) that must stay in step with the hosted leg. Splitting the switch by platform adds one more variable to manage but bounds the blast radius of each switch to the jobs of a single platform. diff --git a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.zh.md b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.zh.md index 5c8fd0e90a..58ba7ffee0 100644 --- a/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.zh.md +++ b/.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.zh.md @@ -6,11 +6,11 @@ Status: implemented ## 问题 -[CI](../../../../.github/workflows/ci.yml) 中三个必需的 Linux 工作作业(`node 24 / static`�`node 24 / coverage`�`node 24 / snapshots and artifacts`)�行在托管的�业级 32 核池上;��它们的必需判定作业(`all checks passed`)�行在标准 `ubuntu-latest` 上;独立的原生 Windows 作业(`windows node 24 / native complete`)�行在托管的 `dsh-windows-2025-16core` 大型�行器上。当�业池�生故障——作业无�排队或�业标签消失——所有开�的拉�请求都无法�并,而"�并一个修�"这一常规��手段本身正被那些无法�行的必需检查死�。**适用范围:本切���的是�业级 Linux 池故障与托管 Windows 池故障。**判定作业的其余必需�赖(`node-compat`�`python-sdk`�`windows`)按设计留在标准托管�行器上(�移�边界);若更大范围的 GitHub 托管容�故障连标准池一并击倒,这些�赖�会阻塞 `all checks passed`。因此故障需�一个任何具备仓库写��的�应者都能在��并任何代�的情况下触�的开关。 +[CI](../../../../.github/workflows/ci.yml) 中三个必需的 Linux 工作作业(`node 24 / static`�`node 24 / coverage`�`node 24 / snapshots and artifacts`)�行在托管的�业级 32 核池上;��它们的必需判定作业(`all checks passed`)�行在标准 `ubuntu-latest` 上;独立的原生 Windows 作业(`windows node 24 / native complete`)�行在托管的 `dsh-windows-2025-16core` 大型�行器上。当�业池�生故障——作业无�排队或�业标签消失——所有开�的拉�请求都无法�并,而"�并一个修�"这一常规��手段本身正被那些无法�行的必需检查死�。**适用范围:两个独立开关,�个平�一个。**`DSH_CI_FAILOVER_LINUX` ���业级 Linux 池故障(三个必需的 Linux 工作作业加 `all checks passed` 判定作业);`DSH_CI_FAILOVER_WINDOWS` ��托管 Windows 池故障(原生 Windows 作业)。Linux 池故障无需�定�原生 Windows 作业,�之亦然。判定作业的其余必需�赖(`node-compat`�`python-sdk`�`windows`)按设计留在标准托管�行器上(�移�边界);若更大范围的 GitHub 托管容�故障连标准池一并击倒,这些�赖�会阻塞 `all checks passed`。因此故障需�一个任何具备仓库写��的�应者都能在��并任何代�的情况下触�的开关。 ## 决策 -三个必需的 Linux 工作作业�独立的原生 Windows 作业,以� `all checks passed` 判定作业(若��切�,�使全部工作作业通过,它�会滞留在故障池的队列中)——�自通过仓库�� `DSH_CI_FAILOVER` 解��行器池。���存在(正常)时它们�行在托管�业池上;由任何具备写��的�作者设为 `selfhosted` 时,五个作业全部切�到公�自有的自托管池:Linux 作业与判定作业切到 `vm-backup` 池,覆盖率与快照的并��到共享虚拟机上�,并跳过托管路径的 pnpm 缓存��;原生 Windows 作业切到 `dsh-win-ci` 池。这个开关是写者�管�的仓库状�而�一次�并,因此在所有检查都是红色时�然有效。自有池的就绪状�由 `serial / linux (self-hosted standby)` 与 `serial / windows (self-hosted standby)` 通��续验�——�次 master 推�都在其上�行完整的未分片���程。 +三个必需的 Linux 工作作业�独立的原生 Windows 作业,以� `all checks passed` 判定作业(若��切�,�使全部工作作业通过,它�会滞留在故障池的队列中)——�自通过仓库��解��行器池,且开关按平�拆分,使一个平�的故障�会�定��一个平�。三个 Linux 工作作业与 `all checks passed` 判定作业(其 `needs` 是必需的 Linux 工作作业,且�行在 `vm-backup` 池上)通过 `DSH_CI_FAILOVER_LINUX` 解�;原生 Windows 作业通过 `DSH_CI_FAILOVER_WINDOWS` 解�。���存在(正常)时它们�行在托管�业池上;由任何具备写��的�作者设为 `selfhosted` 时,对应作业切�到公�自有的自托管池:`DSH_CI_FAILOVER_LINUX` 下,Linux 作业与判定作业切到 `vm-backup` 池,覆盖率与快照的并��到共享虚拟机上�,并跳过托管路径的 pnpm 缓存��;`DSH_CI_FAILOVER_WINDOWS` 下,原生 Windows 作业切到 `dsh-win-ci` 池。�个开关都是写者�管�的仓库状�而�一次�并,因此在所有检查都是红色时�然有效。自有池的就绪状�由 `serial / linux (self-hosted standby)` 与 `serial / windows (self-hosted standby)` 通��续验�——�次 master 推�都在其上�行完整的未分片���程。 `ci.yml` ���一个事件���消(`${{ github.event_name != 'push' }}`),因此一次 master 推��会�消上一次推�留下的��在�行的演练。�次演练以�门�工作进程执行完整的未分片���程,耗时长于 master �并的间隔;在无�件�消下,演练会在得出结论�被�续�行�代,该通�无法产出供�应者查看的就绪��。 @@ -28,13 +28,15 @@ Status: implemented ### 切�步骤(任何具备写��的�作者,约 1 分钟,无需�并) -1. 仓库 **Settings → Secrets and variables → Actions → Variables → New repository variable**:�称 `DSH_CI_FAILOVER`,值 `selfhosted`。 +两个开关相互独立:�切��生故障的那个平�。 + +1. 仓库 **Settings → Secrets and variables → Actions → Variables → New repository variable**:�称 `DSH_CI_FAILOVER_LINUX`(Linux 池故障)或 `DSH_CI_FAILOVER_WINDOWS`(Windows 池故障),值 `selfhosted`。 2. �新触�必需作业,使其�新解��行器池。已�为托管标签**排队**的作业�会�定�,也无法原地 re-run,因此对于本手册所述的无�排队故障,应�消��的�行并 re-run all jobs,或推�一个新�交;“Re-run failed jobs��有在作业真正失败(而��在排队)时�有用。 -3. 切�到此完�。故障切�状�下工作�还会自动:把 `DSH_COVERAGE_MAX_WORKERS` �为 8�`DSH_SNAPSHOT_MAX_CONCURRENCY` �为 12(按 6 个常驻实例定容:最�情况下,6 × 8 = 48 个覆盖率工作进程�行在 64 核虚拟机上)(共享虚拟机的争抢上�),并跳过托管路径的 pnpm 缓存��(虚拟机的�久 store 直接�供热安装)。 +3. 切�到此完�。Linux 故障切�状�下工作�还会自动:把 `DSH_COVERAGE_MAX_WORKERS` �为 8�`DSH_SNAPSHOT_MAX_CONCURRENCY` �为 12(按 6 个常驻实例定容:最�情况下,6 × 8 = 48 个覆盖率工作进程�行在 64 核虚拟机上)(共享虚拟机的争抢上�),并跳过托管路径的 pnpm 缓存��(虚拟机的�久 store 直接�供热安装)。Windows 开关没有这类并�或缓存分支;它��定�原生 Windows 作业的�行器池。 -#**Dependabot 例外。**五个选择器都刻�排除了 `dependabot[bot]`:故障切�期间,Dependabot 拉�请求继续在托管池排队,而�是把�赖项�供的代�放到�久化虚拟机上执行。故障期间 Dependabot PR �续排队是预期行为而�切�失败;托管池���它会自行完�。 +#**Dependabot 例外。**两个开关的选择器都刻�排除了 `dependabot[bot]`:故障切�期间,Dependabot 拉�请求继续在托管池排队,而�是把�赖项�供的代�放到�久化虚拟机上执行。故障期间 Dependabot PR �续排队是预期行为而�切�失败;托管池���它会自行完�。 -**�能扳动这个��。**GitHub 的 API �许任何具有写��的�作者管�仓库��,因此该开关实际是写者级而�严格的管�员级。在本仓库的信任模型下这并�构���:runner group 接纳本�有�� fork 仓库的全部工作�(这是让 PR 引用的故障切�得以�立的刻���),因此任何写者本就�以通过推�分支工作�触达这�虚拟机。抵御��信代�的边界是仓库�员资格;���是为�员路由工作。 +**�能扳动这个��。**GitHub 的 API �许任何具有写��的�作者管�仓库��,因此�个开关实际是写者级而�严格的管�员级。在本仓库的信任模型下这并�构���:runner group 接纳本�有�� fork 仓库的全部工作�(这是让 PR 引用的故障切�得以�立的刻���),因此任何写者本就�以通过推�分支工作�触达这�虚拟机。抵御��信代�的边界是仓库�员资格;���是为�员路由工作。 ## 切�期间的容� @@ -43,18 +45,18 @@ Status: implemented ### 切回 -删除 `DSH_CI_FAILOVER` ��(或改为 `selfhosted` 以外的任何值),新的�行�解�回托管�业池。若故障期间追加注册过实例,将其移除。 +删除 `DSH_CI_FAILOVER_LINUX` 或 `DSH_CI_FAILOVER_WINDOWS` ��(或改为 `selfhosted` 以外的任何值),新的�行�解�回托管�业池。若故障期间追加注册过实例,将其移除。 ### 信任边界 -该��是写者�管�的仓库状�;`pull_request` 事件本身既�能设置它,也�能让��的值生效,选择器表达�存在于工作�定义中。需�注�:故障切�期间,`pull_request` �行执行的是 PR merge 引用自带的工作�定义——抵御��信代�的边界是仓库�员资格(�有�� fork�选择器排除 Dependabot),而�该��。关于 runner group 策略的说明:把 runner group 绑定到 master 引用的工作�与本故障切�机制**�兼容**——四个故障切�作业是从 PR merge 引用求值的 `pull_request` �行,master 绑定的组会让它们�续排队(2026-07-27 实际故障中亲历;当时将组放宽为本仓库全部工作���通了切�)。更严格的�行器侧策略以牺牲 PR 故障切�为代价;当�采用的形�是仓库范围�全工作�的组访问。 +这些��是写者�管�的仓库状�;`pull_request` 事件本身既�能设置它们,也�能让��的值生效,选择器表达�存在于工作�定义中。需�注�:故障切�期间,`pull_request` �行执行的是 PR merge 引用自带的工作�定义——抵御��信代�的边界是仓库�员资格(�有�� fork�选择器排除 Dependabot),而�该��。关于 runner group 策略的说明:把 runner group 绑定到 master 引用的工作�与本故障切�机制**�兼容**——五个故障切�作业是从 PR merge 引用求值的 `pull_request` �行,master 绑定的组会让它们�续排队(2026-07-27 实际故障中亲历;当时将组放宽为本仓库全部工作���通了切�)。更严格的�行器侧策略以牺牲 PR 故障切�为代价;当�采用的形�是仓库范围�全工作�的组访问。 ## 曾考虑的替代方案 **通过�并一次工作�改动�切�池。** �决,因为触�切�的故障状���是任何 PR 都无法�并的状�:必需检查正是失败的那些。仓库��是写者�管�的状�,�跑�生效,无需�并。 -**让自托管池长期处于必需路径中。** �决,因为这是拿托管池的�用性去�自有虚拟机的�用性,�是�移了�点故障而�增加回退。该��让托管池��主路径,自托管池作为一个�过验��一步���用的热备。 +**让自托管池长期处于必需路径中。** �决,因为这是拿托管池的�用性去�自有虚拟机的�用性,�是�移了�点故障而�增加回退。这些��让托管池��主路径,自托管池作为一个�过验��一步���用的热备;按平�拆分�味�一个平�的故障�会�定��一个平�。 ## �果 -从托管池故障中���需一个��(任何写者�设)加一次�跑,关键路径上没有�并。代价是�维护第二套�行器拓扑:热备通�在�次 master 推�时都�行它,��故障切�目标�得陈旧;而 `ci.yml` 中的并�与缓存��分支带有一� `selfhosted` 支路,必须与托管支路���步。 +从托管池故障中���需切��影�平�的��(任何写者�设)加一次�跑,关键路径上没有�并。代价是�个平�都�维护第二套�行器拓扑:热备通�在�次 master 推�时都�行它们,��故障切�目标�得陈旧;而 `ci.yml` 中的并�与缓存��分支带有一� `selfhosted` 支路(仅 Linux),必须与托管支路���步。按平�拆分开关多了一个需�管�的��,但把�个开关的影�范围�定在�个平�的作业上。 diff --git a/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.i18n.yaml b/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.i18n.yaml index 91ddfe4f6c..2c58cd8d43 100644 --- a/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.i18n.yaml +++ b/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.md -2026-08-06-in-repository-landlock-release.md: 1540cebbf5a3dffa20003c70ffcec426aeca104b -2026-08-06-in-repository-landlock-release.zh.md: 5defa5f3ca83e5a420d0c11857ad4cf46555450b +2026-08-06-in-repository-landlock-release.md: 82b21cc0c30338ad11583797f011794b8dbcc90c +2026-08-06-in-repository-landlock-release.zh.md: 7ebd69f505c3b071216eb23f5eed35c392e6f844 diff --git a/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.md b/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.md index 1540cebbf5..82b21cc0c3 100644 --- a/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.md +++ b/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.md @@ -18,7 +18,7 @@ The consolidation must preserve platform selection. The public distribution is d `native/landlock-run` and `native/landlock-run/packages/*` belong to the repository's root pnpm workspace and use the root `pnpm-lock.yaml`. Harness consumers declare `@deepseek-ai/node-addon-landlock-run` with `workspace:*`, so development, type checking, builds, and pull-request tests resolve the entry package from the same checkout. The root TypeScript project graph builds that entry package before consumers, and the repository cleaner owns its direct `lib/` output. -The public npm boundary is three organization-owned packages with one launcher-family version: `@deepseek-ai/node-addon-landlock-run`, `@deepseek-ai/node-addon-landlock-run-linux-x64`, and `@deepseek-ai/node-addon-landlock-run-linux-arm64`. The entry package retains both platform packages as `optionalDependencies`; their `os` and `cpu` manifest fields let npm install only the compatible package. Repository constraints allow public publication only for those three names, require `publishConfig.access: public`, and require their versions to match the private launcher workspace root. The former unscoped names are not release targets of this repository; other repository workspaces remain private under the existing constraint. +The public npm boundary is three organization-owned packages with one launcher-family version: `@deepseek-ai/node-addon-landlock-run`, `@deepseek-ai/node-addon-landlock-run-linux-x64`, and `@deepseek-ai/node-addon-landlock-run-linux-arm64`. The entry package retains both platform packages as `optionalDependencies`; their `os` and `cpu` manifest fields let npm install only the compatible package. Repository constraints require `publishConfig.access: public` for those three names and require their versions to match the private launcher workspace root. The former unscoped names are not release targets of this repository. These three are no longer the only public packages: the [per-sequence access decision](2026-08-13-public-vendor-and-native-sequences.md) publishes the nine vendored framework packages publicly as well, while the dsh family stays restricted. The main repository owns both native CI and publication. `Landlock Run` runs for relevant pull requests and `master` pushes and builds each platform on its matching native runner. The manually dispatched `Landlock Run Release` workflow builds both platform binaries, transfers them as workflow artifacts, assembles and verifies the complete package family, packs immutable npm tarballs, installs and exercises those tarballs, and only then permits the protected publish job. Platform tarballs publish before the entry tarball that optionally depends on them. Publication uses `landlock-run-vX.Y.Z` tags so launcher releases cannot collide with other release families in the monorepo; prereleases use the npm `next` dist-tag. diff --git a/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.zh.md b/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.zh.md index 5defa5f3ca..7ebd69f505 100644 --- a/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.zh.md +++ b/.agents/notes/implemented/process/2026-08-06-in-repository-landlock-release.zh.md @@ -18,7 +18,7 @@ Status: implemented `native/landlock-run` 和 `native/landlock-run/packages/*` 属于仓库根 pnpm workspace,并使用根 `pnpm-lock.yaml`。Harness 消费方将 `@deepseek-ai/node-addon-landlock-run` 声明为 `workspace:*`,因此开��类型检查�构建和 PR 测试都会从�一个 checkout 解�入�包。根 TypeScript 项目图会先构建该入�包,�构建消费方;仓库清�器负责清�其直接生�的 `lib/` 输出目录。 -公开 npm 分�边界由 3 个归组织所有的包组�,它们共用一个�动器包家�版本:`@deepseek-ai/node-addon-landlock-run`�`@deepseek-ai/node-addon-landlock-run-linux-x64` 和 `@deepseek-ai/node-addon-landlock-run-linux-arm64`。入�包继续通过 `optionalDependencies` 声明两个平�包;它们在 manifest(元数�清�)中的 `os` 和 `cpu` 字段让 npm �安装兼容的包。仓库约���许公开�布这 3 个包�,�求设置 `publishConfig.access: public`,并�求其版本与�有�动器 workspace 根包一致。原先的� scoped 包��属于本仓库的�布目标;仓库中的其他 workspace ��现有约��护,���有状�。 +公开 npm 分�边界由 3 个归组织所有的包组�,它们共用一个�动器包家�版本:`@deepseek-ai/node-addon-landlock-run`�`@deepseek-ai/node-addon-landlock-run-linux-x64` 和 `@deepseek-ai/node-addon-landlock-run-linux-arm64`。入�包继续通过 `optionalDependencies` 声明两个平�包;它们在 manifest(元数�清�)中的 `os` 和 `cpu` 字段让 npm �安装兼容的包。仓库约��求这 3 个包�设置 `publishConfig.access: public`,并�求其版本与�有�动器 workspace 根包一致。原先的� scoped 包��属于本仓库的�布目标。这 3 个已��是唯一的公开包:[按�列区分 access 的决策](2026-08-13-public-vendor-and-native-sequences.md)让 vendored 框架�包也公开�布,而 dsh �����。 主仓库�时负责原生 CI 和�布。`Landlock Run` 会为相关 PR 和 `master` 推��行,并在�自匹�的原生 runner 上构建�个平�包。手动触�的 `Landlock Run Release` 工作�会构建两个平�的二进制文件,将其作为工作�产物传递,组装并验�完整的包家�,打包出内容���的 npm tarball,安装并实际�行这些 tarball,之���许��护的�布作业执行。�布顺�是平� tarball 在�,最��布将它们列为�选�赖的入� tarball。�布使用 `landlock-run-vX.Y.Z` tag,���动器版本与 monorepo 中其他�布家��生冲�;预�布版本使用 npm 的 `next` dist-tag。 diff --git a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.i18n.yaml b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.i18n.yaml index dcdbff1208..311f39f0ff 100644 --- a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.i18n.yaml +++ b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md -2026-08-08-native-windows-pull-request-ci.md: 33fbf1ae378112b4fd82633a77afa52056d93d98 -2026-08-08-native-windows-pull-request-ci.zh.md: 552e5cd3129011198fe442ba747cf2fdb7d97365 +2026-08-08-native-windows-pull-request-ci.md: d7db73b2049ae2d08f8996bcfd5b54fa15901478 +2026-08-08-native-windows-pull-request-ci.zh.md: 474b7f71aca8fbb5e0082fd2e4faf8e462bf0c0f diff --git a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md index 33fbf1ae37..d7db73b204 100644 --- a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md +++ b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.md @@ -14,7 +14,7 @@ A coverage audit found that stale branch state had restored temporary exclusions The required `windows` job in [ci.yml](../../../../.github/workflows/ci.yml) remains `windows node 24 / wine blocking` on `ubuntu-latest`. It retains the checksum-verified Windows Node, Wine apt and pnpm caches, a hoisted install confined to a workspace snapshot, and the [shared Wine gate script](../../../../scripts/wine-windows-gates.sh) that runs the workspace build and production site. Node distribution transfers use bounded retries; when nodejs.org stalls on the large archive, a range-capable transport mirror resumes the same bytes, but nodejs.org remains the version and SHA-256 authority and the archive is never promoted before that checksum passes. The stable `windows` job id remains a dependency of `all checks passed`. The [archived Wine experiment](../../archived/process/2026-07-27-wine-windows-gates-experiment.md) preserves its measured trade-offs, while this note owns the current dual topology. -Every pull request also starts an ordinary independent `windows-native` job named `windows node 24 / native complete` on the organization-owned `dsh-windows-2025-16core` runner. It enables Developer Mode for workspace symlinks, provisions the repository-pinned pnpm through `pnpm/action-setup`, performs an immutable install without a transferred store archive, and runs `pnpm run check:ci:windows-complete` under native PowerShell. A 60-minute timeout bounds a stuck gate without treating the measured performance target as a correctness deadline. +Every pull request also starts an ordinary independent `windows-native` job named `windows node 24 / native complete` on the organization-owned `dsh-windows-2025-16core` runner. It enables Developer Mode for workspace symlinks, provisions the repository-pinned pnpm through `pnpm/action-setup`, performs an immutable install without a transferred store archive, and runs `pnpm run check:ci:windows-complete` under native PowerShell. A 120-minute timeout bounds a stuck gate without treating the measured performance target as a correctness deadline. The native job is deliberately absent from `all-checks-passed.needs` and does not use `continue-on-error`: the aggregate neither waits for it nor changes conclusion because of it, while the job retains its own unmasked result. Workspace build, production-site, and 100%-per-file coverage failures make the native job fail. The broader static, documentation, package, and built-artifact portability inventory remains observational. Linux remains the owner of duplicate lint and snapshot enforcement, while native Windows independently enforces supported-source coverage. diff --git a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.zh.md b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.zh.md index 552e5cd312..474b7f71ac 100644 --- a/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.zh.md +++ b/.agents/notes/implemented/process/2026-08-08-native-windows-pull-request-ci.zh.md @@ -14,7 +14,7 @@ Status: implemented [ci.yml](../../../../.github/workflows/ci.yml) 中必需的 `windows` 作业�是在 `ubuntu-latest` 上�行的 `windows node 24 / wine blocking`。它�留�过校验和验�的 Windows Node�Wine apt 与 pnpm 缓存�仅�工作区快照的 hoisted 安装,以��行工作区构建与生产网站的[共享 Wine 门�脚本](../../../../scripts/wine-windows-gates.sh)。Node 分�文件传输采用有界�试;nodejs.org 的大文件传输�滞时,由支�范围请求的传输镜�续传相�字节,但版本和 SHA-256 ���属于 nodejs.org,归档通过该校验���会投入使用。稳定的 `windows` 作业 ID �是 `all checks passed` 的�赖项。[已归档的 Wine 实验](../../archived/process/2026-07-27-wine-windows-gates-experiment.md)�留其实测��,而本文负责当��通�拓扑。 -�个拉�请求还会在组织自有的 `dsh-windows-2025-16core` �行器上�动一个常规且独立的 `windows-native` 作业,�称为 `windows node 24 / native complete`。该作业为工作区符�链接�用开�人员模�,通过 `pnpm/action-setup` �供仓库固定版本的 pnpm,在�传输 store 归档的情况下执行���安装,并在原生 PowerShell 下�行 `pnpm run check:ci:windows-complete`。门���时,60 分钟超时会为其设定上�,�时�把实测性能目标当作正确性截止时间。 +�个拉�请求还会在组织自有的 `dsh-windows-2025-16core` �行器上�动一个常规且独立的 `windows-native` 作业,�称为 `windows node 24 / native complete`。该作业为工作区符�链接�用开�人员模�,通过 `pnpm/action-setup` �供仓库固定版本的 pnpm,在�传输 store 归档的情况下执行���安装,并在原生 PowerShell 下�行 `pnpm run check:ci:windows-complete`。门���时,120 分钟超时会为其设定上�,�时�把实测性能目标当作正确性截止时间。 原生作业被刻�排除在 `all-checks-passed.needs` 之外,且�使用 `continue-on-error`:���程既�等待它,也�会因它改�结论;该作业则�留自身未被掩盖的结果。工作区构建�生产网站和�文件 100% 覆盖率检查失败会使原生作业失败。更广泛的��检查�文档�包和构建产物�移�性清��作为观测项报告。��的 lint 与快照强制检查�由 Linux 负责,原生 Windows 则独立强制执行�支���覆盖率。 diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml index 9f147f34bb..851f0e9d2d 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-08-10-npm-release-sequences.md -2026-08-10-npm-release-sequences.md: 13f343911b6d684ec8738b2245ceae8d848e2f0c -2026-08-10-npm-release-sequences.zh.md: 4116b74b54e84d33df29fd0ab9169f8d38d5514d +2026-08-10-npm-release-sequences.md: d8495f158482d5d6e06a1752a096d1e9200b6070 +2026-08-10-npm-release-sequences.zh.md: 24b466f6b7b10d31ac2e025da6e12ec3c91c7548 diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md index 13f343911b..d8495f1584 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.md @@ -26,7 +26,7 @@ Two hard blockers sat in the way. All 217 workspace manifests set `private: true | vendored framework | the nine `vendor/*` packages | each package on its own version line | `vendor--v` (one per package) | `release-vendor.yml` | | native | `native/landlock-run/packages/*` | its own `0.0.x` | `landlock-run-v` | `landlock-run-release.yml` | -All three publish privately to the `@deepseek-ai` scope on npmjs.com. `publishConfig.access` in each manifest is `restricted` and no workflow passes `--access`, because a command-line flag overrides the manifest. +All three publish to the `@deepseek-ai` scope on npmjs.com, and access is per sequence rather than per scope: the vendored framework and the native packages are `public`, the dsh family is `restricted` ([rationale](2026-08-13-public-vendor-and-native-sequences.md)). No publish path passes `--access`, because one flag cannot serve sequences that disagree and would override the manifest that owns the level. ### Versions land in the repository from a local command; CI only checks and uploads @@ -70,12 +70,24 @@ Publication runs only from GitHub Actions; there is no local publication path. P The third state catches code that changed without a version bump. The first two provide idempotence — re-running publish over one artifact republishes nothing and needs no manual selection of packages. The same rule resolves the tension between one vendor release carrying several tags and a workflow that can only run from one ref: the workflow never infers which packages to publish from the tag it ran from. +All three sequences decide this way, including the native one: it publishes through its own script rather than a shell loop, because a loop of bare `npm publish` calls cannot be retried — the registry answers a repeat of an existing version permanently, so one failure partway through left no way forward. + +Two registry behaviours shape how a publish is attempted. Writes are spaced by at least two seconds and retried with a backoff, because publishing several packages back to back outruns the registry's own processing and earns `E409 Failed to save packument`. And every retry re-reads the registry first: a reported failure can answer a write that landed anyway, so a version that now exists with this tarball's integrity counts as published rather than as a version to place again. + ### Workspace-internal references use the `workspace:` protocol Every reference to a workspace member uses `workspace:^`, so `pnpm pack` substitutes a range matching the target version: sibling `peerDependencies` follow the family version, and a reference to a vendored package follows that package's own line. The Landlock platform packages keep `workspace:*`, which publishes the exact version, because a platform package and its entry must agree exactly. `scripts/check-workspace-constraints.ts` requires the protocol, so a new package cannot reintroduce a hand-written range; the invariant-companion rule requires `workspace:^` for `@deepseek-ai/dsh-invariants` for the same reason. +### An optional dependency is never loaded at module scope + +A dependency in `optionalDependencies`, or a peer carrying `peerDependenciesMeta..optional`, may be absent from an installed tree — that absence is the whole promise of "optional". A static import is evaluated when the importing module loads, so one absent package stops being "this capability is unavailable" and becomes a load failure for everything that reaches the importing module. The failure appears only in an installed tree missing that package, and no test here constructs one: a workspace install always has every package, so the unit tests, the snapshots, and the packed-install probe all pass while the published package is broken for the consumer who declined the optional peer. + +[`verify-optional-dependency-imports`](../../../../scripts/verify-optional-dependency-imports.ts) closes that hole. It reads each package's own manifest for what that package allows to be absent, then scans the files that ship — `packages/*/*/src/` and `apps/*/src/` — across both compiler faces. `vendor/` is out of scope, as pinned upstream source under the [vendoring policy](../../../../vendor/README.md). Value-versus-type is decided against a bound Program rather than the import syntax, because `verbatimModuleSyntax` is off: the compiler already erases an import whose bindings resolve to types, so `import type {}`, `import {}`, an inline `type` specifier, and a named binding that resolves to a type all emit nothing and are allowed, while a bare import, a value binding, and a star re-export are kept and rejected. Only the type phase erases an import: `import defer` still resolves and links its module, deferring evaluation alone, so the gate counts it as a load. + +A violation names the package, the declaration that made it optional, and the way out in order — import it as a type, which is all that declaration merging needs, or restructure so module scope does not need the package. A dynamic `import()` only moves the failure to first use, so it belongs to a caller that genuinely requires the package and handles its absence; reaching for it is a sign the dependency is not optional, and the gate does not offer it as the remedy. + ### Release family objects The entity in this domain is a **release family**: a set of packages sharing one version baseline and tag naming that publishes as a unit. Adding a family means adding a subclass and a workflow lane, not changing the core. @@ -84,9 +96,9 @@ The entity in this domain is a **release family**: a set of packages sharing one |---|---| | `ReleaseFamily` | a family's identity: member discovery, version baseline, tag prefix, packed-payload rule, installed entry | | `ReleaseMember` | one publishable package: directory, name, version, manifest | -| `publishOrder` | topological order over runtime dependencies, ties broken by package name; a cycle is reported rather than resolved arbitrarily | +| `publishOrder` | topological order over the sections npm installs plus peer declarations, ties broken by package name; a cycle among installed dependencies is reported rather than resolved arbitrarily, and a peer edge no order can honour is dropped and named | | `pack` | packs a whole family into one directory and records the upload order | -| `verify` | the family's version baseline, and — when publishing — that the run comes from that family's tag and its members are publishable | +| `verify` | the family's version baseline, the publish order it prints in full, and — when publishing — that the run comes from that family's tag and its members are publishable | | `verify-packed-install` | installs the tarballs of one or more pack directories into a throwaway consumer and drives the installed executable | | `publish` | the three registry states above | | `process` / `tarball` | the one home for spawning commands and for reading a packed tarball, including the entry guard that keeps every script importable | @@ -107,12 +119,12 @@ The verification also packs the Landlock entry, which `dsh-sandbox-local` declar | Item | Content | |---|---| -| release-set manifests | `private: true` removed; `publishConfig.access: restricted` and `repository` with each package's `directory` added | +| release-set manifests | `private: true` removed; `publishConfig.access` per sequence and `repository` with each package's `directory` added | | release-set boundary | every member of `packages/*/*`, `apps/*`, and `vendor/*` | | dependency protocol | workspace-internal references are `workspace:^`, with `check-workspace-constraints.ts` and the invariant-companion rule requiring it | | root `AGENTS.md` | the convention that vendored packages are `private: true` no longer holds | | `vendor/README.md` | records `src` joining `cordis`'s `files` as a local modification | -| the three native packages | `publishConfig.access: restricted`, and their workflow no longer passes `--access` | +| the three native packages | `publishConfig.access: public`, and their workflow passes no `--access` | ### Relationship to the earlier proposal diff --git a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md index 4116b74b54..24b466f6b7 100644 --- a/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md +++ b/.agents/notes/implemented/process/2026-08-10-npm-release-sequences.zh.md @@ -26,7 +26,7 @@ Status: implemented | vendored framework | `vendor/*` �个包 | �包�自一�版本线 | `vendor-<包�>-v<版本>`(�包一个) | `release-vendor.yml` | | native | `native/landlock-run/packages/*` | 自己的 `0.0.x` | `landlock-run-v<版本>` | `landlock-run-release.yml` | -三组一律�到 npmjs.com 的 `@deepseek-ai` scope 下的�有包。�个 manifest 的 `publishConfig.access` 都是 `restricted`,且没有任何 workflow 传 `--access`——命令行选项会覆盖 manifest。 +三组一律�到 npmjs.com 的 `@deepseek-ai` scope,且 access 按�列而�按 scope 区分:vendored 框架与 native 包是 `public`,dsh �是 `restricted`([�由](2026-08-13-public-vendor-and-native-sequences.md))。没有任何�布路径传 `--access`——一个选项无法�务级别互�相�的�列,且会覆盖真正拥有该级别的 manifest。 ### 版本由本地命令写进仓库,CI �核对与上传 @@ -70,12 +70,24 @@ tag �是 commit 指针,�是�布�功的�明。bump 会� registry 第三�拦�「改了代��没 bump 版本�。�两�给出幂等——�一个 artifact �跑 publish �会���布,也�需�人工挑拣包。�一�规则还解决了「一次 vendor �布�带多个 tag,而 workflow �能从一个 ref 触��的矛盾:workflow 从�从触�它的 tag 去推断该�哪些包。 +三��列都按这套判定,native 也在内:它通过自己的脚本�布,而�是 shell 循环——一串裸 `npm publish` 无法�试,registry 对「��已存在的版本�的回答是永久失败,因此中途失败一次就没有�路了。 + +registry 的两个行为决定了「怎么�试一次�布�。写入之间至少间隔两秒并带退��试,因为连续背�背�多个包会超出 registry 自身的处�速度,�� `E409 Failed to save packument`。而�次�试都先�查 registry:报出�的失败�能对应一次其实已��地的写入,所以「该版本现在存在且 integrity 与本 tarball 相��算作已�布,而�是�一个待放置的版本。 + ### workspace 内部引用走 `workspace:` �议 所有指� workspace �员的引用都用 `workspace:^`,由 `pnpm pack` 替��匹�目标版本的范围:兄弟包的 `peerDependencies` 跟��版本,指� vendored 包的引用跟�那个包自己的版本线。Landlock 平�包�留 `workspace:*`(�布�精确版本),因为平�包与它的入�必须版本完全一致。 `scripts/check-workspace-constraints.ts` �求这个�议,所以新包无法�引入硬写的范围;��,invariant companion 规则�求 `@deepseek-ai/dsh-invariants` 用 `workspace:^`。 +### optional �赖��在模�作用域被加载 + +`optionalDependencies` 里的�赖,或带 `peerDependenciesMeta..optional` 的 peer,在安装出�的树里�以�存在——这份「�以�存在�正是 optional 的全部承诺。而�� import 在引入方模�加载时就求值,于是一个缺失的包��表现为「这个能力��用�,而是��所有能走到该模�的代�的加载失败。这�失败�在「缺了该包的安装树�里出现,而本仓没有任何测试构造这�树:workspace 安装总是把�个包都装上,所以�测�快照�打包安装探针全都会过,而那个拒�了这个 optional peer 的消费者拿到的�是�的包。 + +[`verify-optional-dependency-imports`](../../../../scripts/verify-optional-dependency-imports.ts) 堵掉这个洞。它从�个包自己的 manifest 读�「这个包�许�缺失�,�扫�会�布出去的文件——`packages/*/*/src/` 与 `apps/*/src/`——且两个编译门��扫一�。`vendor/` �在范围内,那是[� vendoring 政策管辖](../../../../vendor/README.md)的固定上游��。值与类型的判定对�绑定好的 Program �,而�是看 import 写法,因为 `verbatimModuleSyntax` 是关的:编译器本�就会消除绑定解�为类型的 import,所以 `import type {}`�`import {}`�内� `type` 说明符�以�解�为类型的具�绑定都�产生产物�一律放行,而裸 import�值绑定�星� re-export 会被�留�一律报错。�有 type 相�会消除 import:`import defer` �然解�并链接它的模�,�推迟求值,所以门�把它算作一次加载。 + +报错会点�这个包�点�是哪�声明把它标� optional 的,并按顺�给出出路——把它作为类型引入(声明�并需�的仅此而已),或者调整写法让模�作用域��需�这个包。动� `import()` �是把失败推迟到首次使用,它属于那�确实需�这个包�并且自己处�缺失的调用方;会想到它,往往说明这个�赖并� optional,所以门��把它作为解法给出。 + ### �布�对象 这个领域里的实体是**�布�**:一组共享版本基线与 tag 命���整体�布的包。新增一�等于加一个�类和一� workflow lane,�改核心。 @@ -84,9 +96,9 @@ tag �是 commit 指针,�是�布�功的�明。bump 会� registry |---|---| | `ReleaseFamily` | 一�的身份:�员�现�版本基线�tag �缀�打包 payload 规则�已安装入� | | `ReleaseMember` | 一个��布包:目录�包��版本�manifest | -| `publishOrder` | 按�行时�赖的拓扑�,�层按包�排;�到环是报错而�是��定� | +| `publishOrder` | 按 npm 会安装的�赖段加 peer 声明�拓扑�,�层按包�排;安装�赖�环是报错而�是��定�,任何排�进去的 peer 边被丢弃并点� | | `pack` | 把整�打进一个目录并记录上传顺� | -| `verify` | �的版本基线;�布时还�求本次�行�自该�的 tag�且�员��布 | +| `verify` | �的版本基线�完整打�出�的�布顺�;�布时还�求本次�行�自该�的 tag�且�员��布 | | `verify-packed-install` | 把一个或多个 pack 目录的 tarball 装进一次性 consumer,并驱动已安装的�执行入� | | `publish` | 上�那三� | | `process` / `tarball` | �动命令�读�打包 tarball 的唯一正家,其中的入�守�让�个脚本都�被 import | @@ -107,12 +119,12 @@ dsh 的验�会一并安装 vendored �的 pack 产物。harness 的包把 ven | 项 | 内容 | |---|---| -| �布集 manifest | 去掉 `private: true`;补 `publishConfig.access: restricted` 与带�自 `directory` 的 `repository` | +| �布集 manifest | 去掉 `private: true`;按�列补 `publishConfig.access` 与带�自 `directory` 的 `repository` | | �布集边界 | `packages/*/*`�`apps/*`�`vendor/*` 的全部�员 | | �赖�议 | workspace 内部引用为 `workspace:^`,由 `check-workspace-constraints.ts` 与 invariant companion 规则强制 | | 根 `AGENTS.md` | 「vendored 包是 `private: true`�这�约定���立 | | `vendor/README.md` | 记录「`src` 加入 `cordis` 的 `files`�这�本地修改 | -| native 三包 | `publishConfig.access: restricted`,且其 workflow ��传 `--access` | +| native 三包 | `publishConfig.access: public`,且其 workflow �传 `--access` | ### 与先��案的关系 diff --git a/.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.i18n.yaml b/.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.i18n.yaml new file mode 100644 index 0000000000..07a3e279de --- /dev/null +++ b/.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.md +2026-08-13-public-vendor-and-native-sequences.md: ada7c3bcbe5feb288d67fe8e7ee7204dda6b4597 +2026-08-13-public-vendor-and-native-sequences.zh.md: 1f687d1134baf58c59f5cf6014e265b24a38042f diff --git a/.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.md b/.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.md new file mode 100644 index 0000000000..ada7c3bcbe --- /dev/null +++ b/.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.md @@ -0,0 +1,45 @@ +# Agent Note: npm access per release sequence: the vendored framework and the native packages publish publicly + +Status: implemented + +English | [中文](2026-08-13-public-vendor-and-native-sequences.zh.md) + +## Problem + +The [three release sequences](2026-08-10-npm-release-sequences.md) shipped with `publishConfig.access: restricted`, so every package published to the `@deepseek-ai` scope was visible only inside the organization. Five rehearsal publications ran that way, through `dsh@0.0.1-rc.5`, `vendor *-rc.4`, and `landlock-run@0.0.1`. + +A restricted dependency is what actually blocks a public consumer. Every harness package declares the vendored framework as a `peerDependency`, and `dsh-sandbox-local` declares the Landlock entry as a `dependency`. A public package that requires a restricted one cannot be installed by anyone outside the organization, so those two sequences have to be public before the dsh family can be — and while the dsh family is still restricted, they are the only two whose artifacts an outside consumer would need to resolve. + +## Decision + +Access is a property of each release sequence, not of the scope: + +| Sequence | Members | `publishConfig.access` | +|---|---|---| +| vendored framework | the nine `vendor/*` packages | `public` | +| native | the three `native/landlock-run/packages/*` packages | `public` | +| dsh | `packages/*/*` + `apps/*` (221 members) | `restricted` | + +`check-workspace-constraints.ts` holds every manifest to its own sequence's level, which is what stops the scope from drifting: a new `vendor/*` package left at `restricted`, or a dsh member flipped to `public`, fails the workspace constraints. + +**No publish path passes `--access`.** A single flag cannot serve sequences that disagree, and a flag overrides the manifest that owns the fact — so `publish.ts` passes none, and the native workflow continues to pass none. Each packed manifest decides. + +Harness consumers reference the Landlock entry as `workspace:^` rather than `workspace:*`, so a published harness package accepts the entry's patch and minor releases instead of pinning one exact version. The entry keeps `workspace:*` for its two platform packages, where the binary must match the entry version exactly. + +Access is a property of the package, not of a version: the twelve packages already published as restricted — `landlock-run@0.0.1` and the vendored `*-rc.*` versions — become world-readable at their next publication. + +## Alternatives considered + +**Flip the whole scope public at once.** Rejected for now: it would make the next dsh release public as a side effect of a manifest change rather than a deliberate release decision. Opening the two dependency sequences first is the order that keeps every published package installable at each step, and it is the precondition for opening dsh whenever that is decided. + +**Keep everything restricted and grant a read-only team instead.** `npm access grant read-only ` is per-package with no scope wildcard, so covering the set means one grant per package plus a standing reconciliation job for every package added afterwards. It also only reaches organization members, which does not serve an installable public artifact. + +**Publish public from the publish path instead of the manifests.** Impossible for a mixed scope — one `--access` flag cannot express two levels — and it would override the manifest that the workspace constraint already checks. + +## Consequences + +- **The twelve packages are public from their next publication onward, and that is not cleanly reversible.** Returning to a restricted scope requires a paid plan plus per-package `npm access set status=private`, and anything already downloaded or mirrored stays out. +- **`@deepseek-ai/dsh` is still not installable from outside the organization.** Its manifests stay `restricted`; what changed is that its published dependencies no longer would be, so opening it later is a version decision rather than a dependency problem. +- **What ships from the two public sequences is now world-readable, so their payload policy carries more weight.** `vendor/cordis` publishes `src` deliberately, because its export map declares `./src/*`; the Landlock entry publishes `src/main.c` as a documented audit surface. +- **The private-packages plan is no longer required for these two sequences.** The `402 Payment Required` failure that blocked the first native publication cannot recur for a public package. +- **An unauthenticated `npm view` becomes a usable check for the public sequences.** While every package was restricted, a machine without credentials received `E404` for a package that existed, which is indistinguishable from an absent version. diff --git a/.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.zh.md b/.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.zh.md new file mode 100644 index 0000000000..1f687d1134 --- /dev/null +++ b/.agents/notes/implemented/process/2026-08-13-public-vendor-and-native-sequences.zh.md @@ -0,0 +1,45 @@ +# Agent Note: 按�布�列区分 npm access:vendored 框架与 native 包公开�布 + +Status: implemented + +[English](2026-08-13-public-vendor-and-native-sequences.md) | 中文 + +## Problem + +[三��布�列](2026-08-10-npm-release-sequences.md)交付时带的是 `publishConfig.access: restricted`,因此�到 `@deepseek-ai` scope 的�个包�在组织内��。五次排练�布都是这样跑的:`dsh@0.0.1-rc.5`�vendor 的 `*-rc.4`�`landlock-run@0.0.1`。 + +真正��公开消费者的是**��的�赖**。�个 harness 包都把 vendored 框架声明� `peerDependency`,`dsh-sandbox-local` 把 Landlock 入�声明� `dependency`。一个公开包若�求一个��包,组织外的人根本装�上;所以这两��列必须先公开,dsh ���能公开 —— 而在 dsh ����期间,它们也正是外部消费者唯一需�解�到的两�。 + +## Decision + +access 是���布�列的属性,�是整个 scope 的属性: + +| �列 | �员 | `publishConfig.access` | +|---|---|---| +| vendored 框架 | `vendor/*` �包 | `public` | +| native | `native/landlock-run/packages/*` 三包 | `public` | +| dsh | `packages/*/*` + `apps/*`(221 个�员) | `restricted` | + +`check-workspace-constraints.ts` 按�自�列的级别校验�个 manifest,这是阻止 scope 漂移的那�闸:新增的 `vendor/*` 包留在 `restricted`�或�个 dsh �员被改� `public`,都会让 workspace 约�失败。 + +**没有任何�布路径传 `--access`。** 一个选项无法�务级别互�相�的�列,而且选项会覆盖真正拥有这个事实的 manifest —— 所以 `publish.ts` �传,native 的 workflow 也照旧�传,由� packed manifest 决定。 + +harness 消费方引用 Landlock 入�改用 `workspace:^` 而� `workspace:*`,于是�布出去的 harness 包接�该入�的 patch 与 minor 版本,而�是钉死一个精确版本。入�对它那两个平�包��� `workspace:*` —— 那里二进制必须与入�版本完全一致。 + +access 是包的属性��是版本的属性:已�以 restricted �布的这�二个包(`landlock-run@0.0.1` 与 vendored 的 `*-rc.*`)会在**下一次�布**时�为全网�读。 + +## Alternatives considered + +**一次性把整个 scope 改� public。** 暂�采用:那会让下一次 dsh �布因为一次 manifest 改动而顺带��公开,而�是出自一个刻�的�布决定。先公开这两��赖�列,是能让�一步的已�布包都���安装的顺�,也是将�决定公开 dsh 时的�置�件。 + +**全部����,改为授予一个�读 team。** `npm access grant read-only <包>` 是�包的�没有 scope 通�,覆盖全集�味��个包一次 grant,外加一个为�续新增包长期补�的对账任务。它也�能覆盖组织�员,无法�务一个�安装的公开产物。 + +**在�布路径而�是 manifest 里指定公开。** 混� scope 下��能 —— 一个 `--access` 选项表达�了两�级别 —— 而且它会覆盖 workspace 约�正在校验的那个 manifest。 + +## Consequences + +- **这�二个包从下一次�布起就是公开的,而且�能干净地回退。** 回到�� scope 需�付费套�加�包 `npm access set status=private`,且已�被下载或镜�的内容收�回�。 +- **`@deepseek-ai/dsh` �然装�了(组织外)。** 它的 manifest �� `restricted`;�化的是它已�布的�赖����,所以将�公开它是一个版本决定,而��是�赖问题。 +- **两�公开�列交付的内容�为全网�读,它们的 payload 策略分�因此��。** `vendor/cordis` 有��布 `src`,因为其导出映射声明了 `./src/*`;Landlock 入�按既有约定�布 `src/main.c` 作为审计�。 +- **这两��列��需��有包套�。** 阻塞过首次 native �布的 `402 Payment Required` 失败形�对公开包�会�出现。 +- **对公开�列,无凭�的 `npm view` �为一个�用的检查手段。** 在所有包都��的时期,没有凭�的机器对一个确实存在的包会收到 `E404`,与「版本�存在�无法区分。 diff --git a/.agents/notes/implemented/process/2026-08-13-published-document-fragments.i18n.yaml b/.agents/notes/implemented/process/2026-08-13-published-document-fragments.i18n.yaml new file mode 100644 index 0000000000..d90edf5075 --- /dev/null +++ b/.agents/notes/implemented/process/2026-08-13-published-document-fragments.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/process/2026-08-13-published-document-fragments.md +2026-08-13-published-document-fragments.md: 4146a592a97b5d8b4e1d3fbabd0f035074cc8001 +2026-08-13-published-document-fragments.zh.md: 6cf76dfa349bbd61d1dd51cb683b696e4c405435 diff --git a/.agents/notes/implemented/process/2026-08-13-published-document-fragments.md b/.agents/notes/implemented/process/2026-08-13-published-document-fragments.md new file mode 100644 index 0000000000..4146a592a9 --- /dev/null +++ b/.agents/notes/implemented/process/2026-08-13-published-document-fragments.md @@ -0,0 +1,27 @@ +# Agent Note: Validate published document fragments + +Status: implemented + +English | [中文](2026-08-13-published-document-fragments.zh.md) + +## Problem + +`verify-md-links` validates fragments with GitHub's Markdown heading ids, while the documentation website renders headings with VitePress. Punctuation-heavy headings and translated headings can therefore pass source validation but produce links to ids absent from the published HTML. A successful VitePress build validates target pages, not fragment ids. + +## Decision + +`docs:build` and its MPA variant run `verify-doc-site-fragments` after VitePress emits `website/.dist`. The verifier parses every emitted HTML page, resolves each internal fragment link against VitePress clean URLs, and fails when the output is absent, routes are ambiguous, an href is malformed, or either the target page or requested id is missing. Unit tests cover those failures plus clean URLs, `.html` aliases, same-page links, encoded and literal ids, and external-link exclusion. + +Any fragment target heading whose GitHub id differs from its VitePress id carries an explicit GitHub-compatible alias. Authored English and translated pages place the alias before the heading; translated pages use the English id shared by the bilingual pair. Generated config, tool, and persistence catalogs emit the alias from their owning generator. Source Markdown validation remains independent and continues to reject links that do not resolve under repository rendering. + +## Alternatives considered + +**Use locale-specific fragments.** Bilingual pairs intentionally preserve identical link targets. Locale-specific fragments would make the two sources disagree and would require every link producer to know the target locale's translated heading. + +**Rely on VitePress heading ids.** Those ids depend on rendered punctuation and localized heading text. They do not preserve the GitHub ids already used by repository links and generated references. + +**Check source Markdown only.** This leaves the published artifact unverified and cannot detect differences between the GitHub and VitePress slug algorithms. + +## Consequences + +Every production documentation build reads its emitted HTML once, adding a bounded post-build check to the existing site build. Cross-page fragment links now require an id that survives publication. Explicit aliases become part of the published reference and let headings change language or punctuation without invalidating established fragments. diff --git a/.agents/notes/implemented/process/2026-08-13-published-document-fragments.zh.md b/.agents/notes/implemented/process/2026-08-13-published-document-fragments.zh.md new file mode 100644 index 0000000000..6cf76dfa34 --- /dev/null +++ b/.agents/notes/implemented/process/2026-08-13-published-document-fragments.zh.md @@ -0,0 +1,27 @@ +# Agent Note: 校验已�布文档的 fragment + +Status: implemented + +[English](2026-08-13-published-document-fragments.md) | 中文 + +## Problem + +`verify-md-links` 使用 GitHub 的 Markdown 标题 id 校验 fragment,而文档网站使用 VitePress 渲染标题。包�较多标点的标题与翻译�的标题�能通过��校验,�在已�布 HTML 中没有对应 id。VitePress 构建�功�会校验目标页�,�会校验 fragment id。 + +## Decision + +`docs:build` �其 MPA �体会在 VitePress 生� `website/.dist` ��行 `verify-doc-site-fragments`。该校验器解��个生�的 HTML 页�,按照 VitePress clean URL 解��个内部 fragment 链接,并在构建产物�存在�路由有歧义�href 格�错误�目标页��存在或请求的 id 缺失时失败。�元测试覆盖这些失败,以� clean URL�`.html` 别���页链接�编�和字� id 与外部链接排除。 + +任何 GitHub id 与 VitePress id ��的 fragment 目标标题都会带有与 GitHub 兼容的显�别�。英文手写页�和翻译页�会在标题�添加别�;翻译页�使用�语对侧文件共享的英文 id。生�的�置�工具和�久化目录由所属生�器输出别�。�� Markdown 校验��独立,�会拒�在仓库渲染规则下无法解�的链接。 + +## Alternatives considered + +**使用�语言专属的 fragment。** �语对侧文件会刻��留相�的链接目标。语言专属 fragment 会使两侧���一致,还会�求�个链接生�方都了解目标语言翻译�的标题。 + +**�赖 VitePress 标题 id。** 这些 id �决于渲染�的标点与本地化标题文本,无法�留仓库链接和生�引用已�使用的 GitHub id。 + +**�检查 Markdown ��。** 这��法�会校验�布产物,也无法�现 GitHub 与 VitePress slug 算法之间的差异。 + +## Consequences + +�次生产文档构建都会读�一次生�的 HTML,在现有网站构建�增加一个有界检查。跨页� fragment 链接必须指��布��存在的 id。显�别��为已�布�考的一部分,使标题更�语言或标点��能�留既有 fragment。 diff --git a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.i18n.yaml b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.i18n.yaml index e2ff001696..9c09464d87 100644 --- a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.i18n.yaml +++ b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md -2026-06-26-fsspec-style-fs-seam.md: ec3ee9bd0781b64b804f58c32cb59afc7f05e0d4 -2026-06-26-fsspec-style-fs-seam.zh.md: a4e50c401e56854933bcaebd24cf9955949b3c31 +2026-06-26-fsspec-style-fs-seam.md: 927220a4042a47aa1a76926161427613f3a2b809 +2026-06-26-fsspec-style-fs-seam.zh.md: 52c55f82f77d4101f1e659d4642689e5aa3a804f diff --git a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md index ec3ee9bd07..927220a404 100644 --- a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md +++ b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.md @@ -105,7 +105,7 @@ This Agent Note reverses two decisions from [filesystem-capability-seam](../arch - Text reads no longer return backend-numbered line records or `full`/`partial` views; authorization is based on version freshness, so a windowed read can authorize edit when the file is unchanged. - Literal edit no longer sits behind the old `applyEdit` API that mixed backend mutation with seam-owned observation policy. It remains a provider primitive as `editText`, because version guard + literal match + atomic rewrite must stay inside the provider's mutation critical section. -It keeps the Service Definition / Service provider / Consumer discipline, consumer-never-imports-backend rule, backend-defined target/version/display metadata, atomic local writes, and the shared `FsError` taxonomy. +It keeps the Service Definition / Service Provider / Consumer discipline, consumer-never-imports-backend rule, backend-defined target/version/display metadata, atomic local writes, and the shared `FsError` taxonomy. ## Verification diff --git a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.zh.md b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.zh.md index a4e50c401e..52c55f82f7 100644 --- a/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.zh.md +++ b/.agents/notes/implemented/simplification/2026-06-26-fsspec-style-fs-seam.zh.md @@ -105,7 +105,7 @@ type FsWriteIntent = - 文本读���返回�端编�的行记录或 `full`/`partial` 视图;授�基于版本新鲜度,因此窗�化读�在文件未�时��授�编辑。 - 字�编辑���于旧的 `applyEdit` API 之�(该 API 混�了�端�更与 seam 拥有的观测策略)。它作为 `editText` �留为�供方原语,因为版本守� + 字�匹� + 原��写必须留在�供方的�更临界区内。 -�留的内容:Service Definition / Service provider / Consumer 纪律�消费方�导入�端规则��端定义的 target/version/display 元数��原�本地写入,以�共享的 `FsError` 分类体系。 +�留的内容:Service Definition / Service Provider / Consumer 纪律�消费方�导入�端规则��端定义的 target/version/display 元数��原�本地写入,以�共享的 `FsError` 分类体系。 ## 验� diff --git a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.i18n.yaml b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.i18n.yaml index c24200f8be..29dd78cab1 100644 --- a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.i18n.yaml +++ b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md -2026-08-11-remove-sdk-project-toolchain.md: cfaf0df46e34d419f5d0b2d5a2a25580675fdc31 -2026-08-11-remove-sdk-project-toolchain.zh.md: 3b563007bf92f94adab6c68eeaa9c6c1522815e4 +2026-08-11-remove-sdk-project-toolchain.md: fc896c2823a1ccddf06c8dce788c4ffe72a9367a +2026-08-11-remove-sdk-project-toolchain.zh.md: a258ca39bc824fbf9f1717c10e6b123d52689af5 diff --git a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md index cfaf0df46e..fc896c2823 100644 --- a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md +++ b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.md @@ -16,7 +16,7 @@ The same `scaffold/` group also contained the independently used SDK protocol, T The SDK project toolchain is deleted. The `@deepseek-ai/create-sdk`, `@deepseek-ai/dsh-scripts`, `@deepseek-ai/dsh-helper`, and `@deepseek-ai/dsh-telemetry` packages, their binaries, tests, templates, feature catalog, project-editing model, package-manager support, launcher telemetry, and repository creation skill have no replacement or compatibility layer. Their workspace, build, test, packaging, documentation-generator, vendoring-rescope, and dependency records are removed with them. -The runtime SDK remains. `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and `@deepseek-ai/dsh-sdk-jsonrpc-server` move unchanged from `packages/scaffold/` to `packages/sdk/`; their npm names and wire behavior do not change. Consumers continue to provide an executable plus an external `cordis.yml`, and the JSON-RPC server remains an ordinary plugin selected by that configuration. +The runtime SDK remains. `@deepseek-ai/dsh-sdk-client`, `@deepseek-ai/dsh-sdk-protocol`, and `@deepseek-ai/dsh-sdk-jsonrpc-server` move unchanged from `packages/scaffold/` to `packages/sdk/`; their npm names and wire behavior do not change. Consumers continue to provide an executable plus an external `cordis.yml`, and the JSON-RPC server remains an ordinary plugin selected by that configuration. The [repository naming contract](../architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md) owns this one repository meaning of `SDK` and the surviving package names; this note owns the deleted toolchain. The canceled developer-project, project-editing, and follow-up-capabilities proposals are deleted rather than retained as active or rejected records. This note preserves the motivation they shared, the decision not to ship that product, the capability given up, and the condition for reconsideration. Frozen archived Agent Notes remain historical snapshots and are not edited. diff --git a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.zh.md b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.zh.md index 3b563007bf..a258ca39bc 100644 --- a/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.zh.md +++ b/.agents/notes/implemented/simplification/2026-08-11-remove-sdk-project-toolchain.zh.md @@ -16,7 +16,7 @@ Status: implemented 删除 SDK 项目工具链。`@deepseek-ai/create-sdk`�`@deepseek-ai/dsh-scripts`�`@deepseek-ai/dsh-helper` 和 `@deepseek-ai/dsh-telemetry` 包�其二进制文件�测试�模��功能目录�项目编辑模型�包管�器支���动器�测和仓库项目创建 skill ���供替代实现或兼容层。与其对应的 workspace�构建�测试�打包�文档生�器�vendor scope �写和�赖记录也一并移除。 -�留�行时 SDK。`@deepseek-ai/dsh-sdk-client`�`@deepseek-ai/dsh-sdk-protocol` 和 `@deepseek-ai/dsh-sdk-jsonrpc-server` ��原样,从 `packages/scaffold/` 移至 `packages/sdk/`;其 npm �称和�议交互行为����。消费方继续�供一个�执行文件和一份外置 `cordis.yml`,JSON-RPC �务器�是由该�置选择的普通�件。 +�留�行时 SDK。`@deepseek-ai/dsh-sdk-client`�`@deepseek-ai/dsh-sdk-protocol` 和 `@deepseek-ai/dsh-sdk-jsonrpc-server` ��原样,从 `packages/scaffold/` 移至 `packages/sdk/`;其 npm �称和�议交互行为����。消费方继续�供一个�执行文件和一份外置 `cordis.yml`,JSON-RPC �务器�是由该�置选择的普通�件。[仓库命�约定](../architecture/2026-08-11-repository-naming-contract-and-rename-ledger.md)负责规定 `SDK` 在仓库中的唯一�义和�留的包�;本说明负责记录已删除的工具链。 被�消的开�者项目�项目编辑和�续能力�案予以删除,而�是�留为活跃或已�决记录。本 Agent Note �留这些�案共有的动机��交付该产�的决策�放弃的能力,以��新考虑这一决定的�件。已冻结的归档 Agent Note �是历�快照,�作修改。 diff --git a/.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.i18n.yaml b/.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.i18n.yaml new file mode 100644 index 0000000000..44f197e39d --- /dev/null +++ b/.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md +2026-08-12-production-dsh-excludes-product-subagent-providers.md: 3e3e4fbefb31932a637bfe05ff0d90916e202a79 +2026-08-12-production-dsh-excludes-product-subagent-providers.zh.md: 166964675bf7084b62f5500969e5756c9bd9f644 diff --git a/.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md b/.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md new file mode 100644 index 0000000000..3e3e4fbefb --- /dev/null +++ b/.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.md @@ -0,0 +1,25 @@ +# Agent Note: Production dsh excludes product subagent providers + +Status: implemented + +English | [中文](2026-08-12-production-dsh-excludes-product-subagent-providers.zh.md) + +## Problem + +`@deepseek-ai/dsh` receives the `@deepseek-ai/dsh-base` dependency closure. Including the Codex and Claude Code subagent providers there makes every production install download optional product integration code, including the Claude Agent SDK, even when neither integration is used. + +## Decision + +This decision supersedes the [shared-host placement](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md): `@deepseek-ai/dsh-base` does not depend on or mount the Codex and Claude Code subagent providers. Their packages remain available for Profiles that install and mount them explicitly. Repository examples keep direct development dependencies so their explicit provider configurations continue to resolve. + +## Verification + +The base bundle test rejects both provider dependencies and configuration rows. Cordis configuration validation requires explicit examples to declare the provider packages they name. + +## Alternatives considered + +**Keep dormant providers in the base bundle.** Dormant providers start no product processes, but their packages still enter every production npm install. + +## Consequences + +Installing `@deepseek-ai/dsh` does not download either product provider through the base bundle. Using either integration requires explicit Profile configuration. diff --git a/.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.zh.md b/.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.zh.md new file mode 100644 index 0000000000..166964675b --- /dev/null +++ b/.agents/notes/implemented/simplification/2026-08-12-production-dsh-excludes-product-subagent-providers.zh.md @@ -0,0 +1,25 @@ +# Agent Note: 生产 dsh 排除产� subagent �供方 + +Status: implemented + +[English](2026-08-12-production-dsh-excludes-product-subagent-providers.md) | 中文 + +## 问题 + +`@deepseek-ai/dsh` 会获得 `@deepseek-ai/dsh-base` 的�赖闭包。如果 base 包� Codex 与 Claude Code subagent �供方,�次生产安装都会下载�选的产�集�代�,包括 Claude Agent SDK,�使用户并未使用任一集�。 + +## 决策 + +本决策�代[共享 host 放置决策](../architecture/2026-08-10-product-subagent-providers-in-shared-host.md):`@deepseek-ai/dsh-base` ��赖也�挂载 Codex 与 Claude Code subagent �供方。需�这些集�的 Profile ��显�安装并挂载对应包。仓库 examples �留直接开��赖,使其显��供方�置�以继续解�。 + +## 验� + +base 组�包测试会拒�这两个�供方�赖与�置行。Cordis �置验��求显� examples 声明其引用的�供方包。 + +## 考虑过的替代方案 + +**在 base 组�包中�留休眠�供方。** 休眠�供方�会�动产�进程,但其包�会进入�次生产 NPM 安装。 + +## �果 + +安装 `@deepseek-ai/dsh` 时,�会通过 base 组�包下载任一产��供方。使用任一集�都需�显� Profile �置。 diff --git a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml new file mode 100644 index 0000000000..e48ec3de3b --- /dev/null +++ b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write .agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md +2026-08-13-remove-first-run-beta-notice.md: 21396eb9cc3e0e766238115967e354abe1032bd2 +2026-08-13-remove-first-run-beta-notice.zh.md: 2818343804e88e7114f5a6298393780b0fdcaf24 diff --git a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md new file mode 100644 index 0000000000..21396eb9cc --- /dev/null +++ b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.md @@ -0,0 +1,25 @@ +# Agent Note: Remove the first-run beta notice + +Status: implemented + +English | [中文](2026-08-13-remove-first-run-beta-notice.zh.md) + +## Problem + +Every GUI first launch opened with a full-viewport internal-test statement (内测声明): internal-beta framing plus instructions for enabling Session Log upload through `DSH_TELEMETRY_MODE`. Session telemetry already resolves to `DISABLED` when its mode is unset ([telemetry default-off](../feature/2026-08-10-telemetry-default-off.md)), so the only onboarding content about telemetry was a prompt explaining how to turn it on, and the internal-test framing itself must not ship in a release build. + +## Decision + +This decision removed the first-run notice from the assembled product rather than rewording it. `ui-settings-general` seated no `settings.onboarding` step; the notice component, acknowledgement store, copy owner, and locale keys were deleted, while the Host kept the `ui-onboarding` namespace so stored documents remained valid. The later [shared-modal product onboarding](../feature/2026-08-13-shared-modal-product-onboarding.md) restores a new concise testing-stage notice in `ui-settings-models`, reusing that field and backend contract without restoring the removed takeover layout or telemetry instructions. Telemetry opt-in remains an explicit deployment environment choice documented in the [CLI reference README](../../../../apps/cli/reference/README.md); the restored notice says nothing about enabling it. + +## Alternatives considered + +**Keep the notice and only drop its telemetry paragraph.** Rejected: the internal-test framing is what a release must not present, and a mandatory first-run interstitial with no material statement left is pure friction. + +**Ask for upload consent instead (a versioned consent step).** Rejected for this release: a first-run question about enabling upload is still a telemetry prompt. A future consent flow can register through the unchanged `settings.onboarding` seam and use a fresh versioned field for re-acknowledgement. + +**Deregister the `ui-onboarding` namespace as well.** Rejected: existing settings documents already carry the section, and the settings seam validates stored documents against registered namespaces; keeping the registration keeps those documents valid at no cost. + +## Consequences + +This removal eliminated the full-viewport notice and its telemetry copy. The later restoration is intentionally a different presentation and copy revision: a shared modal precedes the inline credential dialog, the remote scenario again covers process-local acknowledgement, and the existing `welcomeNoticeVersion` field records the new copy version. The historical telemetry prompt remains absent. diff --git a/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md new file mode 100644 index 0000000000..2818343804 --- /dev/null +++ b/.agents/notes/implemented/simplification/2026-08-13-remove-first-run-beta-notice.zh.md @@ -0,0 +1,25 @@ +# Agent Note: 移除首次�动内测声明 + +Status: implemented + +[English](2026-08-13-remove-first-run-beta-notice.md) | 中文 + +## 问题 + +GUI �次首�都会先显示�满视�的内测声明:内部测试的定�表述,加上通过 `DSH_TELEMETRY_MODE` 开� Session Log 上传的说明。会��测在 mode 未设置时已解�为 `DISABLED`([�测默认关闭](../feature/2026-08-10-telemetry-default-off.md)),因此引导�程中关于�测的全部内容就是一段教用户如何开�的�示,而内部测试的定�表述本身也�应出现在�布版本里。 + +## 决策 + +本决策当时把首�声明从组装�的产�中整体移除,而�是改写。`ui-settings-general` ��注册任何 `settings.onboarding` 步骤;声明组件�确认 store�文案所有者文件和 locale 键�被删除,Host 则�留 `ui-onboarding` namespace,使既有设置文档继续有效。�续的[共用弹窗产�引导](../feature/2026-08-13-shared-modal-product-onboarding.md)在 `ui-settings-models` 中��了一份新的简�测试阶段声明,�用该字段与�端契约,但�会��已移除的接管�布局或�测说明。�测的开��是显�的部署环境��选择,记录在 [CLI reference README](../../../../apps/cli/reference/README.md) 中;���的声明�涉�如何开��测。 + +## 曾考虑的替代方案 + +**�留声明,�删除其中的�测段�。** �予采用:�布版本�应呈现的正是内部测试的定�表述本身,而一个没有实质内容的强制首��页�剩下打扰。 + +**改为询问上传��(版本化的��步骤)。** 本次�布�予采用:首�询问是�开�上传�然是一个�测�示。未�的���程�以通过����的 `settings.onboarding` seam 注册,并使用新的版本化字段��新确认。 + +**连 `ui-onboarding` namespace 一起注销。** �予采用:既有设置文档已�包�该分节,而设置 seam 会用已注册的 namespace 校验存储文档;�留注册就能让这些文档继续有效,且没有�外�本。 + +## �果 + +这次移除消除了�满视�的声明�其�测文案。�续��有�采用��的展示与文案版本:共用弹窗先于行内凭�弹窗出现,远程场景�新覆盖进程内确认,既有 `welcomeNoticeVersion` 字段记录新的文案版本。历�上的�测�示�未��。 diff --git a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.i18n.yaml b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.i18n.yaml index 75270e6a39..56bc51e639 100644 --- a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.i18n.yaml +++ b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md -2026-07-19-required-cancellation-through-tool-capability-seams.md: 380204200711158fcda640fe25551293515fc49a -2026-07-19-required-cancellation-through-tool-capability-seams.zh.md: 631abfaa1cd21578437458cc194e277dc7883792 +2026-07-19-required-cancellation-through-tool-capability-seams.md: 478cd887d84ceae8a5a0cd455fb7cf4b4d562950 +2026-07-19-required-cancellation-through-tool-capability-seams.zh.md: f3afdc953b50751798b412d24ecd7a9efd7d9af2 diff --git a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md index 3802042007..478cd887d8 100644 --- a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md +++ b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.md @@ -18,7 +18,7 @@ Require an `AbortSignal` on every asynchronous same-process capability operation Each direct caller supplies a signal it owns or propagates from its own required operation context. Implementations may derive a child deadline or cancellation scope, but the derived signal remains linked to the upstream signal for the delegated lifetime. Capability implementations do not synthesize never-abort signals, use ambient async-local cancellation, or validate `AbortSignal` at runtime solely to repeat the typed same-process contract. -The migration begins with an inventory from every first-party `ToolDefinition.execute()` through the capability calls it awaits. It then changes each coherent Service Definition / Service provider / Consumer seam together, including tests and generated API documentation. Separate PRs may migrate filesystem, shell/task, web/provider, workflow/subagent, code-runtime, and similar families so each change remains reviewable, but no migrated interface keeps an optional compatibility overload under the repository's pre-release policy. +The migration begins with an inventory from every first-party `ToolDefinition.execute()` through the capability calls it awaits. It then changes each coherent Service Definition / Service Provider / Consumer seam together, including tests and generated API documentation. Separate PRs may migrate filesystem, shell/task, web/provider, workflow/subagent, code-runtime, and similar families so each change remains reviewable, but no migrated interface keeps an optional compatibility overload under the repository's pre-release policy. ### Scope boundary diff --git a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.zh.md b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.zh.md index 631abfaa1c..f3afdc953b 100644 --- a/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.zh.md +++ b/.agents/notes/proposed/architecture/2026-07-19-required-cancellation-through-tool-capability-seams.zh.md @@ -18,7 +18,7 @@ Status: proposed �个直接调用方�供自己�有的信�,或从自身必填的�作上下文继续传递信�。实现�以派生�截止时间或�消作用域,但派生信�在委托期间�须与上游信�关�。能力实现�得生�永�中止信��使用环境�异步本地�消,也�得仅为��类型化�进程约定而在�行时校验 `AbortSignal`。 -�移首先从�个第一方 `ToolDefinition.execute()` 出�,沿其等待的能力调用进行清点;��按内�的 Service Definition�Service provider�Consumer seam,将测试与生�的 API 文档一并修改。文件系统�Bash 与任务�Web 与�供方�工作�与 subagent�代��行时等能力��以通过独立 PR(Pull Request)�移,以���项�更�审查;但根�仓库的预�布原则,已��移的接��得�留�选兼容�载。 +�移首先从�个第一方 `ToolDefinition.execute()` 出�,沿其等待的能力调用进行清点;��按内�的 Service Definition�Service Provider�Consumer seam,将测试与生�的 API 文档一并修改。文件系统�Bash 与任务�Web 与�供方�工作�与 subagent�代��行时等能力��以通过独立 PR(Pull Request)�移,以���项�更�审查;但根�仓库的预�布原则,已��移的接��得�留�选兼容�载。 ### 范围边界 diff --git a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.i18n.yaml b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.i18n.yaml index af319b51a7..e8355305ed 100644 --- a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.i18n.yaml +++ b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write .agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md -2026-07-29-durable-last-activity-index.md: 0e441f54a719b29a1a450c133e08cdf7d2c82e9e -2026-07-29-durable-last-activity-index.zh.md: ebc2e2167d7743eafc5a4600fe9a0f687349e1a3 +2026-07-29-durable-last-activity-index.md: 99e50dd40b789db5d896cb7f9e25fa8893b02ae2 +2026-07-29-durable-last-activity-index.zh.md: e317fb192d53353295e6b52f631707ba6b400b66 diff --git a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md index 0e441f54a7..99e50dd40b 100644 --- a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md +++ b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.md @@ -6,17 +6,17 @@ English | [中文](2026-07-29-durable-last-activity-index.zh.md) ## Problem -A cold (persisted, unattached) session has no stored answer to "when was this last worked in". `dsh-host-apiproxy`'s `summarizeCold()` therefore approximates it with the log file's mtime where one exists — `locate()` resolves a per-session artifact for JSONL and `undefined` for SQLite, whose cold sessions fall back to `createdAt` — and the web client sorts its session tree by the resulting `updatedAt`. The two backends are wrong in opposite directions: JSONL reads too new, SQLite too old. +A cold (persisted, unattached) session has no authoritative stored answer to "when did the user last prompt here". `dsh-host-apiproxy` serves `updatedAt` from the optional projection cache's `lastPromptAt`, falling back to `createdAt`, and the Web client sorts its Session tree by that value. The cache is fail-soft and checkpointed asynchronously, so a missing or delayed row makes a recently prompted Session sort too old. -mtime answers a different question: when the artifact was last written. Every durable write refreshes it, including writes that are not activity — a truncate-repair of a torn tail, the synthetic closers that balance an interrupted turn, and the [`session/end-seed` boundary](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md) a seeded session appends. (A `flush` with nothing pending is not among them: the coordinator returns without reaching the backend.) The visible consequence is stable and wrong in one direction: a session touched without being worked in promotes itself above sessions the user actually worked in afterwards, and each touch re-promotes it. `dsh-host-apiproxy` keeps `session.history` inspection-only, but any Agent-bound ordinary-session control resumes through `agentFor()` and is enough to promote the cold artifact. +The gateway previously used JSONL artifact mtime when available. mtime answers a different question: when the artifact was last written. Every durable write refreshes it, including a truncate-repair of a torn tail, synthetic closers that balance an interrupted turn, and the [`session/end-seed` boundary](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md) appended during pickup. That approximation promoted a Session merely because it was opened. The [bounded cold blank verification](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md) removed mtime ordering and accepted the cache's conservative "too old" failure direction as an interim tradeoff. -The attached projection has a real fix — `lastActivityTime()` skips boundaries — but it needs the event log, and the cold path deliberately does not read one. Reading the log to compute `updatedAt` would defeat the header-only listing that keeps `list()` scaling with session count rather than log size. +An attached summary can fold the live event log and select the latest human-authored `user/message`, but the cold path deliberately does not read large logs. Reading every log to compute `updatedAt` would make `list()` scale with total conversation bytes rather than Session count. The 1 KiB cold read used for metadata verification makes eligible small-artifact recency exact, but it does not make large-log ordering exact. -The [boundary change](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md) raised the frequency of this defect, because a pickup now writes where nothing was written before; `dsh-host-apiproxy`'s README records it under Known Limitations. It did not introduce the approximation, and removing the approximation is a durable-format decision, which is why it is scoped here rather than there. +Making cold ordering exact remains a durable-format decision, which is why it is scoped here rather than in the gateway workaround. ## Proposal -Store last-activity time where a listing already reads — the session index — so `summarizeCold()` can serve it without opening the log. The coordinator computes the value, because it sees every append and already owns per-id state; backends persist it. That makes it a new `PersistenceBackend` contract element rather than backend-local bookkeeping, and keeps one definition of "activity" shared with the in-log `lastActivityTime()`. +Store the latest human-prompt time where a listing already reads — the Session index — so `summarizeCold()` can serve it without opening the log or depending on a cache checkpoint. The coordinator computes the value because it sees every append and already owns per-id state; backends persist it. That makes it a new `PersistenceBackend` contract element rather than backend-local bookkeeping, with the same event predicate as the attached projection: `user/message` whose `source.kind` is `user`. The two shipped backends have opposite constraints, and the proposal is deliberately asymmetric about them: @@ -25,7 +25,7 @@ The two shipped backends have opposite constraints, and the proposal is delibera Three questions must be answered before implementation, and none of them is settled here: -**Which events count as activity?** `lastActivityTime()` answers this for the log by excluding `session/end-seed`. A stored field encodes the rule at write time, where the writer sees one batch rather than the whole log. The two must not drift, or the attached and cold surfaces will disagree about the same session. +**How is the shared predicate owned?** A stored field encodes the rule at write time, where the writer sees one batch, while the attached summary folds a whole log. Both must use one exported event predicate or reducer so new message-source variants cannot make attached and cold ordering disagree. **How do pre-field logs behave?** Existing artifacts have no value. Falling back to mtime keeps them at today's accuracy; falling back to `createdAt` is honest but reorders every existing session in the picker and the tree. @@ -39,28 +39,29 @@ Three questions must be answered before implementation, and none of them is sett **Write the boundary only when repair occurred.** Would reduce the frequency, and the [boundary note](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md) already rejected it: the predicate must hold for an orderly restart too. Trading a correctness invariant for timestamp accuracy is the wrong direction. -**Derive activity from a projection cache.** `session-projection-cache` already folds tails past a watermark, so a last-activity unit would ride existing machinery. Rejected as the primary shape because the cache is an optional composition entry; a listing served only when a cache plugin is mounted makes ordering depend on composition. +**Derive activity from a projection cache.** This is the current interim implementation. `session-projection-cache` folds tails past a watermark without changing the persistence format, but it is optional and fail-soft. Its absence or checkpoint delay makes ordering depend on cache availability and freshness, so it cannot provide the authoritative value proposed here. ## Acceptance criteria - `SessionSummary.updatedAt` for a cold session equals the same value the attached projection reports for that session, verified by resuming, quitting without a turn, and asserting the order is unchanged across both paths. - A resumed-then-abandoned session does not sort above a session worked in afterwards, in the web session tree and the TUI resume picker, pinned by an assembled snapshot rather than unit tests alone. -- The activity rule has one definition: a test proves the stored field and `lastActivityTime()` agree over a log containing boundaries, closers, and a plain turn. +- The prompt-time rule has one definition: a test proves the stored field and attached fold agree over a log containing human prompts, injected user messages, boundaries, and closers. - Pre-field artifacts load and list without error under the chosen fallback, with the fallback's ordering consequence asserted. - SQLite's `SCHEMA_VERSION` bump rejects the old on-disk version per the repo's no-migration stance. ## Risks -**Two definitions of activity drift.** The stored field is computed per batch, the projection over a whole log. A new event type classified one way at write time and the other at read time yields a session whose cold and attached orderings disagree — a bug that only appears after a restart, which is where it is hardest to notice. +**Two definitions of prompt time drift.** The stored field is computed per batch, the projection over a whole log. A new message source classified one way at write time and the other at read time yields a Session whose cold and attached orderings disagree — a bug that only appears after restart. **A JSONL sidecar can disagree with its log.** A crash between the log append and the sidecar write leaves a stale value with no torn-tail marker to repair it. Every consumer would need to treat the sidecar as a hint, which is close to what mtime already is. **The fallback reorders existing sessions.** Whichever fallback is chosen, users with existing logs see their picker and tree reorder once on upgrade. `createdAt` makes that reordering large. -**Cost may exceed the defect.** The defect is a misordering of abandoned sessions. If the honest answer for JSONL is "keep the approximation", this note's outcome may be documenting that decision rather than implementing a field — and that is an acceptable outcome. +**Cost may exceed the defect.** The remaining defect is conservative misordering when projection metadata is missing or delayed. If the honest answer for JSONL is "keep the cache fallback", this note's outcome may be documenting that decision rather than implementing a field. ## Related -- [The end-seed log boundary](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md) — one of the non-activity writes mtime counts; `dsh-session` owns `lastActivityTime()`, the in-log projection a stored field must agree with. +- [Bounded cold blank verification](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md) — removes mtime ordering, defines the interim projection-cache fallback, and limits direct cold reads to small-artifact metadata verification. +- [The end-seed log boundary](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md) — one of the non-prompt writes that made mtime unsuitable. - [Session persistence](../../implemented/architecture/2026-06-14-session-persistence.md) — the append-only and never-rewrite invariants that rule out a mutable JSONL header field. - [Shared persistence write coordinator](../../implemented/architecture/2026-06-18-shared-persistence-write-coordinator.md) — the append path a stored field would hook into. diff --git a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.zh.md b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.zh.md index ebc2e2167d..e317fb192d 100644 --- a/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.zh.md +++ b/.agents/notes/proposed/architecture/2026-07-29-durable-last-activity-index.zh.md @@ -6,17 +6,17 @@ Status: proposed ## 问题 -一个冷会�(已�久化�未附加)对「上次是什么时候在这里�工作过�没有任何已存储的答案。因此 `dsh-host-apiproxy` 的 `summarizeCold()` 在存在日志文件时用它的 mtime �近似它——`locate()` 为 JSONL 解�出一个�会�产物,为 SQLite 解�出 `undefined`,而 SQLite 的冷会�会回退到 `createdAt`——而 web 客户端就按由此得到的 `updatedAt` 为自己的会�树排�。这两个�端错的方�正好相�:JSONL 读出��新,SQLite �旧。 +一个冷会�(已�久化�未附加)对「用户上次是什么时候在这里�出 prompt�没有��的已存储答案。`dsh-host-apiproxy` 从�选 projection cache 的 `lastPromptAt` �供 `updatedAt`,缺失时回退到 `createdAt`,Web 客户端按该值为 Session 树排�。cache 采用 fail-soft 并异步写入 checkpoint,因此缺失或延迟的记录会让最近收到 prompt 的 Session 排得过旧。 -mtime 回答的是�一个问题:这份产物上次是什么时候被写入的。�一次�久写入都会刷新它,包括那些并�是活动的写入:一次对撕裂尾部的截断修��用�平衡被中断的轮次的那些�� closer,以�带��的会�会追加的 [`session/end-seed` 边界](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md)。(没有待处�内容的 `flush` �在其中:�调器在到达�端之�就返回了。)用户��的�果是稳定的,而且��一个方�错:一个被触碰过�没有在里�工作过的会�,会把自己排到用户此�真正工作过的那些会�之�,而且�次触碰都会�新把它排上去一次。`dsh-host-apiproxy` 让 `session.history` ���执行检查,但任何绑定到 Agent 的普通会�控件都会通过 `agentFor()` ��会�,足以把冷�产物排到��。 +网关以�会在�用时采用 JSONL 产物的 mtime。mtime 回答的是�一件事:这份产物上次是什么时候被写入。�一次�久写入都会刷新它,包括对撕裂尾部的截断修��平衡中断轮次的�� closer,以�拾起时追加的 [`session/end-seed` 边界](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md)。这套近似会让 Session 仅仅因为被打开就��排�。[有界冷空白验�](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md)移除了 mtime 排�,并把 cache �守的「过旧�错误方�作为现阶段��。 -已附加会�的那个投影有真正的修�办法(`lastActivityTime()` 会跳过边界),但它需�事件日志,而冷路径有��去读日志。为计算 `updatedAt` 而读�日志,会让�读 header 的列举失去�义,而正是它让 `list()` 的开销�会�数�而�日志体�增长。 +已附加摘��以折�实时事件日志并选择最新的真人 `user/message`,但冷路径有��读�大日志。为计算 `updatedAt` 而读��一份日志,会让 `list()` 的开销�对�总字节数而� Session 数�增长。用于 metadata 验�的 1 KiB 冷读��以让符��件的�产物得到精确的最近时间,但�能让大日志的排�精确。 -[边界那次�更](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md)�高了这个缺陷的出现频率,因为一次拾起如今会在此�完全无写入的路径上产生写入;`dsh-host-apiproxy` 的 README 已在 Known Limitations 中记录该项。它并没有引入这套近似�法,而移除这套近似是一项�久格�决策,因此它的范围划在本文,而�是那里。 +让冷排��得精确�是一项�久格�决策,因此其范围留在本文,而�是网关 workaround 中。 ## �案 -把最�活动时间存到列举本就会读�的地方,也就是会�索引,这样 `summarizeCold()` 无需打开日志就能给出答案。该值由�调器计算,因为它看得到�一次追加,而且本就拥有� id 状�;由�端负责�久化。这样它就�为 `PersistenceBackend` 约定中新增的一个�素,而�是��端本地的账目,�时让「活动���留一个定义,与日志内的 `lastActivityTime()` 共用。 +把最新真人 prompt 时间存到列举本就会读�的 Session 索引,这样 `summarizeCold()` 无需打开日志或�赖 cache checkpoint 就能给出答案。该值由�调器计算,因为它看得到�一次追加,而且本就拥有� id 状�;由�端负责�久化。这样它就�为 `PersistenceBackend` 约定中新增的一个�素,而�是��端本地账目,并与已附加投影使用�一个事件谓�:`source.kind` 为 `user` 的 `user/message`。 两个已交付的�端�到的约�正好相�,本�案对它们有�采��对称的处�: @@ -25,7 +25,7 @@ mtime 回答的是�一个问题:这份产物上次是什么时候被写入 实现之�必须回答三个问题,本文对它们都没有定论: -**哪些事件算作活动?** 对日志而言,`lastActivityTime()` 通过排除 `session/end-seed` 回答了这个问题。一个已存储字段是在写入时编�这�规则的,而写入方在那里�看到一个批次,�是整份日志。两者�得�生漂移,�则已附加表层与冷表层会对�一个会�给出彼此矛盾的答案。 +**共享谓�由�拥有?** 已存储字段在写入时编�规则,写入方�看到一个批次,而已附加摘�折�整份日志。两者必须使用�一个导出的事件谓�或 reducer,��新的消����体让已附加排�与冷排��生分歧。 **该字段引入之�的日志表现如何?** 既有产物里没有这个值。回退到 mtime 能让它们��今天的准确度;回退到 `createdAt` 是诚实的,但会把选择器和会�树里�一个既有会�都�新排一次�。 @@ -39,28 +39,29 @@ mtime 回答的是�一个问题:这份产物上次是什么时候被写入 **仅在确实�生了修�时�写入边界。** 这能�低出现频率,而[边界 Agent Note](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md)已��决过它:谓�对有����样必须�立。用一�正确性���去�时间戳的准确度,方�是错的。 -**从投影缓存派生活动时间。** `session-projection-cache` 本就会折�水�线之�的尾部,因此一个最�活动�元�以�乘既有机制。它作为主形�被�决,因为该缓存是一个�选的组�项;�有挂载了缓存�件��供的列举,会让排��决于如何组�。 +**从投影缓存派生活动时间。** 这是当�的过渡实现。`session-projection-cache` 会折�水�线之�的尾部,无需改��久格�,但它是�选且 fail-soft 的。缺失或 checkpoint 延迟会让排��决于 cache 是�存在以�是�新鲜,因此无法�供本文所�议的��值。 ## 验收标准 - 冷会�的 `SessionSummary.updatedAt` 等于已附加会�的投影为�一个会�报告的那个值;验�方�是����跑轮次就退出,并断言两�路径上的顺�都没有�化。 - 在 web 会�树和 TUI ��选择器中,一个����被弃置的会��会排到此�工作过的会�之�;由一份组装�的快照钉�,而�是���元测试。 -- 活动规则�有一个定义:一个测试�明,在一份�时包�边界�closer 和一个普通轮次的日志上,已存储字段与 `lastActivityTime()` 的结果一致。 +- prompt 时间规则�有一个定义:一个测试�明,在包�真人 prompt�注入� user message�边界和 closer 的日志上,已存储字段与已附加折�结果一致。 - 在选定的回退方案下,该字段引入之�的产物能够无错误地加载和列举,并且该回退在排�上的�果有断言覆盖。 - 按本仓库���移的立场,SQLite 的 `SCHEMA_VERSION` 递增会拒�旧的�盘版本。 ## 风险 -**「活动�的两个定义�生漂移。** 已存储字段按批次计算,而投影在整份日志上计算。一�新事件类型若在写入时按一�方�归类�在读�时按�一�方�归类,就会产生一个冷排�与已附加排�彼此矛盾的会�;这个缺陷�在��之��显现,而那正是最难被注�到的地方。 +**prompt 时间的两个定义�生漂移。** 已存储字段按批次计算,而投影在整份日志上计算。一�新消���若在写入时按一�方�归类�在读�时按�一�方�归类,就会产生冷排�与已附加排�彼此矛盾的 Session;该缺陷�会在���显现。 **JSONL 的伴�文件�能与它的日志�一致。** 在日志追加与伴�文件写入之间�生崩溃,会留下一个陈旧的值,而且没有撕裂尾部标记�用�修�它。�个消费方都得把伴�文件当作一��示�对待,而这与 mtime 今天的地�已�很接近了。 **回退方案会让既有会��新排�。** 无论选定哪�回退,�有既有日志的用户都会在�级时看到自己的选择器和会�树�新排一次�。选 `createdAt` 会让这次�排的幅度很大。 -**代价�能超过这个缺陷本身。** 该缺陷是被弃置会�的排�出错。如果对 JSONL �说诚实的答案是「�留这套近似�,那么本文的结局�能是记录下这个决定,而�是实现一个字段,而这也是一个�以接�的结局。 +**代价�能超过这个缺陷本身。** 剩余缺陷是 projection metadata 缺失或延迟时的�守错�。如果对 JSONL �说诚实的答案是「�留 cache 回退�,那么本文的结局�能是记录该决定,而�是实现一个字段。 ## 相关 -- [��结�日志边界](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md)——mtime 会计入的�活动写入之一;`dsh-session` 拥有 `lastActivityTime()`,也就是一个已存储字段必须与之��一致的那个日志内投影。 +- [有界冷空白验�](../../implemented/bug-fix/2026-08-13-bounded-cold-blank-verification.md)——移除 mtime 排�,定义 projection cache 的过渡回退,并把直接冷读��制为�产物 metadata 验�。 +- [��结�日志边界](../../implemented/architecture/2026-07-30-session-end-seed-log-boundary.md)——让 mtime �适用的� prompt 写入之一。 - [会��久化](../../implemented/architecture/2026-06-14-session-persistence.md)——仅追加与���写这两����,正是它们排除了��的 JSONL header 字段。 - [共享�久化写入�调器](../../implemented/architecture/2026-06-18-shared-persistence-write-coordinator.md)——一个已存储字段将挂入的那�追加路径。 diff --git a/.agents/skills/dsh-doc-site-sync/SKILL.md b/.agents/skills/dsh-doc-site-sync/SKILL.md index 5d39470d72..91dd42ae8a 100644 --- a/.agents/skills/dsh-doc-site-sync/SKILL.md +++ b/.agents/skills/dsh-doc-site-sync/SKILL.md @@ -49,6 +49,7 @@ Write normal repository-relative Markdown links in canonical docs. The projector - An image is the exception: its file is copied into the generated tree and referenced from there, so the site serves it regardless of repository visibility. It must be a regular file inside the repository. - External URLs, site-absolute URLs, email links, and fragment-only links remain unchanged. - A missing repository-relative target fails projection instead of silently producing a broken link. +- Cross-page fragments use the English GitHub heading id as their canonical id. If an authored heading emits a different VitePress id, place an explicit `` immediately before it; add generated aliases in the owning generator. Do not write website-specific routes into canonical Markdown just to satisfy VitePress. Use `sourceAliases` for directory-style repository links that should resolve to a mapped index page. @@ -68,6 +69,8 @@ Run the focused website gate before treating the mapping as valid: pnpm docs:check ``` +If Markdown link checks pass but the site build reports a missing fragment, follow the `verify-doc-site-fragments` source and target paths. Preserve the English GitHub id with an explicit alias in authored Markdown or in the owning generator. + Before committing a documentation-site change, run: ```sh diff --git a/.github/AGENTS.md b/.github/AGENTS.md index 3e879db8ae..0c1f0dc780 100644 --- a/.github/AGENTS.md +++ b/.github/AGENTS.md @@ -1,3 +1,3 @@ # AGENTS.md — GitHub Actions -Run jobs on Windows runners (`windows-*` labels) under native `pwsh`. The pull-request `windows` job is the deliberate exception: it runs Windows Node under Wine on hosted Linux and blocks `all checks passed`; `windows-native` runs automatically on `windows-2025` (or the self-hosted `[self-hosted, dsh-win-ci, windows]` pool under `DSH_CI_FAILOVER=selfhosted`) but reports independently. The master `serial-windows` standby continuously validates the self-hosted failover target — see the [failover runbook](../.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md). +Run jobs on Windows runners (`windows-*` labels) under native `pwsh`. The pull-request `windows` job is the deliberate exception: it runs Windows Node under Wine on hosted Linux and blocks `all checks passed`; `windows-native` runs automatically on `windows-2025` (or the self-hosted `[self-hosted, dsh-win-ci, windows]` pool under `DSH_CI_FAILOVER_WINDOWS=selfhosted`) but reports independently. The master `serial-windows` standby continuously validates the self-hosted failover target — see the [failover runbook](../.agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md). diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7bb2bc1518..5e0c006355 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,8 +49,8 @@ jobs: # build-backed consumer tail. The consumer job owns the only Linux build so # all three jobs enter runner allocation independently. # - # FAILOVER: each Linux enterprise job resolves its pool through the - # DSH_CI_FAILOVER repository variable. Unset (normal), the expressions + # FAILOVER (Linux): each Linux enterprise job resolves its pool through the + # DSH_CI_FAILOVER_LINUX repository variable. Unset (normal), the expressions # pick the hosted enterprise pools below. Setting the variable to # 'selfhosted' (repo Settings → Actions → Variables; writer-manageable # repository state — not PR-editable, no merge required) retargets all @@ -58,11 +58,12 @@ jobs: # vm-backup pool and re-running the failed jobs is the entire switch — # see .agents/notes/implemented/process/2026-07-26-ci-failover-runbook.md. The # in-house pool's readiness is re-proven on every master push by the - # serial-linux-selfhosted standby lane below. + # serial-linux-selfhosted standby lane below. The Windows failover switch is + # the separate DSH_CI_FAILOVER_WINDOWS variable on the windows-native job below. node-24: if: github.event_name == 'pull_request' runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "linux", "x64", "vm-backup"]') || 'dsh-ubuntu-24-04-16core' }} @@ -96,7 +97,7 @@ jobs: # compression and upload on the paid latency-critical path. Skipped # under failover — see the coverage lane's identical rationale. - uses: actions/cache/restore@v4 - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' with: path: ${{ steps.pnpm-store.outputs.path }} key: ${{ runner.os }}-node-${{ env.PRIMARY_NODE_VERSION }}-pnpm-${{ hashFiles('pnpm-lock.yaml') }} @@ -114,7 +115,7 @@ jobs: node-24-coverage: if: github.event_name == 'pull_request' runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "linux", "x64", "vm-backup"]') || 'dsh-ubuntu-24-04-16core' }} @@ -124,7 +125,7 @@ jobs: # shares one 64-core VM across six always-on runner instances, so each # instance may use eight while keeping the worst case at 8 × 6 = 48 # workers; process-bound suites remain isolated in forks. - DSH_COVERAGE_MAX_WORKERS: ${{ vars.DSH_CI_FAILOVER == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && '8' || '6' }} + DSH_COVERAGE_MAX_WORKERS: ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && '8' || '6' }} DSH_GATE_CONCURRENCY: '3' steps: - uses: actions/checkout@v6 @@ -151,7 +152,7 @@ jobs: # already serves warm installs, while restoring the hosted archive # would spend ~52 s pulling ~180 MB into that populated store. - uses: actions/cache/restore@v4 - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' with: path: ${{ steps.pnpm-store.outputs.path }} key: ${{ runner.os }}-node-${{ env.PRIMARY_NODE_VERSION }}-pnpm-${{ hashFiles('pnpm-lock.yaml') }} @@ -177,7 +178,7 @@ jobs: node-24-consumers: if: github.event_name == 'pull_request' runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "linux", "x64", "vm-backup"]') || 'dsh-ubuntu-24-04-16core' }} @@ -188,7 +189,7 @@ jobs: DSH_OXLINT_THREADS: '8' DSH_PUBLINT_CONCURRENCY: '8' # Failover halves snapshot concurrency for the shared 64-core VM. - DSH_SNAPSHOT_MAX_CONCURRENCY: ${{ vars.DSH_CI_FAILOVER == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && '12' || '32' }} + DSH_SNAPSHOT_MAX_CONCURRENCY: ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && '12' || '32' }} steps: - uses: actions/checkout@v6 with: @@ -212,7 +213,7 @@ jobs: # Skipped under failover — see the coverage lane's identical rationale. - uses: actions/cache/restore@v4 - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' with: path: ${{ steps.pnpm-store.outputs.path }} key: ${{ runner.os }}-node-${{ env.PRIMARY_NODE_VERSION }}-pnpm-${{ hashFiles('pnpm-lock.yaml') }} @@ -222,7 +223,7 @@ jobs: # Pull requests restore the cache normally produced by serial-linux on # master; they do not pay compression and upload on the required path. - uses: actions/cache/restore@v4 - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' with: path: ~/.cache/ms-playwright key: ${{ runner.os }}-playwright-${{ hashFiles('pnpm-lock.yaml') }} @@ -243,13 +244,13 @@ jobs: exit "$sandbox_status" - name: Install Playwright Chromium and hosted dependencies - if: vars.DSH_CI_FAILOVER != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX != 'selfhosted' || github.event.pull_request.user.login == 'dependabot[bot]' run: pnpm --filter @deepseek-ai/dsh-web-frontend exec playwright install --with-deps chromium # The persistent VM image owns Playwright's Linux system packages; do # not mutate the shared host with apt on every failover run. - name: Install Playwright Chromium on the failover VM - if: vars.DSH_CI_FAILOVER == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' + if: vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' run: pnpm --filter @deepseek-ai/dsh-web-frontend exec playwright install chromium - name: Run compatibility, snapshot, and artifact gates @@ -437,18 +438,21 @@ jobs: # its own unmasked conclusion but is deliberately absent from # all-checks-passed.needs, so it never delays or changes that required # verdict. Under normal operation it runs on the hosted larger runner; under - # failover (DSH_CI_FAILOVER=selfhosted) it retargets onto the in-house - # self-hosted Windows pool. Dependabot PRs are excluded from the self-hosted - # pool and stay queued for the hosted runner — see the failover runbook. + # Windows failover (DSH_CI_FAILOVER_WINDOWS=selfhosted) it retargets onto the + # in-house self-hosted Windows pool. Dependabot PRs are excluded from the + # self-hosted pool and stay queued for the hosted runner — see the failover + # runbook. This Windows switch is independent of the Linux + # DSH_CI_FAILOVER_LINUX variable that retargets the three required Linux jobs + # and the all-checks-passed verdict above. windows-native: if: github.event_name == 'pull_request' runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_WINDOWS == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "dsh-win-ci", "windows"]') || 'dsh-windows-2025-16core' }} name: windows node 24 / native complete - timeout-minutes: 60 + timeout-minutes: 120 env: DSH_COVERAGE_MAX_WORKERS: '2' DSH_GATE_CONCURRENCY: '2' @@ -558,7 +562,7 @@ jobs: # re-runs the complete unsharded aggregate on the persistent 64-core VM, # continuously proving that environment can take over a required lane if # the hosted pools degrade (the switch is then setting the writer-manageable - # DSH_CI_FAILOVER variable — see the failover runbook, no merge required). + # DSH_CI_FAILOVER_LINUX variable — see the failover runbook, no merge required). # Push-triggered, so this lane always executes the base branch's own # workflow definition. (Under failover, pull_request jobs do reach these # runners with the PR merge ref's workflow — the boundary there is @@ -644,18 +648,18 @@ jobs: # move re-runs the complete unsharded Windows gate inventory on the persistent # VM, continuously proving that environment can take over the required # `windows` lane if the hosted pool degrades (the switch is setting the - # writer-manageable DSH_CI_FAILOVER variable — see the failover runbook, no - # merge required). Push-triggered, so this lane always executes the base - # branch's own workflow definition. Non-blocking for pull requests; absent - # from all-checks-passed.needs by design — the required `windows` job owns - # the PR verdict. No cache steps because the VM's persistent pnpm store + # writer-manageable DSH_CI_FAILOVER_WINDOWS variable — see the failover + # runbook, no merge required). Push-triggered, so this lane always executes + # the base branch's own workflow definition. Non-blocking for pull requests; + # absent from all-checks-passed.needs by design — the required `windows` job + # owns the PR verdict. No cache steps because the VM's persistent pnpm store # and tool caches make them redundant (and saving here would poison the # hosted cache namespace with self-hosted paths). serial-windows: if: github.event_name == 'push' && github.ref == 'refs/heads/master' name: serial / windows (self-hosted standby) runs-on: [self-hosted, dsh-win-ci, windows] - timeout-minutes: 60 + timeout-minutes: 120 steps: - uses: actions/checkout@v6 @@ -911,11 +915,13 @@ jobs: all-checks-passed: name: all checks passed # This bookkeeping-only verdict must not depend on custom-pool - # provisioning — and under failover it follows the same selector as the - # worker jobs it aggregates, so a standard-hosted outage cannot strand - # the branch-protection verdict either. + # provisioning — and under Linux failover it follows the same selector as + # the worker jobs it aggregates, so a standard-hosted outage cannot strand + # the branch-protection verdict either. It retargets with the Linux switch + # (DSH_CI_FAILOVER_LINUX), not the Windows one, because it aggregates the + # required Linux workers and runs on the vm-backup pool. runs-on: >- - ${{ vars.DSH_CI_FAILOVER == 'selfhosted' + ${{ vars.DSH_CI_FAILOVER_LINUX == 'selfhosted' && github.event.pull_request.user.login != 'dependabot[bot]' && fromJSON('["self-hosted", "linux", "x64", "vm-backup"]') || 'ubuntu-latest' }} diff --git a/.github/workflows/docs-pages.yml b/.github/workflows/docs-pages.yml index 6336089a41..78bdafdf5b 100644 --- a/.github/workflows/docs-pages.yml +++ b/.github/workflows/docs-pages.yml @@ -23,6 +23,9 @@ permissions: env: PRIMARY_NODE_VERSION: '24' + # Projected source links target the public repository, whose history can + # differ from this workflow's source repository. + DOCS_REPOSITORY_REF: master # CI runs must never report to the production telemetry endpoint baked # into apps/cli/cordis.yml (AppCLIEntry disables the row when set). DSH_TELEMETRY_DISABLED: '1' diff --git a/.github/workflows/landlock-run-release.yml b/.github/workflows/landlock-run-release.yml index 8448af1ad1..76d08e9e4c 100644 --- a/.github/workflows/landlock-run-release.yml +++ b/.github/workflows/landlock-run-release.yml @@ -147,6 +147,12 @@ jobs: contents: read id-token: write steps: + # The publish script is the only repository file this job needs, and it + # imports nothing outside Node's builtins, so there is no install step. + - uses: actions/checkout@v4 + with: + persist-credentials: false + - uses: actions/setup-node@v4 with: node-version: 24 @@ -167,12 +173,8 @@ jobs: fi - name: Publish tarballs - run: | - version="${GITHUB_REF#refs/tags/landlock-run-v}" - tag_args=() - case "$version" in *-*) tag_args=(--tag next);; esac - while IFS= read -r tarball; do - # No --access: publishConfig.access in each manifest decides, and a - # command-line flag would override it. - npm publish "dist/npm/${tarball}" "${tag_args[@]}" - done < dist/npm/publish-order.txt + # Publication is decided per package against the registry, so re-running + # this job over the same artifact skips what already landed instead of + # failing on it. A bare `npm publish` loop could not be retried: the + # registry answers a repeat of an existing version permanently. + run: node ./scripts/publish-release.mjs dist/npm diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cab178a3d2..2e20c215fd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -81,8 +81,10 @@ jobs: run: pnpm run release:pack --family dsh --out dist/npm # The harness packages declare the vendored framework as a peer, and this - # job has no credentials for the private registry, so the verification - # installs that family's pack output too. Only dist/npm is published. + # verification must not depend on the registry already carrying matching + # versions — one pull request may bump both families before either + # publishes — so it installs that family's pack output too. Only dist/npm + # is published. - name: Pack the vendored framework for verification run: pnpm run release:pack --family vendor --out dist/npm-vendor diff --git a/AGENTS.md b/AGENTS.md index d6e3b6cfc0..53f4d17bdb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -106,7 +106,7 @@ Real-API tests and demos read `DEEPSEEK_API_KEY`, optional `DEEPSEEK_BASE_URL`, - **Waterfall listeners MUST call `next()`** to delegate; returning without it short-circuits the chain ([semantics](docs/cordis-primer.md#cordis-waterfall-semantics)). - **Model-visible ⟺ logged**: anything that reaches a model request must be reconstructable from the session log; a new model-visible input requires a session event. - **Plugins, not loop changes**: new behavior goes on documented extension points; changing `agent-loop` requires updating docs/architecture.md. -- **A capability seam comprises Service Definition / Service provider / Consumer roles.** It is complete, never one role; split only when roles evolve independently ([glossary](docs/glossary.md#capability-seam)). +- **A capability seam comprises Service Definition / Service Provider / Consumer roles.** It is complete, never one role; split only when roles evolve independently ([glossary](docs/glossary.md#capability-seam)). - **Prefer maintained dependencies over hand-rolling** when they genuinely delete owned code and tests ([policy](.agents/notes/implemented/process/2026-07-26-dependencies-over-hand-rolling.md)). - **Explicit > implicit at package boundaries**: defaulting is an explicit `resolve(request): Spec` step in the owning implementation, never a hidden `?? default` inside `run()` (the `dsh-shell` request/spec split is the template). - **No hardcoded tunables in plugins**: deployment-varying choices are validated `Config` fields changeable from cordis.yml; a `DEFAULT_*` constant or test hook is not configurability. Protocol constants, external specs, and security invariants stay fixed. diff --git a/LICENSE b/LICENSE index d03c77437e..c1f7a78e89 100644 --- a/LICENSE +++ b/LICENSE @@ -1,28 +1,21 @@ -BSD 3-Clause License +MIT License -Copyright (c) 2026, DeepSeek +Copyright (c) 2026 DeepSeek -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.i18n.yaml b/README.i18n.yaml index a71b0b8ade..47ae1591e8 100644 --- a/README.i18n.yaml +++ b/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write README.md -README.md: 891098974433535fa65863c80c512d3818e75955 -README.zh.md: 7a5b1a9219c8442fca7deabdff45ee4323bba840 +README.md: 8a4bd01332a23ce4144c661784bc549e0ba72d21 +README.zh.md: b7bc214bfb1fd8a76a47de3f0aa242122aeb7603 diff --git a/README.md b/README.md index 8910989744..8a4bd01332 100644 --- a/README.md +++ b/README.md @@ -2,31 +2,29 @@ English | [中文](README.zh.md) -DeepSeek Harness (`dsh`) is an open-source coding agent and plugin-based agent harness. +DeepSeek Harness (`dsh`) is an open-source agent harness developed by [DeepSeek AI](https://deepseek.com). -It uses an architecture where **everything is a plugin**. +It uses an architecture where **everything is a plugin**, and is powered by [Cordis](https://github.com/cordiverse/cordis), whose design is described in [_A Programming Paradigm for Spatiotemporal Composability_](https://github.com/cordiverse/paper). -## Internal testing notice +## Developer preview -DeepSeek Harness is under internal testing. Features and interfaces may change. - -Session Logs stay local by default. Set `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` to share a Session Log only when submitting feedback, or `DSH_TELEMETRY_MODE=FULL` to upload continuously; `FULL` also enables dsh-sdk command telemetry reporting an anonymous ID, the command result, and redacted project configuration. Send feedback through the internal WeChat group. +DeepSeek Harness is currently in _developer preview_ and is iterating rapidly. **THERE WILL BE COMPATIBILITY-BREAKING CHANGES.** ## Run -Install Node.js ^22.19 or >= 24 and pnpm 11, then run the published package: +### Run from `npm` + +Install `Node.js`, then run: ```sh npx @deepseek-ai/dsh web ``` -The command initializes the Web profile and prints the Web UI URL, which is `http://127.0.0.1:3080` by default. Open it, add a DeepSeek API key under **Settings → Models**, then start a session. The invoking directory is the default workspace; try `Summarize this repository and identify its main packages.` - -Continue with the [Web UI guide](docs/user/guide/index.md). +The command starts the Web UI, served at `http://127.0.0.1:3080` by default. See [Web UI guide](docs/user/guide/index.md). ### Run from source -To run a repository checkout instead: +To run from a repository checkout: ```sh git clone https://github.com/deepseek-ai/deepseek-harness.git @@ -36,37 +34,24 @@ pnpm run build pnpm dsh web ``` -`pnpm run build` prepares the repository artifacts. `pnpm dsh web` starts the Web UI without rebuilding and opens the same path. +## Community and support -## Profiles and plugins +- Feel free to submit feedback or bug reports through [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions). +- Add the [`dsh-plugin`](https://github.com/topics/dsh-plugin) topic to your plugin repository for discoverability. +- Join DeepSeek Harness Discord community. -A profile is an ordered list of plugin bundles. The shipped `web` profile powers `dsh web`. Manage a profile with `dsh plugin --profile `, which forwards the remaining arguments to pnpm in that profile's directory: +## Contributing -```sh -npx -p @deepseek-ai/dsh dsh plugin --profile web add -npx -p @deepseek-ai/dsh dsh plugin --profile web remove -``` - -`add`, `remove`, `update`, `why`, and other pnpm commands work unchanged. The command initializes a missing profile before changing its packages and updates its bundle list from installed packages that declare `dsh.bundle`. See the [CLI reference](apps/cli/reference/README.md#plugin-management) for the exact behavior. - -The [CLI reference](apps/cli/README.md) covers headless execution and custom profiles. The [Python SDK](python/README.md) and [examples](examples/README.md) cover programmatic and custom compositions. - -## Community - -Follow DeepSeek Harness on Twitter for project updates. +See [CONTRIBUTING.md](CONTRIBUTING.md). ## Development -Start with the [development guide](docs/development.md) and read the [architecture](docs/architecture.md) before changing packages. +Start with the [development guide](docs/development.md) and [architecture documentation](docs/architecture.md). For agents, follow [AGENTS.md](AGENTS.md). ## License -[BSD 3-Clause](LICENSE) +[MIT](LICENSE) Third-party dependencies and their licenses are disclosed in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). - -## Contributing - -Read [CONTRIBUTING.md](CONTRIBUTING.md) before contributing to this repository. diff --git a/README.zh.md b/README.zh.md index 7a5b1a9219..b7bc214bfb 100644 --- a/README.zh.md +++ b/README.zh.md @@ -2,28 +2,25 @@ [English](README.md) | 中文 -DeepSeek Harness(`dsh`)是一款开� coding agent(编程智能体),也是一个基于�件的 agent harness(智能体框架)。 +DeepSeek Harness(`dsh`)是由 [DeepSeek AI](https://deepseek.com) 开�的开� agent harness(智能体框架)。 -它采用了**一切皆�件**的架构。 +它采用**一切皆�件**的架构,并由 [Cordis](https://github.com/cordiverse/cordis) 驱动,其设计��论文 [_A Programming Paradigm for Spatiotemporal Composability_](https://github.com/cordiverse/paper)。 -## 内测说明 - -DeepSeek Harness 正处于内部测试阶段,功能和接��能�生�化。 - -Session Log 默认留在本地。设置 `DSH_TELEMETRY_MODE=FEEDBACK_ONLY` �仅在�交�馈时共享 Session Log,设置 `DSH_TELEMETRY_MODE=FULL` ��续上传;`FULL` �时会�用 dsh-sdk 命令�测,上报匿� ID�命令结果以�脱��的项目�置。请通过内部�业微信群�馈问题和建议。 +## 开�者预览 +DeepSeek Harness 目�处于 _开�者预览_ 阶段,正在快速迭代。**未�将出现破�兼容性的�更。** ## �行 -请先安装 Node.js(版本�求:`^22.19` 或 `>=24`)和 pnpm 11,然��行已�布的包: +### 通过 `npm` �行 + +安装 `Node.js`,然��行: ```sh npx @deepseek-ai/dsh web ``` -该命令会�始化 Web profile 并打� Web UI 地�,默认地�为 `http://127.0.0.1:3080`。打开该地�,在**设置 → 模型**中添加 DeepSeek API 密钥,然��动一个会�。�行命令时所在的目录将作为默认工作区;你�以�试输入 `Summarize this repository and identify its main packages.`。 - -下一步请阅读 [Web UI 指�](docs/user/guide/index.md)。 +该命令会�动 Web UI,默认地�为 `http://127.0.0.1:3080`。详� [Web UI 指�](docs/user/guide/index.md)。 ### 从���行 @@ -37,41 +34,41 @@ pnpm run build pnpm dsh web ``` -`pnpm run build` 会准备仓库产物。`pnpm dsh web` �会�新构建,而是直接�动�一个 Web UI。 +## 社区与支� -## Profile 与�件 +- 欢迎通过 [GitHub Discussions](https://github.com/deepseek-ai/deepseek-harness/discussions) �交�馈或 bug 报告。 +- 为你的�件仓库添加 [`dsh-plugin`](https://github.com/topics/dsh-plugin) �题,便于被�现。 +- 欢迎加入 DeepSeek Harness �微群:扫�添加�微�助手并填写入群问�,完���助手会邀请你入群。 -profile 由一组按顺�排列的�件组�包构�。�附的 `web` profile 用于�行 `dsh web`。使用 `dsh plugin --profile ` 管� profile;该命令会在对应 profile 目录中将剩余�数转�给 pnpm: - -```sh -npx -p @deepseek-ai/dsh dsh plugin --profile web add -npx -p @deepseek-ai/dsh dsh plugin --profile web remove -``` - -`add`�`remove`�`update`�`why` 等 pnpm 命令��直接使用。该命令会先�始化�存在的 profile,�修改其中的包,并根�声明了 `dsh.bundle` 的已安装包更新 bundle 列表。具体行为� [CLI �考](apps/cli/reference/README.md#plugin-management)。 - -[CLI(命令行界�)�考](apps/cli/README.md)介� headless 执行与自定义 profile。[Python SDK](python/README.md) 和[示例](examples/README.md)介�程�化组�与自定义组�。 - -## 社区 - -扫�二维�,或打开 DeepSeek Harness 微信社区申请页� 申请加入。 - -

- DeepSeek Harness 微信社区二维� -

- -## 开� - -请先阅读[开�指�](docs/development.md);修改包之�,请阅读[架构文档](docs/architecture.md)。 - -�� agent:�循 [AGENTS.md](AGENTS.md)。 - -## 许�� - -[BSD 3-Clause](LICENSE) - -第三方�赖�其许��� [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。 + + + + + + + + + + + + + + + +
�微�助手入群问�微信公众�
DeepSeek Harness �微�助手二维�DeepSeek Harness 入群问�二维�DeepSeek Harness 团队微信公众�二维�
## �与贡献 -�本仓库贡献�,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。 +�� [CONTRIBUTING.md](CONTRIBUTING.md)。 + +## 开� + +请先阅读[开�指�](docs/development.md)与[架构文档](docs/architecture.md)。 + +�� agent:请�循 [AGENTS.md](AGENTS.md)。 + +## 许�� + +[MIT](LICENSE) + +第三方�赖�其许��� [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。 diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 49d5e15b47..92b218ff33 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -3,7 +3,7 @@ # Third-Party Notices -DeepSeek Harness is licensed under [BSD 3-Clause](LICENSE). It depends on the third-party software listed below. Each project remains under its own license; nothing in this file changes those terms. +DeepSeek Harness is licensed under [MIT](LICENSE). It depends on the third-party software listed below. Each project remains under its own license; nothing in this file changes those terms. This file lists **direct** dependencies declared by the workspace and the explicitly disclosed official Claude platform payload closure. It is generated from the workspace manifests by `scripts/gen-third-party-notices.ts`: a pre-commit hook regenerates it whenever a staged file changes one of its inputs, and `scripts/gen-third-party-notices.spec.ts` asserts in the test lane that the committed bytes match. Deleting a manifest runs no hook, so that case is caught by the assertion instead. Run `pnpm run verify-third-party-notices` for the standalone check. diff --git a/apps/cli/README.i18n.yaml b/apps/cli/README.i18n.yaml index 9285fa6c1d..f270fdf882 100644 --- a/apps/cli/README.i18n.yaml +++ b/apps/cli/README.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/cli/README.md README.md: 9a8d722b044ed5d8e31e3c27e54f8c9ef0839f82 -README.zh.md: dc40a4a6f54f99507bccb6b989aee0015e9604b3 +README.zh.md: 7889b4180b5ce2f65550f98708d498f324ac349d diff --git a/apps/cli/README.zh.md b/apps/cli/README.zh.md index dc40a4a6f5..7889b4180b 100644 --- a/apps/cli/README.zh.md +++ b/apps/cli/README.zh.md @@ -2,22 +2,22 @@ [English](README.md) | 中文 -`dsh` 命令是 profile 的产��动器:profile 是按��放的�件组�包 patch 层,之上��加用户自己的覆盖层。[`src/args.ts`](src/args.ts) 负责命令语法,[`src/bin.ts`](src/bin.ts) �加载选中的�行器。无效命令��自其他模�的选项��置错误和�动失败都会以�零状�退出。 +`dsh` 是 DeepSeek Harness 中用于�动 profile 的命令;profile 由多个�件组�包 patch 层按顺��加而�,其上�应用用户自己的覆盖�置。[`src/args.ts`](src/args.ts) 负责命令语法,[`src/bin.ts`](src/bin.ts) �加载选中的�行器。无效命令��自其他模�的选项��置错误和�动失败都会以�零状�退出。 ## 入�模� | 命令 | 用途 | |---|---| | `dsh --profile ` | �动�于 `$DSH_HOME/profiles/` 的指定 profile。 | -| `dsh --profile headless "job"` | �行一个新的�久化会�,打�最终答案并退出。 | +| `dsh --profile headless "job"` | �行一个全新的�久化会�,打�最终答案并退出。 | | `dsh web` | `--profile web` 的别�。 | | `dsh plugin --profile ` | 通过在 profile 目录中转�给 pnpm �管�该 profile 的�件。 | -调用目录是默认 workspace 根目录。`web` 和 `headless` profile 在首次使用时会从�附模�自动�始化;其他任何 profile 都必须通过 `dsh plugin` 创建。 +�行命令时所在的目录将作为默认 workspace 根目录。`web` 和 `headless` profile 在首次使用时会从�附模�自动�始化;其他任何 profile 都必须通过 `dsh plugin` 创建。 ## 应用�数 -�动器�解�属于自己的 flag,并把其�的一切交给�动起�的 profile,任何注入它的应用�件都�以解�这份共享的���快照([`dsh-cmdline`](../../packages/boot/cmdline/README.md))。因此�动器的 flag 必须写在��,而�动器�认识的第一个 token 就是应用�数的起点: +�动器�解�自身的 flag,并将其�的所有内容交给已�动的 profile;注入该 profile 的任�应用�件都�以解�这份共享的���快照([`dsh-cmdline`](../../packages/boot/cmdline/README.md))。因此,�动器的 flag 必须写在最��;�动器无法识别的第一个 token 标志�应用�数的开始: ```sh dsh --profile web --port 8080 # --port belongs to the web app @@ -29,19 +29,19 @@ dsh --help # the launcher's own help ## Profile -profile 目录包�一个 `package.json`(树外�件�赖,加上 profile manifest(元数�清�)`dsh.profile` �其有�的 `bundles` 列表)和一个 `cordis.patch.yml`(用户自己的 patch 层)。 +profile 目录包�一个 `package.json`,其中记录树外�件�赖,以� profile manifest(元数�清�)`dsh.profile` 和其中按顺�排列的 `bundles` 列表;还包�一个 `cordis.patch.yml`,其中�存用户自己的 patch 层。 -�置树在空根之上组�: -- 先按 `dsh.profile.bundles` 顺�应用�组�包的 patch -- 然�是 profile 的 `cordis.patch.yml`,然�是 home 级的 `$DSH_HOME/cordis.patch.yml` -- 最�是 `--patch` overlay +�置树以空根为起点,�次�加以下�置层: +- `dsh.profile.bundles` 中�组�包的 patch +- profile 自身的 `cordis.patch.yml`,然�是 home 级的 `$DSH_HOME/cordis.patch.yml` +- `--patch` 指定的覆盖层 -`dsh.profile.bundles` 中列出的组�包先从 dsh 安装目录解�(`@deepseek-ai/dsh-base`�`@deepseek-ai/dsh-web-app`�`@deepseek-ai/dsh-headless`),�从 profile 自己的 `node_modules` 解�;pnpm 把树外�件安装在�者。 +`dsh.profile.bundles` 中列出的组�包先从 dsh 安装目录解�(`@deepseek-ai/dsh-base`�`@deepseek-ai/dsh-web-app`�`@deepseek-ai/dsh-headless`),�从 profile 自身的 `node_modules` 解�;pnpm 会将树外�件安装到该目录。 使用 `--dump-default-config` 和 `--dump-config` �在��动的情况下检查组��的�置树。 -[CLI(命令行界�)行为�考](reference/README.md)负责确切的层优先级�flag�关闭行为�部署默认值和��执行。 +层的确切优先级�flag�关闭行为�部署默认值和��执行方�,以 [CLI(命令行界�)行为�考](reference/README.md)为准。 ## 开� -生产�行需�已构建的包与�端产物。请在仓库根目录�独�行 `pnpm run build`,然�使用 `pnpm dsh ` �行 TypeScript 入�并转�所有�数;模�解�约定由[��执行�考](reference/README.md#source-execution)负责。 +生产�行需�已构建的包与�端产物。请在仓库根目录�独�行 `pnpm run build`,然�使用 `pnpm dsh ` �行 TypeScript 入�并转�所有�数;模�解�约定以[��执行�考](reference/README.md#source-execution)为准。 diff --git a/apps/cli/composition.md b/apps/cli/composition.md index 0d56813430..4d37b9186a 100644 --- a/apps/cli/composition.md +++ b/apps/cli/composition.md @@ -114,10 +114,6 @@ flowchart LR cfg --> plugin_dsh_base_subagent_spawn_in_process plugin_dsh_base_subagent_fork_in_process["subagent-fork-in-process
@deepseek-ai/dsh-subagent-fork-in-process"] cfg --> plugin_dsh_base_subagent_fork_in_process - plugin_dsh_base_subagent_codex["subagent-codex
@deepseek-ai/dsh-subagent-codex"] - cfg --> plugin_dsh_base_subagent_codex - plugin_dsh_base_subagent_claude_code["subagent-claude-code
@deepseek-ai/dsh-subagent-claude-code"] - cfg --> plugin_dsh_base_subagent_claude_code plugin_dsh_base_tool_subagent_control["tool-subagent-control
@deepseek-ai/dsh-tool-subagent-control"] cfg --> plugin_dsh_base_tool_subagent_control plugin_dsh_base_tool_subagent_list_agents["tool-subagent-list-agents
@deepseek-ai/dsh-tool-subagent-control/list-agents"] @@ -225,8 +221,6 @@ flowchart LR | `subagent` | `@deepseek-ai/dsh-subagent` | | `subagent-spawn-in-process` | `@deepseek-ai/dsh-subagent-spawn-in-process` | | `subagent-fork-in-process` | `@deepseek-ai/dsh-subagent-fork-in-process` | -| `subagent-codex` | `@deepseek-ai/dsh-subagent-codex` | -| `subagent-claude-code` | `@deepseek-ai/dsh-subagent-claude-code` | | `tool-subagent-control` | `@deepseek-ai/dsh-tool-subagent-control` | | `tool-subagent-list-agents` | `@deepseek-ai/dsh-tool-subagent-control/list-agents` | | `tool-subagent` | `@deepseek-ai/dsh-tool-subagent` | diff --git a/apps/cli/config/agent-presets/code/agent.cordis.yml b/apps/cli/config/agent-presets/code/agent.cordis.yml index fb21c21185..407938e5c8 100644 --- a/apps/cli/config/agent-presets/code/agent.cordis.yml +++ b/apps/cli/config/agent-presets/code/agent.cordis.yml @@ -198,16 +198,16 @@ toolName: subagent_fork backgroundMode: continuable - # Product providers are host-plane singletons. Copy this preset, then - # remove `disabled` from either ordinary tool row to expose that product - # only to agents composed from the copy. + # Production dsh does not install these optional providers. An opting-in + # Profile mounts each provider once on the host plane; copy this preset, + # then remove `disabled` from the matching tool row. - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' disabled: true config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code @@ -216,7 +216,7 @@ config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: workflow-worker-thread diff --git a/apps/cli/config/agent-presets/cordis/agent.cordis.yml b/apps/cli/config/agent-presets/cordis/agent.cordis.yml index 598418c3b6..e808250c00 100644 --- a/apps/cli/config/agent-presets/cordis/agent.cordis.yml +++ b/apps/cli/config/agent-presets/cordis/agent.cordis.yml @@ -185,16 +185,16 @@ toolName: subagent_fork backgroundMode: continuable - # Product providers are host-plane singletons. Copy this preset, then - # remove `disabled` from either ordinary tool row to expose that product - # only to agents composed from the copy. + # Production dsh does not install these optional providers. An opting-in + # Profile mounts each provider once on the host plane; copy this preset, + # then remove `disabled` from the matching tool row. - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' disabled: true config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code @@ -203,7 +203,7 @@ config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: workflow-worker-thread diff --git a/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md b/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md index 72a3ce35ea..8214e88654 100644 --- a/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md +++ b/apps/cli/config/agent-presets/cordis/skills/editing-cordis-compositions/SKILL.md @@ -123,7 +123,7 @@ After a clean mount-validation, ask the user to start a session on the new prese ## Native product subagents -Codex and Claude Code providers already live in the host composition. A preset chooses either product by contributing the same ordinary delegation-tool row used for spawn and fork; never move a product provider into the preset and never add a product-specific settings field. +Codex and Claude Code providers belong on the host plane but are not installed by production `dsh`. The active Profile must install and mount the selected provider before a preset can expose its ordinary delegation-tool row; never move a product provider into the preset and never add a product-specific settings field. Copy these disabled templates from a shipped full preset and remove `disabled` only for the products the user requested: @@ -134,7 +134,7 @@ Copy these disabled templates from a shipped full preset and remove `disabled` o config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code @@ -143,11 +143,11 @@ Copy these disabled templates from a shipped full preset and remove `disabled` o config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed ``` -The two rows are independent. Leaving both disabled preserves the copied preset, enabling one exposes only that product tool, and enabling both exposes both. The host must provide `codex` or `claude` on `PATH`; the preset does not install, authenticate, select a model for, or probe either product. +The two rows are independent. Leaving both disabled preserves the copied preset, enabling one exposes only that product tool, and enabling both exposes both. Production `dsh` does not install or mount either optional provider: before enabling a row, the Profile must install the matching `@deepseek-ai/dsh-subagent-codex` or `@deepseek-ai/dsh-subagent-claude-code` package and mount it once on the host plane. A preset cannot provide that host dependency. `backgroundMode: one-shot` keeps omitted or `false` calls in the foreground and lets explicit `run_in_background: true` return a generic Job id. Full presets already carry `tool-jobs`, while the base host carries the job registry; retain both so `job_output`, `job_list`, `job_kill`, cancellation, and completion notices stay available. The host must also provide `codex` or `claude` on `PATH`; the preset does not install, authenticate, select a model for, or probe either product. ## What not to move into a preset diff --git a/apps/cli/config/agent-presets/minimal/agent.cordis.yml b/apps/cli/config/agent-presets/minimal/agent.cordis.yml index 1a2336b222..b6ed406f54 100644 --- a/apps/cli/config/agent-presets/minimal/agent.cordis.yml +++ b/apps/cli/config/agent-presets/minimal/agent.cordis.yml @@ -1,15 +1,16 @@ # The `minimal` agent preset: a fixed-prompt, two-tool coding-agent composition. # # The persona is the complete system prompt, so global identity, Web orientation, -# tool guidance, and later assembly listeners cannot add prompt text. The model -# composes only the persistent `bash` and `str_replace_editor` tools. Context -# compaction is deliberately absent. +# tool guidance, and later assembly listeners cannot add prompt text. Runtime +# context snapshots are suppressed for this preset, and the model composes only +# persistent `bash` and `str_replace_editor`. Context compaction is absent. - id: persona name: '@deepseek-ai/dsh-persona' config: text: You are a helpful software engineer assistant. complete: true + includeRuntimeContext: false # The PTY registry is an agent-owned service, so it lives in an entry-local # realm. The backend still consumes the host sandbox policy and subprocess diff --git a/apps/cli/config/agent-presets/standard/agent.cordis.yml b/apps/cli/config/agent-presets/standard/agent.cordis.yml index f0916d9992..b8559cfd74 100644 --- a/apps/cli/config/agent-presets/standard/agent.cordis.yml +++ b/apps/cli/config/agent-presets/standard/agent.cordis.yml @@ -197,16 +197,16 @@ toolName: subagent_fork backgroundMode: continuable - # Product providers are host-plane singletons. Copy this preset, then - # remove `disabled` from either ordinary tool row to expose that product - # only to agents composed from the copy. + # Production dsh does not install these optional providers. An opting-in + # Profile mounts each provider once on the host plane; copy this preset, + # then remove `disabled` from the matching tool row. - id: tool-subagent-codex name: '@deepseek-ai/dsh-tool-subagent' disabled: true config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code @@ -215,7 +215,7 @@ config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: workflow-worker-thread diff --git a/apps/cli/package.json b/apps/cli/package.json index 50251dbc9a..a5f7913c2f 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh", "description": "dsh CLI: profile boot, plugin management, and the browser UI alias", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -18,7 +18,7 @@ "lib/*.js", "config" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/cordis-plugin-hmr": "workspace:^", "@deepseek-ai/cordis-plugin-include": "workspace:^", diff --git a/apps/cli/reference/README.i18n.yaml b/apps/cli/reference/README.i18n.yaml index 89fb45feb7..b62de584e2 100644 --- a/apps/cli/reference/README.i18n.yaml +++ b/apps/cli/reference/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/cli/reference/README.md -README.md: 0b23db293c304807b5959f5eae9a2faf868caa62 -README.zh.md: 1ca91fb69c3ed34d925f6b8a6454866e82c8dcf7 +README.md: 0be64fdfc0ad4e81d23f25a26881fa89f37565b0 +README.zh.md: 649bf15df814abf4875fed794c2e76c494bfcc25 diff --git a/apps/cli/reference/README.md b/apps/cli/reference/README.md index 0b23db293c..0be64fdfc0 100644 --- a/apps/cli/reference/README.md +++ b/apps/cli/reference/README.md @@ -61,7 +61,7 @@ dsh web --dump-config dsh web --help ``` -The production Web runner needs built package and frontend artifacts (`pnpm run build`). It serves `http://127.0.0.1:3080` by default. Binding all interfaces also trusts the machine's discovered LAN IP literals; `--trusted-host` adds named authorities accepted by the `/api` browser-trust fence. +The production Web runner needs built package and frontend artifacts (`pnpm run build`). It serves `http://127.0.0.1:3080` by default. The CLI intentionally does not support `--host 0.0.0.0` yet and exits with a usage error; `--trusted-host` adds named authorities accepted by the `/api` browser-trust fence. Process shutdown gives the plugin tree up to five seconds to dispose. The first `SIGINT`/`SIGTERM` starts that graceful drain — `SIGTERM` is a supervisor's ordinary stop request and exits 0 on every surface, `SIGINT` reports 130; a second signal forces immediate exit. If one-shot normal completion is already stuck in disposal, the first `Ctrl+C` is the escalation and exits immediately instead of being swallowed. diff --git a/apps/cli/reference/README.zh.md b/apps/cli/reference/README.zh.md index 1ca91fb69c..649bf15df8 100644 --- a/apps/cli/reference/README.zh.md +++ b/apps/cli/reference/README.zh.md @@ -2,25 +2,25 @@ [English](README.md) | 中文 -本å�‚考定义 profileã€�web 别å��ã€�æ�’件管ç�†å’Œé…�ç½® dump 命令模å¼�。å�‚æ•°ç”± [`src/args.ts`](../src/args.ts) 统一解æž�,[`src/bin.ts`](../src/bin.ts) å�ªåЍæ€�导入选中的è¿�行器。 +本å�‚考定义 profile å�¯åЍã€�web 别å��ã€�æ�’件管ç�†å’Œé…�ç½® dump 等命令模å¼�。argv ç”± [`src/args.ts`](../src/args.ts) 统一解æž�一次,[`src/bin.ts`](../src/bin.ts) å�ªä¼šåЍæ€�导入选中的è¿�行器。 ## Profile å�¯åЍ -`dsh --profile ` å�¯åЍä½�于 `$DSH_HOME/profiles/` çš„ profile。生效é…�置树在空根节点之上按以下顺åº�é€�层组å�ˆï¼šprofile manifest(元数æ�®æ¸…å�•)的 `dsh.profile.bundles` 列表所列的å�„个组å�ˆåŒ… patchã€�profile 自身的 `cordis.patch.yml`ã€�home 级的 `$DSH_HOME/cordis.patch.yml`(å�„ profile 共享的机器本地å��好,因此优先级高于é€� profile 的层)ã€�以å�ŠæŒ‰ argv 顺åº�çš„å�„个 `--patch ` overlay。å�Žåº”用的层按行胜出;patch 替æ�¢ç›®æ ‡è¡Œå®Œæ•´çš„ `config` 值,而ä¸�是深度å�ˆå¹¶å�„键,并且å�¯ä»¥æ�’入新行。é…�置解æž�ã€�schema 校验ã€�模å�—è§£æž�或æ�’ä»¶å�¯åŠ¨å¤±è´¥ä¼šå¾—åˆ°æŠ¥å‘Šå¹¶ä»¥é�žé›¶çжæ€�退出。收到 SIGINT 或 SIGTERM 时,挂载的根节点会先 dispose(资æº�释放)å†�退出。 +`dsh --profile ` å�¯åЍä½�于 `$DSH_HOME/profiles/` çš„ profile。生效é…�置树以空根节点为起点,ä¾�次å� åŠ  profile manifest(元数æ�®æ¸…å�•)的 `dsh.profile.bundles` 列表中指定的å�„组å�ˆåŒ… patchã€�profile 自身的 `cordis.patch.yml`ã€�home 级的 `$DSH_HOME/cordis.patch.yml`(这是å�„ profile 共享的机器本地å��好,因此优先于é€� profile é…�置层),以å�ŠæŒ‰ argv 顺åº�指定的å�„个 `--patch ` 覆盖层。对å�Œä¸€é…�置行,å�Žåº”用的层优先。patch 会替æ�¢ç›®æ ‡è¡Œçš„æ•´ä¸ª `config` 值,而ä¸�是深度å�ˆå¹¶å…¶ä¸­çš„键;patch 也å�¯ä»¥æ�’入新行。é…�置解æž�ã€�schema 校验ã€�模å�—è§£æž�或æ�’ä»¶å�¯åŠ¨å¤±è´¥æ—¶ï¼Œç³»ç»Ÿä¼šæŠ¥å‘Šé”™è¯¯å¹¶ä»¥é�žé›¶çжæ€�退出。收到 SIGINT 或 SIGTERM 时,挂载的根节点会先 dispose(资æº�释放)å†�退出。 -组å�ˆåŒ…å��称先从 dsh 安装解æž�,å†�从 profile 目录解æž�。因此内置组å�ˆåŒ…(`@deepseek-ai/dsh-base`ã€�`@deepseek-ai/dsh-web-app`ã€�`@deepseek-ai/dsh-headless`)总是æ�¥è‡ªä¸Žæ­£åœ¨è¿�行的 `dsh` 相å�Œçš„安装;树外组å�ˆåŒ…æ�¥è‡ª profile ç”± pnpm 管ç�†çš„ `node_modules`。任何 patch 行中的裸æ�’ä»¶ `name` 通过 profile 目录的 Node 父目录é€�级查找解æž�,该查找å�¯è¾¾åˆ°æŒ�续维护的安装å�Žå¤‡ç›®å½• `$DSH_HOME/profiles/node_modules`(安装的应用和组å�ˆåŒ…所ä¾�èµ–çš„æ¯�个包对应一个符å�·é“¾æŽ¥ï¼Œæ¯�次å�¯åŠ¨æ—¶ä¿®å¤�)。 +组å�ˆåŒ…å��称先从 dsh 安装目录解æž�,å†�从 profile 目录解æž�。因此,内置组å�ˆåŒ…(`@deepseek-ai/dsh-base`ã€�`@deepseek-ai/dsh-web-app`ã€�`@deepseek-ai/dsh-headless`)始终æ�¥è‡ªå½“å‰�è¿�行的 `dsh` 所属的安装;树外组å�ˆåŒ…则æ�¥è‡ª profile 中由 pnpm 管ç�†çš„ `node_modules`。patch 行中的裸æ�’ä»¶ `name` 会从 profile 目录开始,按照 Node 的模å�—è§£æž�规则é€�级å�‘父目录查找,直至由 dsh 维护的安装å�Žå¤‡ç›®å½• `$DSH_HOME/profiles/node_modules`。该目录为 dsh 安装中的应用和组å�ˆåŒ…所ä¾�èµ–çš„æ¯�个包å�„维护一个符å�·é“¾æŽ¥ï¼Œå¹¶åœ¨æ¯�次å�¯åŠ¨æ—¶ä¿®å¤�这些链接。 `web` å’Œ `headless` profile 首次使用时会从éš�附模æ�¿è‡ªåЍåˆ�始化(`web`:base + web-appï¼›`headless`:base + headless)。其他缺失的 profile 会显å¼�报错,并æ��示è¿�行 `dsh plugin --profile add `。 ### 应用å�‚æ•° -å�¯åŠ¨å™¨è‡ªå·±çš„ flag 写在最å‰�é�¢,并在它ä¸�认识的第一个 token 处结æ�Ÿ;从那里开始的一切都通过 `ctx.cmdlineArgs` 原样交给å�¯åŠ¨èµ·æ�¥çš„ profile,任何注入它的应用æ�’件都å�¯ä»¥è§£æž�([`dsh-cmdline`](../../../packages/boot/cmdline/README.md))。因此 `dsh --profile web --port 8080` 到达的是 web 应用的 `--port`,`dsh --profile web --help` 打å�°çš„æ˜¯è¯¥åº”用的 help 且什么也ä¸�å�¯åЍ,而 `dsh --help`(没有å�¯ä»¥äº¤ä»˜çš„ profile)打å�°çš„æ˜¯å�¯åŠ¨å™¨è‡ªå·±çš„ help。`-V`/`--version` 写在应用å�‚数边界之å‰�时会打å�°å�¯åŠ¨å™¨çš„ç‰ˆæœ¬ã€‚ +å�¯åŠ¨å™¨è‡ªèº«çš„ flag 必须写在最å‰�é�¢ï¼Œå¹¶åœ¨é�‡åˆ°ç¬¬ä¸€ä¸ªæ— æ³•识别的 token 时结æ�Ÿï¼›ä»Žè¯¥ token 开始的所有内容都会通过 `ctx.cmdlineArgs` 原样交给已å�¯åŠ¨çš„ profile,注入该 profile 的任æ„�应用æ�’件都å�¯ä»¥è§£æž�这些内容([`dsh-cmdline`](../../../packages/boot/cmdline/README.md))。因此,`dsh --profile web --port 8080` 会将 `--port` 交给 web 应用;`dsh --profile web --help` å�ªæ‰“å�°è¯¥åº”用的帮助信æ�¯ï¼Œä¸�å�¯åŠ¨åº”ç”¨ï¼›`dsh --help` 没有å�¯ä¾›äº¤ä»˜å�‚æ•°çš„ profile,因此会打å�°å�¯åŠ¨å™¨è‡ªèº«çš„å¸®åŠ©ä¿¡æ�¯ã€‚`-V`/`--version` ä½�于应用å�‚数边界之å‰�时,会打å�°å�¯åŠ¨å™¨çš„ç‰ˆæœ¬ã€‚ -一套组å�ˆå�ªæŒ‚载一次。普通æ�’件注入 `cmdlineArgs`ã€�è§£æž�本应用å�‚数,并把结果作为æœ�务æ��供出去;由 flag é…�置的æ¯�一行都会注入该æœ�务,Loader 会等æœ�务激活å�Žå†�求值该行é…�置(`port: !!js ctx.webStartup.port ?? 3080`),因此 flag 胜过写在它æ—�边的值。该优先级è¦�求é…�置行ä¿�留这一表达å¼�;若用户 patch 用字é�¢é‡�替æ�¢æ•´ä»½ `config`,è¿�行时读å�–也会éš�之消失。help 和被拒ç»�çš„å�‚数会请求退出——拒ç»�时以é�žé›¶çжæ€�,help 时以 0——且ä¸�会激活ä¾�èµ–æ��供方æœ�务的行。在线编辑 `cordis.patch.yml` 会针对ä»�然在线的æœ�务é‡�新求值表达å¼�,因此ä¸�会é‡�置已在æœ�务的端å�£ã€‚ +æ¯�套组å�ˆå�ªä¼šæŒ‚载一次。普通æ�’件注入 `cmdlineArgs`,解æž�所属应用的å�‚数,并将解æž�结果作为æœ�务æ��供。æ¯�个从 flag å�–值的é…�置行都会注入该æœ�务;Loader 会等到æœ�务激活å�Žï¼Œå†�对该行的é…�置求值(`port: !!js ctx.webStartup.port ?? 3080`),因此 flag 的优先级高于é…�置行中写明的值。è¦�ç»´æŒ�这一优先级,é…�置行必须ä¿�留该表达å¼�;如果用户 patch 用字é�¢é‡�替æ�¢æ•´ä¸ª `config`,也会éš�之移除è¿�行时读å�–。帮助å�‚数和被拒ç»�çš„å�‚数都会请求退出:å�‚数被拒ç»�时以é�žé›¶çжæ€�退出,显示帮助时以 0 退出;ä¾�赖该æ��供方æœ�务的é…�置行ä¸�会激活。在线编辑 `cordis.patch.yml` 时,系统会根æ�®ä»�在è¿�行的æœ�务é‡�新计算表达å¼�,因此ä¸�会é‡�置当å‰�正在使用的端å�£ã€‚ å�¯åŠ¨å™¨çš„ flag 必须写在应用å�‚数之å‰�,且å�¯åŠ¨å™¨çš„è§£æž�器会消耗掉一个 `--`:必须以字é�¢é‡� `--` é€�达应用的å�‚数需è¦�写æˆ� `-- --`。如果应用的第一个å�‚æ•°æ�°å¥½ç­‰äºŽ `web` 或 `plugin`,会选择对应的å­�命令。`ctx.cmdlineArgs.get()` 是共享的ä¸�å�¯å�˜è¯»å�–:多个æ�’ä»¶å�¯ä»¥è§£æž�å�Œä¸€ä»½å¿«ç…§ï¼Œæ²¡æœ‰è¯»å�–方的 profile 则会忽略自己的应用å�‚数。 -éš�附的å�„应用æŒ�有这些命令行: +éš�附的应用接å�—以下命令行å�‚数: | Profile | å�‚æ•° | |---|---| @@ -36,11 +36,11 @@ dsh --profile web --dump-default-config dsh --profile web --patch ./extra.yml --dump-config ``` -`--dump-default-config` å�ªæ‰“å�°ç»„å�ˆåŒ…å�„层;`--dump-config` é¢�外加上 profile çš„ `cordis.patch.yml`ã€�home 级的 `$DSH_HOME/cordis.patch.yml` å’Œ `--patch` overlay。两者都会打å�°æ³¨é‡Šï¼Œæ ‡æ˜Žæ¯�行由哪个文件æ��供,以å�Šå“ªäº› overlay 修改过它;`!!js` 表达å¼�ä¿�æŒ�未求值,找ä¸�到目标的 patch 会报告到 stderr。dump 从ä¸�è¿�行应用命令行æ��供方,因此它展示的是任何应用å�‚数被解æž�之å‰�的组å�ˆé…�置树,并拒ç»�æ�ºå¸¦åº”用å�‚数的调用。 +`--dump-default-config` å�ªæ‰“å�°ç»„å�ˆåŒ…å�„层;`--dump-config` é¢�外加上 profile çš„ `cordis.patch.yml`ã€�home 级的 `$DSH_HOME/cordis.patch.yml` å’Œ `--patch` overlay。两者都会打å�°æ³¨é‡Šï¼Œæ ‡æ˜Žæ¯�行由哪个文件æ��供,以å�Šå“ªäº› overlay 修改过它;`!!js` 表达å¼�ä¿�æŒ�未求值,找ä¸�到目标的 patch 会报告到 stderr。dump æ“�作ä¸�会è¿�行应用的命令行å�‚æ•°æ��供方,因此展示的是解æž�任何应用å�‚数之å‰�的组å�ˆé…�置树;如果调用中包å�«åº”用å�‚数,dump 会拒ç»�该调用。 ## æ�’件管ç�† -`dsh plugin --profile ` 在 profile 缺失时先åˆ�始化它(有éš�附模æ�¿çš„用模æ�¿ï¼Œå…¶ä»–å��ç§°å�ªè£… `@deepseek-ai/dsh-base`),然å�Žä»¥ profile 目录为工作目录,把 `` 转å�‘ç»™ `pnpm`:`add`ã€�`remove`ã€�`why`ã€�`update` å�Šå…¶ä»–所有 pnpm å­�命令都照常å�¯ç”¨ï¼›pnpm 必须在 PATH 上。相对路径 spec(`.`ã€�`../plugin` å�Šå…¶ `file:`/`link:` å½¢å¼�)会先锚定到调用目录,因此在æ�’ä»¶ checkout 中执行 `add .` 安装的是该 checkout,而ä¸�是 profile。æ¯�次æˆ�功è¿�行å�Žï¼Œ`dsh.profile.bundles` 都会与已安装状æ€�对é½�:æ¯�个解æž�到 manifest 中声明了 `"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }` 的包的ä¾�赖加入层栈(因此让包获得该声明的 `update` 会将其激活),没有组å�ˆåŒ…声明的ä¾�èµ–ä¿�æŒ�为普通ä¾�赖并给出一次性警告,已移除的ä¾�赖则退出层栈。 +`dsh plugin --profile ` 在 profile 缺失时先åˆ�始化它(有éš�附模æ�¿çš„用模æ�¿ï¼Œå…¶ä»–å��ç§°å�ªè£… `@deepseek-ai/dsh-base`),然å�Žä»¥ profile 目录为工作目录,把 `` 转å�‘ç»™ `pnpm`:`add`ã€�`remove`ã€�`why`ã€�`update` å�Šå…¶ä»–所有 pnpm å­�命令都照常å�¯ç”¨ï¼›pnpm 必须在 PATH 上。相对路径 spec(`.`ã€�`../plugin` å�Šå…¶ `file:`/`link:` å½¢å¼�)会先锚定到调用目录,因此在æ�’ä»¶ checkout 中执行 `add .` 安装的是该 checkout,而ä¸�是 profile。æ¯�次æˆ�功è¿�行å�Žï¼Œç³»ç»Ÿéƒ½ä¼šæ ¹æ�®å½“å‰�安装状æ€�æ›´æ–° `dsh.profile.bundles`:如果æŸ�项ä¾�èµ–è§£æž�到的包在 manifest 中声明了 `"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }`,该ä¾�赖就会加入é…�置层栈;如果æŸ�项ä¾�赖在 `update` å�ŽèŽ·å¾—è¯¥å£°æ˜Žï¼Œä¹Ÿä¼šéš�å�³æ¿€æ´»ã€‚没有组å�ˆåŒ…声明的ä¾�èµ–ä»�作为普通ä¾�èµ–ä¿�留,并显示一次性警告;已移除的ä¾�赖则从é…�置层栈中删除。 ```sh dsh plugin --profile tui add github:deepseek-harness/turtle-ui @@ -48,7 +48,7 @@ dsh plugin --profile tui remove turtle-ui dsh --profile tui ``` -Git 托管ã€�éš�附æº�ç �çš„æ�’件在安装期间通过其 `prepare` 脚本构建,而 pnpm ≥10 在消费方å…�许之å‰�会阻止该脚本:首次 `add` 会失败并给出 pnpm çš„ `allowBuilds` æ��示(以å�Š dsh 指å�‘该 profile çš„ `pnpm-workspace.yaml` 的指引);把打å�°å‡ºçš„é”®å¤�制到那里并é‡�æ–°è¿�行å�³å�¯ã€‚安装已构建的 tarball 或本地 checkout ä¸�需è¦�任何å…�许。 +éš�æº�ç �å�‘布的 Git 托管æ�’件会在安装期间通过 `prepare` 脚本构建,而 pnpm ≥10 默认会阻止该脚本,直到使用方明确å…�许。首次è¿�行 `add` 会失败,并显示 pnpm çš„ `allowBuilds` æ��示;dsh 还会æ��示应修改该 profile çš„ `pnpm-workspace.yaml`。将输出的键å¤�制到该文件å�Žï¼Œé‡�æ–°è¿�行命令å�³å�¯ã€‚安装已ç»�构建好的 tarball 或本地 checkout 时,无需加入 `allowBuilds`。 ## Web 别å�� @@ -61,11 +61,11 @@ dsh web --dump-config dsh web --help ``` -生产 Web è¿�行器需è¦�已构建的包和å‰�端产物(`pnpm run build`)。默认æœ�务地å�€æ˜¯ `http://127.0.0.1:3080`。绑定所有网络接å�£æ—¶ï¼Œè¿˜ä¼šä¿¡ä»»æœºå™¨è‡ªåЍå�‘现的 LAN IP å­—é�¢é‡�ï¼›`--trusted-host` å�¯æ·»åŠ  `/api` æµ�览器信任围æ �接å�—的具å�� authority。 +生产 Web è¿�行器需è¦�已构建的包和å‰�端产物(`pnpm run build`)。默认æœ�务地å�€æ˜¯ `http://127.0.0.1:3080`。CLI ç›®å‰�有æ„�ä¸�支æŒ� `--host 0.0.0.0`,并会以用法错误退出;`--trusted-host` å�¯æ·»åŠ  `/api` æµ�览器信任围æ �接å�—的具å�� authority。 -进程关闭时会给æ�’件树最多 5 秒完æˆ� dispose。第一次 `SIGINT`/`SIGTERM` å�¯åŠ¨è¯¥ä¼˜é›…æŽ’ç©ºâ€”â€”`SIGTERM` 是监ç�£è¿›ç¨‹çš„æ™®é€šå�œæ­¢è¯·æ±‚,在所有 surface 上以 0 退出,`SIGINT` 报告 130;第二次信å�·å¼ºåˆ¶ç«‹å�³é€€å‡ºã€‚如果一次性è¿�行正常结æ�Ÿæ—¶å·²ç»�å�¡åœ¨ dispose 中,第一次 `Ctrl+C` 就会å�‡æ ¼å¹¶ç«‹å�³é€€å‡ºï¼Œè€Œä¸�会被å�žæŽ‰ã€‚ +进程关闭时,æ�’件树最多有 5 秒完æˆ� dispose。首次收到 `SIGINT` 或 `SIGTERM` 时会开始优雅排空:`SIGTERM` 是监ç�£è¿›ç¨‹å�‘出的常规å�œæ­¢è¯·æ±‚,在所有è¿�行模å¼�下都以 0 退出;`SIGINT` 则报告 130。第二次收到信å�·æ—¶ä¼šç«‹å�³å¼ºåˆ¶é€€å‡ºã€‚如果一次性è¿�行在正常结æ�Ÿæ—¶å·²ç»�å�¡åœ¨ dispose 阶段,第一次按下 `Ctrl+C` 就会直接å�‡çº§ä¸ºå¼ºåˆ¶é€€å‡ºï¼Œè€Œä¸�会被忽略。 -所有模å¼�都将调用目录作为默认 workspace 根目录,以 65,536 字节渲染预算加载适用的 `AGENTS.md` 或 `CLAUDE.md` 指令,并使用内存 SQLite 会è¯�内容索引。æ¯�次 profile å�¯åŠ¨éƒ½ç›‘è§†ä¸¤ä¸ª `cordis.patch.yml` 层(profile 与 home)的有效编辑并以事务方å¼�é‡�新应用;一次性 surface ç»�由有界关闭退出,关闭会先 dispose 监视器。 +所有模å¼�都将è¿�行命令时所在的目录作为默认 workspace 根目录,以 65,536 字节渲染预算加载适用的 `AGENTS.md` 或 `CLAUDE.md` 指令,并使用内存 SQLite 会è¯�内容索引。æ¯�次å�¯åЍ profile 时,系统都会监视 profile 与 home 两个 `cordis.patch.yml` é…�置层的有效å�˜æ›´ï¼Œå¹¶ä»¥äº‹åŠ¡æ–¹å¼�é‡�新应用;一次性è¿�行模å¼�通过有界关闭æµ�程退出,该æµ�程会先 dispose 监视器。 新会è¯�默认使用 `workspace-write` æ�ƒé™�预设。Bash 和文件系统修改仅é™�于会è¯� workspace 与平å�°ä¸´æ—¶æ ¹ç›®å½•;读å�–ã€�网络访问和进程å�¯è§�性ä¸�å�—é™�制。`DSH_PERMISSION_MODE` 更改进程å�Žå¤‡å€¼ã€‚General settings 中存储的æ�ƒé™�å½±å“�å�Žç»­ Web 会è¯�,ä¸�改å�˜å·²æ‰“开的会è¯�。 @@ -75,8 +75,7 @@ dsh web --help 基础组å�ˆåŒ…挂载原生 DeepSeek 适é…�器ã€�settings 与凭æ�®æ��供方ã€�稳定的 `web_search` 和已ç¦�用的会è¯�é�¥æµ‹ã€‚æ��供方凭æ�®ä¾�次从继承环境ã€�`$DSH_HOME/.credentials.yaml`ã€�调用目录的 `.env` å’Œ `$DSH_HOME/.env` è§£æž�ï¼›å�—管文档从ä¸�物化进 `process.env`,而两个 `.env` 文件都是普通å�¯åŠ¨çŽ¯å¢ƒå±‚ã€‚æ�œç´¢ä½¿ç”¨ `DEEPSEEK_API_KEY` 并接å�— `DEEPSEEK_SEARCH_BASE_URL`ï¼›å�ªæœ‰ patch 层æ�’å…¥æ��供方并å�¯ç”¨ `web_fetch` å�Žï¼Œè¯¥å·¥å…·æ‰�å�¯ç”¨ã€‚ -会è¯�é�¥æµ‹é»˜è®¤ç•™åœ¨æœ¬åœ°ã€‚`DSH_TELEMETRY_MODE=FULL` å°†æ¯�æ�¡å·²æŠ•影会è¯�事件作为 OTLP/HTTP 日志æµ�å¼�å�‘é€�,`DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 则仅在记录å��馈时上传会è¯�日志å�Žç¼€ã€‚`DSH_TELEMETRY_OTLP_URL` 选择其他 collector,任何é�žç©º `DSH_TELEMETRY_DISABLED` ä»�是具有最高优先级的硬性退出开关。éš�附基础é…�置没有é�¥æµ‹è„±æ•�规则,因此显å¼�å�¯ç”¨çš„导出å�¯èƒ½åŒ…å�«æ¶ˆæ�¯æ–‡æœ¬ã€�工具å�‚数与结果以å�Š workspace 路径;该部署决策由[默认关闭 Agent Note](../../../.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md)负责。 - +会è¯�é�¥æµ‹é»˜è®¤ç•™åœ¨æœ¬åœ°ã€‚`DSH_TELEMETRY_MODE=FULL` å°†æ¯�æ�¡å·²æŠ•影会è¯�事件作为 OTLP/HTTP 日志æµ�å¼�å�‘é€�,`DSH_TELEMETRY_MODE=FEEDBACK_ONLY` 则仅在记录å��馈时上传会è¯�日志å�Žç¼€ã€‚`DSH_TELEMETRY_OTLP_URL` 选择其他 collector。任何é�žç©ºçš„ `DSH_TELEMETRY_DISABLED` 都是具有最终效力的é�¥æµ‹å¼ºåˆ¶å…³é—­å¼€å…³ã€‚éš�附基础é…�置没有é�¥æµ‹è„±æ•�规则,因此显å¼�å�¯ç”¨çš„导出å�¯èƒ½åŒ…å�«æ¶ˆæ�¯æ–‡æœ¬ã€�工具å�‚数和结果,以å�Š workspace 路径;相关部署决策è§�[默认关闭 Agent Note](../../../.agents/notes/implemented/feature/2026-08-10-telemetry-default-off.md)。 通过 `dsh plugin --profile add ` 安装外部æ�’件组å�ˆåŒ…。安装的包拥有其ä¾�赖,并贡献其声明的 `cordis.patch.yml` 层。CLI 还éš�附 `@deepseek-ai/dsh-mcp-client` 作为供 patch 层使用的ä¾�赖,但默认ä¸�å�¯ç”¨ MCP æœ�务器,因为æ¯�æ�¡æœ�务器命令都是 agent(智能体)沙箱之外的å�—ä¿¡ä»»å�¯æ‰§è¡Œä»£ç �。 diff --git a/apps/cli/tests/args.spec.ts b/apps/cli/tests/args.spec.ts index 89a16921b2..611a098b6f 100644 --- a/apps/cli/tests/args.spec.ts +++ b/apps/cli/tests/args.spec.ts @@ -36,8 +36,8 @@ describe('parseDshArgs', () => { .toEqual({ mode: 'profile', profile: 'tui', patches: [], args: ['--resume', 'abc'] }) expect(parse(['--profile', 'web', '-h'])) .toEqual({ mode: 'profile', profile: 'web', patches: [], args: ['-h'] }) - expect(parse(['web', '--host', '0.0.0.0', '--port', '8080', '--dev'])) - .toEqual({ mode: 'profile', profile: 'web', patches: [], args: ['--host', '0.0.0.0', '--port', '8080', '--dev'] }) + expect(parse(['web', '--host', '127.0.0.1', '--port', '8080', '--dev'])) + .toEqual({ mode: 'profile', profile: 'web', patches: [], args: ['--host', '127.0.0.1', '--port', '8080', '--dev'] }) expect(parse(['--profile', 'headless', 'run', 'the', 'tests'])) .toEqual({ mode: 'profile', profile: 'headless', patches: [], args: ['run', 'the', 'tests'] }) // Launcher flags placed after that boundary belong to the app too. diff --git a/apps/cli/tests/built-bin.e2e.ts b/apps/cli/tests/built-bin.e2e.ts index c989d9ce3e..f887c170d3 100644 --- a/apps/cli/tests/built-bin.e2e.ts +++ b/apps/cli/tests/built-bin.e2e.ts @@ -339,6 +339,15 @@ describe.skipIf(!existsSync(dshBin))('dsh BUILT bin (node lib/bin.js, no tsx)', expect(web.stdout).toContain('--port ') expect(web.stdout).not.toContain('dsh web: http://') + const wildcardHost = await runBuiltBin(['web', '--host', '0.0.0.0'], { + DSH_HOME: home, + DSH_TELEMETRY_DISABLED: '1', + }) + expect(wildcardHost.code).toBe(1) + expect(wildcardHost.stdout).toBe('') + expect(wildcardHost.stderr).toContain('--host 0.0.0.0 is intentionally not supported yet for safety: it would expose remote code execution to the network; use 127.0.0.1 instead') + expect(wildcardHost.stderr).not.toContain('dsh web: http://') + const headlessHelp = await runBuiltBin(['--profile', 'headless', '--help'], { DSH_HOME: home, DSH_TELEMETRY_DISABLED: '1', diff --git a/apps/cli/tests/lazy-search-startup.compat.spec.ts b/apps/cli/tests/lazy-search-startup.compat.spec.ts index b1477a63d0..c563c850e6 100644 --- a/apps/cli/tests/lazy-search-startup.compat.spec.ts +++ b/apps/cli/tests/lazy-search-startup.compat.spec.ts @@ -21,15 +21,22 @@ import { describe, expect, it } from 'vitest' const repoRoot = fileURLToPath(new URL('../../../', import.meta.url)) const builtBin = join(repoRoot, 'apps/cli/lib/bin.js') const webDist = join(repoRoot, 'apps/web/dist/index.html') -// The web bundle's patch owns the session-query-sqlite lazy-open row. -const configPath = join(repoRoot, 'packages/bundle/web-app/cordis.patch.yml') +// Full-text session search ships off (`openAt: never` on both layers): the +// base patch carries the default, and the web restatement must not re-enable it. +const baseConfigPath = join(repoRoot, 'packages/bundle/base/cordis.patch.yml') +const webConfigPath = join(repoRoot, 'packages/bundle/web-app/cordis.patch.yml') const requireBuiltArtifacts = process.env.DSH_REQUIRE_BUILT_CLI_SMOKE === '1' interface ConfigRow { id?: string + disabled?: unknown config?: { openAt?: unknown } } +interface PatchEntry extends ConfigRow { + insert?: ConfigRow[] +} + const jsExprType = new yaml.Type('tag:yaml.org,2002:js', { kind: 'scalar', construct: value => String(value), @@ -92,12 +99,20 @@ function runBuiltWeb(cwd: string): Promise<{ stdout: string; stderr: string; cod } describe.skipIf(!requireBuiltArtifacts)('built CLI lazy-search startup', () => { - it('boots and disposes the shipped composition without a SQLite startup warning', async () => { + it('boots and disposes the shipped composition with full-text search off by default', async () => { expect(existsSync(builtBin), `missing built CLI ${resolve(builtBin)}; run pnpm build`).toBe(true) expect(existsSync(webDist), `missing Web dist ${resolve(webDist)}; run pnpm run build:web`).toBe(true) - const rows = yaml.load(await readFile(configPath, 'utf8'), { schema: configSchema }) as ConfigRow[] - const searchRow = rows.find(row => row.id === 'session-query-sqlite') - expect(searchRow?.config?.openAt).toBe('first-search') + const baseRows = (yaml.load(await readFile(baseConfigPath, 'utf8'), { schema: configSchema }) as PatchEntry[]) + .flatMap(entry => entry.insert ?? [entry]) + const webRows = (yaml.load(await readFile(webConfigPath, 'utf8'), { schema: configSchema }) as PatchEntry[]) + .flatMap(entry => entry.insert ?? [entry]) + const baseRow = baseRows.find(row => row.id === 'session-query-sqlite') + const webRow = webRows.find(row => row.id === 'session-query-sqlite') + expect(baseRow?.config?.openAt).toBe('never') + expect(baseRow?.disabled).toBeUndefined() + // The web restatement keeps the shipped default; opting in is a later layer's override. + expect(webRow?.config?.openAt).toBe('never') + expect(webRow?.disabled).toBeUndefined() const cwd = await mkdtemp(join(tmpdir(), 'dsh-cli-lazy-search-')) try { diff --git a/apps/cli/tests/web-agent-presets.e2e.ts b/apps/cli/tests/web-agent-presets.e2e.ts index ca0f5ece78..7b347353fd 100644 --- a/apps/cli/tests/web-agent-presets.e2e.ts +++ b/apps/cli/tests/web-agent-presets.e2e.ts @@ -28,6 +28,7 @@ const BASE_PATCH = join(REPO_ROOT, 'packages/bundle/base/cordis.patch.yml') const WEB_PATCH = join(REPO_ROOT, 'packages/bundle/web-app/cordis.patch.yml') /** The installation anchor whose dependency surface the preset module fallback mirrors. */ const INSTALL_ANCHOR = join(REPO_ROOT, 'apps/cli/package.json') +const EXAMPLES_INSTALL_ANCHOR = join(REPO_ROOT, 'examples/package.json') const MINIMAL_PROMPT = 'You are a helpful software engineer assistant.' const MINIMAL_BASH_DESCRIPTION = `Run commands in a bash shell * When invoking this tool, the contents of the "command" parameter does NOT need to be XML-escaped. @@ -43,7 +44,11 @@ const MINIMAL_BASH_DESCRIPTION = `Run commands in a bash shell * touch the network, or write outside the test. Everything that decides an * agent's capabilities is the real thing, including both shipped presets. */ -async function bootWeb(settingsFile: string, extra: PatchOptions[] = []): Promise { +async function bootWeb( + settingsFile: string, + extra: PatchOptions[] = [], + extraInstallAnchor?: string, +): Promise { const storageRoot = join(dirname(settingsFile), 'storages') const patches: PatchOptions[] = [ ...loadOverlayPatches('dsh-test', BASE_PATCH), @@ -110,6 +115,7 @@ async function bootWeb(settingsFile: string, extra: PatchOptions[] = []): Promis // them resolvable — the same mechanism, not a test-only shim. const home = dirname(settingsFile) healProfilesModuleFallback(INSTALL_ANCHOR, home) + if (extraInstallAnchor !== undefined) healProfilesModuleFallback(extraInstallAnchor, home) const profileDir = join(home, 'profiles', 'spec') await mkdir(profileDir, { recursive: true }) const rootConfig = join(profileDir, 'cordis.yml') @@ -122,6 +128,16 @@ async function bootWeb(settingsFile: string, extra: PatchOptions[] = []): Promis const toolNames = (ctx: Context, agent?: Agent): string[] => ctx.tools.schemas(agent).map(schema => schema.name).sort() +function toolParameterNames(ctx: Context, agent: Agent, toolName: string): string[] { + const schema = ctx.tools.schemas(agent).find(tool => tool.name === toolName) + if (schema === undefined) throw new Error(`missing tool schema ${toolName}`) + const properties = schema.parameters.properties + if (typeof properties !== 'object' || properties === null || Array.isArray(properties)) { + throw new Error(`${toolName} has invalid parameter properties`) + } + return Object.keys(properties).sort() +} + function enablePresetTool(composition: string, id: string): string { const row = ` - id: ${id}\n` const start = composition.indexOf(row) @@ -440,17 +456,23 @@ describe('product subagent rows in user presets', () => { await mkdir(directory, { recursive: true }) await writeFile(join(directory, 'agent.cordis.yml'), composition) } - productCtx = await bootWeb(settingsFile, [{ - id: 'agent-presets', - config: { - default: 'standard', - roots: [ - { path: join(CONFIG_DIR, 'agent-presets'), trust: 'system' }, - { path: userRoot, trust: 'user' }, - ], - includeUserRoot: false, + productCtx = await bootWeb(settingsFile, [ + { insert: [ + { id: 'subagent-codex', name: '@deepseek-ai/dsh-subagent-codex' }, + { id: 'subagent-claude-code', name: '@deepseek-ai/dsh-subagent-claude-code' }, + ] }, + { + id: 'agent-presets', + config: { + default: 'standard', + roots: [ + { path: join(CONFIG_DIR, 'agent-presets'), trust: 'system' }, + { path: userRoot, trust: 'user' }, + ], + includeUserRoot: false, + }, }, - }]) + ], EXAMPLES_INSTALL_ANCHOR) }, 120_000) afterAll(async () => { @@ -477,6 +499,12 @@ describe('product subagent rows in user presets', () => { const tools = toolNames(productCtx, handle.agent) expect(tools.filter(name => name === 'subagent_codex' || name === 'subagent_claude_code')) .toEqual(productTools) + expect(tools).toEqual(expect.arrayContaining(['job_kill', 'job_list', 'job_output'])) + for (const productTool of productTools) { + expect(toolParameterNames(productCtx, handle.agent, productTool)).toEqual([ + 'description', 'prompt', 'run_in_background', + ]) + } } finally { await handle.dispose() } diff --git a/apps/web/package.json b/apps/web/package.json index f6dd190d91..fc990f684c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-web-frontend", "description": "Web application entry: vite build over the @deepseek-ai/dsh-client-web shell library; dist/ served by apps/cli's dsh web", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -24,7 +24,7 @@ "dev": "vite", "watch": "vite build --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-client-web": "workspace:^", "react": "^18.2.0", diff --git a/apps/web/tests/README.i18n.yaml b/apps/web/tests/README.i18n.yaml index a6005ade32..b366a7ff52 100644 --- a/apps/web/tests/README.i18n.yaml +++ b/apps/web/tests/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write apps/web/tests/README.md -README.md: 68e5db5af5f816cc982bacb7989d996c859be204 -README.zh.md: f366c28024dab89d0243a60d93a706f220fa8fb8 +README.md: acb0c300bafe221f6a92f0168908bebf965377b9 +README.zh.md: fd3d950a106375bb038b205415407b4a31bd2b32 diff --git a/apps/web/tests/README.md b/apps/web/tests/README.md index 68e5db5af5..acb0c300ba 100644 --- a/apps/web/tests/README.md +++ b/apps/web/tests/README.md @@ -29,9 +29,9 @@ artifact it produces itself. When a scenario needs a Client-owned constant or pure function, mirror it here instead, next to the commented-out import that names the source module. A drift -then surfaces as a missed selector or an unsuppressed notice — a loud failure, -never a silent pass. `scaffold.ts` holds the mirrored welcome-notice values and -exports them for the scenarios that assert on them. +then surfaces as a missed selector or a stale mirrored value — a loud failure, +never a silent pass. `scaffold.ts` follows this rule for the welcome-notice +namespace, acknowledgement field, version, and asserted Chinese copy. Two kinds of Client import stand. `assembled-boot.ts` drives the shell itself, so it imports `AppWebEntry` from `@deepseek-ai/dsh-client-web` and the boot-manifest diff --git a/apps/web/tests/README.zh.md b/apps/web/tests/README.zh.md index f366c28024..fd3d950a10 100644 --- a/apps/web/tests/README.zh.md +++ b/apps/web/tests/README.zh.md @@ -23,8 +23,8 @@ Client face,而该 face 必须等 Host tsdown 生æˆ� `@deepseek-ai/dsh-goal/re 于是 Host 构建阶段å�˜æˆ�在等一个由它自己产出的产物。 当æŸ�个场景需è¦� Client æŒ�有的常é‡�或纯函数时,改为在此处镜åƒ�一份,并紧挨ç�€ä¸€æ�¡æ³¨é‡ŠæŽ‰çš„ -import 点明æº�模å�—。这样漂移会表现为选择器未命中或æ��示未被抑制——是å“�亮的失败,ç»�ä¸�会是é�™é»˜ -通过。`scaffold.ts` æŒ�有镜åƒ�çš„ welcome-notice å�–值,并导出给断言它们的场景使用。 +import 点明æº�模å�—。这样漂移会表现为选择器未命中或镜åƒ�值过期——是å“�亮的失败,ç»�ä¸�会是é�™é»˜ +通过。`scaffold.ts` 按此规则镜åƒ�欢迎声明的 namespaceã€�确认字段ã€�版本和被断言的中文文案。 有两类 Client import 是长期æˆ�立的。`assembled-boot.ts` 驱动 shell 本身,因此它从 `@deepseek-ai/dsh-client-web` import `AppWebEntry`ã€�从 diff --git a/apps/web/tests/cold-blank-session.e2e.ts b/apps/web/tests/cold-blank-session.e2e.ts new file mode 100644 index 0000000000..dd79c4e8b1 --- /dev/null +++ b/apps/web/tests/cold-blank-session.e2e.ts @@ -0,0 +1,60 @@ +/** Cold Session list visibility through the shipped compressed JSONL backend. */ + +import { mkdir, stat } from 'node:fs/promises' +import { fileURLToPath } from 'node:url' +import { join } from 'node:path' +import type { Browser, Page } from 'playwright' +import { chromium } from 'playwright' +import { afterAll, beforeAll, describe, expect, it, onTestFailed } from 'vitest' +import { + captureStableAria, compareOrRefreshGolden, launchWebScaffold, seedBlankSession, + watchConsole, webSnapshotMode, type WebScaffold, +} from './scaffold.ts' +import { newEnglishPage, saveFailureShot } from './support.ts' + +const SNAPSHOT_DIR = fileURLToPath(new URL('./snapshots/cold-blank-session', import.meta.url)) +const SIDEBAR_EXPECTED = join(SNAPSHOT_DIR, 'sidebar.expected.md') +const MODE = webSnapshotMode() +const SESSION_ID = 'cold-blank-session-web-e2e' +const WORKSPACE_NAME = 'cold-blank-workspace' + +describe('web e2e: cold blank Session visibility', () => { + let scaffold: WebScaffold + let browser: Browser + let page: Page + let tripwire: ReturnType + + beforeAll(async () => { + scaffold = await launchWebScaffold({}) + const cwd = join(scaffold.workspaceCwd, WORKSPACE_NAME) + await mkdir(cwd, { recursive: true }) + await seedBlankSession(scaffold, SESSION_ID, cwd) + const header = (await scaffold.ctx.sessionPersistence.list()) + .find(candidate => candidate.id === SESSION_ID) + if (header === undefined) throw new Error('blank Session fixture did not materialize') + const location = scaffold.ctx.sessionPersistence.locate(header) + if (location === undefined) throw new Error('JSONL fixture has no physical artifact') + expect((await stat(location.path)).size).toBeLessThanOrEqual(1024) + + browser = await chromium.launch() + page = await newEnglishPage(browser) + tripwire = watchConsole(page) + await page.goto(scaffold.baseUrl, { waitUntil: 'load' }) + await page.waitForSelector('[class*="frame"]', { timeout: 30_000 }) + }, 120_000) + + afterAll(async () => { + await browser?.close() + await scaffold?.close() + }) + + it('keeps the verified cold blank Session out of the sidebar', async () => { + onTestFailed(() => saveFailureShot(page, 'web-e2e-cold-blank-session')) + const tree = page.getByRole('tree', { name: 'Sessions' }) + await tree.waitFor({ timeout: 30_000 }) + expect(await tree.getByText(WORKSPACE_NAME, { exact: true }).count()).toBe(0) + const sidebar = await captureStableAria(page, '[role="tree"][aria-label="Sessions"]', scaffold.workspaceCwd) + await compareOrRefreshGolden(SIDEBAR_EXPECTED, sidebar, MODE) + expect(tripwire.pageErrors).toEqual([]) + }) +}) diff --git a/apps/web/tests/composer-tab-geometry.e2e.ts b/apps/web/tests/composer-tab-geometry.e2e.ts index bb43e20406..0f7b01c7ff 100644 --- a/apps/web/tests/composer-tab-geometry.e2e.ts +++ b/apps/web/tests/composer-tab-geometry.e2e.ts @@ -11,12 +11,13 @@ // gets an absolutely positioned seat instead, laid out against the padding box, // which the scrollbar never reduces. // -// Without a shared reservation the two tabs disagree by exactly the bar's -// width for as long as the transcript overflows: the card jumps sideways on -// every tab switch, and inside Chat alone at the moment a growing transcript -// starts to scroll. The column reserves the gutter unconditionally -// (`scrollbar-gutter: stable`) and states the overlay branch as a scroll -// container on the same axes, so both edges are the same edge. +// The column handles the two edges without reserving the gutter on both: Chat +// keeps `scrollbar-gutter: stable` so its seat's content box never jumps as the +// transcript starts to scroll; the overlay branch does NOT reserve (the view +// owns its own scrollers, so a reserved gutter would only narrow the view's +// content by the bar's width), and the overlay seat instead gives back the +// bar's width (`right: var(--dsh-scrollbar-width)`) so both seats measure the +// same width and the card does not move. // // Only a real engine can show this. The seat's geometry is layout: jsdom gives // every element a zero-sized box and reports no scrollbar at all, so a unit spec @@ -27,18 +28,17 @@ // The browser is launched WITHOUT Playwright's default `--hide-scrollbars`, // which is load-bearing rather than incidental. Under that argument a scroll // container's bar consumes no layout width at all, so the two tabs agree with -// and without the reservation and every comparison below holds vacuously — -// measured: the unreserved cascade leaves both tabs' bands at 0 there, against -// 8 and 0 with the argument dropped. Dropping it is also the faithful +// and without the compensation and every comparison below holds vacuously — +// measured: the uncompensated cascade leaves both tabs' bands at 0 there, +// against 8 and 0 with the argument dropped. Dropping it is also the faithful // configuration: ui-theme's scrollbar.css gives `::-webkit-scrollbar` a width, // and a bar that occupies layout space is what the product actually draws. // -// The scenario runs that unreserved cascade in the page — `scrollbar-gutter: auto` -// on the scroller, `overflow: hidden` on the overlay branch — and measures the -// same two tabs through it, which is what keeps the equal rectangles above from -// being explained by a tab switch that never reached the layout. It is the -// reported symptom as a number: the card moves 4px, half the 8px band, on each -// edge. +// The scenario runs that uncompensated cascade in the page — the overlay seat's +// `right` compensation dropped to 0 — and measures the same two tabs through +// it, which is what keeps the equal rectangles above from being explained by a +// tab switch that never reached the layout. It is the reported symptom as a +// number: the card moves 4px, half the 8px band, on each edge. // // Zero model calls: a seeded cold session renders from its log, and switching // tabs asks the host for nothing. A stray stream would fail loud with NO_ADAPTER. @@ -62,9 +62,9 @@ const SNAPSHOT_DIR = fileURLToPath(new URL('./snapshots/composer-tab-geometry', * Absolute coordinates are deliberately absent: they depend on the sidebar's * laid-out width and on font metrics, so committing them would produce a fixture * that has to be re-recorded per platform. What is recorded is the distance - * between the two tabs' rectangles, which is zero when the reservation holds and + * between the two tabs' rectangles, which is zero when the compensation holds and * the bar's width when it does not — including under the control, so the golden - * carries the shift the unreserved cascade produces rather than only its absence. + * carries the shift the uncompensated cascade produces rather than only its absence. */ const GEOMETRY_EXPECTED = join(SNAPSHOT_DIR, 'geometry.expected.md') const MODE = webSnapshotMode() @@ -114,15 +114,15 @@ async function setMeasuredViewport( } /** - * The unreserved cascade, injected into the page: the reservation dropped and - * the overlay branch forced to a hidden box. `!important` beats the module + * The uncompensated cascade, injected into the page: the overlay seat's `right` + * compensation dropped to 0, so it measures the full padding box while Chat's + * seat still rides the reserved content box. `!important` beats the module * rules without a rebuild, and the id lets the control be lifted again in the * same session. */ const CONTROL_STYLE_ID = 'composer-tab-geometry-control' const CONTROL_CSS = ` -[data-conversation-scroll] { scrollbar-gutter: auto !important; } -[data-conversation-scroll]:has([data-conversation-composer-overlay]) { overflow: hidden !important; } +[data-conversation-scroll]:has([data-conversation-composer-overlay]) > [data-composer-seat] { right: 0 !important; } ` /** The column scroller and the input card as the browser lays them out, in one tab. */ @@ -221,11 +221,13 @@ async function compareTabs(page: Page): Promise { } /** - * Run the unreserved cascade in the page for one measurement, then lift it. + * Run the uncompensated cascade in the page for one measurement, then lift it: + * the overlay seat's `right` compensation dropped to 0, so it measures the + * full padding box while Chat's seat still rides the reserved content box. * @param page - the page under test. - * @returns the comparison as the column lays out without the reservation. + * @returns the comparison as the column lays out without the compensation. */ -async function compareTabsWithoutReservation(page: Page): Promise { +async function compareTabsWithoutCompensation(page: Page): Promise { await page.evaluate(({ id, css }) => { const style = document.createElement('style') style.id = id @@ -268,7 +270,7 @@ async function openSeededSession(page: Page): Promise { * Render the golden body. * @param wide - comparison at the viewport where the card sits at its width cap. * @param narrow - comparison at the viewport where the card shrinks with the column. - * @param control - comparison at the wide viewport with the reservation removed. + * @param control - comparison at the wide viewport with the compensation removed. * @returns the golden body, without a trailing newline. */ function renderGeometry(wide: TabComparison, narrow: TabComparison, control: TabComparison): string { @@ -291,7 +293,7 @@ function renderGeometry(wide: TabComparison, narrow: TabComparison, control: Tab '', ...section(`Wide viewport (${String(WIDE_VIEWPORT.width)}px, card at its cap)`, wide), ...section(`Narrow viewport (${String(NARROW_VIEWPORT.width)}px, card shrinking with the column)`, narrow), - ...section('Wide viewport, reservation removed in the page (control)', control), + ...section('Wide viewport, seat compensation removed in the page (control)', control), ].join('\n').trimEnd() } @@ -322,22 +324,29 @@ describe('web e2e: input card position across view tabs', () => { await scaffold?.close() }) - it('reserves the same gutter in both tabs while the transcript scrolls', async () => { + it('reserves the gutter in Chat and lets Trajectory own its width', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-composer-tab-geometry-band')) await setMeasuredViewport(page, WIDE_VIEWPORT, false) - // Vacuity guard, in two parts. A transcript that does not overflow gives - // Chat no scrollbar, and a hidden or overlaid bar gives it no width; either - // would make the tabs agree without the reservation doing anything. + // Vacuity guard. The scenario must be able to fail: on an engine that + // does not implement `scrollbar-gutter`, Chat reserves nothing and the + // overlay seat's fixed compensation stands alone, manufacturing an 8px + // deviation the equal-rectangle assertions would catch. `stable` reserves + // even without overflow, so a short transcript is not a vacuous case; the + // poll still pins the measurement to the overflowing state the product + // ships. await expect.poll(async () => (await measureTab(page)).scrolls, { timeout: 10_000 }).toBe(true) const comparison = await compareTabs(page) expect(comparison.chat.band).toBeGreaterThan(0) - // The reservation reaches both states, which is the whole point: the same - // band, on a box that scrolls and on one that only holds a view. + // Chat keeps the unconditional reservation so its seat's content box never + // jumps as the transcript starts to scroll. expect(comparison.chat.gutter).toBe('stable') - expect(comparison.trajectory.gutter).toBe('stable') - expect(comparison.trajectory.band).toBe(comparison.chat.band) + // The overlay branch does NOT reserve: the view owns its own scrollers, so + // a reserved gutter would only narrow the view's content by the bar's + // width. The seat compensates instead, which the next test asserts. + expect(comparison.trajectory.gutter).toBe('auto') + expect(comparison.trajectory.band).toBe(0) // Declared as a scroll container on both axes rather than left to compute: - // `overflow: hidden` would drop the reservation in WebKit, and a `visible` + // `overflow: hidden` would drop any reservation in WebKit, and a `visible` // horizontal axis computes to `auto` beside a scrolling one. expect(comparison.trajectory.overflowY).toBe('auto') expect(comparison.trajectory.overflowX).toBe('hidden') @@ -351,7 +360,7 @@ describe('web e2e: input card position across view tabs', () => { await setMeasuredViewport(page, WIDE_VIEWPORT, false) const comparison = await compareTabs(page) // The reported symptom as a number. At this viewport the card sits at its - // width cap, so the unreserved cascade's shift shows up as a centring + // width cap, so the uncompensated cascade's shift shows up as a centring // difference — half the band on each edge — rather than as a width change. expect(comparison.leftShift).toBe(0) expect(comparison.rightShift).toBe(0) @@ -378,20 +387,21 @@ describe('web e2e: input card position across view tabs', () => { expect(tripwire.pageErrors).toEqual([]) }, 60_000) - it('moves the card again once the reservation is removed in the page', async () => { + it('moves the card again once the seat compensation is removed in the page', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-composer-tab-geometry-control')) await setMeasuredViewport(page, WIDE_VIEWPORT, false) // The control: without it, equal rectangles could also mean the tab switch - // never reached the layout. Under the unreserved cascade the Chat scroller - // keeps its bar and the Trajectory branch becomes a hidden box with none, - // and the card moves by half the band on each edge. - const comparison = await compareTabsWithoutReservation(page) - expect(comparison.chat.gutter).toBe('auto') + // never reached the layout. Under the uncompensated cascade the overlay seat + // loses its `right` compensation and measures the full padding box, so the + // card moves by half the band on each edge. Chat's own reservation is + // untouched — that is the side that must not change. + const comparison = await compareTabsWithoutCompensation(page) + expect(comparison.chat.gutter).toBe('stable') expect(comparison.chat.band).toBeGreaterThan(0) expect(comparison.trajectory.band).toBe(0) expect(comparison.leftShift).toBe(comparison.chat.band / 2) expect(comparison.rightShift).toBe(comparison.chat.band / 2) - // Restoring the sheet restores the reservation, so the control cannot leak + // Restoring the sheet restores the compensation, so the control cannot leak // into the remaining measurements. const restored = await compareTabs(page) expect(restored.leftShift).toBe(0) @@ -405,7 +415,7 @@ describe('web e2e: input card position across view tabs', () => { await setMeasuredViewport(page, NARROW_VIEWPORT, true) const narrow = await compareTabs(page) await setMeasuredViewport(page, WIDE_VIEWPORT, false) - const control = await compareTabsWithoutReservation(page) + const control = await compareTabsWithoutCompensation(page) await compareOrRefreshGolden(GEOMETRY_EXPECTED, renderGeometry(wide, narrow, control), MODE) expect(tripwire.pageErrors).toEqual([]) }, 60_000) diff --git a/apps/web/tests/cordis-tool-round.e2e.ts b/apps/web/tests/cordis-tool-round.e2e.ts index a702a7f1ea..7d1d6ab3b5 100644 --- a/apps/web/tests/cordis-tool-round.e2e.ts +++ b/apps/web/tests/cordis-tool-round.e2e.ts @@ -47,8 +47,7 @@ function assertCompleteCordisLifecycle(events: readonly SessionEvent[]): void { (event): event is Extract => event.type === 'turn/end', ) const reason = turnEnd?.data.reason - const reasonSummary = { kind: reason?.kind } - expect(reasonSummary).toEqual({ kind: 'completed' }) + expect(reason).toEqual({ kind: 'completed' }) const calls = events.filter( (event): event is Extract => event.type === 'tool/call', diff --git a/apps/web/tests/goal-bar.overlay.yml b/apps/web/tests/goal-bar.overlay.yml index 2594d6a3e9..4e9e382bb8 100644 --- a/apps/web/tests/goal-bar.overlay.yml +++ b/apps/web/tests/goal-bar.overlay.yml @@ -1,5 +1,5 @@ -# The client-side FixtureApiClient intentionally rejects settings writes, so -# this goal-only scenario omits the durable welcome step that would otherwise -# cover the page. Onboarding owns separate assembled-browser coverage. +# The client-side FixtureApiClient intentionally rejects settings traffic, so +# this goal-only scenario omits the settings shell and the onboarding steps it +# would mount. Onboarding owns separate assembled-browser coverage. - id: ui-settings-general disabled: true diff --git a/apps/web/tests/minimal-preset.snapshot.ts b/apps/web/tests/minimal-preset.snapshot.ts index 4a402077a3..011f71ea8d 100644 --- a/apps/web/tests/minimal-preset.snapshot.ts +++ b/apps/web/tests/minimal-preset.snapshot.ts @@ -55,6 +55,9 @@ describe('minimal agent preset', () => { const requestHeader = agentHandle.agent.session.requestHeader() if (requestHeader === undefined) throw new Error('the minimal agent issued no model request') + expect(agentHandle.agent.session.events.some(event => event.type === 'user/message' + && event.data.source.kind === 'plugin' + && event.data.source.plugin === '@deepseek-ai/dsh-system-prompt')).toBe(false) const presetFileSystem = scaffold.ctx.agentPresets.serviceFor(agentHandle.agent, 'fs') expect(presetFileSystem).toBeDefined() expect(presetFileSystem?.sandboxMode).toBeUndefined() diff --git a/apps/web/tests/onboarding-deepseek-config.e2e.ts b/apps/web/tests/onboarding-deepseek-config.e2e.ts index 5572e834ad..ad9bc0903f 100644 --- a/apps/web/tests/onboarding-deepseek-config.e2e.ts +++ b/apps/web/tests/onboarding-deepseek-config.e2e.ts @@ -1,6 +1,7 @@ // Keyless browser e2e: the shipped DeepSeek adapter stays mounted while its -// credential is absent, onboarding routes to the real Models editor, and its -// write lands in an isolated harness home without a reload or model call. +// credential is absent, both ordered steps share the shipped modal chrome, +// and the inline key write lands in an isolated harness home without a reload +// or model call. import { randomBytes } from 'node:crypto' import { readFile } from 'node:fs/promises' import { fileURLToPath } from 'node:url' @@ -8,14 +9,14 @@ import { join } from 'node:path' import type { Browser, Page } from 'playwright' import { chromium } from 'playwright' import { afterAll, beforeAll, describe, expect, it, onTestFailed } from 'vitest' +import { settingsNamespace } from '@deepseek-ai/dsh-settings' import { acknowledgeReloadConnectionLoss, assertFixtureInventory, captureStableAria, compareOrRefreshGolden, - WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_ACK_FIELD, - WELCOME_NOTICE_VERSION, WELCOME_NOTICE_COPY, launchWebScaffold, watchConsole, webSnapshotMode, type WebScaffold, + WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_COPY, WELCOME_NOTICE_SETTINGS_NAMESPACE, + WELCOME_NOTICE_VERSION, } from './scaffold.ts' import { ZH_BROWSER_LOCALE, connectFreshWorkspaceZh, saveFailureShot } from './support.ts' -import { settingsNamespace } from '@deepseek-ai/dsh-settings' const SNAPSHOT_DIR = fileURLToPath(new URL('./snapshots/onboarding-deepseek-config', import.meta.url)) const WELCOME_EXPECTED = join(SNAPSHOT_DIR, 'welcome.expected.md') @@ -48,43 +49,20 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('stores a key write-only and observes configured state without restarting', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-deepseek-config')) - const welcome = page.getByRole('region', { name: WELCOME_NOTICE_COPY.zh.title }) + const welcome = page.getByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }) await welcome.waitFor({ timeout: 15_000 }) expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(true) - const welcomeAria = await captureStableAria(page, '[role="region"]', scaffold.workspaceCwd) + for (const paragraph of WELCOME_NOTICE_COPY.zh.body.split('\n\n')) { + expect(await welcome.getByText(paragraph, { exact: true }).count()).toBe(1) + } + expect(await welcome.getByRole('button').allTextContents()).toEqual([ + WELCOME_NOTICE_COPY.zh.continueLabel, + ]) + const welcomeAria = await captureStableAria(page, '[role="dialog"]', scaffold.workspaceCwd) await compareOrRefreshGolden(WELCOME_EXPECTED, welcomeAria, MODE) - expect(await welcome.getByRole('button').allTextContents()).toEqual([WELCOME_NOTICE_COPY.zh.continueLabel]) - expect(await welcome.locator('button').count()).toBe(1) - const mask = page.locator('[class*="onboardingMask"]') - expect(await mask.count()).toBe(1) - const maskStyles = await mask.evaluate((mask) => { - const style = getComputedStyle(mask) - const rect = mask.getBoundingClientRect() - return { - position: style.position, - left: style.left, - right: style.right, - top: style.top, - bottom: style.bottom, - background: style.backgroundColor, - backdropFilter: style.backdropFilter, - rect: { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom }, - } - }) - expect(maskStyles).toEqual({ - position: 'absolute', - left: '0px', - right: '0px', - top: '80px', - bottom: '0px', - background: 'rgba(0, 0, 0, 0.24)', - backdropFilter: 'blur(2px)', - rect: { left: 0, top: 80, right: 1440, bottom: 960 }, - }) - - // Closing the process/page before acknowledgement writes nothing, so the - // same durable profile presents the notice again after reload. + // Observation is not acknowledgement: the exact version is persisted + // only by the explicit action, so a reload still presents this dialog. const firstReloadWarnings = tripwire.warnings.length await page.reload({ waitUntil: 'load' }) acknowledgeReloadConnectionLoss(tripwire, firstReloadWarnings) @@ -92,24 +70,19 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click() await welcome.waitFor({ state: 'detached', timeout: 15_000 }) - const credentialStep = page.getByRole('region', { name: '添加一个 API Key 开始使用' }) - await credentialStep.waitFor({ timeout: 15_000 }) - expect(await credentialStep.getByRole('textbox').count()).toBe(0) - const initial = await captureStableAria(page, '[role="region"]', scaffold.workspaceCwd) - await compareOrRefreshGolden(MISSING_EXPECTED, initial, MODE) - await credentialStep.getByRole('button', { name: 'å‰�å¾€é…�ç½®' }).click() - await credentialStep.waitFor({ state: 'detached', timeout: 15_000 }) - const settings = page.getByRole('dialog', { name: '设置' }) - await settings.waitFor({ timeout: 10_000 }) - expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(false) - const keyInput = settings.getByLabel('API 密钥', { exact: true }) + const credentialStep = page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }) + await credentialStep.waitFor({ timeout: 15_000 }) + const keyInput = credentialStep.getByLabel('API 密钥', { exact: true }) await keyInput.waitFor({ timeout: 10_000 }) + const initial = await captureStableAria(page, '[role="dialog"]', scaffold.workspaceCwd) + await compareOrRefreshGolden(MISSING_EXPECTED, initial, MODE) const secret = `dsh_onboarding_${randomBytes(12).toString('hex')}` await keyInput.fill(secret) - await settings.getByRole('button', { name: 'ä¿�å­˜', exact: true }).click() - await keyInput.waitFor({ state: 'detached', timeout: 15_000 }) + await credentialStep.getByRole('button', { name: 'ä¿�存并继续' }).click() + await credentialStep.waitFor({ state: 'detached', timeout: 15_000 }) + expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(false) const stored = await readFile(join(scaffold.harnessHome, '.credentials.yaml'), 'utf8') expect(stored.includes(`DEEPSEEK_API_KEY: ${secret}`)).toBe(true) @@ -117,8 +90,15 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup expect((await page.locator('body').ariaSnapshot()).includes(secret)).toBe(false) expect(browserConsole.some(line => line.includes(secret))).toBe(false) - // The same open Models surface reuses the refreshed join and exposes the + const acknowledgedSettings = await readFile(join(scaffold.harnessHome, 'settings.yaml'), 'utf8') + expect(acknowledgedSettings).toContain(`${WELCOME_NOTICE_ACK_FIELD}: ${WELCOME_NOTICE_VERSION}`) + + // The ordinary Models surface reuses the refreshed join and exposes the // configured write-only placeholder without a reload. + await page.getByRole('button', { name: '设置', exact: true }).click() + const settings = page.getByRole('dialog', { name: '设置' }) + await settings.waitFor({ timeout: 10_000 }) + await settings.getByRole('button', { name: '模型' }).click() const deepSeekRow = settings.getByText('DeepSeek', { exact: true }).first() await deepSeekRow.waitFor({ timeout: 10_000 }) await deepSeekRow.locator('xpath=ancestor::li').getByRole('button', { name: '编辑' }).click() @@ -129,18 +109,15 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup { timeout: 10_000 }, ).toBe('å·²é…�置——输入新值å�¯æ›¿æ�¢') - const acknowledgedSettings = await readFile(join(scaffold.harnessHome, 'settings.yaml'), 'utf8') - expect(acknowledgedSettings).toContain(`${WELCOME_NOTICE_ACK_FIELD}: ${WELCOME_NOTICE_VERSION}`) - const secondReloadWarnings = tripwire.warnings.length await page.reload({ waitUntil: 'load' }) acknowledgeReloadConnectionLoss(tripwire, secondReloadWarnings) await page.waitForSelector('[class*="frame"]', { timeout: 15_000 }) - expect(await page.getByRole('region', { name: WELCOME_NOTICE_COPY.zh.title }).count()).toBe(0) - expect(await page.getByRole('region', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) + expect(await page.getByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }).count()).toBe(0) + expect(await page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) - // A different stored copy version represents an intentional version bump: - // the welcome step returns even though the credential is already ready. + // An old acknowledgement means materially revised copy: welcome returns, + // while the already-configured provider step remains complete. await scaffold.ctx.settings.mutate(settingsNamespace(WELCOME_NOTICE_SETTINGS_NAMESPACE), [{ op: 'set', path: [WELCOME_NOTICE_ACK_FIELD], value: 'previous-copy-version', }]) @@ -150,7 +127,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup await welcome.waitFor({ timeout: 15_000 }) await welcome.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }).click() await welcome.waitFor({ state: 'detached', timeout: 15_000 }) - expect(await page.getByRole('region', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) + expect(await page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) expect((await page.content()).includes(secret)).toBe(false) expect((await page.locator('body').ariaSnapshot()).includes(secret)).toBe(false) @@ -161,10 +138,9 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('never paints the takeover chrome on a configured reload, even with the settings join held open', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-configured-reload')) - // Regression pin for the reload white flash: both steps are satisfied - // (welcome acknowledged, credential configured), yet each must LOAD its - // private join before it can decide not to show. The chrome lives inside - // the step (OnboardingSurface), so the deciding window paints and blocks + // Regression pin for the reload flash: both steps are satisfied, yet each + // must load private facts before deciding not to show. Dialog chrome lives + // inside each visible branch, so the deciding window paints and blocks // nothing. Holding settings.describe widens that window from loopback // RTT scale to a deterministic hundreds of milliseconds, removing all // timing dependence from the sampler assertions below. @@ -177,7 +153,10 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup const sightings: string[] = [] ;(window as unknown as { __takeoverSightings: string[] }).__takeoverSightings = sightings setInterval(() => { - if (document.querySelector('[class*="onboardingStage"], [class*="onboardingMask"]') !== null) { + if (document.querySelector( + '[role="dialog"][aria-label="内测声明"], ' + + '[role="dialog"][aria-label="添加一个 API Key 开始使用"]', + ) !== null) { sightings.push('chrome') } if (document.getElementById('root')?.inert === true) sightings.push('inert') @@ -207,14 +186,15 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup acknowledgeReloadConnectionLoss(tripwire, warningsBefore) expect(await page.evaluate(() => (window as unknown as { __takeoverSightings: string[] }).__takeoverSightings)).toEqual([]) - expect(await page.locator('[class*="onboardingStage"]').count()).toBe(0) + expect(await page.getByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }).count()).toBe(0) + expect(await page.getByRole('dialog', { name: '添加一个 API Key 开始使用' }).count()).toBe(0) expect(tripwire.pageErrors).toEqual([]) }, 60_000) it('configures arbitrary DeepSeek models and prompts after the selected model is removed', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-deepseek-models')) // Opened here rather than inherited: the credential test reloads the page - // to exercise the welcome step, so nothing carries an open dialog across. + // after configuring the key, so nothing carries an open dialog across. await page.getByRole('button', { name: '设置', exact: true }).click() const settings = page.getByRole('dialog', { name: '设置' }) await settings.waitFor({ timeout: 10_000 }) @@ -264,7 +244,7 @@ describe.skipIf(MODE === 'record')('web e2e: first-run DeepSeek credential setup it('keeps the fixture inventory closed', async () => { await assertFixtureInventory( SNAPSHOT_DIR, - ['missing.expected.md', 'models.expected.md', 'welcome.expected.md'], + ['welcome.expected.md', 'missing.expected.md', 'models.expected.md'], ) }) }) diff --git a/apps/web/tests/onboarding-usable-provider.e2e.ts b/apps/web/tests/onboarding-usable-provider.e2e.ts index 09e3923064..5638668705 100644 --- a/apps/web/tests/onboarding-usable-provider.e2e.ts +++ b/apps/web/tests/onboarding-usable-provider.e2e.ts @@ -44,14 +44,17 @@ describe.skipIf(MODE === 'record')('web e2e: another usable provider ends first- it('closes the setup card without discarding the add card beside it', async () => { onTestFailed(() => saveFailureShot(page, 'web-e2e-onboarding-setup-card-cancel')) - const credentialStep = page.getByRole('region', { name: CREDENTIAL_STEP }) + const credentialStep = page.getByRole('dialog', { name: CREDENTIAL_STEP }) await credentialStep.waitFor({ timeout: 15_000 }) - await credentialStep.getByRole('button', { name: 'å‰�å¾€é…�ç½®' }).click() + await credentialStep.getByRole('button', { name: 'ç¨�å�Žé…�ç½®' }).click() await credentialStep.waitFor({ state: 'detached', timeout: 15_000 }) + await page.getByRole('button', { name: '设置', exact: true }).click() const settings = page.getByRole('dialog', { name: '设置' }) await settings.waitFor({ timeout: 10_000 }) - // Nothing is reachable yet, so DeepSeek presents itself as its open card. + // The onboarding step no longer navigates into Settings on dismissal, so + // enter the Models section explicitly before exercising its normal cards. + await settings.getByRole('button', { name: '模型' }).click() const setupKey = settings.getByRole('textbox', { name: 'API 密钥', exact: true }) await setupKey.waitFor({ timeout: 10_000 }) @@ -66,15 +69,14 @@ describe.skipIf(MODE === 'record')('web e2e: another usable provider ends first- { timeout: 10_000 }, ).toBe(2) - // Cancelling the setup card is the regression: it used to leave itself open - // and close the add card, discarding that draft. + // Cancelling the setup card must not close the independent add-provider + // draft beside it. await settings.getByRole('button', { name: 'å�–消', exact: true }).first().click() expect(await settings.getByLabel('æ��供方').count()).toBe(1) await expect.poll( async () => settings.getByRole('textbox', { name: 'API 密钥', exact: true }).count(), { timeout: 10_000 }, ).toBe(1) - // DeepSeek is now an ordinary row: a missing-key dot and an Edit button. await settings.getByRole('button', { name: '编辑 DeepSeek (deepseek-official)' }).waitFor({ timeout: 10_000 }) const dismissed = await captureStableAria(page, '[role="dialog"]', scaffold.workspaceCwd) await compareOrRefreshGolden(DISMISSED_EXPECTED, dismissed, MODE) @@ -104,10 +106,9 @@ describe.skipIf(MODE === 'record')('web e2e: another usable provider ends first- // The regression: the step read only the official route's credential, so a // fully configured user was taken over on every blank session. await expect.poll( - async () => page.getByRole('region', { name: CREDENTIAL_STEP }).count(), + async () => page.getByRole('dialog', { name: CREDENTIAL_STEP }).count(), { timeout: 10_000 }, ).toBe(0) - expect(await page.locator('[class*="onboardingStage"]').count()).toBe(0) expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(false) // The Models page agrees: DeepSeek stays a row rather than reopening its diff --git a/apps/web/tests/pwsh-terminal.overlay.yml b/apps/web/tests/pwsh-terminal.overlay.yml index 43afe77e51..23b917c080 100644 --- a/apps/web/tests/pwsh-terminal.overlay.yml +++ b/apps/web/tests/pwsh-terminal.overlay.yml @@ -1,20 +1,30 @@ # The pwsh terminal-card lane swaps the shipped bash stack for the PowerShell -# twin: the bash executor row is disabled (patches cannot rename a row — `name` -# is a guard) and the pwsh executor + tool are inserted. The permission service -# refuses an unconfined executor by design (presets bundle a sandbox mode), so -# its row is disabled too — this lane renders a seeded session, never a -# permission decision. The seeded scenario renders the logged pwsh call/result -# through the real tools on replay; no command executes, but the composition -# must boot the pwsh executor, so the lane skips on hosts without a usable -# `pwsh`. +# twin: the bash executor row is disabled, the pwsh executor is inserted, and +# the host tool-pwsh row is enabled by id. The pwsh-sandbox row is disabled +# too so the inserted pwsh-local is the lone executor on every platform. The +# permission service refuses an unconfined executor by design (presets bundle +# a sandbox mode), so its row is disabled as well — this lane renders a seeded +# session, never a permission decision. The seeded scenario renders the logged +# pwsh call/result through the real tools on replay; no command executes, but +# the composition must boot the pwsh executor, so the lane skips on hosts +# without a usable `pwsh`. - id: bash-sandbox name: '@deepseek-ai/dsh-bash-sandbox' disabled: true +- id: pwsh-sandbox + name: '@deepseek-ai/dsh-pwsh-sandbox' + disabled: true - id: permission name: '@deepseek-ai/dsh-permission-presets' disabled: true - insert: - id: pwsh-local name: '@deepseek-ai/dsh-pwsh-local' - - id: tool-pwsh - name: '@deepseek-ai/dsh-tool-pwsh' + +# tool-pwsh already exists in the shipped composition: the base bundle declares +# it platform-gated on every platform, and the web-app overlay disables it for +# surfaces that use presets. So this lane enables it by id rather than +# inserting a second row to the same id. +- id: tool-pwsh + name: '@deepseek-ai/dsh-tool-pwsh' + disabled: false diff --git a/apps/web/tests/remote-welcome.e2e.ts b/apps/web/tests/remote-welcome.e2e.ts index 7187936ae9..256afaeede 100644 --- a/apps/web/tests/remote-welcome.e2e.ts +++ b/apps/web/tests/remote-welcome.e2e.ts @@ -1,5 +1,5 @@ -// Trusted non-loopback Web access must not wedge on the loopback-only -// settings API while the mandatory product notice owns the viewport. +// Trusted non-loopback Web access cannot call the loopback-only settings API; +// the notice therefore advances for this browser process and returns on reload. import type { Browser, Page } from 'playwright' import { chromium } from 'playwright' import { afterAll, beforeAll, describe, expect, it } from 'vitest' @@ -19,9 +19,15 @@ describe.skipIf(MODE === 'record')('web e2e: remote welcome notice', () => { let tripwire: ReturnType beforeAll(async () => { - scaffold = await launchWebScaffold({ remoteAuthority: 'remote.localhost', welcomeNoticePending: true }) + scaffold = await launchWebScaffold({ + remoteAuthority: 'remote.localhost', + welcomeNoticePending: true, + }) browser = await chromium.launch() - page = await browser.newPage({ viewport: { width: 1440, height: 960 }, locale: ZH_BROWSER_LOCALE }) + page = await browser.newPage({ + viewport: { width: 1440, height: 960 }, + locale: ZH_BROWSER_LOCALE, + }) tripwire = watchConsole(page) await page.goto(scaffold.baseUrl, { waitUntil: 'load' }) await page.waitForSelector('#root', { timeout: 30_000 }) @@ -33,7 +39,7 @@ describe.skipIf(MODE === 'record')('web e2e: remote welcome notice', () => { }) it('advances process-locally and presents the notice again after reload', async () => { - const welcome = page.getByRole('region', { name: WELCOME_NOTICE_COPY.zh.title }) + const welcome = page.getByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }) await welcome.waitFor({ timeout: 15_000 }) expect(await page.locator('#root').evaluate(root => (root as HTMLElement).inert)).toBe(true) @@ -43,6 +49,7 @@ describe.skipIf(MODE === 'record')('web e2e: remote welcome notice', () => { () => page.locator('#root').evaluate(root => (root as HTMLElement).inert), { timeout: 15_000 }, ).toBe(false) + const reloadWarnings = tripwire.warnings.length await page.reload({ waitUntil: 'load' }) acknowledgeReloadConnectionLoss(tripwire, reloadWarnings) diff --git a/apps/web/tests/scaffold.ts b/apps/web/tests/scaffold.ts index 1c3fb67e85..f1ba62d881 100644 --- a/apps/web/tests/scaffold.ts +++ b/apps/web/tests/scaffold.ts @@ -23,7 +23,7 @@ // (the plugin-row path discards the ReplayHandle; the direct install keeps // assertConsumed for the teardown fixture-consumption check). import { existsSync } from 'node:fs' -import { mkdir, mkdtemp, readFile, readdir, realpath, rm, utimes, writeFile } from 'node:fs/promises' +import { mkdir, mkdtemp, readFile, readdir, realpath, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { pathToFileURL } from 'node:url' @@ -41,19 +41,6 @@ import { loadOverlayPatches, } from '@deepseek-ai/dsh-app-boot' import { dshHomePath } from '@deepseek-ai/dsh-home-paths' -// Client packages must not be imported here: these e2e type-check in the Host -// aggregate, so a Client import pulls that package's whole project — and every -// project it references — into the Host build graph. Mirrored from -// packages/client/ui-settings-general/src/onboarding-copy.ts; a drift makes the -// pre-acknowledgement stop suppressing the notice, which fails loudly. -// import { -// WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, WELCOME_NOTICE_COPY, -// } from '@deepseek-ai/dsh-client-ui-settings-general' -export const WELCOME_NOTICE_SETTINGS_NAMESPACE = 'ui-onboarding' -export const WELCOME_NOTICE_ACK_FIELD = 'welcomeNoticeVersion' -export const WELCOME_NOTICE_VERSION = '2026-08-11.1' -export const WELCOME_NOTICE_COPY = { zh: { title: '内测声明', continueLabel: 'ç»§ç»­' } } as const - import { settingsNamespace } from '@deepseek-ai/dsh-settings' import { LlmAdapter } from '@deepseek-ai/dsh-llm' import type { @@ -76,6 +63,25 @@ import type {} from '@deepseek-ai/dsh-agent' import { provideCmdline } from '@deepseek-ai/dsh-cmdline' import { REPO_ROOT, requireDist } from './support.ts' +// Host-side web e2e cannot import a browser package: doing so would pull that +// package's complete TS project into this graph. Mirrored from +// packages/client/ui-settings-models/src/onboarding-copy.ts; drift makes the +// default pre-acknowledgement stop suppressing the notice and fails loudly. +// import { +// WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, +// WELCOME_NOTICE_VERSION, WELCOME_NOTICE_COPY, +// } from '@deepseek-ai/dsh-client-ui-settings-models' +export const WELCOME_NOTICE_SETTINGS_NAMESPACE = 'ui-onboarding' +export const WELCOME_NOTICE_ACK_FIELD = 'welcomeNoticeVersion' +export const WELCOME_NOTICE_VERSION = '2026-08-13.1' +export const WELCOME_NOTICE_COPY = { + zh: { + title: '内测声明', + body: 'DeepSeek Harness ç›®å‰�çš„ 0.1 版本ä»�处在é�¢å�‘ Harness å¼€å�‘者进行测试的阶段,还有许多地方需è¦�æŒ�续改进和打磨,希望å�¬å�–广大开å�‘者的å��馈建议。预计 DeepSeek Harness 的核心æ�’件以å�ŠåŸºç¡€ API 都会在接下æ�¥çš„一段时间内快速迭代ã€�æŒ�续演化。\n\n我们期待与全ç�ƒå¼€å�‘者一起,在开æº�ã€�开放ã€�å�¯å¤�用ã€�å�¯ç»„å�ˆçš„基础设施之上,共å�ŒæŽ¢ç´¢æ™ºèƒ½ä¸Šé™�。欢迎全ç�ƒ Harness å¼€å�‘者加入 DSH æ�’件生æ€�。', + continueLabel: 'ç»§ç»­', + }, +} as const + /** Snapshot mode for the lane, from $DSH_SNAPSHOT (same vocabulary as the other snapshot suites). */ export type WebSnapshotMode = 'replay' | 'record' | 'refresh' @@ -227,6 +233,8 @@ export interface LaunchOptions { * keyless first-run configuration lane; the default disables the adapter. */ deepSeekMissingCredential?: boolean + /** Leave the current welcome notice pending; ordinary scenarios pre-acknowledge it before browser boot. */ + welcomeNoticePending?: boolean /** * Patch the shipped DeepSeek search row to a deterministic endpoint and * credential reference. Browser search scenarios keep the real provider and @@ -252,8 +260,6 @@ export interface LaunchOptions { /** The preset a session that names none is composed from. */ default: string } - /** Leave the current welcome notice unacknowledged; ordinary scenarios publish it as complete before browser boot. */ - welcomeNoticePending?: boolean /** * Mount the shipped telemetry row in FULL mode against this exporter URL * instead of disabling it. Used to pin a real backend disclosure in @@ -391,6 +397,10 @@ export async function launchWebScaffold(options: LaunchOptions = {}): Promise { + const meta: SessionHeader = { + version: SESSION_FORMAT_VERSION, + id: SessionId(id), + createdAt: Date.now() - 60_000, + cwd, + delegationDepth: 0, + } + await persistSeedSession(scaffold, meta, [{ + type: 'session/end-seed', + seq: 0, + time: meta.createdAt, + data: {}, + }]) + return meta.id +} + +/** Materialize one detached Session fixture through the shipped JSONL provider. */ +async function persistSeedSession( + scaffold: WebScaffold, + meta: SessionHeader, + events: readonly SessionEvent[], +): Promise { const seeder = new Context() try { await seeder.plugin(SessionStore) @@ -728,16 +770,9 @@ export async function seedSession( await seeder.plugin(JsonlSessionPersistence, { root: scaffold.persistenceRoot }) await seeder.sessionPersistence.create(meta) await seeder.sessionPersistence.append(meta.id, events) - // Deterministic sidebar order: cold summaries take updatedAt from mtime. - const located = seeder.sessionPersistence.locate(meta) - if (located !== undefined) { - const backdated = new Date(meta.createdAt) - await utimes(located.path, backdated, backdated) - } } finally { await seeder.fiber.dispose() } - return meta.id } /** diff --git a/apps/web/tests/smoke-real.e2e.ts b/apps/web/tests/smoke-real.e2e.ts index 2784b66d07..5d479e9552 100644 --- a/apps/web/tests/smoke-real.e2e.ts +++ b/apps/web/tests/smoke-real.e2e.ts @@ -533,16 +533,9 @@ describe.skipIf(!process.env.DEEPSEEK_API_KEY || notReady.length > 0)('web smoke it('empty-state first send completes a real model round', async () => { onTestFailed(() => saveFailureShot(page, 'w5-first-round')) - // This scenario spawns its own server against a fresh $DSH_HOME, so the - // first-run welcome notice is unacknowledged and its overlay owns pointer - // events (the shared scaffold acknowledges it before boot instead). The - // notice is anchored structurally, not by its copy: this spec sits in the - // client TypeScript program, which does not reference the package that - // owns the strings. - const welcome = page.locator('[class*="onboardingOverlay"]') - await welcome.waitFor({ timeout: 15_000 }) - await welcome.getByRole('button').click() - await welcome.waitFor({ state: 'detached', timeout: 15_000 }) + // This scenario spawns its own server against a fresh $DSH_HOME with the + // DeepSeek credential inherited from the environment, so no onboarding + // step mounts and the page is immediately interactive. // Fresh world: connect a Workspace so the composer starts live. await connectFreshWorkspace(page, sessionsDir) const input = page.locator('textarea').first() diff --git a/apps/web/tests/snapshots/agent-preset-selection/menu.expected.md b/apps/web/tests/snapshots/agent-preset-selection/menu.expected.md index 7e0d1ae032..9e3116d353 100644 --- a/apps/web/tests/snapshots/agent-preset-selection/menu.expected.md +++ b/apps/web/tests/snapshots/agent-preset-selection/menu.expected.md @@ -2,6 +2,6 @@ - menuitem "Standard mode Full coding agent with file editing, shell, file and web search, skills, planning, goals, subagents, and workflows.": - text: Standard mode Full coding agent with file editing, shell, file and web search, skills, planning, goals, subagents, and workflows. - img - - menuitem "Code mode All Standard mode capabilities, with tools exposed through the Code Mode SDK so the model can combine multi-step operations in one TypeScript program." + - menuitem "PTC mode All Standard mode capabilities, with tools exposed through the Code Mode SDK so the model can combine multi-step operations in one TypeScript program." - menuitem "Minimal mode Two-tool coding agent with persistent bash and str_replace_editor." - menuitem "Creator mode Built for creating custom agent presets, with all Standard mode capabilities plus runtime inspection, plugin experiments, and preset-authoring guidance." diff --git a/apps/web/tests/snapshots/cold-blank-session/sidebar.expected.md b/apps/web/tests/snapshots/cold-blank-session/sidebar.expected.md new file mode 100644 index 0000000000..d4d370892e --- /dev/null +++ b/apps/web/tests/snapshots/cold-blank-session/sidebar.expected.md @@ -0,0 +1 @@ +- tree "Sessions": No sessions yet diff --git a/apps/web/tests/snapshots/composer-tab-geometry/geometry.expected.md b/apps/web/tests/snapshots/composer-tab-geometry/geometry.expected.md index 9735019508..e95adaaa6f 100644 --- a/apps/web/tests/snapshots/composer-tab-geometry/geometry.expected.md +++ b/apps/web/tests/snapshots/composer-tab-geometry/geometry.expected.md @@ -5,9 +5,9 @@ - Chat: scrollbar-gutter stable, overflow hidden/auto - Chat scroller scrolls: true - Chat reserved band: 8px -- Trajectory: scrollbar-gutter stable, overflow hidden/auto +- Trajectory: scrollbar-gutter auto, overflow hidden/auto - Trajectory scroller scrolls: false -- Trajectory reserved band: 8px +- Trajectory reserved band: 0px - input card left edge moves between tabs: 0px - input card right edge moves between tabs: 0px - input card width changes between tabs: 0px @@ -17,19 +17,19 @@ - Chat: scrollbar-gutter stable, overflow hidden/auto - Chat scroller scrolls: true - Chat reserved band: 8px -- Trajectory: scrollbar-gutter stable, overflow hidden/auto +- Trajectory: scrollbar-gutter auto, overflow hidden/auto - Trajectory scroller scrolls: false -- Trajectory reserved band: 8px +- Trajectory reserved band: 0px - input card left edge moves between tabs: 0px - input card right edge moves between tabs: 0px - input card width changes between tabs: 0px -## Wide viewport, reservation removed in the page (control) +## Wide viewport, seat compensation removed in the page (control) -- Chat: scrollbar-gutter auto, overflow hidden/auto +- Chat: scrollbar-gutter stable, overflow hidden/auto - Chat scroller scrolls: true - Chat reserved band: 8px -- Trajectory: scrollbar-gutter auto, overflow hidden/hidden +- Trajectory: scrollbar-gutter auto, overflow hidden/auto - Trajectory scroller scrolls: false - Trajectory reserved band: 0px - input card left edge moves between tabs: 4px diff --git a/apps/web/tests/snapshots/message-actions/fork.expected.md b/apps/web/tests/snapshots/message-actions/fork.expected.md index 2487b6c374..f7f9efb3ab 100644 --- a/apps/web/tests/snapshots/message-actions/fork.expected.md +++ b/apps/web/tests/snapshots/message-actions/fork.expected.md @@ -2,6 +2,6 @@ - treeitem "Ungrouped" [expanded]: - img - text: Ungrouped - - treeitem "Use the read tool twice 1min" - - treeitem "Use the read tool twice (1) now" - treeitem "Use the read tool twice (2) now" [selected] + - treeitem "Use the read tool twice (1) now" + - treeitem "Use the read tool twice 1min" diff --git a/apps/web/tests/snapshots/models-settings/empty.expected.md b/apps/web/tests/snapshots/models-settings/empty.expected.md index cea14113ac..2c928e2f0d 100644 --- a/apps/web/tests/snapshots/models-settings/empty.expected.md +++ b/apps/web/tests/snapshots/models-settings/empty.expected.md @@ -44,7 +44,6 @@ - option "moonshotai-cn" - option "nvidia" - option "openai" - - option "openai-codex" - option "opencode" - option "opencode-go" - option "openrouter" diff --git a/apps/web/tests/snapshots/onboarding-deepseek-config/missing.expected.md b/apps/web/tests/snapshots/onboarding-deepseek-config/missing.expected.md index ed37b0fe4d..d42cf40681 100644 --- a/apps/web/tests/snapshots/onboarding-deepseek-config/missing.expected.md +++ b/apps/web/tests/snapshots/onboarding-deepseek-config/missing.expected.md @@ -1,5 +1,8 @@ -- region "添加一个 API Key 开始使用": +- dialog "添加一个 API Key 开始使用": - heading "添加一个 API Key 开始使用" [level=2] - paragraph: é…�ç½® DeepSeek 官方模型,å�³å�¯å¼€å§‹ä½¿ç”¨ã€‚ + - text: API 密钥 + - textbox "API 密钥": + - /placeholder: 输入 API 密钥 - button "ç¨�å�Žé…�ç½®" - - button "å‰�å¾€é…�ç½®" + - button "ä¿�存并继续" [disabled] diff --git a/apps/web/tests/snapshots/onboarding-deepseek-config/welcome.expected.md b/apps/web/tests/snapshots/onboarding-deepseek-config/welcome.expected.md index 8332305eed..de65e02fc7 100644 --- a/apps/web/tests/snapshots/onboarding-deepseek-config/welcome.expected.md +++ b/apps/web/tests/snapshots/onboarding-deepseek-config/welcome.expected.md @@ -1,9 +1,5 @@ -- region "内测声明": +- dialog "内测声明": - heading "内测声明" [level=2] - - paragraph: 感谢您愿æ„�拨冗试用 DeepSeek Harness。当å‰�版本ä»�处于内部测试阶段,功能ä»�待完善,体验难å…�有些粗糙。 - - blockquote: “如切如磋,如ç�¢å¦‚磨。â€� 产å“�çš„æˆ�长,离ä¸�开一次次真实的碰撞与å�¦è¯šçš„å��馈。您在真实使用中å�‘现的问题,也å�¯èƒ½ä¿ƒä½¿æˆ‘们é‡�新审视,甚至推翻已有的设计。 - - paragraph: - - text: 内测版本默认ä¸�会上传 Session Log。如需在æ��交å��馈时共享会è¯�日志,å�¯ä»¥è®¾ç½®çŽ¯å¢ƒå�˜é‡� DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需æŒ�续上传,å�¯ä»¥è®¾ç½® DSH_TELEMETRY_MODE=FULL,但该模å¼�å�Œæ—¶ä¼šå�¯ç”¨ dsh-sdk 命令é�¥æµ‹ï¼Œä¸ŠæŠ¥åŒ¿å�� IDã€�命令结果以å�Šè„±æ•�å�Žçš„项目é…�置。å�¦å¤–, - - strong: 如果您有任何å��馈与建议,请在ä¼�业微信群中留言告诉我们 - - text: 。æ¯�一æ�¡å��馈,都会帮助我们把它打磨得更好。 + - paragraph: DeepSeek Harness ç›®å‰�çš„ 0.1 版本ä»�处在é�¢å�‘ Harness å¼€å�‘者进行测试的阶段,还有许多地方需è¦�æŒ�续改进和打磨,希望å�¬å�–广大开å�‘者的å��馈建议。预计 DeepSeek Harness 的核心æ�’件以å�ŠåŸºç¡€ API 都会在接下æ�¥çš„一段时间内快速迭代ã€�æŒ�续演化。 + - paragraph: 我们期待与全ç�ƒå¼€å�‘者一起,在开æº�ã€�开放ã€�å�¯å¤�用ã€�å�¯ç»„å�ˆçš„基础设施之上,共å�ŒæŽ¢ç´¢æ™ºèƒ½ä¸Šé™�。欢迎全ç�ƒ Harness å¼€å�‘者加入 DSH æ�’件生æ€�。 - button "ç»§ç»­" diff --git a/apps/web/tests/snapshots/onboarding-usable-provider/dismissed.expected.md b/apps/web/tests/snapshots/onboarding-usable-provider/dismissed.expected.md index 84c7358b54..809e7880ff 100644 --- a/apps/web/tests/snapshots/onboarding-usable-provider/dismissed.expected.md +++ b/apps/web/tests/snapshots/onboarding-usable-provider/dismissed.expected.md @@ -48,7 +48,6 @@ - option "moonshotai-cn" - option "nvidia" - option "openai" - - option "openai-codex" - option "opencode" - option "opencode-go" - option "openrouter" diff --git a/apps/web/tests/snapshots/question-composer/composed.expected.md b/apps/web/tests/snapshots/question-composer/composed.expected.md index c18e6225c6..66f3706af5 100644 --- a/apps/web/tests/snapshots/question-composer/composed.expected.md +++ b/apps/web/tests/snapshots/question-composer/composed.expected.md @@ -1,6 +1,8 @@ - region "Which color do you prefer?": - text: Pick one - heading "Which color do you prefer?" [level=2] + - button "Collapse the question card" [expanded]: + - img - button "Dismiss all questions": - img - group: diff --git a/apps/web/tests/snapshots/question-composer/ui.expected.md b/apps/web/tests/snapshots/question-composer/ui.expected.md index c2ee767319..1c7109702d 100644 --- a/apps/web/tests/snapshots/question-composer/ui.expected.md +++ b/apps/web/tests/snapshots/question-composer/ui.expected.md @@ -1,6 +1,8 @@ - region "Which color do you prefer?": - text: Pick one - heading "Which color do you prefer?" [level=2] + - button "Collapse the question card" [expanded]: + - img - button "Dismiss all questions": - img - group: diff --git a/apps/web/tests/snapshots/sidebar-subagent-activity/owner-running.expected.md b/apps/web/tests/snapshots/sidebar-subagent-activity/owner-running.expected.md index 62671cbb8b..7e1864ff58 100644 --- a/apps/web/tests/snapshots/sidebar-subagent-activity/owner-running.expected.md +++ b/apps/web/tests/snapshots/sidebar-subagent-activity/owner-running.expected.md @@ -2,5 +2,5 @@ - treeitem "workspace" [expanded]: - img - text: workspace - - treeitem "New Session" [selected] - treeitem "1 subagent running Delegate a background job. now" + - treeitem "New Session" [selected] diff --git a/apps/web/tests/snapshots/steering/mid-steer.expected.md b/apps/web/tests/snapshots/steering/mid-steer.expected.md index e3b82f0964..9a713be0e5 100644 --- a/apps/web/tests/snapshots/steering/mid-steer.expected.md +++ b/apps/web/tests/snapshots/steering/mid-steer.expected.md @@ -32,6 +32,8 @@ - region "Ready to continue?": - text: Checkpoint - heading "Ready to continue?" [level=2] + - button "Collapse the question card" [expanded]: + - img - button "Dismiss all questions": - img - radiogroup: diff --git a/apps/web/tests/snapshots/subagent-conversation/fork.expected.md b/apps/web/tests/snapshots/subagent-conversation/fork.expected.md index 398c3ceddd..c60eb2d064 100644 --- a/apps/web/tests/snapshots/subagent-conversation/fork.expected.md +++ b/apps/web/tests/snapshots/subagent-conversation/fork.expected.md @@ -2,5 +2,5 @@ - treeitem "workspace" [expanded]: - img - text: workspace - - treeitem "Ask a research subagent to now" - treeitem "Explain event sourcing in one (1) now" [selected] + - treeitem "Ask a research subagent to now" diff --git a/apps/web/tests/snapshots/trajectory-virtualization/load-more.expected.md b/apps/web/tests/snapshots/trajectory-virtualization/load-more.expected.md new file mode 100644 index 0000000000..c3c1302000 --- /dev/null +++ b/apps/web/tests/snapshots/trajectory-virtualization/load-more.expected.md @@ -0,0 +1,4 @@ +- row "Load earlier history": + - cell "Load earlier history": + - button "Load earlier history": + - status diff --git a/apps/web/tests/trajectory-virtualization.e2e.ts b/apps/web/tests/trajectory-virtualization.e2e.ts index 64f149646b..16880295fd 100644 --- a/apps/web/tests/trajectory-virtualization.e2e.ts +++ b/apps/web/tests/trajectory-virtualization.e2e.ts @@ -3,6 +3,7 @@ // DOM mounting stays bounded, and every scroll range remains reachable. import { mkdtemp, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' +import { fileURLToPath } from 'node:url' import { join } from 'node:path' import type { Browser, Page } from 'playwright' import { chromium } from 'playwright' @@ -11,6 +12,8 @@ import type { StreamChunk } from '@deepseek-ai/dsh-llm' import type { ReplayEntry } from '@deepseek-ai/dsh-llm-replay' import { createChatScrollFixture } from './chat-scroll-fixture.ts' import { + captureStableAria, + compareOrRefreshGolden, launchWebScaffold, seedSession, watchConsole, @@ -20,6 +23,10 @@ import { import { newEnglishPage, saveFailureShot } from './support.ts' const MODE = webSnapshotMode() +const LOAD_MORE_EXPECTED = fileURLToPath(new URL( + './snapshots/trajectory-virtualization/load-more.expected.md', + import.meta.url, +)) const SESSION_ID = 'trajectory-virtualization-e2e' const FIXTURE = createChatScrollFixture({ markerPrefix: 'TRAJECTORY_VIRTUAL', @@ -150,10 +157,16 @@ async function loadToFirstTurn(page: Page): Promise { await scrollToRatio(page, 0) if (await page.getByText(marker, { exact: false }).count() > 0) return const before = await logicalRows(page) + const anchor = await firstVisibleRow(page) await expect.poll(async () => ({ marker: await page.getByText(marker, { exact: false }).count() > 0, rows: await logicalRows(page), }), { timeout: 30_000 }).not.toEqual({ marker: false, rows: before }) + await nextPaint(page) + await expect.poll(async () => { + const top = await rowTop(page, anchor.key) + return top === null ? Number.POSITIVE_INFINITY : Math.abs(top - anchor.top) + }, { timeout: 15_000 }).toBeLessThanOrEqual(GEOMETRY_TOLERANCE) } throw new Error('trajectory did not reach the first turn after twelve older-page requests') } @@ -230,8 +243,27 @@ describe('web e2e: Trajectory virtualization over tail-paged history', () => { expect(await page.getByText('Initial System Prompt', { exact: true }).count()).toBe(0) expect(await mountedRows(page)).toBeLessThanOrEqual(MAX_MOUNTED_ROWS) - await scrollToRatio(page, 0) + const loadMore = page.locator('[data-history-load] button') + await loadMore.waitFor({ timeout: 15_000 }) + expect(await loadMore.textContent()).toBe('Load earlier history') + const loadMoreSnapshot = await captureStableAria( + page, + '[data-history-load]', + scaffold.workspaceCwd, + ) + await compareOrRefreshGolden(LOAD_MORE_EXPECTED, loadMoreSnapshot, MODE) + // Avoid Playwright scrolling the offscreen first row into the automatic-load threshold. + await loadMore.evaluate((button: HTMLButtonElement) => { button.click() }) await expect.poll(() => held, { timeout: 15_000 }).toBe(true) + await expect.poll(async () => ({ + disabled: await loadMore.isDisabled(), + label: await loadMore.getAttribute('aria-label'), + }), { timeout: 15_000 }).toEqual({ + disabled: true, + label: 'Loading earlier history…', + }) + + await scrollToRatio(page, 0) const anchor = await firstVisibleRow(page) const selectedRow = page.locator( `[data-trajectory-scroll] tr[data-trajectory-row-key=${JSON.stringify(anchor.key)}]`, diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index e087543cf9..6e706c7123 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -48,6 +48,7 @@ "tests/replay-round-trip.e2e.ts", "tests/hmr-live.e2e.ts", "tests/seeded-history.e2e.ts", + "tests/cold-blank-session.e2e.ts", "tests/stats-paged-history.e2e.ts", "tests/sidebar-scrollbar.e2e.ts", "tests/conversation-column-overflow.e2e.ts", diff --git a/assets/community-wechat-official-account.png b/assets/community-wechat-official-account.png new file mode 100644 index 0000000000..222a051dc8 Binary files /dev/null and b/assets/community-wechat-official-account.png differ diff --git a/assets/community-wecom-assistant.png b/assets/community-wecom-assistant.png new file mode 100644 index 0000000000..b735f2ccc7 Binary files /dev/null and b/assets/community-wecom-assistant.png differ diff --git a/assets/community-wecom-survey.png b/assets/community-wecom-survey.png index d6f6040ba7..800865f785 100644 Binary files a/assets/community-wecom-survey.png and b/assets/community-wecom-survey.png differ diff --git a/docs/architecture.i18n.yaml b/docs/architecture.i18n.yaml index 482e683aa9..ab7a7558b8 100644 --- a/docs/architecture.i18n.yaml +++ b/docs/architecture.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/architecture.md -architecture.md: ad5b9072d2731b0b68c5f6035dafe37bc6229de8 -architecture.zh.md: 24ccd3bfbbd86213134201e49c8e768037eecd38 +architecture.md: a1507fa5e54f6703e89f09a5d387e6c9afc81ade +architecture.zh.md: 4642a1e7691bccf4d52d9a84c92c8237c3c6658b diff --git a/docs/architecture.md b/docs/architecture.md index ad5b9072d2..a1507fa5e5 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -97,7 +97,7 @@ The session log is the source of the context the model sees. `deriveMessages()` ## Capability seams -A **seam** is a swappable capability with three roles: a **Service Definition** declaring the interface, a **Service provider** implementing it, and a **Consumer** using it, commonly a model-facing tool. A package may combine roles, but one role alone is not a seam; adding a capability means designing all three ([capability graph](capability-seams.md)). +A **seam** is a swappable capability with three roles: a **Service Definition** declaring the interface, a **Service Provider** implementing it, and a **Consumer** using it, commonly a model-facing tool. A package may combine roles, but one role alone is not a seam; adding a capability means designing all three ([capability graph](capability-seams.md)). Seams are why one provider swap changes the whole product. Filesystem and subprocess providers share one execution world, so pointing them at a remote sandbox moves Bash, PTY, and LSP with them, with no provider forks. [Subagent providers](subsystems/subagent.md) vary just as widely behind one interface, from a fresh child agent to a delegated turn in another product. @@ -126,4 +126,4 @@ New behavior attaches to a documented extension point. Changing the loop itself | Fork a live session | `ctx.sessions.fork(source, boundary?, childSessionId?)` | | Scope a registration to one agent | use that agent's `agent.ctx` | -The [extension cookbook](cookbook/extension-cookbook.md) maps features to capabilities and indexes the step-by-step guides for [packages](cookbook/adding-a-package.md), [tools](cookbook/adding-a-tool.md), [LLM adapters](cookbook/adding-an-llm-adapter.md), and [Chat nodes](cookbook/adding-a-conversation-node.md). +The [extension cookbook](cookbook/extension-cookbook.md) maps features to capabilities and indexes the step-by-step guides for [packages](cookbook/adding-a-package.md), [tools](cookbook/adding-a-tool.md), [LLM adapters](cookbook/adding-an-llm-adapter.md), [Chat nodes](cookbook/adding-a-conversation-node.md), and [settings cards](cookbook/adding-a-settings-card.md). diff --git a/docs/architecture.zh.md b/docs/architecture.zh.md index 24ccd3bfbb..4642a1e769 100644 --- a/docs/architecture.zh.md +++ b/docs/architecture.zh.md @@ -50,6 +50,8 @@ dsh --profile web --dump-config | [`core/scope`](subsystems/scope.md) | 按 agent 划分作用域的注册原语 | 库,无 ctx é”® | | [`llm/llm`](subsystems/llm-streaming.md) | 消æ�¯ä¸Žæµ�å¼�è¯�汇表,以å�Šé€‚é…�器 seam | `ctx.llm` | + + ## 事件 事件就是扩展点,而选对事件域是大多数改动的第一个决定。 @@ -60,6 +62,8 @@ dsh --profile web --dump-config [事件映射](event-producer-consumer.md)列出æ¯�个事件的生产方与消费方。 + + ## 轮次æµ�程 一个**步骤**是一次模型请求加上它调用的工具。一个**轮次**包å�«é›¶ä¸ªæˆ–多个步骤:它在领å�–首æ�¡è¾“入之å‰�打开,并在ä¸�å†�欠下任何工作时关闭。 @@ -97,7 +101,7 @@ turn/end ## 能力 seam -一个 **seam** 是一项å�¯æ›¿æ�¢èƒ½åŠ›ï¼ŒåŒ…å�«ä¸‰ç§�角色:声明接å�£çš„ **Service Definition**ã€�实现它的 **Service provider**,以å�Šä½¿ç”¨å®ƒçš„ **Consumer**(通常是é�¢å�‘模型的工具)。一个包å�¯ä»¥å�ˆå¹¶æ‰¿æ‹…多个角色,但å�•一角色本身ä¸�是 seam;添加一项能力æ„�味ç�€æŠŠä¸‰è€…一并设计([能力图](capability-seams.md))。 +一个 **seam** 是一项å�¯æ›¿æ�¢èƒ½åŠ›ï¼ŒåŒ…å�«ä¸‰ç§�角色:声明接å�£çš„ **Service Definition**ã€�实现它的 **Service Provider**,以å�Šä½¿ç”¨å®ƒçš„ **Consumer**(通常是é�¢å�‘模型的工具)。一个包å�¯ä»¥å�ˆå¹¶æ‰¿æ‹…多个角色,但å�•一角色本身ä¸�是 seam;添加一项能力æ„�味ç�€æŠŠä¸‰è€…一并设计([能力图](capability-seams.md))。 seam 正是替æ�¢ä¸€ä¸ªæ��供方就能改å�˜æ•´ä¸ªäº§å“�的原因。文件系统与进程æ��供方共享å�Œä¸€ä¸ªæ‰§è¡Œä¸–界,因此把它们指å�‘远程沙箱,也就把 Bashã€�PTY å’Œ LSP 一并æ�¬äº†è¿‡åŽ»ï¼Œæ— éœ€æ��供方专用 fork。[subagent æ��供方](subsystems/subagent.md)在å�Œä¸€ä¸ªæŽ¥å�£ä¹‹å�Žå�Œæ ·å�ƒå·®ä¸‡åˆ«ï¼Œä»Žæ–°å»ºä¸€ä¸ªå­� agent,到把一个轮次委派给å�¦ä¸€ä¸ªäº§å“�。 @@ -126,4 +130,4 @@ seam 正是替æ�¢ä¸€ä¸ªæ��供方就能改å�˜æ•´ä¸ªäº§å“�的原因。文件系统 | fork 活跃会è¯� | `ctx.sessions.fork(source, boundary?, childSessionId?)` | | 将注册项é™�定到å�•个 agent | 使用该 agent çš„ `agent.ctx` | -[扩展实æ“�手册](cookbook/extension-cookbook.md)将功能映射到能力,并索引[包](cookbook/adding-a-package.md)ã€�[工具](cookbook/adding-a-tool.md)ã€�[LLM(大语言模型)适é…�器](cookbook/adding-an-llm-adapter.md)å’Œ [Chat 节点](cookbook/adding-a-conversation-node.md)的分步指å�—。 +[扩展实æ“�手册](cookbook/extension-cookbook.md)将功能映射到能力,并索引[包](cookbook/adding-a-package.md)ã€�[工具](cookbook/adding-a-tool.md)ã€�[LLM(大语言模型)适é…�器](cookbook/adding-an-llm-adapter.md)ã€�[Chat 节点](cookbook/adding-a-conversation-node.md)å’Œ[设置å�¡ç‰‡](cookbook/adding-a-settings-card.md)的分步指å�—。 diff --git a/docs/config-catalog.i18n.yaml b/docs/config-catalog.i18n.yaml index 96397ace10..10cae6e914 100644 --- a/docs/config-catalog.i18n.yaml +++ b/docs/config-catalog.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/config-catalog.md -config-catalog.md: 09c6064c2c6bb3c1da6283a885db33a5b4a674df -config-catalog.zh.md: 0bd95a5ab24b7acf85ba7ca00125ea9135e7dd82 +config-catalog.md: 4f22ed3da7de81f94d6fc5ee55a305d117c126e7 +config-catalog.zh.md: 7054ec8b52a8c46bc1ace97112f086119a61cfec diff --git a/docs/config-catalog.md b/docs/config-catalog.md index 09c6064c2c..4f22ed3da7 100644 --- a/docs/config-catalog.md +++ b/docs/config-catalog.md @@ -9,6 +9,8 @@ This file is GENERATED from source (`scripts/gen-config-catalog.ts`) and verifie A `Requires:` line lists the service keys the plugin `inject`s: its `cordis.yml` tree must also load providers for those services. Scope is the harness tier (`packages/`); the vendored cordis plugins a config tree may also load (`hmr`, the console logger, …) are pinned upstream source ([vendoring policy](../vendor/README.md)) and not catalogued here. + + ## `@deepseek-ai/dsh-acp` Requires: `agents` @@ -29,6 +31,8 @@ Depends on: `Stream` (`@agentclientprotocol/sdk`) Source: [`packages/acp/acp/src/index.ts:70`](../packages/acp/acp/src/index.ts) + + ## `@deepseek-ai/dsh-acp-demo` ```ts config-catalog @@ -82,6 +86,8 @@ Depends on: [`agentCore`](../packages/examples/agent-spine-demo/src/index.ts) · Source: [`packages/examples/acp-demo/src/index.ts:39`](../packages/examples/acp-demo/src/index.ts) + + ## `@deepseek-ai/dsh-agent-default-model` ```ts config-catalog @@ -96,6 +102,8 @@ export interface Config { Source: [`packages/core/agent-default-model/src/index.ts:41`](../packages/core/agent-default-model/src/index.ts) + + ## `@deepseek-ai/dsh-agent-instructions` ```ts config-catalog @@ -124,6 +132,8 @@ export interface Config { Source: [`packages/context/agent-instructions/src/config.ts:18`](../packages/context/agent-instructions/src/config.ts) + + ## `@deepseek-ai/dsh-agent-loop` Requires: `agents` · `sessions` · `llm` · `tools` · `systemPrompt` @@ -154,6 +164,8 @@ Depends on: [`AgentOptions`](subsystems/core.md) · [`SessionId`](subsystems/cor Source: [`packages/core/agent-loop/src/index.ts:255`](../packages/core/agent-loop/src/index.ts) + + ## `@deepseek-ai/dsh-agent-presets` Requires: `loader` @@ -190,15 +202,18 @@ export type PresetTrust = 'system' | 'user' Source: [`packages/preset/agent-presets/src/preset.ts:52`](../packages/preset/agent-presets/src/preset.ts) + + ## `@deepseek-ai/dsh-agent-spine-demo` ```ts config-catalog /** * Bundle config: each field forwarded verbatim to the child that owns it — * `agents` to the agent loop (an app that pre-creates no agents, like the ACP - * bridge, simply omits it), `includeHarnessIdentity`, `persona`, and `toolOrder` - * to the system-prompt plugin (the fixed opener, deployment persona, and explicit - * model-facing tool order), the `tools` object to the tool registry (its presentation `mode`), + * bridge, simply omits it), `includeHarnessIdentity`, `includeRuntimeContext`, + * `persona`, and `toolOrder` to the system-prompt plugin (the fixed opener, + * dynamic-context policy, deployment persona, and explicit model-facing tool + * order), the `tools` object to the tool registry (its presentation `mode`), * `dshHome` to bash environment and local skill discovery, `sessionTitle` to * the fallback title service, `skills` to the * skill registry/local provider/tool consumer, `workspaceContext` to the @@ -222,6 +237,8 @@ export interface Config { maxParallelToolCalls?: AgentLoopConfig['maxParallelToolCalls'] /** Whether the system prompt includes the fixed Harness identity (default true). */ includeHarnessIdentity?: SystemPromptConfig['includeHarnessIdentity'] + /** Whether model history includes dynamic runtime-context snapshots (default true). */ + includeRuntimeContext?: SystemPromptConfig['includeRuntimeContext'] /** The deployment persona (see dsh-system-prompt's `Config`). */ persona?: SystemPromptConfig['persona'] /** The explicit model-facing tool order (see dsh-system-prompt's `Config`). */ @@ -275,7 +292,9 @@ export interface GoalConfig { Depends on: [`AgentLoopConfig`](#deepseek-aidsh-agent-loop) · [`GoalDomainConfig`](#deepseek-aidsh-goal) · [`InvariantConfig`](#deepseek-aidsh-invariants) · [`JobsConfig`](#deepseek-aidsh-jobs-local) · [`SessionTitleConfig`](#deepseek-aidsh-session-title) · [`SkillFileSystem`](../packages/skill/skill-filesystem/src/index.ts) · [`SkillRegistryConfig`](#deepseek-aidsh-skill) · [`SystemPromptConfig`](#deepseek-aidsh-system-prompt) · [`toolBash`](../packages/shell/tool-bash/src/index.ts) · [`toolGoal`](../packages/goal/tool-goal/src/index.ts) · [`toolJobs`](../packages/jobs/tool-jobs/src/index.ts) · [`ToolsConfig`](#deepseek-aidsh-tools) · [`toolSkill`](../packages/skill/tool-skill/src/index.ts) · [`workspaceContext`](../packages/context/agent-instructions/src/index.ts) -Source: [`packages/examples/agent-spine-demo/src/index.ts:91`](../packages/examples/agent-spine-demo/src/index.ts) +Source: [`packages/examples/agent-spine-demo/src/index.ts:92`](../packages/examples/agent-spine-demo/src/index.ts) + + ## `@deepseek-ai/dsh-agent-tool-presentation` @@ -299,6 +318,8 @@ Depends on: [`ToolPresentationMode`](subsystems/tools.md) Source: [`packages/core/agent-tool-presentation/src/index.ts:38`](../packages/core/agent-tool-presentation/src/index.ts) + + ## `@deepseek-ai/dsh-attachment-local` ```ts config-catalog @@ -319,6 +340,8 @@ export interface Config { Source: [`packages/attachment/attachment-local/src/index.ts:24`](../packages/attachment/attachment-local/src/index.ts) + + ## `@deepseek-ai/dsh-bash-local` Requires: `subprocess` @@ -343,6 +366,8 @@ export interface Config { Source: [`packages/shell/bash-local/src/index.ts:41`](../packages/shell/bash-local/src/index.ts) + + ## `@deepseek-ai/dsh-bash-sandbox` Requires: `subprocess` · `sandbox` · `sandboxPolicy` @@ -362,6 +387,8 @@ Depends on: [`LocalConfig`](#deepseek-aidsh-bash-local) Source: [`packages/shell/bash-sandbox/src/index.ts:35`](../packages/shell/bash-sandbox/src/index.ts) + + ## `@deepseek-ai/dsh-client-connection` Requires: `webServer` @@ -385,6 +412,8 @@ export interface ConnectionConfig { Source: [`packages/client/connection/src/index.ts:50`](../packages/client/connection/src/index.ts) + + ## `@deepseek-ai/dsh-client-hmr` Requires: `clientModules` · `webServer` @@ -399,6 +428,8 @@ export interface Config { Source: [`packages/client/hmr/src/index.ts:31`](../packages/client/hmr/src/index.ts) + + ## `@deepseek-ai/dsh-code-runtime-worker-thread` ```ts config-catalog @@ -434,6 +465,8 @@ export interface Config { Source: [`packages/code-runtime/code-runtime-worker-thread/src/index.ts:25`](../packages/code-runtime/code-runtime-worker-thread/src/index.ts) + + ## `@deepseek-ai/dsh-compaction-basic` Requires: `llm` · `tokenMeter` · `sessions` @@ -478,6 +511,8 @@ export interface ModelCompactPolicyConfig extends CompactionPolicyConfig { Source: [`packages/compaction/compaction-basic/src/types.ts:38`](../packages/compaction/compaction-basic/src/types.ts) + + ## `@deepseek-ai/dsh-compaction-tool-result-pruner` Requires: `tokenMeter` @@ -496,6 +531,8 @@ export interface ToolResultPruneConfig { Source: [`packages/compaction/compaction-tool-result-pruner/src/types.ts:4`](../packages/compaction/compaction-tool-result-pruner/src/types.ts) + + ## `@deepseek-ai/dsh-cordis-host-runner` Requires: `tools` @@ -510,6 +547,8 @@ export interface Config { Source: [`packages/extensions/cordis-host-runner/src/index.ts:88`](../packages/extensions/cordis-host-runner/src/index.ts) + + ## `@deepseek-ai/dsh-credentials-local` ```ts config-catalog @@ -528,6 +567,8 @@ export interface Config { Source: [`packages/credentials/credentials-local/src/index.ts:55`](../packages/credentials/credentials-local/src/index.ts) + + ## `@deepseek-ai/dsh-e2b` ```ts config-catalog @@ -544,6 +585,8 @@ export interface Config { Source: [`packages/e2b/e2b/src/index.ts:43`](../packages/e2b/e2b/src/index.ts) + + ## `@deepseek-ai/dsh-fs-local` ```ts config-catalog @@ -561,6 +604,8 @@ export interface Config { Source: [`packages/fs/fs-local/src/index.ts:41`](../packages/fs/fs-local/src/index.ts) + + ## `@deepseek-ai/dsh-fs-sandbox` Requires: `sandboxPolicy` @@ -579,6 +624,8 @@ Depends on: [`LocalConfig`](#deepseek-aidsh-fs-local) Source: [`packages/fs/fs-sandbox/src/index.ts:49`](../packages/fs/fs-sandbox/src/index.ts) + + ## `@deepseek-ai/dsh-goal` Requires: `agents` @@ -593,6 +640,8 @@ export interface Config { Source: [`packages/goal/goal/src/index.ts:116`](../packages/goal/goal/src/index.ts) + + ## `@deepseek-ai/dsh-headless` Requires: `agentDefaultModel` · `agents` · `sessions` @@ -607,6 +656,8 @@ export interface Config { Source: [`packages/bundle/headless/src/index.ts:31`](../packages/bundle/headless/src/index.ts) + + ## `@deepseek-ai/dsh-hooks-claude-code` Requires: `shell` @@ -643,6 +694,8 @@ export interface Config { Source: [`packages/hooks/hooks-claude-code/src/index.ts:45`](../packages/hooks/hooks-claude-code/src/index.ts) + + ## `@deepseek-ai/dsh-hooks-codex` Requires: `shell` @@ -668,6 +721,8 @@ export interface Config { Source: [`packages/hooks/hooks-codex/src/index.ts:44`](../packages/hooks/hooks-codex/src/index.ts) + + ## `@deepseek-ai/dsh-host-apiproxy` Requires: `agentDefaultModel` · `agents` · `attachments` · `directoryPicker` · `llm` · `sessions` · `subagents` · `sessionQuery` · `tools` · `userQuestions` · `workspaceRegistry` @@ -689,11 +744,19 @@ export interface Config { * @default 6 */ sessionExportCompressionLevel?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 + /** + * Maximum physical size of a cold Session artifact eligible for blankness + * verification. Zero disables probes. + * @default 1024 + */ + coldBlankProbeMaxBytes?: number } ``` Source: [`packages/host/apiproxy/src/index.ts:41`](../packages/host/apiproxy/src/index.ts) + + ## `@deepseek-ai/dsh-host-directory-picker-browse` ```ts config-catalog @@ -706,6 +769,8 @@ export interface Config { Source: [`packages/host/directory-picker-browse/src/index.ts:181`](../packages/host/directory-picker-browse/src/index.ts) + + ## `@deepseek-ai/dsh-host-frontend-static` Requires: `webServer` @@ -720,6 +785,8 @@ export interface Config { Source: [`packages/host/frontend-static/src/index.ts:28`](../packages/host/frontend-static/src/index.ts) + + ## `@deepseek-ai/dsh-host-webserver` ```ts config-catalog @@ -734,6 +801,8 @@ export interface Config { Source: [`packages/host/webserver/src/index.ts:45`](../packages/host/webserver/src/index.ts) + + ## `@deepseek-ai/dsh-invariants` ```ts config-catalog @@ -750,6 +819,8 @@ export interface Config { Source: [`packages/runtime-diagnostics/invariants/src/index.ts:15`](../packages/runtime-diagnostics/invariants/src/index.ts) + + ## `@deepseek-ai/dsh-jobs-local` ```ts config-catalog @@ -765,6 +836,8 @@ export interface Config { Source: [`packages/jobs/jobs-local/src/index.ts:31`](../packages/jobs/jobs-local/src/index.ts) + + ## `@deepseek-ai/dsh-llm-deepseek` Requires: `llm` @@ -786,7 +859,7 @@ export interface Config { /** Deployment thinking policy; `disabled` limits every conversation request to `off`. */ thinking?: 'enabled' | 'disabled' /** Default thinking effort (default `high`); `off` disables thinking per request. */ - reasoningEffort?: 'off' | 'high' | 'max' + reasoningEffort?: 'off' | 'low' | 'high' | 'max' /** Default per-request output cap (default 256,000); a model's own cap and explicit request values win. */ maxTokens?: number /** Positive context capacity used when the selected model has no exact value (default 1,000,000). */ @@ -818,6 +891,8 @@ Depends on: [`RetryPolicyConfig`](../packages/llm/llm/src/index.ts) Source: [`packages/llm/llm-deepseek/src/index.ts:62`](../packages/llm/llm-deepseek/src/index.ts) + + ## `@deepseek-ai/dsh-llm-pi-ai` Requires: `llm` @@ -1006,6 +1081,8 @@ Depends on: `Api` (`@earendil-works/pi-ai`) · `CacheRetention` (`@earendil-work Source: [`packages/llm/llm-pi-ai/src/config.ts:172`](../packages/llm/llm-pi-ai/src/config.ts) + + ## `@deepseek-ai/dsh-llm-replay` Requires: `llm` @@ -1072,6 +1149,8 @@ Depends on: [`ModelModality`](../packages/llm/llm/src/index.ts) · [`RetryPolicy Source: [`packages/test-support/llm-replay/src/index.ts:776`](../packages/test-support/llm-replay/src/index.ts) + + ## `@deepseek-ai/dsh-llm-retry` Requires: `agents` @@ -1083,6 +1162,8 @@ export type Config = Readonly> Source: [`packages/llm/llm-retry/src/index.ts:24`](../packages/llm/llm-retry/src/index.ts) + + ## `@deepseek-ai/dsh-lsp-stdio` Requires: `fs` · `lsp` · `subprocess` @@ -1123,6 +1204,8 @@ export interface LspLocalServerConfig { Source: [`packages/lsp/lsp-stdio/src/index.ts:82`](../packages/lsp/lsp-stdio/src/index.ts) + + ## `@deepseek-ai/dsh-mcp-client` Requires: `tools` @@ -1194,6 +1277,8 @@ export interface ReconnectConfig { Source: [`packages/mcp/mcp-client/src/index.ts:98`](../packages/mcp/mcp-client/src/index.ts) + + ## `@deepseek-ai/dsh-message-feedback` Requires: `storageDomain` · `sessionPersistence` · `sessions` @@ -1208,6 +1293,8 @@ export interface Config { Source: [`packages/feedback/message-feedback/src/index.ts:49`](../packages/feedback/message-feedback/src/index.ts) + + ## `@deepseek-ai/dsh-permission-presets` Requires: `shell` · `approval` · `sessions` @@ -1245,6 +1332,8 @@ Depends on: [`ApprovalPolicy`](subsystems/approval.md) · [`SandboxMode`](subsys Source: [`packages/interaction/permission-presets/src/index.ts:140`](../packages/interaction/permission-presets/src/index.ts) + + ## `@deepseek-ai/dsh-persona` Requires: `systemPrompt` @@ -1260,11 +1349,15 @@ export interface Config { text: string /** Make this persona the complete system prompt, suppressing every other section. */ complete?: boolean + /** Suppress dynamic runtime-context snapshots for this persona's agent scope. */ + includeRuntimeContext?: boolean } ``` Source: [`packages/preset/persona/src/index.ts:34`](../packages/preset/persona/src/index.ts) + + ## `@deepseek-ai/dsh-plan-mode` Requires: `tools` · `systemPrompt` @@ -1279,6 +1372,8 @@ export interface PlanModeConfig { Source: [`packages/plan/plan-mode/src/index.ts:70`](../packages/plan/plan-mode/src/index.ts) + + ## `@deepseek-ai/dsh-pwsh-local` Requires: `subprocess` @@ -1310,6 +1405,8 @@ export interface Config { Source: [`packages/shell/pwsh-local/src/index.ts:58`](../packages/shell/pwsh-local/src/index.ts) + + ## `@deepseek-ai/dsh-pwsh-sandbox` Requires: `subprocess` · `sandbox` · `sandboxPolicy` @@ -1330,6 +1427,8 @@ Depends on: [`LocalConfig`](#deepseek-aidsh-pwsh-local) Source: [`packages/shell/pwsh-sandbox/src/index.ts:40`](../packages/shell/pwsh-sandbox/src/index.ts) + + ## `@deepseek-ai/dsh-repeat-tool-reminder` ```ts config-catalog @@ -1362,6 +1461,8 @@ export interface Config { Source: [`packages/guard/repeat-tool-reminder/src/index.ts:28`](../packages/guard/repeat-tool-reminder/src/index.ts) + + ## `@deepseek-ai/dsh-sandbox-local` ```ts config-catalog @@ -1392,6 +1493,8 @@ export interface Config { Source: [`packages/sandbox/sandbox-local/src/index.ts:44`](../packages/sandbox/sandbox-local/src/index.ts) + + ## `@deepseek-ai/dsh-sandbox-policy` ```ts config-catalog @@ -1417,6 +1520,8 @@ Depends on: [`SandboxMode`](subsystems/sandbox.md) Source: [`packages/sandbox/sandbox-policy/src/index.ts:67`](../packages/sandbox/sandbox-policy/src/index.ts) + + ## `@deepseek-ai/dsh-sdk-jsonrpc-server` Requires: `agents` @@ -1439,6 +1544,8 @@ Depends on: `Readable` (`node:stream`) · `Writable` (`node:stream`) Source: [`packages/sdk/server/src/index.ts:25`](../packages/sdk/server/src/index.ts) + + ## `@deepseek-ai/dsh-session-persistence-jsonl` Requires: `sessions` @@ -1476,6 +1583,8 @@ export type JsonlCompression = 'zstd' | 'none' Source: [`packages/session/session-persistence-jsonl/src/index.ts:60`](../packages/session/session-persistence-jsonl/src/index.ts) + + ## `@deepseek-ai/dsh-session-persistence-sqlite` Requires: `sessions` @@ -1519,6 +1628,8 @@ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist' Source: [`packages/session/session-persistence-sqlite/src/index.ts:70`](../packages/session/session-persistence-sqlite/src/index.ts) + + ## `@deepseek-ai/dsh-session-projection-cache` Requires: `storageDomain` · `sessionProjections` · `sessionPersistence` · `sessions` @@ -1540,6 +1651,8 @@ export interface Config { Source: [`packages/session/session-projection-cache/src/index.ts:42`](../packages/session/session-projection-cache/src/index.ts) + + ## `@deepseek-ai/dsh-session-query-sqlite` Requires: `sessions` @@ -1553,7 +1666,13 @@ export interface Config extends SessionQueryConfig { * POSIX filesystems; existing modes are preserved. */ path: string - /** Open the SQLite module and handle at service activation or the first search. Defaults to `startup`. */ + /** + * Open the SQLite module and handle at service activation or the first + * search, or `never` to disable full-text search: the inherited exact + * reads, filters, and traces stay available, while `searchSessions` and + * `searchEvents` fail with `SESSION_QUERY_SEARCH_DISABLED` and SQLite is + * never imported or opened. Defaults to `startup`. + */ openAt?: OpenAt /** SQLite journal mode. Defaults to `wal`. */ journalMode?: JournalMode @@ -1567,8 +1686,8 @@ export interface Config extends SessionQueryConfig { persistedInspectConcurrency?: number } -/** SQLite module/handle opening phase. */ -export type OpenAt = 'startup' | 'first-search' +/** SQLite module/handle opening phase; `never` disables full-text search entirely. */ +export type OpenAt = 'startup' | 'first-search' | 'never' /** Supported SQLite journal modes. */ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist' @@ -1578,6 +1697,8 @@ Depends on: [`SessionQueryConfig`](../packages/session-query/session-query/src/i Source: [`packages/session-query/session-query-sqlite/src/index.ts:89`](../packages/session-query/session-query-sqlite/src/index.ts) + + ## `@deepseek-ai/dsh-session-reference` Requires: `sessionQuery` @@ -1596,6 +1717,8 @@ export interface Config { Source: [`packages/context/session-reference/src/config.ts:11`](../packages/context/session-reference/src/config.ts) + + ## `@deepseek-ai/dsh-session-telemetry-otel` Requires: `sessions` @@ -1640,6 +1763,8 @@ Depends on: `BatchLogRecordProcessorOptions` (`@opentelemetry/sdk-logs`) · `OTL Source: [`packages/session/session-telemetry-otel/src/index.ts:91`](../packages/session/session-telemetry-otel/src/index.ts) + + ## `@deepseek-ai/dsh-session-title` Requires: `sessions` @@ -1658,6 +1783,8 @@ export interface Config { Source: [`packages/session/session-title/src/index.ts:79`](../packages/session/session-title/src/index.ts) + + ## `@deepseek-ai/dsh-session-title-all-prompts-llm` Requires: `sessionTitle` · `llm` · `sessions` @@ -1671,6 +1798,8 @@ Depends on: [`SessionTitleLlmConfig`](../packages/session/session-title-llm/src/ Source: [`packages/session/session-title-all-prompts-llm/src/index.ts:15`](../packages/session/session-title-all-prompts-llm/src/index.ts) + + ## `@deepseek-ai/dsh-session-title-first-prompt-llm` Requires: `sessionTitle` · `llm` · `sessions` @@ -1684,6 +1813,8 @@ Depends on: [`SessionTitleLlmConfig`](../packages/session/session-title-llm/src/ Source: [`packages/session/session-title-first-prompt-llm/src/index.ts:15`](../packages/session/session-title-first-prompt-llm/src/index.ts) + + ## `@deepseek-ai/dsh-settings-file` ```ts config-catalog @@ -1702,6 +1833,8 @@ export interface Config { Source: [`packages/settings/settings-file/src/index.ts:21`](../packages/settings/settings-file/src/index.ts) + + ## `@deepseek-ai/dsh-shell-env` ```ts config-catalog @@ -1714,6 +1847,8 @@ export interface Config { Source: [`packages/shell/shell-env/src/index.ts:29`](../packages/shell/shell-env/src/index.ts) + + ## `@deepseek-ai/dsh-skill` ```ts config-catalog @@ -1726,6 +1861,8 @@ export interface Config { Source: [`packages/skill/skill/src/index.ts:279`](../packages/skill/skill/src/index.ts) + + ## `@deepseek-ai/dsh-skill-filesystem` Requires: `skills` @@ -1762,6 +1899,8 @@ export interface Config { Source: [`packages/skill/skill-filesystem/src/index.ts:49`](../packages/skill/skill-filesystem/src/index.ts) + + ## `@deepseek-ai/dsh-spill-local` ```ts config-catalog @@ -1778,6 +1917,8 @@ export interface Config { Source: [`packages/spill/spill-local/src/index.ts:22`](../packages/spill/spill-local/src/index.ts) + + ## `@deepseek-ai/dsh-spill-policy` Requires: `tools` @@ -1796,6 +1937,8 @@ export interface Config { Source: [`packages/spill/spill-policy/src/index.ts:60`](../packages/spill/spill-policy/src/index.ts) + + ## `@deepseek-ai/dsh-storage-domain` Requires: `storage` @@ -1817,6 +1960,8 @@ export interface Config { Source: [`packages/storage/storage-domain/src/index.ts:52`](../packages/storage/storage-domain/src/index.ts) + + ## `@deepseek-ai/dsh-storage-json` Requires: `storage` @@ -1836,6 +1981,8 @@ export interface Config { Source: [`packages/storage/storage-json/src/index.ts:27`](../packages/storage/storage-json/src/index.ts) + + ## `@deepseek-ai/dsh-storage-sqlite` Requires: `storage` @@ -1874,6 +2021,8 @@ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist' Source: [`packages/storage/storage-sqlite/src/index.ts:24`](../packages/storage/storage-sqlite/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-acp` Requires: `subagents` · `subprocess` @@ -1925,6 +2074,8 @@ export type PermissionPolicy = 'allow' | 'reject' Source: [`packages/subagent/subagent-acp/src/index.ts:27`](../packages/subagent/subagent-acp/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-claude-code` Requires: `subagents` · `subprocess` @@ -1944,6 +2095,8 @@ export interface Config { Source: [`packages/subagent/subagent-claude-code/src/index.ts:32`](../packages/subagent/subagent-claude-code/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-codex` Requires: `subagents` · `subprocess` @@ -1963,6 +2116,8 @@ export interface Config { Source: [`packages/subagent/subagent-codex/src/index.ts:30`](../packages/subagent/subagent-codex/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-dsh-sdk` Requires: `subagents` @@ -2014,6 +2169,8 @@ export interface Config { Source: [`packages/subagent/subagent-dsh-sdk/src/index.ts:29`](../packages/subagent/subagent-dsh-sdk/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-fork-in-process` Requires: `subagents` @@ -2028,6 +2185,8 @@ export interface Config { Source: [`packages/subagent/subagent-fork-in-process/src/index.ts:31`](../packages/subagent/subagent-fork-in-process/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-spawn-in-process` Requires: `subagents` @@ -2042,6 +2201,8 @@ export interface Config { Source: [`packages/subagent/subagent-spawn-in-process/src/index.ts:25`](../packages/subagent/subagent-spawn-in-process/src/index.ts) + + ## `@deepseek-ai/dsh-subprocess-e2b` Requires: `e2b` @@ -2056,6 +2217,8 @@ export interface Config { Source: [`packages/e2b/subprocess-e2b/src/index.ts:25`](../packages/e2b/subprocess-e2b/src/index.ts) + + ## `@deepseek-ai/dsh-system-prompt` ```ts config-catalog @@ -2063,6 +2226,8 @@ Source: [`packages/e2b/subprocess-e2b/src/index.ts:25`](../packages/e2b/subproce export interface Config { /** Include the fixed DeepSeek Harness identity before the deployment persona (default true). */ includeHarnessIdentity?: boolean + /** Include dynamic runtime-context snapshots in model history (default true). */ + includeRuntimeContext?: boolean /** * Deployment-wide order-0 persona template. A scoped section named * `deployment:persona` shadows it; `{{variable}}` references are strict. @@ -2079,6 +2244,8 @@ export interface Config { Source: [`packages/core/system-prompt/src/index.ts:186`](../packages/core/system-prompt/src/index.ts) + + ## `@deepseek-ai/dsh-terminal-bash` Requires: `terminals` · `sandboxPolicy` · `subprocess` @@ -2122,6 +2289,8 @@ export interface Config { Source: [`packages/terminal/terminal-bash/src/config.ts:6`](../packages/terminal/terminal-bash/src/config.ts) + + ## `@deepseek-ai/dsh-time-context` Requires: `agents` @@ -2138,6 +2307,8 @@ export interface Config { Source: [`packages/context/time-context/src/index.ts:27`](../packages/context/time-context/src/index.ts) + + ## `@deepseek-ai/dsh-tmux-context` Requires: `agents` @@ -2152,6 +2323,8 @@ export interface Config { Source: [`packages/context/tmux-context/src/index.ts:34`](../packages/context/tmux-context/src/index.ts) + + ## `@deepseek-ai/dsh-token-meter` ```ts config-catalog @@ -2161,6 +2334,8 @@ export type TokenMeterConfig = Record Source: [`packages/llm/token-meter/src/types.ts:12`](../packages/llm/token-meter/src/types.ts) + + ## `@deepseek-ai/dsh-tool-bash` Requires: `tools` · `shell` · `systemPrompt` · `shellEnv` @@ -2175,6 +2350,8 @@ export interface Config { Source: [`packages/shell/tool-bash/src/index.ts:34`](../packages/shell/tool-bash/src/index.ts) + + ## `@deepseek-ai/dsh-tool-bash-persistent` Requires: `tools` · `terminals` @@ -2193,7 +2370,9 @@ export interface Config { } ``` -Source: [`packages/shell/tool-bash-persistent/src/index.ts:405`](../packages/shell/tool-bash-persistent/src/index.ts) +Source: [`packages/shell/tool-bash-persistent/src/index.ts:400`](../packages/shell/tool-bash-persistent/src/index.ts) + + ## `@deepseek-ai/dsh-tool-fs` @@ -2215,6 +2394,8 @@ export interface Config { Source: [`packages/fs/tool-fs/src/index.ts:25`](../packages/fs/tool-fs/src/index.ts) + + ## `@deepseek-ai/dsh-tool-fs-search` Requires: `tools` · `systemPrompt` · `subprocess` @@ -2248,6 +2429,8 @@ export interface Config { Source: [`packages/fs/tool-fs-search/src/index.ts:73`](../packages/fs/tool-fs-search/src/index.ts) + + ## `@deepseek-ai/dsh-tool-goal` Requires: `agents` · `goals` · `tools` · `systemPrompt` @@ -2262,6 +2445,8 @@ export interface Config { Source: [`packages/goal/tool-goal/src/index.ts:26`](../packages/goal/tool-goal/src/index.ts) + + ## `@deepseek-ai/dsh-tool-jobs` Requires: `tools` · `jobs` · `systemPrompt` @@ -2294,6 +2479,8 @@ export type CompletionDelivery = 'quiet' | 'wakeup' Source: [`packages/jobs/tool-jobs/src/index.ts:32`](../packages/jobs/tool-jobs/src/index.ts) + + ## `@deepseek-ai/dsh-tool-lsp` Requires: `tools` · `lsp` · `systemPrompt` @@ -2312,6 +2499,8 @@ export interface Config { Source: [`packages/lsp/tool-lsp/src/index.ts:58`](../packages/lsp/tool-lsp/src/index.ts) + + ## `@deepseek-ai/dsh-tool-pwsh` Requires: `tools` · `shell` · `systemPrompt` · `shellEnv` @@ -2326,6 +2515,8 @@ export interface Config { Source: [`packages/shell/tool-pwsh/src/index.ts:52`](../packages/shell/tool-pwsh/src/index.ts) + + ## `@deepseek-ai/dsh-tool-ralph` Requires: `tools` · `workflowEngine` · `subagents` · `systemPrompt` @@ -2346,6 +2537,8 @@ export interface Config { Source: [`packages/workflow/tool-ralph/src/index.ts:23`](../packages/workflow/tool-ralph/src/index.ts) + + ## `@deepseek-ai/dsh-tool-session-query` Requires: `tools` · `systemPrompt` · `sessionQuery` @@ -2362,6 +2555,8 @@ export interface Config { Source: [`packages/session-query/tool-session-query/src/index.ts:29`](../packages/session-query/tool-session-query/src/index.ts) + + ## `@deepseek-ai/dsh-tool-skill` Requires: `agents` · `tools` · `skills` @@ -2376,6 +2571,8 @@ export interface Config { Source: [`packages/skill/tool-skill/src/index.ts:61`](../packages/skill/tool-skill/src/index.ts) + + ## `@deepseek-ai/dsh-tool-str-replace-editor` Requires: `tools` · `fs` @@ -2392,6 +2589,8 @@ export interface Config { Source: [`packages/fs/tool-str-replace-editor/src/index.ts:497`](../packages/fs/tool-str-replace-editor/src/index.ts) + + ## `@deepseek-ai/dsh-tool-subagent` Requires: `tools` · `subagents` · `systemPrompt` @@ -2455,6 +2654,8 @@ Depends on: [`AgentOptions`](subsystems/core.md) Source: [`packages/subagent/tool-subagent/src/index.ts:29`](../packages/subagent/tool-subagent/src/index.ts) + + ## `@deepseek-ai/dsh-tool-subagent-report` Requires: `subagents` · `tools` · `systemPrompt` @@ -2475,6 +2676,8 @@ Depends on: [`SubagentReportDelivery`](subsystems/subagent.md) Source: [`packages/subagent/tool-subagent-report/src/index.ts:27`](../packages/subagent/tool-subagent-report/src/index.ts) + + ## `@deepseek-ai/dsh-tool-terminal` Requires: `terminals` · `tools` · `systemPrompt` @@ -2491,6 +2694,8 @@ export interface Config { Source: [`packages/terminal/tool-terminal/src/index.ts:35`](../packages/terminal/tool-terminal/src/index.ts) + + ## `@deepseek-ai/dsh-tool-todo` Requires: `tools` @@ -2511,6 +2716,8 @@ export interface Config { Source: [`packages/todo/tool-todo/src/index.ts:29`](../packages/todo/tool-todo/src/index.ts) + + ## `@deepseek-ai/dsh-tool-web` Requires: `tools` · `web` · `systemPrompt` @@ -2535,6 +2742,8 @@ export interface Config { Source: [`packages/web/tool-web/src/index.ts:37`](../packages/web/tool-web/src/index.ts) + + ## `@deepseek-ai/dsh-tool-workflow` Requires: `tools` · `workflowEngine` · `systemPrompt` @@ -2551,6 +2760,8 @@ export interface Config { Source: [`packages/workflow/tool-workflow/src/index.ts:33`](../packages/workflow/tool-workflow/src/index.ts) + + ## `@deepseek-ai/dsh-tools` Requires: `systemPrompt` @@ -2585,6 +2796,8 @@ export type ToolPresentationMode = 'native' | 'code' | 'both' Source: [`packages/core/tools/src/index.ts:654`](../packages/core/tools/src/index.ts) + + ## `@deepseek-ai/dsh-typert-loader` Requires: `typert` · `loader` @@ -2599,6 +2812,8 @@ export interface Config { Source: [`packages/typert/loader/src/index.ts:47`](../packages/typert/loader/src/index.ts) + + ## `@deepseek-ai/dsh-user-approval` ```ts config-catalog @@ -2628,6 +2843,8 @@ export type ApprovalPolicy = 'ask' | 'never' Source: [`packages/interaction/user-approval/src/index.ts:177`](../packages/interaction/user-approval/src/index.ts) + + ## `@deepseek-ai/dsh-web` ```ts config-catalog @@ -2647,6 +2864,8 @@ export interface WebRuntimeConfig { Source: [`packages/web/web/src/index.ts:55`](../packages/web/web/src/index.ts) + + ## `@deepseek-ai/dsh-web-app` Requires: `webServer` @@ -2670,6 +2889,8 @@ export interface Config { Source: [`packages/bundle/web-app/src/index.ts:38`](../packages/bundle/web-app/src/index.ts) + + ## `@deepseek-ai/dsh-web-fetch-http` Requires: `web` @@ -2694,6 +2915,8 @@ export interface Config { Source: [`packages/web/web-fetch-http/src/index.ts:34`](../packages/web/web-fetch-http/src/index.ts) + + ## `@deepseek-ai/dsh-web-search-deepseek` Requires: `web` @@ -2720,6 +2943,8 @@ export interface Config { Source: [`packages/web/web-search-deepseek/src/index.ts:46`](../packages/web/web-search-deepseek/src/index.ts) + + ## `@deepseek-ai/dsh-web-search-exa` Requires: `web` @@ -2742,6 +2967,8 @@ export interface Config { Source: [`packages/web/web-search-exa/src/index.ts:38`](../packages/web/web-search-exa/src/index.ts) + + ## `@deepseek-ai/dsh-web-search-perplexity` Requires: `web` @@ -2764,6 +2991,8 @@ export interface Config { Source: [`packages/web/web-search-perplexity/src/index.ts:32`](../packages/web/web-search-perplexity/src/index.ts) + + ## `@deepseek-ai/dsh-workflow-worker-thread` Requires: `subagents` diff --git a/docs/config-catalog.zh.md b/docs/config-catalog.zh.md index 0bd95a5ab2..7054ec8b52 100644 --- a/docs/config-catalog.zh.md +++ b/docs/config-catalog.zh.md @@ -11,6 +11,8 @@ `Requires:` 行列出æ�’件通过 `inject` 注入的æœ�务键:其 `cordis.yml` 树还必须加载这些æœ�务的æ��供者。范围é™�定为 harness 层级(`packages/`);é…�置树还å�¯èƒ½åŠ è½½çš„ vendored cordis æ�’件(`hmr`ã€�控制å�°æ—¥å¿—记录器等)固定为上游æº�代ç �(å�‚è§� [vendoring policy](../vendor/README.md)),未收录于此目录。 + + ## `@deepseek-ai/dsh-acp` 需è¦�:`agents` @@ -31,6 +33,8 @@ export interface AcpConfig { æ�¥æº�:[`packages/acp/acp/src/index.ts:70`](../packages/acp/acp/src/index.ts) + + ## `@deepseek-ai/dsh-acp-demo` ```ts config-catalog @@ -84,6 +88,8 @@ export interface Config { æ�¥æº�:[`packages/examples/acp-demo/src/index.ts:39`](../packages/examples/acp-demo/src/index.ts) + + ## `@deepseek-ai/dsh-agent-default-model` ```ts config-catalog @@ -98,6 +104,8 @@ export interface Config { æ�¥æº�:[`packages/core/agent-default-model/src/index.ts:41`](../packages/core/agent-default-model/src/index.ts) + + ## `@deepseek-ai/dsh-agent-instructions` ```ts config-catalog @@ -126,6 +134,8 @@ export interface Config { æ�¥æº�:[`packages/context/agent-instructions/src/config.ts:18`](../packages/context/agent-instructions/src/config.ts) + + ## `@deepseek-ai/dsh-agent-loop` 需è¦�:`agents` · `sessions` · `llm` · `tools` · `systemPrompt` @@ -156,6 +166,8 @@ export interface Config { æ�¥æº�:[`packages/core/agent-loop/src/index.ts:255`](../packages/core/agent-loop/src/index.ts) + + ## `@deepseek-ai/dsh-agent-presets` 需è¦�:`loader` @@ -192,15 +204,18 @@ export type PresetTrust = 'system' | 'user' æ�¥æº�:[`packages/preset/agent-presets/src/preset.ts:52`](../packages/preset/agent-presets/src/preset.ts) + + ## `@deepseek-ai/dsh-agent-spine-demo` ```ts config-catalog /** * Bundle config: each field forwarded verbatim to the child that owns it — * `agents` to the agent loop (an app that pre-creates no agents, like the ACP - * bridge, simply omits it), `includeHarnessIdentity`, `persona`, and `toolOrder` - * to the system-prompt plugin (the fixed opener, deployment persona, and explicit - * model-facing tool order), the `tools` object to the tool registry (its presentation `mode`), + * bridge, simply omits it), `includeHarnessIdentity`, `includeRuntimeContext`, + * `persona`, and `toolOrder` to the system-prompt plugin (the fixed opener, + * dynamic-context policy, deployment persona, and explicit model-facing tool + * order), the `tools` object to the tool registry (its presentation `mode`), * `dshHome` to bash environment and local skill discovery, `sessionTitle` to * the fallback title service, `skills` to the * skill registry/local provider/tool consumer, `workspaceContext` to the @@ -224,6 +239,8 @@ export interface Config { maxParallelToolCalls?: AgentLoopConfig['maxParallelToolCalls'] /** Whether the system prompt includes the fixed Harness identity (default true). */ includeHarnessIdentity?: SystemPromptConfig['includeHarnessIdentity'] + /** Whether model history includes dynamic runtime-context snapshots (default true). */ + includeRuntimeContext?: SystemPromptConfig['includeRuntimeContext'] /** The deployment persona (see dsh-system-prompt's `Config`). */ persona?: SystemPromptConfig['persona'] /** The explicit model-facing tool order (see dsh-system-prompt's `Config`). */ @@ -277,7 +294,9 @@ export interface GoalConfig { ä¾�赖:[`AgentLoopConfig`](#deepseek-aidsh-agent-loop) · [`GoalDomainConfig`](#deepseek-aidsh-goal) · [`InvariantConfig`](#deepseek-aidsh-invariants) · [`JobsConfig`](#deepseek-aidsh-jobs-local) · [`SessionTitleConfig`](#deepseek-aidsh-session-title) · [`SkillFileSystem`](../packages/skill/skill-filesystem/src/index.ts) · [`SkillRegistryConfig`](#deepseek-aidsh-skill) · [`SystemPromptConfig`](#deepseek-aidsh-system-prompt) · [`toolBash`](../packages/shell/tool-bash/src/index.ts) · [`toolGoal`](../packages/goal/tool-goal/src/index.ts) · [`toolJobs`](../packages/jobs/tool-jobs/src/index.ts) · [`ToolsConfig`](#deepseek-aidsh-tools) · [`toolSkill`](../packages/skill/tool-skill/src/index.ts) · [`workspaceContext`](../packages/context/agent-instructions/src/index.ts) -æ�¥æº�:[`packages/examples/agent-spine-demo/src/index.ts:91`](../packages/examples/agent-spine-demo/src/index.ts) +æ�¥æº�:[`packages/examples/agent-spine-demo/src/index.ts:92`](../packages/examples/agent-spine-demo/src/index.ts) + + ## `@deepseek-ai/dsh-agent-tool-presentation` @@ -301,6 +320,8 @@ export interface Config { æ�¥æº�:[`packages/core/agent-tool-presentation/src/index.ts:38`](../packages/core/agent-tool-presentation/src/index.ts) + + ## `@deepseek-ai/dsh-attachment-local` ```ts config-catalog @@ -321,6 +342,8 @@ export interface Config { æ�¥æº�:[`packages/attachment/attachment-local/src/index.ts:24`](../packages/attachment/attachment-local/src/index.ts) + + ## `@deepseek-ai/dsh-bash-local` 需è¦�:`subprocess` @@ -345,6 +368,8 @@ export interface Config { æ�¥æº�:[`packages/shell/bash-local/src/index.ts:41`](../packages/shell/bash-local/src/index.ts) + + ## `@deepseek-ai/dsh-bash-sandbox` 需è¦�:`subprocess` · `sandbox` · `sandboxPolicy` @@ -364,6 +389,8 @@ export type Config = LocalConfig æ�¥æº�:[`packages/shell/bash-sandbox/src/index.ts:35`](../packages/shell/bash-sandbox/src/index.ts) + + ## `@deepseek-ai/dsh-client-connection` 需è¦�:`webServer` @@ -387,6 +414,8 @@ export interface ConnectionConfig { æ�¥æº�:[`packages/client/connection/src/index.ts:50`](../packages/client/connection/src/index.ts) + + ## `@deepseek-ai/dsh-client-hmr` 需è¦�:`clientModuleHost` · `webServer` @@ -401,6 +430,8 @@ export interface Config { æ�¥æº�:[`packages/client/hmr/src/index.ts:31`](../packages/client/hmr/src/index.ts) + + ## `@deepseek-ai/dsh-code-runtime-worker-thread` ```ts config-catalog @@ -436,6 +467,8 @@ export interface Config { æ�¥æº�:[`packages/code-runtime/code-runtime-worker-thread/src/index.ts:25`](../packages/code-runtime/code-runtime-worker-thread/src/index.ts) + + ## `@deepseek-ai/dsh-compaction-basic` 需è¦�:`llm` · `tokenMeter` · `sessions` @@ -480,6 +513,8 @@ export interface ModelCompactPolicyConfig extends CompactionPolicyConfig { æ�¥æº�:[`packages/compaction/compaction-basic/src/types.ts:38`](../packages/compaction/compaction-basic/src/types.ts) + + ## `@deepseek-ai/dsh-compaction-tool-result-pruner` 需è¦�:`tokenMeter` @@ -498,6 +533,8 @@ export interface ToolResultPruneConfig { æ�¥æº�:[`packages/compaction/compaction-tool-result-pruner/src/types.ts:4`](../packages/compaction/compaction-tool-result-pruner/src/types.ts) + + ## `@deepseek-ai/dsh-cordis-host-runner` 需è¦�:`tools` @@ -512,6 +549,8 @@ export interface Config { æ�¥æº�:[`packages/extensions/cordis-host-runner/src/index.ts:88`](../packages/extensions/cordis-host-runner/src/index.ts) + + ## `@deepseek-ai/dsh-credentials-local` ```ts config-catalog @@ -530,6 +569,8 @@ export interface Config { æ�¥æº�:[`packages/credentials/credentials-local/src/index.ts:55`](../packages/credentials/credentials-local/src/index.ts) + + ## `@deepseek-ai/dsh-e2b` ```ts config-catalog @@ -546,6 +587,8 @@ export interface Config { æ�¥æº�:[`packages/e2b/e2b/src/index.ts:43`](../packages/e2b/e2b/src/index.ts) + + ## `@deepseek-ai/dsh-fs-local` ```ts config-catalog @@ -563,6 +606,8 @@ export interface Config { æ�¥æº�:[`packages/fs/fs-local/src/index.ts:41`](../packages/fs/fs-local/src/index.ts) + + ## `@deepseek-ai/dsh-fs-sandbox` 需è¦�:`sandboxPolicy` @@ -581,6 +626,8 @@ export type Config = LocalConfig æ�¥æº�:[`packages/fs/fs-sandbox/src/index.ts:49`](../packages/fs/fs-sandbox/src/index.ts) + + ## `@deepseek-ai/dsh-goal` 需è¦�:`agents` @@ -595,6 +642,8 @@ export interface Config { æ�¥æº�:[`packages/goal/goal/src/index.ts:116`](../packages/goal/goal/src/index.ts) + + ## `@deepseek-ai/dsh-headless` 需è¦�:`agentDefaultModel` · `agents` · `sessions` @@ -609,6 +658,8 @@ export interface Config { æ�¥æº�:[`packages/bundle/headless/src/index.ts:31`](../packages/bundle/headless/src/index.ts) + + ## `@deepseek-ai/dsh-hooks-claude-code` 需è¦�:`bash` @@ -645,6 +696,8 @@ export interface Config { æ�¥æº�:[`packages/hooks/hooks-claude-code/src/index.ts:45`](../packages/hooks/hooks-claude-code/src/index.ts) + + ## `@deepseek-ai/dsh-hooks-codex` 需è¦�:`bash` @@ -670,6 +723,8 @@ export interface Config { æ�¥æº�:[`packages/hooks/hooks-codex/src/index.ts:44`](../packages/hooks/hooks-codex/src/index.ts) + + ## `@deepseek-ai/dsh-host-apiproxy` 需è¦�:`agentDefaultModel` · `agents` · `attachments` · `directoryPicker` · `llm` · `sessions` · `subagents` · `sessionQuery` · `tools` · `userInteraction` · `workspace` @@ -691,11 +746,19 @@ export interface Config { * @default 6 */ sessionExportCompressionLevel?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 + /** + * Maximum physical size of a cold Session artifact eligible for blankness + * verification. Zero disables probes. + * @default 1024 + */ + coldBlankProbeMaxBytes?: number } ``` æ�¥æº�:[`packages/host/apiproxy/src/index.ts:41`](../packages/host/apiproxy/src/index.ts) + + ## `@deepseek-ai/dsh-host-directory-picker-browse` ```ts config-catalog @@ -708,6 +771,8 @@ export interface Config { æ�¥æº�:[`packages/host/directory-picker-browse/src/index.ts:181`](../packages/host/directory-picker-browse/src/index.ts) + + ## `@deepseek-ai/dsh-host-frontend-static` 需è¦�:`webServer` @@ -722,6 +787,8 @@ export interface Config { æ�¥æº�:[`packages/host/frontend-static/src/index.ts:28`](../packages/host/frontend-static/src/index.ts) + + ## `@deepseek-ai/dsh-host-webserver` ```ts config-catalog @@ -736,6 +803,8 @@ export interface Config { æ�¥æº�:[`packages/host/webserver/src/index.ts:45`](../packages/host/webserver/src/index.ts) + + ## `@deepseek-ai/dsh-invariants` ```ts config-catalog @@ -752,6 +821,8 @@ export interface Config { æ�¥æº�:[`packages/runtime-diagnostics/invariants/src/index.ts:15`](../packages/runtime-diagnostics/invariants/src/index.ts) + + ## `@deepseek-ai/dsh-jobs-local` ```ts config-catalog @@ -767,6 +838,8 @@ export interface Config { æ�¥æº�:[`packages/jobs/jobs-local/src/index.ts:31`](../packages/jobs/jobs-local/src/index.ts) + + ## `@deepseek-ai/dsh-llm-deepseek` 需è¦�:`llm` @@ -788,7 +861,7 @@ export interface Config { /** Deployment thinking policy; `disabled` limits every conversation request to `off`. */ thinking?: 'enabled' | 'disabled' /** Default thinking effort (default `high`); `off` disables thinking per request. */ - reasoningEffort?: 'off' | 'high' | 'max' + reasoningEffort?: 'off' | 'low' | 'high' | 'max' /** Default per-request output cap (default 256,000); a model's own cap and explicit request values win. */ maxTokens?: number /** Positive context capacity used when the selected model has no exact value (default 1,000,000). */ @@ -820,6 +893,8 @@ export interface DeepSeekCatalogModel { æ�¥æº�:[`packages/llm/llm-deepseek/src/index.ts:62`](../packages/llm/llm-deepseek/src/index.ts) + + ## `@deepseek-ai/dsh-llm-pi-ai` 需è¦�:`llm` @@ -1008,6 +1083,8 @@ type WithheldThinkingFormat = 'chat-template' | 'qwen-chat-template' æ�¥æº�:[`packages/llm/llm-pi-ai/src/config.ts:172`](../packages/llm/llm-pi-ai/src/config.ts) + + ## `@deepseek-ai/dsh-llm-replay` 需è¦�:`llm` @@ -1074,6 +1151,8 @@ export interface ReplayModelConfig { æ�¥æº�:[`packages/test-support/llm-replay/src/index.ts:776`](../packages/test-support/llm-replay/src/index.ts) + + ## `@deepseek-ai/dsh-llm-retry` 需è¦�:`agents` @@ -1085,6 +1164,8 @@ export type Config = Readonly> æ�¥æº�:[`packages/llm/llm-retry/src/index.ts:24`](../packages/llm/llm-retry/src/index.ts) + + ## `@deepseek-ai/dsh-lsp-stdio` 需è¦�:`fs` · `lsp` · `subprocess` @@ -1125,6 +1206,8 @@ export interface LspLocalServerConfig { æ�¥æº�:[`packages/lsp/lsp-stdio/src/index.ts:82`](../packages/lsp/lsp-stdio/src/index.ts) + + ## `@deepseek-ai/dsh-mcp-client` 需è¦�:`tools` @@ -1196,6 +1279,8 @@ export interface ReconnectConfig { æ�¥æº�:[`packages/mcp/mcp-client/src/index.ts:98`](../packages/mcp/mcp-client/src/index.ts) + + ## `@deepseek-ai/dsh-message-feedback` 需è¦�:`storageDomain` · `sessionPersistence` · `sessions` @@ -1210,6 +1295,8 @@ export interface Config { æ�¥æº�:[`packages/feedback/message-feedback/src/index.ts:49`](../packages/feedback/message-feedback/src/index.ts) + + ## `@deepseek-ai/dsh-permission-presets` 需è¦�:`bash` · `approval` · `sessions` @@ -1247,6 +1334,8 @@ export interface PresetSpec { æ�¥æº�:[`packages/interaction/permission-presets/src/index.ts:140`](../packages/interaction/permission-presets/src/index.ts) + + ## `@deepseek-ai/dsh-persona` 需è¦�:`systemPrompt` @@ -1262,11 +1351,15 @@ export interface Config { text: string /** Make this persona the complete system prompt, suppressing every other section. */ complete?: boolean + /** Suppress dynamic runtime-context snapshots for this persona's agent scope. */ + includeRuntimeContext?: boolean } ``` æ�¥æº�:[`packages/preset/persona/src/index.ts:34`](../packages/preset/persona/src/index.ts) + + ## `@deepseek-ai/dsh-plan-mode` 需è¦�:`tools` · `systemPrompt` @@ -1281,6 +1374,8 @@ export interface PlanModeConfig { æ�¥æº�:[`packages/plan/plan-mode/src/index.ts:70`](../packages/plan/plan-mode/src/index.ts) + + ## `@deepseek-ai/dsh-pwsh-local` 需è¦�:`subprocess` @@ -1312,6 +1407,8 @@ export interface Config { æ�¥æº�:[`packages/shell/pwsh-local/src/index.ts:58`](../packages/shell/pwsh-local/src/index.ts) + + ## `@deepseek-ai/dsh-pwsh-sandbox` 需è¦�:`subprocess` · `sandbox` · `sandboxPolicy` @@ -1332,6 +1429,8 @@ export type Config = LocalConfig æ�¥æº�:[`packages/shell/pwsh-sandbox/src/index.ts:40`](../packages/shell/pwsh-sandbox/src/index.ts) + + ## `@deepseek-ai/dsh-repeat-tool-reminder` ```ts config-catalog @@ -1364,6 +1463,8 @@ export interface Config { æ�¥æº�:[`packages/guard/repeat-tool-reminder/src/index.ts:28`](../packages/guard/repeat-tool-reminder/src/index.ts) + + ## `@deepseek-ai/dsh-sandbox-local` ```ts config-catalog @@ -1394,6 +1495,8 @@ export interface Config { æ�¥æº�:[`packages/sandbox/sandbox-local/src/index.ts:44`](../packages/sandbox/sandbox-local/src/index.ts) + + ## `@deepseek-ai/dsh-sandbox-policy` ```ts config-catalog @@ -1419,6 +1522,8 @@ export interface Config { æ�¥æº�:[`packages/sandbox/sandbox-policy/src/index.ts:67`](../packages/sandbox/sandbox-policy/src/index.ts) + + ## `@deepseek-ai/dsh-sdk-jsonrpc-server` 需è¦�:`agents` @@ -1441,6 +1546,8 @@ export interface JsonRpcConfig { æ�¥æº�:[`packages/sdk/server/src/index.ts:29`](../packages/sdk/server/src/index.ts) + + ## `@deepseek-ai/dsh-session-persistence-jsonl` 需è¦�:`sessions` @@ -1478,6 +1585,8 @@ export type JsonlCompression = 'zstd' | 'none' æ�¥æº�:[`packages/session/session-persistence-jsonl/src/index.ts:60`](../packages/session/session-persistence-jsonl/src/index.ts) + + ## `@deepseek-ai/dsh-session-persistence-sqlite` 需è¦�:`sessions` @@ -1521,6 +1630,8 @@ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist' æ�¥æº�:[`packages/session/session-persistence-sqlite/src/index.ts:70`](../packages/session/session-persistence-sqlite/src/index.ts) + + ## `@deepseek-ai/dsh-session-projection-cache` 需è¦�:`storageDomain` · `sessionProjections` · `sessionPersistence` · `sessions` @@ -1542,6 +1653,8 @@ export interface Config { æ�¥æº�:[`packages/session/session-projection-cache/src/index.ts:42`](../packages/session/session-projection-cache/src/index.ts) + + ## `@deepseek-ai/dsh-session-query-sqlite` 需è¦�:`sessions` @@ -1555,7 +1668,13 @@ export interface Config extends SessionQueryConfig { * POSIX filesystems; existing modes are preserved. */ path: string - /** Open the SQLite module and handle at service activation or the first search. Defaults to `startup`. */ + /** + * Open the SQLite module and handle at service activation or the first + * search, or `never` to disable full-text search: the inherited exact + * reads, filters, and traces stay available, while `searchSessions` and + * `searchEvents` fail with `SESSION_QUERY_SEARCH_DISABLED` and SQLite is + * never imported or opened. Defaults to `startup`. + */ openAt?: OpenAt /** SQLite journal mode. Defaults to `wal`. */ journalMode?: JournalMode @@ -1569,8 +1688,8 @@ export interface Config extends SessionQueryConfig { persistedInspectConcurrency?: number } -/** SQLite module/handle opening phase. */ -export type OpenAt = 'startup' | 'first-search' +/** SQLite module/handle opening phase; `never` disables full-text search entirely. */ +export type OpenAt = 'startup' | 'first-search' | 'never' /** Supported SQLite journal modes. */ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist' @@ -1580,6 +1699,8 @@ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist' æ�¥æº�:[`packages/session-query/session-query-sqlite/src/index.ts:89`](../packages/session-query/session-query-sqlite/src/index.ts) + + ## `@deepseek-ai/dsh-session-reference` 需è¦�:`sessionQuery` @@ -1598,6 +1719,8 @@ export interface Config { æ�¥æº�:[`packages/context/session-reference/src/config.ts:11`](../packages/context/session-reference/src/config.ts) + + ## `@deepseek-ai/dsh-session-telemetry-otel` 需è¦�:`sessions` @@ -1642,6 +1765,8 @@ export enum SessionTelemetryMode { æ�¥æº�:[`packages/session/session-telemetry-otel/src/index.ts:91`](../packages/session/session-telemetry-otel/src/index.ts) + + ## `@deepseek-ai/dsh-session-title` 需è¦�:`sessions` @@ -1660,6 +1785,8 @@ export interface Config { æ�¥æº�:[`packages/session/session-title/src/index.ts:79`](../packages/session/session-title/src/index.ts) + + ## `@deepseek-ai/dsh-session-title-all-prompts-llm` 需è¦�:`sessionTitle` · `llm` · `sessions` @@ -1673,6 +1800,8 @@ export type Config = SessionTitleLlmConfig æ�¥æº�:[`packages/session/session-title-all-prompts-llm/src/index.ts:15`](../packages/session/session-title-all-prompts-llm/src/index.ts) + + ## `@deepseek-ai/dsh-session-title-first-prompt-llm` 需è¦�:`sessionTitle` · `llm` · `sessions` @@ -1686,6 +1815,8 @@ export type Config = SessionTitleLlmConfig æ�¥æº�:[`packages/session/session-title-first-prompt-llm/src/index.ts:15`](../packages/session/session-title-first-prompt-llm/src/index.ts) + + ## `@deepseek-ai/dsh-settings-file` ```ts config-catalog @@ -1704,6 +1835,8 @@ export interface Config { æ�¥æº�:[`packages/settings/settings-file/src/index.ts:21`](../packages/settings/settings-file/src/index.ts) + + ## `@deepseek-ai/dsh-shell-env` ```ts config-catalog @@ -1716,6 +1849,8 @@ export interface Config { æ�¥æº�:[`packages/shell/shell-env/src/index.ts:29`](../packages/shell/shell-env/src/index.ts) + + ## `@deepseek-ai/dsh-skill` ```ts config-catalog @@ -1728,6 +1863,8 @@ export interface Config { æ�¥æº�:[`packages/skill/skill/src/index.ts:279`](../packages/skill/skill/src/index.ts) + + ## `@deepseek-ai/dsh-skill-filesystem` 需è¦�:`skills` @@ -1764,6 +1901,8 @@ export interface Config { æ�¥æº�:[`packages/skill/skill-filesystem/src/index.ts:49`](../packages/skill/skill-filesystem/src/index.ts) + + ## `@deepseek-ai/dsh-spill-local` ```ts config-catalog @@ -1780,6 +1919,8 @@ export interface Config { æ�¥æº�:[`packages/spill/spill-local/src/index.ts:22`](../packages/spill/spill-local/src/index.ts) + + ## `@deepseek-ai/dsh-spill-policy` 需è¦�:`tools` @@ -1798,6 +1939,8 @@ export interface Config { æ�¥æº�:[`packages/spill/spill-policy/src/index.ts:60`](../packages/spill/spill-policy/src/index.ts) + + ## `@deepseek-ai/dsh-storage-domain` 需è¦�:`storage` @@ -1819,6 +1962,8 @@ export interface Config { æ�¥æº�:[`packages/storage/storage-domain/src/index.ts:52`](../packages/storage/storage-domain/src/index.ts) + + ## `@deepseek-ai/dsh-storage-json` 需è¦�:`storage` @@ -1838,6 +1983,8 @@ export interface Config { æ�¥æº�:[`packages/storage/storage-json/src/index.ts:27`](../packages/storage/storage-json/src/index.ts) + + ## `@deepseek-ai/dsh-storage-sqlite` 需è¦�:`storage` @@ -1876,6 +2023,8 @@ export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist' æ�¥æº�:[`packages/storage/storage-sqlite/src/index.ts:24`](../packages/storage/storage-sqlite/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-acp` 需è¦�:`subagents` · `subprocess` @@ -1927,6 +2076,8 @@ export type PermissionPolicy = 'allow' | 'reject' æ�¥æº�:[`packages/subagent/subagent-acp/src/index.ts:27`](../packages/subagent/subagent-acp/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-claude-code` 需è¦�:`subagents` · `subprocess` @@ -1946,6 +2097,8 @@ export interface Config { æ�¥æº�:[`packages/subagent/subagent-claude-code/src/index.ts:32`](../packages/subagent/subagent-claude-code/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-codex` 需è¦�:`subagents` · `subprocess` @@ -1965,6 +2118,8 @@ export interface Config { æ�¥æº�:[`packages/subagent/subagent-codex/src/index.ts:30`](../packages/subagent/subagent-codex/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-dsh-sdk` 需è¦�:`subagents` @@ -2016,6 +2171,8 @@ export interface Config { æ�¥æº�:[`packages/subagent/subagent-dsh-sdk/src/index.ts:29`](../packages/subagent/subagent-dsh-sdk/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-fork-in-process` 需è¦�:`subagents` @@ -2030,6 +2187,8 @@ export interface Config { æ�¥æº�:[`packages/subagent/subagent-fork-in-process/src/index.ts:31`](../packages/subagent/subagent-fork-in-process/src/index.ts) + + ## `@deepseek-ai/dsh-subagent-spawn-in-process` 需è¦�:`subagents` @@ -2044,6 +2203,8 @@ export interface Config { æ�¥æº�:[`packages/subagent/subagent-spawn-in-process/src/index.ts:25`](../packages/subagent/subagent-spawn-in-process/src/index.ts) + + ## `@deepseek-ai/dsh-subprocess-e2b` 需è¦�:`e2b` @@ -2058,6 +2219,8 @@ export interface Config { æ�¥æº�:[`packages/e2b/subprocess-e2b/src/index.ts:25`](../packages/e2b/subprocess-e2b/src/index.ts) + + ## `@deepseek-ai/dsh-system-prompt` ```ts config-catalog @@ -2065,6 +2228,8 @@ export interface Config { export interface Config { /** Include the fixed DeepSeek Harness identity before the deployment persona (default true). */ includeHarnessIdentity?: boolean + /** Include dynamic runtime-context snapshots in model history (default true). */ + includeRuntimeContext?: boolean /** * Deployment-wide order-0 persona template. A scoped section named * `deployment:persona` shadows it; `{{variable}}` references are strict. @@ -2081,6 +2246,8 @@ export interface Config { æ�¥æº�:[`packages/core/system-prompt/src/index.ts:186`](../packages/core/system-prompt/src/index.ts) + + ## `@deepseek-ai/dsh-terminal-bash` 需è¦�:`pty` · `sandboxPolicy` · `subprocess` @@ -2124,6 +2291,8 @@ export interface Config { æ�¥æº�:[`packages/terminal/terminal-bash/src/config.ts:6`](../packages/terminal/terminal-bash/src/config.ts) + + ## `@deepseek-ai/dsh-time-context` 需è¦�:`agents` @@ -2140,6 +2309,8 @@ export interface Config { æ�¥æº�:[`packages/context/time-context/src/index.ts:27`](../packages/context/time-context/src/index.ts) + + ## `@deepseek-ai/dsh-tmux-context` 需è¦�:`agents` @@ -2154,6 +2325,8 @@ export interface Config { æ�¥æº�:[`packages/context/tmux-context/src/index.ts:34`](../packages/context/tmux-context/src/index.ts) + + ## `@deepseek-ai/dsh-token-meter` ```ts config-catalog @@ -2163,6 +2336,8 @@ export type TokenMeterConfig = Record æ�¥æº�:[`packages/llm/token-meter/src/types.ts:12`](../packages/llm/token-meter/src/types.ts) + + ## `@deepseek-ai/dsh-tool-bash` 需è¦�:`tools` · `bash` · `systemPrompt` · `bashEnv` @@ -2177,6 +2352,8 @@ export interface Config { æ�¥æº�:[`packages/shell/tool-bash/src/index.ts:34`](../packages/shell/tool-bash/src/index.ts) + + ## `@deepseek-ai/dsh-tool-bash-persistent` 需è¦�:`tools` · `pty` @@ -2195,7 +2372,9 @@ export interface Config { } ``` -æ�¥æº�:[`packages/shell/tool-bash-persistent/src/index.ts:405`](../packages/shell/tool-bash-persistent/src/index.ts) +æ�¥æº�:[`packages/shell/tool-bash-persistent/src/index.ts:400`](../packages/shell/tool-bash-persistent/src/index.ts) + + ## `@deepseek-ai/dsh-tool-fs` @@ -2217,6 +2396,8 @@ export interface Config { æ�¥æº�:[`packages/fs/tool-fs/src/index.ts:25`](../packages/fs/tool-fs/src/index.ts) + + ## `@deepseek-ai/dsh-tool-fs-search` 需è¦�:`tools` · `systemPrompt` · `subprocess` @@ -2250,6 +2431,8 @@ export interface Config { æ�¥æº�:[`packages/fs/tool-fs-search/src/index.ts:73`](../packages/fs/tool-fs-search/src/index.ts) + + ## `@deepseek-ai/dsh-tool-goal` 需è¦�:`agents` · `goals` · `tools` · `systemPrompt` @@ -2264,6 +2447,8 @@ export interface Config { æ�¥æº�:[`packages/goal/tool-goal/src/index.ts:26`](../packages/goal/tool-goal/src/index.ts) + + ## `@deepseek-ai/dsh-tool-jobs` 需è¦�:`tools` · `tasks` · `systemPrompt` @@ -2296,6 +2481,8 @@ export type CompletionDelivery = 'quiet' | 'wakeup' æ�¥æº�:[`packages/jobs/tool-jobs/src/index.ts:32`](../packages/jobs/tool-jobs/src/index.ts) + + ## `@deepseek-ai/dsh-tool-lsp` 需è¦�:`tools` · `lsp` · `systemPrompt` @@ -2314,6 +2501,8 @@ export interface Config { æ�¥æº�:[`packages/lsp/tool-lsp/src/index.ts:58`](../packages/lsp/tool-lsp/src/index.ts) + + ## `@deepseek-ai/dsh-tool-pwsh` 需è¦�:`tools` · `bash` · `systemPrompt` · `bashEnv` @@ -2328,6 +2517,8 @@ export interface Config { æ�¥æº�:[`packages/shell/tool-pwsh/src/index.ts:52`](../packages/shell/tool-pwsh/src/index.ts) + + ## `@deepseek-ai/dsh-tool-ralph` 需è¦�:`tools` · `workflows` · `subagents` · `systemPrompt` @@ -2348,6 +2539,8 @@ export interface Config { æ�¥æº�:[`packages/workflow/tool-ralph/src/index.ts:23`](../packages/workflow/tool-ralph/src/index.ts) + + ## `@deepseek-ai/dsh-tool-session-query` 需è¦�:`tools` · `systemPrompt` · `sessionQuery` @@ -2364,6 +2557,8 @@ export interface Config { æ�¥æº�:[`packages/session-query/tool-session-query/src/index.ts:29`](../packages/session-query/tool-session-query/src/index.ts) + + ## `@deepseek-ai/dsh-tool-skill` 需è¦�:`agents` · `tools` · `skills` @@ -2378,6 +2573,8 @@ export interface Config { æ�¥æº�:[`packages/skill/tool-skill/src/index.ts:61`](../packages/skill/tool-skill/src/index.ts) + + ## `@deepseek-ai/dsh-tool-str-replace-editor` 需è¦�:`tools` · `fs` @@ -2394,6 +2591,8 @@ export interface Config { æ�¥æº�:[`packages/fs/tool-str-replace-editor/src/index.ts:497`](../packages/fs/tool-str-replace-editor/src/index.ts) + + ## `@deepseek-ai/dsh-tool-subagent` 需è¦�:`tools` · `subagents` · `systemPrompt` @@ -2457,6 +2656,8 @@ export interface Config { æ�¥æº�:[`packages/subagent/tool-subagent/src/index.ts:29`](../packages/subagent/tool-subagent/src/index.ts) + + ## `@deepseek-ai/dsh-tool-subagent-report` 需è¦�:`subagents` · `tools` · `systemPrompt` @@ -2477,6 +2678,8 @@ export interface Config { æ�¥æº�:[`packages/subagent/tool-subagent-report/src/index.ts:27`](../packages/subagent/tool-subagent-report/src/index.ts) + + ## `@deepseek-ai/dsh-tool-terminal` 需è¦�:`pty` · `tools` · `systemPrompt` @@ -2493,6 +2696,8 @@ export interface Config { æ�¥æº�:[`packages/terminal/tool-terminal/src/index.ts:35`](../packages/terminal/tool-terminal/src/index.ts) + + ## `@deepseek-ai/dsh-tool-todo` 需è¦�:`tools` @@ -2513,6 +2718,8 @@ export interface Config { æ�¥æº�:[`packages/todo/tool-todo/src/index.ts:29`](../packages/todo/tool-todo/src/index.ts) + + ## `@deepseek-ai/dsh-tool-web` 需è¦�:`tools` · `web` · `systemPrompt` @@ -2537,6 +2744,8 @@ export interface Config { æ�¥æº�:[`packages/web/tool-web/src/index.ts:37`](../packages/web/tool-web/src/index.ts) + + ## `@deepseek-ai/dsh-tool-workflow` 需è¦�:`tools` · `workflows` · `systemPrompt` @@ -2553,6 +2762,8 @@ export interface Config { æ�¥æº�:[`packages/workflow/tool-workflow/src/index.ts:33`](../packages/workflow/tool-workflow/src/index.ts) + + ## `@deepseek-ai/dsh-tools` 需è¦�:`systemPrompt` @@ -2587,6 +2798,8 @@ export type ToolPresentationMode = 'native' | 'code' | 'both' æ�¥æº�:[`packages/core/tools/src/index.ts:654`](../packages/core/tools/src/index.ts) + + ## `@deepseek-ai/dsh-typert-loader` 需è¦�:`typert` · `loader` @@ -2601,6 +2814,8 @@ export interface Config { æ�¥æº�:[`packages/typert/loader/src/index.ts:47`](../packages/typert/loader/src/index.ts) + + ## `@deepseek-ai/dsh-user-approval` ```ts config-catalog @@ -2630,6 +2845,8 @@ export type ApprovalPolicy = 'ask' | 'never' æ�¥æº�:[`packages/interaction/user-approval/src/index.ts:177`](../packages/interaction/user-approval/src/index.ts) + + ## `@deepseek-ai/dsh-web` ```ts config-catalog @@ -2649,6 +2866,8 @@ export interface WebRuntimeConfig { æ�¥æº�:[`packages/web/web/src/index.ts:55`](../packages/web/web/src/index.ts) + + ## `@deepseek-ai/dsh-web-app` 需è¦�:`webServer` @@ -2672,6 +2891,8 @@ export interface Config { æ�¥æº�:[`packages/bundle/web-app/src/index.ts:38`](../packages/bundle/web-app/src/index.ts) + + ## `@deepseek-ai/dsh-web-fetch-http` 需è¦�:`web` @@ -2696,6 +2917,8 @@ export interface Config { æ�¥æº�:[`packages/web/web-fetch-http/src/index.ts:34`](../packages/web/web-fetch-http/src/index.ts) + + ## `@deepseek-ai/dsh-web-search-deepseek` 需è¦�:`web` @@ -2722,6 +2945,8 @@ export interface Config { æ�¥æº�:[`packages/web/web-search-deepseek/src/index.ts:46`](../packages/web/web-search-deepseek/src/index.ts) + + ## `@deepseek-ai/dsh-web-search-exa` 需è¦�:`web` @@ -2744,6 +2969,8 @@ export interface Config { æ�¥æº�:[`packages/web/web-search-exa/src/index.ts:38`](../packages/web/web-search-exa/src/index.ts) + + ## `@deepseek-ai/dsh-web-search-perplexity` 需è¦�:`web` @@ -2766,6 +2993,8 @@ export interface Config { æ�¥æº�:[`packages/web/web-search-perplexity/src/index.ts:32`](../packages/web/web-search-perplexity/src/index.ts) + + ## `@deepseek-ai/dsh-workflow-worker-thread` 需è¦�:`subagents` diff --git a/docs/cookbook/adding-a-package.i18n.yaml b/docs/cookbook/adding-a-package.i18n.yaml index d9cf8eb3a4..5cdb1404f8 100644 --- a/docs/cookbook/adding-a-package.i18n.yaml +++ b/docs/cookbook/adding-a-package.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/cookbook/adding-a-package.md -adding-a-package.md: 26a380fd3ec6b8b0447ad27d7ef79d3e58433cbe -adding-a-package.zh.md: 49a9fba820698d0c82c9700c31a28039fbc030c8 +adding-a-package.md: a78695735957395c5c900c3294b6778904557f85 +adding-a-package.zh.md: b7a749220fdc1581875851e2e4a7189ba7642b2d diff --git a/docs/cookbook/adding-a-package.md b/docs/cookbook/adding-a-package.md index 26a380fd3e..a786957359 100644 --- a/docs/cookbook/adding-a-package.md +++ b/docs/cookbook/adding-a-package.md @@ -40,7 +40,7 @@ Covered automatically by globs or package-manifest discovery — no edits needed ## 3. Decide the package topology -For a swappable capability, separate Service Definition / Service provider / Consumer roles into packages when they evolve independently (see docs/architecture.md § "Capability seams" — the shell trio is the template). A single-purpose plugin stays one package. +For a swappable capability, separate Service Definition / Service Provider / Consumer roles into packages when they evolve independently (see docs/architecture.md § "Capability seams" — the shell trio is the template). A single-purpose plugin stays one package. ### Name the role that exists diff --git a/docs/cookbook/adding-a-package.zh.md b/docs/cookbook/adding-a-package.zh.md index 49a9fba820..b7a749220f 100644 --- a/docs/cookbook/adding-a-package.zh.md +++ b/docs/cookbook/adding-a-package.zh.md @@ -40,7 +40,7 @@ package.json ä¸�å�˜å¼�(由 `pnpm run constraints` / `scripts/check-workspace-c ## 3. 确定包拓扑 -对于å�¯æ›¿æ�¢çš„能力,当 Service Definitionï¼�Service providerï¼�Consumer 角色需è¦�独立演进时,将它们拆分到ä¸�å�ŒåŒ…中(è§� docs/architecture.md § "Capability seams"——shell 三组件是模æ�¿ï¼‰ã€‚å�•一用途的æ�’ä»¶ä¿�æŒ�为一个包。 +对于å�¯æ›¿æ�¢çš„能力,当 Service Definitionï¼�Service Providerï¼�Consumer 角色需è¦�独立演进时,将它们拆分到ä¸�å�ŒåŒ…中(è§� docs/architecture.md § "Capability seams"——shell 三组件是模æ�¿ï¼‰ã€‚å�•一用途的æ�’ä»¶ä¿�æŒ�为一个包。 ### 使用符å�ˆå®žé™…的角色å��ç§° diff --git a/docs/cookbook/adding-a-settings-card.i18n.yaml b/docs/cookbook/adding-a-settings-card.i18n.yaml new file mode 100644 index 0000000000..acaa9a598b --- /dev/null +++ b/docs/cookbook/adding-a-settings-card.i18n.yaml @@ -0,0 +1,6 @@ +# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each +# side as of the last confirmed-consistent state. Both languages carry equal authority; +# after editing either side, bring the other along and re-record with: +# pnpm run verify-translation-pairing --write docs/cookbook/adding-a-settings-card.md +adding-a-settings-card.md: 56ec3be578bbc489bbb979a50bcaed063a35ace5 +adding-a-settings-card.zh.md: 4643303bfd76ba77676b7e508424f46082627b62 diff --git a/docs/cookbook/adding-a-settings-card.md b/docs/cookbook/adding-a-settings-card.md new file mode 100644 index 0000000000..56ec3be578 --- /dev/null +++ b/docs/cookbook/adding-a-settings-card.md @@ -0,0 +1,100 @@ +# Cookbook: adding a settings card + +English | [中文](adding-a-settings-card.zh.md) + +How a plugin puts its own configuration on the web settings page. Nothing in this path needs a change inside this repository: the Host serves every registered settings namespace, and the **Plugins** section keys its cards on the namespace they edit, so a plugin that registers both halves is paired up automatically. + +The two halves live in one package — the Host half under `src/`, the browser half under `src/client/`, exported as `./client` and declared with `dsh.client`. [`packages/client/ui-theme`](../../packages/client/ui-theme) is a worked example of that packaging; the cards this section ships live in [`packages/client/ui-settings-plugins`](../../packages/client/ui-settings-plugins). + +## 1. Register the namespace (Host half) + +The namespace is the join key, so pick it once and spell it in both halves. A consumer that already has a `cordis.yml` entry should register through `installSettingsSection`, which layers the entry under the user document and keeps working when no settings provider is mounted: + +```ts +import type { Context } from '@deepseek-ai/cordis' +import { installSettingsSection, settingsNamespace } from '@deepseek-ai/dsh-settings' +import z from '@deepseek-ai/schemastery' + +declare function assertReachable(endpoint: string | undefined): void +declare function rebuildFromSettings(config: Config): void + +export const MY_PLUGIN_NS = settingsNamespace('my-plugin') + +export interface Config { + endpoint?: string + retries?: number +} + +export const Config: z = z.object({ + endpoint: z.string(), + retries: z.number().step(1).min(0).default(3), +}) + +export function apply(ctx: Context, config: Config) { + let source = () => config + installSettingsSection(ctx, MY_PLUGIN_NS, Config, config, { + // Constraints the schema cannot express refuse the write, not the next use. + validate: value => void assertReachable(value.endpoint), + setSource: (current) => { source = current }, + onChange: () => { rebuildFromSettings(source()) }, + }) +} +``` + +`role('secret')` on a field keeps its value off every response; the card writes such a field into an `update`/`mutate` payload, or addresses a credential reference through the `credentials` domain instead. `applies: 'restart'` tells a configuration surface the owner acts on a change only at the next start. + +## 2. Register the card (browser half) + +The card registers into `settings.plugin.item` under its namespace and owns everything inside it — chrome, controls, and copy. It reads and writes through `ctx.settingsScope`, which fences each write with the revision it read: + +```ts ignore-check +import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client' +// Type-only: the keyed slot's declaration. Cross-plugin collaboration goes +// through cordis services; a value import fails the client bundle-purity gate. +import type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client' + +export const inject = ['slots', 'locale', 'connection', 'remote', 'settingsScope'] + +export function apply(ctx: ClientContext): void { + const card = new MyPluginCardController(ctx.settingsScope.bind({ namespace: 'my-plugin' })) + ctx.slots.inject('settings.plugin.item', () => ctx.slots.register({ + name: 'settings.plugin.item', + key: 'my-plugin', + locale: 'settings.myPlugin', + inject: () => card.inject(), + }, MyPluginCard), + ) +} +``` + +The scope snapshot carries what a form needs: the resolved `value`, the composition `base`, and the raw `user` layer, whose key **presence** — not its value — is what marks a field overridden. `scope.set(field, value)` stores one field and `scope.unset(field)` clears it back to the composition layer. + +## 3. What the tab does with it + +The **Plugin configuration** tab reads which namespaces the Host serves and dispatches one slot key per namespace. A card is rendered when the Host serves its key and skipped when it does not, so a deployment that never composed the Host half shows no trace of the card. A served namespace no card claims renders nothing — that is how the namespaces owned by other pages (`ui-theme`, `permission`, `llm-*`) stay off this tab. + +Cards appear in the order they registered into the slot; a keyed entry declares no `order` of its own. + +## Packaging + +The browser half is served to the page by the [client module system](../../packages/client/modules), which scans the enabled Loader entries for packages declaring `dsh.client` and serves each one's built `./client` export. So the plugin appears on the page as soon as a `cordis.yml` mounts it — no rebuild of the web application. + +```jsonc +{ + "exports": { + ".": { "types": "./lib/types/index.d.ts", "default": "./lib/index.js" }, + "./client": { "types": "./lib/types/client/index.d.ts", "default": "./lib/client.js" } + }, + "dsh": { "client": { "platform": "web", "inject": ["@deepseek-ai/dsh-client-ui-settings-plugins"] } } +} +``` + +The bundle must be the loader's lazy-CJS factory artifact. Inside this repository `tsdown.config.ts` is three lines over the shared preset: + +```ts ignore-check +import { clientBundle } from '../tsdown.client.ts' + +export default clientBundle('@deepseek-ai/dsh-client-my-plugin', ['lib/types/index.js', 'lib/types/invariant.js']) +``` + +That preset is not published today, so a package outside this repository has to reproduce the same output format itself. The bundle-purity gate also rejects value imports across plugins, so a card cannot import this section's card chrome or its staged-form model — it renders its own, and owns its own staging and revision fencing. Both limits are recorded under [the section's known limitations](../../packages/client/ui-settings-plugins/README.md#known-limitations-and-deferred-work). diff --git a/docs/cookbook/adding-a-settings-card.zh.md b/docs/cookbook/adding-a-settings-card.zh.md new file mode 100644 index 0000000000..4643303bfd --- /dev/null +++ b/docs/cookbook/adding-a-settings-card.zh.md @@ -0,0 +1,100 @@ +# Cookbook: 新增设置å�¡ç‰‡ + +[English](adding-a-settings-card.md) | 中文 + +æ�’件如何把自己的é…�置放上 Web 设置页。这æ�¡è·¯å¾„上没有任何一步需è¦�改动本仓库:Host æœ�务æ¯�一个已注册的 settings 命å��空间,而**æ�’ä»¶é…�ç½®**分区以å�¡ç‰‡æ‰€ç¼–辑的命å��空间为键,因此å�Œæ—¶æ³¨å†Œäº†ä¸¤ä¸ªå�Šä¾§çš„æ�’件会被自动é…�对。 + +两个å�Šä¾§ä½�在å�Œä¸€ä¸ªåŒ…里——Host å�Šä¾§åœ¨ `src/`,æµ�览器å�Šä¾§åœ¨ `src/client/`,以 `./client` 导出并用 `dsh.client` 声明。[`packages/client/ui-theme`](../../packages/client/ui-theme) 是这ç§�打包方å¼�的现æˆ�例å­�;本分区自带的å�¡ç‰‡åœ¨ [`packages/client/ui-settings-plugins`](../../packages/client/ui-settings-plugins)。 + +## 1. 注册命å��空间(Host å�Šä¾§ï¼‰ + +命å��空间就是é…�对用的键,所以å�ªæŒ‘一次,并在两个å�Šä¾§éƒ½å†™å‡ºå®ƒã€‚å·²ç»�有 `cordis.yml` entry 的消费方应通过 `installSettingsSection` 注册——它把 entry 层å� åœ¨ç”¨æˆ·æ–‡æ¡£ä¹‹ä¸‹ï¼Œå¹¶åœ¨æ²¡æœ‰æŒ‚è½½ settings provider 时照常工作: + +```ts +import type { Context } from '@deepseek-ai/cordis' +import { installSettingsSection, settingsNamespace } from '@deepseek-ai/dsh-settings' +import z from '@deepseek-ai/schemastery' + +declare function assertReachable(endpoint: string | undefined): void +declare function rebuildFromSettings(config: Config): void + +export const MY_PLUGIN_NS = settingsNamespace('my-plugin') + +export interface Config { + endpoint?: string + retries?: number +} + +export const Config: z = z.object({ + endpoint: z.string(), + retries: z.number().step(1).min(0).default(3), +}) + +export function apply(ctx: Context, config: Config) { + let source = () => config + installSettingsSection(ctx, MY_PLUGIN_NS, Config, config, { + // Constraints the schema cannot express refuse the write, not the next use. + validate: value => void assertReachable(value.endpoint), + setSource: (current) => { source = current }, + onChange: () => { rebuildFromSettings(source()) }, + }) +} +``` + +字段上的 `role('secret')` 让它的值ä¸�出现在任何å“�应里;å�¡ç‰‡æŠŠè¿™ç±»å­—段写进 `update`/`mutate` è½½è�·ï¼Œæˆ–改为ç»� `credentials` 领域寻å�€ä¸€ä¸ªå‡­æ�®å¼•用。`applies: 'restart'` 告诉é…�置表层:拥有方è¦�到下次å�¯åЍæ‰�会对å�˜æ›´ç”Ÿæ•ˆã€‚ + +## 2. 注册å�¡ç‰‡ï¼ˆæµ�览器å�Šä¾§ï¼‰ + +å�¡ç‰‡ä»¥è‡ªå·±çš„命å��空间为键注册进 `settings.plugin.item`,并拥有其中的一切——外观ã€�控件与文案。它通过 `ctx.settingsScope` 读写,å�Žè€…用读å�–æ—¶çš„ revision 为æ¯�次写入设栅: + +```ts ignore-check +import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client' +// Type-only: the keyed slot's declaration. Cross-plugin collaboration goes +// through cordis services; a value import fails the client bundle-purity gate. +import type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client' + +export const inject = ['slots', 'locale', 'connection', 'remote', 'settingsScope'] + +export function apply(ctx: ClientContext): void { + const card = new MyPluginCardController(ctx.settingsScope.bind({ namespace: 'my-plugin' })) + ctx.slots.inject('settings.plugin.item', () => ctx.slots.register({ + name: 'settings.plugin.item', + key: 'my-plugin', + locale: 'settings.myPlugin', + inject: () => card.inject(), + }, MyPluginCard), + ) +} +``` + +scope å¿«ç…§æ�ºå¸¦è¡¨å�•所需的一切:解æž�å�Žçš„ `value`ã€�组装层 `base`,以å�ŠåŽŸå§‹çš„ `user` 层——字段是å�¦è¢«è¦†ç›–,å�–决于它在 `user` 层中是å�¦**出现**,而é�žå®ƒçš„值。`scope.set(field, value)` 存一个字段,`scope.unset(field)` 把它清回组装层。 + +## 3. 标签页拿它å�šä»€ä¹ˆ + +**æ�’ä»¶é…�ç½®**标签页读å�– Host æœ�务了哪些命å��空间,并为æ¯�个命å��空间派å�‘一个 slot 键。当 Host æœ�务了æŸ�å�¡ç‰‡çš„键时它被渲染,å�¦åˆ™è¢«è·³è¿‡ï¼Œå› æ­¤ä»Žæœªç»„装过 Host å�Šä¾§çš„部署ä¸�会留下这张å�¡ç‰‡çš„任何痕迹。被æœ�务å�´æ— äººè®¤é¢†çš„命å��空间什么都ä¸�渲染——归其他页é�¢æ‰€æœ‰çš„那些命å��空间(`ui-theme`ã€�`permission`ã€�`llm-*`)正是这样留在本标签页之外的。 + +å�¡ç‰‡æŒ‰å…¶æ³¨å†Œè¿›è¯¥ slot 的顺åº�出现;keyed entry ä¸�声明自己的 `order`。 + +## 打包 + +æµ�览器å�Šä¾§ç”±[客户端模å�—系统](../../packages/client/modules)æ��供给页é�¢ï¼šå®ƒæ‰«æ��å·²å�¯ç”¨çš„ Loader entries 中声明了 `dsh.client` 的包,并æ��ä¾›æ¯�个包构建出的 `./client` 导出。因此å�ªè¦� `cordis.yml` 挂载了该æ�’件,它就会出现在页é�¢ä¸Šâ€”—无需é‡�新构建 Web 应用。 + +```jsonc +{ + "exports": { + ".": { "types": "./lib/types/index.d.ts", "default": "./lib/index.js" }, + "./client": { "types": "./lib/types/client/index.d.ts", "default": "./lib/client.js" } + }, + "dsh": { "client": { "platform": "web", "inject": ["@deepseek-ai/dsh-client-ui-settings-plugins"] } } +} +``` + +bundle 必须是 loader çš„ lazy-CJS factory 产物。在本仓库内,`tsdown.config.ts` 就是基于共享预设的三行: + +```ts ignore-check +import { clientBundle } from '../tsdown.client.ts' + +export default clientBundle('@deepseek-ai/dsh-client-my-plugin', ['lib/types/index.js', 'lib/types/invariant.js']) +``` + +该预设目å‰�未å�‘布,因此本仓库之外的包得自行å¤�刻å�Œæ ·çš„输出格å¼�。bundle 纯净度门ç¦�å�Œæ—¶æ‹’ç»�è·¨æ�’件的值导入,所以å�¡ç‰‡æ— æ³•导入本分区的å�¡ç‰‡å¤–观或其暂存表å�•模型——它渲染自己的那一份,并自行拥有暂存与 revision 设栅。这两æ�¡é™�制都记在[本分区的已知é™�制](../../packages/client/ui-settings-plugins/README.md#known-limitations-and-deferred-work)里。 diff --git a/docs/cookbook/adding-a-tool.i18n.yaml b/docs/cookbook/adding-a-tool.i18n.yaml index d7f08cc5af..b39b907128 100644 --- a/docs/cookbook/adding-a-tool.i18n.yaml +++ b/docs/cookbook/adding-a-tool.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/cookbook/adding-a-tool.md adding-a-tool.md: 37516521de4d00de964003fd6f877831774fdcd3 -adding-a-tool.zh.md: 9455fa3b8d8b87632724ad4b035f184cb0c17993 +adding-a-tool.zh.md: 27a90ce19653333a0a6afd989115e614a1c8f9f4 diff --git a/docs/cookbook/adding-a-tool.zh.md b/docs/cookbook/adding-a-tool.zh.md index 9455fa3b8d..27a90ce196 100644 --- a/docs/cookbook/adding-a-tool.zh.md +++ b/docs/cookbook/adding-a-tool.zh.md @@ -54,6 +54,8 @@ export function apply(ctx: Context) { producer æ��ä¾›å�Œæ­¥çš„ `cancel`ã€�在资æº�清ç�†å�Ž settle 且ä¸� reject çš„ `done`,以å�Šå�¯é€‰çš„æ¶ˆè´¹å¼� `readOutput`(负责有界输出的格å¼�化)。预先中止的调用属于失败,因为此时没有任务,其 id 无法满足æˆ�功输出 schema。`ctx.jobs.start()` å�‘布 id å�Žï¼Œåº”使用任务自有的å�–消信å�·ï¼Œè€Œä¸�是 `exec.signal`:之å�Žå�–消外层调用å�ªä¼šå�œæ­¢ç­‰å¾…本次调用,ä¸�会终止已ç»�å�‘布的工作;该生命周期归 `job_kill`ã€�owner dispose å’Œæœ�务 teardown 所有。å‰�å�°å·¥ä½œä»�与 `exec.signal` 耦å�ˆã€‚æµ�å¼� producer 的示例和完整约定è§�[å�Žå�°ä»»åŠ¡è¿�行时 Agent Note](../../.agents/notes/implemented/architecture/2026-06-20-generic-long-running-tool-runtime.md)与 `dsh-tool-bash`。 + + ## 执行策略与观测 å°½é‡�ä¸�è¦�把部署策略内建到工具中。使用 `tools/pre-execute` 实现å�¯æ‰©å±•çš„å…�许ï¼�æ‹’ç»�ï¼�询问策略(è§�[æ�ƒé™�é—¨ç¦�示例](extension-cookbook.md#a-hook-plugin-permission-gate-example));使用 `ctx.tools.guard()` 设置最终的å�•调拒ç»�,å�Žç»­ç›‘å�¬å™¨æ— æ³•撤销;使用 `tools/execute` 为分å�‘添加截止时间ã€�é‡�试或指标收集;使用 `tools/post-execute` 替æ�¢å±•示内容或返回值ã€�阻止结果,或附加模型å�¯è§�上下文;使用 `tools/result` 观测ä¸�å�¯å�˜çš„归一化结果而ä¸�改å�˜å®ƒã€‚替æ�¢å†…容ä¸�会阻止程åº�化访问 `value`ï¼›ä¿�密策略会å±�蔽或替æ�¢è¯¥å€¼ã€‚沙箱实现也å�¯ä»¥åœ¨å·¥å…·çš„æ‰§è¡Œå™¨å®žçް䏭è¿�行;[`dsh-tools` README](../../packages/core/tools/README.md#extension-points) 定义æ¯�个扩展点的输入ã€�顺åº�ã€�返回值和失败行为。 diff --git a/docs/cookbook/extension-cookbook.i18n.yaml b/docs/cookbook/extension-cookbook.i18n.yaml index a496c31981..d55871fa50 100644 --- a/docs/cookbook/extension-cookbook.i18n.yaml +++ b/docs/cookbook/extension-cookbook.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/cookbook/extension-cookbook.md extension-cookbook.md: 9618a3522c5566636fe3e49f7eca93d1e113d51a -extension-cookbook.zh.md: 7b82d7d1ff239cc2139ee424613e818669f3e2e8 +extension-cookbook.zh.md: 540bc6867016d095ccae0fb0fdc79bc1b1c26290 diff --git a/docs/cookbook/extension-cookbook.zh.md b/docs/cookbook/extension-cookbook.zh.md index 7b82d7d1ff..540bc68670 100644 --- a/docs/cookbook/extension-cookbook.zh.md +++ b/docs/cookbook/extension-cookbook.zh.md @@ -8,6 +8,8 @@ harness 扩展的å�‚考模å¼�。代ç �片段çœ�略了 import 和辅助实现, 工具在 `ctx.tools` 上注册。带注解的 `defineTool` 示例(类型化的 `execute` å�‚æ•°ã€�结果构造ã€�`run_in_background` 模å¼�)è§� [adding-a-tool.md](adding-a-tool.md)——该指å�—是工具定义的真æº�。`ctx.tools.register()` 也直接接å�—原始 JSON Schema `ToolDefinition`(MCP æ�¥æº�的工具就是这样到达的);`defineTool` 是第一方工具使用的类型化辅助函数。 + + ## é’©å­�æ�’件(以æ�ƒé™�é—¨ç¦�为例) 这个æ�ƒé™�é—¨ç¦�是钩å­�æ�’件的一个示例。它从 `tools/pre-execute` é—¨ç¦�返回一个类型化的决策,用于å…�许或拒ç»�一次调用;沙箱ã€�æ�ƒé™�å’Œ plan-mode æ�’件都å�¯ä»¥ä½¿ç”¨è¯¥æ‰©å±•点。钩å­�æ�’件也å�¯ä»¥æ‹¦æˆªå…¶ä»–扩展点,本身并ä¸�ç­‰å�ŒäºŽæ�ƒé™�é—¨ç¦�。「原生钩å­�ã€�是在拦截点上è¿�行的普通 Cordis æ�’件,ä¸�需è¦�外部å��议。 diff --git a/docs/cordis-paper.pdf b/docs/cordis-paper.pdf deleted file mode 100644 index 9d722738d7..0000000000 --- a/docs/cordis-paper.pdf +++ /dev/null @@ -1,65905 +0,0 @@ -%PDF-1.7 -%€€€€ - -1 0 obj -<< - /Type /Pages - /Count 48 - /Kids [4681 0 R 4715 0 R 4736 0 R 4743 0 R 4756 0 R 4769 0 R 4787 0 R 4799 0 R 4803 0 R 4806 0 R 4808 0 R 4812 0 R 4817 0 R 4820 0 R 4822 0 R 4829 0 R 4836 0 R 4840 0 R 4844 0 R 4848 0 R 4852 0 R 4864 0 R 4874 0 R 4884 0 R 4899 0 R 4905 0 R 4917 0 R 4921 0 R 4925 0 R 4929 0 R 4941 0 R 4947 0 R 4956 0 R 4973 0 R 4976 0 R 4985 0 R 4998 0 R 5009 0 R 5029 0 R 5053 0 R 5066 0 R 5095 0 R 5127 0 R 5155 0 R 5189 0 R 5221 0 R 5251 0 R 5270 0 R] ->> -endobj - -2 0 obj -<< - /Type /Outlines - /First 3 0 R - /Last 52 0 R - /Count 8 ->> -endobj - -3 0 obj -<< - /Parent 2 0 R - /Next 10 0 R - /First 4 0 R - /Last 9 0 R - /Count -3 - /Title (1. Introduction) - /Dest 4412 0 R ->> -endobj - -4 0 obj -<< - /Parent 3 0 R - /Next 5 0 R - /Title (1.1. Dimensions of Composability) - /Dest 4406 0 R ->> -endobj - -5 0 obj -<< - /Parent 3 0 R - /Next 9 0 R - /Prev 4 0 R - /First 6 0 R - /Last 8 0 R - /Count -3 - /Title (1.2. Motivating Examples) - /Dest 4410 0 R ->> -endobj - -6 0 obj -<< - /Parent 5 0 R - /Next 7 0 R - /Title (1.2.1. Plugin Systems) - /Dest 4407 0 R ->> -endobj - -7 0 obj -<< - /Parent 5 0 R - /Next 8 0 R - /Prev 6 0 R - /Title (1.2.2. Self-Evolving Agent Harnesses) - /Dest 4408 0 R ->> -endobj - -8 0 obj -<< - /Parent 5 0 R - /Prev 7 0 R - /Title (1.2.3. The Coarse-Grained Workaround) - /Dest 4409 0 R ->> -endobj - -9 0 obj -<< - /Parent 3 0 R - /Prev 5 0 R - /Title (1.3. Contributions) - /Dest 4411 0 R ->> -endobj - -10 0 obj -<< - /Parent 2 0 R - /Next 14 0 R - /Prev 3 0 R - /First 11 0 R - /Last 13 0 R - /Count -3 - /Title (2. Preliminaries) - /Dest 4416 0 R ->> -endobj - -11 0 obj -<< - /Parent 10 0 R - /Next 12 0 R - /Title (2.1. Effects) - /Dest 4413 0 R ->> -endobj - -12 0 obj -<< - /Parent 10 0 R - /Next 13 0 R - /Prev 11 0 R - /Title (2.2. Coeffects) - /Dest 4414 0 R ->> -endobj - -13 0 obj -<< - /Parent 10 0 R - /Prev 12 0 R - /Title (2.3. Relationship to Dynamic Composability) - /Dest 4415 0 R ->> -endobj - -14 0 obj -<< - /Parent 2 0 R - /Next 30 0 R - /Prev 10 0 R - /First 15 0 R - /Last 27 0 R - /Count -4 - /Title (3. Revertible Effects and Reactive Coeffects) - /Dest 4432 0 R ->> -endobj - -15 0 obj -<< - /Parent 14 0 R - /Next 18 0 R - /First 16 0 R - /Last 17 0 R - /Count -2 - /Title (3.1. Revertible Effects) - /Dest 4419 0 R ->> -endobj - -16 0 obj -<< - /Parent 15 0 R - /Next 17 0 R - /Title (3.1.1. Effect Context) - /Dest 4417 0 R ->> -endobj - -17 0 obj -<< - /Parent 15 0 R - /Prev 16 0 R - /Title (3.1.2. Revertible Effect Functions) - /Dest 4418 0 R ->> -endobj - -18 0 obj -<< - /Parent 14 0 R - /Next 22 0 R - /Prev 15 0 R - /First 19 0 R - /Last 21 0 R - /Count -3 - /Title (3.2. Reactive Coeffects) - /Dest 4423 0 R ->> -endobj - -19 0 obj -<< - /Parent 18 0 R - /Next 20 0 R - /Title (3.2.1. Coeffect Context) - /Dest 4420 0 R ->> -endobj - -20 0 obj -<< - /Parent 18 0 R - /Next 21 0 R - /Prev 19 0 R - /Title (3.2.2. Specification and Notification) - /Dest 4421 0 R ->> -endobj - -21 0 obj -<< - /Parent 18 0 R - /Prev 20 0 R - /Title (3.2.3. Isolation and Interception) - /Dest 4422 0 R ->> -endobj - -22 0 obj -<< - /Parent 14 0 R - /Next 27 0 R - /Prev 18 0 R - /First 23 0 R - /Last 26 0 R - /Count -4 - /Title (3.3. Component Lifecycle) - /Dest 4428 0 R ->> -endobj - -23 0 obj -<< - /Parent 22 0 R - /Next 24 0 R - /Title (3.3.1. Idempotent Recovery) - /Dest 4424 0 R ->> -endobj - -24 0 obj -<< - /Parent 22 0 R - /Next 25 0 R - /Prev 23 0 R - /Title (3.3.2. Iteration) - /Dest 4425 0 R ->> -endobj - -25 0 obj -<< - /Parent 22 0 R - /Next 26 0 R - /Prev 24 0 R - /Title (3.3.3. Coherence) - /Dest 4426 0 R ->> -endobj - -26 0 obj -<< - /Parent 22 0 R - /Prev 25 0 R - /Title (3.3.4. Asynchrony) - /Dest 4427 0 R ->> -endobj - -27 0 obj -<< - /Parent 14 0 R - /Prev 22 0 R - /First 28 0 R - /Last 29 0 R - /Count -2 - /Title (3.4. The Context Paradigm) - /Dest 4431 0 R ->> -endobj - -28 0 obj -<< - /Parent 27 0 R - /Next 29 0 R - /Title (3.4.1. Unified Context) - /Dest 4429 0 R ->> -endobj - -29 0 obj -<< - /Parent 27 0 R - /Prev 28 0 R - /Title (3.4.2. Situating the Context Paradigm) - /Dest 4430 0 R ->> -endobj - -30 0 obj -<< - /Parent 2 0 R - /Next 40 0 R - /Prev 14 0 R - /First 31 0 R - /Last 39 0 R - /Count -3 - /Title (4. Implementation and Case Study) - /Dest 4442 0 R ->> -endobj - -31 0 obj -<< - /Parent 30 0 R - /Next 36 0 R - /First 32 0 R - /Last 35 0 R - /Count -4 - /Title (4.1. Core Library) - /Dest 4437 0 R ->> -endobj - -32 0 obj -<< - /Parent 31 0 R - /Next 33 0 R - /Title (4.1.1. Effect Tracking) - /Dest 4433 0 R ->> -endobj - -33 0 obj -<< - /Parent 31 0 R - /Next 34 0 R - /Prev 32 0 R - /Title (4.1.2. Coeffect Operations) - /Dest 4434 0 R ->> -endobj - -34 0 obj -<< - /Parent 31 0 R - /Next 35 0 R - /Prev 33 0 R - /Title (4.1.3. Component Lifecycle) - /Dest 4435 0 R ->> -endobj - -35 0 obj -<< - /Parent 31 0 R - /Prev 34 0 R - /Title (4.1.4. Context Access) - /Dest 4436 0 R ->> -endobj - -36 0 obj -<< - /Parent 30 0 R - /Next 39 0 R - /Prev 31 0 R - /First 37 0 R - /Last 38 0 R - /Count -2 - /Title (4.2. Component Loader) - /Dest 4440 0 R ->> -endobj - -37 0 obj -<< - /Parent 36 0 R - /Next 38 0 R - /Title (4.2.1. Declarative Configuration Layer) - /Dest 4438 0 R ->> -endobj - -38 0 obj -<< - /Parent 36 0 R - /Prev 37 0 R - /Title (4.2.2. Hot Module Replacement) - /Dest 4439 0 R ->> -endobj - -39 0 obj -<< - /Parent 30 0 R - /Prev 36 0 R - /Title (4.3. Case Study: Koishi) - /Dest 4441 0 R ->> -endobj - -40 0 obj -<< - /Parent 2 0 R - /Next 46 0 R - /Prev 30 0 R - /First 41 0 R - /Last 45 0 R - /Count -5 - /Title (5. Discussion) - /Dest 4448 0 R ->> -endobj - -41 0 obj -<< - /Parent 40 0 R - /Next 42 0 R - /Title (5.1. Service Multiplexing) - /Dest 4443 0 R ->> -endobj - -42 0 obj -<< - /Parent 40 0 R - /Next 43 0 R - /Prev 41 0 R - /Title (5.2. Access Control and Sandboxing) - /Dest 4444 0 R ->> -endobj - -43 0 obj -<< - /Parent 40 0 R - /Next 44 0 R - /Prev 42 0 R - /Title (5.3. Language Independence and Selection) - /Dest 4445 0 R ->> -endobj - -44 0 obj -<< - /Parent 40 0 R - /Next 45 0 R - /Prev 43 0 R - /Title (5.4. Mutual Dependencies and Component Granularity) - /Dest 4446 0 R ->> -endobj - -45 0 obj -<< - /Parent 40 0 R - /Prev 44 0 R - /Title (5.5. Dependency Typing and Versioning) - /Dest 4447 0 R ->> -endobj - -46 0 obj -<< - /Parent 2 0 R - /Next 51 0 R - /Prev 40 0 R - /First 47 0 R - /Last 50 0 R - /Count -4 - /Title (6. Related Work) - /Dest 4453 0 R ->> -endobj - -47 0 obj -<< - /Parent 46 0 R - /Next 48 0 R - /Title (6.1. Effect and Coeffect Systems) - /Dest 4449 0 R ->> -endobj - -48 0 obj -<< - /Parent 46 0 R - /Next 49 0 R - /Prev 47 0 R - /Title (6.2. Programming Paradigms) - /Dest 4450 0 R ->> -endobj - -49 0 obj -<< - /Parent 46 0 R - /Next 50 0 R - /Prev 48 0 R - /Title (6.3. Temporal Composability) - /Dest 4451 0 R ->> -endobj - -50 0 obj -<< - /Parent 46 0 R - /Prev 49 0 R - /Title (6.4. Spatial Composability) - /Dest 4452 0 R ->> -endobj - -51 0 obj -<< - /Parent 2 0 R - /Next 52 0 R - /Prev 46 0 R - /Title (7. Conclusion) - /Dest 4454 0 R ->> -endobj - -52 0 obj -<< - /Parent 2 0 R - /Prev 51 0 R - /Title (References) - /Dest 4455 0 R ->> -endobj - -53 0 obj -<< - /Nums [0 4306 0 R 1 4307 0 R 2 4308 0 R 3 4309 0 R 4 4310 0 R 5 4311 0 R 6 4312 0 R 7 4313 0 R 8 4314 0 R 9 4315 0 R 10 4316 0 R 11 4317 0 R 12 4318 0 R 13 4319 0 R 14 4320 0 R 15 4321 0 R 16 4322 0 R 17 4323 0 R 18 4324 0 R 19 4325 0 R 20 4326 0 R 21 4327 0 R 22 4328 0 R 23 4329 0 R 24 4330 0 R 25 4331 0 R 26 4332 0 R 27 4333 0 R 28 4334 0 R 29 4335 0 R 30 4336 0 R 31 4337 0 R 32 4338 0 R 33 4339 0 R 34 4340 0 R 35 4341 0 R 36 4342 0 R 37 4343 0 R 38 4344 0 R 39 4345 0 R 40 4346 0 R 41 4347 0 R 42 4348 0 R 43 4349 0 R 44 4350 0 R 45 4351 0 R 46 4352 0 R 47 4353 0 R] ->> -endobj - -54 0 obj -<< - /Type /StructTreeRoot - /RoleMap << - /Datetime /Span - /Terms /Part - /Title /P - /Strong /Span - /Em /Span - >> - /K [103 0 R] - /ParentTree << - /Nums [0 55 0 R 1 4287 0 R 2 4283 0 R 3 4279 0 R 4 4275 0 R 5 4271 0 R 6 4267 0 R 7 4262 0 R 8 4257 0 R 9 4253 0 R 10 4249 0 R 11 4245 0 R 12 4240 0 R 13 4236 0 R 14 4232 0 R 15 4228 0 R 16 4223 0 R 17 4219 0 R 18 4215 0 R 19 4211 0 R 20 4206 0 R 21 4202 0 R 22 4198 0 R 23 4194 0 R 24 4190 0 R 25 4185 0 R 26 4181 0 R 27 4177 0 R 28 4171 0 R 29 4167 0 R 30 4163 0 R 31 4159 0 R 32 4155 0 R 33 56 0 R 34 4155 0 R 35 4151 0 R 36 4146 0 R 37 4142 0 R 38 4138 0 R 39 4133 0 R 40 4128 0 R 41 4124 0 R 42 4120 0 R 43 4116 0 R 44 4112 0 R 45 4108 0 R 46 4103 0 R 47 4099 0 R 48 4095 0 R 49 4091 0 R 50 4087 0 R 51 4082 0 R 52 4079 0 R 53 57 0 R 54 4074 0 R 55 4071 0 R 56 4070 0 R 57 4055 0 R 58 4054 0 R 59 58 0 R 60 4046 0 R 61 4033 0 R 62 4028 0 R 63 4027 0 R 64 4024 0 R 65 4023 0 R 66 4022 0 R 67 4021 0 R 68 4020 0 R 69 4019 0 R 70 4043 0 R 71 59 0 R 72 4015 0 R 73 4013 0 R 74 4007 0 R 75 4006 0 R 76 4004 0 R 77 4003 0 R 78 3999 0 R 79 3993 0 R 80 3988 0 R 81 3986 0 R 82 3981 0 R 83 60 0 R 84 3976 0 R 85 3973 0 R 86 3972 0 R 87 3964 0 R 88 3961 0 R 89 3960 0 R 90 3952 0 R 91 3951 0 R 92 3947 0 R 93 3941 0 R 94 3940 0 R 95 3939 0 R 96 3938 0 R 97 3937 0 R 98 3933 0 R 99 3932 0 R 100 61 0 R 101 3927 0 R 102 3926 0 R 103 3915 0 R 104 3914 0 R 105 3906 0 R 106 3905 0 R 107 3904 0 R 108 3903 0 R 109 3898 0 R 110 3886 0 R 111 62 0 R 112 3883 0 R 113 3841 0 R 114 63 0 R 115 3768 0 R 116 64 0 R 117 65 0 R 118 3508 0 R 119 3507 0 R 120 66 0 R 121 3500 0 R 122 3499 0 R 123 3391 0 R 124 67 0 R 125 3361 0 R 126 68 0 R 127 69 0 R 128 3096 0 R 129 3091 0 R 130 3063 0 R 131 3049 0 R 132 3049 0 R 133 70 0 R 134 3049 0 R 135 3042 0 R 136 3035 0 R 137 3015 0 R 138 2978 0 R 139 71 0 R 140 2892 0 R 141 2890 0 R 142 72 0 R 143 2835 0 R 144 2804 0 R 145 73 0 R 146 2767 0 R 147 2761 0 R 148 74 0 R 149 2694 0 R 150 2687 0 R 151 75 0 R 152 2679 0 R 153 2678 0 R 154 2674 0 R 155 2671 0 R 156 2669 0 R 157 2667 0 R 158 2664 0 R 159 2659 0 R 160 2652 0 R 161 2644 0 R 162 76 0 R 163 2635 0 R 164 2552 0 R 165 2551 0 R 166 2550 0 R 167 2549 0 R 168 2546 0 R 169 2541 0 R 170 2535 0 R 171 77 0 R 172 2385 0 R 173 2383 0 R 174 2374 0 R 175 2367 0 R 176 2362 0 R 177 2342 0 R 178 2329 0 R 179 2327 0 R 180 78 0 R 181 2216 0 R 182 2213 0 R 183 2212 0 R 184 2209 0 R 185 2135 0 R 186 2130 0 R 187 2124 0 R 188 2123 0 R 189 2119 0 R 190 2116 0 R 191 2109 0 R 192 2106 0 R 193 2103 0 R 194 79 0 R 195 2009 0 R 196 2008 0 R 197 2001 0 R 198 1998 0 R 199 80 0 R 200 1785 0 R 201 1783 0 R 202 1777 0 R 203 1776 0 R 204 1773 0 R 205 1765 0 R 206 1763 0 R 207 1705 0 R 208 1701 0 R 209 1695 0 R 210 81 0 R 211 1689 0 R 212 1678 0 R 213 82 0 R 214 1610 0 R 215 1609 0 R 216 83 0 R 217 1216 0 R 218 1213 0 R 219 84 0 R 220 1107 0 R 221 1100 0 R 222 1090 0 R 223 1089 0 R 224 1086 0 R 225 1085 0 R 226 1084 0 R 227 1081 0 R 228 1104 0 R 229 1097 0 R 230 85 0 R 231 1080 0 R 232 1073 0 R 233 1060 0 R 234 1059 0 R 235 86 0 R 236 1055 0 R 237 1050 0 R 238 1049 0 R 239 1048 0 R 240 1045 0 R 241 1042 0 R 242 1041 0 R 243 87 0 R 244 1040 0 R 245 1032 0 R 246 1021 0 R 247 1018 0 R 248 1014 0 R 249 1013 0 R 250 1012 0 R 251 1009 0 R 252 1008 0 R 253 1005 0 R 254 1003 0 R 255 1002 0 R 256 1001 0 R 257 999 0 R 258 1029 0 R 259 88 0 R 260 998 0 R 261 89 0 R 262 974 0 R 263 966 0 R 264 958 0 R 265 953 0 R 266 952 0 R 267 951 0 R 268 950 0 R 269 90 0 R 270 944 0 R 271 941 0 R 272 939 0 R 273 938 0 R 274 937 0 R 275 932 0 R 276 929 0 R 277 926 0 R 278 924 0 R 279 923 0 R 280 922 0 R 281 91 0 R 282 919 0 R 283 916 0 R 284 915 0 R 285 913 0 R 286 911 0 R 287 908 0 R 288 907 0 R 289 900 0 R 290 899 0 R 291 92 0 R 292 893 0 R 293 891 0 R 294 890 0 R 295 889 0 R 296 888 0 R 297 887 0 R 298 886 0 R 299 885 0 R 300 883 0 R 301 882 0 R 302 879 0 R 303 876 0 R 304 875 0 R 305 873 0 R 306 872 0 R 307 871 0 R 308 870 0 R 309 868 0 R 310 93 0 R 311 865 0 R 312 864 0 R 313 863 0 R 314 862 0 R 315 861 0 R 316 860 0 R 317 859 0 R 318 858 0 R 319 857 0 R 320 852 0 R 321 851 0 R 322 848 0 R 323 845 0 R 324 844 0 R 325 843 0 R 326 840 0 R 327 839 0 R 328 837 0 R 329 834 0 R 330 833 0 R 331 832 0 R 332 830 0 R 333 94 0 R 334 820 0 R 335 817 0 R 336 814 0 R 337 810 0 R 338 807 0 R 339 803 0 R 340 800 0 R 341 796 0 R 342 790 0 R 343 787 0 R 344 783 0 R 345 95 0 R 346 777 0 R 347 775 0 R 348 771 0 R 349 769 0 R 350 769 0 R 351 765 0 R 352 761 0 R 353 757 0 R 354 753 0 R 355 749 0 R 356 743 0 R 357 739 0 R 358 735 0 R 359 729 0 R 360 724 0 R 361 721 0 R 362 717 0 R 363 711 0 R 364 708 0 R 365 704 0 R 366 701 0 R 367 697 0 R 368 694 0 R 369 690 0 R 370 684 0 R 371 681 0 R 372 677 0 R 373 96 0 R 374 671 0 R 375 668 0 R 376 664 0 R 377 661 0 R 378 657 0 R 379 654 0 R 380 654 0 R 381 650 0 R 382 647 0 R 383 647 0 R 384 643 0 R 385 640 0 R 386 636 0 R 387 633 0 R 388 629 0 R 389 625 0 R 390 621 0 R 391 618 0 R 392 614 0 R 393 611 0 R 394 607 0 R 395 604 0 R 396 600 0 R 397 597 0 R 398 593 0 R 399 590 0 R 400 586 0 R 401 583 0 R 402 579 0 R 403 576 0 R 404 97 0 R 405 572 0 R 406 569 0 R 407 565 0 R 408 559 0 R 409 557 0 R 410 553 0 R 411 550 0 R 412 546 0 R 413 540 0 R 414 538 0 R 415 538 0 R 416 534 0 R 417 532 0 R 418 528 0 R 419 522 0 R 420 519 0 R 421 515 0 R 422 512 0 R 423 508 0 R 424 505 0 R 425 501 0 R 426 495 0 R 427 489 0 R 428 483 0 R 429 480 0 R 430 476 0 R 431 98 0 R 432 470 0 R 433 467 0 R 434 463 0 R 435 460 0 R 436 456 0 R 437 450 0 R 438 447 0 R 439 443 0 R 440 441 0 R 441 441 0 R 442 437 0 R 443 434 0 R 444 430 0 R 445 428 0 R 446 428 0 R 447 424 0 R 448 421 0 R 449 417 0 R 450 414 0 R 451 410 0 R 452 407 0 R 453 407 0 R 454 403 0 R 455 400 0 R 456 396 0 R 457 393 0 R 458 389 0 R 459 386 0 R 460 382 0 R 461 379 0 R 462 375 0 R 463 372 0 R 464 99 0 R 465 368 0 R 466 365 0 R 467 361 0 R 468 358 0 R 469 354 0 R 470 351 0 R 471 347 0 R 472 344 0 R 473 340 0 R 474 338 0 R 475 334 0 R 476 331 0 R 477 327 0 R 478 324 0 R 479 320 0 R 480 317 0 R 481 313 0 R 482 310 0 R 483 310 0 R 484 306 0 R 485 303 0 R 486 299 0 R 487 296 0 R 488 292 0 R 489 289 0 R 490 285 0 R 491 282 0 R 492 278 0 R 493 274 0 R 494 270 0 R 495 100 0 R 496 267 0 R 497 263 0 R 498 260 0 R 499 256 0 R 500 253 0 R 501 249 0 R 502 246 0 R 503 242 0 R 504 239 0 R 505 235 0 R 506 232 0 R 507 228 0 R 508 225 0 R 509 221 0 R 510 215 0 R 511 210 0 R 512 205 0 R 513 202 0 R 514 198 0 R 515 195 0 R 516 191 0 R 517 188 0 R 518 184 0 R 519 181 0 R 520 177 0 R 521 174 0 R 522 170 0 R 523 167 0 R 524 101 0 R 525 163 0 R 526 160 0 R 527 156 0 R 528 151 0 R 529 145 0 R 530 142 0 R 531 138 0 R 532 135 0 R 533 131 0 R 534 128 0 R 535 124 0 R 536 121 0 R 537 117 0 R 538 115 0 R 539 115 0 R 540 111 0 R 541 108 0 R 542 102 0 R] - >> - /IDTree << - /Names [(Note 1) 4041 0 R (Note 2) 1994 0 R (Note 3) 1211 0 R (Note 4) 1102 0 R (Note 5) 1093 0 R (Note 6) 1026 0 R (U1x0y1) 2633 0 R (U1x1y1) 2631 0 R] - >> - /ParentTreeNextKey 543 ->> -endobj - -55 0 obj -[4305 0 R 4301 0 R 4304 0 R 4301 0 R 4303 0 R 4301 0 R 4302 0 R 4300 0 R 4298 0 R 4299 0 R 4298 0 R 4297 0 R 4290 0 R 4290 0 R 4296 0 R 4290 0 R 4290 0 R 4295 0 R 4290 0 R 4290 0 R 4294 0 R 4290 0 R 4290 0 R 4290 0 R 4293 0 R 4290 0 R 4290 0 R 4290 0 R 4292 0 R 4290 0 R 4290 0 R 4290 0 R 4290 0 R 4290 0 R 4290 0 R 4290 0 R 4291 0 R 4290 0 R 4290 0 R 4290 0 R] -endobj - -56 0 obj -[4289 0 R 4288 0 R 4287 0 R 4287 0 R 4284 0 R 4283 0 R 4283 0 R 4280 0 R 4279 0 R 4279 0 R 4276 0 R 4275 0 R 4275 0 R 4272 0 R 4271 0 R 4271 0 R 4268 0 R 4267 0 R 4267 0 R 4263 0 R 4262 0 R 4262 0 R 4258 0 R 4257 0 R 4257 0 R 4254 0 R 4253 0 R 4253 0 R 4250 0 R 4249 0 R 4249 0 R 4246 0 R 4245 0 R 4245 0 R 4241 0 R 4240 0 R 4240 0 R 4237 0 R 4236 0 R 4236 0 R 4233 0 R 4232 0 R 4232 0 R 4229 0 R 4228 0 R 4228 0 R 4224 0 R 4223 0 R 4223 0 R 4220 0 R 4219 0 R 4219 0 R 4216 0 R 4215 0 R 4215 0 R 4212 0 R 4211 0 R 4211 0 R 4207 0 R 4206 0 R 4206 0 R 4203 0 R 4202 0 R 4202 0 R 4199 0 R 4198 0 R 4198 0 R 4195 0 R 4194 0 R 4194 0 R 4191 0 R 4190 0 R 4190 0 R 4186 0 R 4185 0 R 4185 0 R 4182 0 R 4181 0 R 4181 0 R 4178 0 R 4177 0 R 4177 0 R 4172 0 R 4171 0 R 4171 0 R 4168 0 R 4167 0 R 4167 0 R 4164 0 R 4163 0 R 4163 0 R 4160 0 R 4159 0 R 4159 0 R] -endobj - -57 0 obj -[4156 0 R 4155 0 R 4155 0 R 4152 0 R 4151 0 R 4151 0 R 4147 0 R 4146 0 R 4146 0 R 4143 0 R 4142 0 R 4142 0 R 4139 0 R 4138 0 R 4138 0 R 4134 0 R 4133 0 R 4133 0 R 4129 0 R 4128 0 R 4128 0 R 4125 0 R 4124 0 R 4124 0 R 4121 0 R 4120 0 R 4120 0 R 4117 0 R 4116 0 R 4116 0 R 4113 0 R 4112 0 R 4112 0 R 4109 0 R 4108 0 R 4108 0 R 4104 0 R 4103 0 R 4103 0 R 4100 0 R 4099 0 R 4099 0 R 4096 0 R 4095 0 R 4095 0 R 4092 0 R 4091 0 R 4091 0 R 4088 0 R 4087 0 R 4087 0 R 4083 0 R 4082 0 R 4082 0 R 4079 0 R 4079 0 R] -endobj - -58 0 obj -[4075 0 R 4075 0 R 4069 0 R 4069 0 R 4069 0 R 4074 0 R 4069 0 R 4069 0 R 4073 0 R 4069 0 R 4069 0 R 4069 0 R 4072 0 R 4069 0 R 4069 0 R 4069 0 R 4071 0 R 4069 0 R 4069 0 R 4069 0 R 4069 0 R 4069 0 R 4070 0 R 4069 0 R 4069 0 R 4069 0 R 4069 0 R 4069 0 R 4068 0 R 4068 0 R 4067 0 R 4067 0 R 4067 0 R 4066 0 R 4065 0 R 4063 0 R 4064 0 R 4063 0 R 4063 0 R 4063 0 R 4063 0 R 4063 0 R 4061 0 R 4060 0 R 4058 0 R 4059 0 R 4058 0 R 4058 0 R 4058 0 R 4058 0 R 4058 0 R 4053 0 R 4053 0 R 4055 0 R 4053 0 R 4053 0 R 4053 0 R 4053 0 R 4054 0 R 4053 0 R 4053 0 R 4053 0 R 4053 0 R 4053 0 R 4053 0 R 4052 0 R 4052 0 R 4051 0 R 4051 0 R 4050 0 R 4050 0 R 4049 0 R 4038 0 R 4038 0 R 4038 0 R 4048 0 R 4038 0 R 4038 0 R 4038 0 R] -endobj - -59 0 obj -[4038 0 R 4038 0 R 4047 0 R 4038 0 R 4038 0 R 4040 0 R 4038 0 R 4038 0 R 4038 0 R 4039 0 R 4038 0 R 4038 0 R 4037 0 R 4029 0 R 4036 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4035 0 R 4029 0 R 4034 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4029 0 R 4031 0 R 4029 0 R 4029 0 R 4030 0 R 4029 0 R 4029 0 R 4029 0 R 4026 0 R 4026 0 R 4028 0 R 4026 0 R 4027 0 R 4026 0 R 4026 0 R 4025 0 R 4025 0 R 4018 0 R 4018 0 R 4024 0 R 4018 0 R 4023 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4022 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4021 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4020 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4018 0 R 4019 0 R 4018 0 R 4018 0 R 4018 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4017 0 R 4016 0 R 4016 0 R 4014 0 R 4014 0 R 4014 0 R 4014 0 R 4044 0 R 4041 0 R] -endobj - -60 0 obj -[4014 0 R 4014 0 R 4015 0 R 4014 0 R 4014 0 R 4014 0 R 4014 0 R 4014 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4013 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4012 0 R 4011 0 R 4011 0 R 4002 0 R 4010 0 R 4002 0 R 4002 0 R 4009 0 R 4002 0 R 4008 0 R 4008 0 R 4002 0 R 4002 0 R 4007 0 R 4002 0 R 4006 0 R 4002 0 R 4002 0 R 4005 0 R 4002 0 R 4002 0 R 4004 0 R 4002 0 R 4003 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4002 0 R 4001 0 R 3997 0 R 4000 0 R 3997 0 R 3999 0 R 3997 0 R 3997 0 R 3997 0 R 3998 0 R 3997 0 R 3997 0 R 3997 0 R 3997 0 R 3995 0 R 3992 0 R 3994 0 R 3992 0 R 3993 0 R 3992 0 R 3992 0 R 3992 0 R 3992 0 R 3992 0 R 3990 0 R 3985 0 R 3989 0 R 3985 0 R 3988 0 R 3985 0 R 3985 0 R 3985 0 R 3985 0 R 3987 0 R 3985 0 R 3986 0 R 3985 0 R 3985 0 R 3983 0 R 3980 0 R 3982 0 R 3980 0 R 3981 0 R 3980 0 R 3980 0 R 3980 0 R 3980 0 R 3980 0 R 3980 0 R] -endobj - -61 0 obj -[3977 0 R 3977 0 R 3975 0 R 3975 0 R 3975 0 R 3976 0 R 3975 0 R 3975 0 R 3974 0 R 3974 0 R 3966 0 R 3966 0 R 3973 0 R 3966 0 R 3972 0 R 3966 0 R 3966 0 R 3971 0 R 3971 0 R 3971 0 R 3971 0 R 3971 0 R 3966 0 R 3966 0 R 3970 0 R 3966 0 R 3969 0 R 3966 0 R 3968 0 R 3966 0 R 3967 0 R 3966 0 R 3966 0 R 3965 0 R 3965 0 R 3965 0 R 3965 0 R 3965 0 R 3965 0 R 3965 0 R 3963 0 R 3963 0 R 3963 0 R 3963 0 R 3964 0 R 3963 0 R 3963 0 R 3963 0 R 3963 0 R 3962 0 R 3954 0 R 3954 0 R 3961 0 R 3954 0 R 3954 0 R 3954 0 R 3954 0 R 3960 0 R 3954 0 R 3954 0 R 3959 0 R 3959 0 R 3959 0 R 3959 0 R 3959 0 R 3959 0 R 3959 0 R 3954 0 R 3958 0 R 3954 0 R 3954 0 R 3954 0 R 3957 0 R 3957 0 R 3957 0 R 3957 0 R 3954 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3956 0 R 3954 0 R 3954 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3955 0 R 3954 0 R 3954 0 R 3953 0 R 3945 0 R 3945 0 R 3952 0 R 3945 0 R 3951 0 R 3945 0 R 3945 0 R 3945 0 R 3945 0 R 3945 0 R 3950 0 R 3945 0 R 3949 0 R 3949 0 R 3949 0 R 3949 0 R 3949 0 R 3949 0 R 3945 0 R 3948 0 R 3948 0 R 3948 0 R 3948 0 R 3948 0 R 3948 0 R 3945 0 R 3945 0 R 3945 0 R 3945 0 R 3947 0 R 3945 0 R 3945 0 R 3946 0 R 3945 0 R 3945 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3944 0 R 3936 0 R 3943 0 R 3936 0 R 3942 0 R 3936 0 R 3936 0 R 3936 0 R 3936 0 R 3941 0 R 3936 0 R 3936 0 R 3936 0 R 3940 0 R 3936 0 R 3939 0 R 3936 0 R 3936 0 R 3936 0 R 3938 0 R 3936 0 R 3936 0 R 3936 0 R 3937 0 R 3936 0 R 3936 0 R 3936 0 R 3935 0 R 3935 0 R 3931 0 R 3934 0 R 3931 0 R 3931 0 R 3933 0 R 3931 0 R 3932 0 R 3931 0 R 3931 0 R 3931 0 R 3930 0 R 3930 0 R 3930 0 R 3930 0 R 3930 0 R 3930 0 R 3930 0 R 3929 0 R 3929 0 R] -endobj - -62 0 obj -[3929 0 R 3929 0 R 3928 0 R 3919 0 R 3919 0 R 3919 0 R 3927 0 R 3919 0 R 3919 0 R 3919 0 R 3919 0 R 3919 0 R 3926 0 R 3919 0 R 3919 0 R 3919 0 R 3925 0 R 3925 0 R 3925 0 R 3925 0 R 3925 0 R 3925 0 R 3925 0 R 3919 0 R 3919 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3924 0 R 3919 0 R 3919 0 R 3919 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3923 0 R 3919 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3922 0 R 3919 0 R 3921 0 R 3919 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3920 0 R 3919 0 R 3918 0 R 3902 0 R 3917 0 R 3902 0 R 3902 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3916 0 R 3902 0 R 3902 0 R 3915 0 R 3902 0 R 3902 0 R 3902 0 R 3902 0 R 3914 0 R 3902 0 R 3902 0 R 3913 0 R 3902 0 R 3902 0 R 3912 0 R 3902 0 R 3911 0 R 3902 0 R 3910 0 R 3902 0 R 3909 0 R 3902 0 R 3902 0 R 3908 0 R 3902 0 R 3907 0 R 3902 0 R 3902 0 R 3902 0 R 3906 0 R 3902 0 R 3902 0 R 3902 0 R 3905 0 R 3902 0 R 3904 0 R 3902 0 R 3902 0 R 3902 0 R 3902 0 R 3902 0 R 3903 0 R 3902 0 R 3902 0 R 3901 0 R 3901 0 R 3897 0 R 3897 0 R 3900 0 R 3897 0 R 3897 0 R 3899 0 R 3897 0 R 3897 0 R 3897 0 R 3898 0 R 3897 0 R 3896 0 R 3895 0 R 3894 0 R 3894 0 R 3894 0 R 3894 0 R 3894 0 R 3892 0 R 3891 0 R 3890 0 R 3890 0 R 3890 0 R 3890 0 R 3887 0 R 3887 0 R 3887 0 R 3887 0 R 3887 0 R 3887 0 R 3887 0 R 3885 0 R 3885 0 R 3885 0 R 3885 0 R 3885 0 R 3886 0 R 3885 0 R] -endobj - -63 0 obj -[3884 0 R 3884 0 R 3880 0 R 3883 0 R 3880 0 R 3880 0 R 3880 0 R 3882 0 R 3880 0 R 3880 0 R 3881 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3880 0 R 3879 0 R 3879 0 R 3878 0 R 3875 0 R 3875 0 R 3875 0 R 3875 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3877 0 R 3875 0 R 3875 0 R 3875 0 R 3875 0 R 3876 0 R 3875 0 R 3875 0 R 3874 0 R 3874 0 R 3863 0 R 3873 0 R 3873 0 R 3873 0 R 3873 0 R 3873 0 R 3873 0 R 3863 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3872 0 R 3863 0 R 3871 0 R 3863 0 R 3863 0 R 3870 0 R 3863 0 R 3869 0 R 3869 0 R 3869 0 R 3863 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3868 0 R 3863 0 R 3867 0 R 3863 0 R 3863 0 R 3866 0 R 3863 0 R 3865 0 R 3865 0 R 3865 0 R 3865 0 R 3865 0 R 3865 0 R 3865 0 R 3863 0 R 3863 0 R 3864 0 R 3863 0 R 3862 0 R 3861 0 R 3860 0 R 3858 0 R 3857 0 R 3854 0 R 3856 0 R 3856 0 R 3854 0 R 3855 0 R 3854 0 R 3852 0 R 3851 0 R 3848 0 R 3850 0 R 3850 0 R 3850 0 R 3850 0 R 3848 0 R 3849 0 R 3849 0 R 3849 0 R 3849 0 R 3849 0 R 3849 0 R 3848 0 R 3848 0 R 3848 0 R 3840 0 R 3845 0 R 3840 0 R 3840 0 R 3840 0 R 3840 0 R 3844 0 R 3840 0 R 3843 0 R 3843 0 R 3840 0 R 3842 0 R 3842 0 R 3840 0 R 3840 0 R 3840 0 R 3841 0 R 3840 0 R 3840 0 R 3839 0 R 3838 0 R 3838 0 R 3838 0 R 3835 0 R 3837 0 R 3835 0 R 3836 0 R 3835 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3834 0 R 3832 0 R 3833 0 R 3833 0 R 3833 0 R 3833 0 R 3833 0 R 3832 0 R] -endobj - -64 0 obj -[3831 0 R 3830 0 R 3830 0 R 3830 0 R 3829 0 R 3827 0 R 3826 0 R 3826 0 R 3826 0 R 3826 0 R 3825 0 R 3821 0 R 3822 0 R 3822 0 R 3822 0 R 3822 0 R 3822 0 R 3822 0 R 3822 0 R 3821 0 R 3817 0 R 3819 0 R 3817 0 R 3818 0 R 3818 0 R 3817 0 R 3817 0 R 3816 0 R 3816 0 R 3816 0 R 3812 0 R 3815 0 R 3815 0 R 3812 0 R 3814 0 R 3814 0 R 3812 0 R 3813 0 R 3813 0 R 3813 0 R 3812 0 R 3811 0 R 3811 0 R 3809 0 R 3807 0 R 3807 0 R 3807 0 R 3807 0 R 3807 0 R 3805 0 R 3803 0 R 3803 0 R 3801 0 R 3799 0 R 3799 0 R 3797 0 R 3797 0 R 3795 0 R 3793 0 R 3791 0 R 3789 0 R 3789 0 R 3789 0 R 3789 0 R 3789 0 R 3787 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3785 0 R 3765 0 R 3781 0 R 3781 0 R 3781 0 R 3781 0 R 3765 0 R 3780 0 R 3765 0 R 3765 0 R 3779 0 R 3779 0 R 3765 0 R 3778 0 R 3778 0 R 3778 0 R 3778 0 R 3778 0 R 3765 0 R 3777 0 R 3777 0 R 3777 0 R 3777 0 R 3777 0 R 3765 0 R 3776 0 R 3765 0 R 3775 0 R 3765 0 R 3774 0 R 3765 0 R 3773 0 R 3773 0 R 3773 0 R 3773 0 R 3773 0 R 3765 0 R 3772 0 R 3772 0 R 3765 0 R 3765 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3771 0 R 3765 0 R 3770 0 R 3770 0 R 3765 0 R 3765 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3769 0 R 3765 0 R 3768 0 R 3765 0 R 3767 0 R 3767 0 R 3767 0 R 3767 0 R 3767 0 R 3765 0 R 3766 0 R 3766 0 R 3765 0 R 3764 0 R 3764 0 R 3764 0 R 3763 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3762 0 R 3761 0 R 3759 0 R 3758 0 R 3758 0 R 3757 0 R 3757 0 R 3756 0 R 3756 0 R 3755 0 R 3754 0 R 3753 0 R 3752 0 R 3752 0 R 3751 0 R 3751 0 R 3749 0 R 3749 0 R 3749 0 R 3745 0 R 3748 0 R 3745 0 R 3747 0 R 3745 0 R 3746 0 R 3746 0 R 3746 0 R 3746 0 R 3746 0 R 3746 0 R 3746 0 R 3745 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3744 0 R 3739 0 R 3742 0 R 3742 0 R 3739 0 R 3741 0 R 3739 0 R 3739 0 R 3740 0 R 3740 0 R 3739 0 R 3738 0 R 3738 0 R 3738 0 R 3735 0 R 3737 0 R 3737 0 R 3735 0 R 3736 0 R 3736 0 R 3735 0 R 3734 0 R 3734 0 R 3732 0 R 3730 0 R 3730 0 R 3728 0 R 3726 0 R 3726 0 R 3724 0 R 3724 0 R 3722 0 R 3720 0 R 3720 0 R 3720 0 R 3720 0 R 3720 0 R 3718 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3716 0 R 3705 0 R 3712 0 R 3705 0 R 3711 0 R 3705 0 R 3710 0 R 3705 0 R 3705 0 R 3709 0 R 3705 0 R 3708 0 R 3705 0 R 3705 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3707 0 R 3705 0 R 3705 0 R 3706 0 R 3706 0 R 3705 0 R 3704 0 R 3704 0 R 3703 0 R 3703 0 R 3702 0 R 3702 0 R 3702 0 R 3701 0 R 3701 0 R 3701 0 R 3700 0 R 3699 0 R 3698 0 R 3697 0 R 3696 0 R 3695 0 R 3694 0 R 3693 0 R 3692 0 R 3692 0 R 3691 0 R 3691 0 R 3690 0 R 3690 0 R 3689 0 R 3689 0 R] -endobj - -65 0 obj -[3687 0 R 3687 0 R 3683 0 R 3686 0 R 3683 0 R 3685 0 R 3683 0 R 3683 0 R 3683 0 R 3684 0 R 3683 0 R 3683 0 R 3683 0 R 3682 0 R 3678 0 R 3681 0 R 3678 0 R 3678 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3680 0 R 3678 0 R 3679 0 R 3679 0 R 3679 0 R 3679 0 R 3678 0 R 3676 0 R 3672 0 R 3675 0 R 3675 0 R 3672 0 R 3672 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3674 0 R 3672 0 R 3673 0 R 3673 0 R 3673 0 R 3673 0 R 3673 0 R 3673 0 R 3672 0 R 3666 0 R 3666 0 R 3666 0 R 3669 0 R 3669 0 R 3666 0 R 3668 0 R 3668 0 R 3666 0 R 3667 0 R 3667 0 R 3667 0 R 3666 0 R 3665 0 R 3665 0 R 3665 0 R 3662 0 R 3664 0 R 3664 0 R 3662 0 R 3663 0 R 3663 0 R 3663 0 R 3662 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3661 0 R 3658 0 R 3660 0 R 3660 0 R 3660 0 R 3660 0 R 3658 0 R 3659 0 R 3659 0 R 3659 0 R 3659 0 R 3659 0 R 3658 0 R 3657 0 R 3656 0 R 3656 0 R 3656 0 R 3655 0 R 3653 0 R 3652 0 R 3652 0 R 3652 0 R 3652 0 R 3652 0 R 3651 0 R 3646 0 R 3647 0 R 3647 0 R 3647 0 R 3647 0 R 3647 0 R 3647 0 R 3646 0 R 3646 0 R 3646 0 R 3646 0 R 3645 0 R 3644 0 R 3644 0 R 3644 0 R 3643 0 R 3642 0 R 3642 0 R 3641 0 R 3641 0 R 3640 0 R 3639 0 R 3638 0 R 3638 0 R 3632 0 R 3636 0 R 3636 0 R 3632 0 R 3635 0 R 3635 0 R 3635 0 R 3632 0 R 3634 0 R 3634 0 R 3632 0 R 3633 0 R 3633 0 R 3633 0 R 3632 0 R 3631 0 R 3631 0 R 3631 0 R 3629 0 R 3630 0 R 3630 0 R 3629 0 R 3628 0 R 3628 0 R 3626 0 R 3624 0 R 3624 0 R 3622 0 R 3620 0 R 3620 0 R 3618 0 R 3616 0 R 3616 0 R 3616 0 R 3614 0 R 3614 0 R 3612 0 R 3610 0 R 3608 0 R 3606 0 R 3606 0 R 3606 0 R 3606 0 R 3606 0 R 3604 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3602 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3601 0 R 3595 0 R 3597 0 R 3597 0 R 3595 0 R 3596 0 R 3596 0 R 3596 0 R 3595 0 R 3595 0 R] -endobj - -66 0 obj -[3594 0 R 3593 0 R 3593 0 R 3592 0 R 3592 0 R 3592 0 R 3591 0 R 3591 0 R 3591 0 R 3591 0 R 3590 0 R 3589 0 R 3589 0 R 3588 0 R 3588 0 R 3587 0 R 3587 0 R 3586 0 R 3586 0 R 3585 0 R 3585 0 R 3584 0 R 3584 0 R 3578 0 R 3583 0 R 3582 0 R 3581 0 R 3581 0 R 3580 0 R 3580 0 R 3579 0 R 3579 0 R 3579 0 R 3577 0 R 3577 0 R 3577 0 R 3576 0 R 3575 0 R 3574 0 R 3573 0 R 3573 0 R 3572 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3571 0 R 3570 0 R 3567 0 R 3568 0 R 3568 0 R 3567 0 R 3567 0 R 3566 0 R 3566 0 R 3566 0 R 3563 0 R 3565 0 R 3565 0 R 3565 0 R 3565 0 R 3565 0 R 3565 0 R 3563 0 R 3564 0 R 3564 0 R 3564 0 R 3563 0 R 3562 0 R 3562 0 R 3562 0 R 3560 0 R 3558 0 R 3556 0 R 3554 0 R 3554 0 R 3552 0 R 3552 0 R 3552 0 R 3550 0 R 3548 0 R 3546 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3544 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3543 0 R 3542 0 R 3542 0 R 3542 0 R 3542 0 R 3542 0 R 3542 0 R 3542 0 R 3538 0 R 3538 0 R 3538 0 R 3537 0 R 3536 0 R 3535 0 R 3534 0 R 3534 0 R 3533 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3532 0 R 3531 0 R 3528 0 R 3529 0 R 3528 0 R 3527 0 R 3527 0 R 3527 0 R 3523 0 R 3526 0 R 3523 0 R 3525 0 R 3523 0 R 3524 0 R 3524 0 R 3524 0 R 3524 0 R 3524 0 R 3524 0 R 3524 0 R 3523 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3522 0 R 3513 0 R 3520 0 R 3513 0 R 3519 0 R 3519 0 R 3519 0 R 3513 0 R 3513 0 R 3518 0 R 3513 0 R 3517 0 R 3517 0 R 3513 0 R 3516 0 R 3513 0 R 3513 0 R 3513 0 R 3513 0 R 3515 0 R 3513 0 R 3514 0 R 3513 0 R 3513 0 R 3506 0 R 3512 0 R 3506 0 R 3511 0 R 3511 0 R 3511 0 R 3511 0 R 3511 0 R 3511 0 R 3511 0 R 3506 0 R 3510 0 R 3506 0 R 3509 0 R 3506 0 R 3506 0 R 3506 0 R 3506 0 R 3508 0 R 3506 0 R 3506 0 R 3507 0 R 3506 0 R 3505 0 R 3505 0 R 3504 0 R 3502 0 R 3502 0 R 3502 0 R] -endobj - -67 0 obj -[3502 0 R 3502 0 R 3502 0 R 3502 0 R 3502 0 R 3502 0 R 3503 0 R 3502 0 R 3502 0 R 3502 0 R 3502 0 R 3501 0 R 3501 0 R 3498 0 R 3498 0 R 3500 0 R 3498 0 R 3499 0 R 3498 0 R 3498 0 R 3498 0 R 3498 0 R 3497 0 R 3497 0 R 3497 0 R 3494 0 R 3496 0 R 3496 0 R 3496 0 R 3496 0 R 3496 0 R 3494 0 R 3495 0 R 3494 0 R 3494 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3493 0 R 3489 0 R 3492 0 R 3492 0 R 3492 0 R 3489 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3491 0 R 3489 0 R 3490 0 R 3490 0 R 3489 0 R 3489 0 R 3488 0 R 3487 0 R 3487 0 R 3487 0 R 3487 0 R 3485 0 R 3486 0 R 3486 0 R 3486 0 R 3486 0 R 3486 0 R 3486 0 R 3485 0 R 3483 0 R 3482 0 R 3482 0 R 3482 0 R 3482 0 R 3482 0 R 3482 0 R 3480 0 R 3481 0 R 3481 0 R 3481 0 R 3481 0 R 3481 0 R 3481 0 R 3480 0 R 3478 0 R 3477 0 R 3477 0 R 3477 0 R 3475 0 R 3476 0 R 3476 0 R 3476 0 R 3476 0 R 3476 0 R 3476 0 R 3475 0 R 3473 0 R 3472 0 R 3472 0 R 3472 0 R 3472 0 R 3472 0 R 3472 0 R 3471 0 R 3462 0 R 3467 0 R 3462 0 R 3466 0 R 3462 0 R 3462 0 R 3465 0 R 3465 0 R 3462 0 R 3462 0 R 3462 0 R 3464 0 R 3464 0 R 3464 0 R 3464 0 R 3464 0 R 3464 0 R 3462 0 R 3463 0 R 3463 0 R 3463 0 R 3463 0 R 3463 0 R 3463 0 R 3462 0 R 3461 0 R 3461 0 R 3461 0 R 3457 0 R 3460 0 R 3457 0 R 3459 0 R 3457 0 R 3458 0 R 3457 0 R 3456 0 R 3454 0 R 3452 0 R 3452 0 R 3452 0 R 3452 0 R 3452 0 R 3450 0 R 3448 0 R 3446 0 R 3444 0 R 3444 0 R 3442 0 R 3440 0 R 3438 0 R 3436 0 R 3434 0 R 3432 0 R 3430 0 R 3430 0 R 3430 0 R 3430 0 R 3428 0 R 3426 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3424 0 R 3422 0 R 3420 0 R 3418 0 R 3416 0 R 3416 0 R 3416 0 R 3416 0 R 3416 0 R 3416 0 R 3416 0 R 3414 0 R 3412 0 R 3410 0 R 3410 0 R 3410 0 R 3410 0 R 3410 0 R 3408 0 R 3406 0 R 3404 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3402 0 R 3395 0 R 3399 0 R 3399 0 R 3399 0 R 3399 0 R 3395 0 R 3398 0 R 3398 0 R 3398 0 R 3398 0 R 3398 0 R 3398 0 R 3395 0 R 3397 0 R 3397 0 R 3397 0 R 3397 0 R 3397 0 R 3397 0 R 3395 0 R 3396 0 R 3396 0 R 3396 0 R 3396 0 R 3396 0 R 3396 0 R 3395 0 R 3389 0 R 3393 0 R 3393 0 R 3393 0 R 3393 0 R 3393 0 R 3393 0 R 3389 0 R 3392 0 R 3392 0 R 3389 0 R 3389 0 R 3391 0 R 3389 0 R 3390 0 R 3390 0 R 3389 0 R 3389 0 R 3389 0 R 3389 0 R 3388 0 R 3388 0 R 3384 0 R 3384 0 R] -endobj - -68 0 obj -[3384 0 R 3384 0 R 3384 0 R 3384 0 R 3384 0 R 3387 0 R 3384 0 R 3384 0 R 3386 0 R 3386 0 R 3386 0 R 3384 0 R 3385 0 R 3384 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3383 0 R 3380 0 R 3382 0 R 3382 0 R 3382 0 R 3382 0 R 3380 0 R 3381 0 R 3380 0 R 3380 0 R 3380 0 R 3380 0 R 3379 0 R 3379 0 R 3379 0 R 3377 0 R 3378 0 R 3377 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3376 0 R 3375 0 R 3369 0 R 3369 0 R 3373 0 R 3369 0 R 3372 0 R 3372 0 R 3369 0 R 3371 0 R 3371 0 R 3371 0 R 3371 0 R 3369 0 R 3370 0 R 3369 0 R 3369 0 R 3369 0 R 3368 0 R 3368 0 R 3368 0 R 3365 0 R 3367 0 R 3367 0 R 3367 0 R 3365 0 R 3366 0 R 3366 0 R 3366 0 R 3366 0 R 3366 0 R 3366 0 R 3365 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3364 0 R 3360 0 R 3362 0 R 3362 0 R 3362 0 R 3360 0 R 3360 0 R 3360 0 R 3360 0 R 3360 0 R 3361 0 R 3360 0 R 3341 0 R 3359 0 R 3341 0 R 3358 0 R 3341 0 R 3357 0 R 3341 0 R 3341 0 R 3356 0 R 3341 0 R 3355 0 R 3355 0 R 3355 0 R 3355 0 R 3355 0 R 3355 0 R 3341 0 R 3354 0 R 3341 0 R 3353 0 R 3353 0 R 3353 0 R 3353 0 R 3341 0 R 3352 0 R 3341 0 R 3351 0 R 3341 0 R 3350 0 R 3341 0 R 3349 0 R 3349 0 R 3349 0 R 3349 0 R 3341 0 R 3348 0 R 3348 0 R 3348 0 R 3348 0 R 3348 0 R 3348 0 R 3341 0 R 3347 0 R 3341 0 R 3346 0 R 3341 0 R 3345 0 R 3345 0 R 3345 0 R 3345 0 R 3341 0 R 3344 0 R 3341 0 R 3343 0 R 3341 0 R 3341 0 R 3342 0 R 3341 0 R 3341 0 R 3341 0 R 3340 0 R 3340 0 R 3336 0 R 3339 0 R 3336 0 R 3336 0 R 3336 0 R 3338 0 R 3336 0 R 3336 0 R 3337 0 R 3336 0 R 3336 0 R] -endobj - -69 0 obj -[3335 0 R 3333 0 R 3334 0 R 3333 0 R 3333 0 R 3333 0 R 3333 0 R 3332 0 R 3332 0 R 3332 0 R 3331 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3330 0 R 3328 0 R 3329 0 R 3329 0 R 3329 0 R 3329 0 R 3329 0 R 3328 0 R 3327 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3326 0 R 3325 0 R 3323 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3322 0 R 3321 0 R 3321 0 R 3321 0 R 3313 0 R 3313 0 R 3317 0 R 3313 0 R 3316 0 R 3316 0 R 3316 0 R 3316 0 R 3313 0 R 3313 0 R 3315 0 R 3313 0 R 3314 0 R 3314 0 R 3314 0 R 3314 0 R 3313 0 R 3312 0 R 3312 0 R 3312 0 R 3307 0 R 3311 0 R 3307 0 R 3310 0 R 3307 0 R 3309 0 R 3307 0 R 3308 0 R 3308 0 R 3307 0 R 3306 0 R 3304 0 R 3302 0 R 3302 0 R 3302 0 R 3302 0 R 3302 0 R 3300 0 R 3298 0 R 3298 0 R 3296 0 R 3294 0 R 3294 0 R 3294 0 R 3294 0 R 3294 0 R 3292 0 R 3290 0 R 3288 0 R 3286 0 R 3284 0 R 3284 0 R 3284 0 R 3284 0 R 3284 0 R 3282 0 R 3280 0 R 3280 0 R 3280 0 R 3280 0 R 3280 0 R 3280 0 R 3280 0 R 3278 0 R 3276 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3274 0 R 3272 0 R 3270 0 R 3270 0 R 3268 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3266 0 R 3264 0 R 3262 0 R 3260 0 R 3260 0 R 3260 0 R 3260 0 R 3260 0 R 3258 0 R 3256 0 R 3256 0 R 3256 0 R 3256 0 R 3256 0 R 3254 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3252 0 R 3250 0 R 3248 0 R 3246 0 R 3246 0 R 3246 0 R 3244 0 R 3242 0 R 3242 0 R 3240 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3238 0 R 3236 0 R 3234 0 R 3232 0 R 3232 0 R 3232 0 R 3232 0 R 3232 0 R 3230 0 R 3228 0 R 3228 0 R 3228 0 R 3228 0 R 3228 0 R 3226 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3224 0 R 3219 0 R 3219 0 R 3219 0 R 3219 0 R 3219 0 R 3219 0 R 3220 0 R 3220 0 R 3220 0 R 3219 0 R 3218 0 R 3216 0 R 3217 0 R 3216 0 R 3216 0 R 3216 0 R 3216 0 R 3215 0 R 3215 0 R 3215 0 R 3214 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3213 0 R 3195 0 R 3212 0 R 3212 0 R 3195 0 R 3211 0 R 3211 0 R 3211 0 R 3211 0 R 3211 0 R 3195 0 R 3210 0 R 3195 0 R 3209 0 R 3195 0 R 3195 0 R 3208 0 R 3208 0 R 3195 0 R 3207 0 R 3195 0 R 3206 0 R 3195 0 R 3205 0 R 3195 0 R 3204 0 R 3204 0 R 3195 0 R 3203 0 R 3203 0 R 3195 0 R 3202 0 R 3202 0 R 3202 0 R 3202 0 R 3195 0 R 3201 0 R 3195 0 R 3195 0 R 3200 0 R 3200 0 R 3200 0 R 3200 0 R 3195 0 R 3199 0 R 3199 0 R 3199 0 R 3199 0 R 3195 0 R 3195 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3198 0 R 3195 0 R 3197 0 R 3197 0 R 3195 0 R 3196 0 R 3196 0 R 3195 0 R 3193 0 R 3193 0 R 3193 0 R 3188 0 R 3192 0 R 3188 0 R 3191 0 R 3188 0 R 3190 0 R 3188 0 R 3189 0 R 3189 0 R 3188 0 R] -endobj - -70 0 obj -[3187 0 R 3185 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3183 0 R 3181 0 R 3179 0 R 3179 0 R 3177 0 R 3175 0 R 3175 0 R 3173 0 R 3171 0 R 3169 0 R 3169 0 R 3169 0 R 3169 0 R 3169 0 R 3167 0 R 3165 0 R 3165 0 R 3165 0 R 3165 0 R 3165 0 R 3163 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3161 0 R 3159 0 R 3157 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3155 0 R 3153 0 R 3151 0 R 3151 0 R 3149 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3147 0 R 3145 0 R 3143 0 R 3141 0 R 3141 0 R 3141 0 R 3141 0 R 3141 0 R 3139 0 R 3137 0 R 3137 0 R 3137 0 R 3137 0 R 3137 0 R 3135 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3133 0 R 3131 0 R 3129 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3127 0 R 3125 0 R 3123 0 R 3123 0 R 3121 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3119 0 R 3117 0 R 3115 0 R 3113 0 R 3113 0 R 3113 0 R 3113 0 R 3113 0 R 3111 0 R 3109 0 R 3109 0 R 3109 0 R 3109 0 R 3109 0 R 3107 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3105 0 R 3095 0 R 3101 0 R 3095 0 R 3100 0 R 3095 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3099 0 R 3095 0 R 3098 0 R 3095 0 R 3095 0 R 3095 0 R 3097 0 R 3097 0 R 3097 0 R 3097 0 R 3095 0 R 3095 0 R 3095 0 R 3095 0 R 3096 0 R 3095 0 R 3094 0 R 3094 0 R 3090 0 R 3090 0 R 3090 0 R 3093 0 R 3090 0 R 3092 0 R 3090 0 R 3090 0 R 3091 0 R 3090 0 R 3089 0 R 3089 0 R 3089 0 R 3086 0 R 3088 0 R 3086 0 R 3087 0 R 3086 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3085 0 R 3083 0 R 3084 0 R 3084 0 R 3084 0 R 3084 0 R 3084 0 R 3083 0 R 3082 0 R 3081 0 R 3081 0 R 3081 0 R 3081 0 R 3080 0 R 3080 0 R 3080 0 R 3078 0 R 3077 0 R 3077 0 R 3077 0 R 3077 0 R 3076 0 R 3062 0 R 3072 0 R 3062 0 R 3062 0 R 3062 0 R 3071 0 R 3062 0 R 3062 0 R 3062 0 R 3070 0 R 3070 0 R 3070 0 R 3062 0 R 3069 0 R 3062 0 R 3068 0 R 3062 0 R 3062 0 R 3067 0 R 3062 0 R 3066 0 R 3062 0 R 3062 0 R 3065 0 R 3062 0 R 3064 0 R 3062 0 R 3062 0 R 3062 0 R 3063 0 R 3062 0 R 3062 0 R 3059 0 R 3058 0 R 3057 0 R 3056 0 R 3061 0 R 3052 0 R 3052 0 R 3039 0 R 3051 0 R 3039 0 R 3039 0 R 3050 0 R 3039 0 R 3049 0 R 3049 0 R] -endobj - -71 0 obj -[3049 0 R 3039 0 R 3048 0 R 3039 0 R 3047 0 R 3047 0 R 3039 0 R 3046 0 R 3039 0 R 3045 0 R 3039 0 R 3039 0 R 3044 0 R 3039 0 R 3043 0 R 3043 0 R 3043 0 R 3043 0 R 3043 0 R 3043 0 R 3039 0 R 3042 0 R 3039 0 R 3039 0 R 3041 0 R 3039 0 R 3039 0 R 3040 0 R 3039 0 R 3032 0 R 3038 0 R 3032 0 R 3032 0 R 3037 0 R 3032 0 R 3032 0 R 3036 0 R 3032 0 R 3032 0 R 3035 0 R 3032 0 R 3032 0 R 3032 0 R 3032 0 R 3034 0 R 3032 0 R 3033 0 R 3032 0 R 3031 0 R 3031 0 R 3031 0 R 3024 0 R 3030 0 R 3024 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3029 0 R 3024 0 R 3028 0 R 3028 0 R 3024 0 R 3024 0 R 3024 0 R 3027 0 R 3024 0 R 3026 0 R 3024 0 R 3024 0 R 3025 0 R 3024 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3023 0 R 3018 0 R 3022 0 R 3018 0 R 3018 0 R 3021 0 R 3021 0 R 3018 0 R 3020 0 R 3020 0 R 3020 0 R 3018 0 R 3019 0 R 3019 0 R 3018 0 R 3010 0 R 3016 0 R 3016 0 R 3010 0 R 3015 0 R 3010 0 R 3010 0 R 3014 0 R 3014 0 R 3014 0 R 3014 0 R 3014 0 R 3010 0 R 3013 0 R 3010 0 R 3010 0 R 3012 0 R 3012 0 R 3012 0 R 3010 0 R 3011 0 R 3010 0 R 3009 0 R 3009 0 R 3009 0 R 3007 0 R 3005 0 R 3005 0 R 3003 0 R 3001 0 R 3001 0 R 2999 0 R 2997 0 R 2997 0 R 2997 0 R 2995 0 R 2995 0 R 2995 0 R 2993 0 R 2991 0 R 2989 0 R 2987 0 R 2987 0 R 2987 0 R 2987 0 R 2987 0 R 2985 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2983 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2982 0 R 2977 0 R 2979 0 R 2977 0 R 2977 0 R 2978 0 R 2977 0 R 2976 0 R 2976 0 R 2972 0 R 2975 0 R 2972 0 R 2974 0 R 2972 0 R 2972 0 R 2973 0 R 2972 0 R 2972 0 R 2971 0 R 2971 0 R 2971 0 R 2968 0 R 2970 0 R 2970 0 R 2970 0 R 2968 0 R 2969 0 R 2969 0 R 2969 0 R 2969 0 R 2968 0 R 2968 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2967 0 R 2964 0 R 2966 0 R 2966 0 R 2966 0 R 2966 0 R 2964 0 R 2965 0 R 2965 0 R 2965 0 R 2965 0 R 2965 0 R 2965 0 R 2965 0 R 2964 0 R 2963 0 R 2962 0 R 2961 0 R 2959 0 R 2958 0 R 2957 0 R 2955 0 R 2954 0 R 2953 0 R] -endobj - -72 0 obj -[2950 0 R 2949 0 R 2948 0 R 2946 0 R 2945 0 R 2945 0 R 2945 0 R 2945 0 R 2944 0 R 2937 0 R 2939 0 R 2939 0 R 2939 0 R 2937 0 R 2938 0 R 2938 0 R 2937 0 R 2937 0 R 2936 0 R 2936 0 R 2936 0 R 2934 0 R 2935 0 R 2935 0 R 2935 0 R 2934 0 R 2933 0 R 2933 0 R 2933 0 R 2931 0 R 2929 0 R 2929 0 R 2929 0 R 2927 0 R 2925 0 R 2925 0 R 2923 0 R 2921 0 R 2921 0 R 2921 0 R 2919 0 R 2919 0 R 2919 0 R 2917 0 R 2915 0 R 2913 0 R 2911 0 R 2911 0 R 2911 0 R 2911 0 R 2911 0 R 2909 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2907 0 R 2906 0 R 2906 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2905 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2904 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2903 0 R 2896 0 R 2899 0 R 2896 0 R 2898 0 R 2896 0 R 2896 0 R 2896 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2897 0 R 2896 0 R 2889 0 R 2895 0 R 2889 0 R 2889 0 R 2889 0 R 2894 0 R 2893 0 R 2893 0 R 2893 0 R 2893 0 R 2889 0 R 2889 0 R 2892 0 R 2889 0 R 2889 0 R 2889 0 R 2891 0 R 2889 0 R 2889 0 R 2890 0 R 2889 0 R 2889 0 R 2889 0 R 2889 0 R 2886 0 R 2885 0 R 2884 0 R 2883 0 R 2888 0 R 2877 0 R 2879 0 R 2879 0 R 2877 0 R 2878 0 R 2877 0 R 2877 0 R 2877 0 R 2868 0 R 2876 0 R 2876 0 R 2876 0 R 2868 0 R 2868 0 R 2875 0 R 2868 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2874 0 R 2868 0 R 2868 0 R 2873 0 R 2873 0 R 2873 0 R 2873 0 R 2873 0 R 2873 0 R 2873 0 R 2868 0 R 2872 0 R 2868 0 R 2871 0 R 2868 0 R 2870 0 R 2868 0 R 2869 0 R 2868 0 R 2868 0 R 2868 0 R 2868 0 R 2867 0 R 2867 0 R 2854 0 R 2866 0 R 2854 0 R 2865 0 R 2854 0 R 2864 0 R 2854 0 R 2863 0 R 2854 0 R 2862 0 R 2854 0 R 2861 0 R 2854 0 R 2860 0 R 2854 0 R 2854 0 R 2859 0 R 2854 0 R 2858 0 R 2854 0 R 2857 0 R 2854 0 R 2856 0 R 2854 0 R 2855 0 R 2854 0 R] -endobj - -73 0 obj -[2850 0 R 2853 0 R 2850 0 R 2850 0 R 2852 0 R 2852 0 R 2852 0 R 2852 0 R 2852 0 R 2852 0 R 2850 0 R 2851 0 R 2850 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2849 0 R 2845 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2848 0 R 2845 0 R 2847 0 R 2845 0 R 2846 0 R 2846 0 R 2845 0 R 2840 0 R 2844 0 R 2844 0 R 2840 0 R 2843 0 R 2843 0 R 2840 0 R 2840 0 R 2842 0 R 2842 0 R 2840 0 R 2841 0 R 2841 0 R 2840 0 R 2840 0 R 2840 0 R 2834 0 R 2839 0 R 2834 0 R 2838 0 R 2834 0 R 2834 0 R 2834 0 R 2837 0 R 2834 0 R 2836 0 R 2834 0 R 2835 0 R 2834 0 R 2831 0 R 2830 0 R 2829 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2828 0 R 2827 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2826 0 R 2825 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2824 0 R 2823 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2822 0 R 2821 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2820 0 R 2819 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2818 0 R 2833 0 R 2814 0 R 2814 0 R 2811 0 R 2811 0 R 2811 0 R 2813 0 R 2813 0 R 2813 0 R 2813 0 R 2811 0 R 2811 0 R 2812 0 R 2811 0 R 2811 0 R 2811 0 R 2803 0 R 2810 0 R 2803 0 R 2809 0 R 2803 0 R 2803 0 R 2808 0 R 2803 0 R 2803 0 R 2803 0 R 2807 0 R 2803 0 R 2806 0 R 2803 0 R 2803 0 R 2803 0 R 2805 0 R 2803 0 R 2803 0 R 2804 0 R 2803 0 R] -endobj - -74 0 obj -[2800 0 R 2799 0 R 2798 0 R 2797 0 R 2802 0 R 2793 0 R 2792 0 R 2784 0 R 2791 0 R 2784 0 R 2790 0 R 2784 0 R 2789 0 R 2784 0 R 2784 0 R 2788 0 R 2784 0 R 2787 0 R 2784 0 R 2786 0 R 2784 0 R 2784 0 R 2785 0 R 2784 0 R 2782 0 R 2775 0 R 2781 0 R 2775 0 R 2780 0 R 2775 0 R 2779 0 R 2775 0 R 2775 0 R 2775 0 R 2778 0 R 2775 0 R 2777 0 R 2775 0 R 2775 0 R 2776 0 R 2775 0 R 2773 0 R 2772 0 R 2772 0 R 2769 0 R 2769 0 R 2769 0 R 2769 0 R 2768 0 R 2768 0 R 2765 0 R 2767 0 R 2765 0 R 2766 0 R 2765 0 R 2765 0 R 2765 0 R 2765 0 R 2764 0 R 2764 0 R 2759 0 R 2763 0 R 2759 0 R 2762 0 R 2762 0 R 2759 0 R 2761 0 R 2759 0 R 2759 0 R 2759 0 R 2760 0 R 2759 0 R 2758 0 R 2758 0 R 2758 0 R 2756 0 R 2757 0 R 2757 0 R 2756 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2755 0 R 2754 0 R 2753 0 R 2752 0 R 2751 0 R 2749 0 R 2748 0 R 2748 0 R 2748 0 R 2747 0 R 2745 0 R 2744 0 R 2743 0 R 2729 0 R 2739 0 R 2729 0 R 2738 0 R 2738 0 R 2729 0 R 2737 0 R 2729 0 R 2729 0 R 2736 0 R 2729 0 R 2729 0 R 2729 0 R 2735 0 R 2729 0 R 2734 0 R 2729 0 R 2733 0 R 2729 0 R 2729 0 R 2732 0 R 2729 0 R 2731 0 R 2729 0 R 2729 0 R 2729 0 R 2730 0 R 2729 0 R] -endobj - -75 0 obj -[2729 0 R 2729 0 R 2728 0 R 2725 0 R 2727 0 R 2727 0 R 2725 0 R 2725 0 R 2725 0 R 2726 0 R 2725 0 R 2725 0 R 2725 0 R 2724 0 R 2723 0 R 2721 0 R 2720 0 R 2720 0 R 2718 0 R 2717 0 R 2717 0 R 2717 0 R 2717 0 R 2714 0 R 2710 0 R 2713 0 R 2713 0 R 2710 0 R 2712 0 R 2710 0 R 2710 0 R 2711 0 R 2710 0 R 2710 0 R 2709 0 R 2709 0 R 2709 0 R 2706 0 R 2708 0 R 2708 0 R 2708 0 R 2708 0 R 2708 0 R 2706 0 R 2707 0 R 2706 0 R 2705 0 R 2704 0 R 2703 0 R 2703 0 R 2701 0 R 2700 0 R 2698 0 R 2698 0 R 2699 0 R 2699 0 R 2698 0 R 2693 0 R 2693 0 R 2694 0 R 2693 0 R 2692 0 R 2692 0 R 2691 0 R 2691 0 R 2690 0 R 2686 0 R 2686 0 R 2686 0 R 2689 0 R 2686 0 R 2688 0 R 2688 0 R 2688 0 R 2688 0 R 2688 0 R 2688 0 R 2688 0 R 2686 0 R 2686 0 R 2687 0 R 2686 0 R 2686 0 R 2686 0 R 2686 0 R 2686 0 R 2686 0 R 2686 0 R 2685 0 R 2681 0 R 2681 0 R 2681 0 R 2681 0 R 2684 0 R 2681 0 R 2681 0 R 2681 0 R 2681 0 R 2681 0 R 2683 0 R 2681 0 R 2681 0 R 2681 0 R 2682 0 R 2681 0 R] -endobj - -76 0 obj -[2681 0 R 2681 0 R 2680 0 R 2680 0 R 2680 0 R 2680 0 R 2677 0 R 2677 0 R 2677 0 R 2677 0 R 2677 0 R 2679 0 R 2677 0 R 2677 0 R 2677 0 R 2678 0 R 2677 0 R 2677 0 R 2677 0 R 2677 0 R 2676 0 R 2676 0 R 2666 0 R 2675 0 R 2666 0 R 2674 0 R 2666 0 R 2666 0 R 2673 0 R 2666 0 R 2666 0 R 2666 0 R 2666 0 R 2666 0 R 2672 0 R 2666 0 R 2671 0 R 2666 0 R 2666 0 R 2670 0 R 2666 0 R 2669 0 R 2666 0 R 2666 0 R 2666 0 R 2668 0 R 2666 0 R 2667 0 R 2666 0 R 2666 0 R 2665 0 R 2665 0 R 2664 0 R 2661 0 R 2661 0 R 2661 0 R 2663 0 R 2661 0 R 2661 0 R 2662 0 R 2661 0 R 2661 0 R 2643 0 R 2660 0 R 2643 0 R 2643 0 R 2659 0 R 2643 0 R 2643 0 R 2643 0 R 2658 0 R 2643 0 R 2657 0 R 2643 0 R 2656 0 R 2643 0 R 2655 0 R 2643 0 R 2643 0 R 2654 0 R 2643 0 R 2653 0 R 2643 0 R 2643 0 R 2652 0 R 2643 0 R 2643 0 R 2643 0 R 2651 0 R 2643 0 R 2650 0 R 2643 0 R 2649 0 R 2643 0 R 2643 0 R 2648 0 R 2648 0 R 2648 0 R 2648 0 R 2648 0 R 2643 0 R 2647 0 R 2643 0 R 2646 0 R 2643 0 R 2645 0 R 2643 0 R 2644 0 R 2643 0 R 2643 0 R] -endobj - -77 0 obj -[2637 0 R 2636 0 R 2634 0 R 2632 0 R 2624 0 R 2624 0 R 2622 0 R 2621 0 R 2619 0 R 2619 0 R 2617 0 R 2618 0 R 2618 0 R 2618 0 R 2616 0 R 2614 0 R 2614 0 R 2614 0 R 2614 0 R 2614 0 R 2612 0 R 2609 0 R 2606 0 R 2608 0 R 2608 0 R 2606 0 R 2607 0 R 2607 0 R 2605 0 R 2602 0 R 2604 0 R 2602 0 R 2603 0 R 2600 0 R 2600 0 R 2600 0 R 2600 0 R 2598 0 R 2599 0 R 2599 0 R 2599 0 R 2599 0 R 2599 0 R 2599 0 R 2597 0 R 2595 0 R 2596 0 R 2593 0 R 2593 0 R 2593 0 R 2593 0 R 2593 0 R 2593 0 R 2591 0 R 2588 0 R 2588 0 R 2588 0 R 2588 0 R 2588 0 R 2588 0 R 2586 0 R 2583 0 R 2583 0 R 2581 0 R 2580 0 R 2578 0 R 2578 0 R 2578 0 R 2578 0 R 2576 0 R 2573 0 R 2573 0 R 2573 0 R 2573 0 R 2571 0 R 2568 0 R 2568 0 R 2568 0 R 2568 0 R 2568 0 R 2566 0 R 2563 0 R 2561 0 R 2560 0 R 2642 0 R 2548 0 R 2552 0 R 2548 0 R 2548 0 R 2551 0 R 2548 0 R 2548 0 R 2550 0 R 2548 0 R 2549 0 R 2548 0 R 2547 0 R 2547 0 R 2536 0 R 2546 0 R 2536 0 R 2536 0 R 2545 0 R 2536 0 R 2536 0 R 2544 0 R 2536 0 R 2536 0 R 2536 0 R 2543 0 R 2536 0 R 2542 0 R 2542 0 R 2542 0 R 2536 0 R 2541 0 R 2536 0 R 2536 0 R 2540 0 R 2540 0 R 2540 0 R 2536 0 R 2539 0 R 2539 0 R 2539 0 R 2539 0 R 2536 0 R 2536 0 R 2538 0 R 2538 0 R 2536 0 R 2537 0 R 2537 0 R 2537 0 R 2536 0 R 2536 0 R 2536 0 R 2535 0 R 2529 0 R 2534 0 R 2529 0 R 2533 0 R 2533 0 R 2533 0 R 2529 0 R 2532 0 R 2529 0 R 2531 0 R 2529 0 R 2530 0 R 2529 0 R 2528 0 R 2527 0 R 2525 0 R 2523 0 R 2522 0 R 2520 0 R 2516 0 R 2515 0 R 2514 0 R 2512 0 R 2509 0 R 2508 0 R 2507 0 R 2505 0 R 2502 0 R 2501 0 R 2499 0 R 2494 0 R 2493 0 R 2491 0 R 2492 0 R 2491 0 R 2489 0 R 2485 0 R 2483 0 R 2484 0 R 2483 0 R 2482 0 R 2481 0 R 2479 0 R 2475 0 R 2472 0 R 2474 0 R 2472 0 R 2473 0 R 2470 0 R 2467 0 R 2466 0 R 2464 0 R 2462 0 R 2461 0 R 2459 0 R 2455 0 R 2454 0 R 2453 0 R] -endobj - -78 0 obj -[2451 0 R 2448 0 R 2447 0 R 2446 0 R 2445 0 R 2444 0 R 2442 0 R 2439 0 R 2438 0 R 2436 0 R 2431 0 R 2428 0 R 2430 0 R 2428 0 R 2429 0 R 2426 0 R 2422 0 R 2421 0 R 2420 0 R 2418 0 R 2414 0 R 2413 0 R 2411 0 R 2412 0 R 2411 0 R 2409 0 R 2405 0 R 2403 0 R 2400 0 R 2399 0 R 2398 0 R 2396 0 R 2393 0 R 2392 0 R 2378 0 R 2387 0 R 2378 0 R 2386 0 R 2386 0 R 2386 0 R 2378 0 R 2385 0 R 2378 0 R 2378 0 R 2378 0 R 2384 0 R 2378 0 R 2378 0 R 2383 0 R 2378 0 R 2382 0 R 2381 0 R 2381 0 R 2381 0 R 2381 0 R 2378 0 R 2378 0 R 2380 0 R 2378 0 R 2379 0 R 2378 0 R 2377 0 R 2364 0 R 2376 0 R 2364 0 R 2364 0 R 2375 0 R 2364 0 R 2374 0 R 2364 0 R 2373 0 R 2364 0 R 2372 0 R 2364 0 R 2371 0 R 2364 0 R 2364 0 R 2370 0 R 2364 0 R 2364 0 R 2369 0 R 2364 0 R 2364 0 R 2368 0 R 2368 0 R 2368 0 R 2364 0 R 2367 0 R 2364 0 R 2364 0 R 2366 0 R 2364 0 R 2365 0 R 2364 0 R 2363 0 R 2363 0 R 2361 0 R 2362 0 R 2361 0 R 2361 0 R 2360 0 R 2359 0 R 2357 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2358 0 R 2357 0 R 2355 0 R 2354 0 R 2352 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2353 0 R 2352 0 R 2350 0 R 2349 0 R 2347 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2348 0 R 2347 0 R 2333 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2344 0 R 2333 0 R 2343 0 R 2333 0 R 2333 0 R 2342 0 R 2333 0 R 2341 0 R 2341 0 R 2341 0 R 2341 0 R 2333 0 R 2340 0 R 2333 0 R 2339 0 R 2339 0 R 2339 0 R 2339 0 R 2339 0 R 2339 0 R 2339 0 R 2333 0 R 2338 0 R 2333 0 R 2337 0 R 2333 0 R 2336 0 R 2333 0 R 2333 0 R 2335 0 R 2333 0 R 2333 0 R 2334 0 R 2334 0 R 2333 0 R 2332 0 R 2322 0 R 2331 0 R 2331 0 R 2331 0 R 2331 0 R 2331 0 R 2331 0 R 2322 0 R 2330 0 R 2330 0 R 2322 0 R 2329 0 R 2322 0 R 2322 0 R 2328 0 R 2322 0 R 2327 0 R 2322 0 R 2326 0 R 2322 0 R 2325 0 R 2325 0 R 2325 0 R 2325 0 R 2325 0 R 2325 0 R 2322 0 R 2322 0 R 2324 0 R 2324 0 R 2324 0 R 2324 0 R 2322 0 R 2322 0 R 2323 0 R 2322 0 R 2321 0 R 2320 0 R 2318 0 R 2316 0 R 2315 0 R 2313 0 R 2309 0 R 2308 0 R 2307 0 R 2306 0 R 2305 0 R 2305 0 R 2304 0 R 2304 0 R 2304 0 R 2304 0 R 2302 0 R 2299 0 R 2298 0 R 2297 0 R 2296 0 R 2296 0 R 2295 0 R 2295 0 R 2295 0 R 2295 0 R 2295 0 R 2295 0 R 2295 0 R] -endobj - -79 0 obj -[2293 0 R 2291 0 R 2290 0 R 2288 0 R 2284 0 R 2283 0 R 2281 0 R 2276 0 R 2275 0 R 2274 0 R 2273 0 R 2272 0 R 2272 0 R 2271 0 R 2271 0 R 2271 0 R 2271 0 R 2269 0 R 2265 0 R 2264 0 R 2263 0 R 2262 0 R 2261 0 R 2261 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2260 0 R 2258 0 R 2254 0 R 2252 0 R 2248 0 R 2246 0 R 2247 0 R 2246 0 R 2244 0 R 2238 0 R 2237 0 R 2236 0 R 2235 0 R 2235 0 R 2234 0 R 2234 0 R 2234 0 R 2234 0 R 2234 0 R 2234 0 R 2232 0 R 2227 0 R 2225 0 R 2222 0 R 2221 0 R 2216 0 R 2208 0 R 2208 0 R 2215 0 R 2208 0 R 2208 0 R 2214 0 R 2208 0 R 2213 0 R 2208 0 R 2208 0 R 2212 0 R 2208 0 R 2211 0 R 2211 0 R 2211 0 R 2208 0 R 2210 0 R 2208 0 R 2208 0 R 2209 0 R 2208 0 R 2207 0 R 2206 0 R 2204 0 R 2202 0 R 2201 0 R 2199 0 R 2195 0 R 2192 0 R 2194 0 R 2192 0 R 2193 0 R 2190 0 R 2185 0 R 2182 0 R 2184 0 R 2182 0 R 2183 0 R 2180 0 R 2174 0 R 2173 0 R 2172 0 R 2170 0 R 2171 0 R 2170 0 R 2169 0 R 2168 0 R 2167 0 R 2166 0 R 2165 0 R 2163 0 R 2164 0 R 2161 0 R 2154 0 R 2152 0 R 2146 0 R 2141 0 R 2128 0 R 2128 0 R 2140 0 R 2128 0 R 2128 0 R 2139 0 R 2128 0 R 2138 0 R 2128 0 R 2137 0 R 2128 0 R 2128 0 R 2136 0 R 2128 0 R 2135 0 R 2128 0 R 2128 0 R 2134 0 R 2128 0 R 2128 0 R 2133 0 R 2128 0 R 2132 0 R 2128 0 R 2131 0 R 2128 0 R 2130 0 R 2128 0 R 2128 0 R 2129 0 R 2128 0 R 2128 0 R 2127 0 R 2127 0 R 2117 0 R 2126 0 R 2117 0 R 2125 0 R 2117 0 R 2124 0 R 2117 0 R 2123 0 R 2117 0 R 2117 0 R 2122 0 R 2117 0 R 2121 0 R 2117 0 R 2117 0 R 2120 0 R 2120 0 R 2117 0 R 2119 0 R 2117 0 R 2118 0 R 2117 0 R 2117 0 R 2116 0 R 2099 0 R 2115 0 R 2099 0 R 2114 0 R 2099 0 R 2113 0 R 2099 0 R 2112 0 R 2099 0 R 2099 0 R 2111 0 R 2099 0 R 2110 0 R 2099 0 R 2109 0 R 2099 0 R 2108 0 R 2099 0 R 2099 0 R 2107 0 R 2099 0 R 2106 0 R 2099 0 R 2105 0 R 2099 0 R 2099 0 R 2104 0 R 2099 0 R 2103 0 R 2099 0 R] -endobj - -80 0 obj -[2099 0 R 2102 0 R 2099 0 R 2101 0 R 2099 0 R 2099 0 R 2100 0 R 2099 0 R 2098 0 R 2097 0 R 2095 0 R 2093 0 R 2092 0 R 2089 0 R 2085 0 R 2084 0 R 2082 0 R 2077 0 R 2075 0 R 2071 0 R 2069 0 R 2070 0 R 2069 0 R 2067 0 R 2061 0 R 2060 0 R 2059 0 R 2058 0 R 2056 0 R 2051 0 R 2049 0 R 2046 0 R 2045 0 R 2044 0 R 2042 0 R 2039 0 R 2038 0 R 2037 0 R 2036 0 R 2035 0 R 2032 0 R 2029 0 R 2028 0 R 2027 0 R 2026 0 R 2025 0 R 2023 0 R 2020 0 R 2018 0 R 2015 0 R 2014 0 R 2009 0 R 1985 0 R 2008 0 R 1985 0 R 2007 0 R 1985 0 R 2006 0 R 1985 0 R 1985 0 R 1985 0 R 2005 0 R 1985 0 R 1985 0 R 2004 0 R 1985 0 R 2003 0 R 1985 0 R 2002 0 R 1985 0 R 1993 0 R 1985 0 R 1985 0 R 1992 0 R 1985 0 R 1985 0 R 1991 0 R 1985 0 R 1985 0 R 1990 0 R 1985 0 R 1989 0 R 1985 0 R 1988 0 R 1985 0 R 1985 0 R 1987 0 R 1985 0 R 1986 0 R 1985 0 R 1985 0 R 1984 0 R 1983 0 R 1981 0 R 1979 0 R 1978 0 R 1976 0 R 1972 0 R 1971 0 R 1970 0 R 1969 0 R 1969 0 R 1969 0 R 1969 0 R 1969 0 R 1967 0 R 1964 0 R 1963 0 R 1962 0 R 1959 0 R 1961 0 R 1959 0 R 1960 0 R 1957 0 R 1954 0 R 1953 0 R 1952 0 R 1950 0 R 1947 0 R 1944 0 R 1946 0 R 1944 0 R 1945 0 R 1942 0 R 1939 0 R 1938 0 R 1937 0 R 1936 0 R 1935 0 R 1933 0 R 1934 0 R 1931 0 R 1926 0 R 1925 0 R 1924 0 R 1922 0 R 1919 0 R 1917 0 R 1912 0 R 1911 0 R 1910 0 R 1908 0 R 1906 0 R 1905 0 R 1903 0 R 1898 0 R 1899 0 R 1898 0 R 1897 0 R 1896 0 R 1894 0 R 1891 0 R 1890 0 R 1888 0 R 1889 0 R 1888 0 R 1887 0 R 1886 0 R 1885 0 R 1883 0 R 1884 0 R 1883 0 R 1881 0 R 1878 0 R 1877 0 R 1876 0 R 1874 0 R 1871 0 R 1870 0 R 1869 0 R 1866 0 R 1868 0 R 1866 0 R 1867 0 R 1864 0 R 1859 0 R 1858 0 R 1857 0 R 1999 0 R 1996 0 R 1994 0 R 1995 0 R 1994 0 R 1994 0 R 1994 0 R 1994 0 R] -endobj - -81 0 obj -[1855 0 R 1852 0 R 1850 0 R 1845 0 R 1844 0 R 1843 0 R 1841 0 R 1839 0 R 1838 0 R 1836 0 R 1832 0 R 1831 0 R 1829 0 R 1826 0 R 1825 0 R 1824 0 R 1822 0 R 1819 0 R 1818 0 R 1817 0 R 1816 0 R 1815 0 R 1813 0 R 1814 0 R 1811 0 R 1806 0 R 1805 0 R 1804 0 R 1802 0 R 1799 0 R 1797 0 R 1792 0 R 1791 0 R 1790 0 R 1782 0 R 1782 0 R 1785 0 R 1782 0 R 1784 0 R 1782 0 R 1783 0 R 1782 0 R 1782 0 R 1775 0 R 1781 0 R 1775 0 R 1780 0 R 1775 0 R 1779 0 R 1775 0 R 1778 0 R 1775 0 R 1775 0 R 1777 0 R 1775 0 R 1775 0 R 1775 0 R 1776 0 R 1775 0 R 1774 0 R 1774 0 R 1762 0 R 1773 0 R 1762 0 R 1772 0 R 1762 0 R 1771 0 R 1762 0 R 1770 0 R 1762 0 R 1762 0 R 1769 0 R 1762 0 R 1762 0 R 1768 0 R 1762 0 R 1762 0 R 1767 0 R 1762 0 R 1762 0 R 1766 0 R 1762 0 R 1765 0 R 1762 0 R 1762 0 R 1764 0 R 1762 0 R 1763 0 R 1762 0 R 1761 0 R 1760 0 R 1758 0 R 1756 0 R 1755 0 R 1753 0 R 1749 0 R 1748 0 R 1747 0 R 1745 0 R 1742 0 R 1740 0 R 1735 0 R 1734 0 R 1733 0 R 1730 0 R 1732 0 R 1730 0 R 1731 0 R 1730 0 R 1728 0 R 1724 0 R 1723 0 R 1722 0 R 1719 0 R 1721 0 R 1719 0 R 1720 0 R 1719 0 R 1718 0 R 1716 0 R 1712 0 R 1711 0 R 1710 0 R 1705 0 R 1694 0 R 1694 0 R 1704 0 R 1694 0 R 1703 0 R 1694 0 R 1702 0 R 1694 0 R 1701 0 R 1694 0 R 1694 0 R 1694 0 R 1700 0 R 1694 0 R 1699 0 R 1694 0 R 1694 0 R 1698 0 R 1694 0 R 1694 0 R 1697 0 R 1694 0 R 1694 0 R 1696 0 R 1694 0 R 1694 0 R 1695 0 R 1694 0 R 1688 0 R 1693 0 R 1688 0 R 1688 0 R 1692 0 R 1688 0 R] -endobj - -82 0 obj -[1688 0 R 1691 0 R 1688 0 R 1690 0 R 1688 0 R 1689 0 R 1688 0 R 1688 0 R 1688 0 R 1687 0 R 1687 0 R 1680 0 R 1686 0 R 1680 0 R 1680 0 R 1680 0 R 1685 0 R 1680 0 R 1684 0 R 1680 0 R 1683 0 R 1680 0 R 1682 0 R 1682 0 R 1680 0 R 1680 0 R 1681 0 R 1680 0 R 1680 0 R 1680 0 R 1680 0 R 1680 0 R 1679 0 R 1679 0 R 1676 0 R 1676 0 R 1678 0 R 1676 0 R 1677 0 R 1676 0 R 1676 0 R 1676 0 R 1675 0 R 1675 0 R 1675 0 R 1673 0 R 1674 0 R 1673 0 R 1672 0 R 1671 0 R 1670 0 R 1668 0 R 1667 0 R 1666 0 R 1664 0 R 1663 0 R 1662 0 R 1660 0 R 1659 0 R 1658 0 R 1656 0 R 1655 0 R 1653 0 R 1654 0 R 1653 0 R 1651 0 R 1650 0 R 1649 0 R 1646 0 R 1646 0 R 1641 0 R 1644 0 R 1641 0 R 1641 0 R 1641 0 R 1641 0 R 1643 0 R 1641 0 R 1641 0 R 1642 0 R 1641 0 R 1641 0 R 1640 0 R 1640 0 R 1640 0 R 1639 0 R 1638 0 R 1636 0 R 1637 0 R 1636 0 R 1634 0 R 1633 0 R 1632 0 R 1632 0 R 1630 0 R 1629 0 R 1628 0 R 1628 0 R 1626 0 R 1625 0 R 1621 0 R 1621 0 R 1621 0 R 1624 0 R 1621 0 R 1623 0 R 1621 0 R] -endobj - -83 0 obj -[1621 0 R 1622 0 R 1621 0 R 1621 0 R 1621 0 R 1619 0 R 1618 0 R 1617 0 R 1613 0 R 1614 0 R 1613 0 R 1613 0 R 1613 0 R 1612 0 R 1612 0 R 1608 0 R 1611 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1608 0 R 1610 0 R 1608 0 R 1608 0 R 1608 0 R 1609 0 R 1608 0 R 1608 0 R 1605 0 R 1607 0 R 1605 0 R 1606 0 R 1605 0 R 1604 0 R 1597 0 R 1603 0 R 1597 0 R 1597 0 R 1602 0 R 1597 0 R 1597 0 R 1601 0 R 1597 0 R 1597 0 R 1600 0 R 1597 0 R 1599 0 R 1597 0 R 1598 0 R 1597 0 R 1596 0 R 1595 0 R 1593 0 R 1591 0 R 1590 0 R 1588 0 R 1584 0 R 1583 0 R 1582 0 R 1580 0 R 1577 0 R 1576 0 R 1575 0 R 1573 0 R 1570 0 R 1569 0 R 1568 0 R 1567 0 R 1565 0 R 1562 0 R 1559 0 R 1561 0 R 1559 0 R 1560 0 R 1557 0 R 1552 0 R 1551 0 R 1550 0 R 1549 0 R 1548 0 R 1547 0 R 1546 0 R 1545 0 R 1544 0 R 1542 0 R 1539 0 R 1537 0 R 1532 0 R 1531 0 R 1530 0 R 1528 0 R 1524 0 R 1521 0 R 1523 0 R 1521 0 R 1522 0 R 1519 0 R 1513 0 R 1512 0 R 1511 0 R 1510 0 R 1509 0 R 1508 0 R 1507 0 R 1505 0 R 1506 0 R 1503 0 R 1496 0 R 1495 0 R 1494 0 R 1493 0 R 1492 0 R 1490 0 R 1484 0 R 1483 0 R 1482 0 R 1481 0 R 1480 0 R 1478 0 R 1472 0 R 1471 0 R 1470 0 R 1468 0 R 1463 0 R 1462 0 R 1461 0 R 1459 0 R 1460 0 R 1457 0 R 1450 0 R 1449 0 R 1448 0 R 1447 0 R 1446 0 R 1444 0 R 1438 0 R 1437 0 R 1436 0 R 1435 0 R 1434 0 R 1432 0 R 1426 0 R 1425 0 R 1424 0 R 1422 0 R 1417 0 R 1415 0 R 1408 0 R 1407 0 R 1406 0 R 1405 0 R 1404 0 R 1403 0 R 1402 0 R 1401 0 R 1400 0 R 1398 0 R 1395 0 R 1394 0 R 1392 0 R 1389 0 R 1388 0 R 1387 0 R 1386 0 R 1385 0 R] -endobj - -84 0 obj -[1383 0 R 1380 0 R 1379 0 R 1374 0 R 1374 0 R 1374 0 R 1373 0 R 1367 0 R 1372 0 R 1367 0 R 1371 0 R 1367 0 R 1367 0 R 1370 0 R 1367 0 R 1367 0 R 1369 0 R 1367 0 R 1367 0 R 1368 0 R 1367 0 R 1366 0 R 1365 0 R 1363 0 R 1361 0 R 1360 0 R 1358 0 R 1354 0 R 1353 0 R 1352 0 R 1351 0 R 1349 0 R 1346 0 R 1345 0 R 1343 0 R 1338 0 R 1337 0 R 1336 0 R 1334 0 R 1335 0 R 1334 0 R 1333 0 R 1330 0 R 1332 0 R 1330 0 R 1331 0 R 1328 0 R 1324 0 R 1323 0 R 1322 0 R 1321 0 R 1320 0 R 1318 0 R 1314 0 R 1311 0 R 1313 0 R 1311 0 R 1312 0 R 1311 0 R 1309 0 R 1306 0 R 1304 0 R 1301 0 R 1300 0 R 1298 0 R 1296 0 R 1295 0 R 1293 0 R 1289 0 R 1288 0 R 1287 0 R 1286 0 R 1284 0 R 1281 0 R 1278 0 R 1280 0 R 1278 0 R 1279 0 R 1276 0 R 1271 0 R 1270 0 R 1269 0 R 1267 0 R 1263 0 R 1262 0 R 1261 0 R 1260 0 R 1259 0 R 1258 0 R 1257 0 R 1255 0 R 1256 0 R 1253 0 R 1247 0 R 1246 0 R 1245 0 R 1244 0 R 1243 0 R 1241 0 R 1236 0 R 1235 0 R 1234 0 R 1233 0 R 1232 0 R 1230 0 R 1227 0 R 1226 0 R 1219 0 R 1221 0 R 1219 0 R 1220 0 R 1219 0 R 1218 0 R 1209 0 R 1209 0 R 1217 0 R 1209 0 R 1209 0 R 1210 0 R 1209 0 R 1208 0 R 1207 0 R 1205 0 R 1203 0 R 1202 0 R 1200 0 R 1196 0 R 1195 0 R 1194 0 R 1192 0 R 1189 0 R 1187 0 R 1182 0 R 1179 0 R 1181 0 R 1179 0 R 1180 0 R 1177 0 R 1171 0 R 1169 0 R 1164 0 R 1163 0 R 1162 0 R 1160 0 R 1157 0 R 1156 0 R 1154 0 R 1149 0 R 1214 0 R 1211 0 R 1211 0 R] -endobj - -85 0 obj -[1147 0 R 1143 0 R 1140 0 R 1142 0 R 1140 0 R 1141 0 R 1138 0 R 1132 0 R 1130 0 R 1125 0 R 1124 0 R 1123 0 R 1121 0 R 1117 0 R 1116 0 R 1110 0 R 1110 0 R 1110 0 R 1111 0 R 1110 0 R 1110 0 R 1109 0 R 1109 0 R 1092 0 R 1108 0 R 1092 0 R 1092 0 R 1101 0 R 1092 0 R 1092 0 R 1092 0 R 1092 0 R 1091 0 R 1088 0 R 1088 0 R 1090 0 R 1088 0 R 1088 0 R 1088 0 R 1088 0 R 1088 0 R 1089 0 R 1088 0 R 1088 0 R 1088 0 R 1088 0 R 1088 0 R 1087 0 R 1083 0 R 1086 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1083 0 R 1085 0 R 1083 0 R 1083 0 R 1083 0 R 1084 0 R 1083 0 R 1083 0 R 1082 0 R 1079 0 R 1081 0 R 1079 0 R 1079 0 R 1079 0 R 1079 0 R 1105 0 R 1102 0 R 1102 0 R 1098 0 R 1093 0 R 1095 0 R 1093 0 R 1094 0 R 1093 0 R] -endobj - -86 0 obj -[1079 0 R 1079 0 R 1080 0 R 1079 0 R 1079 0 R 1079 0 R 1079 0 R 1079 0 R 1078 0 R 1077 0 R 1077 0 R 1077 0 R 1077 0 R 1077 0 R 1077 0 R 1077 0 R 1076 0 R 1076 0 R 1075 0 R 1075 0 R 1075 0 R 1075 0 R 1075 0 R 1074 0 R 1074 0 R 1065 0 R 1065 0 R 1073 0 R 1065 0 R 1065 0 R 1072 0 R 1065 0 R 1065 0 R 1065 0 R 1065 0 R 1071 0 R 1065 0 R 1070 0 R 1065 0 R 1069 0 R 1065 0 R 1065 0 R 1068 0 R 1065 0 R 1065 0 R 1067 0 R 1065 0 R 1065 0 R 1065 0 R 1065 0 R 1066 0 R 1065 0 R 1065 0 R 1065 0 R 1065 0 R 1065 0 R 1064 0 R 1064 0 R 1063 0 R 1062 0 R 1062 0 R 1062 0 R 1062 0 R 1062 0 R 1062 0 R 1061 0 R 1057 0 R 1057 0 R 1057 0 R 1060 0 R 1057 0 R 1059 0 R 1057 0 R 1057 0 R] -endobj - -87 0 obj -[1057 0 R 1058 0 R 1057 0 R 1057 0 R 1057 0 R 1057 0 R 1057 0 R 1056 0 R 1054 0 R 1054 0 R 1055 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1054 0 R 1053 0 R 1053 0 R 1052 0 R 1052 0 R 1052 0 R 1052 0 R 1052 0 R 1051 0 R 1046 0 R 1050 0 R 1046 0 R 1046 0 R 1046 0 R 1046 0 R 1046 0 R 1049 0 R 1046 0 R 1048 0 R 1046 0 R 1046 0 R 1046 0 R 1047 0 R 1046 0 R 1046 0 R 1046 0 R 1046 0 R 1046 0 R 1044 0 R 1044 0 R 1045 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1044 0 R 1043 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1042 0 R 1039 0 R 1039 0 R 1039 0 R 1039 0 R 1041 0 R 1039 0 R 1039 0 R 1039 0 R] -endobj - -88 0 obj -[1039 0 R 1040 0 R 1039 0 R 1039 0 R 1039 0 R 1038 0 R 1038 0 R 1037 0 R 1037 0 R 1037 0 R 1037 0 R 1036 0 R 1034 0 R 1035 0 R 1034 0 R 1034 0 R 1034 0 R 1034 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1033 0 R 1020 0 R 1020 0 R 1025 0 R 1020 0 R 1024 0 R 1020 0 R 1020 0 R 1023 0 R 1020 0 R 1022 0 R 1020 0 R 1020 0 R 1021 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1020 0 R 1019 0 R 1015 0 R 1015 0 R 1015 0 R 1015 0 R 1018 0 R 1015 0 R 1015 0 R 1015 0 R 1017 0 R 1015 0 R 1016 0 R 1015 0 R 1007 0 R 1007 0 R 1007 0 R 1014 0 R 1007 0 R 1007 0 R 1013 0 R 1007 0 R 1007 0 R 1007 0 R 1007 0 R 1012 0 R 1007 0 R 1007 0 R 1007 0 R 1011 0 R 1007 0 R 1010 0 R 1007 0 R 1007 0 R 1009 0 R 1007 0 R 1007 0 R 1007 0 R 1008 0 R 1007 0 R 1007 0 R 1007 0 R 1000 0 R 1000 0 R 1000 0 R 1000 0 R 1006 0 R 1000 0 R 1000 0 R 1005 0 R 1000 0 R 1000 0 R 1000 0 R 1004 0 R 1000 0 R 1000 0 R 1003 0 R 1000 0 R 1000 0 R 1000 0 R 1002 0 R 1000 0 R 1001 0 R 1000 0 R 1000 0 R 1000 0 R 997 0 R 997 0 R 997 0 R 999 0 R 997 0 R 997 0 R 1030 0 R 1026 0 R 1027 0 R 1026 0 R 1026 0 R] -endobj - -89 0 obj -[997 0 R 997 0 R 997 0 R 998 0 R 997 0 R 997 0 R 997 0 R 997 0 R 996 0 R 996 0 R 989 0 R 989 0 R 995 0 R 989 0 R 994 0 R 989 0 R 993 0 R 989 0 R 992 0 R 989 0 R 991 0 R 989 0 R 990 0 R 989 0 R 989 0 R 989 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 988 0 R 985 0 R 985 0 R 985 0 R 987 0 R 985 0 R 985 0 R 986 0 R 985 0 R 985 0 R 985 0 R 985 0 R 985 0 R 985 0 R 985 0 R 985 0 R 984 0 R 984 0 R 984 0 R 984 0 R 984 0 R 984 0 R 984 0 R 984 0 R 983 0 R 983 0 R 979 0 R 979 0 R 982 0 R 979 0 R 981 0 R 979 0 R 980 0 R 980 0 R 979 0 R] -endobj - -90 0 obj -[979 0 R 979 0 R 978 0 R 973 0 R 977 0 R 973 0 R 973 0 R 973 0 R 973 0 R 976 0 R 973 0 R 973 0 R 975 0 R 975 0 R 975 0 R 975 0 R 975 0 R 975 0 R 973 0 R 973 0 R 973 0 R 973 0 R 974 0 R 973 0 R 973 0 R 972 0 R 970 0 R 971 0 R 970 0 R 970 0 R 970 0 R 970 0 R 970 0 R 970 0 R 965 0 R 969 0 R 965 0 R 965 0 R 968 0 R 965 0 R 967 0 R 965 0 R 965 0 R 966 0 R 965 0 R 965 0 R 965 0 R 964 0 R 960 0 R 963 0 R 960 0 R 962 0 R 962 0 R 962 0 R 960 0 R 961 0 R 960 0 R 960 0 R 960 0 R 960 0 R 960 0 R 959 0 R 956 0 R 956 0 R 956 0 R 958 0 R 956 0 R 956 0 R 956 0 R 957 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 956 0 R 955 0 R 949 0 R 949 0 R 949 0 R 954 0 R 954 0 R 954 0 R 954 0 R 954 0 R 954 0 R 949 0 R 949 0 R 949 0 R 949 0 R 953 0 R 949 0 R 949 0 R 949 0 R 949 0 R 949 0 R 949 0 R 949 0 R 952 0 R 949 0 R 949 0 R 949 0 R 951 0 R 949 0 R 949 0 R 949 0 R 949 0 R 950 0 R 949 0 R 949 0 R 948 0 R 948 0 R 948 0 R] -endobj - -91 0 obj -[947 0 R 947 0 R 946 0 R 946 0 R 945 0 R 945 0 R 944 0 R 943 0 R 943 0 R 943 0 R 943 0 R 942 0 R 934 0 R 941 0 R 934 0 R 934 0 R 934 0 R 940 0 R 934 0 R 934 0 R 939 0 R 934 0 R 938 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 937 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 936 0 R 934 0 R 934 0 R 935 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 934 0 R 933 0 R 928 0 R 928 0 R 928 0 R 932 0 R 928 0 R 928 0 R 928 0 R 931 0 R 928 0 R 930 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 928 0 R 929 0 R 928 0 R 927 0 R 921 0 R 921 0 R 926 0 R 921 0 R 921 0 R 925 0 R 925 0 R 921 0 R 921 0 R 921 0 R 921 0 R 921 0 R 921 0 R 924 0 R 921 0 R 923 0 R 921 0 R 921 0 R 921 0 R 922 0 R 921 0 R 921 0 R 921 0 R 921 0 R] -endobj - -92 0 obj -[921 0 R 921 0 R 920 0 R 920 0 R 919 0 R 918 0 R 918 0 R 918 0 R 917 0 R 910 0 R 910 0 R 916 0 R 910 0 R 915 0 R 910 0 R 910 0 R 914 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 913 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 912 0 R 912 0 R 910 0 R 910 0 R 911 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 910 0 R 909 0 R 898 0 R 898 0 R 908 0 R 898 0 R 907 0 R 898 0 R 898 0 R 906 0 R 898 0 R 905 0 R 898 0 R 904 0 R 898 0 R 903 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 902 0 R 902 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 901 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 900 0 R 898 0 R 899 0 R 898 0 R 898 0 R 898 0 R 898 0 R 898 0 R 897 0 R 897 0 R 896 0 R 896 0 R] -endobj - -93 0 obj -[896 0 R 896 0 R 896 0 R 895 0 R 878 0 R 878 0 R 878 0 R 878 0 R 894 0 R 878 0 R 878 0 R 893 0 R 878 0 R 878 0 R 878 0 R 892 0 R 878 0 R 878 0 R 891 0 R 878 0 R 878 0 R 890 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 889 0 R 878 0 R 878 0 R 878 0 R 878 0 R 888 0 R 878 0 R 878 0 R 878 0 R 887 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 886 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 885 0 R 878 0 R 878 0 R 878 0 R 884 0 R 878 0 R 878 0 R 878 0 R 878 0 R 883 0 R 878 0 R 878 0 R 878 0 R 882 0 R 878 0 R 878 0 R 878 0 R 881 0 R 878 0 R 880 0 R 878 0 R 878 0 R 879 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 878 0 R 877 0 R 867 0 R 867 0 R 867 0 R 867 0 R 876 0 R 867 0 R 867 0 R 867 0 R 867 0 R 875 0 R 867 0 R 867 0 R 867 0 R 874 0 R 867 0 R 867 0 R 873 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 872 0 R 867 0 R 867 0 R 867 0 R 871 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 870 0 R 867 0 R 869 0 R 867 0 R 867 0 R 868 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R 867 0 R] -endobj - -94 0 obj -[866 0 R 856 0 R 856 0 R 856 0 R 865 0 R 856 0 R 864 0 R 856 0 R 856 0 R 856 0 R 856 0 R 863 0 R 856 0 R 856 0 R 856 0 R 856 0 R 856 0 R 862 0 R 856 0 R 861 0 R 856 0 R 856 0 R 856 0 R 856 0 R 860 0 R 856 0 R 856 0 R 856 0 R 856 0 R 859 0 R 856 0 R 856 0 R 856 0 R 858 0 R 856 0 R 856 0 R 856 0 R 857 0 R 856 0 R 856 0 R 856 0 R 856 0 R 856 0 R 856 0 R 855 0 R 855 0 R 854 0 R 854 0 R 854 0 R 854 0 R 853 0 R 847 0 R 847 0 R 847 0 R 852 0 R 847 0 R 847 0 R 847 0 R 851 0 R 847 0 R 847 0 R 847 0 R 847 0 R 850 0 R 847 0 R 849 0 R 847 0 R 847 0 R 847 0 R 847 0 R 847 0 R 847 0 R 848 0 R 847 0 R 847 0 R 847 0 R 846 0 R 836 0 R 836 0 R 836 0 R 845 0 R 836 0 R 844 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 843 0 R 836 0 R 836 0 R 836 0 R 836 0 R 842 0 R 836 0 R 841 0 R 836 0 R 836 0 R 840 0 R 836 0 R 836 0 R 836 0 R 836 0 R 839 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 836 0 R 838 0 R 836 0 R 836 0 R 837 0 R 836 0 R 835 0 R 827 0 R 827 0 R 834 0 R 827 0 R 827 0 R 827 0 R 827 0 R 827 0 R 833 0 R 827 0 R 832 0 R 827 0 R 827 0 R 827 0 R 831 0 R 827 0 R 827 0 R 827 0 R 827 0 R 830 0 R 827 0 R 827 0 R 829 0 R] -endobj - -95 0 obj -[828 0 R 827 0 R 827 0 R 827 0 R 827 0 R 826 0 R 826 0 R 821 0 R 821 0 R 825 0 R 821 0 R 821 0 R 821 0 R 821 0 R 824 0 R 821 0 R 821 0 R 821 0 R 823 0 R 821 0 R 821 0 R 822 0 R 822 0 R 821 0 R 821 0 R 821 0 R 821 0 R 821 0 R 819 0 R 819 0 R 820 0 R 819 0 R 819 0 R 819 0 R 819 0 R 819 0 R 819 0 R 819 0 R 818 0 R 817 0 R 813 0 R 815 0 R 815 0 R 815 0 R 813 0 R 814 0 R 813 0 R 810 0 R 806 0 R 808 0 R 806 0 R 806 0 R 807 0 R 806 0 R 803 0 R 799 0 R 799 0 R 799 0 R 801 0 R 799 0 R 800 0 R 799 0 R 796 0 R 793 0 R 794 0 R 793 0 R 790 0 R 786 0 R 786 0 R 788 0 R 788 0 R 786 0 R 786 0 R 787 0 R 786 0 R 783 0 R 780 0 R 781 0 R 780 0 R 780 0 R] -endobj - -96 0 obj -[777 0 R 774 0 R 774 0 R 774 0 R 775 0 R 771 0 R 768 0 R 768 0 R 768 0 R 769 0 R 769 0 R 765 0 R 760 0 R 763 0 R 760 0 R 762 0 R 762 0 R 762 0 R 760 0 R 761 0 R 760 0 R 757 0 R 752 0 R 755 0 R 752 0 R 754 0 R 752 0 R 752 0 R 753 0 R 752 0 R 749 0 R 746 0 R 746 0 R 747 0 R 746 0 R 743 0 R 738 0 R 741 0 R 738 0 R 738 0 R 740 0 R 740 0 R 738 0 R 739 0 R 738 0 R 735 0 R 732 0 R 732 0 R 733 0 R 732 0 R 732 0 R 729 0 R 727 0 R 727 0 R 724 0 R 720 0 R 722 0 R 720 0 R 720 0 R 721 0 R 720 0 R 717 0 R 714 0 R 715 0 R 715 0 R 714 0 R 714 0 R 711 0 R 707 0 R 707 0 R 709 0 R 709 0 R 707 0 R 707 0 R 708 0 R 707 0 R 704 0 R 700 0 R 700 0 R 702 0 R 702 0 R 700 0 R 700 0 R 700 0 R 701 0 R 700 0 R 697 0 R 693 0 R 695 0 R 693 0 R 693 0 R 694 0 R 693 0 R 690 0 R 687 0 R 688 0 R 687 0 R 684 0 R 680 0 R 682 0 R 682 0 R 680 0 R 680 0 R 680 0 R 681 0 R 680 0 R 677 0 R 674 0 R 675 0 R 674 0 R 674 0 R] -endobj - -97 0 obj -[671 0 R 667 0 R 669 0 R 669 0 R 667 0 R 667 0 R 667 0 R 668 0 R 667 0 R 664 0 R 660 0 R 662 0 R 662 0 R 660 0 R 660 0 R 661 0 R 660 0 R 657 0 R 653 0 R 655 0 R 653 0 R 654 0 R 654 0 R 653 0 R 650 0 R 646 0 R 648 0 R 648 0 R 648 0 R 646 0 R 647 0 R 647 0 R 646 0 R 643 0 R 639 0 R 641 0 R 641 0 R 639 0 R 639 0 R 640 0 R 639 0 R 636 0 R 632 0 R 634 0 R 634 0 R 632 0 R 633 0 R 632 0 R 629 0 R 624 0 R 627 0 R 624 0 R 626 0 R 626 0 R 624 0 R 625 0 R 624 0 R 621 0 R 617 0 R 617 0 R 619 0 R 619 0 R 617 0 R 617 0 R 618 0 R 617 0 R 614 0 R 610 0 R 612 0 R 612 0 R 612 0 R 610 0 R 611 0 R 610 0 R 607 0 R 603 0 R 603 0 R 605 0 R 605 0 R 603 0 R 604 0 R 603 0 R 600 0 R 596 0 R 596 0 R 598 0 R 596 0 R 597 0 R 596 0 R 593 0 R 589 0 R 591 0 R 591 0 R 589 0 R 589 0 R 590 0 R 589 0 R 586 0 R 582 0 R 584 0 R 582 0 R 582 0 R 583 0 R 582 0 R 579 0 R 575 0 R 577 0 R 577 0 R 575 0 R 576 0 R 575 0 R] -endobj - -98 0 obj -[572 0 R 568 0 R 570 0 R 570 0 R 568 0 R 569 0 R 568 0 R 565 0 R 562 0 R 563 0 R 563 0 R 563 0 R 562 0 R 559 0 R 556 0 R 556 0 R 556 0 R 557 0 R 553 0 R 549 0 R 549 0 R 551 0 R 551 0 R 549 0 R 549 0 R 550 0 R 549 0 R 546 0 R 543 0 R 544 0 R 544 0 R 544 0 R 543 0 R 543 0 R 540 0 R 537 0 R 538 0 R 538 0 R 534 0 R 531 0 R 532 0 R 528 0 R 525 0 R 526 0 R 525 0 R 522 0 R 518 0 R 518 0 R 518 0 R 520 0 R 518 0 R 518 0 R 519 0 R 518 0 R 515 0 R 511 0 R 511 0 R 513 0 R 513 0 R 511 0 R 512 0 R 511 0 R 508 0 R 504 0 R 504 0 R 506 0 R 506 0 R 504 0 R 505 0 R 504 0 R 501 0 R 498 0 R 498 0 R 499 0 R 498 0 R 495 0 R 492 0 R 493 0 R 493 0 R 492 0 R 489 0 R 486 0 R 486 0 R 486 0 R 487 0 R 486 0 R 483 0 R 479 0 R 479 0 R 481 0 R 479 0 R 479 0 R 480 0 R 479 0 R 476 0 R 473 0 R 473 0 R 474 0 R 474 0 R 473 0 R] -endobj - -99 0 obj -[470 0 R 466 0 R 468 0 R 468 0 R 466 0 R 467 0 R 466 0 R 463 0 R 459 0 R 461 0 R 461 0 R 459 0 R 460 0 R 459 0 R 456 0 R 453 0 R 454 0 R 454 0 R 453 0 R 450 0 R 446 0 R 448 0 R 448 0 R 446 0 R 447 0 R 446 0 R 443 0 R 440 0 R 441 0 R 441 0 R 437 0 R 433 0 R 433 0 R 435 0 R 433 0 R 433 0 R 434 0 R 433 0 R 430 0 R 427 0 R 428 0 R 428 0 R 424 0 R 420 0 R 422 0 R 422 0 R 420 0 R 420 0 R 421 0 R 420 0 R 417 0 R 413 0 R 413 0 R 415 0 R 415 0 R 415 0 R 415 0 R 413 0 R 414 0 R 413 0 R 410 0 R 406 0 R 406 0 R 408 0 R 406 0 R 407 0 R 407 0 R 406 0 R 403 0 R 399 0 R 401 0 R 401 0 R 399 0 R 400 0 R 399 0 R 396 0 R 392 0 R 392 0 R 394 0 R 392 0 R 392 0 R 393 0 R 392 0 R 389 0 R 385 0 R 385 0 R 387 0 R 387 0 R 385 0 R 385 0 R 386 0 R 385 0 R 382 0 R 378 0 R 378 0 R 380 0 R 378 0 R 378 0 R 379 0 R 378 0 R 375 0 R 371 0 R 373 0 R 373 0 R 371 0 R 371 0 R 372 0 R 371 0 R] -endobj - -100 0 obj -[368 0 R 364 0 R 366 0 R 364 0 R 364 0 R 365 0 R 364 0 R 361 0 R 357 0 R 359 0 R 357 0 R 357 0 R 358 0 R 357 0 R 354 0 R 350 0 R 350 0 R 352 0 R 350 0 R 350 0 R 351 0 R 350 0 R 347 0 R 343 0 R 343 0 R 345 0 R 345 0 R 343 0 R 344 0 R 343 0 R 340 0 R 337 0 R 337 0 R 337 0 R 338 0 R 334 0 R 330 0 R 332 0 R 332 0 R 330 0 R 330 0 R 331 0 R 330 0 R 327 0 R 323 0 R 323 0 R 325 0 R 323 0 R 324 0 R 323 0 R 320 0 R 316 0 R 316 0 R 318 0 R 316 0 R 317 0 R 316 0 R 313 0 R 309 0 R 309 0 R 309 0 R 311 0 R 309 0 R 310 0 R 310 0 R 309 0 R 306 0 R 302 0 R 302 0 R 304 0 R 302 0 R 302 0 R 303 0 R 302 0 R 299 0 R 295 0 R 297 0 R 297 0 R 295 0 R 296 0 R 295 0 R 292 0 R 288 0 R 288 0 R 290 0 R 290 0 R 288 0 R 289 0 R 288 0 R 285 0 R 281 0 R 281 0 R 283 0 R 281 0 R 281 0 R 282 0 R 281 0 R 278 0 R 273 0 R 276 0 R 273 0 R 275 0 R 275 0 R 273 0 R 273 0 R 274 0 R 273 0 R 270 0 R 266 0 R 266 0 R 268 0 R] -endobj - -101 0 obj -[268 0 R 266 0 R 266 0 R 267 0 R 266 0 R 263 0 R 259 0 R 259 0 R 259 0 R 261 0 R 261 0 R 259 0 R 260 0 R 259 0 R 256 0 R 252 0 R 252 0 R 254 0 R 254 0 R 252 0 R 253 0 R 252 0 R 249 0 R 245 0 R 247 0 R 247 0 R 245 0 R 245 0 R 246 0 R 245 0 R 242 0 R 238 0 R 238 0 R 240 0 R 240 0 R 238 0 R 238 0 R 239 0 R 238 0 R 235 0 R 231 0 R 231 0 R 233 0 R 231 0 R 231 0 R 232 0 R 231 0 R 228 0 R 224 0 R 224 0 R 226 0 R 226 0 R 224 0 R 225 0 R 224 0 R 221 0 R 218 0 R 219 0 R 219 0 R 218 0 R 215 0 R 213 0 R 213 0 R 210 0 R 208 0 R 205 0 R 201 0 R 203 0 R 201 0 R 202 0 R 201 0 R 198 0 R 194 0 R 196 0 R 196 0 R 196 0 R 194 0 R 194 0 R 195 0 R 194 0 R 191 0 R 187 0 R 187 0 R 187 0 R 189 0 R 189 0 R 187 0 R 188 0 R 187 0 R 184 0 R 180 0 R 180 0 R 182 0 R 182 0 R 180 0 R 181 0 R 180 0 R 177 0 R 173 0 R 175 0 R 175 0 R 175 0 R 173 0 R 174 0 R 173 0 R 170 0 R 166 0 R 168 0 R 168 0 R 168 0 R 166 0 R 167 0 R 166 0 R] -endobj - -102 0 obj -[163 0 R 159 0 R 159 0 R 161 0 R 161 0 R 161 0 R 159 0 R 160 0 R 159 0 R 156 0 R 154 0 R 151 0 R 148 0 R 149 0 R 148 0 R 145 0 R 141 0 R 141 0 R 141 0 R 143 0 R 141 0 R 141 0 R 142 0 R 141 0 R 138 0 R 134 0 R 134 0 R 136 0 R 136 0 R 134 0 R 135 0 R 134 0 R 131 0 R 127 0 R 129 0 R 129 0 R 127 0 R 127 0 R 128 0 R 127 0 R 124 0 R 120 0 R 120 0 R 122 0 R 120 0 R 120 0 R 121 0 R 120 0 R 117 0 R 114 0 R 114 0 R 115 0 R 115 0 R 111 0 R 107 0 R 107 0 R 109 0 R 107 0 R 108 0 R 107 0 R] -endobj - -103 0 obj -<< - /Type /StructElem - /S /Document - /P 54 0 R - /K [4305 0 R 4301 0 R 4298 0 R 4297 0 R 4290 0 R 4289 0 R 4076 0 R 4075 0 R 4069 0 R 4068 0 R 4067 0 R 4056 0 R 4053 0 R 4052 0 R 4051 0 R 4050 0 R 4038 0 R 4029 0 R 4026 0 R 4025 0 R 4018 0 R 4017 0 R 4016 0 R 4014 0 R 4012 0 R 4011 0 R 4002 0 R 3978 0 R 3977 0 R 3975 0 R 3974 0 R 3966 0 R 3965 0 R 3963 0 R 3954 0 R 3945 0 R 3944 0 R 3936 0 R 3935 0 R 3931 0 R 3930 0 R 3929 0 R 3919 0 R 3902 0 R 3901 0 R 3897 0 R 3888 0 R 3887 0 R 3885 0 R 3884 0 R 3880 0 R 3879 0 R 3875 0 R 3874 0 R 3863 0 R 3846 0 R 3840 0 R 3839 0 R 3820 0 R 3817 0 R 3782 0 R 3765 0 R 3760 0 R 3750 0 R 3743 0 R 3739 0 R 3713 0 R 3705 0 R 3688 0 R 3687 0 R 3683 0 R 3670 0 R 3666 0 R 3648 0 R 3646 0 R 3637 0 R 3632 0 R 3598 0 R 3595 0 R 3578 0 R 3569 0 R 3567 0 R 3539 0 R 3530 0 R 3528 0 R 3521 0 R 3513 0 R 3506 0 R 3505 0 R 3502 0 R 3501 0 R 3498 0 R 3468 0 R 3462 0 R 3394 0 R 3389 0 R 3388 0 R 3384 0 R 3383 0 R 3380 0 R 3374 0 R 3369 0 R 3363 0 R 3360 0 R 3341 0 R 3340 0 R 3336 0 R 3333 0 R 3318 0 R 3313 0 R 3221 0 R 3219 0 R 3216 0 R 3194 0 R 3102 0 R 3095 0 R 3094 0 R 3090 0 R 3073 0 R 3062 0 R 3053 0 R 3052 0 R 3039 0 R 3032 0 R 3017 0 R 3010 0 R 2980 0 R 2977 0 R 2976 0 R 2972 0 R 2940 0 R 2937 0 R 2900 0 R 2896 0 R 2889 0 R 2880 0 R 2877 0 R 2868 0 R 2867 0 R 2854 0 R 2850 0 R 2849 0 R 2845 0 R 2840 0 R 2834 0 R 2815 0 R 2814 0 R 2811 0 R 2803 0 R 2794 0 R 2793 0 R 2770 0 R 2769 0 R 2768 0 R 2765 0 R 2764 0 R 2759 0 R 2740 0 R 2729 0 R 2725 0 R 2715 0 R 2710 0 R 2695 0 R 2693 0 R 2692 0 R 2691 0 R 2686 0 R 2681 0 R 2680 0 R 2677 0 R 2676 0 R 2666 0 R 2665 0 R 2661 0 R 2643 0 R 2553 0 R 2548 0 R 2547 0 R 2536 0 R 2529 0 R 2388 0 R 2378 0 R 2364 0 R 2363 0 R 2361 0 R 2345 0 R 2333 0 R 2322 0 R 2217 0 R 2208 0 R 2142 0 R 2128 0 R 2127 0 R 2117 0 R 2099 0 R 2010 0 R 1985 0 R 1786 0 R 1782 0 R 1775 0 R 1774 0 R 1762 0 R 1706 0 R 1694 0 R 1688 0 R 1687 0 R 1680 0 R 1679 0 R 1676 0 R 1645 0 R 1641 0 R 1640 0 R 1615 0 R 1613 0 R 1612 0 R 1608 0 R 1605 0 R 1597 0 R 1375 0 R 1374 0 R 1367 0 R 1222 0 R 1219 0 R 1209 0 R 1112 0 R 1110 0 R 1109 0 R 1092 0 R 1088 0 R 1083 0 R 1079 0 R 1077 0 R 1076 0 R 1075 0 R 1074 0 R 1065 0 R 1064 0 R 1062 0 R 1057 0 R 1054 0 R 1053 0 R 1052 0 R 1046 0 R 1044 0 R 1039 0 R 1038 0 R 1037 0 R 1034 0 R 1020 0 R 1015 0 R 1007 0 R 1000 0 R 997 0 R 996 0 R 989 0 R 988 0 R 985 0 R 984 0 R 983 0 R 979 0 R 973 0 R 970 0 R 965 0 R 960 0 R 956 0 R 949 0 R 948 0 R 947 0 R 946 0 R 945 0 R 943 0 R 934 0 R 928 0 R 921 0 R 920 0 R 918 0 R 910 0 R 898 0 R 897 0 R 896 0 R 878 0 R 867 0 R 856 0 R 855 0 R 854 0 R 847 0 R 836 0 R 827 0 R 826 0 R 821 0 R 819 0 R 818 0 R 104 0 R] ->> -endobj - -104 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Decimal - >>] - /K [811 0 R 804 0 R 797 0 R 791 0 R 784 0 R 778 0 R 772 0 R 766 0 R 758 0 R 750 0 R 744 0 R 736 0 R 730 0 R 725 0 R 718 0 R 712 0 R 705 0 R 698 0 R 691 0 R 685 0 R 678 0 R 672 0 R 665 0 R 658 0 R 651 0 R 644 0 R 637 0 R 630 0 R 622 0 R 615 0 R 608 0 R 601 0 R 594 0 R 587 0 R 580 0 R 573 0 R 566 0 R 560 0 R 554 0 R 547 0 R 541 0 R 535 0 R 529 0 R 523 0 R 516 0 R 509 0 R 502 0 R 496 0 R 490 0 R 484 0 R 477 0 R 471 0 R 464 0 R 457 0 R 451 0 R 444 0 R 438 0 R 431 0 R 425 0 R 418 0 R 411 0 R 404 0 R 397 0 R 390 0 R 383 0 R 376 0 R 369 0 R 362 0 R 355 0 R 348 0 R 341 0 R 335 0 R 328 0 R 321 0 R 314 0 R 307 0 R 300 0 R 293 0 R 286 0 R 279 0 R 271 0 R 264 0 R 257 0 R 250 0 R 243 0 R 236 0 R 229 0 R 222 0 R 216 0 R 211 0 R 206 0 R 199 0 R 192 0 R 185 0 R 178 0 R 171 0 R 164 0 R 157 0 R 152 0 R 146 0 R 139 0 R 132 0 R 125 0 R 118 0 R 112 0 R 105 0 R] ->> -endobj - -105 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [110 0 R 106 0 R] ->> -endobj - -106 0 obj -<< - /Type /StructElem - /S /LBody - /P 105 0 R - /K [107 0 R] ->> -endobj - -107 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 106 0 R - /K [54 55 109 0 R 57 108 0 R 59] - /Pg 5270 0 R ->> -endobj - -108 0 obj -<< - /Type /StructElem - /S /Link - /P 107 0 R - /K [58 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5269 0 R - >>] - /Pg 5270 0 R ->> -endobj - -109 0 obj -<< - /Type /StructElem - /S /Em - /P 107 0 R - /K [56] - /Pg 5270 0 R ->> -endobj - -110 0 obj -<< - /Type /StructElem - /S /Lbl - /P 105 0 R - /K [111 0 R] ->> -endobj - -111 0 obj -<< - /Type /StructElem - /S /Link - /P 110 0 R - /K [53 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5268 0 R - >>] - /Pg 5270 0 R ->> -endobj - -112 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [116 0 R 113 0 R] ->> -endobj - -113 0 obj -<< - /Type /StructElem - /S /LBody - /P 112 0 R - /K [114 0 R] ->> -endobj - -114 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 113 0 R - /K [49 50 115 0 R] - /Pg 5270 0 R ->> -endobj - -115 0 obj -<< - /Type /StructElem - /S /Link - /P 114 0 R - /K [51 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5266 0 R - >> 52 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5267 0 R - >>] - /Pg 5270 0 R ->> -endobj - -116 0 obj -<< - /Type /StructElem - /S /Lbl - /P 112 0 R - /K [117 0 R] ->> -endobj - -117 0 obj -<< - /Type /StructElem - /S /Link - /P 116 0 R - /K [48 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5265 0 R - >>] - /Pg 5270 0 R ->> -endobj - -118 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [123 0 R 119 0 R] ->> -endobj - -119 0 obj -<< - /Type /StructElem - /S /LBody - /P 118 0 R - /K [120 0 R] ->> -endobj - -120 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 119 0 R - /K [41 42 122 0 R 44 45 121 0 R 47] - /Pg 5270 0 R ->> -endobj - -121 0 obj -<< - /Type /StructElem - /S /Link - /P 120 0 R - /K [46 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5264 0 R - >>] - /Pg 5270 0 R ->> -endobj - -122 0 obj -<< - /Type /StructElem - /S /Em - /P 120 0 R - /K [43] - /Pg 5270 0 R ->> -endobj - -123 0 obj -<< - /Type /StructElem - /S /Lbl - /P 118 0 R - /K [124 0 R] ->> -endobj - -124 0 obj -<< - /Type /StructElem - /S /Link - /P 123 0 R - /K [40 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5263 0 R - >>] - /Pg 5270 0 R ->> -endobj - -125 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [130 0 R 126 0 R] ->> -endobj - -126 0 obj -<< - /Type /StructElem - /S /LBody - /P 125 0 R - /K [127 0 R] ->> -endobj - -127 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 126 0 R - /K [33 129 0 R 36 37 128 0 R 39] - /Pg 5270 0 R ->> -endobj - -128 0 obj -<< - /Type /StructElem - /S /Link - /P 127 0 R - /K [38 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5262 0 R - >>] - /Pg 5270 0 R ->> -endobj - -129 0 obj -<< - /Type /StructElem - /S /Em - /P 127 0 R - /K [34 35] - /Pg 5270 0 R ->> -endobj - -130 0 obj -<< - /Type /StructElem - /S /Lbl - /P 125 0 R - /K [131 0 R] ->> -endobj - -131 0 obj -<< - /Type /StructElem - /S /Link - /P 130 0 R - /K [32 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5261 0 R - >>] - /Pg 5270 0 R ->> -endobj - -132 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [137 0 R 133 0 R] ->> -endobj - -133 0 obj -<< - /Type /StructElem - /S /LBody - /P 132 0 R - /K [134 0 R] ->> -endobj - -134 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 133 0 R - /K [25 26 136 0 R 29 135 0 R 31] - /Pg 5270 0 R ->> -endobj - -135 0 obj -<< - /Type /StructElem - /S /Link - /P 134 0 R - /K [30 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5260 0 R - >>] - /Pg 5270 0 R ->> -endobj - -136 0 obj -<< - /Type /StructElem - /S /Em - /P 134 0 R - /K [27 28] - /Pg 5270 0 R ->> -endobj - -137 0 obj -<< - /Type /StructElem - /S /Lbl - /P 132 0 R - /K [138 0 R] ->> -endobj - -138 0 obj -<< - /Type /StructElem - /S /Link - /P 137 0 R - /K [24 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5259 0 R - >>] - /Pg 5270 0 R ->> -endobj - -139 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [144 0 R 140 0 R] ->> -endobj - -140 0 obj -<< - /Type /StructElem - /S /LBody - /P 139 0 R - /K [141 0 R] ->> -endobj - -141 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 140 0 R - /K [16 17 18 143 0 R 20 21 142 0 R 23] - /Pg 5270 0 R ->> -endobj - -142 0 obj -<< - /Type /StructElem - /S /Link - /P 141 0 R - /K [22 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5258 0 R - >>] - /Pg 5270 0 R ->> -endobj - -143 0 obj -<< - /Type /StructElem - /S /Em - /P 141 0 R - /K [19] - /Pg 5270 0 R ->> -endobj - -144 0 obj -<< - /Type /StructElem - /S /Lbl - /P 139 0 R - /K [145 0 R] ->> -endobj - -145 0 obj -<< - /Type /StructElem - /S /Link - /P 144 0 R - /K [15 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5257 0 R - >>] - /Pg 5270 0 R ->> -endobj - -146 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [150 0 R 147 0 R] ->> -endobj - -147 0 obj -<< - /Type /StructElem - /S /LBody - /P 146 0 R - /K [148 0 R] ->> -endobj - -148 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 147 0 R - /K [12 149 0 R 14] - /Pg 5270 0 R ->> -endobj - -149 0 obj -<< - /Type /StructElem - /S /Em - /P 148 0 R - /K [13] - /Pg 5270 0 R ->> -endobj - -150 0 obj -<< - /Type /StructElem - /S /Lbl - /P 146 0 R - /K [151 0 R] ->> -endobj - -151 0 obj -<< - /Type /StructElem - /S /Link - /P 150 0 R - /K [11 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5256 0 R - >>] - /Pg 5270 0 R ->> -endobj - -152 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [155 0 R 153 0 R] ->> -endobj - -153 0 obj -<< - /Type /StructElem - /S /LBody - /P 152 0 R - /K [154 0 R] ->> -endobj - -154 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 153 0 R - /K [10] - /Pg 5270 0 R ->> -endobj - -155 0 obj -<< - /Type /StructElem - /S /Lbl - /P 152 0 R - /K [156 0 R] ->> -endobj - -156 0 obj -<< - /Type /StructElem - /S /Link - /P 155 0 R - /K [9 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5255 0 R - >>] - /Pg 5270 0 R ->> -endobj - -157 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [162 0 R 158 0 R] ->> -endobj - -158 0 obj -<< - /Type /StructElem - /S /LBody - /P 157 0 R - /K [159 0 R] ->> -endobj - -159 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 158 0 R - /K [1 2 161 0 R 6 160 0 R 8] - /Pg 5270 0 R ->> -endobj - -160 0 obj -<< - /Type /StructElem - /S /Link - /P 159 0 R - /K [7 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5254 0 R - >>] - /Pg 5270 0 R ->> -endobj - -161 0 obj -<< - /Type /StructElem - /S /Em - /P 159 0 R - /K [3 4 5] - /Pg 5270 0 R ->> -endobj - -162 0 obj -<< - /Type /StructElem - /S /Lbl - /P 157 0 R - /K [163 0 R] ->> -endobj - -163 0 obj -<< - /Type /StructElem - /S /Link - /P 162 0 R - /K [0 << - /Type /OBJR - /Pg 5270 0 R - /Obj 5253 0 R - >>] - /Pg 5270 0 R ->> -endobj - -164 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [169 0 R 165 0 R] ->> -endobj - -165 0 obj -<< - /Type /StructElem - /S /LBody - /P 164 0 R - /K [166 0 R] ->> -endobj - -166 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 165 0 R - /K [106 168 0 R 110 167 0 R 112] - /Pg 5251 0 R ->> -endobj - -167 0 obj -<< - /Type /StructElem - /S /Link - /P 166 0 R - /K [111 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5250 0 R - >>] - /Pg 5251 0 R ->> -endobj - -168 0 obj -<< - /Type /StructElem - /S /Em - /P 166 0 R - /K [107 108 109] - /Pg 5251 0 R ->> -endobj - -169 0 obj -<< - /Type /StructElem - /S /Lbl - /P 164 0 R - /K [170 0 R] ->> -endobj - -170 0 obj -<< - /Type /StructElem - /S /Link - /P 169 0 R - /K [105 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5249 0 R - >>] - /Pg 5251 0 R ->> -endobj - -171 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [176 0 R 172 0 R] ->> -endobj - -172 0 obj -<< - /Type /StructElem - /S /LBody - /P 171 0 R - /K [173 0 R] ->> -endobj - -173 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 172 0 R - /K [98 175 0 R 102 174 0 R 104] - /Pg 5251 0 R ->> -endobj - -174 0 obj -<< - /Type /StructElem - /S /Link - /P 173 0 R - /K [103 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5248 0 R - >>] - /Pg 5251 0 R ->> -endobj - -175 0 obj -<< - /Type /StructElem - /S /Em - /P 173 0 R - /K [99 100 101] - /Pg 5251 0 R ->> -endobj - -176 0 obj -<< - /Type /StructElem - /S /Lbl - /P 171 0 R - /K [177 0 R] ->> -endobj - -177 0 obj -<< - /Type /StructElem - /S /Link - /P 176 0 R - /K [97 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5247 0 R - >>] - /Pg 5251 0 R ->> -endobj - -178 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [183 0 R 179 0 R] ->> -endobj - -179 0 obj -<< - /Type /StructElem - /S /LBody - /P 178 0 R - /K [180 0 R] ->> -endobj - -180 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 179 0 R - /K [90 91 182 0 R 94 181 0 R 96] - /Pg 5251 0 R ->> -endobj - -181 0 obj -<< - /Type /StructElem - /S /Link - /P 180 0 R - /K [95 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5246 0 R - >>] - /Pg 5251 0 R ->> -endobj - -182 0 obj -<< - /Type /StructElem - /S /Em - /P 180 0 R - /K [92 93] - /Pg 5251 0 R ->> -endobj - -183 0 obj -<< - /Type /StructElem - /S /Lbl - /P 178 0 R - /K [184 0 R] ->> -endobj - -184 0 obj -<< - /Type /StructElem - /S /Link - /P 183 0 R - /K [89 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5245 0 R - >>] - /Pg 5251 0 R ->> -endobj - -185 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [190 0 R 186 0 R] ->> -endobj - -186 0 obj -<< - /Type /StructElem - /S /LBody - /P 185 0 R - /K [187 0 R] ->> -endobj - -187 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 186 0 R - /K [81 82 83 189 0 R 86 188 0 R 88] - /Pg 5251 0 R ->> -endobj - -188 0 obj -<< - /Type /StructElem - /S /Link - /P 187 0 R - /K [87 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5244 0 R - >>] - /Pg 5251 0 R ->> -endobj - -189 0 obj -<< - /Type /StructElem - /S /Em - /P 187 0 R - /K [84 85] - /Pg 5251 0 R ->> -endobj - -190 0 obj -<< - /Type /StructElem - /S /Lbl - /P 185 0 R - /K [191 0 R] ->> -endobj - -191 0 obj -<< - /Type /StructElem - /S /Link - /P 190 0 R - /K [80 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5243 0 R - >>] - /Pg 5251 0 R ->> -endobj - -192 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [197 0 R 193 0 R] ->> -endobj - -193 0 obj -<< - /Type /StructElem - /S /LBody - /P 192 0 R - /K [194 0 R] ->> -endobj - -194 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 193 0 R - /K [72 196 0 R 76 77 195 0 R 79] - /Pg 5251 0 R ->> -endobj - -195 0 obj -<< - /Type /StructElem - /S /Link - /P 194 0 R - /K [78 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5242 0 R - >>] - /Pg 5251 0 R ->> -endobj - -196 0 obj -<< - /Type /StructElem - /S /Em - /P 194 0 R - /K [73 74 75] - /Pg 5251 0 R ->> -endobj - -197 0 obj -<< - /Type /StructElem - /S /Lbl - /P 192 0 R - /K [198 0 R] ->> -endobj - -198 0 obj -<< - /Type /StructElem - /S /Link - /P 197 0 R - /K [71 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5241 0 R - >>] - /Pg 5251 0 R ->> -endobj - -199 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [204 0 R 200 0 R] ->> -endobj - -200 0 obj -<< - /Type /StructElem - /S /LBody - /P 199 0 R - /K [201 0 R] ->> -endobj - -201 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 200 0 R - /K [66 203 0 R 68 202 0 R 70] - /Pg 5251 0 R ->> -endobj - -202 0 obj -<< - /Type /StructElem - /S /Link - /P 201 0 R - /K [69 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5240 0 R - >>] - /Pg 5251 0 R ->> -endobj - -203 0 obj -<< - /Type /StructElem - /S /Em - /P 201 0 R - /K [67] - /Pg 5251 0 R ->> -endobj - -204 0 obj -<< - /Type /StructElem - /S /Lbl - /P 199 0 R - /K [205 0 R] ->> -endobj - -205 0 obj -<< - /Type /StructElem - /S /Link - /P 204 0 R - /K [65 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5239 0 R - >>] - /Pg 5251 0 R ->> -endobj - -206 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [209 0 R 207 0 R] ->> -endobj - -207 0 obj -<< - /Type /StructElem - /S /LBody - /P 206 0 R - /K [208 0 R] ->> -endobj - -208 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 207 0 R - /K [64] - /Pg 5251 0 R ->> -endobj - -209 0 obj -<< - /Type /StructElem - /S /Lbl - /P 206 0 R - /K [210 0 R] ->> -endobj - -210 0 obj -<< - /Type /StructElem - /S /Link - /P 209 0 R - /K [63 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5238 0 R - >>] - /Pg 5251 0 R ->> -endobj - -211 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [214 0 R 212 0 R] ->> -endobj - -212 0 obj -<< - /Type /StructElem - /S /LBody - /P 211 0 R - /K [213 0 R] ->> -endobj - -213 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 212 0 R - /K [61 62] - /Pg 5251 0 R ->> -endobj - -214 0 obj -<< - /Type /StructElem - /S /Lbl - /P 211 0 R - /K [215 0 R] ->> -endobj - -215 0 obj -<< - /Type /StructElem - /S /Link - /P 214 0 R - /K [60 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5237 0 R - >>] - /Pg 5251 0 R ->> -endobj - -216 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [220 0 R 217 0 R] ->> -endobj - -217 0 obj -<< - /Type /StructElem - /S /LBody - /P 216 0 R - /K [218 0 R] ->> -endobj - -218 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 217 0 R - /K [56 219 0 R 59] - /Pg 5251 0 R ->> -endobj - -219 0 obj -<< - /Type /StructElem - /S /Em - /P 218 0 R - /K [57 58] - /Pg 5251 0 R ->> -endobj - -220 0 obj -<< - /Type /StructElem - /S /Lbl - /P 216 0 R - /K [221 0 R] ->> -endobj - -221 0 obj -<< - /Type /StructElem - /S /Link - /P 220 0 R - /K [55 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5236 0 R - >>] - /Pg 5251 0 R ->> -endobj - -222 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [227 0 R 223 0 R] ->> -endobj - -223 0 obj -<< - /Type /StructElem - /S /LBody - /P 222 0 R - /K [224 0 R] ->> -endobj - -224 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 223 0 R - /K [48 49 226 0 R 52 225 0 R 54] - /Pg 5251 0 R ->> -endobj - -225 0 obj -<< - /Type /StructElem - /S /Link - /P 224 0 R - /K [53 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5235 0 R - >>] - /Pg 5251 0 R ->> -endobj - -226 0 obj -<< - /Type /StructElem - /S /Em - /P 224 0 R - /K [50 51] - /Pg 5251 0 R ->> -endobj - -227 0 obj -<< - /Type /StructElem - /S /Lbl - /P 222 0 R - /K [228 0 R] ->> -endobj - -228 0 obj -<< - /Type /StructElem - /S /Link - /P 227 0 R - /K [47 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5234 0 R - >>] - /Pg 5251 0 R ->> -endobj - -229 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [234 0 R 230 0 R] ->> -endobj - -230 0 obj -<< - /Type /StructElem - /S /LBody - /P 229 0 R - /K [231 0 R] ->> -endobj - -231 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 230 0 R - /K [40 41 233 0 R 43 44 232 0 R 46] - /Pg 5251 0 R ->> -endobj - -232 0 obj -<< - /Type /StructElem - /S /Link - /P 231 0 R - /K [45 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5233 0 R - >>] - /Pg 5251 0 R ->> -endobj - -233 0 obj -<< - /Type /StructElem - /S /Em - /P 231 0 R - /K [42] - /Pg 5251 0 R ->> -endobj - -234 0 obj -<< - /Type /StructElem - /S /Lbl - /P 229 0 R - /K [235 0 R] ->> -endobj - -235 0 obj -<< - /Type /StructElem - /S /Link - /P 234 0 R - /K [39 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5232 0 R - >>] - /Pg 5251 0 R ->> -endobj - -236 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [241 0 R 237 0 R] ->> -endobj - -237 0 obj -<< - /Type /StructElem - /S /LBody - /P 236 0 R - /K [238 0 R] ->> -endobj - -238 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 237 0 R - /K [31 32 240 0 R 35 36 239 0 R 38] - /Pg 5251 0 R ->> -endobj - -239 0 obj -<< - /Type /StructElem - /S /Link - /P 238 0 R - /K [37 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5231 0 R - >>] - /Pg 5251 0 R ->> -endobj - -240 0 obj -<< - /Type /StructElem - /S /Em - /P 238 0 R - /K [33 34] - /Pg 5251 0 R ->> -endobj - -241 0 obj -<< - /Type /StructElem - /S /Lbl - /P 236 0 R - /K [242 0 R] ->> -endobj - -242 0 obj -<< - /Type /StructElem - /S /Link - /P 241 0 R - /K [30 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5230 0 R - >>] - /Pg 5251 0 R ->> -endobj - -243 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [248 0 R 244 0 R] ->> -endobj - -244 0 obj -<< - /Type /StructElem - /S /LBody - /P 243 0 R - /K [245 0 R] ->> -endobj - -245 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 244 0 R - /K [23 247 0 R 26 27 246 0 R 29] - /Pg 5251 0 R ->> -endobj - -246 0 obj -<< - /Type /StructElem - /S /Link - /P 245 0 R - /K [28 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5229 0 R - >>] - /Pg 5251 0 R ->> -endobj - -247 0 obj -<< - /Type /StructElem - /S /Em - /P 245 0 R - /K [24 25] - /Pg 5251 0 R ->> -endobj - -248 0 obj -<< - /Type /StructElem - /S /Lbl - /P 243 0 R - /K [249 0 R] ->> -endobj - -249 0 obj -<< - /Type /StructElem - /S /Link - /P 248 0 R - /K [22 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5228 0 R - >>] - /Pg 5251 0 R ->> -endobj - -250 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [255 0 R 251 0 R] ->> -endobj - -251 0 obj -<< - /Type /StructElem - /S /LBody - /P 250 0 R - /K [252 0 R] ->> -endobj - -252 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 251 0 R - /K [15 16 254 0 R 19 253 0 R 21] - /Pg 5251 0 R ->> -endobj - -253 0 obj -<< - /Type /StructElem - /S /Link - /P 252 0 R - /K [20 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5227 0 R - >>] - /Pg 5251 0 R ->> -endobj - -254 0 obj -<< - /Type /StructElem - /S /Em - /P 252 0 R - /K [17 18] - /Pg 5251 0 R ->> -endobj - -255 0 obj -<< - /Type /StructElem - /S /Lbl - /P 250 0 R - /K [256 0 R] ->> -endobj - -256 0 obj -<< - /Type /StructElem - /S /Link - /P 255 0 R - /K [14 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5226 0 R - >>] - /Pg 5251 0 R ->> -endobj - -257 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [262 0 R 258 0 R] ->> -endobj - -258 0 obj -<< - /Type /StructElem - /S /LBody - /P 257 0 R - /K [259 0 R] ->> -endobj - -259 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 258 0 R - /K [6 7 8 261 0 R 11 260 0 R 13] - /Pg 5251 0 R ->> -endobj - -260 0 obj -<< - /Type /StructElem - /S /Link - /P 259 0 R - /K [12 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5225 0 R - >>] - /Pg 5251 0 R ->> -endobj - -261 0 obj -<< - /Type /StructElem - /S /Em - /P 259 0 R - /K [9 10] - /Pg 5251 0 R ->> -endobj - -262 0 obj -<< - /Type /StructElem - /S /Lbl - /P 257 0 R - /K [263 0 R] ->> -endobj - -263 0 obj -<< - /Type /StructElem - /S /Link - /P 262 0 R - /K [5 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5224 0 R - >>] - /Pg 5251 0 R ->> -endobj - -264 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [269 0 R 265 0 R] ->> -endobj - -265 0 obj -<< - /Type /StructElem - /S /LBody - /P 264 0 R - /K [266 0 R] ->> -endobj - -266 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 265 0 R - /K [108 109 268 0 R << - /Type /MCR - /MCID 1 - /Pg 5251 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 5251 0 R - >> 267 0 R << - /Type /MCR - /MCID 4 - /Pg 5251 0 R - >>] - /Pg 5221 0 R ->> -endobj - -267 0 obj -<< - /Type /StructElem - /S /Link - /P 266 0 R - /K [3 << - /Type /OBJR - /Pg 5251 0 R - /Obj 5223 0 R - >>] - /Pg 5251 0 R ->> -endobj - -268 0 obj -<< - /Type /StructElem - /S /Em - /P 266 0 R - /K [110 << - /Type /MCR - /MCID 0 - /Pg 5251 0 R - >>] - /Pg 5221 0 R ->> -endobj - -269 0 obj -<< - /Type /StructElem - /S /Lbl - /P 264 0 R - /K [270 0 R] ->> -endobj - -270 0 obj -<< - /Type /StructElem - /S /Link - /P 269 0 R - /K [107 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5220 0 R - >>] - /Pg 5221 0 R ->> -endobj - -271 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [277 0 R 272 0 R] ->> -endobj - -272 0 obj -<< - /Type /StructElem - /S /LBody - /P 271 0 R - /K [273 0 R] ->> -endobj - -273 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 272 0 R - /K [98 276 0 R 100 275 0 R 103 104 274 0 R 106] - /Pg 5221 0 R ->> -endobj - -274 0 obj -<< - /Type /StructElem - /S /Link - /P 273 0 R - /K [105 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5219 0 R - >>] - /Pg 5221 0 R ->> -endobj - -275 0 obj -<< - /Type /StructElem - /S /Em - /P 273 0 R - /K [101 102] - /Pg 5221 0 R ->> -endobj - -276 0 obj -<< - /Type /StructElem - /S /Em - /P 273 0 R - /K [99] - /Pg 5221 0 R ->> -endobj - -277 0 obj -<< - /Type /StructElem - /S /Lbl - /P 271 0 R - /K [278 0 R] ->> -endobj - -278 0 obj -<< - /Type /StructElem - /S /Link - /P 277 0 R - /K [97 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5218 0 R - >>] - /Pg 5221 0 R ->> -endobj - -279 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [284 0 R 280 0 R] ->> -endobj - -280 0 obj -<< - /Type /StructElem - /S /LBody - /P 279 0 R - /K [281 0 R] ->> -endobj - -281 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 280 0 R - /K [90 91 283 0 R 93 94 282 0 R 96] - /Pg 5221 0 R ->> -endobj - -282 0 obj -<< - /Type /StructElem - /S /Link - /P 281 0 R - /K [95 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5217 0 R - >>] - /Pg 5221 0 R ->> -endobj - -283 0 obj -<< - /Type /StructElem - /S /Em - /P 281 0 R - /K [92] - /Pg 5221 0 R ->> -endobj - -284 0 obj -<< - /Type /StructElem - /S /Lbl - /P 279 0 R - /K [285 0 R] ->> -endobj - -285 0 obj -<< - /Type /StructElem - /S /Link - /P 284 0 R - /K [89 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5216 0 R - >>] - /Pg 5221 0 R ->> -endobj - -286 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [291 0 R 287 0 R] ->> -endobj - -287 0 obj -<< - /Type /StructElem - /S /LBody - /P 286 0 R - /K [288 0 R] ->> -endobj - -288 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 287 0 R - /K [82 83 290 0 R 86 289 0 R 88] - /Pg 5221 0 R ->> -endobj - -289 0 obj -<< - /Type /StructElem - /S /Link - /P 288 0 R - /K [87 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5215 0 R - >>] - /Pg 5221 0 R ->> -endobj - -290 0 obj -<< - /Type /StructElem - /S /Em - /P 288 0 R - /K [84 85] - /Pg 5221 0 R ->> -endobj - -291 0 obj -<< - /Type /StructElem - /S /Lbl - /P 286 0 R - /K [292 0 R] ->> -endobj - -292 0 obj -<< - /Type /StructElem - /S /Link - /P 291 0 R - /K [81 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5214 0 R - >>] - /Pg 5221 0 R ->> -endobj - -293 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [298 0 R 294 0 R] ->> -endobj - -294 0 obj -<< - /Type /StructElem - /S /LBody - /P 293 0 R - /K [295 0 R] ->> -endobj - -295 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 294 0 R - /K [75 297 0 R 78 296 0 R 80] - /Pg 5221 0 R ->> -endobj - -296 0 obj -<< - /Type /StructElem - /S /Link - /P 295 0 R - /K [79 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5213 0 R - >>] - /Pg 5221 0 R ->> -endobj - -297 0 obj -<< - /Type /StructElem - /S /Em - /P 295 0 R - /K [76 77] - /Pg 5221 0 R ->> -endobj - -298 0 obj -<< - /Type /StructElem - /S /Lbl - /P 293 0 R - /K [299 0 R] ->> -endobj - -299 0 obj -<< - /Type /StructElem - /S /Link - /P 298 0 R - /K [74 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5212 0 R - >>] - /Pg 5221 0 R ->> -endobj - -300 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [305 0 R 301 0 R] ->> -endobj - -301 0 obj -<< - /Type /StructElem - /S /LBody - /P 300 0 R - /K [302 0 R] ->> -endobj - -302 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 301 0 R - /K [67 68 304 0 R 70 71 303 0 R 73] - /Pg 5221 0 R ->> -endobj - -303 0 obj -<< - /Type /StructElem - /S /Link - /P 302 0 R - /K [72 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5211 0 R - >>] - /Pg 5221 0 R ->> -endobj - -304 0 obj -<< - /Type /StructElem - /S /Em - /P 302 0 R - /K [69] - /Pg 5221 0 R ->> -endobj - -305 0 obj -<< - /Type /StructElem - /S /Lbl - /P 300 0 R - /K [306 0 R] ->> -endobj - -306 0 obj -<< - /Type /StructElem - /S /Link - /P 305 0 R - /K [66 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5210 0 R - >>] - /Pg 5221 0 R ->> -endobj - -307 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [312 0 R 308 0 R] ->> -endobj - -308 0 obj -<< - /Type /StructElem - /S /LBody - /P 307 0 R - /K [309 0 R] ->> -endobj - -309 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 308 0 R - /K [58 59 60 311 0 R 62 310 0 R 65] - /Pg 5221 0 R ->> -endobj - -310 0 obj -<< - /Type /StructElem - /S /Link - /P 309 0 R - /K [63 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5208 0 R - >> 64 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5209 0 R - >>] - /Pg 5221 0 R ->> -endobj - -311 0 obj -<< - /Type /StructElem - /S /Em - /P 309 0 R - /K [61] - /Pg 5221 0 R ->> -endobj - -312 0 obj -<< - /Type /StructElem - /S /Lbl - /P 307 0 R - /K [313 0 R] ->> -endobj - -313 0 obj -<< - /Type /StructElem - /S /Link - /P 312 0 R - /K [57 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5207 0 R - >>] - /Pg 5221 0 R ->> -endobj - -314 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [319 0 R 315 0 R] ->> -endobj - -315 0 obj -<< - /Type /StructElem - /S /LBody - /P 314 0 R - /K [316 0 R] ->> -endobj - -316 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 315 0 R - /K [51 52 318 0 R 54 317 0 R 56] - /Pg 5221 0 R ->> -endobj - -317 0 obj -<< - /Type /StructElem - /S /Link - /P 316 0 R - /K [55 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5206 0 R - >>] - /Pg 5221 0 R ->> -endobj - -318 0 obj -<< - /Type /StructElem - /S /Em - /P 316 0 R - /K [53] - /Pg 5221 0 R ->> -endobj - -319 0 obj -<< - /Type /StructElem - /S /Lbl - /P 314 0 R - /K [320 0 R] ->> -endobj - -320 0 obj -<< - /Type /StructElem - /S /Link - /P 319 0 R - /K [50 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5205 0 R - >>] - /Pg 5221 0 R ->> -endobj - -321 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [326 0 R 322 0 R] ->> -endobj - -322 0 obj -<< - /Type /StructElem - /S /LBody - /P 321 0 R - /K [323 0 R] ->> -endobj - -323 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 322 0 R - /K [44 45 325 0 R 47 324 0 R 49] - /Pg 5221 0 R ->> -endobj - -324 0 obj -<< - /Type /StructElem - /S /Link - /P 323 0 R - /K [48 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5204 0 R - >>] - /Pg 5221 0 R ->> -endobj - -325 0 obj -<< - /Type /StructElem - /S /Em - /P 323 0 R - /K [46] - /Pg 5221 0 R ->> -endobj - -326 0 obj -<< - /Type /StructElem - /S /Lbl - /P 321 0 R - /K [327 0 R] ->> -endobj - -327 0 obj -<< - /Type /StructElem - /S /Link - /P 326 0 R - /K [43 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5203 0 R - >>] - /Pg 5221 0 R ->> -endobj - -328 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [333 0 R 329 0 R] ->> -endobj - -329 0 obj -<< - /Type /StructElem - /S /LBody - /P 328 0 R - /K [330 0 R] ->> -endobj - -330 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 329 0 R - /K [36 332 0 R 39 40 331 0 R 42] - /Pg 5221 0 R ->> -endobj - -331 0 obj -<< - /Type /StructElem - /S /Link - /P 330 0 R - /K [41 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5202 0 R - >>] - /Pg 5221 0 R ->> -endobj - -332 0 obj -<< - /Type /StructElem - /S /Em - /P 330 0 R - /K [37 38] - /Pg 5221 0 R ->> -endobj - -333 0 obj -<< - /Type /StructElem - /S /Lbl - /P 328 0 R - /K [334 0 R] ->> -endobj - -334 0 obj -<< - /Type /StructElem - /S /Link - /P 333 0 R - /K [35 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5201 0 R - >>] - /Pg 5221 0 R ->> -endobj - -335 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [339 0 R 336 0 R] ->> -endobj - -336 0 obj -<< - /Type /StructElem - /S /LBody - /P 335 0 R - /K [337 0 R] ->> -endobj - -337 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 336 0 R - /K [31 32 33 338 0 R] - /Pg 5221 0 R ->> -endobj - -338 0 obj -<< - /Type /StructElem - /S /Link - /P 337 0 R - /K [34 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5200 0 R - >>] - /Pg 5221 0 R ->> -endobj - -339 0 obj -<< - /Type /StructElem - /S /Lbl - /P 335 0 R - /K [340 0 R] ->> -endobj - -340 0 obj -<< - /Type /StructElem - /S /Link - /P 339 0 R - /K [30 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5199 0 R - >>] - /Pg 5221 0 R ->> -endobj - -341 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [346 0 R 342 0 R] ->> -endobj - -342 0 obj -<< - /Type /StructElem - /S /LBody - /P 341 0 R - /K [343 0 R] ->> -endobj - -343 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 342 0 R - /K [23 24 345 0 R 27 344 0 R 29] - /Pg 5221 0 R ->> -endobj - -344 0 obj -<< - /Type /StructElem - /S /Link - /P 343 0 R - /K [28 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5198 0 R - >>] - /Pg 5221 0 R ->> -endobj - -345 0 obj -<< - /Type /StructElem - /S /Em - /P 343 0 R - /K [25 26] - /Pg 5221 0 R ->> -endobj - -346 0 obj -<< - /Type /StructElem - /S /Lbl - /P 341 0 R - /K [347 0 R] ->> -endobj - -347 0 obj -<< - /Type /StructElem - /S /Link - /P 346 0 R - /K [22 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5197 0 R - >>] - /Pg 5221 0 R ->> -endobj - -348 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [353 0 R 349 0 R] ->> -endobj - -349 0 obj -<< - /Type /StructElem - /S /LBody - /P 348 0 R - /K [350 0 R] ->> -endobj - -350 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 349 0 R - /K [15 16 352 0 R 18 19 351 0 R 21] - /Pg 5221 0 R ->> -endobj - -351 0 obj -<< - /Type /StructElem - /S /Link - /P 350 0 R - /K [20 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5196 0 R - >>] - /Pg 5221 0 R ->> -endobj - -352 0 obj -<< - /Type /StructElem - /S /Em - /P 350 0 R - /K [17] - /Pg 5221 0 R ->> -endobj - -353 0 obj -<< - /Type /StructElem - /S /Lbl - /P 348 0 R - /K [354 0 R] ->> -endobj - -354 0 obj -<< - /Type /StructElem - /S /Link - /P 353 0 R - /K [14 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5195 0 R - >>] - /Pg 5221 0 R ->> -endobj - -355 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [360 0 R 356 0 R] ->> -endobj - -356 0 obj -<< - /Type /StructElem - /S /LBody - /P 355 0 R - /K [357 0 R] ->> -endobj - -357 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 356 0 R - /K [8 359 0 R 10 11 358 0 R 13] - /Pg 5221 0 R ->> -endobj - -358 0 obj -<< - /Type /StructElem - /S /Link - /P 357 0 R - /K [12 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5194 0 R - >>] - /Pg 5221 0 R ->> -endobj - -359 0 obj -<< - /Type /StructElem - /S /Em - /P 357 0 R - /K [9] - /Pg 5221 0 R ->> -endobj - -360 0 obj -<< - /Type /StructElem - /S /Lbl - /P 355 0 R - /K [361 0 R] ->> -endobj - -361 0 obj -<< - /Type /StructElem - /S /Link - /P 360 0 R - /K [7 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5193 0 R - >>] - /Pg 5221 0 R ->> -endobj - -362 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [367 0 R 363 0 R] ->> -endobj - -363 0 obj -<< - /Type /StructElem - /S /LBody - /P 362 0 R - /K [364 0 R] ->> -endobj - -364 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 363 0 R - /K [1 366 0 R 3 4 365 0 R 6] - /Pg 5221 0 R ->> -endobj - -365 0 obj -<< - /Type /StructElem - /S /Link - /P 364 0 R - /K [5 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5192 0 R - >>] - /Pg 5221 0 R ->> -endobj - -366 0 obj -<< - /Type /StructElem - /S /Em - /P 364 0 R - /K [2] - /Pg 5221 0 R ->> -endobj - -367 0 obj -<< - /Type /StructElem - /S /Lbl - /P 362 0 R - /K [368 0 R] ->> -endobj - -368 0 obj -<< - /Type /StructElem - /S /Link - /P 367 0 R - /K [0 << - /Type /OBJR - /Pg 5221 0 R - /Obj 5191 0 R - >>] - /Pg 5221 0 R ->> -endobj - -369 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [374 0 R 370 0 R] ->> -endobj - -370 0 obj -<< - /Type /StructElem - /S /LBody - /P 369 0 R - /K [371 0 R] ->> -endobj - -371 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 370 0 R - /K [101 373 0 R 104 105 372 0 R 107] - /Pg 5189 0 R ->> -endobj - -372 0 obj -<< - /Type /StructElem - /S /Link - /P 371 0 R - /K [106 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5188 0 R - >>] - /Pg 5189 0 R ->> -endobj - -373 0 obj -<< - /Type /StructElem - /S /Em - /P 371 0 R - /K [102 103] - /Pg 5189 0 R ->> -endobj - -374 0 obj -<< - /Type /StructElem - /S /Lbl - /P 369 0 R - /K [375 0 R] ->> -endobj - -375 0 obj -<< - /Type /StructElem - /S /Link - /P 374 0 R - /K [100 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5187 0 R - >>] - /Pg 5189 0 R ->> -endobj - -376 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [381 0 R 377 0 R] ->> -endobj - -377 0 obj -<< - /Type /StructElem - /S /LBody - /P 376 0 R - /K [378 0 R] ->> -endobj - -378 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 377 0 R - /K [93 94 380 0 R 96 97 379 0 R 99] - /Pg 5189 0 R ->> -endobj - -379 0 obj -<< - /Type /StructElem - /S /Link - /P 378 0 R - /K [98 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5186 0 R - >>] - /Pg 5189 0 R ->> -endobj - -380 0 obj -<< - /Type /StructElem - /S /Em - /P 378 0 R - /K [95] - /Pg 5189 0 R ->> -endobj - -381 0 obj -<< - /Type /StructElem - /S /Lbl - /P 376 0 R - /K [382 0 R] ->> -endobj - -382 0 obj -<< - /Type /StructElem - /S /Link - /P 381 0 R - /K [92 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5185 0 R - >>] - /Pg 5189 0 R ->> -endobj - -383 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [388 0 R 384 0 R] ->> -endobj - -384 0 obj -<< - /Type /StructElem - /S /LBody - /P 383 0 R - /K [385 0 R] ->> -endobj - -385 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 384 0 R - /K [84 85 387 0 R 88 89 386 0 R 91] - /Pg 5189 0 R ->> -endobj - -386 0 obj -<< - /Type /StructElem - /S /Link - /P 385 0 R - /K [90 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5184 0 R - >>] - /Pg 5189 0 R ->> -endobj - -387 0 obj -<< - /Type /StructElem - /S /Em - /P 385 0 R - /K [86 87] - /Pg 5189 0 R ->> -endobj - -388 0 obj -<< - /Type /StructElem - /S /Lbl - /P 383 0 R - /K [389 0 R] ->> -endobj - -389 0 obj -<< - /Type /StructElem - /S /Link - /P 388 0 R - /K [83 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5183 0 R - >>] - /Pg 5189 0 R ->> -endobj - -390 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [395 0 R 391 0 R] ->> -endobj - -391 0 obj -<< - /Type /StructElem - /S /LBody - /P 390 0 R - /K [392 0 R] ->> -endobj - -392 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 391 0 R - /K [76 77 394 0 R 79 80 393 0 R 82] - /Pg 5189 0 R ->> -endobj - -393 0 obj -<< - /Type /StructElem - /S /Link - /P 392 0 R - /K [81 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5182 0 R - >>] - /Pg 5189 0 R ->> -endobj - -394 0 obj -<< - /Type /StructElem - /S /Em - /P 392 0 R - /K [78] - /Pg 5189 0 R ->> -endobj - -395 0 obj -<< - /Type /StructElem - /S /Lbl - /P 390 0 R - /K [396 0 R] ->> -endobj - -396 0 obj -<< - /Type /StructElem - /S /Link - /P 395 0 R - /K [75 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5181 0 R - >>] - /Pg 5189 0 R ->> -endobj - -397 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [402 0 R 398 0 R] ->> -endobj - -398 0 obj -<< - /Type /StructElem - /S /LBody - /P 397 0 R - /K [399 0 R] ->> -endobj - -399 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 398 0 R - /K [69 401 0 R 72 400 0 R 74] - /Pg 5189 0 R ->> -endobj - -400 0 obj -<< - /Type /StructElem - /S /Link - /P 399 0 R - /K [73 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5180 0 R - >>] - /Pg 5189 0 R ->> -endobj - -401 0 obj -<< - /Type /StructElem - /S /Em - /P 399 0 R - /K [70 71] - /Pg 5189 0 R ->> -endobj - -402 0 obj -<< - /Type /StructElem - /S /Lbl - /P 397 0 R - /K [403 0 R] ->> -endobj - -403 0 obj -<< - /Type /StructElem - /S /Link - /P 402 0 R - /K [68 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5179 0 R - >>] - /Pg 5189 0 R ->> -endobj - -404 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [409 0 R 405 0 R] ->> -endobj - -405 0 obj -<< - /Type /StructElem - /S /LBody - /P 404 0 R - /K [406 0 R] ->> -endobj - -406 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 405 0 R - /K [61 62 408 0 R 64 407 0 R 67] - /Pg 5189 0 R ->> -endobj - -407 0 obj -<< - /Type /StructElem - /S /Link - /P 406 0 R - /K [65 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5177 0 R - >> 66 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5178 0 R - >>] - /Pg 5189 0 R ->> -endobj - -408 0 obj -<< - /Type /StructElem - /S /Em - /P 406 0 R - /K [63] - /Pg 5189 0 R ->> -endobj - -409 0 obj -<< - /Type /StructElem - /S /Lbl - /P 404 0 R - /K [410 0 R] ->> -endobj - -410 0 obj -<< - /Type /StructElem - /S /Link - /P 409 0 R - /K [60 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5176 0 R - >>] - /Pg 5189 0 R ->> -endobj - -411 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [416 0 R 412 0 R] ->> -endobj - -412 0 obj -<< - /Type /StructElem - /S /LBody - /P 411 0 R - /K [413 0 R] ->> -endobj - -413 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 412 0 R - /K [51 52 415 0 R 57 414 0 R 59] - /Pg 5189 0 R ->> -endobj - -414 0 obj -<< - /Type /StructElem - /S /Link - /P 413 0 R - /K [58 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5175 0 R - >>] - /Pg 5189 0 R ->> -endobj - -415 0 obj -<< - /Type /StructElem - /S /Em - /P 413 0 R - /K [53 54 55 56] - /Pg 5189 0 R ->> -endobj - -416 0 obj -<< - /Type /StructElem - /S /Lbl - /P 411 0 R - /K [417 0 R] ->> -endobj - -417 0 obj -<< - /Type /StructElem - /S /Link - /P 416 0 R - /K [50 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5174 0 R - >>] - /Pg 5189 0 R ->> -endobj - -418 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [423 0 R 419 0 R] ->> -endobj - -419 0 obj -<< - /Type /StructElem - /S /LBody - /P 418 0 R - /K [420 0 R] ->> -endobj - -420 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 419 0 R - /K [43 422 0 R 46 47 421 0 R 49] - /Pg 5189 0 R ->> -endobj - -421 0 obj -<< - /Type /StructElem - /S /Link - /P 420 0 R - /K [48 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5173 0 R - >>] - /Pg 5189 0 R ->> -endobj - -422 0 obj -<< - /Type /StructElem - /S /Em - /P 420 0 R - /K [44 45] - /Pg 5189 0 R ->> -endobj - -423 0 obj -<< - /Type /StructElem - /S /Lbl - /P 418 0 R - /K [424 0 R] ->> -endobj - -424 0 obj -<< - /Type /StructElem - /S /Link - /P 423 0 R - /K [42 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5172 0 R - >>] - /Pg 5189 0 R ->> -endobj - -425 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [429 0 R 426 0 R] ->> -endobj - -426 0 obj -<< - /Type /StructElem - /S /LBody - /P 425 0 R - /K [427 0 R] ->> -endobj - -427 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 426 0 R - /K [39 428 0 R] - /Pg 5189 0 R ->> -endobj - -428 0 obj -<< - /Type /StructElem - /S /Link - /P 427 0 R - /K [40 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5170 0 R - >> 41 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5171 0 R - >>] - /Pg 5189 0 R ->> -endobj - -429 0 obj -<< - /Type /StructElem - /S /Lbl - /P 425 0 R - /K [430 0 R] ->> -endobj - -430 0 obj -<< - /Type /StructElem - /S /Link - /P 429 0 R - /K [38 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5169 0 R - >>] - /Pg 5189 0 R ->> -endobj - -431 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [436 0 R 432 0 R] ->> -endobj - -432 0 obj -<< - /Type /StructElem - /S /LBody - /P 431 0 R - /K [433 0 R] ->> -endobj - -433 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 432 0 R - /K [31 32 435 0 R 34 35 434 0 R 37] - /Pg 5189 0 R ->> -endobj - -434 0 obj -<< - /Type /StructElem - /S /Link - /P 433 0 R - /K [36 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5168 0 R - >>] - /Pg 5189 0 R ->> -endobj - -435 0 obj -<< - /Type /StructElem - /S /Em - /P 433 0 R - /K [33] - /Pg 5189 0 R ->> -endobj - -436 0 obj -<< - /Type /StructElem - /S /Lbl - /P 431 0 R - /K [437 0 R] ->> -endobj - -437 0 obj -<< - /Type /StructElem - /S /Link - /P 436 0 R - /K [30 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5167 0 R - >>] - /Pg 5189 0 R ->> -endobj - -438 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [442 0 R 439 0 R] ->> -endobj - -439 0 obj -<< - /Type /StructElem - /S /LBody - /P 438 0 R - /K [440 0 R] ->> -endobj - -440 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 439 0 R - /K [27 441 0 R] - /Pg 5189 0 R ->> -endobj - -441 0 obj -<< - /Type /StructElem - /S /Link - /P 440 0 R - /K [28 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5165 0 R - >> 29 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5166 0 R - >>] - /Pg 5189 0 R ->> -endobj - -442 0 obj -<< - /Type /StructElem - /S /Lbl - /P 438 0 R - /K [443 0 R] ->> -endobj - -443 0 obj -<< - /Type /StructElem - /S /Link - /P 442 0 R - /K [26 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5164 0 R - >>] - /Pg 5189 0 R ->> -endobj - -444 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [449 0 R 445 0 R] ->> -endobj - -445 0 obj -<< - /Type /StructElem - /S /LBody - /P 444 0 R - /K [446 0 R] ->> -endobj - -446 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 445 0 R - /K [20 448 0 R 23 447 0 R 25] - /Pg 5189 0 R ->> -endobj - -447 0 obj -<< - /Type /StructElem - /S /Link - /P 446 0 R - /K [24 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5163 0 R - >>] - /Pg 5189 0 R ->> -endobj - -448 0 obj -<< - /Type /StructElem - /S /Em - /P 446 0 R - /K [21 22] - /Pg 5189 0 R ->> -endobj - -449 0 obj -<< - /Type /StructElem - /S /Lbl - /P 444 0 R - /K [450 0 R] ->> -endobj - -450 0 obj -<< - /Type /StructElem - /S /Link - /P 449 0 R - /K [19 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5162 0 R - >>] - /Pg 5189 0 R ->> -endobj - -451 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [455 0 R 452 0 R] ->> -endobj - -452 0 obj -<< - /Type /StructElem - /S /LBody - /P 451 0 R - /K [453 0 R] ->> -endobj - -453 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 452 0 R - /K [15 454 0 R 18] - /Pg 5189 0 R ->> -endobj - -454 0 obj -<< - /Type /StructElem - /S /Em - /P 453 0 R - /K [16 17] - /Pg 5189 0 R ->> -endobj - -455 0 obj -<< - /Type /StructElem - /S /Lbl - /P 451 0 R - /K [456 0 R] ->> -endobj - -456 0 obj -<< - /Type /StructElem - /S /Link - /P 455 0 R - /K [14 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5161 0 R - >>] - /Pg 5189 0 R ->> -endobj - -457 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [462 0 R 458 0 R] ->> -endobj - -458 0 obj -<< - /Type /StructElem - /S /LBody - /P 457 0 R - /K [459 0 R] ->> -endobj - -459 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 458 0 R - /K [8 461 0 R 11 460 0 R 13] - /Pg 5189 0 R ->> -endobj - -460 0 obj -<< - /Type /StructElem - /S /Link - /P 459 0 R - /K [12 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5160 0 R - >>] - /Pg 5189 0 R ->> -endobj - -461 0 obj -<< - /Type /StructElem - /S /Em - /P 459 0 R - /K [9 10] - /Pg 5189 0 R ->> -endobj - -462 0 obj -<< - /Type /StructElem - /S /Lbl - /P 457 0 R - /K [463 0 R] ->> -endobj - -463 0 obj -<< - /Type /StructElem - /S /Link - /P 462 0 R - /K [7 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5159 0 R - >>] - /Pg 5189 0 R ->> -endobj - -464 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [469 0 R 465 0 R] ->> -endobj - -465 0 obj -<< - /Type /StructElem - /S /LBody - /P 464 0 R - /K [466 0 R] ->> -endobj - -466 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 465 0 R - /K [1 468 0 R 4 467 0 R 6] - /Pg 5189 0 R ->> -endobj - -467 0 obj -<< - /Type /StructElem - /S /Link - /P 466 0 R - /K [5 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5158 0 R - >>] - /Pg 5189 0 R ->> -endobj - -468 0 obj -<< - /Type /StructElem - /S /Em - /P 466 0 R - /K [2 3] - /Pg 5189 0 R ->> -endobj - -469 0 obj -<< - /Type /StructElem - /S /Lbl - /P 464 0 R - /K [470 0 R] ->> -endobj - -470 0 obj -<< - /Type /StructElem - /S /Link - /P 469 0 R - /K [0 << - /Type /OBJR - /Pg 5189 0 R - /Obj 5157 0 R - >>] - /Pg 5189 0 R ->> -endobj - -471 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [475 0 R 472 0 R] ->> -endobj - -472 0 obj -<< - /Type /StructElem - /S /LBody - /P 471 0 R - /K [473 0 R] ->> -endobj - -473 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 472 0 R - /K [95 96 474 0 R 99] - /Pg 5155 0 R ->> -endobj - -474 0 obj -<< - /Type /StructElem - /S /Em - /P 473 0 R - /K [97 98] - /Pg 5155 0 R ->> -endobj - -475 0 obj -<< - /Type /StructElem - /S /Lbl - /P 471 0 R - /K [476 0 R] ->> -endobj - -476 0 obj -<< - /Type /StructElem - /S /Link - /P 475 0 R - /K [94 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5154 0 R - >>] - /Pg 5155 0 R ->> -endobj - -477 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [482 0 R 478 0 R] ->> -endobj - -478 0 obj -<< - /Type /StructElem - /S /LBody - /P 477 0 R - /K [479 0 R] ->> -endobj - -479 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 478 0 R - /K [87 88 481 0 R 90 91 480 0 R 93] - /Pg 5155 0 R ->> -endobj - -480 0 obj -<< - /Type /StructElem - /S /Link - /P 479 0 R - /K [92 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5153 0 R - >>] - /Pg 5155 0 R ->> -endobj - -481 0 obj -<< - /Type /StructElem - /S /Em - /P 479 0 R - /K [89] - /Pg 5155 0 R ->> -endobj - -482 0 obj -<< - /Type /StructElem - /S /Lbl - /P 477 0 R - /K [483 0 R] ->> -endobj - -483 0 obj -<< - /Type /StructElem - /S /Link - /P 482 0 R - /K [86 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5152 0 R - >>] - /Pg 5155 0 R ->> -endobj - -484 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [488 0 R 485 0 R] ->> -endobj - -485 0 obj -<< - /Type /StructElem - /S /LBody - /P 484 0 R - /K [486 0 R] ->> -endobj - -486 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 485 0 R - /K [81 82 83 487 0 R 85] - /Pg 5155 0 R ->> -endobj - -487 0 obj -<< - /Type /StructElem - /S /Em - /P 486 0 R - /K [84] - /Pg 5155 0 R ->> -endobj - -488 0 obj -<< - /Type /StructElem - /S /Lbl - /P 484 0 R - /K [489 0 R] ->> -endobj - -489 0 obj -<< - /Type /StructElem - /S /Link - /P 488 0 R - /K [80 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5151 0 R - >>] - /Pg 5155 0 R ->> -endobj - -490 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [494 0 R 491 0 R] ->> -endobj - -491 0 obj -<< - /Type /StructElem - /S /LBody - /P 490 0 R - /K [492 0 R] ->> -endobj - -492 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 491 0 R - /K [76 493 0 R 79] - /Pg 5155 0 R ->> -endobj - -493 0 obj -<< - /Type /StructElem - /S /Em - /P 492 0 R - /K [77 78] - /Pg 5155 0 R ->> -endobj - -494 0 obj -<< - /Type /StructElem - /S /Lbl - /P 490 0 R - /K [495 0 R] ->> -endobj - -495 0 obj -<< - /Type /StructElem - /S /Link - /P 494 0 R - /K [75 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5150 0 R - >>] - /Pg 5155 0 R ->> -endobj - -496 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [500 0 R 497 0 R] ->> -endobj - -497 0 obj -<< - /Type /StructElem - /S /LBody - /P 496 0 R - /K [498 0 R] ->> -endobj - -498 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 497 0 R - /K [71 72 499 0 R 74] - /Pg 5155 0 R ->> -endobj - -499 0 obj -<< - /Type /StructElem - /S /Em - /P 498 0 R - /K [73] - /Pg 5155 0 R ->> -endobj - -500 0 obj -<< - /Type /StructElem - /S /Lbl - /P 496 0 R - /K [501 0 R] ->> -endobj - -501 0 obj -<< - /Type /StructElem - /S /Link - /P 500 0 R - /K [70 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5149 0 R - >>] - /Pg 5155 0 R ->> -endobj - -502 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [507 0 R 503 0 R] ->> -endobj - -503 0 obj -<< - /Type /StructElem - /S /LBody - /P 502 0 R - /K [504 0 R] ->> -endobj - -504 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 503 0 R - /K [63 64 506 0 R 67 505 0 R 69] - /Pg 5155 0 R ->> -endobj - -505 0 obj -<< - /Type /StructElem - /S /Link - /P 504 0 R - /K [68 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5148 0 R - >>] - /Pg 5155 0 R ->> -endobj - -506 0 obj -<< - /Type /StructElem - /S /Em - /P 504 0 R - /K [65 66] - /Pg 5155 0 R ->> -endobj - -507 0 obj -<< - /Type /StructElem - /S /Lbl - /P 502 0 R - /K [508 0 R] ->> -endobj - -508 0 obj -<< - /Type /StructElem - /S /Link - /P 507 0 R - /K [62 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5147 0 R - >>] - /Pg 5155 0 R ->> -endobj - -509 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [514 0 R 510 0 R] ->> -endobj - -510 0 obj -<< - /Type /StructElem - /S /LBody - /P 509 0 R - /K [511 0 R] ->> -endobj - -511 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 510 0 R - /K [55 56 513 0 R 59 512 0 R 61] - /Pg 5155 0 R ->> -endobj - -512 0 obj -<< - /Type /StructElem - /S /Link - /P 511 0 R - /K [60 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5146 0 R - >>] - /Pg 5155 0 R ->> -endobj - -513 0 obj -<< - /Type /StructElem - /S /Em - /P 511 0 R - /K [57 58] - /Pg 5155 0 R ->> -endobj - -514 0 obj -<< - /Type /StructElem - /S /Lbl - /P 509 0 R - /K [515 0 R] ->> -endobj - -515 0 obj -<< - /Type /StructElem - /S /Link - /P 514 0 R - /K [54 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5145 0 R - >>] - /Pg 5155 0 R ->> -endobj - -516 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [521 0 R 517 0 R] ->> -endobj - -517 0 obj -<< - /Type /StructElem - /S /LBody - /P 516 0 R - /K [518 0 R] ->> -endobj - -518 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 517 0 R - /K [46 47 48 520 0 R 50 51 519 0 R 53] - /Pg 5155 0 R ->> -endobj - -519 0 obj -<< - /Type /StructElem - /S /Link - /P 518 0 R - /K [52 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5144 0 R - >>] - /Pg 5155 0 R ->> -endobj - -520 0 obj -<< - /Type /StructElem - /S /Em - /P 518 0 R - /K [49] - /Pg 5155 0 R ->> -endobj - -521 0 obj -<< - /Type /StructElem - /S /Lbl - /P 516 0 R - /K [522 0 R] ->> -endobj - -522 0 obj -<< - /Type /StructElem - /S /Link - /P 521 0 R - /K [45 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5143 0 R - >>] - /Pg 5155 0 R ->> -endobj - -523 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [527 0 R 524 0 R] ->> -endobj - -524 0 obj -<< - /Type /StructElem - /S /LBody - /P 523 0 R - /K [525 0 R] ->> -endobj - -525 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 524 0 R - /K [42 526 0 R 44] - /Pg 5155 0 R ->> -endobj - -526 0 obj -<< - /Type /StructElem - /S /Em - /P 525 0 R - /K [43] - /Pg 5155 0 R ->> -endobj - -527 0 obj -<< - /Type /StructElem - /S /Lbl - /P 523 0 R - /K [528 0 R] ->> -endobj - -528 0 obj -<< - /Type /StructElem - /S /Link - /P 527 0 R - /K [41 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5142 0 R - >>] - /Pg 5155 0 R ->> -endobj - -529 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [533 0 R 530 0 R] ->> -endobj - -530 0 obj -<< - /Type /StructElem - /S /LBody - /P 529 0 R - /K [531 0 R] ->> -endobj - -531 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 530 0 R - /K [39 532 0 R] - /Pg 5155 0 R ->> -endobj - -532 0 obj -<< - /Type /StructElem - /S /Link - /P 531 0 R - /K [40 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5141 0 R - >>] - /Pg 5155 0 R ->> -endobj - -533 0 obj -<< - /Type /StructElem - /S /Lbl - /P 529 0 R - /K [534 0 R] ->> -endobj - -534 0 obj -<< - /Type /StructElem - /S /Link - /P 533 0 R - /K [38 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5140 0 R - >>] - /Pg 5155 0 R ->> -endobj - -535 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [539 0 R 536 0 R] ->> -endobj - -536 0 obj -<< - /Type /StructElem - /S /LBody - /P 535 0 R - /K [537 0 R] ->> -endobj - -537 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 536 0 R - /K [35 538 0 R] - /Pg 5155 0 R ->> -endobj - -538 0 obj -<< - /Type /StructElem - /S /Link - /P 537 0 R - /K [36 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5138 0 R - >> 37 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5139 0 R - >>] - /Pg 5155 0 R ->> -endobj - -539 0 obj -<< - /Type /StructElem - /S /Lbl - /P 535 0 R - /K [540 0 R] ->> -endobj - -540 0 obj -<< - /Type /StructElem - /S /Link - /P 539 0 R - /K [34 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5137 0 R - >>] - /Pg 5155 0 R ->> -endobj - -541 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [545 0 R 542 0 R] ->> -endobj - -542 0 obj -<< - /Type /StructElem - /S /LBody - /P 541 0 R - /K [543 0 R] ->> -endobj - -543 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 542 0 R - /K [28 544 0 R 32 33] - /Pg 5155 0 R ->> -endobj - -544 0 obj -<< - /Type /StructElem - /S /Em - /P 543 0 R - /K [29 30 31] - /Pg 5155 0 R ->> -endobj - -545 0 obj -<< - /Type /StructElem - /S /Lbl - /P 541 0 R - /K [546 0 R] ->> -endobj - -546 0 obj -<< - /Type /StructElem - /S /Link - /P 545 0 R - /K [27 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5136 0 R - >>] - /Pg 5155 0 R ->> -endobj - -547 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [552 0 R 548 0 R] ->> -endobj - -548 0 obj -<< - /Type /StructElem - /S /LBody - /P 547 0 R - /K [549 0 R] ->> -endobj - -549 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 548 0 R - /K [19 20 551 0 R 23 24 550 0 R 26] - /Pg 5155 0 R ->> -endobj - -550 0 obj -<< - /Type /StructElem - /S /Link - /P 549 0 R - /K [25 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5135 0 R - >>] - /Pg 5155 0 R ->> -endobj - -551 0 obj -<< - /Type /StructElem - /S /Em - /P 549 0 R - /K [21 22] - /Pg 5155 0 R ->> -endobj - -552 0 obj -<< - /Type /StructElem - /S /Lbl - /P 547 0 R - /K [553 0 R] ->> -endobj - -553 0 obj -<< - /Type /StructElem - /S /Link - /P 552 0 R - /K [18 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5134 0 R - >>] - /Pg 5155 0 R ->> -endobj - -554 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [558 0 R 555 0 R] ->> -endobj - -555 0 obj -<< - /Type /StructElem - /S /LBody - /P 554 0 R - /K [556 0 R] ->> -endobj - -556 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 555 0 R - /K [14 15 16 557 0 R] - /Pg 5155 0 R ->> -endobj - -557 0 obj -<< - /Type /StructElem - /S /Link - /P 556 0 R - /K [17 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5133 0 R - >>] - /Pg 5155 0 R ->> -endobj - -558 0 obj -<< - /Type /StructElem - /S /Lbl - /P 554 0 R - /K [559 0 R] ->> -endobj - -559 0 obj -<< - /Type /StructElem - /S /Link - /P 558 0 R - /K [13 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5132 0 R - >>] - /Pg 5155 0 R ->> -endobj - -560 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [564 0 R 561 0 R] ->> -endobj - -561 0 obj -<< - /Type /StructElem - /S /LBody - /P 560 0 R - /K [562 0 R] ->> -endobj - -562 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 561 0 R - /K [8 563 0 R 12] - /Pg 5155 0 R ->> -endobj - -563 0 obj -<< - /Type /StructElem - /S /Em - /P 562 0 R - /K [9 10 11] - /Pg 5155 0 R ->> -endobj - -564 0 obj -<< - /Type /StructElem - /S /Lbl - /P 560 0 R - /K [565 0 R] ->> -endobj - -565 0 obj -<< - /Type /StructElem - /S /Link - /P 564 0 R - /K [7 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5131 0 R - >>] - /Pg 5155 0 R ->> -endobj - -566 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [571 0 R 567 0 R] ->> -endobj - -567 0 obj -<< - /Type /StructElem - /S /LBody - /P 566 0 R - /K [568 0 R] ->> -endobj - -568 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 567 0 R - /K [1 570 0 R 4 569 0 R 6] - /Pg 5155 0 R ->> -endobj - -569 0 obj -<< - /Type /StructElem - /S /Link - /P 568 0 R - /K [5 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5130 0 R - >>] - /Pg 5155 0 R ->> -endobj - -570 0 obj -<< - /Type /StructElem - /S /Em - /P 568 0 R - /K [2 3] - /Pg 5155 0 R ->> -endobj - -571 0 obj -<< - /Type /StructElem - /S /Lbl - /P 566 0 R - /K [572 0 R] ->> -endobj - -572 0 obj -<< - /Type /StructElem - /S /Link - /P 571 0 R - /K [0 << - /Type /OBJR - /Pg 5155 0 R - /Obj 5129 0 R - >>] - /Pg 5155 0 R ->> -endobj - -573 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [578 0 R 574 0 R] ->> -endobj - -574 0 obj -<< - /Type /StructElem - /S /LBody - /P 573 0 R - /K [575 0 R] ->> -endobj - -575 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 574 0 R - /K [105 577 0 R 108 576 0 R 110] - /Pg 5127 0 R ->> -endobj - -576 0 obj -<< - /Type /StructElem - /S /Link - /P 575 0 R - /K [109 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5126 0 R - >>] - /Pg 5127 0 R ->> -endobj - -577 0 obj -<< - /Type /StructElem - /S /Em - /P 575 0 R - /K [106 107] - /Pg 5127 0 R ->> -endobj - -578 0 obj -<< - /Type /StructElem - /S /Lbl - /P 573 0 R - /K [579 0 R] ->> -endobj - -579 0 obj -<< - /Type /StructElem - /S /Link - /P 578 0 R - /K [104 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5125 0 R - >>] - /Pg 5127 0 R ->> -endobj - -580 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [585 0 R 581 0 R] ->> -endobj - -581 0 obj -<< - /Type /StructElem - /S /LBody - /P 580 0 R - /K [582 0 R] ->> -endobj - -582 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 581 0 R - /K [98 584 0 R 100 101 583 0 R 103] - /Pg 5127 0 R ->> -endobj - -583 0 obj -<< - /Type /StructElem - /S /Link - /P 582 0 R - /K [102 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5124 0 R - >>] - /Pg 5127 0 R ->> -endobj - -584 0 obj -<< - /Type /StructElem - /S /Em - /P 582 0 R - /K [99] - /Pg 5127 0 R ->> -endobj - -585 0 obj -<< - /Type /StructElem - /S /Lbl - /P 580 0 R - /K [586 0 R] ->> -endobj - -586 0 obj -<< - /Type /StructElem - /S /Link - /P 585 0 R - /K [97 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5123 0 R - >>] - /Pg 5127 0 R ->> -endobj - -587 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [592 0 R 588 0 R] ->> -endobj - -588 0 obj -<< - /Type /StructElem - /S /LBody - /P 587 0 R - /K [589 0 R] ->> -endobj - -589 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 588 0 R - /K [90 591 0 R 93 94 590 0 R 96] - /Pg 5127 0 R ->> -endobj - -590 0 obj -<< - /Type /StructElem - /S /Link - /P 589 0 R - /K [95 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5122 0 R - >>] - /Pg 5127 0 R ->> -endobj - -591 0 obj -<< - /Type /StructElem - /S /Em - /P 589 0 R - /K [91 92] - /Pg 5127 0 R ->> -endobj - -592 0 obj -<< - /Type /StructElem - /S /Lbl - /P 587 0 R - /K [593 0 R] ->> -endobj - -593 0 obj -<< - /Type /StructElem - /S /Link - /P 592 0 R - /K [89 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5121 0 R - >>] - /Pg 5127 0 R ->> -endobj - -594 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [599 0 R 595 0 R] ->> -endobj - -595 0 obj -<< - /Type /StructElem - /S /LBody - /P 594 0 R - /K [596 0 R] ->> -endobj - -596 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 595 0 R - /K [83 84 598 0 R 86 597 0 R 88] - /Pg 5127 0 R ->> -endobj - -597 0 obj -<< - /Type /StructElem - /S /Link - /P 596 0 R - /K [87 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5120 0 R - >>] - /Pg 5127 0 R ->> -endobj - -598 0 obj -<< - /Type /StructElem - /S /Em - /P 596 0 R - /K [85] - /Pg 5127 0 R ->> -endobj - -599 0 obj -<< - /Type /StructElem - /S /Lbl - /P 594 0 R - /K [600 0 R] ->> -endobj - -600 0 obj -<< - /Type /StructElem - /S /Link - /P 599 0 R - /K [82 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5119 0 R - >>] - /Pg 5127 0 R ->> -endobj - -601 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [606 0 R 602 0 R] ->> -endobj - -602 0 obj -<< - /Type /StructElem - /S /LBody - /P 601 0 R - /K [603 0 R] ->> -endobj - -603 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 602 0 R - /K [75 76 605 0 R 79 604 0 R 81] - /Pg 5127 0 R ->> -endobj - -604 0 obj -<< - /Type /StructElem - /S /Link - /P 603 0 R - /K [80 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5118 0 R - >>] - /Pg 5127 0 R ->> -endobj - -605 0 obj -<< - /Type /StructElem - /S /Em - /P 603 0 R - /K [77 78] - /Pg 5127 0 R ->> -endobj - -606 0 obj -<< - /Type /StructElem - /S /Lbl - /P 601 0 R - /K [607 0 R] ->> -endobj - -607 0 obj -<< - /Type /StructElem - /S /Link - /P 606 0 R - /K [74 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5117 0 R - >>] - /Pg 5127 0 R ->> -endobj - -608 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [613 0 R 609 0 R] ->> -endobj - -609 0 obj -<< - /Type /StructElem - /S /LBody - /P 608 0 R - /K [610 0 R] ->> -endobj - -610 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 609 0 R - /K [67 612 0 R 71 611 0 R 73] - /Pg 5127 0 R ->> -endobj - -611 0 obj -<< - /Type /StructElem - /S /Link - /P 610 0 R - /K [72 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5116 0 R - >>] - /Pg 5127 0 R ->> -endobj - -612 0 obj -<< - /Type /StructElem - /S /Em - /P 610 0 R - /K [68 69 70] - /Pg 5127 0 R ->> -endobj - -613 0 obj -<< - /Type /StructElem - /S /Lbl - /P 608 0 R - /K [614 0 R] ->> -endobj - -614 0 obj -<< - /Type /StructElem - /S /Link - /P 613 0 R - /K [66 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5115 0 R - >>] - /Pg 5127 0 R ->> -endobj - -615 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [620 0 R 616 0 R] ->> -endobj - -616 0 obj -<< - /Type /StructElem - /S /LBody - /P 615 0 R - /K [617 0 R] ->> -endobj - -617 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 616 0 R - /K [58 59 619 0 R 62 63 618 0 R 65] - /Pg 5127 0 R ->> -endobj - -618 0 obj -<< - /Type /StructElem - /S /Link - /P 617 0 R - /K [64 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5114 0 R - >>] - /Pg 5127 0 R ->> -endobj - -619 0 obj -<< - /Type /StructElem - /S /Em - /P 617 0 R - /K [60 61] - /Pg 5127 0 R ->> -endobj - -620 0 obj -<< - /Type /StructElem - /S /Lbl - /P 615 0 R - /K [621 0 R] ->> -endobj - -621 0 obj -<< - /Type /StructElem - /S /Link - /P 620 0 R - /K [57 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5113 0 R - >>] - /Pg 5127 0 R ->> -endobj - -622 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [628 0 R 623 0 R] ->> -endobj - -623 0 obj -<< - /Type /StructElem - /S /LBody - /P 622 0 R - /K [624 0 R] ->> -endobj - -624 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 623 0 R - /K [49 627 0 R 51 626 0 R 54 625 0 R 56] - /Pg 5127 0 R ->> -endobj - -625 0 obj -<< - /Type /StructElem - /S /Link - /P 624 0 R - /K [55 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5112 0 R - >>] - /Pg 5127 0 R ->> -endobj - -626 0 obj -<< - /Type /StructElem - /S /Em - /P 624 0 R - /K [52 53] - /Pg 5127 0 R ->> -endobj - -627 0 obj -<< - /Type /StructElem - /S /Em - /P 624 0 R - /K [50] - /Pg 5127 0 R ->> -endobj - -628 0 obj -<< - /Type /StructElem - /S /Lbl - /P 622 0 R - /K [629 0 R] ->> -endobj - -629 0 obj -<< - /Type /StructElem - /S /Link - /P 628 0 R - /K [48 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5111 0 R - >>] - /Pg 5127 0 R ->> -endobj - -630 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [635 0 R 631 0 R] ->> -endobj - -631 0 obj -<< - /Type /StructElem - /S /LBody - /P 630 0 R - /K [632 0 R] ->> -endobj - -632 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 631 0 R - /K [42 634 0 R 45 633 0 R 47] - /Pg 5127 0 R ->> -endobj - -633 0 obj -<< - /Type /StructElem - /S /Link - /P 632 0 R - /K [46 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5110 0 R - >>] - /Pg 5127 0 R ->> -endobj - -634 0 obj -<< - /Type /StructElem - /S /Em - /P 632 0 R - /K [43 44] - /Pg 5127 0 R ->> -endobj - -635 0 obj -<< - /Type /StructElem - /S /Lbl - /P 630 0 R - /K [636 0 R] ->> -endobj - -636 0 obj -<< - /Type /StructElem - /S /Link - /P 635 0 R - /K [41 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5109 0 R - >>] - /Pg 5127 0 R ->> -endobj - -637 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [642 0 R 638 0 R] ->> -endobj - -638 0 obj -<< - /Type /StructElem - /S /LBody - /P 637 0 R - /K [639 0 R] ->> -endobj - -639 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 638 0 R - /K [34 641 0 R 37 38 640 0 R 40] - /Pg 5127 0 R ->> -endobj - -640 0 obj -<< - /Type /StructElem - /S /Link - /P 639 0 R - /K [39 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5108 0 R - >>] - /Pg 5127 0 R ->> -endobj - -641 0 obj -<< - /Type /StructElem - /S /Em - /P 639 0 R - /K [35 36] - /Pg 5127 0 R ->> -endobj - -642 0 obj -<< - /Type /StructElem - /S /Lbl - /P 637 0 R - /K [643 0 R] ->> -endobj - -643 0 obj -<< - /Type /StructElem - /S /Link - /P 642 0 R - /K [33 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5107 0 R - >>] - /Pg 5127 0 R ->> -endobj - -644 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [649 0 R 645 0 R] ->> -endobj - -645 0 obj -<< - /Type /StructElem - /S /LBody - /P 644 0 R - /K [646 0 R] ->> -endobj - -646 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 645 0 R - /K [25 648 0 R 29 647 0 R 32] - /Pg 5127 0 R ->> -endobj - -647 0 obj -<< - /Type /StructElem - /S /Link - /P 646 0 R - /K [30 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5105 0 R - >> 31 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5106 0 R - >>] - /Pg 5127 0 R ->> -endobj - -648 0 obj -<< - /Type /StructElem - /S /Em - /P 646 0 R - /K [26 27 28] - /Pg 5127 0 R ->> -endobj - -649 0 obj -<< - /Type /StructElem - /S /Lbl - /P 644 0 R - /K [650 0 R] ->> -endobj - -650 0 obj -<< - /Type /StructElem - /S /Link - /P 649 0 R - /K [24 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5104 0 R - >>] - /Pg 5127 0 R ->> -endobj - -651 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [656 0 R 652 0 R] ->> -endobj - -652 0 obj -<< - /Type /StructElem - /S /LBody - /P 651 0 R - /K [653 0 R] ->> -endobj - -653 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 652 0 R - /K [18 655 0 R 20 654 0 R 23] - /Pg 5127 0 R ->> -endobj - -654 0 obj -<< - /Type /StructElem - /S /Link - /P 653 0 R - /K [21 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5102 0 R - >> 22 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5103 0 R - >>] - /Pg 5127 0 R ->> -endobj - -655 0 obj -<< - /Type /StructElem - /S /Em - /P 653 0 R - /K [19] - /Pg 5127 0 R ->> -endobj - -656 0 obj -<< - /Type /StructElem - /S /Lbl - /P 651 0 R - /K [657 0 R] ->> -endobj - -657 0 obj -<< - /Type /StructElem - /S /Link - /P 656 0 R - /K [17 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5101 0 R - >>] - /Pg 5127 0 R ->> -endobj - -658 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [663 0 R 659 0 R] ->> -endobj - -659 0 obj -<< - /Type /StructElem - /S /LBody - /P 658 0 R - /K [660 0 R] ->> -endobj - -660 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 659 0 R - /K [10 662 0 R 13 14 661 0 R 16] - /Pg 5127 0 R ->> -endobj - -661 0 obj -<< - /Type /StructElem - /S /Link - /P 660 0 R - /K [15 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5100 0 R - >>] - /Pg 5127 0 R ->> -endobj - -662 0 obj -<< - /Type /StructElem - /S /Em - /P 660 0 R - /K [11 12] - /Pg 5127 0 R ->> -endobj - -663 0 obj -<< - /Type /StructElem - /S /Lbl - /P 658 0 R - /K [664 0 R] ->> -endobj - -664 0 obj -<< - /Type /StructElem - /S /Link - /P 663 0 R - /K [9 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5099 0 R - >>] - /Pg 5127 0 R ->> -endobj - -665 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [670 0 R 666 0 R] ->> -endobj - -666 0 obj -<< - /Type /StructElem - /S /LBody - /P 665 0 R - /K [667 0 R] ->> -endobj - -667 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 666 0 R - /K [1 669 0 R 4 5 6 668 0 R 8] - /Pg 5127 0 R ->> -endobj - -668 0 obj -<< - /Type /StructElem - /S /Link - /P 667 0 R - /K [7 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5098 0 R - >>] - /Pg 5127 0 R ->> -endobj - -669 0 obj -<< - /Type /StructElem - /S /Em - /P 667 0 R - /K [2 3] - /Pg 5127 0 R ->> -endobj - -670 0 obj -<< - /Type /StructElem - /S /Lbl - /P 665 0 R - /K [671 0 R] ->> -endobj - -671 0 obj -<< - /Type /StructElem - /S /Link - /P 670 0 R - /K [0 << - /Type /OBJR - /Pg 5127 0 R - /Obj 5097 0 R - >>] - /Pg 5127 0 R ->> -endobj - -672 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [676 0 R 673 0 R] ->> -endobj - -673 0 obj -<< - /Type /StructElem - /S /LBody - /P 672 0 R - /K [674 0 R] ->> -endobj - -674 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 673 0 R - /K [107 675 0 R 109 110] - /Pg 5095 0 R ->> -endobj - -675 0 obj -<< - /Type /StructElem - /S /Em - /P 674 0 R - /K [108] - /Pg 5095 0 R ->> -endobj - -676 0 obj -<< - /Type /StructElem - /S /Lbl - /P 672 0 R - /K [677 0 R] ->> -endobj - -677 0 obj -<< - /Type /StructElem - /S /Link - /P 676 0 R - /K [106 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5094 0 R - >>] - /Pg 5095 0 R ->> -endobj - -678 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [683 0 R 679 0 R] ->> -endobj - -679 0 obj -<< - /Type /StructElem - /S /LBody - /P 678 0 R - /K [680 0 R] ->> -endobj - -680 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 679 0 R - /K [98 682 0 R 101 102 103 681 0 R 105] - /Pg 5095 0 R ->> -endobj - -681 0 obj -<< - /Type /StructElem - /S /Link - /P 680 0 R - /K [104 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5093 0 R - >>] - /Pg 5095 0 R ->> -endobj - -682 0 obj -<< - /Type /StructElem - /S /Em - /P 680 0 R - /K [99 100] - /Pg 5095 0 R ->> -endobj - -683 0 obj -<< - /Type /StructElem - /S /Lbl - /P 678 0 R - /K [684 0 R] ->> -endobj - -684 0 obj -<< - /Type /StructElem - /S /Link - /P 683 0 R - /K [97 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5092 0 R - >>] - /Pg 5095 0 R ->> -endobj - -685 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [689 0 R 686 0 R] ->> -endobj - -686 0 obj -<< - /Type /StructElem - /S /LBody - /P 685 0 R - /K [687 0 R] ->> -endobj - -687 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 686 0 R - /K [94 688 0 R 96] - /Pg 5095 0 R ->> -endobj - -688 0 obj -<< - /Type /StructElem - /S /Em - /P 687 0 R - /K [95] - /Pg 5095 0 R ->> -endobj - -689 0 obj -<< - /Type /StructElem - /S /Lbl - /P 685 0 R - /K [690 0 R] ->> -endobj - -690 0 obj -<< - /Type /StructElem - /S /Link - /P 689 0 R - /K [93 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5091 0 R - >>] - /Pg 5095 0 R ->> -endobj - -691 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [696 0 R 692 0 R] ->> -endobj - -692 0 obj -<< - /Type /StructElem - /S /LBody - /P 691 0 R - /K [693 0 R] ->> -endobj - -693 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 692 0 R - /K [87 695 0 R 89 90 694 0 R 92] - /Pg 5095 0 R ->> -endobj - -694 0 obj -<< - /Type /StructElem - /S /Link - /P 693 0 R - /K [91 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5090 0 R - >>] - /Pg 5095 0 R ->> -endobj - -695 0 obj -<< - /Type /StructElem - /S /Em - /P 693 0 R - /K [88] - /Pg 5095 0 R ->> -endobj - -696 0 obj -<< - /Type /StructElem - /S /Lbl - /P 691 0 R - /K [697 0 R] ->> -endobj - -697 0 obj -<< - /Type /StructElem - /S /Link - /P 696 0 R - /K [86 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5089 0 R - >>] - /Pg 5095 0 R ->> -endobj - -698 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [703 0 R 699 0 R] ->> -endobj - -699 0 obj -<< - /Type /StructElem - /S /LBody - /P 698 0 R - /K [700 0 R] ->> -endobj - -700 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 699 0 R - /K [77 78 702 0 R 81 82 83 701 0 R 85] - /Pg 5095 0 R ->> -endobj - -701 0 obj -<< - /Type /StructElem - /S /Link - /P 700 0 R - /K [84 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5088 0 R - >>] - /Pg 5095 0 R ->> -endobj - -702 0 obj -<< - /Type /StructElem - /S /Em - /P 700 0 R - /K [79 80] - /Pg 5095 0 R ->> -endobj - -703 0 obj -<< - /Type /StructElem - /S /Lbl - /P 698 0 R - /K [704 0 R] ->> -endobj - -704 0 obj -<< - /Type /StructElem - /S /Link - /P 703 0 R - /K [76 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5087 0 R - >>] - /Pg 5095 0 R ->> -endobj - -705 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [710 0 R 706 0 R] ->> -endobj - -706 0 obj -<< - /Type /StructElem - /S /LBody - /P 705 0 R - /K [707 0 R] ->> -endobj - -707 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 706 0 R - /K [68 69 709 0 R 72 73 708 0 R 75] - /Pg 5095 0 R ->> -endobj - -708 0 obj -<< - /Type /StructElem - /S /Link - /P 707 0 R - /K [74 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5086 0 R - >>] - /Pg 5095 0 R ->> -endobj - -709 0 obj -<< - /Type /StructElem - /S /Em - /P 707 0 R - /K [70 71] - /Pg 5095 0 R ->> -endobj - -710 0 obj -<< - /Type /StructElem - /S /Lbl - /P 705 0 R - /K [711 0 R] ->> -endobj - -711 0 obj -<< - /Type /StructElem - /S /Link - /P 710 0 R - /K [67 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5085 0 R - >>] - /Pg 5095 0 R ->> -endobj - -712 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [716 0 R 713 0 R] ->> -endobj - -713 0 obj -<< - /Type /StructElem - /S /LBody - /P 712 0 R - /K [714 0 R] ->> -endobj - -714 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 713 0 R - /K [62 715 0 R 65 66] - /Pg 5095 0 R ->> -endobj - -715 0 obj -<< - /Type /StructElem - /S /Em - /P 714 0 R - /K [63 64] - /Pg 5095 0 R ->> -endobj - -716 0 obj -<< - /Type /StructElem - /S /Lbl - /P 712 0 R - /K [717 0 R] ->> -endobj - -717 0 obj -<< - /Type /StructElem - /S /Link - /P 716 0 R - /K [61 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5084 0 R - >>] - /Pg 5095 0 R ->> -endobj - -718 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [723 0 R 719 0 R] ->> -endobj - -719 0 obj -<< - /Type /StructElem - /S /LBody - /P 718 0 R - /K [720 0 R] ->> -endobj - -720 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 719 0 R - /K [55 722 0 R 57 58 721 0 R 60] - /Pg 5095 0 R ->> -endobj - -721 0 obj -<< - /Type /StructElem - /S /Link - /P 720 0 R - /K [59 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5083 0 R - >>] - /Pg 5095 0 R ->> -endobj - -722 0 obj -<< - /Type /StructElem - /S /Em - /P 720 0 R - /K [56] - /Pg 5095 0 R ->> -endobj - -723 0 obj -<< - /Type /StructElem - /S /Lbl - /P 718 0 R - /K [724 0 R] ->> -endobj - -724 0 obj -<< - /Type /StructElem - /S /Link - /P 723 0 R - /K [54 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5082 0 R - >>] - /Pg 5095 0 R ->> -endobj - -725 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [728 0 R 726 0 R] ->> -endobj - -726 0 obj -<< - /Type /StructElem - /S /LBody - /P 725 0 R - /K [727 0 R] ->> -endobj - -727 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 726 0 R - /K [52 53] - /Pg 5095 0 R ->> -endobj - -728 0 obj -<< - /Type /StructElem - /S /Lbl - /P 725 0 R - /K [729 0 R] ->> -endobj - -729 0 obj -<< - /Type /StructElem - /S /Link - /P 728 0 R - /K [51 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5081 0 R - >>] - /Pg 5095 0 R ->> -endobj - -730 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [734 0 R 731 0 R] ->> -endobj - -731 0 obj -<< - /Type /StructElem - /S /LBody - /P 730 0 R - /K [732 0 R] ->> -endobj - -732 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 731 0 R - /K [46 47 733 0 R 49 50] - /Pg 5095 0 R ->> -endobj - -733 0 obj -<< - /Type /StructElem - /S /Em - /P 732 0 R - /K [48] - /Pg 5095 0 R ->> -endobj - -734 0 obj -<< - /Type /StructElem - /S /Lbl - /P 730 0 R - /K [735 0 R] ->> -endobj - -735 0 obj -<< - /Type /StructElem - /S /Link - /P 734 0 R - /K [45 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5080 0 R - >>] - /Pg 5095 0 R ->> -endobj - -736 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [742 0 R 737 0 R] ->> -endobj - -737 0 obj -<< - /Type /StructElem - /S /LBody - /P 736 0 R - /K [738 0 R] ->> -endobj - -738 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 737 0 R - /K [36 741 0 R 38 39 740 0 R 42 739 0 R 44] - /Pg 5095 0 R ->> -endobj - -739 0 obj -<< - /Type /StructElem - /S /Link - /P 738 0 R - /K [43 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5079 0 R - >>] - /Pg 5095 0 R ->> -endobj - -740 0 obj -<< - /Type /StructElem - /S /Em - /P 738 0 R - /K [40 41] - /Pg 5095 0 R ->> -endobj - -741 0 obj -<< - /Type /StructElem - /S /Em - /P 738 0 R - /K [37] - /Pg 5095 0 R ->> -endobj - -742 0 obj -<< - /Type /StructElem - /S /Lbl - /P 736 0 R - /K [743 0 R] ->> -endobj - -743 0 obj -<< - /Type /StructElem - /S /Link - /P 742 0 R - /K [35 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5078 0 R - >>] - /Pg 5095 0 R ->> -endobj - -744 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [748 0 R 745 0 R] ->> -endobj - -745 0 obj -<< - /Type /StructElem - /S /LBody - /P 744 0 R - /K [746 0 R] ->> -endobj - -746 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 745 0 R - /K [31 32 747 0 R 34] - /Pg 5095 0 R ->> -endobj - -747 0 obj -<< - /Type /StructElem - /S /Em - /P 746 0 R - /K [33] - /Pg 5095 0 R ->> -endobj - -748 0 obj -<< - /Type /StructElem - /S /Lbl - /P 744 0 R - /K [749 0 R] ->> -endobj - -749 0 obj -<< - /Type /StructElem - /S /Link - /P 748 0 R - /K [30 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5077 0 R - >>] - /Pg 5095 0 R ->> -endobj - -750 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [756 0 R 751 0 R] ->> -endobj - -751 0 obj -<< - /Type /StructElem - /S /LBody - /P 750 0 R - /K [752 0 R] ->> -endobj - -752 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 751 0 R - /K [22 755 0 R 24 754 0 R 26 27 753 0 R 29] - /Pg 5095 0 R ->> -endobj - -753 0 obj -<< - /Type /StructElem - /S /Link - /P 752 0 R - /K [28 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5076 0 R - >>] - /Pg 5095 0 R ->> -endobj - -754 0 obj -<< - /Type /StructElem - /S /Em - /P 752 0 R - /K [25] - /Pg 5095 0 R ->> -endobj - -755 0 obj -<< - /Type /StructElem - /S /Em - /P 752 0 R - /K [23] - /Pg 5095 0 R ->> -endobj - -756 0 obj -<< - /Type /StructElem - /S /Lbl - /P 750 0 R - /K [757 0 R] ->> -endobj - -757 0 obj -<< - /Type /StructElem - /S /Link - /P 756 0 R - /K [21 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5075 0 R - >>] - /Pg 5095 0 R ->> -endobj - -758 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [764 0 R 759 0 R] ->> -endobj - -759 0 obj -<< - /Type /StructElem - /S /LBody - /P 758 0 R - /K [760 0 R] ->> -endobj - -760 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 759 0 R - /K [12 763 0 R 14 762 0 R 18 761 0 R 20] - /Pg 5095 0 R ->> -endobj - -761 0 obj -<< - /Type /StructElem - /S /Link - /P 760 0 R - /K [19 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5074 0 R - >>] - /Pg 5095 0 R ->> -endobj - -762 0 obj -<< - /Type /StructElem - /S /Em - /P 760 0 R - /K [15 16 17] - /Pg 5095 0 R ->> -endobj - -763 0 obj -<< - /Type /StructElem - /S /Em - /P 760 0 R - /K [13] - /Pg 5095 0 R ->> -endobj - -764 0 obj -<< - /Type /StructElem - /S /Lbl - /P 758 0 R - /K [765 0 R] ->> -endobj - -765 0 obj -<< - /Type /StructElem - /S /Link - /P 764 0 R - /K [11 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5073 0 R - >>] - /Pg 5095 0 R ->> -endobj - -766 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [770 0 R 767 0 R] ->> -endobj - -767 0 obj -<< - /Type /StructElem - /S /LBody - /P 766 0 R - /K [768 0 R] ->> -endobj - -768 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 767 0 R - /K [6 7 8 769 0 R] - /Pg 5095 0 R ->> -endobj - -769 0 obj -<< - /Type /StructElem - /S /Link - /P 768 0 R - /K [9 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5071 0 R - >> 10 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5072 0 R - >>] - /Pg 5095 0 R ->> -endobj - -770 0 obj -<< - /Type /StructElem - /S /Lbl - /P 766 0 R - /K [771 0 R] ->> -endobj - -771 0 obj -<< - /Type /StructElem - /S /Link - /P 770 0 R - /K [5 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5070 0 R - >>] - /Pg 5095 0 R ->> -endobj - -772 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [776 0 R 773 0 R] ->> -endobj - -773 0 obj -<< - /Type /StructElem - /S /LBody - /P 772 0 R - /K [774 0 R] ->> -endobj - -774 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 773 0 R - /K [1 2 3 775 0 R] - /Pg 5095 0 R ->> -endobj - -775 0 obj -<< - /Type /StructElem - /S /Link - /P 774 0 R - /K [4 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5069 0 R - >>] - /Pg 5095 0 R ->> -endobj - -776 0 obj -<< - /Type /StructElem - /S /Lbl - /P 772 0 R - /K [777 0 R] ->> -endobj - -777 0 obj -<< - /Type /StructElem - /S /Link - /P 776 0 R - /K [0 << - /Type /OBJR - /Pg 5095 0 R - /Obj 5068 0 R - >>] - /Pg 5095 0 R ->> -endobj - -778 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [782 0 R 779 0 R] ->> -endobj - -779 0 obj -<< - /Type /StructElem - /S /LBody - /P 778 0 R - /K [780 0 R] ->> -endobj - -780 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 779 0 R - /K [76 781 0 R 78 79] - /Pg 5066 0 R ->> -endobj - -781 0 obj -<< - /Type /StructElem - /S /Em - /P 780 0 R - /K [77] - /Pg 5066 0 R ->> -endobj - -782 0 obj -<< - /Type /StructElem - /S /Lbl - /P 778 0 R - /K [783 0 R] ->> -endobj - -783 0 obj -<< - /Type /StructElem - /S /Link - /P 782 0 R - /K [75 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5065 0 R - >>] - /Pg 5066 0 R ->> -endobj - -784 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [789 0 R 785 0 R] ->> -endobj - -785 0 obj -<< - /Type /StructElem - /S /LBody - /P 784 0 R - /K [786 0 R] ->> -endobj - -786 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 785 0 R - /K [67 68 788 0 R 71 72 787 0 R 74] - /Pg 5066 0 R ->> -endobj - -787 0 obj -<< - /Type /StructElem - /S /Link - /P 786 0 R - /K [73 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5064 0 R - >>] - /Pg 5066 0 R ->> -endobj - -788 0 obj -<< - /Type /StructElem - /S /Em - /P 786 0 R - /K [69 70] - /Pg 5066 0 R ->> -endobj - -789 0 obj -<< - /Type /StructElem - /S /Lbl - /P 784 0 R - /K [790 0 R] ->> -endobj - -790 0 obj -<< - /Type /StructElem - /S /Link - /P 789 0 R - /K [66 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5063 0 R - >>] - /Pg 5066 0 R ->> -endobj - -791 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [795 0 R 792 0 R] ->> -endobj - -792 0 obj -<< - /Type /StructElem - /S /LBody - /P 791 0 R - /K [793 0 R] ->> -endobj - -793 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 792 0 R - /K [63 794 0 R 65] - /Pg 5066 0 R ->> -endobj - -794 0 obj -<< - /Type /StructElem - /S /Em - /P 793 0 R - /K [64] - /Pg 5066 0 R ->> -endobj - -795 0 obj -<< - /Type /StructElem - /S /Lbl - /P 791 0 R - /K [796 0 R] ->> -endobj - -796 0 obj -<< - /Type /StructElem - /S /Link - /P 795 0 R - /K [62 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5062 0 R - >>] - /Pg 5066 0 R ->> -endobj - -797 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [802 0 R 798 0 R] ->> -endobj - -798 0 obj -<< - /Type /StructElem - /S /LBody - /P 797 0 R - /K [799 0 R] ->> -endobj - -799 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 798 0 R - /K [55 56 57 801 0 R 59 800 0 R 61] - /Pg 5066 0 R ->> -endobj - -800 0 obj -<< - /Type /StructElem - /S /Link - /P 799 0 R - /K [60 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5061 0 R - >>] - /Pg 5066 0 R ->> -endobj - -801 0 obj -<< - /Type /StructElem - /S /Em - /P 799 0 R - /K [58] - /Pg 5066 0 R ->> -endobj - -802 0 obj -<< - /Type /StructElem - /S /Lbl - /P 797 0 R - /K [803 0 R] ->> -endobj - -803 0 obj -<< - /Type /StructElem - /S /Link - /P 802 0 R - /K [54 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5060 0 R - >>] - /Pg 5066 0 R ->> -endobj - -804 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [809 0 R 805 0 R] ->> -endobj - -805 0 obj -<< - /Type /StructElem - /S /LBody - /P 804 0 R - /K [806 0 R] ->> -endobj - -806 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 805 0 R - /K [48 808 0 R 50 51 807 0 R 53] - /Pg 5066 0 R ->> -endobj - -807 0 obj -<< - /Type /StructElem - /S /Link - /P 806 0 R - /K [52 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5059 0 R - >>] - /Pg 5066 0 R ->> -endobj - -808 0 obj -<< - /Type /StructElem - /S /Em - /P 806 0 R - /K [49] - /Pg 5066 0 R ->> -endobj - -809 0 obj -<< - /Type /StructElem - /S /Lbl - /P 804 0 R - /K [810 0 R] ->> -endobj - -810 0 obj -<< - /Type /StructElem - /S /Link - /P 809 0 R - /K [47 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5058 0 R - >>] - /Pg 5066 0 R ->> -endobj - -811 0 obj -<< - /Type /StructElem - /S /LI - /P 104 0 R - /K [816 0 R 812 0 R] ->> -endobj - -812 0 obj -<< - /Type /StructElem - /S /LBody - /P 811 0 R - /K [813 0 R] ->> -endobj - -813 0 obj -<< - /Type /StructElem - /S /BibEntry - /P 812 0 R - /K [40 815 0 R 44 814 0 R 46] - /Pg 5066 0 R ->> -endobj - -814 0 obj -<< - /Type /StructElem - /S /Link - /P 813 0 R - /K [45 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5057 0 R - >>] - /Pg 5066 0 R ->> -endobj - -815 0 obj -<< - /Type /StructElem - /S /Em - /P 813 0 R - /K [41 42 43] - /Pg 5066 0 R ->> -endobj - -816 0 obj -<< - /Type /StructElem - /S /Lbl - /P 811 0 R - /K [817 0 R] ->> -endobj - -817 0 obj -<< - /Type /StructElem - /S /Link - /P 816 0 R - /K [39 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5056 0 R - >>] - /Pg 5066 0 R ->> -endobj - -818 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (References) - /K [38] - /Pg 5066 0 R ->> -endobj - -819 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [28 29 820 0 R 31 32 33 34 35 36 37] - /Pg 5066 0 R ->> -endobj - -820 0 obj -<< - /Type /StructElem - /S /Link - /P 819 0 R - /K [30 << - /Type /OBJR - /Pg 5066 0 R - /Obj 5055 0 R - >>] - /Pg 5066 0 R ->> -endobj - -821 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [7 8 825 0 R 10 11 12 13 824 0 R 15 16 17 823 0 R 19 20 822 0 R 23 24 25 26 27] - /Pg 5066 0 R ->> -endobj - -822 0 obj -<< - /Type /StructElem - /S /Em - /P 821 0 R - /K [21 22] - /Pg 5066 0 R ->> -endobj - -823 0 obj -<< - /Type /StructElem - /S /Em - /P 821 0 R - /K [18] - /Pg 5066 0 R ->> -endobj - -824 0 obj -<< - /Type /StructElem - /S /Em - /P 821 0 R - /K [14] - /Pg 5066 0 R ->> -endobj - -825 0 obj -<< - /Type /StructElem - /S /Em - /P 821 0 R - /K [9] - /Pg 5066 0 R ->> -endobj - -826 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Conclusion) - /K [5 6] - /Pg 5066 0 R ->> -endobj - -827 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [835 0 R 118 119 834 0 R 121 122 123 124 125 833 0 R 127 832 0 R 129 130 131 831 0 R 133 134 135 136 830 0 R 138 139 829 0 R 828 0 R << - /Type /MCR - /MCID 1 - /Pg 5066 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 5066 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 5066 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 5066 0 R - >>] - /Pg 5053 0 R ->> -endobj - -828 0 obj -<< - /Type /StructElem - /S /Em - /P 827 0 R - /K [0] - /Pg 5066 0 R ->> -endobj - -829 0 obj -<< - /Type /StructElem - /S /Em - /P 827 0 R - /K [140] - /Pg 5053 0 R ->> -endobj - -830 0 obj -<< - /Type /StructElem - /S /Link - /P 827 0 R - /K [137 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5052 0 R - >>] - /Pg 5053 0 R ->> -endobj - -831 0 obj -<< - /Type /StructElem - /S /Em - /P 827 0 R - /K [132] - /Pg 5053 0 R ->> -endobj - -832 0 obj -<< - /Type /StructElem - /S /Link - /P 827 0 R - /K [128 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5051 0 R - >>] - /Pg 5053 0 R ->> -endobj - -833 0 obj -<< - /Type /StructElem - /S /Link - /P 827 0 R - /K [126 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5050 0 R - >>] - /Pg 5053 0 R ->> -endobj - -834 0 obj -<< - /Type /StructElem - /S /Link - /P 827 0 R - /K [120 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5049 0 R - >>] - /Pg 5053 0 R ->> -endobj - -835 0 obj -<< - /Type /StructElem - /S /Strong - /P 827 0 R - /K [117] - /Pg 5053 0 R ->> -endobj - -836 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [846 0 R 77 78 79 845 0 R 81 844 0 R 83 84 85 86 87 88 843 0 R 90 91 92 93 842 0 R 95 841 0 R 97 98 840 0 R 100 101 102 103 839 0 R 105 106 107 108 109 110 111 838 0 R 113 114 837 0 R 116] - /Pg 5053 0 R ->> -endobj - -837 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [115 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5048 0 R - >>] - /Pg 5053 0 R ->> -endobj - -838 0 obj -<< - /Type /StructElem - /S /Code - /P 836 0 R - /K [112] - /Pg 5053 0 R ->> -endobj - -839 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [104 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5047 0 R - >>] - /Pg 5053 0 R ->> -endobj - -840 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [99 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5046 0 R - >>] - /Pg 5053 0 R ->> -endobj - -841 0 obj -<< - /Type /StructElem - /S /Code - /P 836 0 R - /K [96] - /Pg 5053 0 R ->> -endobj - -842 0 obj -<< - /Type /StructElem - /S /Code - /P 836 0 R - /K [94] - /Pg 5053 0 R ->> -endobj - -843 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [89 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5045 0 R - >>] - /Pg 5053 0 R ->> -endobj - -844 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [82 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5044 0 R - >>] - /Pg 5053 0 R ->> -endobj - -845 0 obj -<< - /Type /StructElem - /S /Link - /P 836 0 R - /K [80 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5043 0 R - >>] - /Pg 5053 0 R ->> -endobj - -846 0 obj -<< - /Type /StructElem - /S /Strong - /P 836 0 R - /K [76] - /Pg 5053 0 R ->> -endobj - -847 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [853 0 R 51 52 53 852 0 R 55 56 57 851 0 R 59 60 61 62 850 0 R 64 849 0 R 66 67 68 69 70 71 848 0 R 73 74 75] - /Pg 5053 0 R ->> -endobj - -848 0 obj -<< - /Type /StructElem - /S /Link - /P 847 0 R - /K [72 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5042 0 R - >>] - /Pg 5053 0 R ->> -endobj - -849 0 obj -<< - /Type /StructElem - /S /Code - /P 847 0 R - /K [65] - /Pg 5053 0 R ->> -endobj - -850 0 obj -<< - /Type /StructElem - /S /Code - /P 847 0 R - /K [63] - /Pg 5053 0 R ->> -endobj - -851 0 obj -<< - /Type /StructElem - /S /Link - /P 847 0 R - /K [58 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5041 0 R - >>] - /Pg 5053 0 R ->> -endobj - -852 0 obj -<< - /Type /StructElem - /S /Link - /P 847 0 R - /K [54 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5040 0 R - >>] - /Pg 5053 0 R ->> -endobj - -853 0 obj -<< - /Type /StructElem - /S /Strong - /P 847 0 R - /K [50] - /Pg 5053 0 R ->> -endobj - -854 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [46 47 48 49] - /Pg 5053 0 R ->> -endobj - -855 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Spatial Composability) - /K [44 45] - /Pg 5053 0 R ->> -endobj - -856 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [866 0 R 1 2 3 865 0 R 5 864 0 R 7 8 9 10 863 0 R 12 13 14 15 16 862 0 R 18 861 0 R 20 21 22 23 860 0 R 25 26 27 28 859 0 R 30 31 32 858 0 R 34 35 36 857 0 R 38 39 40 41 42 43] - /Pg 5053 0 R ->> -endobj - -857 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [37 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5039 0 R - >>] - /Pg 5053 0 R ->> -endobj - -858 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [33 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5038 0 R - >>] - /Pg 5053 0 R ->> -endobj - -859 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [29 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5037 0 R - >>] - /Pg 5053 0 R ->> -endobj - -860 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [24 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5036 0 R - >>] - /Pg 5053 0 R ->> -endobj - -861 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [19 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5035 0 R - >>] - /Pg 5053 0 R ->> -endobj - -862 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [17 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5034 0 R - >>] - /Pg 5053 0 R ->> -endobj - -863 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [11 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5033 0 R - >>] - /Pg 5053 0 R ->> -endobj - -864 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [6 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5032 0 R - >>] - /Pg 5053 0 R ->> -endobj - -865 0 obj -<< - /Type /StructElem - /S /Link - /P 856 0 R - /K [4 << - /Type /OBJR - /Pg 5053 0 R - /Obj 5031 0 R - >>] - /Pg 5053 0 R ->> -endobj - -866 0 obj -<< - /Type /StructElem - /S /Strong - /P 856 0 R - /K [0] - /Pg 5053 0 R ->> -endobj - -867 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [877 0 R 81 82 83 84 876 0 R 86 87 88 89 875 0 R 91 92 93 874 0 R 95 96 873 0 R 98 99 100 101 102 872 0 R 104 105 106 871 0 R 108 109 110 111 112 870 0 R 114 869 0 R 116 117 868 0 R 119 120 121 122 123 124 125 126 127 128 129 130 131] - /Pg 5029 0 R ->> -endobj - -868 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [118 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5028 0 R - >>] - /Pg 5029 0 R ->> -endobj - -869 0 obj -<< - /Type /StructElem - /S /Code - /P 867 0 R - /K [115] - /Pg 5029 0 R ->> -endobj - -870 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [113 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5027 0 R - >>] - /Pg 5029 0 R ->> -endobj - -871 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [107 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5026 0 R - >>] - /Pg 5029 0 R ->> -endobj - -872 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [103 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5025 0 R - >>] - /Pg 5029 0 R ->> -endobj - -873 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [97 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5024 0 R - >>] - /Pg 5029 0 R ->> -endobj - -874 0 obj -<< - /Type /StructElem - /S /Code - /P 867 0 R - /K [94] - /Pg 5029 0 R ->> -endobj - -875 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [90 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5023 0 R - >>] - /Pg 5029 0 R ->> -endobj - -876 0 obj -<< - /Type /StructElem - /S /Link - /P 867 0 R - /K [85 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5022 0 R - >>] - /Pg 5029 0 R ->> -endobj - -877 0 obj -<< - /Type /StructElem - /S /Strong - /P 867 0 R - /K [80] - /Pg 5029 0 R ->> -endobj - -878 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [895 0 R 4 5 6 7 894 0 R 9 10 893 0 R 12 13 14 892 0 R 16 17 891 0 R 19 20 890 0 R 22 23 24 25 26 27 889 0 R 29 30 31 32 888 0 R 34 35 36 887 0 R 38 39 40 41 42 43 886 0 R 45 46 47 48 49 885 0 R 51 52 53 884 0 R 55 56 57 58 883 0 R 60 61 62 882 0 R 64 65 66 881 0 R 68 880 0 R 70 71 879 0 R 73 74 75 76 77 78 79] - /Pg 5029 0 R ->> -endobj - -879 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [72 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5021 0 R - >>] - /Pg 5029 0 R ->> -endobj - -880 0 obj -<< - /Type /StructElem - /S /Code - /P 878 0 R - /K [69] - /Pg 5029 0 R ->> -endobj - -881 0 obj -<< - /Type /StructElem - /S /Code - /P 878 0 R - /K [67] - /Pg 5029 0 R ->> -endobj - -882 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [63 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5020 0 R - >>] - /Pg 5029 0 R ->> -endobj - -883 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [59 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5019 0 R - >>] - /Pg 5029 0 R ->> -endobj - -884 0 obj -<< - /Type /StructElem - /S /Code - /P 878 0 R - /K [54] - /Pg 5029 0 R ->> -endobj - -885 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [50 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5018 0 R - >>] - /Pg 5029 0 R ->> -endobj - -886 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [44 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5017 0 R - >>] - /Pg 5029 0 R ->> -endobj - -887 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [37 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5016 0 R - >>] - /Pg 5029 0 R ->> -endobj - -888 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [33 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5015 0 R - >>] - /Pg 5029 0 R ->> -endobj - -889 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [28 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5014 0 R - >>] - /Pg 5029 0 R ->> -endobj - -890 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [21 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5013 0 R - >>] - /Pg 5029 0 R ->> -endobj - -891 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [18 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5012 0 R - >>] - /Pg 5029 0 R ->> -endobj - -892 0 obj -<< - /Type /StructElem - /S /Em - /P 878 0 R - /K [15] - /Pg 5029 0 R ->> -endobj - -893 0 obj -<< - /Type /StructElem - /S /Link - /P 878 0 R - /K [11 << - /Type /OBJR - /Pg 5029 0 R - /Obj 5011 0 R - >>] - /Pg 5029 0 R ->> -endobj - -894 0 obj -<< - /Type /StructElem - /S /Em - /P 878 0 R - /K [8] - /Pg 5029 0 R ->> -endobj - -895 0 obj -<< - /Type /StructElem - /S /Strong - /P 878 0 R - /K [3] - /Pg 5029 0 R ->> -endobj - -896 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [89 90 << - /Type /MCR - /MCID 0 - /Pg 5029 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 5029 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 5029 0 R - >>] - /Pg 5009 0 R ->> -endobj - -897 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Temporal Composability) - /K [87 88] - /Pg 5009 0 R ->> -endobj - -898 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [909 0 R 45 46 908 0 R 48 907 0 R 50 51 906 0 R 53 905 0 R 55 904 0 R 57 903 0 R 59 60 61 62 63 64 902 0 R 67 68 69 70 71 72 901 0 R 74 75 76 77 78 900 0 R 80 899 0 R 82 83 84 85 86] - /Pg 5009 0 R ->> -endobj - -899 0 obj -<< - /Type /StructElem - /S /Link - /P 898 0 R - /K [81 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5008 0 R - >>] - /Pg 5009 0 R ->> -endobj - -900 0 obj -<< - /Type /StructElem - /S /Link - /P 898 0 R - /K [79 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5007 0 R - >>] - /Pg 5009 0 R ->> -endobj - -901 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [73] - /Pg 5009 0 R ->> -endobj - -902 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [65 66] - /Pg 5009 0 R ->> -endobj - -903 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [58] - /Pg 5009 0 R ->> -endobj - -904 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [56] - /Pg 5009 0 R ->> -endobj - -905 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [54] - /Pg 5009 0 R ->> -endobj - -906 0 obj -<< - /Type /StructElem - /S /Em - /P 898 0 R - /K [52] - /Pg 5009 0 R ->> -endobj - -907 0 obj -<< - /Type /StructElem - /S /Link - /P 898 0 R - /K [49 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5006 0 R - >>] - /Pg 5009 0 R ->> -endobj - -908 0 obj -<< - /Type /StructElem - /S /Link - /P 898 0 R - /K [47 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5005 0 R - >>] - /Pg 5009 0 R ->> -endobj - -909 0 obj -<< - /Type /StructElem - /S /Strong - /P 898 0 R - /K [44] - /Pg 5009 0 R ->> -endobj - -910 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [917 0 R 9 10 916 0 R 12 915 0 R 14 15 914 0 R 17 18 19 20 21 22 913 0 R 24 25 26 27 28 29 30 912 0 R 33 34 911 0 R 36 37 38 39 40 41 42 43] - /Pg 5009 0 R ->> -endobj - -911 0 obj -<< - /Type /StructElem - /S /Link - /P 910 0 R - /K [35 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5004 0 R - >>] - /Pg 5009 0 R ->> -endobj - -912 0 obj -<< - /Type /StructElem - /S /Formula - /P 910 0 R - /K [31 32] - /Pg 5009 0 R ->> -endobj - -913 0 obj -<< - /Type /StructElem - /S /Link - /P 910 0 R - /K [23 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5003 0 R - >>] - /Pg 5009 0 R ->> -endobj - -914 0 obj -<< - /Type /StructElem - /S /Em - /P 910 0 R - /K [16] - /Pg 5009 0 R ->> -endobj - -915 0 obj -<< - /Type /StructElem - /S /Link - /P 910 0 R - /K [13 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5002 0 R - >>] - /Pg 5009 0 R ->> -endobj - -916 0 obj -<< - /Type /StructElem - /S /Link - /P 910 0 R - /K [11 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5001 0 R - >>] - /Pg 5009 0 R ->> -endobj - -917 0 obj -<< - /Type /StructElem - /S /Strong - /P 910 0 R - /K [8] - /Pg 5009 0 R ->> -endobj - -918 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [919 0 R 5 6 7] - /Pg 5009 0 R ->> -endobj - -919 0 obj -<< - /Type /StructElem - /S /Link - /P 918 0 R - /K [4 << - /Type /OBJR - /Pg 5009 0 R - /Obj 5000 0 R - >>] - /Pg 5009 0 R ->> -endobj - -920 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Programming Paradigms) - /K [2 3] - /Pg 5009 0 R ->> -endobj - -921 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [927 0 R 69 70 926 0 R 72 73 925 0 R 76 77 78 79 80 81 924 0 R 83 923 0 R 85 86 87 922 0 R 89 90 91 92 << - /Type /MCR - /MCID 0 - /Pg 5009 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 5009 0 R - >>] - /Pg 4998 0 R ->> -endobj - -922 0 obj -<< - /Type /StructElem - /S /Link - /P 921 0 R - /K [88 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4997 0 R - >>] - /Pg 4998 0 R ->> -endobj - -923 0 obj -<< - /Type /StructElem - /S /Link - /P 921 0 R - /K [84 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4996 0 R - >>] - /Pg 4998 0 R ->> -endobj - -924 0 obj -<< - /Type /StructElem - /S /Link - /P 921 0 R - /K [82 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4995 0 R - >>] - /Pg 4998 0 R ->> -endobj - -925 0 obj -<< - /Type /StructElem - /S /Em - /P 921 0 R - /K [74 75] - /Pg 4998 0 R ->> -endobj - -926 0 obj -<< - /Type /StructElem - /S /Link - /P 921 0 R - /K [71 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4994 0 R - >>] - /Pg 4998 0 R ->> -endobj - -927 0 obj -<< - /Type /StructElem - /S /Strong - /P 921 0 R - /K [68] - /Pg 4998 0 R ->> -endobj - -928 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [933 0 R 47 48 49 932 0 R 51 52 53 931 0 R 55 930 0 R 57 58 59 60 61 62 63 64 65 929 0 R 67] - /Pg 4998 0 R ->> -endobj - -929 0 obj -<< - /Type /StructElem - /S /Link - /P 928 0 R - /K [66 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4993 0 R - >>] - /Pg 4998 0 R ->> -endobj - -930 0 obj -<< - /Type /StructElem - /S /Em - /P 928 0 R - /K [56] - /Pg 4998 0 R ->> -endobj - -931 0 obj -<< - /Type /StructElem - /S /Em - /P 928 0 R - /K [54] - /Pg 4998 0 R ->> -endobj - -932 0 obj -<< - /Type /StructElem - /S /Link - /P 928 0 R - /K [50 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4992 0 R - >>] - /Pg 4998 0 R ->> -endobj - -933 0 obj -<< - /Type /StructElem - /S /Strong - /P 928 0 R - /K [46] - /Pg 4998 0 R ->> -endobj - -934 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [942 0 R 12 941 0 R 14 15 16 940 0 R 18 19 939 0 R 21 938 0 R 23 24 25 26 27 937 0 R 29 30 31 32 33 34 35 936 0 R 37 38 935 0 R 40 41 42 43 44 45] - /Pg 4998 0 R ->> -endobj - -935 0 obj -<< - /Type /StructElem - /S /Em - /P 934 0 R - /K [39] - /Pg 4998 0 R ->> -endobj - -936 0 obj -<< - /Type /StructElem - /S /Em - /P 934 0 R - /K [36] - /Pg 4998 0 R ->> -endobj - -937 0 obj -<< - /Type /StructElem - /S /Link - /P 934 0 R - /K [28 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4991 0 R - >>] - /Pg 4998 0 R ->> -endobj - -938 0 obj -<< - /Type /StructElem - /S /Link - /P 934 0 R - /K [22 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4990 0 R - >>] - /Pg 4998 0 R ->> -endobj - -939 0 obj -<< - /Type /StructElem - /S /Link - /P 934 0 R - /K [20 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4989 0 R - >>] - /Pg 4998 0 R ->> -endobj - -940 0 obj -<< - /Type /StructElem - /S /Em - /P 934 0 R - /K [17] - /Pg 4998 0 R ->> -endobj - -941 0 obj -<< - /Type /StructElem - /S /Link - /P 934 0 R - /K [13 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4988 0 R - >>] - /Pg 4998 0 R ->> -endobj - -942 0 obj -<< - /Type /StructElem - /S /Strong - /P 934 0 R - /K [11] - /Pg 4998 0 R ->> -endobj - -943 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [944 0 R 7 8 9 10] - /Pg 4998 0 R ->> -endobj - -944 0 obj -<< - /Type /StructElem - /S /Link - /P 943 0 R - /K [6 << - /Type /OBJR - /Pg 4998 0 R - /Obj 4987 0 R - >>] - /Pg 4998 0 R ->> -endobj - -945 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Effect and Coeffect Systems) - /K [4 5] - /Pg 4998 0 R ->> -endobj - -946 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3] - /Pg 4998 0 R ->> -endobj - -947 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Related Work) - /K [0 1] - /Pg 4998 0 R ->> -endobj - -948 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [114 115 116] - /Pg 4985 0 R ->> -endobj - -949 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [955 0 R 81 82 83 954 0 R 90 91 92 93 953 0 R 95 96 97 98 99 100 101 952 0 R 103 104 105 951 0 R 107 108 109 110 950 0 R 112 113] - /Pg 4985 0 R ->> -endobj - -950 0 obj -<< - /Type /StructElem - /S /Link - /P 949 0 R - /K [111 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4984 0 R - >>] - /Pg 4985 0 R ->> -endobj - -951 0 obj -<< - /Type /StructElem - /S /Link - /P 949 0 R - /K [106 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4983 0 R - >>] - /Pg 4985 0 R ->> -endobj - -952 0 obj -<< - /Type /StructElem - /S /Link - /P 949 0 R - /K [102 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4982 0 R - >>] - /Pg 4985 0 R ->> -endobj - -953 0 obj -<< - /Type /StructElem - /S /Link - /P 949 0 R - /K [94 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4981 0 R - >>] - /Pg 4985 0 R ->> -endobj - -954 0 obj -<< - /Type /StructElem - /S /Formula - /P 949 0 R - /K [84 85 86 87 88 89] - /Pg 4985 0 R ->> -endobj - -955 0 obj -<< - /Type /StructElem - /S /Strong - /P 949 0 R - /K [80] - /Pg 4985 0 R ->> -endobj - -956 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [959 0 R 62 63 64 958 0 R 66 67 68 957 0 R 70 71 72 73 74 75 76 77 78 79] - /Pg 4985 0 R ->> -endobj - -957 0 obj -<< - /Type /StructElem - /S /Em - /P 956 0 R - /K [69] - /Pg 4985 0 R ->> -endobj - -958 0 obj -<< - /Type /StructElem - /S /Link - /P 956 0 R - /K [65 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4980 0 R - >>] - /Pg 4985 0 R ->> -endobj - -959 0 obj -<< - /Type /StructElem - /S /Strong - /P 956 0 R - /K [61] - /Pg 4985 0 R ->> -endobj - -960 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [964 0 R 48 963 0 R 50 962 0 R 54 961 0 R 56 57 58 59 60] - /Pg 4985 0 R ->> -endobj - -961 0 obj -<< - /Type /StructElem - /S /Formula - /P 960 0 R - /K [55] - /Pg 4985 0 R ->> -endobj - -962 0 obj -<< - /Type /StructElem - /S /Formula - /P 960 0 R - /K [51 52 53] - /Pg 4985 0 R ->> -endobj - -963 0 obj -<< - /Type /StructElem - /S /Formula - /P 960 0 R - /K [49] - /Pg 4985 0 R ->> -endobj - -964 0 obj -<< - /Type /StructElem - /S /Strong - /P 960 0 R - /K [47] - /Pg 4985 0 R ->> -endobj - -965 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [34 969 0 R 36 37 968 0 R 39 967 0 R 41 42 966 0 R 44 45 46] - /Pg 4985 0 R ->> -endobj - -966 0 obj -<< - /Type /StructElem - /S /Link - /P 965 0 R - /K [43 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4979 0 R - >>] - /Pg 4985 0 R ->> -endobj - -967 0 obj -<< - /Type /StructElem - /S /Em - /P 965 0 R - /K [40] - /Pg 4985 0 R ->> -endobj - -968 0 obj -<< - /Type /StructElem - /S /Em - /P 965 0 R - /K [38] - /Pg 4985 0 R ->> -endobj - -969 0 obj -<< - /Type /StructElem - /S /Em - /P 965 0 R - /K [35] - /Pg 4985 0 R ->> -endobj - -970 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [972 0 R 26 971 0 R 28 29 30 31 32 33] - /Pg 4985 0 R ->> -endobj - -971 0 obj -<< - /Type /StructElem - /S /Formula - /P 970 0 R - /K [27] - /Pg 4985 0 R ->> -endobj - -972 0 obj -<< - /Type /StructElem - /S /Strong - /P 970 0 R - /K [25] - /Pg 4985 0 R ->> -endobj - -973 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [978 0 R 3 977 0 R 5 6 7 8 976 0 R 10 11 975 0 R 18 19 20 21 974 0 R 23 24] - /Pg 4985 0 R ->> -endobj - -974 0 obj -<< - /Type /StructElem - /S /Link - /P 973 0 R - /K [22 << - /Type /OBJR - /Pg 4985 0 R - /Obj 4978 0 R - >>] - /Pg 4985 0 R ->> -endobj - -975 0 obj -<< - /Type /StructElem - /S /Formula - /P 973 0 R - /K [12 13 14 15 16 17] - /Pg 4985 0 R ->> -endobj - -976 0 obj -<< - /Type /StructElem - /S /Formula - /P 973 0 R - /K [9] - /Pg 4985 0 R ->> -endobj - -977 0 obj -<< - /Type /StructElem - /S /Formula - /P 973 0 R - /K [4] - /Pg 4985 0 R ->> -endobj - -978 0 obj -<< - /Type /StructElem - /S /Strong - /P 973 0 R - /K [2] - /Pg 4985 0 R ->> -endobj - -979 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [63 64 982 0 R 66 981 0 R 68 980 0 R 71 << - /Type /MCR - /MCID 0 - /Pg 4985 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4985 0 R - >>] - /Pg 4976 0 R ->> -endobj - -980 0 obj -<< - /Type /StructElem - /S /Formula - /P 979 0 R - /K [69 70] - /Pg 4976 0 R ->> -endobj - -981 0 obj -<< - /Type /StructElem - /S /Formula - /P 979 0 R - /K [67] - /Pg 4976 0 R ->> -endobj - -982 0 obj -<< - /Type /StructElem - /S /Formula - /P 979 0 R - /K [65] - /Pg 4976 0 R ->> -endobj - -983 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Dependency Typing and Versioning) - /K [61 62] - /Pg 4976 0 R ->> -endobj - -984 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [53 54 55 56 57 58 59 60] - /Pg 4976 0 R ->> -endobj - -985 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [38 39 40 987 0 R 42 43 986 0 R 45 46 47 48 49 50 51 52] - /Pg 4976 0 R ->> -endobj - -986 0 obj -<< - /Type /StructElem - /S /Formula - /P 985 0 R - /K [44] - /Pg 4976 0 R ->> -endobj - -987 0 obj -<< - /Type /StructElem - /S /Formula - /P 985 0 R - /K [41] - /Pg 4976 0 R ->> -endobj - -988 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [26 27 28 29 30 31 32 33 34 35 36 37] - /Pg 4976 0 R ->> -endobj - -989 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [10 11 995 0 R 13 994 0 R 15 993 0 R 17 992 0 R 19 991 0 R 21 990 0 R 23 24 25] - /Pg 4976 0 R ->> -endobj - -990 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [22] - /Pg 4976 0 R ->> -endobj - -991 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [20] - /Pg 4976 0 R ->> -endobj - -992 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [18] - /Pg 4976 0 R ->> -endobj - -993 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [16] - /Pg 4976 0 R ->> -endobj - -994 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [14] - /Pg 4976 0 R ->> -endobj - -995 0 obj -<< - /Type /StructElem - /S /Formula - /P 989 0 R - /K [12] - /Pg 4976 0 R ->> -endobj - -996 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Mutual Dependencies and Component Granularity) - /K [8 9] - /Pg 4976 0 R ->> -endobj - -997 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [108 109 110 999 0 R 112 113 << - /Type /MCR - /MCID 0 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 4976 0 R - >> 998 0 R << - /Type /MCR - /MCID 4 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 6 - /Pg 4976 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4976 0 R - >>] - /Pg 4973 0 R ->> -endobj - -998 0 obj -<< - /Type /StructElem - /S /Link - /P 997 0 R - /K [3 << - /Type /OBJR - /Pg 4976 0 R - /Obj 4975 0 R - >>] - /Pg 4976 0 R ->> -endobj - -999 0 obj -<< - /Type /StructElem - /S /Link - /P 997 0 R - /K [111 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4971 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1000 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [84 85 86 87 1006 0 R 89 90 1005 0 R 92 93 94 1004 0 R 96 97 1003 0 R 99 100 101 1002 0 R 103 1001 0 R 105 106 107] - /Pg 4973 0 R ->> -endobj - -1001 0 obj -<< - /Type /StructElem - /S /Link - /P 1000 0 R - /K [104 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4970 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1002 0 obj -<< - /Type /StructElem - /S /Link - /P 1000 0 R - /K [102 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4969 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1003 0 obj -<< - /Type /StructElem - /S /Link - /P 1000 0 R - /K [98 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4968 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1004 0 obj -<< - /Type /StructElem - /S /Code - /P 1000 0 R - /K [95] - /Pg 4973 0 R ->> -endobj - -1005 0 obj -<< - /Type /StructElem - /S /Link - /P 1000 0 R - /K [91 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4967 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1006 0 obj -<< - /Type /StructElem - /S /Code - /P 1000 0 R - /K [88] - /Pg 4973 0 R ->> -endobj - -1007 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [56 57 58 1014 0 R 60 61 1013 0 R 63 64 65 66 1012 0 R 68 69 70 1011 0 R 72 1010 0 R 74 75 1009 0 R 77 78 79 1008 0 R 81 82 83] - /Pg 4973 0 R ->> -endobj - -1008 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [80 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4966 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1009 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [76 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4965 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1010 0 obj -<< - /Type /StructElem - /S /Code - /P 1007 0 R - /K [73] - /Pg 4973 0 R ->> -endobj - -1011 0 obj -<< - /Type /StructElem - /S /Code - /P 1007 0 R - /K [71] - /Pg 4973 0 R ->> -endobj - -1012 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [67 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4964 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1013 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [62 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4963 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1014 0 obj -<< - /Type /StructElem - /S /Link - /P 1007 0 R - /K [59 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4962 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1015 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1019 0 R 44 45 46 47 1018 0 R 49 50 51 1017 0 R 53 1016 0 R 55] - /Pg 4973 0 R ->> -endobj - -1016 0 obj -<< - /Type /StructElem - /S /Em - /P 1015 0 R - /K [54] - /Pg 4973 0 R ->> -endobj - -1017 0 obj -<< - /Type /StructElem - /S /Em - /P 1015 0 R - /K [52] - /Pg 4973 0 R ->> -endobj - -1018 0 obj -<< - /Type /StructElem - /S /Link - /P 1015 0 R - /K [48 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4961 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1019 0 obj -<< - /Type /StructElem - /S /Strong - /P 1015 0 R - /K [43] - /Pg 4973 0 R ->> -endobj - -1020 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [18 19 20 21 1031 0 R 1026 0 R 23 24 1025 0 R 26 1024 0 R 28 29 1023 0 R 31 1022 0 R 33 34 1021 0 R 36 37 38 39 40 41 42] - /Pg 4973 0 R ->> -endobj - -1021 0 obj -<< - /Type /StructElem - /S /Link - /P 1020 0 R - /K [35 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4960 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1022 0 obj -<< - /Type /StructElem - /S /Code - /P 1020 0 R - /K [32] - /Pg 4973 0 R ->> -endobj - -1023 0 obj -<< - /Type /StructElem - /S /Code - /P 1020 0 R - /K [30] - /Pg 4973 0 R ->> -endobj - -1024 0 obj -<< - /Type /StructElem - /S /Code - /P 1020 0 R - /K [27] - /Pg 4973 0 R ->> -endobj - -1025 0 obj -<< - /Type /StructElem - /S /Code - /P 1020 0 R - /K [25] - /Pg 4973 0 R ->> -endobj - -1026 0 obj -<< - /Type /StructElem - /S /Note - /P 1020 0 R - /ID (Note 6) - /K [1028 0 R 115 1027 0 R 117 118] - /Pg 4973 0 R ->> -endobj - -1027 0 obj -<< - /Type /StructElem - /S /Code - /P 1026 0 R - /K [116] - /Pg 4973 0 R ->> -endobj - -1028 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1026 0 R - /K [1029 0 R] ->> -endobj - -1029 0 obj -<< - /Type /StructElem - /S /Link - /P 1028 0 R - /K [<< - /Type /OBJR - /Pg 4973 0 R - /Obj 4972 0 R - >> 1030 0 R] ->> -endobj - -1030 0 obj -<< - /Type /StructElem - /S /Span - /P 1029 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [114] - /Pg 4973 0 R ->> -endobj - -1031 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1020 0 R - /K [1032 0 R] ->> -endobj - -1032 0 obj -<< - /Type /StructElem - /S /Link - /P 1031 0 R - /K [<< - /Type /OBJR - /Pg 4973 0 R - /Obj 4959 0 R - >> 1033 0 R] ->> -endobj - -1033 0 obj -<< - /Type /StructElem - /S /Span - /P 1032 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [22] - /Pg 4973 0 R ->> -endobj - -1034 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1036 0 R 12 1035 0 R 14 15 16 17] - /Pg 4973 0 R ->> -endobj - -1035 0 obj -<< - /Type /StructElem - /S /Em - /P 1034 0 R - /K [13] - /Pg 4973 0 R ->> -endobj - -1036 0 obj -<< - /Type /StructElem - /S /Strong - /P 1034 0 R - /K [11] - /Pg 4973 0 R ->> -endobj - -1037 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [7 8 9 10] - /Pg 4973 0 R ->> -endobj - -1038 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Language Independence and Selection) - /K [5 6] - /Pg 4973 0 R ->> -endobj - -1039 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1043 0 R 60 61 62 63 64 65 66 1042 0 R 68 69 70 71 1041 0 R 73 74 75 << - /Type /MCR - /MCID 0 - /Pg 4973 0 R - >> 1040 0 R << - /Type /MCR - /MCID 2 - /Pg 4973 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4973 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4973 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1040 0 obj -<< - /Type /StructElem - /S /Link - /P 1039 0 R - /K [1 << - /Type /OBJR - /Pg 4973 0 R - /Obj 4958 0 R - >>] - /Pg 4973 0 R ->> -endobj - -1041 0 obj -<< - /Type /StructElem - /S /Link - /P 1039 0 R - /K [72 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4955 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1042 0 obj -<< - /Type /StructElem - /S /Link - /P 1039 0 R - /K [67 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4954 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1043 0 obj -<< - /Type /StructElem - /S /Strong - /P 1039 0 R - /K [59] - /Pg 4956 0 R ->> -endobj - -1044 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [46 47 1045 0 R 49 50 51 52 53 54 55 56 57 58] - /Pg 4956 0 R ->> -endobj - -1045 0 obj -<< - /Type /StructElem - /S /Link - /P 1044 0 R - /K [48 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4953 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1046 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1051 0 R 27 1050 0 R 29 30 31 32 33 1049 0 R 35 1048 0 R 37 38 39 1047 0 R 41 42 43 44 45] - /Pg 4956 0 R ->> -endobj - -1047 0 obj -<< - /Type /StructElem - /S /Code - /P 1046 0 R - /K [40] - /Pg 4956 0 R ->> -endobj - -1048 0 obj -<< - /Type /StructElem - /S /Link - /P 1046 0 R - /K [36 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4952 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1049 0 obj -<< - /Type /StructElem - /S /Link - /P 1046 0 R - /K [34 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4951 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1050 0 obj -<< - /Type /StructElem - /S /Link - /P 1046 0 R - /K [28 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4950 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1051 0 obj -<< - /Type /StructElem - /S /Strong - /P 1046 0 R - /K [26] - /Pg 4956 0 R ->> -endobj - -1052 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [21 22 23 24 25] - /Pg 4956 0 R ->> -endobj - -1053 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Access Control and Sandboxing) - /K [19 20] - /Pg 4956 0 R ->> -endobj - -1054 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1056 0 R 8 9 1055 0 R 11 12 13 14 15 16 17 18] - /Pg 4956 0 R ->> -endobj - -1055 0 obj -<< - /Type /StructElem - /S /Link - /P 1054 0 R - /K [10 << - /Type /OBJR - /Pg 4956 0 R - /Obj 4949 0 R - >>] - /Pg 4956 0 R ->> -endobj - -1056 0 obj -<< - /Type /StructElem - /S /Strong - /P 1054 0 R - /K [7] - /Pg 4956 0 R ->> -endobj - -1057 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1061 0 R 66 67 68 1060 0 R 70 1059 0 R 72 73 << - /Type /MCR - /MCID 0 - /Pg 4956 0 R - >> 1058 0 R << - /Type /MCR - /MCID 2 - /Pg 4956 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4956 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4956 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4956 0 R - >> << - /Type /MCR - /MCID 6 - /Pg 4956 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1058 0 obj -<< - /Type /StructElem - /S /Code - /P 1057 0 R - /K [1] - /Pg 4956 0 R ->> -endobj - -1059 0 obj -<< - /Type /StructElem - /S /Link - /P 1057 0 R - /K [71 << - /Type /OBJR - /Pg 4947 0 R - /Obj 4946 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1060 0 obj -<< - /Type /StructElem - /S /Link - /P 1057 0 R - /K [69 << - /Type /OBJR - /Pg 4947 0 R - /Obj 4945 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1061 0 obj -<< - /Type /StructElem - /S /Strong - /P 1057 0 R - /K [65] - /Pg 4947 0 R ->> -endobj - -1062 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1063 0 R 59 60 61 62 63 64] - /Pg 4947 0 R ->> -endobj - -1063 0 obj -<< - /Type /StructElem - /S /Strong - /P 1062 0 R - /K [58] - /Pg 4947 0 R ->> -endobj - -1064 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [56 57] - /Pg 4947 0 R ->> -endobj - -1065 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [25 26 1073 0 R 28 29 1072 0 R 31 32 33 34 1071 0 R 36 1070 0 R 38 1069 0 R 40 41 1068 0 R 43 44 1067 0 R 46 47 48 49 1066 0 R 51 52 53 54 55] - /Pg 4947 0 R ->> -endobj - -1066 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [50] - /Pg 4947 0 R ->> -endobj - -1067 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [45] - /Pg 4947 0 R ->> -endobj - -1068 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [42] - /Pg 4947 0 R ->> -endobj - -1069 0 obj -<< - /Type /StructElem - /S /Code - /P 1065 0 R - /K [39] - /Pg 4947 0 R ->> -endobj - -1070 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [37] - /Pg 4947 0 R ->> -endobj - -1071 0 obj -<< - /Type /StructElem - /S /Code - /P 1065 0 R - /K [35] - /Pg 4947 0 R ->> -endobj - -1072 0 obj -<< - /Type /StructElem - /S /Em - /P 1065 0 R - /K [30] - /Pg 4947 0 R ->> -endobj - -1073 0 obj -<< - /Type /StructElem - /S /Link - /P 1065 0 R - /K [27 << - /Type /OBJR - /Pg 4947 0 R - /Obj 4944 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1074 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Service Multiplexing) - /K [23 24] - /Pg 4947 0 R ->> -endobj - -1075 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [18 19 20 21 22] - /Pg 4947 0 R ->> -endobj - -1076 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Discussion) - /K [16 17] - /Pg 4947 0 R ->> -endobj - -1077 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1078 0 R 9 10 11 12 13 14 15] - /Pg 4947 0 R ->> -endobj - -1078 0 obj -<< - /Type /StructElem - /S /Strong - /P 1077 0 R - /K [8] - /Pg 4947 0 R ->> -endobj - -1079 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1082 0 R 66 1081 0 R 68 69 70 71 << - /Type /MCR - /MCID 0 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4947 0 R - >> 1080 0 R << - /Type /MCR - /MCID 3 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 6 - /Pg 4947 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4947 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1080 0 obj -<< - /Type /StructElem - /S /Link - /P 1079 0 R - /K [2 << - /Type /OBJR - /Pg 4947 0 R - /Obj 4943 0 R - >>] - /Pg 4947 0 R ->> -endobj - -1081 0 obj -<< - /Type /StructElem - /S /Link - /P 1079 0 R - /K [67 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4938 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1082 0 obj -<< - /Type /StructElem - /S /Strong - /P 1079 0 R - /K [65] - /Pg 4941 0 R ->> -endobj - -1083 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1087 0 R 48 1086 0 R 50 51 52 53 54 55 56 57 1085 0 R 59 60 61 1084 0 R 63 64] - /Pg 4941 0 R ->> -endobj - -1084 0 obj -<< - /Type /StructElem - /S /Link - /P 1083 0 R - /K [62 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4937 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1085 0 obj -<< - /Type /StructElem - /S /Link - /P 1083 0 R - /K [58 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4936 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1086 0 obj -<< - /Type /StructElem - /S /Link - /P 1083 0 R - /K [49 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4935 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1087 0 obj -<< - /Type /StructElem - /S /Strong - /P 1083 0 R - /K [47] - /Pg 4941 0 R ->> -endobj - -1088 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1091 0 R 33 34 1090 0 R 36 37 38 39 40 1089 0 R 42 43 44 45 46] - /Pg 4941 0 R ->> -endobj - -1089 0 obj -<< - /Type /StructElem - /S /Link - /P 1088 0 R - /K [41 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4934 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1090 0 obj -<< - /Type /StructElem - /S /Link - /P 1088 0 R - /K [35 << - /Type /OBJR - /Pg 4941 0 R - /Obj 4933 0 R - >>] - /Pg 4941 0 R ->> -endobj - -1091 0 obj -<< - /Type /StructElem - /S /Strong - /P 1088 0 R - /K [32] - /Pg 4941 0 R ->> -endobj - -1092 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [23 1106 0 R 1102 0 R 25 26 1099 0 R 1093 0 R 28 29 30 31] - /Pg 4941 0 R ->> -endobj - -1093 0 obj -<< - /Type /StructElem - /S /Note - /P 1092 0 R - /ID (Note 5) - /K [1096 0 R 76 1095 0 R 78 1094 0 R 80] - /Pg 4941 0 R ->> -endobj - -1094 0 obj -<< - /Type /StructElem - /S /Em - /P 1093 0 R - /K [79] - /Pg 4941 0 R ->> -endobj - -1095 0 obj -<< - /Type /StructElem - /S /Em - /P 1093 0 R - /K [77] - /Pg 4941 0 R ->> -endobj - -1096 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1093 0 R - /K [1097 0 R] ->> -endobj - -1097 0 obj -<< - /Type /StructElem - /S /Link - /P 1096 0 R - /K [<< - /Type /OBJR - /Pg 4941 0 R - /Obj 4940 0 R - >> 1098 0 R] ->> -endobj - -1098 0 obj -<< - /Type /StructElem - /S /Span - /P 1097 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [75] - /Pg 4941 0 R ->> -endobj - -1099 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1092 0 R - /K [1100 0 R] ->> -endobj - -1100 0 obj -<< - /Type /StructElem - /S /Link - /P 1099 0 R - /K [<< - /Type /OBJR - /Pg 4941 0 R - /Obj 4932 0 R - >> 1101 0 R] ->> -endobj - -1101 0 obj -<< - /Type /StructElem - /S /Span - /P 1100 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [27] - /Pg 4941 0 R ->> -endobj - -1102 0 obj -<< - /Type /StructElem - /S /Note - /P 1092 0 R - /ID (Note 4) - /K [1103 0 R 73 74] - /Pg 4941 0 R ->> -endobj - -1103 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1102 0 R - /K [1104 0 R] ->> -endobj - -1104 0 obj -<< - /Type /StructElem - /S /Link - /P 1103 0 R - /K [<< - /Type /OBJR - /Pg 4941 0 R - /Obj 4939 0 R - >> 1105 0 R] ->> -endobj - -1105 0 obj -<< - /Type /StructElem - /S /Span - /P 1104 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [72] - /Pg 4941 0 R ->> -endobj - -1106 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1092 0 R - /K [1107 0 R] ->> -endobj - -1107 0 obj -<< - /Type /StructElem - /S /Link - /P 1106 0 R - /K [<< - /Type /OBJR - /Pg 4941 0 R - /Obj 4931 0 R - >> 1108 0 R] ->> -endobj - -1108 0 obj -<< - /Type /StructElem - /S /Span - /P 1107 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [24] - /Pg 4941 0 R ->> -endobj - -1109 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Case Study: Koishi) - /K [21 22] - /Pg 4941 0 R ->> -endobj - -1110 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [15 16 17 1111 0 R 19 20] - /Pg 4941 0 R ->> -endobj - -1111 0 obj -<< - /Type /StructElem - /S /Code - /P 1110 0 R - /K [18] - /Pg 4941 0 R ->> -endobj - -1112 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1207 0 R 1113 0 R] ->> -endobj - -1113 0 obj -<< - /Type /StructElem - /S /Div - /P 1112 0 R - /K [1206 0 R 1204 0 R 1201 0 R 1199 0 R 1198 0 R 1197 0 R 1193 0 R 1191 0 R 1190 0 R 1188 0 R 1186 0 R 1185 0 R 1184 0 R 1183 0 R 1178 0 R 1176 0 R 1175 0 R 1174 0 R 1173 0 R 1172 0 R 1170 0 R 1168 0 R 1167 0 R 1166 0 R 1165 0 R 1161 0 R 1159 0 R 1158 0 R 1155 0 R 1153 0 R 1152 0 R 1151 0 R 1150 0 R 1148 0 R 1146 0 R 1145 0 R 1144 0 R 1139 0 R 1137 0 R 1136 0 R 1135 0 R 1134 0 R 1133 0 R 1131 0 R 1129 0 R 1128 0 R 1127 0 R 1126 0 R 1122 0 R 1120 0 R 1119 0 R 1118 0 R 1115 0 R 1114 0 R] ->> -endobj - -1114 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1115 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1117 0 R 1116 0 R] ->> -endobj - -1116 0 obj -<< - /Type /StructElem - /S /Span - /P 1115 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14] - /Pg 4941 0 R ->> -endobj - -1117 0 obj -<< - /Type /StructElem - /S /Strong - /P 1115 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13] - /Pg 4941 0 R ->> -endobj - -1118 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1119 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1120 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1121 0 R] ->> -endobj - -1121 0 obj -<< - /Type /StructElem - /S /Span - /P 1120 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [12] - /Pg 4941 0 R ->> -endobj - -1122 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1125 0 R 1124 0 R 1123 0 R] ->> -endobj - -1123 0 obj -<< - /Type /StructElem - /S /Span - /P 1122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11] - /Pg 4941 0 R ->> -endobj - -1124 0 obj -<< - /Type /StructElem - /S /Formula - /P 1122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4941 0 R ->> -endobj - -1125 0 obj -<< - /Type /StructElem - /S /Span - /P 1122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [9] - /Pg 4941 0 R ->> -endobj - -1126 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1127 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1128 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1129 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1130 0 R] ->> -endobj - -1130 0 obj -<< - /Type /StructElem - /S /Span - /P 1129 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [8] - /Pg 4941 0 R ->> -endobj - -1131 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1132 0 R] ->> -endobj - -1132 0 obj -<< - /Type /StructElem - /S /Span - /P 1131 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [7] - /Pg 4941 0 R ->> -endobj - -1133 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1134 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1135 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1136 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1137 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1138 0 R] ->> -endobj - -1138 0 obj -<< - /Type /StructElem - /S /Span - /P 1137 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [6] - /Pg 4941 0 R ->> -endobj - -1139 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1143 0 R 1142 0 R 1141 0 R 1140 0 R] ->> -endobj - -1140 0 obj -<< - /Type /StructElem - /S /Span - /P 1139 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2 4] - /Pg 4941 0 R ->> -endobj - -1141 0 obj -<< - /Type /StructElem - /S /Strong - /P 1139 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [5] - /Pg 4941 0 R ->> -endobj - -1142 0 obj -<< - /Type /StructElem - /S /Strong - /P 1139 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3] - /Pg 4941 0 R ->> -endobj - -1143 0 obj -<< - /Type /StructElem - /S /Strong - /P 1139 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4941 0 R ->> -endobj - -1144 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1145 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1146 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1147 0 R] ->> -endobj - -1147 0 obj -<< - /Type /StructElem - /S /Span - /P 1146 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4941 0 R ->> -endobj - -1148 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1149 0 R] ->> -endobj - -1149 0 obj -<< - /Type /StructElem - /S /Span - /P 1148 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [147] - /Pg 4929 0 R ->> -endobj - -1150 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1151 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1152 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1153 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1154 0 R] ->> -endobj - -1154 0 obj -<< - /Type /StructElem - /S /Span - /P 1153 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [146] - /Pg 4929 0 R ->> -endobj - -1155 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1157 0 R 1156 0 R] ->> -endobj - -1156 0 obj -<< - /Type /StructElem - /S /Span - /P 1155 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [145] - /Pg 4929 0 R ->> -endobj - -1157 0 obj -<< - /Type /StructElem - /S /Strong - /P 1155 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [144] - /Pg 4929 0 R ->> -endobj - -1158 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1159 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1160 0 R] ->> -endobj - -1160 0 obj -<< - /Type /StructElem - /S /Span - /P 1159 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143] - /Pg 4929 0 R ->> -endobj - -1161 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1164 0 R 1163 0 R 1162 0 R] ->> -endobj - -1162 0 obj -<< - /Type /StructElem - /S /Span - /P 1161 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4929 0 R ->> -endobj - -1163 0 obj -<< - /Type /StructElem - /S /Formula - /P 1161 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [141] - /Pg 4929 0 R ->> -endobj - -1164 0 obj -<< - /Type /StructElem - /S /Span - /P 1161 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [140] - /Pg 4929 0 R ->> -endobj - -1165 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1166 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1167 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1168 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1169 0 R] ->> -endobj - -1169 0 obj -<< - /Type /StructElem - /S /Span - /P 1168 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139] - /Pg 4929 0 R ->> -endobj - -1170 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1171 0 R] ->> -endobj - -1171 0 obj -<< - /Type /StructElem - /S /Span - /P 1170 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [138] - /Pg 4929 0 R ->> -endobj - -1172 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1173 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1174 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1175 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1176 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1177 0 R] ->> -endobj - -1177 0 obj -<< - /Type /StructElem - /S /Span - /P 1176 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [137] - /Pg 4929 0 R ->> -endobj - -1178 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1182 0 R 1181 0 R 1180 0 R 1179 0 R] ->> -endobj - -1179 0 obj -<< - /Type /StructElem - /S /Span - /P 1178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [133 135] - /Pg 4929 0 R ->> -endobj - -1180 0 obj -<< - /Type /StructElem - /S /Strong - /P 1178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [136] - /Pg 4929 0 R ->> -endobj - -1181 0 obj -<< - /Type /StructElem - /S /Strong - /P 1178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [134] - /Pg 4929 0 R ->> -endobj - -1182 0 obj -<< - /Type /StructElem - /S /Strong - /P 1178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [132] - /Pg 4929 0 R ->> -endobj - -1183 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1184 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1185 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1186 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1187 0 R] ->> -endobj - -1187 0 obj -<< - /Type /StructElem - /S /Span - /P 1186 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131] - /Pg 4929 0 R ->> -endobj - -1188 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1189 0 R] ->> -endobj - -1189 0 obj -<< - /Type /StructElem - /S /Strong - /P 1188 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4929 0 R ->> -endobj - -1190 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1191 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1192 0 R] ->> -endobj - -1192 0 obj -<< - /Type /StructElem - /S /Span - /P 1191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [129] - /Pg 4929 0 R ->> -endobj - -1193 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1196 0 R 1195 0 R 1194 0 R] ->> -endobj - -1194 0 obj -<< - /Type /StructElem - /S /Span - /P 1193 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128] - /Pg 4929 0 R ->> -endobj - -1195 0 obj -<< - /Type /StructElem - /S /Formula - /P 1193 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4929 0 R ->> -endobj - -1196 0 obj -<< - /Type /StructElem - /S /Span - /P 1193 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [126] - /Pg 4929 0 R ->> -endobj - -1197 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1198 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1199 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1200 0 R] ->> -endobj - -1200 0 obj -<< - /Type /StructElem - /S /Span - /P 1199 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [125] - /Pg 4929 0 R ->> -endobj - -1201 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1203 0 R 1202 0 R] ->> -endobj - -1202 0 obj -<< - /Type /StructElem - /S /Span - /P 1201 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [124] - /Pg 4929 0 R ->> -endobj - -1203 0 obj -<< - /Type /StructElem - /S /Strong - /P 1201 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [123] - /Pg 4929 0 R ->> -endobj - -1204 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [1205 0 R] ->> -endobj - -1205 0 obj -<< - /Type /StructElem - /S /Span - /P 1204 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [122] - /Pg 4929 0 R ->> -endobj - -1206 0 obj -<< - /Type /StructElem - /S /Div - /P 1113 0 R - /K [] ->> -endobj - -1207 0 obj -<< - /Type /StructElem - /S /P - /P 1112 0 R - /K [1208 0 R 121] - /Pg 4929 0 R ->> -endobj - -1208 0 obj -<< - /Type /StructElem - /S /Strong - /P 1207 0 R - /K [120] - /Pg 4929 0 R ->> -endobj - -1209 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1218 0 R 113 114 1215 0 R 1211 0 R 116 117 1210 0 R 119] - /Pg 4929 0 R ->> -endobj - -1210 0 obj -<< - /Type /StructElem - /S /Code - /P 1209 0 R - /K [118] - /Pg 4929 0 R ->> -endobj - -1211 0 obj -<< - /Type /StructElem - /S /Note - /P 1209 0 R - /ID (Note 3) - /K [1212 0 R 149 150] - /Pg 4929 0 R ->> -endobj - -1212 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1211 0 R - /K [1213 0 R] ->> -endobj - -1213 0 obj -<< - /Type /StructElem - /S /Link - /P 1212 0 R - /K [<< - /Type /OBJR - /Pg 4929 0 R - /Obj 4928 0 R - >> 1214 0 R] ->> -endobj - -1214 0 obj -<< - /Type /StructElem - /S /Span - /P 1213 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [148] - /Pg 4929 0 R ->> -endobj - -1215 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1209 0 R - /K [1216 0 R] ->> -endobj - -1216 0 obj -<< - /Type /StructElem - /S /Link - /P 1215 0 R - /K [<< - /Type /OBJR - /Pg 4929 0 R - /Obj 4927 0 R - >> 1217 0 R] ->> -endobj - -1217 0 obj -<< - /Type /StructElem - /S /Span - /P 1216 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [115] - /Pg 4929 0 R ->> -endobj - -1218 0 obj -<< - /Type /StructElem - /S /Strong - /P 1209 0 R - /K [112] - /Pg 4929 0 R ->> -endobj - -1219 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [107 1221 0 R 109 1220 0 R 111] - /Pg 4929 0 R ->> -endobj - -1220 0 obj -<< - /Type /StructElem - /S /Code - /P 1219 0 R - /K [110] - /Pg 4929 0 R ->> -endobj - -1221 0 obj -<< - /Type /StructElem - /S /Code - /P 1219 0 R - /K [108] - /Pg 4929 0 R ->> -endobj - -1222 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1365 0 R 1223 0 R] ->> -endobj - -1223 0 obj -<< - /Type /StructElem - /S /Div - /P 1222 0 R - /K [1364 0 R 1362 0 R 1359 0 R 1357 0 R 1356 0 R 1355 0 R 1350 0 R 1348 0 R 1347 0 R 1344 0 R 1342 0 R 1341 0 R 1340 0 R 1339 0 R 1329 0 R 1327 0 R 1326 0 R 1325 0 R 1319 0 R 1317 0 R 1316 0 R 1315 0 R 1310 0 R 1308 0 R 1307 0 R 1305 0 R 1303 0 R 1302 0 R 1299 0 R 1297 0 R 1294 0 R 1292 0 R 1291 0 R 1290 0 R 1285 0 R 1283 0 R 1282 0 R 1277 0 R 1275 0 R 1274 0 R 1273 0 R 1272 0 R 1268 0 R 1266 0 R 1265 0 R 1264 0 R 1254 0 R 1252 0 R 1251 0 R 1250 0 R 1249 0 R 1248 0 R 1242 0 R 1240 0 R 1239 0 R 1238 0 R 1237 0 R 1231 0 R 1229 0 R 1228 0 R 1225 0 R 1224 0 R] ->> -endobj - -1224 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1225 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1227 0 R 1226 0 R] ->> -endobj - -1226 0 obj -<< - /Type /StructElem - /S /Span - /P 1225 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106] - /Pg 4929 0 R ->> -endobj - -1227 0 obj -<< - /Type /StructElem - /S /Strong - /P 1225 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4929 0 R ->> -endobj - -1228 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1229 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1230 0 R] ->> -endobj - -1230 0 obj -<< - /Type /StructElem - /S /Span - /P 1229 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104] - /Pg 4929 0 R ->> -endobj - -1231 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1236 0 R 1235 0 R 1234 0 R 1233 0 R 1232 0 R] ->> -endobj - -1232 0 obj -<< - /Type /StructElem - /S /Span - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4929 0 R ->> -endobj - -1233 0 obj -<< - /Type /StructElem - /S /Formula - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [102] - /Pg 4929 0 R ->> -endobj - -1234 0 obj -<< - /Type /StructElem - /S /Span - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101] - /Pg 4929 0 R ->> -endobj - -1235 0 obj -<< - /Type /StructElem - /S /Formula - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100] - /Pg 4929 0 R ->> -endobj - -1236 0 obj -<< - /Type /StructElem - /S /Span - /P 1231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [99] - /Pg 4929 0 R ->> -endobj - -1237 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1238 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1239 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1240 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1241 0 R] ->> -endobj - -1241 0 obj -<< - /Type /StructElem - /S /Span - /P 1240 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4929 0 R ->> -endobj - -1242 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1247 0 R 1246 0 R 1245 0 R 1244 0 R 1243 0 R] ->> -endobj - -1243 0 obj -<< - /Type /StructElem - /S /Span - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97] - /Pg 4929 0 R ->> -endobj - -1244 0 obj -<< - /Type /StructElem - /S /Formula - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4929 0 R ->> -endobj - -1245 0 obj -<< - /Type /StructElem - /S /Span - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4929 0 R ->> -endobj - -1246 0 obj -<< - /Type /StructElem - /S /Formula - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4929 0 R ->> -endobj - -1247 0 obj -<< - /Type /StructElem - /S /Span - /P 1242 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4929 0 R ->> -endobj - -1248 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1249 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1250 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1251 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1252 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1253 0 R] ->> -endobj - -1253 0 obj -<< - /Type /StructElem - /S /Span - /P 1252 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92] - /Pg 4929 0 R ->> -endobj - -1254 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1263 0 R 1262 0 R 1261 0 R 1260 0 R 1259 0 R 1258 0 R 1257 0 R 1256 0 R 1255 0 R] ->> -endobj - -1255 0 obj -<< - /Type /StructElem - /S /Span - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [90] - /Pg 4929 0 R ->> -endobj - -1256 0 obj -<< - /Type /StructElem - /S /Strong - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4929 0 R ->> -endobj - -1257 0 obj -<< - /Type /StructElem - /S /Formula - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [89] - /Pg 4929 0 R ->> -endobj - -1258 0 obj -<< - /Type /StructElem - /S /Span - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [88] - /Pg 4929 0 R ->> -endobj - -1259 0 obj -<< - /Type /StructElem - /S /Formula - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [87] - /Pg 4929 0 R ->> -endobj - -1260 0 obj -<< - /Type /StructElem - /S /Span - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86] - /Pg 4929 0 R ->> -endobj - -1261 0 obj -<< - /Type /StructElem - /S /Formula - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4929 0 R ->> -endobj - -1262 0 obj -<< - /Type /StructElem - /S /Span - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4929 0 R ->> -endobj - -1263 0 obj -<< - /Type /StructElem - /S /Strong - /P 1254 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [83] - /Pg 4929 0 R ->> -endobj - -1264 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1265 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1266 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1267 0 R] ->> -endobj - -1267 0 obj -<< - /Type /StructElem - /S /Span - /P 1266 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [82] - /Pg 4929 0 R ->> -endobj - -1268 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1271 0 R 1270 0 R 1269 0 R] ->> -endobj - -1269 0 obj -<< - /Type /StructElem - /S /Span - /P 1268 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [81] - /Pg 4929 0 R ->> -endobj - -1270 0 obj -<< - /Type /StructElem - /S /Formula - /P 1268 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80] - /Pg 4929 0 R ->> -endobj - -1271 0 obj -<< - /Type /StructElem - /S /Span - /P 1268 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [79] - /Pg 4929 0 R ->> -endobj - -1272 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1273 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1274 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1275 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1276 0 R] ->> -endobj - -1276 0 obj -<< - /Type /StructElem - /S /Span - /P 1275 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [78] - /Pg 4929 0 R ->> -endobj - -1277 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1281 0 R 1280 0 R 1279 0 R 1278 0 R] ->> -endobj - -1278 0 obj -<< - /Type /StructElem - /S /Span - /P 1277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [74 76] - /Pg 4929 0 R ->> -endobj - -1279 0 obj -<< - /Type /StructElem - /S /Strong - /P 1277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [77] - /Pg 4929 0 R ->> -endobj - -1280 0 obj -<< - /Type /StructElem - /S /Strong - /P 1277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [75] - /Pg 4929 0 R ->> -endobj - -1281 0 obj -<< - /Type /StructElem - /S /Strong - /P 1277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [73] - /Pg 4929 0 R ->> -endobj - -1282 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1283 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1284 0 R] ->> -endobj - -1284 0 obj -<< - /Type /StructElem - /S /Span - /P 1283 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [72] - /Pg 4929 0 R ->> -endobj - -1285 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1289 0 R 1288 0 R 1287 0 R 1286 0 R] ->> -endobj - -1286 0 obj -<< - /Type /StructElem - /S /Formula - /P 1285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [71] - /Pg 4929 0 R ->> -endobj - -1287 0 obj -<< - /Type /StructElem - /S /Span - /P 1285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [70] - /Pg 4929 0 R ->> -endobj - -1288 0 obj -<< - /Type /StructElem - /S /Formula - /P 1285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [69] - /Pg 4929 0 R ->> -endobj - -1289 0 obj -<< - /Type /StructElem - /S /Span - /P 1285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [68] - /Pg 4929 0 R ->> -endobj - -1290 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1291 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1292 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1293 0 R] ->> -endobj - -1293 0 obj -<< - /Type /StructElem - /S /Span - /P 1292 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [67] - /Pg 4929 0 R ->> -endobj - -1294 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1296 0 R 1295 0 R] ->> -endobj - -1295 0 obj -<< - /Type /StructElem - /S /Span - /P 1294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [66] - /Pg 4929 0 R ->> -endobj - -1296 0 obj -<< - /Type /StructElem - /S /Strong - /P 1294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [65] - /Pg 4929 0 R ->> -endobj - -1297 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1298 0 R] ->> -endobj - -1298 0 obj -<< - /Type /StructElem - /S /Span - /P 1297 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [64] - /Pg 4929 0 R ->> -endobj - -1299 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1301 0 R 1300 0 R] ->> -endobj - -1300 0 obj -<< - /Type /StructElem - /S /Span - /P 1299 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [63] - /Pg 4929 0 R ->> -endobj - -1301 0 obj -<< - /Type /StructElem - /S /Strong - /P 1299 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [62] - /Pg 4929 0 R ->> -endobj - -1302 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1303 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1304 0 R] ->> -endobj - -1304 0 obj -<< - /Type /StructElem - /S /Span - /P 1303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [61] - /Pg 4929 0 R ->> -endobj - -1305 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1306 0 R] ->> -endobj - -1306 0 obj -<< - /Type /StructElem - /S /Span - /P 1305 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [60] - /Pg 4929 0 R ->> -endobj - -1307 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1308 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1309 0 R] ->> -endobj - -1309 0 obj -<< - /Type /StructElem - /S /Span - /P 1308 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59] - /Pg 4929 0 R ->> -endobj - -1310 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1314 0 R 1313 0 R 1312 0 R 1311 0 R] ->> -endobj - -1311 0 obj -<< - /Type /StructElem - /S /Span - /P 1310 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [54 56 58] - /Pg 4929 0 R ->> -endobj - -1312 0 obj -<< - /Type /StructElem - /S /Strong - /P 1310 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [57] - /Pg 4929 0 R ->> -endobj - -1313 0 obj -<< - /Type /StructElem - /S /Strong - /P 1310 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [55] - /Pg 4929 0 R ->> -endobj - -1314 0 obj -<< - /Type /StructElem - /S /Strong - /P 1310 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [53] - /Pg 4929 0 R ->> -endobj - -1315 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1316 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1317 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1318 0 R] ->> -endobj - -1318 0 obj -<< - /Type /StructElem - /S /Span - /P 1317 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [52] - /Pg 4929 0 R ->> -endobj - -1319 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1324 0 R 1323 0 R 1322 0 R 1321 0 R 1320 0 R] ->> -endobj - -1320 0 obj -<< - /Type /StructElem - /S /Span - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [51] - /Pg 4929 0 R ->> -endobj - -1321 0 obj -<< - /Type /StructElem - /S /Formula - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [50] - /Pg 4929 0 R ->> -endobj - -1322 0 obj -<< - /Type /StructElem - /S /Span - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [49] - /Pg 4929 0 R ->> -endobj - -1323 0 obj -<< - /Type /StructElem - /S /Formula - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [48] - /Pg 4929 0 R ->> -endobj - -1324 0 obj -<< - /Type /StructElem - /S /Span - /P 1319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [47] - /Pg 4929 0 R ->> -endobj - -1325 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1326 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1327 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1328 0 R] ->> -endobj - -1328 0 obj -<< - /Type /StructElem - /S /Span - /P 1327 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [46] - /Pg 4929 0 R ->> -endobj - -1329 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1338 0 R 1337 0 R 1336 0 R 1335 0 R 1334 0 R 1333 0 R 1332 0 R 1331 0 R 1330 0 R] ->> -endobj - -1330 0 obj -<< - /Type /StructElem - /S /Span - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [42 44] - /Pg 4929 0 R ->> -endobj - -1331 0 obj -<< - /Type /StructElem - /S /Strong - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [45] - /Pg 4929 0 R ->> -endobj - -1332 0 obj -<< - /Type /StructElem - /S /Strong - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4929 0 R ->> -endobj - -1333 0 obj -<< - /Type /StructElem - /S /Formula - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41] - /Pg 4929 0 R ->> -endobj - -1334 0 obj -<< - /Type /StructElem - /S /Span - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [38 40] - /Pg 4929 0 R ->> -endobj - -1335 0 obj -<< - /Type /StructElem - /S /Strong - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [39] - /Pg 4929 0 R ->> -endobj - -1336 0 obj -<< - /Type /StructElem - /S /Formula - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37] - /Pg 4929 0 R ->> -endobj - -1337 0 obj -<< - /Type /StructElem - /S /Span - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4929 0 R ->> -endobj - -1338 0 obj -<< - /Type /StructElem - /S /Strong - /P 1329 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [35] - /Pg 4929 0 R ->> -endobj - -1339 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1340 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1341 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1342 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1343 0 R] ->> -endobj - -1343 0 obj -<< - /Type /StructElem - /S /Span - /P 1342 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [34] - /Pg 4929 0 R ->> -endobj - -1344 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1346 0 R 1345 0 R] ->> -endobj - -1345 0 obj -<< - /Type /StructElem - /S /Span - /P 1344 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4929 0 R ->> -endobj - -1346 0 obj -<< - /Type /StructElem - /S /Strong - /P 1344 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [32] - /Pg 4929 0 R ->> -endobj - -1347 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1348 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1349 0 R] ->> -endobj - -1349 0 obj -<< - /Type /StructElem - /S /Span - /P 1348 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [31] - /Pg 4929 0 R ->> -endobj - -1350 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1354 0 R 1353 0 R 1352 0 R 1351 0 R] ->> -endobj - -1351 0 obj -<< - /Type /StructElem - /S /Formula - /P 1350 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30] - /Pg 4929 0 R ->> -endobj - -1352 0 obj -<< - /Type /StructElem - /S /Span - /P 1350 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4929 0 R ->> -endobj - -1353 0 obj -<< - /Type /StructElem - /S /Formula - /P 1350 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [28] - /Pg 4929 0 R ->> -endobj - -1354 0 obj -<< - /Type /StructElem - /S /Span - /P 1350 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [27] - /Pg 4929 0 R ->> -endobj - -1355 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1356 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1357 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1358 0 R] ->> -endobj - -1358 0 obj -<< - /Type /StructElem - /S /Span - /P 1357 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26] - /Pg 4929 0 R ->> -endobj - -1359 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1361 0 R 1360 0 R] ->> -endobj - -1360 0 obj -<< - /Type /StructElem - /S /Span - /P 1359 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [25] - /Pg 4929 0 R ->> -endobj - -1361 0 obj -<< - /Type /StructElem - /S /Strong - /P 1359 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24] - /Pg 4929 0 R ->> -endobj - -1362 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [1363 0 R] ->> -endobj - -1363 0 obj -<< - /Type /StructElem - /S /Span - /P 1362 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4929 0 R ->> -endobj - -1364 0 obj -<< - /Type /StructElem - /S /Div - /P 1223 0 R - /K [] ->> -endobj - -1365 0 obj -<< - /Type /StructElem - /S /P - /P 1222 0 R - /K [1366 0 R 22] - /Pg 4929 0 R ->> -endobj - -1366 0 obj -<< - /Type /StructElem - /S /Strong - /P 1365 0 R - /K [21] - /Pg 4929 0 R ->> -endobj - -1367 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1373 0 R 7 1372 0 R 9 1371 0 R 11 12 1370 0 R 14 15 1369 0 R 17 18 1368 0 R 20] - /Pg 4929 0 R ->> -endobj - -1368 0 obj -<< - /Type /StructElem - /S /Code - /P 1367 0 R - /K [19] - /Pg 4929 0 R ->> -endobj - -1369 0 obj -<< - /Type /StructElem - /S /Code - /P 1367 0 R - /K [16] - /Pg 4929 0 R ->> -endobj - -1370 0 obj -<< - /Type /StructElem - /S /Em - /P 1367 0 R - /K [13] - /Pg 4929 0 R ->> -endobj - -1371 0 obj -<< - /Type /StructElem - /S /Code - /P 1367 0 R - /K [10] - /Pg 4929 0 R ->> -endobj - -1372 0 obj -<< - /Type /StructElem - /S /Code - /P 1367 0 R - /K [8] - /Pg 4929 0 R ->> -endobj - -1373 0 obj -<< - /Type /StructElem - /S /Strong - /P 1367 0 R - /K [6] - /Pg 4929 0 R ->> -endobj - -1374 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3 4 5] - /Pg 4929 0 R ->> -endobj - -1375 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1595 0 R 1376 0 R] ->> -endobj - -1376 0 obj -<< - /Type /StructElem - /S /Div - /P 1375 0 R - /K [1594 0 R 1592 0 R 1589 0 R 1587 0 R 1586 0 R 1585 0 R 1581 0 R 1579 0 R 1578 0 R 1574 0 R 1572 0 R 1571 0 R 1566 0 R 1564 0 R 1563 0 R 1558 0 R 1556 0 R 1555 0 R 1554 0 R 1553 0 R 1543 0 R 1541 0 R 1540 0 R 1538 0 R 1536 0 R 1535 0 R 1534 0 R 1533 0 R 1529 0 R 1527 0 R 1526 0 R 1525 0 R 1520 0 R 1518 0 R 1517 0 R 1516 0 R 1515 0 R 1514 0 R 1504 0 R 1502 0 R 1501 0 R 1500 0 R 1499 0 R 1498 0 R 1497 0 R 1491 0 R 1489 0 R 1488 0 R 1487 0 R 1486 0 R 1485 0 R 1479 0 R 1477 0 R 1476 0 R 1475 0 R 1474 0 R 1473 0 R 1469 0 R 1467 0 R 1466 0 R 1465 0 R 1464 0 R 1458 0 R 1456 0 R 1455 0 R 1454 0 R 1453 0 R 1452 0 R 1451 0 R 1445 0 R 1443 0 R 1442 0 R 1441 0 R 1440 0 R 1439 0 R 1433 0 R 1431 0 R 1430 0 R 1429 0 R 1428 0 R 1427 0 R 1423 0 R 1421 0 R 1420 0 R 1419 0 R 1418 0 R 1416 0 R 1414 0 R 1413 0 R 1412 0 R 1411 0 R 1410 0 R 1409 0 R 1399 0 R 1397 0 R 1396 0 R 1393 0 R 1391 0 R 1390 0 R 1384 0 R 1382 0 R 1381 0 R 1378 0 R 1377 0 R] ->> -endobj - -1377 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1378 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1380 0 R 1379 0 R] ->> -endobj - -1379 0 obj -<< - /Type /StructElem - /S /Span - /P 1378 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2] - /Pg 4929 0 R ->> -endobj - -1380 0 obj -<< - /Type /StructElem - /S /Strong - /P 1378 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4929 0 R ->> -endobj - -1381 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1382 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1383 0 R] ->> -endobj - -1383 0 obj -<< - /Type /StructElem - /S /Span - /P 1382 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4929 0 R ->> -endobj - -1384 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1389 0 R 1388 0 R 1387 0 R 1386 0 R 1385 0 R] ->> -endobj - -1385 0 obj -<< - /Type /StructElem - /S /Span - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4925 0 R ->> -endobj - -1386 0 obj -<< - /Type /StructElem - /S /Formula - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [168] - /Pg 4925 0 R ->> -endobj - -1387 0 obj -<< - /Type /StructElem - /S /Span - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167] - /Pg 4925 0 R ->> -endobj - -1388 0 obj -<< - /Type /StructElem - /S /Formula - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [166] - /Pg 4925 0 R ->> -endobj - -1389 0 obj -<< - /Type /StructElem - /S /Span - /P 1384 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [165] - /Pg 4925 0 R ->> -endobj - -1390 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1391 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1392 0 R] ->> -endobj - -1392 0 obj -<< - /Type /StructElem - /S /Span - /P 1391 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164] - /Pg 4925 0 R ->> -endobj - -1393 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1395 0 R 1394 0 R] ->> -endobj - -1394 0 obj -<< - /Type /StructElem - /S /Span - /P 1393 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4925 0 R ->> -endobj - -1395 0 obj -<< - /Type /StructElem - /S /Strong - /P 1393 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [162] - /Pg 4925 0 R ->> -endobj - -1396 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1397 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1398 0 R] ->> -endobj - -1398 0 obj -<< - /Type /StructElem - /S /Span - /P 1397 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161] - /Pg 4925 0 R ->> -endobj - -1399 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1408 0 R 1407 0 R 1406 0 R 1405 0 R 1404 0 R 1403 0 R 1402 0 R 1401 0 R 1400 0 R] ->> -endobj - -1400 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4925 0 R ->> -endobj - -1401 0 obj -<< - /Type /StructElem - /S /Formula - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [159] - /Pg 4925 0 R ->> -endobj - -1402 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [158] - /Pg 4925 0 R ->> -endobj - -1403 0 obj -<< - /Type /StructElem - /S /Formula - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157] - /Pg 4925 0 R ->> -endobj - -1404 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4925 0 R ->> -endobj - -1405 0 obj -<< - /Type /StructElem - /S /Formula - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155] - /Pg 4925 0 R ->> -endobj - -1406 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4925 0 R ->> -endobj - -1407 0 obj -<< - /Type /StructElem - /S /Formula - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [153] - /Pg 4925 0 R ->> -endobj - -1408 0 obj -<< - /Type /StructElem - /S /Span - /P 1399 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [152] - /Pg 4925 0 R ->> -endobj - -1409 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1410 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1411 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1412 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1413 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1414 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1415 0 R] ->> -endobj - -1415 0 obj -<< - /Type /StructElem - /S /Span - /P 1414 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [151] - /Pg 4925 0 R ->> -endobj - -1416 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1417 0 R] ->> -endobj - -1417 0 obj -<< - /Type /StructElem - /S /Strong - /P 1416 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [150] - /Pg 4925 0 R ->> -endobj - -1418 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1419 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1420 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1421 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1422 0 R] ->> -endobj - -1422 0 obj -<< - /Type /StructElem - /S /Span - /P 1421 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [149] - /Pg 4925 0 R ->> -endobj - -1423 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1426 0 R 1425 0 R 1424 0 R] ->> -endobj - -1424 0 obj -<< - /Type /StructElem - /S /Span - /P 1423 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [148] - /Pg 4925 0 R ->> -endobj - -1425 0 obj -<< - /Type /StructElem - /S /Formula - /P 1423 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [147] - /Pg 4925 0 R ->> -endobj - -1426 0 obj -<< - /Type /StructElem - /S /Span - /P 1423 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [146] - /Pg 4925 0 R ->> -endobj - -1427 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1428 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1429 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1430 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1431 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1432 0 R] ->> -endobj - -1432 0 obj -<< - /Type /StructElem - /S /Span - /P 1431 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [145] - /Pg 4925 0 R ->> -endobj - -1433 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1438 0 R 1437 0 R 1436 0 R 1435 0 R 1434 0 R] ->> -endobj - -1434 0 obj -<< - /Type /StructElem - /S /Span - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [144] - /Pg 4925 0 R ->> -endobj - -1435 0 obj -<< - /Type /StructElem - /S /Formula - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143] - /Pg 4925 0 R ->> -endobj - -1436 0 obj -<< - /Type /StructElem - /S /Span - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4925 0 R ->> -endobj - -1437 0 obj -<< - /Type /StructElem - /S /Formula - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [141] - /Pg 4925 0 R ->> -endobj - -1438 0 obj -<< - /Type /StructElem - /S /Span - /P 1433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [140] - /Pg 4925 0 R ->> -endobj - -1439 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1440 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1441 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1442 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1443 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1444 0 R] ->> -endobj - -1444 0 obj -<< - /Type /StructElem - /S /Span - /P 1443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139] - /Pg 4925 0 R ->> -endobj - -1445 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1450 0 R 1449 0 R 1448 0 R 1447 0 R 1446 0 R] ->> -endobj - -1446 0 obj -<< - /Type /StructElem - /S /Span - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [138] - /Pg 4925 0 R ->> -endobj - -1447 0 obj -<< - /Type /StructElem - /S /Formula - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [137] - /Pg 4925 0 R ->> -endobj - -1448 0 obj -<< - /Type /StructElem - /S /Span - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [136] - /Pg 4925 0 R ->> -endobj - -1449 0 obj -<< - /Type /StructElem - /S /Formula - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [135] - /Pg 4925 0 R ->> -endobj - -1450 0 obj -<< - /Type /StructElem - /S /Span - /P 1445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [134] - /Pg 4925 0 R ->> -endobj - -1451 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1452 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1453 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1454 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1455 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1456 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1457 0 R] ->> -endobj - -1457 0 obj -<< - /Type /StructElem - /S /Span - /P 1456 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [133] - /Pg 4925 0 R ->> -endobj - -1458 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1463 0 R 1462 0 R 1461 0 R 1460 0 R 1459 0 R] ->> -endobj - -1459 0 obj -<< - /Type /StructElem - /S /Span - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131] - /Pg 4925 0 R ->> -endobj - -1460 0 obj -<< - /Type /StructElem - /S /Strong - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [132] - /Pg 4925 0 R ->> -endobj - -1461 0 obj -<< - /Type /StructElem - /S /Formula - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4925 0 R ->> -endobj - -1462 0 obj -<< - /Type /StructElem - /S /Span - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [129] - /Pg 4925 0 R ->> -endobj - -1463 0 obj -<< - /Type /StructElem - /S /Strong - /P 1458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128] - /Pg 4925 0 R ->> -endobj - -1464 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1465 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1466 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1467 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1468 0 R] ->> -endobj - -1468 0 obj -<< - /Type /StructElem - /S /Span - /P 1467 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4925 0 R ->> -endobj - -1469 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1472 0 R 1471 0 R 1470 0 R] ->> -endobj - -1470 0 obj -<< - /Type /StructElem - /S /Span - /P 1469 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [126] - /Pg 4925 0 R ->> -endobj - -1471 0 obj -<< - /Type /StructElem - /S /Formula - /P 1469 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [125] - /Pg 4925 0 R ->> -endobj - -1472 0 obj -<< - /Type /StructElem - /S /Span - /P 1469 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [124] - /Pg 4925 0 R ->> -endobj - -1473 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1474 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1475 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1476 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1477 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1478 0 R] ->> -endobj - -1478 0 obj -<< - /Type /StructElem - /S /Span - /P 1477 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [123] - /Pg 4925 0 R ->> -endobj - -1479 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1484 0 R 1483 0 R 1482 0 R 1481 0 R 1480 0 R] ->> -endobj - -1480 0 obj -<< - /Type /StructElem - /S /Span - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [122] - /Pg 4925 0 R ->> -endobj - -1481 0 obj -<< - /Type /StructElem - /S /Formula - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [121] - /Pg 4925 0 R ->> -endobj - -1482 0 obj -<< - /Type /StructElem - /S /Span - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [120] - /Pg 4925 0 R ->> -endobj - -1483 0 obj -<< - /Type /StructElem - /S /Formula - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119] - /Pg 4925 0 R ->> -endobj - -1484 0 obj -<< - /Type /StructElem - /S /Span - /P 1479 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4925 0 R ->> -endobj - -1485 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1486 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1487 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1488 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1489 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1490 0 R] ->> -endobj - -1490 0 obj -<< - /Type /StructElem - /S /Span - /P 1489 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [117] - /Pg 4925 0 R ->> -endobj - -1491 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1496 0 R 1495 0 R 1494 0 R 1493 0 R 1492 0 R] ->> -endobj - -1492 0 obj -<< - /Type /StructElem - /S /Span - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [116] - /Pg 4925 0 R ->> -endobj - -1493 0 obj -<< - /Type /StructElem - /S /Formula - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [115] - /Pg 4925 0 R ->> -endobj - -1494 0 obj -<< - /Type /StructElem - /S /Span - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [114] - /Pg 4925 0 R ->> -endobj - -1495 0 obj -<< - /Type /StructElem - /S /Formula - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113] - /Pg 4925 0 R ->> -endobj - -1496 0 obj -<< - /Type /StructElem - /S /Span - /P 1491 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4925 0 R ->> -endobj - -1497 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1498 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1499 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1500 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1501 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1502 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1503 0 R] ->> -endobj - -1503 0 obj -<< - /Type /StructElem - /S /Span - /P 1502 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [111] - /Pg 4925 0 R ->> -endobj - -1504 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1513 0 R 1512 0 R 1511 0 R 1510 0 R 1509 0 R 1508 0 R 1507 0 R 1506 0 R 1505 0 R] ->> -endobj - -1505 0 obj -<< - /Type /StructElem - /S /Span - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109] - /Pg 4925 0 R ->> -endobj - -1506 0 obj -<< - /Type /StructElem - /S /Strong - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4925 0 R ->> -endobj - -1507 0 obj -<< - /Type /StructElem - /S /Formula - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [108] - /Pg 4925 0 R ->> -endobj - -1508 0 obj -<< - /Type /StructElem - /S /Span - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [107] - /Pg 4925 0 R ->> -endobj - -1509 0 obj -<< - /Type /StructElem - /S /Formula - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106] - /Pg 4925 0 R ->> -endobj - -1510 0 obj -<< - /Type /StructElem - /S /Span - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4925 0 R ->> -endobj - -1511 0 obj -<< - /Type /StructElem - /S /Formula - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104] - /Pg 4925 0 R ->> -endobj - -1512 0 obj -<< - /Type /StructElem - /S /Span - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4925 0 R ->> -endobj - -1513 0 obj -<< - /Type /StructElem - /S /Strong - /P 1504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [102] - /Pg 4925 0 R ->> -endobj - -1514 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1515 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1516 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1517 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1518 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1519 0 R] ->> -endobj - -1519 0 obj -<< - /Type /StructElem - /S /Span - /P 1518 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101] - /Pg 4925 0 R ->> -endobj - -1520 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1524 0 R 1523 0 R 1522 0 R 1521 0 R] ->> -endobj - -1521 0 obj -<< - /Type /StructElem - /S /Span - /P 1520 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97 99] - /Pg 4925 0 R ->> -endobj - -1522 0 obj -<< - /Type /StructElem - /S /Strong - /P 1520 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100] - /Pg 4925 0 R ->> -endobj - -1523 0 obj -<< - /Type /StructElem - /S /Strong - /P 1520 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4925 0 R ->> -endobj - -1524 0 obj -<< - /Type /StructElem - /S /Strong - /P 1520 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4925 0 R ->> -endobj - -1525 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1526 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1527 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1528 0 R] ->> -endobj - -1528 0 obj -<< - /Type /StructElem - /S /Span - /P 1527 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4925 0 R ->> -endobj - -1529 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1532 0 R 1531 0 R 1530 0 R] ->> -endobj - -1530 0 obj -<< - /Type /StructElem - /S /Span - /P 1529 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4925 0 R ->> -endobj - -1531 0 obj -<< - /Type /StructElem - /S /Formula - /P 1529 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4925 0 R ->> -endobj - -1532 0 obj -<< - /Type /StructElem - /S /Span - /P 1529 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92] - /Pg 4925 0 R ->> -endobj - -1533 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1534 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1535 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1536 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1537 0 R] ->> -endobj - -1537 0 obj -<< - /Type /StructElem - /S /Span - /P 1536 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4925 0 R ->> -endobj - -1538 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1539 0 R] ->> -endobj - -1539 0 obj -<< - /Type /StructElem - /S /Strong - /P 1538 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [90] - /Pg 4925 0 R ->> -endobj - -1540 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1541 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1542 0 R] ->> -endobj - -1542 0 obj -<< - /Type /StructElem - /S /Span - /P 1541 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [89] - /Pg 4925 0 R ->> -endobj - -1543 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1552 0 R 1551 0 R 1550 0 R 1549 0 R 1548 0 R 1547 0 R 1546 0 R 1545 0 R 1544 0 R] ->> -endobj - -1544 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [88] - /Pg 4925 0 R ->> -endobj - -1545 0 obj -<< - /Type /StructElem - /S /Formula - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [87] - /Pg 4925 0 R ->> -endobj - -1546 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86] - /Pg 4925 0 R ->> -endobj - -1547 0 obj -<< - /Type /StructElem - /S /Formula - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4925 0 R ->> -endobj - -1548 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4925 0 R ->> -endobj - -1549 0 obj -<< - /Type /StructElem - /S /Formula - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [83] - /Pg 4925 0 R ->> -endobj - -1550 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [82] - /Pg 4925 0 R ->> -endobj - -1551 0 obj -<< - /Type /StructElem - /S /Formula - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [81] - /Pg 4925 0 R ->> -endobj - -1552 0 obj -<< - /Type /StructElem - /S /Span - /P 1543 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80] - /Pg 4925 0 R ->> -endobj - -1553 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1554 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1555 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1556 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1557 0 R] ->> -endobj - -1557 0 obj -<< - /Type /StructElem - /S /Span - /P 1556 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [79] - /Pg 4925 0 R ->> -endobj - -1558 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1562 0 R 1561 0 R 1560 0 R 1559 0 R] ->> -endobj - -1559 0 obj -<< - /Type /StructElem - /S /Span - /P 1558 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [75 77] - /Pg 4925 0 R ->> -endobj - -1560 0 obj -<< - /Type /StructElem - /S /Strong - /P 1558 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [78] - /Pg 4925 0 R ->> -endobj - -1561 0 obj -<< - /Type /StructElem - /S /Strong - /P 1558 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [76] - /Pg 4925 0 R ->> -endobj - -1562 0 obj -<< - /Type /StructElem - /S /Strong - /P 1558 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [74] - /Pg 4925 0 R ->> -endobj - -1563 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1564 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1565 0 R] ->> -endobj - -1565 0 obj -<< - /Type /StructElem - /S /Span - /P 1564 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [73] - /Pg 4925 0 R ->> -endobj - -1566 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1570 0 R 1569 0 R 1568 0 R 1567 0 R] ->> -endobj - -1567 0 obj -<< - /Type /StructElem - /S /Formula - /P 1566 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [72] - /Pg 4925 0 R ->> -endobj - -1568 0 obj -<< - /Type /StructElem - /S /Span - /P 1566 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [71] - /Pg 4925 0 R ->> -endobj - -1569 0 obj -<< - /Type /StructElem - /S /Formula - /P 1566 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [70] - /Pg 4925 0 R ->> -endobj - -1570 0 obj -<< - /Type /StructElem - /S /Span - /P 1566 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [69] - /Pg 4925 0 R ->> -endobj - -1571 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1572 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1573 0 R] ->> -endobj - -1573 0 obj -<< - /Type /StructElem - /S /Span - /P 1572 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [68] - /Pg 4925 0 R ->> -endobj - -1574 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1577 0 R 1576 0 R 1575 0 R] ->> -endobj - -1575 0 obj -<< - /Type /StructElem - /S /Span - /P 1574 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [67] - /Pg 4925 0 R ->> -endobj - -1576 0 obj -<< - /Type /StructElem - /S /Formula - /P 1574 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [66] - /Pg 4925 0 R ->> -endobj - -1577 0 obj -<< - /Type /StructElem - /S /Span - /P 1574 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [65] - /Pg 4925 0 R ->> -endobj - -1578 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1579 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1580 0 R] ->> -endobj - -1580 0 obj -<< - /Type /StructElem - /S /Span - /P 1579 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [64] - /Pg 4925 0 R ->> -endobj - -1581 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1584 0 R 1583 0 R 1582 0 R] ->> -endobj - -1582 0 obj -<< - /Type /StructElem - /S /Span - /P 1581 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [63] - /Pg 4925 0 R ->> -endobj - -1583 0 obj -<< - /Type /StructElem - /S /Formula - /P 1581 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [62] - /Pg 4925 0 R ->> -endobj - -1584 0 obj -<< - /Type /StructElem - /S /Span - /P 1581 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [61] - /Pg 4925 0 R ->> -endobj - -1585 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1586 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1587 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1588 0 R] ->> -endobj - -1588 0 obj -<< - /Type /StructElem - /S /Span - /P 1587 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [60] - /Pg 4925 0 R ->> -endobj - -1589 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1591 0 R 1590 0 R] ->> -endobj - -1590 0 obj -<< - /Type /StructElem - /S /Span - /P 1589 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59] - /Pg 4925 0 R ->> -endobj - -1591 0 obj -<< - /Type /StructElem - /S /Strong - /P 1589 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [58] - /Pg 4925 0 R ->> -endobj - -1592 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [1593 0 R] ->> -endobj - -1593 0 obj -<< - /Type /StructElem - /S /Span - /P 1592 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [57] - /Pg 4925 0 R ->> -endobj - -1594 0 obj -<< - /Type /StructElem - /S /Div - /P 1376 0 R - /K [] ->> -endobj - -1595 0 obj -<< - /Type /StructElem - /S /P - /P 1375 0 R - /K [1596 0 R 56] - /Pg 4925 0 R ->> -endobj - -1596 0 obj -<< - /Type /StructElem - /S /Strong - /P 1595 0 R - /K [55] - /Pg 4925 0 R ->> -endobj - -1597 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1604 0 R 39 1603 0 R 41 42 1602 0 R 44 45 1601 0 R 47 48 1600 0 R 50 1599 0 R 52 1598 0 R 54] - /Pg 4925 0 R ->> -endobj - -1598 0 obj -<< - /Type /StructElem - /S /Code - /P 1597 0 R - /K [53] - /Pg 4925 0 R ->> -endobj - -1599 0 obj -<< - /Type /StructElem - /S /Code - /P 1597 0 R - /K [51] - /Pg 4925 0 R ->> -endobj - -1600 0 obj -<< - /Type /StructElem - /S /Code - /P 1597 0 R - /K [49] - /Pg 4925 0 R ->> -endobj - -1601 0 obj -<< - /Type /StructElem - /S /Code - /P 1597 0 R - /K [46] - /Pg 4925 0 R ->> -endobj - -1602 0 obj -<< - /Type /StructElem - /S /Em - /P 1597 0 R - /K [43] - /Pg 4925 0 R ->> -endobj - -1603 0 obj -<< - /Type /StructElem - /S /Em - /P 1597 0 R - /K [40] - /Pg 4925 0 R ->> -endobj - -1604 0 obj -<< - /Type /StructElem - /S /Strong - /P 1597 0 R - /K [38] - /Pg 4925 0 R ->> -endobj - -1605 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [33 1607 0 R 35 1606 0 R 37] - /Pg 4925 0 R ->> -endobj - -1606 0 obj -<< - /Type /StructElem - /S /Em - /P 1605 0 R - /K [36] - /Pg 4925 0 R ->> -endobj - -1607 0 obj -<< - /Type /StructElem - /S /Code - /P 1605 0 R - /K [34] - /Pg 4925 0 R ->> -endobj - -1608 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [15 1611 0 R 17 18 19 20 21 22 23 24 25 1610 0 R 27 28 29 1609 0 R 31 32] - /Pg 4925 0 R ->> -endobj - -1609 0 obj -<< - /Type /StructElem - /S /Link - /P 1608 0 R - /K [30 << - /Type /OBJR - /Pg 4925 0 R - /Obj 4924 0 R - >>] - /Pg 4925 0 R ->> -endobj - -1610 0 obj -<< - /Type /StructElem - /S /Link - /P 1608 0 R - /K [26 << - /Type /OBJR - /Pg 4925 0 R - /Obj 4923 0 R - >>] - /Pg 4925 0 R ->> -endobj - -1611 0 obj -<< - /Type /StructElem - /S /Em - /P 1608 0 R - /K [16] - /Pg 4925 0 R ->> -endobj - -1612 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Hot Module Replacement) - /K [13 14] - /Pg 4925 0 R ->> -endobj - -1613 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [8 1614 0 R 10 11 12] - /Pg 4925 0 R ->> -endobj - -1614 0 obj -<< - /Type /StructElem - /S /Code - /P 1613 0 R - /K [9] - /Pg 4925 0 R ->> -endobj - -1615 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [1635 0 R 1631 0 R 1627 0 R 1620 0 R 1616 0 R] ->> -endobj - -1616 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1619 0 R 1617 0 R] ->> -endobj - -1617 0 obj -<< - /Type /StructElem - /S /LBody - /P 1616 0 R - /K [1618 0 R 7] - /Pg 4925 0 R ->> -endobj - -1618 0 obj -<< - /Type /StructElem - /S /Code - /P 1617 0 R - /K [6] - /Pg 4925 0 R ->> -endobj - -1619 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1616 0 R - /K [5] - /Pg 4925 0 R ->> -endobj - -1620 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1626 0 R 1621 0 R] ->> -endobj - -1621 0 obj -<< - /Type /StructElem - /S /LBody - /P 1620 0 R - /K [1625 0 R 100 101 102 1624 0 R 104 1623 0 R 106 << - /Type /MCR - /MCID 0 - /Pg 4925 0 R - >> 1622 0 R << - /Type /MCR - /MCID 2 - /Pg 4925 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4925 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4925 0 R - >>] - /Pg 4921 0 R ->> -endobj - -1622 0 obj -<< - /Type /StructElem - /S /Code - /P 1621 0 R - /K [1] - /Pg 4925 0 R ->> -endobj - -1623 0 obj -<< - /Type /StructElem - /S /Code - /P 1621 0 R - /K [105] - /Pg 4921 0 R ->> -endobj - -1624 0 obj -<< - /Type /StructElem - /S /Code - /P 1621 0 R - /K [103] - /Pg 4921 0 R ->> -endobj - -1625 0 obj -<< - /Type /StructElem - /S /Code - /P 1621 0 R - /K [99] - /Pg 4921 0 R ->> -endobj - -1626 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1620 0 R - /K [98] - /Pg 4921 0 R ->> -endobj - -1627 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1630 0 R 1628 0 R] ->> -endobj - -1628 0 obj -<< - /Type /StructElem - /S /LBody - /P 1627 0 R - /K [1629 0 R 96 97] - /Pg 4921 0 R ->> -endobj - -1629 0 obj -<< - /Type /StructElem - /S /Code - /P 1628 0 R - /K [95] - /Pg 4921 0 R ->> -endobj - -1630 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1627 0 R - /K [94] - /Pg 4921 0 R ->> -endobj - -1631 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1634 0 R 1632 0 R] ->> -endobj - -1632 0 obj -<< - /Type /StructElem - /S /LBody - /P 1631 0 R - /K [1633 0 R 92 93] - /Pg 4921 0 R ->> -endobj - -1633 0 obj -<< - /Type /StructElem - /S /Code - /P 1632 0 R - /K [91] - /Pg 4921 0 R ->> -endobj - -1634 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1631 0 R - /K [90] - /Pg 4921 0 R ->> -endobj - -1635 0 obj -<< - /Type /StructElem - /S /LI - /P 1615 0 R - /K [1639 0 R 1636 0 R] ->> -endobj - -1636 0 obj -<< - /Type /StructElem - /S /LBody - /P 1635 0 R - /K [1638 0 R 87 1637 0 R 89] - /Pg 4921 0 R ->> -endobj - -1637 0 obj -<< - /Type /StructElem - /S /Code - /P 1636 0 R - /K [88] - /Pg 4921 0 R ->> -endobj - -1638 0 obj -<< - /Type /StructElem - /S /Code - /P 1636 0 R - /K [86] - /Pg 4921 0 R ->> -endobj - -1639 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1635 0 R - /K [85] - /Pg 4921 0 R ->> -endobj - -1640 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [82 83 84] - /Pg 4921 0 R ->> -endobj - -1641 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [70 1644 0 R 72 73 74 75 1643 0 R 77 78 1642 0 R 80 81] - /Pg 4921 0 R ->> -endobj - -1642 0 obj -<< - /Type /StructElem - /S /Code - /P 1641 0 R - /K [79] - /Pg 4921 0 R ->> -endobj - -1643 0 obj -<< - /Type /StructElem - /S /Code - /P 1641 0 R - /K [76] - /Pg 4921 0 R ->> -endobj - -1644 0 obj -<< - /Type /StructElem - /S /Em - /P 1641 0 R - /K [71] - /Pg 4921 0 R ->> -endobj - -1645 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1673 0 R 1647 0 R 1646 0 R] ->> -endobj - -1646 0 obj -<< - /Type /StructElem - /S /P - /P 1645 0 R - /K [68 69] - /Pg 4921 0 R ->> -endobj - -1647 0 obj -<< - /Type /StructElem - /S /L - /P 1645 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [1669 0 R 1665 0 R 1661 0 R 1657 0 R 1652 0 R 1648 0 R] ->> -endobj - -1648 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1651 0 R 1649 0 R] ->> -endobj - -1649 0 obj -<< - /Type /StructElem - /S /LBody - /P 1648 0 R - /K [1650 0 R 67] - /Pg 4921 0 R ->> -endobj - -1650 0 obj -<< - /Type /StructElem - /S /Code - /P 1649 0 R - /K [66] - /Pg 4921 0 R ->> -endobj - -1651 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1648 0 R - /K [65] - /Pg 4921 0 R ->> -endobj - -1652 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1656 0 R 1653 0 R] ->> -endobj - -1653 0 obj -<< - /Type /StructElem - /S /LBody - /P 1652 0 R - /K [1655 0 R 62 1654 0 R 64] - /Pg 4921 0 R ->> -endobj - -1654 0 obj -<< - /Type /StructElem - /S /Code - /P 1653 0 R - /K [63] - /Pg 4921 0 R ->> -endobj - -1655 0 obj -<< - /Type /StructElem - /S /Code - /P 1653 0 R - /K [61] - /Pg 4921 0 R ->> -endobj - -1656 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1652 0 R - /K [60] - /Pg 4921 0 R ->> -endobj - -1657 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1660 0 R 1658 0 R] ->> -endobj - -1658 0 obj -<< - /Type /StructElem - /S /LBody - /P 1657 0 R - /K [1659 0 R 59] - /Pg 4921 0 R ->> -endobj - -1659 0 obj -<< - /Type /StructElem - /S /Code - /P 1658 0 R - /K [58] - /Pg 4921 0 R ->> -endobj - -1660 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1657 0 R - /K [57] - /Pg 4921 0 R ->> -endobj - -1661 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1664 0 R 1662 0 R] ->> -endobj - -1662 0 obj -<< - /Type /StructElem - /S /LBody - /P 1661 0 R - /K [1663 0 R 56] - /Pg 4921 0 R ->> -endobj - -1663 0 obj -<< - /Type /StructElem - /S /Code - /P 1662 0 R - /K [55] - /Pg 4921 0 R ->> -endobj - -1664 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1661 0 R - /K [54] - /Pg 4921 0 R ->> -endobj - -1665 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1668 0 R 1666 0 R] ->> -endobj - -1666 0 obj -<< - /Type /StructElem - /S /LBody - /P 1665 0 R - /K [1667 0 R 53] - /Pg 4921 0 R ->> -endobj - -1667 0 obj -<< - /Type /StructElem - /S /Code - /P 1666 0 R - /K [52] - /Pg 4921 0 R ->> -endobj - -1668 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1665 0 R - /K [51] - /Pg 4921 0 R ->> -endobj - -1669 0 obj -<< - /Type /StructElem - /S /LI - /P 1647 0 R - /K [1672 0 R 1670 0 R] ->> -endobj - -1670 0 obj -<< - /Type /StructElem - /S /LBody - /P 1669 0 R - /K [1671 0 R 50] - /Pg 4921 0 R ->> -endobj - -1671 0 obj -<< - /Type /StructElem - /S /Code - /P 1670 0 R - /K [49] - /Pg 4921 0 R ->> -endobj - -1672 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1669 0 R - /K [48] - /Pg 4921 0 R ->> -endobj - -1673 0 obj -<< - /Type /StructElem - /S /P - /P 1645 0 R - /K [1675 0 R 45 1674 0 R 47] - /Pg 4921 0 R ->> -endobj - -1674 0 obj -<< - /Type /StructElem - /S /Em - /P 1673 0 R - /K [46] - /Pg 4921 0 R ->> -endobj - -1675 0 obj -<< - /Type /StructElem - /S /Strong - /P 1673 0 R - /K [42 43 44] - /Pg 4921 0 R ->> -endobj - -1676 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [34 35 1678 0 R 37 1677 0 R 39 40 41] - /Pg 4921 0 R ->> -endobj - -1677 0 obj -<< - /Type /StructElem - /S /Em - /P 1676 0 R - /K [38] - /Pg 4921 0 R ->> -endobj - -1678 0 obj -<< - /Type /StructElem - /S /Link - /P 1676 0 R - /K [36 << - /Type /OBJR - /Pg 4921 0 R - /Obj 4920 0 R - >>] - /Pg 4921 0 R ->> -endobj - -1679 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Declarative Configuration Layer) - /K [32 33] - /Pg 4921 0 R ->> -endobj - -1680 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [11 1686 0 R 13 14 15 1685 0 R 17 1684 0 R 19 1683 0 R 21 1682 0 R 24 25 1681 0 R 27 28 29 30 31] - /Pg 4921 0 R ->> -endobj - -1681 0 obj -<< - /Type /StructElem - /S /Em - /P 1680 0 R - /K [26] - /Pg 4921 0 R ->> -endobj - -1682 0 obj -<< - /Type /StructElem - /S /Em - /P 1680 0 R - /K [22 23] - /Pg 4921 0 R ->> -endobj - -1683 0 obj -<< - /Type /StructElem - /S /Code - /P 1680 0 R - /K [20] - /Pg 4921 0 R ->> -endobj - -1684 0 obj -<< - /Type /StructElem - /S /Code - /P 1680 0 R - /K [18] - /Pg 4921 0 R ->> -endobj - -1685 0 obj -<< - /Type /StructElem - /S /Code - /P 1680 0 R - /K [16] - /Pg 4921 0 R ->> -endobj - -1686 0 obj -<< - /Type /StructElem - /S /Em - /P 1680 0 R - /K [12] - /Pg 4921 0 R ->> -endobj - -1687 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Component Loader) - /K [9 10] - /Pg 4921 0 R ->> -endobj - -1688 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [152 1693 0 R 154 155 1692 0 R 157 << - /Type /MCR - /MCID 0 - /Pg 4921 0 R - >> 1691 0 R << - /Type /MCR - /MCID 2 - /Pg 4921 0 R - >> 1690 0 R << - /Type /MCR - /MCID 4 - /Pg 4921 0 R - >> 1689 0 R << - /Type /MCR - /MCID 6 - /Pg 4921 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4921 0 R - >> << - /Type /MCR - /MCID 8 - /Pg 4921 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1689 0 obj -<< - /Type /StructElem - /S /Link - /P 1688 0 R - /K [5 << - /Type /OBJR - /Pg 4921 0 R - /Obj 4919 0 R - >>] - /Pg 4921 0 R ->> -endobj - -1690 0 obj -<< - /Type /StructElem - /S /Formula - /P 1688 0 R - /K [3] - /Pg 4921 0 R ->> -endobj - -1691 0 obj -<< - /Type /StructElem - /S /Code - /P 1688 0 R - /K [1] - /Pg 4921 0 R ->> -endobj - -1692 0 obj -<< - /Type /StructElem - /S /Formula - /P 1688 0 R - /K [156] - /Pg 4917 0 R ->> -endobj - -1693 0 obj -<< - /Type /StructElem - /S /Em - /P 1688 0 R - /K [153] - /Pg 4917 0 R ->> -endobj - -1694 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1705 0 R 124 125 1704 0 R 127 1703 0 R 129 1702 0 R 131 1701 0 R 133 134 135 1700 0 R 137 1699 0 R 139 140 1698 0 R 142 143 1697 0 R 145 146 1696 0 R 148 149 1695 0 R 151] - /Pg 4917 0 R ->> -endobj - -1695 0 obj -<< - /Type /StructElem - /S /Link - /P 1694 0 R - /K [150 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4916 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1696 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [147] - /Pg 4917 0 R ->> -endobj - -1697 0 obj -<< - /Type /StructElem - /S /Formula - /P 1694 0 R - /K [144] - /Pg 4917 0 R ->> -endobj - -1698 0 obj -<< - /Type /StructElem - /S /Em - /P 1694 0 R - /K [141] - /Pg 4917 0 R ->> -endobj - -1699 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [138] - /Pg 4917 0 R ->> -endobj - -1700 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [136] - /Pg 4917 0 R ->> -endobj - -1701 0 obj -<< - /Type /StructElem - /S /Link - /P 1694 0 R - /K [132 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4915 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1702 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [130] - /Pg 4917 0 R ->> -endobj - -1703 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [128] - /Pg 4917 0 R ->> -endobj - -1704 0 obj -<< - /Type /StructElem - /S /Code - /P 1694 0 R - /K [126] - /Pg 4917 0 R ->> -endobj - -1705 0 obj -<< - /Type /StructElem - /S /Link - /P 1694 0 R - /K [123 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4914 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1706 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1760 0 R 1707 0 R] ->> -endobj - -1707 0 obj -<< - /Type /StructElem - /S /Div - /P 1706 0 R - /K [1759 0 R 1757 0 R 1754 0 R 1752 0 R 1751 0 R 1750 0 R 1746 0 R 1744 0 R 1743 0 R 1741 0 R 1739 0 R 1738 0 R 1737 0 R 1736 0 R 1729 0 R 1727 0 R 1726 0 R 1725 0 R 1717 0 R 1715 0 R 1714 0 R 1713 0 R 1709 0 R 1708 0 R] ->> -endobj - -1708 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1709 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1712 0 R 1711 0 R 1710 0 R] ->> -endobj - -1710 0 obj -<< - /Type /StructElem - /S /Span - /P 1709 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [122] - /Pg 4917 0 R ->> -endobj - -1711 0 obj -<< - /Type /StructElem - /S /Formula - /P 1709 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [121] - /Pg 4917 0 R ->> -endobj - -1712 0 obj -<< - /Type /StructElem - /S /Span - /P 1709 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [120] - /Pg 4917 0 R ->> -endobj - -1713 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1714 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1715 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1716 0 R] ->> -endobj - -1716 0 obj -<< - /Type /StructElem - /S /Span - /P 1715 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119] - /Pg 4917 0 R ->> -endobj - -1717 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1724 0 R 1723 0 R 1722 0 R 1721 0 R 1720 0 R 1719 0 R 1718 0 R] ->> -endobj - -1718 0 obj -<< - /Type /StructElem - /S /Code - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4917 0 R ->> -endobj - -1719 0 obj -<< - /Type /StructElem - /S /Span - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113 115 117] - /Pg 4917 0 R ->> -endobj - -1720 0 obj -<< - /Type /StructElem - /S /Strong - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [116] - /Pg 4917 0 R ->> -endobj - -1721 0 obj -<< - /Type /StructElem - /S /Strong - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [114] - /Pg 4917 0 R ->> -endobj - -1722 0 obj -<< - /Type /StructElem - /S /Formula - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4917 0 R ->> -endobj - -1723 0 obj -<< - /Type /StructElem - /S /Span - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [111] - /Pg 4917 0 R ->> -endobj - -1724 0 obj -<< - /Type /StructElem - /S /Strong - /P 1717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4917 0 R ->> -endobj - -1725 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1726 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1727 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1728 0 R] ->> -endobj - -1728 0 obj -<< - /Type /StructElem - /S /Span - /P 1727 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109] - /Pg 4917 0 R ->> -endobj - -1729 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1735 0 R 1734 0 R 1733 0 R 1732 0 R 1731 0 R 1730 0 R] ->> -endobj - -1730 0 obj -<< - /Type /StructElem - /S /Span - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104 106 108] - /Pg 4917 0 R ->> -endobj - -1731 0 obj -<< - /Type /StructElem - /S /Strong - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [107] - /Pg 4917 0 R ->> -endobj - -1732 0 obj -<< - /Type /StructElem - /S /Strong - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4917 0 R ->> -endobj - -1733 0 obj -<< - /Type /StructElem - /S /Formula - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4917 0 R ->> -endobj - -1734 0 obj -<< - /Type /StructElem - /S /Span - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [102] - /Pg 4917 0 R ->> -endobj - -1735 0 obj -<< - /Type /StructElem - /S /Strong - /P 1729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101] - /Pg 4917 0 R ->> -endobj - -1736 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1737 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1738 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1739 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1740 0 R] ->> -endobj - -1740 0 obj -<< - /Type /StructElem - /S /Span - /P 1739 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100] - /Pg 4917 0 R ->> -endobj - -1741 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1742 0 R] ->> -endobj - -1742 0 obj -<< - /Type /StructElem - /S /Strong - /P 1741 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [99] - /Pg 4917 0 R ->> -endobj - -1743 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1744 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1745 0 R] ->> -endobj - -1745 0 obj -<< - /Type /StructElem - /S /Span - /P 1744 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4917 0 R ->> -endobj - -1746 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1749 0 R 1748 0 R 1747 0 R] ->> -endobj - -1747 0 obj -<< - /Type /StructElem - /S /Span - /P 1746 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97] - /Pg 4917 0 R ->> -endobj - -1748 0 obj -<< - /Type /StructElem - /S /Formula - /P 1746 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4917 0 R ->> -endobj - -1749 0 obj -<< - /Type /StructElem - /S /Span - /P 1746 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4917 0 R ->> -endobj - -1750 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1751 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1752 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1753 0 R] ->> -endobj - -1753 0 obj -<< - /Type /StructElem - /S /Span - /P 1752 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4917 0 R ->> -endobj - -1754 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1756 0 R 1755 0 R] ->> -endobj - -1755 0 obj -<< - /Type /StructElem - /S /Span - /P 1754 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4917 0 R ->> -endobj - -1756 0 obj -<< - /Type /StructElem - /S /Strong - /P 1754 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92] - /Pg 4917 0 R ->> -endobj - -1757 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [1758 0 R] ->> -endobj - -1758 0 obj -<< - /Type /StructElem - /S /Span - /P 1757 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4917 0 R ->> -endobj - -1759 0 obj -<< - /Type /StructElem - /S /Div - /P 1707 0 R - /K [] ->> -endobj - -1760 0 obj -<< - /Type /StructElem - /S /P - /P 1706 0 R - /K [1761 0 R 90] - /Pg 4917 0 R ->> -endobj - -1761 0 obj -<< - /Type /StructElem - /S /Strong - /P 1760 0 R - /K [89] - /Pg 4917 0 R ->> -endobj - -1762 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [61 1773 0 R 63 1772 0 R 65 1771 0 R 67 1770 0 R 69 70 1769 0 R 72 73 1768 0 R 75 76 1767 0 R 78 79 1766 0 R 81 1765 0 R 83 84 1764 0 R 86 1763 0 R 88] - /Pg 4917 0 R ->> -endobj - -1763 0 obj -<< - /Type /StructElem - /S /Link - /P 1762 0 R - /K [87 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4913 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1764 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [85] - /Pg 4917 0 R ->> -endobj - -1765 0 obj -<< - /Type /StructElem - /S /Link - /P 1762 0 R - /K [82 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4912 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1766 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [80] - /Pg 4917 0 R ->> -endobj - -1767 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [77] - /Pg 4917 0 R ->> -endobj - -1768 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [74] - /Pg 4917 0 R ->> -endobj - -1769 0 obj -<< - /Type /StructElem - /S /Em - /P 1762 0 R - /K [71] - /Pg 4917 0 R ->> -endobj - -1770 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [68] - /Pg 4917 0 R ->> -endobj - -1771 0 obj -<< - /Type /StructElem - /S /Code - /P 1762 0 R - /K [66] - /Pg 4917 0 R ->> -endobj - -1772 0 obj -<< - /Type /StructElem - /S /Em - /P 1762 0 R - /K [64] - /Pg 4917 0 R ->> -endobj - -1773 0 obj -<< - /Type /StructElem - /S /Link - /P 1762 0 R - /K [62 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4911 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1774 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Context Access) - /K [59 60] - /Pg 4917 0 R ->> -endobj - -1775 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [43 1781 0 R 45 1780 0 R 47 1779 0 R 49 1778 0 R 51 52 1777 0 R 54 55 56 1776 0 R 58] - /Pg 4917 0 R ->> -endobj - -1776 0 obj -<< - /Type /StructElem - /S /Link - /P 1775 0 R - /K [57 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4910 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1777 0 obj -<< - /Type /StructElem - /S /Link - /P 1775 0 R - /K [53 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4909 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1778 0 obj -<< - /Type /StructElem - /S /Em - /P 1775 0 R - /K [50] - /Pg 4917 0 R ->> -endobj - -1779 0 obj -<< - /Type /StructElem - /S /Code - /P 1775 0 R - /K [48] - /Pg 4917 0 R ->> -endobj - -1780 0 obj -<< - /Type /StructElem - /S /Code - /P 1775 0 R - /K [46] - /Pg 4917 0 R ->> -endobj - -1781 0 obj -<< - /Type /StructElem - /S /Em - /P 1775 0 R - /K [44] - /Pg 4917 0 R ->> -endobj - -1782 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [34 35 1785 0 R 37 1784 0 R 39 1783 0 R 41 42] - /Pg 4917 0 R ->> -endobj - -1783 0 obj -<< - /Type /StructElem - /S /Link - /P 1782 0 R - /K [40 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4908 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1784 0 obj -<< - /Type /StructElem - /S /Code - /P 1782 0 R - /K [38] - /Pg 4917 0 R ->> -endobj - -1785 0 obj -<< - /Type /StructElem - /S /Link - /P 1782 0 R - /K [36 << - /Type /OBJR - /Pg 4917 0 R - /Obj 4907 0 R - >>] - /Pg 4917 0 R ->> -endobj - -1786 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1983 0 R 1787 0 R] ->> -endobj - -1787 0 obj -<< - /Type /StructElem - /S /Div - /P 1786 0 R - /K [1982 0 R 1980 0 R 1977 0 R 1975 0 R 1974 0 R 1973 0 R 1968 0 R 1966 0 R 1965 0 R 1958 0 R 1956 0 R 1955 0 R 1951 0 R 1949 0 R 1948 0 R 1943 0 R 1941 0 R 1940 0 R 1932 0 R 1930 0 R 1929 0 R 1928 0 R 1927 0 R 1923 0 R 1921 0 R 1920 0 R 1918 0 R 1916 0 R 1915 0 R 1914 0 R 1913 0 R 1909 0 R 1907 0 R 1904 0 R 1902 0 R 1901 0 R 1900 0 R 1895 0 R 1893 0 R 1892 0 R 1882 0 R 1880 0 R 1879 0 R 1875 0 R 1873 0 R 1872 0 R 1865 0 R 1863 0 R 1862 0 R 1861 0 R 1860 0 R 1856 0 R 1854 0 R 1853 0 R 1851 0 R 1849 0 R 1848 0 R 1847 0 R 1846 0 R 1842 0 R 1840 0 R 1837 0 R 1835 0 R 1834 0 R 1833 0 R 1830 0 R 1828 0 R 1827 0 R 1823 0 R 1821 0 R 1820 0 R 1812 0 R 1810 0 R 1809 0 R 1808 0 R 1807 0 R 1803 0 R 1801 0 R 1800 0 R 1798 0 R 1796 0 R 1795 0 R 1794 0 R 1793 0 R 1789 0 R 1788 0 R] ->> -endobj - -1788 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1789 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1792 0 R 1791 0 R 1790 0 R] ->> -endobj - -1790 0 obj -<< - /Type /StructElem - /S /Span - /P 1789 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4917 0 R ->> -endobj - -1791 0 obj -<< - /Type /StructElem - /S /Formula - /P 1789 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [32] - /Pg 4917 0 R ->> -endobj - -1792 0 obj -<< - /Type /StructElem - /S /Span - /P 1789 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [31] - /Pg 4917 0 R ->> -endobj - -1793 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1794 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1795 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1796 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1797 0 R] ->> -endobj - -1797 0 obj -<< - /Type /StructElem - /S /Span - /P 1796 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30] - /Pg 4917 0 R ->> -endobj - -1798 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1799 0 R] ->> -endobj - -1799 0 obj -<< - /Type /StructElem - /S /Strong - /P 1798 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4917 0 R ->> -endobj - -1800 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1801 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1802 0 R] ->> -endobj - -1802 0 obj -<< - /Type /StructElem - /S /Span - /P 1801 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [28] - /Pg 4917 0 R ->> -endobj - -1803 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1806 0 R 1805 0 R 1804 0 R] ->> -endobj - -1804 0 obj -<< - /Type /StructElem - /S /Span - /P 1803 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [27] - /Pg 4917 0 R ->> -endobj - -1805 0 obj -<< - /Type /StructElem - /S /Formula - /P 1803 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26] - /Pg 4917 0 R ->> -endobj - -1806 0 obj -<< - /Type /StructElem - /S /Span - /P 1803 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [25] - /Pg 4917 0 R ->> -endobj - -1807 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1808 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1809 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1810 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1811 0 R] ->> -endobj - -1811 0 obj -<< - /Type /StructElem - /S /Span - /P 1810 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24] - /Pg 4917 0 R ->> -endobj - -1812 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1819 0 R 1818 0 R 1817 0 R 1816 0 R 1815 0 R 1814 0 R 1813 0 R] ->> -endobj - -1813 0 obj -<< - /Type /StructElem - /S /Span - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [22] - /Pg 4917 0 R ->> -endobj - -1814 0 obj -<< - /Type /StructElem - /S /Strong - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4917 0 R ->> -endobj - -1815 0 obj -<< - /Type /StructElem - /S /Formula - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [21] - /Pg 4917 0 R ->> -endobj - -1816 0 obj -<< - /Type /StructElem - /S /Span - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [20] - /Pg 4917 0 R ->> -endobj - -1817 0 obj -<< - /Type /StructElem - /S /Formula - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [19] - /Pg 4917 0 R ->> -endobj - -1818 0 obj -<< - /Type /StructElem - /S /Span - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18] - /Pg 4917 0 R ->> -endobj - -1819 0 obj -<< - /Type /StructElem - /S /Strong - /P 1812 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4917 0 R ->> -endobj - -1820 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1821 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1822 0 R] ->> -endobj - -1822 0 obj -<< - /Type /StructElem - /S /Span - /P 1821 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [16] - /Pg 4917 0 R ->> -endobj - -1823 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1826 0 R 1825 0 R 1824 0 R] ->> -endobj - -1824 0 obj -<< - /Type /StructElem - /S /Span - /P 1823 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [15] - /Pg 4917 0 R ->> -endobj - -1825 0 obj -<< - /Type /StructElem - /S /Formula - /P 1823 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14] - /Pg 4917 0 R ->> -endobj - -1826 0 obj -<< - /Type /StructElem - /S /Span - /P 1823 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13] - /Pg 4917 0 R ->> -endobj - -1827 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1828 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1829 0 R] ->> -endobj - -1829 0 obj -<< - /Type /StructElem - /S /Span - /P 1828 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [12] - /Pg 4917 0 R ->> -endobj - -1830 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1832 0 R 1831 0 R] ->> -endobj - -1831 0 obj -<< - /Type /StructElem - /S /Span - /P 1830 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11] - /Pg 4917 0 R ->> -endobj - -1832 0 obj -<< - /Type /StructElem - /S /Strong - /P 1830 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4917 0 R ->> -endobj - -1833 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1834 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1835 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1836 0 R] ->> -endobj - -1836 0 obj -<< - /Type /StructElem - /S /Span - /P 1835 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [9] - /Pg 4917 0 R ->> -endobj - -1837 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1839 0 R 1838 0 R] ->> -endobj - -1838 0 obj -<< - /Type /StructElem - /S /Span - /P 1837 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [8] - /Pg 4917 0 R ->> -endobj - -1839 0 obj -<< - /Type /StructElem - /S /Strong - /P 1837 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [7] - /Pg 4917 0 R ->> -endobj - -1840 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1841 0 R] ->> -endobj - -1841 0 obj -<< - /Type /StructElem - /S /Span - /P 1840 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [6] - /Pg 4917 0 R ->> -endobj - -1842 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1845 0 R 1844 0 R 1843 0 R] ->> -endobj - -1843 0 obj -<< - /Type /StructElem - /S /Span - /P 1842 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [5] - /Pg 4917 0 R ->> -endobj - -1844 0 obj -<< - /Type /StructElem - /S /Formula - /P 1842 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4] - /Pg 4917 0 R ->> -endobj - -1845 0 obj -<< - /Type /StructElem - /S /Span - /P 1842 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3] - /Pg 4917 0 R ->> -endobj - -1846 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1847 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1848 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1849 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1850 0 R] ->> -endobj - -1850 0 obj -<< - /Type /StructElem - /S /Span - /P 1849 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2] - /Pg 4917 0 R ->> -endobj - -1851 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1852 0 R] ->> -endobj - -1852 0 obj -<< - /Type /StructElem - /S /Strong - /P 1851 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4917 0 R ->> -endobj - -1853 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1854 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1855 0 R] ->> -endobj - -1855 0 obj -<< - /Type /StructElem - /S /Span - /P 1854 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4917 0 R ->> -endobj - -1856 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1859 0 R 1858 0 R 1857 0 R] ->> -endobj - -1857 0 obj -<< - /Type /StructElem - /S /Span - /P 1856 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [177] - /Pg 4905 0 R ->> -endobj - -1858 0 obj -<< - /Type /StructElem - /S /Formula - /P 1856 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [176] - /Pg 4905 0 R ->> -endobj - -1859 0 obj -<< - /Type /StructElem - /S /Span - /P 1856 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [175] - /Pg 4905 0 R ->> -endobj - -1860 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1861 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1862 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1863 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1864 0 R] ->> -endobj - -1864 0 obj -<< - /Type /StructElem - /S /Span - /P 1863 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [174] - /Pg 4905 0 R ->> -endobj - -1865 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1871 0 R 1870 0 R 1869 0 R 1868 0 R 1867 0 R 1866 0 R] ->> -endobj - -1866 0 obj -<< - /Type /StructElem - /S /Span - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170 172] - /Pg 4905 0 R ->> -endobj - -1867 0 obj -<< - /Type /StructElem - /S /Strong - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [173] - /Pg 4905 0 R ->> -endobj - -1868 0 obj -<< - /Type /StructElem - /S /Span - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - /BaselineShift -0.9786 - /LineHeight 4.88601 - >>] - /K [171] - /Pg 4905 0 R ->> -endobj - -1869 0 obj -<< - /Type /StructElem - /S /Formula - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4905 0 R ->> -endobj - -1870 0 obj -<< - /Type /StructElem - /S /Span - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [168] - /Pg 4905 0 R ->> -endobj - -1871 0 obj -<< - /Type /StructElem - /S /Strong - /P 1865 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167] - /Pg 4905 0 R ->> -endobj - -1872 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1873 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1874 0 R] ->> -endobj - -1874 0 obj -<< - /Type /StructElem - /S /Span - /P 1873 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [166] - /Pg 4905 0 R ->> -endobj - -1875 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1878 0 R 1877 0 R 1876 0 R] ->> -endobj - -1876 0 obj -<< - /Type /StructElem - /S /Span - /P 1875 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [165] - /Pg 4905 0 R ->> -endobj - -1877 0 obj -<< - /Type /StructElem - /S /Formula - /P 1875 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164] - /Pg 4905 0 R ->> -endobj - -1878 0 obj -<< - /Type /StructElem - /S /Span - /P 1875 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4905 0 R ->> -endobj - -1879 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1880 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1881 0 R] ->> -endobj - -1881 0 obj -<< - /Type /StructElem - /S /Span - /P 1880 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [162] - /Pg 4905 0 R ->> -endobj - -1882 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1891 0 R 1890 0 R 1889 0 R 1888 0 R 1887 0 R 1886 0 R 1885 0 R 1884 0 R 1883 0 R] ->> -endobj - -1883 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [159 161] - /Pg 4905 0 R ->> -endobj - -1884 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - /BaselineShift -0.9786 - /LineHeight 4.88601 - >>] - /K [160] - /Pg 4905 0 R ->> -endobj - -1885 0 obj -<< - /Type /StructElem - /S /Formula - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [158] - /Pg 4905 0 R ->> -endobj - -1886 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157] - /Pg 4905 0 R ->> -endobj - -1887 0 obj -<< - /Type /StructElem - /S /Formula - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4905 0 R ->> -endobj - -1888 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [153 155] - /Pg 4905 0 R ->> -endobj - -1889 0 obj -<< - /Type /StructElem - /S /Strong - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4905 0 R ->> -endobj - -1890 0 obj -<< - /Type /StructElem - /S /Formula - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [152] - /Pg 4905 0 R ->> -endobj - -1891 0 obj -<< - /Type /StructElem - /S /Span - /P 1882 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [151] - /Pg 4905 0 R ->> -endobj - -1892 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1893 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1894 0 R] ->> -endobj - -1894 0 obj -<< - /Type /StructElem - /S /Span - /P 1893 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [150] - /Pg 4905 0 R ->> -endobj - -1895 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1899 0 R 1898 0 R 1897 0 R 1896 0 R] ->> -endobj - -1896 0 obj -<< - /Type /StructElem - /S /Span - /P 1895 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [149] - /Pg 4905 0 R ->> -endobj - -1897 0 obj -<< - /Type /StructElem - /S /Formula - /P 1895 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [148] - /Pg 4905 0 R ->> -endobj - -1898 0 obj -<< - /Type /StructElem - /S /Span - /P 1895 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [145 147] - /Pg 4905 0 R ->> -endobj - -1899 0 obj -<< - /Type /StructElem - /S /Span - /P 1895 0 R - /A [<< - /O /Layout - /Placement /Block - /BaselineShift -0.9786 - /LineHeight 4.88601 - >>] - /K [146] - /Pg 4905 0 R ->> -endobj - -1900 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1901 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1902 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1903 0 R] ->> -endobj - -1903 0 obj -<< - /Type /StructElem - /S /Span - /P 1902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [144] - /Pg 4905 0 R ->> -endobj - -1904 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1906 0 R 1905 0 R] ->> -endobj - -1905 0 obj -<< - /Type /StructElem - /S /Span - /P 1904 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143] - /Pg 4905 0 R ->> -endobj - -1906 0 obj -<< - /Type /StructElem - /S /Strong - /P 1904 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4905 0 R ->> -endobj - -1907 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1908 0 R] ->> -endobj - -1908 0 obj -<< - /Type /StructElem - /S /Span - /P 1907 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [141] - /Pg 4905 0 R ->> -endobj - -1909 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1912 0 R 1911 0 R 1910 0 R] ->> -endobj - -1910 0 obj -<< - /Type /StructElem - /S /Span - /P 1909 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [140] - /Pg 4905 0 R ->> -endobj - -1911 0 obj -<< - /Type /StructElem - /S /Formula - /P 1909 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139] - /Pg 4905 0 R ->> -endobj - -1912 0 obj -<< - /Type /StructElem - /S /Span - /P 1909 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [138] - /Pg 4905 0 R ->> -endobj - -1913 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1914 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1915 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1916 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1917 0 R] ->> -endobj - -1917 0 obj -<< - /Type /StructElem - /S /Span - /P 1916 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [137] - /Pg 4905 0 R ->> -endobj - -1918 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1919 0 R] ->> -endobj - -1919 0 obj -<< - /Type /StructElem - /S /Strong - /P 1918 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [136] - /Pg 4905 0 R ->> -endobj - -1920 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1921 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1922 0 R] ->> -endobj - -1922 0 obj -<< - /Type /StructElem - /S /Span - /P 1921 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [135] - /Pg 4905 0 R ->> -endobj - -1923 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1926 0 R 1925 0 R 1924 0 R] ->> -endobj - -1924 0 obj -<< - /Type /StructElem - /S /Span - /P 1923 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [134] - /Pg 4905 0 R ->> -endobj - -1925 0 obj -<< - /Type /StructElem - /S /Formula - /P 1923 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [133] - /Pg 4905 0 R ->> -endobj - -1926 0 obj -<< - /Type /StructElem - /S /Span - /P 1923 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [132] - /Pg 4905 0 R ->> -endobj - -1927 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1928 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1929 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1930 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1931 0 R] ->> -endobj - -1931 0 obj -<< - /Type /StructElem - /S /Span - /P 1930 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131] - /Pg 4905 0 R ->> -endobj - -1932 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1939 0 R 1938 0 R 1937 0 R 1936 0 R 1935 0 R 1934 0 R 1933 0 R] ->> -endobj - -1933 0 obj -<< - /Type /StructElem - /S /Span - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [129] - /Pg 4905 0 R ->> -endobj - -1934 0 obj -<< - /Type /StructElem - /S /Strong - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4905 0 R ->> -endobj - -1935 0 obj -<< - /Type /StructElem - /S /Formula - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128] - /Pg 4905 0 R ->> -endobj - -1936 0 obj -<< - /Type /StructElem - /S /Span - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4905 0 R ->> -endobj - -1937 0 obj -<< - /Type /StructElem - /S /Formula - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [126] - /Pg 4905 0 R ->> -endobj - -1938 0 obj -<< - /Type /StructElem - /S /Span - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [125] - /Pg 4905 0 R ->> -endobj - -1939 0 obj -<< - /Type /StructElem - /S /Strong - /P 1932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [124] - /Pg 4905 0 R ->> -endobj - -1940 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1941 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1942 0 R] ->> -endobj - -1942 0 obj -<< - /Type /StructElem - /S /Span - /P 1941 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [123] - /Pg 4905 0 R ->> -endobj - -1943 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1947 0 R 1946 0 R 1945 0 R 1944 0 R] ->> -endobj - -1944 0 obj -<< - /Type /StructElem - /S /Span - /P 1943 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119 121] - /Pg 4905 0 R ->> -endobj - -1945 0 obj -<< - /Type /StructElem - /S /Strong - /P 1943 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [122] - /Pg 4905 0 R ->> -endobj - -1946 0 obj -<< - /Type /StructElem - /S /Strong - /P 1943 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [120] - /Pg 4905 0 R ->> -endobj - -1947 0 obj -<< - /Type /StructElem - /S /Strong - /P 1943 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4905 0 R ->> -endobj - -1948 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1949 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1950 0 R] ->> -endobj - -1950 0 obj -<< - /Type /StructElem - /S /Span - /P 1949 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [117] - /Pg 4905 0 R ->> -endobj - -1951 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1954 0 R 1953 0 R 1952 0 R] ->> -endobj - -1952 0 obj -<< - /Type /StructElem - /S /Span - /P 1951 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [116] - /Pg 4905 0 R ->> -endobj - -1953 0 obj -<< - /Type /StructElem - /S /Formula - /P 1951 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [115] - /Pg 4905 0 R ->> -endobj - -1954 0 obj -<< - /Type /StructElem - /S /Span - /P 1951 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [114] - /Pg 4905 0 R ->> -endobj - -1955 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1956 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1957 0 R] ->> -endobj - -1957 0 obj -<< - /Type /StructElem - /S /Span - /P 1956 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113] - /Pg 4905 0 R ->> -endobj - -1958 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1964 0 R 1963 0 R 1962 0 R 1961 0 R 1960 0 R 1959 0 R] ->> -endobj - -1959 0 obj -<< - /Type /StructElem - /S /Span - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109 111] - /Pg 4905 0 R ->> -endobj - -1960 0 obj -<< - /Type /StructElem - /S /Strong - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4905 0 R ->> -endobj - -1961 0 obj -<< - /Type /StructElem - /S /Strong - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4905 0 R ->> -endobj - -1962 0 obj -<< - /Type /StructElem - /S /Formula - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [108] - /Pg 4905 0 R ->> -endobj - -1963 0 obj -<< - /Type /StructElem - /S /Span - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [107] - /Pg 4905 0 R ->> -endobj - -1964 0 obj -<< - /Type /StructElem - /S /Strong - /P 1958 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106] - /Pg 4905 0 R ->> -endobj - -1965 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1966 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1967 0 R] ->> -endobj - -1967 0 obj -<< - /Type /StructElem - /S /Span - /P 1966 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4905 0 R ->> -endobj - -1968 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1972 0 R 1971 0 R 1970 0 R 1969 0 R] ->> -endobj - -1969 0 obj -<< - /Type /StructElem - /S /Formula - /P 1968 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100 101 102 103 104] - /Pg 4905 0 R ->> -endobj - -1970 0 obj -<< - /Type /StructElem - /S /Span - /P 1968 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [99] - /Pg 4905 0 R ->> -endobj - -1971 0 obj -<< - /Type /StructElem - /S /Formula - /P 1968 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4905 0 R ->> -endobj - -1972 0 obj -<< - /Type /StructElem - /S /Span - /P 1968 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97] - /Pg 4905 0 R ->> -endobj - -1973 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1974 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1975 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1976 0 R] ->> -endobj - -1976 0 obj -<< - /Type /StructElem - /S /Span - /P 1975 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4905 0 R ->> -endobj - -1977 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1979 0 R 1978 0 R] ->> -endobj - -1978 0 obj -<< - /Type /StructElem - /S /Span - /P 1977 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4905 0 R ->> -endobj - -1979 0 obj -<< - /Type /StructElem - /S /Strong - /P 1977 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4905 0 R ->> -endobj - -1980 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [1981 0 R] ->> -endobj - -1981 0 obj -<< - /Type /StructElem - /S /Span - /P 1980 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4905 0 R ->> -endobj - -1982 0 obj -<< - /Type /StructElem - /S /Div - /P 1787 0 R - /K [] ->> -endobj - -1983 0 obj -<< - /Type /StructElem - /S /P - /P 1786 0 R - /K [1984 0 R 92] - /Pg 4905 0 R ->> -endobj - -1984 0 obj -<< - /Type /StructElem - /S /Strong - /P 1983 0 R - /K [91] - /Pg 4905 0 R ->> -endobj - -1985 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2009 0 R 52 2008 0 R 54 2007 0 R 56 2006 0 R 58 59 60 2005 0 R 62 63 2004 0 R 65 2003 0 R 67 2000 0 R 1994 0 R 69 1993 0 R 71 72 1992 0 R 74 75 1991 0 R 77 78 1990 0 R 80 1989 0 R 82 1988 0 R 84 85 1987 0 R 87 1986 0 R 89 90] - /Pg 4905 0 R ->> -endobj - -1986 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [88] - /Pg 4905 0 R ->> -endobj - -1987 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [86] - /Pg 4905 0 R ->> -endobj - -1988 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [83] - /Pg 4905 0 R ->> -endobj - -1989 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [81] - /Pg 4905 0 R ->> -endobj - -1990 0 obj -<< - /Type /StructElem - /S /Formula - /P 1985 0 R - /K [79] - /Pg 4905 0 R ->> -endobj - -1991 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [76] - /Pg 4905 0 R ->> -endobj - -1992 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [73] - /Pg 4905 0 R ->> -endobj - -1993 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [70] - /Pg 4905 0 R ->> -endobj - -1994 0 obj -<< - /Type /StructElem - /S /Note - /P 1985 0 R - /ID (Note 2) - /K [1997 0 R 1996 0 R 180 1995 0 R 182 183 184 185] - /Pg 4905 0 R ->> -endobj - -1995 0 obj -<< - /Type /StructElem - /S /Code - /P 1994 0 R - /K [181] - /Pg 4905 0 R ->> -endobj - -1996 0 obj -<< - /Type /StructElem - /S /Code - /P 1994 0 R - /K [179] - /Pg 4905 0 R ->> -endobj - -1997 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1994 0 R - /K [1998 0 R] ->> -endobj - -1998 0 obj -<< - /Type /StructElem - /S /Link - /P 1997 0 R - /K [<< - /Type /OBJR - /Pg 4905 0 R - /Obj 4904 0 R - >> 1999 0 R] ->> -endobj - -1999 0 obj -<< - /Type /StructElem - /S /Span - /P 1998 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [178] - /Pg 4905 0 R ->> -endobj - -2000 0 obj -<< - /Type /StructElem - /S /Lbl - /P 1985 0 R - /K [2001 0 R] ->> -endobj - -2001 0 obj -<< - /Type /StructElem - /S /Link - /P 2000 0 R - /K [<< - /Type /OBJR - /Pg 4905 0 R - /Obj 4903 0 R - >> 2002 0 R] ->> -endobj - -2002 0 obj -<< - /Type /StructElem - /S /Span - /P 2001 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [68] - /Pg 4905 0 R ->> -endobj - -2003 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [66] - /Pg 4905 0 R ->> -endobj - -2004 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [64] - /Pg 4905 0 R ->> -endobj - -2005 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [61] - /Pg 4905 0 R ->> -endobj - -2006 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [57] - /Pg 4905 0 R ->> -endobj - -2007 0 obj -<< - /Type /StructElem - /S /Code - /P 1985 0 R - /K [55] - /Pg 4905 0 R ->> -endobj - -2008 0 obj -<< - /Type /StructElem - /S /Link - /P 1985 0 R - /K [53 << - /Type /OBJR - /Pg 4905 0 R - /Obj 4902 0 R - >>] - /Pg 4905 0 R ->> -endobj - -2009 0 obj -<< - /Type /StructElem - /S /Link - /P 1985 0 R - /K [51 << - /Type /OBJR - /Pg 4905 0 R - /Obj 4901 0 R - >>] - /Pg 4905 0 R ->> -endobj - -2010 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2097 0 R 2011 0 R] ->> -endobj - -2011 0 obj -<< - /Type /StructElem - /S /Div - /P 2010 0 R - /K [2096 0 R 2094 0 R 2091 0 R 2088 0 R 2087 0 R 2086 0 R 2083 0 R 2081 0 R 2080 0 R 2079 0 R 2078 0 R 2076 0 R 2074 0 R 2073 0 R 2072 0 R 2068 0 R 2066 0 R 2065 0 R 2064 0 R 2063 0 R 2062 0 R 2057 0 R 2055 0 R 2054 0 R 2053 0 R 2052 0 R 2050 0 R 2048 0 R 2047 0 R 2043 0 R 2041 0 R 2040 0 R 2034 0 R 2031 0 R 2030 0 R 2024 0 R 2022 0 R 2021 0 R 2019 0 R 2017 0 R 2016 0 R 2013 0 R 2012 0 R] ->> -endobj - -2012 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2013 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2015 0 R 2014 0 R] ->> -endobj - -2014 0 obj -<< - /Type /StructElem - /S /Span - /P 2013 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [50] - /Pg 4905 0 R ->> -endobj - -2015 0 obj -<< - /Type /StructElem - /S /Strong - /P 2013 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [49] - /Pg 4905 0 R ->> -endobj - -2016 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2017 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2018 0 R] ->> -endobj - -2018 0 obj -<< - /Type /StructElem - /S /Span - /P 2017 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [48] - /Pg 4905 0 R ->> -endobj - -2019 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2020 0 R] ->> -endobj - -2020 0 obj -<< - /Type /StructElem - /S /Span - /P 2019 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [47] - /Pg 4905 0 R ->> -endobj - -2021 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2022 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2023 0 R] ->> -endobj - -2023 0 obj -<< - /Type /StructElem - /S /Span - /P 2022 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [46] - /Pg 4905 0 R ->> -endobj - -2024 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2029 0 R 2028 0 R 2027 0 R 2026 0 R 2025 0 R] ->> -endobj - -2025 0 obj -<< - /Type /StructElem - /S /Span - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [45] - /Pg 4905 0 R ->> -endobj - -2026 0 obj -<< - /Type /StructElem - /S /Formula - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44] - /Pg 4905 0 R ->> -endobj - -2027 0 obj -<< - /Type /StructElem - /S /Span - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4905 0 R ->> -endobj - -2028 0 obj -<< - /Type /StructElem - /S /Formula - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [42] - /Pg 4905 0 R ->> -endobj - -2029 0 obj -<< - /Type /StructElem - /S /Span - /P 2024 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41] - /Pg 4905 0 R ->> -endobj - -2030 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2031 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2033 0 R 2032 0 R] ->> -endobj - -2032 0 obj -<< - /Type /StructElem - /S /Span - /P 2031 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [40] - /Pg 4905 0 R ->> -endobj - -2033 0 obj -<< - /Type /StructElem - /S /Div - /P 2031 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [] ->> -endobj - -2034 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2039 0 R 2038 0 R 2037 0 R 2036 0 R 2035 0 R] ->> -endobj - -2035 0 obj -<< - /Type /StructElem - /S /Span - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [39] - /Pg 4905 0 R ->> -endobj - -2036 0 obj -<< - /Type /StructElem - /S /Formula - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [38] - /Pg 4905 0 R ->> -endobj - -2037 0 obj -<< - /Type /StructElem - /S /Span - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37] - /Pg 4905 0 R ->> -endobj - -2038 0 obj -<< - /Type /StructElem - /S /Formula - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4905 0 R ->> -endobj - -2039 0 obj -<< - /Type /StructElem - /S /Span - /P 2034 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [35] - /Pg 4905 0 R ->> -endobj - -2040 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2041 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2042 0 R] ->> -endobj - -2042 0 obj -<< - /Type /StructElem - /S /Span - /P 2041 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [34] - /Pg 4905 0 R ->> -endobj - -2043 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2046 0 R 2045 0 R 2044 0 R] ->> -endobj - -2044 0 obj -<< - /Type /StructElem - /S /Span - /P 2043 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4905 0 R ->> -endobj - -2045 0 obj -<< - /Type /StructElem - /S /Formula - /P 2043 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [32] - /Pg 4905 0 R ->> -endobj - -2046 0 obj -<< - /Type /StructElem - /S /Span - /P 2043 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [31] - /Pg 4905 0 R ->> -endobj - -2047 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2048 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2049 0 R] ->> -endobj - -2049 0 obj -<< - /Type /StructElem - /S /Span - /P 2048 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30] - /Pg 4905 0 R ->> -endobj - -2050 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2051 0 R] ->> -endobj - -2051 0 obj -<< - /Type /StructElem - /S /Span - /P 2050 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4905 0 R ->> -endobj - -2052 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2053 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2054 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2055 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2056 0 R] ->> -endobj - -2056 0 obj -<< - /Type /StructElem - /S /Span - /P 2055 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [28] - /Pg 4905 0 R ->> -endobj - -2057 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2061 0 R 2060 0 R 2059 0 R 2058 0 R] ->> -endobj - -2058 0 obj -<< - /Type /StructElem - /S /Formula - /P 2057 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [27] - /Pg 4905 0 R ->> -endobj - -2059 0 obj -<< - /Type /StructElem - /S /Span - /P 2057 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26] - /Pg 4905 0 R ->> -endobj - -2060 0 obj -<< - /Type /StructElem - /S /Formula - /P 2057 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [25] - /Pg 4905 0 R ->> -endobj - -2061 0 obj -<< - /Type /StructElem - /S /Span - /P 2057 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24] - /Pg 4905 0 R ->> -endobj - -2062 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2063 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2064 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2065 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2066 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2067 0 R] ->> -endobj - -2067 0 obj -<< - /Type /StructElem - /S /Span - /P 2066 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4905 0 R ->> -endobj - -2068 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2071 0 R 2070 0 R 2069 0 R] ->> -endobj - -2069 0 obj -<< - /Type /StructElem - /S /Span - /P 2068 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [20 22] - /Pg 4905 0 R ->> -endobj - -2070 0 obj -<< - /Type /StructElem - /S /Strong - /P 2068 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [21] - /Pg 4905 0 R ->> -endobj - -2071 0 obj -<< - /Type /StructElem - /S /Strong - /P 2068 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [19] - /Pg 4905 0 R ->> -endobj - -2072 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2073 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2074 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2075 0 R] ->> -endobj - -2075 0 obj -<< - /Type /StructElem - /S /Span - /P 2074 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18] - /Pg 4905 0 R ->> -endobj - -2076 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2077 0 R] ->> -endobj - -2077 0 obj -<< - /Type /StructElem - /S /Span - /P 2076 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4905 0 R ->> -endobj - -2078 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2079 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2080 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2081 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2082 0 R] ->> -endobj - -2082 0 obj -<< - /Type /StructElem - /S /Span - /P 2081 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [16] - /Pg 4905 0 R ->> -endobj - -2083 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2085 0 R 2084 0 R] ->> -endobj - -2084 0 obj -<< - /Type /StructElem - /S /Span - /P 2083 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [15] - /Pg 4905 0 R ->> -endobj - -2085 0 obj -<< - /Type /StructElem - /S /Strong - /P 2083 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14] - /Pg 4905 0 R ->> -endobj - -2086 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2087 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2088 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2090 0 R 2089 0 R] ->> -endobj - -2089 0 obj -<< - /Type /StructElem - /S /Span - /P 2088 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13] - /Pg 4905 0 R ->> -endobj - -2090 0 obj -<< - /Type /StructElem - /S /Div - /P 2088 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [] ->> -endobj - -2091 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2093 0 R 2092 0 R] ->> -endobj - -2092 0 obj -<< - /Type /StructElem - /S /Span - /P 2091 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [12] - /Pg 4905 0 R ->> -endobj - -2093 0 obj -<< - /Type /StructElem - /S /Strong - /P 2091 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11] - /Pg 4905 0 R ->> -endobj - -2094 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [2095 0 R] ->> -endobj - -2095 0 obj -<< - /Type /StructElem - /S /Span - /P 2094 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4905 0 R ->> -endobj - -2096 0 obj -<< - /Type /StructElem - /S /Div - /P 2011 0 R - /K [] ->> -endobj - -2097 0 obj -<< - /Type /StructElem - /S /P - /P 2010 0 R - /K [2098 0 R 9] - /Pg 4905 0 R ->> -endobj - -2098 0 obj -<< - /Type /StructElem - /S /Strong - /P 2097 0 R - /K [8] - /Pg 4905 0 R ->> -endobj - -2099 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2116 0 R 173 2115 0 R 175 2114 0 R 177 2113 0 R 179 2112 0 R 181 182 2111 0 R 184 2110 0 R 186 2109 0 R 188 2108 0 R 190 191 2107 0 R 193 2106 0 R 195 2105 0 R 197 198 2104 0 R 200 2103 0 R 202 << - /Type /MCR - /MCID 0 - /Pg 4905 0 R - >> 2102 0 R << - /Type /MCR - /MCID 2 - /Pg 4905 0 R - >> 2101 0 R << - /Type /MCR - /MCID 4 - /Pg 4905 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4905 0 R - >> 2100 0 R << - /Type /MCR - /MCID 7 - /Pg 4905 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2100 0 obj -<< - /Type /StructElem - /S /Formula - /P 2099 0 R - /K [6] - /Pg 4905 0 R ->> -endobj - -2101 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [3] - /Pg 4905 0 R ->> -endobj - -2102 0 obj -<< - /Type /StructElem - /S /Formula - /P 2099 0 R - /K [1] - /Pg 4905 0 R ->> -endobj - -2103 0 obj -<< - /Type /StructElem - /S /Link - /P 2099 0 R - /K [201 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4898 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2104 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [199] - /Pg 4899 0 R ->> -endobj - -2105 0 obj -<< - /Type /StructElem - /S /Em - /P 2099 0 R - /K [196] - /Pg 4899 0 R ->> -endobj - -2106 0 obj -<< - /Type /StructElem - /S /Link - /P 2099 0 R - /K [194 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4897 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2107 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [192] - /Pg 4899 0 R ->> -endobj - -2108 0 obj -<< - /Type /StructElem - /S /Formula - /P 2099 0 R - /K [189] - /Pg 4899 0 R ->> -endobj - -2109 0 obj -<< - /Type /StructElem - /S /Link - /P 2099 0 R - /K [187 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4896 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2110 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [185] - /Pg 4899 0 R ->> -endobj - -2111 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [183] - /Pg 4899 0 R ->> -endobj - -2112 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [180] - /Pg 4899 0 R ->> -endobj - -2113 0 obj -<< - /Type /StructElem - /S /Formula - /P 2099 0 R - /K [178] - /Pg 4899 0 R ->> -endobj - -2114 0 obj -<< - /Type /StructElem - /S /Code - /P 2099 0 R - /K [176] - /Pg 4899 0 R ->> -endobj - -2115 0 obj -<< - /Type /StructElem - /S /Em - /P 2099 0 R - /K [174] - /Pg 4899 0 R ->> -endobj - -2116 0 obj -<< - /Type /StructElem - /S /Link - /P 2099 0 R - /K [172 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4895 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2117 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [149 2126 0 R 151 2125 0 R 153 2124 0 R 155 2123 0 R 157 158 2122 0 R 160 2121 0 R 162 163 2120 0 R 166 2119 0 R 168 2118 0 R 170 171] - /Pg 4899 0 R ->> -endobj - -2118 0 obj -<< - /Type /StructElem - /S /Code - /P 2117 0 R - /K [169] - /Pg 4899 0 R ->> -endobj - -2119 0 obj -<< - /Type /StructElem - /S /Link - /P 2117 0 R - /K [167 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4894 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2120 0 obj -<< - /Type /StructElem - /S /Formula - /P 2117 0 R - /K [164 165] - /Pg 4899 0 R ->> -endobj - -2121 0 obj -<< - /Type /StructElem - /S /Code - /P 2117 0 R - /K [161] - /Pg 4899 0 R ->> -endobj - -2122 0 obj -<< - /Type /StructElem - /S /Code - /P 2117 0 R - /K [159] - /Pg 4899 0 R ->> -endobj - -2123 0 obj -<< - /Type /StructElem - /S /Link - /P 2117 0 R - /K [156 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4893 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2124 0 obj -<< - /Type /StructElem - /S /Link - /P 2117 0 R - /K [154 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4892 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2125 0 obj -<< - /Type /StructElem - /S /Code - /P 2117 0 R - /K [152] - /Pg 4899 0 R ->> -endobj - -2126 0 obj -<< - /Type /StructElem - /S /Em - /P 2117 0 R - /K [150] - /Pg 4899 0 R ->> -endobj - -2127 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Component Lifecycle) - /K [147 148] - /Pg 4899 0 R ->> -endobj - -2128 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2141 0 R 115 116 2140 0 R 118 119 2139 0 R 121 2138 0 R 123 2137 0 R 125 126 2136 0 R 128 2135 0 R 130 131 2134 0 R 133 134 2133 0 R 136 2132 0 R 138 2131 0 R 140 2130 0 R 142 143 2129 0 R 145 146] - /Pg 4899 0 R ->> -endobj - -2129 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [144] - /Pg 4899 0 R ->> -endobj - -2130 0 obj -<< - /Type /StructElem - /S /Link - /P 2128 0 R - /K [141 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4891 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2131 0 obj -<< - /Type /StructElem - /S /Formula - /P 2128 0 R - /K [139] - /Pg 4899 0 R ->> -endobj - -2132 0 obj -<< - /Type /StructElem - /S /Formula - /P 2128 0 R - /K [137] - /Pg 4899 0 R ->> -endobj - -2133 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [135] - /Pg 4899 0 R ->> -endobj - -2134 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [132] - /Pg 4899 0 R ->> -endobj - -2135 0 obj -<< - /Type /StructElem - /S /Link - /P 2128 0 R - /K [129 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4890 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2136 0 obj -<< - /Type /StructElem - /S /Formula - /P 2128 0 R - /K [127] - /Pg 4899 0 R ->> -endobj - -2137 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [124] - /Pg 4899 0 R ->> -endobj - -2138 0 obj -<< - /Type /StructElem - /S /Formula - /P 2128 0 R - /K [122] - /Pg 4899 0 R ->> -endobj - -2139 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [120] - /Pg 4899 0 R ->> -endobj - -2140 0 obj -<< - /Type /StructElem - /S /Code - /P 2128 0 R - /K [117] - /Pg 4899 0 R ->> -endobj - -2141 0 obj -<< - /Type /StructElem - /S /Strong - /P 2128 0 R - /K [114] - /Pg 4899 0 R ->> -endobj - -2142 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2206 0 R 2143 0 R] ->> -endobj - -2143 0 obj -<< - /Type /StructElem - /S /Div - /P 2142 0 R - /K [2205 0 R 2203 0 R 2200 0 R 2198 0 R 2197 0 R 2196 0 R 2191 0 R 2189 0 R 2188 0 R 2187 0 R 2186 0 R 2181 0 R 2179 0 R 2178 0 R 2177 0 R 2176 0 R 2175 0 R 2162 0 R 2160 0 R 2159 0 R 2158 0 R 2157 0 R 2156 0 R 2155 0 R 2153 0 R 2151 0 R 2150 0 R 2149 0 R 2148 0 R 2147 0 R 2145 0 R 2144 0 R] ->> -endobj - -2144 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2145 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2146 0 R] ->> -endobj - -2146 0 obj -<< - /Type /StructElem - /S /Strong - /P 2145 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113] - /Pg 4899 0 R ->> -endobj - -2147 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2148 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2149 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2150 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2151 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2152 0 R] ->> -endobj - -2152 0 obj -<< - /Type /StructElem - /S /Span - /P 2151 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4899 0 R ->> -endobj - -2153 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2154 0 R] ->> -endobj - -2154 0 obj -<< - /Type /StructElem - /S /Span - /P 2153 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [111] - /Pg 4899 0 R ->> -endobj - -2155 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2156 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2157 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2158 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2159 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2160 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2161 0 R] ->> -endobj - -2161 0 obj -<< - /Type /StructElem - /S /Span - /P 2160 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4899 0 R ->> -endobj - -2162 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2174 0 R 2173 0 R 2172 0 R 2171 0 R 2170 0 R 2169 0 R 2168 0 R 2167 0 R 2166 0 R 2165 0 R 2164 0 R 2163 0 R] ->> -endobj - -2163 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [108] - /Pg 4899 0 R ->> -endobj - -2164 0 obj -<< - /Type /StructElem - /S /Strong - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109] - /Pg 4899 0 R ->> -endobj - -2165 0 obj -<< - /Type /StructElem - /S /Code - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [107] - /Pg 4899 0 R ->> -endobj - -2166 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106] - /Pg 4899 0 R ->> -endobj - -2167 0 obj -<< - /Type /StructElem - /S /Formula - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [105] - /Pg 4899 0 R ->> -endobj - -2168 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104] - /Pg 4899 0 R ->> -endobj - -2169 0 obj -<< - /Type /StructElem - /S /Code - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4899 0 R ->> -endobj - -2170 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100 102] - /Pg 4899 0 R ->> -endobj - -2171 0 obj -<< - /Type /StructElem - /S /Strong - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101] - /Pg 4899 0 R ->> -endobj - -2172 0 obj -<< - /Type /StructElem - /S /Formula - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [99] - /Pg 4899 0 R ->> -endobj - -2173 0 obj -<< - /Type /StructElem - /S /Span - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [98] - /Pg 4899 0 R ->> -endobj - -2174 0 obj -<< - /Type /StructElem - /S /Strong - /P 2162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [97] - /Pg 4899 0 R ->> -endobj - -2175 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2176 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2177 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2178 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2179 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2180 0 R] ->> -endobj - -2180 0 obj -<< - /Type /StructElem - /S /Span - /P 2179 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [96] - /Pg 4899 0 R ->> -endobj - -2181 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2185 0 R 2184 0 R 2183 0 R 2182 0 R] ->> -endobj - -2182 0 obj -<< - /Type /StructElem - /S /Span - /P 2181 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92 94] - /Pg 4899 0 R ->> -endobj - -2183 0 obj -<< - /Type /StructElem - /S /Strong - /P 2181 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95] - /Pg 4899 0 R ->> -endobj - -2184 0 obj -<< - /Type /StructElem - /S /Strong - /P 2181 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4899 0 R ->> -endobj - -2185 0 obj -<< - /Type /StructElem - /S /Strong - /P 2181 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4899 0 R ->> -endobj - -2186 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2187 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2188 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2189 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2190 0 R] ->> -endobj - -2190 0 obj -<< - /Type /StructElem - /S /Span - /P 2189 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [90] - /Pg 4899 0 R ->> -endobj - -2191 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2195 0 R 2194 0 R 2193 0 R 2192 0 R] ->> -endobj - -2192 0 obj -<< - /Type /StructElem - /S /Span - /P 2191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86 88] - /Pg 4899 0 R ->> -endobj - -2193 0 obj -<< - /Type /StructElem - /S /Strong - /P 2191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [89] - /Pg 4899 0 R ->> -endobj - -2194 0 obj -<< - /Type /StructElem - /S /Strong - /P 2191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [87] - /Pg 4899 0 R ->> -endobj - -2195 0 obj -<< - /Type /StructElem - /S /Strong - /P 2191 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4899 0 R ->> -endobj - -2196 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2197 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2198 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2199 0 R] ->> -endobj - -2199 0 obj -<< - /Type /StructElem - /S /Span - /P 2198 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4899 0 R ->> -endobj - -2200 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2202 0 R 2201 0 R] ->> -endobj - -2201 0 obj -<< - /Type /StructElem - /S /Span - /P 2200 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [83] - /Pg 4899 0 R ->> -endobj - -2202 0 obj -<< - /Type /StructElem - /S /Strong - /P 2200 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [82] - /Pg 4899 0 R ->> -endobj - -2203 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [2204 0 R] ->> -endobj - -2204 0 obj -<< - /Type /StructElem - /S /Span - /P 2203 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [81] - /Pg 4899 0 R ->> -endobj - -2205 0 obj -<< - /Type /StructElem - /S /Div - /P 2143 0 R - /K [] ->> -endobj - -2206 0 obj -<< - /Type /StructElem - /S /P - /P 2142 0 R - /K [2207 0 R 80] - /Pg 4899 0 R ->> -endobj - -2207 0 obj -<< - /Type /StructElem - /S /Strong - /P 2206 0 R - /K [79] - /Pg 4899 0 R ->> -endobj - -2208 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2216 0 R 58 59 2215 0 R 61 62 2214 0 R 64 2213 0 R 66 67 2212 0 R 69 2211 0 R 73 2210 0 R 75 76 2209 0 R 78] - /Pg 4899 0 R ->> -endobj - -2209 0 obj -<< - /Type /StructElem - /S /Link - /P 2208 0 R - /K [77 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4889 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2210 0 obj -<< - /Type /StructElem - /S /Code - /P 2208 0 R - /K [74] - /Pg 4899 0 R ->> -endobj - -2211 0 obj -<< - /Type /StructElem - /S /Formula - /P 2208 0 R - /K [70 71 72] - /Pg 4899 0 R ->> -endobj - -2212 0 obj -<< - /Type /StructElem - /S /Link - /P 2208 0 R - /K [68 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4888 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2213 0 obj -<< - /Type /StructElem - /S /Link - /P 2208 0 R - /K [65 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4887 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2214 0 obj -<< - /Type /StructElem - /S /Code - /P 2208 0 R - /K [63] - /Pg 4899 0 R ->> -endobj - -2215 0 obj -<< - /Type /StructElem - /S /Code - /P 2208 0 R - /K [60] - /Pg 4899 0 R ->> -endobj - -2216 0 obj -<< - /Type /StructElem - /S /Link - /P 2208 0 R - /K [57 << - /Type /OBJR - /Pg 4899 0 R - /Obj 4886 0 R - >>] - /Pg 4899 0 R ->> -endobj - -2217 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2320 0 R 2218 0 R] ->> -endobj - -2218 0 obj -<< - /Type /StructElem - /S /Div - /P 2217 0 R - /K [2319 0 R 2317 0 R 2314 0 R 2312 0 R 2311 0 R 2310 0 R 2303 0 R 2301 0 R 2300 0 R 2294 0 R 2292 0 R 2289 0 R 2287 0 R 2286 0 R 2285 0 R 2282 0 R 2280 0 R 2279 0 R 2278 0 R 2277 0 R 2270 0 R 2268 0 R 2267 0 R 2266 0 R 2259 0 R 2257 0 R 2256 0 R 2255 0 R 2253 0 R 2251 0 R 2250 0 R 2249 0 R 2245 0 R 2243 0 R 2242 0 R 2241 0 R 2240 0 R 2239 0 R 2233 0 R 2231 0 R 2230 0 R 2229 0 R 2228 0 R 2226 0 R 2224 0 R 2223 0 R 2220 0 R 2219 0 R] ->> -endobj - -2219 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2220 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2222 0 R 2221 0 R] ->> -endobj - -2221 0 obj -<< - /Type /StructElem - /S /Span - /P 2220 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [56] - /Pg 4899 0 R ->> -endobj - -2222 0 obj -<< - /Type /StructElem - /S /Strong - /P 2220 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [55] - /Pg 4899 0 R ->> -endobj - -2223 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2224 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2225 0 R] ->> -endobj - -2225 0 obj -<< - /Type /StructElem - /S /Span - /P 2224 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [54] - /Pg 4899 0 R ->> -endobj - -2226 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2227 0 R] ->> -endobj - -2227 0 obj -<< - /Type /StructElem - /S /Span - /P 2226 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [53] - /Pg 4899 0 R ->> -endobj - -2228 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2229 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2230 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2231 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2232 0 R] ->> -endobj - -2232 0 obj -<< - /Type /StructElem - /S /Span - /P 2231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [52] - /Pg 4899 0 R ->> -endobj - -2233 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2238 0 R 2237 0 R 2236 0 R 2235 0 R 2234 0 R] ->> -endobj - -2234 0 obj -<< - /Type /StructElem - /S /Formula - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [46 47 48 49 50 51] - /Pg 4899 0 R ->> -endobj - -2235 0 obj -<< - /Type /StructElem - /S /Span - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44 45] - /Pg 4899 0 R ->> -endobj - -2236 0 obj -<< - /Type /StructElem - /S /Code - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4899 0 R ->> -endobj - -2237 0 obj -<< - /Type /StructElem - /S /Span - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [42] - /Pg 4899 0 R ->> -endobj - -2238 0 obj -<< - /Type /StructElem - /S /Strong - /P 2233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41] - /Pg 4899 0 R ->> -endobj - -2239 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2240 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2241 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2242 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2243 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2244 0 R] ->> -endobj - -2244 0 obj -<< - /Type /StructElem - /S /Span - /P 2243 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [40] - /Pg 4899 0 R ->> -endobj - -2245 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2248 0 R 2247 0 R 2246 0 R] ->> -endobj - -2246 0 obj -<< - /Type /StructElem - /S /Span - /P 2245 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37 39] - /Pg 4899 0 R ->> -endobj - -2247 0 obj -<< - /Type /StructElem - /S /Strong - /P 2245 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [38] - /Pg 4899 0 R ->> -endobj - -2248 0 obj -<< - /Type /StructElem - /S /Strong - /P 2245 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4899 0 R ->> -endobj - -2249 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2250 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2251 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2252 0 R] ->> -endobj - -2252 0 obj -<< - /Type /StructElem - /S /Span - /P 2251 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [35] - /Pg 4899 0 R ->> -endobj - -2253 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2254 0 R] ->> -endobj - -2254 0 obj -<< - /Type /StructElem - /S /Span - /P 2253 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [34] - /Pg 4899 0 R ->> -endobj - -2255 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2256 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2257 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2258 0 R] ->> -endobj - -2258 0 obj -<< - /Type /StructElem - /S /Span - /P 2257 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4899 0 R ->> -endobj - -2259 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2265 0 R 2264 0 R 2263 0 R 2262 0 R 2261 0 R 2260 0 R] ->> -endobj - -2260 0 obj -<< - /Type /StructElem - /S /Formula - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24 25 26 27 28 29 30 31 32] - /Pg 4899 0 R ->> -endobj - -2261 0 obj -<< - /Type /StructElem - /S /Span - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [22 23] - /Pg 4899 0 R ->> -endobj - -2262 0 obj -<< - /Type /StructElem - /S /Formula - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [21] - /Pg 4899 0 R ->> -endobj - -2263 0 obj -<< - /Type /StructElem - /S /Span - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [20] - /Pg 4899 0 R ->> -endobj - -2264 0 obj -<< - /Type /StructElem - /S /Code - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [19] - /Pg 4899 0 R ->> -endobj - -2265 0 obj -<< - /Type /StructElem - /S /Span - /P 2259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18] - /Pg 4899 0 R ->> -endobj - -2266 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2267 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2268 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2269 0 R] ->> -endobj - -2269 0 obj -<< - /Type /StructElem - /S /Span - /P 2268 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4899 0 R ->> -endobj - -2270 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2276 0 R 2275 0 R 2274 0 R 2273 0 R 2272 0 R 2271 0 R] ->> -endobj - -2271 0 obj -<< - /Type /StructElem - /S /Formula - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13 14 15 16] - /Pg 4899 0 R ->> -endobj - -2272 0 obj -<< - /Type /StructElem - /S /Span - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11 12] - /Pg 4899 0 R ->> -endobj - -2273 0 obj -<< - /Type /StructElem - /S /Code - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4899 0 R ->> -endobj - -2274 0 obj -<< - /Type /StructElem - /S /Span - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [9] - /Pg 4899 0 R ->> -endobj - -2275 0 obj -<< - /Type /StructElem - /S /Formula - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [8] - /Pg 4899 0 R ->> -endobj - -2276 0 obj -<< - /Type /StructElem - /S /Span - /P 2270 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [7] - /Pg 4899 0 R ->> -endobj - -2277 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2278 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2279 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2280 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2281 0 R] ->> -endobj - -2281 0 obj -<< - /Type /StructElem - /S /Span - /P 2280 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [6] - /Pg 4899 0 R ->> -endobj - -2282 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2284 0 R 2283 0 R] ->> -endobj - -2283 0 obj -<< - /Type /StructElem - /S /Span - /P 2282 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [5] - /Pg 4899 0 R ->> -endobj - -2284 0 obj -<< - /Type /StructElem - /S /Strong - /P 2282 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4] - /Pg 4899 0 R ->> -endobj - -2285 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2286 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2287 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2288 0 R] ->> -endobj - -2288 0 obj -<< - /Type /StructElem - /S /Span - /P 2287 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3] - /Pg 4899 0 R ->> -endobj - -2289 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2291 0 R 2290 0 R] ->> -endobj - -2290 0 obj -<< - /Type /StructElem - /S /Span - /P 2289 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2] - /Pg 4899 0 R ->> -endobj - -2291 0 obj -<< - /Type /StructElem - /S /Strong - /P 2289 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4899 0 R ->> -endobj - -2292 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2293 0 R] ->> -endobj - -2293 0 obj -<< - /Type /StructElem - /S /Span - /P 2292 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4899 0 R ->> -endobj - -2294 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2299 0 R 2298 0 R 2297 0 R 2296 0 R 2295 0 R] ->> -endobj - -2295 0 obj -<< - /Type /StructElem - /S /Formula - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [248 249 250 251 252 253 254] - /Pg 4884 0 R ->> -endobj - -2296 0 obj -<< - /Type /StructElem - /S /Span - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [246 247] - /Pg 4884 0 R ->> -endobj - -2297 0 obj -<< - /Type /StructElem - /S /Code - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [245] - /Pg 4884 0 R ->> -endobj - -2298 0 obj -<< - /Type /StructElem - /S /Span - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [244] - /Pg 4884 0 R ->> -endobj - -2299 0 obj -<< - /Type /StructElem - /S /Strong - /P 2294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [243] - /Pg 4884 0 R ->> -endobj - -2300 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2301 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2302 0 R] ->> -endobj - -2302 0 obj -<< - /Type /StructElem - /S /Span - /P 2301 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [242] - /Pg 4884 0 R ->> -endobj - -2303 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2309 0 R 2308 0 R 2307 0 R 2306 0 R 2305 0 R 2304 0 R] ->> -endobj - -2304 0 obj -<< - /Type /StructElem - /S /Formula - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [238 239 240 241] - /Pg 4884 0 R ->> -endobj - -2305 0 obj -<< - /Type /StructElem - /S /Span - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [236 237] - /Pg 4884 0 R ->> -endobj - -2306 0 obj -<< - /Type /StructElem - /S /Code - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [235] - /Pg 4884 0 R ->> -endobj - -2307 0 obj -<< - /Type /StructElem - /S /Span - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [234] - /Pg 4884 0 R ->> -endobj - -2308 0 obj -<< - /Type /StructElem - /S /Formula - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [233] - /Pg 4884 0 R ->> -endobj - -2309 0 obj -<< - /Type /StructElem - /S /Span - /P 2303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [232] - /Pg 4884 0 R ->> -endobj - -2310 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2311 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2312 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2313 0 R] ->> -endobj - -2313 0 obj -<< - /Type /StructElem - /S /Span - /P 2312 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [231] - /Pg 4884 0 R ->> -endobj - -2314 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2316 0 R 2315 0 R] ->> -endobj - -2315 0 obj -<< - /Type /StructElem - /S /Span - /P 2314 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [230] - /Pg 4884 0 R ->> -endobj - -2316 0 obj -<< - /Type /StructElem - /S /Strong - /P 2314 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [229] - /Pg 4884 0 R ->> -endobj - -2317 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [2318 0 R] ->> -endobj - -2318 0 obj -<< - /Type /StructElem - /S /Span - /P 2317 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [228] - /Pg 4884 0 R ->> -endobj - -2319 0 obj -<< - /Type /StructElem - /S /Div - /P 2218 0 R - /K [] ->> -endobj - -2320 0 obj -<< - /Type /StructElem - /S /P - /P 2217 0 R - /K [2321 0 R 227] - /Pg 4884 0 R ->> -endobj - -2321 0 obj -<< - /Type /StructElem - /S /Strong - /P 2320 0 R - /K [226] - /Pg 4884 0 R ->> -endobj - -2322 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2332 0 R 190 2331 0 R 197 2330 0 R 200 2329 0 R 202 203 2328 0 R 205 2327 0 R 207 2326 0 R 209 2325 0 R 216 217 2324 0 R 222 223 2323 0 R 225] - /Pg 4884 0 R ->> -endobj - -2323 0 obj -<< - /Type /StructElem - /S /Code - /P 2322 0 R - /K [224] - /Pg 4884 0 R ->> -endobj - -2324 0 obj -<< - /Type /StructElem - /S /Formula - /P 2322 0 R - /K [218 219 220 221] - /Pg 4884 0 R ->> -endobj - -2325 0 obj -<< - /Type /StructElem - /S /Formula - /P 2322 0 R - /K [210 211 212 213 214 215] - /Pg 4884 0 R ->> -endobj - -2326 0 obj -<< - /Type /StructElem - /S /Code - /P 2322 0 R - /K [208] - /Pg 4884 0 R ->> -endobj - -2327 0 obj -<< - /Type /StructElem - /S /Link - /P 2322 0 R - /K [206 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4883 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2328 0 obj -<< - /Type /StructElem - /S /Code - /P 2322 0 R - /K [204] - /Pg 4884 0 R ->> -endobj - -2329 0 obj -<< - /Type /StructElem - /S /Link - /P 2322 0 R - /K [201 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4882 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2330 0 obj -<< - /Type /StructElem - /S /Formula - /P 2322 0 R - /K [198 199] - /Pg 4884 0 R ->> -endobj - -2331 0 obj -<< - /Type /StructElem - /S /Formula - /P 2322 0 R - /K [191 192 193 194 195 196] - /Pg 4884 0 R ->> -endobj - -2332 0 obj -<< - /Type /StructElem - /S /Strong - /P 2322 0 R - /K [189] - /Pg 4884 0 R ->> -endobj - -2333 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [140 2344 0 R 155 2343 0 R 157 158 2342 0 R 160 2341 0 R 165 2340 0 R 167 2339 0 R 175 2338 0 R 177 2337 0 R 179 2336 0 R 181 182 2335 0 R 184 185 2334 0 R 188] - /Pg 4884 0 R ->> -endobj - -2334 0 obj -<< - /Type /StructElem - /S /Em - /P 2333 0 R - /K [186 187] - /Pg 4884 0 R ->> -endobj - -2335 0 obj -<< - /Type /StructElem - /S /Em - /P 2333 0 R - /K [183] - /Pg 4884 0 R ->> -endobj - -2336 0 obj -<< - /Type /StructElem - /S /Code - /P 2333 0 R - /K [180] - /Pg 4884 0 R ->> -endobj - -2337 0 obj -<< - /Type /StructElem - /S /Formula - /P 2333 0 R - /K [178] - /Pg 4884 0 R ->> -endobj - -2338 0 obj -<< - /Type /StructElem - /S /Code - /P 2333 0 R - /K [176] - /Pg 4884 0 R ->> -endobj - -2339 0 obj -<< - /Type /StructElem - /S /Formula - /P 2333 0 R - /K [168 169 170 171 172 173 174] - /Pg 4884 0 R ->> -endobj - -2340 0 obj -<< - /Type /StructElem - /S /Code - /P 2333 0 R - /K [166] - /Pg 4884 0 R ->> -endobj - -2341 0 obj -<< - /Type /StructElem - /S /Formula - /P 2333 0 R - /K [161 162 163 164] - /Pg 4884 0 R ->> -endobj - -2342 0 obj -<< - /Type /StructElem - /S /Link - /P 2333 0 R - /K [159 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4881 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2343 0 obj -<< - /Type /StructElem - /S /Code - /P 2333 0 R - /K [156] - /Pg 4884 0 R ->> -endobj - -2344 0 obj -<< - /Type /StructElem - /S /Formula - /P 2333 0 R - /K [141 142 143 144 145 146 147 148 149 150 151 152 153 154] - /Pg 4884 0 R ->> -endobj - -2345 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2356 0 R 2351 0 R 2346 0 R] ->> -endobj - -2346 0 obj -<< - /Type /StructElem - /S /LI - /P 2345 0 R - /K [2350 0 R 2347 0 R] ->> -endobj - -2347 0 obj -<< - /Type /StructElem - /S /LBody - /P 2346 0 R - /K [2349 0 R 128 2348 0 R 139] - /Pg 4884 0 R ->> -endobj - -2348 0 obj -<< - /Type /StructElem - /S /Formula - /P 2347 0 R - /K [129 130 131 132 133 134 135 136 137 138] - /Pg 4884 0 R ->> -endobj - -2349 0 obj -<< - /Type /StructElem - /S /Code - /P 2347 0 R - /K [127] - /Pg 4884 0 R ->> -endobj - -2350 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2346 0 R - /K [126] - /Pg 4884 0 R ->> -endobj - -2351 0 obj -<< - /Type /StructElem - /S /LI - /P 2345 0 R - /K [2355 0 R 2352 0 R] ->> -endobj - -2352 0 obj -<< - /Type /StructElem - /S /LBody - /P 2351 0 R - /K [2354 0 R 116 2353 0 R 125] - /Pg 4884 0 R ->> -endobj - -2353 0 obj -<< - /Type /StructElem - /S /Formula - /P 2352 0 R - /K [117 118 119 120 121 122 123 124] - /Pg 4884 0 R ->> -endobj - -2354 0 obj -<< - /Type /StructElem - /S /Code - /P 2352 0 R - /K [115] - /Pg 4884 0 R ->> -endobj - -2355 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2351 0 R - /K [114] - /Pg 4884 0 R ->> -endobj - -2356 0 obj -<< - /Type /StructElem - /S /LI - /P 2345 0 R - /K [2360 0 R 2357 0 R] ->> -endobj - -2357 0 obj -<< - /Type /StructElem - /S /LBody - /P 2356 0 R - /K [2359 0 R 102 2358 0 R 113] - /Pg 4884 0 R ->> -endobj - -2358 0 obj -<< - /Type /StructElem - /S /Formula - /P 2357 0 R - /K [103 104 105 106 107 108 109 110 111 112] - /Pg 4884 0 R ->> -endobj - -2359 0 obj -<< - /Type /StructElem - /S /Code - /P 2357 0 R - /K [101] - /Pg 4884 0 R ->> -endobj - -2360 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2356 0 R - /K [100] - /Pg 4884 0 R ->> -endobj - -2361 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [96 2362 0 R 98 99] - /Pg 4884 0 R ->> -endobj - -2362 0 obj -<< - /Type /StructElem - /S /Link - /P 2361 0 R - /K [97 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4880 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2363 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Coeffect Operations) - /K [94 95] - /Pg 4884 0 R ->> -endobj - -2364 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2377 0 R 62 2376 0 R 64 65 2375 0 R 67 2374 0 R 69 2373 0 R 71 2372 0 R 73 2371 0 R 75 76 2370 0 R 78 79 2369 0 R 81 82 2368 0 R 86 2367 0 R 88 89 2366 0 R 91 2365 0 R 93] - /Pg 4884 0 R ->> -endobj - -2365 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [92] - /Pg 4884 0 R ->> -endobj - -2366 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [90] - /Pg 4884 0 R ->> -endobj - -2367 0 obj -<< - /Type /StructElem - /S /Link - /P 2364 0 R - /K [87 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4879 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2368 0 obj -<< - /Type /StructElem - /S /Formula - /P 2364 0 R - /K [83 84 85] - /Pg 4884 0 R ->> -endobj - -2369 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [80] - /Pg 4884 0 R ->> -endobj - -2370 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [77] - /Pg 4884 0 R ->> -endobj - -2371 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [74] - /Pg 4884 0 R ->> -endobj - -2372 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [72] - /Pg 4884 0 R ->> -endobj - -2373 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [70] - /Pg 4884 0 R ->> -endobj - -2374 0 obj -<< - /Type /StructElem - /S /Link - /P 2364 0 R - /K [68 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4878 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2375 0 obj -<< - /Type /StructElem - /S /Formula - /P 2364 0 R - /K [66] - /Pg 4884 0 R ->> -endobj - -2376 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [63] - /Pg 4884 0 R ->> -endobj - -2377 0 obj -<< - /Type /StructElem - /S /Code - /P 2364 0 R - /K [61] - /Pg 4884 0 R ->> -endobj - -2378 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [34 2387 0 R 36 2386 0 R 40 2385 0 R 42 43 44 2384 0 R 46 47 2383 0 R 49 2382 0 R 2381 0 R 55 56 2380 0 R 58 2379 0 R 60] - /Pg 4884 0 R ->> -endobj - -2379 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [59] - /Pg 4884 0 R ->> -endobj - -2380 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [57] - /Pg 4884 0 R ->> -endobj - -2381 0 obj -<< - /Type /StructElem - /S /Formula - /P 2378 0 R - /K [51 52 53 54] - /Pg 4884 0 R ->> -endobj - -2382 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [50] - /Pg 4884 0 R ->> -endobj - -2383 0 obj -<< - /Type /StructElem - /S /Link - /P 2378 0 R - /K [48 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4877 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2384 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [45] - /Pg 4884 0 R ->> -endobj - -2385 0 obj -<< - /Type /StructElem - /S /Link - /P 2378 0 R - /K [41 << - /Type /OBJR - /Pg 4884 0 R - /Obj 4876 0 R - >>] - /Pg 4884 0 R ->> -endobj - -2386 0 obj -<< - /Type /StructElem - /S /Formula - /P 2378 0 R - /K [37 38 39] - /Pg 4884 0 R ->> -endobj - -2387 0 obj -<< - /Type /StructElem - /S /Code - /P 2378 0 R - /K [35] - /Pg 4884 0 R ->> -endobj - -2388 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2527 0 R 2389 0 R] ->> -endobj - -2389 0 obj -<< - /Type /StructElem - /S /Div - /P 2388 0 R - /K [2526 0 R 2524 0 R 2521 0 R 2519 0 R 2518 0 R 2517 0 R 2513 0 R 2511 0 R 2510 0 R 2506 0 R 2504 0 R 2503 0 R 2500 0 R 2498 0 R 2497 0 R 2496 0 R 2495 0 R 2490 0 R 2488 0 R 2487 0 R 2486 0 R 2480 0 R 2478 0 R 2477 0 R 2476 0 R 2471 0 R 2469 0 R 2468 0 R 2465 0 R 2463 0 R 2460 0 R 2458 0 R 2457 0 R 2456 0 R 2452 0 R 2450 0 R 2449 0 R 2443 0 R 2441 0 R 2440 0 R 2437 0 R 2435 0 R 2434 0 R 2433 0 R 2432 0 R 2427 0 R 2425 0 R 2424 0 R 2423 0 R 2419 0 R 2417 0 R 2416 0 R 2415 0 R 2410 0 R 2408 0 R 2407 0 R 2406 0 R 2404 0 R 2402 0 R 2401 0 R 2397 0 R 2395 0 R 2394 0 R 2391 0 R 2390 0 R] ->> -endobj - -2390 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2391 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2393 0 R 2392 0 R] ->> -endobj - -2392 0 obj -<< - /Type /StructElem - /S /Span - /P 2391 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4884 0 R ->> -endobj - -2393 0 obj -<< - /Type /StructElem - /S /Strong - /P 2391 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [32] - /Pg 4884 0 R ->> -endobj - -2394 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2395 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2396 0 R] ->> -endobj - -2396 0 obj -<< - /Type /StructElem - /S /Span - /P 2395 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [31] - /Pg 4884 0 R ->> -endobj - -2397 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2400 0 R 2399 0 R 2398 0 R] ->> -endobj - -2398 0 obj -<< - /Type /StructElem - /S /Span - /P 2397 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30] - /Pg 4884 0 R ->> -endobj - -2399 0 obj -<< - /Type /StructElem - /S /Formula - /P 2397 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4884 0 R ->> -endobj - -2400 0 obj -<< - /Type /StructElem - /S /Span - /P 2397 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [28] - /Pg 4884 0 R ->> -endobj - -2401 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2402 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2403 0 R] ->> -endobj - -2403 0 obj -<< - /Type /StructElem - /S /Span - /P 2402 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [27] - /Pg 4884 0 R ->> -endobj - -2404 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2405 0 R] ->> -endobj - -2405 0 obj -<< - /Type /StructElem - /S /Span - /P 2404 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26] - /Pg 4884 0 R ->> -endobj - -2406 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2407 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2408 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2409 0 R] ->> -endobj - -2409 0 obj -<< - /Type /StructElem - /S /Span - /P 2408 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [25] - /Pg 4884 0 R ->> -endobj - -2410 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2414 0 R 2413 0 R 2412 0 R 2411 0 R] ->> -endobj - -2411 0 obj -<< - /Type /StructElem - /S /Span - /P 2410 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [22 24] - /Pg 4884 0 R ->> -endobj - -2412 0 obj -<< - /Type /StructElem - /S /Strong - /P 2410 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4884 0 R ->> -endobj - -2413 0 obj -<< - /Type /StructElem - /S /Formula - /P 2410 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [21] - /Pg 4884 0 R ->> -endobj - -2414 0 obj -<< - /Type /StructElem - /S /Span - /P 2410 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [20] - /Pg 4884 0 R ->> -endobj - -2415 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2416 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2417 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2418 0 R] ->> -endobj - -2418 0 obj -<< - /Type /StructElem - /S /Span - /P 2417 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [19] - /Pg 4884 0 R ->> -endobj - -2419 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2422 0 R 2421 0 R 2420 0 R] ->> -endobj - -2420 0 obj -<< - /Type /StructElem - /S /Span - /P 2419 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18] - /Pg 4884 0 R ->> -endobj - -2421 0 obj -<< - /Type /StructElem - /S /Formula - /P 2419 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4884 0 R ->> -endobj - -2422 0 obj -<< - /Type /StructElem - /S /Span - /P 2419 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [16] - /Pg 4884 0 R ->> -endobj - -2423 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2424 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2425 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2426 0 R] ->> -endobj - -2426 0 obj -<< - /Type /StructElem - /S /Span - /P 2425 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [15] - /Pg 4884 0 R ->> -endobj - -2427 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2431 0 R 2430 0 R 2429 0 R 2428 0 R] ->> -endobj - -2428 0 obj -<< - /Type /StructElem - /S /Span - /P 2427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11 13] - /Pg 4884 0 R ->> -endobj - -2429 0 obj -<< - /Type /StructElem - /S /Strong - /P 2427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14] - /Pg 4884 0 R ->> -endobj - -2430 0 obj -<< - /Type /StructElem - /S /Strong - /P 2427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [12] - /Pg 4884 0 R ->> -endobj - -2431 0 obj -<< - /Type /StructElem - /S /Strong - /P 2427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4884 0 R ->> -endobj - -2432 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2433 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2434 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2435 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2436 0 R] ->> -endobj - -2436 0 obj -<< - /Type /StructElem - /S /Span - /P 2435 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [9] - /Pg 4884 0 R ->> -endobj - -2437 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2439 0 R 2438 0 R] ->> -endobj - -2438 0 obj -<< - /Type /StructElem - /S /Span - /P 2437 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [8] - /Pg 4884 0 R ->> -endobj - -2439 0 obj -<< - /Type /StructElem - /S /Strong - /P 2437 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [7] - /Pg 4884 0 R ->> -endobj - -2440 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2441 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2442 0 R] ->> -endobj - -2442 0 obj -<< - /Type /StructElem - /S /Span - /P 2441 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [6] - /Pg 4884 0 R ->> -endobj - -2443 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2448 0 R 2447 0 R 2446 0 R 2445 0 R 2444 0 R] ->> -endobj - -2444 0 obj -<< - /Type /StructElem - /S /Span - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [5] - /Pg 4884 0 R ->> -endobj - -2445 0 obj -<< - /Type /StructElem - /S /Formula - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4] - /Pg 4884 0 R ->> -endobj - -2446 0 obj -<< - /Type /StructElem - /S /Span - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3] - /Pg 4884 0 R ->> -endobj - -2447 0 obj -<< - /Type /StructElem - /S /Formula - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2] - /Pg 4884 0 R ->> -endobj - -2448 0 obj -<< - /Type /StructElem - /S /Span - /P 2443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4884 0 R ->> -endobj - -2449 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2450 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2451 0 R] ->> -endobj - -2451 0 obj -<< - /Type /StructElem - /S /Span - /P 2450 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4884 0 R ->> -endobj - -2452 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2455 0 R 2454 0 R 2453 0 R] ->> -endobj - -2453 0 obj -<< - /Type /StructElem - /S /Span - /P 2452 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [195] - /Pg 4874 0 R ->> -endobj - -2454 0 obj -<< - /Type /StructElem - /S /Formula - /P 2452 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [194] - /Pg 4874 0 R ->> -endobj - -2455 0 obj -<< - /Type /StructElem - /S /Span - /P 2452 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [193] - /Pg 4874 0 R ->> -endobj - -2456 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2457 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2458 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2459 0 R] ->> -endobj - -2459 0 obj -<< - /Type /StructElem - /S /Span - /P 2458 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [192] - /Pg 4874 0 R ->> -endobj - -2460 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2462 0 R 2461 0 R] ->> -endobj - -2461 0 obj -<< - /Type /StructElem - /S /Span - /P 2460 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [191] - /Pg 4874 0 R ->> -endobj - -2462 0 obj -<< - /Type /StructElem - /S /Strong - /P 2460 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [190] - /Pg 4874 0 R ->> -endobj - -2463 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2464 0 R] ->> -endobj - -2464 0 obj -<< - /Type /StructElem - /S /Span - /P 2463 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [189] - /Pg 4874 0 R ->> -endobj - -2465 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2467 0 R 2466 0 R] ->> -endobj - -2466 0 obj -<< - /Type /StructElem - /S /Span - /P 2465 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [188] - /Pg 4874 0 R ->> -endobj - -2467 0 obj -<< - /Type /StructElem - /S /Strong - /P 2465 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [187] - /Pg 4874 0 R ->> -endobj - -2468 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2469 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2470 0 R] ->> -endobj - -2470 0 obj -<< - /Type /StructElem - /S /Span - /P 2469 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [186] - /Pg 4874 0 R ->> -endobj - -2471 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2475 0 R 2474 0 R 2473 0 R 2472 0 R] ->> -endobj - -2472 0 obj -<< - /Type /StructElem - /S /Span - /P 2471 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [182 184] - /Pg 4874 0 R ->> -endobj - -2473 0 obj -<< - /Type /StructElem - /S /Strong - /P 2471 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [185] - /Pg 4874 0 R ->> -endobj - -2474 0 obj -<< - /Type /StructElem - /S /Strong - /P 2471 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [183] - /Pg 4874 0 R ->> -endobj - -2475 0 obj -<< - /Type /StructElem - /S /Strong - /P 2471 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [181] - /Pg 4874 0 R ->> -endobj - -2476 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2477 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2478 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2479 0 R] ->> -endobj - -2479 0 obj -<< - /Type /StructElem - /S /Span - /P 2478 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [180] - /Pg 4874 0 R ->> -endobj - -2480 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2485 0 R 2484 0 R 2483 0 R 2482 0 R 2481 0 R] ->> -endobj - -2481 0 obj -<< - /Type /StructElem - /S /Span - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [179] - /Pg 4874 0 R ->> -endobj - -2482 0 obj -<< - /Type /StructElem - /S /Formula - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [178] - /Pg 4874 0 R ->> -endobj - -2483 0 obj -<< - /Type /StructElem - /S /Span - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [175 177] - /Pg 4874 0 R ->> -endobj - -2484 0 obj -<< - /Type /StructElem - /S /Strong - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [176] - /Pg 4874 0 R ->> -endobj - -2485 0 obj -<< - /Type /StructElem - /S /Strong - /P 2480 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [174] - /Pg 4874 0 R ->> -endobj - -2486 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2487 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2488 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2489 0 R] ->> -endobj - -2489 0 obj -<< - /Type /StructElem - /S /Span - /P 2488 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [173] - /Pg 4874 0 R ->> -endobj - -2490 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2494 0 R 2493 0 R 2492 0 R 2491 0 R] ->> -endobj - -2491 0 obj -<< - /Type /StructElem - /S /Span - /P 2490 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170 172] - /Pg 4874 0 R ->> -endobj - -2492 0 obj -<< - /Type /StructElem - /S /Strong - /P 2490 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [171] - /Pg 4874 0 R ->> -endobj - -2493 0 obj -<< - /Type /StructElem - /S /Formula - /P 2490 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4874 0 R ->> -endobj - -2494 0 obj -<< - /Type /StructElem - /S /Span - /P 2490 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [168] - /Pg 4874 0 R ->> -endobj - -2495 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2496 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2497 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2498 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2499 0 R] ->> -endobj - -2499 0 obj -<< - /Type /StructElem - /S /Span - /P 2498 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167] - /Pg 4874 0 R ->> -endobj - -2500 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2502 0 R 2501 0 R] ->> -endobj - -2501 0 obj -<< - /Type /StructElem - /S /Span - /P 2500 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [166] - /Pg 4874 0 R ->> -endobj - -2502 0 obj -<< - /Type /StructElem - /S /Strong - /P 2500 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [165] - /Pg 4874 0 R ->> -endobj - -2503 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2504 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2505 0 R] ->> -endobj - -2505 0 obj -<< - /Type /StructElem - /S /Span - /P 2504 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164] - /Pg 4874 0 R ->> -endobj - -2506 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2509 0 R 2508 0 R 2507 0 R] ->> -endobj - -2507 0 obj -<< - /Type /StructElem - /S /Span - /P 2506 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4874 0 R ->> -endobj - -2508 0 obj -<< - /Type /StructElem - /S /Formula - /P 2506 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [162] - /Pg 4874 0 R ->> -endobj - -2509 0 obj -<< - /Type /StructElem - /S /Span - /P 2506 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161] - /Pg 4874 0 R ->> -endobj - -2510 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2511 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2512 0 R] ->> -endobj - -2512 0 obj -<< - /Type /StructElem - /S /Span - /P 2511 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4874 0 R ->> -endobj - -2513 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2516 0 R 2515 0 R 2514 0 R] ->> -endobj - -2514 0 obj -<< - /Type /StructElem - /S /Span - /P 2513 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [159] - /Pg 4874 0 R ->> -endobj - -2515 0 obj -<< - /Type /StructElem - /S /Formula - /P 2513 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [158] - /Pg 4874 0 R ->> -endobj - -2516 0 obj -<< - /Type /StructElem - /S /Span - /P 2513 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157] - /Pg 4874 0 R ->> -endobj - -2517 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2518 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2519 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2520 0 R] ->> -endobj - -2520 0 obj -<< - /Type /StructElem - /S /Span - /P 2519 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4874 0 R ->> -endobj - -2521 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2523 0 R 2522 0 R] ->> -endobj - -2522 0 obj -<< - /Type /StructElem - /S /Span - /P 2521 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155] - /Pg 4874 0 R ->> -endobj - -2523 0 obj -<< - /Type /StructElem - /S /Strong - /P 2521 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4874 0 R ->> -endobj - -2524 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [2525 0 R] ->> -endobj - -2525 0 obj -<< - /Type /StructElem - /S /Span - /P 2524 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [153] - /Pg 4874 0 R ->> -endobj - -2526 0 obj -<< - /Type /StructElem - /S /Div - /P 2389 0 R - /K [] ->> -endobj - -2527 0 obj -<< - /Type /StructElem - /S /P - /P 2388 0 R - /K [2528 0 R 152] - /Pg 4874 0 R ->> -endobj - -2528 0 obj -<< - /Type /StructElem - /S /Strong - /P 2527 0 R - /K [151] - /Pg 4874 0 R ->> -endobj - -2529 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2535 0 R 138 2534 0 R 140 2533 0 R 144 2532 0 R 146 2531 0 R 148 2530 0 R 150] - /Pg 4874 0 R ->> -endobj - -2530 0 obj -<< - /Type /StructElem - /S /Code - /P 2529 0 R - /K [149] - /Pg 4874 0 R ->> -endobj - -2531 0 obj -<< - /Type /StructElem - /S /Formula - /P 2529 0 R - /K [147] - /Pg 4874 0 R ->> -endobj - -2532 0 obj -<< - /Type /StructElem - /S /Formula - /P 2529 0 R - /K [145] - /Pg 4874 0 R ->> -endobj - -2533 0 obj -<< - /Type /StructElem - /S /Formula - /P 2529 0 R - /K [141 142 143] - /Pg 4874 0 R ->> -endobj - -2534 0 obj -<< - /Type /StructElem - /S /Code - /P 2529 0 R - /K [139] - /Pg 4874 0 R ->> -endobj - -2535 0 obj -<< - /Type /StructElem - /S /Link - /P 2529 0 R - /K [137 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4873 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2536 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [98 2546 0 R 100 101 2545 0 R 103 104 2544 0 R 106 107 108 2543 0 R 110 2542 0 R 114 2541 0 R 116 117 2540 0 R 121 2539 0 R 126 127 2538 0 R 130 2537 0 R 134 135 136] - /Pg 4874 0 R ->> -endobj - -2537 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [131 132 133] - /Pg 4874 0 R ->> -endobj - -2538 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [128 129] - /Pg 4874 0 R ->> -endobj - -2539 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [122 123 124 125] - /Pg 4874 0 R ->> -endobj - -2540 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [118 119 120] - /Pg 4874 0 R ->> -endobj - -2541 0 obj -<< - /Type /StructElem - /S /Link - /P 2536 0 R - /K [115 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4872 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2542 0 obj -<< - /Type /StructElem - /S /Formula - /P 2536 0 R - /K [111 112 113] - /Pg 4874 0 R ->> -endobj - -2543 0 obj -<< - /Type /StructElem - /S /Code - /P 2536 0 R - /K [109] - /Pg 4874 0 R ->> -endobj - -2544 0 obj -<< - /Type /StructElem - /S /Code - /P 2536 0 R - /K [105] - /Pg 4874 0 R ->> -endobj - -2545 0 obj -<< - /Type /StructElem - /S /Code - /P 2536 0 R - /K [102] - /Pg 4874 0 R ->> -endobj - -2546 0 obj -<< - /Type /StructElem - /S /Link - /P 2536 0 R - /K [99 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4871 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2547 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Effect Tracking) - /K [96 97] - /Pg 4874 0 R ->> -endobj - -2548 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [85 2552 0 R 87 88 2551 0 R 90 91 2550 0 R 93 2549 0 R 95] - /Pg 4874 0 R ->> -endobj - -2549 0 obj -<< - /Type /StructElem - /S /Link - /P 2548 0 R - /K [94 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4870 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2550 0 obj -<< - /Type /StructElem - /S /Link - /P 2548 0 R - /K [92 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4869 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2551 0 obj -<< - /Type /StructElem - /S /Link - /P 2548 0 R - /K [89 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4868 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2552 0 obj -<< - /Type /StructElem - /S /Link - /P 2548 0 R - /K [86 << - /Type /OBJR - /Pg 4874 0 R - /Obj 4867 0 R - >>] - /Pg 4874 0 R ->> -endobj - -2553 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [2641 0 R 2554 0 R] ->> -endobj - -2554 0 obj -<< - /Type /StructElem - /S /Div - /P 2553 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2555 0 R] ->> -endobj - -2555 0 obj -<< - /Type /StructElem - /S /Table - /P 2554 0 R - /K [2638 0 R 2629 0 R 2556 0 R] ->> -endobj - -2556 0 obj -<< - /Type /StructElem - /S /TBody - /P 2555 0 R - /K [2627 0 R 2625 0 R 2620 0 R 2615 0 R 2610 0 R 2601 0 R 2594 0 R 2589 0 R 2584 0 R 2579 0 R 2574 0 R 2569 0 R 2564 0 R 2559 0 R 2557 0 R] ->> -endobj - -2557 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2558 0 R] ->> -endobj - -2558 0 obj -<< - /Type /StructElem - /S /TD - /P 2557 0 R - /A [<< - /O /Table - /Headers [(U1x0y1) (U1x1y1)] - /ColSpan 2 - >> << - /O /Layout - /BorderColor [0 0 0] - /BorderStyle [/None /Solid /None /None] - /BorderThickness [0 0.8 0 0] - >>] - /K [] ->> -endobj - -2559 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2562 0 R 2560 0 R] ->> -endobj - -2560 0 obj -<< - /Type /StructElem - /S /TD - /P 2559 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2561 0 R 83] - /Pg 4874 0 R ->> -endobj - -2561 0 obj -<< - /Type /StructElem - /S /Code - /P 2560 0 R - /K [82] - /Pg 4874 0 R ->> -endobj - -2562 0 obj -<< - /Type /StructElem - /S /TD - /P 2559 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2563 0 R] ->> -endobj - -2563 0 obj -<< - /Type /StructElem - /S /Formula - /P 2562 0 R - /K [81] - /Pg 4874 0 R ->> -endobj - -2564 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2567 0 R 2565 0 R] ->> -endobj - -2565 0 obj -<< - /Type /StructElem - /S /TD - /P 2564 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2566 0 R] ->> -endobj - -2566 0 obj -<< - /Type /StructElem - /S /Code - /P 2565 0 R - /K [80] - /Pg 4874 0 R ->> -endobj - -2567 0 obj -<< - /Type /StructElem - /S /TD - /P 2564 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2568 0 R] ->> -endobj - -2568 0 obj -<< - /Type /StructElem - /S /Formula - /P 2567 0 R - /K [75 76 77 78 79] - /Pg 4874 0 R ->> -endobj - -2569 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2572 0 R 2570 0 R] ->> -endobj - -2570 0 obj -<< - /Type /StructElem - /S /TD - /P 2569 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2571 0 R] ->> -endobj - -2571 0 obj -<< - /Type /StructElem - /S /Code - /P 2570 0 R - /K [74] - /Pg 4874 0 R ->> -endobj - -2572 0 obj -<< - /Type /StructElem - /S /TD - /P 2569 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2573 0 R] ->> -endobj - -2573 0 obj -<< - /Type /StructElem - /S /Formula - /P 2572 0 R - /K [70 71 72 73] - /Pg 4874 0 R ->> -endobj - -2574 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2577 0 R 2575 0 R] ->> -endobj - -2575 0 obj -<< - /Type /StructElem - /S /TD - /P 2574 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2576 0 R] ->> -endobj - -2576 0 obj -<< - /Type /StructElem - /S /Code - /P 2575 0 R - /K [69] - /Pg 4874 0 R ->> -endobj - -2577 0 obj -<< - /Type /StructElem - /S /TD - /P 2574 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2578 0 R] ->> -endobj - -2578 0 obj -<< - /Type /StructElem - /S /Formula - /P 2577 0 R - /K [65 66 67 68] - /Pg 4874 0 R ->> -endobj - -2579 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2582 0 R 2580 0 R] ->> -endobj - -2580 0 obj -<< - /Type /StructElem - /S /TD - /P 2579 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2581 0 R 64] - /Pg 4874 0 R ->> -endobj - -2581 0 obj -<< - /Type /StructElem - /S /Code - /P 2580 0 R - /K [63] - /Pg 4874 0 R ->> -endobj - -2582 0 obj -<< - /Type /StructElem - /S /TD - /P 2579 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2583 0 R] ->> -endobj - -2583 0 obj -<< - /Type /StructElem - /S /Formula - /P 2582 0 R - /K [61 62] - /Pg 4874 0 R ->> -endobj - -2584 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2587 0 R 2585 0 R] ->> -endobj - -2585 0 obj -<< - /Type /StructElem - /S /TD - /P 2584 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2586 0 R] ->> -endobj - -2586 0 obj -<< - /Type /StructElem - /S /Code - /P 2585 0 R - /K [60] - /Pg 4874 0 R ->> -endobj - -2587 0 obj -<< - /Type /StructElem - /S /TD - /P 2584 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2588 0 R] ->> -endobj - -2588 0 obj -<< - /Type /StructElem - /S /Formula - /P 2587 0 R - /K [54 55 56 57 58 59] - /Pg 4874 0 R ->> -endobj - -2589 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2592 0 R 2590 0 R] ->> -endobj - -2590 0 obj -<< - /Type /StructElem - /S /TD - /P 2589 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2591 0 R] ->> -endobj - -2591 0 obj -<< - /Type /StructElem - /S /Code - /P 2590 0 R - /K [53] - /Pg 4874 0 R ->> -endobj - -2592 0 obj -<< - /Type /StructElem - /S /TD - /P 2589 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2593 0 R] ->> -endobj - -2593 0 obj -<< - /Type /StructElem - /S /Formula - /P 2592 0 R - /K [47 48 49 50 51 52] - /Pg 4874 0 R ->> -endobj - -2594 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2598 0 R 2595 0 R] ->> -endobj - -2595 0 obj -<< - /Type /StructElem - /S /TD - /P 2594 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2597 0 R 45 2596 0 R] - /Pg 4874 0 R ->> -endobj - -2596 0 obj -<< - /Type /StructElem - /S /Code - /P 2595 0 R - /K [46] - /Pg 4874 0 R ->> -endobj - -2597 0 obj -<< - /Type /StructElem - /S /Code - /P 2595 0 R - /K [44] - /Pg 4874 0 R ->> -endobj - -2598 0 obj -<< - /Type /StructElem - /S /TD - /P 2594 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2600 0 R 37 2599 0 R] - /Pg 4874 0 R ->> -endobj - -2599 0 obj -<< - /Type /StructElem - /S /Formula - /P 2598 0 R - /K [38 39 40 41 42 43] - /Pg 4874 0 R ->> -endobj - -2600 0 obj -<< - /Type /StructElem - /S /Formula - /P 2598 0 R - /K [33 34 35 36] - /Pg 4874 0 R ->> -endobj - -2601 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2606 0 R 2602 0 R] ->> -endobj - -2602 0 obj -<< - /Type /StructElem - /S /TD - /P 2601 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2605 0 R 29 2604 0 R 31 2603 0 R] - /Pg 4874 0 R ->> -endobj - -2603 0 obj -<< - /Type /StructElem - /S /Code - /P 2602 0 R - /K [32] - /Pg 4874 0 R ->> -endobj - -2604 0 obj -<< - /Type /StructElem - /S /Code - /P 2602 0 R - /K [30] - /Pg 4874 0 R ->> -endobj - -2605 0 obj -<< - /Type /StructElem - /S /Code - /P 2602 0 R - /K [28] - /Pg 4874 0 R ->> -endobj - -2606 0 obj -<< - /Type /StructElem - /S /TD - /P 2601 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2609 0 R 22 2608 0 R 25 2607 0 R] - /Pg 4874 0 R ->> -endobj - -2607 0 obj -<< - /Type /StructElem - /S /Formula - /P 2606 0 R - /K [26 27] - /Pg 4874 0 R ->> -endobj - -2608 0 obj -<< - /Type /StructElem - /S /Formula - /P 2606 0 R - /K [23 24] - /Pg 4874 0 R ->> -endobj - -2609 0 obj -<< - /Type /StructElem - /S /Formula - /P 2606 0 R - /K [21] - /Pg 4874 0 R ->> -endobj - -2610 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2613 0 R 2611 0 R] ->> -endobj - -2611 0 obj -<< - /Type /StructElem - /S /TD - /P 2610 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2612 0 R] ->> -endobj - -2612 0 obj -<< - /Type /StructElem - /S /Code - /P 2611 0 R - /K [20] - /Pg 4874 0 R ->> -endobj - -2613 0 obj -<< - /Type /StructElem - /S /TD - /P 2610 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2614 0 R] ->> -endobj - -2614 0 obj -<< - /Type /StructElem - /S /Formula - /P 2613 0 R - /K [15 16 17 18 19] - /Pg 4874 0 R ->> -endobj - -2615 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2617 0 R 2616 0 R] ->> -endobj - -2616 0 obj -<< - /Type /StructElem - /S /TD - /P 2615 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [14] - /Pg 4874 0 R ->> -endobj - -2617 0 obj -<< - /Type /StructElem - /S /TD - /P 2615 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2619 0 R 10 2618 0 R] - /Pg 4874 0 R ->> -endobj - -2618 0 obj -<< - /Type /StructElem - /S /Formula - /P 2617 0 R - /K [11 12 13] - /Pg 4874 0 R ->> -endobj - -2619 0 obj -<< - /Type /StructElem - /S /Formula - /P 2617 0 R - /K [8 9] - /Pg 4874 0 R ->> -endobj - -2620 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2623 0 R 2621 0 R] ->> -endobj - -2621 0 obj -<< - /Type /StructElem - /S /TD - /P 2620 0 R - /A [<< - /O /Table - /Headers [(U1x1y1)] - >>] - /K [2622 0 R 7] - /Pg 4874 0 R ->> -endobj - -2622 0 obj -<< - /Type /StructElem - /S /Code - /P 2621 0 R - /K [6] - /Pg 4874 0 R ->> -endobj - -2623 0 obj -<< - /Type /StructElem - /S /TD - /P 2620 0 R - /A [<< - /O /Table - /Headers [(U1x0y1)] - >>] - /K [2624 0 R] ->> -endobj - -2624 0 obj -<< - /Type /StructElem - /S /Formula - /P 2623 0 R - /K [4 5] - /Pg 4874 0 R ->> -endobj - -2625 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2626 0 R] ->> -endobj - -2626 0 obj -<< - /Type /StructElem - /S /TD - /P 2625 0 R - /A [<< - /O /Table - /Headers [(U1x0y1) (U1x1y1)] - /ColSpan 2 - >> << - /O /Layout - /BorderColor [0 0 0] - /BorderStyle [/Solid /None /None /None] - /BorderThickness [0.4 0 0 0] - >>] - /K [] ->> -endobj - -2627 0 obj -<< - /Type /StructElem - /S /TR - /P 2556 0 R - /K [2628 0 R] ->> -endobj - -2628 0 obj -<< - /Type /StructElem - /S /TD - /P 2627 0 R - /A [<< - /O /Table - /Headers [(U1x0y1) (U1x1y1)] - /ColSpan 2 - >> << - /O /Layout - /BorderColor [0 0 0] - /BorderStyle [/None /Solid /None /None] - /BorderThickness [0 0.4 0 0] - >>] - /K [] ->> -endobj - -2629 0 obj -<< - /Type /StructElem - /S /TBody - /P 2555 0 R - /K [2630 0 R] ->> -endobj - -2630 0 obj -<< - /Type /StructElem - /S /TR - /P 2629 0 R - /K [2633 0 R 2631 0 R] ->> -endobj - -2631 0 obj -<< - /Type /StructElem - /S /TH - /P 2630 0 R - /ID (U1x1y1) - /A [<< - /O /Table - /Scope /Column - /Headers [] - >>] - /K [2632 0 R] ->> -endobj - -2632 0 obj -<< - /Type /StructElem - /S /Strong - /P 2631 0 R - /K [3] - /Pg 4874 0 R ->> -endobj - -2633 0 obj -<< - /Type /StructElem - /S /TH - /P 2630 0 R - /ID (U1x0y1) - /A [<< - /O /Table - /Scope /Column - /Headers [] - >>] - /K [2637 0 R 2635 0 R 2634 0 R] ->> -endobj - -2634 0 obj -<< - /Type /StructElem - /S /Strong - /P 2633 0 R - /K [2] - /Pg 4874 0 R ->> -endobj - -2635 0 obj -<< - /Type /StructElem - /S /Link - /P 2633 0 R - /K [2636 0 R << - /Type /OBJR - /Pg 4874 0 R - /Obj 4866 0 R - >>] ->> -endobj - -2636 0 obj -<< - /Type /StructElem - /S /Strong - /P 2635 0 R - /K [1] - /Pg 4874 0 R ->> -endobj - -2637 0 obj -<< - /Type /StructElem - /S /Strong - /P 2633 0 R - /K [0] - /Pg 4874 0 R ->> -endobj - -2638 0 obj -<< - /Type /StructElem - /S /TBody - /P 2555 0 R - /K [2639 0 R] ->> -endobj - -2639 0 obj -<< - /Type /StructElem - /S /TR - /P 2638 0 R - /K [2640 0 R] ->> -endobj - -2640 0 obj -<< - /Type /StructElem - /S /TD - /P 2639 0 R - /A [<< - /O /Table - /Headers [] - /ColSpan 2 - >> << - /O /Layout - /BorderColor [0 0 0] - /BorderStyle [/Solid /None /None /None] - /BorderThickness [0.8 0 0 0] - >>] - /K [] ->> -endobj - -2641 0 obj -<< - /Type /StructElem - /S /Caption - /P 2553 0 R - /K [2642 0 R] ->> -endobj - -2642 0 obj -<< - /Type /StructElem - /S /Span - /P 2641 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4874 0 R ->> -endobj - -2643 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [62 2660 0 R 64 65 2659 0 R 67 68 69 2658 0 R 71 2657 0 R 73 2656 0 R 75 2655 0 R 77 78 2654 0 R 80 2653 0 R 82 83 2652 0 R 85 86 87 2651 0 R 89 2650 0 R 91 2649 0 R 93 94 2648 0 R 100 2647 0 R 102 2646 0 R 104 2645 0 R 106 2644 0 R 108 109] - /Pg 4864 0 R ->> -endobj - -2644 0 obj -<< - /Type /StructElem - /S /Link - /P 2643 0 R - /K [107 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4863 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2645 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [105] - /Pg 4864 0 R ->> -endobj - -2646 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [103] - /Pg 4864 0 R ->> -endobj - -2647 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [101] - /Pg 4864 0 R ->> -endobj - -2648 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [95 96 97 98 99] - /Pg 4864 0 R ->> -endobj - -2649 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [92] - /Pg 4864 0 R ->> -endobj - -2650 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [90] - /Pg 4864 0 R ->> -endobj - -2651 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [88] - /Pg 4864 0 R ->> -endobj - -2652 0 obj -<< - /Type /StructElem - /S /Link - /P 2643 0 R - /K [84 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4862 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2653 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [81] - /Pg 4864 0 R ->> -endobj - -2654 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [79] - /Pg 4864 0 R ->> -endobj - -2655 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [76] - /Pg 4864 0 R ->> -endobj - -2656 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [74] - /Pg 4864 0 R ->> -endobj - -2657 0 obj -<< - /Type /StructElem - /S /Formula - /P 2643 0 R - /K [72] - /Pg 4864 0 R ->> -endobj - -2658 0 obj -<< - /Type /StructElem - /S /Code - /P 2643 0 R - /K [70] - /Pg 4864 0 R ->> -endobj - -2659 0 obj -<< - /Type /StructElem - /S /Link - /P 2643 0 R - /K [66 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4861 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2660 0 obj -<< - /Type /StructElem - /S /Em - /P 2643 0 R - /K [63] - /Pg 4864 0 R ->> -endobj - -2661 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2664 0 R 53 54 55 2663 0 R 57 58 2662 0 R 60 61] - /Pg 4864 0 R ->> -endobj - -2662 0 obj -<< - /Type /StructElem - /S /Code - /P 2661 0 R - /K [59] - /Pg 4864 0 R ->> -endobj - -2663 0 obj -<< - /Type /StructElem - /S /Code - /P 2661 0 R - /K [56] - /Pg 4864 0 R ->> -endobj - -2664 0 obj -<< - /Type /StructElem - /S /Link - /P 2661 0 R - /K [52 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4860 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2665 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Core Library) - /K [50 51] - /Pg 4864 0 R ->> -endobj - -2666 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [22 2675 0 R 24 2674 0 R 26 27 2673 0 R 29 30 31 32 33 2672 0 R 35 2671 0 R 37 38 2670 0 R 40 2669 0 R 42 43 44 2668 0 R 46 2667 0 R 48 49] - /Pg 4864 0 R ->> -endobj - -2667 0 obj -<< - /Type /StructElem - /S /Link - /P 2666 0 R - /K [47 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4859 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2668 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [45] - /Pg 4864 0 R ->> -endobj - -2669 0 obj -<< - /Type /StructElem - /S /Link - /P 2666 0 R - /K [41 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4858 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2670 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [39] - /Pg 4864 0 R ->> -endobj - -2671 0 obj -<< - /Type /StructElem - /S /Link - /P 2666 0 R - /K [36 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4857 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2672 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [34] - /Pg 4864 0 R ->> -endobj - -2673 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [28] - /Pg 4864 0 R ->> -endobj - -2674 0 obj -<< - /Type /StructElem - /S /Link - /P 2666 0 R - /K [25 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4856 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2675 0 obj -<< - /Type /StructElem - /S /Em - /P 2666 0 R - /K [23] - /Pg 4864 0 R ->> -endobj - -2676 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Implementation and Case Study) - /K [20 21] - /Pg 4864 0 R ->> -endobj - -2677 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [6 7 8 9 10 2679 0 R 12 13 14 2678 0 R 16 17 18 19] - /Pg 4864 0 R ->> -endobj - -2678 0 obj -<< - /Type /StructElem - /S /Link - /P 2677 0 R - /K [15 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4855 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2679 0 obj -<< - /Type /StructElem - /S /Link - /P 2677 0 R - /K [11 << - /Type /OBJR - /Pg 4864 0 R - /Obj 4854 0 R - >>] - /Pg 4864 0 R ->> -endobj - -2680 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3 4 5] - /Pg 4864 0 R ->> -endobj - -2681 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2685 0 R 89 90 91 92 2684 0 R 94 95 96 97 98 2683 0 R 100 101 102 2682 0 R 104 << - /Type /MCR - /MCID 0 - /Pg 4864 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4864 0 R - >>] - /Pg 4852 0 R ->> -endobj - -2682 0 obj -<< - /Type /StructElem - /S /Code - /P 2681 0 R - /K [103] - /Pg 4852 0 R ->> -endobj - -2683 0 obj -<< - /Type /StructElem - /S /Code - /P 2681 0 R - /K [99] - /Pg 4852 0 R ->> -endobj - -2684 0 obj -<< - /Type /StructElem - /S /Code - /P 2681 0 R - /K [93] - /Pg 4852 0 R ->> -endobj - -2685 0 obj -<< - /Type /StructElem - /S /Strong - /P 2681 0 R - /K [88] - /Pg 4852 0 R ->> -endobj - -2686 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2690 0 R 66 67 68 2689 0 R 70 2688 0 R 78 79 2687 0 R 81 82 83 84 85 86 87] - /Pg 4852 0 R ->> -endobj - -2687 0 obj -<< - /Type /StructElem - /S /Link - /P 2686 0 R - /K [80 << - /Type /OBJR - /Pg 4852 0 R - /Obj 4851 0 R - >>] - /Pg 4852 0 R ->> -endobj - -2688 0 obj -<< - /Type /StructElem - /S /Formula - /P 2686 0 R - /K [71 72 73 74 75 76 77] - /Pg 4852 0 R ->> -endobj - -2689 0 obj -<< - /Type /StructElem - /S /Code - /P 2686 0 R - /K [69] - /Pg 4852 0 R ->> -endobj - -2690 0 obj -<< - /Type /StructElem - /S /Strong - /P 2686 0 R - /K [65] - /Pg 4852 0 R ->> -endobj - -2691 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [63 64] - /Pg 4852 0 R ->> -endobj - -2692 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Situating the Context Paradigm) - /K [61 62] - /Pg 4852 0 R ->> -endobj - -2693 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [57 58 2694 0 R 60] - /Pg 4852 0 R ->> -endobj - -2694 0 obj -<< - /Type /StructElem - /S /Link - /P 2693 0 R - /K [59 << - /Type /OBJR - /Pg 4852 0 R - /Obj 4850 0 R - >>] - /Pg 4852 0 R ->> -endobj - -2695 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2706 0 R 2696 0 R] ->> -endobj - -2696 0 obj -<< - /Type /StructElem - /S /L - /P 2695 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2702 0 R 2697 0 R] ->> -endobj - -2697 0 obj -<< - /Type /StructElem - /S /LI - /P 2696 0 R - /K [2701 0 R 2698 0 R] ->> -endobj - -2698 0 obj -<< - /Type /StructElem - /S /LBody - /P 2697 0 R - /K [2700 0 R 52 53 2699 0 R 56] - /Pg 4852 0 R ->> -endobj - -2699 0 obj -<< - /Type /StructElem - /S /Formula - /P 2698 0 R - /K [54 55] - /Pg 4852 0 R ->> -endobj - -2700 0 obj -<< - /Type /StructElem - /S /Em - /P 2698 0 R - /K [51] - /Pg 4852 0 R ->> -endobj - -2701 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2697 0 R - /K [50] - /Pg 4852 0 R ->> -endobj - -2702 0 obj -<< - /Type /StructElem - /S /LI - /P 2696 0 R - /K [2705 0 R 2703 0 R] ->> -endobj - -2703 0 obj -<< - /Type /StructElem - /S /LBody - /P 2702 0 R - /K [2704 0 R 48 49] - /Pg 4852 0 R ->> -endobj - -2704 0 obj -<< - /Type /StructElem - /S /Em - /P 2703 0 R - /K [47] - /Pg 4852 0 R ->> -endobj - -2705 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2702 0 R - /K [46] - /Pg 4852 0 R ->> -endobj - -2706 0 obj -<< - /Type /StructElem - /S /P - /P 2695 0 R - /K [2709 0 R 37 2708 0 R 43 2707 0 R 45] - /Pg 4852 0 R ->> -endobj - -2707 0 obj -<< - /Type /StructElem - /S /Em - /P 2706 0 R - /K [44] - /Pg 4852 0 R ->> -endobj - -2708 0 obj -<< - /Type /StructElem - /S /Formula - /P 2706 0 R - /K [38 39 40 41 42] - /Pg 4852 0 R ->> -endobj - -2709 0 obj -<< - /Type /StructElem - /S /Strong - /P 2706 0 R - /K [34 35 36] - /Pg 4852 0 R ->> -endobj - -2710 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2714 0 R 24 2713 0 R 27 2712 0 R 29 30 2711 0 R 32 33] - /Pg 4852 0 R ->> -endobj - -2711 0 obj -<< - /Type /StructElem - /S /Em - /P 2710 0 R - /K [31] - /Pg 4852 0 R ->> -endobj - -2712 0 obj -<< - /Type /StructElem - /S /Em - /P 2710 0 R - /K [28] - /Pg 4852 0 R ->> -endobj - -2713 0 obj -<< - /Type /StructElem - /S /Formula - /P 2710 0 R - /K [25 26] - /Pg 4852 0 R ->> -endobj - -2714 0 obj -<< - /Type /StructElem - /S /Strong - /P 2710 0 R - /K [23] - /Pg 4852 0 R ->> -endobj - -2715 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2722 0 R 2719 0 R 2716 0 R] ->> -endobj - -2716 0 obj -<< - /Type /StructElem - /S /LI - /P 2715 0 R - /K [2718 0 R 2717 0 R] ->> -endobj - -2717 0 obj -<< - /Type /StructElem - /S /LBody - /P 2716 0 R - /K [19 20 21 22] - /Pg 4852 0 R ->> -endobj - -2718 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2716 0 R - /K [18] - /Pg 4852 0 R ->> -endobj - -2719 0 obj -<< - /Type /StructElem - /S /LI - /P 2715 0 R - /K [2721 0 R 2720 0 R] ->> -endobj - -2720 0 obj -<< - /Type /StructElem - /S /LBody - /P 2719 0 R - /K [16 17] - /Pg 4852 0 R ->> -endobj - -2721 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2719 0 R - /K [15] - /Pg 4852 0 R ->> -endobj - -2722 0 obj -<< - /Type /StructElem - /S /LI - /P 2715 0 R - /K [2724 0 R 2723 0 R] ->> -endobj - -2723 0 obj -<< - /Type /StructElem - /S /LBody - /P 2722 0 R - /K [14] - /Pg 4852 0 R ->> -endobj - -2724 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2722 0 R - /K [13] - /Pg 4852 0 R ->> -endobj - -2725 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2728 0 R 3 2727 0 R 6 7 8 2726 0 R 10 11 12] - /Pg 4852 0 R ->> -endobj - -2726 0 obj -<< - /Type /StructElem - /S /Formula - /P 2725 0 R - /K [9] - /Pg 4852 0 R ->> -endobj - -2727 0 obj -<< - /Type /StructElem - /S /Formula - /P 2725 0 R - /K [4 5] - /Pg 4852 0 R ->> -endobj - -2728 0 obj -<< - /Type /StructElem - /S /Strong - /P 2725 0 R - /K [2] - /Pg 4852 0 R ->> -endobj - -2729 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [107 2739 0 R 109 2738 0 R 112 2737 0 R 114 115 2736 0 R 117 118 119 2735 0 R 121 2734 0 R 123 2733 0 R 125 126 2732 0 R 128 2731 0 R 130 131 132 2730 0 R 134 << - /Type /MCR - /MCID 0 - /Pg 4852 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4852 0 R - >>] - /Pg 4848 0 R ->> -endobj - -2730 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [133] - /Pg 4848 0 R ->> -endobj - -2731 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [129] - /Pg 4848 0 R ->> -endobj - -2732 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [127] - /Pg 4848 0 R ->> -endobj - -2733 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [124] - /Pg 4848 0 R ->> -endobj - -2734 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [122] - /Pg 4848 0 R ->> -endobj - -2735 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [120] - /Pg 4848 0 R ->> -endobj - -2736 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [116] - /Pg 4848 0 R ->> -endobj - -2737 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [113] - /Pg 4848 0 R ->> -endobj - -2738 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [110 111] - /Pg 4848 0 R ->> -endobj - -2739 0 obj -<< - /Type /StructElem - /S /Formula - /P 2729 0 R - /K [108] - /Pg 4848 0 R ->> -endobj - -2740 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2756 0 R 2755 0 R 2754 0 R 2741 0 R] ->> -endobj - -2741 0 obj -<< - /Type /StructElem - /S /L - /P 2740 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2750 0 R 2746 0 R 2742 0 R] ->> -endobj - -2742 0 obj -<< - /Type /StructElem - /S /LI - /P 2741 0 R - /K [2745 0 R 2743 0 R] ->> -endobj - -2743 0 obj -<< - /Type /StructElem - /S /LBody - /P 2742 0 R - /K [2744 0 R 106] - /Pg 4848 0 R ->> -endobj - -2744 0 obj -<< - /Type /StructElem - /S /Formula - /P 2743 0 R - /K [105] - /Pg 4848 0 R ->> -endobj - -2745 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2742 0 R - /K [104] - /Pg 4848 0 R ->> -endobj - -2746 0 obj -<< - /Type /StructElem - /S /LI - /P 2741 0 R - /K [2749 0 R 2747 0 R] ->> -endobj - -2747 0 obj -<< - /Type /StructElem - /S /LBody - /P 2746 0 R - /K [2748 0 R 103] - /Pg 4848 0 R ->> -endobj - -2748 0 obj -<< - /Type /StructElem - /S /Formula - /P 2747 0 R - /K [100 101 102] - /Pg 4848 0 R ->> -endobj - -2749 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2746 0 R - /K [99] - /Pg 4848 0 R ->> -endobj - -2750 0 obj -<< - /Type /StructElem - /S /LI - /P 2741 0 R - /K [2753 0 R 2751 0 R] ->> -endobj - -2751 0 obj -<< - /Type /StructElem - /S /LBody - /P 2750 0 R - /K [2752 0 R 98] - /Pg 4848 0 R ->> -endobj - -2752 0 obj -<< - /Type /StructElem - /S /Formula - /P 2751 0 R - /K [97] - /Pg 4848 0 R ->> -endobj - -2753 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2750 0 R - /K [96] - /Pg 4848 0 R ->> -endobj - -2754 0 obj -<< - /Type /StructElem - /S /P - /P 2740 0 R - /K [95] - /Pg 4848 0 R ->> -endobj - -2755 0 obj -<< - /Type /StructElem - /S /Formula - /P 2740 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94] - /Pg 4848 0 R ->> -endobj - -2756 0 obj -<< - /Type /StructElem - /S /P - /P 2740 0 R - /K [2758 0 R 75 2757 0 R 78] - /Pg 4848 0 R ->> -endobj - -2757 0 obj -<< - /Type /StructElem - /S /Formula - /P 2756 0 R - /K [76 77] - /Pg 4848 0 R ->> -endobj - -2758 0 obj -<< - /Type /StructElem - /S /Strong - /P 2756 0 R - /K [72 73 74] - /Pg 4848 0 R ->> -endobj - -2759 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [60 2763 0 R 62 2762 0 R 65 2761 0 R 67 68 69 2760 0 R 71] - /Pg 4848 0 R ->> -endobj - -2760 0 obj -<< - /Type /StructElem - /S /Formula - /P 2759 0 R - /K [70] - /Pg 4848 0 R ->> -endobj - -2761 0 obj -<< - /Type /StructElem - /S /Link - /P 2759 0 R - /K [66 << - /Type /OBJR - /Pg 4848 0 R - /Obj 4847 0 R - >>] - /Pg 4848 0 R ->> -endobj - -2762 0 obj -<< - /Type /StructElem - /S /Formula - /P 2759 0 R - /K [63 64] - /Pg 4848 0 R ->> -endobj - -2763 0 obj -<< - /Type /StructElem - /S /Formula - /P 2759 0 R - /K [61] - /Pg 4848 0 R ->> -endobj - -2764 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Unified Context) - /K [58 59] - /Pg 4848 0 R ->> -endobj - -2765 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [50 2767 0 R 52 2766 0 R 54 55 56 57] - /Pg 4848 0 R ->> -endobj - -2766 0 obj -<< - /Type /StructElem - /S /Formula - /P 2765 0 R - /K [53] - /Pg 4848 0 R ->> -endobj - -2767 0 obj -<< - /Type /StructElem - /S /Link - /P 2765 0 R - /K [51 << - /Type /OBJR - /Pg 4848 0 R - /Obj 4846 0 R - >>] - /Pg 4848 0 R ->> -endobj - -2768 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (The Context Paradigm) - /K [48 49] - /Pg 4848 0 R ->> -endobj - -2769 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [44 45 46 47] - /Pg 4848 0 R ->> -endobj - -2770 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2783 0 R 2774 0 R 2771 0 R] ->> -endobj - -2771 0 obj -<< - /Type /StructElem - /S /LI - /P 2770 0 R - /K [2773 0 R 2772 0 R] ->> -endobj - -2772 0 obj -<< - /Type /StructElem - /S /LBody - /P 2771 0 R - /K [42 43] - /Pg 4848 0 R ->> -endobj - -2773 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2771 0 R - /K [41] - /Pg 4848 0 R ->> -endobj - -2774 0 obj -<< - /Type /StructElem - /S /LI - /P 2770 0 R - /K [2782 0 R 2775 0 R] ->> -endobj - -2775 0 obj -<< - /Type /StructElem - /S /LBody - /P 2774 0 R - /K [25 2781 0 R 27 2780 0 R 29 2779 0 R 31 32 33 2778 0 R 35 2777 0 R 37 38 2776 0 R 40] - /Pg 4848 0 R ->> -endobj - -2776 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [39] - /Pg 4848 0 R ->> -endobj - -2777 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [36] - /Pg 4848 0 R ->> -endobj - -2778 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [34] - /Pg 4848 0 R ->> -endobj - -2779 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [30] - /Pg 4848 0 R ->> -endobj - -2780 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [28] - /Pg 4848 0 R ->> -endobj - -2781 0 obj -<< - /Type /StructElem - /S /Code - /P 2775 0 R - /K [26] - /Pg 4848 0 R ->> -endobj - -2782 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2774 0 R - /K [24] - /Pg 4848 0 R ->> -endobj - -2783 0 obj -<< - /Type /StructElem - /S /LI - /P 2770 0 R - /K [2792 0 R 2784 0 R] ->> -endobj - -2784 0 obj -<< - /Type /StructElem - /S /LBody - /P 2783 0 R - /K [7 2791 0 R 9 2790 0 R 11 2789 0 R 13 14 2788 0 R 16 2787 0 R 18 2786 0 R 20 21 2785 0 R 23] - /Pg 4848 0 R ->> -endobj - -2785 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [22] - /Pg 4848 0 R ->> -endobj - -2786 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [19] - /Pg 4848 0 R ->> -endobj - -2787 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [17] - /Pg 4848 0 R ->> -endobj - -2788 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [15] - /Pg 4848 0 R ->> -endobj - -2789 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [12] - /Pg 4848 0 R ->> -endobj - -2790 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [10] - /Pg 4848 0 R ->> -endobj - -2791 0 obj -<< - /Type /StructElem - /S /Code - /P 2784 0 R - /K [8] - /Pg 4848 0 R ->> -endobj - -2792 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2783 0 R - /K [6] - /Pg 4848 0 R ->> -endobj - -2793 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [5] - /Pg 4848 0 R ->> -endobj - -2794 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [2801 0 R 2795 0 R] ->> -endobj - -2795 0 obj -<< - /Type /StructElem - /S /Div - /P 2794 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2796 0 R] ->> -endobj - -2796 0 obj -<< - /Type /StructElem - /S /P - /P 2795 0 R - /K [2800 0 R 2799 0 R 2798 0 R 2797 0 R] ->> -endobj - -2797 0 obj -<< - /Type /StructElem - /S /Code - /P 2796 0 R - /K [3] - /Pg 4848 0 R ->> -endobj - -2798 0 obj -<< - /Type /StructElem - /S /Code - /P 2796 0 R - /K [2] - /Pg 4848 0 R ->> -endobj - -2799 0 obj -<< - /Type /StructElem - /S /Code - /P 2796 0 R - /K [1] - /Pg 4848 0 R ->> -endobj - -2800 0 obj -<< - /Type /StructElem - /S /Code - /P 2796 0 R - /K [0] - /Pg 4848 0 R ->> -endobj - -2801 0 obj -<< - /Type /StructElem - /S /Caption - /P 2794 0 R - /K [2802 0 R] ->> -endobj - -2802 0 obj -<< - /Type /StructElem - /S /Span - /P 2801 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4] - /Pg 4848 0 R ->> -endobj - -2803 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [172 2810 0 R 174 2809 0 R 176 177 2808 0 R 179 180 181 2807 0 R 183 2806 0 R 185 186 187 2805 0 R 189 190 2804 0 R 192] - /Pg 4844 0 R ->> -endobj - -2804 0 obj -<< - /Type /StructElem - /S /Link - /P 2803 0 R - /K [191 << - /Type /OBJR - /Pg 4844 0 R - /Obj 4843 0 R - >>] - /Pg 4844 0 R ->> -endobj - -2805 0 obj -<< - /Type /StructElem - /S /Em - /P 2803 0 R - /K [188] - /Pg 4844 0 R ->> -endobj - -2806 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [184] - /Pg 4844 0 R ->> -endobj - -2807 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [182] - /Pg 4844 0 R ->> -endobj - -2808 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [178] - /Pg 4844 0 R ->> -endobj - -2809 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [175] - /Pg 4844 0 R ->> -endobj - -2810 0 obj -<< - /Type /StructElem - /S /Code - /P 2803 0 R - /K [173] - /Pg 4844 0 R ->> -endobj - -2811 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [159 160 161 2813 0 R 166 167 2812 0 R 169 170 171] - /Pg 4844 0 R ->> -endobj - -2812 0 obj -<< - /Type /StructElem - /S /Formula - /P 2811 0 R - /K [168] - /Pg 4844 0 R ->> -endobj - -2813 0 obj -<< - /Type /StructElem - /S /Formula - /P 2811 0 R - /K [162 163 164 165] - /Pg 4844 0 R ->> -endobj - -2814 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Asynchrony) - /K [157 158] - /Pg 4844 0 R ->> -endobj - -2815 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [2832 0 R 2816 0 R] ->> -endobj - -2816 0 obj -<< - /Type /StructElem - /S /Div - /P 2815 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2817 0 R] ->> -endobj - -2817 0 obj -<< - /Type /StructElem - /S /P - /P 2816 0 R - /K [2831 0 R 2830 0 R 2829 0 R 2828 0 R 2827 0 R 2826 0 R 2825 0 R 2824 0 R 2823 0 R 2822 0 R 2821 0 R 2820 0 R 2819 0 R 2818 0 R] ->> -endobj - -2818 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [147 148 149 150 151 152 153 154 155] - /Pg 4844 0 R ->> -endobj - -2819 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [146] - /Pg 4844 0 R ->> -endobj - -2820 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [137 138 139 140 141 142 143 144 145] - /Pg 4844 0 R ->> -endobj - -2821 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [136] - /Pg 4844 0 R ->> -endobj - -2822 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [127 128 129 130 131 132 133 134 135] - /Pg 4844 0 R ->> -endobj - -2823 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [126] - /Pg 4844 0 R ->> -endobj - -2824 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [117 118 119 120 121 122 123 124 125] - /Pg 4844 0 R ->> -endobj - -2825 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [116] - /Pg 4844 0 R ->> -endobj - -2826 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [107 108 109 110 111 112 113 114 115] - /Pg 4844 0 R ->> -endobj - -2827 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [106] - /Pg 4844 0 R ->> -endobj - -2828 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [97 98 99 100 101 102 103 104 105] - /Pg 4844 0 R ->> -endobj - -2829 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [96] - /Pg 4844 0 R ->> -endobj - -2830 0 obj -<< - /Type /StructElem - /S /Formula - /P 2817 0 R - /K [95] - /Pg 4844 0 R ->> -endobj - -2831 0 obj -<< - /Type /StructElem - /S /Code - /P 2817 0 R - /K [94] - /Pg 4844 0 R ->> -endobj - -2832 0 obj -<< - /Type /StructElem - /S /Caption - /P 2815 0 R - /K [2833 0 R] ->> -endobj - -2833 0 obj -<< - /Type /StructElem - /S /Span - /P 2832 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4844 0 R ->> -endobj - -2834 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [81 2839 0 R 83 2838 0 R 85 86 87 2837 0 R 89 2836 0 R 91 2835 0 R 93] - /Pg 4844 0 R ->> -endobj - -2835 0 obj -<< - /Type /StructElem - /S /Link - /P 2834 0 R - /K [92 << - /Type /OBJR - /Pg 4844 0 R - /Obj 4842 0 R - >>] - /Pg 4844 0 R ->> -endobj - -2836 0 obj -<< - /Type /StructElem - /S /Code - /P 2834 0 R - /K [90] - /Pg 4844 0 R ->> -endobj - -2837 0 obj -<< - /Type /StructElem - /S /Code - /P 2834 0 R - /K [88] - /Pg 4844 0 R ->> -endobj - -2838 0 obj -<< - /Type /StructElem - /S /Code - /P 2834 0 R - /K [84] - /Pg 4844 0 R ->> -endobj - -2839 0 obj -<< - /Type /StructElem - /S /Code - /P 2834 0 R - /K [82] - /Pg 4844 0 R ->> -endobj - -2840 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [65 2844 0 R 68 2843 0 R 71 72 2842 0 R 75 2841 0 R 78 79 80] - /Pg 4844 0 R ->> -endobj - -2841 0 obj -<< - /Type /StructElem - /S /Formula - /P 2840 0 R - /K [76 77] - /Pg 4844 0 R ->> -endobj - -2842 0 obj -<< - /Type /StructElem - /S /Formula - /P 2840 0 R - /K [73 74] - /Pg 4844 0 R ->> -endobj - -2843 0 obj -<< - /Type /StructElem - /S /Formula - /P 2840 0 R - /K [69 70] - /Pg 4844 0 R ->> -endobj - -2844 0 obj -<< - /Type /StructElem - /S /Formula - /P 2840 0 R - /K [66 67] - /Pg 4844 0 R ->> -endobj - -2845 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [30 2848 0 R 59 2847 0 R 61 2846 0 R 64] - /Pg 4844 0 R ->> -endobj - -2846 0 obj -<< - /Type /StructElem - /S /Formula - /P 2845 0 R - /K [62 63] - /Pg 4844 0 R ->> -endobj - -2847 0 obj -<< - /Type /StructElem - /S /Code - /P 2845 0 R - /K [60] - /Pg 4844 0 R ->> -endobj - -2848 0 obj -<< - /Type /StructElem - /S /Formula - /P 2845 0 R - /K [31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58] - /Pg 4844 0 R ->> -endobj - -2849 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29] - /Pg 4844 0 R ->> -endobj - -2850 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [0 2853 0 R 2 3 2852 0 R 10 2851 0 R 12] - /Pg 4844 0 R ->> -endobj - -2851 0 obj -<< - /Type /StructElem - /S /Formula - /P 2850 0 R - /K [11] - /Pg 4844 0 R ->> -endobj - -2852 0 obj -<< - /Type /StructElem - /S /Formula - /P 2850 0 R - /K [4 5 6 7 8 9] - /Pg 4844 0 R ->> -endobj - -2853 0 obj -<< - /Type /StructElem - /S /Em - /P 2850 0 R - /K [1] - /Pg 4844 0 R ->> -endobj - -2854 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [226 2866 0 R 228 2865 0 R 230 2864 0 R 232 2863 0 R 234 2862 0 R 236 2861 0 R 238 2860 0 R 240 241 2859 0 R 243 2858 0 R 245 2857 0 R 247 2856 0 R 249 2855 0 R 251] - /Pg 4840 0 R ->> -endobj - -2855 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [250] - /Pg 4840 0 R ->> -endobj - -2856 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [248] - /Pg 4840 0 R ->> -endobj - -2857 0 obj -<< - /Type /StructElem - /S /Formula - /P 2854 0 R - /K [246] - /Pg 4840 0 R ->> -endobj - -2858 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [244] - /Pg 4840 0 R ->> -endobj - -2859 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [242] - /Pg 4840 0 R ->> -endobj - -2860 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [239] - /Pg 4840 0 R ->> -endobj - -2861 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [237] - /Pg 4840 0 R ->> -endobj - -2862 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [235] - /Pg 4840 0 R ->> -endobj - -2863 0 obj -<< - /Type /StructElem - /S /Formula - /P 2854 0 R - /K [233] - /Pg 4840 0 R ->> -endobj - -2864 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [231] - /Pg 4840 0 R ->> -endobj - -2865 0 obj -<< - /Type /StructElem - /S /Formula - /P 2854 0 R - /K [229] - /Pg 4840 0 R ->> -endobj - -2866 0 obj -<< - /Type /StructElem - /S /Code - /P 2854 0 R - /K [227] - /Pg 4840 0 R ->> -endobj - -2867 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Coherence) - /K [224 225] - /Pg 4840 0 R ->> -endobj - -2868 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [178 2876 0 R 182 183 2875 0 R 185 2874 0 R 203 204 2873 0 R 212 2872 0 R 214 2871 0 R 216 2870 0 R 218 2869 0 R 220 221 222 223] - /Pg 4840 0 R ->> -endobj - -2869 0 obj -<< - /Type /StructElem - /S /Code - /P 2868 0 R - /K [219] - /Pg 4840 0 R ->> -endobj - -2870 0 obj -<< - /Type /StructElem - /S /Code - /P 2868 0 R - /K [217] - /Pg 4840 0 R ->> -endobj - -2871 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [215] - /Pg 4840 0 R ->> -endobj - -2872 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [213] - /Pg 4840 0 R ->> -endobj - -2873 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [205 206 207 208 209 210 211] - /Pg 4840 0 R ->> -endobj - -2874 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202] - /Pg 4840 0 R ->> -endobj - -2875 0 obj -<< - /Type /StructElem - /S /Em - /P 2868 0 R - /K [184] - /Pg 4840 0 R ->> -endobj - -2876 0 obj -<< - /Type /StructElem - /S /Formula - /P 2868 0 R - /K [179 180 181] - /Pg 4840 0 R ->> -endobj - -2877 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [170 2879 0 R 173 2878 0 R 175 176 177] - /Pg 4840 0 R ->> -endobj - -2878 0 obj -<< - /Type /StructElem - /S /Code - /P 2877 0 R - /K [174] - /Pg 4840 0 R ->> -endobj - -2879 0 obj -<< - /Type /StructElem - /S /Formula - /P 2877 0 R - /K [171 172] - /Pg 4840 0 R ->> -endobj - -2880 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [2887 0 R 2881 0 R] ->> -endobj - -2881 0 obj -<< - /Type /StructElem - /S /Div - /P 2880 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2882 0 R] ->> -endobj - -2882 0 obj -<< - /Type /StructElem - /S /P - /P 2881 0 R - /K [2886 0 R 2885 0 R 2884 0 R 2883 0 R] ->> -endobj - -2883 0 obj -<< - /Type /StructElem - /S /Code - /P 2882 0 R - /K [168] - /Pg 4840 0 R ->> -endobj - -2884 0 obj -<< - /Type /StructElem - /S /Code - /P 2882 0 R - /K [167] - /Pg 4840 0 R ->> -endobj - -2885 0 obj -<< - /Type /StructElem - /S /Code - /P 2882 0 R - /K [166] - /Pg 4840 0 R ->> -endobj - -2886 0 obj -<< - /Type /StructElem - /S /Code - /P 2882 0 R - /K [165] - /Pg 4840 0 R ->> -endobj - -2887 0 obj -<< - /Type /StructElem - /S /Caption - /P 2880 0 R - /K [2888 0 R] ->> -endobj - -2888 0 obj -<< - /Type /StructElem - /S /Span - /P 2887 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4840 0 R ->> -endobj - -2889 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [141 2895 0 R 143 144 145 2894 0 R 2893 0 R 151 152 2892 0 R 154 155 156 2891 0 R 158 159 2890 0 R 161 162 163 164] - /Pg 4840 0 R ->> -endobj - -2890 0 obj -<< - /Type /StructElem - /S /Link - /P 2889 0 R - /K [160 << - /Type /OBJR - /Pg 4840 0 R - /Obj 4839 0 R - >>] - /Pg 4840 0 R ->> -endobj - -2891 0 obj -<< - /Type /StructElem - /S /Code - /P 2889 0 R - /K [157] - /Pg 4840 0 R ->> -endobj - -2892 0 obj -<< - /Type /StructElem - /S /Link - /P 2889 0 R - /K [153 << - /Type /OBJR - /Pg 4840 0 R - /Obj 4838 0 R - >>] - /Pg 4840 0 R ->> -endobj - -2893 0 obj -<< - /Type /StructElem - /S /Formula - /P 2889 0 R - /K [147 148 149 150] - /Pg 4840 0 R ->> -endobj - -2894 0 obj -<< - /Type /StructElem - /S /Code - /P 2889 0 R - /K [146] - /Pg 4840 0 R ->> -endobj - -2895 0 obj -<< - /Type /StructElem - /S /Em - /P 2889 0 R - /K [142] - /Pg 4840 0 R ->> -endobj - -2896 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [124 2899 0 R 126 2898 0 R 128 129 130 2897 0 R 140] - /Pg 4840 0 R ->> -endobj - -2897 0 obj -<< - /Type /StructElem - /S /Formula - /P 2896 0 R - /K [131 132 133 134 135 136 137 138 139] - /Pg 4840 0 R ->> -endobj - -2898 0 obj -<< - /Type /StructElem - /S /Formula - /P 2896 0 R - /K [127] - /Pg 4840 0 R ->> -endobj - -2899 0 obj -<< - /Type /StructElem - /S /Formula - /P 2896 0 R - /K [125] - /Pg 4840 0 R ->> -endobj - -2900 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2934 0 R 2901 0 R] ->> -endobj - -2901 0 obj -<< - /Type /StructElem - /S /Div - /P 2900 0 R - /K [2932 0 R 2930 0 R 2928 0 R 2926 0 R 2924 0 R 2922 0 R 2920 0 R 2918 0 R 2916 0 R 2914 0 R 2912 0 R 2910 0 R 2908 0 R 2902 0 R] ->> -endobj - -2902 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2907 0 R 2906 0 R 2905 0 R 2904 0 R 2903 0 R] ->> -endobj - -2903 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113 114 115 116 117 118 119 120 121 122 123] - /Pg 4840 0 R ->> -endobj - -2904 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112] - /Pg 4840 0 R ->> -endobj - -2905 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85] - /Pg 4840 0 R ->> -endobj - -2906 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [66 67] - /Pg 4840 0 R ->> -endobj - -2907 0 obj -<< - /Type /StructElem - /S /Formula - /P 2902 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [52 53 54 55 56 57 58 59 60 61 62 63 64 65] - /Pg 4840 0 R ->> -endobj - -2908 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2909 0 R] ->> -endobj - -2909 0 obj -<< - /Type /StructElem - /S /Formula - /P 2908 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [51] - /Pg 4840 0 R ->> -endobj - -2910 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2911 0 R] ->> -endobj - -2911 0 obj -<< - /Type /StructElem - /S /Formula - /P 2910 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [46 47 48 49 50] - /Pg 4840 0 R ->> -endobj - -2912 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2913 0 R] ->> -endobj - -2913 0 obj -<< - /Type /StructElem - /S /Formula - /P 2912 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [45] - /Pg 4840 0 R ->> -endobj - -2914 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2915 0 R] ->> -endobj - -2915 0 obj -<< - /Type /StructElem - /S /Formula - /P 2914 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44] - /Pg 4840 0 R ->> -endobj - -2916 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2917 0 R] ->> -endobj - -2917 0 obj -<< - /Type /StructElem - /S /Formula - /P 2916 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4840 0 R ->> -endobj - -2918 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2919 0 R] ->> -endobj - -2919 0 obj -<< - /Type /StructElem - /S /Formula - /P 2918 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [40 41 42] - /Pg 4840 0 R ->> -endobj - -2920 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2921 0 R] ->> -endobj - -2921 0 obj -<< - /Type /StructElem - /S /Formula - /P 2920 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37 38 39] - /Pg 4840 0 R ->> -endobj - -2922 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2923 0 R] ->> -endobj - -2923 0 obj -<< - /Type /StructElem - /S /Formula - /P 2922 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4840 0 R ->> -endobj - -2924 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2925 0 R] ->> -endobj - -2925 0 obj -<< - /Type /StructElem - /S /Formula - /P 2924 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [34 35] - /Pg 4840 0 R ->> -endobj - -2926 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2927 0 R] ->> -endobj - -2927 0 obj -<< - /Type /StructElem - /S /Formula - /P 2926 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33] - /Pg 4840 0 R ->> -endobj - -2928 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2929 0 R] ->> -endobj - -2929 0 obj -<< - /Type /StructElem - /S /Formula - /P 2928 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30 31 32] - /Pg 4840 0 R ->> -endobj - -2930 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2931 0 R] ->> -endobj - -2931 0 obj -<< - /Type /StructElem - /S /Formula - /P 2930 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4840 0 R ->> -endobj - -2932 0 obj -<< - /Type /StructElem - /S /Div - /P 2901 0 R - /K [2933 0 R] ->> -endobj - -2933 0 obj -<< - /Type /StructElem - /S /Formula - /P 2932 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [26 27 28] - /Pg 4840 0 R ->> -endobj - -2934 0 obj -<< - /Type /StructElem - /S /P - /P 2900 0 R - /K [2936 0 R 21 2935 0 R 25] - /Pg 4840 0 R ->> -endobj - -2935 0 obj -<< - /Type /StructElem - /S /Formula - /P 2934 0 R - /K [22 23 24] - /Pg 4840 0 R ->> -endobj - -2936 0 obj -<< - /Type /StructElem - /S /Strong - /P 2934 0 R - /K [18 19 20] - /Pg 4840 0 R ->> -endobj - -2937 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [9 2939 0 R 13 2938 0 R 16 17] - /Pg 4840 0 R ->> -endobj - -2938 0 obj -<< - /Type /StructElem - /S /Formula - /P 2937 0 R - /K [14 15] - /Pg 4840 0 R ->> -endobj - -2939 0 obj -<< - /Type /StructElem - /S /Formula - /P 2937 0 R - /K [10 11 12] - /Pg 4840 0 R ->> -endobj - -2940 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2968 0 R 2967 0 R 2964 0 R 2941 0 R] ->> -endobj - -2941 0 obj -<< - /Type /StructElem - /S /L - /P 2940 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2960 0 R 2956 0 R 2951 0 R 2942 0 R] ->> -endobj - -2942 0 obj -<< - /Type /StructElem - /S /L - /P 2941 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [2947 0 R 2943 0 R] ->> -endobj - -2943 0 obj -<< - /Type /StructElem - /S /LI - /P 2942 0 R - /K [2946 0 R 2944 0 R] ->> -endobj - -2944 0 obj -<< - /Type /StructElem - /S /LBody - /P 2943 0 R - /K [2945 0 R 8] - /Pg 4840 0 R ->> -endobj - -2945 0 obj -<< - /Type /StructElem - /S /Formula - /P 2944 0 R - /K [4 5 6 7] - /Pg 4840 0 R ->> -endobj - -2946 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2943 0 R - /K [3] - /Pg 4840 0 R ->> -endobj - -2947 0 obj -<< - /Type /StructElem - /S /LI - /P 2942 0 R - /K [2950 0 R 2948 0 R] ->> -endobj - -2948 0 obj -<< - /Type /StructElem - /S /LBody - /P 2947 0 R - /K [2949 0 R 2] - /Pg 4840 0 R ->> -endobj - -2949 0 obj -<< - /Type /StructElem - /S /Formula - /P 2948 0 R - /K [1] - /Pg 4840 0 R ->> -endobj - -2950 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2947 0 R - /K [0] - /Pg 4840 0 R ->> -endobj - -2951 0 obj -<< - /Type /StructElem - /S /LI - /P 2941 0 R - /K [2955 0 R 2952 0 R] ->> -endobj - -2952 0 obj -<< - /Type /StructElem - /S /LBody - /P 2951 0 R - /K [2953 0 R] ->> -endobj - -2953 0 obj -<< - /Type /StructElem - /S /P - /P 2952 0 R - /K [2954 0 R 341] - /Pg 4836 0 R ->> -endobj - -2954 0 obj -<< - /Type /StructElem - /S /Formula - /P 2953 0 R - /K [340] - /Pg 4836 0 R ->> -endobj - -2955 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2951 0 R - /K [339] - /Pg 4836 0 R ->> -endobj - -2956 0 obj -<< - /Type /StructElem - /S /LI - /P 2941 0 R - /K [2959 0 R 2957 0 R] ->> -endobj - -2957 0 obj -<< - /Type /StructElem - /S /LBody - /P 2956 0 R - /K [2958 0 R 338] - /Pg 4836 0 R ->> -endobj - -2958 0 obj -<< - /Type /StructElem - /S /Formula - /P 2957 0 R - /K [337] - /Pg 4836 0 R ->> -endobj - -2959 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2956 0 R - /K [336] - /Pg 4836 0 R ->> -endobj - -2960 0 obj -<< - /Type /StructElem - /S /LI - /P 2941 0 R - /K [2963 0 R 2961 0 R] ->> -endobj - -2961 0 obj -<< - /Type /StructElem - /S /LBody - /P 2960 0 R - /K [2962 0 R 335] - /Pg 4836 0 R ->> -endobj - -2962 0 obj -<< - /Type /StructElem - /S /Formula - /P 2961 0 R - /K [334] - /Pg 4836 0 R ->> -endobj - -2963 0 obj -<< - /Type /StructElem - /S /Lbl - /P 2960 0 R - /K [333] - /Pg 4836 0 R ->> -endobj - -2964 0 obj -<< - /Type /StructElem - /S /P - /P 2940 0 R - /K [319 2966 0 R 324 2965 0 R 332] - /Pg 4836 0 R ->> -endobj - -2965 0 obj -<< - /Type /StructElem - /S /Formula - /P 2964 0 R - /K [325 326 327 328 329 330 331] - /Pg 4836 0 R ->> -endobj - -2966 0 obj -<< - /Type /StructElem - /S /Formula - /P 2964 0 R - /K [320 321 322 323] - /Pg 4836 0 R ->> -endobj - -2967 0 obj -<< - /Type /StructElem - /S /Formula - /P 2940 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318] - /Pg 4836 0 R ->> -endobj - -2968 0 obj -<< - /Type /StructElem - /S /P - /P 2940 0 R - /K [2971 0 R 229 2970 0 R 233 2969 0 R 238 239] - /Pg 4836 0 R ->> -endobj - -2969 0 obj -<< - /Type /StructElem - /S /Formula - /P 2968 0 R - /K [234 235 236 237] - /Pg 4836 0 R ->> -endobj - -2970 0 obj -<< - /Type /StructElem - /S /Formula - /P 2968 0 R - /K [230 231 232] - /Pg 4836 0 R ->> -endobj - -2971 0 obj -<< - /Type /StructElem - /S /Strong - /P 2968 0 R - /K [226 227 228] - /Pg 4836 0 R ->> -endobj - -2972 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [217 2975 0 R 219 2974 0 R 221 222 2973 0 R 224 225] - /Pg 4836 0 R ->> -endobj - -2973 0 obj -<< - /Type /StructElem - /S /Em - /P 2972 0 R - /K [223] - /Pg 4836 0 R ->> -endobj - -2974 0 obj -<< - /Type /StructElem - /S /Code - /P 2972 0 R - /K [220] - /Pg 4836 0 R ->> -endobj - -2975 0 obj -<< - /Type /StructElem - /S /Code - /P 2972 0 R - /K [218] - /Pg 4836 0 R ->> -endobj - -2976 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Iteration) - /K [215 216] - /Pg 4836 0 R ->> -endobj - -2977 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [209 2979 0 R 211 212 2978 0 R 214] - /Pg 4836 0 R ->> -endobj - -2978 0 obj -<< - /Type /StructElem - /S /Link - /P 2977 0 R - /K [213 << - /Type /OBJR - /Pg 4836 0 R - /Obj 4835 0 R - >>] - /Pg 4836 0 R ->> -endobj - -2979 0 obj -<< - /Type /StructElem - /S /Formula - /P 2977 0 R - /K [210] - /Pg 4836 0 R ->> -endobj - -2980 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [3008 0 R 3006 0 R 3004 0 R 3002 0 R 3000 0 R 2998 0 R 2996 0 R 2994 0 R 2992 0 R 2990 0 R 2988 0 R 2986 0 R 2984 0 R 2981 0 R] ->> -endobj - -2981 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2983 0 R 2982 0 R] ->> -endobj - -2982 0 obj -<< - /Type /StructElem - /S /Formula - /P 2981 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208] - /Pg 4836 0 R ->> -endobj - -2983 0 obj -<< - /Type /StructElem - /S /Formula - /P 2981 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [179 180 181 182 183 184 185 186 187 188 189 190] - /Pg 4836 0 R ->> -endobj - -2984 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2985 0 R] ->> -endobj - -2985 0 obj -<< - /Type /StructElem - /S /Formula - /P 2984 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [178] - /Pg 4836 0 R ->> -endobj - -2986 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2987 0 R] ->> -endobj - -2987 0 obj -<< - /Type /StructElem - /S /Formula - /P 2986 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [173 174 175 176 177] - /Pg 4836 0 R ->> -endobj - -2988 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2989 0 R] ->> -endobj - -2989 0 obj -<< - /Type /StructElem - /S /Formula - /P 2988 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [172] - /Pg 4836 0 R ->> -endobj - -2990 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2991 0 R] ->> -endobj - -2991 0 obj -<< - /Type /StructElem - /S /Formula - /P 2990 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [171] - /Pg 4836 0 R ->> -endobj - -2992 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2993 0 R] ->> -endobj - -2993 0 obj -<< - /Type /StructElem - /S /Formula - /P 2992 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170] - /Pg 4836 0 R ->> -endobj - -2994 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2995 0 R] ->> -endobj - -2995 0 obj -<< - /Type /StructElem - /S /Formula - /P 2994 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167 168 169] - /Pg 4836 0 R ->> -endobj - -2996 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2997 0 R] ->> -endobj - -2997 0 obj -<< - /Type /StructElem - /S /Formula - /P 2996 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164 165 166] - /Pg 4836 0 R ->> -endobj - -2998 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [2999 0 R] ->> -endobj - -2999 0 obj -<< - /Type /StructElem - /S /Formula - /P 2998 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4836 0 R ->> -endobj - -3000 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3001 0 R] ->> -endobj - -3001 0 obj -<< - /Type /StructElem - /S /Formula - /P 3000 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161 162] - /Pg 4836 0 R ->> -endobj - -3002 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3003 0 R] ->> -endobj - -3003 0 obj -<< - /Type /StructElem - /S /Formula - /P 3002 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4836 0 R ->> -endobj - -3004 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3005 0 R] ->> -endobj - -3005 0 obj -<< - /Type /StructElem - /S /Formula - /P 3004 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [158 159] - /Pg 4836 0 R ->> -endobj - -3006 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3007 0 R] ->> -endobj - -3007 0 obj -<< - /Type /StructElem - /S /Formula - /P 3006 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157] - /Pg 4836 0 R ->> -endobj - -3008 0 obj -<< - /Type /StructElem - /S /Div - /P 2980 0 R - /K [3009 0 R] ->> -endobj - -3009 0 obj -<< - /Type /StructElem - /S /Formula - /P 3008 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154 155 156] - /Pg 4836 0 R ->> -endobj - -3010 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [132 3016 0 R 135 3015 0 R 137 138 3014 0 R 144 3013 0 R 146 147 3012 0 R 151 3011 0 R 153] - /Pg 4836 0 R ->> -endobj - -3011 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [152] - /Pg 4836 0 R ->> -endobj - -3012 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [148 149 150] - /Pg 4836 0 R ->> -endobj - -3013 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [145] - /Pg 4836 0 R ->> -endobj - -3014 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [139 140 141 142 143] - /Pg 4836 0 R ->> -endobj - -3015 0 obj -<< - /Type /StructElem - /S /Link - /P 3010 0 R - /K [136 << - /Type /OBJR - /Pg 4836 0 R - /Obj 4834 0 R - >>] - /Pg 4836 0 R ->> -endobj - -3016 0 obj -<< - /Type /StructElem - /S /Formula - /P 3010 0 R - /K [133 134] - /Pg 4836 0 R ->> -endobj - -3017 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3024 0 R 3023 0 R 3018 0 R] ->> -endobj - -3018 0 obj -<< - /Type /StructElem - /S /P - /P 3017 0 R - /K [118 3022 0 R 120 121 3021 0 R 124 3020 0 R 128 3019 0 R 131] - /Pg 4836 0 R ->> -endobj - -3019 0 obj -<< - /Type /StructElem - /S /Formula - /P 3018 0 R - /K [129 130] - /Pg 4836 0 R ->> -endobj - -3020 0 obj -<< - /Type /StructElem - /S /Formula - /P 3018 0 R - /K [125 126 127] - /Pg 4836 0 R ->> -endobj - -3021 0 obj -<< - /Type /StructElem - /S /Formula - /P 3018 0 R - /K [122 123] - /Pg 4836 0 R ->> -endobj - -3022 0 obj -<< - /Type /StructElem - /S /Formula - /P 3018 0 R - /K [119] - /Pg 4836 0 R ->> -endobj - -3023 0 obj -<< - /Type /StructElem - /S /Formula - /P 3017 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117] - /Pg 4836 0 R ->> -endobj - -3024 0 obj -<< - /Type /StructElem - /S /P - /P 3017 0 R - /K [3031 0 R 51 3030 0 R 53 3029 0 R 67 3028 0 R 70 71 72 3027 0 R 74 3026 0 R 76 77 3025 0 R 79] - /Pg 4836 0 R ->> -endobj - -3025 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [78] - /Pg 4836 0 R ->> -endobj - -3026 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [75] - /Pg 4836 0 R ->> -endobj - -3027 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [73] - /Pg 4836 0 R ->> -endobj - -3028 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [68 69] - /Pg 4836 0 R ->> -endobj - -3029 0 obj -<< - /Type /StructElem - /S /Formula - /P 3024 0 R - /K [54 55 56 57 58 59 60 61 62 63 64 65 66] - /Pg 4836 0 R ->> -endobj - -3030 0 obj -<< - /Type /StructElem - /S /Em - /P 3024 0 R - /K [52] - /Pg 4836 0 R ->> -endobj - -3031 0 obj -<< - /Type /StructElem - /S /Strong - /P 3024 0 R - /K [48 49 50] - /Pg 4836 0 R ->> -endobj - -3032 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [29 3038 0 R 31 32 3037 0 R 34 35 3036 0 R 37 38 3035 0 R 40 41 42 43 3034 0 R 45 3033 0 R 47] - /Pg 4836 0 R ->> -endobj - -3033 0 obj -<< - /Type /StructElem - /S /Code - /P 3032 0 R - /K [46] - /Pg 4836 0 R ->> -endobj - -3034 0 obj -<< - /Type /StructElem - /S /Code - /P 3032 0 R - /K [44] - /Pg 4836 0 R ->> -endobj - -3035 0 obj -<< - /Type /StructElem - /S /Link - /P 3032 0 R - /K [39 << - /Type /OBJR - /Pg 4836 0 R - /Obj 4833 0 R - >>] - /Pg 4836 0 R ->> -endobj - -3036 0 obj -<< - /Type /StructElem - /S /Em - /P 3032 0 R - /K [36] - /Pg 4836 0 R ->> -endobj - -3037 0 obj -<< - /Type /StructElem - /S /Formula - /P 3032 0 R - /K [33] - /Pg 4836 0 R ->> -endobj - -3038 0 obj -<< - /Type /StructElem - /S /Em - /P 3032 0 R - /K [30] - /Pg 4836 0 R ->> -endobj - -3039 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [323 3051 0 R 325 326 3050 0 R 328 3049 0 R << - /Type /MCR - /MCID 1 - /Pg 4836 0 R - >> 3048 0 R << - /Type /MCR - /MCID 3 - /Pg 4836 0 R - >> 3047 0 R << - /Type /MCR - /MCID 6 - /Pg 4836 0 R - >> 3046 0 R << - /Type /MCR - /MCID 8 - /Pg 4836 0 R - >> 3045 0 R << - /Type /MCR - /MCID 10 - /Pg 4836 0 R - >> << - /Type /MCR - /MCID 11 - /Pg 4836 0 R - >> 3044 0 R << - /Type /MCR - /MCID 13 - /Pg 4836 0 R - >> 3043 0 R << - /Type /MCR - /MCID 20 - /Pg 4836 0 R - >> 3042 0 R << - /Type /MCR - /MCID 22 - /Pg 4836 0 R - >> << - /Type /MCR - /MCID 23 - /Pg 4836 0 R - >> 3041 0 R << - /Type /MCR - /MCID 25 - /Pg 4836 0 R - >> << - /Type /MCR - /MCID 26 - /Pg 4836 0 R - >> 3040 0 R << - /Type /MCR - /MCID 28 - /Pg 4836 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3040 0 obj -<< - /Type /StructElem - /S /Em - /P 3039 0 R - /K [27] - /Pg 4836 0 R ->> -endobj - -3041 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [24] - /Pg 4836 0 R ->> -endobj - -3042 0 obj -<< - /Type /StructElem - /S /Link - /P 3039 0 R - /K [21 << - /Type /OBJR - /Pg 4836 0 R - /Obj 4832 0 R - >>] - /Pg 4836 0 R ->> -endobj - -3043 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [14 15 16 17 18 19] - /Pg 4836 0 R ->> -endobj - -3044 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [12] - /Pg 4836 0 R ->> -endobj - -3045 0 obj -<< - /Type /StructElem - /S /Em - /P 3039 0 R - /K [9] - /Pg 4836 0 R ->> -endobj - -3046 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [7] - /Pg 4836 0 R ->> -endobj - -3047 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [4 5] - /Pg 4836 0 R ->> -endobj - -3048 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [2] - /Pg 4836 0 R ->> -endobj - -3049 0 obj -<< - /Type /StructElem - /S /Link - /P 3039 0 R - /K [329 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4827 0 R - >> 330 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4828 0 R - >> << - /Type /MCR - /MCID 0 - /Pg 4836 0 R - >> << - /Type /OBJR - /Pg 4836 0 R - /Obj 4831 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3050 0 obj -<< - /Type /StructElem - /S /Formula - /P 3039 0 R - /K [327] - /Pg 4829 0 R ->> -endobj - -3051 0 obj -<< - /Type /StructElem - /S /Code - /P 3039 0 R - /K [324] - /Pg 4829 0 R ->> -endobj - -3052 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Idempotent Recovery) - /K [321 322] - /Pg 4829 0 R ->> -endobj - -3053 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /K [3060 0 R 3054 0 R] ->> -endobj - -3054 0 obj -<< - /Type /StructElem - /S /Div - /P 3053 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3055 0 R] ->> -endobj - -3055 0 obj -<< - /Type /StructElem - /S /P - /P 3054 0 R - /K [3059 0 R 3058 0 R 3057 0 R 3056 0 R] ->> -endobj - -3056 0 obj -<< - /Type /StructElem - /S /Code - /P 3055 0 R - /K [319] - /Pg 4829 0 R ->> -endobj - -3057 0 obj -<< - /Type /StructElem - /S /Code - /P 3055 0 R - /K [318] - /Pg 4829 0 R ->> -endobj - -3058 0 obj -<< - /Type /StructElem - /S /Code - /P 3055 0 R - /K [317] - /Pg 4829 0 R ->> -endobj - -3059 0 obj -<< - /Type /StructElem - /S /Code - /P 3055 0 R - /K [316] - /Pg 4829 0 R ->> -endobj - -3060 0 obj -<< - /Type /StructElem - /S /Caption - /P 3053 0 R - /K [3061 0 R] ->> -endobj - -3061 0 obj -<< - /Type /StructElem - /S /Span - /P 3060 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [320] - /Pg 4829 0 R ->> -endobj - -3062 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [284 3072 0 R 286 287 288 3071 0 R 290 291 292 3070 0 R 296 3069 0 R 298 3068 0 R 300 301 3067 0 R 303 3066 0 R 305 306 3065 0 R 308 3064 0 R 310 311 312 3063 0 R 314 315] - /Pg 4829 0 R ->> -endobj - -3063 0 obj -<< - /Type /StructElem - /S /Link - /P 3062 0 R - /K [313 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4826 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3064 0 obj -<< - /Type /StructElem - /S /Code - /P 3062 0 R - /K [309] - /Pg 4829 0 R ->> -endobj - -3065 0 obj -<< - /Type /StructElem - /S /Formula - /P 3062 0 R - /K [307] - /Pg 4829 0 R ->> -endobj - -3066 0 obj -<< - /Type /StructElem - /S /Code - /P 3062 0 R - /K [304] - /Pg 4829 0 R ->> -endobj - -3067 0 obj -<< - /Type /StructElem - /S /Em - /P 3062 0 R - /K [302] - /Pg 4829 0 R ->> -endobj - -3068 0 obj -<< - /Type /StructElem - /S /Code - /P 3062 0 R - /K [299] - /Pg 4829 0 R ->> -endobj - -3069 0 obj -<< - /Type /StructElem - /S /Code - /P 3062 0 R - /K [297] - /Pg 4829 0 R ->> -endobj - -3070 0 obj -<< - /Type /StructElem - /S /Formula - /P 3062 0 R - /K [293 294 295] - /Pg 4829 0 R ->> -endobj - -3071 0 obj -<< - /Type /StructElem - /S /Em - /P 3062 0 R - /K [289] - /Pg 4829 0 R ->> -endobj - -3072 0 obj -<< - /Type /StructElem - /S /Em - /P 3062 0 R - /K [285] - /Pg 4829 0 R ->> -endobj - -3073 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3086 0 R 3085 0 R 3083 0 R 3074 0 R] ->> -endobj - -3074 0 obj -<< - /Type /StructElem - /S /L - /P 3073 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3079 0 R 3075 0 R] ->> -endobj - -3075 0 obj -<< - /Type /StructElem - /S /LI - /P 3074 0 R - /K [3078 0 R 3076 0 R] ->> -endobj - -3076 0 obj -<< - /Type /StructElem - /S /LBody - /P 3075 0 R - /K [3077 0 R 283] - /Pg 4829 0 R ->> -endobj - -3077 0 obj -<< - /Type /StructElem - /S /Formula - /P 3076 0 R - /K [279 280 281 282] - /Pg 4829 0 R ->> -endobj - -3078 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3075 0 R - /K [278] - /Pg 4829 0 R ->> -endobj - -3079 0 obj -<< - /Type /StructElem - /S /LI - /P 3074 0 R - /K [3082 0 R 3080 0 R] ->> -endobj - -3080 0 obj -<< - /Type /StructElem - /S /LBody - /P 3079 0 R - /K [3081 0 R 275 276 277] - /Pg 4829 0 R ->> -endobj - -3081 0 obj -<< - /Type /StructElem - /S /Formula - /P 3080 0 R - /K [271 272 273 274] - /Pg 4829 0 R ->> -endobj - -3082 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3079 0 R - /K [270] - /Pg 4829 0 R ->> -endobj - -3083 0 obj -<< - /Type /StructElem - /S /P - /P 3073 0 R - /K [263 3084 0 R 269] - /Pg 4829 0 R ->> -endobj - -3084 0 obj -<< - /Type /StructElem - /S /Formula - /P 3083 0 R - /K [264 265 266 267 268] - /Pg 4829 0 R ->> -endobj - -3085 0 obj -<< - /Type /StructElem - /S /Formula - /P 3073 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [254 255 256 257 258 259 260 261 262] - /Pg 4829 0 R ->> -endobj - -3086 0 obj -<< - /Type /StructElem - /S /P - /P 3073 0 R - /K [3089 0 R 249 3088 0 R 251 3087 0 R 253] - /Pg 4829 0 R ->> -endobj - -3087 0 obj -<< - /Type /StructElem - /S /Formula - /P 3086 0 R - /K [252] - /Pg 4829 0 R ->> -endobj - -3088 0 obj -<< - /Type /StructElem - /S /Em - /P 3086 0 R - /K [250] - /Pg 4829 0 R ->> -endobj - -3089 0 obj -<< - /Type /StructElem - /S /Strong - /P 3086 0 R - /K [246 247 248] - /Pg 4829 0 R ->> -endobj - -3090 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [236 237 238 3093 0 R 240 3092 0 R 242 243 3091 0 R 245] - /Pg 4829 0 R ->> -endobj - -3091 0 obj -<< - /Type /StructElem - /S /Link - /P 3090 0 R - /K [244 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4825 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3092 0 obj -<< - /Type /StructElem - /S /Formula - /P 3090 0 R - /K [241] - /Pg 4829 0 R ->> -endobj - -3093 0 obj -<< - /Type /StructElem - /S /Em - /P 3090 0 R - /K [239] - /Pg 4829 0 R ->> -endobj - -3094 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Component Lifecycle) - /K [234 235] - /Pg 4829 0 R ->> -endobj - -3095 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [198 3101 0 R 200 3100 0 R 202 3099 0 R 219 3098 0 R 221 222 223 3097 0 R 228 229 230 231 3096 0 R 233] - /Pg 4829 0 R ->> -endobj - -3096 0 obj -<< - /Type /StructElem - /S /Link - /P 3095 0 R - /K [232 << - /Type /OBJR - /Pg 4829 0 R - /Obj 4824 0 R - >>] - /Pg 4829 0 R ->> -endobj - -3097 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [224 225 226 227] - /Pg 4829 0 R ->> -endobj - -3098 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [220] - /Pg 4829 0 R ->> -endobj - -3099 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218] - /Pg 4829 0 R ->> -endobj - -3100 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [201] - /Pg 4829 0 R ->> -endobj - -3101 0 obj -<< - /Type /StructElem - /S /Formula - /P 3095 0 R - /K [199] - /Pg 4829 0 R ->> -endobj - -3102 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3188 0 R 3103 0 R] ->> -endobj - -3103 0 obj -<< - /Type /StructElem - /S /Div - /P 3102 0 R - /K [3186 0 R 3184 0 R 3182 0 R 3180 0 R 3178 0 R 3176 0 R 3174 0 R 3172 0 R 3170 0 R 3168 0 R 3166 0 R 3164 0 R 3162 0 R 3160 0 R 3158 0 R 3156 0 R 3154 0 R 3152 0 R 3150 0 R 3148 0 R 3146 0 R 3144 0 R 3142 0 R 3140 0 R 3138 0 R 3136 0 R 3134 0 R 3132 0 R 3130 0 R 3128 0 R 3126 0 R 3124 0 R 3122 0 R 3120 0 R 3118 0 R 3116 0 R 3114 0 R 3112 0 R 3110 0 R 3108 0 R 3106 0 R 3104 0 R] ->> -endobj - -3104 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3105 0 R] ->> -endobj - -3105 0 obj -<< - /Type /StructElem - /S /Formula - /P 3104 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197] - /Pg 4829 0 R ->> -endobj - -3106 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3107 0 R] ->> -endobj - -3107 0 obj -<< - /Type /StructElem - /S /Formula - /P 3106 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4829 0 R ->> -endobj - -3108 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3109 0 R] ->> -endobj - -3109 0 obj -<< - /Type /StructElem - /S /Formula - /P 3108 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [149 150 151 152 153] - /Pg 4829 0 R ->> -endobj - -3110 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3111 0 R] ->> -endobj - -3111 0 obj -<< - /Type /StructElem - /S /Formula - /P 3110 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [148] - /Pg 4829 0 R ->> -endobj - -3112 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3113 0 R] ->> -endobj - -3113 0 obj -<< - /Type /StructElem - /S /Formula - /P 3112 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143 144 145 146 147] - /Pg 4829 0 R ->> -endobj - -3114 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3115 0 R] ->> -endobj - -3115 0 obj -<< - /Type /StructElem - /S /Formula - /P 3114 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4829 0 R ->> -endobj - -3116 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3117 0 R] ->> -endobj - -3117 0 obj -<< - /Type /StructElem - /S /Formula - /P 3116 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [141] - /Pg 4829 0 R ->> -endobj - -3118 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3119 0 R] ->> -endobj - -3119 0 obj -<< - /Type /StructElem - /S /Formula - /P 3118 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131 132 133 134 135 136 137 138 139 140] - /Pg 4829 0 R ->> -endobj - -3120 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3121 0 R] ->> -endobj - -3121 0 obj -<< - /Type /StructElem - /S /Formula - /P 3120 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4829 0 R ->> -endobj - -3122 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3123 0 R] ->> -endobj - -3123 0 obj -<< - /Type /StructElem - /S /Formula - /P 3122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128 129] - /Pg 4829 0 R ->> -endobj - -3124 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3125 0 R] ->> -endobj - -3125 0 obj -<< - /Type /StructElem - /S /Formula - /P 3124 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4829 0 R ->> -endobj - -3126 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3127 0 R] ->> -endobj - -3127 0 obj -<< - /Type /StructElem - /S /Formula - /P 3126 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119 120 121 122 123 124 125 126] - /Pg 4829 0 R ->> -endobj - -3128 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3129 0 R] ->> -endobj - -3129 0 obj -<< - /Type /StructElem - /S /Formula - /P 3128 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4829 0 R ->> -endobj - -3130 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3131 0 R] ->> -endobj - -3131 0 obj -<< - /Type /StructElem - /S /Formula - /P 3130 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [117] - /Pg 4829 0 R ->> -endobj - -3132 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3133 0 R] ->> -endobj - -3133 0 obj -<< - /Type /StructElem - /S /Formula - /P 3132 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116] - /Pg 4829 0 R ->> -endobj - -3134 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3135 0 R] ->> -endobj - -3135 0 obj -<< - /Type /StructElem - /S /Formula - /P 3134 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4829 0 R ->> -endobj - -3136 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3137 0 R] ->> -endobj - -3137 0 obj -<< - /Type /StructElem - /S /Formula - /P 3136 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80 81 82 83 84] - /Pg 4829 0 R ->> -endobj - -3138 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3139 0 R] ->> -endobj - -3139 0 obj -<< - /Type /StructElem - /S /Formula - /P 3138 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [79] - /Pg 4829 0 R ->> -endobj - -3140 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3141 0 R] ->> -endobj - -3141 0 obj -<< - /Type /StructElem - /S /Formula - /P 3140 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [74 75 76 77 78] - /Pg 4829 0 R ->> -endobj - -3142 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3143 0 R] ->> -endobj - -3143 0 obj -<< - /Type /StructElem - /S /Formula - /P 3142 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [73] - /Pg 4829 0 R ->> -endobj - -3144 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3145 0 R] ->> -endobj - -3145 0 obj -<< - /Type /StructElem - /S /Formula - /P 3144 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [72] - /Pg 4829 0 R ->> -endobj - -3146 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3147 0 R] ->> -endobj - -3147 0 obj -<< - /Type /StructElem - /S /Formula - /P 3146 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [62 63 64 65 66 67 68 69 70 71] - /Pg 4829 0 R ->> -endobj - -3148 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3149 0 R] ->> -endobj - -3149 0 obj -<< - /Type /StructElem - /S /Formula - /P 3148 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [61] - /Pg 4829 0 R ->> -endobj - -3150 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3151 0 R] ->> -endobj - -3151 0 obj -<< - /Type /StructElem - /S /Formula - /P 3150 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59 60] - /Pg 4829 0 R ->> -endobj - -3152 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3153 0 R] ->> -endobj - -3153 0 obj -<< - /Type /StructElem - /S /Formula - /P 3152 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [58] - /Pg 4829 0 R ->> -endobj - -3154 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3155 0 R] ->> -endobj - -3155 0 obj -<< - /Type /StructElem - /S /Formula - /P 3154 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [45 46 47 48 49 50 51 52 53 54 55 56 57] - /Pg 4829 0 R ->> -endobj - -3156 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3157 0 R] ->> -endobj - -3157 0 obj -<< - /Type /StructElem - /S /Formula - /P 3156 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44] - /Pg 4829 0 R ->> -endobj - -3158 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3159 0 R] ->> -endobj - -3159 0 obj -<< - /Type /StructElem - /S /Formula - /P 3158 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4829 0 R ->> -endobj - -3160 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3161 0 R] ->> -endobj - -3161 0 obj -<< - /Type /StructElem - /S /Formula - /P 3160 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [30 31 32 33 34 35 36 37 38 39 40 41 42] - /Pg 4829 0 R ->> -endobj - -3162 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3163 0 R] ->> -endobj - -3163 0 obj -<< - /Type /StructElem - /S /Formula - /P 3162 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [29] - /Pg 4829 0 R ->> -endobj - -3164 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3165 0 R] ->> -endobj - -3165 0 obj -<< - /Type /StructElem - /S /Formula - /P 3164 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [24 25 26 27 28] - /Pg 4829 0 R ->> -endobj - -3166 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3167 0 R] ->> -endobj - -3167 0 obj -<< - /Type /StructElem - /S /Formula - /P 3166 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [23] - /Pg 4829 0 R ->> -endobj - -3168 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3169 0 R] ->> -endobj - -3169 0 obj -<< - /Type /StructElem - /S /Formula - /P 3168 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [18 19 20 21 22] - /Pg 4829 0 R ->> -endobj - -3170 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3171 0 R] ->> -endobj - -3171 0 obj -<< - /Type /StructElem - /S /Formula - /P 3170 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [17] - /Pg 4829 0 R ->> -endobj - -3172 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3173 0 R] ->> -endobj - -3173 0 obj -<< - /Type /StructElem - /S /Formula - /P 3172 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [16] - /Pg 4829 0 R ->> -endobj - -3174 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3175 0 R] ->> -endobj - -3175 0 obj -<< - /Type /StructElem - /S /Formula - /P 3174 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14 15] - /Pg 4829 0 R ->> -endobj - -3176 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3177 0 R] ->> -endobj - -3177 0 obj -<< - /Type /StructElem - /S /Formula - /P 3176 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [13] - /Pg 4829 0 R ->> -endobj - -3178 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3179 0 R] ->> -endobj - -3179 0 obj -<< - /Type /StructElem - /S /Formula - /P 3178 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11 12] - /Pg 4829 0 R ->> -endobj - -3180 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3181 0 R] ->> -endobj - -3181 0 obj -<< - /Type /StructElem - /S /Formula - /P 3180 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [10] - /Pg 4829 0 R ->> -endobj - -3182 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3183 0 R] ->> -endobj - -3183 0 obj -<< - /Type /StructElem - /S /Formula - /P 3182 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [2 3 4 5 6 7 8 9] - /Pg 4829 0 R ->> -endobj - -3184 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3185 0 R] ->> -endobj - -3185 0 obj -<< - /Type /StructElem - /S /Formula - /P 3184 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [1] - /Pg 4829 0 R ->> -endobj - -3186 0 obj -<< - /Type /StructElem - /S /Div - /P 3103 0 R - /K [3187 0 R] ->> -endobj - -3187 0 obj -<< - /Type /StructElem - /S /Formula - /P 3186 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [0] - /Pg 4829 0 R ->> -endobj - -3188 0 obj -<< - /Type /StructElem - /S /P - /P 3102 0 R - /K [3193 0 R 400 3192 0 R 402 3191 0 R 404 3190 0 R 406 3189 0 R 409] - /Pg 4822 0 R ->> -endobj - -3189 0 obj -<< - /Type /StructElem - /S /Formula - /P 3188 0 R - /K [407 408] - /Pg 4822 0 R ->> -endobj - -3190 0 obj -<< - /Type /StructElem - /S /Formula - /P 3188 0 R - /K [405] - /Pg 4822 0 R ->> -endobj - -3191 0 obj -<< - /Type /StructElem - /S /Formula - /P 3188 0 R - /K [403] - /Pg 4822 0 R ->> -endobj - -3192 0 obj -<< - /Type /StructElem - /S /Formula - /P 3188 0 R - /K [401] - /Pg 4822 0 R ->> -endobj - -3193 0 obj -<< - /Type /StructElem - /S /Strong - /P 3188 0 R - /K [397 398 399] - /Pg 4822 0 R ->> -endobj - -3194 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3214 0 R 3213 0 R 3195 0 R] ->> -endobj - -3195 0 obj -<< - /Type /StructElem - /S /P - /P 3194 0 R - /K [331 3212 0 R 334 3211 0 R 340 3210 0 R 342 3209 0 R 344 345 3208 0 R 348 3207 0 R 350 3206 0 R 352 3205 0 R 354 3204 0 R 357 3203 0 R 360 3202 0 R 365 3201 0 R 367 368 3200 0 R 373 3199 0 R 378 379 3198 0 R 390 3197 0 R 393 3196 0 R 396] - /Pg 4822 0 R ->> -endobj - -3196 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [394 395] - /Pg 4822 0 R ->> -endobj - -3197 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [391 392] - /Pg 4822 0 R ->> -endobj - -3198 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [380 381 382 383 384 385 386 387 388 389] - /Pg 4822 0 R ->> -endobj - -3199 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [374 375 376 377] - /Pg 4822 0 R ->> -endobj - -3200 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [369 370 371 372] - /Pg 4822 0 R ->> -endobj - -3201 0 obj -<< - /Type /StructElem - /S /Em - /P 3195 0 R - /K [366] - /Pg 4822 0 R ->> -endobj - -3202 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [361 362 363 364] - /Pg 4822 0 R ->> -endobj - -3203 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [358 359] - /Pg 4822 0 R ->> -endobj - -3204 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [355 356] - /Pg 4822 0 R ->> -endobj - -3205 0 obj -<< - /Type /StructElem - /S /Em - /P 3195 0 R - /K [353] - /Pg 4822 0 R ->> -endobj - -3206 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [351] - /Pg 4822 0 R ->> -endobj - -3207 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [349] - /Pg 4822 0 R ->> -endobj - -3208 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [346 347] - /Pg 4822 0 R ->> -endobj - -3209 0 obj -<< - /Type /StructElem - /S /Em - /P 3195 0 R - /K [343] - /Pg 4822 0 R ->> -endobj - -3210 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [341] - /Pg 4822 0 R ->> -endobj - -3211 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [335 336 337 338 339] - /Pg 4822 0 R ->> -endobj - -3212 0 obj -<< - /Type /StructElem - /S /Formula - /P 3195 0 R - /K [332 333] - /Pg 4822 0 R ->> -endobj - -3213 0 obj -<< - /Type /StructElem - /S /Formula - /P 3194 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330] - /Pg 4822 0 R ->> -endobj - -3214 0 obj -<< - /Type /StructElem - /S /P - /P 3194 0 R - /K [3215 0 R 289] - /Pg 4822 0 R ->> -endobj - -3215 0 obj -<< - /Type /StructElem - /S /Strong - /P 3214 0 R - /K [286 287 288] - /Pg 4822 0 R ->> -endobj - -3216 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3218 0 R 280 3217 0 R 282 283 284 285] - /Pg 4822 0 R ->> -endobj - -3217 0 obj -<< - /Type /StructElem - /S /Em - /P 3216 0 R - /K [281] - /Pg 4822 0 R ->> -endobj - -3218 0 obj -<< - /Type /StructElem - /S /Strong - /P 3216 0 R - /K [279] - /Pg 4822 0 R ->> -endobj - -3219 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [269 270 271 272 273 274 3220 0 R 278] - /Pg 4822 0 R ->> -endobj - -3220 0 obj -<< - /Type /StructElem - /S /Formula - /P 3219 0 R - /K [275 276 277] - /Pg 4822 0 R ->> -endobj - -3221 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3307 0 R 3222 0 R] ->> -endobj - -3222 0 obj -<< - /Type /StructElem - /S /Div - /P 3221 0 R - /K [3305 0 R 3303 0 R 3301 0 R 3299 0 R 3297 0 R 3295 0 R 3293 0 R 3291 0 R 3289 0 R 3287 0 R 3285 0 R 3283 0 R 3281 0 R 3279 0 R 3277 0 R 3275 0 R 3273 0 R 3271 0 R 3269 0 R 3267 0 R 3265 0 R 3263 0 R 3261 0 R 3259 0 R 3257 0 R 3255 0 R 3253 0 R 3251 0 R 3249 0 R 3247 0 R 3245 0 R 3243 0 R 3241 0 R 3239 0 R 3237 0 R 3235 0 R 3233 0 R 3231 0 R 3229 0 R 3227 0 R 3225 0 R 3223 0 R] ->> -endobj - -3223 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3224 0 R] ->> -endobj - -3224 0 obj -<< - /Type /StructElem - /S /Formula - /P 3223 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268] - /Pg 4822 0 R ->> -endobj - -3225 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3226 0 R] ->> -endobj - -3226 0 obj -<< - /Type /StructElem - /S /Formula - /P 3225 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [237] - /Pg 4822 0 R ->> -endobj - -3227 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3228 0 R] ->> -endobj - -3228 0 obj -<< - /Type /StructElem - /S /Formula - /P 3227 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [232 233 234 235 236] - /Pg 4822 0 R ->> -endobj - -3229 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3230 0 R] ->> -endobj - -3230 0 obj -<< - /Type /StructElem - /S /Formula - /P 3229 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [231] - /Pg 4822 0 R ->> -endobj - -3231 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3232 0 R] ->> -endobj - -3232 0 obj -<< - /Type /StructElem - /S /Formula - /P 3231 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [226 227 228 229 230] - /Pg 4822 0 R ->> -endobj - -3233 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3234 0 R] ->> -endobj - -3234 0 obj -<< - /Type /StructElem - /S /Formula - /P 3233 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [225] - /Pg 4822 0 R ->> -endobj - -3235 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3236 0 R] ->> -endobj - -3236 0 obj -<< - /Type /StructElem - /S /Formula - /P 3235 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [224] - /Pg 4822 0 R ->> -endobj - -3237 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3238 0 R] ->> -endobj - -3238 0 obj -<< - /Type /StructElem - /S /Formula - /P 3237 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [214 215 216 217 218 219 220 221 222 223] - /Pg 4822 0 R ->> -endobj - -3239 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3240 0 R] ->> -endobj - -3240 0 obj -<< - /Type /StructElem - /S /Formula - /P 3239 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [213] - /Pg 4822 0 R ->> -endobj - -3241 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3242 0 R] ->> -endobj - -3242 0 obj -<< - /Type /StructElem - /S /Formula - /P 3241 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [211 212] - /Pg 4822 0 R ->> -endobj - -3243 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3244 0 R] ->> -endobj - -3244 0 obj -<< - /Type /StructElem - /S /Formula - /P 3243 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [210] - /Pg 4822 0 R ->> -endobj - -3245 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3246 0 R] ->> -endobj - -3246 0 obj -<< - /Type /StructElem - /S /Formula - /P 3245 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [207 208 209] - /Pg 4822 0 R ->> -endobj - -3247 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3248 0 R] ->> -endobj - -3248 0 obj -<< - /Type /StructElem - /S /Formula - /P 3247 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [206] - /Pg 4822 0 R ->> -endobj - -3249 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3250 0 R] ->> -endobj - -3250 0 obj -<< - /Type /StructElem - /S /Formula - /P 3249 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [205] - /Pg 4822 0 R ->> -endobj - -3251 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3252 0 R] ->> -endobj - -3252 0 obj -<< - /Type /StructElem - /S /Formula - /P 3251 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204] - /Pg 4822 0 R ->> -endobj - -3253 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3254 0 R] ->> -endobj - -3254 0 obj -<< - /Type /StructElem - /S /Formula - /P 3253 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [166] - /Pg 4822 0 R ->> -endobj - -3255 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3256 0 R] ->> -endobj - -3256 0 obj -<< - /Type /StructElem - /S /Formula - /P 3255 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161 162 163 164 165] - /Pg 4822 0 R ->> -endobj - -3257 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3258 0 R] ->> -endobj - -3258 0 obj -<< - /Type /StructElem - /S /Formula - /P 3257 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4822 0 R ->> -endobj - -3259 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3260 0 R] ->> -endobj - -3260 0 obj -<< - /Type /StructElem - /S /Formula - /P 3259 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155 156 157 158 159] - /Pg 4822 0 R ->> -endobj - -3261 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3262 0 R] ->> -endobj - -3262 0 obj -<< - /Type /StructElem - /S /Formula - /P 3261 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4822 0 R ->> -endobj - -3263 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3264 0 R] ->> -endobj - -3264 0 obj -<< - /Type /StructElem - /S /Formula - /P 3263 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [153] - /Pg 4822 0 R ->> -endobj - -3265 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3266 0 R] ->> -endobj - -3266 0 obj -<< - /Type /StructElem - /S /Formula - /P 3265 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [143 144 145 146 147 148 149 150 151 152] - /Pg 4822 0 R ->> -endobj - -3267 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3268 0 R] ->> -endobj - -3268 0 obj -<< - /Type /StructElem - /S /Formula - /P 3267 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [142] - /Pg 4822 0 R ->> -endobj - -3269 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3270 0 R] ->> -endobj - -3270 0 obj -<< - /Type /StructElem - /S /Formula - /P 3269 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [140 141] - /Pg 4822 0 R ->> -endobj - -3271 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3272 0 R] ->> -endobj - -3272 0 obj -<< - /Type /StructElem - /S /Formula - /P 3271 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139] - /Pg 4822 0 R ->> -endobj - -3273 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3274 0 R] ->> -endobj - -3274 0 obj -<< - /Type /StructElem - /S /Formula - /P 3273 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128 129 130 131 132 133 134 135 136 137 138] - /Pg 4822 0 R ->> -endobj - -3275 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3276 0 R] ->> -endobj - -3276 0 obj -<< - /Type /StructElem - /S /Formula - /P 3275 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [127] - /Pg 4822 0 R ->> -endobj - -3277 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3278 0 R] ->> -endobj - -3278 0 obj -<< - /Type /StructElem - /S /Formula - /P 3277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [126] - /Pg 4822 0 R ->> -endobj - -3279 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3280 0 R] ->> -endobj - -3280 0 obj -<< - /Type /StructElem - /S /Formula - /P 3279 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [119 120 121 122 123 124 125] - /Pg 4822 0 R ->> -endobj - -3281 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3282 0 R] ->> -endobj - -3282 0 obj -<< - /Type /StructElem - /S /Formula - /P 3281 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118] - /Pg 4822 0 R ->> -endobj - -3283 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3284 0 R] ->> -endobj - -3284 0 obj -<< - /Type /StructElem - /S /Formula - /P 3283 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [113 114 115 116 117] - /Pg 4822 0 R ->> -endobj - -3285 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3286 0 R] ->> -endobj - -3286 0 obj -<< - /Type /StructElem - /S /Formula - /P 3285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [112] - /Pg 4822 0 R ->> -endobj - -3287 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3288 0 R] ->> -endobj - -3288 0 obj -<< - /Type /StructElem - /S /Formula - /P 3287 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [111] - /Pg 4822 0 R ->> -endobj - -3289 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3290 0 R] ->> -endobj - -3290 0 obj -<< - /Type /StructElem - /S /Formula - /P 3289 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [110] - /Pg 4822 0 R ->> -endobj - -3291 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3292 0 R] ->> -endobj - -3292 0 obj -<< - /Type /StructElem - /S /Formula - /P 3291 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [109] - /Pg 4822 0 R ->> -endobj - -3293 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3294 0 R] ->> -endobj - -3294 0 obj -<< - /Type /StructElem - /S /Formula - /P 3293 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [104 105 106 107 108] - /Pg 4822 0 R ->> -endobj - -3295 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3296 0 R] ->> -endobj - -3296 0 obj -<< - /Type /StructElem - /S /Formula - /P 3295 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [103] - /Pg 4822 0 R ->> -endobj - -3297 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3298 0 R] ->> -endobj - -3298 0 obj -<< - /Type /StructElem - /S /Formula - /P 3297 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [101 102] - /Pg 4822 0 R ->> -endobj - -3299 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3300 0 R] ->> -endobj - -3300 0 obj -<< - /Type /StructElem - /S /Formula - /P 3299 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [100] - /Pg 4822 0 R ->> -endobj - -3301 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3302 0 R] ->> -endobj - -3302 0 obj -<< - /Type /StructElem - /S /Formula - /P 3301 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [95 96 97 98 99] - /Pg 4822 0 R ->> -endobj - -3303 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3304 0 R] ->> -endobj - -3304 0 obj -<< - /Type /StructElem - /S /Formula - /P 3303 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94] - /Pg 4822 0 R ->> -endobj - -3305 0 obj -<< - /Type /StructElem - /S /Div - /P 3222 0 R - /K [3306 0 R] ->> -endobj - -3306 0 obj -<< - /Type /StructElem - /S /Formula - /P 3305 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4822 0 R ->> -endobj - -3307 0 obj -<< - /Type /StructElem - /S /P - /P 3221 0 R - /K [3312 0 R 83 3311 0 R 85 3310 0 R 87 3309 0 R 89 3308 0 R 92] - /Pg 4822 0 R ->> -endobj - -3308 0 obj -<< - /Type /StructElem - /S /Formula - /P 3307 0 R - /K [90 91] - /Pg 4822 0 R ->> -endobj - -3309 0 obj -<< - /Type /StructElem - /S /Formula - /P 3307 0 R - /K [88] - /Pg 4822 0 R ->> -endobj - -3310 0 obj -<< - /Type /StructElem - /S /Formula - /P 3307 0 R - /K [86] - /Pg 4822 0 R ->> -endobj - -3311 0 obj -<< - /Type /StructElem - /S /Formula - /P 3307 0 R - /K [84] - /Pg 4822 0 R ->> -endobj - -3312 0 obj -<< - /Type /StructElem - /S /Strong - /P 3307 0 R - /K [80 81 82] - /Pg 4822 0 R ->> -endobj - -3313 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [63 64 3317 0 R 66 3316 0 R 71 72 3315 0 R 74 3314 0 R 79] - /Pg 4822 0 R ->> -endobj - -3314 0 obj -<< - /Type /StructElem - /S /Formula - /P 3313 0 R - /K [75 76 77 78] - /Pg 4822 0 R ->> -endobj - -3315 0 obj -<< - /Type /StructElem - /S /Formula - /P 3313 0 R - /K [73] - /Pg 4822 0 R ->> -endobj - -3316 0 obj -<< - /Type /StructElem - /S /Formula - /P 3313 0 R - /K [67 68 69 70] - /Pg 4822 0 R ->> -endobj - -3317 0 obj -<< - /Type /StructElem - /S /Formula - /P 3313 0 R - /K [65] - /Pg 4822 0 R ->> -endobj - -3318 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3331 0 R 3330 0 R 3328 0 R 3319 0 R] ->> -endobj - -3319 0 obj -<< - /Type /StructElem - /S /L - /P 3318 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3324 0 R 3320 0 R] ->> -endobj - -3320 0 obj -<< - /Type /StructElem - /S /LI - /P 3319 0 R - /K [3323 0 R 3321 0 R] ->> -endobj - -3321 0 obj -<< - /Type /StructElem - /S /LBody - /P 3320 0 R - /K [3322 0 R 60 61 62] - /Pg 4822 0 R ->> -endobj - -3322 0 obj -<< - /Type /StructElem - /S /Formula - /P 3321 0 R - /K [50 51 52 53 54 55 56 57 58 59] - /Pg 4822 0 R ->> -endobj - -3323 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3320 0 R - /K [49] - /Pg 4822 0 R ->> -endobj - -3324 0 obj -<< - /Type /StructElem - /S /LI - /P 3319 0 R - /K [3327 0 R 3325 0 R] ->> -endobj - -3325 0 obj -<< - /Type /StructElem - /S /LBody - /P 3324 0 R - /K [3326 0 R 48] - /Pg 4822 0 R ->> -endobj - -3326 0 obj -<< - /Type /StructElem - /S /Formula - /P 3325 0 R - /K [40 41 42 43 44 45 46 47] - /Pg 4822 0 R ->> -endobj - -3327 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3324 0 R - /K [39] - /Pg 4822 0 R ->> -endobj - -3328 0 obj -<< - /Type /StructElem - /S /P - /P 3318 0 R - /K [32 3329 0 R 38] - /Pg 4822 0 R ->> -endobj - -3329 0 obj -<< - /Type /StructElem - /S /Formula - /P 3328 0 R - /K [33 34 35 36 37] - /Pg 4822 0 R ->> -endobj - -3330 0 obj -<< - /Type /StructElem - /S /Formula - /P 3318 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31] - /Pg 4822 0 R ->> -endobj - -3331 0 obj -<< - /Type /StructElem - /S /P - /P 3318 0 R - /K [3332 0 R 10] - /Pg 4822 0 R ->> -endobj - -3332 0 obj -<< - /Type /StructElem - /S /Strong - /P 3331 0 R - /K [7 8 9] - /Pg 4822 0 R ->> -endobj - -3333 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3335 0 R 1 3334 0 R 3 4 5 6] - /Pg 4822 0 R ->> -endobj - -3334 0 obj -<< - /Type /StructElem - /S /Em - /P 3333 0 R - /K [2] - /Pg 4822 0 R ->> -endobj - -3335 0 obj -<< - /Type /StructElem - /S /Strong - /P 3333 0 R - /K [0] - /Pg 4822 0 R ->> -endobj - -3336 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [193 3339 0 R 195 196 197 3338 0 R 199 200 3337 0 R 202 203] - /Pg 4820 0 R ->> -endobj - -3337 0 obj -<< - /Type /StructElem - /S /Em - /P 3336 0 R - /K [201] - /Pg 4820 0 R ->> -endobj - -3338 0 obj -<< - /Type /StructElem - /S /Em - /P 3336 0 R - /K [198] - /Pg 4820 0 R ->> -endobj - -3339 0 obj -<< - /Type /StructElem - /S /Formula - /P 3336 0 R - /K [194] - /Pg 4820 0 R ->> -endobj - -3340 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Isolation and Interception) - /K [191 192] - /Pg 4820 0 R ->> -endobj - -3341 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [131 3359 0 R 133 3358 0 R 135 3357 0 R 137 138 3356 0 R 140 3355 0 R 147 3354 0 R 149 3353 0 R 154 3352 0 R 156 3351 0 R 158 3350 0 R 160 3349 0 R 165 3348 0 R 172 3347 0 R 174 3346 0 R 176 3345 0 R 181 3344 0 R 183 3343 0 R 185 186 3342 0 R 188 189 190] - /Pg 4820 0 R ->> -endobj - -3342 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [187] - /Pg 4820 0 R ->> -endobj - -3343 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [184] - /Pg 4820 0 R ->> -endobj - -3344 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [182] - /Pg 4820 0 R ->> -endobj - -3345 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [177 178 179 180] - /Pg 4820 0 R ->> -endobj - -3346 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [175] - /Pg 4820 0 R ->> -endobj - -3347 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [173] - /Pg 4820 0 R ->> -endobj - -3348 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [166 167 168 169 170 171] - /Pg 4820 0 R ->> -endobj - -3349 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [161 162 163 164] - /Pg 4820 0 R ->> -endobj - -3350 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [159] - /Pg 4820 0 R ->> -endobj - -3351 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [157] - /Pg 4820 0 R ->> -endobj - -3352 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [155] - /Pg 4820 0 R ->> -endobj - -3353 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [150 151 152 153] - /Pg 4820 0 R ->> -endobj - -3354 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [148] - /Pg 4820 0 R ->> -endobj - -3355 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [141 142 143 144 145 146] - /Pg 4820 0 R ->> -endobj - -3356 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [139] - /Pg 4820 0 R ->> -endobj - -3357 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [136] - /Pg 4820 0 R ->> -endobj - -3358 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [134] - /Pg 4820 0 R ->> -endobj - -3359 0 obj -<< - /Type /StructElem - /S /Formula - /P 3341 0 R - /K [132] - /Pg 4820 0 R ->> -endobj - -3360 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [120 3362 0 R 124 125 126 127 128 3361 0 R 130] - /Pg 4820 0 R ->> -endobj - -3361 0 obj -<< - /Type /StructElem - /S /Link - /P 3360 0 R - /K [129 << - /Type /OBJR - /Pg 4820 0 R - /Obj 4819 0 R - >>] - /Pg 4820 0 R ->> -endobj - -3362 0 obj -<< - /Type /StructElem - /S /Formula - /P 3360 0 R - /K [121 122 123] - /Pg 4820 0 R ->> -endobj - -3363 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3365 0 R 3364 0 R] ->> -endobj - -3364 0 obj -<< - /Type /StructElem - /S /Formula - /P 3363 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119] - /Pg 4820 0 R ->> -endobj - -3365 0 obj -<< - /Type /StructElem - /S /P - /P 3363 0 R - /K [3368 0 R 75 3367 0 R 79 3366 0 R 86] - /Pg 4820 0 R ->> -endobj - -3366 0 obj -<< - /Type /StructElem - /S /Formula - /P 3365 0 R - /K [80 81 82 83 84 85] - /Pg 4820 0 R ->> -endobj - -3367 0 obj -<< - /Type /StructElem - /S /Formula - /P 3365 0 R - /K [76 77 78] - /Pg 4820 0 R ->> -endobj - -3368 0 obj -<< - /Type /StructElem - /S /Strong - /P 3365 0 R - /K [72 73 74] - /Pg 4820 0 R ->> -endobj - -3369 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [56 57 3373 0 R 59 3372 0 R 62 3371 0 R 67 3370 0 R 69 70 71] - /Pg 4820 0 R ->> -endobj - -3370 0 obj -<< - /Type /StructElem - /S /Formula - /P 3369 0 R - /K [68] - /Pg 4820 0 R ->> -endobj - -3371 0 obj -<< - /Type /StructElem - /S /Formula - /P 3369 0 R - /K [63 64 65 66] - /Pg 4820 0 R ->> -endobj - -3372 0 obj -<< - /Type /StructElem - /S /Formula - /P 3369 0 R - /K [60 61] - /Pg 4820 0 R ->> -endobj - -3373 0 obj -<< - /Type /StructElem - /S /Formula - /P 3369 0 R - /K [58] - /Pg 4820 0 R ->> -endobj - -3374 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3377 0 R 3376 0 R 3375 0 R] ->> -endobj - -3375 0 obj -<< - /Type /StructElem - /S /P - /P 3374 0 R - /K [55] - /Pg 4820 0 R ->> -endobj - -3376 0 obj -<< - /Type /StructElem - /S /Formula - /P 3374 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [47 48 49 50 51 52 53 54] - /Pg 4820 0 R ->> -endobj - -3377 0 obj -<< - /Type /StructElem - /S /P - /P 3374 0 R - /K [3379 0 R 44 3378 0 R 46] - /Pg 4820 0 R ->> -endobj - -3378 0 obj -<< - /Type /StructElem - /S /Em - /P 3377 0 R - /K [45] - /Pg 4820 0 R ->> -endobj - -3379 0 obj -<< - /Type /StructElem - /S /Strong - /P 3377 0 R - /K [41 42 43] - /Pg 4820 0 R ->> -endobj - -3380 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [30 3382 0 R 35 3381 0 R 37 38 39 40] - /Pg 4820 0 R ->> -endobj - -3381 0 obj -<< - /Type /StructElem - /S /Formula - /P 3380 0 R - /K [36] - /Pg 4820 0 R ->> -endobj - -3382 0 obj -<< - /Type /StructElem - /S /Formula - /P 3380 0 R - /K [31 32 33 34] - /Pg 4820 0 R ->> -endobj - -3383 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29] - /Pg 4820 0 R ->> -endobj - -3384 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [265 266 << - /Type /MCR - /MCID 0 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4820 0 R - >> 3387 0 R << - /Type /MCR - /MCID 6 - /Pg 4820 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4820 0 R - >> 3386 0 R << - /Type /MCR - /MCID 11 - /Pg 4820 0 R - >> 3385 0 R << - /Type /MCR - /MCID 13 - /Pg 4820 0 R - >>] - /Pg 4817 0 R ->> -endobj - -3385 0 obj -<< - /Type /StructElem - /S /Em - /P 3384 0 R - /K [12] - /Pg 4820 0 R ->> -endobj - -3386 0 obj -<< - /Type /StructElem - /S /Formula - /P 3384 0 R - /K [8 9 10] - /Pg 4820 0 R ->> -endobj - -3387 0 obj -<< - /Type /StructElem - /S /Formula - /P 3384 0 R - /K [5] - /Pg 4820 0 R ->> -endobj - -3388 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Specification and Notification) - /K [263 264] - /Pg 4817 0 R ->> -endobj - -3389 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [243 3393 0 R 250 3392 0 R 253 254 3391 0 R 256 3390 0 R 259 260 261 262] - /Pg 4817 0 R ->> -endobj - -3390 0 obj -<< - /Type /StructElem - /S /Formula - /P 3389 0 R - /K [257 258] - /Pg 4817 0 R ->> -endobj - -3391 0 obj -<< - /Type /StructElem - /S /Link - /P 3389 0 R - /K [255 << - /Type /OBJR - /Pg 4817 0 R - /Obj 4816 0 R - >>] - /Pg 4817 0 R ->> -endobj - -3392 0 obj -<< - /Type /StructElem - /S /Formula - /P 3389 0 R - /K [251 252] - /Pg 4817 0 R ->> -endobj - -3393 0 obj -<< - /Type /StructElem - /S /Formula - /P 3389 0 R - /K [244 245 246 247 248 249] - /Pg 4817 0 R ->> -endobj - -3394 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3457 0 R 3400 0 R 3395 0 R] ->> -endobj - -3395 0 obj -<< - /Type /StructElem - /S /P - /P 3394 0 R - /K [216 3399 0 R 221 3398 0 R 228 3397 0 R 235 3396 0 R 242] - /Pg 4817 0 R ->> -endobj - -3396 0 obj -<< - /Type /StructElem - /S /Formula - /P 3395 0 R - /K [236 237 238 239 240 241] - /Pg 4817 0 R ->> -endobj - -3397 0 obj -<< - /Type /StructElem - /S /Formula - /P 3395 0 R - /K [229 230 231 232 233 234] - /Pg 4817 0 R ->> -endobj - -3398 0 obj -<< - /Type /StructElem - /S /Formula - /P 3395 0 R - /K [222 223 224 225 226 227] - /Pg 4817 0 R ->> -endobj - -3399 0 obj -<< - /Type /StructElem - /S /Formula - /P 3395 0 R - /K [217 218 219 220] - /Pg 4817 0 R ->> -endobj - -3400 0 obj -<< - /Type /StructElem - /S /Div - /P 3394 0 R - /K [3455 0 R 3453 0 R 3451 0 R 3449 0 R 3447 0 R 3445 0 R 3443 0 R 3441 0 R 3439 0 R 3437 0 R 3435 0 R 3433 0 R 3431 0 R 3429 0 R 3427 0 R 3425 0 R 3423 0 R 3421 0 R 3419 0 R 3417 0 R 3415 0 R 3413 0 R 3411 0 R 3409 0 R 3407 0 R 3405 0 R 3403 0 R 3401 0 R] ->> -endobj - -3401 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3402 0 R] ->> -endobj - -3402 0 obj -<< - /Type /StructElem - /S /Formula - /P 3401 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215] - /Pg 4817 0 R ->> -endobj - -3403 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3404 0 R] ->> -endobj - -3404 0 obj -<< - /Type /StructElem - /S /Formula - /P 3403 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [198] - /Pg 4817 0 R ->> -endobj - -3405 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3406 0 R] ->> -endobj - -3406 0 obj -<< - /Type /StructElem - /S /Formula - /P 3405 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [197] - /Pg 4817 0 R ->> -endobj - -3407 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3408 0 R] ->> -endobj - -3408 0 obj -<< - /Type /StructElem - /S /Formula - /P 3407 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [196] - /Pg 4817 0 R ->> -endobj - -3409 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3410 0 R] ->> -endobj - -3410 0 obj -<< - /Type /StructElem - /S /Formula - /P 3409 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [191 192 193 194 195] - /Pg 4817 0 R ->> -endobj - -3411 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3412 0 R] ->> -endobj - -3412 0 obj -<< - /Type /StructElem - /S /Formula - /P 3411 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [190] - /Pg 4817 0 R ->> -endobj - -3413 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3414 0 R] ->> -endobj - -3414 0 obj -<< - /Type /StructElem - /S /Formula - /P 3413 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [189] - /Pg 4817 0 R ->> -endobj - -3415 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3416 0 R] ->> -endobj - -3416 0 obj -<< - /Type /StructElem - /S /Formula - /P 3415 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [182 183 184 185 186 187 188] - /Pg 4817 0 R ->> -endobj - -3417 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3418 0 R] ->> -endobj - -3418 0 obj -<< - /Type /StructElem - /S /Formula - /P 3417 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [181] - /Pg 4817 0 R ->> -endobj - -3419 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3420 0 R] ->> -endobj - -3420 0 obj -<< - /Type /StructElem - /S /Formula - /P 3419 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [180] - /Pg 4817 0 R ->> -endobj - -3421 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3422 0 R] ->> -endobj - -3422 0 obj -<< - /Type /StructElem - /S /Formula - /P 3421 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [179] - /Pg 4817 0 R ->> -endobj - -3423 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3424 0 R] ->> -endobj - -3424 0 obj -<< - /Type /StructElem - /S /Formula - /P 3423 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [171 172 173 174 175 176 177 178] - /Pg 4817 0 R ->> -endobj - -3425 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3426 0 R] ->> -endobj - -3426 0 obj -<< - /Type /StructElem - /S /Formula - /P 3425 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170] - /Pg 4817 0 R ->> -endobj - -3427 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3428 0 R] ->> -endobj - -3428 0 obj -<< - /Type /StructElem - /S /Formula - /P 3427 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [169] - /Pg 4817 0 R ->> -endobj - -3429 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3430 0 R] ->> -endobj - -3430 0 obj -<< - /Type /StructElem - /S /Formula - /P 3429 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [165 166 167 168] - /Pg 4817 0 R ->> -endobj - -3431 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3432 0 R] ->> -endobj - -3432 0 obj -<< - /Type /StructElem - /S /Formula - /P 3431 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [164] - /Pg 4817 0 R ->> -endobj - -3433 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3434 0 R] ->> -endobj - -3434 0 obj -<< - /Type /StructElem - /S /Formula - /P 3433 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [163] - /Pg 4817 0 R ->> -endobj - -3435 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3436 0 R] ->> -endobj - -3436 0 obj -<< - /Type /StructElem - /S /Formula - /P 3435 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [162] - /Pg 4817 0 R ->> -endobj - -3437 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3438 0 R] ->> -endobj - -3438 0 obj -<< - /Type /StructElem - /S /Formula - /P 3437 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [161] - /Pg 4817 0 R ->> -endobj - -3439 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3440 0 R] ->> -endobj - -3440 0 obj -<< - /Type /StructElem - /S /Formula - /P 3439 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [160] - /Pg 4817 0 R ->> -endobj - -3441 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3442 0 R] ->> -endobj - -3442 0 obj -<< - /Type /StructElem - /S /Formula - /P 3441 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [159] - /Pg 4817 0 R ->> -endobj - -3443 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3444 0 R] ->> -endobj - -3444 0 obj -<< - /Type /StructElem - /S /Formula - /P 3443 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [157 158] - /Pg 4817 0 R ->> -endobj - -3445 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3446 0 R] ->> -endobj - -3446 0 obj -<< - /Type /StructElem - /S /Formula - /P 3445 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156] - /Pg 4817 0 R ->> -endobj - -3447 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3448 0 R] ->> -endobj - -3448 0 obj -<< - /Type /StructElem - /S /Formula - /P 3447 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [155] - /Pg 4817 0 R ->> -endobj - -3449 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3450 0 R] ->> -endobj - -3450 0 obj -<< - /Type /StructElem - /S /Formula - /P 3449 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [154] - /Pg 4817 0 R ->> -endobj - -3451 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3452 0 R] ->> -endobj - -3452 0 obj -<< - /Type /StructElem - /S /Formula - /P 3451 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [149 150 151 152 153] - /Pg 4817 0 R ->> -endobj - -3453 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3454 0 R] ->> -endobj - -3454 0 obj -<< - /Type /StructElem - /S /Formula - /P 3453 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [148] - /Pg 4817 0 R ->> -endobj - -3455 0 obj -<< - /Type /StructElem - /S /Div - /P 3400 0 R - /K [3456 0 R] ->> -endobj - -3456 0 obj -<< - /Type /StructElem - /S /Formula - /P 3455 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [147] - /Pg 4817 0 R ->> -endobj - -3457 0 obj -<< - /Type /StructElem - /S /P - /P 3394 0 R - /K [3461 0 R 140 3460 0 R 142 3459 0 R 144 3458 0 R 146] - /Pg 4817 0 R ->> -endobj - -3458 0 obj -<< - /Type /StructElem - /S /Formula - /P 3457 0 R - /K [145] - /Pg 4817 0 R ->> -endobj - -3459 0 obj -<< - /Type /StructElem - /S /Formula - /P 3457 0 R - /K [143] - /Pg 4817 0 R ->> -endobj - -3460 0 obj -<< - /Type /StructElem - /S /Formula - /P 3457 0 R - /K [141] - /Pg 4817 0 R ->> -endobj - -3461 0 obj -<< - /Type /StructElem - /S /Strong - /P 3457 0 R - /K [137 138 139] - /Pg 4817 0 R ->> -endobj - -3462 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [112 3467 0 R 114 3466 0 R 116 117 3465 0 R 120 121 122 3464 0 R 129 3463 0 R 136] - /Pg 4817 0 R ->> -endobj - -3463 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [130 131 132 133 134 135] - /Pg 4817 0 R ->> -endobj - -3464 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [123 124 125 126 127 128] - /Pg 4817 0 R ->> -endobj - -3465 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [118 119] - /Pg 4817 0 R ->> -endobj - -3466 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [115] - /Pg 4817 0 R ->> -endobj - -3467 0 obj -<< - /Type /StructElem - /S /Formula - /P 3462 0 R - /K [113] - /Pg 4817 0 R ->> -endobj - -3468 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3494 0 R 3493 0 R 3489 0 R 3469 0 R] ->> -endobj - -3469 0 obj -<< - /Type /StructElem - /S /L - /P 3468 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3484 0 R 3479 0 R 3474 0 R 3470 0 R] ->> -endobj - -3470 0 obj -<< - /Type /StructElem - /S /LI - /P 3469 0 R - /K [3473 0 R 3471 0 R] ->> -endobj - -3471 0 obj -<< - /Type /StructElem - /S /LBody - /P 3470 0 R - /K [3472 0 R 111] - /Pg 4817 0 R ->> -endobj - -3472 0 obj -<< - /Type /StructElem - /S /Formula - /P 3471 0 R - /K [105 106 107 108 109 110] - /Pg 4817 0 R ->> -endobj - -3473 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3470 0 R - /K [104] - /Pg 4817 0 R ->> -endobj - -3474 0 obj -<< - /Type /StructElem - /S /LI - /P 3469 0 R - /K [3478 0 R 3475 0 R] ->> -endobj - -3475 0 obj -<< - /Type /StructElem - /S /LBody - /P 3474 0 R - /K [3477 0 R 96 3476 0 R 103] - /Pg 4817 0 R ->> -endobj - -3476 0 obj -<< - /Type /StructElem - /S /Formula - /P 3475 0 R - /K [97 98 99 100 101 102] - /Pg 4817 0 R ->> -endobj - -3477 0 obj -<< - /Type /StructElem - /S /Formula - /P 3475 0 R - /K [93 94 95] - /Pg 4817 0 R ->> -endobj - -3478 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3474 0 R - /K [92] - /Pg 4817 0 R ->> -endobj - -3479 0 obj -<< - /Type /StructElem - /S /LI - /P 3469 0 R - /K [3483 0 R 3480 0 R] ->> -endobj - -3480 0 obj -<< - /Type /StructElem - /S /LBody - /P 3479 0 R - /K [3482 0 R 84 3481 0 R 91] - /Pg 4817 0 R ->> -endobj - -3481 0 obj -<< - /Type /StructElem - /S /Formula - /P 3480 0 R - /K [85 86 87 88 89 90] - /Pg 4817 0 R ->> -endobj - -3482 0 obj -<< - /Type /StructElem - /S /Formula - /P 3480 0 R - /K [78 79 80 81 82 83] - /Pg 4817 0 R ->> -endobj - -3483 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3479 0 R - /K [77] - /Pg 4817 0 R ->> -endobj - -3484 0 obj -<< - /Type /StructElem - /S /LI - /P 3469 0 R - /K [3488 0 R 3485 0 R] ->> -endobj - -3485 0 obj -<< - /Type /StructElem - /S /LBody - /P 3484 0 R - /K [3487 0 R 69 3486 0 R 76] - /Pg 4817 0 R ->> -endobj - -3486 0 obj -<< - /Type /StructElem - /S /Formula - /P 3485 0 R - /K [70 71 72 73 74 75] - /Pg 4817 0 R ->> -endobj - -3487 0 obj -<< - /Type /StructElem - /S /Formula - /P 3485 0 R - /K [65 66 67 68] - /Pg 4817 0 R ->> -endobj - -3488 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3484 0 R - /K [64] - /Pg 4817 0 R ->> -endobj - -3489 0 obj -<< - /Type /StructElem - /S /P - /P 3468 0 R - /K [46 3492 0 R 50 3491 0 R 59 3490 0 R 62 63] - /Pg 4817 0 R ->> -endobj - -3490 0 obj -<< - /Type /StructElem - /S /Formula - /P 3489 0 R - /K [60 61] - /Pg 4817 0 R ->> -endobj - -3491 0 obj -<< - /Type /StructElem - /S /Formula - /P 3489 0 R - /K [51 52 53 54 55 56 57 58] - /Pg 4817 0 R ->> -endobj - -3492 0 obj -<< - /Type /StructElem - /S /Formula - /P 3489 0 R - /K [47 48 49] - /Pg 4817 0 R ->> -endobj - -3493 0 obj -<< - /Type /StructElem - /S /Formula - /P 3468 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [35 36 37 38 39 40 41 42 43 44 45] - /Pg 4817 0 R ->> -endobj - -3494 0 obj -<< - /Type /StructElem - /S /P - /P 3468 0 R - /K [3497 0 R 25 3496 0 R 31 3495 0 R 33 34] - /Pg 4817 0 R ->> -endobj - -3495 0 obj -<< - /Type /StructElem - /S /Em - /P 3494 0 R - /K [32] - /Pg 4817 0 R ->> -endobj - -3496 0 obj -<< - /Type /StructElem - /S /Formula - /P 3494 0 R - /K [26 27 28 29 30] - /Pg 4817 0 R ->> -endobj - -3497 0 obj -<< - /Type /StructElem - /S /Strong - /P 3494 0 R - /K [22 23 24] - /Pg 4817 0 R ->> -endobj - -3498 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [13 14 3500 0 R 16 3499 0 R 18 19 20 21] - /Pg 4817 0 R ->> -endobj - -3499 0 obj -<< - /Type /StructElem - /S /Link - /P 3498 0 R - /K [17 << - /Type /OBJR - /Pg 4817 0 R - /Obj 4815 0 R - >>] - /Pg 4817 0 R ->> -endobj - -3500 0 obj -<< - /Type /StructElem - /S /Link - /P 3498 0 R - /K [15 << - /Type /OBJR - /Pg 4817 0 R - /Obj 4814 0 R - >>] - /Pg 4817 0 R ->> -endobj - -3501 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Coeffect Context) - /K [11 12] - /Pg 4817 0 R ->> -endobj - -3502 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3504 0 R 239 240 241 << - /Type /MCR - /MCID 0 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 2 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 3 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4817 0 R - >> 3503 0 R << - /Type /MCR - /MCID 7 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 8 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 9 - /Pg 4817 0 R - >> << - /Type /MCR - /MCID 10 - /Pg 4817 0 R - >>] - /Pg 4812 0 R ->> -endobj - -3503 0 obj -<< - /Type /StructElem - /S /Em - /P 3502 0 R - /K [6] - /Pg 4817 0 R ->> -endobj - -3504 0 obj -<< - /Type /StructElem - /S /Em - /P 3502 0 R - /K [238] - /Pg 4812 0 R ->> -endobj - -3505 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Reactive Coeffects) - /K [236 237] - /Pg 4812 0 R ->> -endobj - -3506 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [213 3512 0 R 215 3511 0 R 223 3510 0 R 225 3509 0 R 227 228 229 230 3508 0 R 232 233 3507 0 R 235] - /Pg 4812 0 R ->> -endobj - -3507 0 obj -<< - /Type /StructElem - /S /Link - /P 3506 0 R - /K [234 << - /Type /OBJR - /Pg 4812 0 R - /Obj 4811 0 R - >>] - /Pg 4812 0 R ->> -endobj - -3508 0 obj -<< - /Type /StructElem - /S /Link - /P 3506 0 R - /K [231 << - /Type /OBJR - /Pg 4812 0 R - /Obj 4810 0 R - >>] - /Pg 4812 0 R ->> -endobj - -3509 0 obj -<< - /Type /StructElem - /S /Formula - /P 3506 0 R - /K [226] - /Pg 4812 0 R ->> -endobj - -3510 0 obj -<< - /Type /StructElem - /S /Formula - /P 3506 0 R - /K [224] - /Pg 4812 0 R ->> -endobj - -3511 0 obj -<< - /Type /StructElem - /S /Formula - /P 3506 0 R - /K [216 217 218 219 220 221 222] - /Pg 4812 0 R ->> -endobj - -3512 0 obj -<< - /Type /StructElem - /S /Formula - /P 3506 0 R - /K [214] - /Pg 4812 0 R ->> -endobj - -3513 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [190 3520 0 R 192 3519 0 R 196 197 3518 0 R 199 3517 0 R 202 3516 0 R 204 205 206 207 3515 0 R 209 3514 0 R 211 212] - /Pg 4812 0 R ->> -endobj - -3514 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [210] - /Pg 4812 0 R ->> -endobj - -3515 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [208] - /Pg 4812 0 R ->> -endobj - -3516 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [203] - /Pg 4812 0 R ->> -endobj - -3517 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [200 201] - /Pg 4812 0 R ->> -endobj - -3518 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [198] - /Pg 4812 0 R ->> -endobj - -3519 0 obj -<< - /Type /StructElem - /S /Formula - /P 3513 0 R - /K [193 194 195] - /Pg 4812 0 R ->> -endobj - -3520 0 obj -<< - /Type /StructElem - /S /Em - /P 3513 0 R - /K [191] - /Pg 4812 0 R ->> -endobj - -3521 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3523 0 R 3522 0 R] ->> -endobj - -3522 0 obj -<< - /Type /StructElem - /S /Formula - /P 3521 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189] - /Pg 4812 0 R ->> -endobj - -3523 0 obj -<< - /Type /StructElem - /S /P - /P 3521 0 R - /K [3527 0 R 157 3526 0 R 159 3525 0 R 161 3524 0 R 169] - /Pg 4812 0 R ->> -endobj - -3524 0 obj -<< - /Type /StructElem - /S /Formula - /P 3523 0 R - /K [162 163 164 165 166 167 168] - /Pg 4812 0 R ->> -endobj - -3525 0 obj -<< - /Type /StructElem - /S /Formula - /P 3523 0 R - /K [160] - /Pg 4812 0 R ->> -endobj - -3526 0 obj -<< - /Type /StructElem - /S /Formula - /P 3523 0 R - /K [158] - /Pg 4812 0 R ->> -endobj - -3527 0 obj -<< - /Type /StructElem - /S /Strong - /P 3523 0 R - /K [154 155 156] - /Pg 4812 0 R ->> -endobj - -3528 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [151 3529 0 R 153] - /Pg 4812 0 R ->> -endobj - -3529 0 obj -<< - /Type /StructElem - /S /Formula - /P 3528 0 R - /K [152] - /Pg 4812 0 R ->> -endobj - -3530 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3538 0 R 3537 0 R 3536 0 R 3535 0 R 3534 0 R 3533 0 R 3532 0 R 3531 0 R] ->> -endobj - -3531 0 obj -<< - /Type /StructElem - /S /Span - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [150] - /Pg 4812 0 R ->> -endobj - -3532 0 obj -<< - /Type /StructElem - /S /Formula - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149] - /Pg 4812 0 R ->> -endobj - -3533 0 obj -<< - /Type /StructElem - /S /Span - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [133] - /Pg 4812 0 R ->> -endobj - -3534 0 obj -<< - /Type /StructElem - /S /Formula - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [131 132] - /Pg 4812 0 R ->> -endobj - -3535 0 obj -<< - /Type /StructElem - /S /Span - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [130] - /Pg 4812 0 R ->> -endobj - -3536 0 obj -<< - /Type /StructElem - /S /Formula - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [129] - /Pg 4812 0 R ->> -endobj - -3537 0 obj -<< - /Type /StructElem - /S /Span - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [128] - /Pg 4812 0 R ->> -endobj - -3538 0 obj -<< - /Type /StructElem - /S /Strong - /P 3530 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [125 126 127] - /Pg 4812 0 R ->> -endobj - -3539 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3563 0 R 3540 0 R] ->> -endobj - -3540 0 obj -<< - /Type /StructElem - /S /Div - /P 3539 0 R - /K [3561 0 R 3559 0 R 3557 0 R 3555 0 R 3553 0 R 3551 0 R 3549 0 R 3547 0 R 3545 0 R 3541 0 R] ->> -endobj - -3541 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3544 0 R 3543 0 R 3542 0 R] ->> -endobj - -3542 0 obj -<< - /Type /StructElem - /S /Formula - /P 3541 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [118 119 120 121 122 123 124] - /Pg 4812 0 R ->> -endobj - -3543 0 obj -<< - /Type /StructElem - /S /Formula - /P 3541 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [106 107 108 109 110 111 112 113 114 115 116 117] - /Pg 4812 0 R ->> -endobj - -3544 0 obj -<< - /Type /StructElem - /S /Formula - /P 3541 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [94 95 96 97 98 99 100 101 102 103 104 105] - /Pg 4812 0 R ->> -endobj - -3545 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3546 0 R] ->> -endobj - -3546 0 obj -<< - /Type /StructElem - /S /Formula - /P 3545 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [93] - /Pg 4812 0 R ->> -endobj - -3547 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3548 0 R] ->> -endobj - -3548 0 obj -<< - /Type /StructElem - /S /Formula - /P 3547 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [92] - /Pg 4812 0 R ->> -endobj - -3549 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3550 0 R] ->> -endobj - -3550 0 obj -<< - /Type /StructElem - /S /Formula - /P 3549 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [91] - /Pg 4812 0 R ->> -endobj - -3551 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3552 0 R] ->> -endobj - -3552 0 obj -<< - /Type /StructElem - /S /Formula - /P 3551 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [88 89 90] - /Pg 4812 0 R ->> -endobj - -3553 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3554 0 R] ->> -endobj - -3554 0 obj -<< - /Type /StructElem - /S /Formula - /P 3553 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [86 87] - /Pg 4812 0 R ->> -endobj - -3555 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3556 0 R] ->> -endobj - -3556 0 obj -<< - /Type /StructElem - /S /Formula - /P 3555 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [85] - /Pg 4812 0 R ->> -endobj - -3557 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3558 0 R] ->> -endobj - -3558 0 obj -<< - /Type /StructElem - /S /Formula - /P 3557 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84] - /Pg 4812 0 R ->> -endobj - -3559 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3560 0 R] ->> -endobj - -3560 0 obj -<< - /Type /StructElem - /S /Formula - /P 3559 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [83] - /Pg 4812 0 R ->> -endobj - -3561 0 obj -<< - /Type /StructElem - /S /Div - /P 3540 0 R - /K [3562 0 R] ->> -endobj - -3562 0 obj -<< - /Type /StructElem - /S /Formula - /P 3561 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [80 81 82] - /Pg 4812 0 R ->> -endobj - -3563 0 obj -<< - /Type /StructElem - /S /P - /P 3539 0 R - /K [3566 0 R 68 3565 0 R 75 3564 0 R 79] - /Pg 4812 0 R ->> -endobj - -3564 0 obj -<< - /Type /StructElem - /S /Formula - /P 3563 0 R - /K [76 77 78] - /Pg 4812 0 R ->> -endobj - -3565 0 obj -<< - /Type /StructElem - /S /Formula - /P 3563 0 R - /K [69 70 71 72 73 74] - /Pg 4812 0 R ->> -endobj - -3566 0 obj -<< - /Type /StructElem - /S /Strong - /P 3563 0 R - /K [65 66 67] - /Pg 4812 0 R ->> -endobj - -3567 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [60 3568 0 R 63 64] - /Pg 4812 0 R ->> -endobj - -3568 0 obj -<< - /Type /StructElem - /S /Formula - /P 3567 0 R - /K [61 62] - /Pg 4812 0 R ->> -endobj - -3569 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3577 0 R 3576 0 R 3575 0 R 3574 0 R 3573 0 R 3572 0 R 3571 0 R 3570 0 R] ->> -endobj - -3570 0 obj -<< - /Type /StructElem - /S /Span - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59] - /Pg 4812 0 R ->> -endobj - -3571 0 obj -<< - /Type /StructElem - /S /Formula - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58] - /Pg 4812 0 R ->> -endobj - -3572 0 obj -<< - /Type /StructElem - /S /Span - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41] - /Pg 4812 0 R ->> -endobj - -3573 0 obj -<< - /Type /StructElem - /S /Formula - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [39 40] - /Pg 4812 0 R ->> -endobj - -3574 0 obj -<< - /Type /StructElem - /S /Span - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [38] - /Pg 4812 0 R ->> -endobj - -3575 0 obj -<< - /Type /StructElem - /S /Formula - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [37] - /Pg 4812 0 R ->> -endobj - -3576 0 obj -<< - /Type /StructElem - /S /Span - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [36] - /Pg 4812 0 R ->> -endobj - -3577 0 obj -<< - /Type /StructElem - /S /Strong - /P 3569 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33 34 35] - /Pg 4812 0 R ->> -endobj - -3578 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3594 0 R 3593 0 R 3592 0 R 3591 0 R 3590 0 R 3589 0 R 3588 0 R 3587 0 R 3586 0 R 3585 0 R 3584 0 R 23 3583 0 R 3582 0 R 3581 0 R 3580 0 R 3579 0 R] - /Pg 4812 0 R ->> -endobj - -3579 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [30 31 32] - /Pg 4812 0 R ->> -endobj - -3580 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [28 29] - /Pg 4812 0 R ->> -endobj - -3581 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [26 27] - /Pg 4812 0 R ->> -endobj - -3582 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [25] - /Pg 4812 0 R ->> -endobj - -3583 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [24] - /Pg 4812 0 R ->> -endobj - -3584 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [21 22] - /Pg 4812 0 R ->> -endobj - -3585 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [19 20] - /Pg 4812 0 R ->> -endobj - -3586 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [17 18] - /Pg 4812 0 R ->> -endobj - -3587 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [15 16] - /Pg 4812 0 R ->> -endobj - -3588 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [13 14] - /Pg 4812 0 R ->> -endobj - -3589 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [11 12] - /Pg 4812 0 R ->> -endobj - -3590 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [10] - /Pg 4812 0 R ->> -endobj - -3591 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [6 7 8 9] - /Pg 4812 0 R ->> -endobj - -3592 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [3 4 5] - /Pg 4812 0 R ->> -endobj - -3593 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [1 2] - /Pg 4812 0 R ->> -endobj - -3594 0 obj -<< - /Type /StructElem - /S /Formula - /P 3578 0 R - /K [0] - /Pg 4812 0 R ->> -endobj - -3595 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [263 3597 0 R 266 3596 0 R 270 271] - /Pg 4808 0 R ->> -endobj - -3596 0 obj -<< - /Type /StructElem - /S /Formula - /P 3595 0 R - /K [267 268 269] - /Pg 4808 0 R ->> -endobj - -3597 0 obj -<< - /Type /StructElem - /S /Formula - /P 3595 0 R - /K [264 265] - /Pg 4808 0 R ->> -endobj - -3598 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3629 0 R 3599 0 R] ->> -endobj - -3599 0 obj -<< - /Type /StructElem - /S /Div - /P 3598 0 R - /K [3627 0 R 3625 0 R 3623 0 R 3621 0 R 3619 0 R 3617 0 R 3615 0 R 3613 0 R 3611 0 R 3609 0 R 3607 0 R 3605 0 R 3603 0 R 3600 0 R] ->> -endobj - -3600 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3602 0 R 3601 0 R] ->> -endobj - -3601 0 obj -<< - /Type /StructElem - /S /Formula - /P 3600 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [248 249 250 251 252 253 254 255 256 257 258 259 260 261 262] - /Pg 4808 0 R ->> -endobj - -3602 0 obj -<< - /Type /StructElem - /S /Formula - /P 3600 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [236 237 238 239 240 241 242 243 244 245 246 247] - /Pg 4808 0 R ->> -endobj - -3603 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3604 0 R] ->> -endobj - -3604 0 obj -<< - /Type /StructElem - /S /Formula - /P 3603 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [235] - /Pg 4808 0 R ->> -endobj - -3605 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3606 0 R] ->> -endobj - -3606 0 obj -<< - /Type /StructElem - /S /Formula - /P 3605 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [230 231 232 233 234] - /Pg 4808 0 R ->> -endobj - -3607 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3608 0 R] ->> -endobj - -3608 0 obj -<< - /Type /StructElem - /S /Formula - /P 3607 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [229] - /Pg 4808 0 R ->> -endobj - -3609 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3610 0 R] ->> -endobj - -3610 0 obj -<< - /Type /StructElem - /S /Formula - /P 3609 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [228] - /Pg 4808 0 R ->> -endobj - -3611 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3612 0 R] ->> -endobj - -3612 0 obj -<< - /Type /StructElem - /S /Formula - /P 3611 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [227] - /Pg 4808 0 R ->> -endobj - -3613 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3614 0 R] ->> -endobj - -3614 0 obj -<< - /Type /StructElem - /S /Formula - /P 3613 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [225 226] - /Pg 4808 0 R ->> -endobj - -3615 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3616 0 R] ->> -endobj - -3616 0 obj -<< - /Type /StructElem - /S /Formula - /P 3615 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [222 223 224] - /Pg 4808 0 R ->> -endobj - -3617 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3618 0 R] ->> -endobj - -3618 0 obj -<< - /Type /StructElem - /S /Formula - /P 3617 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [221] - /Pg 4808 0 R ->> -endobj - -3619 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3620 0 R] ->> -endobj - -3620 0 obj -<< - /Type /StructElem - /S /Formula - /P 3619 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [219 220] - /Pg 4808 0 R ->> -endobj - -3621 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3622 0 R] ->> -endobj - -3622 0 obj -<< - /Type /StructElem - /S /Formula - /P 3621 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [218] - /Pg 4808 0 R ->> -endobj - -3623 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3624 0 R] ->> -endobj - -3624 0 obj -<< - /Type /StructElem - /S /Formula - /P 3623 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [216 217] - /Pg 4808 0 R ->> -endobj - -3625 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3626 0 R] ->> -endobj - -3626 0 obj -<< - /Type /StructElem - /S /Formula - /P 3625 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [215] - /Pg 4808 0 R ->> -endobj - -3627 0 obj -<< - /Type /StructElem - /S /Div - /P 3599 0 R - /K [3628 0 R] ->> -endobj - -3628 0 obj -<< - /Type /StructElem - /S /Formula - /P 3627 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [213 214] - /Pg 4808 0 R ->> -endobj - -3629 0 obj -<< - /Type /StructElem - /S /P - /P 3598 0 R - /K [3631 0 R 209 3630 0 R 212] - /Pg 4808 0 R ->> -endobj - -3630 0 obj -<< - /Type /StructElem - /S /Formula - /P 3629 0 R - /K [210 211] - /Pg 4808 0 R ->> -endobj - -3631 0 obj -<< - /Type /StructElem - /S /Strong - /P 3629 0 R - /K [206 207 208] - /Pg 4808 0 R ->> -endobj - -3632 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [191 3636 0 R 194 3635 0 R 198 3634 0 R 201 3633 0 R 205] - /Pg 4808 0 R ->> -endobj - -3633 0 obj -<< - /Type /StructElem - /S /Formula - /P 3632 0 R - /K [202 203 204] - /Pg 4808 0 R ->> -endobj - -3634 0 obj -<< - /Type /StructElem - /S /Formula - /P 3632 0 R - /K [199 200] - /Pg 4808 0 R ->> -endobj - -3635 0 obj -<< - /Type /StructElem - /S /Formula - /P 3632 0 R - /K [195 196 197] - /Pg 4808 0 R ->> -endobj - -3636 0 obj -<< - /Type /StructElem - /S /Formula - /P 3632 0 R - /K [192 193] - /Pg 4808 0 R ->> -endobj - -3637 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3645 0 R 3644 0 R 3643 0 R 3642 0 R 3641 0 R 3640 0 R 3639 0 R 3638 0 R] ->> -endobj - -3638 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [189 190] - /Pg 4808 0 R ->> -endobj - -3639 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [188] - /Pg 4808 0 R ->> -endobj - -3640 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [187] - /Pg 4808 0 R ->> -endobj - -3641 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [185 186] - /Pg 4808 0 R ->> -endobj - -3642 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [183 184] - /Pg 4808 0 R ->> -endobj - -3643 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [182] - /Pg 4808 0 R ->> -endobj - -3644 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [179 180 181] - /Pg 4808 0 R ->> -endobj - -3645 0 obj -<< - /Type /StructElem - /S /Formula - /P 3637 0 R - /K [178] - /Pg 4808 0 R ->> -endobj - -3646 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [167 3647 0 R 174 175 176 177] - /Pg 4808 0 R ->> -endobj - -3647 0 obj -<< - /Type /StructElem - /S /Formula - /P 3646 0 R - /K [168 169 170 171 172 173] - /Pg 4808 0 R ->> -endobj - -3648 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3662 0 R 3661 0 R 3658 0 R 3649 0 R] ->> -endobj - -3649 0 obj -<< - /Type /StructElem - /S /L - /P 3648 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3654 0 R 3650 0 R] ->> -endobj - -3650 0 obj -<< - /Type /StructElem - /S /LI - /P 3649 0 R - /K [3653 0 R 3651 0 R] ->> -endobj - -3651 0 obj -<< - /Type /StructElem - /S /LBody - /P 3650 0 R - /K [3652 0 R 166] - /Pg 4808 0 R ->> -endobj - -3652 0 obj -<< - /Type /StructElem - /S /Formula - /P 3651 0 R - /K [161 162 163 164 165] - /Pg 4808 0 R ->> -endobj - -3653 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3650 0 R - /K [160] - /Pg 4808 0 R ->> -endobj - -3654 0 obj -<< - /Type /StructElem - /S /LI - /P 3649 0 R - /K [3657 0 R 3655 0 R] ->> -endobj - -3655 0 obj -<< - /Type /StructElem - /S /LBody - /P 3654 0 R - /K [3656 0 R 159] - /Pg 4808 0 R ->> -endobj - -3656 0 obj -<< - /Type /StructElem - /S /Formula - /P 3655 0 R - /K [156 157 158] - /Pg 4808 0 R ->> -endobj - -3657 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3654 0 R - /K [155] - /Pg 4808 0 R ->> -endobj - -3658 0 obj -<< - /Type /StructElem - /S /P - /P 3648 0 R - /K [143 3660 0 R 148 3659 0 R 154] - /Pg 4808 0 R ->> -endobj - -3659 0 obj -<< - /Type /StructElem - /S /Formula - /P 3658 0 R - /K [149 150 151 152 153] - /Pg 4808 0 R ->> -endobj - -3660 0 obj -<< - /Type /StructElem - /S /Formula - /P 3658 0 R - /K [144 145 146 147] - /Pg 4808 0 R ->> -endobj - -3661 0 obj -<< - /Type /StructElem - /S /Formula - /P 3648 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142] - /Pg 4808 0 R ->> -endobj - -3662 0 obj -<< - /Type /StructElem - /S /P - /P 3648 0 R - /K [3665 0 R 76 3664 0 R 79 3663 0 R 83] - /Pg 4808 0 R ->> -endobj - -3663 0 obj -<< - /Type /StructElem - /S /Formula - /P 3662 0 R - /K [80 81 82] - /Pg 4808 0 R ->> -endobj - -3664 0 obj -<< - /Type /StructElem - /S /Formula - /P 3662 0 R - /K [77 78] - /Pg 4808 0 R ->> -endobj - -3665 0 obj -<< - /Type /StructElem - /S /Strong - /P 3662 0 R - /K [73 74 75] - /Pg 4808 0 R ->> -endobj - -3666 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [60 61 62 3669 0 R 65 3668 0 R 68 3667 0 R 72] - /Pg 4808 0 R ->> -endobj - -3667 0 obj -<< - /Type /StructElem - /S /Formula - /P 3666 0 R - /K [69 70 71] - /Pg 4808 0 R ->> -endobj - -3668 0 obj -<< - /Type /StructElem - /S /Formula - /P 3666 0 R - /K [66 67] - /Pg 4808 0 R ->> -endobj - -3669 0 obj -<< - /Type /StructElem - /S /Formula - /P 3666 0 R - /K [63 64] - /Pg 4808 0 R ->> -endobj - -3670 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Decimal - >>] - /K [3677 0 R 3671 0 R] ->> -endobj - -3671 0 obj -<< - /Type /StructElem - /S /LI - /P 3670 0 R - /K [3676 0 R 3672 0 R] ->> -endobj - -3672 0 obj -<< - /Type /StructElem - /S /LBody - /P 3671 0 R - /K [34 3675 0 R 37 38 3674 0 R 52 3673 0 R 59] - /Pg 4808 0 R ->> -endobj - -3673 0 obj -<< - /Type /StructElem - /S /Formula - /P 3672 0 R - /K [53 54 55 56 57 58] - /Pg 4808 0 R ->> -endobj - -3674 0 obj -<< - /Type /StructElem - /S /Formula - /P 3672 0 R - /K [39 40 41 42 43 44 45 46 47 48 49 50 51] - /Pg 4808 0 R ->> -endobj - -3675 0 obj -<< - /Type /StructElem - /S /Formula - /P 3672 0 R - /K [35 36] - /Pg 4808 0 R ->> -endobj - -3676 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3671 0 R - /K [33] - /Pg 4808 0 R ->> -endobj - -3677 0 obj -<< - /Type /StructElem - /S /LI - /P 3670 0 R - /K [3682 0 R 3678 0 R] ->> -endobj - -3678 0 obj -<< - /Type /StructElem - /S /LBody - /P 3677 0 R - /K [14 3681 0 R 16 17 3680 0 R 27 3679 0 R 32] - /Pg 4808 0 R ->> -endobj - -3679 0 obj -<< - /Type /StructElem - /S /Formula - /P 3678 0 R - /K [28 29 30 31] - /Pg 4808 0 R ->> -endobj - -3680 0 obj -<< - /Type /StructElem - /S /Formula - /P 3678 0 R - /K [18 19 20 21 22 23 24 25 26] - /Pg 4808 0 R ->> -endobj - -3681 0 obj -<< - /Type /StructElem - /S /Formula - /P 3678 0 R - /K [15] - /Pg 4808 0 R ->> -endobj - -3682 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3677 0 R - /K [13] - /Pg 4808 0 R ->> -endobj - -3683 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3686 0 R 4 3685 0 R 6 7 8 3684 0 R 10 11 12] - /Pg 4808 0 R ->> -endobj - -3684 0 obj -<< - /Type /StructElem - /S /Formula - /P 3683 0 R - /K [9] - /Pg 4808 0 R ->> -endobj - -3685 0 obj -<< - /Type /StructElem - /S /Formula - /P 3683 0 R - /K [5] - /Pg 4808 0 R ->> -endobj - -3686 0 obj -<< - /Type /StructElem - /S /Formula - /P 3683 0 R - /K [3] - /Pg 4808 0 R ->> -endobj - -3687 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Revertible Effect Functions) - /K [0 1] - /Pg 4808 0 R ->> -endobj - -3688 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3704 0 R 3703 0 R 3702 0 R 3701 0 R 3700 0 R 3699 0 R 3698 0 R 3697 0 R 3696 0 R 3695 0 R 3694 0 R 3693 0 R 3692 0 R 3691 0 R 3690 0 R 3689 0 R] ->> -endobj - -3689 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [342 343] - /Pg 4806 0 R ->> -endobj - -3690 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [340 341] - /Pg 4806 0 R ->> -endobj - -3691 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [338 339] - /Pg 4806 0 R ->> -endobj - -3692 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [336 337] - /Pg 4806 0 R ->> -endobj - -3693 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [335] - /Pg 4806 0 R ->> -endobj - -3694 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [334] - /Pg 4806 0 R ->> -endobj - -3695 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [333] - /Pg 4806 0 R ->> -endobj - -3696 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [332] - /Pg 4806 0 R ->> -endobj - -3697 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [331] - /Pg 4806 0 R ->> -endobj - -3698 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [330] - /Pg 4806 0 R ->> -endobj - -3699 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [329] - /Pg 4806 0 R ->> -endobj - -3700 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [328] - /Pg 4806 0 R ->> -endobj - -3701 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [325 326 327] - /Pg 4806 0 R ->> -endobj - -3702 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [322 323 324] - /Pg 4806 0 R ->> -endobj - -3703 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [320 321] - /Pg 4806 0 R ->> -endobj - -3704 0 obj -<< - /Type /StructElem - /S /Formula - /P 3688 0 R - /K [318 319] - /Pg 4806 0 R ->> -endobj - -3705 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [287 3712 0 R 289 3711 0 R 291 3710 0 R 293 294 3709 0 R 296 3708 0 R 298 299 3707 0 R 313 314 3706 0 R 317] - /Pg 4806 0 R ->> -endobj - -3706 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [315 316] - /Pg 4806 0 R ->> -endobj - -3707 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [300 301 302 303 304 305 306 307 308 309 310 311 312] - /Pg 4806 0 R ->> -endobj - -3708 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [297] - /Pg 4806 0 R ->> -endobj - -3709 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [295] - /Pg 4806 0 R ->> -endobj - -3710 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [292] - /Pg 4806 0 R ->> -endobj - -3711 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [290] - /Pg 4806 0 R ->> -endobj - -3712 0 obj -<< - /Type /StructElem - /S /Formula - /P 3705 0 R - /K [288] - /Pg 4806 0 R ->> -endobj - -3713 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3735 0 R 3714 0 R] ->> -endobj - -3714 0 obj -<< - /Type /StructElem - /S /Div - /P 3713 0 R - /K [3733 0 R 3731 0 R 3729 0 R 3727 0 R 3725 0 R 3723 0 R 3721 0 R 3719 0 R 3717 0 R 3715 0 R] ->> -endobj - -3715 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3716 0 R] ->> -endobj - -3716 0 obj -<< - /Type /StructElem - /S /Formula - /P 3715 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [278 279 280 281 282 283 284 285 286] - /Pg 4806 0 R ->> -endobj - -3717 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3718 0 R] ->> -endobj - -3718 0 obj -<< - /Type /StructElem - /S /Formula - /P 3717 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [277] - /Pg 4806 0 R ->> -endobj - -3719 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3720 0 R] ->> -endobj - -3720 0 obj -<< - /Type /StructElem - /S /Formula - /P 3719 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [272 273 274 275 276] - /Pg 4806 0 R ->> -endobj - -3721 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3722 0 R] ->> -endobj - -3722 0 obj -<< - /Type /StructElem - /S /Formula - /P 3721 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [271] - /Pg 4806 0 R ->> -endobj - -3723 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3724 0 R] ->> -endobj - -3724 0 obj -<< - /Type /StructElem - /S /Formula - /P 3723 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [269 270] - /Pg 4806 0 R ->> -endobj - -3725 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3726 0 R] ->> -endobj - -3726 0 obj -<< - /Type /StructElem - /S /Formula - /P 3725 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [267 268] - /Pg 4806 0 R ->> -endobj - -3727 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3728 0 R] ->> -endobj - -3728 0 obj -<< - /Type /StructElem - /S /Formula - /P 3727 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [266] - /Pg 4806 0 R ->> -endobj - -3729 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3730 0 R] ->> -endobj - -3730 0 obj -<< - /Type /StructElem - /S /Formula - /P 3729 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [264 265] - /Pg 4806 0 R ->> -endobj - -3731 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3732 0 R] ->> -endobj - -3732 0 obj -<< - /Type /StructElem - /S /Formula - /P 3731 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [263] - /Pg 4806 0 R ->> -endobj - -3733 0 obj -<< - /Type /StructElem - /S /Div - /P 3714 0 R - /K [3734 0 R] ->> -endobj - -3734 0 obj -<< - /Type /StructElem - /S /Formula - /P 3733 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [261 262] - /Pg 4806 0 R ->> -endobj - -3735 0 obj -<< - /Type /StructElem - /S /P - /P 3713 0 R - /K [3738 0 R 254 3737 0 R 257 3736 0 R 260] - /Pg 4806 0 R ->> -endobj - -3736 0 obj -<< - /Type /StructElem - /S /Formula - /P 3735 0 R - /K [258 259] - /Pg 4806 0 R ->> -endobj - -3737 0 obj -<< - /Type /StructElem - /S /Formula - /P 3735 0 R - /K [255 256] - /Pg 4806 0 R ->> -endobj - -3738 0 obj -<< - /Type /StructElem - /S /Strong - /P 3735 0 R - /K [251 252 253] - /Pg 4806 0 R ->> -endobj - -3739 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [241 3742 0 R 244 3741 0 R 246 247 3740 0 R 250] - /Pg 4806 0 R ->> -endobj - -3740 0 obj -<< - /Type /StructElem - /S /Formula - /P 3739 0 R - /K [248 249] - /Pg 4806 0 R ->> -endobj - -3741 0 obj -<< - /Type /StructElem - /S /Formula - /P 3739 0 R - /K [245] - /Pg 4806 0 R ->> -endobj - -3742 0 obj -<< - /Type /StructElem - /S /Formula - /P 3739 0 R - /K [242 243] - /Pg 4806 0 R ->> -endobj - -3743 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3745 0 R 3744 0 R] ->> -endobj - -3744 0 obj -<< - /Type /StructElem - /S /Formula - /P 3743 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240] - /Pg 4806 0 R ->> -endobj - -3745 0 obj -<< - /Type /StructElem - /S /P - /P 3743 0 R - /K [3749 0 R 208 3748 0 R 210 3747 0 R 212 3746 0 R 220] - /Pg 4806 0 R ->> -endobj - -3746 0 obj -<< - /Type /StructElem - /S /Formula - /P 3745 0 R - /K [213 214 215 216 217 218 219] - /Pg 4806 0 R ->> -endobj - -3747 0 obj -<< - /Type /StructElem - /S /Formula - /P 3745 0 R - /K [211] - /Pg 4806 0 R ->> -endobj - -3748 0 obj -<< - /Type /StructElem - /S /Formula - /P 3745 0 R - /K [209] - /Pg 4806 0 R ->> -endobj - -3749 0 obj -<< - /Type /StructElem - /S /Strong - /P 3745 0 R - /K [205 206 207] - /Pg 4806 0 R ->> -endobj - -3750 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3759 0 R 3758 0 R 3757 0 R 3756 0 R 3755 0 R 3754 0 R 3753 0 R 3752 0 R 3751 0 R] ->> -endobj - -3751 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [203 204] - /Pg 4806 0 R ->> -endobj - -3752 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [201 202] - /Pg 4806 0 R ->> -endobj - -3753 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [200] - /Pg 4806 0 R ->> -endobj - -3754 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [199] - /Pg 4806 0 R ->> -endobj - -3755 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [198] - /Pg 4806 0 R ->> -endobj - -3756 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [196 197] - /Pg 4806 0 R ->> -endobj - -3757 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [194 195] - /Pg 4806 0 R ->> -endobj - -3758 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [192 193] - /Pg 4806 0 R ->> -endobj - -3759 0 obj -<< - /Type /StructElem - /S /Formula - /P 3750 0 R - /K [191] - /Pg 4806 0 R ->> -endobj - -3760 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3764 0 R 3763 0 R 3762 0 R 3761 0 R] ->> -endobj - -3761 0 obj -<< - /Type /StructElem - /S /Span - /P 3760 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [190] - /Pg 4806 0 R ->> -endobj - -3762 0 obj -<< - /Type /StructElem - /S /Formula - /P 3760 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189] - /Pg 4806 0 R ->> -endobj - -3763 0 obj -<< - /Type /StructElem - /S /Span - /P 3760 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [170] - /Pg 4806 0 R ->> -endobj - -3764 0 obj -<< - /Type /StructElem - /S /Strong - /P 3760 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [167 168 169] - /Pg 4806 0 R ->> -endobj - -3765 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [78 3781 0 R 83 3780 0 R 85 86 3779 0 R 89 3778 0 R 95 3777 0 R 101 3776 0 R 103 3775 0 R 105 3774 0 R 107 3773 0 R 113 3772 0 R 116 117 3771 0 R 140 3770 0 R 143 144 3769 0 R 155 3768 0 R 157 3767 0 R 163 3766 0 R 166] - /Pg 4806 0 R ->> -endobj - -3766 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [164 165] - /Pg 4806 0 R ->> -endobj - -3767 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [158 159 160 161 162] - /Pg 4806 0 R ->> -endobj - -3768 0 obj -<< - /Type /StructElem - /S /Link - /P 3765 0 R - /K [156 << - /Type /OBJR - /Pg 4806 0 R - /Obj 4805 0 R - >>] - /Pg 4806 0 R ->> -endobj - -3769 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [145 146 147 148 149 150 151 152 153 154] - /Pg 4806 0 R ->> -endobj - -3770 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [141 142] - /Pg 4806 0 R ->> -endobj - -3771 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139] - /Pg 4806 0 R ->> -endobj - -3772 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [114 115] - /Pg 4806 0 R ->> -endobj - -3773 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [108 109 110 111 112] - /Pg 4806 0 R ->> -endobj - -3774 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [106] - /Pg 4806 0 R ->> -endobj - -3775 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [104] - /Pg 4806 0 R ->> -endobj - -3776 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [102] - /Pg 4806 0 R ->> -endobj - -3777 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [96 97 98 99 100] - /Pg 4806 0 R ->> -endobj - -3778 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [90 91 92 93 94] - /Pg 4806 0 R ->> -endobj - -3779 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [87 88] - /Pg 4806 0 R ->> -endobj - -3780 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [84] - /Pg 4806 0 R ->> -endobj - -3781 0 obj -<< - /Type /StructElem - /S /Formula - /P 3765 0 R - /K [79 80 81 82] - /Pg 4806 0 R ->> -endobj - -3782 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3812 0 R 3783 0 R] ->> -endobj - -3783 0 obj -<< - /Type /StructElem - /S /Div - /P 3782 0 R - /K [3810 0 R 3808 0 R 3806 0 R 3804 0 R 3802 0 R 3800 0 R 3798 0 R 3796 0 R 3794 0 R 3792 0 R 3790 0 R 3788 0 R 3786 0 R 3784 0 R] ->> -endobj - -3784 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3785 0 R] ->> -endobj - -3785 0 obj -<< - /Type /StructElem - /S /Formula - /P 3784 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [66 67 68 69 70 71 72 73 74 75 76 77] - /Pg 4806 0 R ->> -endobj - -3786 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3787 0 R] ->> -endobj - -3787 0 obj -<< - /Type /StructElem - /S /Formula - /P 3786 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [65] - /Pg 4806 0 R ->> -endobj - -3788 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3789 0 R] ->> -endobj - -3789 0 obj -<< - /Type /StructElem - /S /Formula - /P 3788 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [60 61 62 63 64] - /Pg 4806 0 R ->> -endobj - -3790 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3791 0 R] ->> -endobj - -3791 0 obj -<< - /Type /StructElem - /S /Formula - /P 3790 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [59] - /Pg 4806 0 R ->> -endobj - -3792 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3793 0 R] ->> -endobj - -3793 0 obj -<< - /Type /StructElem - /S /Formula - /P 3792 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [58] - /Pg 4806 0 R ->> -endobj - -3794 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3795 0 R] ->> -endobj - -3795 0 obj -<< - /Type /StructElem - /S /Formula - /P 3794 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [57] - /Pg 4806 0 R ->> -endobj - -3796 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3797 0 R] ->> -endobj - -3797 0 obj -<< - /Type /StructElem - /S /Formula - /P 3796 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [55 56] - /Pg 4806 0 R ->> -endobj - -3798 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3799 0 R] ->> -endobj - -3799 0 obj -<< - /Type /StructElem - /S /Formula - /P 3798 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [53 54] - /Pg 4806 0 R ->> -endobj - -3800 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3801 0 R] ->> -endobj - -3801 0 obj -<< - /Type /StructElem - /S /Formula - /P 3800 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [52] - /Pg 4806 0 R ->> -endobj - -3802 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3803 0 R] ->> -endobj - -3803 0 obj -<< - /Type /StructElem - /S /Formula - /P 3802 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [50 51] - /Pg 4806 0 R ->> -endobj - -3804 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3805 0 R] ->> -endobj - -3805 0 obj -<< - /Type /StructElem - /S /Formula - /P 3804 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [49] - /Pg 4806 0 R ->> -endobj - -3806 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3807 0 R] ->> -endobj - -3807 0 obj -<< - /Type /StructElem - /S /Formula - /P 3806 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [44 45 46 47 48] - /Pg 4806 0 R ->> -endobj - -3808 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3809 0 R] ->> -endobj - -3809 0 obj -<< - /Type /StructElem - /S /Formula - /P 3808 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [43] - /Pg 4806 0 R ->> -endobj - -3810 0 obj -<< - /Type /StructElem - /S /Div - /P 3783 0 R - /K [3811 0 R] ->> -endobj - -3811 0 obj -<< - /Type /StructElem - /S /Formula - /P 3810 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [41 42] - /Pg 4806 0 R ->> -endobj - -3812 0 obj -<< - /Type /StructElem - /S /P - /P 3782 0 R - /K [3816 0 R 30 3815 0 R 33 3814 0 R 36 3813 0 R 40] - /Pg 4806 0 R ->> -endobj - -3813 0 obj -<< - /Type /StructElem - /S /Formula - /P 3812 0 R - /K [37 38 39] - /Pg 4806 0 R ->> -endobj - -3814 0 obj -<< - /Type /StructElem - /S /Formula - /P 3812 0 R - /K [34 35] - /Pg 4806 0 R ->> -endobj - -3815 0 obj -<< - /Type /StructElem - /S /Formula - /P 3812 0 R - /K [31 32] - /Pg 4806 0 R ->> -endobj - -3816 0 obj -<< - /Type /StructElem - /S /Strong - /P 3812 0 R - /K [27 28 29] - /Pg 4806 0 R ->> -endobj - -3817 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [20 3819 0 R 22 3818 0 R 25 26] - /Pg 4806 0 R ->> -endobj - -3818 0 obj -<< - /Type /StructElem - /S /Formula - /P 3817 0 R - /K [23 24] - /Pg 4806 0 R ->> -endobj - -3819 0 obj -<< - /Type /StructElem - /S /Formula - /P 3817 0 R - /K [21] - /Pg 4806 0 R ->> -endobj - -3820 0 obj -<< - /Type /StructElem - /S /Div - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [3835 0 R 3834 0 R 3832 0 R 3823 0 R 3821 0 R] ->> -endobj - -3821 0 obj -<< - /Type /StructElem - /S /P - /P 3820 0 R - /K [11 3822 0 R 19] - /Pg 4806 0 R ->> -endobj - -3822 0 obj -<< - /Type /StructElem - /S /Formula - /P 3821 0 R - /K [12 13 14 15 16 17 18] - /Pg 4806 0 R ->> -endobj - -3823 0 obj -<< - /Type /StructElem - /S /L - /P 3820 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3828 0 R 3824 0 R] ->> -endobj - -3824 0 obj -<< - /Type /StructElem - /S /LI - /P 3823 0 R - /K [3827 0 R 3825 0 R] ->> -endobj - -3825 0 obj -<< - /Type /StructElem - /S /LBody - /P 3824 0 R - /K [3826 0 R 10] - /Pg 4806 0 R ->> -endobj - -3826 0 obj -<< - /Type /StructElem - /S /Formula - /P 3825 0 R - /K [6 7 8 9] - /Pg 4806 0 R ->> -endobj - -3827 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3824 0 R - /K [5] - /Pg 4806 0 R ->> -endobj - -3828 0 obj -<< - /Type /StructElem - /S /LI - /P 3823 0 R - /K [3831 0 R 3829 0 R] ->> -endobj - -3829 0 obj -<< - /Type /StructElem - /S /LBody - /P 3828 0 R - /K [3830 0 R 4] - /Pg 4806 0 R ->> -endobj - -3830 0 obj -<< - /Type /StructElem - /S /Formula - /P 3829 0 R - /K [1 2 3] - /Pg 4806 0 R ->> -endobj - -3831 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3828 0 R - /K [0] - /Pg 4806 0 R ->> -endobj - -3832 0 obj -<< - /Type /StructElem - /S /P - /P 3820 0 R - /K [164 3833 0 R 170] - /Pg 4803 0 R ->> -endobj - -3833 0 obj -<< - /Type /StructElem - /S /Formula - /P 3832 0 R - /K [165 166 167 168 169] - /Pg 4803 0 R ->> -endobj - -3834 0 obj -<< - /Type /StructElem - /S /Formula - /P 3820 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [156 157 158 159 160 161 162 163] - /Pg 4803 0 R ->> -endobj - -3835 0 obj -<< - /Type /StructElem - /S /P - /P 3820 0 R - /K [3838 0 R 151 3837 0 R 153 3836 0 R 155] - /Pg 4803 0 R ->> -endobj - -3836 0 obj -<< - /Type /StructElem - /S /Em - /P 3835 0 R - /K [154] - /Pg 4803 0 R ->> -endobj - -3837 0 obj -<< - /Type /StructElem - /S /Formula - /P 3835 0 R - /K [152] - /Pg 4803 0 R ->> -endobj - -3838 0 obj -<< - /Type /StructElem - /S /Strong - /P 3835 0 R - /K [148 149 150] - /Pg 4803 0 R ->> -endobj - -3839 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [147] - /Pg 4803 0 R ->> -endobj - -3840 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [128 3845 0 R 130 131 132 133 3844 0 R 135 3843 0 R 138 3842 0 R 141 142 143 3841 0 R 145 146] - /Pg 4803 0 R ->> -endobj - -3841 0 obj -<< - /Type /StructElem - /S /Link - /P 3840 0 R - /K [144 << - /Type /OBJR - /Pg 4803 0 R - /Obj 4802 0 R - >>] - /Pg 4803 0 R ->> -endobj - -3842 0 obj -<< - /Type /StructElem - /S /Formula - /P 3840 0 R - /K [139 140] - /Pg 4803 0 R ->> -endobj - -3843 0 obj -<< - /Type /StructElem - /S /Formula - /P 3840 0 R - /K [136 137] - /Pg 4803 0 R ->> -endobj - -3844 0 obj -<< - /Type /StructElem - /S /Formula - /P 3840 0 R - /K [134] - /Pg 4803 0 R ->> -endobj - -3845 0 obj -<< - /Type /StructElem - /S /Formula - /P 3840 0 R - /K [129] - /Pg 4803 0 R ->> -endobj - -3846 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3859 0 R 3853 0 R 3847 0 R] ->> -endobj - -3847 0 obj -<< - /Type /StructElem - /S /LI - /P 3846 0 R - /K [3852 0 R 3848 0 R] ->> -endobj - -3848 0 obj -<< - /Type /StructElem - /S /LBody - /P 3847 0 R - /K [3851 0 R 113 3850 0 R 118 3849 0 R 125 126 127] - /Pg 4803 0 R ->> -endobj - -3849 0 obj -<< - /Type /StructElem - /S /Formula - /P 3848 0 R - /K [119 120 121 122 123 124] - /Pg 4803 0 R ->> -endobj - -3850 0 obj -<< - /Type /StructElem - /S /Formula - /P 3848 0 R - /K [114 115 116 117] - /Pg 4803 0 R ->> -endobj - -3851 0 obj -<< - /Type /StructElem - /S /Em - /P 3848 0 R - /K [112] - /Pg 4803 0 R ->> -endobj - -3852 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3847 0 R - /K [111] - /Pg 4803 0 R ->> -endobj - -3853 0 obj -<< - /Type /StructElem - /S /LI - /P 3846 0 R - /K [3858 0 R 3854 0 R] ->> -endobj - -3854 0 obj -<< - /Type /StructElem - /S /LBody - /P 3853 0 R - /K [3857 0 R 105 3856 0 R 108 3855 0 R 110] - /Pg 4803 0 R ->> -endobj - -3855 0 obj -<< - /Type /StructElem - /S /Formula - /P 3854 0 R - /K [109] - /Pg 4803 0 R ->> -endobj - -3856 0 obj -<< - /Type /StructElem - /S /Formula - /P 3854 0 R - /K [106 107] - /Pg 4803 0 R ->> -endobj - -3857 0 obj -<< - /Type /StructElem - /S /Em - /P 3854 0 R - /K [104] - /Pg 4803 0 R ->> -endobj - -3858 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3853 0 R - /K [103] - /Pg 4803 0 R ->> -endobj - -3859 0 obj -<< - /Type /StructElem - /S /LI - /P 3846 0 R - /K [3862 0 R 3860 0 R] ->> -endobj - -3860 0 obj -<< - /Type /StructElem - /S /LBody - /P 3859 0 R - /K [3861 0 R 102] - /Pg 4803 0 R ->> -endobj - -3861 0 obj -<< - /Type /StructElem - /S /Em - /P 3860 0 R - /K [101] - /Pg 4803 0 R ->> -endobj - -3862 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3859 0 R - /K [100] - /Pg 4803 0 R ->> -endobj - -3863 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [44 3873 0 R 51 3872 0 R 61 3871 0 R 63 64 3870 0 R 66 3869 0 R 70 3868 0 R 83 3867 0 R 85 86 3866 0 R 88 3865 0 R 96 97 3864 0 R 99] - /Pg 4803 0 R ->> -endobj - -3864 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [98] - /Pg 4803 0 R ->> -endobj - -3865 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [89 90 91 92 93 94 95] - /Pg 4803 0 R ->> -endobj - -3866 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [87] - /Pg 4803 0 R ->> -endobj - -3867 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [84] - /Pg 4803 0 R ->> -endobj - -3868 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [71 72 73 74 75 76 77 78 79 80 81 82] - /Pg 4803 0 R ->> -endobj - -3869 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [67 68 69] - /Pg 4803 0 R ->> -endobj - -3870 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [65] - /Pg 4803 0 R ->> -endobj - -3871 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [62] - /Pg 4803 0 R ->> -endobj - -3872 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [52 53 54 55 56 57 58 59 60] - /Pg 4803 0 R ->> -endobj - -3873 0 obj -<< - /Type /StructElem - /S /Formula - /P 3863 0 R - /K [45 46 47 48 49 50] - /Pg 4803 0 R ->> -endobj - -3874 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Effect Context) - /K [42 43] - /Pg 4803 0 R ->> -endobj - -3875 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3878 0 R 22 23 24 25 3877 0 R 35 36 37 38 3876 0 R 40 41] - /Pg 4803 0 R ->> -endobj - -3876 0 obj -<< - /Type /StructElem - /S /Em - /P 3875 0 R - /K [39] - /Pg 4803 0 R ->> -endobj - -3877 0 obj -<< - /Type /StructElem - /S /Formula - /P 3875 0 R - /K [26 27 28 29 30 31 32 33 34] - /Pg 4803 0 R ->> -endobj - -3878 0 obj -<< - /Type /StructElem - /S /Em - /P 3875 0 R - /K [21] - /Pg 4803 0 R ->> -endobj - -3879 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Revertible Effects) - /K [19 20] - /Pg 4803 0 R ->> -endobj - -3880 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3883 0 R 4 5 6 3882 0 R 8 9 3881 0 R 11 12 13 14 15 16 17 18] - /Pg 4803 0 R ->> -endobj - -3881 0 obj -<< - /Type /StructElem - /S /Em - /P 3880 0 R - /K [10] - /Pg 4803 0 R ->> -endobj - -3882 0 obj -<< - /Type /StructElem - /S /Em - /P 3880 0 R - /K [7] - /Pg 4803 0 R ->> -endobj - -3883 0 obj -<< - /Type /StructElem - /S /Link - /P 3880 0 R - /K [3 << - /Type /OBJR - /Pg 4803 0 R - /Obj 4801 0 R - >>] - /Pg 4803 0 R ->> -endobj - -3884 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Revertible Effects and Reactive Coeffects) - /K [0 1] - /Pg 4803 0 R ->> -endobj - -3885 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [167 168 169 170 171 3886 0 R 173] - /Pg 4799 0 R ->> -endobj - -3886 0 obj -<< - /Type /StructElem - /S /Link - /P 3885 0 R - /K [172 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4798 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3887 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [160 161 162 163 164 165 166] - /Pg 4799 0 R ->> -endobj - -3888 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [3893 0 R 3889 0 R] ->> -endobj - -3889 0 obj -<< - /Type /StructElem - /S /LI - /P 3888 0 R - /K [3892 0 R 3890 0 R] ->> -endobj - -3890 0 obj -<< - /Type /StructElem - /S /LBody - /P 3889 0 R - /K [3891 0 R 156 157 158 159] - /Pg 4799 0 R ->> -endobj - -3891 0 obj -<< - /Type /StructElem - /S /Strong - /P 3890 0 R - /K [155] - /Pg 4799 0 R ->> -endobj - -3892 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3889 0 R - /K [154] - /Pg 4799 0 R ->> -endobj - -3893 0 obj -<< - /Type /StructElem - /S /LI - /P 3888 0 R - /K [3896 0 R 3894 0 R] ->> -endobj - -3894 0 obj -<< - /Type /StructElem - /S /LBody - /P 3893 0 R - /K [3895 0 R 149 150 151 152 153] - /Pg 4799 0 R ->> -endobj - -3895 0 obj -<< - /Type /StructElem - /S /Strong - /P 3894 0 R - /K [148] - /Pg 4799 0 R ->> -endobj - -3896 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3893 0 R - /K [147] - /Pg 4799 0 R ->> -endobj - -3897 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [136 137 3900 0 R 139 140 3899 0 R 142 143 144 3898 0 R 146] - /Pg 4799 0 R ->> -endobj - -3898 0 obj -<< - /Type /StructElem - /S /Link - /P 3897 0 R - /K [145 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4797 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3899 0 obj -<< - /Type /StructElem - /S /Em - /P 3897 0 R - /K [141] - /Pg 4799 0 R ->> -endobj - -3900 0 obj -<< - /Type /StructElem - /S /Em - /P 3897 0 R - /K [138] - /Pg 4799 0 R ->> -endobj - -3901 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Relationship to Dynamic Composability) - /K [134 135] - /Pg 4799 0 R ->> -endobj - -3902 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3918 0 R 72 3917 0 R 74 75 3916 0 R 91 92 3915 0 R 94 95 96 97 3914 0 R 99 100 3913 0 R 102 103 3912 0 R 105 3911 0 R 107 3910 0 R 109 3909 0 R 111 112 3908 0 R 114 3907 0 R 116 117 118 3906 0 R 120 121 122 3905 0 R 124 3904 0 R 126 127 128 129 130 3903 0 R 132 133] - /Pg 4799 0 R ->> -endobj - -3903 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [131 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4796 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3904 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [125 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4795 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3905 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [123 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4794 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3906 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [119 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4793 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3907 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [115] - /Pg 4799 0 R ->> -endobj - -3908 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [113] - /Pg 4799 0 R ->> -endobj - -3909 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [110] - /Pg 4799 0 R ->> -endobj - -3910 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [108] - /Pg 4799 0 R ->> -endobj - -3911 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [106] - /Pg 4799 0 R ->> -endobj - -3912 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [104] - /Pg 4799 0 R ->> -endobj - -3913 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [101] - /Pg 4799 0 R ->> -endobj - -3914 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [98 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4792 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3915 0 obj -<< - /Type /StructElem - /S /Link - /P 3902 0 R - /K [93 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4791 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3916 0 obj -<< - /Type /StructElem - /S /Formula - /P 3902 0 R - /K [76 77 78 79 80 81 82 83 84 85 86 87 88 89 90] - /Pg 4799 0 R ->> -endobj - -3917 0 obj -<< - /Type /StructElem - /S /Em - /P 3902 0 R - /K [73] - /Pg 4799 0 R ->> -endobj - -3918 0 obj -<< - /Type /StructElem - /S /Strong - /P 3902 0 R - /K [71] - /Pg 4799 0 R ->> -endobj - -3919 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3928 0 R 3 4 5 3927 0 R 7 8 9 10 11 3926 0 R 13 14 15 3925 0 R 23 24 3924 0 R 33 34 35 3923 0 R 50 3922 0 R 59 3921 0 R 61 3920 0 R 70] - /Pg 4799 0 R ->> -endobj - -3920 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [62 63 64 65 66 67 68 69] - /Pg 4799 0 R ->> -endobj - -3921 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [60] - /Pg 4799 0 R ->> -endobj - -3922 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [51 52 53 54 55 56 57 58] - /Pg 4799 0 R ->> -endobj - -3923 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [36 37 38 39 40 41 42 43 44 45 46 47 48 49] - /Pg 4799 0 R ->> -endobj - -3924 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [25 26 27 28 29 30 31 32] - /Pg 4799 0 R ->> -endobj - -3925 0 obj -<< - /Type /StructElem - /S /Formula - /P 3919 0 R - /K [16 17 18 19 20 21 22] - /Pg 4799 0 R ->> -endobj - -3926 0 obj -<< - /Type /StructElem - /S /Link - /P 3919 0 R - /K [12 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4790 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3927 0 obj -<< - /Type /StructElem - /S /Link - /P 3919 0 R - /K [6 << - /Type /OBJR - /Pg 4799 0 R - /Obj 4789 0 R - >>] - /Pg 4799 0 R ->> -endobj - -3928 0 obj -<< - /Type /StructElem - /S /Strong - /P 3919 0 R - /K [2] - /Pg 4799 0 R ->> -endobj - -3929 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [198 199 << - /Type /MCR - /MCID 0 - /Pg 4799 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4799 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3930 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [191 192 193 194 195 196 197] - /Pg 4787 0 R ->> -endobj - -3931 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [181 3934 0 R 183 184 3933 0 R 186 3932 0 R 188 189 190] - /Pg 4787 0 R ->> -endobj - -3932 0 obj -<< - /Type /StructElem - /S /Link - /P 3931 0 R - /K [187 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4786 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3933 0 obj -<< - /Type /StructElem - /S /Link - /P 3931 0 R - /K [185 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4785 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3934 0 obj -<< - /Type /StructElem - /S /Em - /P 3931 0 R - /K [182] - /Pg 4787 0 R ->> -endobj - -3935 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Coeffects) - /K [179 180] - /Pg 4787 0 R ->> -endobj - -3936 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [153 3943 0 R 155 3942 0 R 157 158 159 160 3941 0 R 162 163 164 3940 0 R 166 3939 0 R 168 169 170 3938 0 R 172 173 174 3937 0 R 176 177 178] - /Pg 4787 0 R ->> -endobj - -3937 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [175 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4784 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3938 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [171 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4783 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3939 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [167 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4782 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3940 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [165 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4781 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3941 0 obj -<< - /Type /StructElem - /S /Link - /P 3936 0 R - /K [161 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4780 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3942 0 obj -<< - /Type /StructElem - /S /Formula - /P 3936 0 R - /K [156] - /Pg 4787 0 R ->> -endobj - -3943 0 obj -<< - /Type /StructElem - /S /Formula - /P 3936 0 R - /K [154] - /Pg 4787 0 R ->> -endobj - -3944 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [139 140 141 142 143 144 145 146 147 148 149 150 151 152] - /Pg 4787 0 R ->> -endobj - -3945 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3953 0 R 104 105 3952 0 R 107 3951 0 R 109 110 111 112 113 3950 0 R 115 3949 0 R 122 3948 0 R 129 130 131 132 3947 0 R 134 135 3946 0 R 137 138] - /Pg 4787 0 R ->> -endobj - -3946 0 obj -<< - /Type /StructElem - /S /Em - /P 3945 0 R - /K [136] - /Pg 4787 0 R ->> -endobj - -3947 0 obj -<< - /Type /StructElem - /S /Link - /P 3945 0 R - /K [133 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4779 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3948 0 obj -<< - /Type /StructElem - /S /Formula - /P 3945 0 R - /K [123 124 125 126 127 128] - /Pg 4787 0 R ->> -endobj - -3949 0 obj -<< - /Type /StructElem - /S /Formula - /P 3945 0 R - /K [116 117 118 119 120 121] - /Pg 4787 0 R ->> -endobj - -3950 0 obj -<< - /Type /StructElem - /S /Formula - /P 3945 0 R - /K [114] - /Pg 4787 0 R ->> -endobj - -3951 0 obj -<< - /Type /StructElem - /S /Link - /P 3945 0 R - /K [108 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4778 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3952 0 obj -<< - /Type /StructElem - /S /Link - /P 3945 0 R - /K [106 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4777 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3953 0 obj -<< - /Type /StructElem - /S /Strong - /P 3945 0 R - /K [103] - /Pg 4787 0 R ->> -endobj - -3954 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [3962 0 R 50 51 3961 0 R 53 54 55 56 3960 0 R 58 59 3959 0 R 67 3958 0 R 69 70 71 3957 0 R 76 3956 0 R 85 86 3955 0 R 101 102] - /Pg 4787 0 R ->> -endobj - -3955 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [87 88 89 90 91 92 93 94 95 96 97 98 99 100] - /Pg 4787 0 R ->> -endobj - -3956 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [77 78 79 80 81 82 83 84] - /Pg 4787 0 R ->> -endobj - -3957 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [72 73 74 75] - /Pg 4787 0 R ->> -endobj - -3958 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [68] - /Pg 4787 0 R ->> -endobj - -3959 0 obj -<< - /Type /StructElem - /S /Formula - /P 3954 0 R - /K [60 61 62 63 64 65 66] - /Pg 4787 0 R ->> -endobj - -3960 0 obj -<< - /Type /StructElem - /S /Link - /P 3954 0 R - /K [57 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4776 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3961 0 obj -<< - /Type /StructElem - /S /Link - /P 3954 0 R - /K [52 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4775 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3962 0 obj -<< - /Type /StructElem - /S /Strong - /P 3954 0 R - /K [49] - /Pg 4787 0 R ->> -endobj - -3963 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [40 41 42 43 3964 0 R 45 46 47 48] - /Pg 4787 0 R ->> -endobj - -3964 0 obj -<< - /Type /StructElem - /S /Link - /P 3963 0 R - /K [44 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4774 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3965 0 obj -<< - /Type /StructElem - /S /Formula - /P 103 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [33 34 35 36 37 38 39] - /Pg 4787 0 R ->> -endobj - -3966 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [10 11 3973 0 R 13 3972 0 R 15 16 3971 0 R 22 23 3970 0 R 25 3969 0 R 27 3968 0 R 29 3967 0 R 31 32] - /Pg 4787 0 R ->> -endobj - -3967 0 obj -<< - /Type /StructElem - /S /Em - /P 3966 0 R - /K [30] - /Pg 4787 0 R ->> -endobj - -3968 0 obj -<< - /Type /StructElem - /S /Formula - /P 3966 0 R - /K [28] - /Pg 4787 0 R ->> -endobj - -3969 0 obj -<< - /Type /StructElem - /S /Formula - /P 3966 0 R - /K [26] - /Pg 4787 0 R ->> -endobj - -3970 0 obj -<< - /Type /StructElem - /S /Formula - /P 3966 0 R - /K [24] - /Pg 4787 0 R ->> -endobj - -3971 0 obj -<< - /Type /StructElem - /S /Formula - /P 3966 0 R - /K [17 18 19 20 21] - /Pg 4787 0 R ->> -endobj - -3972 0 obj -<< - /Type /StructElem - /S /Link - /P 3966 0 R - /K [14 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4773 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3973 0 obj -<< - /Type /StructElem - /S /Link - /P 3966 0 R - /K [12 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4772 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3974 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Effects) - /K [8 9] - /Pg 4787 0 R ->> -endobj - -3975 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3 4 3976 0 R 6 7] - /Pg 4787 0 R ->> -endobj - -3976 0 obj -<< - /Type /StructElem - /S /Link - /P 3975 0 R - /K [5 << - /Type /OBJR - /Pg 4787 0 R - /Obj 4771 0 R - >>] - /Pg 4787 0 R ->> -endobj - -3977 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Preliminaries) - /K [0 1] - /Pg 4787 0 R ->> -endobj - -3978 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Decimal - >>] - /K [3996 0 R 3991 0 R 3984 0 R 3979 0 R] ->> -endobj - -3979 0 obj -<< - /Type /StructElem - /S /LI - /P 3978 0 R - /K [3983 0 R 3980 0 R] ->> -endobj - -3980 0 obj -<< - /Type /StructElem - /S /LBody - /P 3979 0 R - /K [95 3982 0 R 97 3981 0 R 99 100 101 102 103 104] - /Pg 4769 0 R ->> -endobj - -3981 0 obj -<< - /Type /StructElem - /S /Link - /P 3980 0 R - /K [98 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4768 0 R - >>] - /Pg 4769 0 R ->> -endobj - -3982 0 obj -<< - /Type /StructElem - /S /Strong - /P 3980 0 R - /K [96] - /Pg 4769 0 R ->> -endobj - -3983 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3979 0 R - /K [94] - /Pg 4769 0 R ->> -endobj - -3984 0 obj -<< - /Type /StructElem - /S /LI - /P 3978 0 R - /K [3990 0 R 3985 0 R] ->> -endobj - -3985 0 obj -<< - /Type /StructElem - /S /LBody - /P 3984 0 R - /K [81 3989 0 R 83 3988 0 R 85 86 87 88 3987 0 R 90 3986 0 R 92 93] - /Pg 4769 0 R ->> -endobj - -3986 0 obj -<< - /Type /StructElem - /S /Link - /P 3985 0 R - /K [91 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4767 0 R - >>] - /Pg 4769 0 R ->> -endobj - -3987 0 obj -<< - /Type /StructElem - /S /Strong - /P 3985 0 R - /K [89] - /Pg 4769 0 R ->> -endobj - -3988 0 obj -<< - /Type /StructElem - /S /Link - /P 3985 0 R - /K [84 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4766 0 R - >>] - /Pg 4769 0 R ->> -endobj - -3989 0 obj -<< - /Type /StructElem - /S /Strong - /P 3985 0 R - /K [82] - /Pg 4769 0 R ->> -endobj - -3990 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3984 0 R - /K [80] - /Pg 4769 0 R ->> -endobj - -3991 0 obj -<< - /Type /StructElem - /S /LI - /P 3978 0 R - /K [3995 0 R 3992 0 R] ->> -endobj - -3992 0 obj -<< - /Type /StructElem - /S /LBody - /P 3991 0 R - /K [71 3994 0 R 73 3993 0 R 75 76 77 78 79] - /Pg 4769 0 R ->> -endobj - -3993 0 obj -<< - /Type /StructElem - /S /Link - /P 3992 0 R - /K [74 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4765 0 R - >>] - /Pg 4769 0 R ->> -endobj - -3994 0 obj -<< - /Type /StructElem - /S /Strong - /P 3992 0 R - /K [72] - /Pg 4769 0 R ->> -endobj - -3995 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3991 0 R - /K [70] - /Pg 4769 0 R ->> -endobj - -3996 0 obj -<< - /Type /StructElem - /S /LI - /P 3978 0 R - /K [4001 0 R 3997 0 R] ->> -endobj - -3997 0 obj -<< - /Type /StructElem - /S /LBody - /P 3996 0 R - /K [58 4000 0 R 60 3999 0 R 62 63 64 3998 0 R 66 67 68 69] - /Pg 4769 0 R ->> -endobj - -3998 0 obj -<< - /Type /StructElem - /S /Em - /P 3997 0 R - /K [65] - /Pg 4769 0 R ->> -endobj - -3999 0 obj -<< - /Type /StructElem - /S /Link - /P 3997 0 R - /K [61 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4764 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4000 0 obj -<< - /Type /StructElem - /S /Strong - /P 3997 0 R - /K [59] - /Pg 4769 0 R ->> -endobj - -4001 0 obj -<< - /Type /StructElem - /S /Lbl - /P 3996 0 R - /K [57] - /Pg 4769 0 R ->> -endobj - -4002 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [26 4010 0 R 28 29 4009 0 R 31 4008 0 R 34 35 4007 0 R 37 4006 0 R 39 40 4005 0 R 42 43 4004 0 R 45 4003 0 R 47 48 49 50 51 52 53 54 55 56] - /Pg 4769 0 R ->> -endobj - -4003 0 obj -<< - /Type /StructElem - /S /Link - /P 4002 0 R - /K [46 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4763 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4004 0 obj -<< - /Type /StructElem - /S /Link - /P 4002 0 R - /K [44 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4762 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4005 0 obj -<< - /Type /StructElem - /S /Em - /P 4002 0 R - /K [41] - /Pg 4769 0 R ->> -endobj - -4006 0 obj -<< - /Type /StructElem - /S /Link - /P 4002 0 R - /K [38 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4761 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4007 0 obj -<< - /Type /StructElem - /S /Link - /P 4002 0 R - /K [36 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4760 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4008 0 obj -<< - /Type /StructElem - /S /Em - /P 4002 0 R - /K [32 33] - /Pg 4769 0 R ->> -endobj - -4009 0 obj -<< - /Type /StructElem - /S /Em - /P 4002 0 R - /K [30] - /Pg 4769 0 R ->> -endobj - -4010 0 obj -<< - /Type /StructElem - /S /Em - /P 4002 0 R - /K [27] - /Pg 4769 0 R ->> -endobj - -4011 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Contributions) - /K [24 25] - /Pg 4769 0 R ->> -endobj - -4012 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [8 9 10 11 12 4013 0 R 14 15 16 17 18 19 20 21 22 23] - /Pg 4769 0 R ->> -endobj - -4013 0 obj -<< - /Type /StructElem - /S /Link - /P 4012 0 R - /K [13 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4759 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4014 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [88 89 90 91 << - /Type /MCR - /MCID 0 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4769 0 R - >> 4015 0 R << - /Type /MCR - /MCID 3 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 5 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 6 - /Pg 4769 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4769 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4015 0 obj -<< - /Type /StructElem - /S /Link - /P 4014 0 R - /K [2 << - /Type /OBJR - /Pg 4769 0 R - /Obj 4758 0 R - >>] - /Pg 4769 0 R ->> -endobj - -4016 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (The Coarse-Grained Workaround) - /K [86 87] - /Pg 4756 0 R ->> -endobj - -4017 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [77 78 79 80 81 82 83 84 85] - /Pg 4756 0 R ->> -endobj - -4018 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [45 46 4024 0 R 48 4023 0 R 50 51 52 53 4022 0 R 55 56 57 58 4021 0 R 60 61 62 63 64 4020 0 R 66 67 68 69 70 71 72 4019 0 R 74 75 76] - /Pg 4756 0 R ->> -endobj - -4019 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [73 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4754 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4020 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [65 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4753 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4021 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [59 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4752 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4022 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [54 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4751 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4023 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [49 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4750 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4024 0 obj -<< - /Type /StructElem - /S /Link - /P 4018 0 R - /K [47 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4749 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4025 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Self-Evolving Agent Harnesses) - /K [43 44] - /Pg 4756 0 R ->> -endobj - -4026 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [36 37 4028 0 R 39 4027 0 R 41 42] - /Pg 4756 0 R ->> -endobj - -4027 0 obj -<< - /Type /StructElem - /S /Link - /P 4026 0 R - /K [40 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4748 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4028 0 obj -<< - /Type /StructElem - /S /Link - /P 4026 0 R - /K [38 << - /Type /OBJR - /Pg 4756 0 R - /Obj 4747 0 R - >>] - /Pg 4756 0 R ->> -endobj - -4029 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [4037 0 R 13 4036 0 R 15 16 17 18 4035 0 R 20 4032 0 R 22 23 24 25 26 27 28 4031 0 R 30 31 4030 0 R 33 34 35] - /Pg 4756 0 R ->> -endobj - -4030 0 obj -<< - /Type /StructElem - /S /Code - /P 4029 0 R - /K [32] - /Pg 4756 0 R ->> -endobj - -4031 0 obj -<< - /Type /StructElem - /S /Code - /P 4029 0 R - /K [29] - /Pg 4756 0 R ->> -endobj - -4032 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4029 0 R - /K [4033 0 R] ->> -endobj - -4033 0 obj -<< - /Type /StructElem - /S /Link - /P 4032 0 R - /K [<< - /Type /OBJR - /Pg 4756 0 R - /Obj 4746 0 R - >> 4034 0 R] ->> -endobj - -4034 0 obj -<< - /Type /StructElem - /S /Span - /P 4033 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [21] - /Pg 4756 0 R ->> -endobj - -4035 0 obj -<< - /Type /StructElem - /S /Code - /P 4029 0 R - /K [19] - /Pg 4756 0 R ->> -endobj - -4036 0 obj -<< - /Type /StructElem - /S /Code - /P 4029 0 R - /K [14] - /Pg 4756 0 R ->> -endobj - -4037 0 obj -<< - /Type /StructElem - /S /Strong - /P 4029 0 R - /K [12] - /Pg 4756 0 R ->> -endobj - -4038 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [4049 0 R 72 73 74 4048 0 R 76 77 78 << - /Type /MCR - /MCID 0 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 1 - /Pg 4756 0 R - >> 4045 0 R 4041 0 R << - /Type /MCR - /MCID 3 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 4 - /Pg 4756 0 R - >> 4040 0 R << - /Type /MCR - /MCID 6 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 7 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 8 - /Pg 4756 0 R - >> 4039 0 R << - /Type /MCR - /MCID 10 - /Pg 4756 0 R - >> << - /Type /MCR - /MCID 11 - /Pg 4756 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4039 0 obj -<< - /Type /StructElem - /S /Code - /P 4038 0 R - /K [9] - /Pg 4756 0 R ->> -endobj - -4040 0 obj -<< - /Type /StructElem - /S /Code - /P 4038 0 R - /K [5] - /Pg 4756 0 R ->> -endobj - -4041 0 obj -<< - /Type /StructElem - /S /Note - /P 4038 0 R - /ID (Note 1) - /K [4042 0 R 93] - /Pg 4756 0 R ->> -endobj - -4042 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4041 0 R - /K [4043 0 R] ->> -endobj - -4043 0 obj -<< - /Type /StructElem - /S /Link - /P 4042 0 R - /K [<< - /Type /OBJR - /Pg 4756 0 R - /Obj 4755 0 R - >> 4044 0 R] ->> -endobj - -4044 0 obj -<< - /Type /StructElem - /S /Span - /P 4043 0 R - /A [<< - /O /Layout - /BaselineShift 2.5866 - /LineHeight 3.24 - >>] - /K [92] - /Pg 4756 0 R ->> -endobj - -4045 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4038 0 R - /K [4046 0 R] ->> -endobj - -4046 0 obj -<< - /Type /StructElem - /S /Link - /P 4045 0 R - /K [<< - /Type /OBJR - /Pg 4756 0 R - /Obj 4745 0 R - >> 4047 0 R] ->> -endobj - -4047 0 obj -<< - /Type /StructElem - /S /Span - /P 4046 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [2] - /Pg 4756 0 R ->> -endobj - -4048 0 obj -<< - /Type /StructElem - /S /Code - /P 4038 0 R - /K [75] - /Pg 4743 0 R ->> -endobj - -4049 0 obj -<< - /Type /StructElem - /S /Strong - /P 4038 0 R - /K [71] - /Pg 4743 0 R ->> -endobj - -4050 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [69 70] - /Pg 4743 0 R ->> -endobj - -4051 0 obj -<< - /Type /StructElem - /S /H3 - /P 103 0 R - /T (Plugin Systems) - /K [67 68] - /Pg 4743 0 R ->> -endobj - -4052 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Motivating Examples) - /K [65 66] - /Pg 4743 0 R ->> -endobj - -4053 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [51 52 4055 0 R 54 55 56 57 4054 0 R 59 60 61 62 63 64] - /Pg 4743 0 R ->> -endobj - -4054 0 obj -<< - /Type /StructElem - /S /Link - /P 4053 0 R - /K [58 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4742 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4055 0 obj -<< - /Type /StructElem - /S /Link - /P 4053 0 R - /K [53 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4741 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4056 0 obj -<< - /Type /StructElem - /S /L - /P 103 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [4062 0 R 4057 0 R] ->> -endobj - -4057 0 obj -<< - /Type /StructElem - /S /LI - /P 4056 0 R - /K [4061 0 R 4058 0 R] ->> -endobj - -4058 0 obj -<< - /Type /StructElem - /S /LBody - /P 4057 0 R - /K [4060 0 R 44 4059 0 R 46 47 48 49 50] - /Pg 4743 0 R ->> -endobj - -4059 0 obj -<< - /Type /StructElem - /S /Em - /P 4058 0 R - /K [45] - /Pg 4743 0 R ->> -endobj - -4060 0 obj -<< - /Type /StructElem - /S /Strong - /P 4058 0 R - /K [43] - /Pg 4743 0 R ->> -endobj - -4061 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4057 0 R - /K [42] - /Pg 4743 0 R ->> -endobj - -4062 0 obj -<< - /Type /StructElem - /S /LI - /P 4056 0 R - /K [4066 0 R 4063 0 R] ->> -endobj - -4063 0 obj -<< - /Type /StructElem - /S /LBody - /P 4062 0 R - /K [4065 0 R 35 4064 0 R 37 38 39 40 41] - /Pg 4743 0 R ->> -endobj - -4064 0 obj -<< - /Type /StructElem - /S /Em - /P 4063 0 R - /K [36] - /Pg 4743 0 R ->> -endobj - -4065 0 obj -<< - /Type /StructElem - /S /Strong - /P 4063 0 R - /K [34] - /Pg 4743 0 R ->> -endobj - -4066 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4062 0 R - /K [33] - /Pg 4743 0 R ->> -endobj - -4067 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [30 31 32] - /Pg 4743 0 R ->> -endobj - -4068 0 obj -<< - /Type /StructElem - /S /H2 - /P 103 0 R - /T (Dimensions of Composability) - /K [28 29] - /Pg 4743 0 R ->> -endobj - -4069 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [2 3 4 4074 0 R 6 7 4073 0 R 9 10 11 4072 0 R 13 14 15 4071 0 R 17 18 19 20 21 4070 0 R 23 24 25 26 27] - /Pg 4743 0 R ->> -endobj - -4070 0 obj -<< - /Type /StructElem - /S /Link - /P 4069 0 R - /K [22 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4740 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4071 0 obj -<< - /Type /StructElem - /S /Link - /P 4069 0 R - /K [16 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4739 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4072 0 obj -<< - /Type /StructElem - /S /Em - /P 4069 0 R - /K [12] - /Pg 4743 0 R ->> -endobj - -4073 0 obj -<< - /Type /StructElem - /S /Em - /P 4069 0 R - /K [8] - /Pg 4743 0 R ->> -endobj - -4074 0 obj -<< - /Type /StructElem - /S /Link - /P 4069 0 R - /K [5 << - /Type /OBJR - /Pg 4743 0 R - /Obj 4738 0 R - >>] - /Pg 4743 0 R ->> -endobj - -4075 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Introduction) - /K [0 1] - /Pg 4743 0 R ->> -endobj - -4076 0 obj -<< - /Type /StructElem - /S /TOC - /P 103 0 R - /K [4285 0 R 4259 0 R 4255 0 R 4242 0 R 4238 0 R 4173 0 R 4169 0 R 4130 0 R 4126 0 R 4105 0 R 4101 0 R 4084 0 R 4080 0 R 4077 0 R] ->> -endobj - -4077 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4078 0 R] ->> -endobj - -4078 0 obj -<< - /Type /StructElem - /S /Reference - /P 4077 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4079 0 R] ->> -endobj - -4079 0 obj -<< - /Type /StructElem - /S /Link - /P 4078 0 R - /K [54 55 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4735 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4080 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4081 0 R] ->> -endobj - -4081 0 obj -<< - /Type /StructElem - /S /Reference - /P 4080 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4082 0 R] ->> -endobj - -4082 0 obj -<< - /Type /StructElem - /S /Link - /P 4081 0 R - /K [4083 0 R 52 53 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4734 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4083 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4082 0 R - /K [51] - /Pg 4736 0 R ->> -endobj - -4084 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4097 0 R 4093 0 R 4089 0 R 4085 0 R] ->> -endobj - -4085 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4084 0 R - /K [4086 0 R] ->> -endobj - -4086 0 obj -<< - /Type /StructElem - /S /Reference - /P 4085 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4087 0 R] ->> -endobj - -4087 0 obj -<< - /Type /StructElem - /S /Link - /P 4086 0 R - /K [4088 0 R 49 50 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4733 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4088 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4087 0 R - /K [48] - /Pg 4736 0 R ->> -endobj - -4089 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4084 0 R - /K [4090 0 R] ->> -endobj - -4090 0 obj -<< - /Type /StructElem - /S /Reference - /P 4089 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4091 0 R] ->> -endobj - -4091 0 obj -<< - /Type /StructElem - /S /Link - /P 4090 0 R - /K [4092 0 R 46 47 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4732 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4092 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4091 0 R - /K [45] - /Pg 4736 0 R ->> -endobj - -4093 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4084 0 R - /K [4094 0 R] ->> -endobj - -4094 0 obj -<< - /Type /StructElem - /S /Reference - /P 4093 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4095 0 R] ->> -endobj - -4095 0 obj -<< - /Type /StructElem - /S /Link - /P 4094 0 R - /K [4096 0 R 43 44 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4731 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4096 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4095 0 R - /K [42] - /Pg 4736 0 R ->> -endobj - -4097 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4084 0 R - /K [4098 0 R] ->> -endobj - -4098 0 obj -<< - /Type /StructElem - /S /Reference - /P 4097 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4099 0 R] ->> -endobj - -4099 0 obj -<< - /Type /StructElem - /S /Link - /P 4098 0 R - /K [4100 0 R 40 41 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4730 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4100 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4099 0 R - /K [39] - /Pg 4736 0 R ->> -endobj - -4101 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4102 0 R] ->> -endobj - -4102 0 obj -<< - /Type /StructElem - /S /Reference - /P 4101 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4103 0 R] ->> -endobj - -4103 0 obj -<< - /Type /StructElem - /S /Link - /P 4102 0 R - /K [4104 0 R 37 38 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4729 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4104 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4103 0 R - /K [36] - /Pg 4736 0 R ->> -endobj - -4105 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4122 0 R 4118 0 R 4114 0 R 4110 0 R 4106 0 R] ->> -endobj - -4106 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4107 0 R] ->> -endobj - -4107 0 obj -<< - /Type /StructElem - /S /Reference - /P 4106 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4108 0 R] ->> -endobj - -4108 0 obj -<< - /Type /StructElem - /S /Link - /P 4107 0 R - /K [4109 0 R 34 35 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4728 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4109 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4108 0 R - /K [33] - /Pg 4736 0 R ->> -endobj - -4110 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4111 0 R] ->> -endobj - -4111 0 obj -<< - /Type /StructElem - /S /Reference - /P 4110 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4112 0 R] ->> -endobj - -4112 0 obj -<< - /Type /StructElem - /S /Link - /P 4111 0 R - /K [4113 0 R 31 32 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4727 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4113 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4112 0 R - /K [30] - /Pg 4736 0 R ->> -endobj - -4114 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4115 0 R] ->> -endobj - -4115 0 obj -<< - /Type /StructElem - /S /Reference - /P 4114 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4116 0 R] ->> -endobj - -4116 0 obj -<< - /Type /StructElem - /S /Link - /P 4115 0 R - /K [4117 0 R 28 29 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4726 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4117 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4116 0 R - /K [27] - /Pg 4736 0 R ->> -endobj - -4118 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4119 0 R] ->> -endobj - -4119 0 obj -<< - /Type /StructElem - /S /Reference - /P 4118 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4120 0 R] ->> -endobj - -4120 0 obj -<< - /Type /StructElem - /S /Link - /P 4119 0 R - /K [4121 0 R 25 26 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4725 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4121 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4120 0 R - /K [24] - /Pg 4736 0 R ->> -endobj - -4122 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4105 0 R - /K [4123 0 R] ->> -endobj - -4123 0 obj -<< - /Type /StructElem - /S /Reference - /P 4122 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4124 0 R] ->> -endobj - -4124 0 obj -<< - /Type /StructElem - /S /Link - /P 4123 0 R - /K [4125 0 R 22 23 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4724 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4125 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4124 0 R - /K [21] - /Pg 4736 0 R ->> -endobj - -4126 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4127 0 R] ->> -endobj - -4127 0 obj -<< - /Type /StructElem - /S /Reference - /P 4126 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4128 0 R] ->> -endobj - -4128 0 obj -<< - /Type /StructElem - /S /Link - /P 4127 0 R - /K [4129 0 R 19 20 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4723 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4129 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4128 0 R - /K [18] - /Pg 4736 0 R ->> -endobj - -4130 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4165 0 R 4148 0 R 4144 0 R 4135 0 R 4131 0 R] ->> -endobj - -4131 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4130 0 R - /K [4132 0 R] ->> -endobj - -4132 0 obj -<< - /Type /StructElem - /S /Reference - /P 4131 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4133 0 R] ->> -endobj - -4133 0 obj -<< - /Type /StructElem - /S /Link - /P 4132 0 R - /K [4134 0 R 16 17 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4722 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4134 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4133 0 R - /K [15] - /Pg 4736 0 R ->> -endobj - -4135 0 obj -<< - /Type /StructElem - /S /TOC - /P 4130 0 R - /K [4140 0 R 4136 0 R] ->> -endobj - -4136 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4135 0 R - /K [4137 0 R] ->> -endobj - -4137 0 obj -<< - /Type /StructElem - /S /Reference - /P 4136 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4138 0 R] ->> -endobj - -4138 0 obj -<< - /Type /StructElem - /S /Link - /P 4137 0 R - /K [4139 0 R 13 14 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4721 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4139 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4138 0 R - /K [12] - /Pg 4736 0 R ->> -endobj - -4140 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4135 0 R - /K [4141 0 R] ->> -endobj - -4141 0 obj -<< - /Type /StructElem - /S /Reference - /P 4140 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4142 0 R] ->> -endobj - -4142 0 obj -<< - /Type /StructElem - /S /Link - /P 4141 0 R - /K [4143 0 R 10 11 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4720 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4143 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4142 0 R - /K [9] - /Pg 4736 0 R ->> -endobj - -4144 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4130 0 R - /K [4145 0 R] ->> -endobj - -4145 0 obj -<< - /Type /StructElem - /S /Reference - /P 4144 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4146 0 R] ->> -endobj - -4146 0 obj -<< - /Type /StructElem - /S /Link - /P 4145 0 R - /K [4147 0 R 7 8 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4719 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4147 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4146 0 R - /K [6] - /Pg 4736 0 R ->> -endobj - -4148 0 obj -<< - /Type /StructElem - /S /TOC - /P 4130 0 R - /K [4161 0 R 4157 0 R 4153 0 R 4149 0 R] ->> -endobj - -4149 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4148 0 R - /K [4150 0 R] ->> -endobj - -4150 0 obj -<< - /Type /StructElem - /S /Reference - /P 4149 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4151 0 R] ->> -endobj - -4151 0 obj -<< - /Type /StructElem - /S /Link - /P 4150 0 R - /K [4152 0 R 4 5 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4718 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4152 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4151 0 R - /K [3] - /Pg 4736 0 R ->> -endobj - -4153 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4148 0 R - /K [4154 0 R] ->> -endobj - -4154 0 obj -<< - /Type /StructElem - /S /Reference - /P 4153 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4155 0 R] ->> -endobj - -4155 0 obj -<< - /Type /StructElem - /S /Link - /P 4154 0 R - /K [<< - /Type /OBJR - /Pg 4715 0 R - /Obj 4714 0 R - >> 4156 0 R 1 2 << - /Type /OBJR - /Pg 4736 0 R - /Obj 4717 0 R - >>] - /Pg 4736 0 R ->> -endobj - -4156 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4155 0 R - /K [0] - /Pg 4736 0 R ->> -endobj - -4157 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4148 0 R - /K [4158 0 R] ->> -endobj - -4158 0 obj -<< - /Type /StructElem - /S /Reference - /P 4157 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4159 0 R] ->> -endobj - -4159 0 obj -<< - /Type /StructElem - /S /Link - /P 4158 0 R - /K [4160 0 R 92 93 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4713 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4160 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4159 0 R - /K [91] - /Pg 4715 0 R ->> -endobj - -4161 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4148 0 R - /K [4162 0 R] ->> -endobj - -4162 0 obj -<< - /Type /StructElem - /S /Reference - /P 4161 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4163 0 R] ->> -endobj - -4163 0 obj -<< - /Type /StructElem - /S /Link - /P 4162 0 R - /K [4164 0 R 89 90 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4712 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4164 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4163 0 R - /K [88] - /Pg 4715 0 R ->> -endobj - -4165 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4130 0 R - /K [4166 0 R] ->> -endobj - -4166 0 obj -<< - /Type /StructElem - /S /Reference - /P 4165 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4167 0 R] ->> -endobj - -4167 0 obj -<< - /Type /StructElem - /S /Link - /P 4166 0 R - /K [4168 0 R 86 87 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4711 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4168 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4167 0 R - /K [85] - /Pg 4715 0 R ->> -endobj - -4169 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4170 0 R] ->> -endobj - -4170 0 obj -<< - /Type /StructElem - /S /Reference - /P 4169 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4171 0 R] ->> -endobj - -4171 0 obj -<< - /Type /StructElem - /S /Link - /P 4170 0 R - /K [4172 0 R 83 84 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4710 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4172 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4171 0 R - /K [82] - /Pg 4715 0 R ->> -endobj - -4173 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4234 0 R 4225 0 R 4221 0 R 4208 0 R 4204 0 R 4187 0 R 4183 0 R 4174 0 R] ->> -endobj - -4174 0 obj -<< - /Type /StructElem - /S /TOC - /P 4173 0 R - /K [4179 0 R 4175 0 R] ->> -endobj - -4175 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4174 0 R - /K [4176 0 R] ->> -endobj - -4176 0 obj -<< - /Type /StructElem - /S /Reference - /P 4175 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4177 0 R] ->> -endobj - -4177 0 obj -<< - /Type /StructElem - /S /Link - /P 4176 0 R - /K [4178 0 R 80 81 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4709 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4178 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4177 0 R - /K [79] - /Pg 4715 0 R ->> -endobj - -4179 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4174 0 R - /K [4180 0 R] ->> -endobj - -4180 0 obj -<< - /Type /StructElem - /S /Reference - /P 4179 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4181 0 R] ->> -endobj - -4181 0 obj -<< - /Type /StructElem - /S /Link - /P 4180 0 R - /K [4182 0 R 77 78 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4708 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4182 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4181 0 R - /K [76] - /Pg 4715 0 R ->> -endobj - -4183 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4173 0 R - /K [4184 0 R] ->> -endobj - -4184 0 obj -<< - /Type /StructElem - /S /Reference - /P 4183 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4185 0 R] ->> -endobj - -4185 0 obj -<< - /Type /StructElem - /S /Link - /P 4184 0 R - /K [4186 0 R 74 75 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4707 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4186 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4185 0 R - /K [73] - /Pg 4715 0 R ->> -endobj - -4187 0 obj -<< - /Type /StructElem - /S /TOC - /P 4173 0 R - /K [4200 0 R 4196 0 R 4192 0 R 4188 0 R] ->> -endobj - -4188 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4187 0 R - /K [4189 0 R] ->> -endobj - -4189 0 obj -<< - /Type /StructElem - /S /Reference - /P 4188 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4190 0 R] ->> -endobj - -4190 0 obj -<< - /Type /StructElem - /S /Link - /P 4189 0 R - /K [4191 0 R 71 72 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4706 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4191 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4190 0 R - /K [70] - /Pg 4715 0 R ->> -endobj - -4192 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4187 0 R - /K [4193 0 R] ->> -endobj - -4193 0 obj -<< - /Type /StructElem - /S /Reference - /P 4192 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4194 0 R] ->> -endobj - -4194 0 obj -<< - /Type /StructElem - /S /Link - /P 4193 0 R - /K [4195 0 R 68 69 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4705 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4195 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4194 0 R - /K [67] - /Pg 4715 0 R ->> -endobj - -4196 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4187 0 R - /K [4197 0 R] ->> -endobj - -4197 0 obj -<< - /Type /StructElem - /S /Reference - /P 4196 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4198 0 R] ->> -endobj - -4198 0 obj -<< - /Type /StructElem - /S /Link - /P 4197 0 R - /K [4199 0 R 65 66 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4704 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4199 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4198 0 R - /K [64] - /Pg 4715 0 R ->> -endobj - -4200 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4187 0 R - /K [4201 0 R] ->> -endobj - -4201 0 obj -<< - /Type /StructElem - /S /Reference - /P 4200 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4202 0 R] ->> -endobj - -4202 0 obj -<< - /Type /StructElem - /S /Link - /P 4201 0 R - /K [4203 0 R 62 63 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4703 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4203 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4202 0 R - /K [61] - /Pg 4715 0 R ->> -endobj - -4204 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4173 0 R - /K [4205 0 R] ->> -endobj - -4205 0 obj -<< - /Type /StructElem - /S /Reference - /P 4204 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4206 0 R] ->> -endobj - -4206 0 obj -<< - /Type /StructElem - /S /Link - /P 4205 0 R - /K [4207 0 R 59 60 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4702 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4207 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4206 0 R - /K [58] - /Pg 4715 0 R ->> -endobj - -4208 0 obj -<< - /Type /StructElem - /S /TOC - /P 4173 0 R - /K [4217 0 R 4213 0 R 4209 0 R] ->> -endobj - -4209 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4208 0 R - /K [4210 0 R] ->> -endobj - -4210 0 obj -<< - /Type /StructElem - /S /Reference - /P 4209 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4211 0 R] ->> -endobj - -4211 0 obj -<< - /Type /StructElem - /S /Link - /P 4210 0 R - /K [4212 0 R 56 57 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4701 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4212 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4211 0 R - /K [55] - /Pg 4715 0 R ->> -endobj - -4213 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4208 0 R - /K [4214 0 R] ->> -endobj - -4214 0 obj -<< - /Type /StructElem - /S /Reference - /P 4213 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4215 0 R] ->> -endobj - -4215 0 obj -<< - /Type /StructElem - /S /Link - /P 4214 0 R - /K [4216 0 R 53 54 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4700 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4216 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4215 0 R - /K [52] - /Pg 4715 0 R ->> -endobj - -4217 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4208 0 R - /K [4218 0 R] ->> -endobj - -4218 0 obj -<< - /Type /StructElem - /S /Reference - /P 4217 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4219 0 R] ->> -endobj - -4219 0 obj -<< - /Type /StructElem - /S /Link - /P 4218 0 R - /K [4220 0 R 50 51 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4699 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4220 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4219 0 R - /K [49] - /Pg 4715 0 R ->> -endobj - -4221 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4173 0 R - /K [4222 0 R] ->> -endobj - -4222 0 obj -<< - /Type /StructElem - /S /Reference - /P 4221 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4223 0 R] ->> -endobj - -4223 0 obj -<< - /Type /StructElem - /S /Link - /P 4222 0 R - /K [4224 0 R 47 48 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4698 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4224 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4223 0 R - /K [46] - /Pg 4715 0 R ->> -endobj - -4225 0 obj -<< - /Type /StructElem - /S /TOC - /P 4173 0 R - /K [4230 0 R 4226 0 R] ->> -endobj - -4226 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4225 0 R - /K [4227 0 R] ->> -endobj - -4227 0 obj -<< - /Type /StructElem - /S /Reference - /P 4226 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4228 0 R] ->> -endobj - -4228 0 obj -<< - /Type /StructElem - /S /Link - /P 4227 0 R - /K [4229 0 R 44 45 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4697 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4229 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4228 0 R - /K [43] - /Pg 4715 0 R ->> -endobj - -4230 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4225 0 R - /K [4231 0 R] ->> -endobj - -4231 0 obj -<< - /Type /StructElem - /S /Reference - /P 4230 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4232 0 R] ->> -endobj - -4232 0 obj -<< - /Type /StructElem - /S /Link - /P 4231 0 R - /K [4233 0 R 41 42 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4696 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4233 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4232 0 R - /K [40] - /Pg 4715 0 R ->> -endobj - -4234 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4173 0 R - /K [4235 0 R] ->> -endobj - -4235 0 obj -<< - /Type /StructElem - /S /Reference - /P 4234 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4236 0 R] ->> -endobj - -4236 0 obj -<< - /Type /StructElem - /S /Link - /P 4235 0 R - /K [4237 0 R 38 39 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4695 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4237 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4236 0 R - /K [37] - /Pg 4715 0 R ->> -endobj - -4238 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4239 0 R] ->> -endobj - -4239 0 obj -<< - /Type /StructElem - /S /Reference - /P 4238 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4240 0 R] ->> -endobj - -4240 0 obj -<< - /Type /StructElem - /S /Link - /P 4239 0 R - /K [4241 0 R 35 36 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4694 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4241 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4240 0 R - /K [34] - /Pg 4715 0 R ->> -endobj - -4242 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4251 0 R 4247 0 R 4243 0 R] ->> -endobj - -4243 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4242 0 R - /K [4244 0 R] ->> -endobj - -4244 0 obj -<< - /Type /StructElem - /S /Reference - /P 4243 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4245 0 R] ->> -endobj - -4245 0 obj -<< - /Type /StructElem - /S /Link - /P 4244 0 R - /K [4246 0 R 32 33 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4693 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4246 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4245 0 R - /K [31] - /Pg 4715 0 R ->> -endobj - -4247 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4242 0 R - /K [4248 0 R] ->> -endobj - -4248 0 obj -<< - /Type /StructElem - /S /Reference - /P 4247 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4249 0 R] ->> -endobj - -4249 0 obj -<< - /Type /StructElem - /S /Link - /P 4248 0 R - /K [4250 0 R 29 30 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4692 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4250 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4249 0 R - /K [28] - /Pg 4715 0 R ->> -endobj - -4251 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4242 0 R - /K [4252 0 R] ->> -endobj - -4252 0 obj -<< - /Type /StructElem - /S /Reference - /P 4251 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4253 0 R] ->> -endobj - -4253 0 obj -<< - /Type /StructElem - /S /Link - /P 4252 0 R - /K [4254 0 R 26 27 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4691 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4254 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4253 0 R - /K [25] - /Pg 4715 0 R ->> -endobj - -4255 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4256 0 R] ->> -endobj - -4256 0 obj -<< - /Type /StructElem - /S /Reference - /P 4255 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4257 0 R] ->> -endobj - -4257 0 obj -<< - /Type /StructElem - /S /Link - /P 4256 0 R - /K [4258 0 R 23 24 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4690 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4258 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4257 0 R - /K [22] - /Pg 4715 0 R ->> -endobj - -4259 0 obj -<< - /Type /StructElem - /S /TOC - /P 4076 0 R - /K [4281 0 R 4277 0 R 4264 0 R 4260 0 R] ->> -endobj - -4260 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4259 0 R - /K [4261 0 R] ->> -endobj - -4261 0 obj -<< - /Type /StructElem - /S /Reference - /P 4260 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4262 0 R] ->> -endobj - -4262 0 obj -<< - /Type /StructElem - /S /Link - /P 4261 0 R - /K [4263 0 R 20 21 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4689 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4263 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4262 0 R - /K [19] - /Pg 4715 0 R ->> -endobj - -4264 0 obj -<< - /Type /StructElem - /S /TOC - /P 4259 0 R - /K [4273 0 R 4269 0 R 4265 0 R] ->> -endobj - -4265 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4264 0 R - /K [4266 0 R] ->> -endobj - -4266 0 obj -<< - /Type /StructElem - /S /Reference - /P 4265 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4267 0 R] ->> -endobj - -4267 0 obj -<< - /Type /StructElem - /S /Link - /P 4266 0 R - /K [4268 0 R 17 18 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4688 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4268 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4267 0 R - /K [16] - /Pg 4715 0 R ->> -endobj - -4269 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4264 0 R - /K [4270 0 R] ->> -endobj - -4270 0 obj -<< - /Type /StructElem - /S /Reference - /P 4269 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4271 0 R] ->> -endobj - -4271 0 obj -<< - /Type /StructElem - /S /Link - /P 4270 0 R - /K [4272 0 R 14 15 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4687 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4272 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4271 0 R - /K [13] - /Pg 4715 0 R ->> -endobj - -4273 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4264 0 R - /K [4274 0 R] ->> -endobj - -4274 0 obj -<< - /Type /StructElem - /S /Reference - /P 4273 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4275 0 R] ->> -endobj - -4275 0 obj -<< - /Type /StructElem - /S /Link - /P 4274 0 R - /K [4276 0 R 11 12 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4686 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4276 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4275 0 R - /K [10] - /Pg 4715 0 R ->> -endobj - -4277 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4259 0 R - /K [4278 0 R] ->> -endobj - -4278 0 obj -<< - /Type /StructElem - /S /Reference - /P 4277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4279 0 R] ->> -endobj - -4279 0 obj -<< - /Type /StructElem - /S /Link - /P 4278 0 R - /K [4280 0 R 8 9 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4685 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4280 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4279 0 R - /K [7] - /Pg 4715 0 R ->> -endobj - -4281 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4259 0 R - /K [4282 0 R] ->> -endobj - -4282 0 obj -<< - /Type /StructElem - /S /Reference - /P 4281 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4283 0 R] ->> -endobj - -4283 0 obj -<< - /Type /StructElem - /S /Link - /P 4282 0 R - /K [4284 0 R 5 6 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4684 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4284 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4283 0 R - /K [4] - /Pg 4715 0 R ->> -endobj - -4285 0 obj -<< - /Type /StructElem - /S /TOCI - /P 4076 0 R - /K [4286 0 R] ->> -endobj - -4286 0 obj -<< - /Type /StructElem - /S /Reference - /P 4285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [4287 0 R] ->> -endobj - -4287 0 obj -<< - /Type /StructElem - /S /Link - /P 4286 0 R - /K [4288 0 R 2 3 << - /Type /OBJR - /Pg 4715 0 R - /Obj 4683 0 R - >>] - /Pg 4715 0 R ->> -endobj - -4288 0 obj -<< - /Type /StructElem - /S /Lbl - /P 4287 0 R - /K [1] - /Pg 4715 0 R ->> -endobj - -4289 0 obj -<< - /Type /StructElem - /S /H1 - /P 103 0 R - /T (Contents) - /K [0] - /Pg 4715 0 R ->> -endobj - -4290 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [12 13 4296 0 R 15 16 4295 0 R 18 19 4294 0 R 21 22 23 4293 0 R 25 26 27 4292 0 R 29 30 31 32 33 34 35 4291 0 R 37 38 39] - /Pg 4681 0 R ->> -endobj - -4291 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [36] - /Pg 4681 0 R ->> -endobj - -4292 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [28] - /Pg 4681 0 R ->> -endobj - -4293 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [24] - /Pg 4681 0 R ->> -endobj - -4294 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [20] - /Pg 4681 0 R ->> -endobj - -4295 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [17] - /Pg 4681 0 R ->> -endobj - -4296 0 obj -<< - /Type /StructElem - /S /Em - /P 4290 0 R - /K [14] - /Pg 4681 0 R ->> -endobj - -4297 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [11] - /Pg 4681 0 R ->> -endobj - -4298 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [4300 0 R 8 4299 0 R 10] - /Pg 4681 0 R ->> -endobj - -4299 0 obj -<< - /Type /StructElem - /S /Span - /P 4298 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [9] - /Pg 4681 0 R ->> -endobj - -4300 0 obj -<< - /Type /StructElem - /S /Span - /P 4298 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [7] - /Pg 4681 0 R ->> -endobj - -4301 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [1 4304 0 R 3 4303 0 R 5 4302 0 R] - /Pg 4681 0 R ->> -endobj - -4302 0 obj -<< - /Type /StructElem - /S /Span - /P 4301 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [6] - /Pg 4681 0 R ->> -endobj - -4303 0 obj -<< - /Type /StructElem - /S /Span - /P 4301 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [4] - /Pg 4681 0 R ->> -endobj - -4304 0 obj -<< - /Type /StructElem - /S /Span - /P 4301 0 R - /A [<< - /O /Layout - /BaselineShift 3.1614 - /LineHeight 3.96 - >>] - /K [2] - /Pg 4681 0 R ->> -endobj - -4305 0 obj -<< - /Type /StructElem - /S /P - /P 103 0 R - /K [0] - /Pg 4681 0 R ->> -endobj - -4306 0 obj -<< - /Type /PageLabel - /S /D - /St 1 ->> -endobj - -4307 0 obj -<< - /Type /PageLabel - /S /D - /St 2 ->> -endobj - -4308 0 obj -<< - /Type /PageLabel - /S /D - /St 3 ->> -endobj - -4309 0 obj -<< - /Type /PageLabel - /S /D - /St 4 ->> -endobj - -4310 0 obj -<< - /Type /PageLabel - /S /D - /St 5 ->> -endobj - -4311 0 obj -<< - /Type /PageLabel - /S /D - /St 6 ->> -endobj - -4312 0 obj -<< - /Type /PageLabel - /S /D - /St 7 ->> -endobj - -4313 0 obj -<< - /Type /PageLabel - /S /D - /St 8 ->> -endobj - -4314 0 obj -<< - /Type /PageLabel - /S /D - /St 9 ->> -endobj - -4315 0 obj -<< - /Type /PageLabel - /S /D - /St 10 ->> -endobj - -4316 0 obj -<< - /Type /PageLabel - /S /D - /St 11 ->> -endobj - -4317 0 obj -<< - /Type /PageLabel - /S /D - /St 12 ->> -endobj - -4318 0 obj -<< - /Type /PageLabel - /S /D - /St 13 ->> -endobj - -4319 0 obj -<< - /Type /PageLabel - /S /D - /St 14 ->> -endobj - -4320 0 obj -<< - /Type /PageLabel - /S /D - /St 15 ->> -endobj - -4321 0 obj -<< - /Type /PageLabel - /S /D - /St 16 ->> -endobj - -4322 0 obj -<< - /Type /PageLabel - /S /D - /St 17 ->> -endobj - -4323 0 obj -<< - /Type /PageLabel - /S /D - /St 18 ->> -endobj - -4324 0 obj -<< - /Type /PageLabel - /S /D - /St 19 ->> -endobj - -4325 0 obj -<< - /Type /PageLabel - /S /D - /St 20 ->> -endobj - -4326 0 obj -<< - /Type /PageLabel - /S /D - /St 21 ->> -endobj - -4327 0 obj -<< - /Type /PageLabel - /S /D - /St 22 ->> -endobj - -4328 0 obj -<< - /Type /PageLabel - /S /D - /St 23 ->> -endobj - -4329 0 obj -<< - /Type /PageLabel - /S /D - /St 24 ->> -endobj - -4330 0 obj -<< - /Type /PageLabel - /S /D - /St 25 ->> -endobj - -4331 0 obj -<< - /Type /PageLabel - /S /D - /St 26 ->> -endobj - -4332 0 obj -<< - /Type /PageLabel - /S /D - /St 27 ->> -endobj - -4333 0 obj -<< - /Type /PageLabel - /S /D - /St 28 ->> -endobj - -4334 0 obj -<< - /Type /PageLabel - /S /D - /St 29 ->> -endobj - -4335 0 obj -<< - /Type /PageLabel - /S /D - /St 30 ->> -endobj - -4336 0 obj -<< - /Type /PageLabel - /S /D - /St 31 ->> -endobj - -4337 0 obj -<< - /Type /PageLabel - /S /D - /St 32 ->> -endobj - -4338 0 obj -<< - /Type /PageLabel - /S /D - /St 33 ->> -endobj - -4339 0 obj -<< - /Type /PageLabel - /S /D - /St 34 ->> -endobj - -4340 0 obj -<< - /Type /PageLabel - /S /D - /St 35 ->> -endobj - -4341 0 obj -<< - /Type /PageLabel - /S /D - /St 36 ->> -endobj - -4342 0 obj -<< - /Type /PageLabel - /S /D - /St 37 ->> -endobj - -4343 0 obj -<< - /Type /PageLabel - /S /D - /St 38 ->> -endobj - -4344 0 obj -<< - /Type /PageLabel - /S /D - /St 39 ->> -endobj - -4345 0 obj -<< - /Type /PageLabel - /S /D - /St 40 ->> -endobj - -4346 0 obj -<< - /Type /PageLabel - /S /D - /St 41 ->> -endobj - -4347 0 obj -<< - /Type /PageLabel - /S /D - /St 42 ->> -endobj - -4348 0 obj -<< - /Type /PageLabel - /S /D - /St 43 ->> -endobj - -4349 0 obj -<< - /Type /PageLabel - /S /D - /St 44 ->> -endobj - -4350 0 obj -<< - /Type /PageLabel - /S /D - /St 45 ->> -endobj - -4351 0 obj -<< - /Type /PageLabel - /S /D - /St 46 ->> -endobj - -4352 0 obj -<< - /Type /PageLabel - /S /D - /St 47 ->> -endobj - -4353 0 obj -<< - /Type /PageLabel - /S /D - /St 48 ->> -endobj - -4354 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /PGOLQH+TeXGyrePagella-Bold-Identity-H - /Encoding /Identity-H - /DescendantFonts [4355 0 R] - /ToUnicode 4358 0 R ->> -endobj - -4355 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /PGOLQH+TeXGyrePagella-Bold - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4357 0 R - /DW 0 - /W [0 0 500 1 1 778 2 2 250 3 3 611 4 4 389 5 6 556 7 7 500 8 8 889 9 9 333 10 11 611 12 12 389 13 14 611 15 15 333 16 16 500 17 17 333 18 18 722 19 19 444 20 20 611 21 21 556 22 22 500 23 23 611 24 24 778 25 25 556 26 26 500 27 27 833 28 28 333 29 29 389 30 30 444 31 31 250 32 32 611 33 35 500 36 36 722 37 37 611 38 38 709 39 41 500 42 42 1000 43 43 667 44 44 1000 45 45 500 46 46 833 47 48 611 49 50 500 51 51 611 52 52 833 53 53 500 54 55 490 56 56 510.99997 57 57 833 58 58 250 59 59 833 60 60 250 61 62 778] ->> -endobj - -4356 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -xœûÿ þ#ãø -endstream -endobj - -4357 0 obj -<< - /Type /FontDescriptor - /FontName /PGOLQH+TeXGyrePagella-Bold - /Flags 131076 - /FontBBox [10 -266 988 747] - /ItalicAngle 0 - /Ascent 720 - /Descent -258 - /CapHeight 681 - /StemV 168.6 - /CIDSet 4356 0 R - /FontFile3 4359 0 R ->> -endobj - -4358 0 obj -<< - /Length 1482 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -62 beginbfchar -<0001> <0041> -<0002> <0020> -<0003> <0050> -<0004> <0072> -<0005> <006F> -<0006> <0067> -<0007> <0061> -<0008> <006D> -<0009> <0069> -<000A> <006E> -<000B> <0064> -<000C> <0066> -<000D> <0053> -<000E> <0070> -<000F> <0074> -<0010> <0065> -<0011> <006C> -<0012> <0043> -<0013> <0073> -<0014> <0062> -<0015> <0079> -<0016> <0031> -<0017> <006B> -<0018> <0055> -<0019> <0076> -<001A> <0032> -<001B> <0044> -<001C> <002D> -<001D> <0049> -<001E> <0063> -<001F> <002E> -<0020> <0075> -<0021> <0034> -<0022> <0037> -<0023> <0033> -<0024> <0052> -<0025> <0045> -<0026> <00660066> -<0027> <0039> -<0028> <0035> -<0029> <0036> -<002A> <0057> -<002B> <0054> -<002C> <004D> -<002D> <0078> -<002E> <0047> -<002F> <0068> -<0030> <00660069> -<0031> <0038> -<0032> <0030> -<0033> <004C> -<0034> <0048> -<0035> <007A> -<0036> <0028> -<0037> <0029> -<0038> <002F> -<0039> <004F> -<003A> <00A0> -<003B> <0077> -<003C> <003A> -<003D> <004B> -<003E> <0056> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4359 0 obj -<< - /Length 6443 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xœ�Y TS׺N7ÙÚ4µOµ¢Q¼V­õ¢mµ8kµÖ™EÂ<ƒŒ"3$ù“�0Ϩ ÊFAÔ¶­ÃµRµ³õÞZŸ�ûÇ·y뾬­¶¯}¾—µ’¬“uö>ÿù÷·¿ó}_„‚1cB¡p‚ƒÜe]l¸|«‡�<0Ðã¥U!�^¦ßß0Z§€Dfœ*”�X<ø”ˆÿëæˆõ³˜)czÉT�@hõ¬é3幩Á¿ÿ-±6øKf˜¾öJl"¡ÐLÚ¶Ò+d¯|½—<8Ò/2vuHhl¸Ÿ�o¤•íüù¯¾d;ÿ¼C­ä.V¦B¬ä1‘òà¿�૽±V«æY½åáà7×ê­y›æYm‰öð4É#­<çYÍ - ¶Ú+÷õô¶ -ñ�ÇqûöÛ­ÖÙoqܺýÅyVN~òÈ`� y„ÜÊÓ×#ÜÃ3Ra-—[yxyɽL×yÓ#ØÊÁWnåàëì;O xJ ,5*&ÜßÌÇ”ý4¸ Ö˜±ÊB±lœ(ßæß’±Ù’q_Ž3äçäé² $”>}<¿®^¯ÏΕ<£–HE¡@ ,í²@mêÞT�@°ÔÔsÁrÓ5¬¥‚ -á‹ÂJá�§>�ysL7ÙB~0KKÅÇèDª¥Ÿ�];vh܆qŸ>½ìé÷%n’Ïl~æ®ôyé>éuéýgÓž5Žwï¹son3wj‚ë„ó| ÿÓó]M|o’Ï N/|5yçäs§˜MqšrtÊ{SMµ›ú‰ìyÙËUÐgœÐ'ìëÃ�>QßóÆƘ‘f}#kyã™ –ÞPpÅ�qI´°RÁ·h êhƒªEb†Z¨Q5ä¢8³ ‹™}|¶w¨’:)À›œÐô©OÀô«L§GhIHVBþ�£”¿[öl[?ò‰÷Š�Ù§¤A -‚ÁÃÙ?°l"q�.T´aS·W+–÷yÌqÓÝyiˆ»&CCwŠëÚZeUP–XA+ótȓ䬚�˜Dù^ºÇî$ëߨG8C@r¬bc*Ÿ.9¬Ô¦ÀVÊBÄà˜‘¨¤¾J"eÖqÇ�SŽ Ûp -zàQFòlÞG Ñ~y_Ź‹?f³Ø‚ ØN©äñ™Ú“¯4®acÒçu«½ÿ�3dRfÍÊûp÷ݳݸ~0½Ï¼ú«Uø¬õ�¸ŸõG÷ãŠj6ž_ø‰NÂÕ8î6¾ðÉ®¶™²`33 ÷]R *>* 8· ¢ L•§*€‹pîp{{]]aôA‰ª ³œgêΑ½™1ª}� -‰¯¦ÜÁÞÚ]…€MÛ•` Þ…þ•aåÑÅ)M‰t�#á¾$§¥EA4ø”Åö ¯»’ý)IaJ¹[+¾*àÁp°©¶¨$§YÛ ¥µñÖ¾élki»µã]KîNRŸÑŽ¿r¤åäÀQ÷%kB½�dÎ]XJã>_Õ†.8îCó6”âT|†ëmû™½Ýýšì0”dååÐ]ÉØD¸ýºTR«©S×ÂQ¨U5-c�–Dj2 - ‡â~ñ[fÊÜÁ+II�`mmÚ¡>¢Í>’]ïA½�v1]K˜y˜›¼JQZÍCïÁŠËå´«Ø8ÂõF‡ùÄAÄTB+•âv…ølI³ù”¢Ýƒ÷„)ÜÍʇ`ê€NU‡©ŠP ÐdæÀIŠAâ†ö¦¶ÓGäKel©3S”4P ÞäÁ˜cЩ:fã«!�šŒ?Œ©×iêÔuÐõªÓyþ¿�·YŒ2Ÿ+™?ìK�;@í6‘ÈSž•k!àá1|�®'\ït¿�tÅ_€tD¨0à6wFßÄÉÂQ*j|xK]Ð¥êz¼<0 -“õÀcHš<9Vá‘N÷+ÿtî󯳼¼6È`¨­54Õùȃ‚|dÒ…�¶rJ¹áÊ¿¸"‰›ÚŽ]8âk'cÕâZM­º¡AÕø‡†ÀpJKØ‘°š½Å;!"ÒãkC×ÿÚ†…qw^7ÇžÃeÍ�ÑæhŽÁ(åNt`Ϧ_��cÂï‡O3VîÀ(üþ¤0þgª~õ>œâ—¾-�‚Ï€‚Re%ÃV -L�CBòCõáÁ)¡qtõ.bïº ^¡hÞÂÛtⲬš£Ü)Û(æN¸íòvXãv²Lvû]Üõ™Ç>X©M·ºàäžvÓ�0ul¶"O™«*„JŠU8^œ:3‡ìQ¸«öE�øráÁnÙA(Ψ‹¡%Ùp—Äe%köCD&ËèÊMÄÕ3-쨻8,6:É?žBÄu°*iÞJºw´['�?œ0?‡ãmëh>·�ûש£üUÿÓ®®ÿоt~{V5efµdeE@-œ€K'{nÀtŶxSî–~q;8¯;ž{”f�7«œs׳ƒí€YÀ«'6Þ ¡håA¸á¡¸š@p…•^�u°¡6 ‡¦}á VdîM²§Ò…,߀îïãÇ_.i6ÿ¥‚æÜÝ£,Œ÷?ÀÖqèUÿ¥G�êŒ\f^÷&”(*¡šÊÞ?©ÏÒëtYúš?„/á§e×§ƒ'ù†ÐÍ;á£QÎ÷KŠËtÉ ÜÍ$Õ£H ~ˆ$´ÅyÜ'æîjh(m:ܽåoÓÝÖ¯²ô€€ÒÐ*Æ}ŒCg„Ÿ¡TtÈ(äÏe+ ¶ùç²:¨ÊÎͧ½gRËITrŠ"è®ý%½–˜ò“8ç<‘gÊ•r §Å0 mÈí£ yÄ3&0Ñ%F뤎…( -[Ö»iÜe\Ú‡ÖCÂ|_ENÔ�Q<[pý5œ-; Myçè¡ã‰ÅdWXPÊ^Ø;kÂ;⎤W*�Sœhv -ŽéOÑ~ñÏ+/2*óƒ°´Ðxº+„¬÷ -Þ -s(ŽïãïÕ´�>Uí9 \þ²h¨{�é¶ãÍ�ÑÂïQ*ª¼Ïó¿a~Ä÷·�ö+÷ý�äòض‘VÆ�7~1$<†³�ZEÇðžEâ½ßÃoÃß+èâ2â•_ õÐÖP5íУ�¦Ü­¼mÍ�ƒRâU¨w2áv•#ü Ö7{\Š£ŸEn¸;©4|a—o�=ì¿â@͸è¦]dì(ão=À¬(ïñÖ̓“bKº=”ÚZOºÃ;;¡jrŽ–¶Uv×9Ü×Þ0 À¢×§=WüäÑNâî‘÷M¨ü3LšÆuã�-Â<ãb¾IIŠUñÅrж#³"·“H{_??ƒ¨üÈjš”;—Ô$Î8 —`ðä GÑÕèI -jŠK‹´´Z-$P¨ -„@TJl@Þ $%ªüTH‚te’2ƒÎdº×0˜¤—$U@)æç«i“ZÈåÕØnê=©¢Mˆî8IÔd¼ÀCxVL^E«ó¤,G ûèÈ1ÇÄË•tµI®¾¯yOý>œ�3ª3&LmÒ¹&¦j)~ †ëš³98†&æ&ueb¯M Tº�[ð-Së¿A©èàÿ ±hž'Fs6ݧó{fNqE£Y”&>/¶‚2 %×Ïv—”ê‹�Öµ°çͬ!‘¡áÛ])å��ýFÜGÆk!ŠpšQpFT}ÿˆ }JÌžFÁ -\�ÿü×˰K _hõ]YÔ ‘+å*9ÈÁK-\ ³t1L;àäç¼;áMXnÅ¡õ¡õ)=ðEõcs8+�UÎà .jg‰�”Y—E—´ó�‹ù*%)UÅ–ºSœÎF>RÒ•WUPCq¶“¼C¹¹¥ZZkZøe€*À_`Zø%)Rå¦A -$*Ò÷ÓÍlޝÝ #ÉU™Å�y9úb5m7-½»Ò]åî°GínZz”°±?4ï5`N⺪üÍõ†kªa‰�² -¡© 554SG¸6˜¤ÌÁU¸œ\8oøœƒom¯°ñ°ÜâìÝi,[lP”½Orj»ªŽÁèØë`…×ò¥K)³c¯)Z(�×F­Š§ŸÆÙ\WÓãkà ÿŒøý©4 "I¿æ„ºú¡_Ñ/±Á§…\½ø^Ó-øî„~¸£—rÃÛNÛU1 °ƒ% -; \—#8ª5£þk o|OÌ WjKÔ‡ÇÂ�ˆ^×®=×Á,˜¾ÜÕuÇÎ5û�pˆU‡g™Ø�ñ)a ž•à>'‹€èŽä7—4Ó”<–$Ù7Ñ?Ñ�š$B›ñÛ6¡Ép‰F½Ö/eªúM^Ë[Kve©4p‹çŠá–ZÓ3ºúm�¯>x¤'S­Ûß{©ì¸Ëxï²Ð€ãѱYdÀXž-øp!Î�õ�!·§ŠìNÉ#~ û2‚�ÎÚr'Ün<~βZ£µ‘4{K3ý9]Cî1šVHv—Deù€BÒ"¨s ±u -Ø ©tÄ!ç {p¾¨ç<ïÑìÛÞahno÷nñôðöö�IÆ}¹ü�b5ÿ¥¸ -¥\o•q -ÿˆ²['žyrû]ÙQ¨Ê).¦×®nÆ"R¯©S×?¦×~꣪ö�}Ä?9V±éw†n¾˜ëÝáîédÕôµ °è—ãLÎOª0àÄ�„X‚cEèÎg{¡À‘Àîè0o%Ý`b¦3š3ê3púU'Lõѹ6¦ -ºéÉ[×Å*í|N�íiLJØX¶| ›`Ϭé¥N¾¨®¨¾¤–¾‹”tšÞz–²OÅÒ²(c=J…½­¢îûSxÈZè`©ú{+äœ#ºcù9=@qd¥³�‘b})Ó”«Ë  ÊUe›âÞc(ª¤øF’¶›å†Æ“ºØ4Y×�¹fÑY"�BÍõ5—Qõí˜jT4aŠ^ÃñÜͤC8ŸÏuÓFÚuÄ6¤÷.œ€ÀÉ0ÕîY^¥wÓQî†`¸­© Þ��–Ÿ±ðLÜæOÙ¼& å õï=Ûêë°Ámï:K_ˆY™�A¸Þ¤ -}¹æÐk};W,uqXeé ~…a‡"&Ü×K¥•Š6ãí_“W´æ†ÿÝñâ"}¹¶nÁ‰]ð:8…»í�ßžé "Ñ›ÝùE½×Cƒª^bÓ&öÉNÔík l=Ö�¡Ã‡KjŽ©/n†ÊuÝÝÐÇÌeëáMÅzØ -[Ô[ÿ*mX§ñp߇ѸåôÃj]ÚŠ›Z¹{I­ ¿Œý ¥]Ó®n‡àšâ„#pJKu9ùhë‘/eªSÊn ìE-`9¢)UzÁ¬J’´aT¿£ ˆ²YÕ ÍЬnj–ØxBº=QÆÈðºÞÌ ZCÓ‡´Ñ’AèHU'ÑœÍP„ÖéÙÄ[¥ö†%°T±(w/i#lPoÔPiþDZæ»ÏÌMžw¢”»Ù¨à»4]ê.臣­7=µYÅÐm²;Y•øW³Þä�&ÅQ“U -]¿Ù61P@F­ w÷QsÂÝü{âÆv>43O8⯠MÜ1”Ž-ýÂ:‡[�Õ—óLzfí�²¨È®(¥gIú–ÌÐ$ߘ >;w‡ÇïN …tHR'hhJlK0¹ =¢;V�Sßþ§®¡¸zÅfÅ&/²e3d8®—ÿ¸±÷ô;�[­…Ê·n”Ÿ¾#“Æ�Æšïq< -ôÑæµ•½(Çqܽ´äË—éÃõ†øºô. ¸9$8 EË/±g,Ý!(Õ>Œfá˾Р}k}>Q•@@…¦Hwˆrgæ`‚ôµë§ƒÄ:-•èV«ƒÀ�Úˆ!J‘±„–'‘†#MÇ€Þìw|mѧe–kÁ¥Õw˜Jãú°ó3”w 87ã8‘KyX\±¼~w³ËPØeS -÷Å×h�â-ÿ˜k¹¼ö¹nÎù¦¨¿®»íí �W r WE‹K¼jÈ<¥sì[;þ¶l'³¢8a=ÿImû™Ó­›ç/ pÙ¾E~î[™Ë¢î[tÑæÜ@éýI|½‚”+ õ!-Gî]‚|_FÄGž&E¾ù¾…¾ôЀÓQj\C -» –jhƒIÄx+}TÞà >j_Ó&íV�ê‚TH€dUŠ"‰Î‘²©ø5áÆ·&6F½MÝÌÂ6æö}�²Ù 9¢ÌUåB”¨)7ÐašÔM¹GåÎà<ªŒmÆëï -kÛЧ¡c›h¢Òû‹øW�¯v9mÝE¢m3¤Õű#1f¿Rx’?§«+î…ììbOª[ÛDsMÛ”sœ¦ëÈ åtÕ ˜3ÔÓ%6RTŒ?„8öŒñ,NÕ›‚ÝÖÑ`·åA°ë­%nY -Ü¢`|ãF"Höþüˆ²=´Ñ¬¼;+Ïp�â^ãJYHž¬²¹�‰D/¥\åõPhîd„m‘2[üx¾B<•ž*OðOµç r�"ÝíA–Ei�¤9ÎPmιW7ð9>D§Î-4@YBõzƒMaO1+“¨¤~·Åýžû‚pIß°¥¤ZS­®†j¨RUKl¸­q 6ªÌï4µÅ¹wÑŒÔ5çé jj˜+f6ÛùSÂùF¶ÄŽ.¡¾)+ã½Ó¨-â†Ð©Ó¯ÿ=dÞƒ³�Vh½¶•ëíÁ{< Åyl:&˾…kÅ(颸š*³² 9´QÌÝܡܡÚ®°Kí*±�½JÒ¡,N�0Ê&‰]büÓÝ�²W˜y´Ç5_ÿˆ¯Y^…ḓΔëù½m\]ø"P–ËlÙ ,Ðò—Pì�ü%=Y,öº)'ü¿Çb8ÝÐ¥êþ¥DMf6 šÈ]$æÚÙåu@jòcv[²¨'³UFqªxõ>Â]ø'Ë3ve"˜=ynŵ ~ezÂ]üží¹â$£åï²I™)œ´”Æõ/õ›7ÞZý=º~b‡Oq·ñe~æGkp¾ðÍWh.ƒž„Öà†}U±{K)7|±§ª†èçk‡˜€™/ZÅD2XsÄýŠ]â)w„5”»u«„‡�ÒúþnúN(¹ê_ë ötý®�›d«�NhÉ ×á·üÉ–¦Sïv¸o��G|°»7ÝSNÞ¨ ; -ÇMll¼Ú'l@ :£DÔ€ƒ<‹8;gâüKHP'ƒŸß >pj{í*X[äoúmMX -LJQr‰|*ûD…¡¸æPá8 -•±%~îEŒ6˜µÿ²-&L”Å7ÒèÎD| -p²ÉŸ6Þx`!°ºUÔzŸçñO¤Z^÷‚H¢LuN1퉗´`Œ%j7Læ« ;‡0¿MˆÏà4|§‰šÿBÝÚßÔàL¸©fÿä<ö$v‡ÙŠ#”1 ÊfšÉ!"5mÿ?V ñ»>á` ^ï•(øM¿znÃmÕm‰�NGà˜î�ìãÔ2IŠý�DW ì5ÀƒF ÄEé¢r1©1õ‰MšBÁ&·€¶Šè�åÅqÀ–±”él -‘2/ÿ•Ç£7lÎ=ö2Îas²²uúÑ—.;‹Y …¾hAoˆ-ñ%´@‹´¬t]º>]Ÿ¡ÏÌfsØœYìe`s¨i¾ª¯D1?>;SŸ¡O×§ëÒ³Òpι‡/Î�dÎ,|™ÍÁ9™i飯Œ´L´`ƒì%`ÔN ÌÂ�½Ä,˜•²-7Øl¾PS .„B(THlðÈýv’¨< : Q}`qCÆ»CB!oÄÙ¢ü”gá8‘q‹©8 -0CÙDäYË`ÓØd+ÃÙ‡yø®êFWWkKùY€Ž¸&¿AǺ9À°­Ë^d3Áö–ø4SÇ�À¯Å&w)E‹ÑpÃô(4.æ”ä°*/9'”þ<2á:�>|!¿òΦ8‰½}@vÓ‘ôŸXH -ò -‹Ô´ÑZø)ýU~àþj?SÜÑaŠI -Lÿže*“T™Ô‡’è•·›r™ /퀅ÌÙž=·£‰*K•:Z˜“›/ãzLÓ¹)ÝTnà»Õn›&çý…ƳcþhŽo<¡ýÇâêý:ÅÐ:Š^LC5�êÆ‡Ï�v±·:²0°™²r¼€áèI*Î>«£­â e *‚ P$± C˜�]Be;˜#à®?ßá¾KnŒ -?aÅýI|»‚T)KbºPL¹x HaC~cQ=E/c)¬/,<¨¡õ!Dž²(öÃþäÀ('ʬÙOìïÆ‰$êh¡ r r‹Ô´Ï4ÒQé¨r'pV;Il¤ÿ HKç -endstream -endobj - -4360 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /HRSIWM+TeXGyrePagella-Regular-Identity-H - /Encoding /Identity-H - /DescendantFonts [4361 0 R] - /ToUnicode 4364 0 R ->> -endobj - -4361 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /HRSIWM+TeXGyrePagella-Regular - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4363 0 R - /DW 0 - /W [0 0 500 1 1 667 2 2 287 3 3 333 4 4 500 5 5 582 6 6 250 7 7 525 8 8 582 9 9 500 10 10 250 11 11 500 12 12 1000 13 13 479 14 14 667 15 15 556 16 16 613 17 17 556 18 18 709 19 19 603 20 20 946 21 21 546 22 22 611 23 23 395 24 24 424 25 25 326 26 26 834 27 27 1000 28 28 883 29 29 601 30 30 291 31 31 333 32 32 565 33 33 444 34 34 560 35 35 250 36 36 553 37 37 250 38 38 278 39 39 623 40 40 500 41 41 516 42 42 556 43 43 778 44 44 608 45 45 605 46 46 774 47 47 500 48 48 611 49 49 604 50 50 832 51 52 500 53 53 763 54 55 500 56 56 668 57 58 500 59 59 556 60 60 831 61 61 337 62 62 611 63 63 500 64 64 778 65 65 786 66 66 726 67 67 722 68 69 428 70 70 560 71 72 456 73 73 250 74 74 897 75 75 500 76 76 611 77 77 333 78 78 250 79 79 234 80 80 486 81 82 500 83 83 208 84 84 480 85 85 500 86 87 441 88 88 500 89 89 278 90 90 208 91 91 786 92 92 667 93 93 444 94 94 486 95 95 278 96 96 747 97 97 371 98 98 500 99 99 479 100 100 603] ->> -endobj - -4362 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -xœûÿ~Z« í -endstream -endobj - -4363 0 obj -<< - /Type /FontDescriptor - /FontName /HRSIWM+TeXGyrePagella-Regular - /Flags 131076 - /FontBBox [-40 -283 1000 750] - /ItalicAngle 0 - /Ascent 726 - /Descent -281 - /CapHeight 692 - /StemV 95.4 - /CIDSet 4362 0 R - /FontFile3 4365 0 R ->> -endobj - -4364 0 obj -<< - /Length 2027 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -100 beginbfchar -<0001> <0059> -<0002> <0069> -<0003> <0066> -<0004> <0061> -<0005> <006E> -<0006> <0020> -<0007> <0053> -<0008> <0068> -<0009> <0031> -<000A> <002C> -<000B> <0032> -<000C> <0057> -<000D> <0065> -<000E> <005A> -<000F> <0067> -<0010> <0054> -<0011> <0079> -<0012> <0043> -<0013> <0075> -<0014> <004D> -<0015> <006F> -<0016> <0064> -<0017> <0072> -<0018> <0073> -<0019> <0074> -<001A> <0077> -<001B> <2014> -<001C> <006D> -<001D> <0070> -<001E> <006C> -<001F> <002D> -<0020> <0076> -<0021> <0063> -<0022> <0071> -<0023> <002E> -<0024> <0062> -<0025> <003A> -<0026> <2019> -<0027> <00660066> -<0028> <007A> -<0029> <0078> -<002A> <006B> -<002B> <0041> -<002C> <0066006C> -<002D> <00660069> -<002E> <0044> -<002F> <0034> -<0030> <0045> -<0031> <0050> -<0032> <0048> -<0033> <0035> -<0034> <0033> -<0035> <0047> -<0036> <0036> -<0037> <0037> -<0038> <0052> -<0039> <0038> -<003A> <0039> -<003B> <0046> -<003C> <004E> -<003D> <0049> -<003E> <004C> -<003F> <0030> -<0040> <0055> -<0041> <004F> -<0042> <004B> -<0043> <0056> -<0044> <005B> -<0045> <005D> -<0046> <2022> -<0047> <0028> -<0048> <0029> -<0049> <003B> -<004A> <006600660069> -<004B> <2013> -<004C> <0042> -<004D> <004A> -<004E> <00A0> -<004F> <006A> -<0050> <002F> -<0051> <201C> -<0052> <201D> -<0053> <007C> -<0054> <2218> -<0055> <005F> -<0056> <007B> -<0057> <007D> -<0058> <00E4> -<0059> <2018> -<005A> <0027> -<005B> <0051> -<005C> <0058> -<005D> <003F> -<005E> <005C> -<005F> <0021> -<0060> <0040> -<0061> <0022> -<0062> <00E1> -<0063> <00E9> -<0064> <00FC> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4365 0 obj -<< - /Length 8677 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xœÍz tSÕöwc8ÍQCÄ^‚¤e(ˆ ¨ ‚€ È<-P ¥sKG:¥¥#“ì$MZZ:ÏmšNt¦3Dd‘¢Eá‚‚ö­§ï½o¥àÃx¼ï­ï[ÿ¬öfÝ›3ì³çý»[`6h�™@ xa½ëÆEa®«Ý]½½__ëêìí`úiÿ -?Ä2~„@öŒ™%À½«Xô÷+ýï 'W‡ê #ÌÌ£Ÿ3]cžaföÏŠG™n<ÄcL_ÛÄÖfB�À\Ò𾋟“ëWß Ï °ù~þažîAVo½ñÆ´×ßzãÍéVn~Vë]7Z™h±r rõ ôôó ´r -³š7Éj©£³—Ÿ<ÐËs¢ÕÒI+&Y­ô“;:›î\ƒ¬½'Y½êçkåäêáèífåç6°ŽÍºk×Y-Z»Êfõºñ“¬l=]ƒ|}\]­œ=�ƒ\­ä®®VŽ..®.¦};úZ­÷pµZïáèë1ÉÌì)3�™3¯Ú7G*Ïç=³Ð´99s¶7E${F˜nýOñÓ)âgŽ>cLÑéu)bqﳕ©úL}nºNüÝYVµ\¼A³fŠ\ß÷¶qYAǰwØhÌ$^‡�Z€2q‘ô[)ŒüÓ†FùÕ[×oMîå~)PH›4�ê&h‚FU“iñ­Zâ©Q¤ÀÇðŸ±ÉdcȆHÛêW+jHŽ_bÉ‚E°\賓[„ãÏñǤ>ùr£1?ßX./ð•yËå>–v[aÄ_;0ô„àz…E�Ù÷âQJ7qPlS9ýF„¢ Dz2È�/¡{ôpž„¤Fk£À RG–z~àó†•ô/`“±B��öÂl6FšÓ˜G.þR÷±á<�Ì$þ±a ¶ñs–®™@%оò¼ ¾K¿f+¤g5çÔgá 8¯úBl­,€4È„ H+[³›»p)Ú�·�á höÆÁ|°“Ûm¢;ÙðrÈh%Ù‡÷–œ„KpЦÁ\Ç÷abÊÞcKˆ?í{͘*·àbRû^“¤\‘•êIqTÿ?:�ì®L-Îk£8�_‰Ï³+¤ê-m\ ÐN(û _çkˆ.'=­PC+µ`$J•x€‡ÚCl > -Ҥؽ+QNÙ‹ý‘l:ïH¸¹!G“R㪩—yÈŠp{[ö2eCØ©q¼ ‰«Ó”Ôk)ÓdZÊQé¨rGpT;Š­%l›¼7UãÜ*AéUŒ¿,,E?),Ï´1¸ÖÛžò>µP›Ú˜[–^�‘¬§ùÕQid™kPì6X -6å~¡UñåaŠcÍOC³ötº:S½öŠÞ?Ç�l‹r -œ±eû -M¯uI¡-¹0£´`_sY;TAiT®áö4_XLÙ Ù -;Ô6:* W´ñ?íôTó¡ Â,…ôŽæŽúü ?©~[Ã%u�î õ„„µ$~Id{(+~'ÿϤr+ßÜð¦x›a®qSGƒx©¢ÝÄÖÕ ?C´õe©(Š¡æŽ�¾n[(;Øÿ"‰ �>€JÇöV`ì§«FÛŽÔj‹Ê/l{×|�k{Õ¸þîJ&•¾qy9r8Ÿ½†’Ï6w.�±©æ\_÷†À=e–�‘š^Z¨×i4ÉÉi*½*š¡;¯±¼¥ª°º!_‘W@¯@IcÒ6*‰¸Ý÷Ø�lŒt -¤Ü¯Ýë¼|í`%¼ßºñl�µ’p}Ý»"£ ürÃÛ#éÔ-$2.Ò ¼)×ßý…F --¥ ¹Ù)íi Hꃖ¾=kÙ(Ë©«ºÎZr¿vWðË¥çk[ŽŸj]7m©£ýJÙbûýç-% F¾¿UPR�×СB8tznßb©n­Æ–Ò -H¾@ÔÅé» @q²¹ÖSÛhÿÌ'‹ üL´¨ µU¦¹H�UÒäY@àM½îCʼì- \>¹á\ß ƒW°‡Ÿ/ÍU’EFL¦Åý¯­$^ï¸lqÊm ‡°Ô�Y4 -ç® oWvbœ„æ½ußRtà=HÃy† 5hÀ@¼”Þ*/ðoµ—ØüJ•&ûˆŽp§ìYÖB‚ëv…vÐe8‹ìܧɫ×Ð:Ó$¥«Ê\ÀUí"¶–”Êô nÞåÃ*„…xMʼñ-6£e_ùÜÓ{©¡36�¬p^(Ÿ”m`ÃpnÂåhŽœûãOÎ.–ó+DêÎä½™'¦æẽ©0=d± 3_¼j°W¨dfôGªxsC£Üâf/Æôr¹üi­ù½°2K ôÞ¹…>uB 4d–•ГǾªpѦLm¸ç†•ô÷nøáéÅ;"Žô -¢\‡ŸŸW¤ x€_zx^dv|죀íæH0[aì{Î(@a+ÿÙ5“S¬×Ô©ë¡T &1; ˆy7|I�·ÇÊþïò�”H5´P\ÈKö]‚~{³’â·$QO“š4kšÔÍÐ ]ªÎ?©‰�¾ÔínÕÒ_ä­ôVyÿ&6–ÕßÍrøî? ÓgŸ‚´*t±0›öÛˆ`vbìVuP !¯âgV *¯bÇUa%úHÙÈËPŠ“ð©»ø¾2þÁÆŽÃÆË®VKQÜþÉwWN�cÙhãüwÇ/¹Ž£d’ùÑn®â‡· G‹šo±¹—‹ªAo)Ì,[ÒáL¹®jß¶¨O Š’uÉ…W •8™”jJÔ¥`„ -•ñOÙßÿ×È–‰Öû¥z€?&DÑ)[ÉZ·y0�~[%EÁ�ãßËê !ª&° rOÄQ&ÁR宨 Êuùm±óÞtÊòoðYK kT±ï›…‹;½ÜéSoT7B;´©ÚïGH{­R '(Îmèì�¡ 2Û‹Àn“˜”°ä0 \­x…‡ÐuKà6áN›�ÚÇe¨¶G^Ë¿SeQûé#ªÎ.0pW�ÉÒý;ëã[_€«ŸÂ�PW$ÏßQº=}JÎŒlÿ|h¥�5†�dÜå“][,ƒ "õau±¶Â6×=Å …ÖÛ°¹Ð³5¤,º;üTåηìÊ Wj³Éõƒyj:e�>"X¨ð‰s¦Öý1ö¶ ~ìòéÉÀÉûU^çeEP¬Ó§Ðö -Ô%<¿Ã³p¨h÷6"ê4i÷¦§Ñé$0Â'Ê{—ÖG ->Ìö œÀÏ7¤™BµžŸ/5(‰A™±³ä]ú3»Ü?âN’ÛTý)ÅáìZ+àü™Îdfjh©É‘lWz©¶ÃvðRo7yŸj%iPê"�é&fµ™ a"l&ÜÜÈêøü¸2lJ¿à,'±F]N�†r1 ¦Eœ•.*gpµ³ØZ‚Ÿ¢ßaú ú5âð?"Ì%¸å·¤÷f/ú˜þ†ç:²MA³º  þž©:þ)�;z vã[ô@–àC]Eü~Îo©ŸÊï)ù–ãœD7×›,óߨ°p:gñ:áT¶ÜÀÏt¿p|cR©‹�U©¬Úˆq]øwCà'?ôbË·ÜÅT–,õ=š¾5"cXe| ”C©>;�¢ùYÒPÚvŽ -'Ë(¸�û®ð:c.\7QpãOôÃoà`¼)EdêÒ3r(w±¼¶1¯èߎ.Í-žþ¦åzpÊui¤’þá -cŸÄ”;ßé>¶Ð{˜é?È~Ìè6z}&ÈÁvaúKu‰˜Æ“‰:–m -�Ïðó “V+I®J›Dqnÿ¸N úª¬ŠüŠÏ`)êÊÈÊWÓ -“Îx+½TÞà ^jo“â5*I¥|ýQÇ‘+˜{IŒ!ÑP©¦÷žËï‹“ïç¥û¥ßašAXŠnRöʵ‰ø²l?œËKË¢•»²ˆ›Ü+Ö(λ„/Þí<ú½å>h—çД• Ъkܽ׹Ø#Ý 6úÐU® ÜÀ*aÏ H÷C~p› æ[,îÖà6){áÂ4"+€œäŒTzç°DË“â·+é“b¶jÚÔ­Ð�÷j’¬åcEpL_—SGCÓí¼ÉÆ¢miÛÀ<â"bé;6d™Óö%0•~»OŠO:~]Ö5Ñ5¾”eŠ 2p‡D`TP| Ð)+¿ÂÁ–’þ‰H'‘ -OvK}ÊüÊ+ eF?ƒ·�¿Ÿ�L†Ewñ‚Oî•K'z±ø[aDßxé!ó{òtÁ -•üš�а—4ìØ»«ê¡4¥ ‹ÞúŒì«¬ù>¤s¿ [À.lǺ~àÏ4gô_•¢—2Ór³s åõ9�@{»Y±A«fOÛð~eá}1 ©àRቇ�‰?ºÿÌXñ/ÒûÇók1[Ђ«…-üiÖ®}ÅäÃÏëNV_¢Q¯ù�„™�K6¿G%«~+ Ó¿EœØÞ'ô÷PöB|C�f”ý��§Fk#À<Ãvü�pdN߈žxô#ð -¨á_ª5âM£0;Gª—“.M—º ®ÀÕ±5i‹õíTßæa³HR˜cü ìÀ“üH0’­Ê­ª­0f¨§‹­•UÑ ©öœ"ɹº³@q´yÈöð ?O*a3sC´e¼UiØ@Ę›?ì’9@JQ÷zöGÂÅàKlÉרó¡òUbkn5´$Z�“EÙ«¸Gá»DŸ’žœ4Ó0Ü aóç %�(ŒÉð¬¦ŒÊ ·M·£@Ir•…Qi‘ÅlÏ> ñ±Q »€î4—0NaÜUÄ¿dD{Sòr§—ëpOMê&h„†{6äð;J†¹LG¸ˆëåPDÁ7Ç«‚2 |ž¸×Ädì̧(ý‰´í-K¯j'Z¶l‹ƒ‹7�·ø­�ók\‡‰ÿ×F´oàçËY -é^M­z/4@ã½ ä¦%Ú¨ȆŒÌæ‚Nj8‰�ÐÊD$Ç19 -b!&<>@I·<ðMÐ|Oµ<µd‡&&Ïã"e‰ü'^@b<]§Q¶£_E¢|C•ÔMA0¥ÈaZ°."™û›z+åÿÓ‹‘½Ü�¢ßÓ ûTÍ÷3¥Çag‡tÑB õPÐ${w¨»e¿úÉìø_ w16�8Fl�[I ¢�R«¡Ü�]¬z×kõì�“¸šåWoåŸ0F~ëµ^îk³ÿŸX žôyÈf\WÌ¿«?6…8ÛF®Žëpæ›õ<áüA±�ÇZ£’küâ»\KaßkÒ†¿¯|cƒÃã¨w8Ý׎vèP´‹­q(\¯úôôggö¡Ü\Éd8˜¹]kk`!,R/[ãÊ¿¿ 寈¸ó¥ºm' ¾—wÛ¶o.š〠ò|{‰Í*»U;�­à­Ù¡§…'çmä¬êjp›4=óæXi§¤+L²? éV€.èRuÝ/qì´1p”ž�•AAψÀNá%óGKsÀ…šKºF­{ߟ0ÿþw¥è…¿û…Hæ+š�ØÝ~IŽ®M>F | ›jâ¸�+ÚX³ŠŸ{%–»i®-æ^ê¾T�[ãL-�Ãúiû©$z’„mQÞ‘‰!ñóß„ ¦ñÕSÀ*œª%û /)e{r°Ú €Í•µªZ¨…zu]½ØÚǶ'†Æy†&mƒM°Dí ¥˜/ªHÉQŸ†áPbe,åfšÇk“ ˆ.­ÁQ]{ú>ʆh óžr¶ê=X «Ô«ÅÖ’Y -#vVbWÝýsåÜân*¤�òD5©åÉÕ@Ñìð¦‰o®\>Õ2"4;Riš;)NÌTåÅ¿\EñõÙGgÉ]\ ëka%¬R¯4ÕŠ- -Ò¢H�‚÷ï±ë>pA$8^aÄÓíXlààkü˜kÂÇÑ��¢2M64Å(óȆ2%5éó!6"¸ KmÕÒvS…k§´SÙ�lVÛ™è{ N¶P¢ -Q9eQæN¬–«).|²¹<›¼9�S.èäçšÝZ¾á®eàiÑÚ=^™†ˆ†Øf8 gʶt òœ$ïö0sØ îQ+Ü(÷ÃntÅÉ:Q悲 ô¹bkHÔŒ\$µh¤ Ä£4lá®ÁÅ$…ÍO mme™@¯]Ä̘pÙR&°´�M¹‘¥tëWD"oÄÕ˜rÒ"«L]�Y_Ù]å~ÍÂ×¥+SÝõ›ºÃöÅÕB\i9x²º1g´A»¼É½$ 7(uÓnÊõ÷3¶Â¸üþ&„E`ºy3õeC* ÷I¯þ¸z?ÐOºm—Ï]½üƒ8-XFÛ¦$�ºœ<]PîׯÛmß°^¹x’åVpÊò1F… ’yúy«&‹Â»¼û•-_ˆ“ÂØš·Ž­øtÑ]'¤pNgàð:гDP¡Ö¤%Óò´¤â¤tR9�8«�LÂø:ž”(wÇB +‚@etR|LèªÈ%@™³ÀÑmÐ á*Ëý°/¡.šr¿- Wj[!‚.}[æ&¬Ü¸{&P–ÎÞccY€¥D^…—�b•\Pùî¹$¬D�²=Ö(Åa7nãp-<7R¶Ü—Øà’Þqñ -©n9d‚—“|£Ã˜©ë˜Øúƒ¿j’óÒs -«ÛŠÛ�~ѵäÕÑ¿7mëçø²¥$7„¿}I°�ß!5BÊ!’z,%µ(æ›;Ïð^㺒2EÿðÝQ ÚÜ\ˆG5¡ ô“Ë8…â2ü -Œ„™%Ū¬`ìT¿&¶Þ•H´ËL¬Q¬±µ$Baìýfò·¸óÿÆä«S�&“¿sxó´ÉóÖ0jén^˜“Lq9ƒFR¤)TA1«ŠÅÖF‘—6\•C™;È¡ÌÒôª¢ýµ†N8 ×—`Ã`¬V¬ʵ¬�µê5 ->�@�~g9Õ}Òj ã™Íç0þÔÆ Üe#N‘Žùz†f?ãô¸53óý”;ÿñÊ&8J/}px${vêœQ2XTæúÝZ§Ð�1Á!ÔÕUn(wùLª>/o=ÛB{ÜÉÇ~uv`CßY¾ä]Ù´õG¯ZrçËøÁÒí-g>oßíñðÕû€å V>½U˜óXÀÒ™÷éïý>œ@š"Ò(ßñ¹Ïäc�•Î*çßJâßc�ÐïÕÌÿ@`»"dË<�z yó>9ƒVž44üñ°óM}Â�Åñ‡JáŸr‚?¦GUš*u| ç_Bì®MiN®L»A½ z‰u‰IHŒŠ™Ïžw2%;|Þ£i’Èkú¸Ay/ô -Ëñ¼ØÓckìjìùоÀa¸ý–Þa#ØäYì9–hÙ»WŠîµ__»Q?žÅ3O×)“_sú 2É5ù±>3Æ|�£U¸çÇ`(‚Ù¹ëë\œÎ„Ü‚Ûpº ¥µ­­ð �bÓ“ Œ}.b#-aÖÌrÕA*Ã�9ÙmySßK`É]¡)07Ë& =á{8ýÑ�Yá‹,€…²‰ìUæ/»[+ÅWîàtœó“0f7™=Í&³YŒà(Ü.“4?™:¦¥àOì;R¦)U—A!¨ -MCB4$Bžî]NÙ×ø æa<)+.É(UÓ& ‰¿r‡Ê|ÀWí#¶öABÔÎðpÊ*X1àvò¡Wõ}¯¦7“{¤@™¾k�/ÅÕýN¤bÎ�,ÚižwlOUU�éå Rt0#+WC�¦õÝ•î*wpwµ»iýý -R«ÔúEzP¶¬ß‡mâ“Ibfjv™š2�vPÚ«ÀìÕ&Ì)•i~�Ø À!Ç…8„i¥`®Ô«R RÔ)z±5{ë׉øÖŸž˜ÿnfüqáWÌMªIPÇC<Ä«âÄÖðk 0ÿã³·þ1Ñ\žëäÇzø1ÂÔJ™¸g&ŠQÜÓcºÎìab&ž9“‰e&¿GºI�Míeo ŒÉ´údÝÀ'Y¯er«q"à8Ú#w'"‡\‚619Q—¨KÒ)ôLÆdï°7€M¥¦õ -L„zKõ -]’.Q—˜œ¨M@Êzñ À©‹L}ß`2”)’>I -äw„M6ŽÎ·šMdãL/¹ñ*RÁU¤Âl6ê±/¹ÏóµÒ¿¢C¸ý/Õ¤ãý‚²÷ß”Ž�€]L››  Áÿ!äø_C@ü­‡–©ûçþejÌ#ÊÔû`<¯8ܯ07¹dü²õ ¦˜I®aôÍ…·¹ ¥÷l©-)9þ¾kv‹ ŠL¤;vA¹‡ˆ4B“¢Ql}>Ém©:ÒTs ->….y£k™«Ás÷{úŽ´¢Ý†<ÊÝh¯*i†ýðÝšv6ø_ùÌ[Ø ¶ÕP\ú÷—¤xJT¯Ù y@ñ•�í¬F.\Ξµô… M€žâÝA˜$ân”ê‹4•@ï¶¹OŸºj 3·Ü Qà­¡vÛdûøô5a£RÝœbSóÔÇ{ë;:Žft¦üÆ'ŒT_‹Þ‰ôu–‚\”iRQI¿ Û[×÷ҽ樓ÍQÎL)ÝãJ'×ÔuÖ´æ7¹A>ô!o-¿±wý箑ÅAÔZÂßíûò¡}Q›zð‚°‡½&MÕìV§ÂnHUí[£¡¯‘Ä*ãT±±ê8±µdíâ¤Q7ŒD¡øTû4"Í!�¬�çºØómŠnÃõÓo“ ¤¢Û°Gb¬ý~=í÷ILU§B*¤ªRÅÖ}�¢8eœ*â n€@æð};µ zL×5áø²ë×�¿~}Ùñ –-› kv²¥åäÉûÅ‹íMÿ-'eö|§`î M¼¢S$a‰¸ò¸ð+Ü)ý¼ÂæmK6U“>Zý³?è!E“¢ÑkS´º¹ùžÝpŠâT\ôëÞTÚYj膋÷§ª»Ïå+tŠ¥^iò¹zkÿ•«aeSEo{ÛÌ“=pªÊjÚl�ɯ¹K“5ñšM¼:^•ðsÙGGàªi¹K>—=ðÞ=�ç}à’¥i£«+�X—©TñÊxe‚2>)ñœ¼Ú™6‚w ¶�;6íð³…wîyÚΕÓ]hŸß²¨¼|ëæ­z¸œ˜‡÷¢Å<´-æ¿éFã^6;Î?D¹œ˜Â~÷¿´ªÝkT£ÎµÍ–ÜKf¸€w˜þþ§´nJúýøígq¬wC×}¬o²” P+)WPÁÖ€×®[­-hhQh^�,(44ÈRr;´©ïÅÙÍu)óC+6½d‰Jï¹cÝ6ªô:RIöèõš4ÈCbÅ.Нn%51ñ q´÷—ÄU,l†õY3«W”íÔ9ê.¤Ô¦í7âàÓgqàŠÎl¾À‚XÐ@’ä+»[)ÅÕ?ÜÁ8÷“07¶e -ÄÞ”MƒE•›ŽmúØç:Ü4uøûÌJ#�ér ® S!ÍÑäªs rT9bk´Ç#¸œ!%šbu C‘©è£�–„j"³·ï§ì¬ÂIèBddd©i£Œc�­`El(zîtP]DNhe#ý5;Z¤XY³½j=š̓m`Ù$À3:&XAw˜2÷¸D¤|æ ‰” šQx•;ßÌ7KËãòÛIzYEV |]ö° œÃ¼V/]¹8Ü<Á'3ÐJ 2Ix^BdCUFÎÅÏ¿ù²¤>„og�àk»ƒrW�ößþë™)ÿËõɤhø{#ùƒcubýãMdöÈ-."}¯Žûæb÷CMæoI«ú'î´Æ9-ÑP%åx�è5•PHKØs™ŸÙ-,Æ^)Û„ÓØ$t‘]…ÞŠÓU²ó+ºèJóÍK½w¬ pÝég”­`#ðü?Àáø.Å7ñik6‚‰f0n®e$”¥éy¬œa HôA¿’Í@ÍžbÏÎ:²â¬e”fw~¬³)óÙ)>�2�S™5>ÏV2ö6›Â¶YbÐ{Rè(9[ÙVV_™WPà N°1dŽŸ]€½OÐvp‡Àè¦öÉ¿,‡þgæÁépɰßF*ŒÔýÕ�þ÷6ÁÖóÏKÇ|Oª -RR!ò"³vB„ÅÓÿ}]}û1æ1ä>茺zËâf¯×­›·¼{¹Ž˜'ë�Šùo¤bþ]‡÷®¾„Óf˜áæañðÿþÓß� -endstream -endobj - -4366 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /VHGYFM+TeXGyrePagella-Italic-Identity-H - /Encoding /Identity-H - /DescendantFonts [4367 0 R] - /ToUnicode 4370 0 R ->> -endobj - -4367 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /VHGYFM+TeXGyrePagella-Italic - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4369 0 R - /DW 0 - /W [0 2 500 3 3 556 4 4 444 5 5 778 6 6 278 7 7 407 8 8 250 9 9 444 10 10 500 11 11 389 12 12 333 13 14 389 15 15 278 16 16 463 17 17 500 18 18 518 19 19 667 20 20 278 21 21 556 22 23 500 24 24 528 25 25 500 26 26 611 27 27 333 28 28 556 29 29 333 30 30 444 31 31 778 32 32 722 33 33 444 34 34 667 35 35 841 36 36 545 37 37 611 38 38 278 39 39 556 40 40 463 41 41 667 42 42 722 43 43 944 44 44 778 45 45 760 46 46 611 47 47 722 48 48 778 49 51 500 52 52 250 53 53 611 54 54 778 55 55 250 56 56 556 57 57 333 58 58 500 59 59 250 60 60 722 61 61 500 62 63 456 64 68 500 69 69 944 70 70 486 71 71 778 72 72 722 73 73 233 74 74 1000] ->> -endobj - -4368 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -xœûÿ -6´ Ø -endstream -endobj - -4369 0 obj -<< - /Type /FontDescriptor - /FontName /VHGYFM+TeXGyrePagella-Italic - /Flags 131140 - /FontBBox [-162 -276 1010 744] - /ItalicAngle -10 - /Ascent 733 - /Descent -276 - /CapHeight 692 - /StemV 95.4 - /CIDSet 4368 0 R - /FontFile3 4371 0 R ->> -endobj - -4370 0 obj -<< - /Length 1654 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -74 beginbfchar -<0001> <0064> -<0002> <0079> -<0003> <006E> -<0004> <0061> -<0005> <006D> -<0006> <0069> -<0007> <0063> -<0008> <0020> -<0009> <006F> -<000A> <0070> -<000B> <0073> -<000C> <0074> -<000D> <0065> -<000E> <0072> -<000F> <006C> -<0010> <0062> -<0011> <0076> -<0012> <00660066> -<0013> <0043> -<0014> <0066> -<0015> <0075> -<0016> <0068> -<0017> <0067> -<0018> <00660069> -<0019> <0078> -<001A> <0054> -<001B> <0049> -<001C> <0053> -<001D> <002D> -<001E> <007A> -<001F> <0044> -<0020> <0077> -<0021> <006B> -<0022> <004B> -<0023> <25B7> -<0024> <0066006C> -<0025> <0045> -<0026> <006A> -<0027> <004C> -<0028> <0071> -<0029> <0052> -<002A> <0041> -<002B> <004D> -<002C> <0051> -<002D> <002B> -<002E> <0050> -<002F> <0047> -<0030> <004E> -<0031> <0032> -<0032> <0030> -<0033> <0031> -<0034> <003A> -<0035> <0042> -<0036> <004F> -<0037> <002E> -<0038> <0046> -<0039> <004A> -<003A> <0034> -<003B> <002C> -<003C> <0056> -<003D> <0035> -<003E> <0028> -<003F> <0029> -<0040> <0039> -<0041> <0033> -<0042> <0038> -<0043> <0036> -<0044> <0037> -<0045> <0057> -<0046> <002F> -<0047> <0055> -<0048> <0058> -<0049> <0027> -<004A> <2014> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4371 0 obj -<< - /Length 8773 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xœ­šwX›×Ùÿ!øØÇ Ud¥i“ÈÄ6q†�¸ŽW–í$ñ^Ø`Ìbˆ!@´îG{°H€ÄÞlŒÞvâ�cì8‰Ó&iFÓÔíïC›÷zpfß¶¹~½~úCºtt=Gç¹Ï¹¿ßÏ}Kž3fxxzz>êÏ Ü”%àí -‹æ%$„-Ùœ–Á|²Áý¸û ðæºŸôä>è1àþ³÷¬¿Ÿ›Zõúô‰CèIÏù3Ï¢Gžôðøö[ïùÌ›Hï…ÌK�·Ÿ‡—§çLVç‘üpÞæH^RZlZÖ[üä,AltLšï²¥KW.Y¶ôw«}£ø_^ /³_^f/)5–Ÿ”êžåûæ ¾[Â"âùÂÔøØÅ¾[^Øþ‚ï¾0,‚yÇKó KxÁ÷~’o8/&,!Ê—5=Ͼ½öìõÝ´gç¾]{Ÿ}Áw,/-),‘—Êó�ˆ „E¤ñ©¾Bž€çÉ‹d¾çí°$_ÿž¯LXRÌ xxzlv+çNnã+ÝYR3iÌâ>èeõûÖ{¶ÑûÁ±�&ƒ¡ÈÛ{ì¡ÎJƒA§3¼ååáéáá᱕‰â\ -€b¢ö¤‡‡Ç -&*‹|<¶2sÏ÷¸í©|àå&¼Þ™:cdÆqô4º63|æµYûg]Ç+ðÅÙüU~ý�Ù{�÷'¿g‘‡›æ<7ÇøÈ“�¬xä¦O&ÛŸýé\×Ü?=êñè‰_oýõ;�%üÆ÷7ŽßF>þüã’'ýJ4'ë°–¼¼¸N>H¯E�ô†on€H®ƒÐS&ÊŒ%ºC±H]… Ç,ÚWzÞ½FèIæNx9Ü�qŒÂÆ*ÔêÐQF°‚Q" §÷…Ó °QŒjŒvCµÎF|ªÏ÷]½síLXÁ d)3dñ8€ŽAÒ(Eä€À*²A-´V}yK*R²QRfºXÌ^XAOY)¾@\ÈèÒ9¡ìâb!„ÁFÞ.^ ?6àMÜNV ]…¦¬P%+AD¦¿€Y´~ú`xê®�åW½t8¡¥±6n´Uµ5ö´uŒ¾‡“h6Rd©²!Ò̹¥`‡.çíK¸  -ªÕrE|²H* ÈMP:ÐRZü‰ûa‰9. E–fê’�ByrÞ¶„øDÁÁ�e ôCð*¾ÒÄ�sµÄ«å}ÇIGÅØÁ¦è¥ûfÄú¯Ú¶#ò¡°ê0ëö%«îüq‚ºû �ÕŠ/•Vÿ9ˆWݩѱîþ¾z'A'ƒ<ˆÉ g†Ño᜷õâË¥UCe·š¯÷�žniè¥�©êÜÔå8”þ’ñå)�þ ¡·hÌú*|� #]¹¶ LP.±æ@ð²v„n;sp#®'O"]¥¶Œ`“å@"§û‡…Ä -3¶¼„›Èo�®LS -E`“åBð2ÞØ�YS+¥ç‰û� âásdÂøþÁÏØîæïoÛe³èÌ`£òA¦ÈPˆðfºIãBêýõ¶Uqåþz…’×K™ Õø9�tå ˜¡\fΆtˆ®Ý‡Ù÷È$€#(Í©i°»Ú¢ò n"?.v‹îq?9äY3N -í^5ä ÎóÝ�Üc0X9Ú‡‡»d•" zë/;öBR'Ü„¿63ØQUQcjÜך™:o§}–é¼±Í\+(‹3ñà0¬�Ùs`ÏÞðŬ©=ÌIlw¯h÷,'òq¯r²˜óTßž÷¹£0VÛ×}æT/™ _ÃgN¬†PÊ>ÿÊîÃOÍÂãjÔAê,¶Ú 8 M‡a<ŸðTÈþ¬Œ”üØ ±}p³hS©p?vғ̸I_ñ* íc!ª2Vêõ¸›”š•¨VZª²Âq ³®öœí:ÝL€ëp1­7 ypDt† zv�‡�¶üþÆÉ¬?l_8½EÎ -«þ»-Ê™J¨’àÝôçéBDæ�>NÅ_Q5™û7òë÷¡ŠÒ!^‰ Ú¿V˜/ -‡SÊ0‹wº×éÓP#=EV\L°³o˜Ë8í™Í²‚þŠ#�G:«Ú`Ž%¸Ö•àPÚiÍ,‡.éí: ˜}µ ڳʒ±¿}–®EWg=iã›â v$:˜’,@4ìmˆ¿�‡Ïæ#ö§½²²lˆ€ÍÁ¡ë!­|¾#˜%,Œcý­ô<ù¨×óøDåÇ^]îßrîÀ^ºÉ2¤ÜO’h®¼y¶¢¤Pa+Å’ŠÃ (1#Sš2FŠ ¶è½ò .>ó7°#ž"VŃ²Ï¬Cǰ¸ ó“óò±€^ƒB2RÄYŒ˜Ž‰ÜÏt{–ŽÞ5¯R2ƒ³¦7ø -÷Œ:?½Že¶Ôl´ŸwH ‡€ß§¡VScpáÛ•¨\Wk©µ~ÐÞÑg` ®!¶íùvÄÖă ´7lÀ“G8æ6Tv±²§®ÆVÑX\.° !Bb‚ü¼èüÃfî¹_zÜ0L'zÕ~Ÿ?ÙÜ<ØJ‡GÐs±¥U«uv®%Þ¨â}ûHï‰æÞºªj(‹Üš‹KfjÛõ�¦.±^AÉ!R£cÆìõÄé«�v°Cå}qþQÜÿÃXvë„Wk=‡Imî¿Míbm‘¶Žû¯ÿבEó O‘¦ÊÇÏOÅ Ü9Ò1‹Î3Ép -ڮͯ¶ÓœÈÁ¸Qn±õ4|~éyÈcÐ.íÈ/-0çéE� -‰2~n`r\âö×ð‡îùÿÒý Ôbu!~zj©• %¾ÞÉ��ÓÜf›p vv75u¹ ŠÓà lÍX‘¸%ncDü>ÀÁ{÷<–xØýàåíÃ>ãWHÅ9v_¹Ç©†ònd,¯´: lª -¨‚2ªVK{ÑÞa«a¬é÷?ÝÐ^Ñß…z/6\®.¿�˜}ãDJW4—Ý—ù -™ ²f"ö ³Á¬5®+K‹ ŸyŽ^õÒÁ„îóóà^Ǿ$,,©@ì>¡4Oɇp×…kó)©R,ǹÉâè<Ì¢7Ò®³îOÏn;FÄc>ì6z%]Å1ËK•Vè‚c §¯T]¾FîékLõ†&L^é^”@DÓ;Ò7fîJJˆ†4È7fWã\R¤å’KÿýÕìË™©³í†¬0"v[¼4âç@™�Ê>t¶÷C=Ô‰JS±Eç¼�²MIúTCŽR¦H¿¼#-5==?Q¼笢_ù½Fô - -e)–§ßúå›À¬¤¬÷?F<ûîº#ë¼úH‡ÞÿWÚƒøs?‡wì8ƒ-­#Z²; ûu —ÁÊÏ�l2£ùËÓgÏ9nÂ8’{<¯ª›¥?aê)é_ãÚ[´^†—‚èÙ¯í¤z “ÓÀ„ßó‚ÿ“à¨Pj�þ›àÙ/êKÿ?†‚ö¿ã~UèI®Ox5þ ïƒ\-SËñ6z©$ªtÈ�ôÒ¬J8 äWdÆÂÅQô|T P¦0{ÚÕß§¾ 'U<-­F°@±¶T[„ï�Éó¦lI ­M};)x׋¯¾RP˜¡J5V}->AH[¦)�b°É¦q#J¸nfIÏ“ÿ¹t_,ŽQ|¹ •‘Yå§]#½·þòE7ƒ™»¬Bž4Ò�H­H‡ÌïaãßÁÑ4lœ#fd¨Õ7@9T‹K² vÄmÛ“”“´ _ºƒÿCFç¡dúùz]Æ6¦pºç6’¨~G³OÔ9ç»Å×î]ºÂþÖ#Š~‰³þ�`âI8]yŸ ­­¡-x犭˳� ÌK©M«£(�³ÿ!þÒñîûð1˜Á¬,Åjm3 r°Pv-6÷) ˆ_ T태Z‰Y`É0 ô2Câö†%í†õ°¦/ø`XÁJápʉ³ $FqIþZA‚(*Çò3#!Ÿ+á@{EKc]mUµåH)¾± ±¿õè�¶%Cضúå=ݧ¹_¹7pþxäüU.ûâ“®èõ mذ#¾ëæ<ýí:KBÏ’ÛÇÒˇ…"Ú12|»ú3öŸÄÿâÜW^¹NþŒmwGíˆ}G\aÒR°‚‰Ù¼Ü‚<�bµj]Çð|äBr‘¨ja¸þú–VƦ ¬¼lYÈ@a„b0Qf]9>MŽ ��bj¾ªÂb¦þË—§KvòSd)fÿI¼LϤRéMW_ TC…È’‚‹´Èܯ«4Ù…F±&ò!W)UdË6îMˆÿ/“É=6IÿŒK,å²ÄçɽñÍ|Ø#fŠS*+SAt¸ð8™m݈JVVG¶B54–7ºðP¯Ô†¢¢AžER)µ‰Ûä.œõuË8_go€2(’éE¸DWúÊ7JµRˆ€ˆèí/â(ÿÂAÄ®Êÿ*¹u¤@ºLš‡w¯.— úæÊ4Auxù³Øº=b; -};6ž"ëTz,v -•„ª¼Âx¬ÊW+Õ˜µRÙàþG�çˆË-wz�¸k8.(cü¿Ì`4Û m€É X1U�DK•ŠT*øh@3H @ôª{½ý´Î]Z”BILPÐéªðgîá«€ÞƒV¹6_+Ódª%X±Õ ud5Z¢Z¢^K` µÄÛ�E«tN²�žF%§[ÓMuC7t«»™)´(Y#5B%)3¥Ç»‘±CoèÐâ­Ö‰¢T†F©9- ±}%‰"b!Àt¨³ç¤“ÍÉ� BejާYUP•ëÌT1”€U]©ÀìÐæ‚Ze´‚ÃÐTŽY·•½!µ“Þm‰õ>“O~Â~Û©ä°] šªÎÃyåyo¿+0d=ZK–N|Nžò -|™øÎŽžà¦çËWÁ&ؤܘáT¸+ù#ßíZä*âå‰xù…i‰ŠL9&�7q ˆ2j+ðçîcˆíê€v}�-ðþZ W=›7ÓÆ}þoò—CÔo²`Ví÷¨vå*ÙwžˆÎ±‡þ‰ÖlP¡²AS5ZižX,ÉÿÝüØ·`%¼Üâ?ø½FHC”Hƒm®Ð>¸÷¾>CžüžßnÝç·¡ŸñÛ­Ÿò›ßsô++“2:GçÁ€ùBQ>J¶˜ÞHO¢ŸEùÛs#’öE¬ã…'B ¤uÀI u}ñ™1 yCÿ òôÒÓn� ÷]ÑDqÌ’‹åv2™}ÍÍ—é ÆM5P ŽâÞÜß(³…¦¢\Y�J(0HËcÎ¥‹$ã’tútÍ0˜Àª*Wàò³(Ë�¥Í‡Í°z ýýþ›[üð]…òÖeo  y˜•¤tNέó,Vrz5½T/tA—º‹IÞƒ?$¯aºÔCJyŽ^kOºG/°kìS\ØÕÕ*\/œ•¢ŒZL«É(é#µ¨¬´ÊR¸ªnfš*]�i�N¥{û%Í™$�ÏÇô\úQr8dl‚ýî/  û£Ÿ‘ôÍŸ“ôGަpBE¾Y€-€Ø§ ]e€tPE™$†¨"ÔŠÌñª©Hž.‹ƒtH±äÙ *¬§pK­´êP,ÊÊËÅ Ü™ Ê´vc#&»¯ öÙbŸ -O «±Ñ‰Ø7³ 2M>ä�H)U¤Š_Ù‘ššž–Ÿôß°æJewX-9×Mêºë}Üæº\;²^É9¢9J|®+¯Ã‡ ÔtxûéZ‘¾ÛÔmêÂÉ�³Ic¤ùòLùzùN‡dj›ŠÀª)Â=Ä@f"> P6¨±­Oa¤ù…QÐM¤ Cšt¦ã|¥9]RJ„ÙËLË€´çŒÃÖötM*•¯ÃkÊ׳öÁ~j?#?Ç~0 ‘2±0~Z~”Yy!÷™¾oò7—˜žñcZ^_o «9y±ª: £³õ½ª�’!y �“o˜þU)è¡LjÎù¾õ]ó¥ÄPa+ ˜$�yŠ\e^4%C‬†Ó² éŘý))œ<þ/[]¾L,'9N·¸��\öOAì´xû©k¬ïŸÁ �½IãeÙE~áZù^ðµýû~âvý,W"Tê8üT4�++~ :wºY5Ý›u\ñr¼ÇÙU”èàVC¥±ÁŽMtnðÂ;mðÚ©eH‘*æças.j05ZÝ1èyèBÖÓ†ZKÎ5Ä¥£Ðò$c$CªŒŸ��.ˆФŸ†…øJ >ï!Ïu•ºÌ�à„ªÂÁ œ±‰ÓC¢‚¶îJbYUÐt_ƒjeŽYÁ]öeó¿‘"T‚™2kËñîs§Ñ‰\†JMà�ú#ßXüú†óB@)Fä·t@áë4»Fã j lj› -×ÍŠÐç›øÝ˜ÞFœhÔâ*j­=ÙÝ0 -§áÃûWÃ8 <˜Ý¨ÌÁ:þO¾¶ŽÑ�¥*åwºS«t}«û ¡g¦’Ó¦i§Ú ZÕ-Þ~ÀpO6•k3˜ Å•ÍøÏä-¢†::QRJrÈIù*¢>êÒtR]Ó·ÚÉ\š¢EAz¥¦°/ŸDÁ05{ê÷(fofN¬ åˆt“ÙDºÚè.Ä"”Ò9ùHý� hƒ6u+0žÅk³ÍL£HS¬¯ÀdŽ;’<;uÝ'þBdîeG?Šš*G*~na '(•|Ô§é¥ú~„Á(-ŠÖfZ©*Lµu¹�ˆ²•Y\Ü®Ñ:_ÅWó�|*ÙÛ/3ÊV·’~Óê©WèçÜ×þ©’_«BGH�Bu�ªÓ~S$ -ÈÉó—cÖm:øô­^e÷äÜnŸ‘»¹·áî–öÀ©áл?{š¬ç~ïÚÎwŸ÷Þ#‹€,Ãdã‚oè·¹´„~“ÞJëæ]�ZÆa_)%ÃŽS¢’¨%  %aFhû,�„šPK$Þ~¬•J')k!Nç…ö.ûÓòbúÕýÌ.mùÙÍ”Qk÷Ý9@W¥·Qz­E[Üj(ÓØÿy(äÚã­—^š—B}T Ö$ ¶¬J¹ 0á�ÈlòÄ׋‡—Ïc߆`e0ìʟټџ¤@‚<¿ñO)�ÕGøµîGF<‡ïº_:a­ó&uz'ñœO¹ïÀéŠ Õµær]±ëŒHU¬*Ñc;yiÌE–b n4hjQ˜*L¡J…zûÉSšUèºÂ¬€T©„òTœõ:œ)Ýô+°âS €Ìnùúܹ¡áóŽ÷áûYoguýëFxÞL{+�ž½j;=èçâ�.P4Lž´ý˜'zg˜Eh¥&heÕXñ„;’üaêÚ0|æF6‚tú6 nÓè™R%Z1CÅxûÉ¡­U[ -  -”)ª<üêT.ý¥ûC”¬JV'C2$3§_ÎoQ¡ruu�UZš_š 2(Pf« -ñKSI({¡4Z‰”ˆ¥¼±æ‚ûÒyrïvr‘’Ãn»¨¹D]„‹pQ}ÑÛ¯ür¡ ±“ƒe±ÊÀt ÕèÄ™Æëp¾Ü|v!BT~H<ÞI{WKÑÐD›ó\€¾Ã°6E­Øº:l߆կ¿Œ –Ø5éëòl'}ã^­$‡C¿xf9y€{Î÷Þú¸�<äa 6ß} -6ÀîØ M»Vðè…@?�Ç÷sàýRâeÿ´�øõ޽ —¡ÉhϤÑ~‰Ë£Ÿ - Ú oCÜ1ø+f)ë&W =�)9'4Ç©pŽ«�{ûéëÖëP°6Ï-`¥ŒÆn|ͽÙAf‰¬‹Â/'QöVN-ï2Êït¡íÙy=åxŔɤù -¼R‚XS{äd6É"³}zïÝcÐÛÍI*Ϫkr6¶Õ «ܸäxÞ<öå“ä«éñ溆öÇY+•mQµä�VÒÈ?îCw7|ÈŽ¬UrØ]õšªŽÁˆò˜·ß Xœ7z/Á8ôä6%W§T%š7ZNT:Šë0{Y_§£ŽÀíW×ü` ?Ç¿*ˆ+Àäñ -Îrô@ß ‡-ŸÇ®Yøæ‹¸BH¢â´…T>•Cáä.gˆÔ!ö²:¨Õ×¾Õ½nþÛè9óX·³©ô¹ë.»ëõ‹*ù½Hrïêÿ Q›Ž´çÈ=¯‘Ÿ‡˜‰$—A'qu“±i8ûSåŒnMÕ ýß‹ÓV-J¦¦Mû~ýÐJRÿ%üõO7)½ÞZ ijâ£?� ýÝg¿³Æ# ûñ©ìiö{0ûF þÔ¢¥�ýS‹~Q­ -ÿ®að-Þ8yÓéC¯áhS�µ HYÇàè@ó­²vs£ù þÀ}Ú�Æö_ª=ä TËñâ¿ÿ‰&‚|Æq´ÌI'¯w=K‰?‡@è‡dabIœ¯�ȓѨæ85 -£0ªeÎÿr JÖJõPUZ§¡›G®ª€ -U¹—�*ôô\xß½G¦ß(¢?†Æj8ÄîžýöÔlæäÓ ˆÍÓD¼Lôo8FIK1ºúûþw›obiñÒ$YB -Q—²[Õ]0ª9âí×r²Ð¯¦½•hðµ;´˜}+ƒ’É·ÒßTIQOoCY?Ü„¾ølHÝšÌ�…Âp .‚…*Ö”á4=o‘†Iã1‹. sÎy‘9$Šôò;ôRÂ¥¹ZƒN?ýд4›°w‘Å@á‰Y@�"‹ ›° µr�\/×+ôJÍ¥¹«è¥@/Ÿž¯êœ×m:�cPêz¹^®“k —pï�¥@–OO²|YJs WY¨�O?…J¦٧èÅ@/¯ÎzÑ.z1ͦ٘%$²cäFŸç»ãD5îÕH¼8æ }¶%R'¢”Ym^]a-\…÷ÎܾòÇ.ò�'0™¿oÜ�æÐ3hozÞ3§¶|Ì= }u§®eøæìD®Þ¶!Ξp -F¾á�7n^èÙýÒ½ëÖ¬?r—Ë7“OÚˆì´Ï°ƒtÜ|ýCö½ê&Î`|Wþ) K€Ì!0­³£Ù1u‚Š4óþbÌvßí‚+pcûÈRæ×[Ù�4¼û[^•uô9Š{á4tFÁ^xeãÆåº\JD‰g…òQkq¹¶†é¸}0|på<Ø‘º3"œÙµpX A]p,”YëÀ©zÄwOÎìöi×_"kÆ/±Ý­äQÎʱ½Ÿ�¹dAć —S›–2ÿ#˜9ÞÒãøzÀà+´í5ö6„^ŽÜž˜’•�ÃC3A ¯àÀ­Þ³wû±+±Ýç¢*’`'^¼wãë#z¯r¯ºäÜ8rò—}ïdGøÎy°#jß›A8Ö†‚kS: ³Äýdb”$� î÷'0ξ5D‚8ôc'^ûœ;�è½iï*‚Aø"ðÄJx$n_[ý§ês�ÇûnŽõ\ÌþÂVeƒ› ìÊÕŠ4™ ‘D¼±¯˜DÿèÇðx -‡xžºyëbgÐk4ÞµòµÍ¡£w¸¬Š ÷Ô5Ï=G/C%šbªJÁ®o¿kä•÷Éò›„�‰ �6­ŠQGóð,õ¬·_ÎëjÒ4i›9Ð SûÐúùŠz³5¹Øiú�-Ãìªw's*T¨KnÊ×íÁ�So"ýfÍ!*Ï,i©è¨hÅ$ͽ‹Ì˜z•XïÀGÀX‹¬�ƺâLÖºuÈP^ZT­Á•÷$NqGÅ3´Ó¡B.u‘ r!O™U˜…éESáˆJ/s_΂z�6”àÎDªúÒ’F fWµ1“D¨ÂÕQTÓLŽš 7½&èç8&�™bÚ7&µÙÛ�8'»�T%S3¿H)™·ëvæÉ°ÆÉ‡�>_¼Çn»;¹˜s”a2“²A¢(ÒðÖ©‡�"]ÅüÙiáÅdôA§eÐ1Vßà8:& .LÉóÇìd½Õk\T=¸À©v2P¸S‡Ò4RCh íøæ®ï{Dë}�ˆRó ‚ï×܃*T¯6å+’ñú©ÝˆÝ¶ö…×/‡°¿®@e54à»î”¨JR'B"$R‰Þ~LõÈi%Ó2¡:ÕLý¯E<]6Sî›tfƒ “-$‡¤ +P T™j uX�ù³ú4}?VmàhP¸6ϘëÀôZ2FRˆ¹š-†Z v2‘¾on‘À£xŒÞ7©P£ªXù –K³Ò1½‚\@!i…¼LPTl¨gàœ(DuX‡!„ -ùÎ(†E²Ê(Lž¦í´”nA¢¬´üT%æ+k*ÂGdžäí;^d½;ŽSçÈV¤ÑQzÐc{¦---3+�Ë"'Hæ°§„drþG–áȱþ½Þµ -endstream -endobj - -4372 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /AINDEB+TeXGyrePagella-BoldItalic-Identity-H - /Encoding /Identity-H - /DescendantFonts [4373 0 R] - /ToUnicode 4376 0 R ->> -endobj - -4373 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /AINDEB+TeXGyrePagella-BoldItalic - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4375 0 R - /DW 0 - /W [0 1 500 2 2 250 3 3 500 4 4 250 5 5 667 6 6 333 7 7 556 8 8 500 9 9 333 10 12 556 13 13 444 14 14 389 15 15 444 16 16 833 17 17 333 18 18 389 19 19 611 20 21 556 22 22 722 23 23 778 24 24 556 25 25 389 26 26 500 27 27 611 28 28 556 29 29 685 30 30 778 31 31 556 32 32 1000 33 33 556 34 34 593 35 35 444 36 36 500 37 37 722 38 38 537 39 40 556 41 41 611 42 42 778 43 43 389 44 44 500 45 45 778 46 46 833 47 47 611 48 48 778 49 49 944] ->> -endobj - -4374 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -xœûÿ¬» -endstream -endobj - -4375 0 obj -<< - /Type /FontDescriptor - /FontName /AINDEB+TeXGyrePagella-BoldItalic - /Flags 131140 - /FontBBox [-130 -271 1073 726] - /ItalicAngle -10 - /Ascent 726 - /Descent -271 - /CapHeight 681 - /StemV 168.6 - /CIDSet 4374 0 R - /FontFile3 4377 0 R ->> -endobj - -4376 0 obj -<< - /Length 1300 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -49 beginbfchar -<0001> <0031> -<0002> <002E> -<0003> <0032> -<0004> <0020> -<0005> <0050> -<0006> <006C> -<0007> <0075> -<0008> <0067> -<0009> <0069> -<000A> <006E> -<000B> <0053> -<000C> <0079> -<000D> <0073> -<000E> <0074> -<000F> <0065> -<0010> <006D> -<0011> <0066> -<0012> <002D> -<0013> <0045> -<0014> <0076> -<0015> <006F> -<0016> <0041> -<0017> <0048> -<0018> <0061> -<0019> <0072> -<001A> <0033> -<001B> <0054> -<001C> <0068> -<001D> <0043> -<001E> <0047> -<001F> <0064> -<0020> <0057> -<0021> <006B> -<0022> <00660066> -<0023> <0063> -<0024> <0078> -<0025> <0052> -<0026> <0062> -<0027> <0046> -<0028> <0070> -<0029> <00660069> -<002A> <004E> -<002B> <0049> -<002C> <0034> -<002D> <0055> -<002E> <004F> -<002F> <004C> -<0030> <0044> -<0031> <004D> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4377 0 obj -<< - /Length 6617 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xœ¥yyxSÕº~cYe‰%j·qàh©gPTå¢ 2ÙR,:Oé�i’6i›¡Mº“¯Ù›©mš¶é8k/z( €óØ�þ«úî‡þò—àpÿCvðÿ-%øÑ€@'ˆ;ðzrNbÊúäA¿ huNnQ>?-½ ìùÅ‹_Zôüâç^KÍÉÛ–æ',¥° E äç„a‰Ea«ž Û��”™#fò†mxfÓ3a›s$ Iþ§”‚°„¬gžÈ„%¦¤'d¥†å¤Î|'*ò�ˆÈ°u[¢¶F>ùLØv~J� !;E˜–”ž�Ÿ�T�’/ “¤ä§„%$'§$û÷y3A¶-=%l[z‚ ý™€€Û8‹}î¹¹–Wèöñõ$ÕÙ` bavèœ@Û£ ¾Ý<çË9³Ñâ4º‚ƒ¿¼c|È`rZ]Ás+ƒ¹�œ€€€€çý©¼§ ÒŸº‡–ùSótHÀóþ ¨ê9wq(Ž÷¶àÛöÖÍZ6ë’­:3{ËìÃøäíòÛ‡ç$ÞÁ¹CpÇ/Ács#ç^às§ïì½ëÞ»Fî.»{:¤‘:}ÏRâ�Ü»ñÞ�ïk¼ÿÔù\œù‡Gÿ ?X÷P¾œ‰ r`"pâ^ß=½ hbz;Ï·€˜^0›ËFÔŠ™ÎJ1Hó€ÌaÎ�'s 8ÜÔ‰¨•¯1(V/·@ *«þÂÇ C£¡ÖèÁR+ŠÊ)Ó&Ê^°Ü,,ÛhU‘·.¾0-Eªw*è 8ŠFÜé�R²�3NæŽïå%5åõïiï›èzSâ2Òv„ÞÚü;_Ù—!äÂ¥z+ý1<Ä\=Oî€àp×{Ƈ—™•›¡ks³b y$>ÜyN¿¯zŸ „(H,‰NÅ‘ìƒm*g#ê=Þ䞀“0”›àñWÙ{Ø…ìãø©Eþh¸µb¦›èÉÔž_¹Ÿ±Ñ<ø–yïÄ÷nèFTáVåV*­à[¥]oÃ×}¨Y_SY ø»á䨀 Ë–Ì/€BƒÐ‚õ騧´EÓ ˜Ì'³~&÷‘–sð©ù+èë…àpMæ$�z´UåP]™®¿2�ˆŠ_R+3´8†F\ö¦ôSߥ–Q ç™x¢›—n“zB÷@·›Ü~—4g Ââ…ÊAc+4:,ÝøŸ™=Æ£+­(F£x¼—çŒj°«dóA¥SÒrüÄôvT¼NWé˜{€ÜNÂI@`½�Ãsäõx�ÍlgªÀ&5(A¬Œ..Zgp•ç©ø ~mAà³píò÷d1ÎdoGŠ$M>È Ï)­é::â´©5ÍuXÙ"’"‰L¬*�2PÁ vCsU' Ï‘‡U6_ÊWgTjWd/Þùj̫۷ @åF°@�¡ÑäÅÝä!äýÞà†V¨W:¤� ñ…»³0—�`{|¸›äï‡ìøÂõg²ð§å$€ú~ûoÅg1$„<þË™oCa¨ s[?~é(*©R9Àµ5ŽAW�ÓSUkÇÔwºZÀq¨£]e�øjEՄƺ†Fùºl}‘SŸåØÓ-¹ +1iq¢XØ»m¯¨¹ ½ì„?Y!A•…U….ÅZ¿8[„“s$|HÅ_¸x0ÖÖ}ª·8>݆Æ2kD��߉H~ýåÈ¡c¡dŽï> 8&kškÛš«»SŸ7fE=ž°nSlNÇþù·Žþ Éur_Èi”HîZB5‘ïy޼újT稳‚  †r­J��·²jDýH—Ð"ÿA8¤n胱†O;ª z›Ë[r¥(]$+S€Ú�8Ì]ŽQü.‰FÔ5£ÛÐ -n¨WºŠA[³7íÆÔWI2/Ý#êhmì.ðf„¦fg$ÎçÎB“9±„KMÕ�ÿà9r;êQµÍi²� jPÀ¶dö¥Ýl(®R zó¸¥Go­=cïêÿùKrÛ88À\% SÆGcêr&;K¶ ty êÎM:«Œ†*3.mH�P¦P+¡*Lþã3¶X:ð8Ùˆ¨©ª>S8À+«)€]ðoÑë^ç§ Ó·àš£¨åS+´€[i“‚2d±˜+�ôýi2äl³ékõsvå›hà� -†g` -¸öv�™þ.Bwq_�GÐ$¶½ÜþTOVÁ§&Ç> -¥nì‡ÁâÁtüRÛl·Œ;÷Å·îpEû(°sÙYÀ>/ö&“»cßÏ·iÜE˜òU—Xó –ÇÄ=+!Ú›·ŸÏ�ÍeGIò%ßc’�~YF8Ô5¹Ésæ ®æfgØü¹‘ �²õcE¢VØQ—Ú -0àèîïªoéŸÂ‰ì2”Ì>¿sÍH†‚F¬•f\dÚ”„˜Häˆz�ÜDµš››É‰©÷4DµÆh²èxÀ¦VÔLî·µ÷CTËÛã°‹A–1s»cLl’ëK@ -Z\šU˜š'+Á‘1(6I)‘oÕ*t´N­Ð”¨óË0åØ!Óä˧_DöENˆ ØQÒŽ¥4Òäȶ)„~´’¸¯8½äb`/Iæ™Tè�¡ŽÂpÒSZÛ>“ÛQ‡Ë­ì#4Š€¤Ê£&W-)ŠÅÜåt‡`’4�ã8# ñÕô”wP^Í£’Éà ‰DyOÂ8½j¾6wÙFpˆÞ@¥I-»\ƒ©üm>¤›ñ8i>ä5�sLceÃèa„ûd­´‚FສZc­`TÀÇÛ;f{ÉB¥ Q Ù—Du®I¤×l~zF½ŒÒ¨[k+1¨gÔË’i*‹UʳiœC#®ô8ùþ¸Sò9¹�”] .¸É^ ´Ez“]ß§¡‡é²àÄD´hQæfX -/ ¿óG8GZ÷î»tå=r/|…©‘£©¡e ÖÉéÌÔbYa ®#«ÅapBT@&D -_æoáoMÉŽ‡x(è�“0`páú©¦¡#gp‰Qäe9j!ÄÃ:£°RVYªU`®tØ>Ì'ADL‚ÇÉx�MD: -ý–÷dÓ¡‰ú�æq÷§p®G|¶C¤ô�ŒMÉüxñ,‹)Û‰˜ixðeÓOÝ�]-5�0~]ù\^xú!?Gš ; kŽcnG­˜4 ø‚%œtš§™=ãç!8ÜØÇ l}© ìPct9½ø -YˆÞgöÀhÓö?êec�¾H¦ÈÑâÒ\gŽú‚á;•A™Œ´ZÓƒWøÜˆnÐzéü4°™¾‰JE2E‘óiDZH �)² WY»õxˆ1v#x‚~kë3~˜¤ï£Q³ÖVR�Ò9š,œÏ>ËŽA?‰E–=¶ª®¿.xšÞt Wþ­Zk9H ˆj²ðêéE¨x‰æVˆ+ý”ÜØÏ&³‡óâê³:BÏ×W¯‘¥8•}i -µ~FϵKë`&;ΟÆò6‰ ‰¤¢¨€6kkqÕÞ’�Ìæ†Ú ,³Çæ¢]u"S$‚H�%ŽLÝ%ËOß–Î΃å˜ÌæAoý�Þ‹õgZZ‡ <ê.YÉs¯E®LŒJá‹@e5P7SÓ_“{9d.A�uäÏ‘×Õˆjí.‹Ì3 y]6û†!u~¹°$Ûä¨ÙÚ`8lr~e›¨éûsÿø(Ô€Sã)Ávª2´ºN) åz%ä@¾\˜Ÿ›#¼Æ.v_Rç¹?­2Öƒ{T6Yh.¤Ŧû…±´—|ØGD‡ôu‘Jr{;¹ƒòYydz†”‡€,Âý È<¸ºcï#\i@G¼ÞêÖvLÝhisvB|öÖþGàmH,Ý��#ÙÀVê8Ö×4 G¡›°SŸ$–5 MeƒeÑ&5´×0µ€)ßû}»_ž ÊDIzNLŠ06@ü0œ—Þø1_�¸ËkÅ7çúùk²Ïgí£.LúŒ¼>pFF�Ñn4;œ�Uu€É]ðÒ´•,—Ë2µxû ¯3ïý -À™ILeTUZ˜|Ý×Ln45r]®XÚmd9¢FÊ�Ø7h±ˆ}‚ÃÕšM]%oµŒJBÈ‘[2öF½–÷7­j=_÷aóÁÑoÎ}4ì—ª -(‚²éÛ˜òñÙà’M�Ž¢Zè‚1ïOg±ªI¦Dé"i™ -Êü"µ -ê�±÷‘ˆºaq�À4×ÀKÀ-^ÊÎÃ_ø"c½¹þwf4[™t>²XÀ>ƒ3Ø5ö΢TÌÕHOú.áL‘Pß Ý�S„áÁÂæµbGRß_„oà/¹m -;ú•VQ)Z»µp#`ö¾ÍgÉ""¼N&OÏÿ.ei3°æ…n@Æ1skÓ×Ú"k�U»��0÷ªtŒäu�?ã|@B}ou~@¬(tjZŒ‹ØYH`–é%� "Mž<"oSl~FR4ŸåÁ“˜Õóàt3¹§õTÃ�ZÇ´@]Eo .DЏ„ÕÛ× R³E…PJTc.9^+¾¹RÂ9}so�F}4£4/Æû§û/ÑùTä¾iÕ% 9¾!Ôý¹Õ^«Ç]3D¹žŽ�_?C”#4êÒÚÔ ¥®B™‡ÙW§#Ø'|²€­�L÷mCt·ÍѪÇ# t#xžŽˆx‚Ãýø¿röV»ÈìÀ. ¯J…Ž:ª™V½¾S_m?d?Zi®oÄí]‡ØgQóªjaxa¨î`?nW¶æJQAI©Ú¯…�Ecxy�¾;Þ´\`×Ö«qÝTl’1rØqÂ�[ÞÞ•´ _÷­FÆzS½é_c>‹}%›½O�¹OýÏT]+yì_i®ß[G9þ•ÔÆëþ—zPW¡•Ó¥˜}þ/zSŽÌb¾Š¯Àÿ½œÔIO“›Ç8$ˆäwv�;x/ïÝ~!t -&½dΧXÙ†–oO–î„��Õ ápíWžñºÑŽÆAh‡VeG6”¨#;U_2Ö9{£ÜBc$‚@ñfbL6_P”+Ø]°VÏ´—�É/s,�¾åžÀ2šçVÚ*Ð -=�­ýø2 ªzYb,ùÎ"»Ô­¬…6è«;w×V˲Å(G¢ªPB)”ZÔvyƒ|¤l+NôíCmƒ}-�`£®ª[sapÛä¦bƒ2 5'iÞ¸¤¢)�(ÛeiCŽ#$P\‘(Ó¨@§QŠ“J -JŠpC)r5u64‚Rl›qõ ï¬B‚D�$Ûߥõ -V· µˆN­ÈW%ÏÈ2¦Û÷Þ_#¹Ÿê5üÆîËý­ÝwÍ×�šô5•nÀÈ|íÙõo>;h¤È“é¸ù˜ê%�²Nû˜Î¾£~‘Ö–jFŠÊü¦/f“:tÂÞf몟èhž€Ãp�åŒ?k ‘^xý# ÌŸÑÔÿä.›NDTî?z‚‹¤£¾9§nUï0¹mF½_ã­M<:Gk÷·‘Y'“Û€<çòwÂnØU´3=5W”—´Ÿ%?:Oþnù©tJ­¯š^�Êbu -�ar›—#®ã�ûÚŽ_<>MààÈ>��½%%3 ¯ bîŒoê'ƒ{C|�ÔˆšæÁ7ÌÑ?ÎtjDnü[³¶VÚî!Ñÿ<L�~ÔÉ´è:  >UÛTFµ_ñümú`W1hs:½yÓS3ƒÇÄïØ¦%¯Ê¥™ZïO#&潄½È®ƒ`²’ŠÙ^U9rè z³§Ê­¯ÕŽZúzH¸GãÔz ZL^[³ã@o_>99D�;àTag*ì‚]â¨Ø¸Ô<þ®åØõ>r5÷€êT¶¢¿ZKK7ýÖSB¶Q'`ïÆËÙk¨t[y®< “ ä<Ïy UŸ±·wíûàÀH¯_qK Öf³³R×ò’LÈ�%Ã�¹ËÙÆsdݧä«}ÑÞâA—ß |B¾ AdÎJr'5µò¿™sWîµ4èÛŸ2Ô -«ÐˆðZ¶ Q‡ÿ;«ðÐJK ã†h–;òýƳ®ˆÆÔ••[ìð’ÙȶÏÝä/´ŠÓgØnÔÔæØ+6)õ¥�ÙkŸ[U,)Y£U­-ÇÔÔÊ ¹eÓ¯¢öQ… ýÿ'9ê`˜ïó›?ýž%yÕ�À›ó$!”GKóà,32üþ¯Ø‹�f�°Rî„&°3 Æfü¡/ Qr|ºë2 〡Í܉¯øV¢šKÆ‹Ùb2ëÝzܢ:¬¦wï^=ƒ¸!µk] -ƒˆÐ…øõéìi_�¿'$l€àp:³ŸFÕººr§ªV^“¯Uâ'§åˆŠ/KT–ˆtx§–ïþ=JÝo˜&þÓX þW¦ùÜW�L½fc§¿yºŒ¾à{¥´ -í.Ì.Û]ÁÎeŸ\Ä>°�]Œ/öñN“Ù§¿½AæáÍìwˆ{Uúq¬ŸOoô…|CݜÇÛG#¯Î®äÓåeqømö(Òè|B¼•ïÎk�;˜wÆ`¬º¯¹ÛÛPwøÎeïAT´± ÁIfpôƒ_Ïñåß -þ/}ÈÜc6uëñèŒ.úk†fÈ_7Uheª¼�e]·3SŽ4±@%€THsËZT.�ZÁQiÓÛð_¼ÚŒ`;Í�Ö-3øý5éž›A{8çI¨o3 :Ös†£«€] òNXµséºxÿ,[>†ý3yIB|ý=ToÍ£rá*s(ôâ}ÈJ·L˜ÛÝ×p¬@ªœŸN¦_¤c •B#þÞ7€Ì=&Ó�Ý/Ödtž:¿2…Êv«‚[.ÍUz�ïOC!¾ŸI(5EÏ‚+ÌÁÐ?B\¦ oôxúó�ö“¹@¸ð�èXÒHô¡7Y á ªX~÷s ów'Hô+!/ù''ˆÄÔó~ð}ÒÏ jÊUé¬4Âè-í*Ü—í�€%ðd˜ðzÜ«of°r@¢ßhÅ\b¦ûnΓp -hœbö �š�A4ƒòýð»ä•–ü‹o#ydú˜Î’»É°/ÿ•é" +×U`­ -•¥ÒYš_­‹ëÌÑ#×þn](ý@2ëmŒë-ûÒ�õÝ*{/ƒûc‚7踸µ¾œ}dëSìklf)ŸÁ::>þÍB¡Q¯¶Z b(¢ÅjfïžN@Ê´ÒB©'Јûÿ,DN_ -endstream -endobj - -4378 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /FKQCWC+DejaVuSansMono - /Encoding /Identity-H - /DescendantFonts [4379 0 R] - /ToUnicode 4382 0 R ->> -endobj - -4379 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /FKQCWC+DejaVuSansMono - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4381 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 52 602.0508] ->> -endobj - -4380 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -xœûÿ~äó -endstream -endobj - -4381 0 obj -<< - /Type /FontDescriptor - /FontName /FKQCWC+DejaVuSansMono - /Flags 131077 - /FontBBox [0 -235.83984 602.0508 765.1367] - /ItalicAngle 0 - /Ascent 759.7656 - /Descent -240.23438 - /CapHeight 759.7656 - /StemV 95.4 - /CIDSet 4380 0 R - /FontFile2 4383 0 R ->> -endobj - -4382 0 obj -<< - /Length 1334 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -52 beginbfchar -<0001> <0061> -<0002> <0063> -<0003> <0074> -<0004> <0069> -<0005> <0076> -<0006> <0065> -<0007> <0064> -<0008> <0078> -<0009> <006E> -<000A> <0073> -<000B> <006F> -<000C> <0044> -<000D> <0070> -<000E> <002E> -<000F> <0067> -<0010> <0045> -<0011> <0028> -<0012> <0029> -<0013> <0072> -<0014> <0079> -<0015> <0041> -<0016> <0043> -<0017> <0054> -<0018> <0049> -<0019> <0056> -<001A> <004E> -<001B> <0052> -<001C> <004C> -<001D> <004F> -<001E> <0055> -<001F> <006D> -<0020> <004D> -<0021> <0062> -<0022> <006C> -<0023> <0068> -<0024> <0053> -<0025> <0075> -<0026> <0066> -<0027> <0042> -<0028> <0040> -<0029> <005B> -<002A> <005D> -<002B> <006A> -<002C> <006B> -<002D> <002C> -<002E> <0020> -<002F> <005F> -<0030> <0050> -<0031> <002F> -<0032> <0046> -<0033> <0071> -<0034> <0033> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4383 0 obj -<< - /Length 9557 - /Filter /FlateDecode ->> -stream -xœÝ{ xTÕ¹ö»ö·×Þ3“Édf2¹!“€!É$!@Èîr,—AABDÌ¡9‘K‚тħEjQ©§¥¨„F„ÐÑR„h+Z¥ )Ǩ0Yœgí=¹€ÔöùûÿÏyž?qfÖì½öwy¿û -‚AÞ¹.�¿P¯Ûïü¥ JïU}(~/.X¼r~³øt'@O]½%ófë7ðÐýwú””Ì›miTT î()]þPäpw€Å‹ËæÎ~cÏ1ˆB~/�ýÐR~FMââ—Ì.�÷Q -º�/-+_®ÝÉ}^P»tÙ¼¥ù¿=¤}ûz4â¸ñÚÍžD#æhÄZå(í¿�8‚ãPŒ}�ì8[Ï^ÃqìBDZ_1ý–õÅ4˜ª&à8ê°Ýx²ŽþŠ -:ˆS8†3¨ ¿²Ä˨Áe<­\Àt¼Œ×pTM€€ÃäÁZp�(»•�Ê|Ôà(ê°[Ù´ \³Aà,oQÒð,^Ævs°�·ð§%¼…·ðKx@7­QóèIì”�Û.v�e)cqŠÙP‰I4ƒ 3¬ZMRWÐÔ) Y¸'x‹æA�ž„:m>[©Î2~+¥~Ê -uÛ� šGŸCß RIÀQl74^V&ð±|¬zó±Û�÷:ó]sâmº†5xRl„:Œ¡•êh<��RQ Œrq?ÊPÉ7š¿Ø�ÝHçi‹Ri¢Ár”�Ø®Ìg5¨S®âm”ÑPôÅ|tãQÍ^Ö<€¾ -å¼ðàU]ã*) ½â�{”ä¢â=¾»§ÆÿnZBz¯[¾Æ;õø=¿'te|ã�㧪]ø´=¼ëJ¶ìQ““Îþ½›gÓ{�?5¾‘E ’-œ54½×¨‰S÷(ÉòÛÐi é½ -‡÷$×=Û)âÄÙ»E Kã?‡ëZwüÛœM»Ž+³êØ]P°P‡jXŠ _ŒeìͶm8¬)ûTÂ4>£lºÃyzÀy`€_2Í>ð;/zY‚ä™›àJ`9I ì=VXÂJÅYÖ½±Q�Ȭ«£eÈ©[1 –ª³ až¯'E©\U¢˜Âå)4h -á0×8)Œ«E(Ô�—ýQRÏóÙyÞQ§êNþ¥î´_üËi‰{S†™>‡�YÈ¢ª\IV”™lfxޕ尤â×Y!öºXö¥:+0‰^¼¾ -*oœS§ª•ˆ@WúRIÌVcݨEîcZm({#¦6¼)´¡)]�ÖH E]ÝÎÝœ—ý³Ë-q—.p^:µóòEwž+ÏË"‚v�hóˆœl·nº«:5pîõ_L=TºðȽâºxŸÅ_z÷ëFõÉuÕ/:•û¦k¯þ®_Þ«ii,�…3;ó‰?ÝùžíA9ÝšNt…×Ëቭuxj- Ž&¶�¢ThÊp—;$([v¶´�t΋¦CäcGq9Ý9Ù‘Ì0·wJR¢FÓ3Š�_øüÍy[EغêêššêêutRò­ãÄ)¬?‹`.ÖwŠy÷ýN·œy_Úp4 V«³‚|#x”¦kj©ºüà*SE) - ‰ƒ-Êjcò#Ħ[tk”Å¢Øt•©æJp¥Y´B»órs ÙeXyÀùì¨ÛÚù6v×mÒîqV¦éóÙBýA¶R×t¦ëš-–¯ö¶MW'Û,3ÙL«’deIV–ceê}¢Œ5¶ˆF±¿…5в·XO–ªÎjý¬µ‘½!)#”h±ˆ=Ì €ÚE­D8zù¢­1­ÖÕd?lcІ‘¡V-d˜ÇyÙŸ�!1àüe¿+Ê@=Ée áJråD‰Jí²ÿþV×46f=_þó”}­#•}õ�¿úóÖµê¬çgÍ=kðk¹qNÕÔJ¤¢Âç µ+Ž�¨îq«¢Û¢âºÇt‹‹¶…ÄuW#PéžšˆCѵ.µ6¹ÉÕУ›-¤{ãºhŽ"]ó$öp^nöü祳¶¹«S\‘Ëe¤`cÇ—®¨<ÝxŸ–ÈÚ³WwÇ"ñDíÆ'žØxá뫟_¸z•>zÿÝ–3gZÞ}»xGüEœ§X:“ -e|uo�.ôðEhõÖu¨ÓfÕ)Ûž¥Ç9½ngÀð»LÜ2ý—ýÞäø>.gJB’+ÜëžÌÅ^Æ�7�ÝÀ¬b6™ Ånqr×u6‚�º~}Ï›E•xT<%[Mb²:I­4b8Ç×µ=†› ìîær‡ 7"y˜ŒâlÃ�œçÏ·‡qr»™z§0Ó½ <ØŠýûeÿõ³7ç7°Kk«Û°á±êµ[�i¶º‰SÄoÄçâoâØvåÝ÷Ï´œþà}÷Ù@ù„e�à܇� -ëÕ);ƒL¿—帒؅@€e‰†­*ÅÕìFøRcìq]R­ä® �´ÖÆEÖ†QíMqaGz¾35š}¸æv'Œ¸Ót@™‘œçÏ7› €³å¢tH#7uÒ!Ü£t¸Ú@¥SŠÊÍ¡ékW¯}¼nÝ#k/þuô®‰sv yj]¯§K›?ÿ¼yñ–ÌF%ïÄ{ï�8ñ§÷ŇèÚe_F¯�{,«î›Áò™Î,,òô'Íx> -¨cy‹ÔéիJ=ÖYêÕ_Ù·f釻3àÏ47Kü†ß…Ë’|¥[')�·.S^¬à-»Å°Ý­çv›xî_Q…æF(ºûÂ´íØæÕAn Ñ6‡ó´?[úSœ¿—iJ„Ç•”¢äöv÷¥Šê5kªwÔoÞ\¯¹Ï‹þŸ~"ò?½ÈŽ|üköƒ±â+Jm£«Kº: ± Zu‡8œ§FáÒ͉tGx=©�;··Âf4wT¯Y£¹ýbÀGgÅÿgì7çγßHyïÔ5j%\ç ×ô‚‹êMÖúMÓ`q;O7ûe19Ùú-Ù·y}ÉN8™Ó�xïòÂËrœ^—>6Äés�Çx6Þ9ÞåžÉÌ$Ò‘û¢Ô5ý.zqßþý¯¯ú`Z™qçßj=¥Î:³â‘D9ä�¡DLVW«³àÆ_ah”#T!Å¢XíQDŠ+Ê ·3*Ì ùár†:BâŽÐgx(ÖZýˆËq8Üå µéÐÝw‘£0\6¡FMqžÏ¾,áwÿݺ"s Ó"KJ?7c3}±ªóA§bqYÜ1ö˜ÐGJX?W‘«È=-Ô63™¦+ºƒ¥±\YìeUÉ¡éÃç&fl˜±¹ôîß#l4~„•T¼.¾É;vë}ÍêØÀfZlöÕÉ€ú"o�žö F2ƒì…’¹ª'sUKæ\µ&“Í’L6–l#’Ù -@z=ÛCë¬ÜjÑ5c(±òL[ˆó³Cp>àoS2¨œù_§•¡¥N†–6„¡uP‰…(*ÙU«®Ycë‹Ô’dóD ”¤”´°ÝâWWر“KZ¯,>É“ZUúŵ4V-*¥íjnœS³ø%Ä ÃóöFÖSèKö½ÎzëÙ:gÛ‘¥ycelº ­«·k�ͰïÓWͳó^qVaƒX·{w޹{òÑææ£S_(ÊíÙ“maKÙÖгç‰�>ññ¶ø½øƒo áG™€º“·@GWŸC“®²|ŠC>·8O%ó²?Û ë$WB¦Z.Ò�‹4Þ²ûZ O3}ñ jFžHö…ÛŒ,¡Ökœõ¥8}­vÏ#:üÙíÄ‚mð1(~ËòGXžø-oÙ}ý‘Ý»ÕÕ&Ý<@}š·@Ãh_O–¬�‚d $? 0,_Î^&M%®dr¯î ˜Öõÿ½þ7YÚ‰å(%ì'Ũ+bÔÉÝ<íZš¬= 5€:Œ·ÀŠR_W�)LÑt­@W/[¸ÆtÅ¥fé.xmmEOú‘?;/ÈK=&_Ó÷F1é2)QJ´ÞSIÑûéS”bå~½ByX·Ek)¬§6ŒiSØV¢I÷ O�Ígs%Õ0°oŽÜ€°á-×sÔ·¯¥©o_Ï‘§%€z’· ]q¿¯ŸÕ¢“MK&•x²ªR�¦"‚Ôˆz«§>t]ˆÊ]‘V�läBWÙb²UW–Çg÷v3s¶ì½\yÆ›Tá²ÿ´ß�';@kksâXTxe°4Ù©%d«�¹‚}±òÍØ%Žÿiï˜Ê¹og;®2í™Ö?|øäãõO(oxÊv‰¶ò™™­ëyËŸßÙ|@™ÖzñÑÇV¯Ã{€*O 8¢}vÓíâ( ½5gÀ/�î¼ßž#�ä½ãÊÉ@1o¹Ö²[悊çÔüR[d­£úˆ-a Ñȶ÷Ѳݹцa:ú ¶Æ''ÛÞiMë×nmX»¶aëÚS_·¶^ý:Ðúµr�±Xñ©xU4ŠOY +‹*öC¶Ž­eU¢ÊðÉM7Ωy º¡§/*ŒÜP™µ>ºÁÉÖŅŹ²”8xãÚ%�y4*ÏîÊqyäì-#õ.–+¿jº1¢§f°MÇíañ+'Oy(!ÌþfÞ°‚Ý÷/Ü=¤0_HOì¥3cúÐ?fÆbº(ùä�AýóóûßuÔŒ�R@-S+‘ˆŸúR£ÝaVUG·.ša¯�§¦.‡cœ:\a–1ÚXט°±]£ÇÄ&9/�ÚcŸ4j�kÒ½S÷#öÆ¡~Ó Wv~0àüå²Hºò¤ox}ýª—{5¯îµx­^›7dPä ¨AуbÅê2¨ë nƒâª¨J­âUZ•^e©²VÙªBê"ë¢ê¢ëbêbëºÔu­ëV—Äf2£¸Å°NÍþ­]¿òlâ‘kËžÏ6¾ÿóy#‹òž{.aî ÑóèâˆÂ“â£ÖÊê/Ë+?i}DY}i©üTgÍ0h˜Äb2 ®ä-°£Ú×Ë¢�¢)6¦0«¢°› ` áånµÈIÙ¦ij¦Mƒ7ÔŒc³ø³e €Éæ‹Ëˆ3¦§;¸Åf�bÑe‰¶¦°ž”béiíÃò¨�¥ŸÕ¦‡éa6’³t‚•Ɍɒ˜+i2s0…©,ì€¸Ú ®¼Æ[Z-Ê7×ÒxjàK -¿ö'(xCÎך!æÜm·Rm˜µ6¢!¬©Ë¶¸ÝãíšÛ©ãí<·vîo;õ½©I®Ú²Îìq×µžëµmþ›Ÿ]8^Ü�ÑØ¨d\å¡ SÅ1ñ7ñ…8:eâFyœÇ°PmZw„"ÅnÙöÙ�Ò>Nš --d´Uöh�·Ì†ßHƒ^vÓ9ŠòȽÓÞ»ð³WÄŸØGlË¿ýpûéÃôím3¢æùÎŒ¸íö3¢ÿ¶3¢ë̈š§õYcH4kíH~ ©øwß@cFLŽ ‰ÉÝ»Ç"‹xÉó\t½‹½„çÔúä-®†q怘Ò%Ï‘åÑó½=œyHwÓ€h–åv—1‡Ã¶´¹×¢È ;,¦+¤+Lv ·ŒŒjç‘1%“É™ñ93^ž±ÿ¾º]¥OÝÿÎ!ñM`áéEåo—4ì®xrñ²Ð�&7ñ�o÷PýÀÜ’¤è¬w^iù8=ý½¢¡ë+—>“Ù´ãwÿ•<£ë¢Þw Ö 6vØ.q©h0°6ks0[µ¥+)QûqHÊ‘ÆEKݰÖ ¼ø<{^‚-¡VV^ßùüìb9Žm›jض·/–;™Ý²OcµØæÐÛ”pV®…†…Ü|w>[ž‹e»¥�#’µn,Øiä&ÈéYM=9w [-i”‡q/¼¤yî^0·.�I'ëÆ6ÊãvêÁ5}I1¨·YëÝëX½íWÝ]!1ÝÃ- -‡#.’gwͲ"ÎíM0Š ÿ´¡±áņ1�# ³°QÛ"9!;2£醹z2öÀßölùñóûâGkVo#ÙkŸ|³fͦçÄUñ­¦ký°rã�Ö+óÅ]KW=P¼ë7¯¬ÿ±'òÄŽã'  ‹xCÝÊË‚ÞXêËê‘vGl9ìÖ.½é—QÖ_Ú]©wü2-*î—Yi¹©¡Z;´4bC3ìž„4{zF®ó Ù)4;åTh$lgóiy©¹¥ù¢óbž¼fþçõ…Srx•§*Bc3oš;ˆ�™QÞ2ÛÊ>}£:zLw„ê¨Z´hõêE‹ªjŸH^3á™S§žÿØ{ž¼*>d#™»Ïâ<ï Ê|±MÌd±'¯) «·m[ýè¶mâ³²AC¿:xð«amo«Å~ñªxر6&š½ÃjÙcì÷âêÇ`ì„øŠVhèˆó…©û´W•}xÅ „Åy:Ð,Çá€oÊ7ÿF�Ú—·€¤nŠÑÞB‰#yhdüAér³×W6.¾Î[¾-Ã@�jÌwøÂƒç-ê¯,œ‡-½åÈ‘0ÎZn>jIº@e­3”y­ÛŽËS–»[ûšg†b‚Ú]]aô9¾®í=ESXC—#1‡»Åp¸Ýwuœ†w>Gë|úÍn>dr%±Ñk««×¯¯®^«Ä¦7Ì;vá³7‹2öïWÒd[ÑræýÖ §±¾ÌÅ"Yþ”‰uß^5p‘ç˜}ù%ôÀp_O„×GØj¬»Bëµî5ñ»ºÖ'mÑ"^èòÄÄ¥8ã(±»ÇÚ½§3ÐÜÌÖYpúÛK¯‘±¿[GÍø37ÿò%g²lÚ.¾¸²àÝó3g×Þ½OoÝZ³ýÉǦ5•¬üuÑûŒ¯§î©¿}ê÷_¤Üq,·÷–��6ìz¸´¼²G�×âãϼRùlÐï Ü×øeõª~6à -º[äUœ:œöMÛçõ ­Œ7Yò˜7ƒÏ饢›œß®o¸ááM¥Î?L=‰TãÖ`/ŠQ‰JŒÆ´`=Ö£‰]@%޲Ýl»%HF 2q y¨AÞC6¡“ñvàjpG° ]Ø 6¯ÁÏŒ?Úá(æã‚AHÁv|ÌbÙX¶™}¦x•]ÊŸi=AoªõNõqõ ú÷ðü-_«Òvj¿×-údý þGK´å>ËyëPk­µÑzɶĶËö—�>!‡BþbWí>{“ýûö¯B{… ]Úèˆ64ÍUìHÃ"hPàDƒD†Oa.p¨Æ¿ŒØS­€ñoÌ5C<š‚kü9¸¦N×ÕNkŽh|\kè -\[�Èbƒëä³Áuhx -{0¸v Ä³CP†¥X‰eXˆ(ÁrÄ£æ¢'â‘ /¼ÈA<æ`%âQ€…XŽr,Ç2ÌÃl”¢âQ„%˜‹ Äc0c1â1¡�V¹ñmÊ1Ëð æ¡°a(æá~ÌÆdT sQ‚ÙX‚ÆÎxÌ6èÇc!– KQ�9XŒ…˜‹x£ ¥˜mÜ»•ÎDƒŠ¤0eX‚2  eX„Éÿr,4®KÍ2�ƒ¾7=ßötÛ³7Óžo\55ZÔ^j¸K‘�Ld¢8¸ÿAT å(C–a.æÏ.3´ËÀÌÃr ëD­MÛ6Ô¿‹²¼'”»æ`£ +ÐÓÀüÿ’Ò&¶Ûr6‘›�ø›dþ®×Ø�þ/üJîÿžÿt^DQÚ\^‘6–˜-Ã"Ä£ óÿ¡,R³ñ½RƒZ‡š´KŒ{ó‚z-0¸H”¥|’Î|ãî¼vn¦…Mo’÷—£Ì�p‰ñüÒ Ÿ›Ê0˃–¯A]æ‘n£¹Ü�âfŸ�¹Æ¾R, Ro£ w›²›ž4ψÓƒ;yI¢a9ùl±ñ)u/Ã\,Äì ~¦ÎEJ *RÖåíøÌÇB,úq�v;8Èx—ò/ÇŠ ŸKŽ˜È+K± e(F…!g‡4ņÒb 1†<8ü}’ºÄa.£Â bb²Âð�#æ—‘‘ö¾Y£6ú^Þ.m…�a¯NÖ‘k‰K‡­;â·%Æ•ÛéÑ«]ÏL#ïÄ”Íx0i/ ¢z³õ¿_ë6äLiM?35¼Ùë:4ZaàQúOqh‹†ùFÎ\ÔÐô“šô©I™!M¹�Äý˜‡¹=sOg?^Ì’m’šK ¶Û£ùFtN ->5sPfd†tÎE|7Èz!éJ/+¿io[¬,½mèüœÔJƶi)™çoö5 3“Ïþ{JÊf¾�¶/5>;òÇ?c‹åXiÈ;ßÈ’vÆMH}ß³“•íòKîsËmMÊ.ýtYûSR‰i›–Òž�½®­~I.&^Xl|ëÐH>+‘]ôBSßXlhS¼¶¬S•Ú™’”·ó¸Ÿò¨SçW|“‡IMo/Á÷Kr3¿[q¹�Œ&ŠK NR“¿ŸÕM+Éw)_éMtÛ®”·{f[ÜÜZEæó�”¸ƒÓ -C«bãùÄÛÔÅÄv½o}Bîo«º‰�¼ÍŒ�Ñ·Ô‰‹Y›Úd•Þ°¸“%DÞ±yxÈÀÙôÞÙXŠ¥Á*&£_V›¶':Ûß”ùû#FÚQÞ“ŸåA%ŸïóS»Ûåpy·ÂØu3‰ßÛ¯$ÞdÃÿÓ˜•9vq{Í¶ˆ’„{².™õåVŠò™¹X„ÙÆIÙ¬‹Ò«¾Ûü¿ÈX_+³Ó2Q”uq~;R#Phð‡±˜dð‡a˜„)Œ ƽ"LD<ÆcÆa2Š0…jØe°qGÞO4¢q -Š Šãp�Aˤ1ƒ ÚÓoЖ�êXãÛ(a,†ÏbªÁ£ ªã0Á =ã1EO³Ç‹!�{0ÔX7ºQ“ßXŒ3>åþ1†,¦¤“0®×›¥’”'¶K6…˜€!¼;(2èIù%ÿaÆzl»œÃ‚’60’”%Í!¸£�oòê=˜€ñ‡‰ž’òР´c †aBP—BCÓ¦DC0ã1ÍØ1#0É�BršÜ)¿O2ô‘–cpe\5%´²\wP‘s€äiÊ!ñŸÜÎy¢¡ÿhŒ6°•úN48b0Æ´Ómó�á)·‰Æ=†~R¾"CCICÞ“(J&­dJnƋɣ͎÷ý³-òÆÞ‚o[µíûgr‡I«�÷Í”xJœL ÍL2öŸ¢kæ®BI-ÿ;}¨Ä`A'Éå|gö²¯�õr -ý÷W™ü¿¯ÑW™ô_‚. ú[6]ôЗ[ÈÿÅpîäo¼qÒwCýb8}~¡˜¾….Óg‚þúiþWAŸv¡O�_Dçýå�ý8†Ÿ½FÇÐG[èÏ‚>ôÁ™þ� 3ôþúÓ#øŸýqcÿc½·ŠÞͧ–�!¼%ŸN :õŽ�ŸôŽ�N -úƒ \üDWú}$½-è­-t¼&™ô¦ c«èw‚~+è7‚Žn åÍ‚Ž:,è A‡6†ðCzÝNM¿>À›ýúàLþëôë*õà�d~p&ô©’é5Aû·PcÝ`þª }uƒù¾kôÊÖPþ² —Šio1ýÊA{ÜôKA¿¾VúOA/ -ú¹›v záy!›žwÐs»\ü¹´ËE?{6�ÿl=›N?´SÐ3‚vü$†ï(¦ŸüØÉC?vÒØh» m[Cù6A[C©áé Þ èé ª¯Ìë·Ð–§ð-‚žÚ<“?u€žªR7?‘Ì7ϤÍ>u“  zò‰dþäz"™êj’yÝ`z|cÜCC¨¶&™×SͯI¦ .Z/h� µ‚«vñÇU»èß­ô¨«€?:‘V ªzˆùá*þˆ ®¢Uqôo‚*ô° ‚T±ÜÎ+¨¢‘Á÷¾ºÜNË©ån*÷©Ë= h© ²%yÙZRÚƒ/™H¥=h± EÙt¿ …ÙTr� ù‚æ *4wNŸ+hœ|NÍ4KÐÝ7=„ßç ™Å4ãwtïô~¯‡¦‡Ð4AS=4EÐdA÷t‰á÷dÓ$AMt÷*/hœ‡Æ -ÃÒùA£Ш4²(š�ìKECܼ(šFFó‚†qóáÅ4¬0š;@…Ñ4tˆ›íKC -\|ˆ›†4*>ŸU-Æ \TШÀgUû|p nd‡|VÕ7ÈÎ}ò5²*ŸUd·òAvÔÈ|¾bõ.AY:x�ê߃òå¹ -x^1õËŠåýFQ_A}Ò=¼� ÜQÔÛË{�¢o,Ï”í*àÙ‚²Ò=<+–¼±”™îá™Ñ”a�ä(½W8O÷Pz£"Ùörºx¯pê%ÅÝ¢¦Ý™ÌÓÝi�äw&SO%Ÿ÷ÔCPª ”0JŽ,àÉ…tG% J ㉂âÓyÂ*ŠO§î£(ÎUÀãuÔµK ï*¨ œ¼K Å -Š-(*²€G £ÈˆtY@'�H'�“Âáäár» -¸[�‹¥sW9øÓEN»0‡�‡…Q˜‰�#ÔÆvr˜Ø…Ú­<ÔF¡�Ì÷²j·’]úV_5D�ÍÉm‚¬‘dq’.Hcé\Ä=DJ>§k¤°t®äƒ“³t‚“X#+®ÞÈÒþÿùÁÿ¶ÿâO7ü¨)ÒY -endstream -endobj - -4384 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /GPMDBV+NewCMMath-Book-Identity-H - /Encoding /Identity-H - /DescendantFonts [4385 0 R] - /ToUnicode 4388 0 R ->> -endobj - -4385 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /GPMDBV+NewCMMath-Book - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4387 0 R - /DW 0 - /W [0 0 500 1 1 625 2 2 611 3 3 361 4 4 278 5 5 584 6 6 444 7 7 306 8 8 444 9 10 389 11 11 500 12 12 389 13 13 278 14 14 497 15 15 603 16 16 654 17 17 750 18 18 1000 19 19 722 20 20 500 21 21 613 22 24 556 25 25 500 26 27 556 28 28 278 29 29 466 30 30 722 31 31 278 32 33 500 34 34 485 35 35 576 36 36 977 37 37 837 38 40 500 41 41 828 42 42 466 43 43 444 44 44 828 45 45 778 46 46 738 47 47 778 48 48 722 49 49 625 50 51 778 52 52 500 53 53 600 54 54 1000 55 55 490 56 56 833 57 57 392 58 58 581 59 59 572 60 60 518 61 61 569 62 62 611 63 63 706 64 64 556 65 65 528 66 66 412 67 67 667 68 68 778 69 69 531 70 70 906 71 71 500 72 72 654 73 73 569 74 74 528 75 75 610 76 77 422 78 78 407 79 79 666 80 80 477 81 81 500 82 82 528 83 83 776 84 84 706 85 85 569 86 86 662 87 87 500 88 88 319 89 89 527 90 90 447 91 91 319 92 92 639 93 94 500 95 95 469 96 96 500 97 97 710 98 98 849 99 99 722 100 100 521 101 101 1000 102 102 607 103 103 500 104 104 571 105 105 778 106 107 278 108 108 667 109 109 568 110 110 394 111 111 583 112 112 278 113 113 816 114 114 520 115 115 445 116 116 500 117 117 831 118 118 595 119 122 902 123 123 732 124 124 667 125 125 759 126 126 863 127 127 917 128 128 759 129 129 451 130 130 530 131 131 517 132 132 593 133 133 1149 134 134 354 135 135 406 136 136 782 137 137 651 138 138 494 139 139 612 140 140 576 141 141 750 142 142 554 143 143 556 144 144 485 145 145 750 146 146 514 147 147 345 148 148 958 149 149 559 150 150 510.99997 151 151 639 152 152 278 153 153 1000 154 154 503.00003 155 156 389 157 157 1000 158 158 778 159 159 839 160 160 529 161 161 429 162 162 653 163 163 1139 164 164 1361 165 165 1000 166 166 778 167 167 500 168 169 667 170 170 642] ->> -endobj - -4386 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -xœûÿ xûúÌ -endstream -endobj - -4387 0 obj -<< - /Type /FontDescriptor - /FontName /GPMDBV+NewCMMath-Book - /Flags 131076 - /FontBBox [-32 -950 1236 1500] - /ItalicAngle 0 - /Ascent 806 - /Descent -194 - /CapHeight 683 - /StemV 95.4 - /CIDSet 4386 0 R - /FontFile3 4389 0 R ->> -endobj - -4388 0 obj -<< - /Length 3246 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -100 beginbfchar -<0001> <0393> -<0002> <22A2> -<0003> -<0004> <003A> -<0005> -<0006> <0065> -<0007> <0066> -<0008> <0063> -<0009> <0074> -<000A> <0028> -<000B> <0031> -<000C> <0029> -<000D> <002C> -<000E> -<000F> -<0010> -<0011> -<0012> <2192> -<0013> <03A3> -<0014> <0067> -<0015> -<0016> <0070> -<0017> <0075> -<0018> <0068> -<0019> <0061> -<001A> <006E> -<001B> <0064> -<001C> <006C> -<001D> -<001E> <0077> -<001F> <0069> -<0020> <007B> -<0021> <006F> -<0022> -<0023> -<0024> <21A6> -<0025> <2026> -<0026> <007D> -<0027> <0032> -<0028> <0033> -<0029> -<002A> -<002B> -<002C> -<002D> <003D> -<002E> -<002F> <00D7> -<0030> <2115> -<0031> -<0032> <2264> -<0033> <002B> -<0034> <0030> -<0035> -<0036> <221E> -<0037> -<0038> <006D> -<0039> <0072> -<003A> -<003B> -<003C> -<003D> <0031> -<003E> -<003F> <0393> -<0040> <0053> -<0041> <0079> -<0042> <2218> -<0043> <2208> -<0044> <2212> -<0045> -<0046> <2254> -<0047> <0034> -<0048> -<0049> <0030> -<004A> <006B> -<004B> -<004C> <0028> -<004D> <0029> -<004E> <2032> -<004F> <2200> -<0050> -<0051> <0035> -<0052> <0076> -<0053> <22EF> -<0054> -<0055> <0032> -<0056> -<0057> <2217> -<0058> -<0059> -<005A> -<005B> -<005C> -<005D> <0036> -<005E> <22C4> -<005F> -<0060> <0037> -<0061> -<0062> -<0063> <0054> -<0064> -endbfchar -67 beginbfchar -<0065> <21C0> -<0066> -<0067> <0038> -<0068> -<0069> <2286> -<006A> <005B> -<006B> <005D> -<006C> <2209> -<006D> <2216> -<006E> <0073> -<006F> -<0070> <002E> -<0071> <03A3> -<0072> -<0073> <22A7> -<0074> <0039> -<0075> -<0076> -<0077> <007B> -<007B> <22AD> -<007C> <2227> -<007D> -<007E> -<007F> <004D> -<0080> -<0081> -<0082> -<0083> -<0084> -<0085> <2133FE00> -<0086> -<0087> -<0088> <2295> -<0089> -<008A> -<008B> <212D> -<008C> <210E> -<008D> <007B> -<008E> <2111> -<008F> <0062> -<0090> -<0091> <004E> -<0092> <004A> -<0093> -<0094> -<0095> -<0096> -<0097> -<0098> <007C> -<0099> <21D2> -<009A> -<009B> <27E8> -<009C> <27E9> -<009D> <21D4> -<009E> <22A5> -<009F> -<00A0> -<00A1> -<00A2> <0046> -<00A3> <221E> -<00A4> <221E> -<00A5> <2190> -<00A6> <2260> -<00A7> <2205> -<00A8> <222A> -<00A9> <2229> -<00AA> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4389 0 obj -<< - /Length 21370 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xœ¤| X›UÚ6H_rÜ2#1΢&µã¸Œ»v´ÕÚÚEºot§@�²ï„�!ûödß!„¶„�aëJ÷Å»h«Öí«Ž£U;ŽÎyñÅùþë«Î7ó_×wýÿÊy—œ÷9ç9ç>÷}ŸDGÍ™ý« ™Âåë×§ñsžZV\œOÅ“÷“À]òÁhÎQ\€Ù÷»ÿ >ðí]üŠ|àîψ£¢¢Y¿¢ßù÷<õßÿ}×<ú�¤»¦m½ë�Q1Ñѱ̎¥Å陫32‹ø¹üŠÇ–?>÷ùgŸ[øÔóÏ>ÿÜÜ¥Eüâ¢Ü²¹[ËŠ Š sù¹eOϽckNnÙ\a1/nnÙ\^fAfZYfÆÜò¢ŒLÞ\~NæÜ•Û¶l�_\ÄŸ».wofQYæÜ§žš[–™97‡Ï/yù™gøåÙOó²ŸÉ*.â—=S0{NÙ3ôeOÅoܰõ©u«—¿¾aËëOóEü¹Yż¹™ü´Ü‚²§£¢n‹ŠŽ -Mùî%ÿÆ.o"—{q¸Úc©tƒsÇœ­ÅwÝn½ë¸ëÎ�;š³¹Öb½ë®�;¬uf‹Õl¶Zïº;&*:***ª“â½´£¢¢Ñ1ùm\T'ýˆrG]ŒÞm½�#Œ™š³uÎÁ&ÄÄDl cãd¹=úöÒ;äw¦Þõ›»¼w/»û3¦þWÏüJöë}ìžïéŒ{0nŒe¼÷ž{Óï}›�ußC÷íÿ�ö·¯ü.õwþßÜÿøýß=ðíƒ;ôq~˹Á=;WôPêCŸÏ»ú‡î‡_¸î�¡G~ÿÈÅGÓízlîcËûÛãÅ�_ù“㉹O|ô¤ýÉïŸJ{ÊðÔGO÷»v|Ý›ëã×�nxuãÂ�}›j6¿²ù¯ ¶$lÛš²õ­mÊí÷mî¸cGÁë·wEíJØåKT&Žï~7Éœütò™”Æ=•{¾H­N{9Í“öCºì'Wï�Þ¿Ú³ÿ>òa²{úáØýÓUlr5>4½šÁl„0ùU8ßÿ9¾ÔƒÛ¦Øì¿ÅžƒaqSa0Ý”ãxuA®œnÈh¢ü:›Ú¦6×@šö0 BS£T+Õ] âŒØVãÃøŽè[u(œÍØEµKgÑ;À�H?£Ç -ý¦Õ/ÀÆñaô‘±2HÞÆž^ŠÇbëvq•BQÅùá׌*»¢Þc·×sð¹”Qo·×»¥. —Ii¥!ò®þèS“1ø}ò%¶Cfp^Žmý»û0˜Á/u -€ÕU)Ê¢ž~ˆr©^ uªýÜ÷b©eƒ¶ôg�~èò{šƒÞvW›Ùe´‚ j‹ �Tj�4wAzz"T‚¼ÚÀc¬7×£ xð:­6c—I½ xÞ‹çDô] ÞJÞÉñ[ ù¥……�ÒP(ÐâPçü[Sar©o Ç5÷’W»ùYßâSw²A«Wjeˆúít ¡käZ�\š«Þ¨ ÚT*µ©ÝÜpÑÑ£kz¢&t^@^»½ÞYcáqw@¡QnÑuf°"|?9D˜êL“Élm6 Ãôk|rŸÜ)€\¨Ð–ªs‹Ô)ô*PƒÔ¢r�¬“µá×Ö·‹Á -V䤃:=[ -:­B„6QË­\§Òk@fQ»À6»ÅÓr©e$àkõïw^ŽuÕ\&õgi'NoÇ ‚qí×qù¥¼.Ö·ä ØÌÆŒUר9œ�°‹Ÿž”¹G´6À:ÿö¡ä¡äƒüSp†Cá–®Úf¨GN•EÊQ€Z­•–¯NÍ[ )�ã/‰ˆ:äcú3b›¬Æ&îó_²Y¤+Ï’EˆâÇšÞðŽ„-�MN?Œ@ˆïIBLê „ñT?V…¢ñm¯}ƒ¦¶±Ÿ_½üy.uÛâÌ+Ô› ik”¥¦\Ÿ20ÃD "úˆ…Ëy 0*-J‹¶>�çôS Ã8ÑñæÇ6½M'V(ªA„ -Ê«¯êêª÷v]XÜ¿˜³v–§'§' ¶Â:Øàß6˜2˜²¿ü$ì‡p]{0ðì͈õ™Éa°‚*³ Öh‚Ué¹ë ŠÝÅmyUá2úºÿËO8Lª@ÚEÞÞŸŒûÛ[ù�øW�¬KøCÇ>‘¿™±«bËžta÷ynÆÜ~ë,ÅÅkòcõyÚ"e)b V®ÎÈݤEEïSM ØÔ�Ù#j«nQ¶z£û� \&UpóD ¾@Ø‹ÅÁ“ά5ïH{£àÓ’wª¯Âô®Ô]m{§ãÓ¡7˜LF3]kµEzÐ굺�É»V¦?‹2æ Â"ô5. Ï|vÿÊÉ&�IoÄœa²)|Z� ß�ÁMSO³ÓÓ6 -Ê`„ˆ½«M›f¹Z®æi÷ÊɈm16¼ïÃa}‹…séÀ3), -‹šn>ò£Yg-¥cƒE'b®R:ö‰Ñýç? Üx Þ¡kýŽðZÆÇéŸî:¿qTkÔô µä 1jLÚƒ{‡Vw<‹ÚÕ½ -‹éZ/®~µdQÁ³i«wìÕjtЂܢv€L“1©wÕ8&/o�ÁÜïØù‚²üÂ/Ä­ƒZ³Ã� -Ö ¶¥¥*h@fV;ÀµµÞ@÷¸÷E‡*%s˜T”]@¾Š¶5]ÂmbÈ_‘Ø`WIÆvåHNÏNH‡Â<ÁYžZ*º.°ÌVÀâ0Ù ¶†·ýmÐŽj(‰ºXšŽ(¡•¨JA B—¬ |Pç´5,ÖW5]'j÷9úl-&›½ÎÝØ{x¸ítA}9¤‚X+T–"jÎônB§Ð«A —ÌMੳžCn!,~S#xábJÿr@L�$H.F“wœ¿ÑCNâyl‡z&³UJ­DøJÙÞ’Ù¶¼Ön÷~ÔþÂÑko±v k;a´,`¤Gôr(‡ê-§ÂH«„ù…垬’�ßà3·9úÐ~™°wXšŒ®Ÿ®‘ÐÕ�7=ù/Õõ@­Ýå1Ù¼“]ø7Íò~8ᎎ^äÊê*ƒIð¿W1÷‰‡ð7}X3=ð1~ö*^öN ®³¯Áù¦ÃÃ^w½ÏÛ‚²Tȉª,Q± 2§$»:ž�Ôá+ÀQýø¶�Ëß\=ð5œ…ÎR؉`¯$«4·8+¯"Ê ÆuàðFÀ�¼R;?“_´'©·ìÇÀµ÷Ÿ™=F¸arW÷£@= -ÔœU¯R÷§/O¦âà! ~}n!fbâ?BoG÷à?ÇàMì8¥õ�lvð€Ce•Š ÕNð�ÃÑè µ�øºÜMkbAi¨6•Û–™÷‚‰Êå)"¹¢JfU×ršámS34Âm# �Í^ï”[*¸ÅPiT›Ô&�CïAÉZŸÁ.€�©”Dݘ¾LîÚ[’¨©Ò+ ™Uí‚z8dª„1y�¢NSù@0I®K€¥ãÑß/À¶Íd¶‚ l«Ò´»>¥;í`q�hP>¦u+¬@U -E%× =á�?iúAKƒp§$±Ëv쉯œ�@¯×•vE=Ç v«Éíó ¶÷ é¯GL|;ì#ÿŽ>2õ6ÖQ$UMùˆÙ”C2§ÚÇ!Ç¡«ò��/äïÈáçðj¢¼€Õ¸�°ÙLV:Ÿ´Vµ Q‰8ŒK€xŽÖtð:xþ�®WGã@”©t¥\æ<*½¯a t¢¡Þð ‡i/OÍí�>ø^ä*.}ÇÔƒ‡ŸcC³©ÑRNµE -jÐèt:µ:�ʇ*zs‚l‡ �"z’�ð߆7àXÛÁCµ‡7`¬j ¯Sìºx¾¥ÜZnE«ˆ<¯ âíëéìé ×Gà/0º ƒ -�*‘–aRZ4vëØÍt4Øã¨A©–KQê¢x$)° -ÖABÙ®¤»Ké‰xùXÂñ*ôm qXÜ-‚U�\‘ž“�“½W”�ÊÜ@ÌDj{Ï ’w÷—wÅ}û66}Âz�°OÁ¡¦ÈHd¤éœ†“ƒÃéc»a'ìff 8N°nP’B&ÑM³xZ4�Αæ_àH¬ 3´&²@`Pš•fM-ø~�ÑT)=ˆõž•|™=�ü–d_†3R IšZžQš”ÃO…4Èkä…ån�Ü3‚[b&Jƒý÷»„q8úm¼ëm–76°ã%Á³\Àï¬.ê)ºrah¬J«Òă=ˆz”¦Bß³c¢ô†Á–ö–¬$ü'ôÙ 0*¬ -«¦ðwômž¤oÓ~­]eW™%ÀGÔrÆ¢´×—q˜‰&ï -á¤ÙZ\ÂIo³ÞÃçÈØ#�œ\ªò? 3K‡"™IfÒØÀ…ðfŒë»´>ÙÉ”ŽE°’‹ ¶ Àýá^hšùtS5ðÑ´ëß"|ë¶ÿá5Œ÷\ºÊaΓËúqj;~&×ùÁ–¯ð“oŸéd Iá§ìãù›R¡@XÓÒÈÁ»УiU6”�ï}Ðâ%©Ëó¼•]]õõ]\н¦¦–.wЩþ„5Ü<Æ«êM5é"ĪZU�› - Pê,÷U"ÖpgÑpõ8C-­KhËlÏ‹:Ô94Áe�S½ËØÉ™Ý£\øìÆÀ—ô$cÕž-«èXÒÍY¼Õœ#øùÜ��ýHýÄ™?>qÿ/Y‹ðFŒýÈu�TX°Á'ë -õè¿Äq¦ëŽãÿ¸k�™Šãªã˜( ‰úÉ»lïîO°émVy‡”Í*ÂOýKïñн‡¼I°"Ôã³½çíGíaä÷ímØ ëa{yjJjJù627nŸ�Ìü“p"¾®0¢r;=¢–L›Ô$ ¢R ÑJ•Òâ”Ìò$H‡¼ÆÒÁŠ�|NŽîûôk !„Éof:dÔEV~ØÄÆ1tßȆò™¾¡¥Ÿ HŠ`MÎ…®œMeS™ê\·úl6 U™WÄ™Aü\0zô*6Äà_c6š-]ÎA´/ö,ì·÷zºêš]-6¯©Ü0±£s d@†,C¸xïªg�º ýñø+_qÁ˜{°¥Ûßâ¯÷Û&˜À¥¶ÒçZ£RäíI/NªA -¾¦€wŽ"lÆöêµy›“ë{£}¸ßò¶8õv–gs™øv§€|¬?z* -È® ·û ¨ŸQ -Õ‹ è dýzŸŠA£Wiåh>¥z -{ ­CoòøìaôÏÕB}�!Ý„2=àWÛä&­½ÒU€^¦Ïa ¡uè,`DžÆ™³©9Ú™ûî·Á•‡ð=ÔMÂZeW8Áv›Åƒ¾ÀþTa©¶+]`3Ømv÷l«`²¿VˆïÄDÜû8æÏYn¼�ü’âµ––¶”„8-­Ü�ÓŸ³ÿN·X�*3b ªÌ:4 cÖ%ê5�It�_K�¹³=Ê÷o�6�2u’;éŸhœw1æÞq˜b²±�Gs†â[&[z†èðÇNõŸtY,.�j“!M–%J*ãçA¢ ŒuSÖIÕj©Ô¢v�9ž¼žC�È+ë ÉFݺrÃúþc\æ ÇíÇ1xË�ü.‰eSO³wBjEVvV¶( v¢Ü^G¨¥5ÔUÈçhA:½oßpä4\ƒÑðgX•»|åDm¢r‰Ø`€"D2€`}Ä«ò€PìT©äju¡n+ ê¸ñ9qþÌG“ÁCˆE6ö8{ á;ž¹JÝÅaÎ+ï}ß�ïïÀQ8êPWܾㅟýjŽfQQøþŽýFË©Óð!D=émÙ�ôÚdH�Œš~F©0RQ^¿³³)ÐÉ�.QC¦±µg°áœ€P¬€4Eޏ¨dw–|=ÔèTj�#± 9‘XÖ´ô­þís_,Xº„»v7 ÷è[[¡uóZr3„Ât$6e „KF%à(ìóEú"}þQ8‚à¯KϾâGL\aòoáè©Ä¿Æ�g¦–°©cùR}¹Ô¥nj0UqA§WÍ“턺\&«•º -} r™N u©ý\ünìy8Ûxzð“Ã÷^€ðcÏ~G=ÂÁ  -Ù@;©w¬JXöZÖS€¨˜X)(AcP�Ö&0m&7MZŽ.½aÐw±xÎéÕÔ.“â–Âñ!kÇŠníòvÆ�KÉÙP+q××Ú - vפð·—dA -”Öò›…é¼”DØ„^Mþˆ³]]þH[S øgÉ]5h´oO†d>ð¡Ü(4£,[f ¾ÑHC“¼]Ó h¢½6ÐÈsîâæB¡ª¤¦Ì]ã…&èhnóö¸û¬ýÐ!yK…SiÓZy<—ÚN=Æv�SïÔÉt}H ä·©Îè¡�ÅŸ¥!òþv\=9ÿI÷õ·cÈ�SO²Á£pV™wº3­e°R÷ÂjÈðm /{¸ô•gy�¨Zˆd:r}E¡äaþQ‚~_Oxâtû»ð9œI?€”bÍùG ¬‹Éìl¨wô^ð+ZÄ"ŸÜMÐÔ­ˆúëtˆ Gë&‚‡;N ôïó4ez2&±¡*¡X[ªâñÏLL”�3v–ûsÏxkj »6i+A¯›„ …bv¡æÒ7kkéõ¾\%­‘ êYjQt¾ø\ÑyƒÑ`4N¯µÙXo´ÛÁ .•Ee°X[Hñ& ±RQ%s¨¸#PµE#ª•Ê Ê­V£QkÓS“ʶj+õr9ˆMrƒÚ ^8nò‚&µþYv‚;3DÊŒ5ð€ÓQçm8õÆé7Nžë~¹ç•®…z�^§Õ"¹¼J]¦ë -� ©Uíæà{L„ÞÔ6€ì4YâTZĆΠ‚Å„ó'ú®Z–!áUÖTÖ«Ò½Çp5aï:ƒ17öô¨}²vq]!¤@¥¾B[ :Ðê5HÎ�ZÔNެ£5â%„©]i*4­¡Ç>—9uG'l:‹Ú‚¨d<ó",£là–9% µN­FT2ýÂɄڢ6*A2H@iT[ÔÏ£’ µZ§%Hœ27ØÀb´XÐì©d¢¶èlà§Ü4Odø†È‘8³�|aj„%šzjj)›z8–W£s¡Æ¥lÒµêêÕ¥Mf®€Ô~j˜äJ§Ä"D½[6s¦Ä®¬×7ê¼rO•^¥W€M °U­Ø¥èeJ¨AM€ƒŸŠm®µy¸P+µ•vX”z\&ד ¦¬A‡Ô®¶ª³Õ¶pY"r‚±ß\?Êi08làF>‰©ŒÃš¿`ZŠ=ý2y„PÛÔt̾‹e6Ö ãâœÄìÁ¸�Ë}wýüû�XŽÅ¿cCÄÓÓÑR묵¸µ™•¾SÚÈm†z·­­v(¹1 Ò §¦ˆŸ‘ÏË”¦jªtb�Ï*tW¡–¼ñÊKp Þj;wx¤78VwÌì5zÀGÒö¿A¬–õeÁ(ll ·´yƒŽ tA“¼¶Ò%1UkIJôa* ŸðhܺZB°6ÔRïvy-M¶]@âµîuoêNxrsÙŸ�Z¤­„*(²óê…>^o¢´CÜ^(°KÍb�X+R �4…Ÿ�UšUšZ“hyJç$—IÝ96õÈHôÔ³ýì¹×õàPÛäf4Ý�­d¶³Åð*ìU �^«GÓ¨B¦V+@ -R‹Ò©Fä{Óqìé·fòv†q$ߢó¶~&¥™X0MF�ÇLmÀmlª÷ÿŒË¨~ªŸñO‰û©þXúôµÜ�û!eÎ+M¡Ptø:ÖÐ�¿œ�zÇbðSù[·?§-£.õÐ냪¢Öí£žÇæâ9d„mË1­…§áÍJåÉ+Y{7ø�·$P5¦¼¨mÑ„w|l:iérL4ô´{šj}V/œ…Þí®Mˆ©žEþW/á”s¶ áî²?Èæ/ÊÛ›NgM×Yµ8ºñ"ôÁ›Iá×aì,Mߎôì°ÊwT§ÈòÕ"PþRv˜UÐ/d‡b�¨Kfdá�Œ³²ƒÿzÇ®€7àovöÖGni™‚%©T¬²BK÷Ãľìq@ÃÐÓÒ²ß7àl7¢Ç­X^Ãa’\éÄÖ0¦&2ÂqGBSçC,ï”LÊ>ãÍ}cÝÃÞƒpŽWÌÎKjN€•°©4qGQ>¿¨’‡RuV×"VÁ¶Ñ„ÀFØ »Ë²’r÷Tî€�°É»£kO_ÒXÙQ8Ç[÷DÁÎ@ÐÛÙ̯«A‡“�òO °� Å:¡¶F-’|ÄòååTî…TH ¤Ž¦Lä -ÚOã˜ËÀgpòyxýp^φ‘ºp{b´÷ô4D CüHòÈÖ®tñ:*féÖ—àiØp¾DLŠA¥…\Ÿ“ýø�Ï]¡èC_â#_Æ�û¦îf§¶'qÖCê^þ"u…tgÕKhMìOº÷ X6ýBš K“×dUŠÊA 5f©­ÓRïƒNÔ*q—ä–æî,ã´@ÀéówvµŒ5œv…�ý¶~t Ÿ¹DÀi8d!wq¬u°?áð9ýuNzútk\ÊeU R·¤­»9ÔÍabÑ/ ©ÝWðî·ï}€µŸ'Ÿc�þVŠÿ#„f˜Nš?*ÿþè݃—¯ŒrVpf®ÑüÇkþ�ÉÒý’É*ÊßT}|Oð5X» ógY­÷þw¬Öϵâÿ+«uèÒ“ʽõœ¿øÅ_X#dÉd‡³Z28;!£°t‚OiþìágAëÿ+wKxM? ÏO0 b{ºk¤1l -d2u T£�¸ƒÓæó·r™·ÐÚ“S‹Ø°Þ$$V(Ä4Úñ»T5\�ÊÅ•"D•SµáBk×Yô&än°öúöz§Ê"áP÷h‰rxÝT1sé,2k�Ρó© Z«a&u•0) jÐ"Á¢f§"_#Q–(«h_— åz¹ÊÑŒ’„ï1á8-áÑÛíà›Ö¢6È -ƒò B£Ú¤3è�`³ÅïèC=˜K˜Üf§Õа÷¸ÝDkksƒßáµû,~CƒÑb�z@JA ;µb@̼™,.øåªNüÉ—ë:YWÈfòvöhJ`'rù¥É‚ÑœÀNH„½üü”’Œê"Íj °ZŒä;6tþ=È ¯æP¿¯\U˜— -Õ 1I-ˆu½Õé¦q3�y¼â¼ä1þ>ÎtÚF}ɽüƒ0�Α¶p]�ØèÕ­kå¨2!%~ äAe# ‚ÛÒîAÝø~Â÷VGÿ0Ô�[ëR#Ö•¹„¥4?ÐÙìä2çãÿ~G*ŒkáSxCA«„ô“L¶»ÅêÃ,�XA%¨µZUΚôgvSwjÞ�œ*?Zt9¥o¬ƒ­iÅyI•9PŽävµ—c±ÞƒÁ®ÁºvG“¥«äïR ¹�¡ÉWðr©˜ÊPb«ÒµPëw zÏÔµí7yŒn“õâ9#8êÐ7ˆ™ Ò5�ÍÇà#SO²SÓÖ -æÚÃ8cŽ^/šV3@¢Wh5ji¡j+ ôÔXoÆ+5Ib+ZU.�Yo§ @ÃŒ6�¥€Ã´RÏDpóÜüqðí¸cÿûK>ézïã�Y”ô™ÇTî“ÞÁ¦€ßßä Àç_MÚ’ûÂëð:µí8´Ô!iÊéÙŒDÊõPÛ]Y~AKiPÒ W`2tòäÀ@ã‚AeHÜ€à("Ô⯥! bo;KÈÛDíE!DÝE1ˆ¬ýÐ -û:»ÏúÛªZ´ÎÜàlò7ùƒ]]£Hâ'ö¦—WAm|÷“GãÛSQ,Øô´„úbÞ„ù²o�DãçoÒaþ5ß{ÆÅ�¢`†}¯= A®™>�:cÃjš¥0¥P‰¦í ¨ü¥ +5?mƯk ’ÄŽ[¬™p3º­†~3qF—‹;raE'þì¦NÖul™zŽý8½²�ºß ³ª4CéhàâÝ ŸÚ!ç¨@¥VÉPþbÏÐÞ–e@Eß_* -ž9±òáûò Ö•s•ÃÉð¼¶cýk@ý_Vc=Gˤ*¹ˆC%2D¹“c«ÅêD�‰Hʉò«pÆý}ƒ}ƒ ûàŒUGJÂ%á¬æ¢â:Öõíµ©cp½91ñ&‡¹˜J ‘gÂѾOc0A¥±'`¸¿ã -ÂKÉ— ï@¨qP˜‘7Kb?O“Íz�x Ò)5rô$%y;èáϪ7¡:Ÿ­�ajŽ–(ÓçÒL(ƒqÜÆº\„¥¨²-DÉZÑ–uP=3a,.4£�ØSP($Žäìã0©m_�áô±è#ô{ &±‰ ûåþœž¢`¶'Е+.<¿òÚµóç¯q“îƒ4•¢Œ/–ÉŠ%$�=:JÿKNà2O¥ŽaÞ8æ�E¿·/æÞÉf6•»¶ø“#ɑ҃ªÓˆ|}ƒÒX“;ýz¬õtëÁÑÈhäˆÿ4 œ0³®œ9F%ľ ñÅ Åñ°¶ÇM8š0YüÞ­ónáXáhôÔ:ÜÊžþ>V¨’I$VY#—ü>¶Ñêtת\B.siy/9?„˺¢>èú -‹®Å`y� ±»ÈØ16Ò|þ#‹áqHWìo¨œLíY‹aUþÆõhãúÂxX YîÌÖÌŽ”ñòsð ¼5tüÃ#×Nây€Yp¡âDö8Ê8¼µ-VÁ.~nRIVu!ðéQ±=ÔÖâàµT3Ö‰ÖglH�ß™» VCfÎ@»-\·¿n]�Ç?pt_ð( K�Û–q™øðU“0†‹c‹;‚ Öo§Î‘sØÓµ±ôtXeWx¸díL¸t8¬UÔæ9³G«Ä?õpiˆÎùá�x#›õXGiKA�WPØÊ u´6wp(ñ–¶£´¹ °”WXÐÂëèliî¤yÉ0þu˜,Fãñ«1ø»©…l9(Ô*9¢&¦3 ×,$nY&Eº<@¼ŒØ qÔp -NÁ¨>¨Ca#D3¦3 =÷_û2ü8™Âp*mÎfê×lêÁÜ'9»õ$¾xV*ŒÛßýÎ%üu/«ˆr»ÄZ±z�`Ïz^BÚÓ5™óöïƒËpnìFW¿Õf¢µVÊŒ §Ê‹J6—l®Þ)ð‡wVZŽvR/©N9ã•‘ÒÝí´ûP7~�`õ¸ô´Cé\ê|ãÌgº.Á5t5ýÔkœw©Ù°®p놤„´ ‚Õ ¨iš@ïyÇ1f® ¼sþ»¿:Ò½7�ËÌö’doôÁ8p#†tã‹lÀ„ð£Œãùû×ö-†|(Ró¤ÔmÉÙÔ½@=¹Æ|S�—úÍI*?¨‚–¾m¤ßø)DÅbÛ•e�‡‡áqM¼<½fSZâJàÏÎ÷D#ŠIm@ÞEpÃrÎÙë=3ÐyNÀpFÝnÄ\¬EaFT˜j,5–꺪¢îÁ¯Ój– ´`p:ü =­�^W‡¯ÃÙiDý �®L_É�i(0¢L†Oï¤I‰e�¤Q¿¥@æ¬ÏþwŠtŒ Ïù7E¾>v ¾Œ8û\×.�£šU'ƒÁ´ÈG{qQ_ô‰ÏZ¾ÁžOcÈßL¥°_ƒ-üœ¤¢Ìê(Ce�UÍ�mm�Ô¸ËÌ�#cM'á˜Xs!G™\½‰ÿ殞Ű 6‰2QBfF²`«$G™°×“ёѓ2Qþ|Ûwvâbß;¾�‘=lî†à§ŸÀˆzž3½� ©•ÛsÖlÞ°m!¼)a¸=-7\mm““g?…·al,ALj-F§bðMjÿ�þA‹Î¤5m‰¤\̽Yô±øxý�ï{>~Ü}sä⑈Éd4�eÖ?¨­^¯[³kÛÒÔÇPúS‚çàEô¼ènð©Èc‡—žÝeЙôfšq]‹µ§b®Qcì³û_Ž|5øWÿ'ð!}럤ÿ5õ«m—×ì×µÍ-“ŸÚ¨5i�¤Ž,ï~ç{^‚ô­ˆ_*šŸûHÊò-©Z­N êY“ŸLmòK<‹Ûcp9ÊæA¥L.@Ô¢é—GóÈÂâ0ÑÊf¨´µó$ùà8Ö£1ÙÀÆÞ©» «Gã[ÅV™FU�ž¤*¨}ð® 4¥EUP-¶W ìýánÂ,µ«]´Dj1»õy';€º—:I0©{©´~-D²Cqž/Ó¯bé½ö릇zˆÍº‘:"ø„3õáÀpk[�+‚p4¹–0: ´Û¹‘¶J#Öç´·NÉ/ï+lÈ‚µ��Ÿ¸6e#¬�ù–~aèõvu¡Bê¢(>%g”B¹±ÂŒX7ý.§ˆõYKµ»„“Ï+Êçâ¿’!6ëF£À)!èõj�%Q› ¿²¬¤¼¤¼Tʇ½ Â1˜èÆÌÆÞŽ£=íƒÐe­Ñ:Ê×ßâe!|÷'�¸ýßníÇŸ³(|>϶€Õl±…F›B´ Ò]%ÖtØ -ë{Ä¥¼ô\A* U°}¼â Io4˜±~µB\ÕÁ£]M?äˆEY�¾÷â×Ü“p°ihxhØN±Êý¹‘¬±äÀ@,* ÒÅy…Ç3Ú­š6…Ww Ãç÷Õ6Xí&:lNéo$I3¥@ª#ݧ6j @rµ\Ä¥F�7p˜‹gµuò·ølPë”z‚RÍÅ „†–Ä Èã³õÏJâ·°G&ã8ŒuÙÏ£þö£>£‹×!ÌÆ ³Ëì°Øëš[kûõÿ Æ êj 1ñ¼ë»è#ÿªïe`Óÿ‡ÀwSÖCÞÓ‡cÞÅeï*¯� ±nàäzv”T²ªyÒRe‘VªW�¤6UøÀà²ø½“�ž ŸC\È©ºTšŠ¶Sy„²D[ zà»kZhþÇî¨7Y­~GòÿQ;fk5Zí­µ-ÞÀÐññÐôBMeˆâ3E¬oe¥ê -�¶áÜÃ0ýÍmã�AWÔ�Ki•€R¯T+eH¯èù‹s3ö@5Ídù¡ÎÞêéG¬=×½g F«: ¼¼º"[¬�­Å{¶ ù¾Ôž :![#q§ñ,ü&}ˆußI.bw67wr¡WäË24�íï? ÿÇVà °»29'¥’/©’Ë%£jI�Q …ˆ|ÖgxSÊ특R­-ÐmD-Ž=wüÔ¡ãc#=��mˆu3ö BN•íKìMíÚæ] [!©*=?5§|l›09Ì£eWð‹¼Kˆ[„q}„ï¹ÿ5k¿†ÿɆÓõ;|-mî£N®—ƒ*MBk9b}ïÙjOƒBÈQó¥Ò"aqM‰5ñ‰³Î‘†ÖÖ@ ®Ùp9\æZz ®7kÑ‰Ô à& -}¥­üNôø&B?¤Œˆ‡kZåÓ6|à°¸\—Ën³™z¶¶æ5ÈBæÁºÍ(Ä)+µb‚΢ò ¢ˆgrâó’òQ�‡Ø%Øš»!¹xSõFXÔíó�n=ºõJñ h…vSÐr<<ÞÝBAFJñ^aޤB/ÑËQ¨|ÞÌeÎÃùoÆàJÜϦïUn¾RV)«´–5(¾o3u_Q¡P•9+�•e}-ÂŒÄÔC„NÐPå4ÔëüHŒÂŒ—oM“ÍéuzUÍvDÝwßwŒh°[›e^™—o«’ бÀƒ"Œ�^ˆ ¢Ò(DL* cäõ1»0#Åêã÷�ÅOÝÏ`MR¯+ ‰8eƒ îôþø$þ•‰`¾ªÀëºð˽q�ø^¬øò�—Ë"ŸÄ¿gSŠXcØ0äïj¨ ·ƒ‘ú�!1©çUø¿Ç’zã¾Á±IcøŽ1Ö%2ÿš}(i'ce~Yñf8àà ~dŒvû?‚·$Ųõ�&>ö˜e_£Ús?.¿Ày{äè%îÌSã›cãgã®ág)&Žb}†Ã÷�­'ePËèç>N?7uŠ~n¦‰`Ýœ$o²#9=©©99©©=9N¤§'ÂevÏܧ¸7ÇâX*öœ�cY]$ußX<®e|»-ü(ç ØžPºŽ"Xg©×~ -*kpööq4…cñ8“ÀÑí;Ýí,áP�Ùƒ=c�ìÎK_vtÅ }�w~¹â Ö4É" ì®zo÷Åmá¥Ü°:#qQêJÁb˜+ðüØö�äQ>=ôï„Gëû¾aý×ÉŠƒÙ‘ÌÑÄæM°ö•lAV`¢ý‹í¾6GôB«Ì+@¬éÜJQ!·Ø/hçdP جï]|k -¬†5êTi¹0½@� -EPî¬j”ÔËë4®šÕœAÐnn³µºÇú†' !¡/1ç‘…¸šm1­`»Îª6!*§Z‹Ê¨ }':­QéT:¡ÖêT …QeÑ"L—˜ÔV�ì`5š,¨’œËÆK©_x)Á¤�‡?Çœwûƒq¿œÁÜ3ßg}G.Àÿ`Ýܱž³RD%™ü¼šB(�í=¹“â ºIéU Ö÷~¹³Ê B!¬ä вÄÛaäxª‚�ú¶VèD-wI6?/{õż‹œ·àpSçH[Ÿ» Bt¦û \e6± ±¾Ëqd› ‡öw�!h“¸yå¾xHà’8 í\æ<½€|çƒè‰.CÇá/cÈbò&Ûæ0¹¡QêØxÈ0+Z“Ö¦s È¥rº€p±‡¬“©ÃxÞ Q"^¦{©_u?ʨuuÕûœ ÀO6ãÛÆÎ!æ·.ÁÔ½—7ŸŽ#¯}Èê#/NíbgA®¤€WÀ+Þ[¶…Ô„·¿1ØÜèrÔ››fЈ»Ú*7I¡öV$f'¤'ä¥ñKµ˜Ú­Ò·�ˆ°}¡8%hG¬IIC¥C;!­8oky–¸PÁG! œ uÓñðd–^Ô­Ò&ʨkæU/CvÉÉ1vöÍ?ûîêõ£“½]ÞGŸ©Öà:’ÜÂabí�TîÈÔ"¶Vš·$w…M]§­ÓÚiMS*ó+Ñ4“º‚�¿Ãí¶X�^CPk-4;U–.ÅÒR÷šˆ*}5š±t šª8·,¿û�–«ÚÍÅq¦ÓzÂC: z­LïKši´nòX(ŒŸÆÀ·a‚ª#l•f)¨Qe•¼ B¡Î�¿Mð¶‰^=žÐú ŽÞŽP…ElH™«ºQá· ½EgÖ›NÂOûú‡Ýöfs§ZgV5¤i«i…ýö[;æ¢{;±îs¬ëŒ¹÷�©‡È-ìNáÊi "ª²Û¦ãí]­¡}¦“„°êhh/@Ó ³ô¤Z%ÍWm´'#6d…¿cÓlnO £;œß–ÁI�Ý…Û7¥§ä•HÐMòiBçÐY%�Kä5z±N©1¢Iv_«¡šCýqú#Ú«¦ ½ôöƒÜv›Çâh¸Ð‰P=Áƒ]ˆ5-±²d�ЗrŽAø`ãßoqÏ´(_¾¨do  -y];—EEA}ía¨‡£É=O×ê[í¡öP£ÏíjkjuÀI�9T¢æóhìHrqåXRgÜÔ¦1Vê÷ p%»Öjuqiê^iz¹oÁ�¢Oµ.¥EBwDÚôQÒ�Ù›„XþÎÔPa[úÁ9³;cÆãÀ4Êzɸ^¼sØ)ŒÃo½÷Ú‡¾a½Ež!ìáìàN -l/Z¿)%5»˜Wƒ¾ ï# FƒÕè@µJ«„Ãú”Š“•z…*‘Ô©òyÛ@Ê ½Ar7µ%™Ú–H%̸ôPV[Ó-Pï±ëO>uô¡wä6¼½cüáÆ$G¡«ÊUåRÔƒÆzob}vú2-‹ -‹Æ Èeu4p¿¢U G -â -™‚ç-pdÃó°b/¼¹uEA~OQ—ê´±.�•tA -$ä­€xØ3*úTëVÛ䀤*™ˆK±g XLv[C½BÛÐ,é­ôùûþÂe–ÛS CÑIØ.¨µ¹=Wã ÑóDëro¢«ÀVaQºÄ>E+ ¬Ó`1ƒŒ:³Æ¢´)=Š¢’ÉãDå¾ôæ5 ¥d ´ª]Ú:�CmQÙN¡+}N5Rª‰�HTR�C…GÜ0»á»Ù½å‡ØÁ²æ¢¢²²¢¢æ²`°¹9Èaâl˜ ŸŸÑ‹ÞœšËÆMÔ7”�ª'ärµԨƥjâ�:0¤!_R¸bgy¥R¢–ê3”iÚ=€¨ÀµØG8f;XUŽ÷c5½³í¸´·<ÌoÙ^»àG½ Q¬Ö”p™/JCä\zÞ‹¸Š¿îŠ!—NÝÅÞDiA_‘/Ö@BÞ®UÉëùk`¼@3G - Œ¹2»óÇMBÓ5Ïå_NUÂE?mÿ¼µÁÏ#'ÁLhm*³ø�¦Ù¨”êU -¨þyš|�r°�K5Èõ½Z¯D‰ÔvB+UÖÈk²R²ù9�‡fkoí¸ÿÃб¾ŽF¯ÏîÔ�’ÚRĤæû´Îòð8æÍ~ýÀm8À¦êñø>ö§ì§êq⌧Güó×xf=<‰¸žAŸç–ºjfÆûö/ßê C¯@V|‰w~ÁúFx.;¯ª2÷µ“Ùïpß…3cï…Ï5^��³øŸ$ÊIiÚ › Q�‘ŠXß§¦fv±4ìèMíOÞÇ?a ½í’0€Š-ÍØ[�—W•{¡È!ò!Ö?:ê:¸í1³¾cg@Q£p±¾—T#pÎÚ†Ý-M��ƒ0!žo—«Ä–LóyóшJPrm‡à½·É¬ãÚÚñ³Ÿ)nàæk¬qüù76ކ÷‹ŽoIiZ à¥êu%é¼Ì -~�¢F!R—B ¤Ô½ÚŽ’½{Ý9¶¿ ŽŽÃÔ‰ƒ…Ī.ŒT·€ìf§Íå ¶´vúßC,ËÜ•ÆKVÕh«@↢Þ4Īò—9Ë€…¢²ŒÊI¾2’2²“Kw"¿€ð¶ùü î·×æ…FhS÷H‡jÂ’žjÄ?Îï«©‡\>öF}_4| ïÀ[üIcéƒIí;ë2\Û,+¥Á.Ù&Qº$›Ÿ—Ÿ�P¼žGíbÂ�_ùÛU¼ -Sö lrò¿XWÈÒ©ÛÙ³ðm£ - ^OnC:¬„ Û×ïÜÄ[ñðÌÉ%�m®Oïå =H]��³®‹쳈B=ƒ(”5™N^¹’Ÿ[ H$›Ù,`¬£-Î’£ÿ -s>û0‡Cãî3”‹]+°Š�Þ,¯ÓëÐnj¡âWð Ë Ë‹kx�ü8 ÍÖn×°kØÕéjì99Ð1¨šjÜ<ÄÄûáh4ùŽŠ™Ê¾Ïçt6rÁ­rH,ëÛ†RN¥œ*?gy'5}'u/™\zrÕ…Ýï™õ&½‰îûý‚ÙëɇîÃQSR**ö…Ø4%gã;Îàñi³7y75}7VV¦®J‰ß–´†/Q«äP ÕV¹[}–8i$>²Ê¿V é»qy7ðêAüGêŽ3³Ÿ6µúV…K§V³Ý«ÜÐ(sŠèYK¯Ñ¿\´b÷†UñKs—À"4}'Ž"ïdÀÙ¦3#§FN:@LÌúeRãeã1Ssq€=ý{¸ŽƇ9©6Fx=a4Ì`¡çP1(@©Q+õ;*û�8‘øÉÌÓk©Xj¡ÕЛ9f'PØÌVºŒï‚¹ÄOÖ>Àk�rÁì'ÍL¥ÓËðÃìK°Œº�`ž2¢'GbÈ Bv=x<ŠD)É7 �Ka‘‚j�QÊé7 ½V¯ ˆíÊzp‚Íbv \B6áâé&Â,·©�t= a|8„ÛÂqä×_§|ÉúlJK°?}nßãÚ¾/Óó« µÜ�¾AgÑ[ôFZµø¿Ùø2E•Œ¶‰áïbωƣaĺy:ÒIo:zgÍøŠ:ô_þ›çà¢Rn²YŸMöä¯áÂNaZZnZnRÕN@N`%íýÚûû õ%›u³ŽoãvSÒ³Ò³’+¶¢îÿWÿ1ý5 æÌjþ¢þ Âëb#¬ö– &vA�õâÆHÜÔ+8j뷬Ϧ®’½l/ëÛݚєìÚˆšŽåK´|.Hmê:=:¨#Üz«dˆº:B¨…²±Z­¯¤°2vf£J·ÎÏ!Y±çàŒïdbݼé¡·ç¾»dßkuèz#žó|ŽXÿ§²3�jëºÖ¸)늓‰[½iÒ×'’”¤}IœÆMš¶IÚ$Ží8°16`æ1HÌ!„$„Ð’�„ &� 1ŠÙvpl—8¶ÛÄnWë M§iÒá\|qóÖ•Àv†¾®þÅZâèêJë蜳÷ïû>}ô°†„£…)1Ù‰üØ -æÆ·ÁI,%ŒиáÇX+sÜ=!ì¿DÒçHˆ*JŒã&åÄ–D?Í*•ÕCÎáQœ -ÄùùdHŸöWó8dˆ2¿ˆ_Á›H ÌX¼vÕg}c�ªÁPß„põwX›"¾¨c¯›Ñ¼oÁŒÚ^‹ÜyAÜõHfjÕV�Ù 7è;´.@½núEV>ÔªåBDg­MЙÔ(!kWéòÑ/¦õ²šÏn,eâ{dŒn¤B.‘Šxòz¼[‹ïfÐãv~ã‰�`üd‰C>‚ÇØãÞBUÿõå÷º>-` V…T/ sîèÞ[Œ™1ȸ|ó.Ze½ºAmTëÁ¡¶úæŸöëó¯bcþ•£i½²Qƒð½>ÉX‹Úh‚fÔ Õ R…z@SWׄÞÄ�ÌYxÅÅ?2e‰,±§¤ÉÊ<Ë'¹¿†^°[ìÝöî&;ô"¶Û§UgO1Rx•Tš[Q\.)—ˆb(†Ê6†.í°a±ÚM3˜a!ÏÑ…þdì³ð¢ïû=Ù.i(�\ÖËòóþj -è!8…ë }‡ÑlÖè5íà‚Ó0R;Μ+žlà_ÿÉÐÐgǃ¤vSw’c)=‰œH)Ί«rgõ3¶S^οMë°Þ”ÍV}U6Ûí`i0´£¶· ó¸¡WkAýøÛD�Ñh±´ÙGúf jMJžL\º./sv÷99Á/™Ô3®ïÔµ‹ø‘Ï)@ÎGvæDC|Ijbu‹Ì"1[ Mù�ù¢RnaReú¡jµ¹ÞGuz¡ ÄÀûªÃã.hè4:;?´þªÑkÐYA£Ñ-­ÈéuÛ&Á -ͪÆêBieøÊæÁnF/ú´¤�zÐ@=ÿn ¾A…‘4[éà Ç׸ÞÑà ﰚі¶´á( 00wÚ»Ôu·‘žTË#Ç;r÷‡@~5WšPòlî¡4ž ¼TÎtöE‰EÐQÕ C]£ÎŠlWÛ—Zz]Kîþ @Á••.jËPÅ{/�z„ÚO„ÃE1qñ‰¼(ñôäZ�¿C£ò÷FÀä4ô£|„èÎ*›‚Xr{cádÏ›°×ö]x E¿O]„õŒy¬Þj]txF{:-†v˜�îØùJnebe¢$G"@™)y €’âÜã!ÁÔ¨äXÔ)êòrÜÔªä"•þ{Ÿg†L rÎÁ©…Å¿õ�ìzÓº‚Žá¢7¥u·áɺ|MäÂKŠm’ï#sÕñaâ*®Ã,ü*þþ–¢@žU•Œž¡ÿI°­²—lé'`.¬ !aQ!*+ˆÊ%âj ðA5\çÒŽ7Ì7/¡KøQßÓæêg:2¨ÐÔj«õ2m�±Ö =`k5vÙm|@1Q¸'š¾ç ú~zÏ‹ôÚߩޕ^¬øsá…L/R±Ø¹Eά–$H‡ŒŠL~� ?1oêÓýçG‡g¡:*› ÑsôoˆÊqŠ(›»;+› "�UVe[¥IˆŸŸÇ ¦uÒ>êaÀñ3}o¯ ⇤äx¬cÎ1g‡ †7›Œ³ô@øk¯ø`‚&ã@Ë,ü”èû¤é84ûéw)HdòRi†‚¯ÊJd\i,¨+R@�dy%±Àƒ£.î,S‹ÅJûpÒ~`$À{9—JI ›;-¦zèQ£²^Æ©PEL7}7pá-èÑÚ v„Ìên4X¥õ‚z+ËþþâÄe@ÆøÁ*Ä�µÂ-}.ïyÕÙ*;޲2Ë^[ ú/žL_e–ÚJóÝŽ,·”ËÝ{˜Ÿ-Ê–g«~võ»D�ɗ㳞õÁä?ÕÈkj%¢zãAb‡‰;Ë`o]r]Eìë †v�,0Ëu…ÈbŒÅ©UùPñ Æâ&ÆX\劊µäç³x3&QWƒ`±c~|Öãõ,X-ºzÆßh•™Dàw¿R¼7#"í ËÞ»ÑÚÕ 8(ŒH�L�ŒÍŒIjªå I½ÜRs\4�é‰ôD¶GÀA߸ÝÎ}§ÃŽG¿™ñvq�š9%[ÁdbP@µQ¢‹´Æ ¤zQÒ¬`}w�¿GoÆDè, -ŽÎŸ/P«Ü‚ñÕ_þ‘ý uå$�õÍ»g½HÜI¤ed•åƒDzAÃvWt+B\fö+eéåéâtÔ%&Zg;GzìííÝ ýŒÂ¹¦]�pövÒbkë´u R3Ï�K‰=‚ØÃj±ºä Ðæè“»Ï­M†8 z­ @(T1çþSY›Ð)î•ÚP~‘’Ìã -ó›k,^!Ø}®Ü~q/\„sƒgϺ=í'à"xkæäÇ{¸Ö¢î„>hÓ53Á1RG�€zz=3äoçqýlž“~5^g1e2eò¨- b ±4# ~ƒ` ¾Ik÷A�óub ~¼xÛ^ã S «Í‘ÓÄDä$�Ek64ô�·{aœÂž”Vž)½)ý©Þ -M½„;.â%*ŒÜûxG9˜¿vÂã§_þÞ‚eÇâÉÅ“ö7á\Û{þ1@—éûI(VæT% ~–u(.·¨¼X^G Ï 'àõA¼É64rrÜ1 h±—Q3Ñ^¾ºá¿]ÔVW u¾™übÓõ¾øâ³¿º¿ØÈü‹/¾¸;ÌȪ1ØB¨± °êšŒ³Õaœnún}—ÒˆpÈÍ"£DW"k[é«”šP4TéÅŒg1ÍÉò@g­¾F£Ö(AŽÖ,_« îZ¯ b€g”ZåÌGeE?Uâ˜ÁwQ\wÀ(¾sþˆãŒdd·;=uíí0Œ {²2‹ 2Ÿ{çðï8“0j²Ù;‡ê'4zh‚nDí «ÖlÔµ�u.ßmGEìQGhâ´(Í´e½´N©‘�­EíÊÞ¾—L[üëÊÝoés5�<ñqá û:^ Ùkv‰%ŸÃ¾ž————ß$±‡ôÚ{{CØ7 -ׄdÉ 9~ƒ³ðXûþp?e´éZÁ3YC1�Äì7ÑH˜RÅ|Wdúš� Çv©ßãÙ²¨P•+JQñ¾¢ÝÂHqªœÙ›b†2§a[š»Á;u„Ã,$!Áøï_BäbNÆ,¶ëúó~1ÄçÑ£¡œ§ êhA¼ð£iÓá8”�³Ï/Œ8{»0bü…Wf–;…¿¼)ŒøÿIÇWñ¼ø@?~bh‹ßñK¼?ƒYl5ÛEÚ$ á„iÀ6„s‚ÞßqšþßCtpÍÓ‰®R{ÿ@Ç¥VU]oý€¦ÐEWò‹!YAlïm�ý<Žï-[�KàíClA.Äÿ•3Íjo„®:‘lïã?’F§º&8€7á7ÍjQðÖjõ_ž€üm¼o¤ -ñdSTqÊ@]«”ì‹-õ·ð¦Ž¾“!.°ª,ª²òZÈÐÆÍý�Fõáô«/ÓA4¢øÓøIü¬#‡Q£P�C8Ü'çaáM8³Ø—¿¢F‰/IGjü‹}íkŸ«E¡/á»<�8„Ö’Æš~}_P‹Â(‘(äåœî *7È-ŒIQ#À�{q¨7àúÓ¸‚4ê62@亰–ý®ý nîdÁ|�I¡cD >rµ•FiKìMÈBkïßò¤®ÞÏæ��—%•¥eðÐ�ûo1Xê}VNV^Zq¢Z©f¶%_ïª :�©gÞ59é^^Xv-µ àGÖ3Ìt8ìøïbL…‘‰�\œ/�ʵÅüG“âZ‘² ÑßZÛKȲÕ5i ŒöÙÐÌ!Í0¯m^ld ––å«CÀ2Š·é¬íŽRœ†ÎÙ³SK6¦¢»uñg€T<ÒÝÎ;ÈTt™Ò„âgø‡¸|�¨TV -|Z¤vY‡²Œh§úÎV[¯­×ÖÝhcNî¹xb2Ÿ¡µ¤â�´ê:D露x'•Iø8šÎß”‚BYS…èÝkù~`Æ f•¦áÝk„®Ê 4û®¸0ˆû±’ô=W»qÅÝTQÓ ðYÔ|Üký¹;׸ôεÌ�+2Á‡àt èK“á(® MZ�L`ªÑË´aÖýƒa ‰nîdþ¼Ò¤Ðɾy2lg öºm½F u~$(cÚ™²ü(nBbZXäþ¬0’©j‰³L§4©–DËYK‘i®{”^f¨1A “�Ђ N­Uë‹'òÜ9ƒˆÚþ ÓÇ�ÞdŸwMN¸—–—¬ˆŽ}Ÿâ{Š&KJS‹2ùh­�•Ù—Ú•Ð6ÙæéêCÁà]Ý,\wK{Iz„Z½-ÄfÕo–^·XÿóvkŠÆñèÄ äÚB}èÁ¬YÉqöÚêÌêóäÚ¨¯ý'm¬îé‡ÖZ=“ÕÊN¥ZQ+cšeiu¥\)W -j3•TªJ*ÍÕ¶ê8«tuÆVôÎ$t¦:h™~|§RI¨TÕUrQööìna:ÿPÅ‹€èü=½움˜„”¨ª+K}iÈ*T¤•13ÃÌD"[Ñ"æuF_ÁÃ\�œ¥T×(ke’ør¾¨JTÅW&ú!¼ŽE„±_ @ø'¬c0¢l—"öõ~qsÄBEM”A…Aa�zÐk´Z½Yk„zÔŠ_‚ÂZ©p‚_ôŸCÖaœ‡Þ–­z;\ë‹®ËäB'p ¡o«c¾»íL<ªÀW¡†y­é~x÷Züþâ½°1²oŽÞM™Óso¢ÒÛ°ˆ4ùØl°·Ãì-þØÛ‰¯³·7 ïY\ôN ¤ÂÉLÈq³Ð -!˜ôŠÊ/øô׿+Ž F)”e çé‹„4YÉ´¦~2µý·ëËÅä²¹ˆf–‹Zén[_.*Jžå‡ss…"¦”Âx:õΆ Ôù¡mÖ›ë�ža@ÁÓàÆ.7ô§¡ïĽ«$‰ïd�ƒ)±�?�¦Ë0íXOüœúOãЙîmÆ—ãбürÐ8ôÊÅ�âzÄ¡ܙÂøêÜJq¥8Ožè9¬f Õ«Ýœ`ª¿jyÿ$¾¶œ0¹å�¡ë±­«¿¯"1ûèÄèDÇ",Ã’p!u"u"Ú»à`ÉѤÌÜÜì‚lÄÎÍÉrrû¢FÃ:vÂ~ˆ.NILIDÂ~k?âIô$Î1ùa+p²sv|¨¿ßÙãDlkú`¶‹�æS–o².3{BkÚPN_êDÌë¿úû¥…�lÙ@æ@fK -ÄÀ¶í/oÄÎ]»Œ/‘0VæÎà{gÂ_}èùÈ'!R­9C9Cåc0ƒ>8áNðªJº²kÿa%zn Þ!ž5D]Bt%qeû> -endobj - -4391 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /ZXCGTT+LibertinusSerif-Regular - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4393 0 R - /DW 0 - /W [0 0 500 1 1 375] ->> -endobj - -4392 0 obj -<< - /Length 9 - /Filter /FlateDecode ->> -stream -xœ;ÁÁ -endstream -endobj - -4393 0 obj -<< - /Type /FontDescriptor - /FontName /ZXCGTT+LibertinusSerif-Regular - /Flags 131078 - /FontBBox [0 0 500 698] - /ItalicAngle 0 - /Ascent 894 - /Descent -246 - /CapHeight 658 - /StemV 95.4 - /CIDSet 4392 0 R - /FontFile3 4395 0 R ->> -endobj - -4394 0 obj -<< - /Length 619 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -1 beginbfchar -<0001> <2023> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4395 0 obj -<< - /Length 344 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xœcd`aa`dd”ðÉLJ-*ÉÌ+-N-ÊLÓ JM/ÍI,ɹý�þ!ÓÍ#÷C–‡AŽ‹A¾»Bò°Ë<¯ý=EFBú×OVY†½ü² Œ\‚² ÿÿó(�„>ñ¨€¨W<ª ÌŒŒl|ÞŽ)ùI©ž)©y%™%•Îù•E™é% -–‘�¡‘®‘�‘‰BHFªÂY -EùY©É% -Ž¥%ùEÅz L Œ õÓ8Θ;ý»ÈÔu3VNeûÝ4�]Ž‹yÚÎnîõ\·¸oMâáý±O”¤¬‡‘Q¤§»»ä�Û4@Ä!!&FFß”Ðî½?^îcìÞûCe/s7Ë�ŽŸ~:Ønÿ•ýn÷}Òw»ß“Xÿ°ýØ+ -býñ¾W}Ÿ–cý3�ýwÌ÷ý¢¿í¾Odýþ‚�ï·ûýï{¯|ŸÃ|å¾è÷9ß5~Ïù®ÁÊRl†; -endstream -endobj - -4396 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /LCCCWY+DejaVuSansMono-Bold - /Encoding /Identity-H - /DescendantFonts [4397 0 R] - /ToUnicode 4400 0 R ->> -endobj - -4397 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /LCCCWY+DejaVuSansMono-Bold - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 4399 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 8 602.0508] ->> -endobj - -4398 0 obj -<< - /Length 10 - /Filter /FlateDecode ->> -stream -xœû߀€ -endstream -endobj - -4399 0 obj -<< - /Type /FontDescriptor - /FontName /LCCCWY+DejaVuSansMono-Bold - /Flags 131077 - /FontBBox [16.113281 -176.75781 602.0508 742.1875] - /ItalicAngle 0 - /Ascent 759.7656 - /Descent -240.23438 - /CapHeight 759.7656 - /StemV 168.6 - /CIDSet 4398 0 R - /FontFile2 4401 0 R ->> -endobj - -4400 0 obj -<< - /Length 717 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -8 beginbfchar -<0001> <0052> -<0002> <0045> -<0003> <004C> -<0004> <004F> -<0005> <0041> -<0006> <0044> -<0007> <0055> -<0008> <004E> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -4401 0 obj -<< - /Length 4326 - /Filter /FlateDecode ->> -stream -xœÍXypTÇ™ÿõû^Ï¥c B\bFBâÒÅpYâ‘‘YB— –4#F ‘�dÀ#„ÃÆì&)Åqâ‹d Ë^‡(ÁEùÊn²»®�ËèÖ[›¢â8Ù*…²¡dñØêî7ÒHȘÚìVv¦f¦ßëîß÷û~ß×Ýß0)衤åÁnß›•¯/ðÀo�íŒîYRº Ђ~´³}ëºïUß hC€Þ 7…lþ °¶X‰„›ìçØïëis"Ñî}–wµvÀú ÞöΖ&ý÷ü¿ë¿‹ëhÓ¾˜n¥�ëU¾Ž¦hø·9Öï60åÝXg¼•, ˜uÀ’XW8V½áùÅ@¶ Я³Å,—�e'pšù¾Âj° èc–Ëæ²\6�å2¶é©,`›9jöêÓè-–ËãšY. –+{›Hz*šÑ§§Òe4ã0NÓô˜ì¹ª�Ô>ÐNBcÀ)hx gñ3¼„§ñúq�åáÞcylžcÅ,W¡±b6ȬÍôêq§p?g`§™q|ïá2>Â>ÈŸÆ)>ÈùUìa:€Y–‹×š‹+¬ÃØÌ<Æ;øO-DÛèûl.XZµg´÷ôäû€+Ú6í€ö .ë°3øµÅ‹Sx Ï šîÁ´\¯Æu|ñš gh)?¡Þ,�ÙðÔVá€`ɯâ$•c?þÕzʒΊ­‡ø|ˆ8à>ý‰ÕÂuÒ -|®~-¯2ÔܰÕ÷‹FaÁ„KŸËêëG]Ú~ßÀÍ›u[õ¼±ŸÏì§<[¿ž—{ù‹:/TÕmõõ¿]Qn¢V3-®‘¡!‰V²X‚\fsµ½|ðóbcDÄiÛÍßè=ü*R0¹Á Kl -bÎŽ)]Yv¿'›ü©s³\#C#"^ŸH:,Çâve.,s»ò™ ~Üò[‹ì‰DötE"7evFLgvãÏÆˆqÃø³þ»ÏŒ?×>ûŒ¥²´Ï �bG�}Æ#Æ£Æ>vü€ÞÏ¡Á�׃wƒAçºÆu+×-œëÌAh rØÉas�#d�°‡)dçv›Õ"W…�Ïpd¥¸®UõÛªúîßúS8¼«qHÅü“‘¡¤p‹ˆÛdÔ—êNc 8E¬´V¢•XKlV0§¦“C_ÊVh+¬Kmqöu­—�ÔÞdçµôíØÎÈÏüÌO~òk‘'ØTãmÖÆ¾e\ÚfôÜo\ÒÿñƳ´gx!Ûcœzô>ܘœ‚˜=Äb.›ær€ûÓ²á´çx¤âîÒÒRÁ|èÚP‰L@·+?—)½ç3Ö_wöÛß>kc+Y»×¸`|Óx_ÿç‘{>fVÆÿ�9ŒÝFÜxQø²ëæoôV>73í” -f‰9»,ä±;SfkNÌòŒ9pMY–+Ó+½Ôíw»4¿OÛÅæv…Ã]lîŒkÆŸþ¨Í¥³#¶Ø¡C1º>RoüÊb^±Ó1ìô­|v4gZ™Æ4‹Õ’gÕ!·0«–¯Ï¶æc–#ᨠP ÔŒ�þKñiÌyãcl{0Õ¥1»e -;ÂŽYôíØžá—+‚¹ý{Ù*öÓ�Ÿ;Œ>øù{úªá…úªÏ߃8kµß=úÔ¯¿æ\ù'̶ÉMø£w^KüŽDG.ñK¶�`P�Š;¬Qc–ØwF¢Æu~I"%¿˜þ!"8ŒWpÛàÇ1ìþ"Ç1€‹,“=Éþ�ZPδk©Xˆ0,ÐàBPX¢×Øpˆ'ÇA`ºÀÀl3øpÁlk°á?Ì6a>5ÛzR›#‹¹Ì¶ùlžÙ¶!‡Õ˜í¬`1³�–‘ÏΘítD¼¿Âjt"†ýèBv"‚nø0-˜(A Çfì‡÷¢ ݈£]£ QÀ‡Jt Eð¡ íh‡õ£XqyFatáA„B(G»Ð„Íè�-ˆ  Ø)GúÐ$ñ}hC|ˆ¡ÍhGZàC�ˆ¢IöMÄi�(a=:Ñ�NÜ‹N´#ô¥ã|£#7K¦q´É¡Acù8„ÄüÄìÂ/°Ó*û• -ݦbB•nİÅ(FÈÿ zP„8:у.´ ,çvIEŠÐ�0º±& -¡P"R·FFô ÕŨf„ÑŽNìÅ|§ÿõE“ZV6Á7Žó­™æ@á_ðÖÿÙëûŸÛLEÌÅc¡YvÇN´~)áY�Ä‹J´±lTØÙ6ýÚ)­•?�Ó*{ãÖT„U6‰þn™ñbŽ˜33^YèD3ºÍ‹ÏNÓ—Séf·d1>Ç›Ð"ÇE3Ñb´â®2),×�Êàœ¤,É‘‘sCòWøÞ‰´¡ÉôOå` z•(‚k÷¨>­hC»™ÇóF9ŽYk_ðïÆ^3Ï…Å1MÄ�ºÐ‰z$Ï16!é�ˆXšÑ#ùŒéðźСíè‘(J“½2"rÍw›Êˆx�÷(�?–áñQ¶=R¤舶Ðe,Öcë7Žˆ¼3™£~Ë}Ç'‘ÕzPØm¦ªã£{¯Ê)¶*Ï”‡ã³nÌ£½R�èYH¬†V¹gv˜ªQh"S„'�’M\*± a´H<5&9�ÛÍ]2!á¹ð m4q¬�«s£9« Íè”;ÃX ’÷¢1nÝ ÄÉ!pE–ÅÇ�M¬•ؤ{@ò<á•XÛ*RbŸŸkJ µ“7Ý&žYí"öQù;¶ÜI,º±_òm•»€À.§Ôíæ -Mö�òÖ…æb-'v4Á]äi×èÅThšðRÄ39ëç—°¢ôêA»¼óHÌÊî4³Pù»íÒ›ˆy¯+iÞ)&ñQõ‰©OÉ{\h\† O'gp{&ãíMÔe2ŽJÅiIxòÅ»ºŠ’øü¢ãpw⣙™X7O‘°¹ß Æc–öJ¯Br~Î$çbΨßgˆñ‰S7')ÛÔÚ©žpÎ]ÔÙ”à*²¡=)¢m“(Æ>©³ÊÞ&Ä3O1±úÅi“˜‘Åùö+FÄQô‰ß¸ÉQع]¾(ï&ÛÃEo�5^áœÛÖ+9ãbø?]³q³þUgöتK¬(QA¨µ'Î%u¾LDsZ°MrŒ@V碪Ï'Öÿ;Ö{¥*-¥¢8[G•Z‡ -i§5Ø(íÔb 6b ÊP/û*ÑêP�ZlF%ÊQ�r—2Ù#úsäjÜ‚J‰X‹MKaÔ£Lb7Â'±E¥Z#¯ªP‰”˹Ø*mT A¢Ö¢^b¯GªQ)mª³«Q�M(—íµ²UöjP+Åøõ’‹bºµIVdzÈ £ÌÖ£õX�ufoîE¥Äü…ý5²]3Ês�É´Lj$�æjlBµ¼w7¡u¨EƒÔS —›lk¤kPoúR!¨H(F«Q‹:4Êk±% ai£9R\o”þˆÈ¬—V«ä]Ŭ֌²h�¡ˆçaSñúoµÜ ý¯FµÔVøÛ -T  ëGq¹³V"ÞJ�MÒ?Á¯Rz(0DŸPQèY=:²>)*"¦e2n‚¹˜/<Š4LêIm|t&ËŽ„�%â&”ª–£P‡ -¬–HêŽÊÇJéëjS[…©ò^å„«8‰øÔÈÈnÀ&s„›è…Z!‚ÿ˜*eæ÷ê$ÍÆ¢/ç‘Í"ËnUE¬?ÁDŒY ®*ˆQRÌÕzQ6qÜdægbåÕLÐ7±ŽãîdïPX Ûã#(ô:)†j'©¹#\µwU`ŸÜ÷b湿åäN®ǪÒäú³ i¯M®Ô.¼VŽ�N7vWíÏêÌ{æI®á&;¹OɪßDõ¡önõl”\ý†d�®jÁøhU¢Î�ÎÑÊDTÿªbH<µˆ§Aq¾ŒÞ‹K»Ê3eëV,U_ŠqÊZ|5owBM|B\„Fy¯l‹ÿ’TÅÐ$Lj±âþCžŠ•wƒ„/_¦¿¸—§¨¨Eۤ¢ž,2q»FŸÏÆ4 -¨·¢¢>–}mÅ-u¨Ð`gsñ|§j QW›Ž¿àÿµb©÷n´¡Xrs÷¡HVá1O¨(Åÿùòuóaܯþ=žðÿì.Å<#€9˜‹»°h@ë v_0èüyúÙyúé0ýd˜Îýx-?wž~¼–Þ Ðß÷Ñz=Dý}ôÚÙ þÚn:›A—A?2èÌ«iüÌ0½šF¯¼ü$Å WÞÖ_~©‘¿ü$½Ü«¿ôÃ|þR#½Ô˜O§ úA€NM¡_XË_4èÅ�›oê/<_Æ_XKÏ—ÑsÏøs»éÙ}ß ï Ó3Ãô]ƒžöÐwò¨/‹¾eÐ7 ú[ƒþÆ “a?y�ž:áåOeÒ‰']ü„—žtÑ­Ùü‰O¥cGÏóc=²�=OG{õ#ßÈãG¶Ó‘ þ�<:ü¸“žF�;é±>zÔ GÂ.þH€zeðÞÊ ‡ûè`ˆ¾Þ@Z³ù�=vñ‡´?‹öµfó}!ÚkЃuÇÓx<�ºöñ.ƒöQ¬5›ÇRguDÏóƒ¢íÛyôDÕUt_e¿¯�*3hÝ0­¦5©¢<ƒW¤ò Z�EeétO€¾â¦U+Óù*ƒVÞ�ÂW¦ÓÝ)´¢t*_ÑG¥w¥ðÒ©TÚ«ß•Bwõå˲øòå´¬Ð×eÑÒ%Y|i-YìåK²h±—‹²x D‹ -=|Q•g3yI9gQQ¡‡eSa�›z¨p@ ízÁB'/pSÁ€† ]_¸ �/tÒÂövЮ/°8ø‚tZ0Àzƒ[ôùU4ÏIs«(NÏŸCys²x^Í�‡ÏÉ¢\/åÌôòœù}K¸ÿ+䃇û–Ðì^>{:eÏðòlƒfÍôòYšé¥Ó3ø /ÍkîOŸææÓ3hºâ4ÍæäÓÜ4MpÚ¢gyijeÂÃ3ûhÊrò.§ –Í3†É ·+ÀÝÃ䂇»äLßÊ�)ž¾•ÒlNž–M©)NžšM)NrÀÃmÖTns’Myhµ8¸5•¬ÂC»návnq�e€ßÔ¹�øCpš®÷iiœ²IK#gÙ±:|‚-üýÂ_Ñö¬ÿ¼]À -endstream -endobj - -4402 0 obj -[/ICCBased 4404 0 R] -endobj - -4403 0 obj -[/ICCBased 4405 0 R] -endobj - -4404 0 obj -<< - /Length 258 - /N 1 - /Range [0 1] - /Filter /FlateDecode ->> -stream -xœu�±JÃPFOŒµUªv¬DœD@¤`]\Ú -F§ëMkŠIˆ¹‘RŸB|êê&Ø¥Žn‚ऋ¸º(¸H¹rëTųüË9ð`ù� Õ¨a”&åʺ»ãî:Ùl -Œ3Ŭ�*ÞªnÔ”h)™&C|>b™û°ä‹ÈëÞìçº�«é»“æõAçívØýCÆ«+ ô€y')ð -̵Ò8+¤/<°ŠÀâa­RkpÂàØ´óA¾mWÓQ”Ihÿ㌠œ%–Álþ½E5VW~ªüdžµþX€ì)ôÏ´þ:׺öôŽb‘ˆ�k#�&¼_¤ 3÷0±÷ ØIì -endstream -endobj - -4405 0 obj -<< - /Length 314 - /N 3 - /Range [0 1 0 1 0 1] - /Filter /FlateDecode ->> -stream -xœ}�¿KqÆ?×U–X 94%MQKS�†Nø#Ô¦óüQ vÝ÷BšË¡©hˆFk ¢ÙÆú‚ ! -¢­Õ †’‹¯ZPÏò~xx^Þ—”ç¼QÝжùµx"©¹^PñÒÏ cº!ÌåH0 - ô’0l+ϽߣÈy7½®Ó;¯×«É¥º;QŽ?V.ø_îtFÀà3LËEÆK¶)y ðëz”80eÅIPö¤Ÿkñ‰äT‹/%[Ñp” å:8ÕÁ…ü¶¼+%¿÷dбÐŒ"ÂÿG¦·™ `d_¿{Ù¹ÙÖ–gzžçm\‡Ð8rœÏSÇiœ�úµ­öþfæë ´½Ô1\íÃÈCÛóU`¨ ÕS·ô¦¥]Ù ¨ŸÃ@†oÁ½ö ãâ_± -endstream -endobj - -4406 0 obj -[4743 0 R /XYZ 70.86614 563.1574 0] -endobj - -4407 0 obj -[4743 0 R /XYZ 70.86614 227.6214 0] -endobj - -4408 0 obj -[4756 0 R /XYZ 70.86614 473.5624 0] -endobj - -4409 0 obj -[4756 0 R /XYZ 70.86614 189.85742 0] -endobj - -4410 0 obj -[4743 0 R /XYZ 70.86614 270.0724 0] -endobj - -4411 0 obj -[4769 0 R /XYZ 70.86614 546.0924 0] -endobj - -4412 0 obj -[4743 0 R /XYZ 70.86614 751.3704 0] -endobj - -4413 0 obj -[4787 0 R /XYZ 70.86614 660.6094 0] -endobj - -4414 0 obj -[4787 0 R /XYZ 70.86614 224.9267 0] -endobj - -4415 0 obj -[4799 0 R /XYZ 70.86614 484.6444 0] -endobj - -4416 0 obj -[4787 0 R /XYZ 70.86614 766.8504 0] -endobj - -4417 0 obj -[4803 0 R /XYZ 70.86614 438.3524 0] -endobj - -4418 0 obj -[4808 0 R /XYZ 70.86614 766.8504 0] -endobj - -4419 0 obj -[4803 0 R /XYZ 70.86614 592.29944 0] -endobj - -4420 0 obj -[4817 0 R /XYZ 70.86614 651.1064 0] -endobj - -4421 0 obj -[4817 0 R /XYZ 70.86614 149.31738 0] -endobj - -4422 0 obj -[4820 0 R /XYZ 70.86614 212.80957 0] -endobj - -4423 0 obj -[4812 0 R /XYZ 70.86614 162.83142 0] -endobj - -4424 0 obj -[4829 0 R /XYZ 70.86614 141.41962 0] -endobj - -4425 0 obj -[4836 0 R /XYZ 70.86614 326.0504 0] -endobj - -4426 0 obj -[4840 0 R /XYZ 70.86614 193.52795 0] -endobj - -4427 0 obj -[4844 0 R /XYZ 70.86614 367.3716 0] -endobj - -4428 0 obj -[4829 0 R /XYZ 70.86614 554.3584 0] -endobj - -4429 0 obj -[4848 0 R /XYZ 70.86614 358.31302 0] -endobj - -4430 0 obj -[4852 0 R /XYZ 70.86614 403.732 0] -endobj - -4431 0 obj -[4848 0 R /XYZ 70.86614 443.95 0] -endobj - -4432 0 obj -[4803 0 R /XYZ 70.86614 766.8504 0] -endobj - -4433 0 obj -[4874 0 R /XYZ 70.86614 461.0124 0] -endobj - -4434 0 obj -[4884 0 R /XYZ 70.86614 442.8364 0] -endobj - -4435 0 obj -[4899 0 R /XYZ 70.86614 266.8504 0] -endobj - -4436 0 obj -[4917 0 R /XYZ 70.86614 483.2844 0] -endobj - -4437 0 obj -[4864 0 R /XYZ 70.86614 344.5394 0] -endobj - -4438 0 obj -[4921 0 R /XYZ 70.86614 562.8894 0] -endobj - -4439 0 obj -[4925 0 R /XYZ 70.86614 644.3064 0] -endobj - -4440 0 obj -[4921 0 R /XYZ 70.86614 703.17444 0] -endobj - -4441 0 obj -[4941 0 R /XYZ 70.86614 614.0324 0] -endobj - -4442 0 obj -[4864 0 R /XYZ 70.86614 519.0904 0] -endobj - -4443 0 obj -[4947 0 R /XYZ 70.86614 460.6354 0] -endobj - -4444 0 obj -[4956 0 R /XYZ 70.86614 573.4164 0] -endobj - -4445 0 obj -[4973 0 R /XYZ 70.86614 703.17444 0] -endobj - -4446 0 obj -[4976 0 R /XYZ 70.86614 689.5124 0] -endobj - -4447 0 obj -[4976 0 R /XYZ 70.86614 171.0354 0] -endobj - -4448 0 obj -[4947 0 R /XYZ 70.86614 566.8764 0] -endobj - -4449 0 obj -[4998 0 R /XYZ 70.86614 687.9334 0] -endobj - -4450 0 obj -[5009 0 R /XYZ 70.86614 716.8364 0] -endobj - -4451 0 obj -[5009 0 R /XYZ 70.86614 150.51141 0] -endobj - -4452 0 obj -[5053 0 R /XYZ 70.86614 593.8784 0] -endobj - -4453 0 obj -[4998 0 R /XYZ 70.86614 766.8504 0] -endobj - -4454 0 obj -[5066 0 R /XYZ 70.86614 682.9724 0] -endobj - -4455 0 obj -[5066 0 R /XYZ 70.86614 331.1374 0] -endobj - -4456 0 obj -[5066 0 R /XYZ 70.86614 302.23438 0] -endobj - -4457 0 obj -[5066 0 R /XYZ 70.86614 268.1104 0] -endobj - -4458 0 obj -[5066 0 R /XYZ 70.86614 233.98639 0] -endobj - -4459 0 obj -[5066 0 R /XYZ 70.86614 199.86243 0] -endobj - -4460 0 obj -[5066 0 R /XYZ 70.86614 179.40039 0] -endobj - -4461 0 obj -[4756 0 R /XYZ 70.86614 101.267395 0] -endobj - -4462 0 obj -[5066 0 R /XYZ 70.86614 117.95239 0] -endobj - -4463 0 obj -[5095 0 R /XYZ 70.86614 766.8504 0] -endobj - -4464 0 obj -[5095 0 R /XYZ 70.86614 684.9404 0] -endobj - -4465 0 obj -[5095 0 R /XYZ 70.86614 650.8164 0] -endobj - -4466 0 obj -[5095 0 R /XYZ 70.86614 616.6924 0] -endobj - -4467 0 obj -[5095 0 R /XYZ 70.86614 582.56836 0] -endobj - -4468 0 obj -[5095 0 R /XYZ 70.86614 534.7824 0] -endobj - -4469 0 obj -[4756 0 R /XYZ 188.99736 745.5764 0] -endobj - -4470 0 obj -[5095 0 R /XYZ 70.86614 486.9964 0] -endobj - -4471 0 obj -[5095 0 R /XYZ 70.86614 452.8724 0] -endobj - -4472 0 obj -[5095 0 R /XYZ 70.86614 418.7484 0] -endobj - -4473 0 obj -[5095 0 R /XYZ 70.86614 370.9624 0] -endobj - -4474 0 obj -[5095 0 R /XYZ 70.86614 309.5144 0] -endobj - -4475 0 obj -[5095 0 R /XYZ 70.86614 248.0664 0] -endobj - -4476 0 obj -[5095 0 R /XYZ 70.86614 213.94238 0] -endobj - -4477 0 obj -[5095 0 R /XYZ 70.86614 193.48041 0] -endobj - -4478 0 obj -[5095 0 R /XYZ 70.86614 132.03241 0] -endobj - -4479 0 obj -[5127 0 R /XYZ 70.86614 766.8504 0] -endobj - -4480 0 obj -[5127 0 R /XYZ 70.86614 719.0644 0] -endobj - -4481 0 obj -[5127 0 R /XYZ 70.86614 671.2784 0] -endobj - -4482 0 obj -[5127 0 R /XYZ 70.86614 623.49243 0] -endobj - -4483 0 obj -[5127 0 R /XYZ 70.86614 575.7064 0] -endobj - -4484 0 obj -[5127 0 R /XYZ 70.86614 514.2584 0] -endobj - -4485 0 obj -[5127 0 R /XYZ 70.86614 466.4724 0] -endobj - -4486 0 obj -[5127 0 R /XYZ 70.86614 432.3484 0] -endobj - -4487 0 obj -[5127 0 R /XYZ 70.86614 370.9004 0] -endobj - -4488 0 obj -[5127 0 R /XYZ 70.86614 336.7764 0] -endobj - -4489 0 obj -[5127 0 R /XYZ 70.86614 275.32843 0] -endobj - -4490 0 obj -[5127 0 R /XYZ 70.86614 227.54242 0] -endobj - -4491 0 obj -[5127 0 R /XYZ 70.86614 166.09442 0] -endobj - -4492 0 obj -[5127 0 R /XYZ 70.86614 131.9704 0] -endobj - -4493 0 obj -[5155 0 R /XYZ 70.86614 766.8504 0] -endobj - -4494 0 obj -[4806 0 R /XYZ 70.86614 408.4204 0] -endobj - -4495 0 obj -[5155 0 R /XYZ 70.86614 719.0644 0] -endobj - -4496 0 obj -[5155 0 R /XYZ 70.86614 684.9404 0] -endobj - -4497 0 obj -[4829 0 R /XYZ 70.86614 211.88239 0] -endobj - -4498 0 obj -[4806 0 R /XYZ 70.86614 322.02838 0] -endobj - -4499 0 obj -[4808 0 R /XYZ 70.86614 259.5064 0] -endobj - -4500 0 obj -[5155 0 R /XYZ 70.86614 650.8164 0] -endobj - -4501 0 obj -[4840 0 R /XYZ 70.86614 436.0584 0] -endobj - -4502 0 obj -[5155 0 R /XYZ 70.86614 589.3684 0] -endobj - -4503 0 obj -[4844 0 R /XYZ 70.86614 551.676 0] -endobj - -4504 0 obj -[4848 0 R /XYZ 70.86614 766.8504 0] -endobj - -4505 0 obj -[4874 0 R /XYZ 70.86614 766.8504 0] -endobj - -4506 0 obj -[4852 0 R /XYZ 70.86614 530.7204 0] -endobj - -4507 0 obj -[4840 0 R /XYZ 70.86614 690.6024 0] -endobj - -4508 0 obj -[4874 0 R /XYZ 70.86614 273.1394 0] -endobj - -4509 0 obj -[4836 0 R /XYZ 70.86614 249.72339 0] -endobj - -4510 0 obj -[4836 0 R /XYZ 70.86614 626.2924 0] -endobj - -4511 0 obj -[4884 0 R /XYZ 70.86614 166.1914 0] -endobj - -4512 0 obj -[4899 0 R /XYZ 70.86614 531.0484 0] -endobj - -4513 0 obj -[4820 0 R /XYZ 70.86614 481.9704 0] -endobj - -4514 0 obj -[4822 0 R /XYZ 70.86614 552.6725 0] -endobj - -4515 0 obj -[4822 0 R /XYZ 70.86614 114.11548 0] -endobj - -4516 0 obj -[4905 0 R /XYZ 70.86614 733.27637 0] -endobj - -4517 0 obj -[4905 0 R /XYZ 84.86614 575.9684 0] -endobj - -4518 0 obj -[4905 0 R /XYZ 84.86614 676.9084 0] -endobj - -4519 0 obj -[4905 0 R /XYZ 70.86614 397.0664 0] -endobj - -4520 0 obj -[4905 0 R /XYZ 70.86614 133.45135 0] -endobj - -4521 0 obj -[4905 0 R /XYZ 460.86523 491.3384 0] -endobj - -4522 0 obj -[4917 0 R /XYZ 70.86614 356.8594 0] -endobj - -4523 0 obj -[5155 0 R /XYZ 70.86614 541.5824 0] -endobj - -4524 0 obj -[5155 0 R /XYZ 70.86614 507.4584 0] -endobj - -4525 0 obj -[4929 0 R /XYZ 70.86614 111.99536 0] -endobj - -4526 0 obj -[4929 0 R /XYZ 215.36813 305.1084 0] -endobj - -4527 0 obj -[4941 0 R /XYZ 70.86614 123.72339 0] -endobj - -4528 0 obj -[4941 0 R /XYZ 70.86614 101.267395 0] -endobj - -4529 0 obj -[4941 0 R /XYZ 424.47882 581.8794 0] -endobj - -4530 0 obj -[4941 0 R /XYZ 448.44293 568.2174 0] -endobj - -4531 0 obj -[5155 0 R /XYZ 70.86614 486.9964 0] -endobj - -4532 0 obj -[5155 0 R /XYZ 70.86614 466.5344 0] -endobj - -4533 0 obj -[5155 0 R /XYZ 70.86614 418.7484 0] -endobj - -4534 0 obj -[5155 0 R /XYZ 70.86614 370.9624 0] -endobj - -4535 0 obj -[5155 0 R /XYZ 70.86614 309.5144 0] -endobj - -4536 0 obj -[5155 0 R /XYZ 70.86614 241.26642 0] -endobj - -4537 0 obj -[4822 0 R /XYZ 70.86614 260.2793 0] -endobj - -4538 0 obj -[5155 0 R /XYZ 70.86614 207.1424 0] -endobj - -4539 0 obj -[5155 0 R /XYZ 70.86614 159.35638 0] -endobj - -4540 0 obj -[4973 0 R /XYZ 70.86614 111.99536 0] -endobj - -4541 0 obj -[5189 0 R /XYZ 70.86614 766.8504 0] -endobj - -4542 0 obj -[5189 0 R /XYZ 70.86614 732.7264 0] -endobj - -4543 0 obj -[5189 0 R /XYZ 70.86614 684.9404 0] -endobj - -4544 0 obj -[5189 0 R /XYZ 70.86614 650.8164 0] -endobj - -4545 0 obj -[5189 0 R /XYZ 70.86614 603.0304 0] -endobj - -4546 0 obj -[5189 0 R /XYZ 70.86614 568.9064 0] -endobj - -4547 0 obj -[5189 0 R /XYZ 70.86614 521.12036 0] -endobj - -4548 0 obj -[5189 0 R /XYZ 70.86614 486.9964 0] -endobj - -4549 0 obj -[5189 0 R /XYZ 70.86614 439.2104 0] -endobj - -4550 0 obj -[5189 0 R /XYZ 70.86614 377.7624 0] -endobj - -4551 0 obj -[4973 0 R /XYZ 246.03696 507.1394 0] -endobj - -4552 0 obj -[5189 0 R /XYZ 70.86614 329.9764 0] -endobj - -4553 0 obj -[5189 0 R /XYZ 70.86614 295.85242 0] -endobj - -4554 0 obj -[5189 0 R /XYZ 70.86614 248.0664 0] -endobj - -4555 0 obj -[5189 0 R /XYZ 70.86614 186.61841 0] -endobj - -4556 0 obj -[5189 0 R /XYZ 70.86614 138.8324 0] -endobj - -4557 0 obj -[5221 0 R /XYZ 70.86614 766.8504 0] -endobj - -4558 0 obj -[5221 0 R /XYZ 70.86614 732.7264 0] -endobj - -4559 0 obj -[5221 0 R /XYZ 70.86614 698.6024 0] -endobj - -4560 0 obj -[5221 0 R /XYZ 70.86614 650.8164 0] -endobj - -4561 0 obj -[5221 0 R /XYZ 70.86614 603.0304 0] -endobj - -4562 0 obj -[5221 0 R /XYZ 70.86614 568.9064 0] -endobj - -4563 0 obj -[5221 0 R /XYZ 70.86614 507.4584 0] -endobj - -4564 0 obj -[5221 0 R /XYZ 70.86614 459.6724 0] -endobj - -4565 0 obj -[5221 0 R /XYZ 70.86614 411.8864 0] -endobj - -4566 0 obj -[5221 0 R /XYZ 70.86614 364.1004 0] -endobj - -4567 0 obj -[5221 0 R /XYZ 70.86614 316.3144 0] -endobj - -4568 0 obj -[5221 0 R /XYZ 70.86614 282.19043 0] -endobj - -4569 0 obj -[5221 0 R /XYZ 70.86614 234.40442 0] -endobj - -4570 0 obj -[5221 0 R /XYZ 70.86614 186.61841 0] -endobj - -4571 0 obj -[5221 0 R /XYZ 70.86614 138.8324 0] -endobj - -4572 0 obj -[5251 0 R /XYZ 70.86614 732.7264 0] -endobj - -4573 0 obj -[5251 0 R /XYZ 70.86614 684.9404 0] -endobj - -4574 0 obj -[5251 0 R /XYZ 70.86614 637.1544 0] -endobj - -4575 0 obj -[5251 0 R /XYZ 70.86614 589.3684 0] -endobj - -4576 0 obj -[5251 0 R /XYZ 70.86614 527.9204 0] -endobj - -4577 0 obj -[5251 0 R /XYZ 70.86614 480.1344 0] -endobj - -4578 0 obj -[5251 0 R /XYZ 70.86614 432.3484 0] -endobj - -4579 0 obj -[5251 0 R /XYZ 70.86614 398.2244 0] -endobj - -4580 0 obj -[5251 0 R /XYZ 70.86614 364.1004 0] -endobj - -4581 0 obj -[5251 0 R /XYZ 70.86614 343.6384 0] -endobj - -4582 0 obj -[5251 0 R /XYZ 70.86614 309.5144 0] -endobj - -4583 0 obj -[5251 0 R /XYZ 70.86614 261.7284 0] -endobj - -4584 0 obj -[5251 0 R /XYZ 70.86614 213.94238 0] -endobj - -4585 0 obj -[5251 0 R /XYZ 70.86614 166.15637 0] -endobj - -4586 0 obj -[5251 0 R /XYZ 70.86614 132.03241 0] -endobj - -4587 0 obj -[5270 0 R /XYZ 70.86614 766.8504 0] -endobj - -4588 0 obj -[5270 0 R /XYZ 70.86614 705.4024 0] -endobj - -4589 0 obj -[5270 0 R /XYZ 70.86614 684.9404 0] -endobj - -4590 0 obj -[5270 0 R /XYZ 70.86614 664.4784 0] -endobj - -4591 0 obj -[5270 0 R /XYZ 70.86614 616.6924 0] -endobj - -4592 0 obj -[5270 0 R /XYZ 70.86614 568.9064 0] -endobj - -4593 0 obj -[5270 0 R /XYZ 70.86614 521.12036 0] -endobj - -4594 0 obj -[5270 0 R /XYZ 70.86614 473.3344 0] -endobj - -4595 0 obj -[5270 0 R /XYZ 70.86614 425.5484 0] -endobj - -4596 0 obj -[4743 0 R /XYZ 178.1254 701.1934 0] -endobj - -4597 0 obj -[4743 0 R /XYZ 423.09903 660.2074 0] -endobj - -4598 0 obj -[4743 0 R /XYZ 382.28867 632.8834 0] -endobj - -4599 0 obj -[4743 0 R /XYZ 508.94345 367.1224 0] -endobj - -4600 0 obj -[4743 0 R /XYZ 153.22902 353.4604 0] -endobj - -4601 0 obj -[4756 0 R /XYZ 524.4094 513.3844 0] -endobj - -4602 0 obj -[4756 0 R /XYZ 317.62296 441.4094 0] -endobj - -4603 0 obj -[4756 0 R /XYZ 125.0658 427.7474 0] -endobj - -4604 0 obj -[4756 0 R /XYZ 465.35275 414.0854 0] -endobj - -4605 0 obj -[4756 0 R /XYZ 278.04752 400.4234 0] -endobj - -4606 0 obj -[4756 0 R /XYZ 238.44057 359.4374 0] -endobj - -4607 0 obj -[4769 0 R /XYZ 219.96544 670.46643 0] -endobj - -4608 0 obj -[4769 0 R /XYZ 107.44759 486.6154 0] -endobj - -4609 0 obj -[4769 0 R /XYZ 237.97284 486.6154 0] -endobj - -4610 0 obj -[4787 0 R /XYZ 293.1822 628.4564 0] -endobj - -4611 0 obj -[4787 0 R /XYZ 408.30182 530.1707 0] -endobj - -4612 0 obj -[4787 0 R /XYZ 108.7478 468.7227 0] -endobj - -4613 0 obj -[4787 0 R /XYZ 270.1342 407.2747 0] -endobj - -4614 0 obj -[4787 0 R /XYZ 167.72777 352.6267 0] -endobj - -4615 0 obj -[4787 0 R /XYZ 210.38522 267.32867 0] -endobj - -4616 0 obj -[4787 0 R /XYZ 355.5598 267.32867 0] -endobj - -4617 0 obj -[4787 0 R /XYZ 412.81937 267.32867 0] -endobj - -4618 0 obj -[4787 0 R /XYZ 503.99344 267.32867 0] -endobj - -4619 0 obj -[4787 0 R /XYZ 235.28406 192.77368 0] -endobj - -4620 0 obj -[4799 0 R /XYZ 363.59082 711.4524 0] -endobj - -4621 0 obj -[4799 0 R /XYZ 322.45868 581.6944 0] -endobj - -4622 0 obj -[4799 0 R /XYZ 211.09238 527.0464 0] -endobj - -4623 0 obj -[4799 0 R /XYZ 381.96036 527.0464 0] -endobj - -4624 0 obj -[4799 0 R /XYZ 153.25615 513.3844 0] -endobj - -4625 0 obj -[4803 0 R /XYZ 317.83813 194.46942 0] -endobj - -4626 0 obj -[4817 0 R /XYZ 317.01538 618.95337 0] -endobj - -4627 0 obj -[4836 0 R /XYZ 168.51923 670.46643 0] -endobj - -4628 0 obj -[4840 0 R /XYZ 292.8334 462.5704 0] -endobj - -4629 0 obj -[4925 0 R /XYZ 355.30414 530.1814 0] -endobj - -4630 0 obj -[4925 0 R /XYZ 414.00015 530.1814 0] -endobj - -4631 0 obj -[4947 0 R /XYZ 291.5864 428.4824 0] -endobj - -4632 0 obj -[4947 0 R /XYZ 168.92632 107.51837 0] -endobj - -4633 0 obj -[4956 0 R /XYZ 524.4094 684.1284 0] -endobj - -4634 0 obj -[4956 0 R /XYZ 321.3684 425.1674 0] -endobj - -4635 0 obj -[4956 0 R /XYZ 145.59686 124.665405 0] -endobj - -4636 0 obj -[4956 0 R /XYZ 120.04367 111.00342 0] -endobj - -4637 0 obj -[4973 0 R /XYZ 310.54578 479.8154 0] -endobj - -4638 0 obj -[4973 0 R /XYZ 481.62567 302.27142 0] -endobj - -4639 0 obj -[4973 0 R /XYZ 136.55405 288.60938 0] -endobj - -4640 0 obj -[4973 0 R /XYZ 246.84358 274.9474 0] -endobj - -4641 0 obj -[4973 0 R /XYZ 443.16983 274.9474 0] -endobj - -4642 0 obj -[4973 0 R /XYZ 393.09418 199.8374 0] -endobj - -4643 0 obj -[4973 0 R /XYZ 162.6677 186.17542 0] -endobj - -4644 0 obj -[4973 0 R /XYZ 395.751 186.17542 0] -endobj - -4645 0 obj -[4973 0 R /XYZ 178.73436 138.3894 0] -endobj - -4646 0 obj -[4976 0 R /XYZ 238.37125 745.5764 0] -endobj - -4647 0 obj -[4985 0 R /XYZ 209.40015 656.8044 0] -endobj - -4648 0 obj -[4985 0 R /XYZ 443.829 533.9084 0] -endobj - -4649 0 obj -[4985 0 R /XYZ 209.55678 411.0124 0] -endobj - -4650 0 obj -[4985 0 R /XYZ 122.979576 226.60638 0] -endobj - -4651 0 obj -[4985 0 R /XYZ 292.35217 185.62042 0] -endobj - -4652 0 obj -[4985 0 R /XYZ 398.23715 171.95837 0] -endobj - -4653 0 obj -[4998 0 R /XYZ 334.1413 567.0084 0] -endobj - -4654 0 obj -[4998 0 R /XYZ 414.36783 539.6844 0] -endobj - -4655 0 obj -[4998 0 R /XYZ 240.69826 355.2784 0] -endobj - -4656 0 obj -[4998 0 R /XYZ 390.9383 211.8584 0] -endobj - -4657 0 obj -[4998 0 R /XYZ 355.56662 157.21039 0] -endobj - -4658 0 obj -[4998 0 R /XYZ 524.4094 157.21039 0] -endobj - -4659 0 obj -[5009 0 R /XYZ 283.5666 636.8974 0] -endobj - -4660 0 obj -[5009 0 R /XYZ 111.38758 595.9114 0] -endobj - -4661 0 obj -[5009 0 R /XYZ 272.62112 397.8434 0] -endobj - -4662 0 obj -[5009 0 R /XYZ 219.68813 206.57538 0] -endobj - -4663 0 obj -[5029 0 R /XYZ 239.16399 615.8184 0] -endobj - -4664 0 obj -[5029 0 R /XYZ 112.72849 602.1564 0] -endobj - -4665 0 obj -[5029 0 R /XYZ 276.56262 602.1564 0] -endobj - -4666 0 obj -[5029 0 R /XYZ 503.99344 574.8324 0] -endobj - -4667 0 obj -[5029 0 R /XYZ 306.7424 335.7784 0] -endobj - -4668 0 obj -[5029 0 R /XYZ 177.65485 294.79242 0] -endobj - -4669 0 obj -[5029 0 R /XYZ 298.93057 294.79242 0] -endobj - -4670 0 obj -[5029 0 R /XYZ 334.41858 253.8064 0] -endobj - -4671 0 obj -[5053 0 R /XYZ 485.22726 745.5764 0] -endobj - -4672 0 obj -[5053 0 R /XYZ 308.39426 731.9144 0] -endobj - -4673 0 obj -[5053 0 R /XYZ 486.7188 704.5904 0] -endobj - -4674 0 obj -[5053 0 R /XYZ 263.03928 690.9284 0] -endobj - -4675 0 obj -[5053 0 R /XYZ 289.94495 677.2664 0] -endobj - -4676 0 obj -[5053 0 R /XYZ 497.94345 486.6154 0] -endobj - -4677 0 obj -[5053 0 R /XYZ 399.76514 343.1954 0] -endobj - -4678 0 obj -[5053 0 R /XYZ 394.7261 145.12738 0] -endobj - -4679 0 obj -[5053 0 R /XYZ 172.12447 131.4654 0] -endobj - -4680 0 obj -[5053 0 R /XYZ 275.54834 104.14142 0] -endobj - -4681 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /XObject << - /x0 5272 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 0 - /Parent 1 0 R - /Contents 4682 0 R ->> -endobj - -4682 0 obj -<< - /Length 2833 - /Filter /FlateDecode ->> -stream -xœÅ\[o\·~?¿‚ªÜÖ›VÔðÎlÙFÔEë-΃¤H©‹xål6@úï‹£=r8¼ì% xµ»äp8×o†<{ùj³ýôps·e/^tŒ]¾ÚnoîþsÿûîòúñË÷ÃG~½ÝþïË=»üÇýÍ÷›á£ë§÷ÿ¾ùñÓúfûéqݽ|É^¿¹ê~î€{ FH¯ ÿ–·Nqe­ÐÌyàÞ€fwŸ»Ë߀½yì¾í~îÄÓ„ Áp¿èì2ðØÕ‡¸�Þƒê ûpõ¯N³÷Ý0ës§�âF«aÕŸºÝ·ÝÛ÷WÝå‡/7ëqcﯾ~Ã`atYÎp¥…gN(Þ=¯v÷Kì—»u÷úºv½é.€ Ë®–¹ÃËõçî»çà#€_åøªÆW=¾šñծ؅0ì9úÚ=½ÞÿoŸþ_OÓ0ùS0Sq$5* 4Ѹ�(=¬˜XèDg7f3R³ˆº‹¨›èS�ÃgðñvÅä¼Û™^gšƒ„(e4¾HK*DK‡Ü�”·ˆG³úž]Ó½½ÎY� ¬F -à^;Ϭî´Ôª`7‚ Q¶›pS¡zµ$6D €¬mFýófý#{~¿^Q;3š[0®gÖYB”ºÉ�á?ÑPÕí©&#%wVˆ¢Û‡¤^Ým½ùéúþ·-{ñîí»w¯Þ¼œWâÃ|°»ÍýþªÄmùtF‡ò#gå Eƒ‡Fkï%ô¶Õ'£Á(šyöåï<»îß²ßü¶í—j¦Çbâ@¬˜Þ�Ë+ªm¾)-R¼®Šú8]ÝÔq¨ ™™/€…ýÛ¹Cr¿×틈}ò.µHûu†Zø)Ü ·†TÔ•ã¢#jàÂö½W§8n¥(îubß Å¬ÕÏUÉF -¾`‹É¶·öRaE&½×Ÿ²œ’(’<&QPâßi‡‰#¤7•“ÍÅ~�oÂÚ††EªB]\�Híh_D-ìûP8™ZDÑææ´5kÑ@£�—ܩ㺪E'¨9R -øTèvOüfHÖÒESÊá*¼÷ilq~“Á”vKÈ6{2»ë—QÏk -yà…è+Ä­šG¯EçÏ­\nŽâ¸2?Ñ£1–CôswNrJjê—Ò·;Ú½Ù½ÙöìqýÓ|?žH9R�Ó„J¡oüÄ[fjPÔdQ}�Zhà༓-’©µñÐó»6ªf6ÿŒÕ—Þ´ñ»Ç©r"k]ø26ѤƒîðÓ–·ðrîRTxyí«Wä ë@†´ (=žYªÌ2ÛµY¦;±:øú|"‘æÈdféü³äíe/×­’Ú÷’©òÅÈh ×pT¯5–ÿ³bÊÉŸ](à¼Uo®ðÔ|’.wŠcâ„jc¡Ñûƒ¬d9ú.e–¶#vÿˆÙuËÆ"«&t˜Â/ -Ò�Ü&•FË•íz£%WÕw|'+&z4¹´ó\‹ Ňs”|ø]„cÎitaBz;‰\ЇþvLjÏ…k¢Ùü²ïzùJ�L½3�LƒqñdÔE#£�¡\ ¾[@áçØœò¿>÷úq»}üÿÝ»ÇÇmíè‚' 5÷~øaÁ{aL€ î$ÿ°Òÿ}é¦ -endstream -endobj - -4683 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 689.9764 524.4094 697.4674] - /Border [0 0 0] - /Dest (sec:introduction) - /F 4 - /StructParent 1 - /Contents ->> -endobj - -4684 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 671.3144 524.4094 678.9264] - /Border [0 0 0] - /Dest (subsec:composability) - /F 4 - /StructParent 2 - /Contents ->> -endobj - -4685 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 652.6524 524.4094 660.2644] - /Border [0 0 0] - /Dest (subsec:motivation) - /F 4 - /StructParent 3 - /Contents ->> -endobj - -4686 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 633.9904 524.4094 641.6024] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 4 - /Contents ->> -endobj - -4687 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 615.32837 524.4094 622.9404] - /Border [0 0 0] - /Dest (subsubsec:motivation-harnesses) - /F 4 - /StructParent 5 - /Contents ->> -endobj - -4688 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 596.6664 524.4094 604.2784] - /Border [0 0 0] - /Dest (subsubsec:motivation-workaround) - /F 4 - /StructParent 6 - /Contents ->> -endobj - -4689 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 578.0044 524.4094 585.6164] - /Border [0 0 0] - /Dest (subsec:contributions) - /F 4 - /StructParent 7 - /Contents ->> -endobj - -4690 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 549.4634 524.4094 556.9544] - /Border [0 0 0] - /Dest (sec:preliminary) - /F 4 - /StructParent 8 - /Contents ->> -endobj - -4691 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 530.8014 524.4094 538.4134] - /Border [0 0 0] - /Dest (subsec:effects) - /F 4 - /StructParent 9 - /Contents ->> -endobj - -4692 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 512.1394 524.4094 519.7514] - /Border [0 0 0] - /Dest (subsec:coeffects) - /F 4 - /StructParent 10 - /Contents ->> -endobj - -4693 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 493.4774 524.4094 501.0894] - /Border [0 0 0] - /Dest 4415 0 R - /F 4 - /StructParent 11 - /Contents ->> -endobj - -4694 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 464.9364 524.4094 472.4274] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 12 - /Contents ->> -endobj - -4695 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 446.2744 524.4094 453.8864] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 13 - /Contents ->> -endobj - -4696 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 427.6124 524.4094 435.2244] - /Border [0 0 0] - /Dest (subsubsec:eff-formalization) - /F 4 - /StructParent 14 - /Contents ->> -endobj - -4697 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 408.9504 524.4094 416.5624] - /Border [0 0 0] - /Dest (subsubsec:eff-composition) - /F 4 - /StructParent 15 - /Contents ->> -endobj - -4698 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 390.2884 524.4094 397.9004] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 16 - /Contents ->> -endobj - -4699 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 371.6264 524.4094 379.2384] - /Border [0 0 0] - /Dest (subsubsec:coeff-context) - /F 4 - /StructParent 17 - /Contents ->> -endobj - -4700 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 352.9644 524.4094 360.5764] - /Border [0 0 0] - /Dest (subsubsec:coeff-reactive) - /F 4 - /StructParent 18 - /Contents ->> -endobj - -4701 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 334.3024 524.4094 341.9144] - /Border [0 0 0] - /Dest (subsubsec:coeff-isolate-intercept) - /F 4 - /StructParent 19 - /Contents ->> -endobj - -4702 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 315.64038 524.4094 323.25238] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 20 - /Contents ->> -endobj - -4703 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 296.9784 524.4094 304.5904] - /Border [0 0 0] - /Dest (subsubsec:eff-idempotent) - /F 4 - /StructParent 21 - /Contents ->> -endobj - -4704 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 278.3164 524.4094 285.9284] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-iteration) - /F 4 - /StructParent 22 - /Contents ->> -endobj - -4705 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 259.65442 524.4094 267.26642] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-coherence) - /F 4 - /StructParent 23 - /Contents ->> -endobj - -4706 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 240.99237 524.4094 248.60437] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-asynchrony) - /F 4 - /StructParent 24 - /Contents ->> -endobj - -4707 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 222.33038 524.4094 229.94238] - /Border [0 0 0] - /Dest (subsec:context-paradigm) - /F 4 - /StructParent 25 - /Contents ->> -endobj - -4708 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 203.6684 524.4094 211.2804] - /Border [0 0 0] - /Dest (subsubsec:unified-context) - /F 4 - /StructParent 26 - /Contents ->> -endobj - -4709 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 185.00641 524.4094 192.61841] - /Border [0 0 0] - /Dest (subsubsec:context-situating) - /F 4 - /StructParent 27 - /Contents ->> -endobj - -4710 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 156.4654 524.4094 163.95642] - /Border [0 0 0] - /Dest (sec:system) - /F 4 - /StructParent 28 - /Contents ->> -endobj - -4711 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 137.8034 524.4094 145.4154] - /Border [0 0 0] - /Dest (subsec:core-impl) - /F 4 - /StructParent 29 - /Contents ->> -endobj - -4712 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 119.14142 524.4094 126.75342] - /Border [0 0 0] - /Dest (subsubsec:effect-api) - /F 4 - /StructParent 30 - /Contents ->> -endobj - -4713 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 100.47937 524.4094 108.09143] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 31 - /Contents ->> -endobj - -4714 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 89.42938 524.4094 89.42938] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 32 - /Contents ->> -endobj - -4715 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 33 - /Tabs /S - /Parent 1 0 R - /Contents 4716 0 R - /Annots [4683 0 R 4684 0 R 4685 0 R 4686 0 R 4687 0 R 4688 0 R 4689 0 R 4690 0 R 4691 0 R 4692 0 R 4693 0 R 4694 0 R 4695 0 R 4696 0 R 4697 0 R 4698 0 R 4699 0 R 4700 0 R 4701 0 R 4702 0 R 4703 0 R 4704 0 R 4705 0 R 4706 0 R 4707 0 R 4708 0 R 4709 0 R 4710 0 R 4711 0 R 4712 0 R 4713 0 R 4714 0 R] ->> -endobj - -4716 0 obj -<< - /Length 16038 - /Filter /FlateDecode ->> -stream -xœÝ½]smÙq$öÞ¿´hkîL°zÕªï±Ä±¤‘Âv„"Æ¡~õФ¨:¬¦Üsáù÷Ž\ÀЧ./�ž¦_}ñ‘¹ÏÚ{¯�ʪ¬¯ÿâû�¿û§oóñîÏþì«»»¯ÿâãÇoó_~û�wÿõ7¿ÿ—À·þî_ýñ¿ýËoï¾þ_ûí?þö{|ë›óïÿôíþÝwß~üÝï¿ûê—¿¼ûËÿøW_ýõßþÕW_ÿÝ¿|ûÝ=ÚßþÕÿöïÖÃOÿï¯ônÝ­»_è]-éLõ»²-¡åw¿ù篾þͺûÍýjÝý×ß|÷Õ_~óÕºûæû¯¾þ§u§v÷Í?}úc|ù柿úûó«µÖ¯ÖÞ—¯+Î×ï.ÿÒºÿéºú]ûðwßüï_ýõ7_ýׯZo]uöÈT¾rÕzóªóòÕêµ+ÙW®¤]RßéJìê¸-6ªK _ïîÿ$ŸýòÇk7`í—ìñQûË¿}öa4–ŒšÆ[>ÍÇ©wßüŸÒg!fÖÆ¤©ðØDŠtÑâ2´ÄD‘¢L–f“¢Ä­v)Z¥£†J‘²«Ó‰³$gŒùZLˆîµ”I1¾ˆÔ^&“jͤh±Þ‹ø@mÝÒkqžÝZ²·9ñ�Ú[%Ý•J‘²Ò›8Ñn[âÌ[a.³R‰Sù¶ÛÙÌ7ÏMÊ+˜¯…·hö&γ;¶D÷0ŸÙ(Y‹¹íTq[ÌÏ�!k˜Ól-Ù¥É|dË%gS‹Q5ê’×&aF],ºdÂ�ùâÍ«PæL>)5A¼Û¶T¶&ñNØ -I+e~]²¢š8A™ºxQUÓ–žÙÄIж‰é ñ‘µ]RÎÜjšmÑdîÑÌR¢uˆS ¹ÊZ;™ãä!¾Í¨Ÿb¤�{·Ãe§q"·hÉg¾i¢+‰UË’ØÉœeKe¼œJ‘bÙÊ|žzIu7s"ï�½&˜3T�¤­Í|dÇeÅ"ñlZ¼˜7Û×–ž½‰S ¯ÓÍ<¹ª”3X皢áÌ`�ï%Q±˜Ÿb»ÌDQ?ň+õV˜I[— -·–UĉÜ}KV;óÅó’5ÃTv€ÞÅ®}¹Ø¿ýñ?ØRñäo~öʧókÉÐÌN2G©˜ú­ÑÕÛÉ'ãOžüïkÉ%qåztÍ{]�<ŒãýÍ¿$•|ÿ<µÄÖóßÚñ#?Ï?·ßñ÷æîöº{žæò駨çš~þâBóÅ¿õþ�ï¿®üÜä–)^ûmƒy>Ÿüˆf²dÖV<gŽ,M©Ü,ôrÑQüHø-¹±Z~›¬PBHø%ÞûsàGeT±2‘ðSÌ‘=ÈÁ·µ¤.b! A(ÅF�„�‚7xuY©8‘ð[ü9ð{Ëlu~‰mâ7S茇Ÿ²Þ—¤+Â~$ü�U -¥Ž„?Ky/W˜Œ)B$üFÄ~n©ÑE»þÄ®ùäŠpðK%ãœyHø)«ºçÀ÷’Ð…„g¾#&Fý±ZE{»Æ¤ògHð-ÛR6(øÐL2i›rè%k"y|U‰½h££! �mþ^b½�äJÂwi]F»½{dû‚�ÄÁ7“¬Åƒoѵ6íññ-a‹v*rO™\´�!$Ü“àCz/h„ü\»·é’5´€4]'y‹ƒ_ÈÊdÑ‘ðK&™ïüÞb3�5Iø)½‡€ê±chHÙíš‚^<ì¨~²jHø-SÐæ8ð�2ÇûÁ_�ºçM�ãù—h7¯ô„²_húŠÆñõ+Ÿ®nj±%c¿�Æq_•úªÊÑ·UŽ7_ÒÚ÷Õ²;>Üi -+ -‘~oÑ1ÞëÛ)é ¥küQY�8^�ðEk´Û;È>9§ -¾-߉È ¿¥kÓ/ÓSºÄšLK*§ þÞ²!¸�ÐS2r#ßTt9k_e¡J’ðG.�¼»¸;äF> -WÑžž01;…$ü’jC*?7(.$ü”,ÞÌV*GK&¡‡DŽÓð{ÉÒ€O ßÅs#�„ß2«y“ØX*µHø%½”5üP·÷Û"7ñSrx»rÈ�êJ;²CŒ.ü^²Œ·)‡è½xð-³9†|3±2c½\n%¨g­Œ�w"E•ŸRzŠ‚9ø¡+Ó¶µ�s z8ø ߈M;²Cô9Up$ü–q‡"ÈÁGHcxs*‘GÄÁï-»yûr‚e‹vd‡ ¨EÛö=pó¶åÐW!W€ïšÁý£æF ÿQ|?ø«ÕÜo�ÿQ‚zÍX—IôÑßÌdf½¯$øäû¯Zý^óúÕSâý.—§Ïkж½�ø^HåLëÁ«øáï×mñAçó/×ûTTzß—ΛzâF$8ðØ|¯ãAÂGÜè¬$|Ä�præÀcóm�„>ÂFÇô˜ƒ�Í·-¤I“ð6 -äÛpð±ûÞŠÈ ‘£D…»oÝPTHø.…Ý1 ‘#Ã�Ý·N'$ü’§½¾Ø}ûIE%á'\»`öÂÁÇîÛ”•ð¡à£¾pí̓GX¶iè ×~ìí9øb" 1Y‡¹bb ü‰�˜,B²xˆ‰~Ô>>B²ÉZÖQ\¸lÓ¦ý£&VÓ¦}¨‰³y£11‚ !Y§MûGL̵iO¦Ô:zjb(ô>~HÀ•ƒ5Ñ7o⇚ØÈ1#Á·Ìq\åÀCK¬á-êÐ7 >)ðGK¬S{F‡Üq¢Z|„3’Í€”˜«PyÉÁG8#6þˆ´‰ÿh‰nÐâ8øgœ6 -$xˆN›÷�”x)%á' ÓXèˆe”¢q ?$µh§¹£$æQZIø.±N~ËÄéaÆÁ?Jâ ù—„_0"çMýf ²HHðP–|Ä2úØÖ’ð!%B©¤À_”ÄÓ\Š„)‘öð_”DcH? ‰ï]ËÚ7•ÄìJ¢ÝV5Äv[½¿”ø¹¥†ê·ÅÄ·_áƒ0ø ý=È…÷²¢�ŸðîÃ�?>úæ§²Á»Ï)>üwîö£ì¨õ¤èð¥�ã£9"¾>`>TFÖ‡»_|’/ïÿæE™âý×//^ì”È…íÿÆù•€óZÇ1�Eâ�l3þÈ,§á#æl±‘*Í"h8÷`—K"PC6-ïhIN"’D°·¨»Ñ^ÄžãÒàŒD`*Ë‘ñÊÂD˜pcŒŒ%t;�»X;“eÎða!áêœ�§>‹…Χ‰ Qê|ú³PëL¼Å¥Ø±#·�E°ù‚ÄÆ"@µ3Â5$|D¢5qfb´t:M$D£u#ý•E€šÌ…Á H¯¦­5§¸%’·ÞŸˆôrX"°�a·‡†RìrtXȱkœOYH²K(b$Ä¥QÙË‚Gï EXÚ�+‹i@Õ„D€ÐôéÇÄÂGºBððš6{c|à•Ø´·Bøa c�8G 8]Å;Wžèô>Ò‰áé"n©O€z+²"HˆP'qB„Z ÉЂ£Î€öÏ"@�šù¥>‰#$‚Ç8õ;â_�“ÆÍ@õ-úŸD¤Ú^û|y3R“’y³‘Ò—ªýó¢Ôu3Jýö«[û¼ýõ³@ñ�4êù#¾>ß}èÞSO‹`þðEûþ÷CdüòõŸ>ÜÕ¢áÀ{påû·×¯æñWÚ ÅKøÏOψùV{Ëߌ�ÂÕ\»iø-;ѯ„„¯+˜½é|%ôª­Ê‚ß -÷,Úèï„ïu$ ßÄÚ͵�µ×Ú4ü¯©bá;rŒÓn¯7Ò/6mücKGíúM–›6ü©RÕN›2e[ÓžÎZ’SCƒÑ€ÿ ÎÖœvwÛeU)mø»% ¡bþl™É ½\S�…�59øB§¶\¬çQV+Úð¸.i‹`M±îAp€…?RAüí²* ¿%Ë�õr!ºªæ›59 ¼cC{¹|ËÂìCÃÏu ],™Bt’…â¶Yk£ÇHïÝÍ“ñb<ü–ÖÍ:´ °ºKiÄUË�5NÂ?–È´#5‚ªÐFHøˆ©ê*ÚÜpJ˜iëú‰¨ÚÚ¬©UgM 'šêÃz2c©ï=˜×·B©·Øÿ8"©s«ŸHTËZïÓ3ýób§{Ýì&òö úa|ôE‚íCdòöüùóðäËŽ"?ÞMýsÖZ#½öÛ>Û�EÛO©<¿%§qxâà�‰z"4AÂÇþÔƒuý{mô&?Å�76 _—ŒuÓ®bTçð®pz]4|œÿÚ÷&á7¶x8ŸqðqþCþ ¾På´áÁñïœîIð)—ãþþ´hð!®J“àG:våÀãì§Á»ül©ä=™8ûßÛ*t)Þ´ÑÁÑo!I€…Ÿ°.¤½¸§–¶ê,|”í¤ Ï)%‚ÜI�?•DÞÍÃo©“JÂ?uD±Xó¥ŽÈ”6>§ŒH7m|PEÔC[¸N‘•³^ßKQ °EÂG : ’ðO ‘ëÔr*ˆöÐvå§‚¨Ð –…�¢\´ñ9õCŽÈ% ÿ´J¤­î—ò¡…d>Z%¢H�…�â¡ Úøœâ!§Mo§thmxNåЂ.@Â/©hÖÎüR6Äš›/EC�tþ©2ü¥— ­ÜzæÀ_,¹Yóþ¥XYvøS*D;³\J…zÿríµ=•B´‹?eB°ðaá£LÈiÁ’K™2Ið§Ñ”цçÔ¡Õ ÿÔ%íÍ=B0T&១�V>êƒVÓÆç”�Sþ)¢-ê÷ÕAÊŸûâ šÌu_D;PÒ³ßþºÀª7õìì? =;_ûx×,ºjIç‘�}ÄÓn îzE>¶{å×êU)ûš�V»¤¾Ó¥<˜R=ÖÔ¬g=m>>©ºüÿw÷¿ÿ pû‡»_<úM}|ò¾?[ɆڰômŸía”ëºX ÅÙZ4‚tôlÀ4Σhî‹ÈP&«WP)JbÁl•GÑ*³B¤<Šó…³�b–T ÖmE@Ámæ{7#1ˆæ³örY:ry-ŽN²<EÐ0Ù­%»é4 -TÚMSï6ªí´™�ìFÁ�5< -—‰Fa�bÄŠ:NnRÓ›ùây˾”†Ò(ÐÅÑŠúÌFÉ -4«ãQ¤ŠΨ<†�žB\žFQKL �…KYá°Ç£Ôü1Ù6ô¿¢>²](œ£>²³á↸�"áœÀ|fm©ìHæ3k+$+™Ï¬é’5I|fMe d ò(ÐAy;4†�Þg'õˆGQR'+‘Æ`¨Ì�Û‘"%5§Q8ÒHN�‰ZN}d}¤ Þ4†pÙãÔG6ZJ�É�§Ò”úÈfI„3WŠR™rê[)6†ŒxE/i5™<Š�m–Ìõ®G2ŒùÈœ Å-<Šd#°�­1jÌGÖW‰ -yªR±™�¬C©Í|da÷ƒÞ™DЏï*M¤Ô”3ï6ÜÒb£´–GѨÍ"ƒoA#PæÍöU¨ª4†P ;©v<Š��xK¤È%vpx ŽÜ ê›#[ó‰-“´…´eEË¢îø‘êᵨOl§ôœBÅ(RDQ�À£)[HÂfQ íC}` Å£p‰äêò(Z¦‡ø@}JÿxW†ëy ~3äÆ|IÈ+W»öË �õJÈÿðÚÇ‹›Ž¶àâù%é5iO—]ì ^ÍÉÛ¦o½¦“²ñ§ŸÜYöܬà L `LjUÿ-×v#ÛI½Å—ã ÎÁ?vŒH€ Á—ØJ$êrðaÇ ™„Ÿ²×Û9øðcÌÝ�„¢Çµ‰?;@Úí…£:4~‹ç™Ì9øðcÔ#¿‘ðK,‚/•>eñ$øÄÁ^|]R{#îEÂG>‘Á±„„?h½5¬×Ž«’öôì–Ø'ÜÏÁ·-S]¬ÙŽ~Ùõsð]¥ûœæIø‰X#mxbIµáÄBÂG\<”‡?’�ÈÌäà§£Pñð•ë,t¤ÆúqÍ á—øhÐð‘ë a$|hO§nšƒ?KÚ‘1G‚‡•0L9Hð#å…@®:ƒ\<~KÆ¢ ?\9.!+<Ô]cíàÉ�”vÚÝÝ)AÛö£ÅĬã¤F±èÍÇ",'8ðî²O3M>(NY<?L4�MÂ/IuÚ¾–+ƒµ²Ã‘#´x“O-´Ã¥mûáÈá:�^HøHR:^Ëüv1´¦gÁ·Tñææ1ÙÛ›6ùL!ûSYøÈñ@'bÖÓOŽ(Ú¡É´'†ÞJ;1GÛAÃßð’:ÝsHøèF¬mR9v#©† ü¢íù‘Ä¡}Ä?~¢¯mâDþÆ¥S�-‡ÓÔè/1sú¾qðaËá'�š„ºcóØrøñï%áÃò†v¦8¶�¤|J-->\9Âx×WŽå°�£àWŽ ­\'5c%kËÒ2¢‘ýÆÁLÊx?øëùu3#ãûO“ãÕ„“¾™‘¡[eÙï“‘ñð�Ws2ævNÆÛ¯êE£‰ïß=I#Yo»Ø›Y !PñIø!zdLüHœ$e|™`_R4üó“£ÁÁo¼Å Ÿ„_¢y¢‘üQ‰ÂÒE‚™>ûZ -þ^Kl6ªIøŽEc$ü“‹Œ� _MRm;Hø-ëØÁqà÷·D - ?¡£!�šƒo(ˆ6lœIø!™*5ß—¬R$ü“ðý°i³ì½û˜9rðaï=…�3 ¿¤V@¦æàÃÞ[OÓ&þiûBÛ<À#c µG$ø€¯²HøÐÁ�Ï¿æj�ð["R ’Å{:‘I{·à…Q³!S“ð‘|¬´}?\0R×â᣾²!Ô‘ðG|óà·ÁMEið-Ûeº|Û¨ù†ÐEÂ/Y¹‘ÅÁwX<�Ôx~H× ÜÏÁ�%»2; ß%'iÇj‹½„<9øizÚ©“ðKf£�7¾¶˜Ñö…°¶(‡ÒË�oõ£Õ‘ðÑÚ¡h‡jZL¢øŽ„?.¼3œ,ê4Œ£Àû2ÑÙðè"á—ä:e|EzáIð!á§ø¥¥/é}jèIø'1ž¶s€iEºÓÎÔn.+xs'ü*<)J|ßÒ§™= þ×ÒžžPÉF/R|ÂZ�¶m€?E¬@æ7 ßá5‘„?ÈþCÍ¿ ]�yð TZ<iáÇŒ˜„Ÿ2Q¼µf™´�Ûq¢(Gs -þ±¡hÚ¾êä9ÌIý&á�@ggÍ>ŸÞþªènëf¢Ã ö?ŠDÓ[‰>wçwJtðÏÊr°}3ËáÍ—Ô¬†_-Ëç]IÖótˆµâYâïŸÿ–=üÖ=šé‡;}`ú„q~*÷ß| ŠàO¡ö÷E’Æ2ò‰¯âñ§Iòç/.9_ü[_\×ggv Dê�lñ7Ü WB¤�7޲dþHfÌfᣀ–xwц?\zö2þÈž Á§¡»oø³/5¨$øÚ8¨-ÚÝ­”Ym´áoØÊ¡@�…'i�6·ÍBç¥Á»Ä~ÛÎè•éløxsð#µ]CƒG­�*ëáGˆTÍ�õð#DF›™!G3 iÎÚö @Z^NCVÇ*Úݵ†ù; Ý7B,›‡Ó«E[w -t8aÁ§h"|LÂG€´h›ž-£í™O|´Ð‰‡„�øh/Ö²xâ£mF»»ˆ�6íÀx£ Z>£ƒð4 ?¤&YSÏ‰Ž¢O ß%צÅ.áÑd­‹�ÑÑw„¿¬³[ÑÑ[ì?‰èè¼öñüVkæ3£]È—öCþ“ÏíËlq«/ó›¯ãçÏ•ëSørÇËï^0?~[ëY#懮Îúâ�NxñÄþ§$ù çI çû¯õ´ ´>ûéÕ«~hýøãÍÏôP} �§?ÿì+þÜPé•Nd²¿áƽÞnzKÒ(lÁÒ³{3)óHR?ºc HcP—µÕˆwýç<6óNì-ÝèÇC¤(1µ!2˜J¹ófÚñs˜|I®tæ‡ð�e8óò`Øßo[º^¡“æÓ-¶Ç#En©\Øäò(JtGxE©äF$‘"‘ÇF�‰#ˆÎ£@“C#äQŒ˜G1'¨1©J*CË^åD -x“¥1ßmÄ¥!Øçq8”QáCÆV3)öKÄîy h�Ý–Ç€Ìcîÿ`W–h!JdhèÏÌ}2‚ÕèÓÌdHOæþk+æô -ï²^�D E.Ù6ÌÉ/]²àD¤@ÑÔâ®ì0¥®U2¹™;@ım,˜³ZÏmtQæQ ̨gàclÖÉÜž¨¶&qB$›øØ´Ç? �ˆ‰ø%ÕŠH¿¶èðÞ®JÉ…ž[$üVYû„¶Iø!nFÄiOÖ¡ÅJ;†ß’µ‘§DÁG±t0ÖÓ Uاyøª2zT~ŠmCÞ!/)KÚ©åJêí‹„?¹YQÁSA;µC¶nÚÖðø9-¥�Ú�¡“:í釡Ó.Ú¡ý8:ù¢Ú!ü¢¯ß‘9O›r`×Eƒ/T�‹>ªÀ…¶|,iÓ‚§bÉN™6Kî¨w#á‡TíÔ~ÄÝ:Õ’$|—hÔ»‘à[f’vlÿ$ê¾üu‰qn*º7Ø%Kÿþ•�ç×üªt"j85l´LÞï(éþê®_3›R»¸{¿Ãµ½"Áþ˜�Ò£­“>Qu?¼üÛÏ.ïY§.÷mŸç¦î‰ºÜAü†ƒ¯¨Ë Iø�”s¤Mqð÷–˜Fž ¿d->pàMÅua"ᇴ&%8ø¾�ïJCwÉ=°4 á�, 8øaâ®E{¹¢¤OoU~¢ù©#|FÂOÉDξTV&öØ$ü€MtOþ Uíéi—Ý�Ð= ¿5É“uDy|I,ôààC÷]›uýðh4ô×#Á+*‚wñðÑ|³qÀ'á£û&¡9ðÝ7™û$üǤ¾á$‚]<šo.’pð]Ñ@‹¶m†ì9Ù�Kìä{‘à›~'$üÁ¦Ÿ7µ¡‡Íé_ÆÂoY �HHøµÅYË:4ÏÖ„dËÁo•½7\ØHø!ÉÛTÁŸqR5IðŽ-?ì>Hø�-?mbƒæ¹Ã’õj�&61•8øhb“´pÆéaSÛX/×éaS�°7 ?d7íÀ{ZØÐ,§� qÕ=þŒËx£‡Æ5ðÚ áÃT%`ïÉÁ‡Cã¦-,Ç¡q·ÓðáÐhE’„ïÇ]•7Z,é4Æ©\'á74†|ž´@ó:ذ^Ý‹A#mUÿ¤v¾üuÉmßT;o°ÿq¨�v[í„hë½Õ·¦6¯ê�~[ï|ëÕý÷«f½üÒÿü´ñÌ£b\ûýÛ�tþy5SÖRĉ¾|øn†Øaô´†‡ï2¹jÓðGܱ(qàQu:y�à[|¡: Ðgæ6Iø%ƒ$+ ->$‚¶“O‡Dpúqð¡Àך†hôƒ8 ¤¢¡Îsð·£öŠõzA#¨ÓŠ„oèwŒ^$ø’¬Âq�ƒï¨˜?Ý$Hø)i§?TTOÇ~HÏu|.YG¿"Á»D$\ˆHøHIÄy9ø°›Ò mL ^SèÈÊÂoÔMΛ$|4”…Ä�· M�p3Aéß×›ÓƉ„ïÒuªnIø#¾iøŠS™Ñ6&® {ë¢áï-5†¢p>:(žv*|˜sÇÉš%á§lCåÞ—”nÖÚâ¢sVþ n’wý�>Zy}$|ØÕhÓðÓD�„K‚/‰á=ûµeÕé�GÂO‰XðjâࣦÚÐKœ…z*sHø#3ËhøÈ0(tÒ"Á·ŒÃKŸËÄ÷Ðöý± -+:&¼þõpïµ.=¡ é ¯Ðÿ÷¶ßwk¿´Éùøj\;o¹F"Ÿfw¿KÐý³#íuÓ7òÍ—t¥iüå2¯Æ¹¯à¤öèû÷7�ÉíoùÌ·œ ílz+ ¿Åm ^7ÄK~Éöå´áß*émYø(1oÚð*Ìw ߥï,ü‘�«iÃï&™>4xXc!ƒž„ñØ¢ ¤tÕÛ&ô[ø©²aˆË‚‡ƒxlÚð }‡7¹•‹�9mø«¥‡÷ò¶‰- ÚðwI­HÚðÏ]S´áŸ”P£Mnè8dz–…b[‡5þèXʼn$|uQC ¿‘í¨´ñß[Æà<ÇÂ/1߯š.ýÓiã�怱œ6þ¾ÐLž6¿™» |Yiø#–»hã&•Y´ñ�†ÁKÓÆ?·DùÐÆ?‘Ï:‹6þ¥bm¬“£òYKiÃßÈgÕMþF>+НYø0ð¼ÏXø!+W°–ô[æ]~štvÒ†?[ví¢Í�µ%+›6üU²NJ9 ¿UœwõÒ=‹6ú@…q$ ß%Y—,|tš¤�Ú!�Æ -c ÿ'yôñ¯kt}S½Eÿ“’G—Ú«räÜ,Kº´DÏwUH?]à«bi¬›eIo¾º?TåüÿÈ—QKl¿ñ¾"ÍÕîQ~ŠŽ·x;µÐÎÃG«L”ê³ðQ ½½àà»IùnÚíõõˆfáÇ–ð†8DÂGúµò^¯T1ØO±àáþœØÃrðk�bw¼£±ïíª–Éà½]ÐæNh–_Rµ}áàCš+3~Joí:Ò\5ëå:Ê\+íå:Ê\;6‘|(sÍ[»Ž27¼µë(s³iÃan‚övan‘q~Ê^¼¥ Â\.ÚÒçÁµxKt9xUÐÞ®0AC1ÚÓ-[ykt¹TÚÚ…†kkóÖ. ú6ÞÛU!M·|1ì¶"÷ÖëûÕZ€ñîR³ø‹§ßñÏsï{î~ÿáûûáûçëŸ}¸³O.�ñáNãá_Ï ¾ì>[ÿCþf/ä|ùpÞŒ1;N¾iø#ª0$á�!ÆLCoY®›…okcN£á#9]ëHø -{¡R|Ȭ �‚ƒ¿ô,‰$|—¶ ýŒ„?ØñlÖËg¼J4bá7‚`´á÷-9¾ho¯ÔQ£áŸÎÜž´·�¹{†Ÿz8§±àf&‘ðù‰(ìäà—!õ`ÑÆ§Z\Óhø½ÏQ��º¹lþ(ôÞõâHèÉÌÁ‡5^9ª²Ið!•$t8w٦២ÔFj: ¿¡�6 #B;¨é'á×I›cÁ›¢h‹ölZ¢0€‡ïKÆr¯Iøq2hð#}ªz8ðáÈH%â·Ô( -¦9ø‰Î`è¦ËÂ/©­C{wkŸ´|JêE9ð}ÜžQC‰6ØpðÑv’ðv¬]ÉqÅ«¦¹Ž-ž·þc�ùýð¯7ýv�ùýW�9n™Íå,…ïd¾|ûÕ‹ËÛæ·^ÜŸ?7¬{ÓÞ·–yçˆòŸß¨¹ouó³§ß²xÚ¨æCÊ©2¾ß6~7“ÒS\Oò ¿–t£ä�bqÎ$ü‘¶Ã%~TÚèwK•£,”ƒ?&Û …›$ü’:»3 -<"úzÙ½’ðS2ÑÛ“„¯*jð« Á‡ä*¸åpð7ºq ¢F$|´ã =<{dm§Í̈çû$mn@«›É¦]¾ïÓ$Œ6üž2ºi33âù†¦Å,ø€�(mfF<ßö)©'á»ôBÌ‹?§ �g=p6 ᣠR7¾‘¹†¦Î,üM…ÏTÇrzŠ®7ž9^‰æG5Â.$ü� ^3$ü‘Ø›65£Ñ͌ӦfôýäÆqà/&“´©ñ|Gš ßTº a~ŠEÐæfDô{mnFD<\Ið#UJ››Òßn´¹ù„ôm¯IøhtÓ09 Á—d.Þ䌈¾An"Á§ä:îû|4º©äÍÍé;BÖxDô7’êIðÇ~‚ ÿxЦæÑ·¢MÍO"úï‡=˜\·#ú7èJý¯_ š÷Í>7ˆÀ8v‚o�èfnw¹yóýЃÉüYè<®†Ì¿¿�¿Öÿòy´}Ù“ð§iè[?Ü�JvÔ’þ›§6Q/ÚÓ¾áNÁþÆ�¹Õ‘íë7Á6ÉN&A‹nd“ðmKdñKÖ¾«x,œX¨äR"A,1ÛÈÜe¸T�U™E0²ÕÑT†D�&Ç‚EЂîˆ,øÚVHe ö¡ið(–Ô"At ú,±Å¼¿¨–t…56‹`DûWpl™ä6mXhl…¾Y$|EuQ@ëd¤Œ'ïl&§÷‹./¨f'áÛ’�ƒÀ -‹À¥t!™E0¢¡¼‰ÈÜ$f£D�Eв ‘oþiçh@Å"€, ‹Mþñ¨<Ž,‚�".ÅVK¶5rJY.Y§Ç‹`D7zE³Ú$RÑ…�EвÖ&Ñ@ü7ÄÀY)ÝpæàûR±Dü8�¢høº�(‘¥è§!‹`Pïˆ@5‰`›„-¤&² -õܨ] ØÔ»ÓÞ2(}Èo'á»ÊOÚj ©¯N‚ ?–h%qž‡ñ#o?‹¨M¢DÛï5Ë’ñÓÙ†DPÖÂð}`¤ô†bIÂo•}q`„ÔéHNŸãz$ã±%Ä€\ÑâíWŽð—�"QÁ£ò÷ŽW%¨\·¥¿[ü?%íï*Ò>¨Þ¬æ�#ûÔ5˹®ý}º´WeÀÜ7kyÞ|iþ¬ææûÛBà;§›r`?�y&ÿ¡FçéîÃ�?ûTõ|¸ûÅ'¦ý‡·AwÜeoŸ›JºãÎlþÀ„"‡…î2O~‹ÙÚÆÂÏ�ö¯4ôB^WÑðK¥Ö -ÚèzO#÷„„ßKR}ÑÆ§áźšöt6²n+iã3&ƒ ¾Å]•5<¨Åê© ~‰…³ž”bµ*íê5e'RÎIø{IíX¬§Ú�¶6 ~$­ƒ†o.ë4Îfá7*Õ”57@·Y N,üc"ž´·+Tfo§�O¤XÑ6V(ÆjCJ5 í»hssŽ”ó¦ærÙ+YÔbeÚ¢�N›¨NÓ&‡.¸¦Ò.6$WÚÕOŠÏ¢ŠPŒ…´ÖӥƗ±^]Ôbu.Ú¾:�)<îYøÇa`±¦N¨4ÛíT‘&»‚õvA£QwÚ©MÂçžï*+Šv(‚@Šþ#,ü�G›|ÂÅwÓnn4TnÚ mƉ,üBW=Úå×–±Y»Zè2¥›v(:öjټǧCr£ß/ ÅX Ço¾KŒ5Yø-3Á -wM&6íPôI’yGüëj€ÝTdnÑÿq 2~[�©Ó|gAæsxdÜ–dÞzq~Ýéì©øòþ3´�#3o»þïˆöFA$ö$ü”žD`‹ƒ?H÷DÖ6 ?¤Õö&áïµdŸbx¾KÙÚIÃGݲUIøj’^ØÂ�ð[t ~£øîœnHøhL»Záà›Š7 àXø!c() áû›6ÖôÅ.U4øÓpÚì†ÂÁ¡=>hûl[ >Ú>ÏÚë›%zŽ—xôv[´‹¯”•hÇDÂï%±cÑF§]¦-xø#îh A‡޼U'Á·XŒ²nïÑ›µ’‡_²+¡sðU¹4¬Û ÅY.R$ü�㣲VÆ#8ëÉ"ál ¹qð¡8ï‚àOÂïÓ0‰v{}Ë8me?‚3|“Ið�¶Õj´Ë‡Þ¬'2ÊÁÏ%UMÛ×ÁÙù$ü‘DÍ ¾\4P,ÎÂoIݼ§¿ ©j´�ÛQœ÷8íöŽÊtÑöµGs>¢þHÎ0è¤á‡X¢l‰…?¨7¡íl¡9ïæEŽæl£,øm¢C[Ù�âp\"áCq¾Hª$ü”(ÞÆðHΦ´�-$g$,�àGÆ›ñ<’ó: $ü–NtÒ$áCsÞh8ÂÂ/©Þ´�í��÷öÂÿs¦iøÐœ£�6»AsÖ¤íl�æ\a´Û{4gZ@õ"9oÖÆö"9/ÚÆö‰äü~ø×Õμ-9ß ÿ)IÎõªª[·%çÉpßïª9žhömÁùÍ—ö+Ð_?—žŸþë"-?k¹õ¨Ì�8½¾ñ¢oʨ[²ix,‚%â肋HAÈŒ"—ŠD K܇2�Kï(´°…Á6©8AA‹ÎY|H¶%m ¿N`Ó\%ô”²B&ôr¼^g5ï5GÃ=Þ-€Õk-oHi0ùc´h,0I0{Eç(~ɲ•<¸½œ�h!£�>Iøð{ &¾K P´4‚ãöZ§–�EÐ�i/ñq{�…;‹ ež<,‚­âF%éZ¨ù$ØÂŽ‹6K»×8¥c,‚Á† ¥{$7l¸xoÜ^ëȸ$‚ØØp1 .䟒à÷:'��EØpñÞ2ø½ÖB¢‹à¸*ó÷Çï5Ðë’E¿×¡ÀUyÑ6íÇîµN.‹®ÊèÚB"8~¯´¥ì¸½ö@ï&ÀîuS \2‡<€Ý«®ãmE"€Ý«-xpÜ^û¤z“àöº�Í‹ ¥“ø ¹Š-&~À¥‚‡³×>‰,—ÜèêK#YÉ 1BÛ�5¼“ýÅëu�Û@"8^¯Tx½\ÀHÇìuxéñzÞÙþböz’ÿX0{%.eÇ앇ñz=Ùy,‚G•÷ ®kŒs[æ½ÅÿSÒyç51µÖm�×ò¬ÞUçýú³tÞÒÛ:ï›/íß]×Ö cÕ'’i¾O -Š?ÜÙYumÑP„ñ†OqSÖ\ˆã¥òЯ2ˆø#g:' üé­G#h±ìØ4‚½¥€aÁ£PÞà,C¥�bAb¤h'"µ$_°ü~{Çæ ŸÈŠ#„ËZŽ‚A‹¤q~nµÍ{ ²Ä²ŠGPЬzäö±…¼Ð ó„ `{\BYƒyâ�›–W„Ó500gá7æ hï§kY -óT5�ªŒ¢.’…Ÿby‚$$‚½¤·òÖ{§»®,‚�é -ß\´�¶Ü£ö5m Ì’`·<†P-‹ $E$üØhH[í!›z‘ —ŒgCjôÆcá£F�¸Às¹U\,‚–Úƒ$,l—Ûi'cÁ¦!W“„ßå9©Ž,‚”ð‚Á‡¢éBæ >Ä¡xþ@T†`D"€÷râ˜,‚–֣ʒà¾\è)ÂÂ/©}ú�P ÛiŸE�’V¼“ý)‡� ‹5AH8:J³bÉZÄ-û)‰�S²Ê"hÌpI$ (6yG覭˃ŸªØ2âd /æÝÈ‘" 0¶‘ÈÇÂL´íÊ)Œ%®ö�M=‰ë=tÓÅ -.űDøGÕô ®+vû¶jz‹ÿ§¤šþûW¥ÉkÆÓ]²÷Q&÷F¿¿/êDúR4ýL©ôºAô¼ÛýjíõÃRØK[Ë”˾lyùíϾwÿ·ú¤Ýå£�óusçûžœ�æÎz¯ÉšÿÁý07¾«Îæ¦tRè®A#°%º­ˆÇn±4AËø6�›X("!,‚’ÊSVJ"ˆ-Z'ÅžEÇœ ¢]çÅÂØ +¤‚u$|»º ¿%±u$ÁÃî͈�O—¸CÕ"á�J‡ŸÏAwÌcIÅ!°µ$�' ?d�ö˜,üØG�ð‘ä³x«˜!Çg zà‘ö–Ò"A‰îF~‰ÀTÂ*ˆ�F{Í#€™}¤ \*O`Áˆ–ó2 $Œžd:AÉ̉—’rø7‰‰FÌÃ#(•½O8“E€HÑBB#‰ —,´�ุïvAKGó~6&;‹wð³)ɪE#ðµeu‘�]‘8LÂW¸ì" „…bФUþHmÞLêÛE ),|ä¢mÚžÒÜÄ£f7ñ‘ð‰ -¾«=E‹ô€(�ì¾ËLñÞÞ˜cƒKÃO“Ö#ɱZöâTpK â 'wãÀÇ)Œ·�&×¹‘B"˜_lÞ^¢\öQýX#kVÓ ÊÅZ<‘à‰.÷Ž×塸­ËÝâÿ‰èr÷ÝHÿëJXÞ®g„AW~QGÚëÊÜ'Ñðu‘®n×3¾õÒþ—§5‰�-O�Zö‹§ªÝ£�ö&õî³Å6uYVoû€·b¬Š†Aƒ$þFàÓLš„_bãCÃ7•öBÓ ~Š�lK¼/©ÓJ�²W [—„�Bñæ O8ü‘ÍLÂo‰4hHü4YÞ’ðK<žüR™­‹‡ŸbÅ›|5?è5H‚GÅO õ> -GþœzÞÒ5¨÷IÚÒuŠêzÐSƒ„�j>JêÆ!‘ðÑŽ«”†�Šºc~F‚±Øˆ’ð‘ý´µ åt;N§S~À…Ï|7њݡœ?2±¡brðÍt�º(ÚÒ…ú9X^òð‘»iK4º­§ ?%³’†ï*J| ÞÅë”T‘ð[ÆN£>ŠæÚh;“S4gÇGƒƒ�š¹nÚÚuJæ\yk*æÆxð!é´ˆÛ¥^Žöê¢X.”6¯�R9§­[—R¹ÓÅ“„ÿ¨É½þu1¨oKr7èÿع¹©ÈiÃH2]ßW’»¿ºWE¹^7E¹·_ݯ֪ç…kÚ¶çn�ÚÚ~®Ã=º=èu¦î~ñX÷ÿ‹‚¼‰Ž7Ž÷+‘Üå¨ä¡´ø¤Ñl�¬´1A!q)xªÒiJ$H1E‡sÁ^Rå¶yqÚe F²#x°HsU~KÀÈŸ…‡´Ø¼Gi«††*“<üWdгrI—_bÔŒÚ"¾Ä9RÄ—U£®Ä—e£S¼—i±y/1‚»«y�ÒÒx/1‚»¨"áû‚r´û{‚»¶h÷ÑÝî¤Ýßã�æJ»¿ˆî2ÖXøpG 8øÑJjuò`�–¾‰)©èŠÅ"€=Z¡¦“F¦Ä·ÌG¦3“F€8¯ïM$h驿 Òæ¼7¡Þ5‹G€Xo:ñM>þh°ìe Ú[È ¤ ì¾Ø,D|»ˆoòqHÛÄ7yZf`RG"¸Ä}azK#xü¾'Áõˆ£ÞŒüÞäÿi…~õñÕèê5C¸ZÒy‚«8LfÜŠ±¯›±ÕK�¦eõêu\õksI}—ëøÕ²K€õ×îöcœT‚±zÅAíá_ß=ÄNÓýx­g!Õ�Ï¢¸ß½×3 ‡ òCøùo=�ïé~ïû§Þ ëÝsÀÇPòþ쨮Ö–· ðÃøÖ�¤§Û©e¦R4ü7q£Qä–ômƤ(Ñ¥8sÐ(J%R5™) åDŠ^âëj"…ËÒ²‰c´*"Ŭ.”9PÓb -ë d•*4&RÔ}*#�BUrP³M¤HÑ@_Å^’êÁ¨²Ê†9P{àœIœ¢Ì 6ºÔ»m誶©wÛÑX�¹Z@k±ZÔ›*}*§‰)»©T.ô'§ÞìD™%Žo<†A ‘ \tõVW#)†ÉÇNÏÍd€ÀÁü�“¸ï€þâÛ‰S8˜nkâ�€c'W�Ç€ú0}h ê²s/懀³™gT¨1Ú‹z¯w¡¿$Òh†®Püٖ1Ô› QFaÏG¤ñ*âôwt+êÍ›Læ[m&еƒGuFƒz·³�ÖÌ�‚Bc¾™U)9A�F•& B�"$uSo7”šRêí†Vcpq%R@­YÌÛ}Ñk`¼M¤xTlÞ•âº~à·5›Wð%’Í+—»öKÉf½.ÙØCöùâ÷?ø°q«¹�$iû’ˆ˥üÁ¾Y�7›Û¼ù‚~˜.¿ë‡Iõ¿|ª—üüf^üÑr¿ý ÿ|~:¼–‹ë~Ûg»!vj—blR8ø�êRDéIðK¨e,|ÔnO#ɘ„Ÿ’ŽD{ -üFéö(òOIøHj·Mq#á7œ°,pðQ»½áŸÊÂÇžV‘þËÁ?µÛ�9 µÛŽˆ)µÛ'pM‚‰hï8ø§ë©#_Š„�¦§êCÃGR_£�ƒ�S£{Ñî/ŽŒ£ˆ#sðÏy‘‡ž’íH%ãàãœxjÄHð0F@ù çÃí´�ʽˆsN†Z´¥†t–ŽÈ: í„ON4_7Ëxð)µÀàÀoÄ`ŽJ‰¡Mœf ¶î„‘ð]|‚;$|ØŽòˆ9øhxÙ®´ñqØŽ,¤�qð­ºáuÊÂG&:íî&ÒФU>¢›…†Ü ->üèth!ˆåi94|E‰‡Ñb&Êà ¦‘à[¦`GCÂß&èMž]ÒµX hã†6¾,ø”J£-ŒPÅ7ml<$#ië"¼ètm]‡~ -EIøãÅüü4q7ÚÂx*{hg"ÈßfÈD Á'|ly3g£)çðÖEˆÞ°Ð&ÁÏÝ›¦%µ;'hO'üè­{9øGçÎ « þ£Èý~ø×EÖº­pß ÿ‰%.µWå¾mI§#ßï§qÿ!r÷Üv¤{óÅ�Ê¿?ý¤pÿìš*?Üå'ûŠÔ}þðß¾fZ÷Ùå‚kdÙ~ãG¼)Ì™8¶ø,ø’¹Ô(“ö?uè,ü”®À!…D`zÖrÞ-°€± -œ…H¾dÇŸX.¥§ÜƒE€Vðpþf„!™w P�»”ø”æ–H(Xø%k2üH¥âíć´BÆ�ÂN"@î -èP,‡Žì,‚Û…�-‰`Lª‰¯ñ´lÞkp*o1~! �ŠŠn iJ,ü”5;y{I„!&Ï"YŠFÌ4‚¯àM¥§ÔÖ’÷�Z£Ðbxo™o4á=C¨±ÕF>‰ ÐÍv ,ü”í Õù$T×.E>‹ І n,‚‘¼�HåPGxuµî(% ¬vñ{¨ƒžIœHQR‹†ð<‚ë†þÈ!8µÞÃÃtLâͤ¨¦­:U9$Óš:ï(lƒ7̧I¨¤ ”4³ðÑpÑQµD"@m9o&=5´v2ÔH¾ Wñ^c”ÏrŒXø#£ «-Jgë˜i°ZÚR!HH€^‹7“":�‰ÐÇV–…�hãbO±¬ïAH.´�b :“8“B8ÜÉ{H‘ Ý…6‚£:O,x¢¾#ÁUÁjÖméðÿOK;ô×´¹ÑÛÂá:æ�Vï,~n3«Ù·¥Ã7_ÞJe¿ÿ-ñ/î¿ùäO~¬vöe¬4°Z°¬h†p;`ÞðñoŠN…žt(*!¸JÏBÕ‹ Ŷ+ ?–Tºo±BД†w !�À¦‹D�.똘³ðÑŸl£è’DP[{.|‰Åqý"´J Î,ü„_ÁðfIæ‚ñ‹ d z{ÒFbóæQTŸM*Ât,Dó‘ÊIÂ×-½›FAÁo !"Á†Qí[÷"7 RtC™&áÛ’ÈÓñƒEà2§÷ No&Þ3ä&�Žh>‹ eOóÖb¢•!g”…_¢¼µµh1¼y4‰z¼µµh�;xø.=Ã[‹­FÌ )’ðÛ¤ò3²Zö‰’ðg fQÞ#4%+‘@ÄÁG=Z,Eâ7‹ dŒ7@¨H³ÞJ ¹©Oß'þÀVŸ·CmÊS4ÆÂG"£ñVb¨MaDZšE�2¥ˆò’\Åí,ü�¶†bI"ˆ%»x³P¸Ô -Èq,‚5ÞB ­)j#ÿ‰EÐè¦Å Úâ¾��Æ"@R>/²­ ¦¼ê�:®$|”¨],xYŽn¼;Œ5?u/‚#5/0ôDjzG‚ë‡Ý–šnñÿ´¤¦¯T¿¸¿Â�¿ýÍùí?Þýý×ùû�ÿÏÿ€ïþÝ¿þúãû—ßÞ}ý7¿ÿýÇß~�o}sþýŸ¾ýÏ¿ûîÛ�¿ûýwW¶Q »O4‡×ˆùÒÛsjëžÞ¡ÿbªA -endstream -endobj - -4717 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 749.2384 524.4094 756.8504] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 34 - /Contents ->> -endobj - -4718 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 730.5764 524.4094 738.1884] - /Border [0 0 0] - /Dest (subsubsec:context-access) - /F 4 - /StructParent 35 - /Contents ->> -endobj - -4719 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 711.9144 524.4094 719.52637] - /Border [0 0 0] - /Dest (subsec:loader-hmr) - /F 4 - /StructParent 36 - /Contents ->> -endobj - -4720 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 693.2524 524.4094 700.8644] - /Border [0 0 0] - /Dest (subsubsec:config-layer) - /F 4 - /StructParent 37 - /Contents ->> -endobj - -4721 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 674.5904 524.4094 682.2024] - /Border [0 0 0] - /Dest (subsubsec:hmr) - /F 4 - /StructParent 38 - /Contents ->> -endobj - -4722 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 655.9284 524.4094 663.5404] - /Border [0 0 0] - /Dest (subsec:koishi) - /F 4 - /StructParent 39 - /Contents ->> -endobj - -4723 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 627.3874 524.4094 634.8784] - /Border [0 0 0] - /Dest (sec:discussion) - /F 4 - /StructParent 40 - /Contents ->> -endobj - -4724 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 608.7254 524.4094 616.3374] - /Border [0 0 0] - /Dest (subsec:scaling) - /F 4 - /StructParent 41 - /Contents ->> -endobj - -4725 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 590.0634 524.4094 597.6754] - /Border [0 0 0] - /Dest (subsec:capabilities) - /F 4 - /StructParent 42 - /Contents ->> -endobj - -4726 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 571.40137 524.4094 579.0134] - /Border [0 0 0] - /Dest (subsec:language) - /F 4 - /StructParent 43 - /Contents ->> -endobj - -4727 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 552.7394 524.4094 560.35144] - /Border [0 0 0] - /Dest (subsec:granularity) - /F 4 - /StructParent 44 - /Contents ->> -endobj - -4728 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 534.0774 524.4094 541.6894] - /Border [0 0 0] - /Dest (subsec:versioning) - /F 4 - /StructParent 45 - /Contents ->> -endobj - -4729 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 505.5364 524.4094 513.0274] - /Border [0 0 0] - /Dest (sec:related) - /F 4 - /StructParent 46 - /Contents ->> -endobj - -4730 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 486.8744 524.4094 494.4864] - /Border [0 0 0] - /Dest (subsec:rw-effects) - /F 4 - /StructParent 47 - /Contents ->> -endobj - -4731 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 468.2124 524.4094 475.8244] - /Border [0 0 0] - /Dest (subsec:rw-paradigms) - /F 4 - /StructParent 48 - /Contents ->> -endobj - -4732 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 449.5504 524.4094 457.1624] - /Border [0 0 0] - /Dest (subsec:rw-temporal) - /F 4 - /StructParent 49 - /Contents ->> -endobj - -4733 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 430.8884 524.4094 438.5004] - /Border [0 0 0] - /Dest (subsec:rw-spatial) - /F 4 - /StructParent 50 - /Contents ->> -endobj - -4734 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 402.3474 524.4094 409.8384] - /Border [0 0 0] - /Dest (sec:conclusion) - /F 4 - /StructParent 51 - /Contents ->> -endobj - -4735 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 373.8064 524.4094 381.2974] - /Border [0 0 0] - /Dest 4455 0 R - /F 4 - /StructParent 52 - /Contents ->> -endobj - -4736 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 53 - /Tabs /S - /Parent 1 0 R - /Contents 4737 0 R - /Annots [4717 0 R 4718 0 R 4719 0 R 4720 0 R 4721 0 R 4722 0 R 4723 0 R 4724 0 R 4725 0 R 4726 0 R 4727 0 R 4728 0 R 4729 0 R 4730 0 R 4731 0 R 4732 0 R 4733 0 R 4734 0 R 4735 0 R] ->> -endobj - -4737 0 obj -<< - /Length 9777 - /Filter /FlateDecode ->> -stream -xœÕ}]�žÇ‘Ý=Åx×AÂ,\ì®ï -6l¯�$€� ¬;Û²VÞu�•- dÿ}pz>83½Ciæô�i’⩞~úé§»Î9Uï~öÍû?ýñó/Þ_ýýß¿¹ºz÷³÷ï?ÿâ_¾ü§«ß¾ûìë?ÿô›¿üáý¿ÿùË«wÿýËÏÿéËoðGŸ�ßÿãçÿü§¯>ÿ§¯¿zóÓŸ^ýü~ñæ—¿þÅ›w¿ùóç_Ý ýúÿã®Öíßþß7ûj]­«Ÿì«½L¢sûUùˆZûÕÿúæÝëê‹{³®þ틯Þüü³7ëê³oÞ¼ûãºÚûê³?~ø×øå³}óÛÿô»µÖ;üÏßâ~÷þîÿúùoõÙÿ|óËÏÞü¯§G¶Ÿ™™´½ÊÈ~·To~�ë_Íß^麺ù[‹‡»®ýæÁï–í›ß'~ýéÍon€—½½Úqxþá�n0÷Û+Yk-»þ뛿°|$ÏÑÝzøù¯̋ڈoÙ¼œ�üíÛ«Ïþ÷uÄûønÒ;Šߢ»”†*¹»iÓ%K >·¸î¡MO†´Z( ¿–¨Æ¢�¿\R3ƒ†?²´iÓÓ&®SMÃ/iÛf,üQQÓ¦�RÒÜ“„okË2zˆ[ñàGÚ†¶óÛvQ§½º¶[Ò•¶ó›š,7Ú»kZâ´Ù·-í9¬�Í,E½ið¾$cm|ÈŠ�´Ù÷SÚâ “/Úâ��4ÚøS%£†_²bœ¶:k‹ç^¬ï¢UH§ë»h½DÓ7müí’I;ô[�¬,¥}ÇÄ“v*±)é¢�ù}©híáá§dñÎü¾·¬â�ù}‡xeòÆ?ÒE;7¸ºhM±ö6×–ìm´åc&«•µõ»•x»Ó†ï[ºsѯ§hmïôX’=›¶|"d ïå�UÚðӤǚõeôlÑ c}[¼TrrXŸF¯’5´c¿÷–Xkцß!³xç~Ÿ%¶hÇf—Z¼c¿ÏÈ^¼c€XÕ¬ñÇ*™õÊçþ')}‚bˆ�;ësÑïCýì‹÷ùüÿ|öåÿ{õ÷¿úå¯~µ–.]¹~z‹þ1C=Ùþ3Ú_÷?P©xÈalïö—b—Y[•¯Ìò\ÿás#óË,ÏKGöm–çssMµ¼}ŠÍù»·W÷è™Ýçfl=üõ{p5{Éž~ÙOw)]º]ÒwÒàGVÇ -¾š„6¾dj ßT|#!H‚Oéè¦=]ßbK�RȆsðcÉîÑMÃwIÓä�dUÒ†Ÿ&±'hÃÏ’IÚâ)_ ˆ„ŸÒ>Âï-:fEÃ)K¤,8øƒw ÙR�â½[Èd¬Í:Ñ‚àÛî´›º‡K@ABY¶i7uð{^Î:�;Ò»i7uÐ{–›vSw$2V@TÉÁG&ÛvU¿—Ù‰ ÚUü^Ôж$2Ti'rÐ{NÛ7ï‘{¯‡ÿ$³—ɽ Ñ?-r¯ž£Ðò‰´KTƒ¶·ÌöWáönô,§WO²�óZ#":·îþɱ¨ýné?–Ö÷æúVBú²Ÿú"‡Ä× ˆD戃¯8åvb>vâÅ~Ë̹~rð Æ à­+éPÛ,|‡†up $á§ÔJNüز */|Häâ-Ÿ™nèÃ9øé ºyð-íê´é)Í�‚˜„_ñÑVO«l5$NIø)¹/þ,™‚D“â+x{ÏÀw§Ð Rðm¹h kõØ‚>] ³j³öfs—½œ6ýÞ×ù/~¨L4íÓeQb ã>·ôVÚ§Ë®ÖÅÛ|jI&2ï$x˜/Žš�„?zäóü6Gr™ßb …8ø£ÒËxß–)Q[,xpŠE;6Ã8¸ÚiŸ.�б7íÓVqìHø#–Iût�V¬A1|‹ê¢}º@+¦¾díÜV1ÖQ�“ðCFApàc‰ñN� «�öá­¨p6±ðÓ$�·ódËJ‡¥›ƒ}ô(íÃZqö qð{‹yò¾\H—ÑNÍàu-Þú9 -éâ}¹@,F°6ŸÃ+âRJÿc_ÿI~«/3‹¢ZÌâ s�™ãàÏ–@Ë|ÊÚûe׊g’öÞ…Ì" ßeRA¹‘ðGÜàö&áoƒp©ió³A˜CGÂW•>¾ ~‰¹B-ÂÁG³·Í›~ôz§ÇÁ÷%U ù> z|šìX›‡_èáŠÄ:¿¤ =%ª†ß[V ” ?$ˆ®Y²VÐ-Òö½“6;HÛGkzNÞÞŒµoÞKÛ¿þÓÉb¿œ¶¿þÓJÛÿ—gÓâq©æR\<ýY{ÿ¸,}^¬¸ôâñ|Ð*ß �×SŠæUê0íGæÛ´ýþ�ìÿ÷~þöÊ>è“o%Ìú âþé÷)Ť2þÂ鸔õ\�SBÇ�ß[ª› Œ -Ì“ðuIjì¢á‡,?Ô9 ÄÓ“ö|Á©�ö,ü[8rà]¥Ô†öx½P) ‰7~l‰4o~È´)íñæ_çGÂ÷SP„7þõ#¦çà#s˜ -Ò‚„ß臺Œ…�ÔáB^›Ÿ2×ÒþÀÚ Î…R¹Á¹Pð rß^ÍZ�(ö”è—É‚GÅX4´$áoƒ‰ut@­§ŽÁí—ƒ¯§L!>%gŒõi4Û²÷±à‘ðC” ª¾FZ•ƒï.V ÛIð-5½iË'Lt²þ$üBÑÚÅÂReE9mü™â‡‘åÀ×’ž¤Ý+PìÉŽ’?h -G»V¤P‘J›~h¡ øå �ÊL€1"á*¤²&¥žÚP矅Ÿ‚:ó$t$ m°Yø§ŒíL‹BO±2@>ìËæ´C-*=zØ“àMQm%Xï.*=í1c½»(õ”Û@H‘ðS––„K³÷¢�ªN¥'[´ÙG¡'b¶çzÊ�þž‚]鉖 ¾Gh¾þÓ¼Z]&4/„ÿ4Ík¶îý³üáS­pñÉ×A÷Ôui–÷eúð–|¶•Í~ªâT£{íë d™}¨0õØ@tõˆ®|ðŸÞx�¾º¥?–vÜÚq^6úó÷Ôû°½Äf`w¡…Ôr9–^ˆ[2Zˆ\R¡øìðB„èRdŠy!F2 ÷2Zˆº)�NŒÐdÑB´ÕóµèG#9^„Ù2ëTá…H±@#Z]Kz17(]�vø(óB ºéBÁ@ ±ý#™Zroæ’U…½P‘Xà…@•ƒ•ÂÐÄpAä…HñíÐÒB8q�$ /ÄI`ƒ¼ä…©DYZ„p�,ÐÆóB´d6’µ´Ðh£º/@Iä _N �+º Äá…cDÝžaPùùEZs1;^<^”ðD Z7QSXªx!J²�®’"]F‰ç‹”hGI:ZˆÜ²Ž5˜!Äúz^„‘±dÞ�¬ü˜¡¥íÀ£…híf^�àd/ô6åE•=‹úA�”ô£Je…€d ˆ"^„@9H¨(x!Ff T5-ÄFe?æÏ°[zœùfCbÎ<ÙÀà^§ò-‚¡lu‚y䅀ܖ™õ…2d;„¼!1Ã<;A²|ˆŸS(DâˆÚy`Ì¥RFЉø‚ …êö£¢…([GŠÅ ‘RÁL@2¢+¨_ÓÉ8rSZˆY²óˆ ñHD)5ÄÈZTÆèHH‚ÉÝS‘¼jˆ'u º. I.Œà‡IžîÒÇB’ýœ�ä¦j¬}K÷ð­Ÿt_tÆ/$ãâ‡v®Çñ½»„©^¶Æ¿t@0½?l¡õöê'·ø«ûfõ…f¿UÚöa)Ûo5özT»öåíÃÿæ¶\ímë°ïá�ßè†8oüðù¸ ØÒ}®sÆ‚‡�k -v’ðý¾q0æàÃÁe§ ÇÉ@C ¾/Yyz‘ð]BOO~ËtÛ°ð³ã¤ á—ÌNx 8ø©b½`À$á§4>ƒôÚbk Û ៶²p×rðbc8ïIð.µ6È+þÈNˆ8ðc’: ZIø Øb ->ŠYG4’_$ü’¥Š›oñN÷"ᣅæ©ÉÊÁ×këG1ë®Ó͈„?bNÛ{P̺W�œ"á7Úð±ö6T³†�6û¨J3B›ƒ}ÔpÑ&á§lí—݃.á'ZyÑÎm W$íÜB0”÷î–Éô1À’ð[Ü›¶µµÊlÛ4ø«£|æàÏ–>Ê#<ì ,|³®¤í  ýÔNÅQþHBUÁA?:j¥ùÁöA�Å‚‡‚zŽ’„_á¼ñ´@qG‚OñVÚ‘…¬Ç!„#Á‡øÞHГðGúš‹áà¤cC;ñƒÕëe´?(=Íâ-ÏD²“wl8•¬KO‚G²sÑŽüàñ¶Ò²=§”uŸjR|Ô²¥ù}·‰v³îÓdƒ‚ˆ;TE!áßÑv¯‡ÿ4sd—9» á?%ó÷Úö,Gæ—8»ÀЇòü8»�m;©q‘µ{ñ�þîí•ÝT þÑ·›@®‡¿ÞquwÍ*òmwu®ëáßßõ™|Ðoòÿ»­‡ý¡zö¥ÿîÇ·à÷Šd¿ˆ~’¾^6µsäKj‡7 ? æì¤á�d¦ eÔ|GÑðaûD;>ZJ"чï 5 -9ø§£¤³F�~’±ÛX÷ô“"üéê½ið#ƒ~•,|uñ=¬�ç´“Tb"á£�d­ Á¨WÚÆ‰ ¼é¦í §Ÿä€~"ᣟdÁÉÉÂ)/¥-O4”Tåíœh(É{¹ÐO²à�"á£*¼7¾qÕ]´éAQøÞÖ‰~’E;´�v’Á;tž~’PÝpà‘��µš‡ï2Å;sžv’Á;sžv’Ê;s" ï‹7=è&Y¼3çé&¶hãG7Iå�:‘…·“¦%áŸv’CÛã4 ;+@É”Ÿq)´îM ë8ü•¬(;Ô©¼­´CÐG�%‡r%íNv$ËSćŒzC¼‡|ò¥…îð´w ÓW ðtên.gL/Åÿ„R¦ïžKQÚº˜2 8ç5DËï>*cjûrÆô¥ãy¢TÐ~:WúPv,/ɇÞ&. £?6?úX0m~/‹{WÒèQRôÑàîR¨óöŸÔÛ«}£ß~b�j)Ýþý­>û®¦Òíîï›�=¾æzás}&ƒ°}C‚‰‡ ÆæZ›ß`·JYø­Ò3F›~8›ñ9æ Ã׬çÜNÂOÑ1ÖÚ9¾æÓ�Š…GIƒÉ.>œÍ�Ü% þø�8ààÃÙÜ{³^­ãlöhÖËuíl^¸u“ðÑš&6í킵٦hËÞæåÎÚš�·9²$þñ6C÷A‚ï[’•ƒ¬Í´Åc³ÿ›•Ÿ’‘ o9øÇؼƒ¶·gsÒ†ŒÍhÒȇ±™÷e9¾æµY;Ûµ¯©8ü]‚àõ🾨êåüÀ…ðŸPzàYO³ÙÅô€9z]½Fzàã Íæ—Ó/ÏË®ùnÀ7¿_oÏàffêöš}ûÝÞÛ¿Ûuü1Ù�_¼½šG‚®Ûûù]šá»TS/·;wJí£¦úáámÖAA_ðÃ$ø�ˆ#�'á�Lkß–‹ƒý'¡£Òšdá£Xv8´Ù$ü’¬¼B¹®øÎ“ðÑä/[Yø¶P”µöÍÐWÓqC"á®�~sðݑߠ=]oIϤá‡É*4È`á—øÀôÃ�Ï-³w~йBDËÁG�tÀcÁŸ2¼éG™Ž�F_$üvYÖ<øOEú�ƒ?*ÝG8HÂ/±M;6@UVXý4ü”�/‰V$?Iø!k%®À$ü7Ð:x5épexRl˜BZˆ>tISC@¯|Ü[¼#YÔ×n}æ˜oÝô)˜F< BβsË Qâ= ÷h!ö–qæ÷Îv" ·-„.é8åþy!Bl¡G1ÄH­:-‚¹èf~íÐÀ33PJ‚ÂMöØ}x!J¢NÁZˆPYz -}óB /ÚÃE ‘ð8uÍfˆ5õÕΑvef PAG'Q�•¢¥�¯y!ÚDÑ Œ¡$ƒy”…æaï A/DJd€ùe…€ô©!xâ{oÜh3Äv±k/䥯Ì.C ¡]Ä% Ÿ\9ôÏ´3O0sË0Ë¥3· QIJÌÐr'3· eÄÚ‹™[†:“šo„wn6ô´‰V;§l/DIë!Ši!JEk˜¹eˆ%Šy…JcÐv6´6ØU›Ÿ’ -º—„¯}iè!¡ê´É×A5³¡ÍŽ�µ´é±†N‡·6ÝÄ6mc5Sé¬} ´ŒnSÚìDJ‚ Áç–½Ù)�!áyñ6¶r\-ƒ6=Õ2ËmzÚÄBy«¿Kz¡T TÔÇió3)9Õ¬ùí²=�µ¹�s‰ñfͧËMYët‹Ï.Úüì–á½^àY@5³>½`YÚŠvŸÇ¢A[þ†<¯/Úü€]ie¬@­¤­¡Mx•Ú�¤Jh ¾Ñ_ÚhÓŸ&®ÐаðK4 ¾âó¢MH”âímè[°;YŸöC d½,³ú\×HÿYð.‘NËÚdÓ¶¶Ã™$ëØü�.yEü§“öû"Wr)ü'd7}Öåéz‘+ɆJóU¸’óæól‰]fK^:¤ÛÒú·¼Å]©¾·W?ù@\<]ÇÿŽÀð�)4¸ß^ùª_¾ãbô!Ð s käøŒ]J‹ÀeÉÂGò&d>²78 ràyQÚä´á#áCL;†ó# Ÿх�…?‚Zî´Å ­îE[œÕ¸(mu6 #È“àKÜÑ -—„�FQHL“ðS4‹¶wÚZ’¹) ?dõI.’ð¥ -AéqðaBÆÝž„ÞpßÑ6O”1-=t6 ¿dÛ¦mžf(·  ?P&•¶yš£ ñÐ6OÔ1­lÚôû€Q¥mž¨c�´ÍuLg’·y¦ÂÌÛ<3¥·ÓN†V[(ç…ÜÐædš¶· *p£¾:ß—Ê‚™‡ŸâC»�Tš•Ðs�ðClÃRÊÂ)�ÍZ�®.ÛÜX«…LÃ�¶u‚Uš }ØQÇÔ (à ;ê¹–…Ÿ²{ѶNpJÑCÛ:Á)Í4mëDS_ÍÛ:Ó¤áL‚od@ƒ†_*yjH°ð õmx{goñpÞÞÙ!�hÀFÂGÓRÞÞ‰B¦½yð#kPa�ƒZ)ê’±ð×ÚßðËÄÒ…ðŸ±4ÏÒ8q‘XBA­X¯A,ùDZJy™Uzéx®;SÍ-±óÍÇ´•þŽéE­ªïˆ¢ƒö㇬Òô‹ÛL+º�¦½læ.²K)±G=>º�æöMÃñ½‚6?ð+Å$m~`XZ̓ïÓJÙXøð+ñ. µAR•…ÃÒ -èŸHø)îŇci!CG‚‡P‹‡?20“àaX -ÚÚ„]i-ÚÎ|üJN{saWÊi§áïäC ?%&ió1,�ä4 >ÀìAvO§}vaX²1ÚÆ|K®´�Ž%�̓Gm�G¢—Fw~JZ³6fX–xgžcX²‚!Š„�Ö¨¼g Ã’ 3$ü–nçmÌ0,�ô ¾¤Z!)çàïd›·1ïԛµ1»’-ÚÆ|ìJ5`U9ø°+)8¼‹WÑ^ÞãVÒ¤mÌÇ®T1´Ç »’–„»R9mo>v%+Ï�‡[©”¶7»’nÚ©óÚ®A Þ%öÐöæcWJ´8#áî´{Ó/ìJY°„pðáWÚÉÛœáWJÚÉáÚ¯„zÛ,|ø•x³sìJÊ:4_Û•”·5»Ò¦mÍ×~¥EÛ›ïK¯‡ÿ4ÅQ—‰¥ áÿªˆ¥¾H,Ù’î~ béÝÇKs™Xzéx>TX»¥zýÈ„ôWE �ŽÍhùõ‚º”EËæ2Ý4|ˆÈ7*>z6û˜ÓðKv2q|ß(ÜŠ�„�f�‚�ƒµªu³à]Æ&iÓ#V¥%ÿˆ�p! Á·hXÓð!vš ƒ„‹ ¼·D¢]< ?e­ä�–¸ã²J‚wéVÔÍ"á�˜.ÚÎ ‚íôÞaÁ·ìIÚÆ ‚-̓õxm—,4ƒ Áë–Ø æ*~È\[#9ø¶ÄPŸœïÒêð†‘ðG4æ$¾›ÔbzÌ[¶ YüP hÈiø% ½èI𠉮!ÏDÂéÙ¸Êsðk‰×fÁWX¨JÂÑ´#3¶t¨~Hð-«Ñƒ„?Š,1>e–i -<6Þ±Ûuo!þ>òwºKíE;2øµO· ¾Ï.Ôû$ü–¥N;U�_ó„㞟2 )h¼o1kçá‡T%í» z  Þ%ãs!áÃZ²hGfÐk¡ÍÛš³Š@Úü ñ>4ø”£Çä ƒ\ëÍ{w;¤öЎ̇] Þ‡ ìÚéUÇÂYf´#óa×jCvE¿c×^ÿIž'ÖevíBøOƒ];tÖ{ŽÎЧÊÖ’ÎÃf-E›K“ü]MŸ®ñ77¼Ñ³u ãɺ„.¹_eX±›Ò}_=$¸® ­«›ß؇fO�ÿÁÒ�e¼6ÊÆÌ)¹üÃG¹™ØvÐŽ�Ô$-D˜dlȼç¢'2-DªÄäÿy!RÆúe‹õ™µÅò{á…©qä h!z‰ªâxÇ �êÂå•bPq›úv,ÐeÌŸbJÆN1VpNL¼)uÍîÑBlqZ8VòB h3ßnUè.ÏÅ“Â%–ÃŠÉ Ñ2¦Ì·[ÍÄrCÏ Á0ßnut*Xy!Ðøú܇h!-»l˜?E„ÄRêÛ芇r´ ›iS_îl©FFž¡ ©«aF(°ÌÕÔ*«6õÍnÔUCmZ„Y2ZÌG=!Á|Ô3R É+‚-Gñâ[ ùºƒ#l“•(ÃÅ‹Pâ“Ä' Ç(óCgšbÁ<œAÉQ§~?/Bˆ.0ž¼#i§ -„»¬DÃ^„†'žù¨CeI^^„‹]-D¢¾!ÌÙ¼ySÕ…¡ŠàAÕÍ .;5ʳ¥-D›ÌæÃîóS®‘b¼+õiO‰®Si‡Ê�<�y µ?•h!öã…p™]Ô‰Ú#æ¦�BMªŒ¹‘C ¢k3O€Ðƒ¤�¼%+’Zßâ}:@óB„ÌvæVuˆùéÏ á(}¼¨!Fö ó �HjQ÷òlY¨±L µHõqWÊle^R!1?å`y!m>¨›9Ä#“ÔÇ�²¿ê¨\ 1²Â áa…82’ÞÌÍüž’äUC<­n°Ëb’ #ø!b’g†»ô±˜d?'&ùÑ�2â[~ßoý¤~IObeÒ+¸ŽãÇo¯ö�•Y¯­Ë¼_U÷æÏ>4Z\OÊ=Ö¥Ç÷QuÀlëe?Ë3¤ì±[3DAÅI á[¢¶3DÈP§ G¥éÚÌ.½Qʇâ¶8/ŽJÆ}ç¨dÔ%‹£RâÆH ‘Ò�Fð¼PØŽ3œ”V3×J -B–ýr£�-s'ˆo….� "†(d͘KVQ¤wV3DJ.'®YE¥Þ�’ŠÄ!n»‰¯…êªr2'Ê\4pu'†hÉÒ!~,Яzu&óÍóB棈�tuÍFŠiQ×l.)‡�™"dG(óYä ÌÇ0C”É´R×lµØ$ó‡h•Þ‹¹dOu1£.Ù‰SÌ-pRV ±-ÚZ{:sÅB`ÓÕIÜÈÑÜZG�b£ -E—,z\ï=E<¤¡Íu˜—,46ãE]² Åâ©*›*§.Y_²»©ÏÂ]réb.(G¥O”Hà…×aÎSܲÄOú_k$uÉfJÖJæOQèµàÔ%[èe 1ÄÈì]Ä:b›2sPÚ*{ð"ŒÉå†(‰Læ’…Ðfz1—,”66μâAiÓ«˜Km²U73å¥ „zÄê²¼‰)(èl<•ºdM¥+�¹ž¬DOñ^tÎ^F]²hž½Q{‹e�™Â>´Ý™Kee£™³”з)ñp�Íî¤.ØR‰™bþh§½�º`ÑQ5¹ˆBÚ!,å…@[m(2‰\2™¼ÑØ´.bˆ#°™`®Ø›× ñ´ì$. -l.�àØüìVˆr3Â÷ï?ÿâ_¾ü§«ß¾ûù×ïßý¯¿ÇŸþæ/xÿïþòêݯ¾þúý—ßà�>;¿ÿÇÏÿùO_}þþO_õÄü\WN®¾:,¬xßý€.Ö§ñOçÿ"¸µ -endstream -endobj - -4738 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [182.8334 688.1684 188.3334 701.8304] - /Border [0 0 0] - /Dest 4456 0 R - /F 4 - /StructParent 54 - /Contents (1) ->> -endobj - -4739 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [427.80704 647.1824 433.30704 660.8444] - /Border [0 0 0] - /Dest 4457 0 R - /F 4 - /StructParent 55 - /Contents (2) ->> -endobj - -4740 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [386.99667 619.8584 392.49667 633.5204] - /Border [0 0 0] - /Dest 4458 0 R - /F 4 - /StructParent 56 - /Contents (3) ->> -endobj - -4741 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [513.6514 354.0974 519.1514 367.7594] - /Border [0 0 0] - /Dest 4459 0 R - /F 4 - /StructParent 57 - /Contents (4) ->> -endobj - -4742 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [157.93703 340.4354 163.43703 354.0974] - /Border [0 0 0] - /Dest 4460 0 R - /F 4 - /StructParent 58 - /Contents (5) ->> -endobj - -4743 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - /f3 4372 0 R - /f4 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 59 - /Tabs /S - /Parent 1 0 R - /Contents 4744 0 R - /Annots [4738 0 R 4739 0 R 4740 0 R 4741 0 R 4742 0 R] ->> -endobj - -4744 0 obj -<< - /Length 4497 - /Filter /FlateDecode ->> -stream -xœÅks$µñ»Å8¾KXÀ²Þ�* ê¸G ªHáoÀÛØp©à»,KUø÷©ÙÝ™‘Z­–fg||9ßîjZ­Vw«Ÿš«ÛÝÛ‡›»]÷Ùgg]wõb·»¹ûåþ§îû«ëwïì¿úî÷ÛÝïﻫ¯îo~ºßö_]ï?{óóÛÇ›ÝÛw�g_|Ñ}ùêåÙëo^ž]}÷þæñí›—_¿êøðëÏDÇ;Þ]ŠÎqæ­ºsJ2#œîî~=»ºãÝÝog¼ûíîñìËë3Þ]oÏ®x'Twý0=Üÿ¹þõìû�~àœÿÀ¥=üUnócwý�³××gÿÂ1&Þ1!V„Ë#&fÿ÷ñðI¸ã¯úø÷ð+ªÿÛ±Éà]2ô±¶0I’˜kæ�¡&:!H&�¨+½é$ï>J–;ýÊ9Dúy7B©”@ÃóÇ¿ÛaÎþï³”\È‘¦­í¦Ó�9£µ; yÞ²‚#ØÃŒ›¨ Cy\™â›N˜ñW‘ãQ�Ç��bYÇa¤r}E#|Þ°+:;ìÞ¸+ -ÌK­‹ÀŸ«˜fÊå}ø||,âvþ”§"J DéVäÅ÷ÿûçÍãÏÝG÷�d•–LšvQV4ŽP ��zð>þ­ÚlCÙZÆ•Ëùî9Ek…Iç'ïÞy‰õ’--sÛdŒ‡¥M1ÌϨ2‘¼Z8û'Üj†6ió[ç˜QbÉÉméQþû5 ­˜õ½^Šé>Z¸•‰>šT·Ôa6òD‚Üy¶'ù$å#7›Ž�'ü^�·µÛtzØám�Lˆ�U&&­òF‚äü˜M -éÈãMôjÙýŒbó·D0—ûŸ6ÑÑDO%úo‡Gnq�Ý£t‹ÿJmÉà®@ôÎ P�uÑ,Ú‚m«˜·átÑ‘‹ÏãÞ@�X¹?›Ëî6�¾‹u©–Y#dä¦áÚ44m`�ÖÊ–v>꤀'¡§Y0²¡±CΛR%“ �ív‰�UÃD -æ„ ¦…«j† Ü?:i`!톉À¼7eóÜ·\ -;ò”6gE^dñÜ®…pâ3N"1›»4©¥ g’»5 „œq¸SÚO†Û`¨ÁKªrl¶ ,!Y6y°b¸D«û|q™jž÷”jµYP»Å&Qº¡Kã‚‚ŒŒHGÙ`¸²4â'©Ë•eF/Ên $.:š -GÐÑÌ=ÐìÊ7f9�dæEèÏ&ƒ8Î0 ž†Z¢.þô¢$¼ÎÊÒ|G]îÆO‚ -pÚp¤ÇÁqÂa[7…8j¾>¸à¡–÷(vK&ÔGŸvQÈ -¦N€ÑHR�µìú´œZŽ“Ž)Iɼ_ ü´úÎìóÃӒŦS�ŸDù à���W×7pê)ƒ•‡XÑÝF‚PÙrÒ` ",cT�“¸í)˜ñA�Râ1U‘nRÒ‘vÅÓh - -a†wd¦ÆT6 �(¼+c1å%“Þ[·„—›l1‰• (oYv…éumzÔq’éU¦¯bs UpLrmýrEBÉEã‘—‰æ*nV6,Æ NÄôÙgq,+Xc~Cêq˜”B/ªV.b«« -fjrXÅ”ä†È€b¦Jª¨dCý -2Ñén $M�ز»(ƒa)½Ó3 -óm‹Ø�ò@vàáãSˆ}â‹V äÐOËÃU3KÇä5)�B -B�­³.é–’t 3}ÚùTAÿP‘PθäÁs?{”Ä"BÆ| ¶z;—³0잤²ª¶ÆÒlË()“§&È„ �ƒ ‹¦Hµ¥<Ñx0 ¶`|Q°•çqQeS>º=‰{Ò£noÄ’5¥àH¥àóaY LQžÁp&ÆtOÒ‹ÉŠûæãtñ£$ °'G°Ã| ~ü>-e7’Þ…tTÓé Õöë΋*x’´aÖÚJ¶h+‡Ÿ«¨a¡Æ ×Cm$¡ŠÊ¼‡œ?�uÑQ‚Bp $S¥ú¶”®Ä&‘Ø Ét<ûÑ.Ø/ÃTë[É��‘‚q¾ÌÒïùŸã -Ô3Å�–±Gµ´e‡úäq¸d®º¢ÃgÇh�a_Î’æSaö s¢5ˆ’üéÍ3Hû¤V¤ÙtaÒv¼nkŒL0(´‘Ò›îÒ8f$QͳýÓ­,`)¥`ÒHï–ìe0ÎV^J8â DB9§é’<œ²5Þ’A3«9÷-´©îÁ~�£N¨"‰y™Jh&‚çöéö¬vжœÏÉ Y8Wzª%Üû­‰I‘ÅlÉ"c¿®WØÜ™ <© �bRøE¶A-„m,S†{Ukê80Ç%ÿ›©ËæË8+¼š°ð ‘ùÅÆÎ#Óñdi·A“±;k 6ínUvU‘‘äÙ£¹X0¿“Vè)¾Œ[ÈB–Â&�VrS“Ü@J® Ì»FÚ°Ò_�¬4a¼8C¶ïHåajNÙé�Ι  �v~)èñqC’ ­·bĹ9Ѹּ›"Ígçi/­Ôbw€7O›>žº|TOÐë†ÅO lŸ¼ ZÆ3>jN·µæ¤PkÃ|X!Ìô0#/Ö±Yæ¹à¡ùôJX±¢€OšÔr'dr�öÓlšJU# «Q¨°k¶ÐäÖ:q?gsÀI�ˆ)Uj„гC•2R=/æÉZSõLÚà*Ô¤S�Ò©$“jQ m‘_RM4iIÆ`„gÆ=] F«öL•Jbi8@ÆîµDPvDÀE*Ål¢àÿô€‹Æ*ô¤à,„Ï—8ïÙÊW ¸ä4]pѦpáLø M mêW8$A¬«^4Vó£„b–{mŸnïÖ¼€ ž¦‰ã”v¿<›û�/Ô”øõèk\àHuÇ5 |Q”%>Œ ‡h"µ‰Y£$ó±×JÖoVÚ0ÊýæpÚxÊpZrÍr¶]T Ó€ÊåX:5½Q myʦB-œÊ¨í,òWª 5�ƒE¯�(NŽoLÑÍËŠ}›šBiÎ"ø°&ÕdìTÁ¤^�!¢-Q,´ªÅú[�qaÊËî,Í!nÓÙãô´z 'dI §}9ccÝiÊQ\&ڱǓ#Œ"Yþ¤rGs‘MéT0œà¤�—KuÁk mn9Ô¤,Pµ””ýµ† à¨þ¦'¿,€33<’rÓT¿Ñ#çn:m眧áu@%²¤ö)9.yà© —{`F×Ê’ZísÃÚ¡W=o#(Ï[Ç„\8ø¿?ç‚c¢vûÒ–|à”bZPB21¿Ã(_K±Ò3‚†‡mþiu2ñ)œ8“­Ãpu¸õ<¨Íˆmx)ý˜�Å.ú­wñà; égZ¢–)¨¿Oè\Ä£/j¼áû>…âóV[Î`±1Ã= Zi³DDÛ.RÅÊ£L&0ËÄ~ö«ÚìX€ÉˆÀij×P VOd¤bÞô¹ŽÅÚ±½Â� ZJ+¦í‚XͳZÆ1’W¬Þæ¬Ó¾xE5P­xÞ©Š¨‘½ëÖ(&eàr ]Úds³„q,(ÇÕâék÷äÌþì[õ*ÓפÃb¥°ž m–ÿÀ”_e5c32R“3%0òоZT•BûÀ'q¶–ÓNâœ$å“8;ÿNÛ|ÃNk¦m Ax;íRÍl"Ì„EéxrÚÀ’u*˜ kÄ`Oé‘Lð¼YÍbÎ!¶]Vž{ª0†¼~ t•BºE0¨¦ÊF£®cù&rFzÔ’‹ -ˆm�yV‰‹’DôÎFI˜Œ—fŠ/ÙÄ¢„eB-*wƒËÝS«?ÍX�¨~P�iëÜà1‘xy…Å |Ï �«;Ç)üíg«›QHJ;»«)éÍf‡ 6À—{Š’µ•o$'›SZn:£¶ððÌß2ÑDUuŽU|’À�ngò]/ŠK¦�Öj±<㱈x�­dN[¥|f=qrT!oF=3;ÊBh|< -š®�ØúšDu‰ }`•‘¯¥]eÀg竌lö§Ëç m¾R+gça.(šÌî×d�¼|Zzϼ�ʯ`zg¢»`UÔM³ó0OÒÖe�³wº\xub9ºÞ{ª›M^g&�dÆ -W¼Îb¸Îª~�…µÔukàv Ú§è6ì&!�ÔZ™xðôyœòwåZÄ�Yމy.U•,ä4}¡¡P\9‚,êÔ· Ÿ§ -Ì®h0�÷7¯†,,$H‹Ho‘�J TÔ£9– &®ß˜Æ?ÚKÕõ’—= o˜¶~�î<å.w˜°!˜©¢aéuÈDâuűدO-+§ª¦ºòYehc½tA]m"ÍG�jÂéó$÷ xˆÞ`G“c4Ùjc_ƺڰ墲µñ^»" çæ £²¾ÑŠü;òÊ áó|AØcŸg}_¾1–®ˆƒœ*SÛ–)Úîòñ’ùŽ_n Ìï콆ѵ˜ ?ki„¶¦áð¸q»Ùçã�¡ƒÓÅQ3 Óœ@Çà57©›ú%ûuöÐ(lNŒIÕúp«¶¤µJÿ±†FÁ”Ö Œ·uïíP‚i¥…†Î{|ÃÙØ’X…^³DÝÔuX¸TÁ¸6A4‘«©ñ¬s¶*ÁÁÔ#æœz¸Ôž-É•xŽ jC•pÆ�ÝíŸCŽlÜû‹wò €è—v¶aR)D{‚ j8gÉx¤PŽY/I·¢".·õC,¶˜¬c‚�UêŸjS÷¢á/PD€®Îù)xêÕ$éȼS :ÓØn`J8Áiu%Z[zsœÛ¡QèôÉž*M™iƒ¨«ly¡ðÛ&è^¡S/}¯D‘†§tf926)¤î/VÞ. NÎ{AÝa}Z0ë”ãÅ7èFAI�|giïN±HiLÍËíùm_fž¿4›÷¼jB)–B6j¥—ä¸/h·ÿ´Ýý0¤¯ úÞ<Ñ_°¤k“ÝyæWy;©È¢%5ôÑ÷îYÎlPV­#ð…-^üút&xÚ÷� ø -Á™2KJ¡f%ˆ„87,ô–`±^…—;à*åæè,σŽÚa‘]2Cüž² ÃE—$‘àVzuLa¦j{ -x ’:Ã^õ ´XO$;^®£˜¹¿”Óš“‹6"r›·¦ÈKèƒe6X-«„å¾F|èöokÝ¿¯ó@² ˜(¥`»éë—N•Êá|kûaÙzÒ0xþÖ‹ìäHÁÀ–E6­îCîRÀ’Ö‡ôfh¤ ·n‘j¬ê¼•’Ñ"%3-0(\q‘ÀÌ^‹U¿,NfkÈý. î/¶»·7w»¡v·»¹ûåþ§îû«/ßívï~ý±ÿö»ßow¼¿ï®Þ¼{·»ßö_]ï?{óóÛÇ›ÝÛw�…Ûm½w¾3‚aLX§KéÿÔ¨T¶ -endstream -endobj - -4745 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [188.99736 732.5514 192.29736 746.2134] - /Border [0 0 0] - /Dest 4461 0 R - /F 4 - /StructParent 60 - /Contents (Footnote 1) ->> -endobj - -4746 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [395.27713 630.11743 398.57712 643.7794] - /Border [0 0 0] - /Dest 4461 0 R - /F 4 - /StructParent 61 - /Contents (Footnote 1) ->> -endobj - -4747 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.57414 486.6974 81.07414 500.3594] - /Border [0 0 0] - /Dest 4457 0 R - /F 4 - /StructParent 62 - /Contents (2) ->> -endobj - -4748 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [86.57414 486.6974 92.07414 500.3594] - /Border [0 0 0] - /Dest 4462 0 R - /F 4 - /StructParent 63 - /Contents (6) ->> -endobj - -4749 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [322.33093 428.3844 327.83093 442.0464] - /Border [0 0 0] - /Dest 4463 0 R - /F 4 - /StructParent 64 - /Contents (7) ->> -endobj - -4750 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [333.33093 428.3844 338.83093 442.0464] - /Border [0 0 0] - /Dest 4464 0 R - /F 4 - /StructParent 65 - /Contents (9) ->> -endobj - -4751 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [129.7738 414.7224 140.7738 428.3844] - /Border [0 0 0] - /Dest 4465 0 R - /F 4 - /StructParent 66 - /Contents (10) ->> -endobj - -4752 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [470.06073 401.0604 481.06073 414.7224] - /Border [0 0 0] - /Dest 4466 0 R - /F 4 - /StructParent 67 - /Contents (11) ->> -endobj - -4753 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [282.75552 387.3984 293.75552 401.0604] - /Border [0 0 0] - /Dest 4467 0 R - /F 4 - /StructParent 68 - /Contents (12) ->> -endobj - -4754 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [243.14856 346.4124 254.14856 360.0744] - /Border [0 0 0] - /Dest 4468 0 R - /F 4 - /StructParent 69 - /Contents (13) ->> -endobj - -4755 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 82.78937 82.56614 93.517395] - /Border [0 0 0] - /Dest 4469 0 R - /F 4 - /StructParent 70 - /Contents (1) ->> -endobj - -4756 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4378 0 R - /f2 4354 0 R - /f3 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 71 - /Tabs /S - /Parent 1 0 R - /Contents 4757 0 R - /Annots [4745 0 R 4746 0 R 4747 0 R 4748 0 R 4749 0 R 4750 0 R 4751 0 R 4752 0 R 4753 0 R 4754 0 R 4755 0 R] ->> -endobj - -4757 0 obj -<< - /Length 5456 - /Filter /FlateDecode ->> -stream -xœÝ=]“·�ïó+z#嬵o¹ü&;e;%Ëqb¥r¥}³ü°Z¯]Å#ßf\wù÷©ž™îi ÈöZU÷`�v† ¢AÄÁëç»wooïvݧŸnºîúùnw{÷÷û»ï¯oÞÿòÃðÕ«_ßìþõË}wý§ûÛnöÿíö§wÛÛÝ»÷ÛÍçŸw_|ùbóÕË›ëW¿Ün�Ð^¾øöËNŽ¿þÏFu²“Ý•ê‚Ñ{e»`{¡M´ÝÝÏ›ë;ÙÝýs#»Þm7_Üldwó°¹~+;¥º›·§‡‡�›Ÿ7ß?{-¥¼þ÷ZjwüôûχÃ_Ò_vWN gƒ1¦Û?ðZJ{üLŸ!G_Ð�PCŸ–gÖa>Æ�jwÙiwÓ]vV‡?”Ñ{-¥!@�øà×R«Ë®?Â~’ù D.}s8lŒºì®Ô8å›2E†ÔøÂÓd†!óëÝðÿ?NÿËŒ:Ìz9Î’`2Î2ü{øOÓ¯:ýN-öegNh+v…4{ÙM$Q›8Ìøô“aÊ‰ç ˜àrË õsÞkiôœùNëBñd¸ìÂø3Q?üïÄ1?t7Þ|u³ù/ZS(VS'\ð«i -@­“ˆƒåÚ¿–ÒFx)cÊ\3â=Ìg0ä§Éº>d�gZ‰vzø×w·ÛŸºg÷ÛK‚�*FÑ÷Áø.X)¢u<%½ð)�"xÙÝü7ƒŒ¡æïµÐ‡ù[W’^^¯ÃÁf\fÍÈz(¯ÞRÕ.Í\ƧµLÇP3̇üˆ·®†2j®Ã£s‘ç)WB©¤½ŽcOß“Gùp´DÖ`Ao�'•œªÓ'YÀŸ€Õ'éÙãx"hA4-«Ö´½²ç ËËÎLë1êZ­‹f‘ -Bégk™riJ[À‚ ¸dŸD`g¼U “£´†Bê::©.ŠÈj�i':~Ž\:ꓱöø½ø*žx­¥�REß¾æZC~Ý~|Ùij§Æ ¥)ÙE\"¡p¥óvÏh+öj [U3ñ«°Ÿ¡æªíðèEªÕ�ó”zCãæM0J¦��K’n\Oò³8jÂPgæ.Yø±¬&”Qh§¤ðf«ò—�ñÂF'•Ïë>´ø#£ÍÁ™dˆVlèãÖ6þÊâ­�4ž¼)“³hÇù¡úK]¼mÅ+P¦�$µ©š -J�„$§T0f“ò«]|Èö¼µŽßÎÏ©Hè@úÍV2g0`à·§•B ·®jI™×¥7¦Z­9­á{+\/[öÒtK›b6¿+@ÁK6¡`…±ÒôsÒ~túç±Ë‚GNâÔ ´˜§y�F!�‚HÑ ˆ]ù N§A�CZþ)¼o2:¬È5=Á5FI¢4¾†mÊæä£™�ŠŠ™g„ò6˜vžÿp@thîOö¿œdŒ²á´ëͶXÌÀÀÕ¬´8DßW&üv�÷Γœç9’ÝýJ ˆ¸|”¢× Áð™0Û¹ŠÍ®AcgäqÒ�ÄSç`ÀŽ )\ÿÑKÞŸçh[û¤z¸òáWr‡£e6 ŽW±l‹A˜Ã’z)¬÷Ö0kªù5=b®F…dwÀñŸDò²»òNô1 <ªÝlOÞÍ=¡“¹AÏáæjÄ"™È0`è…ÖAê*ÒT¹ÁékžAÄ*ڞ葳#(Šƒ -"é^‹Þ{WEÊòvæ“°Ö¤Lg,°M¥Z™Ùoo“ñ‰j€L -¾Eq²CsIBÅ‹¬´Bkç‹» -¡]–• -l¥H/Q[)wâ>àÎFsEªR¡+§µ^)žªsXÏïv¿Þþãæþÿvݧ_õõ×R>ÿòór�ü£4…C–áå ]6¤à­Q6Ú.’U¡t@”ÂGé©ð¸U¥y5j‘H+&0·tqŠ@‡ÂA‰+U&WÞà›>±¢† @$a?ô÷Ü‹Øn„o!ÁM�/ä·Á#tzûјƒd‹lr;Ç ¹íäÒÔvI›ñ±c„²-ÇE!l'… Î3O!ÿÓ’£Þ‚ be½ÐrÈÅVÐâÿ�¡)7[»0lq~ îÈ,.™ï„£N�LÀa�ÐÜ(‹=ªÏŒYAN¹šR):PZ•(Ó;¡CP¦ó& -«Ô#V+hM"… AéG䙈 ‘:ÀÏ~½ TÁEEèã0Ó"ÿ‰uŽªÂ©%%¤ «¡U/l\#ºûlE©±¼/] -ÂÆ^ëÀƕШbÉx`)£àî öÐ>[$…ó<íwœW‰ð˜Ó¡hÊæp®èâ©iÓã1—©â›ü¦Á+é’4}7V¦øŠò¶´øî·Y@¢W”4(T^U:“FáaI¬-ëF2bý!¼HíX%$�ˆjŰ,ŽžšµÂ¸±L)�͘÷à]¢¢ƒ, B• mNè"MæÇhÎ…Yìø�ÁaCÉ䈀„'ŠåI´\Ù/J€ -HÓíZ34ɲé‘ÜŽ“¯.Ѝ™%³5qK°N÷òá媱¤ <'ò®×B¹¦Õ\Þ¸TAº%…ò:°U7䡸à‚!{Dp‰­0æ!?é$P¼ÁÐŒ.X@ô7EÝ OÍf:EŽÖÄJ¦@â%ߣ•h"’G�ÆÍF4r«cÙsñ~ ó•+%%ÀF�]ˆÂö¿eiî ï(†} í臺#\èå¬^ÐBŸ-§`%‰e –Sø‘&;iÑ*÷÷ë–Ôê�Aç¹ %-À‰�·"š¶ðuzP¡”´aÌæ5‰ÃI¼J*Í‹ªš“½¤(K -wÐԌ͋Æ.° j޺ͺ-qk×½ÒkjXªkOŠ1F²ãéè¤ÃT<ҡߦÐÒ:¢'ɦY&¦™æŸãJ¾ÕX.¹ÚÔå •pÚˆèS ]T'†­sN "£LîW ÎW�ªÒá„Ã�ýHì9¸ÐŽ8뜂eÊ¡'Ø NTtáM''v4•¨~S\Y*á íptVºP³´µµ©£@ãuÆäRaÆÝÎm�²if´0©¯C„zsu‚¨Ð±6å6²ÿ™Þ'ƒ¹6¹Z6ó¾|Žr[¡ŒYýå'“f눅ªÄ°ì©Jg‚p²)d[r#ªòÉÁÓ!�8<ýŒJÈ&#Ð 2àiÇüSgŸ EhÜõP4¹˜µKV–À–„� ðî‘z+éiq<=G˜üXJg±K öHr(™†ƒª‚¼S -ì\—•{£u¼ù’гyš½•f}Ó¹Ú…�æIøhý|"ØêG¼èqÀ8›M¥¤ÖÐ\@ ×,87ÛRê"KåT�­/ÿ_ýö9®$¿OË“Ú"ؾöà�ñÜY'�0±‰ýÏ-›�±V8­/èSéšØTø0‡UQí ªßÐdÙš9bhѤB�@¿á€bÚ½ƒ§^. -†.Þп-ÌŠx2‘Nö�g”'uæqâÌJ¤‡ÑqFv-Á‰$£!KÝ0�ÑìWEgâL+2ó�ú‹l¬5k‰—4›Á°±AŸ­Øcòe©Ï9ºûØf‚8%¨@[TB¶"°4Xc©°Qô+QÂÈ`©PQ¯ÛɰŸý«ÒìT8£÷"D½î"€ [g�)þÀc}ÕvN£`MK4™ýxð‹<Ä–BZç… l¬)¹´¹Ëèï"ª”÷­¤R­…kÆK¨Àö7î>–5-ŠAƒ„©ž³Â›9¬´-Æ{†�¯äl{µ# ñ!¢Iãø]‘ä¬ïc�VöM¶Ì¿ûÊóÑ:k�•vV‰úYöçBµSëˆÕ³ðƒD4‹€NxHD°.5`Vzq -dU.’l©ÅIQK¹Fáµî} ¿UY–²kŒÖÂÙ›æéCizʰ1:ˆ¸Êô)MO6¯0f¥·ÿCazG¶Ÿ0q¥·/Ù޲fŒ5™د êžpB_å£ÇZý ÐòáôHUºR‚&D©­Øðª|8Íîc*ˆ0¤éBx¤;�z˜ 1Ì^ ¯eŸ=]‚‹•¨#; õÞÅ–w­Ò¡Ž4Òt/B0qJNªi@¶u´²‹:]BmcÊ:a£Zƒ4±5ö`ðÂ^Â܉ò¡:(Þ˜ÉIm™Bì› Àt@ \µ™kºƒdÓ-hu‡"I5¥–UÄqù䡱ØbV¨5æJÊÝ÷ð\ð4‰^ÜÒº$´|XIZ!£[±çZår ÔBº¨æ„g�œ£sðyn•Ñ\€i¬¹ÍwžÚ§;«Ÿ ÆnRÉ;£Ì9&γá•Ió’$ÐaO `æöæ£&®$P”Ca½Æ %ð Ug -P… RH/ƒYA •]±/2åYØ!`ÛŠG•5à)ÏÂF'‚�a ½ÆsšìD1{†+QOs‡*9ì?Ä¡Jφ3M/…Õ¦ÍЯïÐ9¬ˆ?ØÝž¶öŸ¶§ pN‡!DØ¶ÙÆ΋#¡ùÈ4íü�ÆÇ§~D) YY^â]²�YˆBÚàt ;T)@Oy!:jœk›>Q€CƪD²7|oÚ1©S�”e§û(¬7ά@ˆí*2±à 9ÓÅ{¼€ç³öp$Õ Š®™kQ"¨–î< 8Þ¯96é ¦/œT"jÙG˜M ïX�ë4ª`þV©¶`X¢v šÍO–,Øì&¸Úæã+?Ë$³¯MÜ8Á_ô@­KUf!­RÇ@Z‚:¼´4ÿ "4Ó´Äôd«Ò´µmñ}¸Š@xئ9§ÓK·Ì°çŒí…5 1ÿ55ü¹M©l/ú8ä@ép*8�9M³úž\±äY·¡§ßþ¬[ÃjTù}�<×f‡Ž~Ñùvf8ø}Åãu�ô~�mG£Êé ¤÷뢈η-ʨ§œ™¨ZÔ‹,ÃŹÖehøc°3š…:9š£jÄ‘„@´ÈÍR×lgH Ôé"4ÔÜ¡ÃÿIžé¢Z5°-˜Œq"„†`ì9øøí_-p5ŒrÂ(cõÙïöÚk‘ûŸ°à~‡uA8o�â�,xüQ]<<ßìÆæÈ|®Úãi6äÂüE㈜ðFZ²çýhÝaÊjÎP™§)Ý �‚W½å’‡< -¥´à¦­:–ö |K*á�jºSâ\]Ú])¯„ò}Ow#¬TosŸ6�æ;§³Ï.:@ˆz„„AÄd:ÚŠ.9rO˜¹ßÎŘ9¤ ²àD1·*åöKbÑ'Ô­“¯úÀÚve ->JQ6{N6u ¢�½‰+ti]× ¼R&gÁfÓŠe§]éæO6l«‡{ùt[õ&‘$¢îÎ2Ù{!µìûÚ«QÁøóÖ˜¿l¡„(ÛYE(Õmg› )*gY ˆÀ G=­÷… £Ÿ’H8_ -C=Ì*)X5ÇMÓýËœ¿rÔÊ}Çl’±¾2¡Ì` Ÿ�ÈiŸ’ˆ³ÁZí¥ð¾©Òìj©%ɪNèê�$e®û�vªÎÔÖ$$E•ŸJ²¹Ãßô¿‚Òp-Xd�j%¸äú[H縴”Î�ï^RÓóáåÒu–ÌËírÝ笛²*µçï›iµ L$rÊeüS“jÁgÏi„”-!²Õ<<Ý‹è‰ 6àEáU› €öAý9ðb%Ñ!£€&z¨‚aŠ· g—Ý1 �­VüMçÎ4ÈŽžFYf#Í,/Æ$keÚ�“uú²†Ú©gK¡wöUP‘-ÖÃñWÛ|[Ʋ A‚ÖI׳×aÂAKúO±³‘;(B‰8XŠ-jû“ŸÂqæTîV†}2{ùzÓP!ítÐbia™¢ÐÞ³ZEçÈOêê…h‹*· ‰:AŒ3z,$˜eÉgKÒGs½`K*ƒíªU/|h‹ "¥=ê½àƒí);â‚CAÿT¢˜ pž�à¤áCô+°møxxÞáš*Á´þ(ShJÕb�‘Äʶ>,UÒNXyøÅB_ -' X]ÁÕ ¦�Ÿ’~¾�NsäðioWŒ ‡>V¾%¡f;Ýhé…TmQ¿ÌyYÔþ?1@)Å\Ô“ãÔ0¤—itF�Ê%—ý,ŠÀ7Þ­xf[­ °«€�ôq¹O±\#²•(*è¡pã1;o�rÿETÛyk \Çu1驯g¨{cÂsPŸwè�ôš‰qSK&NÖÓÜjî³MˆÖINÖ—Ž‘-P6ˆ º­>O„%ÙOm½Žê™%”:a‘9Æù…)¨ßºð¼Tb²–p©Êʶµñ¼†B+—¦[�Á$¨ÔL5‚MÔAªOù¢µ"�=ÖXãÎA”„›­&PÆ -iuKø±¹'Ô•‹B7«–aËÉ’Á¥¢7À¶ð¤ƒDÍ1ö67y ", Æd�*)= -TÛ‰Œì*•WÅ2Î۴롾¢!3 ™g�eiT¨Ÿ‰KmŸd§Rçe?¾àoIÀ{ÉPcüCœPëÙ<¨ÒR˜(MXãjÉ]Tˤ÷ÎW¬ �ƒÑí%FbŠ5ôXlÖ®ÕKáÿÖvRnexú•ò è�:}ä*�àEoDß„F•Œ\‘¥Ü´{О)¥µ0}ÇQ‰´êïõŠíùÃîÝÛÛ»]÷ÅKZ9 ­¶}0½•ËWÙ½zñ×�®ûß�í^n†g~Þ(ã…ôºï;Ùýcó*«‹ôðÏïn·?uÏî·—”bê�sÇ~ÈóN�6¯w…£K=•ŠæèîF'¤é j±ÏkE‘•i'ìh£êaOïÁx¨<à ˜NvyA¦¹“Í�ÒWÇÏyf·NzuÓ.Ü%uü¸0IŸ|Øä»”CÂü•-/ ~ôû?@ùCÇñ?ÎÿØÿ‚¢H“`-…Ýîöîï÷?vß_ñ~·{ÿó÷¯~}³û×/÷Ýõ×ïßïnöÿíö§wÛÛÝ»÷[²!‹1†Ø9%zå\îÉÀô…YC -endstream -endobj - -4758 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [190.07903 746.2134 195.57903 759.87537] - /Border [0 0 0] - /Dest 4458 0 R - /F 4 - /StructParent 72 - /Contents (3) ->> -endobj - -4759 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [224.67343 657.4414 235.67343 671.1034] - /Border [0 0 0] - /Dest 4470 0 R - /F 4 - /StructParent 73 - /Contents (14) ->> -endobj - -4760 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [112.155594 473.5904 123.155594 487.2524] - /Border [0 0 0] - /Dest 4471 0 R - /F 4 - /StructParent 74 - /Contents (15) ->> -endobj - -4761 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [128.25504 473.5904 139.25504 487.2524] - /Border [0 0 0] - /Dest 4472 0 R - /F 4 - /StructParent 75 - /Contents (16) ->> -endobj - -4762 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [242.68085 473.5904 253.68085 487.2524] - /Border [0 0 0] - /Dest 4473 0 R - /F 4 - /StructParent 76 - /Contents (17) ->> -endobj - -4763 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [258.7803 473.5904 269.7803 487.2524] - /Border [0 0 0] - /Dest 4474 0 R - /F 4 - /StructParent 77 - /Contents (18) ->> -endobj - -4764 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [264.2438 357.49442 316.85895 371.1564] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 78 - /Contents (Section 3.1) ->> -endobj - -4765 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [267.97797 302.84637 321.2902 316.50842] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 79 - /Contents (Section 3.2) ->> -endobj - -4766 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [313.2113 248.19843 364.57465 261.8604] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 80 - /Contents (Section 3.3) ->> -endobj - -4767 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [394.14352 220.87439 446.3582 234.53638] - /Border [0 0 0] - /Dest (subsec:context-paradigm) - /F 4 - /StructParent 81 - /Contents (Section 3.4) ->> -endobj - -4768 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [289.3024 193.55042 333.3956 207.2124] - /Border [0 0 0] - /Dest (sec:system) - /F 4 - /StructParent 82 - /Contents (Section 4) ->> -endobj - -4769 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 83 - /Tabs /S - /Parent 1 0 R - /Contents 4770 0 R - /Annots [4758 0 R 4759 0 R 4760 0 R 4761 0 R 4762 0 R 4763 0 R 4764 0 R 4765 0 R 4766 0 R 4767 0 R 4768 0 R] ->> -endobj - -4770 0 obj -<< - /Length 5367 - /Filter /FlateDecode ->> -stream -xœå]Ýo$7r×_ÑÊê�Qüfp¬¿n/8Xo¶$YëÛ žõÍ��ÜôÌtYU,²§[»òby%²H«ŠÅ_«ï^ïöïÞ><í»Ï>»êº»×ûýÃÓ_Ÿ꾿»ÿë�ï¾ûíqÿ�_Ÿ»»7Ï?=ï†_Ýþý—‡ŸßmöïÞo¯>ÿ¼ûâ«/¯¾þöË«»ï~}Øž¨}û埾êäø×¿]©Nv²»U]�¢÷^Ù.Ø(´ém÷ôËÕÝ“ìžþ~%»¿?m¯¾¸¿’Ýýîêî­ì”êîßž;?î¹úþ“¤”×Ã~�ÚÊÓO£Nÿ¶§Ÿ:ûûîÔ+œ~ë7�ò"ítì>ÉIÇyL{¹é”›�#ê�þvš�¦ç+ýæÇîþ?®¾¾¿ú/š�Š`£ê�0AI³„�‡™~µéîÿ›]S£G)dˆ+Œn+£rt'Ü*£]Ý£k)…îòÑ�\¿\bF™ó§¿ž~É�ÿh/ŒÓï}‘P3c7�–Ó8üU¦toòÁ¦A4ÐŬÍœ\®Út·“êeªJ¶W!m_PÜQAµÓ·À„ÌYΤý¦ÜhW0h:—[ßi&[·énÇ=ëRb×¹Q~¾*’ý·¹v˱æß Jì—(Ï$|Äö]S¼K—»=¯óÖk¡¤ì'îY(Ô”µ'{J¸ËƒœIØÕèMg¦ßyÚ1äÕ¦;S›¦çáf¡l§Ëc0ª„šgJq`ð§åÖ”ôçmn3!çæ¨-}ÞûÒˆÖ¾åcߤrPn6MÜ“,84Ð*�êªÂ\¹š)¹Í©[ÏZ­DTv=çØì|²kË—vBKÙû,ʺ“謙Dg<¿múï?pcL¤¸€n’%L3ÚtÆgEA”Š#MN´'�Ñ»À²U�…“ä[÷§¬…hb¹�. PÖÔEl¬ØaÜ!»´Œü'Nøéç¶Iœ[ëŠXÅ–½ÐN/ò™'A_àìŒ�sÃzâ!pÀ€ñMøšHKIp�úA}·gË3�:Hd!m–¹ÓRÆÐÖŸ~ûª&%=!%}æ %¾"Dy¹”LwíM§ÏkÒ›ÎNL>¯ K}^J—ê‰1"h{"Òö wMç“qqÜéOi‹255E%†›&Õâáìš ÓyÜ´ÅÒ¥†ºˆÂ¡§F„n1xÚZnºÜ'ž)-˜NšTÊôA7\ƒììð…å‘�÷’ǦHš­kH*ˆ‚YC,šZWìBäN¬Pzâ2ÿ˜œÜà �IOJp�ðÚûhÀaz� -ñè YdÈ/nš„ˆœAà�ç¿¿J”WPŽA¿Œä¹ÒFá¢ÉYLÞæ è·6ÄŠNZ}[Û.Ž†ÝŽÊRÞT×øi¸qj@nÀî°ºŽJSè¾ÓZ¯«©)©×Oûßþçþù÷Ýgß|ýÍ7R¾þêó‘p „;¨çÅýöKn¶Šµ+^ -ë½5KÜRƽ7NgdÄg±bå2óiâr§3î�ä£l91‹8€›ÒWd¨xö5Q£bZE½³Ëv¯)¢¨(„ÖVø`¬YCzöÃïª| ãÆ­0�¦pˆ¢]m¥0ý€Õ,çßZ„« d•¸ßLýLQ -¬E˜ß¥€`Ñ4$8;­” :P% -Ü -ɰ ©ôù'ú�Žj#5Œ¡S­t‹¨›nôÖ‹^.€Ñšsl>C Î>rWnµµ"ø`#½qÀyœ…ù"Òô.Á»eŠìXrÉ]»p£žÜ£\`-ÑAò F Ú¶øe0Ä&kÎ2±3)àn,¨Çoÿ’¸Ã†æ¢rݸÝì²,;3É‹3B�kºÏ"’Þ¡ìDrV)�äv,-¬A:iôıpY@¿›ã-L­ILpyæa·ô¶…Xð¡³r -LAî´Ã¥(1\Éqº ¤5NÏNÌ�eØ5H/)�”F‰²6Ø>0t]®Œ­ªnÏ^2Õý(—L¼RQØ~¨=Ïšä[ê´ècTýY@%Dkñ$)¤\£ÉÅó­r_š:°……äŽêlS·7.\2Ÿ9®$šHÓwUÝbÍU1<ãªÛÓÊD&aeÞW�20Cd“�žÀFA`¶=ªÙôW/�èÕ(;³ÊG* -�´(7§ŠW£žc~N~kÜ‚baìé'ŠÙäÝÿLŸ°Ôþ’|X'û¢@}:ÌÜÜ4,šõ„„âUîyû›Æ¨aïI³`¸‰� ]h¶³C.Tô±Ä(2øIŠß²Lqt[¯©?‹8»¨…r‹Òg~Ĩà rÀZ”0ÊõVW2sÒĉDdGIæ²AzÞSdo&"HÃyB¤m½æ7žâ¨—$þí¸5š[lDü‘L}LV¼ íwªW -k¹ ¨ËK . -qÉV绀¢êxñù%ª�§CDJjê¯Yõ½°qà˜a(J”µïö—%µêÆžr!à VÕ~7ŸãeàA›½>ªïIZÙ…HýËùÁÚøÎü ‡›¿ÀL­ÆÑŠŸBô�`ÛÒi.¶Ä­H.XQÍ&Ö&x+zó{"‰üE&ï;gÜÄíóàÔf=þ*Ã,Ë0Ý /ù,qUs¢Æ&¹.ØS› �zʼnMv/ws¶�±I¶ë1ŠüƒÔ6É}=µÜST´©®“ ›9iD4q‘›ú‰–»þðÄ/IÞd±² ÊnËmIáôcA4qÿ)Îcòkà9š¹4×EJö¥ -?xzt°ˆ-Çû«%~‘ƽ)ÌgðH§ /Ü�E)_MçHþ÷ÏÛŸ»Ož·BEm4¢wƒjÐQ]3E.3! ÷ühm†eU§MƒùVX“qž¾ö”™Åçm”B‡°ŠONzl½Aö6´ -êAÃÛœadM†”õÂ*çL gª2”bÛü1[Öâ‘X÷(yÕãÊ�O壯ôF¯²Ãíû´=0¦#©øö -&£a›âÉxÊÔÁ‹Aj©µs˜ 7D:Á¨À<¡Å ®ùˆrei8ו{gM€uM+�ÔB*cý -Z9ÜÙÍï”iðö¤�µ ›Ú„Ïö5xá•[bEÔ”h–=e’cø-¾£OaÝ~P÷ %��±WÖµ,aée¨›…’AX\\<ƒZª«¡~¥°Ú¹Ø´‰-©®õ� rv”6ëÍ£È7”Û¢ôðŽÑÉÕ8RŸå¼(—O£­ -ÍTÖˆèÍ*\8³ƒËaNÃU…]VUý„îm›0Uý›ôšÝbWÑR_Ú¶Y]Jׯ~ËfÉ,zD ÃC‘—¶l–Lž·Zø^ön-5®"G–Ì¡wfµi4Û5K™zízziÖâG¬Î‚2ôÚÇųh³j”m×Á -Û÷º1«VȡɋÅÀ€VîD'VàÅ‘fÄàqÐ>É*¾:ªè€ˆUž+¬ÊD0Å‹¨d˜›Z˜²˜Ñ:ñf•ä -¯Etf½W -0æ�blL`èEp^Á -©&i˜t|™«/-pÎ¥R%Ç‘o©Ì¥Ù/Pi>ÑQÞ6g¨2²š²{ü¿“ZU36­Ï5£ZKGÛX±+DÉuþÈXÕ½h¥Œ|”<çýŒ³�)óŒ8ªóNŠÊû&ì N ¥&Cžç¯*Ñ%ê)—ýä-› š4ò ð¢GòÑfò.he­p»ÔüX©¦ülRŸ=ܦÅC3^fêRÌ¡-¢“ƒw"eÐ>Í/Û$͉ª°¨ B'»64‚ZO!SÇÒœbžÅ�°Oþö&OÇmšól®¼Š¹�_~à;›B:ŠÓ„SÄzW„ÑA¿I5áĆ~êJèòlé«i<›Çg‡:…~QD‰LÛâëø+ú^z‹–Ç·Ç"Ìç ö«2Ý19Ÿ& -£²˜!Ñ9ÉuxBe5.r·ÄÕ&/‰ZèM±"âš{Wd›ž¥Ë•YBÙLÐúâ{̇ص´mk²IƒÑ`ý¬ì…‘‹P¥ÕÊnºÛáÆ¢¬KŠÍ²…¦WEfF¢.c雜-K¿M--Õ¥zX« B’Èä 5�H÷ “_Š…5“¬< ºlŸª$`ž]ì6R³Ÿ;Ë=7æôöc<7vl�u­ðvZ¸RNa)Ohg¼Gïû�»H´lÚ :RwED¼PkfôE&=á^Lé¹yßó…¥€\3Ëàž0ÚNi€'.—E·„Úú8.Ï8y³–§›BÚë–Ò/M“€Ly) 3N;˜Ç9¿5³Åfi›^Š!}e¹»1×"¿ðK¤éRrøùvÓylÐÕ—‰Bz3ê(Ó|Ñ\Hê,î0Á©RÉ�ìêÐê„�êÇW)pU™�—©¸4$\}õáÈ„©„RëLƒ•áÕ°*zïÜ j›t9VóV‚Î*Z8Q}f2ÚÁѽVœ8ø‡ñã¯ó7%cøh¦Nšbéñ¯ÿ FõðŒ­~=‚ŠÂh焵ʯ!#¤Dü±:- -ÖÞ -mM¿Ê¬æ¦Îþ'^…=Ï}uAüe”½ë£[¾¢7ð»X-÷× ¦LÝïðyJorÂ=2Ý`�iΛ~ -³.M–-z…Z%óV -Ã]“8™ø×$oùãd¨ýèA¸ôÛsþªì¬ÐF;Ã^M@Óáàì6)O¤XDMÂ2¸M.¦ì5ƒ¨~\âGñg€U‰],�·fCI¼¸,c‘Ãö�Úk-Ã’Ò åúBˆ<ó²´}Ñ’SRC`îæ}�¨ØÂ<%£ì—²Äµµðp²úíÔçâôÐ -ÙJÁˆ¢|œo�»©Ìíš¡‚–W–-aÉéëGq–"o^TÎ,KA�W`÷!ƒP!U¸pÕåŸZ‚}Í×cë'·‚dÑ�¡ aXŸ°Ôç¡x[<‘¾£\Î[§>"¾ª/> -endobj - -4772 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [297.8902 615.4314 308.8902 629.0934] - /Border [0 0 0] - /Dest 4475 0 R - /F 4 - /StructParent 85 - /Contents (19) ->> -endobj - -4773 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [314.86404 615.4314 325.86404 629.0934] - /Border [0 0 0] - /Dest 4476 0 R - /F 4 - /StructParent 86 - /Contents (20) ->> -endobj - -4774 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [413.00983 517.1457 424.00983 530.80774] - /Border [0 0 0] - /Dest 4477 0 R - /F 4 - /StructParent 87 - /Contents (21) ->> -endobj - -4775 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [210.92213 469.3597 221.92213 483.0217] - /Border [0 0 0] - /Dest 4471 0 R - /F 4 - /StructParent 88 - /Contents (15) ->> -endobj - -4776 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [113.4558 455.6977 124.4558 469.3597] - /Border [0 0 0] - /Dest 4478 0 R - /F 4 - /StructParent 89 - /Contents (22) ->> -endobj - -4777 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [274.8422 394.2497 285.8422 407.9117] - /Border [0 0 0] - /Dest 4472 0 R - /F 4 - /StructParent 90 - /Contents (16) ->> -endobj - -4778 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [291.6684 394.2497 302.6684 407.9117] - /Border [0 0 0] - /Dest 4479 0 R - /F 4 - /StructParent 91 - /Contents (23) ->> -endobj - -4779 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [172.43578 339.6017 183.43578 353.2637] - /Border [0 0 0] - /Dest 4480 0 R - /F 4 - /StructParent 92 - /Contents (24) ->> -endobj - -4780 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.09322 254.30371 226.09322 267.9657] - /Border [0 0 0] - /Dest 4481 0 R - /F 4 - /StructParent 93 - /Contents (25) ->> -endobj - -4781 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [360.26782 254.30371 371.26782 267.9657] - /Border [0 0 0] - /Dest 4482 0 R - /F 4 - /StructParent 94 - /Contents (26) ->> -endobj - -4782 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [376.27432 254.30371 387.27432 267.9657] - /Border [0 0 0] - /Dest 4483 0 R - /F 4 - /StructParent 95 - /Contents (27) ->> -endobj - -4783 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [417.52737 254.30371 428.52737 267.9657] - /Border [0 0 0] - /Dest 4484 0 R - /F 4 - /StructParent 96 - /Contents (28) ->> -endobj - -4784 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.70145 254.30371 519.7015 267.9657] - /Border [0 0 0] - /Dest 4485 0 R - /F 4 - /StructParent 97 - /Contents (29) ->> -endobj - -4785 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [239.99207 179.74872 250.99207 193.4107] - /Border [0 0 0] - /Dest 4473 0 R - /F 4 - /StructParent 98 - /Contents (17) ->> -endobj - -4786 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [257.33554 179.74872 268.33554 193.4107] - /Border [0 0 0] - /Dest 4486 0 R - /F 4 - /StructParent 99 - /Contents (30) ->> -endobj - -4787 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4384 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 100 - /Tabs /S - /Parent 1 0 R - /Contents 4788 0 R - /Annots [4771 0 R 4772 0 R 4773 0 R 4774 0 R 4775 0 R 4776 0 R 4777 0 R 4778 0 R 4779 0 R 4780 0 R 4781 0 R 4782 0 R 4783 0 R 4784 0 R 4785 0 R 4786 0 R] ->> -endobj - -4788 0 obj -<< - /Length 5807 - /Filter /FlateDecode ->> -stream -xœÅ=Ûr·±ïüŠa$Ç^稉Æ)G)ùûÔñIN™o¶(Yt”Š)‡¡«’¿OÍrç �Æ.fy^´âî Ðhô }ÃÕ«û‡w·7o†O>¹†«W7oþúöÇừë÷¿ü0~õí¯¯þýËÛáê«·7?¾½¿ºÞÿý—›ŸÞÝÝ<¼{wñòåðéçŸ]|ñÍgWßþrswí›Ï¾þ|Ó¯ÿ¸ÀA bx�ƒà­E=8í §‡7?_\½Û^ˆáŸoî.>½¾ÃõýÅÕ­P ×·ËËãÇõÏß}ô½â{¡äáÓí~®ÿûâ‹ë‹ÿ£!Aïq#HÄ¡ŸúñSŠÃ'î?öÿ¾^ýÿîð¼›ÞÛ /¤>Z=² ¢¸eÊ*Â¥¥Lm™8 Ö–y€äu¼hu€OØÝðÂ;0è´±‡5L¿Þ�ÿ^¾Âxi›ê@‡_åWÒìi’í2'ß´UÔ¯—|—äêïksD î=mðá%éV»/å~7àôôLï¥I¤žÚÏøayGê(2zPvÒt*f¡ÄnÀöæw§½Õñ;ê°x…»áÅüÒk~‹&�”\íÏ‚ÓÂ;ÅIdL¬÷áO„4-aÁ*ÃæªÊæÂ‚uª‡Í'N›IÜ&ê˜#“ƒ2ÂÏ(T$ñ¬H_-n>Yö®‡ÐÕ¦3ñ´²ö0½Ùk˜>ÿyVâv7Ø àûÊL"¥ÓY¦Gt\B­eÁ< ¦÷jFZ²Wós˜ ™ÆOúRNðÔ›ÏéEÇdON˜@u ÄZš˜pýH}ÉUY?œòo$˜&"åa`˜]טݱ‹ÙOÀßÂ_¯°ã”4&4ì ù|Š2B0f/Åð:vÒf¡GZÄ�¾Øÿ²«Í7¡Ð:,%�ºA” ]£ÔÒº§‡gFKÉÔ®åÒ%‹Ïãöøã^GˆfIz¡Ï+ÆÀžB—o_h46YJÈ^ºk,‚‡µñ ¤W[ððáøÐncÿo¶VÍ­Ák0Bjô~“E� S„Ž«ÊO@é \Ï¡ÈPºŠ¢ÈFOEÞãs‰}‘<;ðZZ‹’ý•‚�Zù·—ñÏ'56ÈŸq»ã«»£ zæ`Žm.‚X¾ñ.ƒ@@äv�="îƒñŸß`›Ph}Èžû±êi±èA{:oþ�ÐFZ�p^7+‚ìùÈ&éf7ÌŽ�ùR8ÐÄ%ìhk¯¦µV8ó›º8y�»L üH±&j'îO“P_cä‘8^F_íQ÷U« DÊ &ƒôRöÉœÏwÃõßj³S¾)ø ºfÿnå+û=‹êè¬„ß -Š»æÍ Ìz…¼Õb–ý^àžÐþÈBÙ&Jš~@öp|Á‘eV(%À8)̦;’ó}…¥‹ò¤î�ˆùsÌò“$™ÞH4oªŸy¢L­8 M¨“µ�û^ä6�ÒÞZ °FˆM �”–ÖF€–Ön€b�”æÕÆ�6 -7�@sPb][ÆZ·†€’ìÚ!XôM4 rû¡á@MZ —Žx²ê”µBƒ Z«.GMdÐÄVþìä¥4O°à5mš ífJç àQm7ÁÖ~¯GÚÂhUØ]Qy–÷Erˆ¦Tj�k[d7kRͨ܃sçÃ3ëô/¿K†ÜâßÍœ”¢’2€&øM¶‚Ó•’ÒTRYP^4‚Pߊgeœþ.;¿q&1þ÷nî~>z{·£ 7B0m€«: MTqˆxN§Ÿýçí#ßR4öhà> ‹&@µ:"Ý®þ?›Yìâ)…ªÐ€ Nž“gVN¼ÑŽÝ·‰«úüxùV˜¤à¯®'áêØ9�Íó)%£˜©wçB,~Èw˜Hõ -÷ùT“0L@@%»Ì¡YÕ˜¥Ý(³Óáè¸Cb]è(^:ïA2[sLa>œ%F’`öœXîÖ}æÊ\©YJE¯M¯D$n -VKM”Y)­ïÜHNN€3U?d¯âR”½(�/œõ[@Àòe.JïÁx-íp«¢L9 X› €;ä)Ê�SÁI­Üp¦¤¢L(%FkÖ+;ëAèjüG\]-Fªù´ë´9–c(CË ePwqLìQ:˜·lüžòxêQh:èÓãO²_{¾”£�RÍÖBöB’È$hïv¤–‰IY‹#{‡ ØçO¥Q©cÂîTˆ ‡½9†Žz*Vv÷�Bj£¨4À˜˜ì½âÈK+5Ÿ×"¤íäJÛ‚UÂm2Cë”–˜£«Œ¦…8‰€U Q)ðJöD¤[Ì_áAÊñäy¬ù›¿Ë=âÎl²’2,ùÎéæl Ái Êia-ÛS‘˜æ¸ÈÓH%éV‰S-óˆÅ%øIs:U}ߎð OB2Õc L\?æIèÄéL|V9äf¬‘ˆœ¶Jí™þÙ;óô¦Î@ëô¬×U ’&0fÒIHªÁûŸÍѮדW_îµèŽ•,(åú¦ ŠC2©/y:b¬=,YSçM=¦½ -ô²‡®›²4uØÔ¨@ˆàU?[Íf;{ŒÐdΞÔý�4ÅÅ5uâÔÒƒC· "î˜â5åæË(¶?³´Fä‘eÈíY5×Ï FøÓqö1½à$¶±Z‹GpÂKaÛ@ù+'Ã�¥î³‚š,hé9 k‚×¼n? ‡�ïÊ´™ª•ªB6Ç[d太§–ML¬¼ä=oØ­ÕRÙr2–žÖÊ7!ÜÌjßÛRì®9e»,MÚýﺚRªÇNm{4Hfu$îï¥â†ÌŽ˜7çJǤƒžâ¸\¸`ßì­ÒN‚òUoU=íõ¿"Ô%ů“jNéo7HÞ!—£‡hÊ›mÍõ5”�m­¼ö-Ën ù嫘(%a­Ì¾å ÈÜNaA¢FÕ³€&³Í�É�( HÙ7ý:»“Mƒ6d°Db?M6›!#%Ò‚Ub,PTô"-Å$µ:E}“˜H 4Ò¹Ö�É@çõ授t!G¸®hÐ[ øjwËùêÉÔIÁúÚûÉnTŠœØq¹TäqÜbªŠÒxp²Ç y»\¦›fXK AÐdR•ðà´ó=@·É92Ÿ -hcºfON§c ‡ÊÌA©»AiuT� e´jDŒŒà@¢ÔBª¢[3•.…útªŠj-Ñò‰êíìùNÏW>^fbf%‚ã‘÷£úÊT2%>¿d¼ßÕÐÑ(€xöµ”¡¥“•±…nêaì;†l-™ÚexmPöÏχÑ-e))gÀ7Ú½Üsó“0^€ó^› 0€–ƒ€¬|ñŒ‘Ú>È‚—€ u›èâà8È’—àA8ë6€à–›Ÿ,”1Î�MxS�º¢ %~|šn –,iq‚RZo@RpÛC–´x(]§lOœHQ�ø¶øzTG‰y#%8‹u1¿êÕ›‡_oþ~ýö_Ã'_~ñå—B¼úüå4p‹³?úï±ýÍg5h«ñx­ ÛsÈêK+Õ)¬c1b-Q#}ŠKÔ(G9³±Îœ/.±įú‰Pz&;{_œLšÉžê­q¤ò¤ý ”Ök~8Rý£¥Äp˜#•¿D°"˜ 0¶¦©@—»ðf 8ÝëèrW ¨|ÓôÇT»fäÛêæ¨˜ÌEµ‚ÝŸÁ»7‘5!™‹ê48¯•Ú‚�¸|\ -f´.<{ò $H¡F+º.+Û“u§£ËÙ„§ež,;E j41Î-È<™'�ÌÓl?™'!Ç*Îó 1O¦F(ĦŷÕûfÒ+�Gª¸”¢¥Y`>hbÐÄN75Úc–ÞV-P… BGâB5âÍ�FIû€ ¬#c¼úà“k.ɶËKt2B`b’)n*/Ï�s[¡¨Ö:è1aWu¥ÔµWýñò|»ÂI€î©™xó¾¢ -Òã|L)‰íY‹®±J\&”Î×\îB/±x2˜;?¾ê_ Õ·%jd´$Š3 -¬š vR௚R%Q¨æ\IÈQ7v´%z´¯‚Z"åô‰hKi”/dkÌX4žÔÒ �Æ-ÓT‚ƒ&%Ôò9ÅSZýD }tÍ5iK‰ÉV2\}e‹)P£‹Ú©p’U¢cÚ¯èŠåmYKø©ñöÿGÂ’mÀQdÓ—ñSoÜrr�¾¶€ÖXYêë˜>ÑÄmÉ+Y·ˆYjÑeöåàK5tÁŒ-ÇÆ| ûÀ9¹Æ^H¶?—Ê€²® „¶hf‚bB‚’×É$±d´85ŠÞÍXÅ "³  -mnœÄ­üÏÖdøìH«�l0?f»:mÐ÷ÐØ|ÿKÔ�‘ï,€tßv)@[åÌdÏF4‘îÜ.-ç6`<.˜€tßv%À»Áü¬/ŸnÛ®<`Þn!yØÎõtßv#AêñÕPBºq»Ùç;l¡Û™”lž®­kœT›0é|9R#“’mÒµ7 ¥òO£d—t=¦^¨ñzÏ'¡úÒ/cŽái¸„’• ø}7ÇóK*²uø¾ýŠúIDÙÏr,ô}\º²Oê¨êíRÊX�¾/îYè•»¨„Co–5ÇE=¾® µ]¯… ËñuéµîÛq˜’¨Þ#‡;—–ÃMö÷\¥sŽà–¼ãZ�·dÄ,è¦ñ½–ÌÀæb«–Kº�¸êAÊËÆ:Ö:q5D×ZOMD³œGÙ˶ê?-ÁÊŽ¸q_ØG�Z, 0-QŸäa¬b±°å-#óܬ'�s=k‹ù�ÝÆÑIÐÊ8ß¿cSŒãŠÇHôª’¶ Ùs½Ôªo'Ö~�Œã¾Êó•·M)@+‰W”Í9ÑoÚ½�ÝUË…ÏÕØLaoÞòÞâZ‘ !Ùu�“/#­1Õ�Úµšà»6 ÝÈÝYãÅGýduW#®w}+…œ¤_¨ñÏeÍ$=_çí·×#Ù÷~ÑaÒïËžd�¯8³?WÝÝ’õ6]�Q¿B)ï_¨N¼$v,¦Y(䬗ëW?à‘O^š46ÈñÃãõV÷øæTÁItNÆãdŠ57ŸD²Ñ¿Ü×:»Ñ­w:°3¡pZ‹ì,.­… ‚Ú]óõÉQŽ‘à‘C_ÿŠ Ln�ÈXÌ�­ÁB€€F÷cfb¹*¡/~E0j”'½DÂú3Ⱦ¶ãíVEÿü¿a§' `%‚´vÌjê]?×ýɱJZ@³—>cç'kW•kiÜÀú“4™=¤xé»dĤfëÓ“­•Qc“¼ Áìüt  ±ÏhuvNÿ[vzY½�¦_Dß-_öj$&άÒk°¦+%'j#¿N©�¬BS¸˜3=‚»Åe×}DéD»Ü8C*Ž»Ú"›~Ck–œ ê.»œ<ÒT]îâ–2H5%8a½l!�>=aJj -­ô[Pf¹tâo/iÐçœäïòÝDñÀg·öyZ!CìN‚Î4‰‘>•JveÔÎCЪmþ#ºjdTД—ZzK–«Ñ1/<Ñwe/ɱzô¿io·‰l¤ÃÅ~›ØuW�"¡ÙûæÖš${(«ÉIï8“µT?zÈôÕHLçy©é½—ÑãíCœ.9:"Š  -¾—2ôÙå[Là‡Ì3æqTâùæ°·U‚tvyÎ.²ÍêÂóÆ�’¾¯ò®©'>ѼE¿*sÔ•ÓûÀ×M<nI­M{ÖÄhnƒÈ~¦cãså�”];Ô±!;šJ4 ‚ê Ùð®m²µéØþ¼”¶˜ ÙÛTŽIe7Áų"¾¤EOv{Š.•Œ$‘ø”Êã¸Pf_™±2è§‘CüQMgœÌî9yL0Œ þ)ÈŸ<&XÒ:¿%ù7 ‚ôl9Ü”ö|:[Š2I§Õ–há+BɆªÊ» @i” -¤¿+ /•Úv_R«›Ù¶�l›ªQ‚Ǡܰ٠u¬ï7ÒuÓMàqA&§J¿(mtC¶ÊÔJ�TFùóÒM݈M~7ÃÈ2ÓÊo.iþìnPrÞ!Œm‘Ÿ€2)AoÆ{j³!eþžÇ™‹£k ÍS¦«%„vÏß’J6à\Î%Z�µÖ†Ó7cöÓn…¤FZà¹8a‰læQ;GUïqÓs³Å&„¥žçÕ\�ì„ËÕ~%NɘÑIÿã.'C²ÓêBjÂí3ÂTG—�9äïÒ¿YàÈ.¬ã s›7{[R7n[ã~ÕMôœSÖŸÌɰ>·s_Ò gÁzamCJnöìÑWDæ³qò’ËjCkAy'|F™¼¶¸ÁKS–[¾¼é¢¡±-Ì¿¨VBï6?£ -Ã#ƒ>„#Ø LÛú»ÕÙw,ê”^ Ûk­�r¥ -‚n¶zÜüE6q1b;@Ú¥d'Ù½¹¢ŒÙBÖì9ö�<dë7€£Í€#ûÉJ§@heÌ›R‘Š+B\h÷º'Åq-ü™¼PSRýÁ -ó–béEh¢t�¦eЗnôb€¹?¢ª�c.‰!ói¡,S�-†;À@ÄÓOWŽÍ€ à ÀzºBj(çeê ûqT¼�G�hi@åä˜åN9ÛSÊöC%›"ïûƒiïô˜jBŠê)Lw ‹5óm½ó§]¡›¯« ¥DLaÔ6ˆckJÉfÊJxð2ì×Ûw"Ó0Çø-@`ë‹C)3ØàÍ&0° Ëd[å%®†È>™,Z–:}-!¥íôÉR0ÞQ‰ÄZø{¹O\q­j&~þT=›ÎšF­é‡R=9GÓ[«s“Ô¦lí�WÖ4€F> -endobj - -4790 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [389.9495 671.1034 400.9495 684.7654] - /Border [0 0 0] - /Dest 4473 0 R - /F 4 - /StructParent 102 - /Contents (17) ->> -endobj - -4791 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [327.1667 568.66943 338.1667 582.3314] - /Border [0 0 0] - /Dest 4488 0 R - /F 4 - /StructParent 103 - /Contents (32) ->> -endobj - -4792 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [202.81924 555.0074 213.81924 568.66943] - /Border [0 0 0] - /Dest 4474 0 R - /F 4 - /StructParent 104 - /Contents (18) ->> -endobj - -4793 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.80038 514.02136 226.80038 527.6834] - /Border [0 0 0] - /Dest 4489 0 R - /F 4 - /StructParent 105 - /Contents (33) ->> -endobj - -4794 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [386.66837 514.02136 397.66837 527.6834] - /Border [0 0 0] - /Dest 4490 0 R - /F 4 - /StructParent 106 - /Contents (34) ->> -endobj - -4795 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [403.2961 514.02136 414.2961 527.6834] - /Border [0 0 0] - /Dest 4491 0 R - /F 4 - /StructParent 107 - /Contents (35) ->> -endobj - -4796 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [157.96414 500.3594 168.96414 514.02136] - /Border [0 0 0] - /Dest 4492 0 R - /F 4 - /StructParent 108 - /Contents (36) ->> -endobj - -4797 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [289.38113 398.4804 332.71014 412.1424] - /Border [0 0 0] - /Dest (sec:introduction) - /F 4 - /StructParent 109 - /Contents (Section 1) ->> -endobj - -4798 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [98.00314 132.16443 141.33214 145.82642] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 110 - /Contents (Section 3) ->> -endobj - -4799 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 111 - /Tabs /S - /Parent 1 0 R - /Contents 4800 0 R - /Annots [4789 0 R 4790 0 R 4791 0 R 4792 0 R 4793 0 R 4794 0 R 4795 0 R 4796 0 R 4797 0 R 4798 0 R] ->> -endobj - -4800 0 obj -<< - /Length 5926 - /Filter /FlateDecode ->> -stream -xœÍ=]s·‘ïü££• í°‰Æ7*.×ɲûê|•+óÍò)KŽRgÊÙ¬«’Ÿš]Îìh4°‹Y*/–Ib€F£Ñßݸy±Ù¾w÷f;|þùÅ0ܼØnïÞüåíOÃ7·~ýqüÕ÷¿ÝoÿùëÛáæ›·w?½ÝŒ¿ºÝýü统ß?Ümßx¸øâ‹á˯^^|ýÝË‹›ï½{xœí»—ß~5ˆé¯»ÀA b¸ÆÁ ðÖ¢œ •×Û_.nÞˆáÍß/Äð÷7_Þ^ˆávsqóN ˆÃí»ÃÇã?·¿\üðû×Bˆ×B‰Ý¿›ýOÒ] ×R »?ûß 9þûl9ìñ#!ì8Ü€ðV³ÿêµPx5à㯅4ÜXi£yÍò'a¢1¥¦ùwÿ^2Cßíþ{¿ÜÕk¡"ÈïvûÏÃÿîQ!6!CÇ`&f·&4;ó4£‹WÀñ ñ€w5`6å¬ß] ã´BˆÃ~;3ÚôÕ0ÑÉ”ýì ~ZŽ�#¥Ã^î«G%”¼tF{#ÔZÅCy¾gÑ4OC?·ÿ}ñõíÅÿÑüY~  g»ø‡ñSqÌÓYŽé™*”Xï„iš¤'Òœ¿ÍÎ¥Dyí;ï¿r—µ–ãÿýÏÝÃÏÃïß>\§í¨ýi£DÍ�6VN[Æ8»�~š.ÆãfQíþÝ&+¯†kåØ�žýÌ¿wð»å‡A8¡r?»P®† Eàƒ/µkBJí -ì.p¼¥G¨s›H0¾ÜOæ�hP•‡¨„Œ2Ÿ˜}š\©”Íä?ýÞl,9ز`O¯íõâ{E0Ñi·�7¬„ê»ÀÅWW pGkÉo­B¢šeÒAy:…fK‰â™l0áB˜�*%‡•p ú¥T=ðöy*Qüä:æ“4=�KM¨?PÚ°�6‰¸œQ�b¤/Æó²Ü‡,Ãñ_éÝ#á× 4ŠÙ×Ì(¥6üòjɆ¿Ú´ !PY&/{(pÕWWÃí_™Õ-¹º¼Wýô¿Ç䶆GAáB?; ¾®àÀS«{ BXß�‚HiÍoëBX%l:ZPhæßÏzXã;p…évMrçñßM*–ìèY+}ŽÁZïÀq:vÿDmzÚÇÒox¡:ÿ+ËØap¼—V› …kÈídÊÏÎFÕ̭왲¾†ý´ž|T²ñIÑ™ÙdÂæ›lDhJ’VU]á_вÛéS~ÁåB‡Ï™oÚ¬Ö‡*=λ2‘ºAëmœ–Z3pY�—uPvy¼w”ê½(¢)ô€Æyå2¦·Ðiï¹Èû˜�ÊØF¤yüá°¹p€´,Kj!e ‘cÚŸÄéàôırG(–%®ÂžÑeyE¼LªB2h“ÞÃl <<öl ]�þ)�ò¤F#{.@“\>@ÐÁ¬pýv��”‘¯…膢IwCÊ~Ó€5n �“\£Ä?]¡5Ҋ˹!Þ ±œ¨ xT��´›5B0¬4°´µZu:< N ¤ -Ö›>}™œìtßr-MŠÃ -NOsj×EÍŸ@o'cI±b@M”3e—Ân¶1GËùF)ý“?Ÿ'q1-¤Ï%ÙgíP7ëºõ‹HõÚ[0(œkº‰’ãɯjL™²çuà|ð+¬U[Ÿ²èu#®‚€M Êè5BƒW -U?ŸVÖ—”bnD€`>Áþ%¥Ôà�ж€ÏjëSš‘‘P ½þ_¿«@)EFjÐ"ôÉÂ…ZÂCÀ:¶­¶àEGèåK“ÊHP ¤ö®àPyò`A  5øÏ[ù¹¤+é,h9F­β�™PâDz V£º—ÑUƒ€’'r”'8²³^jâDRâD†Þ¡°ýë×Ä©¤¤‰Ј¶/$VP”8Q(A‹5¨1SEšÙÀ)må�5HK[©Ñw-Ÿä(y¢´¡Ûh ¤Ç¼�æ·”•3�ÒI«žëN¼–IÔ¹�•·ø¯8–.dZs/|¥�wÕ„ -Jª)ÁYäoârªo¶¿ÝýÿíÛl‡Ï_}ýê•/¾úbš¸MÿPnO±ß½ä å=JêžÈ§,¼äF�ºÁ³ZC?% -5Ø1̶l©K¯U” D)!„`°{ùQ¬(Yˆ2¢®‚š,V”,DåAZ#|ÿú5Y¬)QˆZ‚Ñz�ý×E�¦¤!.¬AMkJ¢ñ££Õª50P“ÆšL+sÐk|ÔF� ”ŧ AŠ­¢7`Ñ<ÉþI.48ëždÿ$ „¶žä’Á.»bªw�₌cÁg_ßP\P¢otÛþ[ôÑTn§ “ù}Èo¥<QŒs©™ÆÓŸày u‹jÔ?û"òT�ny£Oë4ÏŠåû/ä -Z�ÇMè3Wƒ2DéI®ψÔ5}�=�õ¼ã†MË·@{q>æi(ñéôk,_ã�†’�^ƒ n…åÿP[�’œAAX÷U¶E -N� Ä¨9u.][�6$ÔÒt/µåiÛAƒpÂŽNéÎõojë“–ƒ2 œz -Ò# ­ÁiÙ¶|“ E[ÐBú Ž+&Š<&Ù+)‹SSÙ٨ȇ‘üut¾ZÄz©t:åæ|‚¤Âÿ-éÌ´vÌŒµç3_CK:3ݘ©Ú–çéð[–+®·üà׉}oq%9ÓÙ¤¹¥Ä©ö4Úp~inÉä§ ÁXïýùŹ%ÓŸ‚¯]8;Oµ”<5ƒYù5qn)�jvVÈXUvnyn«H -ýÉ«‹Úê”8õÞ*×½xƒÆRò4Fe¦€å9Ò ' ïÛ–¯KóÓä÷ª»$£#v¼aCÓ†M{ŸùlKsµÖasA¬ñÔ˜º~rE,$ªI\ú:¯N?ïŠ_ÑJ°R÷Dõ¯Žô•:Îúàš�ЖŸïë�QâUy�|pM¹"’*qwDýtRR@f$fGQ‹/~Ê–+â=µ3Q5"UhAITMç£jeÛÞ¢lÈQq>V�§ä½Ò‚÷ÒŸ� ŽJ€-¯Hó@ËŽ®¹Mp3&ÕÖnlœN›Á_‘ ŠÄ‰ 3æÞñ—íê«c#¤Æ!ØÐ×ç -ãÖ(r´SÀC‡-`Õ€šÞÑ> V;k»—¯i€Žvi8�¥ì^¾ªý;Ú§�`Ƭ�îåwåJ|å, õ´Z€Zš©§C¡ -¼ÒÆt¯_S�=)Ý­ä -Ë×·OÆA­é•wÝë«ÚòdÔðWX¾¾}: *À)µÂí«ù3=ÉùüX´ŽŸ`ûtTzit÷úµDOò¾À®²|}ûdTh0Ny¿óÃý:*F‡öÔÜ�â~5(#Ûî_‹*h X‚äê—Ò17c<ühݲÑl¦- áͲ^�¶Uê ÈìO)Ao›º«Ì3�¹ŸÒZ»Â1?¢U ¤í¡|7M…ž�ì“¢%x§× ö‡:�Q‹;L×âYòK2Q�h“ß$Ú![4`ÇUf Ëd d=*ña“ 1žšÍ¥`YsÉxª'íä˜ÒÎ`Àh§T­[Q<. -tL|)�~P†æ�hòIÉ"÷dÈ©5î�V3< ¢ìÂyó£3­$x }Ë/‹ÜC t•꣉ù¡ u Fº5ÐpY$œØºi‰Á2ׄ,è­v!ïÝÎ̬o¾×ÎEA©rŒó9§V BþÊÎ\ƒo‡Bʆ],k7ɲ‰Ìq´ägDŸÞ„Y’b0çt¹7*ÇÓ ú‰\Lp›ÖêÍÅ,O•EʯµbE™Ö œP¶ƒ¤²n”º¤7W"¢ mþÑê’cB Ø]V' -Òè�®fZ;~(aµ9¦�SöMÖsƒôXg½�«‡@z޵?VõBƒí‹‚T œÕ ÃÓ�CEïÖÇœetvGœ©Ç¨®pqêŒÔ`Œ§Ã¿×½ù¤©q S\ùÐÈþfc´ÍmûϬVÂ�t)cÛ×ÿˆ¼.©ù§» /ïell�|¾—ì¢�ù–óŒ3Î�ìÞuP”'º2X -wéD�cZêAz,¥öqi(D¬–›í{<ž'^*ÖýJ©£‘.»Èí!ûkþ©~æ”Ò'½§LË‘w,�ì•&ƒä˜�ÒKrß0§Áv3Ì'·Š>_Ök’bt�mÏ!’žH/@£ðªû«ªÙÞIyÁŽa‡uNñ¡ŒùäúP¦o•Nr)2Rj�o”šÌ¤ZÄ~Tš_=r6ÕÓ KW(dïO~®Á¢Rxp寏K9zbÂîNrñgð�[hµFpÕã •iDA*ßsM>I$Û{íÊ…è[’ÑU4�]¾¤´ý`´9%É._R!á×@OÖ|Ült*R -*nôìŬõµjI®±×o _zš·ioHöAS!ØÑn8ûE!Û )oÁÚ±aé:妎2rÜZ`aR’½¼´P»Êñ•R�ä"ÙÒK£î†¢‘q�ý!1€åò´ ›‚š”òYæ>ä_�nÏZšžÎi¨Ÿ¯çÚqøým‚�lpvP¯„å;bû|úGÜáv’ç|, ÚP›Ìª4 -¤±hzðÑÆµÉ~kh«×8�úÐ@§Wú~0Ú¸Ùs �ëvÅ�ë_V×g;xjë�êyQnb‡{µå²µ¨ɶ^A®ØãcQ`o²ç&,~adK½†·çÂ7˘ا³]1ê×BM šðqÑ{úq=ú™¾¥8¯žº¶' ïñ¹¤h«ä³X?6KFk :àé×W4”HAŠš”õxðñµ&ébÝ¥&é„QÈL’HË“˜’b— 99]L�ø/R%+4Ö ñ…çµ®DékqMÛœÝÁ¤ >uÇd¼,}�Ëä·æ¦Hvö;ÜYéÁËÐ HùTîlk <�¢&„Ä¥c°õa„èË´^V,O‰xÁfSœé¾á¡�håX‘_þíÜ· J¾^¨(Æ7Å�j!�Z¡â#d“$�I7:¼Mk²0’�•¶`…6r Š&O³œ�CRëúHÊÀE�ý‘…ƒ…§¦ŠDÙ~ãjÇEöµ<ðŸñ¥^ëVà?'Üpt€Þ›™ßW¯xúAîãnÀGµ”µ…D�-Ø©^¾¥Ròa`Ò1ªg¿Ï·9ÝÜúݤ[x;ú_ü*§Ýt K*OŸçv^2ÐQ©yØ)û¬®|ä+­%ŠÉù±E÷ËžÛ&ñyJ?'¶\J¹$‡2•@çÀfzþõÛ 8gw>гŒì>{àÔb ¿˜JÆh¯”Ñ̬§aÁ²’ØÚIßd+G2“Íò/„p~Üx¢#=²Ÿ¯ô”GTk©8–Ãüï^¢ÔA's”‡c'ÏÐw�?¯¾þç¸&3c¤Khuòò¯ªËWUô±+±l„…w‹}¶xj|Vœw)íŒ3“üØ Ç€W&øE½ýè~+º«±`ýˆ¸ŽÓŒL†lë‰jš}S‘'�eh$CJ©QH~Y¢É_�bˆIzsÄêo0ç;¢`-y᳞dB -ƒ…‚Ž&loØ–J^šùMEæÒ8½´þ@¦à4 ޾?ЦAvJ>04ëFÕežÜ+úZ:0贱˜ñMyÀá�£�g3©¨�u r]S¾JÒ›œö~–¾š·šªVä{ç©{ô’]‚0oxDÅ›®¼ÝrHG93°èËJ�­ñ…üƒ–×P‹|>jËb“dÊÄSî9LKwQ¤%ŠõªG²Wبñ µ5ÜʇüÊ<(òI-�Z{�FY»h Qž��#GårÑë5JíôËõÝ}ËÜÁÌè Jޱ<جH4¿Ô^žô<�;ÑHÕ‡Ι˜Eå(ÈÝŒ4©ÑêM¥³æ©Ovg’mÿ|@ ¦Ïá—†?3Iµ¸!URÝòÔw¥YëOZPÁœÏú3¦Ýú«ÃRIŠ˜"/–Í L½ñm(-ÆžTÿ>¦ù¾w’1¶çèâèPºõS/Gc³©—}šrâ´­KÞxu5°3Gv,žvD°Ét)"‚ËÁòŒn„Øl9¶O~ïÉG3·åØl®ËÙZ Ár±~¼ÛÂx¹È<%≤Ç�`©‚vp8]–œ­'dð�‹Ì2¸ŠæB:²b,ÄÃIÙUJúhZŠUËâ N.Ž$§9áíî‡:¾©R††:ÑW/&›áÌ]Ì�ãJ ß’ãûKâ®HDU"?XF ]¤Ž¿ÔI‘¯áR÷1MsÛ± É¢iÚ×Ë&g¥ÕVå%O€%mòLØ7p”3?“à5}*/q0Qü´®w“OèÌz·t¬ÊŸLÎ’ÎðX²ÞŠá{5¸éwQBÎØšXz|ô±t‹øÍ¼Ò»‚¶xÁss5±z¡Ù7¥Õt—{àôÊ«@IüüPeä…¿j¸¡Lÿ†dò¶§Ìrˆe¡QþÞÂìÍÏFs-G³ÀVš°ÎÙéRLOËx`“qšddLˆq´û.¹™"î+Æ;õ@Ã#²¾mÝK g­çQmûZ¢¦Õë̶–‘Aú>çJ™uiÜeÚÛª«¯VO´–—M|»¿ñc� ˜‰�›9v(výµœx•Ø…Â5k*ŸÌ´µ”Ù=+䵓TyYœNÊýª�Nc"ÙÒ";ã‡2~‹ŒïÚ)U�R”Ù^@N¾8x¸ÛÊ�•JcTþ´ ÈµSà­”î ËSdDš}ž>ºÅ·û!¯o3˜…´“t윀þøeúx9COµä›]¾ÇŸíÈÎw•ôNŒ™;ÁýùiH(Mú3PÚçĞRç°HiyhY¾S˜U™›+,åøò6ju2³èž¨Hm}8!¦’|ZðО¥]&sVØ{Ö¾8®Îúï6¹×S>�D‘)l³]r„kM¦©›@ †óà1µýòfr÷È |>W\õ—í&åì*q=’-B -¨-%q5Ï §Š5ÇÒ3U†À¾77`eèñÜ•˜ó”juT.̵+#{+•…Ĩ§1QùE[Ø#3 yKrd”ò$ó0 Ó:>[à|�âl©vi�~û-7­Þ�JãPXöŠyOºCÓUf»<ŒÕ|V9Ö•í×´R~JSÙ†0[Ü�Î:£e³”ÿ1&JÚ��I&F{Á™#‹²‰G�[#’N$Ì´€(LO‰¯lÃ¥.ÿÚ–^ðœY«D>EÃ12›2È9®Áí™bÈ4cãÛpä'vZ¬#ßX"6sýª@,§y² ›ùüʼnÎð†çY†g%TÆÌ™·K{Ð:¨—’. -nr#´q¯•ä«TÒâ“H µÎåSGHÓ!ª=`÷¬!E%&ß}ùóCù¨cÂzÙ -¬/ƒÅpײYàf - 5ªò¾ -dÙ§í”PCðí*Ÿ`» Ž¡Uo°ÏÆ! \V ZîT€Dm¤R‡¬¸„e†5%ñÐ ´·ÈÝ(¦¸EæûWf–….ᕆ’­å­jh�u …/ÎäÄ>ŽBD Ýú1eâê^fõ¤9O¶ Ä6a\厭ÆdùÄGÉ!tl’*èC¿ÁW»”Û²Šj² ̓jÐOípPï±îÈ& A)¹èqüˆOmK�гƒm¾„eF@¸ tåjë©z™h³÷_l¶ïßݽÙN÷h»½{ó—·? ?Ü|ùa»ýðË�ão¿ÿí~ûÏ_ß7¯>|ؾ݌¿ºÝýü统ß?Ümßx(¼Ìè½{ÐC@cN9žÝCTô/ý»g† -endstream -endobj - -4801 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [391.98032 717.3104 434.9935 730.9724] - /Border [0 0 0] - /Dest (sec:preliminary) - /F 4 - /StructParent 112 - /Contents (Section 2) ->> -endobj - -4802 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [322.54614 181.4444 333.54614 195.10638] - /Border [0 0 0] - /Dest 4493 0 R - /F 4 - /StructParent 113 - /Contents (37) ->> -endobj - -4803 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - /f3 4384 0 R - /f4 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 114 - /Tabs /S - /Parent 1 0 R - /Contents 4804 0 R - /Annots [4801 0 R 4802 0 R] ->> -endobj - -4804 0 obj -<< - /Length 5927 - /Filter /FlateDecode ->> -stream -xœÕ=Ûr\7rïüŠ£HÞ]:K�Æ5k;‘ïNe§Ì7Ë”,z•Š)‡;®Êþý†sf€g0C'/º�8@£ÑÝè;®_>lÞÝݾÙL}t1M×/7›Û7yûãôýõÍû_~ˆ?úî××›¿ýòvºþúíí�oâ�n¶ÿÿöö§w÷·›wïï/>ùdúôóÏ.¾øóg×ßýr{¿›íÏŸ}óù$çßþÏLr’ÓLN -o-èÉi'BpzzóóÅõ9½ùë…œþúæþâÓ› 9Ý<\\ßÉ pº¹;|ÿºùùâû?¼’R>�¼’è.˜nþõâ‹›‹ÿ¤Á ïÀIÀx%¥Š¿¸œ@N»)¹.'eòŸJ}9]~ nû÷f7Hïþ†ì£í*Ä?~—-b“y¤Â寤|üùýn²Pï>È'Þ4÷´[LÍ‹šåïYˆ¹3TMRRR šÖÂÐ:Ãd¯ÓÍà¼9{9)/œ ¸ßøîwñÏg3f2\˜ä46;,¼œ®G2OÙ„â'ó_À¢†?£@{¶üÍå¤V°Ÿ «c¶sÿ¾Š±ÖìRgeûö6²dFÄó7j¦× ”GŽK°X‡²œ^ZŽü‘  ‚—¨NAÿ;–ï§æ/·,kbµq–Sì¢Â ×`EåÖÛ‹ÑŒöÂA·9-ñ,‘/šÃ”!0e”Î41µœéå›Í¯·ÿ}óö7ÓG_~ñå—R¾üü“yb¥óÜåtó_[ëÀÚ¦p–VX‡CÇjh±¼ÃïüÿûÃIHaC@�Øzñ»Ëi/7LN�A…'æ™æ‹ŒX{!À¨_îEÈ<ó ã¼7½\ñYïQ'B|–Wû�gí¸¸ -È×Î^>nQy`0¸œÂ¨ç-œ,/ãfË5Q½<Û=6mëœæÝÛdâÖéQЉ(ZCSÙ“!ðØóà/ÿõo·÷?Mx{I‰ik ¦‡¡U›¡ïäÝ/ }Má8Ñ>w:ÆÝ‚¼–èÝað®÷Jò¤ ÕBË0$»7R”ŸÕõCKvÚ€B/;gy¡3ý%çK^ª]AJJÜz�®ø¶©Óå£�Öêˆe ½®Â™œE)9vQhJ ¾ç vá€×êì×Á/@YÓ*há´<Á¾’ˆ'ÐÆ0SÔwàCýnx‘\-*Ú i &oS %¤·´>Ý1ïCn/f<ܽlc�5} ^0s”Ó´á­ u@7¢'¦úàvkZ ð�ÔÆ²_^¥R’VIk;–^¹AEaÉu±Š²”Íö§Ä³W»ûgH�„¶.o+K4ä¾õ¡ºœô^¨µÎZzÌ,h[çŸë¼-"9–’Žc &Imö`Ç̲`9*UÂ׃®�†îOÅ?ÐÞF¤EnëHPåGC I^À`SÀX#¬o:z{åKâÏS”Á—:Æå4»¦’¬B†æ�r^]ºT~ûO9 ¥"WL|´ZÌ”�7c‚òöY6ýqîònß“—]%q38X‰K ¥íŸmí³Cü¶ñÔ!zZTW“ÈåÀn‰\å˜Æ¦H‰Ì‰ÝF ©Æ¼� ù¥¬Ph‚U}Z"õÍ �µšì8RXÈ#[FRí²˜¼ðgŸáºop"ÙXÅÛzáHĬæSäJÈ -©<½0$0$+6K&éu¡ø8nÓ)ÞbèßÂ)M¯¸E/ÐŽyÅDߥÅ]aZ£Ñª¸+GqÆ#ñqy$ŽOâ›z¬dU 6}§ŠI!)á�Å]\˜ä¹EGL×¾�‹c"²©þ8]*$å ›µ‰“½äSµýù^çI„¡Œš+¼›\¯m4¶åßÉ+N‰ËïñºÔÄ¢œÔFH)³HLáI⤛kÊ ¥…“c޵ mqÍÚ ‚´¡+Ÿ�eDF>ñãõh7|ßi‘¾¶B)AÒÐìÙuâ™ñ6ÙÂM[ª¤Hª•ãû&ã‰aˆñ3…“ÞPzÍ6°ß`.÷›>«Ã©Ð÷=K~©ì x½œû9‹ÑfPÍ8-¼ôLÆt$¦ˆã•Ô©àú¿˜‰È¢¸HÚáÜŒ -Ú�HÚV=’ry]ô‚WÜ/ñÑQðËL™—h¡œtx3¦ñºúÄóµ7#:c™ƒ Iãv,R©H DòÛ…ÈžL«rßD6D1ˆQ ÊI×Y­ÌÊ´òYÝ ­Š�¬CJߥÅà"ž¹~Å*ÁÍ£” r?£ÉsåÈ2ëõJÂÊa¿ï8‘ -æ:nrÕ @´B{=”¥¼–hh¥d�DáÁxÓËžåxI¡;5Œ—4œOð@DKRàsõl¿yÍ™u°”€*-aß³Øá¨Çr:vÛ�Au` -çMuÙ$ âì©�Q�Ú|Ê‹™k±<ˆ”´Öž]%>™a¨‰ÔN“� Í@Dt`z¥ÄÂÒÇM'>ˆn„²N&ˆ³´Ç3{·Ëï˜/“xvÒ_žÚ±SÛá#.˜‘òy_×ÝWÔЖÓ4N1˜­õ‚�e�+‚ØxÝÊÜžî‡}iWU¢¡RóÁ3“3œA‰<¢çÝœnšœ.ƒ+8ýîr²‰Óg·ýà…ÔÖõxì3—u%RǯÐî->¥²(òAaïê¼ W'‰”šµ&Â’ÏHXÊÓb"ÅÕQ‘&TF€—Êõ�2IÌÀ$1+Êw�h@thŒC åDC×µèŸ”Ó �Ú›ààšY)ßÚ ´÷ê¸çÖ§ò‚Ñ¡pÖ= "åõ@�ÂçÍS!Òez.¦²è'AY`'µ°êlxÇ-O]Zz¤ëcÂöý÷A�ôOÓsOa£‘·gEË[qÑãgåvŸáN^·¥Ç‡63 t0B?\Cr\Bٕ׌óºfÕ’ƒ²§L«Ø;Üec -îdŠñ¼éCO:Ï‘±Hú’c`êPóÑ«êUVèNˆ(N�Òß²AéNIV|¶‚rjŸ·ÈLvÇHN/ÃMVcŽl¦h£=EJAŸ55RíPö&ÆôXÅ"§5Ó<Ä|­¦�Z…l]ég3}±ˆâ.ò*Þð™�»jSÇ=Ô7ÿzØÁÒíÎÀff‚¶^€ÓgpghrÞqîqœo[ý‚�åãû³Y8Œ.œ N Dm|þ¸pv™žEYdæìg��g=J&"ä�íÞA™˜ -PX }ûéWïÓzq9áA‚@ãàÉà Å/LˆŒž½]¶LQíqA—.`†P@Š­Œ¨4i�k~ISœ2¥§gs;ý1§îÌ€ê.àšrÎha` @ÓE -©+±¥ÃÍCqbV«½'¦ŒÉìh—–¥*Õª5Kéq¯¡4ÓåHÓîñzeÉ­Y­UüW3ÓW³YNÇAíÿ,¨”Gk›@'‚u�e\Äl�âyryž5ÍmílBÛΙËv:ð‚ ©Å[  ¤b&*<ÁN‰E­„G#­#Ò‹üŸWfߨæõ“Jè‡æLƒ±ó”ëPI-¼•>ô ¾éºÜìÔ—§\h -¤PæqyÚ7¯œœpM¦Ü"Ùgwäö‡¡K”A¯Ð í¬3ÃXzÌm#Š2 ”Fa‚ÄaþÈ­NÅX”±AûSìŸuñRvR “z€âV'›¯¸ dt«˧Թ‘K€Z)01òŒ] Úb®K²ÝZ—ÞðQuݶ¹†�”R¡5 -ïåùå§¡ômP X­ŸB02ôe‚Ðãb©#òfÈЗõÂé Ç%ý5Ôý¥]Î@8»X6Ôµ¤ƒŠ×ÒINŸËd7i…Aõ$ÇO]LŒðN€îøm³Ó6z% º³ÝJ–4Ÿƒ0ÆB¤}~ù×’µÂh—·Ži¥8±¢Ó’å„Sü0ú:ÈÇ’f–²ÂJÝAO½FŽ;Ò�žã—Kc\?6ú™ÃÕÌô£Ç’^á|/¯ô¡§ËœvŠûbEÍ$‰W2ðš |ÁÁœ…œè¤ñÔyHbß‘4Éê|bgfr¿Sß¶½Ö ïÆšÏ¯6—-¥nøm³Òàz@–X”ÂP›ãdµ7AHg´ël¿”�ïò›¤Ÿ\ÑÎçŒê‹eõº«¥?xo)¥ -‚ˆÔðÿ‰;`ÒÐ�ýp½±þ$Æiô–4öA ‚êâ»!¥Ö‘–¾RB[¯ðlß &îÚ­ߪ‡ Êus!Ú-‘™ÿ¹Õ€¥±Ã§õwZªší`xõÜêdâ'z|°fdùý±=µÀž‚®¤Akp6ž‚³‘�ðcnù˜Cu/¡ÑBƒ'�\²#Sá�6œâbäÜ ŽÌƒ·FÈÓÜËìöÉ,xu‚õY&$Sà�O²ýf}OæÀ{)Œ2xöÓ“Ð[áÁ�¯Î&_{R2اXžÎ}7]î»,Øô¾Ê3ƒÈ‡‹hŸlbœŒÞ¾–`öIOâW¾ -QKĽmÐ6\Œ -ðlÂГÅpN(ݹzEx¨ÐW› Ûøra—'í?»!_œ,÷ʱ™éù¤G¥‰–3MË$ªÜo²›®L™N¦øG‚yŠÐÕ_võWoNšWw^›»$3J�i4Z#óí­»2y5›âøZí|¢–ù]¤Øm“›J/À:×—àÎ ¢f… -jÆ õ¶#]™�Tô‹âdw%7íe¸§!ÊZ¿Í©6§Àôçß4§ât¨A¶/žÉ·¼Òš/°Æ¹Y·ÞæIM[FmG+×CR£0OêÚÒ‰`C]÷Ûª“7M -Xg_KÞ‰4|Qi¦—-Ÿ5Ýé8yÊÈÐÊŠ€1Ø4xðŸpÏ5Q&†FÖ³5ù=êãíëæ–§l ­c dŒ>±ÁÝsaÖ@&-ÐEŸàñ«?’ü¿Ä?^Æ?ü‚1ÁCÇõý¦M›¹MUŸ³@-1 £`€Ë òI’ØTz'ÝHòm†ØT»`Ÿ@°�Mà1H¡¤´ê  Ù›:¦)£úD{>3y5²®œö³Õ”Àêz¯­.‚ªÙ'�J++†ÈFÍûL›Gð›¼`J¶u>¨¨…ÒcOþ†Î¯jQQH•é˜y’} -e_ ;VŒ£„saÈ�Zmo v›…N–þCLyâÈBî4»$õéâ­‡ë]^³9ýÈ -uë·�€çòŬCo=\´Ü\—»åЂ�%_R¥òFh4ÆwÑï°o…îy¢ô–�0ô…¡‹cëzý E•D=b=Í´\ŸËþ¢élM4�I!äȃl¿°+  ¾½5žòW}MœL‹%ÞV+ljñ.h÷ëEÉ{bù4�>ÏójïO³2=AßCU•ÅÓ~©Š~u�Þeö8\™Â̇™¨õ2_2Uø�}tÔ›ÛÏ«ÓÉõ®¢×gyh©\†yk±¤¿µb‚Ù_O]V”4Ûå)e„6fÈ!Òhd¼0Þjekôž’䣹GoËoŽí¡P´ àùºcgk•í ÓÖ¤ZYÀË–æôæ\_wWL4�’lÛPWÞÈB¥‹/NeÁž]èæÎ~ì¡Ãçõ%^Rúl%1édÝ€|…å /„ CuGÝž‡ØÐ_¢uwÒZ4éYY>ïPŸ®3[‚¾€¯Èʆî·r«ìûéø#¯žl¢ôFŠ,<ÝQp“LüU2Qv:Ik¼$µ~fá[X¯šÊMón‡±ûêÌWÕâ�tÜÇñ�o÷ ûu ÔÜåA Ú#;{A°uúM}h¡õõûüÉ·�öb‚€ á¬öi¥Òiè¡-Š–B¢´‡û$d(Kq%?bŸ3ÊÇg’=eååoIïÕ—Zf}å+�o")‰Â¢B5~ü¬¿Ÿ|{%v”Ř|2A|• 4“{2äð'_oP`…–Æà È/=]¤” A‹z©$–ÆÈu -™‹7l�nˆ6ŽH>£_Uð^ä -Ùþ^-B0ªýÝœÒó“„=³ÞƒSë"NY¥†ÖI‘z>5šéŒ¹v’ÞØé[uÉDu?t!B³‹›Mõu<á6írð1¯tÌùÚ¸HG [:Qµ:æ,¨ÔD$3Ë¿*Êä—½ê“T¼ž¨a%0Z³ŠÊÀhÏ.éÙ×SÖ$ ÈG¢’>ÀFàÚÙB_©XV­N°>Û�è&ú¨bH»a¾f×'o�­^àN°>Û& -è&úñU2eµgûW­V@DÒJ¡¹¼|ؼ»»}³™K+6›Û7yûãôýõ§ï7›÷?ÿúݯ¯7ûåítýåû÷›·ñG7Ûÿ{ûÓ»ûÛÍ»÷÷•Š÷ÎODcŽñól7™¾¿ôwƾmm -endstream -endobj - -4805 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [259.9224 538.3174 311.83884 551.9794] - /Border [0 0 0] - /Dest 4494 0 R - /F 4 - /StructParent 115 - /Contents (Theorem 4) ->> -endobj - -4806 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 116 - /Tabs /S - /Parent 1 0 R - /Contents 4807 0 R - /Annots [4805 0 R] ->> -endobj - -4807 0 obj -<< - /Length 6944 - /Filter /FlateDecode ->> -stream -xœÕ]Y“Çq~ß_Ñ0é0×&*¯:"(É<¤eQ‡�7’ Jt˜ ­Â¡ïÈÞ�;»«fª{v­ÀnÏdvUVfV_>ÿôýÝ�?¼z}7|òÉÍ0<ÿôîîÕ뿾ù~øúùËw?k?zñ÷ïîþñó›áùoß¼úþÍ{ûÑËñßzõ—ß¾ºûñÝÛ›_þrøì‹Ïo~ýÕç7Ï_üüêí÷}õù—_ aóÛÿ¹Á! aø‡œ€cD’ Î2¼þéæùë0¼þÛMþöúíÍg/oÂðòýÍó€8¼üa÷aûãåO7}BøÍíðò¿n~ýòæÏ>qtˆ—�‰ãñO*ÄÉ!Ž!GŠ¥›úçêìQÇ I•b7õoBÀ -â1@ -‘CS;ÿõ†ƒxÿ'¥ñÏ÷÷ÿbuöÿža<øíöo‡�Q‡{Bß|t|äÙ > uDó˜ÊáGÕ}èþ£·Þ�ÍÛaËÕî·rú _Þ~;¼üÝÌæèì©dMqµSgOe�ø¬dþ¶B<¹§²%�%v“¯ËìË1fÒn꿬P/À¹ŒÔ ²–yê Ò$ù_ÕÔ±g � DPšÞ¾U'ºðdïÎ¥ýÓ¶9eÛóºùbÞjsªí³cØUq�ê–Ëce0Çíé—8jp«dnzøøp;Ȇ¡÷‡jëbõw‰ÃÛa·0Ûo8Þ¶ żùýv¡Žžßþ~³FñR úAMƒ¢ç[¤ù^…BA¹\”1!zÈòv àÈ^›½‡k"çn"13¤º6”ýûÄÔruÞGV냃/ýávˆ‚Ç·=¥ñM`:| -SÍNvÝ�Ÿ¹vÛoÐîÕèH?Þoó¶P½’®Þf)Ù_ÿêí_†�Þ¼½�(-À”9ÍHÕ|Ö�D�Ü…=«uw°Ow/³±kT}›\{ D«¤Î×Ù -YMç–*?Œ$!/ÂOªåü8œ)ŠVÚq°“ü�¶òýÿϰ\MðØsM) -”̨M [¹î�'¢ð;.×窱¹nk.�Nu„h‰µ.ì9^T2f^RæöìUšð êûèG-‚(÷ícSœžý¨Úf�‹µöfME-2f•E7k* \Ý"7˜¡9„Fû¶ÈfPBÕþ-ú�}7˜"ærφp -“‘í‘‘þ?×è»Q€$À - ‘3”¨òšVÜÄ)€Èeˆ�$¯¸1®¢Å#ö¬ËÖäÖð”'q"Y€�ZÀ[<ÝI, �q‘¨V>xÚ“D@˜cZ€ª9œâ)GÒ ’ ñUÖÀS�8ÊÔb½â©GJ ra¢kì�º -20”rîæ iRO?2–È7ˆ€º™/&`Lz•c n°/PŸþ¸NdŽ²Æ«BÕyIáÒhc¯�Ô8k#1Ab]ÏFª«‘AÐläåë2Rÿ¸FÝÕ�!Éh:É×nÿê«Æ K?õkÅ_žZ¤’eTÌ�ä«îAtõb@Z€|-]�¤°ÈÛ×ÒÑÑÕˆH EìÖÔI¿–;‹®JÄ)�÷ÊÞׯyqª@DB\_öÝkµ"h-b'ùß×ÈûWæŠe.WÖ;ѽ1GÍe�·¯Ÿ|ÿÆ!ǼÀë׎~ò/Ì (‹¼~Mö“«øR¡%^¿ªz’«ú²¹ƒ¥¬®y’«ø -BÑÌýšç³yWñ• …%åÕ�^òôžF1ê"*|±¿õE�¾§øxŒÕuÓÿE�¾§ù#X/BÿÙûªF>ÏÕþhQ(}Úû<Ú¶Bø¤øùvø8FÀ¤L- ìëåSŽù:É‹ÞÜPÀŒ /¼{µÝw&ùO?r”ø>Hòög‹’눗”sn‹.��ýøD„DÂÜM¾ÚáÇ' ÆÞ¾¾Ï®5"†Ì© Z(±¬wÍ~Yn�\.¡\�n8�ÕjÀÚ‰mé¨�Œì™K ‚„~Ùhˆœd×`"CAÍ«mÏqeýdnlF»­¡ÇV¤šÌV5©ù�}ÈJuãøF–5ÐHÈkʺۑƸDÎMoÚ¦ÌnKšœúé·œ6·/MrÐFæ7ûƒé=ýæG:uæù‡mÞ«2;(qÛV%úGz[€V•‹âʸXd4q×¾ôFoËT™‹bN2h*ëæž‹[Ë’h²¸v¿ÈÖB Åͱ&�,¥h?5ß­¸)ÖŒ@TY€Z0¡¸IÖ¬ !—EÔ³øN›ÏܧÎk1«Š»¶£¹d¾†´¹q;FÀ”h Q‹\•<Õäy úÕÐQq#wBÀRb?ýZìƒ{U’*¼ýzãRp/KÊ�‰"/qÜÞΧÊ�`æ”¶ÝßCý+ÏïÂà™ ¡ 1»F¬­¥1xfBX!D»ä­®$â!ó¾,Ëí@»Hζ˜ÞÛ ý>GXè¸-ØkboØ=™½Ä 1®�Á³p–$�¡�ü.‰©òÐØw5Ù»0ݾrL¡¡}¥ê¾z_:¯&Î|M�Ä%ZÀ¯Æ" @™º©®ÜZÉ`Ƴ‰~“8^)×QêÛ±³¯¿L~U8¸s4ƒ_zËÔ2i;Ú{1Âàz*Vv&¤qШPdM„b…3C.–hê•ö:Ü€‹‹Á9&Niýãæã-³RKЯûj>àBÉ�™R\ý¼Øüɇ&[ûq¢\�¯�É_>4'ÚÙ”?V¬ØD$qRí7çVОP«Ô ýþC-ª†.ð„b„’eú Q5t±'ÔrZdY¦ºiÖ™S…`»rù™hõ:‡��‰p©ËJõÝÝ+3p -¥åÝ{5²]åQJîg Šã"_ °˜�|†RRGªíUÜVIvÌýP…€q#P 4Ù½©—�êUÆÅ<@½oýã«ì€ c þ-¨eõMiÐþ3P+üC·G³@TnS€]•Hn’) ¢ ЯzeäêÀ¢Ó=ý^¬U !¹Å!FMKpP«AB·ëšB„9ôïA˜›¶ÁE(ðú†ÀoAÆD÷ °ºò›�)@Idy›Õõ�ÛXL¤@Š–7Yݹ�ÅÖœgå÷q}[äv'`N”®"~<†Ac¿-ªU‚¢Û8L,uâúªØm&��óôkµ�è6SDPmôçï_ÎùúÕq -ùâÞ -v¡©£¸×aÌt Ÿˆ”ÎeOh>|×^†ûR•(ÞÄ»íxßnŶ±Ú»Þ?D æœæ,Âùw}·\J†�$¤n‘®ÞõÝŽo q‘#Ýr×w»¾$ó§ª&Jg¢ºýá»X€ °t�UÎC&‰å¤êî¸|Ó^J¬ýºïöŸ#!`ı8¤þ‚]•­è¶Ÿ#%È™ŠåË9C$+¬Z ›Ýþsú.Ù½nªap·ý… äŒý{P�;á¶Ÿ£*`( {èw§(ܾtLVyL‰®±9nk:fK�ˆU/unNý"äv¦c1„ -.ëP·-KܼÿvÀ½†2ߨ�ê=ÈíL§�€RĦóÑž^?Ö÷¡âƒf™ãäч>¼xW‡Ý\Ú‹n›;i�B´ˆ©;hüÙª}tÞѪýáøÍž×ßÁ­>C„Ì9/ò³F9Ì<#3›öëq?ÜYô�cp‚¶­ÝÕéï½ Ám÷ç¢ Œ%÷Û‚·ÿ|jÿÉu^ÊD#œb^À7©«^·ý_(ô`IÝ T]u·ý_Èâ†~н ®º‹ ,@!.ÁBUùº †¤æ^çD£ò6îŠwuJ[ûçþB89t¡ ìrlÓÕ}N� M ˜ ‡Dz § VÒÅ—‹E@>Æv ZË£g»J\ -Aûo£í;°¡»€ƒ8¶µucv3dÉ6ì¨ã—³:K¼ 7  ³è ؽ4”VšGÂ9nÑÔke>ÆÃŸ€‘ž,‡œÊ„ãáõ\ïàI÷tܱ–ÜjËÃ>£ƒ ‡˜ÙÇr<1>êH=·—vø¸Ö¿6˜iØÕYÅùǪX¹_¢%ÚU¿“~]¬ý‰jó R7ùZ5úÈQA’)ë^úU»åBKp"À¢f·P#¯XñèbKpÊ@’¤ê)5\‚³G´â†ËØÞòÆ3ZêGÑ¿i$«óé݉j‚ÛÅ3�@@,ÅÞ¹ÕÌš‹h 6Û1$Ì lÄåA7í@˜­�œ®pH\¸‘a %Q¿ö¹p"Lmî\ŸŽöñ4@›9z_¿zãòá4C`µkw'5ÀAt›é%+¼‚‰t[Ü%e�ÄåŠÁÓ‹’u¬¾¦‚vÝÅ@ð“…ÒV×ÐnO¹†Ùðç:p÷J².þÙWG�Ò�yÜÔÁÏ_Ü„áÅç¸ yøß¾ºÁáw7ö¹Ÿn„ 4¤º0ü÷Í‹¶Zë”35“AÈYJ i$ `Âb1Î`ðTH!Ñ€0ef‰¥dG•hx}g6QsjgmGé€E„B¦Lâ!‡A(ÝÓ�âkBPÜR1ó$8åA -…Ú‰ Í -cZPÄ‘ (5 Ša$4 ‰‚"em&q=!ÙqFOTHÜz¾Â˜y´ Ë É)y¢ˆ5Ú0åAˆ ìm¨¯M›ëÈ&e4Ú$!£—(ã.B7-¤,�PKJ¶=m‚z ™{Ý“ÊSŠ˜÷„ÒÊ_Râ=‘Ù‰Qƒ˜RdkÕáv¾v„Œ¿}‘ܱw/‘;æBSBâf:ÅÔnIeÈ5“ë 鹶߇̰飥äA”€KÍö7[þI­B†³º´^BæÒjƒ‡9>aiõçîðÃb^QXýQÁ „t5a¥!&3ÿ(Ôlþà d8òؤWK-kÓPÀ¨9ŽI¶„%ĺØIÂ"A‚L9*Úé#ÿ³).1p1AF@Õqž@-(VÝ4gÉØÚzW�\…nl”R*’øaŒ!Ë>?»—9ÛÃpZÖ´1ò­TÅ KtZxuëª#� ñš±>Ò`ÆrËužÈ®¡1<OîÕB ˆŒg�bSÕ ¼.*Ì8™&/@þÂ5ñÑ@ùAÎW_Ü]]bGZ†mÎýr �C~Z¹_ -ñŒÜoÇ+Œo𬺜éŒÜo/7 ¹_r!;ör¿ <̆žî‹A*<¸5¹¹këÐÂÂZérQ;P"#v­ÎɸE¿8ð §}¬ÀÙT¾{8CÛš¼p^É !²P“´½{Wp˜\À¢Ôªnš«6¹üƒžž‰b€Y˜Œ«føÉG4!e›£Õ»Cµ ?¹P#Vvl<]é r¡eG‚…kN‡ƒ“‚f U¯n9\Îâ P=.‡!$²¢t�ŽýÌ??0SHÃa;#ÍÀÞUVŸ‘–€5å½Á“��¹&KÿÛŽf‹6(NdÚÙrnýÎ'§Æ¸Íp½k§r1ûæiw!:þÆSˆãª”ùQL#Ç&1ë»Jº0ã(‡Œ>»T®¨v]ð ›å@B™8goçw -}çðÁgþ,Âé'O©ÝñGÓ -ïåÐ?‘³:#÷oóOG¾jßõŽoOé!ˆÎ!’v“ »Å¥@¤(Mû¸škáâ�¨�±Pº4ys¤ß…Ù%�(�õ¶t±�×ÑagÙæ(ì+oÎÂóÍhJ‡"vhPv±úðÿ^ÿìɼ‡Iå\• ä}†X¨qKºú¾Éd!U j•‰ÞÆor‘W¬BvÊeSK()¶gYƒ€   »4ÍúMà�Å%t?ëpwÐ>yw No›s®Jõ,§UM¦Î÷¹��ª«ËUvØŠÅòì4$]]”žN¥•‡¶ÔTaë¦×3ôÓõÆW%Ï zF�’Ù2B +;o~ËÁª|·ÕÎÿ¹ÿójùø3¥€ÆûC�ËŠã(È� - ·-Ô¹ÙÕs¶Ñ ƒÚðß®ml³J. s€q Z¬’‹ÈbÙÍÂVkÚ³Emé%’…�€H(”‚Öª^×?K.l I´ÜÛÈ&³ùÞ«&·Å -ðs ’zj«f«,øƒ'-ß‘ºY¨%…¬ .±õãâN‘!Ê p@TåÀÕ© R½Âøã—(Åè7mB™Wc³Lxt•á"žì©ŒhåÔ¼¦ÊpÁ9 lqT—/T[zÐç°¶¾‚Yº6ª1Êï¢sP6xŠ$ÚÍ@ óž\xÊÖúœ _¯rñ9¬I�£µ=ô2P|'ž#б¶¹{ªiž­•¥p7ýÚäò19Øfך½Xÿø.f„Hx…íw19¬‘(£^ãõ]à «Ø’¼þñwq7XØ*·Ö~wƒ5ƒ5µ]Aû¸ÀlƒÄ¢L݆Ú ›`SÕ»(VF—(˜óº¾9ÎSXE)YÖç -ò�沬$!YóÖšiVIPrÌeo¼ôSˆùœòµýðaÝönN"M¥l�Wœ…¤?y~?xÿì‘î¼Tìé‹u¦b«Í�«$k±j²N›ã›<͸ˆŒOn±‹<Ú+ ÏÜB�ãüÎi -Ñ¡ëæE�ÎH{熋&cóÕ¥ëÑîÝèªuuQJ I7åÐÈÀE[}¬šö¢Ï哉«§Qª‹î"yå9&ŒW8].ì†a…ˆ� <îùª®ðì|¢Ô²Þ¨Öù*€£a½„·CyX€½ÉÚ†Û,£×Ðl��?²üÀùS¦.0huÆ�ë)v¦ùü·œ¥s�ôñ> -A(1s“ujG?ù“�“¡�õ r³¾ŸÛÁUàx=Ž–Áæõ^�&˜æZ9ÒdߟãS“ýnveäÓåËV€¦Ò&W ¢ºÛr¢)n®'r¡v’-YÇ¥éÐGÀc�ï@BO.DñvÇqŠ­3᎞Ÿª£ÛÆÛ#£0EÕ·Ñ'�NŒ¢Ÿx«~�>||¦÷ÍÀ)“çyÁ7eÀ‡w΃OîÕNƒÏßTEá�£ð¬Ê§3«ää¡v£X9§ìc�XtE­K°á”¬U‘È.ä—ʆkÑÁZ[’]Ì Ic7µJ vñEÄÆ-…1ehc.8 ®†<Ê.Ĉ åaJî_�j䋃[0‹Ñ1¹K<ÛB¡\ ^Bà,ßÉÀ‹*}×ÞS�"]ãýóÔe½$¥ÇÕ.,¯Ðl\««þC¬°C‹òúêÁ…à0xh2xè~íð²Ê€«“´@ÎêÚÁ…¸0H8µñ;K¸xžñ=nÝ™v�>Ü3öGá‚Óìhìü׬x¥ëåΊ”ד_:³‰]`4ÜWÌÖÂÖðf]¥0ìs¤�(ð]'ý†Rv±9�Çô6ΪޛD„’1Û(Q„œhw#[Õ›” eÃÎn¦s-Äæ}Öˆ­9èi!6³ ¤B”!Q¤bD†œ]ÙÌ.’ -1[×Û,™Ã] Wtƒ?ß,B_óÀßaø¾ŠþÉ í>k�.´G]òñœ%»lk¬á:>Í­ÙcíÑ·Æ?Ï>0‘ZqQ´ã•A�*Žc�>q‘‰8¢•¢})}¹>yÙlûØÀKó8åÝD(é⃠-HG9Ê|‘ë¾o‚*ONRiÞòÙG¨Öÿ×#ªn!ª%<0`5ôT3¾íó -N�YÛ2h²ñçkÛÞÐév1>6¾�÷xz§fŸ·Ç?5GÀ‚™ÖUgœ -¤@fÛžÞÆìñöø3q˜uÖð®¯Í|ø ¹§¿º2K³†¿S™5~&C Gƒl÷Qƒ%s›§°¥:S*+S P’Í(°ðE¬OB¸ÊŒÞºV�\]{Fû|œø6-_ņxs4V Í �u‰l&i<-)ÝLÒxÂRZæ&i<)5<ßW 3Q)¯}X °ÚĶ'%¦f»§*¦>fgÔ¾Ÿ‚˜!ÊC.ÀM~+�­ƒm¦Újå�ËÞßîoÿmÙÃÂPŒ<"�hjžWD !kmz6 °žû’ö›‘•9Íyü· ŠÄ�d°)Ðq;lš1ûm²)Z6&+EæB&ëTr!»Iˆ‘ƒ q³*–55ÎcëµÂfp>Ü)f./òêö×f4Ç?%@É—¹á=%tÕ]5Ù!ÜËèΜëSµÃþ'‰BdÛ—säé Êט‡%Cɉ©�±«„cÁ׸¦QÆ| ˜ÌÓÂÏ ºz$ždnÐÕ#ñäÞÑK°‚—GãÉMXƒý5ž°�§j¾Üý5å€eò.Iž�G¶þš”¹yd�³&.4ðvÙêKâboç‘=Ò’¸�ÜÖwEWY·‘»°9Pë.É'#ŸÞݽzý×7ß_?ÿìÝÝÝ»Ÿ¾µŸ¾øûwwÿøùÍðü7ïÞݽyo?z9þûO¯þòãÛWw?¾{;у&Hj~’êœ;_©<Ýù_:@ÿ¾]ä¦ -endstream -endobj - -4808 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4372 0 R - /f1 4360 0 R - /f2 4384 0 R - /f3 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 117 - /Parent 1 0 R - /Contents 4809 0 R ->> -endobj - -4809 0 obj -<< - /Length 6139 - /Filter /FlateDecode ->> -stream -xœÝ][“Çm~ß_14¥Ø›A\úZ%+%QRYJ˜’Mæ*êaI“2SæR¡W•øß§0gÏef0Ó½ÛsF*ë�«=;g€F£�øúñgnÞ¾¹zuÓ}òÉE×=þìææêÕŸ^ÿ±ûîñó÷?~¯=ûéåÍ_|Ý=þÝë«?¾þ =ïÿöꇷ×W7oß__|úi÷ùO.¾|úäâñ³¯®oßöôÉ×_t¸ÿëÿ\P‡v�¨‹)r]tÄg×½zwñøv¯þr�Ý_^]_|þü»ç.¿Áލ{þæøeýñüÝÅw¿y�ˆ/Px÷÷?iô»ì¿ü¾{þÍÅ—Ï/~osJ§„H+±ŠN~|Ù=bìn?£¨¿úý¯ìöߎŽ.»Grø3…þç�þûw·/ Ão숼@îÇý«Ó?>¼äöÉ__v�èÀîÞr=}¼§ùÙxñ¡$R^œ|vr\’($ÊÊ2¾x¹ãf/�Wbp•È'Ì5\ñ2W½¤ò~þŽ ~SâËY -H²#L¡E^=cß^vÏÿ{�¼·È3§¸†\ò@_{‰<Ðþpúy.É(XLú)­¡Qt=!/´_âÚ�N5NÂÒw÷ß9"›‚.tÚ/ô±B[_س²[±.»ý*î†ðÀó-}ÁÅ×â‘ôƒ�O^ˆ~éE{;´'·ÿy`à DˆwΑ-²±wþ²ÛÛÑî²s{‹÷a ÅÁðK\,íí ,={°Î<Ã@�0q¨s'sÈþ²ãêáWØÐ¸hÙ‰Å7­Ãýì†éËàH|Ê·¸{øÁéx‡Zvü=˜Ê³Ã‘þ‘_Ï.ŽSU™áo§ÇG_»_G{wºñ`nüÇ |�L—]¾}ÑÃY¿�ªÖ„µ£¹ìÈèxý?8Øõü‹_NõN÷j§ªwb±,�¼ìâþ³:%Ã9�‹ƒ`¾Ñ2ð¦ö åúòÞº¶8®eEÜ϶?�í…÷þýô{§Ó9Q°‚ÕHKV#äe «ÑÛE'�ØûÌ3.sê!Ÿ¼ôªƒ´i‘àØúàœØÇßýh¬uÆËÇÕ�~†«†‰›½ìäh�–GVØ®Œ¾0kÔ¬%7#qËÝ·òu¢{éô29so7~ªb5/ wqVÇr]Ü©=\Éx‡;ØÔ·¦±.ƒl—²2檬ÁñYù Ïæ&“uo,FeD‹63 D¢&›i8ŽGÁÅBWØŽI«Í© ÙÿuÎíX»úÑúÛmœ?^bÍ2ÅÇFËäொÞpBlœØ/s³d¬•ñFn�ØÞ²�wý‡em~i8¸ó�ÖØ¥ÉøÙš¬¡·ÙØ“�ÁÖ÷dfL-˜qI«Ì=ÝÃ¥Wª£ÆÉN}qif'˜#…ÁÆ«>ª_$EÛJ‹™·Ðe·¦ÙmG†Ã>ø„½ðP‡¼êï>=�@ޝ\rüwKâŒ,Þa9ÜuŽª; IŽ™áÃÎD,F–r£a޾_zïACÙSÿ×�‹úgåXSÙéŸËàSKž®Ï±>,rafT‘€h6>Y-]Ó1’ËÉÕnI'_¸«:˜D—&ñzñ›æÚ4ù,»ÏÉwƹÃohr>UqòÆýÈåô©ÓýÉÉqÇ!õR6¨Vv\0�÷ÞùUšÛ­îÇA¥� •úòàë8¨Ê}�ÄþÑ]´n²KÜû„Åbo öw36É`¬²ÖÉÑ#sž{)ŽíîÒžeq‘ß' UR׸lùÄCæ¶­X›Ôº#ƒÑvà°ì™Š½•å;ZËc¿(¶rô¼Yypš[¤?ŽÄýéï™ÛåIä¢YÝ=WÏ´•Sö}"_3Óꠃ -äE<„”â - 0`+F—!:Ça °¤‹Ï€AÚEð¸DÝÚì‹îñC iÿu‰¾µÙ“è@œßFÙÚèIrÀÑo£‚æö '!v›ˆÀÚ8ôÀÖààM‰¾åqfpÉ×-‚Ç9��ñ|xôï–}dËn:qàˆx¥5 N— ¥-”V,»é|Éq³õe‰¼e4]p�…V _1bN R­Ý^Ìî~]"¿$kéMh:#© -“¥&·2b„É ˆcªÞ¸�¿{nà Y"O¾7 �Ÿ+‡Çs£*ÇSñýŒ¡±Ø¡q„9×hO›±Ãb‚¡�z�±Ÿ0%ªb &,NøBP>ÑŠ�|¢‡÷ È›VõfÁøDDç Å%-[WL�þ¶BñAô{"ºqmöLH~Ÿ¶�RmåÏ›‹3C±nê›L£3ãbÎÀH+�¯°�ÎŒ‹% …´Å=®3cc/@)jXrî)0CcŸ!rel0fh2 ÃØÌ@)5á̽AÒãG¡Æ_JM8sw�ó+ÐÜd„ä+móô›a."Ä6Z�f˜K’ã–@i -¼ä2�Ä°Í -ôfœË دbJ™oF¹Âày� ÈÊ™oÙLç#8ßg²Î­0–ÁtA g\ÁcÔ(Œe4]ÈŒ›,YoæS„ƒl°dÍTbvà %u�ürñ -wâ,ý-Ñ7mfÎàQ‹u¶ÐËfz ‰ë8XLL=,�¸”˜ò)I^­oÏ®@Œ„9§q}maа¿È,瓘ôTY_iìË2¬ú¾¥AÌT€�R/»8îÁ|ø=Mñ ZÐFTG�õ$Ä ¬ Ä·Ñ‚ u뇬Ü4cfu=M„uŸB˜É;–:§&Oß1¯x½<Õ#¹ÛOÍ–Û˜“8)a-zÓ°X?ì£ÓÄ–µ<ÓÔ0Ч‡=’1gŠé ÷“Üë£Á?Ìm»ê� ¿KE¦ƒtª]ÚTõ¾™ÇÉWÇes sÇ{´Ž�…L=åp¦ed†êX†]ã ž�äZ„ÝÅ;WM-ÉÃ…W¼¹ìÂØå•×øbµ¯‰ZŽ^ï^”[äØÚ㉖lÔ±¼¸Åú´´Á1O¼Á¯ä}Ôb­ûî0ÿ±DßîµàI»IÚglP~™&ž82µ  â &™F^"Ç([È [Æ‘]€àâ -2(ÕdË8²�\+ T_�yf“‘9Þd,ëÈZÃì3…-”0[f�“‡Ln#%´,!g†˜ò”NØsXt.'à�Ïærœs)KçQ+Pù|ûƒœý�˼çóù¡œýP«ôK~ˆQ+ý¢ "4� EÚûÓΊ/²`ÚAö�P]a; èŠ,˜†P2ù(k°Pl„DÓ:‚ä§X(ÚbBÓz)¹m¤`î ƒfZA -¥-¡¹1Ôs–È[¬Gs_˜<ò ÔÌ�i3‚‘MÑÎtàRJÛ,G:KúÀQÖ`¡´- …G!‚ãä·`@–]c¢¦î˜âR4XXg€ÙS3ýòR4a;XgÉoAß´…”!%\AŸé›¶P[(bh@…_6 -X<ˆ n�ÚY(Ó:F¿ Åuh"°"¶8¤´‚ ÊöØ„(à às¿=:ûR0Q -8DHѵ1°Kãý‡þóŸúÏ•ÑÑL»˜´æGEòvkšƒQ¶f‹TŽe®=-æ° ÅEhˆ8Àè)œß9›ð¢ç9~uÐ —ôÊ�6v&ù»ž�e°@»G�µ4•60v{ˆ�s^Ã=—5Ñ´†‘�cZAEw`÷°Ç¨HÛh¢i “ƒ”y‡\4‡v§nà1Èù-�Ù©ëPØklGŠâ7ûtFE�Ò”Íù°L¡'5…ä4m5‡�ïm‰v¥Hßß2S„ •¥r*EÈÁ¶{ -0ÊÃêäzˆ?³³—p羪Ølváf{/á¾Ã¼™…¢á4û{µŽØ%\��òÂ5�^(C « ¼pÌÃvÚÞ½Ž®Þ âXE?*š�†8”åÄz½7ë^SNÛ(�ÙRLYÀ$if è­Í†bÊ ’ë³Z­(ofG1£@r©™�â~Íìf5;^V _^uf�°ùyaW]uÃn¦ŠÅIã�}£BðØ/5�*N�»ßÅu§ªfr΀\I¾q�Ùº:|Ò”}+5™S³¹wnѳ_ƒ…bæÔlDÖFñXÇBuíݤ ¸?ÿ¶Nù´Óåp7UXj�=mr½<ÒÛ }]\$Ë�ÒNP3Šç[$fsçq‘”É·Ùa³ïLI@‰Íäk–È|Eö~ ʸìv3™h \¢X('÷í~2‰QÖ™‰²ì†1>¦:¶°mPo«”›Ïõ“VbtÁ¥Ýõ<…;(×Ó—oÓ0›òŽÆƒæ Wƒ…Ü&$�1! æ° HÌùkÞŠR0½r@`NÄ5bh4º¦K -øŽ+Ð/‡?vãŸÂ�s&jf ¸5³ÿ¢ž]­A¿¼û·;ÿCpR3Åde4�^vÀ>²4Ó/&=¢ý ‚—ÄUXuÉpÑ—„Y• &/=�,€Lš/˜‡®˜ÞL·t�¶iâ ¸�ñ“Ó›B‡Ý>¾5t‚¯°{nèCQ€ã‹ÍZgÅD(c‰ÌÜF»xwÜ’#ÙR¯m-_³bm¼Ü¼}sõê¦ûüé¨J0%Ÿs'ž€å(Ï'Ï.°{öä_.\êþ÷ÂuO/¨ûæB¿øî"'AwØýùâY‰Š89¸zldŸSJ%2)¹0v ¼S¯úî!S¤¬ðêÚ‡âsèPËM“ˆ �'pÜÑ}5Ã׌²™u¤ÙA”˜:ñ8•rþ8ëAÇ( KÓáØçÔ_0U3'ñNçðô?bŸ’xïkféîÄwº€�CŒ�R‡àœ'ÆÈõ(äZ]Ñ—cLj:eÓ9½ã,™¥¶IïâéD8\o–&äÍ^}­kô=yÇ€'R³[Ñf©Q¤n”!BÖF¼Fê¿­ÖPß“ =Á@‰¤NK´š$…Ø9†˜“6°Ö(¥^³%ÙK?RÕž=ÄÇÞ2„„¤{wÁ€DœQºGäsÐn„”½Þ¢ôSt¤M<¢ÄÁ‹O™¼Ìªè€Ëè‚�� Câc?â¬P´5j㤲+„!uï.”³@™¢§Ž‘¼vr(gœ(‘SJQЉ²Hezgcgb.°O@£ï„T,G}×udÔvÌzŒÚJ]¯NÎE.N/ž(ЩZUz¢ )r’;Ð;ÌŽfˆúЉ‡3Ä@ä“`gè8ÉÚ$NK£ü-“Qíû]t^(cÊy ò!{OZïu¢ò>FâUzwV"³¼S´¬Ò¥&%:$lû=M.ßQix:R0"ª_Ó¶°3›ÆœÀgÝ-(fˆ ¾¬É ä„9îœw•AÌBœr‡\ͨ¢}[Ý -“Ä€Y¶XöÍUz1PωS$¹å’ÇzŒóɘ½b¢°ë¬;ÎI[ˆïír&gˆ5<™uÁþçåÉî­%ðŽSÇiÇß—©:>Ù�+9‚KkЯºñ—–N9("S�tïÈÿé0Ã31m¢6Ýãbç1Dõ>µ"ìÀ0ª¯É�˜è0r_V_'§&˜[2ÁazÈá˜{º+ŸšƒLl=*Q×vMiGº%=†r!�Ö6˜%HËŠß>KÿTdÀ´üØ_Ó7Q3·C()ÝÔdtG� »?MØ.!aV¢Îéå�ŒN�Û}q–v5.¡±‰ƒ£÷ÀcÖŸ³k›88e�‹~ƆM ñˆ3ù-fÉ -ƒh'Éù� › 9xTÜæ ÔÄŒ¢ÓòýX·Pš�›C5ts”�£_.v3c¬onO?œ_…›êÑ››¹©€ofŠçˆß\ÃÃß&€ó/èü®¨ã6š‘DÀÕlWLb¡Añ(Õ}™ÁðRÝÝ<Ý”95�``ˆ}Cëå«1:9Ÿ}µQ�B‚˜YÖTø;ö²‰‡DQùÁûŽ™À IüL£8iÎ/d:¦šËÎgœF:ÉéÕµ14ɪ¶¼Ÿmø$NcŽmóU·[²ñ“$R6˜34ò¨ fyT´°�ŸH¿¯ne¡”ñb>)1dôëhb)ãÅ&|’ÂÙŤg:›Lƒ‰ $Á�óš¦?ÿ4˜¡CÔãm§ô=x.ùÀ–{9ÙDM’è!'Jé�_ô ”ƒÞ,~¯ømeb",=ˆö+;­ù8›å2!–ü/Gu -¢ªª“gb‰…!%Ims5wŠ>åÁ4�Áet+ððQ‰e‰C†@ê?Ú…Pêaf‰£(¶Kví”úØÄYR> -endobj - -4811 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [186.94914 178.54639 238.52814 192.20837] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 119 - /Contents (Section 3.2) ->> -endobj - -4812 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - /c1 4403 0 R - >> - /Font << - /f0 4384 0 R - /f1 4354 0 R - /f2 4360 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 120 - /Tabs /S - /Parent 1 0 R - /Contents 4813 0 R - /Annots [4810 0 R 4811 0 R] ->> -endobj - -4813 0 obj -<< - /Length 6514 - /Filter /FlateDecode ->> -stream -xœÕ=k“#·qß÷WŒ"ÉöÚu8ô T§¤³cʼn§tÎK§$§ÓÉV*·RÎëJùß§z–\r†=� ©‹ª´ÜåÍ @w£ßxúÑÛûo¿yùê~øùÏo†áéG÷÷/_ýáõ×ÃOŸ÷ý—öÕçúêþÏß¿ž~òúåׯßÚWÏÇ¿ûò÷ßÞ½¼ÿö»»›_übøø—Ïn~õé³›§�#~üé³›ÿ¹�!qxj IaP†P4òðêÍÍÓWqxöùM>öÙM œ‡ÿ½ááÓ~sc¯½¹)9¤D ‡8ü÷Íç7ÿ¸ƒ4æ’dPæ@$¥BÎ\RÔ%áqxsC…’3 -F’’†4q DF}ûj­ñ›Ï¿y·YÚOŸýí/‡¸]ª}¤1D̃rw+óê�7qøã«»›�ŸßÄáùÛ›§ßÄâðü›ÝËöñüÍÍO^Äõvxþ_7¿z^[%D°©hR>j/$ˆ6np(3 )¿“ÎF`Î�5æ!åónÄ8zÀ Ô¨yHB’ -t]þY+h bɃRi¢‚/†¸ÿ -hRÛ¯6ò8öÆP’j‚<ÄÀ,€Qq€�’* Qm4�šŽ¢rM+–|9ú`¸†‘¡”0Œs<�<~Y�-lÂÀÊݰÿêÅb¬ �”¹‘Líx,„kÓ_òD„”�#å!¥ËÒŸzÀ“„4×.ø¬;»°s`ÁnØ5Ú/l¥�Kî†ÝLûš‚@æ4(Q x#iÁÂ0Ò) -“Æ9¡²ÀH¸P×t.&ƒ kj;ÅcHXp<’¨pI}¸hÈ„šì I,9“on$ ©RžÄÀ ©ˆ’± �$û¢R¶ß£±Xá’Ùi‚¿†BdHvvu/eÄ  £”(ÛÃ!¥ˆ:H@@RÃ:*QÎÂ6ˆ)ç'à"r´¶âé�X0$Ѩƒ"…¢9mhFÚ¬Ìïqñ"’´R/”“Ä4$… "|ꥊ E8…LŠMB^bÅŒC"0» w“/³ˆé? Psf~ ßÄ9�ô5’j²=Ƭ#Uh†ô@¿HE8µÐ/Š¡6�#Q/³fLÀj$…uKÂi” - cÁ&JÊ)Û!†9•„2@JÄÀG“°«qC ”è�8‡R \�‚ðs•räqÄO0$ì¯_e'*�˜Õ1 -�µ®·0-9'3§åÔjÅe$šåxcÔ„F#aA‚*`¦ZÑŒ#i�r”ÉH @rD0ô -1Ž"³IÈk"ÑL -b4[ÃцWͨC %æR†77"–HÆÞE²Ú¯¹ Y�¢ -˜ÕïXâw͉D¡HÉEÓÿEåÝWôѵr‘BÌ%â  A™õ -íš³„AÒ"P+ˆœAÏ'I…¢ -v:BfÎ_ÿîï"§èaò9uû¦:‘Á�´”Q×G*ØëØÉ™3G]“É\�o,¤ÊŠÌd~IO�\XG§$Y¥ñ ÂdN[å!�vë6¢ÛáÙ Â$1ç‘'Sm*†œ‹À A¢¤TF9R¢”Œ{óƒÀ˜‰ É¡ž)ޤ9‹_Í×hî¹ý>¶uJn¸-’�úù¹äþª–,àFãbC‘&?Þ½ ví |7VÓÓ8͘.éâ¸�´˜äª¦É\-‰†?äb’«í˜ÍQ 7„ÿº„Ëüw5Ô\ýçᬽô²9û|€Ù¯ÿòî÷ÃO^ßÝ:¸j 9%àA -…XhM °|æüÌ~<�8Q6Ÿ<ùþ«Í·XS/‰køƒù\9KÏ Æ TSªÈ :2/"ÕÒ'È;MÀÜt¥\G!¦ -Þ¡X¶¤ƒ¸JS†ÂæSgŸi�’î«tä   OlÅ7»÷¿oª¡Lz»orí†Ú>õÈD©:M×Ï8KßvŒ³ü§Z>™{† [<ŒÍ3¶ÍX2ò0þç|ß*.–Ô¿ËïÏög*Ì6"Ž`• îZ÷’ý“…Ž‹Ù·—ÿP[K×~ÉæIìäìÖH9»GÎ!AÑnžÕ {Ö–b±0ËÀ¹4+¹¡§˜)à5XÉ�!İð?Òø]ƒïêö€�8qÿò¿x[ƒïêï æ‹Îïι&n¢?c(1æËï’x—,ÅFð <úâ®ß“‘$,º}%n¾…dsrŸcþßÔà»i–A[Pøâ2R\‹¦³ùÏ/-#Å•‘™3Ã(".'!Å•�™Yõ‘±rÎ'ƒÿ»xW@ZeIUÿNðUÎwåcá �´Ûòx¿=yb/ë˜ãǃ¤A—6¯SåíAo_[7Ûè p ©XÆèæX±Ÿ?ÞýúÞ\'tÞ‰‘6ú$Û½Š¾Q°³3jgEò„5 !B˪uqkrõÙÈA2�àe k\Œb“«ÐZæ9 6M¿nº»»u}h•z7õq“ݧæVäö-ÐÛã>%>B]¡Ö=¨sët‹ùößÕÆØ¡!S_Δ·/ïѧ3ÇÄõ& û€¿ª­ã{ œ{/ÞN¾»;úí°[„*.["xœçãFï´&&>˜ÍºÆì¼êë%•]dûjôVà!}Ïd¥Û�år6‹x�†·$¶ê/™åßÜiNÞ©JE3Þ¤Éî>R¿7èfÆoŸLövöà#¤éS·æáÝNw{ÚÌq2¢±á½·ÃÂ9±¿ -;ˆ;Aãð†;ñGþžø·êß©{½,«ü°ÊUçíŽ;(‰zº'üE¤í‘>Nbßósÿð ûm6é®Õ-žRÝ-AXûf3NæÇµsU«¸�•O«yà:qipŠ'×ÓK´4bÐæé•}jnž¼s¾»–’ç{€­]Al#†U%¯ZÑé{€-mïà«nõ=À¬©þokàýl¨0[X/øš=®®ŠË)¤l)/½àk¾º[¡P¥AlJ¼œ‚¯®Ç6Yí„U`÷sþ݉Gÿšú:UžÞ•Ó´EÒ¨ç}a� 9·-wŸ¤ñÜ/ŒlµØ/iþ½Þ;fØú°¤|yAã‰y&µô’6ðÍñ̉WU³²{ä1V¥Ê£ŠìËÿ¢Õ�wƒ¯QEö‹;sˆÅò×{Áר"ûòŸ-bvðF 5 ü# ‡¤j`?µ$�,KÍ"žÄ®[š d²Þ½Ô’¥²_ý“)áu¶ ¯ÊVSår2 ¬Ê€^ð5P⪠è_“Å•€ !� ù½àŸÔÀ»Pr(jYã½à^ïJ@¥P0K?øjà]ñgÁ1áÃÅÚàéaã±ÿj?þ­v761Ô>TÚB³Å¯�•€1vÂÿY ¼+Ñ -wξjˆ?7Y‚µ ‘nøÿQï†çL+¤tðÕÀ4D71�4d�¥~M -AôJàleQ½ðkB¢Ÿ˜ !FK_¹8÷Aô3JÀlU'½Ôä0ẖ̂V× @?7�¬Ò³�QüňƋj tLëG‚Ž,q•#¢®Ÿ §ãÒJ•yýPèDà§Uø~UF D�›Ñv*€Û`ËŽD«3íF`Œ]UPpE£uZ(LÜ�B•3ÝHD)æÒ ¿z4ø=r8`4ÉØ ¿f�€ßGØš¾�~� ýö*’CŽV5Ћ@M3¿«JâǪ…+ +Õêµ±�㎷?ÆÞÑ�8PO°¤N ®¥lA&Ž;¨Šc·‚5úaÑs,@U»eôÕŠxLw"PÓÒÁ­ž{Z hî†ÿqþRûá‚¥Ž#·¬ØNÄ\Ì[Ö�BU`{b“„Ìòn•Ȧ#j产°�{5àUO x,ë@«51Üra°V¥…Ö˜Éd ›S¶À­±>½VñÓ€`—ãÜ`H Æ3/Л~ÐÂ;ðK”•‚°öî]-ô~r¶~|q¤�2åËeÃùõb2æd7ï;T{äŸJÖµ2Ÿ�kÅw@~{ü¸XOÜ^øUYé–[]QV«äì…_×ÌÜÂbb šÄÜ7�TxnÁ0I -Ädªq'üZ&¸•¼”RPk�yqqâVò’rˆ…E¯ NÜRÞP â�Ý óå’‰À-¿¥lQÄ’¯Àný-eËÛk¯i àVßR¡ Yä -ʈ[ËB†|yöwËoâx+€^žýÝò[Æ4ç3ì~�ÿÝô&ë;æñ^�ÿÝ'‹¢ë˜Cpqþw+kÙúÌ¡™¥§«3MnàVÖ>V¸1X{éž~‹uK+é°peWÒ1/\˜•Lžör¥_óÍ×0˜Õ'ìò®WŠ9ŽÊ·te«vÎì†Mrÿù¸­Öb¸i£ Ì�áBÍš®_B�ÉøÛ­Ni•J÷±Ä¡LtœËoê¨yG Çl$˜z:4ò 7{†(§PÖ«�Ï�Èž¡î)ì6�]jwu`Öìr«¹wΡz[)�[Ñ $¥ZP¸NÏ pk¿!�õ»í[«9¢«%h{^£'ÛÄwçpñ„îr1iõF7»� pß&µ©Ån·U˜h4á×þ|>ºëºnÜ:ssݠnÜ:sË|¢m;Ôg¸¹•¿Äd)Øg€_·\“ë»â$eÎÝTm·äú®DpŠýPµÝ’ëºJvÅVí†_µÝÜ -Hs�dŒit!`¼`ŸpKÍs’U»�ÒkðýĨA€%�IhÙ2]~ðsÔ/V4ËVUd¼· ð‚Ý›`¡\±Ä¢Ò³R�  ‹Öv?+w#P••~Å"—�s>ÇTƒÏ~Í¢$»ør7UuÂ-âÃÄ!1'y—xÅíNmýÍ¢¦«ðŠŸ¬“IÉt ^qÅj´þ59c7Õcխ쳎€v‰ ]�WÜÚ>Ëè•~YQÍtkû,Qb.﫸U€$1¨Ý¸sVq‹-v–‘!]�UÜ@J`w„˜ -|écůLÅò¬å -RÝ/kŸb”+ˆ -¿7ΖØxQáÉJ«|$±cý¼:š£ÿ¹A¦Æ�nEà£/ßJ3“tõžÆh~äG²×lµ Òí ÛÇ÷:b¡u7î'Õ1æn郷—zsE¯ÖCñݼ贖)]8Ì&<úò÷»‰µø% -Ô<ž–®Ùn+m  ªÐì÷ÜÚî°ÅfßÁ¦o–ë£ÙF2žýê�¶OB0›sk3$P}iüj)»¸'a?ƒ|¸LËo÷�PïMüRKO¯ww<`–®¾?þˆ“ž”m´çFRì~¥ÂH-+Üç’pëbÙîÈk°Æ;!íÒØ‹…“ÝjXCÕn'’Pè’:‘[k•„vã�eòžõsÛF+èè=_Ì-µì«“š®ÆÉ�íúõžy®Æ–gì´ßÕnÚ‰­è ¨”9W=.ÀêÓ áoi�åv å`øcx{ÿ(mw»…ÇÖf5ÆlÞ¯ú\ÉLqK”í²†¤`Þ¯~Jñ·a_¹˜G2FføéDéX§ƒ£T¡ó’D•B[h²ÖYuþBKãÙ;Çwcm stëËÙ:¿'± ?O'ó¶ë½Üs»n¾œ~C—tkÌÙnÅRnC¡µß™Kº³\˜]ýñtVÝlO}K]cž�k]3§Ñ­ek5ÍŸrú:·¦ [̾;T-K—yÖ‚ŒÛቨ•“FI®8¦ËïDÌ͆]À¼ú"ºÝ«'ÛG'%Ì…ý4K̇²}—!¶v0L¶äwN‡–,Üe3àû«¨ÄÛ¡ÌÌÆõ\ œt^Ù Ü<ݵ9V¹O9v"¶ìSj—ui�Õ­87%e<™×?¸hçQÙ_»š6P]ã-¡f¯^ÉÉóá*òó”Èm]jàÆƒÑvÝ»«³]'ÝY‡Ð©2T~Ð�âRX0]Ü]õ’NW!O�‡%ëðlK:§1™îÛõ9FrrbŸjÑkgp�–Îè¶mÙ‰„l¶��ž,~} ÜÞ›ù:yö÷¼7h P±Œ’ùüÆÏÊÐí‹ìÛÍ1PâÆU^Õ2?©êxe)mEòY¶ù“¥þpÝÖ”úƒ§äO�È]Üà .b|’l<mE6.Cî•�5Êt{Y¼°õµ¾ïžÛMS`áFøÍÑç'VÓTò�žÚ\¯‡n÷´Â�2bÿjÕR›Ðí�‘¬ƒcºÊv¹URÖ\œJ,ýÔ’›ÐmšPB†³¬@-Ý®ivÇÒØ™âò à6M*�JJrp»¦k`,pp»¦�Ø�ð�¼ÌEF‡ž{º â6i³[¥¬3Ô–ÜÍ“G+Ï´öFgXsµgñ^õTáÒA?ïÞ.í…«ð°›NŸ$h"<ÃrþÈ(2ØÕw{*U\\èuëiFÁ,è6ká¨Åƒw®ƒî9øÝËAçã¬9Lˆ©v�éÁó›OÜ£µÙݰÓW*nÌú¶}ððŠ³‡÷[,¼íËB·KßN4–íò5ø÷Yú9Cãü³†ñ>óeçbõ™#¬‚5ëh匦×Ã"¼¿8Çr]™ý1T8[·ùÄîÚ.lÍë4ýtzï–Á׸xþxœ²€k¿zëù8st}ÏÇÂnìí×J?”y4¥Ê«e•Wc¹•žCÙ•GL�cÔ]€Ú ;/X¤«Ž�éÈGÇ1cÞ ÍÝÊtfW6{"æ«ò˜•¸2�/̆šÄêÅõ¥u’*ֺߋ4þ×^Æú”ª7ŽO^ø…ýø+ûñ—;Ì?Z%Y·ÍÁ<×ÍØõÝrK<1 {º¤¶ö¬‰·g죀"©/­yꕪd&yÎìY±9•Ýž®)d-¬g™Üò�é¾:û™EbˆXJÚx~<º¹>#×rNÙÚÊåþ }²™béµÞòžš(à}À¢Ä›qv­ÈS)‡óŸÞï+—IW'zŒÎu€š24fq÷ �Ïè[ÛùÅÕ;Q�Þ®LòõµÎ)´*×2Ñ®`ÐNÕÕco_%�]r×± ´Û´(·F°ºšžÿ¬—3-çñ¢t*<[ -ÕÐmËŒ”íêš³Ìã“¶P¥ÛžyG�l=Ãâé�ÜÞß�ãîɶñüJÏ…Ø£ hrÎoeÛTÝܪŸ÷;·ç�˜[ýs{}ü÷Mž ±�`rs AÀ’fŽ©£êsc%n9“½Úέ\ØLã+³C,y'‹'Kg Z�ánÿ_€Ü…� vÆÕ‘jçBtÛ_ƒ]W -hÛZ59|fΪºæƒžœ§|0R¥›éÁ+—R‡¼%YHÕ™?º¢Ì®gx¤£©®Tå…`©i¬És(WªSCoâAuÔö”s·ÙûN.E R_l¥�l â.Á Êd/œìió@/óüYß›üÈoæ_¬ ¸[EâÄ:×ÕAWã‹sók6“üéÞZ­ïÏ1ýŒ]t.ÇòKë4õ«®�Sºà¸¤m¤﯎««t8M˜ß‘‰øh°& -î -É´ œB!¦³†kƒÏ#];÷äÛÌð:¢ÅÃð¼p8m'ãrƨŽ%¸µôfjÛÌ·–V—d¿nnºÎmµj ÃV¤ýÒÖÌheº,k39-awa˜q­O<�Ò‹d79yš–,¶1Íž¯eÆû½½ÿö›—¯î7üÿÑýýËWxýõðÅÓ�¿»¿ÿîÍ—öíçúêþÏß¿žþÍwßÝ¿~k_=ÿþíËß{÷òþÛïîÜfy€4¡€HG\èÑü˜¢ÿN?¢� -endstream -endobj - -4814 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [321.7234 605.9284 332.7234 619.5904] - /Border [0 0 0] - /Dest 4495 0 R - /F 4 - /StructParent 121 - /Contents (38) ->> -endobj - -4815 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [340.1572 605.9284 351.1572 619.5904] - /Border [0 0 0] - /Dest 4496 0 R - /F 4 - /StructParent 122 - /Contents (39) ->> -endobj - -4816 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [330.0642 189.77643 383.65222 203.43842] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 123 - /Contents (Section 3.1) ->> -endobj - -4817 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - /f2 4372 0 R - /f3 4354 0 R - /f4 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 124 - /Tabs /S - /Parent 1 0 R - /Contents 4818 0 R - /Annots [4814 0 R 4815 0 R 4816 0 R] ->> -endobj - -4818 0 obj -<< - /Length 6211 - /Filter /FlateDecode ->> -stream -xœÕ]Y�$·‘~ï_‘ÒÈX·Œ‰aï…VÀèK ËðB�}‘ôÐÓê‘Æ+õÈí`ÿû³®df�Á*fµå—驪LF0HÆÅàÇ/7oßÜÞm†�>º†/7›Û»ï¿¾yqóî—ïÒW_ÿúzóÏ_î‡_Üß~ÿ˜¾º?ÿåö‡··›·ï®>þxøä³O¯>ÿêÓ«_ÿrû°kí«O¿ülPû_ÿv…ƒÔð¯ 8‡fð&é`†»Ÿ¯^Ü©áîïWjøûÝÃÕ'7Wj¸y¼zñF ˆÃÍ›ãËéÏÍÏWßüþ[¥Ô{éŸoÙí_m®RÃøÓ·JÛüWµýû˜}RwŸÝõðÜ‘Š>ì›PfBåð$¥¿Ãõ UþÜá‘ ­*M¸óÇWÞ›8¼¿oÍ]d÷¯S�m½mà5×_¾Ÿ{ŠØÀ9¹Œ-Vªù3ÛoóÞÉ2ú`!˜ã8g­ó#w=è�´Ø¡:tÙM¿ÿ û²N€íq‹È.9«ê#ÿÝpóßWŸß\ý¿X±ºXµëÝù‹5uäzxŽû9¼còz@~V£M:Íå1]2¥gw‚˜Ìì%騑Ÿ21�:“†F)>«Ð|s=¸ýkuÞ81°]Ó™p�Q$±»sž}÷rë{Ij?5u˸s¿®mŠÄ멱x|w*ËLZϧßä«þ0ƒg��Yª%añSuñBDÓm©sm;‘Ì^º”Oˆ\!¨F4³E6Q§¯Ë�çÌÄ„~2o+4ÇÅ‹‡v”â³……^æp1Йú¿Î¾{¨Qß÷gÚm&é=5}*_-ýZÎ[þÕ ,…&)äë—êd“¼�"z™£Uœ�ó(ç¤A)èªRPÈR�G�kdÒyçvyªC¦–˜,ÅèŽþuª^¸j«-´EË’Y¾p1K³ìu¥”"QG,G/w@&êo¶Lê¤3›<ûõüžÜ½Ù‚¯eˆ¾¬J3sgd1Ö$ªèKÞ!VU´¥—w›_oº¹ÿÇføèÕç¯^)õò³�÷ ºc/U=Üüuä±Ì¬­é/ بºôWUQ°Áéh|öÙ6;{õ$Oë|u0ç—W‹^5¨ƒù;Ç(mJi¸Ìl�ÖI÷ÚF1ÔÒË®-“?d�i¦�É$§…"¼âî‘gJ¥Ø”Ÿ;¹¥�Å‹Ë1USë½ôÃy;qŽÌüG‹†Ô’KÿûÓíÃÃïï®™eoB«¬q-ë…u�Ód\æÉ}«ÔvPßì9?ŽÔaÜ¥Þø‚’5Á˜×ïZ¥ªú3(ˆÔ‘¾ý`ºî²P�´Óó(ÿ2îKê„ ¬ÒÌ F®¼òÆ$µ2º 1OÆ¥´fg÷úµf•™ýìñlÖ¹ðVÅUß½øÐ<é”—­Í9)u'-öXóìj‹ý_áÙaugÉ9互ՕçqþÌÇ-Ë×f äk‘[~£Fdfv6‰Úb¶€\-ÈÜ.ƒ£Æ�ìã3Z޽�töÜïß:¦èÙP˜S¦ã¿ÏÄ­‰êÞ„ÓÚÚp“´71Û08¤¤÷ŸŠMd•ˤ¢R p%^£1 â¶£ñþôÃÎ)DW}óáèÕLæG2SÏ÷vj·3†ò&R5gäT€hµö=+SM¼ÙÂT;Xj´K‹ žDá-…Ê-ãýlwqinf«´@TÏ,Ì~Îm¿¯{"KóTáü�éŸÿš)«‘©/Ê/ ô ù­’äyÃ%4zPhuèš8cw>Û•2}.W  Á“^cގ⊢Ç…¦µ¸˜x!'\ ¢�´žÖ’ÇŠ\pˆ¶ØÏÅÈÄçÒ¤à|"m-g×BIÑù>¶ÓÅV Ó‹"K'lÏß½àñBá.wo¤m̪_h£ŠØUÄ0Sêü–3SAb(ô&øí³Nr�³"ˆé0nmkíÝO-Ñš/3 ŸXK·tÛÛgµ¦Ie±.—\²£Ê‘M-r\4T*‘È™Eçsç ‡Ïȱ´È·ñX|Šûõ¤L™Ü@{.c9\ÍÉèÒHÕÑÌM˜fıP}\$ P l@p»4@KmÑ!6ÜÅðÇ~ÖÆl ŠÑZfÃ<>,í<äJàèRN²)³UÉ1³ ?ç NLŽHKw Ë¯~]È&5ç¨êºe6À‡ﬕ=5ÃuÈ�\¼´°;Õ^ˆ5‘”0?.ë�×®²f´´föi…±jâŠn²µ¿a+;Ę›´Ô$ 1êÝ*ýÙ�º–Y3"kÚmYëâl–<+óÃÅ9¨#xÓÊB“Ok8¢v¾\æg0*03ó³wgfrñkÁ[~¬¶Èl¶ÏkÅ¥–� ãÈx�Ô6Mmœo¥Aæ‚7²œvûéo«dë,p‘ÙÞ*íûYx-ÑçB7ò!R\CDš E(8ˆ&Ø.¶ í.ýórfãä’.Î=Òˆàb#WÍfÙMý‡çlUna…× -¡¤‹¦N»Þ{Õfë¤Ía55e{/ z³-â׬zÊÍáÖz¾™nNÕ×N¾%ÁåfM2?�B¸˜î/C'޲0›NÉDdA‹$3Sõ�Œ« -z‰™ÃÈ5'˜s{›£jÙ„þNçR�µ  ¹°-\ _M“IºVKº–5¸Î�2ЍŸ…W}ÖàúÊáx�è³Ö6hÐF­@ÿ{‰Ò¢ÑŠ‹ÿ«ÖïR�ã!Q.ìÞº_.CŸ?[=b',oËZD‹`4ÆÐ=¹%—IJÑ)ÐAÛnêŸJÔYsèxïºT[žP‡$ˆ#ÁÚÆˆ`­Uý#!:§–-­ˆÂè�^ZÑ[ÎE }ì73¢gf93gTòG´£núo%òœ™3„ Éc¿ð%¿Ør6Îhƒ¦�ü™¦b:NÝM_4Ξ[gôl9¦n:ÒÀÙf‹)áû5˜äP;N}[ `ÝHÝ�±ærþ´ãÔ·% ÁF³‚ û¬yªõŒ&Ø4ó—=š“9Ù‹Úá©�#&g§üƒ½åß#ãÏá¿)/â8Õ#(j¤Þ¥ù�+DÖcŠÊzé‹–Ïñ!N„`Õ -ý—| LJ8¼YCü¢és¥G‘í›|GåÊ^}©ú)/:ù<ä¡Ä¶aã¸Q³b�g“^ÁêˆöâóËs6‚‚•ï¦.ùØž3UJ9¥èù|òç8Ù^—öÕ‘»¼ªñ|ý´…h�ìÅU­ç˧ӑEGþòªÆ³…ÓäÀ;Û&þºª å¿'�¯[ƒ½˜±õ¡jleê}3 -ƶ“þ_ú�Me©.Z4¶›¾¤ § =8ã|7õ$êì©£g™˜–'ù÷%òºTؤÆå×Iþÿ$ò¦PÔ�n#¿ª£Á•ÖÎ7 Õo׫ì~nÐ@q4¬—^H®´™hLè¦þ“D�=÷¢œN•äÏñ*{þ…4t)�Ù) Ñ«ìòI©jq›UaW�ŒêŒ6¯"²9lÀbÔMsq ¯"RÕ«0l:v!¯"êªW!SfWé˜�µ±›üÏy¶Zx”î&/©ÂÈ&0ˆÀ)£tרŸAÏѤøcæL4ý[Ž¢#[¼ãx�PV.>ÈlíŽO:VÙÐM^ -£#[»¨ ±kŠŸcðP±*_ŽRJ£S¢ÅCÅÈj@ƒO ðPñ•<\p}ãÑfóPñ¥<¢³m#°†ÑCUO\딂NjY=Tõ̵L¾K' âS×¢÷¾›¼¤P±‰k  ½"k{8O+°™l·ám§<´›Ý0 …µ‹wƒ&Bôz ˆZ�E`AkÞc -±Ï_�çy"3@œ |?A1?ŸÜvLY4—£Rtì:MšŸÎ°ù‚±ÊÑ�öð ªáYn‡zñT‘:ÿµáXղŋ«B\†0í§ùZ†£kOY�Já°k¤ßTÍ0k!wtÄjÊ�òú 6㊘(À­/§`LDÒ–7^ÁNhŸJœ}7˜Î‡�e9�SI4ð,Ò‹Á>Dw±™TÀi-)†yâV­Ìî©áï)É1üÓ°í ½ ´Ä1öµÚ  ¼îÚ~> o{HHa¥�¨³J‘f¯÷!‹°ƒÎa:Ü ¤N•Ê:V^ù-ýT-pÁÂ}dc�u:4 à„‘Ëñ;{¡^í»$ÀãÍWáΛi,ñÙš�ºv9À{®ð-IN!÷ΚhÉÐѾÇ"¬/‘sü•\?i–p‘ ´‹Fä»ÚêÈ*:�vó]›llu¼q@J·‡”Yes�i·ŽB»xú‚™Ð%¹€ØlÿZ*§Øg«u¢eácJ€'Œ(™õY%8•Ìû³óyUeŽCS»ªØ«ú´Z¨´($< fØo¤êmPÚY0Ø·ë0‰”ÝÚª$~²^d!|¬ -€¤žB/²`=6�"{ZA/ŠÛ@ºîXŸ -ùŸH1²ð5ÁÛÇM£^d¡`¢…Hfú¢bdaVP×迨Y�T¼ m ü[£|‘îéïŸr·1W4óZ”2Ä—â\¤cÏn]ïæ‡ •Cîjïw2È}®ÚkîÄ.­DAsh‰ü×C 9Õ¢Î]�ÜA‘��ÀäRn�´r©z‹ÖúƒÝŽŒaU»á -ÓPŒµXÌžt²Ûùh×X"|1ÚRR4ÒJ,ˆª˜…îÑÊÚð4R`“¡ž’óÙÏ�XÁÂ÷èt8@�ä P~¤³:‚Åï9šˆtN 37~²‰`qq0D@L&¢ƒ¥‘£ç’H\I=z -HÝôEõÌBã$Õ”S]C²ÝÛ鳺1åá(¨ÐM_̃±ˆ6I)�Yƒ¾Üê Ý8JéxìåûÏ*E¯Á»TŠÞK_öOXTí(ãW€¼X�tÂz]�¾lœy\çÀ‡Q¹Q 5kkÆ‹, ÌÑiîà§Ùaã¡`TJŽÓ,ˆ“’GƒAµ7T� ˆ“Ò—JÓÑjÒO3|uºMW!ûÐÍ‚è4³0¤-h«W /¯K_ºvEyOÔÍÀ ‘~éÚåã -‹@tYJ‡Ôuti<`ÐôY ˜cÔÒ¿d�…�9F-+° F-,Ì1jy)°‡HSÕ˜EožF -ì1RëÀé€áò‹‘Å„Inš3é4Áå- £¢=BÄèìÓŒë*J¥DøD3‘u£ƒèÉ?‘X\e ¢ñ+˜fQ-Á_´:xŸÌaŒBÝÁP[ Í«¤'ùTð×Í€¼:YP"Öcú9FW…4¥ÓN«ˆàQä€õµm0ùk½H aÈ¢«Œ×äEïã -"W& °2É¥ôr &xì‘c2¥—1›À¢�L²)——@©àRûÑ[º¸* rD+pV%—ñÒc@<äHÚíˆÖ®0 %èDâ1GŒ�q�1�”!ñ˜#&yL9ÕKÏBbÑF´K¡›^Ã"Jº�X¼íXŠ+З‰IÞª >ÅŽ7GÄbޤ­¯0ePz9x'2ÀçMòŠÖ`@Ö¬*ŒIŔشtH·§žÀÿY ÑÑ€Q Pº[¿ˆ °ª0z0.ÕY]~ XÀ�,¨½?ɰ·tŽ™LgVX‰æ±( š ÄT;ykÀc3�M¤'ð ‰Eg8Tv’Né$kè_|ƒ±˜&ëXˆÝÂçÚÛ³Ä -$` tS��)@ÔxgH7âæ1(@D�”H·Ä ÌžÕF­#­4ƒ¹2ü¶³¶‡:Aq2±QѰ:�>ÁH²ÀÖÁƒ )4è¥/�À!öd$ÆTA;nö®°ÂO9ƒCüII à¬'÷‹›=™RG ·g…)!zìñH¢&¤›žbq³û<:U¨F._VMìIJ²~w?GÿÔ=1ëIìi¾”ìÑ¡Ul�s—=ÏGÞîü‹«3ö@…ñ*@ZAŸÉQ{ˆ�‚cÒ6}/bœÍâK ·¨VÑ_ââåoK�0Œù®ËÌÔ6¬{Š™Ìf ¬ÚUéw3 a{åzº`48ïŸÞ0³W°ë�NǦüÕåu{BJ‡T´†§$šeþöH`¼òO±°ù+Øc:›2x0Êó7‡‰î{–ꀗJÊ�qZ‡³…ðÑ0¯€×’�Ì F -Áþã˜Mì¿ êÇÜÒ­u]öœN›N†Z—;{ÜŒ!?¼d W�èÊðg•lL kìg@teøûã�´~ú²Æão�wŒvm 4�˜ZJ0DùÉù…\<Ù ŽIüI(ô`ÉÄÐ/âÿ%ÌW)¤IîFtºËóüо¿‰ ðU -^¹TAÔ?Æ•ñ+Û³p£,½hz¶|FÀTc[Õ3/Ûž -ü7k°å �/{Kä×ÐL¦]Ç0^3FsS6Z›Cü•§þ¢Ùò=¸ímH³nþBËT[1eÐñ|qrpýÈ•$†ñäx¾ašØ3’©tD9C«Ì2Ur^‘üyÙUs\‰²kÉŸ¹ œ%Z£OÍ0”ÄŸ½Œè°‘ÓRíq‚rŒ¡×­BcKLÑA 3rª@cð‚†šs ið¤×šŠü=é2óÜŠ:êpë‹O›+ˆ2žµ4~ì™Ò£µð1¡èBŠÇ2²ÆÈæ‡ àÞÚ€vZcbñüa6)0*”¶¬L­sŽ,Z�»Ö½‰ØH‚Å:æäY�UÇøâ†²å!Éæ.žW3Á-A^+j/±Š�3Ô[Åë±pŸ4\Sû>“?3/™·vô»ÄuÏ,�wˆÕu?mëåÝæ×ÛŸnîÿ±>zõù«WJ½üìã}‚˜!P}õi•Ý*c -ý�÷})ÆB? %ݲAx)øë3¯ S¤æŽ^© -þÓÔ¿9<Ÿ0mm¶‚­:®rb™E8N}�ÈU§>µUd-‘gŸefù[k(\‹ÛýèàÈU¦Äwž~ú÷zbªöã‹»$s6KØ¬Úî[í§¿~ÈE³Y£íTeIÚê°§C•Îtaq•/`s`IEçätÔ�«æÄ-š-Ã|�s‰‡@`ÿì^f~ÒÖ~ÑÖë¥ã8Y8,õ¹0r!î¸9$ÐfW"5uðT¿rGœ½?mÑ›‚RdÙ:Ý%eóGùUZ%ŽØ  ð´tmMNùèꊫµZ65XE¹â?\z'1±ÕEHR±…Y^*fŇÚÑÆçïw‡?üæå‚Pa‘Nͳ`µ¯¯d:lÐR-+˜˜'±·´°äØ(�7O愦 íY±Õ?™åÃK7Úd½:eÊä——RÇûœHYhbå4õw¹xù¸yûæön³…6›Û»ï¿¾yñÉ»ÍæÝÏߥo¿þõõ柿Ü/^½{·¹L_ÝŒŸÿrûÃÛ‡ÛÍÛwlQ¥ ö0ØtfÞÚŽÜÕèv˜œ÷ÿ.vP -endstream -endobj - -4819 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [350.45316 328.3786 402.03214 342.0406] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 125 - /Contents (Section 3.3) ->> -endobj - -4820 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4366 0 R - /f3 4354 0 R - /f4 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 126 - /Tabs /S - /Parent 1 0 R - /Contents 4821 0 R - /Annots [4819 0 R] ->> -endobj - -4821 0 obj -<< - /Length 5900 - /Filter /FlateDecode ->> -stream -xœÝ][s7r~篚rb®W-4î¨òº"ßd§²—Ä|³ý@É’­TLiéãd�MòÛS8<3gô qf”­¼˜‰A�ƇFßðäéýîõ«Û»á£�.†áÉÓÝîöÅ�/¿¾yróæíwñW_ÿò|÷ëۗÓ/_Þ~ÿò>þêfÿï?Ýþðúîv÷úÍÝÅÇŸ|öéÅç¿ÿôâÉ×ooï½ýþÓ¯>Äø×?_à 1<ÆÁ ðÖ¢œ •×ËŸ.ž¼ËŸ/Äðó‹»‹On.Äpsñ䕇›WÇ�ã�›Ÿ.¾ùà[!Ä·Bèøóòá -¿”ñçp=(1$í¦&÷‡ßÚëA@thÜØTšÃ?Õ¾ÑôWlþô’%5�ʦ?ÉÆ -¯‡Ç8ä9?;o¢Lò�¡Ú̇}`âô¹¨MCfüç†s™M÷ÀéÚI’ŸÐ|3•Þ3~fpW›‡»¦U˜ÉÕââè¶/êÔé8ª -. AÙ6±O¦�á©ÃûÕ ‚¯Ìõ §MwÜ�×ß 7ÿxñùÍÅ?Ó0�L)ÁYÄ*LÌ{zúb÷Ëí¿Ý¼üËnøè‹Ï¿øBˆ§Ÿ}W“ý�BƒõõæZCIjù ÏÛþ1[¬l/N¢¾Œzñih©b˜mµÇãîZæD‚iÞú€ 2šGÉ’ÕaוÀåyŽÜ ÷3qÄ/ö4 :A‹Iæé"5¼…ÍÈôÅžMÌ+€ÝѺº£…id×ùOCn6Ήñ³=¦˜¤�à‚N‰n‡Éz\-õ—�h÷uºãjî›ý}‰QØöy¾É¨^Ÿºf†X3©`�è[ 늣TŠãâ,5ƒ€JcXCj™ÁìñD]„ê|Ùç§lñ7SÏ…ë’­Ù¾ÇGɰ&e ó©­Ýï”–ÐûoOû¨ù>ÌïriÒõÒEå‡ãZìþf¦Œ³ ùèxÜ̧G „ÝO®†�6h0Aœ/Í«i¢q*å2æò˜C’ž àL×™ôÚÙUè¨n¤f†c« x¯E('g f:Ã¹Ž–ha�© "·?Ø•÷ÄÊ+á@ú€¦eé«HzÏÀh ¨£%½ë&þš!Ž”5SIAKi»É?çÈSV¥<dÓì™3dÒl²1ýÇô}{CŽØÇ™~düߺ½ûaøàåÝ55Å ÁY'›€E2Ç$ªdC¼Jg2þUjòîˆov#Ì&`$Îï##C²]|èsÏ\+cYGÝ-µw \�M{±j{Ÿ“GJ–J€WÚÖ)0x¾Nõ#G�Véhe”é&ÿ3GžTè´åMÀnò"uKã@K³ó¿àÈS§€t´vBv“ÿ#Gž:¤sàœê&þ=C\R§€ôœÔ¦ŸõŸrä©S@··È«ÍORÖo% À¨úu’Ë‘§ O‰µÛ~é)ÄSè­•jû¥§ OIÆø.Á›,ÇK�çI Ò”rý»àÛ;Ž*£À¢Ýþð‘¤l Å&ÿŠ#OáŸAÊDcr¿$ì˜Íækà¦ðÐ;PwA#@É.ËFƒÅ h­Œ–u§ïdP$}gEh@ÙmqÂ$?Ý·,sǤû|–‘•µ8n½ÈÄh��jY°5aDQç‰t„¦I|úpDQŠt” }ÜhEêÐÞ€wz�ésH¢H-:@£Ú¦ßb—¬Äæx£3«ü‚Õž7W‘½ãÜé>óár›‹:£µ€*šK¶–mêˆÖÆ‚õÊm'Z#ôO¬­,.ì “ÉO>›&WK!ý'sÛwqÅÊr>®I(Œ×ñîW -ÕtýñNÌÎú]"5»„uw­±ÚšuØ¡4`´[g6,¾dG¥ØQ)»•êU'¾<ê^�*€ �#à/?ñç‡ÍPdXþÊ4-£ãܬb.bãfIŽgêóÄýzG´+ÂrÇ)í”eÙB»ñ$(mÚä·m�rôyŸéà³ìÞÍc¬ìÙw÷_8ù¥| -œñQB,F's�¼·HÿÏ}ÒÃç8”¡{öœ{Ó�.¾`Á)­uù©ø‡TXÙàE2ð%TÚvsƒµ‘Òç‡d�ÚtÓçâ^ éó“” kLŸ³‘ -Ë�Ðà÷Þ–ni˜ÂEöè7Æ�p2aªZ„`…Õ¦çÚ™ÆjŸžEWÉZÖ1óТԶ“Ï”7•M“2•Ó®šeB�þÄLÉ”¹ùòxqiåÿ=aˆK×6§!RZäTY}ÙØšKÑ Œ8|¶l'JiÑDPœv[~M^¦dË—y–”Úïóå5ˆì°e~|Ìb¯Ë«µ°g茾$ÇYІ´ŒCj!È„e]žb‰¿Z¤ûa=ü¸g‹ý¤MÀOά1Õ°r#$hß—ZsÚ,x'‰#2´gJ·Fé…ˆª=?Í.·œ¡TkT -¬6mä›ürNz!]¯ÓRº82ÆYnÍ,K©Þ{×�БºíÌù× ?pä)Í­cT­Uvš$§FÚòQ�ydOg q’ú—�çý$@–‹\’\ÈãF'+'Îäe&š¦Pzß-Ï\ø¦%#µc¤îÇ.‚Ñ’ŒÆ@Ð:ôÏž³jX2fÑÞ:pÖlgÓ°dÈ¢CÞ Û x‹B!ÉI6;ßZj74£:ÑôìÄnKQç©ö0(Ü~GQÇ©ŽTΡì_U¦úÀ2°-;ÐÙä>Q+ÇR›ÑÿE9‡5¥Q{^ö×ôEô¥tç+—ý>QKî Tè+kvv¬sçÈY«Aÿ7ì©rªÝSµÂlú;,ÝîªêV««Ê™ª«ªam.ÃL»�ío;EÖ‘N%o@ؘ#ÛÀѮɑ®£ …wÝÔ¹$YG'p2&Éö’眎Î6àEL’]Mšk¥^NÀüÒðÄ¥_“9È6€óVöËwö¤+ÊYP*&œô’�¡$uú¤+Ê#¬"\ììÉË›w1=ÙøA[¿ÏÀÙÌàÉÛ[LóuJ4Au×íÍS'…‚5ýÌo(¢âÉxv”„kÀª ð¬2å) F¯@i-Ü ¥i±'ÑfxБÔxmÚÿ|Ê‘ôó#‚v¸bÔ�Îèç”tóct´ ´jslÒÏ/„س@MhÈD,éÀÝO�…Ò@f^) Z³ùÜÉ´+å!a­$È Íª�̺Òœº›ñ\ýdÇ‘¬_6×*oA´ÛÖëA©¥“ª,Z´JÞ2¸§ësŒç[½2­.ž’š6åU”Sí e.Ik�’ $º&¾÷A.Y¸Mj+¥ê&Ïž¶dá6©˜¨ltÓgQ�,Ý&M |²mô›‚oÎì*F•”«O,µ&ËÝ”ñÔX貇 ƒ¡¹9RNãKòŠØ(r¦UDYˆZda£šç£œå«÷ÏUJÇì=\:¬X:æªÖÿÒ;DËÞ¬…rntñ™²Ô|VG)Ëž!S¾˜S6¥qZ�ü^=ܯ ²Í¶åh¥_�#¤rý³š@tχ7$òâÌ— %¼N4Y<ƒ˜ZWÅl[ÅãÁIw>&¼«‡“m¢'Ô¸ñ�‹*Ÿ¦%§frG?nPP.�:O.I‡}†à7µ]YÔm*ûOŠneϲÝ× +Ìr%7@š“Õ4R}8S²íŒbc µRxL¨¦NE£žˆA·: -ØbtÚ·>RZ~@D§�[0¿qÙfÝ+§Ò,Wµa.j$%ˆDéL¥'jà•G Oï¬ ��žþè 1ðdTE92·û’8m§r¶ä´ðëÜ'ʉµ§™s¬iŽ-E²ôôq£GË© Ý÷Í9’Ë[8KúÎÔÉSMOîpñóm{´´Ü9ñIÔæoé|ää²+¨P1.téê™ -RµŽÖôÂ� ¶¾$-’EºƒŒmÚ5DëP³ç¾Yþÿ£'tæ­Åd1r-$%û¶Ç~ -Wœ™‰,®}4®¢€ û¬L£âa%‹Â|T •F}°Iœ¤è§iE�êïþ‹ü-S_ʯÎUï†Í¸Øÿž׵¯Ø’®™íЯ$—¤Ü’oü&eýNØþd%öÚmµ6¶Evë‹»ÓŠ!Y™]ÅÄ:__c/Ñ˹l7e‡L™5j0V ìgá¿H–|×Z‚õ1ß§›¯WËÌý]º/»1‰«§Ã󂲤ìë˘Ð×\D;²uo3Rƒm#`R(#�™TÊø²P ˆèQ(ÓQzÎ0Õ¨gènÉr¦:¾ëœ‘ÛÃYqR£ƒ q V€—rï/àùÉ>·û$åÒùkʼnåfùtQi)<ªþHÓêW�W±ì³E·é5Œ¬Éç 6Ž eý­‹…:Ÿ™­Ë‚yËŠ{ziÍŠºh®>Ð=ÓªFÞöì«à F²¾¡T1# ê–&ö8$ J­ÀÚX_qYZó}H$kÆ×•cÅw×Í@6R•,zX¶^ÙMŸÙ› U ¬ÆwÓg -ºFŸˆ¯»Æ[›�÷aÜvú]¥O8°ˆÖn„†‰þû^ -w™ßñt™.ügb™û�,ügh¹×Ï:é³2Y OÅóUÆ‚³ôÏyñÉŠy1£Ò„€ýû›·Ë�õíTˆ�®zÜßÈ‚uÑG©¥Zá€âíŽX-,8!Û Á0qUÙé…¿ëœw3Õ'Ú|ÇÞUhg�Ëå^õé6ÎWÃääÜ©ªVkc¬ÚR­uºªÖ6 ¡É¥ŠYzövŠÓº)öí8§KÖɘ�-½œe�,ð†J€3!lÇÖ6Ë9²$‘  ­�G{ëÎ: ÈjqèE¬èaÝ -›„? HG�×`¤íäHÛq@VtÃXÚk[Ý,`ϲ¨³W8ÛFÐn@*¤š -Y.ž%¾š!HùXnXEu1=°™ÜŽž÷hÞNd9ºøP” ˆ+¬k·¢+Ò  -£Ù¬{å¸þr]¶~¾÷«ñzèÎâ`O|õó$™€-<)Á 5w¸ŒOO„ÓOR²¢ AÎýNØÔâz¸9‚¬*xÔÓL|çL>úU }�c¬‰Á›óM}e«äk�I�)¥Ggˆ6+‘¤ÓTx�Òß´ÝjóBUÄøØGë:‹º—Kºb.I}§NÖ(Šè®b�"yÕ‰|¹>ÿ† ·¬ ÷É�»1;§ö4BîØ¨fN¦=?ë;™Çî¤êÃô±Ü¡UhBÏ-¥Û+‹÷)B8×µTöpRþñý�~õnÉ-Q:Õôñÿk}ò=ôå2�Tå›rO¦’«Ü_áòN–«=nhé!ؾHMþAΉÆ¬ÑQU¿äyõ¥÷üBQ;ñ1æ{:qçºè…å*nëAÙÚØÂÖÞùH×–bãš²fR~Îmüsü)jt‰JÉk}é[y©7ïfÍëA1Kdj1]-~ü;"µ«èž¼|T”ìydÇÝrÇ ¯ìίŒÕÌÓ87þ®B‡½Ëíϳ¿±±jЉ¯w† »Ü3ÇìøÄ -�\-1@PAâ´ŽsQ$�+ù•Çõ²¶Y:&]ò+ï>wq.õ"b‰²ÚFiÇôÍo¼k¨e…ùüé7XŠD6@ÝðMvaJ-%¹ÂÛÂûuŒ…¤Õ,qMÂ0;M ^ó_t·bJAnub÷~5”µ¥d�1·¥¼e´!˜çÚóÞé~(Åd¡ÜD}8ÌfIÛŸ®lÕ¾oU¶ˆQ·w"æ[óÒŸô^Cóºn¬ÜzîQÀ}@¿ÑÁ6I±l«#°K6zbK:´xõ0{‚Gã•èPy6}²qdÔ«4io(–䳪F�ÐÖ¯³‘‰…vÎi:LÒOVÈP•ä“G¤“¬]ŸH§â±LÃÔëÑ<1Ç[J\÷iSó‚åDˆ(k…êî ¬#Œ‘ÅDήH ²°"g±Eb6•r²ãäÆzÖ…™5ZKfæ|‘îf{éLä‘ôk'>Ä礵YccQ«ül.>¹‰Xd?]¥\e[]Ï”øÜÐ9�s³˜Ì´GZ¡,öU©Ð°œ¯›¥Ð‚ÞöaÚZz÷·³�9«^—¡ßls¶Ø§÷»×¯n_ìÆµv»Û?¾ü~øæÉ'ov»7?}ûõ/Ïw¿¾}9<ùâÍ›ÝËûø«›ý¿ÿtûÃë»ÛÝë7wd’TÎ! éññí÷Í“tìÿ ˜“|� -endstream -endobj - -4822 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - /f3 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 127 - /Parent 1 0 R - /Contents 4823 0 R ->> -endobj - -4823 0 obj -<< - /Length 7941 - /Filter /FlateDecode ->> -stream -xœÍ]Y¯·‘~ׯ8Š�E¨ÄZ¸ŽÇ$“ "ÌKœI–gÆWÎÍ50ù÷öÙz©îâ=ìnùéjéK‹Åb±–¯^|vÿðí»WoŸ|òäpxñÙÃë7{ûÍáÏ/^¾ÿþ/åŸþôÃë‡}ÿöðâË·¯¾y{_þée÷÷?¾úë·w¯¾}÷äÓO¿úõçO~óûÏŸ¼øÓ÷¯îN£ýþó¯~}påO¿{u÷×Ã/ÞÞ=;ú�'xpwxއ�C@9DÉ@œäðæ»'/޸Û>q‡¾¹{ò«—OÜáåý“ïÜñðòÝõ—Ë�—ß=ùó/¾vÎ}툎?�?ý½üÙý¬ÿ—¯‡ãOŒ§�éÙ�P2âá4ŸàÑ€xú{Œñ0øêî4F|ö—ÃËÿxò›—OþKç *ìÀ˜@rö5ì@ƒ.ŒWö»Ñ2&v —̧oé´d:³"ôYôTÿå �ƒÅ ²ä„¼‡’O5œ!“3'ú¸¿j¥ûùnðíy��¿ñzÊ8 ÏäO»Œtù̶øÁ - ˜<`J™WŽ»9 x:Øæn?¿þñéP(–ˆÝP`ÎçîÌ“Ë4üîÌ#ulŽuþI¾Ç{Çôì€×¿¹ùñŸž_>}=Ø:ís7"C¬ß8�’û�Z9ï-!E<Ä€¸(ý‘>{óðëÿ}ùöÿŸ|ñ›/¾pî³_zØ–óºã³ÃË¿w4Îëb£ƒtTîìÁÇТ͆¬?eñ牞Mm¦Ó9·¤-ZãEôBŽ žZÌ}Ógöƒýpd­%YkAòà%®³˜“<³¨Ê&U:ª¸…ª‘‰1ÿXr*(WR`?—ÊO¸ÊâsUöC…éxƒ!}ã­x!‡FêZ!ïªV3ÑGßwãýÔ|÷j_B†�$á!DÞ;¿´—¼,MÄ–4‘F! -‰!fðÂ~‘‚qQgt*¡ÓOMŽhÏ=b&б�#_XìÐ^$X„¹iþ;0Æ‘?Át  ö¢ �ÁIl$êô¶¸¢Y4˜S;¯­ù£6bäUpo�T°“šøÄ¹ä>5¦ÏÚô9@ÆØ8ýqýïŒõ“vç°c‚+è©ÖôšždÂÞïpHÓ’Œ 2Ñ>èn0rè¥YÑ@ÒÔ"3Ì -÷”‹šdŽ QBÜü’¦Y¸CÚãj*�=ƒ­ �ßZÓk -�CaŒ+¬ÿ•5¿¦9x>ÎO�ø63¥l?ÛϪþ‹q ³ÄÜ~Ö4 wÉ_ -vÉ]?p´Ïß™¾yZ|nzÊâo~‰üûÂÓ`ü²v½—õè�2tÊ]ôÃu Ïú{Ík ¹ÊF¤�_$cÍÈÃaÇ„XµŠ1��RÇè¶Û‡U«˜’çòä¼}þrøØ:|ªùK Bâ5Vo¬Z¿Ì…û’šçÿ›5½jüŠļÂô¶êQm_àœ$¶Ÿò‰w‘¦Ž„þa5_Õœ—¢ë�¦[è­zAŠvUä Ž*go9*¢FÒ]„Œ[&¯5ÓD»yò-Üþ|M{"{ˆ”(´sÅÒž¢iOÎÅ6žT=žESŸè¸,+LoªOÑÔ'z�œ¼O­'Â2ÜEÓž|N>·¯ÞÒž¢iO RŒu«¯óÖjQ¾JÿìúnÐQtœ«0¶�ΣJ/8rúø^½!d9”hÄžzÉ£ÿWC�«ï—½÷}?îu�ªM¹¯ÅoaÔ…íJÀxsž+×牸¯L…¹|�’@Žn³ Ô/_ öìMÖ–×oÐTüá!7O_q…ú¹+4Š+úº•ëºòêu‰ær]Þ>�§É«—%EÀ˜JHdþ«÷%3P&n^¿u_yõ¶„ì|Ûìu÷•WïË.Ã*çvþ[~&¯_—…ù¾<6§·ÜL^Ó|°?NO@~;7SPC»‘)×­¾&– IpIÂ\¢¢ú‘‘!8ù~9áïQ™l --Õƒ¶\YzœÌ4zn\l‹‰y°"†)cÓ°–”ý´>›t~ÄQÒÍÕÑVWi¼,Hœeɘ™V¸”ºt^>Dbh EËØ¥ÛO÷‚ÉWk�^Õ¨‰ìÐúè¬K3“)ð’ÝéS(bÔ¢ýi‘ýdå9‘ç±~)ùÓ2aÖ1Ÿ¡ÿ:|…×”¶ñf¨sÝü˜QÆRSñ(Í}%°_§pùf¨xÓ?²£4�Kæäðù¨¤ÞN¾œ~>þü¶Üü@m[X£=[W<ÚYí—}¾~s­¸è¥3ޯÊg‡xþâ®V²iг¥d)Øä‹•”ZÜÐkZ,Ïs†Ì™FõO¯Ÿ�Å0�yðË·dˆ_êwz»×i³©ÆîŸø�æWðN‘S¿Æ‚ÔÛ̠Ꚏ™ -SS |©× 5¶øöøÆx{5Å HtuÓ×W:M8k¨£é÷7$“+=+j*¹F€¾í9.¯JïÐÓgÓ«È’ í9,ÙAÌ‚Ü"5ᜠ½†%$Ø,�¦'(h¯aïdǸùyˆÚcØ»±8"šo9B¢ú´@Ò÷ÍìAT‹¨¬*€ÅT ï3x" -×£ï?¶/p­Äf¬±?ˆÃ»‚oª·3;)£¯b\‹»3ªîÎì!f^gß&µ;óŠ^Ý;ó -´N�z:sA_tjË«\üQÏfÈÁUò¼M¯F5£#v>ÖFªdNOf`©•¹FÕª¦3§c¡J¨ŠòÀæ~=*D* ¯f=VXí 1#É�¸jzöà¢�øC×xa}‘× -«9Þ?1©¢ú"¯ªFîÂyrx±È«‚‚Ú2ã³Ø%sqĺ}3ò| m�“"5lK¢…”‹¼™c×ç“E‰ÂK \KÉ2oîÉ5¢—¤X¹U�³0æ‹mMJÕ‹‰¢È:BÕ/Ešœ'•þPM«z‡yöqq»СCø~ÉÙW_'¯ÿ¿½î¬fÂSΡM¸/îiC5fµ¨”rêTcçYâ^%‹Y­ †“_U4—�™ ›Õ›Ä18ïøàQÀ;Œ;*ê¬^ ¤ÔDPm‚GVoŠ!;ßN�eþgõ~ˆäÈIóü–_%«÷ABÀ’`²ÿÕ��B§:)°òa³šã‘#°\�Öë�¦B‰"8Ÿó -@dR Ö�{Â.­!vÙ¹SëÎ}ŽÔ‘PÐßöSâèÔ›ä€SÉ’ÞeWÔ"Ë”Aç㮄7Ë}B§Æ?²€§ãü9¹›“ŸÄ*rvj¤äGdçÚæ¯SÌèTo¿#pé¨)°Uƒêð/>oŸ;)le�MA^2¤óLRÞÑ\À¼†Ì©‰¢cÊbˆŠÑQ®ËÄ›§·.kœÁ爀)Hóô›Ó«jQ°Ë¹yzûDêxÞ�O©iþšðêÀ>€`Ûì—8µ1¿ê©ŒŽÚwßr”£Ž»QŠW¼'jg€©�fp7xtqñWËÎG¿ýè¸)A )ÆÎŸŽ¼‘¹@ÏİùÔq7r*ÕS1í±~Mÿ‰c@VØSý«À⊋ƒÚø_yUÜ Af܇õµ\ g -ô�Ä. îåLE‡ãâ½h §öõŒ*G©çŒŽPÌ[ ÕBô¾”ø¶ÏožŠ£Dr É·¯¿bT0Œ¥¢Ö 6“`¢a©°˜`Œ+ÌoŸI�S€ìŠÿ •  -U<ŠâÂÉî¤Z¦7Ê: …#È¡›^ÀC%¶¼“u< -ÁS–¦é+5€ŽH�H;ÌgžŽC�¼§æ·}¯:AŠ ÂÅóÓHÀOÌùõ05AÊy…ùmW#¸Fç7]¯ji÷5ò°ùP‹µ¯‘‡Ûç¯r|ª¥Ð×ÈÃæÒ¯[ö"�˜Žoµ¯yØ^úÃräasñWߨ9Càî1³½ü«V£cÈÈ+H@jìÅ%ÀLÄ›Ÿ@µü¬`Ž;¢56À<‚jZ‡9ŽìãöGP­(+�÷Ä'šçÿ»9¿yžÀ'òiûý×!ÏiöÛò¯–IqÁ ̸ÿM L-“bð)z¿ƒ -Vˤؗ!m¯‚Õ:)7´ó¤lmªeR0¹Ð.ÿcö¼ÐAÏ¥4[ iHªŒ <Æ6 ¢ëÍ9�Û® Ž€÷æüª -ÌNd +ÈÔAj™gL�F@•VkzÄu©Ê…ÿ�€Câ›ýÿi®_Ó�⤫€—=$PÏHÌ 8ª¶6Ô’ÁÌ||‡P�…äÀ¥Ìa%¤¼I·îv-ø½9¿ê'¤Ba ˜:@­o)ŽÊè -âÖ:@­_ŽàÙsÜAÕz•â¥ä)í Ôz‘]ó§ÍU€Z®"ž †=ø¯ª@_ÞA¾DP×ÿ�9¿ªC„‚h¸½ø«ú/2Héx½9÷I-V)Áìò�¶Ö>¤–ª”àˆ„¸½šÔ2é0 y�Ão7^SÕ_F²‚Z1¿ªý²‡\ v˜_S~Ùƒ+³ -gH�øGQLjýÊ55ðvZkÓH­_)ðÅAÌ7“`%¦‘Z¾Rj%ˆK^Nãôf—@½v%Sy°zi™¿ªEœZ¨rM -jÞ3¬Mz?ÙkRP; VX›ôz•kR�pqáó^amÒ X®IA{ìŠ,'í±+~9)h÷] ‹IA[+ -µ®¥—Ô8¿•DjYK/)h‰ÈËIA{K„ZéÒK -Úᜪµ.½¤ vE­wé%í¾+¼œÔÈ+)ˆÔò—‹õG,ùGbý©…2ׄ¡Ûi­J"½L¦4Hõ\†ç¯è�¬Úž1@â.a§‘󥦗Ťâ¦Hk0ÀrÓ�^“"ìvn' ªC³^“Ëú»|¥Öõ›/5µ*æš/Ô8¿­#µ(æš/´¹üë=Z/ùBm»o¹‰HïÐzÉÚ\øõ’˜k¾P#–“’ôš˜k¾ÐöÒ—ó…6Õ¤Ä.2¦=ä_5(É{¸jE Ó1X»ùT‹a˜HÀøoeË�ZüÂ¥Iqò+°ß¼~õÊ) ÚÃò¯—½ø.PÉ›_¾z‘KÁî—’¼Þ¸x+Sƒô"—ÐA/õæê_¯r 8SØAýë%.ÑCæöPÿjM '„%F·ù¨-œŠøÔªV¬LR«Y¸XŸÂ´ƒòW«WŠ;£dkn®üÕÚ•‚•NwŸbÚ.L§–«à¨àÈí¡Ô‚AɼƒPËU¸âçÝeÔ05!Ä”V¸l¤¬p!®p­DR V„2`‡ ±¹ -PëU„Ä5^ÂU:@­W)2âÎý±¹ª+"„R 34n€•'AjÉŠx$Äí PµbE‚‡±Íþ¯Ô€jÉŠ„’+XúÄl®ÕЉâ÷’@UFäx…KÀV�z¿¤˜Aí¢ƒÕš•KK. ë)ò,Ÿ#²k=ãºï~~ýã¸Sìô÷§=�¯�µÎÉõíf'ƒŸœì=b^ëØñc*­ÄF£.v§Ñ{)ˆJã0­w܇¤×`q®÷¥,3hþ7™faÉzkÏùÕŽÈXšîŒÚj%øº¿»O—¶Ö+�Ø& =ïc¿uåµËy�צXAµˆëÒ+…ãäöóøø>xý‹,¥‡öö³¼'ýDÏÛ{ê¿òzi¤UÏï”ÎêÖÏó”ÝÜÔë´¤»¥I¬~†Ó_p£µL�Ê” +6  ^ÓÎròK£Æ·�ÙÂG6PœgºÚ»nú­¡–GÄÍ)eóøãâñ|Aìj¸Ž�êzWìäˆ(}ÝŸ£xHÏK{tCm}­ŸöÕª´ßÒ¤vzŒ§+™ï%£|­ú‰"œùÕ]¯­9ö©'wôéÇÓ+|ng/'Å«ºm¹]ö’%4·Mljÿ0�ØÅ+±¾7-7¸,mz³Ã–³<¹»¥–WS—Õnq}´8îèþÕ­J­ÌøTŒG^ÐÊÊ·KÝ…†£ÂvP:°++_ñ� >T…˜éK¸›û†'Öqë¼±&{9jvHþz £‡[àæ‡}>˜¹×‹êzsq´Ï2/že)Û¹å,ãP1ëâ<º&ÕÃTš9}Ë'g~l®Ÿ¶ñnv¼IãUéwØ  Òuúf¯¦†WÁ׿¨äÄÚ²;ÜèÚ©üÊå–ímæÓÉSâiíÞêêwDüâsþ«¥õMîÚ…�·éÿ¦M44ºÅêðlsY<æÊ#FŠ·ŸsSëžÅix0÷ÇãZæýÖ^´šê ‚¸ÊU/:!ÿÛòAª¸ès›Á‚K -îö’Á˜èUH¨ôåë8à’÷ËðàWËbV�<°TäÒ¡¯]¿ÉÛì«eá�rÕÚ£Á†çnàʸhıA6ê¶~ÕüÊ[þâV„�G#Ϙ~„Ïù4 ÙƘb¶šì^}åè }sfçß‘Æ::×~ÖÿËua—k•:û^ Æ@“§ÝÝðãó “Çúéß1Ø “+Ì%ˆ¥À�#SH5¬²;Lª«ž�6Lä&jx¬I‡öÄt„Æ @u^²;P31xÕ0—,æöwÿ|èhÀÓãV¹3ºËÞõÌ“Ó þ£þe~׳Þ �PÏ£ÚLSÃˈ�"óB8°“§ëY8mÕëË>�Ó¡©3ïéŒÅîF?£fV�)˜7ÐMž.¾ƒ(K‰Ý6…'^ì!Ïzrl=ö=U¥*�\Nî„ñ§k¾ìÇc÷öýéBøï΢ç.«yq é;ã.ÚêÙ�gžÙÚCfÂ_ß´š±0Š ü “Ç^Ëñ:Ïæ±-к8,Zö“‰j÷ùGõçsñS²ûcAÃ\+ž?ã«&ön¼�-gz8ä¢óyð¥â{woËîØt�¥çQ±„¾¢9IÇV²î4òXw9,QÙä0ˆS¹?¿NZ_~ánIZœê÷}D3!>u{‡¼×Ïî¼ôt~H4b6*‘‹šÆ<Ê~ñ(‡H¹á øHwð�rÞò¼ðêFrëc«rI™íë)ËX¿î¢„ tû›‘Ïwa·Ô¾ ñ`?åÙ«‰ÖjŠÃÝK\g9G¹@›¬d’Å¡#‹[ȺF ’Šú‡%™6W’`¿xËO¸ -²ÙØòMù";ÞaÕúZý½¬D"'ð™ÊUÉ\ðî~T!$Ñ{p�¤ŽGUi†£ýžÉz˜~%Kÿ;.�’V‰ˆš¸�3dLL+ȈyAë –Nsdn¢ ¨Ç`©GÃÒ%p]–K;, VQ, r*PùÍX *¬¢Xfð× À¾¡UK"†Òô1¬p Z}"TLK¢ žK|zsyT1-© :qñ7h�Ô”�ÂÂVÈ�‚‡€¥P¢f¥�ÊBVÓˆûy�§«õÝH»Æ¡–½ä·ãÏg&˜y¬£v2A�¬ZCØg÷®=‰nVj®•CJáó\í—–•6™A-ž{¤\®dp-�ša�ÿÄa yÕÙú¬b«^MÓà!ûò~l«"›fðiyýôSLà™bÆãGfe«(­è2P*½ÄjV²¤N£©NÕº,dˆ’»ù¹`Õùí?*J+bÇ“_a/¿œÝž�ûÙÁ Û8É>.¥¨“´âKÞu/?è\[ýÕÂØ x¦ô¨–‰C!ǺsÐf©³Å:$”Jjtõ„gãBÔ Â–›ÿ¥0Ѱ˜húu ÖŽµ;~64]º36oŽé[Sño);pAxý™-™ý -fš¦#AH©jiTç1éA�ͤ«œMš¾x�̞ךÕ\œk,•^�.Âbæ·4ŽŠ1¦°Ý>_JDÆSbÜÛm,“:âf�i… Õt'ê Ã1�óq— UÇN ,ã�àØ?Òªf¿Ó¢%è˳!!¦–@§Šp\@æ©›_2øH·Ûo⸴×Ä’òPÀåí"`G'|ˆ[ø¿Í2ŽM‘PQ—‹ÜGŒ+ˆ„é°RA—1–ÔÝ�C;Ÿ›¨^åT"ÏÙS;fàWÅ]Æ,@Ùùâ@@‰$~8Ƕ -ÌLXBò.Õ±¨®~~t*UŽ6*ù›œ¯&_S0kh(v -åÒ¨`Ç#}Mý‚¯A1Íɬ¸<µTŸÓ°Ì,ŽjR/ž¨Z]½ÿIE¬fŸJoû %£Ñ6º[zX Ñ“,±n§ L�‡_~YM¾¯Ã1U¡û’ª„}ÙJà�¢ÿ�Eõæ -Ô\L�B̾f m—šŠšŒÔ©W˜ß„©¸­XZI°[�ó5­bMb)y °LCOÈ+õoìJ–u»÷THI9È™¯Æ}]}—)Å*ú† 1sñíßÎÄa±f§„’MŽÞu�Í÷jÕý›»SÕÆ�ÊS­Gw$îbLÛ µÜu¾dëÖ1 ê±:çA¢ƒo½[Ûàx´ñåªÎ¸¾""ÆòÚ�7ÑGsŸ»eŸéàÛªk}DMGÅONŸñHÇh>Ý1ëçM‚é›Ã{›iżh��@ÞcÓ)¸,cÀŒ)×È|D0BG$à )bí2ÕiÒmô®•„*ï_š3BÊ辂$•ÐÈfþ ? -K LÌŽ×ØóVQ!r:€ðè8µoC2·AÇÛ�H;lÃâf DqŸmÐ17‚ç€íÛ`—“Û sGÀÛ —@ˆë\aíÛ`’0ƒ+� ¤ßn×î—ä­ -SC» -;Øà‹G¾Àd�a+´¿Š\P*Â%÷÷ög^&—Åï#l:4�dà$%[v•‹| ºz±xtctˆõ4p¿Ï9ÝÕÞ.�²xTÂhӘ2§G>|ö²ƒ~Sa8%pG»m‰S«Ž3û.;w=‰ûm­r¹)sªÝBÿ² -m˜³‰µt±»sïJý�9ŠsªGŽZa9Çø¹MV®GŽj ë2N‰¨Wä¨ -jµòLA‹Á0QA,ºT,O§ --·Ø9÷äœ]b“¤1#¤(èWàYu²§¨ø¥6†kIYæÎÝcY£G7Ãé¡»"kZEÅÅ(…QdÁZ ÃjVU³Y­|)™<>¬"�W’6馡ÿͦ©È®(¬Üä ›V[—&:’‡„s•‡s 9ø‡C&:ÔG`p.ʪÒá˜Õ šÜg÷ß¾{õæáDãg¯Þüíí7‡?¿øÕû‡‡÷ßý¥üëŸ~xýð¯ïß^|ñþýÃÛûòO/»¿ÿñÕ_¿½{õðíû;5c“9¦ƒGÈè}Cä¹ãñ(£ðÿ0ëÓ -endstream -endobj - -4824 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [461.69614 570.07336 513.27515 583.7354] - /Border [0 0 0] - /Dest (subsec:capabilities) - /F 4 - /StructParent 128 - /Contents (Section 5.2) ->> -endobj - -4825 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 454.5324 122.445145 468.1944] - /Border [0 0 0] - /Dest (subsec:context-paradigm) - /F 4 - /StructParent 129 - /Contents (Section 3.4) ->> -endobj - -4826 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [201.28658 225.36938 241.48993 239.03137] - /Border [0 0 0] - /Dest 4497 0 R - /F 4 - /StructParent 130 - /Contents (Figure 1) ->> -endobj - -4827 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [495.9211 82.57959 522.7611 96.24158] - /Border [0 0 0] - /Dest 4498 0 R - /F 4 - /StructParent 131 - /Contents (Definition 5) ->> -endobj - -4828 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [522.7611 82.57959 526.4241 96.24158] - /Border [0 0 0] - /Dest 4498 0 R - /F 4 - /StructParent 132 - /Contents (Definition 5) ->> -endobj - -4829 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4384 0 R - /f1 4360 0 R - /f2 4354 0 R - /f3 4366 0 R - /f4 4378 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 133 - /Tabs /S - /Parent 1 0 R - /Contents 4830 0 R - /Annots [4824 0 R 4825 0 R 4826 0 R 4827 0 R 4828 0 R] ->> -endobj - -4830 0 obj -<< - /Length 7277 - /Filter /FlateDecode ->> -stream -xœí=]“ÜFnïó+¨H—œâj4ú³â8%Ëç+˹Dª¼Ø~X­%Ûkå¬×U¹Ÿjî ‡l‚�žir”‡ÜÃÉ»Kh�Æw?}v{÷óÛ«ë»îã�w]÷ôÙÝÝÕõOo~è¾}úêý¯ß§_½üýõÝß~}Ó=ýÓ›«Þܦ_½êþËÕ�?ß\Ýýüþf÷É'ݧŸ=ß}þâùîéË_¯nö_{ñü«Ï:uøëï°S�êž` ((²�· -”V¦»~·{z­ºëßvªûíúf÷é«�ê^Ýîž¾UªîÕÛãËéŸWïvßþñ;¥ÔwJ›û•ëÿ½{ü}÷êÏ»Ï_íþ�Ç|PG°Ê’kAh��2�»W-  9lg½ÓíÜà‰ï4X³ø膃î¸` ^‚ú–EÀ�6„¡�×tÇA ®ý»·xÏ��V[Ó ý©<0ÀµJÀ½£è+ì'eà‘ŽöRoqŠ�‚ç ™í7qj�‚kÍ -Ç®tî§õ("D\eù’ì§÷(Zj�åËäçôÅ.®²~ùÜ#Nùå!g]«ê ‚ê%Nõ´à�³Iõ*ðz3#˜8Íg´}ØúÔ!Ní퀨 x�äNïR µ_¾’âôž! 6¬±z‰ó†S{†"ï/ŸÓ{‘ ¢"k;�È5ø_7§9_Æ”ã³ç£S!4lˆÐhСwÿZ1·$4Я_ܬ÷kM2‘.ÂÖ¶‚W)\Öˆ�£5¬ÿë"(³xqCZÖöÐêføR˜Öòþoñ·¬÷ùá×ĉ-›‰,ÝC'q3+À²¾¯ò€Z¯²÷ÄH¤e½_ŒbŒÍH�H˺¿Ú€‰±ßzÛRŸu~uR)F½ù¾å,Á˜‹Y‚v¤,�SÅ,Fˆñƒe ³۳DZrÊLÊøÃúÈ}xêƒË Öƒʺ°ù¹éxÿ9A�ªýØþZÏ©NŠ´_|�p°´ê•w�Á‡Ž%[›.²{Y'›,(íÝ%øãY7;ù5Ƨðʇå�g½pëAk•r��ôy!G½`×[€—ó‚=S� èT¥ =_¦cÁõ)ÈVð¢àù*�V¯_r�=_¦c „U–/ea<낇Ô§ à'( -.�gÝïh!öéÇæÕ‹EJ±”~l/%a‚*¦7ý€¥ôc#ë¥@pÐÅôãæ‚¨˜~l…/eÀ‚)¦7—ü`KéÇÍ%Ÿµ É‚q/!ùœÖ#Š@Öè €çÔm—_µó8¥GÆ�Ãö;/²¹g‹ I¿ù΋lîÙzÀ BûÆÿ«žõ¬]_uÌæöFäÝêhƒ£Í7~äýf^¹¶�WcnDÖo>Õ>¶“þ¿¤µón³Ä ‹?²:/š¤ñÍv=«óT·†Öy/��Ke¯ñ뫺UéÖ¨|T¬Ë‹‚6ºóŠÝÙÁîoÄųygt ‰ôö¢‡ŠSzF+p>® s¥[s­8ƒÝžülÍ5)PV8ñDÍƒŠ­¶!‚¨Chwó~á³áBràÕð+v?4 -llä@Ýîg•Ÿ1€½l-lOŠI•þƯ!âþg[RŒEˆÑlïê!Û�’â�Ñ»½öe[NŒ#°Þúví÷N„Ïj?�©ê(úÍ-^ä[N¼ƒa»„úc»NL2zõ¨@€ÓA�í«Œ\ÐàUSÛK1ßÿðz”Vº¶?†ïPj´p¯-B¾Ieè¢mFA<=ø6•¡�¶qñm*C'í%xÀ÷© ½´­(HuZÈö©»i›I na¶Ueè§m…/%œ‘ïT:jà×TJ!ß«2ôÔº Rðh³®A¾Ue(—ißr×&ß®r¨—Y¹«6– -f\H%ܰ­V•*f.Á!¾§e(™¹‹ø¶–¡fæƒóˆJE3›ë°…®—CÕL+|©jº^e3W¬›ùàâK…3ÙÄ¡T9sÅbé̇fß@3ÔδRHª�A¶ƒæèÊ$]çÿ�º2l÷Í¨Ðæ|ÜëzýÙî›dCc¡¼ìÆðí6A�ò+À½¾×&™ð´ÆòÅ ßk"„`�oA ™ÐÏ$šïµ‰Œ²©Ô¦uý¢ͶÚkmáK‰Gd[mFÅ6›‹?Ûks¬¶ic¿f[mFå6›‹?Ûk3ª·iD@ ²Ý6£‚›ÍåŸo¸*n¶–¶Û†úhr�¶6ûÝ'@1êK Àæ¿‘}êö›þÆ4paòKE'ȶÛF°vðâÙË6Û�öàB -€o-ûl; ™4òmg_ïùfCà½o;ù+EŸï¥1œó)¶9ûYÏÛRòªÖ €<ö‹U~6RL¡‡6�Æ= ß0ãDÛ‹?�QÎùË[›=l¯ E .ôá„Í·ÛíBÑ�õk ‚lú[iÀ¾Íº©ð Ù—~ÔŒë3˜›k¶ÃÅ Bè»ì·>ýØ—4ì†âýúS.W‘ߪü�íp1öÃŽ. €|; �¶xÀ܉ ¦�ïÖäg›\ ip¨zø[+ ¶Ë%Y¥T»ã'Ÿ…¥¡;:¬_Þÿl§‹1ÉñÙ|ó³m.&õ칿µô±ºÏ¦šë>á±µßÅ6º«“å·½ÝͶ¹‡ ­Þ:·‹ms1žÀÓf{ÔÉ«ù|jô0)ºùÆc]L@P�^g÷ÙFZeý¢æe[]LT@z…õ‹¦?Ûêb"*sË“mv11M¸Fm¶?úÙv«¬Bm·W¾lËU.uº÷ð7@NÿYT”Ò—ˆù²M/©ßÈ94�3&5}-ÃDZ�­|;JHÞîÓ’ö�ž|Ü=ÑTTNùn¨´[þëƒ}>sÿ2�;­/’�þu&JX¾O©*µÿ—ðq÷íþϯ‹¯ª ·#|ï¿ödü“a£YÜ()g˶ io Rš’UÁAµÀÁ~aâŒd¶mHב ¢œ<8õ6ãƒâ~Ë}ë§-4hÌ�ÝJc-4Û½”:VcH.T#ä)ñü0$ ! ®Àƒ›¢ä3›ä¶f«èKjLõýž80® zní9×=îhPÃö:@»íæ²!²™oTÐ@Ö£næ³8œoÓr¢Òíb&Oƒçû´<VÊY£˜³¾Š� üä—'¢ómZ�€¬»ýY%xp´‚š‘u=ë¯D‡ñËçÛ´b*¡ ?¶I+Y«>¦&ƒÍ¥�íÒJÆ¢EŸÆ2��@MŽH³]ZcŠT$o�¸ˆB’ÎOi¶MË+÷¶ªöà�;wùâel“–7à�jƒ^+üœòKº�â -ðeág;´’™i×X¾Ì|ÖQ‰ Ñ\>§û"�‰T¿lbýáhæ81hK•öÕôñ]¤C�é¾|tìÑ «ƒA¥ýøCûøÅ˜‰é…Ùw²ïæç¾8øjªªö#‹¿¿‰a QÍ -j}Ä5ù˜ñæþµÇ¿°œþÝc} NIÆ4Û4˜¬9ët*øÛXŸ³=ƒÉ–3Ö)Û¾£ÇNÓLfT²|(Š�Hd]<3Ñ€ -¦Å;tÊAÐìãNï±í¦;e¬HF™<;‡@}•á�@”ynv¬}ä¨ óEFMÌ:H³ÍþuÒî™}*±í¨d—-9ÐùóSm;xÓ4ÅõžJKßQ•UC Sés'Q–ŒÆƒÓ>¤¤u'1‚Ž·³øÐ$p7}Zˆýü}B”Rªö é -ÁÌU†×S™ ¢òåñ£{@?•QsPQs(Fkr-ªCq!Q޴د±¿ÿÊFw¿È'ÊM»]2âL_\²\øg'*íqgrcÁ§ÐÔÑÈÒì‰{<¦'Á§©hä�÷ßÊwèD�.¼9•ª‰‰P+cU܇¡þäXÔú„ÿTœ;|™§Yµ8C2cöýf;0nJþGÓGL8¶GꦂÇãÃEÜÔf!ᥦŒgÅ®n3ºø„_„h­©Ó*�n4Û¨oÑ€&³¢#Ͷê[­IZ�¢+ËvêÛt±ˆŠmš}”±Pˆ¥ÃŦêÓò¼!ñl™ø#“cžÙÏ:¤kõÜèäάÚ\é,)÷QʈùjQódOgÇâ4išX<¡V3?Hæ”�²;,ÚíñÑôš¡&N1¶ñ*³°7EòLH˜�ñGo'ÇB¥x°OMˆ•-s º:ü‡ªÏˆG;æËbQŒ¿õìúî÷«_^½ùŸ»îã/>ÿâ ¥ž}öÉáÃuZ‹öWr¾x^D‹šË¨4±±Å*f²¡ ’›3xßñýºèŒd{âþçUK+2‡tjŠªz4úWþa¾«3@U¹AsÓÂG*"×Í:‹Hˆ[»€ÄLãlCûvç��Ó’ê2]\IÌÕÈô¯Šë|“þ�Æk"y|ÊŠ@{‹¶}½ŸñPF£˜¸²äR�³¡ºˆÆÃ±{1ü £ÅãQ¯†Öˆ“ÓÍòz¬—Ðq§í>6u“m®þ;4š{ñv´QóåGõ°ƒµ’)䊌C Z%¿åüm0‰Á�ì* ÖÙ`‡JIÎÞ(›ÓgOTºsP º3 Œ­·ü ‡7&=¹;3sÏ�L n¶ˆ²¡;{|ê ŒH•ãS0Âf••Á5ùñQ�›µçaÝG²Iò ´Æ%ûæÉ(^N G7ÿ®9Õ|i;›À¦Ûݵ’ƒç-h¥â¦£)˜ b¶KY»"óó qbï(dþ¸‹{>\FC'þ+>3’=:UûŒF`麼�'Å„9Z¼R9ÇaœÇ²94'™”™ëÇ+�›Â÷t yf¦æh?g0×'q¾¨Å™¸�Cq÷w“a[ô¨x¤Þ@ïЇaeƒ‘Îé¶Ržrö©á!ª'GLÿýõÕÍ�ÝßÜ<æ¦(‘«u âP�å~˜;6^òÍä/“LÂþ§·âjØùm42A¯Â]:�Ëìµ”¢›ípæ‹KN\!¨8Cjš"Ê"@˰�þ>8§Gk¹ž,&9êéó·ÿ-~]wà°9œ5É»‘†·Ùé•}wšÿϳW¢hó%'©ˆÎÇÉ.þ•B)îÎNø3! ®Â ¦Yc.j1_Ê™ùõ;0ðxx�±-Çîé…b‹Ù9~»{R’8?A›†·š›åªô”­Ï_¨pöòwÎ /®ˆ5–[Wv²OÛ´Ì#¿ªZq-¼¬Ã3- `!ñIó3[и•pYñÙS²ý^¤¾N³<� -Á¦ÎVù°¥N•§òØ) Zƒ1�mYĽk&žN2'�¥@µ¦!Dx0ÆîajnFbfnŽžPJËäô¢q¬mº§b¥åôBP�V�mv×£E-he©­>ì"iH¬DA¶ Ò¿Uoe«D -ÙÔx•ùè}`¯†Ÿnª0 ¸«“¼:úV×T¥+wqñüdU³Ï&U,¾Ùð凫ëq]úÏ�ÆÊ`ìÑþÉNèþC�©ÌŽou´î/Rtö,§º®O¥º.vv«N�©V÷—HF -FŸÝö¯"{ÙëW|H7'xÛ²üþ"|öþ•ˆ BÒž�àÁ³# •­5]†ìCÀcˆ®™ÒÕšŸßмNÛ»üŠàÙþÿ~r>™KП�àj•�`Ñ4`ÚÍ‚t,0�O=v¬ë`=Rˆ`|K‹Mî19¹Y,l!ضTÇ1=�0òœQhL¤ -{Í€³àœ©#Kc ,;l]„hm3b9;m½…¨ý�`¯iÒ0¡EVD�½60Øtå¦ñí(ˆUÀìÜYŒéÌ :TZDýÆû»,.q0’„TþI-— 6ÙMBu�ø–ŠÉoG5`#¯`H©Os_­:íß\ø.›g§“ܰ”˜„¿ÆÚN¶Ùq¿ÃÀ'òB:0Î .ˆ†;í7FPº|›æagý¢ - œõÍàŸ‹àÙ n0€±AÛfø¢�ÈNúMüØ{øÉ *†–ÍvÒ/�³©ÿ¤Aüfmô:]Ÿm0µ>ÓçO/ŠšÁÛ À㦯¾O¿\“ÔF·óëJ&´áÚ4æ�¼xÀ,O&˜}m¨ð2‡Ód â ^Nµú“+èÙùÕC}iO}� -zvÜõñpÐꦤÝ4ñn™,�LÓâ\D2LT“±H#|³}ÊNÅFåA+ï¢mÆA<+٩؈œJ³9[á‹.=;uÊ�km]GÆ‚÷´áaÉŽÅFRɘ* -T–¤A£Æck©X3~¼âtÌ´ x¸Yþìr�µxæmºüñ6}³mÏNëG¬Ãl³Å0>CV‚vþâWÉ:&Ï<{Æ,ŠÎ,ÿ!÷j°óà�Š?� Ô�Â%ÿèì¤ÌòÀÀÑ2&³óWT©ÃsbLå¯2…‡ó‡Æ ÙW–„ìëÍbóõr�›“ª°#ö|»]‰w³©GÒ‹h¥Ä'¥lUº’´F…Äç¤�æÀ^œ’1uLûO÷c�™…#�øÎ}üí¸�@&{1U@ ÄXG€z�qÆÄ�`¾kËAö|�gyÒ.¿Y ·ùŽ¹å‹žH‰YÄaï8æ'P%µ¿Êt¬j½÷}*û ¥sís¬d£‡Ì»ã"ß*Í#’›Þ]C±âÂð—L=FYE¤Ù;,0]Ûê‚Æ5˜È‘öKQÍÏ9YU…˜½“7«:n³õu¹`5L;› éò¸3öÙb)çô…³ N—ÖËœ®‹e6r#3ÀÔBUÏ ³.ÍD•–+f½â+Ž<ÐÑ�W-M°%×)4) --·Ú°ï$�2ôßÊoH;iŽ”À�=£™14£yU_!T˜"ó·Äá-ÓN/šžC¬4M˜fMs“æ¹9K[†Ò–?·jÌš¡Pýq^K‰ü é„û¿?Y Œ¨ŠÃDu PF«\ŠVÛ—R@Œ½/)…·ƒ®„ßvý{]R°`‚öíàÁ³ó ‘¶íðÅä){[RŒ`ÐW¯™¦qoo€TÀC‘p•ÐôéGü)±0ªyúÃù”^ìl)y·^6<‘yCRåóÇse(�jkžÙ×ê Ø÷™0ž¨kØ;¡“+�¯“6ÓÅH\ÆÙÌB:båI!ì=Zd Ø`•^as|µL]YȹÎ;¦¬FUó×å5¬ï‹7ý:¼xª×æ=±W`¯• ´ïÏщåQ*õÕŠÄ^mu<ô] -å+ú»íŸ„ä(Ð:ºmþ¹•[ö�éˆéÌÅd‘9H;Î$½1ÈNçP CvÙèþÄüÌËEùçaÆÏ'iÏé(N—ä(w\#;/nb·ç gá—좯ñÖb´=8°ÑU »nçìº4.²"bo'? }HòÒØÛÊH¡«\MUhl‘+%Aœ5w.XUü>¼—Šcì^$Ñ©§m)äfÒÉxtô²`�X5Oì-kÃ|Þ¶�¸V4õ‰½ií¨ô­M}-YÐ}Ø.O,=(%¹§ÁO•:bS¹xm¼núÂåÕæ˜V…�óÕµ^ˆ!ÊÛÀä-�ñÉÜ®àxkɱ·Û¥«D�'¯×�º›"‰óE�b¸0õa)ʇmg+Ÿ—'ŠNyƒð�ýën£ÓÇ$ˆ‚Ëš»B(dÍ�õœ­¹Ù -�š»A€«57{IáQs ʶeÃNÊMDRõ‰ ôÕÃÅg/4ïQΪœCiL¨,¬t!?6{v>R²¾©{*Ÿœo{¸ü­aTÎ"¹Y56_M¦6ù“;w�cìslØÛ‰øŠ ›U…{ýv£"µv¦¨ˉ€¢1¸Âý|mÜáê“]{ XNl˾©*&±Ûå÷OŸ}Cìý¬iÄ„Ά¨þÏã�–ÝtÃgýf¶®;yìƒtµmˆ‘VXÅX[M�ãtUÎÕ‘6ȃ4¬->ž|SønyÊžP8#!É×¼þQZ·ŒÚ«1§/²÷Q-Þ¼’ÍP›®²ªzvï\ÿû*nØŠMh‹š xj o6?yZ6½ó§wY•ûÊ&_åÊvr÷ZÕ‹w†òÒ¾ü_/½`P®d^"çƒsfTöõqj:œ¨´&ykŸÔv82Ýj‹]ÉÓpÅ­„wip=ÿèpÎÁ½^ì«Ý 0™]�oòg·w?¿½º¾ë>}‘Í·ApäCß5ƒc÷üåN�ëÿ绗ϿٙîÅ»?ïÒ›ïvÁvªûe÷RA:Ýp­ £’AP𢠔6��¨ƒ -–ºw;„ˆ*¤é&Ù�Þv -Œ¥�Ѝ5 ×„Ô½^@jAݱsw†4ò½‡:زw¾ETu™i°gZp•LÛ³ë]Ͻ -¦�â^.4(tè±S‰‡D;JÁ/ìëKÀ[ë½6ÇáÙæËl‹AíØvfHe‰¦ýa¯EФ¦moF§B�ã"¡ÝžÈ.DÓªýàºë�êЦΠ-Ô¶û%ý€B:Ôxx`üß×;›N÷ã»Ö¡òŠÆ/Œ?èÆ°®w.!ðKúg€tü„ê¬é·fÂó—ÝO»OOá5UUÈkL2šÆnb’ë—I­/ªAúîŸÉ}v.—vz;÷W,¤`o„×:5¼êÐa|ê£�eãY­èÀÎ’®ýO/Ç?|ÍZ"·ß­¶^¨HfJ1 Œ:�F¡È[53ud°f?«Á8•‘å绨þ`]Û{N4 4 BtÏþlk¤lÿÈ9›^æ1ÜÕ÷“ -­ÉµmÉK»YûLïl›ÃŸå\Eù~ï¤g�;ÿvïãœ×ÎD0FkwÙ¼«¸|vŽIó·´ÁŠõ_.«Ä^šœLkOÊ7sŠcRK–'ÿ’篛á™ÁhÍïpkä³;ù“m¹�&Ú¶O´ŸÑQ ³Ô Ìf$Î¥ð¬Gbö!•×\å'ç(4!îÌb™L²­”IÿÕX&3‰ÀŽÃ¨6€ &Æõ—ùOèVÉ_®Ëá0» µ„“='»�z¸øÒGãS/!á7{þ”KËË©¾,ŠØëçSg¶ö>ê*™-OŠ�TŽTèéüãßGO¾ >@péJ—öV=ùœiö¦ÐÓQxõÑ8ÿ1¹fúÜ’?;!ÀG{ë«*5_›“æ¸"®À"`†ùˆH•ï/"u‰Ï>ûÌÝÝÕõOo~è¾}úéû»»÷ï¾O¿}ùû뻿ýú¦{úÅû÷wonÓ¯^õ?ÿåêÇŸo®î~~ÃÎßÇmŠöZÉQ.í�ÞßÍà6N; -endstream -endobj - -4831 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 101.63025 759.87537] - /Border [0 0 0] - /Dest 4498 0 R - /F 4 - /StructParent 134 - /Contents (Definition 5) ->> -endobj - -4832 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [426.6189 732.5514 483.94568 746.2134] - /Border [0 0 0] - /Dest 4499 0 R - /F 4 - /StructParent 135 - /Contents (Definition 7) ->> -endobj - -4833 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [173.22722 657.4414 184.22722 671.1034] - /Border [0 0 0] - /Dest 4500 0 R - /F 4 - /StructParent 136 - /Contents (40) ->> -endobj - -4834 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [260.59808 453.1714 318.8676 466.8334] - /Border [0 0 0] - /Dest 4499 0 R - /F 4 - /StructParent 137 - /Contents (Definition 7) ->> -endobj - -4835 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [118.39714 339.1854 178.22614 352.8474] - /Border [0 0 0] - /Dest (subsubsec:eff-composition) - /F 4 - /StructParent 138 - /Contents (Section 3.1.2) ->> -endobj - -4836 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4366 0 R - /f3 4378 0 R - /f4 4354 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 139 - /Tabs /S - /Parent 1 0 R - /Contents 4837 0 R - /Annots [4831 0 R 4832 0 R 4833 0 R 4834 0 R 4835 0 R] ->> -endobj - -4837 0 obj -<< - /Length 7328 - /Filter /FlateDecode ->> -stream -xœÍ]Y“·‘~ç¯h-%Û#“yàŒPÈ¡[rÈ>¸§¤Š&ey×Cíxüà¿�>ëÈB¢Õm¿h4êB"3‘HäñáùG�?¾yùêqóÁO6›ç=>¾|õ§×Ü|óüÅÛŸ¾+úÃß¾üûO¯7Ï¿|ýò�¯ÊŸ^lÿíË~¼ùøãÛû'~¸ùøÓOž|ö›Ož<ÿÃO/ï÷_ûÍ'_}ºÁÿþßÚà7ÏhRä6Ñe`Inóê/Ož¿ÂÍ«¿>ÁÍ__Ý?ùøÅܼxxòü nˆ6/Þœ^.?^üåÉ7¿ø¿EäÝO¡ñïì÷¿oþëÝæ%ˆEüfûªÜ}·yñë'Ÿ½xò;�rR('$‚ìW!=Ì©ú9n>ì§…£ßhô×òc¬MB<ˆd—Z&A “ØRûåÝæÅŸ+£‹6ºcð"m£_ÆB¡» á‘¡¾•YN#×GÈc¯ÔÊN´(¦îy�’�� -%p™-–vÂâ O§{ØÐvŒß|wøâv[y¿.GÕkj’øÃÒãïL"Œ~šúõÅ -‰4ÇNЃp¢Ð£[[r>³Ö´æÍ ¤À仇ÿ‘, -4�N˜ æ6¥5`¶м(É¥(0% ùGâ$1ÈàC¾Ü¡þ7kü¬ŽAbö7ÑÖ66ñØ»6 -η[×[Ü݆�öeºßì�ÚaMÞ¡e+t|SZík›«ã�Rîçœfðlâ¶)Æs4ÝÖöL—²ó!õÏèË‘�¥í<÷¼ßýÉŠT=&Èä:s§Qw'‡ù�f?<¤È$êAfú�Ç7y,{ŠÚ†§}bûO??ýï;C¥ùY™ "žœù:±G:î6Ï~s·q‡8ÙyÇlп(ãWN »Æ–º¯°Àãw†öCÆÃŸx÷ûÅõpîŸUï@ s¹E»Bd¬:ΗƒFîWÿ÷:4d/à÷ëz]ýôÐ~+ª12"#óQSá9‘sµ(ÀòJ>ìBb¬[û‚c‡ªùÃìy�ù…và QMŒä,Ò6\Ó“0ÇÂÌ“L²ô#—áÈÔÓ¢ 6q*öÃðoÇ(Óöç›»M8|ý¡yèqü¾}™~ôÀ¹íÏ÷§±ñƒ3KyÚmµïøvàêŽÙÓÜÌn®/°ô?šá¢àA|&iY F¸è¤¥£Í¢¬�#CvîÎãà/oZx”ëþ_¬éi'OsßúÞ’óÔÚ]´ƒGŠ [ëR„˜±Ãº¨Kän#2;É{c9WåƒfúÅwªZ>ºKO ßʱ ¥ÁŒÅoŽ.´pÜÔàq¨szp"“\íÄ"�[)l9 Îä#84„GS>Ù/�†+Ÿ:¾T}hâ�Tæ²Ïœˆ›x:ú|¦�ôíK›»�÷+Ý1½œ;ÓÓ˜ò™Éާ>T÷ÈgϽƒlN �ÑÖ6Žç…Ñ\|2ifßÈOlQ„Á ÏZF\óÛBt@Ü•q;*ØøÔ5` D i@½L$ågÇÈzöjöE%Æ2ÈP¨ùóíÊÞ"5 Ÿ8áÀ-’¨žß>°J´Ó##B$ ´†"è¢VXó‡{§j—å]UŠ…ì¨å·kÏì¡Ó129¢§n�vz½ˆ “dóaœ1MUògñŒÑBg¦×YNO¿òõÄp´+4sÑZ¥¾j.‚ ÁIÏ2D¡˜@JL÷²=Lÿ„RV`Í9XŽ!1BJÌM °Ã2—£3>¦ì£QtcσI®œKðøsŠZ^‡BD×6«Þ„¹h, - µÆÏ ÅṞQ°uÍ~^þó+³tMËïPr+�Ñ”asjµdJ�Å3­À†÷–—fý¤8_È‹±¿áBŸ¦­[¼§¹ÕQãhK­ÐHII,NFÿGÕuܯÂ"«Þ`¾'ÍG¶ŠŽf¯X^älˆ=#‡E Ç“›öÂ¥‚»M< p_£_9{-}NMjýœá$ìI� B»ZT}úöÈÇ$q�`Ë$m5ûöD=ÇÕsµ7Gé¹é¿ž­Ó•ïÏkHµ§µˆ2ÛËN®Ëã©Qî…˜ï¬*g�ÈÅÊ ýÙZ¾oöÂ9®ÙÓªRç¡I4jEÂXö^úR]Â9¥¡sŠÇJ=•Åî[£Ý£ÝùtÕ´zr]y%ýÜ6s’'s›ü½«¬Ë©õúÌbãe“ UÓ¸ä¸f°¡Dé¥ü.… i AìhQ#�ÓšãêѲÝgXÊ’j~“šÁÓcZÓÔÓÔ¢5¤¿Li¨…pÄ�K9ò*G ¸�¿dâEXÔªUsãzªsuóV…õÔ$=Ygß“-Â!U3βE·$ã0�7ÚdG -u�›“1Kډˑ×'Ye6ǘ’Ù&d¦žHb?aº¢qôê!P2DßHASŠ#9Å`lüïØä]pàSäÂo�wÞÍXcƤ8ë”.mfšÐkþ;†�]Ê=²l�ìx5²îÁ8¢0ªÆR£§je¼îz -g*%¶74‹î"A`‰ýÚl¥/‚fÎ]L%`obÏ£fÏ]ò€Âm´´r,è‡UxÚvŠÕþU_:)­“ç„Ö|†1jÁÐ KŒ&_|¶…ž�¬EþæäÍËÄçë|5T\›¾VóQ�Ù%ƒíg%Òž.�÷ænã )jÞl’Ñ«},ól™WݽS•àXß[²žÜ\Ö¬µ“›k³â|ËRM„ùD >8¿R‰#ÈÅð`Úr©ÓÏÍ;Y\Ð!u0¢„&6,íT ¦O>4v)5äî"8 �÷ƒÃÌdÐUs;ÿÚbVK}´’Ôš=ß²0×?%�h2è˜x?„veÖ¶34wóA+^æÂÃïª;ªÒÎk­0µ½°[2Ç ©Uƒª0Ïî3ŽÚÁÈyÄ�ûigè*j&C)Êq…õû´ÆHlÒªÂ1V7ŽKH³ Re°%ÌúÛ´ú³² çï"‹ÉWµ;ì˜+<NˆÛ®ÙŠ>¿Ò‡='³Ø MêʇDÒ"ήýO;'r"è(¬¡LÓä§.Ì+{ÜI­xæÓ&ÄÑøó3Óý9Ýž“ÃŲ?>±ôƒ�ÃÖþþ¨AtÆ•ÙîØ¦¼åç{&¸šZ[é#p Î/ Òe*×iÍ“^t‰àK]m!Ф"6%±—/Ûñk ¯7~ p’foÅþ’ê -ç�brÝã?³†W“PXÊʮ֫“ÿYþó_å?ÿmj¡š�âVº(i1Èi ž˘+,Í]=Ç¥qoMΨ{Uˆ>­@Ü7[:¾5©P÷¬!»ôÔê�Êšñä�“+gçðïZëy*$À=÷j秆vf5G…D¶£;.òÕ,dVsTä ùì¥{xsƒÈjŠŠ2�¤¦oªžšŸbŽV™¾µCdu-—àû -Óÿ³5¼Ž¹Æ�˜}Ïè-v9/!®19LÝs7—½šž÷°”]^_ó Õô|@àì__÷UÃW*š¢[�€ÿ1ÇWM_‘î“ÀÔi¶kp UC˜1¥k¯BÕfÄ’Üì•Åÿš²PãQÈ y%QœâŠæ¡…P�A±Å[lJ„š]tÁyÇé껡šê–Ò�{‹]‰0×�aàìª9Ú>¨ ËÓÐAÀ¶AE\؆jšŒƒŠ{<0½âøÄ‡T­ÃÒ8Ç<¨`½'óÐËÛ>¨p½ûpýõª¢›¦…PÑz=–s­rª¾öCünO”©©ÇÇ9utC|= âÃ�cP¢vØiö—J·I )¶�ÜeYTÌ_¢ BÜ6|S}š$`�0`úý ã‡Fu z2tÔ97b;Ûô‚Ñ•8}þ|¼ˆKØðnucÔ9:ý|KÔJ«ù›8…lœüGè|¨)S†éügŸPqèõnï¹tkõ—½Ú×’µh2@*àõÑdºì@¸«@U¿žj;©â"祺¸ -ÒêäM·.ŸÊƘm£”1Î8ù¨%’)õÝã/ªõ„#K1!@«œÍ©¹`°.œ9ïôq:UüµÈþâ&÷&¨c˜pi‹o,§ï—P¤Œ‚9ÍÈ�¯B}/Lþrp·¯Ú FµÈÎ%„PR׺¦AÇ‚/Õe¸Âð-e¨`àF'ú6 -šËÛLQhÇ�Tª0ýMD¡BrØãÖºä :®vc«ÈRH Ü�tA…–”Ê1hEe0} -SYÔ“†x@ïVàÖ‡«D=j8*ÚZÆßf¯xc!©¨¶¥05q¹£_V3)-`x�ëye\µ2©NY€lQqϪ»i))kö25Ïfi&³ºœ£¤»"ã�x -[1}n^‰Ù<Ùƒ´N%¿µv�ÑnZ…Ë8|ѾYŒk`Ý®ÀÇä¾»ßpÁÛ�Û²ï¦g× ÂæÂ> -*u¿“ÁÎÀ-iúÞ%õº¤bÈ2#°ó"-¬¿ÕåsË=ñ¥è©Ô»˜¯igÕ²#O�ú&N5Å”Æ2ýÂæ‹Zƒ|N˜úÉZáj§ÉœìĄЭ)” …ú§ôee Õ ª¯-½ÑvðsümüþrägfŸ\�øó/bZúÄî¬õnÕÔOä?CóUõá½ ™ß`ʪQr·½|{µj÷‹ï)Ó�YÒj¨ð&cTÙ{à”]háŒaã…‚{¶l…÷kûzJ¼#Ò$C¢xE«¾€Þ€Ø….Þ4æÜT”ËRËë° šô`Ê‘Š–GÙCf¿Ì”›[‚‘gtm hÛWÝØ*O:âQµ4ÝÚK}ÉÌ›«D‡Ý)a²âyt¯ßK«ðI•C_jÍ®#º/Úï_œ t}\âeÅ¢†‡íëW¦¯œÑ5»ÃrI¿§–Š›0}±ïRâj_šãTî›ëR›æ»Í³Á1Žõ˜žç\éŽÆZ§¹É65*—J¨)·ñ­ë¾Frª‘ EŸ»ÇÿؼLZurÉ¥{|s«TAþ2…¶ñÛ"m_T²3- 3*¨èÂÞÓ°œ/k¥ÙµxõàŠµv¼^k&à}£ìê{è¨MfÇÁ­Ì~?ü{¶ÉT+Ò89D߯bÇ£o=xyV,wœ–[B6à�«3vøÖ6kÔ®3�1¦�Ãó?A JÅH¤@b‰ÇCH’/9Ñôzk*xâ‰2ôóõÎZ:x"Ì0ò=Ü}5Éò'GEVs\^Æw¿*kÿ‘åCL˧“LÒ¢ß]>!«pC (JÛøMÕ‚ L_,è–éÊÃÕŸ,Ÿ½Î-Ü!=Àÿ7…[m_ÞÁváè ûSu�=^Ú™Ä*8Q©öŠëLioŽÕ6t½—¥üÇ�Àþ¸ÿ$öŒÔ -–ry%¯$¤¶NÍiÁÎîéÅžüóêtX‘:ibI­újjÕ[žÿô²¶ÉïG3o7foаd°V"vÇÛ_îu¤�SiÔ±-g²h( ¯lÞ«à½=™jU-'±¢Ouíúå !RÌœlž^Чy ãR¾Ÿ·ÊEÖ3D“&“¡æª]‚„>Ƙ—œ�ïÛ>™èÉ,ML/Ö²RéÛs¸‚¸tI ü9Õ:ŠÏ‚ýXËÕðNÔwvjq7poGõ¯ã³‡–Á—¶¨ãÔÆpMµoØ%c—)=Ó¦¼ªNᅩ&°x�Å}uÔ‹‘XQsG׳¬´š2áÎÕ¤Â=¹Úá -ÿõVÓ (oxÈœ@ÕãˆÀâW¿ª§õ -Ó�@N’âpj‹nòŽ'O—_~s·9"~=ÔÆ˜úÎã²ñÐòªµøk—?òË�e®ªÖs6… öbíJGS¹¤üÿ×/ïØüâõý�š›àXîÏnP5®«ÚA}F°w{_ûÍN]”éî�Ó7óþ,;ömøÜãé¹�seûã*â‘$‰’�+,ºûš†*@Žsä.]ß–îÄœr¡Z_íçŒ ®*ØðQº.×]06ûe÷l¹±f8mÄì»smæ9ç‡ËÎÄÌ_XVŸÑÌM‘B�þ[ÖÁ²V'ÁKIéRµ�Â5A4[êÙg hÕ öÿü+EMSS*-#7X(z–ZÀ…TøàBÑØ°4øu¶¥ë?LÖèœHéëq7Y¨ú '5Î×.ÕÞ}Æöxu¤Pî‘ÄJ5]©A@¹šIÑQ�¢çsò[4_ʸooRtx¤è@oYSÌ^¹åjKZH*pÄè<õ çs“ ‰!rÀØOÀÇ aéÎUñ¹“†r¡ÇgÆ…¬ 1yð‚˜úyð“ɵو ‚“ÀkÁleÿ……ÊÅv´Š"˜­Ã¬bÀÎÀ9Êmø âÀ°w�]^ƒÏM–ºØ³§°ÌJEÎd°Ä[©£ŠU �ñm´QÅ)xL!º±Á/ݳ›i̺E×C0–’f¾ÅrX„k¥Ø¹¾ù1~ŽHÑoèsD Z^ƒŠóQzјx•åa/P½ß—æðிaªPB(7 Þ@+U¨ -ì1ùmÝ¥r#Zëƒ"BÀ\\ÇÄ >ùt{§V…)ôPâìû(k;(« …7^x+œ[ú!®æV« ·ºW=L·ZŸս´¸Õ*ÈÀ­î ¡ÍJ¤º[ÝËÓ­V1<nu·LC­£xpÁ¿Ýnýj`öí²å!·Ž}? &4/‚y0ÅâØ¯@ƒéJ-z �K¼‚:¶¸”  ¥ì7჎÷+àYV…éÐéÈÉ�g¿Š.Ø«RÇö(•œ.úIA‡÷(x^n¤Œ:ÂC,·^܆ :²eÁ¯BƒéIêÐ@R^Ã,˜ëAÇö�ÒÎM±o�¸ð€£ƒ}„\øåÐyýªÃ}DzmD“뢣}Ð/ �2iUKDÎ�'¿Š�²)P­$!GÅoˆå~µ…‘êî[/ j˜ëîÛõ)PA?XÊýÛ``/ê «pÕÓK¢´ ¼GñcöT¬Á -4˜• -úÁžÁsX…s=ª°�.Z… ¶Ç�—\ÇL!¹›¬.å­¿ÐAÁÙ°d¬�p€që@Ý€j(Ä•Ôj7 ëP ì™W!ÀÄ „<ÓÊVóƒ “U,¤ÍÕƒd„,®O f4œ%Q‘=Šíp›"¸ºiÛCD JÀ´ÐBgÛ£Àã‰Ëa Ûl†yDÅ÷�ࢿ‰¯"*ÂGÁ%ŠÞ…ë»*¢"|”¬Š7QCÕ†9„>΂h‹¡†ú°†*˜&Qc�” Ät]T $3dÃõ÷EQñ$'`‰7ÑE \à#¯qz3M¢Ú©ï(BiºÁÉEÔöû]%ë6Šq裢[… h&Ñ£ƒäËUë»(ç‹bK£.4ÚÖ8~·§Ê4PÕ*L’R\Pç‹ÙpÕÒg‘©ö(:ÀèéìÞÖÕÞcÂ\«Ð`šRµy˜HÀ%\ƒs!³ŽÕ’!†uX`.#µ—“غV´‚«ñ F ®ÇzèÉóz‹ÝRDŽÀ\ -jB=ûºz#5Ô3êXPWKü£—sKg=�î ì*ùX`žóXO¨»èR?¦_§vЕŒ~¼6 ôF2.›`MG]½�ŒPˆé–HïçB¢u-ѸKÛW�º–nÎSû4ÌŽQÒŽP‰Åî’¯—aOñލ=X9rëø}–FíÁ*~‡` ÑéàÀ Ìké’¾†K÷í(ÃŽ·c‹ÎùÝë§NŸ¯l U !—ÅçëiH¬jHÃø}†Xí+â]êdÀš -Òɹÿ)®\¢^ !°q -\“£ÄìÆÐz¯éYš^…�Í’P¸Ö¯MÓÕî±£¦·Œßµáê½cèŠzwÎIÑgíÈÃÞbëÊî3Õê6 =<þøæå«Ç=g?z||ùêO¯ÿ¸ùæùÇoßþå»ò×?üíûÇ¿ÿôzóüó·o_?”?½ØþþÛ—?üxÿòñÇ·÷j¶‹�$¦�'Èä{,ζÌ9Žiÿ;ZÛc -endstream -endobj - -4838 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [468.37003 476.86942 508.41824 490.5314] - /Border [0 0 0] - /Dest 4501 0 R - /F 4 - /StructParent 140 - /Contents (Figure 2) ->> -endobj - -4839 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [297.5414 449.5454 308.5414 463.2074] - /Border [0 0 0] - /Dest 4502 0 R - /F 4 - /StructParent 141 - /Contents (41) ->> -endobj - -4840 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4390 0 R - /f1 4384 0 R - /f2 4360 0 R - /f3 4354 0 R - /f4 4366 0 R - /f5 4378 0 R - /f6 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 142 - /Tabs /S - /Parent 1 0 R - /Contents 4841 0 R - /Annots [4838 0 R 4839 0 R] ->> -endobj - -4841 0 obj -<< - /Length 6945 - /Filter /FlateDecode ->> -stream -xœå=k�Çqß÷W C9ÑÙ`±ýD$¤–Ép@&H" u"eâQ¡Ï@üïƒÞ½Ù™é©™îÝž=2°ñnogºª««««ªëñøÉÛÛŸ^½¸¾í>úh×u�ŸÜÞ¾¸þÓ˺o?óËwéOÏþúýíß~yÙ=þòå‹^¾Mz¾ÿü‡?þtóâö§77»O>éž~öéîóo>Ý=~öË‹›»Ñ¾ùôwŸuØû?;ê°ÃîuD,;2�7±é®_ï_cwý—v¹¾Ù=}¾ÃîùÛÝãWØuÏ_ o§Ï_ï>ü#"þ‘®ºçÞ}þ|÷¯:¤!ÀÈÒ,a Z@àÛ�#!2!bD¤€H_ ÒD2Ÿ|×=ÿj-ÖÐrÑcZ¼„VOwø)é÷ô?~’¿ûlï~š»çòçÝô=¡ýÏ·‡Oì¯:²Ý‡Ù4}‡{ýO·4Ö#Â~01ÓAfˆ®ùÝU�ð²Î�b!Z¼$Cšu† Ö»³’É#ºÏS–˜Ðj¨ V ÙT´¸)P©à#’6J$BÈ'ëÀ½Ü -8 mÀsU˜{PÁ{Áב¾zÿßm¾Û÷l¯:¾Û¹]¶“Üx[æ‚@(mÓ~Ï?~ô(+ìè¯WÙv½¤<ÁñÛÓ‘óX QY�àAÜ^*‘iYF�lWÝ#và8�7wèï¿û§á×9•wN$êU7H[ÎØC¿‡®�Ø/Ç‘cdüÔAóÕk]ZBÒt ¶18k‘*÷öÄ:m´¸·E<5•„½g¢�' B\ÅÓƒ_CTˆÝŽÑ‹E¼x/ ÀdÏÂk�Ö¿”45íhæ!H~‹M¸¼á2iÕoОugºQ‘–Ú)/"`‰ü{ÄŠš 6yã÷+.ћ˭¸¦ˆ³ÀìâÅ|A.?»xê½Q¬�u¹peQŽŽÃ�ã¿=uÚ#b:à�Iñ}õæÐt/�ö‡­‹Œå¦Ãv4Ãêä3³¨»êLO¼\§9š!W�ôzÓèñ;j<8å4ûU‘B!ýúõ‹›»_Þ\­’Ë3ĸj±H�\ÒÓfO“anÆM�;z‘‹“‰¥É$óÇ¿Ñl¸Jác,b%n�•´`u<� ¢�U?…DàX‰A�A�?š,çÛSµý¢¢º½<ü¤Œ²¦L‰$‹BêÖó~4Ö”.qÈŽlç¼ræþ•Q6¼0Òå”QV5#o“ -ÌUrªÖ@?òV ¬zM�€Ñ uÎ28öïc©v< -¹ÎYépV( f"xd-Í×@m4ܲ‚GQXÀ@T¯¼3@ä7ÀàßKàÕ³Îï ½;ÎÕ)ï $ƄץCTßt$ˆdmÓÖîO?.a I]&‘…|3Ÿ—ÀkB—Ù€±žÂ;£äœMº²q ƒ¹—%Ðä¦xÇ6òå—@“Ž’´ã~k:.¨-k[àßJà5Ù(��¬g¹0¸~¾¢ÿ>(n† -Ç!Äw¡¹. †á’ª›QŨñ ¸?_Ï_Á=øG%ðêŸ'ˆQ¢k_s­eÔ;½È€LýƒÒÔUé™Üxn€5‚/^(Mv2Y0ÆØöéT¯ÉNfÏ›Lÿm ¾&<9ùöÈÛ ÿËx«Þ¿ˆ@ Ü|ñJÕª÷*Æ�qNÌřߪ×'΂ {ÕA ÙóŽÿHÿügúç¿J"Øê7)Æ™6Têö¡UÕÈàÁÙþoJàU52&ß�iŸ~iZU FŸôxnÿ‡tU�D#>¿Ÿ½ªA¦«$mÓOçÎ?«*�$ࣵí“/É §É@aDß ¿¤{8MŠpÚx®™ö%ÝÃé>OV‚»±ãT_¦Aä]û¾/ÿNuYÃà˼§_æZ@Žmðз{,þX:|œ[?A¬œàf£E´O£CŒ¾äæåa´I-9ŸyäT�лžèÀE:z(AW5ÂÀàQš€·¿z]J°ÞÇf¢ÄRäŸ.$8Û¼NJyUJ†H|àu!é�"µƒ/©f^•‘–Áx²Ò>û’râu™®åøÎFi�_2‘¼ðâ‘84ƒZ¯ûSÔ¹÷Ü ¾¤™zÝ·ÁÄè7XüÒéu碀÷ÁÛË3_PÅ^àü^9lÇŽº8¹ÂÞ{¿*�ÙA‰†Œ<¸ì¢7â/æ³ šP4Á¢Ý`c¥bФ¢a û‹ïŒ ‰EÃÝàËÑèšX4)\1Ø{�ïVµ$»·Ý㥴¤à×´¤à§gdÝxÀdA5 R¹ T ‰éx´ÍËP2£*÷ÞcÜ`î%ŒªZHL4ѵN¾¤”FÝvf°mžê<Œª‚h [{yŒº†hÀ£iÿß%èKÑÁ‰•öÙ—T„¨+ˆ¼5¡iú!*1¡ªºÁ†àîa .^>Ç6A\å<‹ºz  ‹ìÁÍ‚öQ”† £ïlôÀ(ï �©€&?è3HPU#Ó ˜�è./¼U=R¢„69^s‚ªz¤ð’ôø‹o`B]‘Œ€Ämó¯]M€#À‘6@ äß ÔD¨1¬§-´˜ÒB¨ÉPcÓÝ·Ã/985!jœ!†ö´äá 5 ФhaïÙ7Ã/r¤&÷oÁƸüòT³øL°‚m¬Þ+I<ýf¡©ù}ƒŠ›ü@ιœlXHÊs8n€@I·$=ÛΤÕ�”Ëf -…ƒžpgRlVLêe­.(R³ÂÄ8ÇÉàxS`Ü&å�–´OO6ž÷À ºšBÇÌ[¤(½X÷Pz°ä6Ù£Eñ¥æAI4À²Å-žjÞŽIáŸd£iB Æ#5Ç ¡ïgÌZ)›î“±!)÷7ãÜÉIUc Úc–‡i†ä²ï—ŸÞ(çS¸\\☠-©¾^H Ο/图Uç4ŒXLòWƒ£¬뜭YÞF £G$g:€Z¹«@ÔQþPÏ3}ú ¹êxàÓ>mpš\د…[ãË,up1ù¼¸pêùh-!/Í+WÔìÕ¼)q) ßÖÁoZºQê¥òPŸCg³Ÿ“$Ô“r´ Ë9M>�VÎIßù~‰We*%šÈ 0�r°Ì\šæa™Á;¢Õµ�õäúö¯/~~þòo»�¾øü‹/Ÿ|öI?p� ²DédE¬T -Áµ”xkÄ4Uè‚û#äÈHSÞQ€±`‚¤€«•ƒi\ƒI“íãG¦•ѱ?ãd̼6«©£æê1bÊæ PCê6©£æä1!X Ž›áõA5'/eÄ™°7 -áÏK=#/mLá?…-±m¸™ÿ¸ˆ�ª0y ÷°ªÂ )! Ù6ÃV„¯^›�<Ù.ÞÃüÕBk�0†¸<ª!„.Mš¿™‹‰š‘—J�1¸‰´×%ëBÝÉÁªPKXôE*Ü â "üœb®ÎæÃÊs¬½ªê\ÙCŸìeGúçŸEùÉÚ,«§•u]2hÁZ¥pz†ËÆ�šw9˜ÇŒBC]ˆ¯Ç8‹g<  寯˜\™Ʀä”g¯¨'úiöJf6eÕW4k|ª”,XásÄÊVxôfu~«Ê´vJ´U4ÌÚ@Ç -3ÂkQä;.Õ+JžlDq5Lhjoª‹öjd ßÍ–ÜôçÜŒèóª<)õJ Å}¥T¥æÍ´œVpˆëÍËù–í%¯\ÿãý<ŽÖ,¹í„å5ïk¡÷ =ºvªBOu¸C]Õ*–\5Ó¿.Ézž!ïJ´Â/•ô"½ö„OÎ�HÜ™èÁžy{ß“¨W¥ˆ))8p;a¾)F¯J-‡uð«®M¦›mý ˜I¯£óø”›‘™ôÉ_V*ÜéÎ$F…ÑwÂìu½5S×33uÖ aeæú—Mn¤ -É£ÖÎB!Ds�³0;ëÕ -Ôi™&÷¨5Œ•ÂU� ‡·>ÈN�ÉEÇHm4ÅË“|ä£OiÄZÙë ²¬9Vÿ!C™×•ˆ‰®?ø8ÁÞàÖ ì.ÓvÎZEL®á.˜C¹Öv÷âMÍ&»iþç®ÔŒþ‹Ð;ˆh&Æ"ÜnÇÔB;Æ�(í›oä[�wpÒê¹ÿ^›•ïÕŠ=˜Ã)Ù:‘±!’á÷ñéT_×þ�–¶Û_M ¨’XkRdØÔNÍܳŠ=³ íç/Ô4Š™ÙØDX•H“sömÖŸ€‡Zåê6ž½®˜%#IJîbkb:òeuª›-Yã2M"ªÐÒÕÀù«YÁõ¹=­O`‚TÉÔK·*9,ƒõMþæÜÅ•í9W¨Î×ÑÞa°ÉL ©}U•¦½ÞØ×£n¼z›^-UÆû¬gBÍzŒúÞŽ‹œ‘b†¾Œ¢jW 1:Ï[°ŒJ×%¿ÚYrº8GÕv� A¤iWìQú¬ØH·Ð“Ã`‹Mù¸2«R¯�†¡�ªºË¤O#Nn“v>»YÛÅ8÷Fž¸Õ•ç+Ü……WgW'+’qf)¾úãíöbpÆâF,†ï¶L; ¦ÍY¸,¯ÔxÇ@Î56z'�œjͼá@–ÛÚàV ɪ^—“¸•¼ËMf\ëšÊÑt§Mzt>\MÂ×&¹ÉCgRNwŒÕúôÙÁíÿóݳO¿3Ý7;ê¾Úa‡€“ÿGCÞûîõÎØ»ŸwÏJp÷µ� ëá -Dö˜ü¢Ø½Þ¥Æ„l‡éï"–:L%‰ÅÐ1xk½ß?k rÀ”Dw} -VIºF‹§à5@ãgµ¼�`GžS§Ÿ´)—ˆØ† ÖÚÓ–(¸÷q‰ŽX½ë%Z[z�‚MX{ˆ×’´lê[² 'b¦òÏ"l–*ôn$€Ø÷Q X½köÊ -á�´DßJ'ßuØý�+­ -W®‰#p P*}8UÜ,�r{®#°‘8†ØÙ„b°±“CÓ –Îv)Quøíz7||e%�몈ãüÎÑA¨ãßîõ.ãa‹©Ò+sG(Û‚Q -�:•`.­Ly�ëB`›¶Ïˆ Þz±qL¹ë4ž0™T¬b ŽhVÉNdÃÒÞW"͘ ½ÞÓîçÓä¡~9ßËC ¢!æ�Ø«J¼�@Ö4 -Hy°‹�×\0 -�©asÕî; ð�—{ È€äÈÓH -/Ø�ÄÓ ²jØÅxð=Ÿ€×j/~î$à»;8 ‡'"Å6‰Ä„‹¡d -¸AR'‚ˆ†=+-¢z^ .DŽév£Iü`GЇT€÷çô)€„8 2õŒ¿Þ™8úøóÎ2¡GýÕÚÑ€éÃÖõ.Õ¤O¯ÙÒ0v&1Õõ~?ïþ´{zÊ–Tûx¦tÈØé*Ÿ±%{Ý$óh­œÌ¸:zq±v“öG"Ù±Ô¯_{¿WT^ïÄ‘KdbÁþ÷ôí~õÓ�$¿"»ÿŽÒ×Ç/iÿ‡ñÇÃûd‡÷ú/c§µ[Zµ,äï`šâþ.VÓ„VxoE–LE–QD–‹,3Yæ ²ÌHd C`' "K-]%‚õ[ˆ¬óEÔYµ‹§K‡}ÉȈ>®™€œRÛ]ýî$:&¤ŸÏÆ>>åú·²Cú¥Ò#NÑ9>\“%ä·Œ*ºÇ©"KªmŽ©i"ŒI=$Ï.Ý28¯‘pΛ!p([ßüæóN�ïßá—ë‰~ÈÞùm™€jOÅÈ)`�|Û¢hÕÞ#X¢=nß�ö‚E°ÔöŒ¬ñ0Ñ—kL¤†�ÌY­1{azõTuÏRŒ%Ó åFæQ?ó¹(Y­JìE; 6ŽüY•‘ÖðM—ïå”5�I‹ªÉëÙ!T¾÷«7SÂ|�Ø›ÐmÇóZÆ¡rfíNå›?µµ ¡‡hÙø*Œë¯�fO´v…<¨TÊföü¥/g ô -QùC«ûcZö`m^u:�†Aò³:—û -ØžÂoÕ¬®ºxþá"Œ¤ÛUù4#ùB.â, àTÅä~xv–Ú^”«‘nB ÄíÆA²“ÍìÁEçì‘”­ô*�–rFóØy5ÅpúHNY{ê„Kp¦Jîì¨í·<uª�ÀLϾÞxÍeƒÊkš!§‚>üüÕ2�tÕ鲞×Yé'= G«�¡f ¯á¶>+-Ø£¾—F¦åQåÙs“û¥B§ðkR„ccct-Rä¤bg%éç²S±ú3‡? -ºU'à–Ït÷ggWæY9w[Ì)Êó &à"ÖONš‘}°¸=•iXWCGmwtT°÷£owTŒ%Ijñ¬,ƒþeVUoHh_dޱˆÈÇS2ó2D*ÒfÈf§Á±¼„"ŽÖ2Îfãø9ÑZkKd#žT‘uz -Í÷C™'ÕÚ۩Ιw\Å“ëu—©ä{ÑûzL]à¼l�s5 -:˜Ô Sî‰ j$t$`©¤BMÈý -û^`O´z]þ1i7û¸ƒÑY³&ÞÎr�,Lùî�^m˜î´òÎR{+J„3 ’Rƒ”ˆj{šÉ@ê&·duØéa^%ígƒnëiËFÏ -eáôýÙ>­â²0銥3¥¢cÌ.ű‹«ZÈRÙ±>Üñ¨eê�„=ˆõjòd_$bžnUœ²Ú\d±›°«²(5×—d³"UÔÆ!6€A#UDi»Q[tгà�$ø,•ŠŸ/•I}RëòôÿÓô³Ô¤“ô.�©"ipéÞñæ‚×4z£ÎÀÀ>˜:¡ÚÔ+�ôf�Q Dn0ä -¨�–ÁrÝ6]ëÓñy©O‡Ú¯3õép)ò¢uþ¿'¯ †€Ñú- ¬§©�:MJ52H[ PÖVÕv�&Ý’Þô†sˆR¨f+ -�‹ðÕ†sÖ§Øa{A ÚI’y/˜/>}µß\ê%¶Q¦ƒÁ§C!"šÔ¾î‹”Q:XíÎi1÷£Ù@6ÛH±Ú†Ó¦nîÍÅ9‚Õ&œ6eu‡tD· T1œÕ.œ–‚MEL6Ðáª/bXmÉ9X?ÁùÔÚªÙúɪ)Á.õñ5Še—ß©L]HÕ–«Ý?I 0RŠ/¬˜l+ëkÒ˜$€ ¸¥þŸ¬öÿLÁ Þm‚@±Ç« @Ép–Ä7a�zÐ>)n50ÒáWR@íJ6›Ô²¡[D@�#s‚Á-(P€jPòD±’UFìL¢œ—Èœù+¦£~PëšÑQšÔš}™n•@‚dm®f¾êD)*¬ô1Р\¾cI,ë�Wm‰^Ì}ìµñª3É‘[‰ÀYì8sï¹s¥w§n”ÓªfÏ6J]xIqeUûÇ@Ió—õj?ÙÔíÙ‹«„__7n¶&X,϶´Æ¥è�Éâ`ýr¬_—‹$ŠM!ƒg¦AÎQUµdpÖ$�^תé¢7UÅÖóGgk…/éõÉŒ¶—Vémz"“¨7*“ðÖ™P¯î´8mUfMþ`&fÖ'²a$à ‚Žâøú×çpG‘›Uwht`£8·ÍÎ;³"à WµÇ²á”nEqƒ�÷p‘À¼$솃¬p¾-ôµœ±ÝX­�™f•7o™˜´Vîh�–ï¢Ü«Ý¥‡‚%I‘¤nU�e£¿ÂC¤¡tãÖ%gÎ5"ÔÑ–êo¯¶ŸÊFù@…ZSiì”bÌsÔOºá+T)=QTg59UKåÁäÕ›FY/½z"÷Õ–æÍßlŠÁ ÀB FQ^­ÇB`ŠY£ëÞ@»Ì&*s>XâÈìïõ­•³í2ãRBýË”[õ£’w€âV)çN�"Yü\FVÏÅÁ}iŒm°Í×%ÏB9æ]î7Ì( xØ·kƒ"XíÚ>߈_ïîQ`ÛWë½EðB©á®f¬ç_f®%520;9&Š>­ÖÌÌÕ™š5²4×I0ȤªÃ/y›&æËÍʸ¥,�ùó-½ææÃ�ÖkN Ôwqy -›g�w™z•+–ÙWí²r9äÍ - 0/]ü -a¬C· S§ÕY÷?©mëSÿr©ü^ ­1¬ö¢O êqh¦ƒÚ¥ÝdKÛpÎvÕ~æØ«Æœª§EsO\ÕËHyjÉH®jl”�½pËyþšÏ^x”ïf=)®L=®Õ€D î½AF=ûɦû`—¼“V.>V;Þe—`-Ân©/ì̹*½”¡»È´Åµ¡Õ#�  Åx™¾Ò)ürä ZJ/Y~#ùFú:ÕPš> -endobj - -4843 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [467.11914 178.77362 506.78516 192.43561] - /Border [0 0 0] - /Dest 4504 0 R - /F 4 - /StructParent 144 - /Contents (Figure 4) ->> -endobj - -4844 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - /f2 4384 0 R - /f3 4378 0 R - /f4 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 145 - /Tabs /S - /Parent 1 0 R - /Contents 4845 0 R - /Annots [4842 0 R 4843 0 R] ->> -endobj - -4845 0 obj -<< - /Length 5807 - /Filter /FlateDecode ->> -stream -xœí=]“7nïó+Úg;çu"¿GI¶*wuvœÒ¾Ù®Êz-ÙNI+go}u÷ïSœ™þ Mr¦gÆz°´;³Ý‚ø"<~zÿðóë›Û‡î³Ï6]÷øéÃÃÍíO¯~è¾y|ýî—ïâW/ýþῼêÿç«›^Ýǯ®·Ÿ¿¾ùñç»›‡ŸßÝmž<éž}þ|óÅ—Ï7�_þrs·íËçú¼Ãþ¯ÿ·¡;ìQç(kIwN`åuwûvóø»Û¿n°ûëíÝæÙõ»ëûÍãרuׯǗã�ë·›o>ù¿EÆ«Ž»þ£ÙýD{Õ= -¬màá�vûó~÷IÑøéƒä+ùm…ûQÔøÆ÷Åç¯:2ç~h½ÿœà‚&Á “Ÿw% |Õé~ö÷…‘H>ìRÂíi”̲8®NÇE{õ]wýçÍ×›ÿ–9‚âo¹¹û±ûäÕÝ•À xÖd[øƒÊüq?¡àÃCwÕñÈ0U|Y@Qq$ƒ> Ë «sîü~�àœ1�.�JWÝ£�)³ Üß͹¬gœn�ǰMö÷V|JÜ–ï"vq÷÷¥éʦ»ü¨-:¶r·¸Å!ø�¼SŒ³Ç3 Œ=’$Úº&äé·½„Úþ§šJ„b.1V¿N0-ŒB…ÜF1^ ØvîŸ^u×ÿ[€n$ùƒ4{2�S Þ„2tnüß*à­žœf¿zî‘“+ð�߃7V™ Àª‚€—àÞ¨@§@€+ ­ `Ðn5P�N’yĆÁ2i»^^LwñTÔ ÚÞeO Êc²Ç÷o%Æ 6S¦‡ÌìÑ��x4ýFŸJŒIjÚ«(ðÛ(Y\ÈûÚBŠV‚�¶¶ñQóBê)�?®ÒERH¬5xöè;Gôå+Iâ�u€`4ºÎ�;§€%QÀLŠÖOÿÛ»|Q›:0¯ÿS º(ß­TŽÜúÙ¿®ÁÅ»SÁ«Õð_ÔÀ‹ÂÝ[PAEýz<øÏó'eè,Êö€`«³/=Kò�ƒ>å«|Ï¢;ãkIâivà}tGmØúÅÇSÿ«|IäiE`U uþ­§%™§•‡à”]µõ¢yöyÅ<Ó’ÌÓFr`½zöÿU›¼$õ´EPæ¬_ó ´$ö´��~»^áÔÜ-J=À† ÖÓ¾æhQìyÖ+eVƒÿ¥^”z�ÀÎ.uŒ(ó‚¥)œ_äIèŒ1vôþì|o$™gЃ¡о*òŒ$ò ™½OxnkÃèÒy¨uŒñçãÁ쫌/ɼ`À’i›}9î0$ôAˆœ´®®jua­$ZÉÚ(ÛÚf©:¾^Îóx!Q(Ë‹°Š¼¢ÆˆZÓú%šœ™e92òqç8§ñy1?$K¥¢>…J‰Ðž ¬“”™RZJžÁÕÀ%b¤A+мn'F«÷‹ŠÕkÅ8ƒ!ž£Ëã4xMZ#…#ü5øb¤Á`Ü)™,Í�iŒõõK9Mc£•ùÂ_uj<Â'é)1-GÈÞj”MVYË£»Æ«W�÷µ W÷iVHOÛF‰XV~+•ÿ:æFN÷álÿe‰o 9 3XMQîåÈ,Usž* \N¤[œã‘™tóñšSéþéªcˆˆ“çqyì^HöihN ·›$[4q•áåè�ãThbøUñ3+GïTôc#x Ê—N±ßoS:†=¡R5ùP¥‘èí²­•;…PXÚÕ35/=5eœL§>=þ5wI L@׈$Ö1°UdÎÏIN2M<"÷�ì)X UoöÍŽLUe"'ºí¬¶ ™§P-Í)½Ž‹>¬VQÛñÑxüóô¤2‘_Ú�5hƒÍt·–/ ä�çšé¾¤Õd$Ñ¢³ñE™Ÿ YéÍ�2 ©á4î´‰juòÓþã]ÁŠVfÔÃh˜¡^)“+JO¯ ¤ŽÛ%ˆ-kEÛÜÕ¾\'?D»Z9@e"t«ÿƚȉ'}Æ�sñ„wíÖ]d#Î7 tí¢¾À¢­á-x"Ãç_a1•&åŒ:ůԢ™�4:¿~q?.­ðÌe·Ñª�ûfî�|šCäXbª”jÉ?Ððu¡¨9€UvMODÐX­Y5Š÷ÙóÉ]™«¹Â�hTpó3ý9u5îçVåŸ -C±IqXœòVMN´L.ƒ°JŸCéy>?y¾t‚i?HKÖ…� [G0HN„£õ–y¶ý6>çÿÌ€ç!£ú¾ûà"0<n•Ø“¥ç³A''äªÆ³<•âY&0ÓXפ+ÊŒòˆÑ€c æ�hÅüµÝ±)ÜþY -4£<áT.ˉYÞàŒ³þB÷O.K%�ºêô.xµß=lÊp‘2»r]¤{ªœý5ž=ÑÝÂyÆ„5–ôL ‹ª)&É¡ËE®Yˆ}oã ¼y?O·¼ä�)`ƒ†ë¨/É‘-â_×®UŠ·jɃ ¶x•n'¤“䢑AP^ûãÉ”8hÛGÖ�Ùá=[Š‰Î ŸÏ^]8ªMvî" -™²Ï­£ låjÅP~j{u·ûG¢MJKŒÏ¤Â1»tŸC‚yVü}ó±@Žô)SáÓ±ÅóÝGù©qu‡Haà ÎvÈt §·¿Þ¼¹~õ÷‡î³_¼x�øôó'ý°-'râNè|ù¼„«+Êkë�¼_c=-/ËlŸXpŠ Î}ùæ´ /EˆøàY5Ló’òUòÛÉX¿U«—D&êÒ}óD$–Ï|ˆÌ˜8vŸæ§‚)œ�ê>ìÔŠ¾_>“�á_º�“=½� 25ëR�)žJ唕øì²Ñ\a² ùz*(@äpŠýp>;-ˆ9ñÊ€òŽÝÙöGûyy#“E\’Š´ )�>Ù(*²Ç̲¯óDÙt7 ïHÿÛôD¥G.ÏÄš_ÅÿtiÙjG0ŠWa½;rÌÌö¡üÚ³/³+ò :m:ƒñÀÓQìç/7vûÏu/ŸµÑÝ—êþ¼qà™� -Å;Th•îÞnâpo6/«à<£±Û¤lÇ“û7‹àˆXs¼1¨Ù9gº·›G앱ʺn{PKžt‡ñ Y)m\G`É‘µ¡#ð!`àÐawÛ€¢Ó€ì½ëtP`•!UÅÑÆ/RÁuÁ8­¥·›x¬­ ²ê!�e�Îu ¨=m¿Tèµ6Aƒ±›6^´øæÛ A c•‹ä!Fe½ï4°h|üŽ­E´º›ÎG6ìãéF b.¦º7ãE༵Žý?òl�õ]üM™`;CÁ¯ºX*ÉØx‹V8ˆ\Ú hƒèÚ™<¢…Vs5ÛP<áœq�FÆ× ]Ÿaû5#6n?̶ݰD“]7®Ñ¸ë\«=im@³:€…¦bd¥Q<Œ¼4J‡÷0ÒÌ „KdÁ¸ó&²`ÜzY0Ý{È„Xó!‚;`ïMÙúí”ãß®]J^œ" -Èa8@×\„•3Øè¸·/Ôe÷ " :P;~—^–k—^[Œ‹åÍ!üÓ îÚìx2œ[û÷|Ó*!/l5 û®]µ\ÜöT1·ÁùN;c•¯bÈvo¡´™ß–ÀÆñ·Kªã+ìYwB¬ãfÔž“bù ÓéxBåL9Qy -[^w¬H5kÖ§Æ9�8a‚ Æï•2”`ãŒqnûì8ƒÃ–¢‘TSqó#E.(¤@;EžÝH¡éDλ}? 2hŠLO i©›¶Õ‘XEÎ}sÆñ/5ë÷…=âM§÷p#MÐzdŽC íêyl]uƒ€,úm¼eÓ¨¸ã:²Ž“‹�¿G}„Çü@Olº7ìT¼�ëPÛá9¥vw�™ü~»18ùøfc"é}àéóf2œ1H·cº0~»‡3 €�Ù(âþfóÓæ™H(9\%–×t”c²�v¬®°RÝoxKsNG° Ê”3„8·¯%.2™ÓM`SJýÖ,çR–ss–‹"jÎ¥,çv,¿ÝÃÀÎÏrbESµ�’G?—=`páxŽ;!‡‰åOÙƒb¶Eœ-bZb°ZùÏ Ö>U L«�?Åp¹¬u4‘­õk ÇÕÊÖbùSmÀk­ÝjþX…/Þ.7x"ø1ÿº‚/•D¼–¨Â„bágfëø¯�Dåd}L-µ—àQÁ8µ¾TŒ³ª`´Š…83�ö»ŠW®¬cb½4öT¼Ûq1%CXÔ2ñ>J0dÕ™Ô aQϬ_U4„eM³~³ ¡²ª9TëcATV7ëq¨ê*뛵œPU8TT8—a„²ÆY�Ã'U Ê:g­4hU: -÷jS9b£Å;•ãÞ+·†Ä¶Švg­eY×8bW‡Ç¿„gCbS¥.éÚˆ�”Úés~ÃVìíkÜŸ~]ÕÈÝôNÕè³»6rwsA×Fnð`NåÚÔõŒÜãÁ^Ø·ÔÌï¾M³¢á²¢y¿|.kš³;7\T5gwn¸¬k.bÓª²²¹ˆs£Ê -çÎ�*kœ³;7ª¨r.Ãe�³‡ªÙ¡Ê:çR¾ Ù÷ù˜ðýT:bÏ òª¨­?'<¡Ò;TP¼Y· ¨­<¬ê±E¹Ø9m=øºÎ;T�7½ÎY¿YÔˆ]*( Á¬µ8TE�ب‚b_ðÓ PW8b« -Fì£i+Ù ªpÄVŒn¯p.Âb4�vòþ$8Ô-±iEìP¼‡ƒ�ßuÎÁ:Glø;òî�÷JçˆýAÔ^çðù•ŽØ D]Léˆ BÔe•ŽØ&D핎¹Œ¸{…ÄÞ\§Â¡ªwÄv!z¯wôùõŽØ/D_Tïˆ=Cô^ï¸ 1‚Ø,i¯wÖáÐÒÉ“ÄÖ!�Œó[!jT9F„ Ð�¼=Û—fLêo¾œ~ÀzM7­”Þ[Û#œº0ÓPѱZM÷Ä…AÚk�¬©r1t8¤ôÂbKŒ|Ð3c8¬üBU‡‹ýn† çJðK憮Ü䟕TL>ÿKÿ¡Ž¨èa"n³ÏO‚éP¬gº¯ÇjfLÐJ»%º›rJµÁ/‰�vFºsl*è‹a¡£kæÛm2¿TÀy^ÀcV~màÖ¬uVE>Ô^Bjön^³a@:-yß„‡XZ8—Ò«•jâ¤3vÅH`5UÏN+îeµY‹$›÷×8¨ÝNúý}™y -ågxeuÀå꟥–.Kü!–€©íj±µÔ¸«)öN³Åfâ•]](÷˜• ,"t Œµì�¨¬"ŽP¬™)6FÁ¼XYŽÓr›¥9œe¯¥U3s˜µš±ã~Œ<½Üygat}^-.bE„ É<²DÇ»òÊIòXjLR%Ñ\-¤“H>ÕÅluÃSiÃspàƒ¶Ç×b,½„Y¶sþ45Mgû‰Ø]“°Þ&élV&W|î -�¿›³Ý°‹²6Mƒ•hí¼^cÒž+Õ3ÀÓ2ÖËs¹�TÌ5ÏøÂÇuà‹ô<£ 0ƒ%ÖPŸDû&e$E½ÈÔº«N�q¦gö°ÈiBÁýHô›6©r:öÕm»t©'Ä71>Ĉäb †ÝOÑ>©b%6™EhH›UXµµ:%±ËŸ¡Øn4v]�ÁvUp�bF†j-OIlN6öLZ/Ã'º¯ÊEoœ½V+ê¿Ém4ò�UKÙ×À–l –çØMâ °r@¦ §ÖŠ„Á Ó¦Ü=möÔ,>$=5Ø]‰åþ‡eqšP”³wê¥Z®H\í„5GwÊ‹ãì±>Ñ©EòH®ÏŸ÷™]@aA]¦”˺ad–Èq,q@"}5é~9Ø-¹/^_m¹´û~‹zË$¶ÉŬC0Wµ¸ªÖ_ˆç±|¹ÍÙèT&¡Ù;Y(á˜àAÆd:ñ–…èsP¡Ú§„Ħ„C£’xñŒÐ¯ÏüÇ´×°ÐOD¢q ­ñGøÁ³7[|¶v;Dì’GãIžá&JÕ«÷ç6½çžµ¦ÙO¥J›ê1Q<ö'XÕ’U1t”‹Rõ‰ÈÛo4^K^ñ^± €ŒŠÏGßÉahÞóÉÈ2CDœd1Œù&,6�¡drxØä%cd71‡v¯ÎOZDF Õ•-¬gÃ7^\Kz Îže—IYÐÚÚã-ÿC•Ðd®Û\a486ÍÀª`Ÿ½#ê„¶Û?•‡/)C'a£l1#Ô,÷`ÉŒÎGj§‹Ôé7�t_x‡Ó¸•Äx»y|Ü‚à!¡ÌÙ™[á¤ka¥fÆß,ÝCô|ÒÑ’|’í²~ZœªnߎbQç�cq³†ÝxA»Al&NÞ×KŽ8»†j¹- GGËëUq¡G˜²d¢´˜Jv`Bà!DœN9çÝ…]±<Þ“øß¿gÙXOoìRß ®žÆ®ó‡*ýÿ -󜞤ˆVD‰&þÇ}õ……ÈIÒöBè˜"NòÛ«‰ KrÌ\ÓŒÆw%J:‹Îi g�es,‘(Î2êäR·9ÏL€´Úø;oŽróº^ÝmÜŸN¬È©�àØ€¾¹¹üìùÌžŒñü•Õm\¤¥Ôµ{®%/s´�q±ù]úl&^ó&Æ‹ÖCHX6É"�þ�w¥QçÇ…—B¬CÄb¹]tËï¸ÆÚ1ºu \ÎâÛ[jÔà•>ÑvwÄñ‘ -±'¦V1@ê퉨{ª@…Øs›to=��º-j—…”¼×ó…«O¾Øï°8ùß$_îyo-j‹«ò_�Ë=Ü®V@`mŸ7ƒ£òÈDïãï¹¹û±ûäÕÝÕB7èØc®…ÌTÝÉ6Ø“—ì$‡ovÚ±7ú¾æo™ •×¹_Ï#TTíJbCGÖ†OÀlÓ8A>¡tÕç!”ìy9ï_<©ß‹ñ»ð${ç2\-A::^»òG�Ï€>d2ÉùëÒ­‘Ú*¯kIbçÈQxzüšŒ•YÆ©¨Ÿz"&÷›–2ë†%^¢ôLåMÎÒV� NŸE^ÖÅ ôï°%xÛ•ÃßJóëyôâ§´sº§à(�/ûa=5—V­¾AÄþ¤ÖQ8É9®“æã:â’;cЂó1�i âŸl¹o©™æÞü{x¸¹ýéÕÝ7�Ÿ½{xx÷ö»øíË_¿øÇ/¯ºÇ/Þ½{xu¿ºÞ~þúæÇŸïn~~w'v%à}9Ím·&Sª«VGñÿM‰÷ÿ Oé4 -endstream -endobj - -4846 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [213.19614 398.77203 265.11087 412.43402] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 146 - /Contents (Section 3.3) ->> -endobj - -4847 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [249.16646 313.135 300.0526 326.797] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 147 - /Contents (Section 3.1) ->> -endobj - -4848 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - /c1 4403 0 R - >> - /Font << - /f0 4378 0 R - /f1 4396 0 R - /f2 4360 0 R - /f3 4354 0 R - /f4 4384 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 148 - /Tabs /S - /Parent 1 0 R - /Contents 4849 0 R - /Annots [4846 0 R 4847 0 R] ->> -endobj - -4849 0 obj -<< - /Length 5170 - /Filter /FlateDecode ->> -stream -xœí]Ý“7nŸ¿¢U’ï]–Kü¬øœH²eû*¾»”öÍòÃj-ÙJI+eo\Éý÷)ÎL��&Ù³N*§—ÑÌv“ ð#€ xõô~ÿîíÍí¾ùâ‹]Ó\=ÝïonyóSóÃÕõÇO?†Ÿ^þúzÿ·Ooš«oßÜüôæ>üt}øþ—›ŸßÝÝìß}¼Û}ùeóì«ç»¯¿¾»êZ|öýóÝî ‘�l.¡o…!뫌 RÍí‡ÝÕ­lž¿ÜIaÿlóòùŸvªù~Íw²1͇�lPgЃü/üM6·»—»¯îWV÷ë„$/ êCÿ²y_î%ÍŸl>ì´º² í‚œÓ �VJT‡®@x�ŽûÂïD)”&Þ5(¬ÖÖžU£“NS ‹{º4$¯æÐÕ÷4¤O )¥Õu`‘€�VE–ɃYéŽëgSÕ/-ì×ÈF†Q÷ÿµs¤µ®-ÁyèW6VèÚ«úAa¥·ØX2ÂxOÅ~z÷bÿ°kEÜ ½q'õja·ƒ¯¥IF´ôÓaHM7:rú‘ÌàñZ€ÖP$+(µ;Óô ìÿþfæqC’¯@WC¡W|5P pžóuÃ;麃R]ƒõ®c¯„t„ãê XèÔ e ÚƒCÍy{^YÞ‘ÒCpHL AN_ÎYüf0¬¹C­fJ¯«˜Ñ­…ÕÌʯ~­í×t‰ÂT¼×rçíç0ŽN˜�|‡²låË)Æ*©v*¸š®¡æêuö-qC Y#ó^ƒ@‹' G’4zà)È¢V>(gÐ* ¬&B+¤uP§‰p°(­êýÿ›ÎгW¥€Ðâl[Ïeô|]Iêƒ`ZjÑ P ›Û¿†.%x#]ó×Û»éI}´‚¢öè×£ŸtúìÙ€îç�lÀ rΡëDhþÿv§Õàëû�¶‚@ZIÆ ša_·A››æ}øèzê›��>®©�Î÷»_vÏXn~yùéæîäš~ÿü»¯ÙºšC^Z'È"¸Æ‚еaàæ�‹Ï®w²¹¾ß]½•�k®ßöo‡�ë»>%¥|%Iž>ñø‰úôiNŸ6yN¿Ë‹›ë?î¾¾. -ý"Ñ#zr$À9m·ýö¢ÆNÔÚ§¥ÊˆºZO�@Ýü×ÿ_ ƒìq (ZUœÎ35 äA"O �'ý éô©NŸ'I3$Æû1„ÿŽ’e(¡,JŒ3Àœ $GÍñz.DÒA(nµ3J õ�1Rob­’Š ÈiJÿù¢AÙ|#Nj)Rƒ÷-ÑáójøååðË¢1Þ'š4�<'Ž�64îEº%¬{KEß#‚^Ij¹{ø| 9¢Ú% ;ë›<¥âÅ[¢ô¨»öÕ¶©VÞ]Ó7Õ� ]_ì� 5Ý[Èó4í•d ešA™³‚ŒÕ%Rb�]Vå€9©Ðäð×X„ƒ!DC|Äs¯7%‚ÇFdJYûÔp"}VŠÉ -¼°%-Ëa/.šëÿÈôn™Þ½×ö~ÅRQ]4—pl_ùð™¿>ŠeNj¨È(™oÉ´OAÅwŽ©,sOÕktÇ-KÒ C }gCˆ6ïÁ´z»5[Ë–·%R=Gª’B�wn垘ãüÓá×vf&J†!�•a�<ýìI÷e¤ÄëLB9Û˜,�¦'«aœ_LN -cÁÐF¸ÚÌ3QϹv -IHm¶ÚÝr•(眥A€4æ×tÎ"V…óÊÙ3Îç0Á. ¦ {fÛ ¡²+˜ æ¿”zñ`« “q_e¨ Aê…ÔN×`´ž%œ�Ž„…¾Š'e°¶æ®+gþ ha%j·�üXF?2¶uƒÒ5þˆ×Ç“�p¶ÍyòϯZ³ÒæZC´o¤¹hTÒBj!Gó”ТiÊšdHhëÍ6�Üp™âŒ7òZ�±Î<(³¾jýªÅ™vŠ@h²7Ò-[ÈY6Ê� Ôt.ž_&º5v¢ùzúm©ö.Ê -!·�i�B)wÞe¬Ö�JÞŠ¢ �¯¶ -ÆL¸Ëi¸$¶Ò A·ä˜‹û©‘RµPA!m6(Pk  -þ? ~B6æd©Z³!ƒÇ…�ª\ÄB['‚’á3VG‹kœÙØb“KuJ:˜eA�WZf¤Xž´¯®_ 8ƯLlý,K1£ÉGOÝOçC/ÅÊ]öýBRÃ�úM•ª„¥A‡‡~ïV{HŠ‹ŽXPP�òRHPë<¤á{?c� �€ð4‡ëé É亖¯³ýðÖMbãE“bÜFºu ¬ø¸›¤-6�8í®ßHÎG×3õŒ†>3,Åiè\¶NÒÄ7‰Zêtv#=ãGMÑøˆ3~Tò==_1a±½t4]4¤g:lÇoßV«“U ÖÒ(qMÔ4—÷ì„ g’jš<¾…ß7&ál��zš:þnÃø$ÿäÅšgfJã,Gˆ¦)OŒ�‘ÀÙì\Ò‘A6[jqjDvÏ7åp´Ô§@ŽuUÁ^.j®Òœ·Ù9oBé ¹*cºÎj%Kí»M�>�a¢—ý.—e=¡´Ï0ž²ŒÌ8žd‹4qj�ÑÔ²ê÷ƒó•íN_ÇÄX wÉ�M9Ø -iJºh¨?ëi)ž¾Ãqúï#¼. ”YaIÖ‡ó¼[Ÿ!¼h.)œÛEåá,3ióñJ:•%Z£,G ÏψÒ\È!üÚŠí'X ƒXùÑýi<4ÕM¸bB„æ“-uHñuv›ñR�—S.~1˜Êý5U‡éâ§9T@™]Å/F�-q˜ Í’¡œ5U Vù\ …�"ÍÔ(Tp1hÎ(âÉmÉ)Ƨ±­£¡Ä$�[xÂû�S©”ÖƒlÿqræUÂ’ó"²뽃ˆt.o)+Âß"sIg=7rN%¥Yæ"näP±"Æ30ø²eJn¸Âñ^Çè�¡ºªRÏS ÅÆÂôîÒ,´¹åxØIdùHÁ%—7½hd‘–NþÊjØGì^Üh󮪭©¨ësÕ ð®j°ÜÜŸ|:Ý+‰snù—\ç1`øMÒ$š´Þ÷ÓYß�¬ -µõVÄ{-ï ŒZíëo3�©åÊoTN•µÈü9î¾ NÞYO>§wÆo|v¿&Žpg}%¤OxØ#ÆŒkŽ C¥4ÑJ²;ÖRñzÖF¤Î:Ĥ¤p˜�?êY±ˆJ8ÓA¥H(›Ç%öÉV”Å{9T¢w¿õ"vâë&n`ëD"ÌÑ–ñeë:žì9(* “u„ Œ³&`ê5e*]4…wZ"·üÅ;‹{a8—è�ðaê°Ö¿0œ *$7S% õI¤)» «YòxÁÎ(™±§Ñ ã­Ù×%yqþ ’ýÃ@†Í‡W(¤§Jj|ÒX–ßåÂxS^€1ÊlCÕ‚ðN<Š>¸ój_0N†ÓÒ[ŒçÛ̼™&½"m’›)»·^·¦^\´àö,úx,%a¡lêp“�'êIÉûHM¥ÙÎGÚïÐ,OÔ›“¶Â27yKH¢PÞ­ªPÜþ76T{3�¯¡øx†¦ûw‹åŸÒ²l‰`†”¯Â5b@µ8~µ~ÈÿfíáÖˆªey[ç!Œ† s:„}§*Æ÷8×)FÉ4¿+Ϊj©±•ïÆC^ؘ*+Zœö>7íÑ…�â59ÅœKrQc930¹Æ£ÉÃÌÑ#Û|ÜÔ‡,øÁS™Í•é�únLqÑn]®ˆ -°l™;TBk_‚‚©ˆTª‹É!'ZÐ(ìbñJœhþ©Ò)ùØ|¡4o"°Q -ÊdSÅ‚§Ãÿíæîçæó7wÙÉJ [•�!”6ÛãôrDh·g- bÄRi4€Zhe·Î1ƒ¸H–*’Eæ@­"+ÙŸ™¦‡­IG>œ¬¯$¡zFÉ:í¶i(¶(ÖÉÃC�»pÑHÅø×z¿–sË0ìú#8Am³ûcª±Âr4|!åSú²Ð?[—¼ðŽ”ÚÇ}2IçaâS3eÕÆ–Ò%Ò¡³ †+ ¼9«”·r"á­=� CɽóIÙ±É*ʇjÂ׳ t@ÕMÕñR -Â5ëE"ÆyØ@›ñBZµ e°Á6«…W~ >•úg#m…4èÔð€Õ¸BáZOÁU©{>†‚œ²[pà®D[ÄRa Yzpê0Äÿ´WáÎÃõ$ Hð¬#AR刞w%¬Ð¨6!ám‰N%’R•{€™àÙT4­j¹ ‹ÞœçÔ¡–J8 ÁôXAB¼WtL«ý¹²î~ö¢RÉÍ q·¼,>à·v_“'ðçéxÂäÅ&\³á³÷l 4‚ì²`r•Yâ³mÔt¿Z qëHî�ZÉ�#Ü>›‰¨çÀ×8r³oúf«°áaßê»"P}¨‡ aÛû¬¶‡)H™Ãi¹÷µ(ÉfH'¼6Æ›õ$M�lfA¸¥õƒ0�[2½p.œ‘Z‚e3õÛ+ìœu¯WU,{b{s°‡ÌÑ–¤‹÷۽Ź2[u"Ô”zYH¤rºgË)×ô¿Ö4É-Ì �ðÆ­äÁºuéÜ{ Ž ÂòIJ{ê)Ù²ŒR¡'Šæt[Tó,_µ}Ýñ@�6;C´Ú¯©c÷¯½â™bR\y…„÷¨<Íß[½ºþŒYuE_�¬ùç� gœ¯bdÁêqÓò+†çëºì!�lQHåë­:8”HcpúœÝ¶åkݤenþ?ÅÏÈ´¿d‚õ&«Î-.Ÿ2Üø(EñÆ®© Ç@�r«pSm±×†‘ÓB’Q¶ ÂY}®ˆ6°w‘WB!Öq`Ƶec™±gú’(Uu;ª´VõfðWŒ.dÖ¸¥\R`oýR!v"M%ÅØ‰åÏÆûåÓ¶ê„‚ÕjXxŸdƒG ¤ð´òºœèD• §��Ö+νNµ‘f»µžëU�OޤG$€qŸ™�Üǹ'O¦'OÎ4K l”PüEk^ ƒ-V˜Õ¦> ˜$¡MØØ´¬ìøS–c8®Ouc�|~¬¨‡@ÞTžMöV6�t¸jÊëºä‡Îú©ôØ‹Ò ì**YIÐV÷¤{k -CÆmÂ�Aþo5ƒØè!Y�Þ×U}#AÔÔ9îIö`wúÐÊ[{Ù«:¼ iœaÅY#Ÿêe�½³ ¥JQ-u.mÄ»íJäÜåäÔ‘f­¿y‚epµ.T̵Hœ‡5§¾Â4�œ)þ0ªgUó-[‚€„‘ù}öÚÕnòpÓd9ØæR¡�QX% -äܹ´�%÷$váã\û]-Öð‚�#›x¡�àÊQÂ}©±‰“ý“foLlª“aÇšªÀ”UÝ7E½Í&¬:'l8°˜'@ÅáæÏέáZd:›³¥|Ð)¸žé5ë%{û\¸Ö´wFÆóQû¼xf׃a*+òÕÍxíÜ…›‡»‘#6z' М(Oo 0Y]1ïŒäØ;üºEÃ{á•ZW|sÆ¡E¬2mkõèø…¥µÎG-EpHöÏ“3{ Ñ%ЦèM˜2:³ÇÑ74ôÓZ0Ý~D†Ð M“ŠnØ­™äÑ'ÅQ³�^O›2óJ‚ŒB°£¿n¯ã¢òš…âäÆÜävF [¹™ÇÉÕ¡0Z3š2­�>Âmš=’ÖÌKúj¢ò«‰>�‹mñ¤æ-1*VíöO)Hkkx¾~ gÏ€è] U+ø˜wrÈç®:BÄü܆î4n¸{¦ºÏ*SÌ·�¦SE‹ë“Iïš!¥~�_)Å0¢ÓÇl»Ì;N+ Ô¾X®h>®¨qV7÷éýþÝÛ›Û}<ÞïonyóSóÃÕ³�ûýÇ?†__þúzÿ·Ooš«?îß܇Ÿ®ßÿróó»»›ý»�wì - ë ƒΖ•.M‰còù¿ÄÔÿ¡<-5 -endstream -endobj - -4850 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [123.083145 416.867 182.91214 430.529] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 149 - /Contents (Section 4.1.2) ->> -endobj - -4851 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [107.86602 297.10602 118.86602 310.768] - /Border [0 0 0] - /Dest 4478 0 R - /F 4 - /StructParent 150 - /Contents (22) ->> -endobj - -4852 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4366 0 R - /f4 4372 0 R - /f5 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 151 - /Tabs /S - /Parent 1 0 R - /Contents 4853 0 R - /Annots [4850 0 R 4851 0 R] ->> -endobj - -4853 0 obj -<< - /Length 5365 - /Filter /FlateDecode ->> -stream -xœÅ=ks·‘ßù+†GÉ �ÄûQåSN~ÈÖÕ9åĬûbûEKŽRç•�YW]þýÕìÎÌ�nìÌ0þ¢w1@£Ñ/ôkn_>îß¿»ØwŸ|rÑu·/÷ûû‡¿½ý±ûîöîÃ/?ô_}ûë›ý?yÛÝ~õöþÇ·�ýWw‡¿¿¹ÿéýî~ÿþÃîâÅ‹îÓÏ?»øâëÏ.n¿ýå~7Ìöõg¯?ïäøëÿ^¨Nv²»Q]�"z¯llÚDÛ=ü|qû »‡\ÈOï.dw÷xqûNvJuwïN÷w?_|÷û凜ßKíŸ�Ç¿Œ›ÿ%6æøíåð‡Îï¿‘WÃOþº»Q2 -«eòÝa½ÃïÝugåñïñAú±nøRjUŸbZsÏ(8Õi&igÀ§ ´Ë'–{–ío˜Àèb eÈmý×Ë&c¯;=.1ž „,:í�^¢Çùˆ)Äê¥Ñ“>Ö„÷G{º|ž#X¤dÜÕ4ãáá›�ƒç/+„œ_µ– þä�Î襱†—Ç+ -5¸ËpMB¸Æ:/t4¦…k4kÛ Ÿã©N§;ƒvÏÞ=1‡‘�J$ë›Àl1ÁÊÓ›I­RgÜYÓ ÜÞ°‹µÓZ¯¹·ùT/ö¿ÞÿÏÝÛÿÛwŸ¼úâÕ+)_~þbœ˜A¸Ýp4ÿþŒ‚V“b6X¡ô*×dÞ½…ª hœŸÎ øNêP¼Gn. úÏ¿ _… <0“¼É%á_4™X€*cXâMi”Œâå9K‡†ò^xg„÷‹<‡å_1W<…]2SR¯\ýHW/ñŒÊ�ÕAilêÔD&œôSFÒ“vÂ8™Ê€¬{»efrål3Ü2fÎ̯y°Š¦ª{õ Û{ýeïL 4‚vüý«þŸ×,G8’#¬RÚ§ãOrÄòÕ�ñ'¯öŒ,ýR>¹în´Â…ñÀøuëÀ=ýV…í²Æ_ØXÌwèṄÆ�ažŠsÀÑÍlY>û%´Ê±S\Ⱥ;én‹|€ˆÇŒ`8Î$ïi/Œ]å<:²Féœ8ë©f~½.wéÇ7ð™5åZÖß�y�ÔÕ(�#)�•>ʧ“lj¤‰å«OAk½5ZÇ8¡ÑɘTÅíW• ý­6ù:‹éκMÓð#! lÁ:W ,õ�Ïiã¯á Ó”c.Mi˜Ñ„ŸÇðhHYCñäÐÛ!ãôűT‡�ÏJòvMpíoq»ÖŠ’1®ÿŸŠÖ¬V<ÈÁ½žŸ‡R"Èhg¢%^ �“,�†Ôa}šx�”´K\-ñ Ò°’>qŽÉW.‡‹ß*^&™Nã…ÎÍA©… ¡T¸cñ²Ü_ÍÉ"MrwtÂ8oÝjîwþ¬âé'TÚ™¸¶È6ÿH{ -w<Âå´‰“|hW Ÿªcšsuœ·"¦¹:ßK3†±dFvÑdføè§Rgi:>ФµÒàÁaˆ2ÔÐñ %štXÓµƒÃgòhÌ¥§µ!ô:¬ÇM‰pŸº'F™DJ)H¿“¢"ã²Ìei�Ųyzí%nIÙ¬A‘Gç€Êrw³y¹ÓÇœgVŒv¡åô×f iÌ�f{‹Oç;çµP!˜ðTyCs"X­…T&=ùßàþ\Žjꪗ;åÈÉTë�H¦�ß ·áL³ æÇ~Æaïn{—i®Q–vgØußõÔãÔÂk×ÂÅ,þ ™IïœÚ¬Ër’EªÆ%êC•¸ÇµßŸ—B¥d�‚ÛÞèóÀbéØH@1C‹û{“¯Å�$Ž×=»Y‚÷®6í³ª+³\2£P4ŸÏÿFqüo¤1j«[¨‘jn”‚P/t‘‚Ä—…bÀ`6»qJxgÛöÔ.*TŠ$_ -üDEÌšORC4Xdò¯Ï¯Oa;iÍ�Ú’—ZÈ×�âÓôQ¹Îß‚0€Zž‚.ÈìU k°×c9V=m\¡dÜîú3¿5T HÍnÆq›QÚ gÃF»ÒGX°< –ñ°Ì°€K±f�*“„N�ð&hÿù¨Ûî£ ÎÉ9«Äk¸)qG‚�´Q":ÕFä=„=ÌŒÔV }X½z/B,f!j„•R»Õü7·<æÑÖÎ -õay)LR‹j7ëÿ‰[ÓßÚÅþj]çúº˜(Ÿ›îœpµ; eî€-gòAhïTØŽË T¼úsžÆÀ±jÅè T_,Ӳݽ8<ËZ‚­B -QhcT#‘¢ç!{Êai{7²ÔOû¶�;äÉ�ÍCbM‡ñh†ëÞèã…Žƒ¯ò‘=>L(cû¼ÂU„ŒxF"êÙI®Eñ ywÆ2«a¢Å18.†a¥¬õÈBteáXÖŸ2+CfŽcCɨæ•GfóôÀc)“Ò^(§Šò`ºŠêTé„Í‘é§[ºD*S¬0ÆXNîOé&]V2åR³ª¬©A{–˜[P/”íë -Zί)„SœÄAhàw~8¶Å ÖóS©Ý² rtÞ‡­­_A5#ÛÅYMáZ -£GoÈ!H;θkAä¹^)8QÅ+Å[ jêIZû-Šê=é\0ʈ�Œ\“ä½Ä�×Wë Q¤4I3s^�x¹Þ)tÞÀe�øÈæÅjX¥#:ÿälΕ3èS «‡Ñ nÓê­®8ëÒ[�‹r#§ÔZWuE-…Øc vÚHÔxSpMLæº(b�ËÆbö‘ Ô¹�ÀöõF˜‚ÙD4± -í¶n@;…J-’“©iL쳿‘ÑÇ€¹2úÌW+“ÝÍA@_ë¥ÊÈC°ãÖGïN(ë6Yÿ`Р] �0i¹õÑDäØ4Øà7AK†h{6'|LÛ€ðŽ3)RÉGÛ‹»˦%4h|A¡\”z=Ÿ3ëG4 Cω+ןrý›só#&•Šs€å ¨‹Wá‚ÝÞ$‘×ù§â’G»Y¢aT8êIߌuÖù·Z!Ð3‰®õ—¶�™ÚšÙ,Ëw¥’YhH…)u®Å[dàAÍ -)$ÎÞ5Ç^ñÞ¨ZVN;í�–"i$èè…õË}ÿOØÃ¨þVµO'ßUN[t4MÓÉ.ŒÏëk�Ó) ‚I´;̇á‘ã¬Þd°XËà„ƒ`fYžд4ƒ¶6—x\ÿÄêj“aìÀþ §�Mˆ¯ð••)ÑàVsE$Ýû:hår÷¾Æ#Bs¥ÀêŠ ��‚»§Wû NbT‹HÁ(¶˜ŠŸI†fÇsƒd¢ºÎ?O¤™E~qR8 ÌùÚ—õé¡ EµE)Á - ëûò€VÖªgN�âRòpÌ‘ÑG`ز 8XÚSÏs+·o+…oy±DsçîèH�áRS_!´€O"D/Õª* -l"æü‹áçvX‚Ï7¥ ¯$aD#X‰æM#óæ8 ã1 \Ì™m¨5¬Â!�“ïo}Úë.XÑ#±’�Å0ŽütU›ÿkÑÇ O -ë„�:­I)˜G®VM²5F(m¼>ej”E3å(Æp¯Ì\¤%bìUDƒˆHF¹ÞŽ1Âf$ML8¾'¤5.xɘ-v¸Á/`‹Ú|k -¾éÿy9½�F”¡0ºÊ©qrxðc¥ Ñ’¤ÍÝ6Ù<ˆH¾õõÐö§Mårî=+¯+ùÆ”[ x <’qGÙ¬õ|tõM�šJ‘hm„ÎæåÆØœX¤•Æ%©Ö4ç"ÞPÞœb£PÉêÉ0}3óK,mÖ æœ/Ž+ÑÖ&`¡^»Í ‘Ã3±ÿ'MÿŒª¡9}(¢]ªBQõ][N©õ%×–¥¶Ü«O !tAXj¥§.ý)Ü:ŸYÁ�ÑÜ1Sü`ªF�&û.Qò]$ýyA‰,P)ŸÂº«bžûé¨$Û·IV¶ÁãWŽÅ3{ŠZ…<¬˜Eb®ÞT›á¼‹H9ý. |4ß5zéuò¼"ŒSKĬ|]Y9åºü'—¸[Ñ˾zÎ4P«.r‰|S­ŠVHcW\äZ|l¾¯‰ËLkôL`Nxî%ÖÓÎÌ8Áø–Û!|Æ;âÁ¬Äþø/-º« b䣓%ÁWãá;Åb±ù Xjy¤‰ËG½�'úιè-˜#},þi¢1DßDúL2Þs,þhŠ~4ý3Ï‘>ÙDŽ„Å{¬NÂyµÏâdžVM à -Õ³¦x¾l -’ ñÞØ†á,±¤_\)L Û–4VÊÔÀoØ2þž0m„ÖIŸ‘‹\<Ó"íŠupEV@ýz+`³7g2�´ÒB -÷;�a0õ ⾬ÄEK$«ÙÛA˜¤² ·¦aÁÚó[FJPSÁx)rñkÁîS;s‹œÜ ÝáÊyÔ·À¹Ê•NX¼:Íβâც=ó6ÓVÒ­`J&ãës5�"·»öÖP`oƒ8áðíTNßÞ& -K[XF0ÔÇßðŠÖan C�{VORô|*…ÇÀ¤G\Y#¤]çÙ[�ò6D@RASÿ1Ý0;½¥0®¯«"Ãføþ–ëÀi°›a¹£âÀ¹‰ÒF¤³Žª7Eðä×#²&mæäyŸýÀ@5¨ÐJÓRÒ‡—E „yî`Ü Lí-uŽ‘†LùeA?óÌ»]³ô k'•N}õÔ:é¨ žÐèâÊ{1Z3¡¬°É™Ø´æbœóM–ŒY„8`ÚÅe”Vù·yÓžIÂ�)y�9xÓÊïÀ—Y„lôOS€OÍv»Q}áHè߸a£Ù€f¾šQ}2B'*É©xxîô’šÿÉ|Æp%з̞D¢~œºÀdÂëqÑ£±Ûn¬×ò+kà·§û)Iq”AÛÖtD]£üçÊ.H¡­OÃ&LØe4dªœ·È/Â<ÓùCó›ÏIÍœ%µ&·�ƒéü*x³‹P=˜�/³[À Gº†‰Ç1íýMÊ:¡“±E„Õ4.Ó V"¹3N¤(a9žŽëH-¤_çÉljÊÇ_—m_œ�Œ -LR FÛ×ÌÂì/jÖ,ÔP¨Yž[ }›ã�¿sN¥PñHôÆS¬?fŒ»ºî`Ë݈¿E¥ Y¥OK *Þ ­ð�SÁ‚VMàž±œ†…‘¬SÂj¥š8�±–?ÊT‹q‰Æ‡|F9í¶á~”êÉ ‹›šUg ’(oƒ`Ë/÷ïßÝ?ìÇd˜ýþþáooì¾»ýôÃ~ÿáçúo¿ýõÍþŸ¿¼ín_}ø°ûØuwøû›ûŸÞïî÷ï?ì0#> -endobj - -4855 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [467.71432 582.3314 518.84344 595.9934] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 153 - /Contents (Section 3.2) ->> -endobj - -4856 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [407.13937 469.5504 452.5994 483.2124] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 154 - /Contents (Section 3) ->> -endobj - -4857 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [468.31793 414.9024 519.39343 428.5644] - /Border [0 0 0] - /Dest (subsec:core-impl) - /F 4 - /StructParent 155 - /Contents (Section 4.1) ->> -endobj - -4858 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [465.84985 401.2404 519.39343 414.9024] - /Border [0 0 0] - /Dest (subsec:loader-hmr) - /F 4 - /StructParent 156 - /Contents (Section 4.2) ->> -endobj - -4859 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [213.6029 373.9164 267.18137 387.5784] - /Border [0 0 0] - /Dest (subsec:koishi) - /F 4 - /StructParent 157 - /Contents (Section 4.3) ->> -endobj - -4860 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 299.3614 107.09487 313.02338] - /Border [0 0 0] - /Dest 4505 0 R - /F 4 - /StructParent 158 - /Contents (Table 1) ->> -endobj - -4861 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [184.06622 210.58942 235.26276 224.2514] - /Border [0 0 0] - /Dest (subsec:component-lifecycle) - /F 4 - /StructParent 159 - /Contents (Section 3.3) ->> -endobj - -4862 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [218.00346 155.9414 281.07553 169.6034] - /Border [0 0 0] - /Dest 4506 0 R - /F 4 - /StructParent 160 - /Contents (Definition 25) ->> -endobj - -4863 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [489.91193 128.61737 524.4094 142.27942] - /Border [0 0 0] - /Dest 4505 0 R - /F 4 - /StructParent 161 - /Contents (Table 1) ->> -endobj - -4864 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4378 0 R - /f4 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 162 - /Tabs /S - /Parent 1 0 R - /Contents 4865 0 R - /Annots [4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R] ->> -endobj - -4865 0 obj -<< - /Length 5456 - /Filter /FlateDecode ->> -stream -xœÍÙr·ñ�_14eÇ«„ ¨"ÛºRvâÄ|³ý@Ò¤­TL)ô:ÿ}j¸;3@£ÑÀì ¥<Ä -I Ðè }¡qöìnûææâjÛ=yrÔug϶ۋ«Ÿ®è¾=;ûîûþWßüz¹ýíÝuwöêúâ‡ë»þWç÷?}ñã›Û‹í›··GOŸvŸ}ñùÑó¯>?:ûæÝÅí~¶¯>ýELJ¿þûHt¼ãÝ©ègÞZ¡;§“Êëîê磳+Þ]ýrÄ»_®n�>;?âÝùÝÑÙ ï„èÎo¦�ûÎ>úöÓï8çßqiïÿ½Ûý¤Lü7É®úßõÿ³›îT¦%¶&2éGè %6Ý©0û/“ÅÐñû¥~Þtãç\‰vMA禡í¥öãe>¤¶×d(×)š† LGL5 Þï…^w¬7�ä#ö먔”#å°Ìóø³œEÅ 15†)Ç¥8¾ÃÝÏݦÓÃˆí¦“ãtRlº°qRÆGˆ¶ª6�à)TÇûMöº§æº=š(oé8çSÚ(Qàh˜ø[s$ˆZu+£f¦5ɉQ9�®(,1ŒèôÚ8k„¿Kr“"0ßôAø©ˆ¨"O).˜6r�ˆÞEL5j›A êÁ‰»ÇÅ1ÂîÞ3˹'ùŒ©qNfw”ôW­"t¹Cùé¤4ç=º~7­ ØŸB'Ôú£>ËÆ¦Zënù’àHÌF'§I�Á’¬@HL¹ÌºO G5òTF²A í¹þ²ïuéÕ”ôZï˜ |±ônP§$•ÎÌ%è·ç ÓJ ½ìNgi=ƒ�Õž’Ôm:‹8"éJœÖà¬QyÍV .0™€rÊZˆVïSMæ©)Š_ØÃd7Ä`>~Db¨>Â]’Âvr÷nîÎññ<§WÂ̧ñoŽ�ÚW„Þ�Bï4rQioŠ\æb>òIè‡ 0ßbâ[Ò)‰ü¯{Œ<Ž8 UÉ·`¾â©…pDdBç¶Àr \†°×4/Etˆ5sUbfÊI$ǰ >ÍèÇð:ʪ¾¡¥|Ck³vAxäËÝ~'&>ClÏø˜’3#œ³}3:äæ­+­üÔÿj’ ãŸäÉ–A j0j¦)–oZýi°“§2¾öÕØEÈWˆäs§XÀLçå\4¤&±Eƒ·´a3.PtGWš3Η�€>Ì2™‘a-S!?à뎴óÐÑeû„ô§²Á3Ò7Èa–\r@€rJYDX‡?ŽQ”,ˆŠ8—!`Öù™†§c!É@ d$È*ÊÊéœ%ññ³ScŸô`½¯�+c!>äG±‰Œ/@3WÒ=)éÒ2¥—Ä’òìJ‹)˜D3ñW+ÌŒgª¬eÒ…°�¼ý1ù$Ç?�Ó¤ÞfHá.ûL`‘¶ Ì-eí8Évµêi‚ÀÃÙAŒ Äž±ðøÒ-Ö|H:^Gfaa¤,G 2 u“X$b@�FG2jÊ ÊÀHÉœ‚TñLÏ®¶¿^üëüú¿ÛîÉ‹ç/^pþì‹§ÃÄ­1�ÚmºóÞÃHäjÉ¢ +$³~I ­ñ‰ÅÑs´2º- W£ÜpòÅŒ gÄcñÅ=%>™(~rˆYã$ÐpÌÇùè]˜?wÁô�âpÈo’Ž)¦ë½¬–0`5 Ê[æ� j ¹à‘çÚ” ûk¶ =�ÒÛꆰŒ´V�)i•\¾¡WUi³2Y�Ìœz¤ú£†-29hB`\x­–«EXv•5² |{ Á¸p:OÓ"qílì<㌷g`•²&K±ŠBø§Ÿ`šW5KÓI‚ºu[Ä`Œûã9IQ ó Û";4`|YàÅŽÍa¡k¢`1Ÿ²FÑÏ¿]T1 Ȥ£ñ†)cµy?¬X¤ìhÎ<êÝÇ”ËÅ€¬pÎuùç„ý– ®ØoÙxTôŽ«fİ7YD“X`^_  ‡WÉ”ffãPê÷t(BQ7Ô°œ ¶Ž9¡•\E(±ÔÀ6"K� UÝ–!2Â3¯•^CÑ@c­È6N0²óíÀG…"»ö8G Õ€ÖL9®ì’8GvêP$΋çK¡ÕªTŒCV(Y¨_÷ £è†s&•£Ô©è„*£q ¾«Â�…-½cB¬G&R—±�#b DäIqp¢ÍEÊä{{@û6‘Ï[ µ.™Þ|LGM’’ÚqI}ÔnÕ.�Pš*²%Etí$3άvɯ‚A1'ƒŒtJ¦´šâãùD©à¦ª®dðN Õp§úÿûåÅí�ݧ׷‘ &�’-ˆ”5Dª˜­„MŠ4�ª©»g IÁ™´\ŠKÒ¥^£Š}†_ó'b1¢�€Q«¼‚”Ê®=�, Ãhö'Jô>�¤]�ühÄ�;&TPn ¹?(5vVÍRK,È �d&„U´W� 0_µ8ª¦šJöÚ¢P ´&#Úx„Ò`íÎÇ$ØY¼é - -qÅ™è£GÉ�j†hz©Ü -Xv8žcùÏ^èQ7Ð2F7Ú×Î#iúboT ÙkRâyÜ ´4ÜjObI  |?O…Ñ�“ÌPÒ1¤‘k0;ÊXÑ.¬—‰¨²A*«Uõ£L‡Õ+Ì»>˜öH¦Cn�4Ü‹%}­ “F¬QÌHW³A�Ý`ÄZÁŒ”**miОQd¢µq“=Ní^^½=t”}˜Ž…Wˆó6!ÔlI®4÷&œ`ªPHp:-ŠÔ*¤s¼œV>‰O­“,öa�IuKgáf*ä*pr—ÖÿÇ'º8öÏqx· ™å¥Ûºdµ7äÉÞš {¸h%˜ñaEÃ'ñ9ŽË÷*1ßDs&‚µ¦­ÓJ#0 -M÷¤ £7hñc¸!K Fv+¿&÷AõS*ÀPºU„ƒg‘ 5xéϬ>å-Ò[+_†-£¡X3]LÊåè§k±†'K‘aD>=˜e�8Š…Ë43—Ì‘ªÐKªr™úQ¹¬È=- Ò-RQ »·™ Ú0ç¸S°„& Km‹ò¾'Ää¥.@ÙÀÓl­ §0fñ–TQ½ô]-G^\¹~™)‡‡hu‘”+¾N@õÅÇÅï_NÞÜ«™ ¶Ûûºæúj!˜�Ê»©ªº¾Iˆ?qk÷÷³� fÍÔ8å÷¿�‚'\VQ€ Æ�Ñr ]‚Ѷ -¡³ž)á‚ZªC*›Ò]œÍ¨AWX4͈ÀTPz… M"R„¬~Ð\3i—Å>WÓ·iœÔíÚæ¨æ(<ø áo¾y ŒžU¸\ØÓ}Ri,ͨEÉoCŽÿëò -/ãÌá«ÃéUãÚPSÔÊY&¹·²…‡ç)êþ¾Òømò•lc÷ÓÍ Ês€ïÀ\ ]E½ÿ¥ÒÆ2!‚T«È0Fé*X˜ß¬­a^oVë äPº�Hi7ä;µ¤ÕöÒ=5«mMZü*pfù’5ÖË$ -Ç)&¬t­•ìép¼ˆ­8|F»Dr�Ý~NAWB:^Ú`ñC`M‹F\JA„%kSÇ{Iäp"à™gXßG�qviÉL˜Î«×¥ÕîÏ' §ºÖŽÊ×dš¼SÓh¡/€}¨fÑk'Nû²g�ÎÛ¾«B¥üÉ�×phªÅ4Î0'…v-¥ ƒ�’Ó{,šÉd¬3æÜH®˜W=.Ö <‚Ýúù�¹(R(f¹ «@uÐñ�îb:¾«Uót¤uLx¡š¸¡õìΠ�¡ŠO½(sKã5©Ù½ sù[µ‡2 Ïw�Væe¿‡E~ƒ·5Ãf>Ø=Ñd-±²ªïµ±L“·W�e¥ã)pGQ1»jI°!Óè}]×d³JA¢c, Nå¥^"l0%ȵàB*qa"l8×îÿžTfJ(åùt_ù‘¾ºI²4WqÉ”_ô…ä›ÎƒFŸÈ]ø�òvÌH±[ ’ÌÉÜ1ú{Ì+À¾—ýªn€Í\e‹ëò_Wëoúñª$ ñd`p¤–%޲ûƒùo•âË–] — H†áD ÑLÁ¡e“n¢ÃI}U€ÐËÂIËžÑTú¾[6ò`6}±«—Ôl‰ûºïþ¹•´Î7¯s‚kÌï¯a1ß_x͸µR®‚öCŠ0Ò�éö ‹–”(ä•ή°Ÿ(Ø“ù§\lÓ°D9Ú’Ð.b¼Õd¸öPe‹ÆÍoÛåÓÌ©1™QÁ˜-ÔZ깪À[”טœ C‰Ð»’‹úIRMIˆn­MOCˆ–— 36Þk)}½$ù„x&ÂV{原-Cfð•ó<Œðñ¾Ó…VÞºéÃä™ç�¬Ô¦!&}ƒÒ‡ºGN�R¿¿SS dM˜ð–ÉEÏt?‰j/;b‘<¡4 NYÙ²±Jdò“â‘G�=˜Æ"¶‰ß�‰}mGXHMÏŒá"¬Aª{n3²?Tëu‡…)$·ÌoM TšÊ¯ÜU’+«Å’B2掠ˑòªˆ™J± ÜrÏ.›Q™k]B°ˆ‰–imŒ}ߟÙwq�µj½;ÌTN÷BÜ~0¹À|$åãN½X.z}Z Ì«QÞ3¼i’̹ïIAÆ´x{¤†°3¶B«ý�ÀF×#Ÿ€ü?ˆ3ƒÔes¦ÄÑv¹ë3ê^˵ -ÝZ^–†=j;ÀL! ³Z«Ð¶‡õTÉ`v‚>ÜûÑã�Øê{±¨ýà“’»]bÉq’ItkL:üÀ§Ãášè…=WKgÛE›9ͪâbùÏáIú#WÍᇄÀ‘&d”Ìt=ü¹;�ÞZVœ©>²ò~%,KÉW�G_6tޝ‚ù’¥¸ô%Qö±cÛB.ò´èuÚ%¹¨TèÈ{[†y©ùP®r ²€ÓÐÝïÊ»&HÏï”á_å=ó²QU;Íã­Â=ã\i»©Ø„†S¬WYÓíB¸õ]yKýÃLcéãÎµÂæ^µÐ'½…G5vKÏ>«%óÒèsaïJö•g/Tf3”baÈV,pš¯57rJëUõμ¥:Ö‘ø!ZÖy²�¸Ð†)¾0¡8?ZèóŽ÷-}™?û «–Ê®‘•.�Ýl•…v×X ½)--3Jê6â¬i�7# d(WQóžïó˜%ƒaš;¾Ûa«Žs‚׌aÛàÒ$\!ÁñåˆöÄ¿U0ѧÀ•gV™>Ö»}y¨c¹HÞCzºI?S—šŸ�>$ºP›ßZ&ò½ kb­¦/U+ñ‚¢®,á®H6ÉP^ /C -%˜Õån÷j ²:Zdcú{Ûêd$óqmuÌ€èMXîûÕ¥gAö- ©åsÅõÿS[³úØ©urùî¿»­-�z�3£í -ËÿT[;˜BÓ]¬±ù›Êò‚£Q8.úGïÚ˜ñ�Óýà ž+�º&©†l6ZGÓvš3§¥ôKpø„óðüi ƒ˜:0ÅyÛòío†Ä¸›¥¡ý©àh† ˜ý{d ›ª^;ÓÖð9œ±|ŒŸÔ«C�†”éßu²a9Irk%£™ºÌå bÛäÓ£½þ�þ1-–L‚8æ"õ -ðŠ»^E; Ã$7Mò÷@uù¨±tløYßz ´¯õ½ß²”“§Kì”Ö>° DPk¨¹ýd KU;ÊîIs¡�×`a -N×õ�Ÿ=×bIà#{: s_°{[¥·âAü å^�«Š¶ü�= EÊÃÞÑO=K6€SŸÝmßÜ\\m‡0Üv{qõÓõÝ·gŸ½Ýnßþü}ÿÛo~½Üþöîº;{ñöíöú®ÿÕùýÏ__üøæöbûæí-ß�L(ç;#XÆ„¼5xt°Uîÿ”]4� -endstream -endobj - -4866 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [180.62326 741.2904 222.00327 753.6004] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 163 - /Contents (Section 3) ->> -endobj - -4867 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [463.0277 515.1334 524.4094 528.7954] - /Border [0 0 0] - /Dest (subsubsec:effect-api) - /F 4 - /StructParent 164 - /Contents (Section 4.1.1) ->> -endobj - -4868 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [464.3611 501.4714 524.4094 515.1334] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 165 - /Contents (Section 4.1.2) ->> -endobj - -4869 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [229.18156 487.8094 288.63504 501.4714] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 166 - /Contents (Section 4.1.3) ->> -endobj - -4870 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 474.1474 130.69514 487.8094] - /Border [0 0 0] - /Dest (subsubsec:context-access) - /F 4 - /StructParent 167 - /Contents (Section 4.1.4) ->> -endobj - -4871 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [263.94278 415.8344 316.6733 429.4964] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 168 - /Contents (Section 3.1) ->> -endobj - -4872 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [346.99957 361.1864 411.01254 374.8484] - /Border [0 0 0] - /Dest 4507 0 R - /F 4 - /StructParent 169 - /Contents (Definition 23) ->> -endobj - -4873 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 286.07642 146.54327 299.7384] - /Border [0 0 0] - /Dest 4508 0 R - /F 4 - /StructParent 170 - /Contents (Algorithm 1) ->> -endobj - -4874 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4384 0 R - /f2 4378 0 R - /f3 4360 0 R - /f4 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 171 - /Tabs /S - /Parent 1 0 R - /Contents 4875 0 R - /Annots [4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R 4873 0 R] ->> -endobj - -4875 0 obj -<< - /Length 5323 - /Filter /FlateDecode ->> -stream -xœÍ]K“·‘¾÷¯(Z¶W-‰9‰7`kå i[Ô®©ÐîLìEÔaH‘7Ä¡vܲÃÿ~]]ÕTõhR<̰{ª�‰DâC¾\=º?¼y}ûòÐ|þù®i®·/|õ}óíÕÍ»Ÿ¿‹_]ÿòâð¯Ÿ_5WO_Ý~ÿê>~usüüÍíoînoÞÝí¾ø¢yüç'»¿<{²»ê[|üìÉîÿv¢Á›‡¢J€÷JºÆ)¨Q7/ßî®^bóäz‡Íõ“¯wºùçN7Ïvñ�·;¥ hl~Ú]ïþ‹§`½’¶qÆ‚7$?¢–P0Æ€ÑË)\ÿ|{w’ù³'_ý¹Áø¿¿ÝÞýÐ|üênß tHZ#`+>­ñ½üû›¿¿¼Û=¾Ùass¿»z��ÀææõùíøëæíîÛ�Ÿ#â§ñÇUüñ%¶¿Ñœ~ë}óP™æøàs”Ý×2þ¶ûïš›ÿØýåfª‚bÜ#Xy•µŒ?¿O™V¶ý-Üñ÷!éÊ]üù‡øã#ŽmÉ _J ˆ+…ì‚Û77ÿ[`E±¬h ·'ªVT/ö�ì‡\œ„*E"ìɧ»Nðûæ¡ÀîUt¥ñàFA—µ^�¢Ø[QüsDÁÈÞ� h0ê(n)Á•Å-GÑÿñ‘ú¢LÛ–‡Z²H[6¾4Òí~ލN#Î †£ø1”‘Ú×ð£ÊªwR <)›Q‘:|1œìí#OêwÒ0…û¦ÕIUÕñ¯Rp@ݽ’þnÛ}�áœIZlYØ÷<2Bóe —kðÿ0êHê\«BèÀ©%ê{$þ'†¸@Šº‘ ÑDê|ßk†]ƒÈEȸzNV�‚�y«À‡–¼‚Ì‚aè1;×£V(jŠ+i¢j¢cÍÅ”C—Ñm­rgô¿�g샒™ÞÃ�þþíð�Ç'?Iê<÷i˲ES”Çu°Ç£Þ˜’éçÓºxjô›Œ‚H^ê(uµ5Mÿ¾o:3®Ù7º[£ïsMˆ!«G¦q6PnÑäꪮ#]ÇÒ¶KÃ�åÓNè»-ŸQ÷.†Ôê)¬‡ Ì:)�°�£O.DN‚ÇMè£2äbäh» ¯ú‹ˆcƒ!¥4ÛT©ñÜjëïûÄUä´G<~þMÿ£ƒ­ä±ÏNïJÖ³åùê´Y£ Rq#A®‡Ú�ÂJ¶2 $¹YÏÉjY�.Ž `dË�ô¸Ú68Jä+Ê­é]œ"ïq`H°vªž“ÕC¶G0Ør°ÍÀÙÉ6z³¹Ä³y^æFksö9‘!°ú>Œ0§7]]š $”ããÿÚ9;þë¬í™E"äú5êAnŸ -Þ>ýªé(wS[ Ê -±Åd\†t© h¤CÁF±nyïj±.ˆÖé€à•þpX§4圠­¼Äm¬šÏi{é<©8š-sö -ÐK½z†£sÕ“#�Þ¹ ¼0v‹á[2;Ò.’sƒ 12ƒè=X[ôŒQ&¥•ï�jtÂb¤œ…‚v Rf„‰I½É¬µ+z>•Ì+ð2Δœ…1T­è{kqs²J8.ü_Ä•d7‡±Vßtci›“ïw"MNž+¶3d|^!Ø`6ê�%L‰ÊR¡Ÿ �˜>Xc+ìá^)³´÷©÷%Ç”sÏÓÎ2Žyºá~*ÔS”Xk�±!ç`‹J®UL–ÔBÕâ3jO.õ™å“̰ ŠMD†Õ‹­µÞÙny�Uí{ÆÄÄ(øè¬¯‡�ÄŠŽ¦¼ ›…Ï&¬yÔ`½ë£QyCk½Ü©ö¶õr3*3ŒÀüÝ/Ùá&묂 ¥ó[Œ÷2_&íF %•F ¹TX°N©õ=z:˜�”ÈqR -�ô‰Å¾òhÞÔyÁ3'QnNL�¬ÍtÕÊOA))ñgc‡&†(ãõü:«eï ˆàÖ(üÊhŒ… ‚ÕŽ -ªäë»=q–Ì\F-l™ª?Ô Iÿ 6ÖÕ €l<\øD¾¤/h, ´Â¬W£ßM Ù¬ø@͈'q‚‰IIÃÃ]�«]·ÑŒXPU:ƺJ œìdÑ³ËŸå „©¥�U⋨‚£Ì*k���ùJ©ãX´‹×³Þmš¹‚�OÓ³³­_5A!14;Íh{‘T8§ _ÞÌtleüì`¡`Õ†Þ`ªA l�Þü*0˜Üœ�$R«-´¿ Ìôési®i4š8kÅ1¹½øþ:o¹¥¡Q—T¯œ?©.©� tEts¼SÐT{Ø.ø\m61{a©¡?¢KšÑã§F`Z, õeRý‡Æy¢¬„�¦Õ³=±qÀÖXk -£VâñÓCl~0'YRÅKZ=11½Êz°Ö`šfª:�ëéšÃ)«KA£HÊj�B,Ÿ¹�6D;F‘£*vg89ô¾ -´´BÖà×°ÀÒG ­ 뇱w÷EÌœ{YNñçO±•ù 3‚s#$9¥qy+kòœ/D�Öj_#kQ—Y{+y,²’‚ ¦QÖƒò&”÷9ÀÎE&Fð%@ ¹ˆ¯º“bÉ£‘•ò „·—š+l|W�çü*m!„`Üz¾à<§Òg&×D{³ùӖγ yA¬…Òl°Î<ÍB1¨e¨¢ -aÞ”‘.­«Jÿºô0ì­`«l¢£W¥zc± ¤ÖO‡”)O-–AÛ§pµîyúüd”`½?Ò×à¤úxI¬|dLˆÈ˜vqí“>ÑXhðΙª‘©CLAyQS�1~˜ªz¶d -.'HBDNh*ÐÃ#}ð�#”0—×oú,fâ6hÑê·7¾X/x)§wpÁDÉÄÆÇÜýR ÿOV6dÍKÐàƒŒ¾š~Ž‘·Ñ ´Bn1Çî -:½ö„Òä%éMäËE@DSÙ½3Ù{ƒ»"˜v¦ŠêRߢ$¤;óø‹`3µ³îÔ™éKq@—NÊÉ:réóÅœW}ˆB–-eÁûUyà5 ð8ACpY€k°³›LQüÌr”¶5«ö“•!}G¬65B\¹øÐGZˆ~"} ‚;�j¾’�ÇÕ×*´U¨LA�ú°¤¨T�ŠKt€"ÈËyЏ”ó"4J‹¸6}{˜<òûÈƈ�R¼¿ 9Lð-¥c� —S¥Õ›‡ª¬ƒ¹‰wñÙ S^ …/Ó&ú­ª‰Ú†Å‘[d¦¤Ïs')´3@›’0Û—Ÿf…è+rjGÙx ‡½'¬… 1ÅV*�1H³mönØ+å@keôT°†QÊ!KªÆíÏȆN5‘ÝqH?•m,O™KCJ³öô—êº6èò³ì·R/'šÍ’TSæÉ·+*¢¨�KanØ‘:ð˜Öµâ@ÎVáô�€xkkoþ¥#]ƒ‡t²Ô¸FU0SÜ@ 0€±JË5†|•›o&I�&œ_«¹ú@vë… /µè�Ê�>€@¡übÑ}J^î<ÖYЈ.¿Þ72€´ˆÝÅ'ªè‹2´s<’k}÷ZÍÎøê†àŬ¢åq+e`HŸ*#!ë"Ƀ=g@]Î邤ygˆtñ°4lÕÈüÒãäÕ#J:pÒhµ�‚}4)õ×ûÆ&›'´HNÍ´ìM¶«ô-T¼ÖÞTuµè6r—© òžåXÔzú�Yúdv9h°Ú¸ ð ËåjDÖ9{14›2i7B®¥AÛ¹ P†Å˜æÈc¬Ÿ.E×G:Z-ÏÉð“…4‰H]I¾r«íÙÆ!Óbã±båFo²4ñ´ù ÇO2ÒdN‹M$—ßh³<ŒGß¶¢X¡ëXå—ÐŽ;Ç_&MŸ"¯ @¹­Ê1€TB™Ì»é�ŸÑe’xJ†J”ž¹Ú•}ç†dutÝÐÇêVöMn ¯�Z–ë* BÖèï鋸ãßã�?žÜGÓ÷¸×&£F‡*†Ó##_éÑýáÍëÛ—‡æñ³ · -¥ÒØ HÓ¼Ýaóðø¿ŸÿÓFE÷C�¿8}þq÷z= }£ÂÆë9š·Ão,(7$܃é�o& �g½ˆÿÿÛíÝÍǯîöÔ¢ã;^�ˆ ^ôÑ»P>+Êgr<çûa9œC$ý—WTUò`Kß®¤4]Û9îdѶ3ÈE¯j+è§ g¾žÇ :†}{r½ÃæúÉ×;Óüs§›gQå‡:†ÍO»kŽ@Üã{¢ ÄÛý�Øã?w¤t¦�MРõ<q×*œ‹¬ŠYÕ¾ìÛ�Õ6*œh/¶¯,8[K �Ä/IqÙLˆ¯WJçÔ¸qC|•øç7÷õŠ ÅüÆÇ“�rÁ|¯§J�ŽFbi -’æNOblC£9°‹…='^dªÑKÀ®3GºÐt²5«K{}\ñ¨Dš =5Â}¥¼j;XxÝ&§A”,YÑÓmŸ÷}bnnÙë NžÙà}TR�zÍË5žò‚³E%Љót˜«¥ñø>NOÝTYå‰Êq¦xyä&2�\y!‘n–’ UÜ<_ÁbáªG†¹‡JÐwšéäët{Iiö—ujF^‹vV³x~†ÅCJjÆÝ—"è‹ÄÎ:† -‚ þ -%[èÐð¤o#óàdmV)!y™0sèW"ìC—¼‡¬×+¤â‚ŒÓzuÅê•áÖØ³’ÅJÞÄêš½ÈþñìRÏB"/)ú„PÍ]íøÍY¡jñÃÇÙðܾ™éaf—(ú -/ÕŽ¬:’b�uq”B³oTvUà "‡¡$éj¤§õCßœéÀ}ÆšN®òb¯XçWOJȃ|à �Oaé†x£ùlç "G½5}Ž p£G^ &£ŠªµÒ›‚çq¡Ew¶_—4SÇTÎzò¢±ó¬�[$ƒ`¢ÓÓž×Öƒ`€�'ƒ�0FÚ±~Í …¾8LúV*,#u]G5èâ,+K'@œv­,©(Zw�#ïLÒ—“Al*áË�ä5gRz�®²'ë �¬›P3È_@Uãï›M†�?yÍÚ¿â¦f'”[ˆ_lZÕ‹ø•‡ì.`äuh«à¤v~•,£ª ä+¸{„Žz¾oÜ¢¯ Ý‘¿k[mAyÞ# -q¯çVk¯%ø]^®¿Æ‹[1Ã<ƈâŽçÒ, ¬ÄÜ 2�}/±93IµÞZ3LIõçÇð²£kh]Ëï…×J¾ ¡8üñª$µ<únøV‡é…pi^hþèox'ï>Ju^[ËsïS©ÆaŒýä—ìÇ®ò’'ï¥�ˆ8Û *pâx«ìl .¬âùPeìÈS[K†Bo{`ycD\„Ž‘í–W¨ô%fýZøR¥ræ1Lõ©Ê–ÝG‡ÃíË_}ß|{õøÝáðîíwñÛë_^þõó«æê¯ïÞ^ÝǯnŽŸ¿¹ýáÍÝíáÍ»;Ê2Þøá=S<ûˆ«r"¾ù’ï -endstream -endobj - -4876 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [406.7677 613.0534 470.17062 626.7154] - /Border [0 0 0] - /Dest 4509 0 R - /F 4 - /StructParent 172 - /Contents (Definition 22) ->> -endobj - -4877 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [311.19995 572.0674 370.8978 585.7294] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-iteration) - /F 4 - /StructParent 173 - /Contents (Section 3.3.2) ->> -endobj - -4878 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [197.09962 524.2814 261.27277 537.94336] - /Border [0 0 0] - /Dest 4510 0 R - /F 4 - /StructParent 174 - /Contents (Definition 21) ->> -endobj - -4879 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [408.45615 469.6334 468.06592 483.2954] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 175 - /Contents (Section 4.1.3) ->> -endobj - -4880 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [258.05804 397.6584 309.11444 411.3204] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 176 - /Contents (Section 3.2) ->> -endobj - -4881 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.88214 308.8864 134.90927 322.5484] - /Border [0 0 0] - /Dest 4511 0 R - /F 4 - /StructParent 177 - /Contents (Algorithm 2) ->> -endobj - -4882 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [363.2142 220.11438 415.47824 233.77643] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 178 - /Contents (Section 3.1) ->> -endobj - -4883 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [402.55 206.4524 463.17172 220.11438] - /Border [0 0 0] - /Dest 4511 0 R - /F 4 - /StructParent 179 - /Contents (Algorithm 2) ->> -endobj - -4884 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4354 0 R - /f3 4378 0 R - /f4 4372 0 R - /f5 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 180 - /Tabs /S - /Parent 1 0 R - /Contents 4885 0 R - /Annots [4876 0 R 4877 0 R 4878 0 R 4879 0 R 4880 0 R 4881 0 R 4882 0 R 4883 0 R] ->> -endobj - -4885 0 obj -<< - /Length 6976 - /Filter /FlateDecode ->> -stream -xœÕ=]s$5’ïþæÎi)•úŠ#ö–á‚áöbæöxð c`ƒéa½Þ¸Ø¡î®ê*U–RÕ*›½y»ÛUR*•ß™J]vwÿËíÍëûîÓO/ºîú³ûû›×?¿ù±ûîúå»ß~H_½øû«ûüö¦»~öææÇ7wé«—ûϺùé—ÝÍý/ïvøC÷ùO/¾|þôâzñóçO/þz¡;Õ©îJw^ApNSç­ƒ`u¯ß^\¿VÝë¿]¨îo¯wªS€¶{{¡º«ýo¿Ž~#kÀ’1ó/ŽŸ¾¸½øïV†A5*pº{;þFƒÖ㉇oÔô×ý›UiEDjÑÓ -ÜþŸï^<ýö‚ºç A{ìh ¸î׋â8L€JWN`5èP;¾Ù�ï¼cªÆOo׌­†± �bóØûo^üv³;ûó§_Ñ©žxÇtâz¤�FœÓÉç//T÷òîâúVu¡{y{z7ýxùöâ»�¿WJ}øÿò‡îå^|ù²+B3@h=l jY(´*€¡Œ>üTtüœ~WŸ¿t|ÈÁg,:mkàÓ ð}ªÔgöÝË¿&7Üä´br 9ÊíÞíÿ¿¼ìÐvŸ¾yïðš &÷újô÷³nüóƒñ÷O~rÙ¡:Ž¿Ï¿ìY펃4¼jÜ‘=d\–·Är³“òÑëqK¬¢¿ì®t�7eh´c -÷?“P抜޼jæt¥�†O¿}s³û©ûøÍî²Ìø'2› -%Dú)ù¢S^O¬ -÷?oÓÿ÷€öãEªã ÒR·º ÁÇÊÕÕ’ N×qoß+c'«î¿?1¯H4±H4Ú†V¢!Q;(‘dÌ�dLç5��-$s"…¡½ :¢Q{dV£Ù6'Bù¢F®jqÍÞ,Ù× “ÝU¯®�Àª:îÒœbDM u%tK8P,¨M²P;pµàˆ²¬ßj5Jy•ب»4·Œ<[dl•<…Vƾ�pe^V -´oã’�¹Ãs;šöf‡ p‹!¨Y}âWÌ^-TÌezòãÓî¨EDl•‡ ˆZiL47PiÌ Þ*ã°†~n-Û“Ý]vÔã²§8_íy°ŠÄEðt@¢ ~ É!ëùø5Ó· -Y4¢F -X �l1ž<”9+½)y_k ë£(Á´â.ç×÷V„°¨œGPÍοLáe%�ÇU‘?ë,dôE$Z®Ù¯’i-)gÄWã½ �]¦ÿŸœïzT ¾¸ j‰*WÔsaµ†_1ûCºnýÛ/ǶÛ"ikŒ.R<ÐÍNa��•ùgñÓßÙö6|DÏôÄ%CûPÄ%BΩ´àû0µv |�4š.Êê$¯2aÑ]‘…¨´�4•Ô'—|ºÒã÷ÕâÆpªPATCÕÒL TìÊ«ÌÖÞCüaoxW̪͠!Ƥ57Ø -íI &,.èÐžÖøaŒNYÏ2âv¯ 2—¦žIÒS=�-á¿Ì¬‹ÁãGÆy$ýà¡ø8Á¨ÇŽXÏ®#÷a6þW"ápöŠ P“sU”“dë¢IÿgÁž7œ©bBë�ó�ÔÏÄXœÞƒ/f{¦ÑZW§Pâ\SšÍiÚÇhÎl׈!Îæ ¥À;ôn –ÞUgW8 OÊ�wÞo œ(ÿ*c³)s Ÿ{Ò?<÷-ÇWÚÔ¦ ˆójÉïÃ'7Xß³5’e~âž6c¹0(ìLÁ�d™´vÎø -œB í¨AmH’Ýx�sq¨ìegä�ÉÌ�˜�ˆSÚ¹cQ6�ý1  Rxù¡»™ò9)xfH£ÆÛ9U½U& ©¤ŠËXˆ¿7¨Žh[Æ÷àQŸ§qÌdÁÐduà“Å)¾™€À2ÄØÇÿçØ¨Ñd(Sr†T{Ý™,+6¹h<�ísÚ71â@T’#6ð–šäHŽ�K™œry},ŸX‹_;ðˆJ׬@4ø<Ô›özº9¨C¬‰OP#šv=¢Ôà5y‹3‰bO$tWzA’û³z 3 d”«1¸+O:ÕóMYjWc�=>}'gá(3YÂIî â%XK¶ƒ°‡‰eFÅ='5¹Ív6éñšU¿ÇU#/2³ýâ”=³KÖxXØÔX}B‡|Qnz * -Á3!‚2Ñ„=‚™¨ù‘ÊÕ"™Ðq‘˜Y‰}¥ê!�°æÏW(âƒÃ÷Af˜^™ä„YvX\ÙÉúâh:Ë2Ÿ4×Ä$ª!óͰkãCĺÙZƒŽ1Ú-í˜cK^[¶0ˆðô[•Çúꉋ¢íkûðlòà¶œ‹o"�Qž\ à‚ÍѤ{µ82vkÀcÝ~Tà£÷5ÐCßHE•¬WŽÈÄöÙ¥°”åüb2>—h*‚ -–=,e9;›R`:Ô‘z+Ï%¬pF2Q‡qFcylÉ;ÊdË Ö3óñ,ùÊh.i_\Q�;]Q¼B�çÎÛà�yóf¯ ÇþÜI¹UH±mÃÔ%›”Rj¤ÅëÑÌV\E�˜±ÏrZÆOâ‡÷Õ q5zoÌ$pØŠ›âzÈt¹îSaå`s܉›~²_��bNóWkPÄêiE@>šmv¯ÑÇv¬F6 -¢‹Ö·lâ¾'‚|uº”Pµ”àmÔÝï¤o�žˆŠ�†ÿæì/WØ9¶FŒ˜”OªXCU"R[†Œ/:ÌSTú+OÖ™‚Yx‹qêÕÏËþ˜7«tla´3 T0ÛÕ–™lÇY8F)P‘=ñ›Ï…ü© -—Ó0ì„=éŒvwn8�B‡X½ÊãèÙxÓzÆ�‚ Žö®†§)•¥ À²?3ñxTL#FC©òñ³,êmÑbCF5e¾VVÛÌmºý²µ…ˆÆ†>Ÿ¿Ú\$� -Vd#Î΃V†l Ž–¼�ÌRfégãÍ@)9ÎÍ›W�wl¥eô btØÉ©ñœ†N¶­¸:Î`C§=¦@ëêžeáT)ðÌ,n}"a>H6ÍXv�‘\*ní¤’¬I ÄPGê²úÎÌäž)E.ÊRÏFŠ´ò6à‚Ìò®Ð®¸Å”Éä—QN†Û,Ê<­K¬ÏVz,*/mÀmâñµÃyÕBÒ³®ÊC´H¾Ü:òˆP+í§ÔÁçkÀæ,QmDcTÜËí¬Çæ­]ê` >n‹'³gëÎ�Í™w6'ÎÍÞyéÆü5•QÂB–0?6“1g`̹å,jIîT” -:æH¤yBU˜ož§ò cÅæ+Îè^p³äxa™œ|žmí$ŸùÉˆÌæ™d‰‘Š\Š¢tŒ¡>‚[{îh1%y¥À8C‘ÂW‹…Où“ ^íü±�OÉÉølK//Œ<)ƒÆ!‰¥ˆ]vËfäKf>È•l Äÿa5Q²ÕÙ¤Áª¨±†*WѳYfÀFKn &Z".ú·L¬uŸÑF¡0”xYò—lÊÙÈúܺ+àzoßÇ¢  6ä/Êy¼c·¡ñwB¦¨»²ˆ”îA ƒæ³4V(K]b8QAÞ¹š}hMl(ç¢� �Ãvšš(�ÙF±\ DÃÿuj\ö2&?MÇ [< -te7WÅ/Y7qf£.D] —ö¡æìÔldÖ¤œÓAKø%=mò.9ÿ …Ík,•½ëÑ(…†<œž,•è•ÉäpF ËÇy@X”-³ËÈ'›¿ýêÚºÀ&ØÒéð�NjUÐH±(çK!iØÆÁ€ÒÎÛŽ¼—Š#Î=¨ö?Òülû»@iR¾yù)H"AÀ¹n Bˆu”™ôI‰\TW¬r&²ÓÊŒ³2g�£µz2C¹3¸nqñœhà<RȦnC³ -H§«¸>íÖý©–T\çµ�  œ�ؾ´gÕB;‹-1Õð+…³´ò²ÉoÄØvúOeÚˆÖ9c8†t¶ÀÇ­]ˆl{&c!PJÖl€Ð•YSì÷Ÿ×fÈJSÌBI“Ïw%Å}¢ëɳa˜…wKÃ@ù€7Ös;6¯€œEJ Ç òr�¡½ÆjË!rÆ¥ñ:ìã%[Ðws†!²¥ÐJ�óÖ·ÐôA· -º=¦zpCÅ:l*rT ﱕyÈJ¡ˆ%6“Ê–ô&€Î‹ÉNµ�éçûãýɉ ÿJ ²$y΋ÇWî™ö¸b;˜XŽ 'Š ¦)‚>¶µX–²”«Ü㺲SJ5Gëg1@/|gq Æy -5x)¸~Ɉ ð!¥:xešç?4,@`c|&�»ÒÖ·ƒ°`C|&í�²M{ð©RAK­¶k÷�‹ªŽ•Û·€=_–Î^ã[ D°•À6¤NËìÿ­´zÍfE�4¶oÀqþ¥D¦3®]܈Ós¢�‹ûé¸rïôÅÚ}”vŸ¿[!D ¯ªV_Öêµ× þ‡xùô¹²;–?½Îd¬#®´cjÄ C/ô®Ôg ¾–ï)v`56‚‹þá öÚˆ“�#O¿ÆÀ™$ œ÷³¸M½µÃß6A¼ -ÖµàîGÖ>‹µaŵ;¼º#ÀÔ~´/¢½Å^4�.€Åà›ç%NÏê;Ài»ÅúïDx�gÀ*¯š³ÊÜâ/‹ˆ[0…hl±A`t`b¬[ü¶ú~eäK£œ£æÜÞ�U={1ÆIÕ“eìézö^‹“ª—§?GÕ÷Í7&§CG1�>K3ÕzbÈWó÷cØtJ-5)h@湺¿¦£Ø¤ëâÚ.b[ ìe{åàbòeô•„£“„#{z VG4-ÓW ì�48ƒ>´ƒ êgÃ;„¢ÖÞ7ð£8¿Y*¹ræ‘¶`©ODô.™(� ˆ& -{EDꨧœÙ`~YK³W>ÀÄ@´Á Š °ÇS YC« /Àãï 1¦~dé7£Ãù•�ò° �(¦kPc»™Wð Åžá›5˜×÷VeqDëi¡+ØÜªšÔ{å,óœÓ¿?õ{EÂÉ$B›.‘ ó÷Ï Ð6]Àœ¾+�”Ë^¬j“½sÎÁ´쫚É3à ��×­wh2�Æä).êK³e'½oƒg·™—JCDšä,c=¨¢©"Ê6ÍÌÞfaœEʶÏ_£ØK%LH-œœªc̦¨ÛŒÞ$ã�rà@4ÏØnò&*@e·Ø™ -Xã :Ðû;ÆÛQ êF¶³5)dR`ñQè�-ìÖ(j½Á.ˆ™[¶11!�2N? -!²-† m!¨bE¾‡°!Ðdµ °}„MBÚbDVä[ ¥£�›�ÈŠ MƒÓ±ì¸T@À6¶Á‡J2¨íÑ-ÞtÎIFr -‚I6{$�çkóŽ­C T� ’{ˤ7•ÅdÍöƵH@*¶YÃ3"ns(ÖÆ¥>ËZ›p._‰ó³µyBÀÆù¿ãŠ5‡sY[°â¡ŒƒK”ªVBtapäRUͶ§M—#GÑo°ÀÑQ¥<>εºÌß\„º‰æ±vf¢5q÷ -QÁ¶ãÅdËSº’­ÝMÊ“m¥‹.IM]Óü•Ês¡w¬ONV´íˆÊ“í‹Þ€²¸²êbû„¢÷`Œ®$‚š¦&9-Ë™1™|Y@Ù”DÅ*ÀÇò ¶Å§±0z· ÚwçI,»‘ «½žfö⪲XÏüá×tzÜ›vþ]$¶Å(¹Ö¡ÁÇ�qlƒMòióðBžï�™* ½N©”G@ë!¥£Vm±¢�gûCRˆÈ™Ç�ñl§GŠíãÀúG1)ª$‚ßIÉ”ÛæajØGÿDg؆j§V¤ðV·Š¸Ò¨Aô§ øøl‚3[­`<`Ð&ÖÀÜ& â½“ZWN_×a4ÇÖìfŸ,çÄ´™©k9™O4­à»q.·”QX×sF(Ó®+ÎKË­Hõ±8+´]œÞž±Ý+zôñ÷Lçù Ž¶²¼é®ˆŠqWÚ»¢«ªyžíw«�Àÿÿ¥ÜŠí§1‚&r¶f5•Wz(Ж¬.¶8Ëž:ïòe®Qàlú÷­ÎÞåˆ*»�&_,-ÿõ<ªoÀ*Ó‹1KÁNóÒLO×Åžý¯løŒûš…½š÷äõY)£B·#Œïý#PØâõkâÅ^2Óß¡W±©¶¥xìxzƒ²JÇŒ1 �À¹vƳwؽš=%Õ œJ-¸þZª4£2Ÿ^¸½ì\VëPsMoŠe膫"™�ñ@Ý–·R ’ŠÂšÙ;|3ÆÌ(üpyˆ¯NŠôY=«™ôû77»Ÿº�ßì.Ù¼yºcÓTñ�­ -{é)í^²ê®Þ¿:~žš¯Ø�éÙ·Sží/¡9ÑÇítþ� -¦ioy¨d4s^¾EÁFÚB¤U·ÅÕlÏÄ“pµеU®UÝ•€(Ø”…^à¬R§-¾iÉlÈYrŒ}ˆ¿4…‘ŒÃ“�v¦±39s¼n%˜=œuÏã辚‚h¼+MPŽ3gÏOw=[w1è✼Ã7ßÌfÏíx&f› ùj,ÌVe' -eçÁ†tïr à -b9º÷™ÅZ}½�]FS.�ÅÕ{iõ'iEœ*'k„óvN”I_�Òcy±[Ô +tcÃÔàÁT®±V9TËgV4*Öò�ò˜«ñg2YW÷½�™,—w‡(ÑàP뽯û5Å $J$˜5ÃL­Ögª¯7”¦wC�»ä¥V�Ý•K×>OÒ}H +îÙ«Ÿösõ¾sÖ©üHŽÜÐJ³MV5�7èkp[žYÂI¦‘'Ñ‚ -9Íö\Ek ¤‹š+€/ßž²­xc¢f[z¦Š ƒ¾ œÊdÛ­½—.àk�_Lå±í:Sµ„U¸ÁòÅsÛlN &š ðÿ¾8?Û§(x½iG€˜Iä;4îOŽ�ÆÌ¹BR%Æ/7M©áyþà—JÝ€bû.ÿYD2î˧Ó�1!Y!ž}òì¯Èv¶3–À»Ô8ã�¶YìŠlË;ã  ¦mÀ:£?h¾ŒQƒPQ #Û�´òé*«æ%=›E¾3hW÷ýdn摎î�›"/?YÈ&,çª|âñjŠN…JÍ¥|‘…DR©®b@¶Å^P€&„PLë¥KûŸ ÿ1�D'Ù.}Ú$æ‹ÆnƒÓ}B!(ç¢�DŠa¡Ù;ÒM�óǧq>­±xµ8díãù%blHdz%e.�Þ+Î ¾>©Ékµbzƒ‹*/»x|ä”á©—=˜¡ì¤»ié>ƒ4¹zÙ&’©ÔR{�L³‡bÏñÍ·ÜQá¬þ…äÈ\Ý~ƒèh!hû€mv«�ÙìOqÃewµ¿â™ô)ƒÛ+?=5g-^äó9ȶÐÔ{ÏÌ;[…�·áð*Z?6ºËµ³غˆ÷ -Ñújëù^ž&€�^¹*Dlê³#ßÜÓ"`L7XµTçµ#ßßÓºtd«%U~;ò>¹¸¢çŽl+Ë}àÄ)Ú!�\wd›Y¢GÚÕÉ«6×ÙŽ”)v¢¢­ öŒäfâ�7ù>X´[˜‘„tÝÄ&›A=)zÊþºîœ7x}[ŒVtžÙ¹œgá ×,c%ТõE}´5M%ìõ'�Ig›‘FWGnz4ÙÆ¥:é0ŸZ³Ú–¢ld»–j¢dLD×4¥Êb[”j -‚ÛQe±-Ju -�Ü¢Àf»”jA9]IõÝŒ¤K^ÝœþËòhöüBA†aý½é}•E8ò*Œ¡Tl[4_~úcl¢ÖÔÝK‹¦*ßw¬ æ0N" OŸüæ4ÕT 0wú¦9³lgÅY…6*¬Bð²Ò®�ËlßÞ“r!õ~iŠ? 7q±6ɤ×CÏÙÀZ¥û#+Á—\澬ÄpIïcäÅS‘휎$9Cd6Ás]ûýMK­*Då™U5kÙâÀËÆW /Tj|vwÿËíÍëûîóç |fhnÿU§m÷öBuWûß~ýFÖ€MÇg_?ÿ|qÛÂ0¨#ˆ¦{;ú™ñ´ýjüÛþ­ ,sîKÇ|èÁ$ô)7V¬\QEVYºÓt`‚}ùí´Ö7Ñéðå5{¯¢Òb›B§~$–j§¤Å ¶õMÀ·®I_Ï&NðôÅ…ê^<ýöB�íþ÷‚ºç‰%ÆD¨º_/^HhEý :@°£Â´4¸ý?¿Ÿé4‡êÁPí‡ÊªèAiMºbüôöhì9µp>Sp…n��èŠÔÂ*·#e‹öºXP¶o`|€ÆNñºž/oOÙÕ›|ÈêµDncû^§ôž§Z�k¹�ÓbþøjÎm‡ûüv+ - ŸÉkÕEZÑ©žÅœ¨r-©¤t�@,l‡m­OŒ§�RièùÈ®gˆÈâŒ^�û“Ó¶ÔÄñ ±ˆÏ¤6ÌÈvâÖvÅôudÉPÝ2nXKÕ#P¨Ît¿O d|§{CŠ)4£õË=+¸õËzˆùkòÜ2Äé1R!ͬ`¼ú“º*vd„§b}O+á)0ˆ¬cÛ„cê±³•1;¶a6:—Ò�"†îØ&É)Õ‚qS„ˆ<¶Yò f¢¯¤cXËZFºÂI<÷wÒ7¹vŽŸÐÇ[ÔØ éÆNÂPƒ.²Ûc9u!ª÷…>Û~Y'† •ÀÕ ýæž4ÈöjÖÑAP*†vTž}�ÍQ/ïÙϘÂ@¨bd!X�Ïv|ÆÔéÖ¬¨(Y¤¶fÈv~FK@aS@d™Ïv€N7·¯¢ß’*%Èv‚NJÐyý¨øX: aÝVø¨S‚l_è¤#n‰Q²Ý¡Ñ;zS„|ŸC2Ð|vóúç7?vß]þîþþÝÛÒ·/þþêþ¿½é®ÿøîÝý›»ôÕËýç?ÝüôËîæþ—w»¥ƇΦÆiÖÆ†HôA¢_OeÏÿШӵ -endstream -endobj - -4886 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 598.6334 147.40263 612.2954] - /Border [0 0 0] - /Dest 4512 0 R - /F 4 - /StructParent 181 - /Contents (Algorithm 3) ->> -endobj - -4887 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [140.40207 571.3094 200.47287 584.97144] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 182 - /Contents (Section 4.1.3) ->> -endobj - -4888 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [149.96503 557.6474 213.69797 571.3094] - /Border [0 0 0] - /Dest 4513 0 R - /F 4 - /StructParent 183 - /Contents (Definition 15) ->> -endobj - -4889 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [276.43414 530.32336 336.26315 543.9854] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 184 - /Contents (Section 4.1.3) ->> -endobj - -4890 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [259.87186 334.6334 325.1928 348.2954] - /Border [0 0 0] - /Dest 4514 0 R - /F 4 - /StructParent 185 - /Contents (Definition 17) ->> -endobj - -4891 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [383.5707 307.3094 446.11862 320.97137] - /Border [0 0 0] - /Dest 4515 0 R - /F 4 - /StructParent 186 - /Contents (Definition 19) ->> -endobj - -4892 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 208.01038 122.27716 221.67242] - /Border [0 0 0] - /Dest (subsec:core-impl) - /F 4 - /StructParent 187 - /Contents (Section 4.1) ->> -endobj - -4893 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [382.14737 208.01038 441.80838 221.67242] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-asynchrony) - /F 4 - /StructParent 188 - /Contents (Section 3.3.4) ->> -endobj - -4894 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [270.15045 180.6864 330.23697 194.34839] - /Border [0 0 0] - /Dest (subsubsec:unified-context) - /F 4 - /StructParent 189 - /Contents (Section 3.4.1) ->> -endobj - -4895 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 146.56238 148.84537 160.22443] - /Border [0 0 0] - /Dest 4516 0 R - /F 4 - /StructParent 190 - /Contents (Algorithm 4) ->> -endobj - -4896 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [260.3851 119.2384 290.7564 132.90039] - /Border [0 0 0] - /Dest 4517 0 R - /F 4 - /StructParent 191 - /Contents (Line 9) ->> -endobj - -4897 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [277.53036 105.576416 306.98016 119.2384] - /Border [0 0 0] - /Dest 4518 0 R - /F 4 - /StructParent 192 - /Contents (Line 2) ->> -endobj - -4898 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [362.92276 91.91443 422.8277 105.576416] - /Border [0 0 0] - /Dest 4519 0 R - /F 4 - /StructParent 193 - /Contents (Algorithm 5) ->> -endobj - -4899 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4378 0 R - /f4 4366 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 194 - /Tabs /S - /Parent 1 0 R - /Contents 4900 0 R - /Annots [4886 0 R 4887 0 R 4888 0 R 4889 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4894 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R] ->> -endobj - -4900 0 obj -<< - /Length 6217 - /Filter /FlateDecode ->> -stream -xœÝ=]s·‘ïü#Sò™I�ï”ËW²ì“œ:'¹’îÉòƒ$K¶’ˆòÑ›ºÊ¿¿Âì΀tïÎ,í:=ˆËå Ðhô7Ý7�ïvïß½z³ë>ÿü¢ënïv¯Þüôö‡î»›þ>}õüŸ¯wÿúùmwóìí«ÞÞ¥¯^ô¿ÿõÕ�ïo_íÞ¼½øâ‹î˯ž\|ýí“‹›qÄ/¿}rñ?ª“�ì®Uç¥Î)ÓyëD°Òto>\ܼ‘Ý›_.d÷Ë›Û ÙI¶ûp!»ëþÓ?fŸŒÕ­ë/¿ÿtñîâ¿Ö‚0ª´Rwòo¬žO<~#Ë�RóRÒ i'Œž zòüB -×ÿóÝó'¾0Ý· A=v” "¸îÏÉ `œ@HÅœ H!�5¾Ù�¯;çŒÐÜm¸ðë~g@˜È?½Í„=�­Ï1¶ᆠ¤—F¯¼ÿæùϯnœúí“o¾êäÀy³©ÃHäÆPù—/.d÷âîâæ�ìB÷âÝônúñâÃÅg/¥”7WÝ‹¿]|ýb€¦œ[¥OÿùêöÇî³··W q$=£3ÚFIà ù®åå»ô×¼íÿ—Úí*ßÿÜí“vÿÌÕ÷Ý‹?5`\¥µð† ¯lÃ+å<�>Ë—w‡ßTúù4ý÷`þÍË«ùÒöïþî*M±îîªSöðY‚J~ÍÞé®:=¼#¥É1zå… Ý$,ˆÂË“ K„e(ÂRjj1j¿>eY ^;R /�²à{¼ÿùpþÇþÉß�tGî¼kî¼²ÂÉ;ïˆ�÷([Æ+#l\…<ðsv¬°wø]: -IÔ�Æ)Ëý\ÊÇö‹6–"6¹?bò£Hl.¡¾¢ð¢0…¤"˜°iœ| Íÿ¶ïÀ¶ªoŸþ´ZJÍÝQ¥ÈA[´ë‘úu�>B®�²Æt8· °0^Ú�¸7‡Ü4!¿ìzM‚ƒi ð^xs$8 Öš` e0(‚r+(Z—²�05Á‰¨·„ã - L˜CqSt¼£àðM¥"Ó§“•Ч&m­"¥P~kŸ$'QnAHÙËI&¾œ¼ÍEá^NŽæ CÒ*ÔƒÔzôM’‘§žÙP‰NX#cä¾FI*žõ³ó´4Ûäg¡ âÎ -2zè³*@ŹwÂjÃQð4ØO„\œ'³FmÅß((Pi¬Ð°68:0aQž@$ë”,`‚¢Vm¸+”ŽL”CŒ"ømÑA)Y�‰i-³ï¶ä!&wµŠBgívp|BÁ�I` FHã¬ÙŽ¿Sp4c).8aÌÉÆO¤&7MãÇ%-n¥ökôÐ>2"Á홃9$%äæcûKt8Ë6÷Àƒ�§JÿHí�#ZÓ†x•EÑ�h�FÈykâ’Ò\u×0I¼¡§…éÃY h—¨g4b(äyΊÈ瞣�UéÐVâo0/¤g0ÍàÝ@ýÖ wR4÷€´'ÿNAž(;r�u"® -ëNnŽœK‹’+Òï$àèaAáô}$¬ç‹·Ô`— À3a»G?Ò Ö¼¶"Æd¿®FäÙZƒsÁ9#ƒ {-£�Ñ\¨�Ç1²¨' @İ>X®‘Å=� ´Ù!”kd¡©�*¬U€/wäÑ n+½" áÿ©)nMs/ ïVï…Tš„Ãò�™«Ž_Ù,·˜P)kÁpÁ=Ù&¹œë¿M³ŸžzBMz�à‡T©„³�à µ¼ìߣ6¿„�­|ÎHZ]u×#¼žÛ¾ê®MJÒðfÿ€!‡T/Œ§×¯nïm•`½”ºXÞ°Üáûa •Ÿóü¸±*Ëp‘�™2kìÁiØã ©5@éðï‡Í†Êç2å‹WŒb­‰¨>ófz¶õìÌ-6=_Jñí ®[¨|8�ú®ÍÐùþ45CŽËÛÖ¸)�g¦JY¿ÿîÁë®:ÃØ¦ë‰vO�¿êüðæ´&Š1knL µÁ‹ÝfÔ0ÃÀݲDW1[s4Âp3"<šöG«Ç" ¸AžÌ`òõed_ Ujó!„‘¨Ü'Ìp§D0ÀÙtÝÑ0O>­9`Liå2ÄìfŠixt²äÈ¡&xŸ¢Û‚ŒÛôX -mìáÜWvkÔBn"QD4É¥!°±G8^ÄmÈW81‰o8įp{{Ÿ0øš2ѧ ps:15MÆ£øó´¢ZúÈ‚“`ãyÔkÆÖù—{Ü_’°â'4 t4à×#õ°ù D ÊÅýæ?%¡BóX�L¶¨Üª7änÆH˜#ÃÚÁ¤ÎWqÓ#x’’—,3Û¡Ñ3™B6XÚ³E¬7Rùh!¿M¯s?ŒôEÐ*g¦x{³·Ó´�‰R¿/˜«\ø[ë=L1Ãèh’-L€Ã‚`ø²µ­2Ã/ Z¬‚”óбËÇ”ʆ¸ÙMñ˜o* -'…ó ÝZM1:&ÇЈ))´Ô-MQsÀ™·"J|ůì#‡»ôQDg¥ÞbÚ—ëbÀªÅ2{QJ–èɦÒÂEý+{ÔØˆÌÝÉÿxš«_NÀ†ù›(p?Š1.ÁxÕ0Ûlìñ±•ÓÃ)M¾ÑN€ÓÊ®YM¿˜ËÂd#K{XPBbÞ_u‘E¦Ê!2²ê")O(dÕE†odþ±3¨Ú’H¥6ø0€*£PÐÜ2±a`âÑ-*¢ÏmxlÈÏð³/ojIMš>½”¦�°†¹.^D@Ôñ‘Á~nÎq‘ŠE4]J“!%U"é+�Ha»ÿ�Õ!™ˆŸWëd˜À-¼ ¼0Î -y5`Æñ]˜ã[%¤çÕ�Ù�¯;Ó'c1Ç×N8Ëß�ã§úL0P5r@sñ¿O€1*¯Xã§·™¸?ÛØf?¶>ÇØnýØ•ÈQ­Ì5•0Ržz‰ä厈M ëíŒleƆ¿þ=ˆ€¦>¦22† 0·àÎùR É䇽±Iæ°…f¤ñNÄp:¥ÌG‚�‰�#%y— Ü(i~¾23 ($¡Ž))™pñ¦yzEÁèIDš( ¤ýë¹crzâ`÷öžÞqKÇôÿÝÆ*?H#6Ý£‚½üX�Ýñ:KmVUåwš·©ŒaÝÉükæ�ô-*=ZNeÖ̽1oDoL™‘yi¸x4ÈIG£@ÕôõB#üak×â“ÉÃM ñF@_äþðÇçÖH+•ùû¿!·º&·š ”‘ç*‘i a'ßÀg¾Á©ÔõŽÄÈ’†�a�ŽûãN¼ÔYÌFÔæ½¡'Tå ¹TùƨMQ…t¹ö.±@ã_¦§ËH]:L’Z$UªQ–¹H2B”¥“ÓWs”D‹çX-´¿o¼ŸV½–­Ý pþ_­ ž4 Gà6è°óg¨ƒ'±CPí"⦌¸&e¦`´Ow’¶@غjŒØIƒŽ^H©}ømÓ!¦¥RüL[eÌo“I�Ťz\øI¨¡綤…©ÐB�“Y”J!ÃÉf�Ph±MuˆSë~z¹.x_$èÆMƒ×chÉm%C: --Æ9¡SE¡­=WÕ\¥h'fÂm=�ðÀà7Zj>éP_d�çñR§Ž ´l^QQÔ9÷½†Âõ­Øæ`}õ7t½0^»nÁ°Y~ôàùeóLˆ+S d~¨—f -_VDPÖrÌ»aP g)‡¤zp¼§³Ó³"9¾?šo]P]LÄÈӪˉŠ\|hfx‘’³'¾ÂV(²�CÔ_�ÂïÚÕ¸$ÒÀ+ÐÉkLœ)n�>Z¦y”¤èffŒöA8³êr -žA¶xÆ[^ÕÕÞ»àÐlåâ¯ùʇ¬•2åfñÅ¥Œš»Ù!Fž¯\AÇOu^\Øοéq(S´1U¬æ®9yNqø]Ù<»àŠàc¾¸‡XÝ@Ô…h’ªQkÝz!­ôª&2O‡äô�ºÈ8®BK'k"`F»mîD‘•|Õéz;^ šÐ›ZÖ?À“MÛ,Ršø°¹nÈ y– Ì£¡æ­u팈T¥–’ˆBLIIÑh;U?¨Ðæé{höà|wr%W �ÞˆZ~ -M?΋ <ÀÆ£æÑTÃ"y'×ë¬ÒÕDÝ/ð5 -úâñ¥XΩúOÓØ¹¶¼mŽÁKME·}Ìh<•/‡O­I;“RüÙ¥}_¸+Šðbk¨¸ä·”�MéaU*5½êîC‘€ñ-yÀ !ÍE¥ÚFw^$Ó3ݦvVWè¦U³‰i߀FÆH×ì]:fà‹W\Á âÔò‰¥ùÏ…K²5Y¡‚‰ÛY›Ì4 …´ä%¹Eè…2“R÷BdmÑÒ…2V;´ ¾¶©p|ˆp> -áŠO}èi@a£õ›‚i±à†éó¥-oƒ�0QN,X }*¯ÎSý• N6#Õxè "~œ¤v’È-h{ãÚ¯-[6ƒ9wÍê;#Iâƒ༉T¹¬âÁê*dòéª+?£‹;H·ÆˆO9âñÀ¦Ÿ­wèÕHU¦mälP[ÑÃr;eåä³ãʶo°JÄDÏÐ ßkÂ{8ØÔÃA·”-né—”Ú#š–�xW°BEëWö¬’‘G¡cý#œ¿s‚¿’‡zkØPÊWÛ(f,ÜÄAîΪk2b$¨¦�½ºœÝ1B:wÜSB�±ŠS%}¶éW/Ðïâ^Õ»j¢UeÍÖ#f¡n抂”Ø<'é,o “Ô‹šñRóàPï6ŽénÁþ²ïËÃg†§ªSo«0ÛðQõ3'—•w¬ØN,ڞƂFÆU‚aæ ´�$´GÍ$š”\[j,gñÞú•-k™ŸöªÐÆ2)<£HËž¤ÌÓi€†½ea¥pѽêû{ö*µ;�°$™–¥Zù&!ìé‰j•šG&m)æ”(¨ 䜑û‚ß�¬Š�³/­¨…£¢µÌƒʸóÅýzIhW­­p2¬Ânɲ‡0Ì襟q®_Šºd …¶òIçp$ ôÍ|&ƒ–Š -ZXŸN+×B²�ËTðf¿ ¤×…™Æ8¡Tp°~aÏŠ“¥Jh¡ÇÈe-Ô²É,YŠy;$¾tK{Ct©d–��’1N¢…¹j�g•¦N©ž§êFÖdÖGY7r´”KÌ› ÈùgñPágÞXA&HZD½îyÜÒ›8�µ ±Ì£ª+÷íÄÃÍóeªª±Æ¬±å¡ªƒâbɰtVSƒ´6ïíËeR;)A³XxóÌ´å–•Z8­µÛD¬4÷÷øºq -íÊ5 ÂÔ„^IÖø1™lÈÂ%�~/‰¡� yRU)æ�cU}I±J¹(´�Ø„9“²§cs¶‰¹¢*çè(A)ÛhHÑ»sR -©¶µ>÷j¿·9›ç ÅÃo™J¹™› ÃÆî_¸œj=Œ¡˜áï4*š™F&U‚Õqm/ž>èäúJmÃW¥ÚðꂘŽCCZùè ÙEK•ª qRÕ¡ ÎÞ�‰‹Psó!†Ø²’¾ hS‡¯Y»j¸qb9_²bŠ9`SûsÅ„�u˜žãréè�„½Âè�P΃gA»*fùèHwmN§•`“¾]�Ü˵2j¢—¯Ì¨Ž¨(Y�£ŽJí®  òç‰JùùÃO›!¬ªbâhqÎ2IYÒäèê… -oà7 -~¥„L™i÷ÛBY^z}(„8ôG;þ¥ðŠ”ÎÙN)b4ÍÐ&t^ø…¬ƒÇä] ¼/Ÿ3BGˆ›PÆ@;žMjÖK!Mû@GsötpŠo§l™P-£zµUà¡ –·^§2 ùí®EUM^~Åaô§KGЈåõ™¥Ž*åÕ0X&·g¼“F´¿ÜXj(•k¶Á›µgVxÀIØ'•+A"šôÚÐë&ˆ`¬öë7&€Ï *ï©ñzô”£l} W€x–£ºV¸\c:Î$÷‘¬�¥!ÝLJÑ1Ʀž2—šáæIzÏ“ÚÉb³ -mQ—U°ÎF•E\^þ¬â�¦¿C¢šB>�g;½ÂoÜÌJ#ºÊ’ëDíÜÔp0£Y =–™vUP€•"‡vúéE}lÉ��, Î-¼K>7¹43"já]ØÓGZÖˆ%4¶˜ðf\PçÚ Úhœ1õ. v °¾@ ânð0spé»1hs!HÍ»¬ÛBÄÔqÃ’´©�PþMx°pIi®:Ö!+å¯#Ûtè(¤N (8»HXo ·a^ÉíØ`jD“&]*¬œK à]’ê<;d£ ©Èå6s£éìoÅ}�CZX¹!EÒ z7gn£j'¢TÑT9Ì™±øu—OTÎ" ÕØ”™\¼À¨L8í g°BÊY– û¡+\èYºª˜Ú£N+/œ38Tzd�ÌOÑÌÐ[Ö( í´5©�R°ðŠ}Ò‰Æ ˆàÝz¸¶=™-–G €6´3"€÷ëW÷¬ŒŒÖÌØ–Äȧ”pß@P~Ÿcrìï¾ÇæãÝîÕ›ŸÞþÐ}wóåÇÝîã‡ïÓ·Ïÿùz÷¯Ÿßv7ÿññãîí]úêEÿû__ýøþöÕîýÇ[4nB¥6h©ä¤²v Ñïã„üçJ× -endstream -endobj - -4901 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 519.29944 146.85141 532.9614] - /Border [0 0 0] - /Dest 4519 0 R - /F 4 - /StructParent 195 - /Contents (Algorithm 5) ->> -endobj - -4902 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [326.38528 519.29944 386.20056 532.9614] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-asynchrony) - /F 4 - /StructParent 196 - /Contents (Section 3.3.4) ->> -endobj - -4903 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [460.86523 478.31342 464.16522 491.9754] - /Border [0 0 0] - /Dest 4520 0 R - /F 4 - /StructParent 197 - /Contents (Footnote 2) ->> -endobj - -4904 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 114.97339 82.56614 125.701355] - /Border [0 0 0] - /Dest 4521 0 R - /F 4 - /StructParent 198 - /Contents (2) ->> -endobj - -4905 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4384 0 R - /f2 4378 0 R - /f3 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 199 - /Tabs /S - /Parent 1 0 R - /Contents 4906 0 R - /Annots [4901 0 R 4902 0 R 4903 0 R 4904 0 R] ->> -endobj - -4906 0 obj -<< - /Length 5213 - /Filter /FlateDecode ->> -stream -xœÕ]m“·qþ¾¿b˜3m­âÐxG¢È¡(™´Ë²�â哨T�(RbÊ<*çu\þ÷)ìî¼èAc³'ZUâÞíÍ�F£ßÐxpýôþðîííëC÷Ùg»®»~z8ܾþñÍ÷Ý7×7~ú6|õò¯ßþþÓ›îúÅ›Ûïß܇¯nŽ¿ÿéö‡ww·‡wîvŸÞ}ñå³ÝW_?Û]¿üéöîÜÚ×Ï~ûeÇû¿þï:Þñî t–3g ¨Î*Ï„tª{ý~wýšw¯ÿ²ãÝ_^ßí¾¸Ùñîæ~wý–wÝÍÛñåðqó~÷Í'¯8ç¯8—ûtwþMèó§ Ÿ�Ž¿ÜŸ¾’ááð¿ÙwÊ3oµéß’°ïž �|7}+{úÑäÎŹsîöøùË}'4ãœó‘°ùÞ{òzÊuÞ N1ðtÔÜì¿ín~·ûêf÷Ÿøl2à S”«™˜™ŽÏ8÷_}ÞÝüO¡s�t.¸bÞúºÎIYÈÅÕù³g¯)ðt*;ãäÂùw°ûNðxÖúg'ÓK̀Ę`,Ód D瘛gÂã#‡ðï?�É–gÒÎÃã–"Qa$zϤñÚ¶ÏÓÕì Ž..jéôsÛ?(d49ëÖÿ 9½X`ôÊ„“¬G•�ˆŸï%«$·µiëÑ0ZæÈ~” �#_ž Î9GHŽ.*{©™¶¦e�Ï©½dH&þ<ý½BqÏðòï¦ÿ=�Ýi�Òɘ|9�‹ïýdíž,"'2j }[½DšËF̦Áô€µÌZºf:çŒÅ‘šÿÞ—­…Åzw’I£¶&t2¤š(ùÄ(OV‚HæUàSšM�^0=ËW{ÙñßûÕJ…I×ûéwW©( ~å_Ï(!™°FÚlyÇ™ÐÝûïžúóä'¥%ÓJÊü‹óï?îÞn@ÃÐ*8άïÞO¿&ü´çáÿx|3¢(q~úýíÝÝ'oîö˜ît=©LꢸˠKâÞ»7ÑTOdRí»'ƒèFŸgøò:× �(â1‡S*¦Uå°85¬~‰‰% ù<èY›/ëQCOc�áéÄÅL•BæHdÊbùêá&âÛ³—;Þ½|ö‡gºûÛNu_‡e4[Þýy÷’j¸:w`œf^Æ0süÏ;»àHËlUûbhßÓPÙ¾®ª}uj_vF fleûB0©jé—'úg®Ž?áíJÚCÛòmóžn­³«ÚÎ"I,°w½€/™D�€†1gõC8”êôƒ¨y‰òrÕù6üÛM]ÁÞm<;ð‡Ø]$ƒp,)™U•W+E™»–Ïs³¿ÏÝÜG›iÓR³§GŸL™ù‚äž, -žõLðõ‚ÇAR¢§(ÑÕœ‹ÔÜG {Xˆz�=šà:Ù{T -É~1ýãñÉOɤçßçß(fÝêùWÔäÛælvŒbÜÕ¿ÄÁ/å2¾¸öddk”™¢¹éŠÜÔœI³š›×7=¹”FÖ*Yô5pBñé -ê¦îoïÜ‘ëH`æŒdê´Žhjçä`’Ë,gSIF3_KÎë!1— v¢‘'‚ët‰(Ûøç¤Y)þ”%X¢ô ñR3ÑaJaß™³¿ªß} ¸ˆÙÁ Þ³‘GpQgvžjjWMSÁ‚Þ›W"šªÇÌã§wUÊ\Óëqrè¾,ÂI(³Æ.ʱ·CYŽi¸e°Þµ´+%”]In˜jñÌæ¸Rµi…G,–WI[Ë -—˜–µ ÷:Ÿõߦ1Î)Kƒðëùò¼ìcÄ3ž½Ò¼ÓdžQ­¶ÇkWKH W”*­(í3ë�uO­(]\QÚóþ²ö›ìšõ†Ù4Ðâì]VPÞ´ÞÐ Ç,è}QŒ8eΗ͚ÊÍðFÎIÿ%r˜= ‚3 z;Öͱè+ro¿hâ´uL§äÊù¯{TÙÆik+6õ=Þ1'Ñë½Á³ÛgÃæò¸N±5ަe*Õ²Xjí‚Þë$îPUó mœ;Ç£ <©Z† -ÕüÞ1 ›2es«»@4Ÿ7˜ ­s² -³WÖôËÚHæÔ3æö1·ðk’[V.F2h §F^Ñ{êÏ×fCi¦»"Ó•gJ´2ýÕ�¤‚Îá�S�ì>ýÌ9<�æðTŸÃ« v½±&iÃ,¥³ý6^زj}õË?ǂآÅå³Ó:¤@N§âû˜PNzëN—äØPƒ© s´I¨Ê"´d-ž‡úÉLá[ÞQ4œ=Ÿ¤¤sE¦DB±!*×™i@eº'­�K¬ÊجøŒ”Ìi‘Â0é´p›H@¡-ÖÊåX ~üéšæøHg˜à\› FvW/b3s.�2žè+zú0÷JIì´ÒÖ ’¨b~Åe¿ïÅcIMœª·$©˜g¢ŒcZh#/¦k -eçÁ˜£B¢D@ˆ ·àmï~ˆFÞbˆŠ)î›lTmâ]cÑöP$¥¹cƈ¦¹Å“{fßiÏœÆÛ-ÔûãB»±–JŠóçñŒ˜šþ7“*”|PªðÇñ¼ÄÔ -eÕp‹Kf1&„2ÄIáwº'À‹dΕI­ -æÎkç~õ`"?°tx©(m„ó‘?Ïã¬ê9ôƒ*M:~¦b&ÔÔÞ6T)�ã¢�¶‹�Þéß�¤;nŠÇØ”?V]7�lXèÊ=qš gðSiÉ̇~5ÛPr§þ¬šÙ s䬩aiµ†E:c‡}yÒeW$­hüá óVz±Ål¢ŒJy"íUåœÎMUîä©(‰.x^èƒÐ4ÉósyiêHdÚmÝ¡Èy'ñìT¥5Ž0æ3yœë/Yê˜öËM@>VÜÅÍ9µ -dQ¥9`²ñ4¦ÈÂÂ4_ÍüèùâÎPÞ8v‚0h�1T£¯$Á9žYΔ›BB¶Ùþf8x7ìn É3MâÆ«4÷tÖ©jÚUõ@£umH̽š­Õgr rKg™‚WQZg³Vf Aš¥hÀÍ5ÓFy»K·8álÐ [Z&µöbÜÌܺãZø”¤–<'¦LÐÛZÈN9à ·eÒ 3-ð »•Q Œ¢�{W%�\å�Z^Lª|DëÜB)§ÒÀÚÚœŠE·ÀØŠº\°£Õ †Y͵®pƒc£ˆ…£Yk”G?ß÷—:žä™ü´ßJ�7¥¶„o�w±Ÿl%G,£cƒmXÕ¼YNظ '=ãk£”RË\ΨP/…×5ËŒTHg�sŸƒ -(’:Ì-R˜R´ë€«Y¾ÿǾ“ã”êÕÜ-âP(­‡†œÿö‰Â©» –q§¥Ëvu"yMžš*ŠQÆ?�²¦ÑÉz‰¶…î—9àyc„bH_¨T~y?xÖ,÷˜î¡"mD{ }+C{þ=®™ª(äE¨Ž„ànCNò)i>´ÿœƒ�) ]·!TY|ØTF¸šÅK»j‰­LAœ†ˆš“Äâ›u’�TÚµkšß¶ ™Þ †èŠºTq&uÃÛsÌ_4•1ãË¡2ɪöL9n²}–ˆqéC-ú0k‹XÄéó½ó3]Aýf-öB¥ú̺ÉÓc”0 åÍV0Ï-ØihÁ�sX'B„htˆâZe‘—âG)º¬…¨Æhâ‰V -xW¨+Úí;•ìq!MПӀ[ŠewæEfÖf%o~œøŽVÈRÑI«ErPÔ€Â0ãùÏœÐrè–Ìh¥d ‘õ.»fšƒJ Œîe¦wTô™8qmálel\ðfn¨ë¬ž8´4Þ æ(ó±ÌжŠYî­nŸ¹¹IC“&#ÓM‚`]bÂ0 ‡=]Ú¼èC˜aÍÆu+x‹D¬OÐŽmÆ$O}þù÷ä¸àÓ"§K¹(Ô}˜ã)šäAx:ïm¶v÷%ï]LA­“rL’q±Íve«¹À/™æBj‡¦”.àë½\±u@ãp|Íœå«[°9ÈŒµ œ±Y‘[$XñCËý�´“Í&=bœg­ßd‚7ÚLp¨»®SÖpÛ>›W¥)%±|³Wz¿!ÉD�Ü@jâó~»–$çÓ½pt“aNzª²}ªäÔ—y@„Š„P¯8U�“�,Æ!ÏYìâè£�ésd:d±¬N1§›6›ŠÕ³‰.0Y/SÖšeæôg\‰Í`‘Z¤¢3¼²85eÏ4ƒ?5:“׸<û“`#Cã-Ö`Æ¿ñ6kpLšðv–„¡Q!-sf -*¤cÒL;¾áñ�Ç7‹x·ªo¥Õ ÔÇxûêR§‰"ämÅÀ~NÈÛä8\¬"£ -ûN�vae”VêµÍòbyÄ™ÍAm¥òÌŠZP[î˜ÕË:‚3®+;0š™e ¹{ÝÔÒ*Ã6¯sÞ(q¡ö‚ˆ¬Åä]ÒüéL¬°œ ^GþbÜ\¡ 8ÍÒmظ¸dãåŒËëmÙ"6h©-Sp9 Š�¾‚<¨²ÂÉ”1„öý@´¿™Áô8Ö5#iñä½Wì’þ7PÙ4›lIÜÂ5•–: ³±€<Š5Ê^ …«‡0¶à‹Æ¶‚�íÌÇÊ©Š"H›Öž�ÇÛyßfS~Ñ®c*Ék¶)‚¶)ÔÒó 6¥|/ƒpšIpcÖicP{ ®øNEIÙË­rôš…É*§ yH—½–at©+¨-Y3CY3ôN†Ñ£n`VýDƒŠ€…ZKB˵€_Í`!¤gˆ²Bc‡SÃÛ¬£6��^¿0ªœ°Kåݘ¢ßøò˜¹a¡¿H#Ûܸ4ö¥l7~…ƒsaÃtÕðšœ[ô‚`�ëû_†�c�NJ/þ« 0{4¦åú“ã?ôTÓYB¦¥¼Ô• d³„u‰åY£tFï®ôEC­Y* è5 #£”`°þê4 -IЋ& -#ÝSüGS¾¬0*†×¤0Ð{& -£™½TÞ˜T§2Ðk$r!,³Ê)¸0þ;(Q½‰hšVj¬ xÒ“RÑiÞ¤Žfók<ñk 0ë+Ç·nÏ÷’×ozkÄ(G ™«vR–AÚ~}Ähw@0# !Ыw~iòh©†@€ i¤'�¼Ÿ5E¿&/ÄEc­p· è:-ìª5ÐËÂa²š†6{�o„/éÿa¶pè ‚yiè¹#ä‰^„¡ú‚¤¤|[P E@[Fzý)¸ -f枮˩¡¿I&Q”ý€ÉZßóºÔt*Í&ª ¢­òXßçÙY ÏÎ -r΄jŽ�¤/Ê·-Áeª½û§þF!ô€íò{ŸÅÛ·íA6É|ÕÍO€âç·…xpÜ·›¶ÛDaö¥î¯©if)Y�€ÂìKLˆ‹¬„•†Ë�ÙFéùQÕ10ÌQw†¶yE("¶ô¡*3xÍÚ÷I€(r§˜Zu÷æÔŽ“Pb€Â OŒ¸“!d!ü‰æuÎiŸŸL*bèGQ«gRJ5sCÏ kÎ2˜ìç÷Ç.,3&Q,qtv_z&ƒ)z\3‰Å[º ³S"ÁÄ…&;ã š>6x5}ú*ÕÍèA�rϼ÷“;+�›—ߌ¬Ô”JQgñ²�º‘ãP¹yóÔ%ñ ³€ªõJJ•””×Ì+½nð108î-2"¿»­iUÖ$x»%,ÍôaŠ÷éók¼™û:V‰X™¯|»q/q¬îJÝ"˜ë3…qEê«õböfl0”½²©&Œ[¯W„ñ{ ð:~ô0n&»K)ù=�iÄ“/)š]Ö‹‹ãdŠ­Byab�f\zitWûåk<ü°{^±¸°)šcF¬(ÖÅ §×(ádÖäÊ�,~¨%¹T—:IYþZºns*°ð+Q*¦kÝ™ ¬�Ÿó ~'{z8ܾþñÍ÷Ý7×_|8>¼ÿ6|ûò¯ßþþÓ›îú7>Þ܇¯nŽ¿ÿéö‡ww·‡wîÐ’Á@Z×i`´&vèŠ(—'dØdqü?ôœÿ+ -endstream -endobj - -4907 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [210.73615 585.1914 270.70114 598.8534] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-coherence) - /F 4 - /StructParent 200 - /Contents (Section 3.3.3) ->> -endobj - -4908 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [349.41644 585.1914 409.38144 598.8534] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 201 - /Contents (Section 4.1.2) ->> -endobj - -4909 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [304.4633 523.7434 363.29776 537.4054] - /Border [0 0 0] - /Dest 4508 0 R - /F 4 - /StructParent 202 - /Contents (Algorithm 1) ->> -endobj - -4910 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [411.42615 496.4194 471.25513 510.0814] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-coherence) - /F 4 - /StructParent 203 - /Contents (Section 3.3.3) ->> -endobj - -4911 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [210.50237 438.1064 273.43668 451.7684] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 204 - /Contents (Section 4.1.2) ->> -endobj - -4912 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [298.89136 369.7964 357.71567 383.4584] - /Border [0 0 0] - /Dest 4522 0 R - /F 4 - /StructParent 205 - /Contents (Algorithm 6) ->> -endobj - -4913 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [301.9643 356.1344 361.79327 369.7964] - /Border [0 0 0] - /Dest (subsubsec:coeffect-api) - /F 4 - /StructParent 206 - /Contents (Section 4.1.2) ->> -endobj - -4914 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [87.36614 215.0924 146.8631 228.7544] - /Border [0 0 0] - /Dest 4522 0 R - /F 4 - /StructParent 207 - /Contents (Algorithm 6) ->> -endobj - -4915 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [458.63428 201.43042 517.46844 215.0924] - /Border [0 0 0] - /Dest 4511 0 R - /F 4 - /StructParent 208 - /Contents (Algorithm 2) ->> -endobj - -4916 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.88214 119.458374 135.71114 133.12042] - /Border [0 0 0] - /Dest (subsubsec:component-api) - /F 4 - /StructParent 209 - /Contents (Section 4.1.3) ->> -endobj - -4917 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4378 0 R - /f4 4366 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 210 - /Tabs /S - /Parent 1 0 R - /Contents 4918 0 R - /Annots [4907 0 R 4908 0 R 4909 0 R 4910 0 R 4911 0 R 4912 0 R 4913 0 R 4914 0 R 4915 0 R 4916 0 R] ->> -endobj - -4918 0 obj -<< - /Length 5497 - /Filter /FlateDecode ->> -stream -xœÕ=k“·qß÷W s’í£Lo$²R-KNYŠS¼|õáH‘SæR9Ÿ+åïÂìÎ =hÌcO1?pïöf€F£ßhtß|~ÿðîíÝë‡îÓO]wóùÃÃÝëŸÞüÐ}wsûáçïÃW/þöêáï?¿én¾~s÷ÛûðÕmÿûŸï~|w¼{x÷áxøì³î‹ß??|ùÍóÃÍ8âß ÿ}•Òïy7¸ìçyÉ…Nßf| ÛåðùuÿµM¦Ê ™ô[ÙÀS0XJdøQb€JL…ƒÛLRœ0{Lñ}¦÷·áÿ{ì´Àq»ŽÔJF—˜õ�«k£Ë}éˆZ”¯’çÌÛ­$ô¯¤Öá ÔçL¸�Dt݉³ý·éÇ‘ºÎd¤@U€gJ÷’е�"šTÁ‰&aO/¹Ô)ñœ¿¿I‡$¨j[ã ÓZl0M8ôôþï$²JÆiæÌ¥5î4·h\@U®•LòÆÅmQ¹€ê\·`öVÙ6àMЩj7c¹A4�©îå ©á"´�¸“Ë¥ÓIø¼%�B•‘Œ»F8ö=÷œ¬«WÍä�é!°š9Ѹž9ò?±öu�þŸ¡Ã7¢sÄ&ªKœaÐ -A…ÿý—ÿ Lă—̹ÇZ¿$¹Ì&[Á¡l°×ݳAóßœ —·Ù�BU“¶Ì‚‰ƒ$!ÑU4³üsù ÂT�ІÅmшÂV½Ðͨ�4â 7ejíKC®JˆJ2©ìfBT$~�‚T" ˆ>jÔHVcl!¸çÝvƽ!Á€:×fAÆ.®•¢Îµôâ¶p­”u®ÝŠÚ ÆŽ’¡.9’˜svˆss`Î:OÐÀ¥¯2/¨Ó†ï%œ}î&Û1©p¾ÊgždÞ˜Šý|™KÜhÃ"¯ô£ëNŽƒ âƒ/ÛÌA`�ᜠ˜åÆ!@UÁ؉"HL�sádŒ’) ØùÕ?½¬qâºÝ‚‰a’`oMoŒâ$[¶äñS²2®„ëîÙø(AeO2EaQîÕÔ¬)Mõ¯ýºÄn èlyBGâÈ€ª t´¦£˜3dzkí`”ÜÀõÃêGÎÊ"˜5:‚I#]ó&—/,à»ëN�Ä\R~>tsþ(ÄÓpm6+6ÌWäa6¯Î¬ úk�-:9Qš™Öé?¿-סFC"ú‰\fQ Ë™å° ù}›7(} Ç)>Y©“˜Õ-¹gV°Më��cdØ|rùðÙcûWçM¢ŽÅT¤¦A)¹1­!r…™áRy¦À(õÿ†Èo&rzˆ(‹öÊfß+î™t v#ô¸Á -ª‰±å’y�¡UíeÓZ©M6kB£‡Œ�ŠÚ‘$ÌZa2”XÉt}0£D -À1‹&ŒžZÍIˆÎø1UdZ]f£�\wbY/¹=¥›1� 8H;Ù«µþŠ=¼"I_Ö¼5­ãÔAÿ:oí€ïÏ0ý .³_£m*%—ª6ŸWYhó jBkt¨=5Ò•ˆÈcbä�&){Æ×¨ªºŠ-(Ü-ÂjŒ-òÂVJÇû$^<…°š. ([Q±Cé³| ™«:™÷ !/9$2hdÏ1êžÈ“·ÉoCÆm`®–’&¤4-¥ÍòÚB£â ׂ9%Êxæ¥�–µPæî”ðÒCö/ÙF ÔGæc(ÌÃИJÚËa}½G®\Õ¦Qœ)É7 öã‰j×c=šå‚Ý»4�MXåÌz+½t±P�¤É“1bŠ¿@¥ù m±ÇrT� à/Ó U%b×Ù•Œ¦’šÌ¾¶ÐK¹ÆUÇã\ĆÎÅ@§¨^š€“ÚÍLª‰Ofcå¶çÌV!ê5›x^½.¤j‚w5™Y§¹e œÒ-ŒLè×àOdþ¶tUHp1ÏY Å÷j‹¤iÍBÐuSf�Û!]b¦x g -¤žT¼h0° ¾*ªŸ#³^‚O޵ùª²[K=�®þ:2“€‰lãór`2ø¥1WNrÅ”‘r -ûd7÷ìÛidªœÆN¥‘LxkÍ«‹"_)l3æBXÜ$gù®ôFZù˜Ý°‰)36#åÊiS‹&©Ÿ� ‰jJo‘ŒØá_†é“ý­4ÓFéáT6[’œ1Æçœê€—á×ãü4Û�¬|ÀiUj…yUŒV@cQhDYO« ­Õ2åPQî6¯c.µ‘gƸ€rºª¢š—b¢Hø®Z‹-ïD¡¢j\±ÈHOrMšxÜÔx\yÏÔ–{æáÇðsùô¥o]“kñ_gÅ:Nx¥0�bÀÒ^Òk(Bø3Kž�xNð?Ì- -q¹šÎ¦”ÍtŒÅ�S"œ¢o&ä5ç‹«�Í5"R˜Ðä–Åôk¹¢<"_• F3ëemv]Eåo3’N�8þ‘¼‰¦ïsÎ8ìeÄM©X:N刂“äò³â…Ü ‰_¹ŠÏ—cqxO®ªÛ£€�„‹œ '˜äÜŠ•ÉQù«Î}ˆ 5S»H1b&1GópõmD¯JYÈV¶:eÁ`^©°’)iŒÛeyèFp™$Ž–AªTuˆæÔdCŸ5 ÎÀ*Ó²`2Ÿ2ÝçðçíN�—NÞÈø¹ Ì'“Ú‡*2æR›ÖzÂüÝtÂ@ïÍ%–\>5¸2eè#ù,Ò jcÕÝ"š놶°L¿éDmT¨2†ì¬„ò”‘!/b¥;P¤óHXpZ˜Un -@ È‚ñ„éãìuZw£m,0°\5!£…ŠÁ0/¸s²áÌ®|Ï󯾲¥`ÖŸP¡ �õâò¤E0š‰¥i×ÑÜDn™WJï°éÇÙ­ÃEy.6¶;ùË•øëN&Ò¾J³7 J:ÍbDq8àªF²™Í�šQs·ØqRM×$j�­Ø6 +…r®(Š’Å 2NmN_°¼*lA2lj[rDàRQ)üJ1c•ôó»šXzȉ:J#Å jéöÔ^œ š”�žÏIjš2&ór¡ªùá™í3ø$š:5·¼J0¿q^˜E>+v8Ôˆù8¼=?®\¸d”»Ëá#jý-á‚´欅H1*Y}LiË„g[Ø–0Ð#×}<¦~ˆþrŸèÁÁN?'¨Ö(}P˜‰h¿Óm1OS Éœöjy5) -Y•›œ3PZm=¨ìíl«H.–äÎdÜV¹Ä…�^DÏË'“Ó’ä’š[‚¿Ü°Âßgnð*TBTñ|™Ÿ ȤðEš†¢(ôxXHfT(“Ô@RëŒÙëYSõ) 2êbÃx¨=³™ ’ÇU{œ-¸þP•¤’C©t¯kD³Ê”)'Go~f� “ �±Gv«³6Éò°Ÿ­:êÒ¦\5®L_˜¬²h0z¯•[kªgǪ% -Ì@e ”£á"eÛÞÌeаÍgôUe¼ÄÁ(&KÌG|j,$€nD~0ú¼š}íw Ø�¸gÞ{osk>•Ä'#Ëy]'j³�Ö{Œ%e%`æé §!¡P®Ù¸-ßlŒÂT‰ˆ’èi£·Ìƒ¢EHZ-s€Î¦ä@¬ä¢uµ¤Ê 2, -¯U�mõQZÁœØ¦N®�­®ÀçðCD®l„xz ¤yRFÓH¨Ðb1‚3©¹v{`¯Ï,&¥Ñ�iѱ»Z¼™È×\jÐ×¶²ñVÞ½DàÚjÛ#¶9Íî–CO½cÎCõ=fbh‚ zmhÒk_(M{1"æ©Xˆo}c7²7ç pæmŠ,°¿­ 4ålºàZYii[x;Û©ª�מ�ÞvŠS˜’Kذ5a,½>½ÄOŸ¹‡MüšóÔä£fWiZü/j/õL¥ÏtËf^B¢¥QœaÖk¹ �­Î7s˜(90ª<ìÚªt³ÕÙ ­pÒW:—ÂnYÐ)™Ù‹dW©BWÿK6ö™ajÚÃÓ.iìÃ=ã.iì3|ÃÓû7€Š-!k,Z7€*óÒoª�^˜?™ìUQ‚[T/=/©šºj×d-zÔ—ŠiÕ¸°¶ê}£q;éöñíz:ÝŒô½]oܦٻ«l€VE—ã—¦jጆ~6}Ît÷Q7›‰uÚšñŒpÏ4ø¶þGF3åÛò ã Ç™u~ºQT�@†ëG­ 8ÕÖ©Zx%öl'´Ãàë@­´©Ëqñ -UØg'\|/È. #I€IHb¹xÚ»¯‡G‹† -Ϭj¸¹±ÇzÓý«R÷_—v'Q£‘îR-m-¹`Öƒtkɨ¿ \'$´¢5LòD0î#~ߥ8n«�çÑŠÔR2ãZ�ÛRÜÖ£™rjÉô‹ªÛÆdv5[X˜ÂYµFµp.\ÊXQs¹XQÔÔP™zR%6U%kì¦!ˆ§ItÃïCn@Ck^­U-¬b}_€ux»!ðœn'Oˆ“}š¸¬'ëíÔó‚£µ¥¥;7½h¤�þ[*Ý’°¢JE»³Ri€µÚÐâ9¹ƒh?™`bÁ®¸ZQlü?ç�Ù¼jŠ2ºq‘—ì YHÃ<߸­G/ÀÉæ5"ô«j…g±´q‘ëÞk¯ZÓèCsŸ�eÞ…k|»‘0ZVñL“�cv¯¶aÚ3£`òŠ{Ê肆l“¸×Žyõâ~¦½Ú(îi@Ö‹°fy„6G#ž¢�ÜÔ¸ð¦háúľHB22² úv”‘÷°À+gÒßJmÛD8ÚM€b6¢·Y„ƒ¡5žÔúeÐ5�½Ä�IÜ¡¿Câ¬|4Üá×g,ƒVd½å˘ùµ�ZÔü†€[ÖLoÝàÉGã'¥ÔG4æëêDi&¬éØx>î%°ŽwS›4HözT'ðNkzp£[ ÛÔjïµf–Ì¿£i>Sƒͧ^Q-`,À1ª»ù£%7ð ;9WF5¦7Ú‘‘‘°ÃòN¢.‡«¼ca¾ö2N= 5¡Ê~ÅÓm…Q¸Š6"èzgÑÇë‹y�Ú? ’*õ¢p<.8:ú˜†0Í4Ù‡0âk€sí|¶Q‘l¼ÀE(ŽÇc¢OþÓD¼›¨Ÿ±´S{¹&À;$‚`Ž+ÉMüD¦Fqk‚ -�R ÇŒwjœµð¤wfJNœ)y‰>T6 ×…vÜÕ:¤ùz±®GŠxHîGeË#³7@ ›Cx›»6@Û/­n(¤˜îÈ‚+VóÛY}HåE=k9ÿ©¥�f›š†Y°‹®‘´  Å,Å•X’XQ³«º¸¹›ídowÌgPR3#�wû°×ò¤3@{u* LË`Ù]F˜‘Edí²©´cF*ц­G.#›�‚h'Of5Ò—’ýc;}Vó[Á‡ºÝ›n‚¡ùœa$ˆÖ�Åó5¡òv�‘ÉÍÄ­°6DZe6�c~“¬>b5º|>¹ì[¬¬Å\Qåì¸#ö]u.^Æ -1Õhjö0Q0WµÑ8ul”X ªâj)),ªnØ—»7ú $³R;;ýËy¬ �&;þšªúR¼ßâx—P/ZeRâxÍ®¡ÇµB2e¥…¦mÛ½Ø 4d7œiùÜ�ÖšËwÚSRAü2øÛ¥Xà�4C† ³v~ÆyXÅCÅ·OP�ŠVÏÊ.Gœ>Ÿâaºf^žiÉ–‹ž4>RÜûOî¢@w‘+d�yšCÐΧ“^§Æ†ŒüWèh¡§(˜ÓÂØ(Þš›÷ØCãº*¨U›å¸zêzhm„àðÈY.mxy¬ Ô`1 …<Êaê4Y>¿P£—›Ýb�ÕaŽÏ…ÇZpõY—Ø™(Žðºe$5µp']JÖ8ÑÄ«T…Øâ¢YZ^mÌMTÖ• oÒ‹C#N±^‘;ÈtV] ¤×R­Lʇ -Y[ŽÛòZ°3UŠ£5T„›sÜ©‰C(ý“½°¼\T9ãÀ^Ñ èϰ²&tû#r«°°‰9ë> -endobj - -4920 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [184.48878 504.0494 243.92665 517.7114] - /Border [0 0 0] - /Dest (subsubsec:unified-context) - /F 4 - /StructParent 212 - /Contents (Section 3.4.1) ->> -endobj - -4921 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4378 0 R - /f2 4384 0 R - /f3 4354 0 R - /f4 4366 0 R - /f5 4372 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 213 - /Tabs /S - /Parent 1 0 R - /Contents 4922 0 R - /Annots [4919 0 R 4920 0 R] ->> -endobj - -4922 0 obj -<< - /Length 5034 - /Filter /FlateDecode ->> -stream -xœíÛ’µõ}¿¢�m`ku—ºÊ¡b S8!ž»Ëš8ÆÎ0T…¿OõÌt·ttt¤¾ÌÂC^vímµ.ç~ÓéËg»ý›××·ûæéÓ‹¦¹|¶ß_ßþóî§æûË«·ï~ìþôÝo7ûßßÝ5—_Ý]ÿt·ëþtuøÿ·×?¿Ù^ïß¼Ý^|úióÙçÏ/¾xõüâò»w×ÛÓl¯ž¿ü¼áýÓÿ\ˆ†7¼y"Ç™·VèÆé–IåusûËÅå-on½àͯ·Û‹Ï®.xsµ»¸|Í!š«×ãËݯ«_.¾ÿðÎùƒîÇ\šão¥7�äÍáÑ\�þÊåéÿöð{wú«Ý4O´eV -ïÝðŽïèà�mþÍG›F KA-!]¸ ÅÁìx„&Þ ? Ž˜¾?�Ás3 ÿ±¹úúâ‹«‹à¸®¤l™2F™d‰Æ3ŸÇVpìlÓýü¤ßä ‡ýTÚ±Ävìsªur9yåPx„n‡‰M# ü+Ä—âá¨�Â2ô·iž ƒoÊ+¢~Ñù°Ÿ˜àN/T�ƒB€«œeNxîk€+3À=l}·i®þE¬®±Õ½dŽKq.Ì>Šà­B´õü“`Áͦ‘ýÛ!v¤Â%M¿À‘j^Ö"É `ÒN2%œ]L.¥/rçK!r8ñÃî‡.Ç"Ç1R3ÍÛEê"@:IuŽTWÊ0ãìpÜ'CñIƒG¿�¦8М2Šië\Os'/M@u\Iâ�Q\‘óEX2/?Pmõ§ …è ´g}¿;ãœó`MêôÃŽzÍ{Rý=ä\llÑkØM££¥ƒí£ …â.Ó4sük�arU²Ó84G–€hˆdôƒkÀebUH¶¶1Ð[¼ÛD …˜Ú¤&ä0ð`žf§Ç¬ ê‚Áœ¡`¬#í‡%bi)b±Þ0ëE,ªÆý(»?©+ZÚ˜[Ôʵö€+¦°›{ÂFÏNÞ�äáÿŠ<ÌÓKBE¯V¨y!H¼XÁ¸Ê.Q´¼Ûnp ß2×rãªà­ëìÄ}O!4¶ÑÛØ‡ß¯{âL�ÍE$%D0ï."Ñ}°VÿÄŽš¾£Ò"Ì0�Gz×9À­Z…,3%ºQ9о:jQDïê�ÄÊì(@ Æƒ3¦�Œ’ô\”÷•y§×!›õr -U»ª…nåHS¤'̇5R2g… É)œëÙíþ·ë_Ýýwß<}ñÅ‹œ?ûüÓ~æ:¿G¹£ßóê9µ]C -eÝñA»È²â‰$fkn­cÂȺGA ã\éø�ê(æŠ -ío…hkÀ1/6ªåÃï÷‡£å4¾W<æÏJ.wÂÚp:⨴Ìl—Ü3§¹Ògç㉻ÅìF© óÒ® ·<­"þX)Š™•Ò9Æ•ãòü4;œª–>%f*¡™�J™åp~˜óÇeá;ùu.ø.;-Ð)aX`‡‹£¿GÐH¢…ó!£dŠ’†-á®hajg˜’NW!²h`ê€Ä wÒœ‹Æ¾ŽžÆèMñxªt¼Q5*Ålëœn?¬c‰‡�1U*xöz|{ôîzãöóÌb‰™1B:&$¯;ýah“­pØÆ ‰�…Zpƒü5$˜.�:…'o?Ž•H2NJ%ðÀª•¦g4!ˆ?±N -f©:×j¤¶*8ãO�rlœ -F Ìt¨Ÿ !º¸y,Ü™}õ÷øHDX<=™Ù+± mšKθ2gN£�¹@ó…àsÅ”±­öƒò ˆoúyÉ»pá�ΓÁq°h½]9"ý�:Ÿ…K[R,RiÖêNm–{?q™äèQÐed©ˆ E˜{¢„dÞ(ã—ÓuŽ€"ž~£•y“*%¶ºøwòæ"ÛÌ•­DÉòÔ0µ1€'ðµIé�8ÎE}V®D,žŒ¦´òGS$�yà–)§Kì9éÁ\¤Ï1å¥m¹&hòIŒì^ÎËJb«†G -öyü* ¶»U{5õ˜œ²PT“¼;CatiG)þ0Ã*Šd¦;îeO`àEŒ÷$ëæ­pú8m Ô}¶š¨DAë[éÖ‘01*/;Ïì�°?¡@­(µ"Ë$M+™b•ºÈ›!(¬b\8T£eÉ<±ïAžx” `¶ÔZ¤Yžî¬@Ôé lÄîÄ¥ø[@Ù |ž_)g'e4°\†žŒôìªàŠZ0±ÔÈ,P·PÅæ)­Ôû®K)ÏçLEÜ?O‹R£©$ È„¹q-ãº]TörÖDâ€þG8·Å`›¾h®ä©X¢$ Wm˜j= WCÂõ4j>þ8Eq£XnZpθXg§=hyHšƒ÷ èxÞ§ðÿ>¬Ý¨–N…é½M$h\Õüqzð0ûeôB¦+BW“d 9sjAÝg”lðLh§ø.Ó;^0š›kz”¬Xk™î—ïËû�)ëGã§ç·5S8ôOU~T^æ�ö°%±…¾Ãª…N™ÄN„¶8F:ÔI `W�`tK½…4Úfhõ2'N÷F«wšnG1þ Ö<­5Ü1î–èêØ,#ÕdäÁ.t2Ì« ăÔÛa‘û(Ãyé<_¡ŒhxÍ´÷ίæYwÀ)ô E/G}º/ -ÛЊµÒZ³üh_�{Á@ÿM ‰pÔ’ƒÕ»±öú°"v"ï³ÁÑ”‰Y&TÂ�H_Mв‹8õÅt9·Ì›¶Št a,ŒÈû†1ä²Í‰Å0µê™ðr«�m HGVÓ˜Ô&=ôùÔ¸,‹§É(�nÓB.g&ü˜‰8ÉœãNOg øfAý&Ã9Z¡I½Q°=ÒÎÂZxô•.ûd¢ùÉæ&DÕs³ÀÐMg­�ö$5’Ø&“̪Åqƒ˜ö �¤ ;f(߆o\ˆ\+É2X¤]Ëœá‹Ävf0±ç ¥Ÿ-ØXŒébÁÛcc˜ô~É ]ª ½Å¾Œ dö#ùTÔíºXÞ&¤aF»•Nsù¦¸-]Ü–²‡m©%Û™Üüv0ON¨–ɶre ( Õ³x±ˆD˜ŽÍ+Ñw/æ¤Æ¼ás¦­Ûf0g4E( -2NÛŠ°š0çŒl×ë(P+îçÁ”€`¼•ÇE$`Uݧ£ÜÒ‚Y9+ÒyØÞ‹?aEÛ2.+W/×§÷˜+ÞÁ4˜5.xˬ”r("ïF2ïDWÌä:ú0*”IÞÄ« éªÖt ™¿¥Uä“2õ"+€6H¥@öÜQ�Tr~ÚPL÷‘g©èR>¸®>ñ -2ºøG�¿”œ% ã½1$.ÑJH88¹¡¤L�5S“³Ç�Oóèù’ZrÉê$ùË¢X¤€”޵VŸM@I -Èòêù8Dö{EX IG¡Y+¹ôK€5ö(+x½ûý×î‡ï~| -iâ»Uθbå=hq�©¤Ä͆|´H'SÖ -ù¬V”Rf M²†ÐLqy>Ö0$k”W¯µúËEG9=êá7jï°Ðô„²L©Ýh•xo’fYa®^ßeÖx„¢È©³Ó±“Ôº¨á¡¢,ȇR‘~´®œœes e†t$CrάæçcHO2dyõZ†Œ¯(Œ’ÓĨ+Þk3˜3"´eŽ{c—€o)‡¢årwT öÿŒûgg\Ë)ÆUÞ²Öù³1®ãV¬^}KüÔh61Û¾•€„Ù¢K? -­å(-¶>ïãrDØ\øhif4'?1Ó9,bÚ¶�V¹Tr‚Ç }�/ä–Æ@\UõQc ZÌ“Ò-gV½Ï…B)j&U6ªÝ oã‹£—%qdHaèSâ|!IkIaX^½Œ˜¸v¢ëAèc ] ŠøB#éZ0-¸‘K@V”ŒHˆŠ�#°Â{]ý�wm -Ò Ê\ãE:ú43_ꕘª‰ô†gÆJ: - ªÒ––l˜©LËl'‚f×6‡ñxÑ2ë¹UkTo©‰±\|2j*ea ôÌö²…EÍÉŒ¥zÕøºÂ �Œ¬BÌü|Y :â )U̹JS†j®™E#?GµoˆÙxCëaþµÙ!8�ĈºÆÓdšÝ=á +·­‡g%;™—˜š¼i,=gFkå0õ¤ªA¬Ö󉑌k+\]x(ÍLSôT®/!F*…²ôÅÉÒ—&Œid4í2ClKzGy:|Ï ÓJ«vyVzd‚!8댉~´Ò�º®BÕ ˜¹…-Ä-•B 6…E@‡e;Œ,iîš¶Njq®šfOÖ4×,¿bŸïÈ> K€1õ#”  a˜¨Þʪ÷«=zM‰®©³rk€&[È=C?&p_­˜»‹ç¼/ -ž¸Ž.ÁM­–«é|lŠ<\TV_ÿ* ,aA–›¬3‹÷ÖZ²4O8Á”à³üË*¹Ö’×j–¿ß;à­$ï€/�è1£¤÷"Ób&zÖó}XVÒÛß™ê.ĸIV,¶f ‡¯éðçθÞÿÀ΀×íl+Þ�â]5…„ �œmá½K›â ¸ûÄgf½5þy¨EoÖð­"åŒqÌj¯ü¶D>ùÁÐ>d]¤™ -´¡àC5 ­ 3wqy¹š<׈b,E­,¢çX†‰ ,—5ÙëDt½¸½�åoÕi:²ÙIÍòps…Ö’Í–0®®ÌI«Çü•"‚¬eî«XXN…WüÁÍÀhAàH¦á�d ,³[ÚÇê-#°cE¡\­úÔXîÄYs½8ÚSi.Ñ2pH;¨aAÎ[ñ)”ÜVfè,GJ Å™’ËZu…º€5qµ GƒË2§Q ²´d+K!,³VjaÎ&£Éf–UëßO# Á9ÙIc¨"i,¼e‚Ž‹cø4㟂”–%ç'.zbcéOÃD/¬ç²oÉ]UÓ“×�{�%± dÒ1‹!ž�žã7ãWÀÚˆ -ÌÃÍ,arÍñ«ó¯Õ!HÁéW�³«Õ¢^ ×øâɃº„k/©ïL5SøÀ4Ó_éµäU4µ•Ž -îÝ#¥%u­Ñ™Kd—¾»°ùA–Ðq„¸€!¡�¦¶Ò™'èâBr´´ë Ô•1AógÅ‘c9bÒ׊�9'FTÖ˲ã«o™RKB I�)Z¦…•cý3D9ø -c$7 ™^²ÇnƒÁÅ�ú‰"„Ð.´Î3å½5 úóWÖ ŽÅ¤qÝ¡ªÎXcŸd¬‡-‹gÈÖ2iEk×ÀáZ¦2·PÒ3n¸TgBêþfÇ 5 KW_i€obâ1Õ×j©-š)[A—±÷û Ɇ9�4½ÂCÀM©ïx¶Û¿y}}»?ß³ýþúöŸw?5ß_~öv¿ûË�Ý_¿ûífÿû»»æòÅÛ·û»]÷§«Ãÿ¿½þùÍözÿæíe«®¡C÷ DÁZaÌ’Û‘™Úx÷ÿÐ;PË -endstream -endobj - -4923 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [360.01215 517.1564 371.01215 530.81836] - /Border [0 0 0] - /Dest 4523 0 R - /F 4 - /StructParent 214 - /Contents (42) ->> -endobj - -4924 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [418.70813 517.1564 429.70813 530.81836] - /Border [0 0 0] - /Dest 4524 0 R - /F 4 - /StructParent 215 - /Contents (43) ->> -endobj - -4925 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4378 0 R - /f2 4372 0 R - /f3 4366 0 R - /f4 4354 0 R - /f5 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 216 - /Tabs /S - /Parent 1 0 R - /Contents 4926 0 R - /Annots [4923 0 R 4924 0 R] ->> -endobj - -4926 0 obj -<< - /Length 5049 - /Filter /FlateDecode ->> -stream -xœÝ]Ý“·qß¿bh‰²NñáÐø†‹¡CQ"é”™rŠ—äAÔÑâIL‰G弪Øÿ}jfw0 �ÆìÌÑçèA¼»��_7°On÷ﯯÞî»G�v]wñd¿¿zûÓ»ºï..?þò}ÿ§W¿¾Ùÿí—wÝÅ‹wW?¼»íÿt9üþç«ßß\íß¼Ù=~Ü}ýÍÓÝ·/Ÿî.^ýrusíåÓ?~ÓññÓÿÙAÇ;Þ�Cç=ã€ê¬òLH§º·voy÷ö/;ÞýåíÍîëËï.ow×¼è.¯§—û.?ì¾ûò5çü5òð¯ÔÇßÍá_®Ž‡áßÛã_ÍYw®³Žè¾Lå !~uÖ?>w{Ö�ßpÖÉñ·Û„>l’ð¡èÿýmíI}Ö‰ãÐÝY§ÂüÇ�mñÝÃ'oæ½æÒdÔ}ß]þëîÛËÝ¿ãû -Ⱦ -#7R˜–�…Î1WÛÙÀqKÑ"0Z¬dF{)·Ù7SG¶ß¢ ÌæG¨‚%FM” -ÙüÓÇÖ$VšÅ«4?:hÄžŽ'Áõ�úƒLGô=Ht�/YÕaR3mÍ'Ðau&[Ϥà^£ -+ýpdË8³°gݹà¤êøÂFoU09U ÚcaÒ˜>±©îl±pÖ�­œV}“'¡2c’½¢cúÎ:9êæãŠÎ£E6ñ%2 Y#^bœÌùSú=Ÿ+›¨…”äŽ�:Pç’–Á À©€ðx�UUÀ<¨52Ä)•QSAéA®æAôÒbç¥Ìô ÇB’{AžJàq�ƒQô,‘É\‹˜æ¹QzÍe¢/æ$žA´ÁðÿÏ(hÎ2ipÇ„§€` öÙYwùß•ÉM�ôä´Cd#tŒ²= ýobFÒŽ“EHL×b ÃÉãžJøA^ˆbÁ5iéF Jöón��ßMщQPR¦I%¤æláƒÊ„¥t?ˆ&LœÑ˜¨£EáÄÕäÊ8ˬç« Dí÷jHó7X$#˜ÕÖNš'è΄¯�ïè[1³Fž·Í„}šC©f:vR÷±•+Ø|òâÞ|bÉr)O�È# ’À™ñÞÉÑ -òHx³ïÿÿEÌ u"` ©SÎÁ`/q7USèS%QP“¾KÉÖ'ºŠË&I«up�&¯#Õü‰ç7w±?+�ûÏúò©oÓ¥6ø4$:°¼‡åÌT¡U ÄŠTÃ4#5ÛIÇHíêÁMõùºBòGù"y(ÆÒm®LVRG”‰ÕÅÜWdŒÏ³¤ÃW}¹§¼ÙRÍÇÔó |²‚ B¥ò®s5ËâùI{ÖÙñ‰›Ú�ˆ]]�Î$zN ´Þœ1IFÀ4Ð<Ÿ&ŠPÏ1!\›‚¨* Ù2FÉU J„#Ùn§‚9*ù9ÖƒxU´f° Á I<ß’ø4€"P܉‡>[\ÓB‘ «»% s k*^T7ëw1ƒ‰Í~'éÄRÀ9ã° ¡YÌ0e "_s ×Gƒ>Z…$Þ -Ã᥇³|cøìKlo?K”#ÇÜ@Ë ®î* ´<Ýp݀ʡ9ë„eÎ{pÓ‡!™+®D¦n+C$fKÏóëq¡h$s<Ÿ¯mxÙõÿ{Q!*¨M] K”¼„œEuëQäǤ|*¥±X­£®ó<ýÛÌbÔwMÍæéë(=87áe¾ÂÉ£DÄô?þéêæÇîËw7gˆ¼(©˜Fè�‘”vÑS”6¦±æYÉã^RDc9,e ó„\/Ø%F›¨zX¦šÌ!×îj:M;Ç”‡ êžYMà Ci­;7š­•0‡õ�£BÅË/,uôoÊCÍòÈ£è�|˜“�y’cÊ×c¤;�‡ÐZYi”$ÍŒ¬nPèwªºya±§U\ñb³Å7]Éa†¢BÇ5òIYïÙ(‘öU‘¶Š9áWi³œ£»Ö° '„eZ+í'Nˆ†€!+*BmÈ …Ø&º¦yN<��ü…$MwXŠÖÈ}ÅFûS†À°(YÊÿäEYèäÓZ¤6VP7h?KÀze?Ç÷=-•D’M’3…™(j4’´ÌǬ弓§7KâÑÆû`)ï- u‚àU�`€�±Òœ®7f‘bR[)3øeE°ìá˜�m“Þ´L�}¸<¼Ê‡@SXÒ;£ «TjOÁ/àÀÖ(tôtó‘'#íƒ.b±;P�XÉüz[ŽÆáMqëÉÛý¯W?_¾ûë¾{ôìÛgÏ8òÍãqä–†‡Þ98ô<¼|Z#·šÝÔÊ2Íõª(„HÀFRæ8“B:Q4iäVÞ§z¯DJDÍÿH§Ü�Œ˜´]Â&�›�Œ5r5µ׸OebÐæ¨j»Þ°ukM™!0õ¸«þlâëÄ*ï¦è¨!.>Œ~x\ã<‡¼|Ú[©¦Ïµ”Ì©ù×Ê2g¤„Ó˜_*JãMq+:q’˜àUy‰núü¢£ªOðšê4­r"£°µ‡A>+>™§¯—s?YT_1+unÔxi�d?êkMÕÊù™¤B¿2)ìª*ì‚3p«2�™‡QÅQANçO=È÷ÞàñºnH" BÝ4a�ÖA‚‚OÖ°�n^É)¬¿Z�½>ëLÔ0VFt¥�‚B V{“Z3ÉÕ:˜ t~C4æ -¬3Wš¾P*@¯GéÅ� I>`µ -ia=!ßR|ÀÊÒjfEŸ—ØBZ|Æ=·Oç©u¼i¨KX‚T�ê³+ð�Â’Är1 -³Ü�ÜKd„(±Q ¿žŠ& IQ¨ ª¡ó`3 å–›lÞ�²Öª¬¼gVåÏ�ý K«ïÕpLKÞFÕüŠ·ÀNÖ9;ðOÓ�sj¬RŸIL¯ƒµLqeõÜŽÚ·‰Ð’·,y¤2vŸŸD(¸ŸkÉZ¼”œ9­lzˆZ|ðk1µþNÖâ%jß g‚ k6ÀCâEÕó¨®û¦ê/òr˜A*�Êh9ׄœ`ʘf•#ÇíXA"Ùî(¬L -Ðz&´­m�¢DRÎ|žQ­„xÈ‚õìP½gÓç,£åQù‘ß%I9Ç1=TŸ"„7P pv4`Ìä…ãRÇYmÔ—¢çÈ£#"‰ù'BiÆ�0¶ešÎä¼ÅíRþäm!‘»6BEפRS{]Ѝ=U×Þ™ÈCuRV>Ìÿ°NÄŠN)ÅÉN)pLkí[6œj”9[ó5¦³‚µ�Ó3@®õ#5ï« ^ÞXKçêògŸûˆ°§ÿ%ØØÇ)VT«Êh¦ýº*Fd¬ðH½_0a¹ Ðì4~ >õræò—Œ7Yœ©÷í¯.P²àÆ<Ó˜RÑx1ò^=Eš?Ÿ¥RJºÙ«K²«/*ãÔ2ó ×G�X’^£é!-¤m�4å5F‚'¯s„nq™Å ê�Z=)Þ¯ÄK½…pÖ Šh©äÑç+{ÂÚP€¶àÚbaÖ”ÆUµy^i`^®¨éä=Z0å‡31±C�ÒÖU�é”õ‚ZþtK¡£ÐH…�˜Üƒ0…ö¶¢rmÓŠðO ‡z¢®«ì­Ó{õ^¤e›tìë³NgדdÇâË…a -ÔhZX;ŽËP“ç‘'Z°Ði”æˆ�YÞFÎÃ�CTópþÈñÎARh£¼Ì+Ïíz!.êR,+B¿^Í_¸£v\Uí°WÒ1a×uØ7*zŠN,êô‚õùXßB'�årä5,¼�íäZa¶à[ƒþ¶9í¥*žŽGšZ‚Í(öùg£N'ÓkiÇ´9ï_,\ž=¾Ê#«ÆNôyɽÈf&ä %b�ã?·_Ðûì$¤IBÚY”Pßµø†³Ï W^¡ Àyf®¶¡•CåÅó¯è¶¥t¼úµxÅÙ›[5(¡­Þl „b†¯ªP„#^�)¡§(¢T.½ÅHc¡;€dB÷×5�~z]“¤ «G�ð 8´ÑÖ~-T¤ýÆ» T”Ìlç)Z°²À”ÓίáéÁž$Æpí×/ øÁ$6!ï8ºû°ãÝùðÓϳŸ”–L+)ó?ÿiw½ž„0¨Š Û}ˆÿbí|âðžþ(lLP¶%š -î­IåœIWÝÕÇî š^YBJ5?Á½Ÿé×ñ�yq†ö0ŸúS§ªq]œZ×(Ê ÕçiÖ¸ù*‰”1$¥×+ž¾ÚñîÕÓÛq¦»ÿÝ©îe/s,òîçÝ+j|àjœÀ*æM<3Ãv˜hš‚wÂ3®i&Ë„óÓ½Õ,óbÙøÂõ)øÆ€1Lɦ ÔaÙ }¨gж¤eÚ7Í` J3á½tM3HìY68Ë Üå’3®Z'X²É‡‚¦ä¾Ï¶lrÿv#íýزÜ3.ÛºxpÐÀ¤ncLëà�+ 3ÂK¯7]Òïbts§£ó‘3^2Û¨s’±3S…åS\PÏN°á‡š¥Bݺ£A%Z°4Yó÷AÏ:ˆùrgàz*Ã�upS«•“VËV€”̪F‚Û¬ü"{=K€Â<©_oXçH¯xrVcöÙÙ’K@Ð{,_P¼5¼ -Kã˜P§Ãr¨E×oÁÅÂH€Fc™VëövIûvžé§ø‡“Ú0Î èúu�þGœ?Ñ� î¡á¢Y0{«ÿ{ -®IÞ©*ö´dNœŒ=EO×�§%±ŠuóTTªZÐCã­™8ì;Mü*Ô¡÷@›³7¢n -H²ÒUA(=Süd^P ôuʾQ|'«YÒÕ0‹æìµbR  )_ƒ@‹Z ³`ößfõ‚:¨Þ7†¹-Öo©õË*h…bÞÁ+,D-e³­¢œÉ„ûLÕ܃>Á�Œî›œòIBQ/ÞJXsrH¢ÇášÕ¹%»·AifüF Ý·¹ÝUóZ3�[3ðd¯¹…¹dè^2¥6bn(ÉçIºŒ2_•bàLŸR -Ì¡ -\މ˜4Qr�L�C•¿ ÊŸ¦|�éq¨âw foŠ»âf<„0L_=²’Žâæô )˜?¨·­ø÷¼öm5ý¿ÿ±¾\ÿœVÿ/šw=ô -–qß(�¥]èù@©´»©¿DÆn -ëçŸ"(wøÁYμýÇÏÍZf¶Ö'F˜/š2C®j�„7 ¼9Õ:/ -*ùow1…×Qáæ”êåXÝãqr8<4õPRßZU®9`NÂTZÈ6O±MT�z?=È-Œz~Ç7úípè‡-ìÑÄVö|82ܰ�56Þ£Ý nÁì­Œ_¦ŸÜgB¤ôº -:c™‚ÓÃÁßS ££— �ÆÄ5ÐOzüËËÆp°…°Oz:bé/˜ü¥ Úz4WeÇppKÞ•ç œ4+,ت bAàh?�eX÷ò)Áà|“ÿ@S!Hè驟AÄݧBïš& ¯sÆÝÈŠ’Vìýà ÀÑHJ3¢•)5#é # ³:B9&üÖ›r·áp,ø¾?áÐ -ô' ÉIÌ6‰áúf'[óÙÀѨ… &šiX“ÑŽ~ß· æ_Í ÍC¼µo -iòþÇ1ä Í1@Ý`HÇ´ë,Æë=MsØ`%¤eÎÞã -> _à$`,¢7,`M¬è÷2õ鏿éï‰E¿2IÌ{¬ä#•u@•¸5Lܹ­øøŸ´ ÿ/šW¶*¼B1Ð@”Vhám8+ è—ÂÌÄWH¦´'ôÈß§è·_sñ-´¯]ô¦ý~óÚçÿ»‡Dèíá}ìs¨¬áaSâÐûÀ…ƒþÛ€ -.~]qÜÞ=�'¥Zæ‚K&3½Hu&µi+òýÍôzÛ§€�lkXÊ:!Fí†X2³Cí;Žéï.C/ àƒþˆ¬Í\ÐT¸öx8ÁK“ðáF¯ìò°E¹ôFPp‚É¡ÚÞBñÿ¿\zO©0Àœï-Y SªVà=eÐ+Jçq¨?n¹+wØ— ’ÌŸILše ÙXA¢—ŸNê¤/ ø“jUs}B{ ²nËz:Àß×N\�%óuh†m ~•õ’%ëÕ<ý½4fãC[ÖJ&’¡£Äb aÕ1Õ³7ñ@Ñ#'©í&Z�v�ÔÒ[¦x]j�fÖ®+ÝỸÞc8Å�-´¯ZôòÀ)nÜ‚ww7*Y�×ð°-nDoy›âÆí˜¸‰ÔâW¢©Õ‚q Ò¯“Z²;ÐK¬fR›ž2½Çq#zAÕ7¶,e�»jܸ+·ŠÑëž&ðIËŒ;¥•kŽ=OR¡ù‚¸QÚøø¦q#Mjµ¶B2)V×V~O“Q/­äGŸï“‘E¯²™ÙâW (z'ÍÌÊnÁ½;7³Z×ÍìZ.’¾1zÅJofû~íM¹ø�Ö± è‘~©Ç–íU{Óæi´hoÆ®íí7çŽKˆèIcãöÝ£=¯`ìÝÞTgÜi÷6˜º ãŽy¾¦Âxìm£[ÊŒhoåîɼ^ì©›ýèÚ‰øº‰p5•ˆ.\˜ÜSr%hšVLÛVâÚ“S�hz)ª†¯˜êÏ�žîŽ��tûq?½€åžeÿˆƒø Ô¯rqˆ“ø0ïSdÿÐ#ø‚�Ù¿•L¤u~©‹àÈmÈD¹ÐK,Þòv ÿÉ~õö§w?tß]|ýq¿ÿøáûþ¯¯~}³ÿÛ/ﺋg?îßÝöº~ÿóÕ�ïo®öï?ޠ݆‚�´®ëïu†þ›HªË%¾€ oþšÙú~ -endstream -endobj - -4927 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.36813 292.08337 218.66814 305.74542] - /Border [0 0 0] - /Dest 4525 0 R - /F 4 - /StructParent 217 - /Contents (Footnote 3) ->> -endobj - -4928 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 93.517395 82.56614 104.24536] - /Border [0 0 0] - /Dest 4526 0 R - /F 4 - /StructParent 218 - /Contents (3) ->> -endobj - -4929 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4378 0 R - /f3 4366 0 R - /f4 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 219 - /Tabs /S - /Parent 1 0 R - /Contents 4930 0 R - /Annots [4927 0 R 4928 0 R] ->> -endobj - -4930 0 obj -<< - /Length 4465 - /Filter /FlateDecode ->> -stream -xœÕ][“µ~?¿bÀ†p ¬Uë®Ä!± ±IÅ )/äó°668…×Îr¨ÿ>¥sÎ\$õ¨5—³»á�ÝÏhZ}Sw«õÍÙƒ«Ý›×/wÍýû›¦9{°Û]¼üéÕÍwgçïÞ.=ûõÅî·÷¯š³'¯.~xu.�ïÿþúâÇ7—»7ï.7ŸÞ<üâÑæË§�6g݈Ÿ>Úüg oxsË™3TcµaNsÕ¼|»9{É›—¿lxóËËË o8ºy»áͽýo?~SZ2­¤Ì/ÿþiózóÏ¥$tƒ‚gÆ6oû ‚3°Ã×¶øà·ÃSU´W1<"æÑ³ gfÿŸmž=úûF5OoöŒ±Ì‹æçͳšáåax%™’UÇ§ÇÆÞ_yöþâò¨)O}õEÃ[É™lÚy)Å@ˆœÉÏ7¼9¿Úœ½æ�kÎ_÷φço7ß}òœsþœƒln¿oÎÿºùò¼%-%Âo»¸ü±ùäÕå¡ - cw„¬À¾]\~ -~¤Ï†ŸMû�ÛæžÐÍáÞKŠr�HT•ÄrŠX~>RþA÷¿çW‡ëRoÁ�4s Ãûž_‡ë®^õCqyü'.Ž?u>ÌŠᇳ­.ƒeœ’e~@‘v@U<Åø/ÎM�¤aÂH²cN;»ãO Ûæ´ò~Q|¹õªô@÷‰çÀW.ÚŸ6—¼4fû—«’*ù¶éîïHi-åHÒ‹Z6ß‹4ê*ärEºïÙn›Î`ët ‘@¢ñýôq©N1BBš-ƒGèlUKok¼ã/¡/:#¸æ�Ê{{e$üƒÂ–œn]ç’ImÔ÷ -ì×–9çÖ5Ðñ1ËwÍ÷äÅ{%.ß=Ùÿ—§SPâÞ\#GgÖØZ^VIéæô¤5îá‚¶–´|U§/ÛFvž_@é™)#¾G‡ŸyMÚ‘è’#1Î3ãÕGÒN)1§¡ZÖ£áGoµ´ìkc; :ú¹£’í¯'†žÞ?MI#l¥çœåkÛJÚË3�qg™‰´×‡Ow¦¼,h½Cé’¡Ò�.‚5Æ3!‹IP+ÔžgÇ?lÌŸ6%áboš)oŒŠc×û…[®†QØÈ¶ºwAü®Î¨£øì¨›‡|hàt‰À6ã‹3«Á«Lt}Éìøbi)qYDBB+u•ˆÈ Âä“ûs¢°‰qvì"—è·–9J×P/ÇŠy7oM;Iuxb¨‰û ùîÊ¥àLXíÄ©ø^ l¨²Và�Ê0 ÞšuxÝÉ}Èë#ÊwS €Ñí<®@®Àéa–{"Ë|Έ% yú+õøƒqš™FˉÂ&N–’“(!Z3mù‚jG»*ëš…=á3’Êô6Êàrkï±ü�ð?§�CîÒײð%rl¹Çïœ/'I-ðBÒé:©IÂ��êõpIn}ÙÑH®HÊÕÈZÇÁT[ãt3‰¢:•p2)‰a@Ûé-O=Àˆu90¦ŸI˜9H£¤%WœH­¯HRât¬OÓc¥+Ùð¨ÿÛp l] áZ§5HÊŸÍlB2vgl˜?fn‚ÒÈr⥀yî–Rl™%‡É|'‹8Î$pëß–‰¯tsæ‡.ç¨d·O�ÕÒq:HõËî¯,OSR2˜ßàŠy+¸®ùôo!¯IBNÅC½*R#:8rÆhVà<³Š[·‚b^’Bk¥#*”.]ÚãÒV”áB�–C¶q¥Ä֦ΒT§óû¿›m£g…½jyå,«ïeoU…ÉO­aQŠçŠQ8&Ô¢’6¦]9™ˆ›éØ8\P­šŸÇ–‚–ÌYºfâ7“\ ,)o˜ÐF‹5–êÒ"WìÚî&êˆ×åâdUêMø£têd#…Í<6Ùëëå%¡ïÔЂ95shɤ�º9Ú+<þuÿdDP¦dï�u-©\1.Œ´KzZ×›{õ°ý u”»A!¯½x–{ umS�ŠiU;±º>…½"» ÉNëŸìäøk¬ì<ÌýG\\ŸÔL¶í}Ì Ð…³ï¾áL7ÿôàô¦PÛæs|ƒuÌp£tU‘WL©i/PFF~m¥ñE7å™5FšªHì™ö%S¼r¸ªñÕa|Ù(®™6•ã Ád5ƒ[$Óuô—¹Ð&1åTjͱ;º¥“ÌŠUÇV‡±å)Æîx"�gr¿3ï‰65u¾Á&<‘Y aÎÑÇo›ó—|·¢(ßÙ Ó±™¾@½ÞÇöħ¼gC®zÓ -Šk½éX�¨oB*@ÉžÛÕÐE¶­vXÞ••]Ū¨3J2.gëÌ¥3šÔÙ‘Z…ÀÐ;��9¨Äk’%˜›%wžÐ„ÔªBIt5þV¢+‚‡- è*RÇΞ–G”QoLxkåû«Yµpi’žÔ5/Âv¥ˆÉrD_v w±ECpÅ›[¦o -[ax¦åµè›Âª-"4OóSêÛ„ ²Š‹ô¦¹ñŒ«µT)ru-i$­jló§ÚR–UŠ\%„L¬g¹+bRå”A8f`öòJå Ê–WTÎÌÝh¾ ÐõCw;Má’|A¡ù‚™ðöëZ¼4¾³²/M-ç“#ø¤Q¯Ï�I¹*Ÿ¾¥©‘œEƒÅÀ;"Œ·8ÊUiÒ³Ì/©ZÎÈ�¢~ðêxC«‘48VM�-Î -›«VKM' V‡-Æ,æé®Î¯k4Gµb¿*+joKúj2Èj9Y:ªQLÈuäÔ5Äç{Nax_¸fžWÚáÍdööC¦÷Ú—Ü¡òžÙù%KKxCËU ðv¾¬^¹z)¥¢ÚLòÜËpÊi&ç—á<Åó e¸toë†ce#‹'þ+¨]Ž‘‹eÊræ¥Sb¦hO‰VWoWRˆV›k®¯SÜ­ª x¦pǺÏîÔOv›n?r„±%4¥ Ó³’ÐaÈô'’WöEZ3·,‰ €ÌýfÑ) j¢hViY9Ñ%9­E×\7áíKË5ÆBã5æOí�YQÔõPÅŸÕQ¥;ò%�öš¯ ê¾¹¶<Тy hóÀ -º*]òÔ.4’p:#Ô¦U·ÅÜ­Ì-ºÀø½&n.s[–Nß8?V}—3uBúf]Ñ¢…efV -‰·IËúb9G ÃüZÙÌ@„ÕÝòï=P ô�Q$}KÖ‡z}3áí·¿©Ö�m¤ïNŶÛ5�®¼0‚dB/5#rÉqê£ -DÔ5z²ý~§ŠûýtL¯Í2p´áÏ„c!•t– ÜSŽ®o–ÝWäÒB'Š‹èi¶°/àVࢡ¸ˆÖ"0or±6[ð o¿^Ó£§ž•gF­ÀEjÚ£>[&a-,®Ð$wŠ)ŠtŠ©Å62?ñ¾l¨É��ÿßpt�¶ÆU1Ó%& m‡^_­�·…áhÛ� çþ+Uk‰õÇ– áÓvU†;¹ZE¶£WE×`<ó‹ë‘ÔõõÈôt× ï -7ÅmÁ -ro‰¹Ñ3µ%€D©Â‘ëÈ›ŸÅäP»Â9n+$Ìl‡éÍîªgv‘Ômý z\Ì5«Lt�¤�NäÍÇ'ÐjÆÇOdQhb‡5!5 `d(ÅX­k4ïÆ��£Ø‰Ö2¡½_n4_•…ŠAµ* §ÑJÏ*ñþ²áºlFš´ë!ØY5Š;EGb5¢_ÑhÛ-¤8`5Š[©–(Ð$쫬\‹*âkQ“bµH�}¯zÞ£­PE ˆi>z:f -“—Cb¥ÈIfÌHR�ŒZÃÆÐÐ2êÔª3CÀU¾<Š"=­jéìŽ{©£,$ 3Ù ÖGÜ1kùõ@2{ÃŒS '÷Gÿù³mc2ч¿LÐ~lMûRB Œ¾9n»›u=¢-O¾&{¿3:ZŽ>‰hòiœâ„¸aíVxá5ƒ…�—„ •gà@‹Õ>’8m9ªÐÇ££~@"¨ÒŒ§ÏÔ�fÒ¸PÞáœIk¥+ÊÁ03;pPMpÌ·Š"\Ž2ónÆÌOIü¾\Ì�8õøMeäÔ|ÈØ“uzÔ;b, [Oñ!Fa¥ÇfyÞ»Õ/J;ñcODhûv}~DH£bM·E׿ Ô¯VùÓLüOR'gçë¡þ®Õ>Ïö*7\3ŒÁñZ©'héEÈãÎZ…¢IîGù}HÓƒÖS¤gZqáVQ\C}}"fâluvˆwÛ84hŸÓ£¸®‘ Üë=Î mnup:4h8ܶ+Å bƒŽÓÐèUšðIÕð"HËTøÈj~…Ç¿îŸ,‚ƒ‚àÕè B[&„) 7‚ú;ú3P„­™Yõ¹¾mLï]ë¨Uª'êóV|jµéæ¥EÌÓÕECƒ�«ÅËôŠI9 �SpºÆ{ã\ð”fÒ×¾ úËÊà'8ÇŒN@]×Dü }õNƒœy‚±;äÌà$½Mts-8уç~«£ ¤gÊ;§Bæ!«Ï:†:ÙÐoþ¬#U<ìXAqµÓŸPîzœûúíi4^Cÿ -Ù÷(Nj¯Ê!û°Ô‡³ÁvŠÚ7\„æ[é aM%}­a e ’](h�òÌËZbuWá¢zÊû«[&OQÿü¦®B×ä{«Pþ"þƒÎ,H"üœ� -’ òf<Žzfu[�|Z“þŽY´!ô Kå¤?&T §vcÀë8ºº¶£€£¤vÐA5”ÝЙQ�$Ø7ØöÐè -®<5 -=ÔãÚc£+rôÖt“Jò£ÀBiæöå¯$1á¨) xª½¯âdp}€£©vÜáõB y1ó#^3É!Ç‘Œ´D›ÁîЫ˜,®b`,Ó|>î -ubP€Ö�\’„ñFÅRm…8”+a*ÁðèI- -óp$W˜ðú) tQ¾“ÊE` æl­œðˆð$·šù¢d3åðø½aðD[£*~´#`¦sçfÇ”¨(US†ÞĨÐ5cùè‚ÿ¶¯'j("ÏÏ�¿ÓáŽNkHœ3u[§)˜½iY†« Ds2è2 ðj³úÖÀÚd·'Žˆ°½íáSs»Ê¼üÉä7pË”×ñ'¡ÐwØ‹áFxOü”#·c|÷ò�¨9"&ÕLÍÏQd^'�ŸÑðšYc¥/ÚÆ�ëÁƒØyژÖ«sâø5ËûÑv/‚±w§ÿˆ–�ËñáÆzÅÑžîìQ•ïÕ#{9ȳ1€D2@Èã�.Uó¸")¨úÚsþ2실é]ÝWS[Æ>î»|B-½e&Mï´ÉÆßG9•lÚµ¤”F{z]“èºÒ¡�ƒ&-NUÖÄ1Ýý`W+>Ç]<~à4ãÒN°àƒfwÊÏiûiWG­$ dä^LìlÏ쥪37Ëg2_2ÞáÑu†è¢×+ö‹Ü­t*Y¿}·t4éÁnwñò§W?4ß�=|·Û½{û}¸úì×»ßÞ¿jÎþòîÝîÕU¸t¾ÿûë‹ß\^ìÞ¼»ùÊHëÂ'=hMÔ -=8{V$ˆ�ÿ}{¦E -endstream -endobj - -4931 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [424.47882 568.8544 427.7788 582.51636] - /Border [0 0 0] - /Dest 4527 0 R - /F 4 - /StructParent 220 - /Contents (Footnote 4) ->> -endobj - -4932 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [448.44293 555.1924 451.74295 568.8544] - /Border [0 0 0] - /Dest 4528 0 R - /F 4 - /StructParent 221 - /Contents (Footnote 5) ->> -endobj - -4933 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [436.5668 480.0824 488.00662 493.74442] - /Border [0 0 0] - /Dest (subsec:core-impl) - /F 4 - /StructParent 222 - /Contents (Section 4.1) ->> -endobj - -4934 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [448.2978 425.4344 492.196 439.0964] - /Border [0 0 0] - /Dest (sec:theory) - /F 4 - /StructParent 223 - /Contents (Section 3) ->> -endobj - -4935 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 336.6624 131.14336 350.3244] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 224 - /Contents (Section 1.2.1) ->> -endobj - -4936 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [123.86342 254.69043 176.0907 268.35242] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 225 - /Contents (Section 3.1) ->> -endobj - -4937 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [146.12852 227.3664 206.04572 241.02838] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 226 - /Contents (Section 1.2.1) ->> -endobj - -4938 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 179.58038 130.88567 193.24237] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 227 - /Contents (Section 1.2.1) ->> -endobj - -4939 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 105.24536 82.56614 115.97339] - /Border [0 0 0] - /Dest 4529 0 R - /F 4 - /StructParent 228 - /Contents (4) ->> -endobj - -4940 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 82.78937 82.56614 93.517395] - /Border [0 0 0] - /Dest 4530 0 R - /F 4 - /StructParent 229 - /Contents (5) ->> -endobj - -4941 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4378 0 R - /f4 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 230 - /Tabs /S - /Parent 1 0 R - /Contents 4942 0 R - /Annots [4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R 4939 0 R 4940 0 R] ->> -endobj - -4942 0 obj -<< - /Length 5550 - /Filter /FlateDecode ->> -stream -xœÅ=Ûr·±ïûÃHJLŸÄ˜XvJ’mÉ©ÈIŠ5»;3@£ÑÀ\¤è�wqént7úàòÙnÿöáænß<}ºišËgûýÍÝO÷?4ß]^¿ÿåû_o÷ÿùå¾¹|uóÃý®ûèúð÷_o~|»½Ù¿}¿Ý|ñEóüË›¯^¿Ø\#>ýbó��hxÛ Ñ8μµB7ÎXæ ×ÍÝ»Íåoîþ¹áÍ?ï¶Þp&MónÛ‹Ãÿ~þ§�bF+•~púû§ÍÃæoKAµ’µªy| ˜Vá´ý<üß¡W,‚ëóâjÙ=üsÍÕ‹o7ºyÝÑæ@#˜ðÍÏ›«âøò�¯�ã«Æ)Ë´ª_J¦tíøê8¾ÐÌ´Uãw½kÆæÇ±uã8g­:¶\yìÃ'W¿ÜlO"úúÅ7_6¼¹`f?p·ÖLH™r÷óë o®w›ËÞøæúaìÛýº~·ùä çüçÍõß7_]÷ÐÀ¹E÷¿?ßll>¹ßž#€5°†îDƒS�t«��òÝ–7çÝ÷ÇÿsnN¿õù÷ÍõŸ%–öLð#�Š`q,Îíá÷.L‰ãoéΛ az¸åécnKp«"m�eVU"Q íþðs[‚Ic`x˸[—–\ñóf$ZOK®Oÿšø§ÏeØJñÚ50¥5�Ú0¯­0+¬ªÇ¢—E@q¶—yÙ2ÇçÈ|È ,Áà0^0ƒ¸Ë–q±„jåé¼iOZáQ÷ã¢ûñ8¡ëaÃ&o¸´_ ¡N“I}~èe÷ãU‰*ž\a˜ôKWæÍ¾DK/ ØDÿ§KS+‰Ûæ$—Ì‹ƒô•q’œžrþÌ|QØç6»˜0{�â;‹zr¬ÊpäãP5ú -zVéË% 7ÖµTÃ&|ÔÃ_÷ŽY›!˜è,¿c÷Û¼áÂU  �¤òÎ2Z,�\¨"j‚mÌÃ9{GGYy¢åe¼]rsÞô_}V„Ýã­dÜc–ìb{©WÃï^»"¤³|ÝÉä¶N1g|PA*�²vq´=o.\çi¡¡}Ò±÷ÈÝ#ù�Ù1Šj`ÚHŒõ“Ÿÿ(£”ö� -ðˆ1½ŽÆ¨2¶F§Püo†bbOrEz aOö kb Ö»Ñ÷hÎÝkÀt+RO`Iª ë†|y›á’^÷ǵ‹[ ¼Ö³K,˜ÇìóÉ'f2·Â @-ßÞÛµ–3ÞZ½DèC¥©0·­¹R±ÖpÓøk »z÷ËoŠè\Eî­êà‘pˆpŒayñùú‘õ¸9¤ðÀ þ/Gä…úèQl`@BíVCN“#å­”SïsbŒâæÕý~U&@I¯�géõ¡ÙcÜÊÔ†Z=wl%â‘öȯœÖÝ;3¾"©JtÉ\¤Iêc'Ä­b¢UÒzrë 0N‡H<\¼U¸v��-5=]lŒŽ´®^̃m˼Î׬‹j<#Lø^†"Ãë÷ãVµ‹…?´úìúß'¬„ vºã—¿é~|ZDóÔ¥oY+¼ñ+0á–Z¬’òI;Q3f–A'Ä^+:,ðùèý¨7Ç2ЇZ†¦Ú!Ë*ÛÜl¡‡lƒŒà-óÇcP9€–›ö0öûšÊ%õ�>œB¸%ôc &&0=+t�+ê:í™Ö²U�éjż�¯êTIÕaž´6‚9-[³‚<’BCçr$­{TlGdKª(­™1fQø8å"Y{°£"]5ø/½NÑSˆ¨=sÊ´6Ö~~"Ÿ£”hãÔÍ­ªÈK/'5²#ã!@Ø:™?"d”G]û쀱2!´$� œ.Ñtà^°Œ�‰…°PÆÚt0�rúóqÄrÅÕ[ò@—¢KªÈ�‡QœùViµÄâ@Ê.ÀÎi“Ú¶µÙ€á5,‘;}”ûs ,8Åñ˳rÌBO-l;5“ìþ -QåÓ@ÀH0c-‹%ŠU¼(h, ¨<�T)�ñü £^WVR~k‚gjà#�¦zƒÃ·¿í ;Æ9ç�ò¢X6 ¥ÁˆHOžU×ÑÒÁ4á˜TB›ÙJbRü:ÞÂã>|^JâïÇÕ…\�²n&=][ˆSw@ Ê)<•,ÙÍC]�n-s¶�h|Ö”Êõ!ÆA?«0B¨"_åÔvKöä\ž7­a\´Ü bí®‚lj#yCçÖ½_g•ª�Õǧ9~ù@4Á*ÌÆ�lÚá6nrèÄ^cK÷Å$â³�øP7s¢£Ø•M,€«¬fR9ák¸¬è Ø„&súp)¶ÐÇŽ´l²ÒzB#ôKh l‘ÉÏ£ƒ .=B¦-€KË­©M@{Å_šªM2 -ɬ‘Ö--n€AKÏ,ÚgR8ÑTBÒÏ‘�ùb -5'«ÙFè—SC<8Võq´:ÇŽ¯b&òU&„ömmpþ%q5‹*½Ú“#Ä -�¾+ËŒµ~ 1…ûáP�hÈʾc½�èn®æ‚C5Ü÷&GhØ�¬£³Ðå -B0ûgqä2:žÐvðèÙ`‹ÀDUffFï.vŠ/.@zj¬ÈÑÅõšå"C�%T•ñ¬íJ +Ø©ªÆ0Á0ÖL)=£< -eº»T}vDUŠøFI<äÈk¼Å%¼�âWZR2�¦TˬÿèLš3§­R½3»/ãR -š ÉJ0¡•²«àgSx�‰3¬†)žú‡ˆ§{}×]f<5“´Âs×}„ -,¼ïGbS`0íÍsÌ1†!Šõ è¼u>PJ–Á©#,´ô† zUÉ«gÀÊâ±ÜÜO�/åZ×\¡Z¥cÈ#,JZÆå’èPEÌ, –‹î–†ñǹUí`$©È•Ü+ó’ð,Qæ–p¤Ý¸’ ÐD/ZT’`ŸÉd•�yB–zBMƒª¶,0áÅ-à¦Á)‡R‰Ë¡rä -r�¤#ê=fñ¦c¢!”ÌQ>Ÿ^É3ÕQ!#IÕ $SvAThvá™ÕÌH©ªÎ•&m‰ìh;a£ÊA”Þ† [Ömh�ðY…pQyªM(‚e-ßäûB;¦Ý°m23Ƈ½‡%AšÞ™ãæ½^<Ìåiö)ÞJA°0LÜ”À¢·JÂNæ�eë™ãBËù†tšbAD]*ݽsÕJ1W“‚{Àhx�d2'G"ÏÙ»`çê°wUêhxì¹–E ÎRu %B�Úë¹s#.p€ó•. PK–8ºÊ4ÉC@õË'rSÂb—$'DB­‚„8‹öw21,½a\µ‹®¸˜½ }ßݘ£Ã‹Uæ×Y'co€(tçi=Ã- {,È-œ#ng@­ˆbäGY‘ðwÒqðt pIQk?O…ÏXfÙÛäqû�^Ôœ³F’¡àÔgé6ÉHAw Ñ�´hµ¤Èœ°t‚)生­þœ¨â§h·;ÐAzÖjkãê€Ê`컂ǎY-é4èÒdâ'.¸�: A¤™Óy‰;þó^ûYFãÒd$­†I4Âòüétƒ’v8—‡íôrL)ä¨#P¨ÂÐHQà±<±‘’9+-ðáXÏîö¿Þü|}ÿï}óô믾þšóg_~Ñ�\Ð =ÜñúÁîYÒ<¸ä�bisbYYHc£if¸O;h—›SZhuüöeq=Ð× -¤bÞ*-×Àp^¡uŒ†ž’Bt–ñî.ŽÅ¥o¢X Q…hÇ…]ñàfÚ -sïÏÉý&rØ�ýβRŸ«Ò †:¶zœ¹N’ò­3Ce,tÔô¤°<ÃKÁÀ~Ê�2ä*›xù•G¿­·çª“f¥ZÉ#QRkÆÍˆËö~·(tÈÊ÷ ;ü0ÞN·î@Ïå‰ÂÜ€ÉQ‚ŠT  S%°MîrãºË_ÇíˆÀ¤­="àã¥4Žuì*Ëš`/µÌ´)œ4�âÆ™-œºº(¡r +nƒJS¬ßãÚðúÔ­%S·Rq¦ÚE!Ûúçm<ãÂiô>FÛ§¨@iÝ2!½‘«à:ËxÏ®�±Xô]r˸6n%üÐuÂïHC‹/R¡|’°=xÌ%²)lôõo~&=ñã5 f4²Ià0æF” -azdg*KSU‰ -c¢S’F…Êr\²'Ù› ­:J-,s²Unµ«cÒ� &h1ta³W«RÁð´”,*ÏÞòt0½®ÃpHÏîQÑ»Z�£š1ùÉ,°7ÔÖzTéäbI¶5Õ%Ù¢µ‡ºýùÏNí@}´Ãê‹ñúëî·¨�ã£Ö_ÃÙ‡Uae¾!n¦Í�²%ÛôæsÏ“¼Ü§/¢†µÝTxŒ˜°å’k‹È”òÌ*/} ¿ÔÕ\Çø}Žåã&Å‹ëÐÊ©ü6’rqP kK>;›t˜U•Œ²¸PŽrÈ+ ޶-ø�éÐ+¾[•£aæE¼I5ÛZIvd_äë8¶�Ê—­Œ`ÊK;þê�çÜÜí›ç¯3z@´LJ¥Ú^¼¸ÚðæêÅ·ÎLó¯�n^oº>ï6BYÆ­lÛ†7?o®²j§ø–k‡¹ó¼ð|¬azöKÙKwyŸ8LÏÓ­Q–œ¿]ÿ‰{-™ÑʵqÙ T;ôuò„§ †ÏºÆ' “>ókàÁXÕ–ݧ¢ô¢�LJ ðÊ'²ï”G?*É.Û-Å9÷“º8) ÊTV43ké|9èP°hðI諺qª2 28Å¢oBwʳÉ™b<<׿Tkæª#Šh¯ƒ�pa†ý4±´+¸ ×Q@5ÆÁ $0úÍÄ9ðô?Õ¤òmK9×§™vSrN%D' WdAÖó,sˆ;1¶‰z°š;ñ‘\ü”[1{êLµ á[¦ ŸoB”^ w–2!Žg× -Á“µ-ˆºM½^J“4reD…r+^B&¬e²+/ª!›&5]ÿì¨+Ü즊P£©¦–3iÄ -ë�BÏSxHyé%'ÈëŸJóŠÆç'¼2Np²´ºm‰'•áÌI!Ôržì“¦}½E¨N£{ßNQ´]ô×C �…qUÇ©ºf§~rTɱüÆÓa›ýþæî§ûšï.Ÿ¿ßïß¿û¾ûôê×Ûý~¹o.¿~ÿ~¿ë>º>üý×›ßnoöoßo±rÃîò{å|ck…1ƒç99uª7‰)÷_l&ä -endstream -endobj - -4943 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.88214 732.5514 126.86732 746.2134] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 231 - /Contents (Section 3.2) ->> -endobj - -4944 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [296.2944 415.4574 307.2944 429.11942] - /Border [0 0 0] - /Dest 4531 0 R - /F 4 - /StructParent 232 - /Contents (44) ->> -endobj - -4945 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [173.63432 94.49341 184.63432 108.155396] - /Border [0 0 0] - /Dest 4532 0 R - /F 4 - /StructParent 233 - /Contents (45) ->> -endobj - -4946 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [191.8974 94.49341 202.8974 108.155396] - /Border [0 0 0] - /Dest 4533 0 R - /F 4 - /StructParent 234 - /Contents (46) ->> -endobj - -4947 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 235 - /Tabs /S - /Parent 1 0 R - /Contents 4948 0 R - /Annots [4943 0 R 4944 0 R 4945 0 R 4946 0 R] ->> -endobj - -4948 0 obj -<< - /Length 5092 - /Filter /FlateDecode ->> -stream -xœÝ=k�$·qß÷Wôf÷��åòÍ& 9½X‰í7YöV{òÑœ2ö¿7zvº‡U,Ù�“aÑénØE²XU¬7ï_ŽïÞ>>»�>ºêºû×ÇããÓŸžè¾»xÿó÷Ã?}ûË›ã_~îî¿z~üáù0üÓÃéïxüñÝþñøîýþêã�»O>ûôêóo>½ºÿöçÇýÚ7Ÿ~ýY'Ç_ÿÿJu²“Ý�ꂽ÷ÊvÁF¡Mo»§Ÿ®îŸd÷ôç+ÙýùiõÉÕìW÷oe§T÷ðöòñðÇÃOWßýæ�RÊ?JN†ÿ^Ÿÿɽü)áŸé£Î?i8T½@“Òï:E¢T¦;O%-‚Ë Òþݸ]§å8ê<ÿaÜî ão{xºÙ4¹£n×™i²i `R#¹‰ -�ßuÚM¿*æS£vÝ�Ǿ &§ò`UÉY]¦‡c¦E©†��¬cÚ×ù“C3®Ç9tŠ�3†»]gGdÐéo¹ãë*ö¯Ó½brU!¡À|�ßwÿyõùÃÕÿÐ|¬X>6N¸à—ðñi9_ÿe&×ÔäNô½^7ù(Dd¨JÈÿµëœ±7}xAè ×7gD›2 ±¥½è}0zý†¾þóuB%`© e¿�ÉQš3ehƒ$#’˜$ŒVžCßmÉxËš�xzƒ¶fw�9 2R N@�¬¿ÿÈl×È]7 Ê ÁÙDœL{âÖ� {/`QÕ‚ Ì Ó†9Ls§1]ŠäQ�Wh{ßW .™;¿ƒ&:7—,°Â®–•}Z‰¨ì -ñ3ièÏq½Î{áÈ› V¼Áh7Þ3o©Ë =4¾vsÃá×nÆÜt’ÚÇÃ/¢”‡sé7·<ñ\W‰ðä”iAàbÌ7̈ô]c�ŠéHñ›ó'yÁ‘ëÄ}<3߀¾T&a -?lÁ?},RK:mE8VÈ^h§W)#Ë)N˜…’Úyç‚�ÑHGÒJŠšWÅ� ª�ý¸DW(ÏWVŒˆ7¥˜lðJuâ<!Š{@ö‰³Qð�;pélXªúšù•ÃÙ90$s2·©ÆÃN9�Øiª ‚¥1‹ËäÏŸ­ŽÖÝsŒî£.Ê匎rÚQzŸAÔb/;Ía÷>ˆh¢V%Sž4±ƒƒ·)s-Q.÷åŠ>€ ©‹N�¯ ð>^cE=Aã!zˆ2±rÜ:y›³3·x¡õÎØ¶±X1οu&îô縕(óa ꙽ÿv×)8åKȤÂò�eù^ЍWy+‘ºŒÔfíGZæ3$–©x”n\”Å‹5¸­‹ŒAß‘wïyåº�ÈVÕwræ‚lR9±þCi�üa(ê"¾Í/·‰Æ ·ÚM�hûáÿ~ÿ¸ÿ±ûÍó~GPp„y¡`/…õÞ†„K¿þsO]�Ôà�0yô®3QX夶ã^§kÃ1ƒô\,šþ™(Žg@üm¢ØÁ„˜à„#å‘ë¥ð&HÕ„·*ë{bƒgÔe—8Ü¡£·RsY�eÀ�ùr¥5[&eŠæ{ñ”“:ÑG�ãf3éc¹�¸±`ĺKî«Ë`3!Å —ÇʇÝ`æ¬%Ý*äÜÙ%P�%PAA§µ^U˜-…õúéøËãÿ=<ÿåØ}ôÅç_|!åëÏ>!·„N‚áyøæSn¹lìÃ[/z¹Æÿ— L[ŒØ$ºž–Â;í{NÕÃc(ç,ƒ,P¤½fBu9Xe³´� x†„ÊÙpKyX9/†�këÕ„ lúM¬l™ãm�œ-‹gb6Kð3 ߃à‘QÄã%�%ãr¡ªNsQñvzFÂúI¤Ú <šP9çiMjV¨#”]åFÌÂ'×H,8LqÐ'À¼UÓI×À¿v‹�RÊDPHf9?PH¾Fš3ºuømú? @Þùøö (Þ]‰â¶<ˆÃÑËʧ˜”j»î.ÉE(&~”©Ó<¹‚‚Ä.Š>öDXç -ôJ– ÿ±ÑÃñ ¨1ÚoÉïQaXQ¡¢°ý -G$Ô7ò#Æ:eY5¼ QXë½+:÷ùQÓ�dÙQR)¹@+ªâœ/Çg ×R^«)l™Ü7ÌtÕXl¾Àš»}P�Ç3ÌŽÈf0õ ,L‡ o*Æ’Ÿ%'›Ðv¹4äjb}Yên®£ ˜ä&ðwIÝ]¡Ø”/�èÕ&ŽÊìæ¤Õ*&†|×+|°ÎÓ -ŒêgB cÍm”�k¿Ž²OÁ}„~ý¸µZVÎ^hm9nˆˆÃ×ìî�•„}ÔHÖñ &̲«‡RƒQÄáWÓö.ŠQUA%0zñÅSÙž©�·ˆ�9ž„\Óè²5U“lê‚‹Z(·&�²e+I °íÔ×™ãÚ°¡… —ƒ_óœ*�±@ǺhlÃ@ÌVº% Ð7:¾NS^O0 -%-oõäQC'ÌQÊO‚r ò“°öÈ¿mŠj(6üîl/¤6¬ÛMuÊ0ÔÚPTT°B©�Vr!2Ë€7b‡�†Ž†ku+=‹T-…þg…×�PëNbLû(L¯/) ¤$drw ˆaŠ*†8¦Rœ*Ÿ²8¬9ó“èfÅ÷~»7‰Ø.™†ô~8áaÆîø¹+—zËZ�F\ÊsºEUÎÌÚG×|më%¿uy°¤~ÑkìYö”^ø×°gé>TÐÆ.h×èOî°‚!JÜöNï tI”0ŸdÆ-v*€-^!-ËÀM5Ü,¥>Ó7v]<ƒ¼áv” -^ÒVÎ�d>ÿPp EÌÓaècpS"M™âÆä>xiôáH±ÂÍš­}´ÑiÂêº�—ÝC¥fßE%œN¢+t -1ô–c”Á�¦D«,ä ƒœ¯&ëNCºƒ¯\‹yÁI†3VcÀƒ1)½ÀÇ Iêùµƒã®áÂ:0hDààæÏ§¤ƒb¯Ýu¨¬d”QK&ï¼Û*÷*.I�ãÞ¿GŽ‚fÉ6Da‚[¥9Pzmk†šf#ÖÁΚÅ­nÂ’zUÓNS~Ô¨7[*"˜2åì®»K²¢@BÛäáLõï© ¨ÇŽ©oH§yùþ.rh5´°Ž"«zaûÁi±PùRRhg¼× ”/ä É293èyyKf®Í1aS˜Ï$s‹â 3»h‰A¯Ï¿œHEí€r¾èA²ö~œÖöY­Ü›r¸èè…Žvò;¥¯ÞWQ@¹JŒ «qZÃç5P– QZÈ!ón5 - -tŠP&.¸6!Qeq‰5̺¤V±È$™ùŽŠ›Û{ YË´¶^Š—äȆ#Òµ´@“â‹÷ÉK ü? ½(½ÆÕL½Ôf=i½âè WØ/e^ß‘VôzUN™×„2Ç"rw‹Ìû"øHÙ—iP2›)ÄIt 1ZѤ+C5+¢þÔ³¶,ˆ -ßæƒhŸ†?Üô(­*óûU�6sN¬Rí3�t®k‘&ç+ Iû -n¸ó#œ¨çÔAάéa¢Ê­È”˜_f8Ø.ôfIÜ›Lw)ïA>qk×�üÓJ:8}MïÙÅ´´ð(,Ʋ€™dÉtÊÜ��@á‚]Ø®a¼`~´:È“*xèšN•ÙÕ¦"?SôEz{f-(Å5ƹ˼&'ØŒ*‚°qU�),àÖ˜«€9…-*gÃ\µ¡†Ê  \/´�ѵ Ät½èߌm#²þKç?Có’)³UE'Œñ:nqŠ4Æ™æç±X'"Mäc—+סfçèà…²Á´ ´bæœo•4Ô› °©$ÓðEb¤Ö Ò WaðŒš hcßD!”ØC£¯ÿÑå«°: -¥M4[ŠqQÇ©9!ŠñB©€•‹=*­Í?³t¨!†-p4ÞˆžÏoªâe±(²ºZÜn… RÆ–uÖ<.ç›fLªB÷ÍrsÅ�%›?š!hd¿Û‰5æ¢0¾éãw¥–” ̧â �åÚ æ_ÜÖn–®EdO¡¥”:&•öXLyŸj›Ñ¿Ö¥CôXÄxdn°l9­–åF˜A¡¢²�­Æ›¼à¤Pa…k´T[=TÕ{áƒWÞ¨ý>«j• Ü Ù‚šÄ7™âKÃ�#»)‚ûò"�¿j>RWÕeu/úèÙ[?`Ýâû>™ë—€ n‹2 -WÔŸF§_�mfêà'ö1|þ+ËS–vE”Õdd/Œ•~²Å‘”lÈù/¤#¶Ðó¯—¤ z£¶‰Tl¢óJvÚ´šßÂÂËý85za»dã…S+b/Y‹¤äºðC~z³nûì ì`-°fŸ–ÑŸ/…ºÞà Ûæ@äÂ�‚ÆÞðš�ý×ìw|CÿÎòÊZ¶Z´\ÑWn�E¯¨¢)«3­çr( idª_¼i!‚_µ6àÃÑâ¾…ØfÇÑ-[…b´½]U½:yá³ B~ŒG¼Ö2†žÐÊHeèPÌJD Zú:>Lo \` -›¿¢@îõŽ«ô -ùÐ-ã(�‘-âÒ9XÖõ–/bÓígsWû«Vž„!Œo·&±’u§XØ Û²+FF¡†Œ±Õ+Ø\%KoŽÈ9и®x¦e1ªhEŒ¾Þ/.yý3dE šæËÔHi¶¶\5CJÇ(ŒUÚµGÍ_ÑÙ”!õ†B¨,Å €f¬êÛ§©Æk¡¼Ña=;€Níh°/Aœ‰P7®²©–»¬3HÍ=–éírÍ„Kb­êìØ¤4�pzƒ‡B¨$¤T)*”7xðú”ŽÛKêðµÇCðÛ%”@ƒ×$Øéÿûá9ƒ�Š._4¬½»úZÔ‚®×S¹=+f3näN¦qÏèc«¶¾*O.w€gká¸yë]QulÒšî•è½^Õ�x}âÎ Õ[eÍ!�H³kêÁD¯”µ²mÕžãÉɼ‘=4Yð”¥lG\¸š›³”Ň ƒˆAæÑÈ×R´6‹ñŽMRQŸq/ðn¸]4%_Ñ~Ù*u�™y5g#MÚ÷BKiúÕÅÁo6м‡~KïÃY¡/�1Uò‡ ;®îa¤fŸÅaxBÔc -°%�­aÙ´ë ¸À¦mr¾*Ï9�7>­`Š'i4r$2K ) i�?( -/2øÄcÖljæé·[ -l�¥vV8Ó›¸:†ÒÎ$ôñà>Z°2UÅ'ö¦™ªéÝ’& O]®ãú\yúÏãNS¤|� C6ku¶Ø…ƒ¶[Th8td~âšë³X„Eö-Ž@L\µÕrrç¹GN´±Boõ‡hce†²Ô¾j‘æ˜-§V/•Ú«(Y„Òóí’íUÓCd¶¸EÁµØW슫T]<‹ÌØìºUÝ!N‰ïDÍ{°‹g^¹Úáù²ëc $úPkOEÕ{186­@k)¬²ëŒÞL¡È8³øÂÕt"´Â`5jku9×þ²“ŠQDþÝQ¾U®½evò†Ó�ÒRH-c¼4FE%ÓŘàLÖ¨ E3]�o3ù^cLhÙy[Ú6Þ\Ú³›ŠèæØØ(™‰‚¼©oÃ_ê]Ùók®8Nð‹.@‚$3-…Î6IGÑ)GÔ…HÌ·ÌAR�:ÃUR{Å”íB¦ú¡«ÆªJùÆD† üІM¡­®ÉÒÊ–7Pa»A¼\1YXù#i¯ÜÑ�6Q| «àÜz‘†N&6§áËË 7ùóð{fæÖöSs%ØF‹<n>l€³Lëjç|ëäÕ( “' C1ÛÛ9oÊ!¤¯¸sȃl5ÎfËvTÐÂë~•D?È¢E?dK?ã‚´|‘¦‚Ñ`’ƒVh,EùuÁ—ÌÓ×x¹ü†/t~\Þ±¼)Aþýå ¤€"/oqm[kø Êe«hä¼+ %“bžs”VîgR,Tofu6³`(ÊŽ«ž'å*SŒˆÚ…œ‰–v(þN<B iúS*Ñ D6µ¯=ÑÀM[Vò¡’2ó²û}Ç:>êUK�É¿›ží·ëPv8þž�&æèÛÂ¥_¡ÜM–{œ‡^ù¢[[“�„ÅÜ$kÍ2€jbƒÍ#PÖ #íš(#ëÌTJ¨ �´ -LïeÖ³�úm<åŠu ¹Øw„çàû÷ìËk£rC²õo˜h�á�Э6ÁèÔ�7]é»]˜—òÏÄò]ÊK”E¸4³•Âðn:Ì"¥å$Zži]…ìy’¤’€\“1l&ÃPØîW>dZ�&õˆ5ØJf/ ®3œ.�=Dæ¦Õ�,§>I»®"Õµ{~•ª—¬�Ç»~oA’åˆe¨†�¾Û“SØöÃcc -\S±'÷1®�ÅFOÕ ìÉÖ>�õÚ¸&,4¹�ávþ<^?籌¶z0nw…~\ÑÈ Oów©R+î¶ÇCƒP©xv‰2E�Eˆ� ŠŒѧÁ´dk?Õ­_¬­1b‹A85´WÛ2¶¤„Ky)t?Ôž7©¥WÖ?ÒíûBè)joô„5õÁödä+á�]7}Ò»Ú°&PÕÛ­VÑÞ–>PO•èc°¡£¾Ê£¥^½ˆ¦¾à�²è´ ÂKgÕzÜpl¨]ÒB Æ~ÈPwÔåÓ•¾‚Œ¨„¡²ßt‰£2½jÒ§�ˆ)>Œ&»Âæ“Ï Ó”f²-3ŽJ͝ÇwoŸŽã;,ÇããÓŸžè¾»ÿäýñøþ§ï‡ýö—7Ç¿þüÜÝñþýñù0üÓÃéïxüñÝþñøîýž,aÔB™ÐwN‰¨œ[ž¦yÞnö7•í\R -endstream -endobj - -4949 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.57414 657.4414 86.57414 671.1034] - /Border [0 0 0] - /Dest 4534 0 R - /F 4 - /StructParent 236 - /Contents (47) ->> -endobj - -4950 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [455.87366 453.1284 519.39343 466.7904] - /Border [0 0 0] - /Dest (subsubsec:context-access) - /F 4 - /StructParent 237 - /Contents (Section 4.1.4) ->> -endobj - -4951 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [326.0764 412.1424 337.0764 425.8044] - /Border [0 0 0] - /Dest 4535 0 R - /F 4 - /StructParent 238 - /Contents (48) ->> -endobj - -4952 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [342.5764 412.1424 353.5764 425.8044] - /Border [0 0 0] - /Dest 4536 0 R - /F 4 - /StructParent 239 - /Contents (50) ->> -endobj - -4953 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [456.27435 309.70837 518.84344 323.37042] - /Border [0 0 0] - /Dest 4537 0 R - /F 4 - /StructParent 240 - /Contents (Definition 18) ->> -endobj - -4954 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [150.30486 111.64038 161.30486 125.30243] - /Border [0 0 0] - /Dest 4538 0 R - /F 4 - /StructParent 241 - /Contents (51) ->> -endobj - -4955 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [124.75167 97.97839 135.75166 111.64038] - /Border [0 0 0] - /Dest 4539 0 R - /F 4 - /StructParent 242 - /Contents (52) ->> -endobj - -4956 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4378 0 R - /f2 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 243 - /Tabs /S - /Parent 1 0 R - /Contents 4957 0 R - /Annots [4949 0 R 4950 0 R 4951 0 R 4952 0 R 4953 0 R 4954 0 R 4955 0 R] ->> -endobj - -4957 0 obj -<< - /Length 5393 - /Filter /FlateDecode ->> -stream -xœÅ=]sä¶‘ïúT¤\"çá›d�ËWëÏ]_œäÊz³ý ÉZg¯âYßd\uù÷Wœ’@w£ÔúÅëÝ�Fw£¿Ð¼{µ?¼{ûðth>þø¢iî^Oþ±ùîîþý/? ÿôí¯�‡ýòÜܽ~~øñy?üÓýñï{øéÝîáðîýîâ“OšO?ÿìâ‹o>»¸ûö—‡ÝÚ7Ÿ½ù¼‘ã¯ÿ{¡ÙÈæV5­�÷Ê6­í…6�mž~¾¸{’ÍÓ?/dóϧÝŧ÷²¹ß_ܽ•�RÍýÛyòðÇýÏßýñ{)å÷RÚÓŸÚÇJ}úÓ¨øïÚ�ÿîâùfœçoš[Õj¡¤“ms\åvøÏõñ÷ýJ›=Ãטp"GŸa�!«à/o寱çÝ,Œäà )2ŒA>²S‰¡ûô„ë­©?ºi”qêI,÷3ÄicêþÐÜ}ñÅýÅÓ<®7½Òº¶„ÇUÓ‰ŽcòÁ‰ÉÁÁ�ÛÕ2‡ª&PµÚŠÎ˜¾Û@w<;Íç?óôIZ¾Î#s¶,·«6dYr©€Ž†VÆß4z†13S†º†UvÆ ×úewÞú(³£`›aË2¡#Ýã´hûÞôf¢‡¡$vzRF) ñP¨¡Iàb4ŸD4¹ÏéBõ™P“vÙb—g]¿˜4/G–qbrèWóïWáqÌ»ž•lÄÃî‘Xü5– òšyÏ�k‹¤¥Œôjpn—…—4 Uß4Ü,#€3:�1ø¯3tãïï—‡Œv±¬vÑJôÊVi—-eïÖ)¡:«,æ²ÈÞ¡ÇNŠ XmÏÂÌhy²¡0„BEìw$§c�;›ê¦ÑÈnJCº$‰|¼ÿn‹1BmŽ@þ½D´$ŽúwÑÉî9årâ£+2yò XÍß)6áL�‰–r¡_’UŽU²Úé*u0îË�¬„6æo£…ñV*::%‹yΠNAe ^ë&m?Œ+8bn?ÓÃáN‹Ã‰ðóUnˆ›s>¤H¼FÅì¡qÒà»3ô€á6¦K+2V›(¸ÌcøÅN< xoC*p<ñ2�ÚíiÌ%¾ØÓç´˜ÉÝ]ƒû!Ö›mN;xN;øÞ -×Ëí€ü¬½=²+S]f|M.ßÊ om­-�:‹Ë•ˆ�w -F7rÜ‘Œ[¾9ÝÅ?½1BÙŠàg2uv«L+ZßZdÛG—5Õ ÿUsÐBªÅ¢—‡fl °ä]L„c‰©1ÿîóÌHD4äRäö,ÉQ 'Fæü« Ã?¡6ÛãJ…Ä9œ§}T Eë·…m6:ÈŽºa�‚Ð+…é’Œ�›‡º6IÚ�yøœØóQMÕ ÛUD5S¦°$ƒG¤)92ZhÝ�×Ï«è>9n²o3Þ\D¢›ÞPÊúƒÊuos›xéK2A9˜Ð) Q˜†É” ý`à86S"¸EÔ¤ŠÑ¢“~ -X#ŸÐ‡‹­›N òÃ;º\¬ZV H':UóŒ�ÞLŒ�¾ Zá�rÉh9h"„¼óH ¬1˜‹vrÉL¼zXNƒÅ[LXÍØÄ-›-1 Çó"ž±åcPŠ)È[�¥±6ÐT� EIº¸�<(·þ/Áhi´:'ö'ö®×B¹ºòÊÅ×2pc…™©¡óYÆÕÀh³4“–ù (8bŠ— ›ôWœ&�’‘³ä)ÚV„<Íî;›‚Ý^’9Uh³RvpTn‘Íy*6e᜽vyÎ)nvþs¼]²iM%3z½b3 ÊÙHù´êùï1í‡BK F¹ÚhV {Ï�ÑäûÛ0»[ªª´bÀ(¡½Y¯ª¢ åÊ_I¡Ú^ÅE,’ƒ6-ƒàW¢5«Å¦qõ`¨•íxP_dÁ -{ASî/XfQA“>“jÇl)¤f»á Y �7×~3>Êø~åF†Ö¬ä&ެ+³foñs�©­–}Û¡”#i¤SsŠØ,(®Ö*Œ÷0ÅïÚxæéï¿O¯ñÕ¬ž_Sƒ·Oq0˜Àãü?Lˆl%,ž³Vý\fÊ-ˆ¥¢PÎN*SX,“¤ƒ9‘eŸ]9iDoúú7¦Ù|IäÐNضõ½. -ï€Ñ_…VÉk*ø¸dQ"AG¯0¸‚äÌSUf»0�³4½ï‚ëÏÊÅà„¢*ræÄÿA7>�”çÂ)á+ö°Ö„`BûÞÞðÒ"‹\jÉ ƒ° êç´[7`{)tÛÖ½“ èðxGJÆÑÑéAÉ 7Rûè‰O -öèÒ¢j½5EýèåM¸*«ûÐà‚˜[¬…‡?|ýš@ô ³pŽ=Ñx´v 6š~•Ä~�©AT1WÛ�¨ÂJ�ØÒKhù“'ͦýmë…W®"í¿´®XÂ7M?†�³;ñÅeñÖy¡œÙ¤,~,9%èç¸Ç!Ò ‡ØD8ãÌb6Ò`d»qÔx1K}ŠD†ðÚ9©ø]DQÙ=†2ñÙ¢hQA°ŒJ3iç„”¾U%çRR[�÷“ª®'FnxUàÃYT%„e“Jö«ì‘Q)ëœèÚ¡z}‹#k¾^ÿ ÞÆÝl̦ÿ½Ëî� -*;Õ Ókê÷öº¸ËÛÓÇZ-l¯¶èé3©²¸qjâe5½½î”_á÷Ã$-¨ª!‹™âå€#�M„~âzQÄ´“G£Pv i -�Ð-Ÿ@7(ÀÄ�ê¸�œLUsNuy7ó­h�v“êÃ"\(¥ "*óûµü³m &'älÃêNtº"¨Â<ȺÕZAÌó.[Õ€æ.’¼ò‹…à0¢T‰ã‡ÅÈ'�=,oòäÌm9/Åä…Δ ï¦û«‰4 - $ŠU0Ú¡UHÅqrÍ&6¬rBùª8ÝŸË(á� ºelІPdÛ7P¸ÌSEqð!# �©¿‰ÇÂdUäl_'p€Æ qï]“Ú�¼Þ¤(Éγ 7Z ã»*Ö+zÀi¨ Ñ^È¡[5ã�ù>K*raL[�ćÿÊ‘€ª›6VŸúÑU“àÈ(ÿ™%åNgª‘(zÁj(ÏиNèÎn¡þv¬téli9oR<† 5»b9¥–(ÐÚ � òfèk®@÷¤ÞÚ三-±²R '+B�éº_Ú@€W ùò¢—¢µÒ:Ö—ƒƒ"�AH×ÒlX§{.�È*ÒÐØ' …ÒϰRDŠÊ…@Å•‹NÁ©¸ Ì9´èöÅ]©è‹é:ÑkëK?ÛmöL„CX% =h“E“ò­–¢Uº+³(xŠhúR .†]€�iÒ$£– *`Ö¨7]+:[ÜÆP wÚŠVvv̉¯í¸ã@²ÙF4:—õÖvKÀëŶòûd™/Eš²QÌþ_�#JCw”³•r¦ñÉÚGâ^\À.±a°%»/ðò-[ e†vPÝ&±yº‹kgZ:;µ<ê¡%bö¤ú¾,‹ ,4þuÇ-�¯ Ư©¼Ä­ ðö‰ ºSf%‚÷ÛÅÖIrUi®Ôì;®t\~pK -á¹T|äÄž-r2^ -§êJ ɺ±^ÈNzw®äŸù¹â¦FÀõòÇNH*’G%ŠAAÓŽA -qa­%‚•+ŽCøoÛ¤”¾Ny¢f–±4¦Zá'ÆǦF£ªDªé ñ8f)ýã¢Ò$6,·e˜'‘‡&ùz­ëžÓ2lù•Z0¹íK)SÏé’ÖËey礌.Ê4%ž�bs{qcyŠ€ï£+([xf=Wk6„ÅM_å–tfW]/\ÛudÛ›¬I‘énaS�ôa+h.¡t^-šŸÙ “ŠÇÞRèŒvVÑ—lÍ­=‹ŒlRo±â¨1µÅššç"€{n‹– —ð銢¶Ù%Í )ÛàÂ(-ZSÖùÓü*!ŸD?±cEQ�îEׯ"YG¯ËR5Ã6�)$‰Æ¡¦˜¬O7è�×HÅ«©µ–„�B}ÈIÙjpH�^¿Á ^¸â5²• –®õB·C<¦Z†ÄŒv¬Å ›¯ÿÓ¡(�lé"ÐîçÝ@5À�#å¾A–‚ê¾²Ý$ÜD¿¨ÚüµÅ�“ñxÎq(iK@-í!æÓŒŽð$Z´"Ç?©¤Ö¦ï’R;,!Côª¿‡¦Ãç¸&a®q$ˆKü¨W‹%'TšRE´°šë¢Ì¥'“Ó lå¨îœ°²·º>5¿ç˧an" äŒ�r�;¿jú�(RLܱ`||oÏéèlìw—2øñ–Œ@�JFåä†A ´ð†¢Ž`ç[×�)Ë¿l–Z³ÂædIÄUl £7 -\²Gn+‘þø¦V’×ròÍæœu«Dk[ÓmÕ…³6 o¼h[Ùš% §ðPè)”Î@¨€Çà@ga pæ^�¿ðñø-Ì#Å©/ù†é©è°\P‹± A“­kp¶õ+tÖUÖB%OrY=’c3ÎÚuBvnû 0WTV8eûÎ~Ð(Z5¨eb£ù¥Ëäbf`ÆÚÚÁªòÀ²�Ђù#¦‡í¡‚]�*Là€_§{äßM)†Ï×Ú�;t®ÊŽß™>tº0±AÛœ~aSÛÚZauÝ‹Þ_¿>…£”i[ÖI‡cÒ®f<ò%ÚUQ([ìP£¸^­õ–YN†V�ŠÛEpF“¼g{1zªÐHû^x?”P•IÑ{b¸Õ·KG—$Ml¶Å¿~°øYfa¢V…ž€îñ3)D}k -2SuWñèÊMòê,U9^S܇±YVû->ŒíÙ|¼rNx§ªb(®aŽ^}Ó+A�^y°èõK'”ïûnU”ήibˆ!¿¥FÑ%_‡bÅ5¦Øqk”ºÛ Z&ÁN%€ÑkZ�û¶VöªŸTbÌKÌËíÙ‹­$DzoûÀ„Òïäô›™WV‰¾ë«Üæ ü…îT ;£�×ÑP:è‰JBð´üS¸ÓÍðDƒ¹(>âž‚âõÜtsþµ0T…@€”ááN€ -ÅçÈŸ ÎÄš3{¤KkŠˆa°”°o®XZÈ›ÆgÜh–Ç>\}ÏæÓ•î„ÑU�8+¿k …T­í26£ÎÅ+'GÁœ%ŸG k¿ �ƒ Þ}Fqhu{ŽNÙr~8¡L}âidw „ ²º?¤)‰Ñ‰o˜t�œÓ„ŒNJò-ÏÝèã×&V[£’Öá%“ìÁ’}6=>Tìxï¬tµ·Ãˆ&^½œ¬#Eçd÷[èB*—¨¬®÷�¯£HQoROe6”“ÂH[‹@ЛóûC–Tuè?¾"Eý9=õ°Mù!š<ô‹Û‚9w,ÓQ×L-kR¡ys UIC®1ÏˈEoHrÅé×T¿!xqgi†êŠrn»ºáÉ’]'¾îÃê%Í‚�g„¶e__*©„”51ÑL%Óƒ ¸­HKÅÛ”–BZãÛª})á– - )mEëTåú¡–*Û4³¥> -endobj - -4959 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [246.03696 494.1144 249.33694 507.7764] - /Border [0 0 0] - /Dest 4540 0 R - /F 4 - /StructParent 245 - /Contents (Footnote 6) ->> -endobj - -4960 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [315.25378 466.7904 326.25378 480.4524] - /Border [0 0 0] - /Dest 4541 0 R - /F 4 - /StructParent 246 - /Contents (53) ->> -endobj - -4961 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [311.1513 350.6944 322.1513 364.3564] - /Border [0 0 0] - /Dest 4496 0 R - /F 4 - /StructParent 247 - /Contents (39) ->> -endobj - -4962 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [140.36269 289.2464 201.18646 302.9084] - /Border [0 0 0] - /Dest (subsubsec:coeff-context) - /F 4 - /StructParent 248 - /Contents (Section 3.2.1) ->> -endobj - -4963 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [486.33368 289.2464 497.33368 302.9084] - /Border [0 0 0] - /Dest 4542 0 R - /F 4 - /StructParent 249 - /Contents (54) ->> -endobj - -4964 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [141.26205 275.5844 152.26205 289.2464] - /Border [0 0 0] - /Dest 4543 0 R - /F 4 - /StructParent 250 - /Contents (55) ->> -endobj - -4965 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [251.55157 261.92242 262.55157 275.5844] - /Border [0 0 0] - /Dest 4544 0 R - /F 4 - /StructParent 251 - /Contents (56) ->> -endobj - -4966 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [447.87784 261.92242 458.87784 275.5844] - /Border [0 0 0] - /Dest 4545 0 R - /F 4 - /StructParent 252 - /Contents (57) ->> -endobj - -4967 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [397.8022 186.81238 408.8022 200.47443] - /Border [0 0 0] - /Dest 4546 0 R - /F 4 - /StructParent 253 - /Contents (58) ->> -endobj - -4968 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [167.3757 173.15039 178.3757 186.81238] - /Border [0 0 0] - /Dest 4547 0 R - /F 4 - /StructParent 254 - /Contents (59) ->> -endobj - -4969 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [400.45898 173.15039 411.45898 186.81238] - /Border [0 0 0] - /Dest 4548 0 R - /F 4 - /StructParent 255 - /Contents (60) ->> -endobj - -4970 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [416.3656 173.15039 427.3656 186.81238] - /Border [0 0 0] - /Dest 4549 0 R - /F 4 - /StructParent 256 - /Contents (61) ->> -endobj - -4971 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [183.44235 125.36438 194.44235 139.02643] - /Border [0 0 0] - /Dest 4550 0 R - /F 4 - /StructParent 257 - /Contents (62) ->> -endobj - -4972 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [79.86614 93.517395 82.56614 104.24536] - /Border [0 0 0] - /Dest 4551 0 R - /F 4 - /StructParent 258 - /Contents (6) ->> -endobj - -4973 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 259 - /Tabs /S - /Parent 1 0 R - /Contents 4974 0 R - /Annots [4958 0 R 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R] ->> -endobj - -4974 0 obj -<< - /Length 5950 - /Filter /FlateDecode ->> -stream -xœÍ=]“·qï÷+æ|Tì3CßH)N(J6•2¥È7IGŠ”éŠŽÊù\)ÿ{×ìîÌ�f0§ò —{‹ÏFw£¿qóüþáã‡ÛwÃçŸ_ ÃÍó‡‡Ûw~ÿÃðíÍ›O??þéõßÞ>üýç÷ÃÍË÷·?¼¿ÿôæðý›Û?ÞÝ>|ütwñ»ß _|ùââ«W/.n^ÿ|{wíÕ‹¯¿äôëÿ]À 9<ƒÁKœ3x…ÒÁ ï~º¸y'‡w½�Ã_ßÝ]|ñæBoî/n>È`xóáÜyüxóÓÅ·¿ùNJù�Ôöø©üéóðýòðåþÔD¦ŸÒ]à„Ž‚NãHuú´×ƒ>ýu¸Œœ,–Òœ†„´÷±Ñ8 -3ÕÜHÏ�¾Þü×ÅWo.þ‡"@oxýP”þ °Ë–­ý)Û×a3W‡6µý(b?J9a½µ¡?Ÿ1À×p=<ƒéëÛ%žÐí%:qSïr‚œò×Ã<Ó<À„3VÚô÷"O,±N‡Àsÿëf¬…‰,4¹üi-ÜÀÔ‚¾“Ê-ÿ:QKbègôbz>Iç˜ò¸ þzPÓ†ïÓßH]¶ð‰ -k–¹i+¬w]d93%´­hK Ã;õÂ8€@þv •¬urº#Ÿ)-lpF¹Œšâ¼3Šz�F.°SÇN˜ìë¿Wr¬«òÐÏs¦M,œgY‡·*ôQÑSIÓ�³Ýí¸È ”ÅÍ’Š‰VˆÒ­&ˆ¥ì£þ<Æ‚í�wž°J<ųóÖû*UÑŠÀRá†å -D³�W`BJ óæ")Ý n(1þù3Xÿ”‹H§O|�h²uÆÆÓ\ZæÜ€ùkùþbÇX¢;_î’¥âûñ8ô%En)"¢Q’óSözP„hzè{UÃ?Ë០V¸ 9üþ®šhÅ/x­öµE9bQQí¶¨ˆ'ó)=À1ùé(/œ™âÃ'ª: :m.ùN·ºC· š!]âÔ7%Ì©ÏDÓ÷iÌÓuÿ�àí]í$<‹„T Ýfþô4]#) -ÎŒ_'y»àÍ ´PJÆ0‘Zsi$×S6ÖÊVfq9Î 7œXi›U˳%Wf…Q¸�QÄ£Çò´´i¾È‰Æ¦Éž 8²™kêÀ3ÕcÇë”Ñæ%®ÿ\×Âç?I‰ˆºf†o*Ò¶) SGn¹l“ŽUÕ Ò³Æ[!óÀ’¹ñBÛØeŽ‘ôùä²9±£{޲h -'5 "h?]•çøÑSu¿QpJ„Ítò6áFKiáY‚—ÈzcrrgA�]]A¢âv »™©Ü€öÏxDÙ5A³m¬•a¨'7< EÄ+ØS¥ïH�Á¿Bñ‘¥x­…‹~7½#Õì„ö - Ñ5ï‹¿g†&LÙG°Í<ÙpäÕ™52¹Ùk�¨ËŒŸ˜´�aJö\"ì=C©iÇKÒ„h{-`\ݯuº¼’YsŽ˜çK´„ƒÙå“�ýª<ý‡ëÁÙ†ÃÌ(Â0¼ynÜo3Dë’qJ -©m� ðhȰöüsvr™j{²ÿyy½¤Û™@� V'#eõð`üïoï~~óþîš8Éà…>œ¤�QX¯Y¥�ןŸ^ñ|}÷ÿv‰¾“Ê‹‘|R§g>ªÆ½zNɳ‚¢ÓÞìÈ3M#›¥’{šç1b{=¸³Q5Fé–%¢öÑ7Á³jÐw9 ž.…¤TëÁc¥°¾¦Ù�ú>A”– þe®f3ï+Ï£ñai1ÛÝzþÖ,¬�®‘·ñN€±N7á£jóû"›Ñl³š8êòÎ:í tu/”ÅÛ«Àí@MŸ±”rÖðkËd £6Xö¸ÏnÙÌxKH_Š÷Æi-¢•6ªå0¿.»Ä¨>™’ް7e/YoRæ/´jòЗ©0•RrrÏ+±´“;wÇU§Oô•|ŸÍòÿ®;(­Æ`�³x{ ¾¹¦‡dÎ*Âê¸�“’°Ì.,þTˆ_‡¥E$“45yð5ãXã•P¦Ëæ¶J!’Âé £’f=y}+æ_¢�F¤û¯0Dæ·¤›á;ë|ç ™³(’öȜڂyÇ’9[ -n›ÓXØQiã,ì­ÃSÌ›B‘d©¤½~šiéá\ f¿�gùãqŠdÈ冲µV¶Ö©ÄãEÂc -Ý&À¦vàT9þ—\BJ)¨Ý.l²>?kƒ°¡ß48bhdÇð·>-“XÊò¶1ä!š[p4l˜P í²%HŸž¸¦0Sš^rNØl;'Äk˜H, -šæ¹1ÐŽ”3 Ó… F¬S·³Ö´¢ƒeµßLŠex  5‚M²”ì×ý¬ÒÙÈÍÆå¬gkÀ'Ñu!¡œÆ©ñ°³²0Iêí'9õ´L~¿äeš£gÿÁ­OÞt¬º_"NÓ¢’•p¢ÀÜ�¸xUàß³9jäÈz±¬2Â8Ýå·6¼Ù¾dü,j!£–ç�Œí̉1ðøí´•÷\ní· A87WµÍ{Ï´—:‘Ê, �$#ƒdvSÓp#Ð9"ÇC]ƌҖHôIG4\rÓÓÄr&Áܼ“cÓ²É,U°aàYDìxÒÓWµ–ñ®©åà~óð‚SNQµ Ö‰eAŠ »¬v F6䵫ksiË\—KOL‡Ò±ñdÉ@m1û¸S=Æ+m¿ ²r›à¬j¸1Ð�ažps”#´°Â–j÷ÛÎ"½i_<Ý]!ˆ$—|–&Ú|žãú¾.NúyDÜõWçLŒüÒª‘0p$l¢ ûìb…«ç¼Ý œwà‹Ñ–¼±*è]qè4´‘öQ×/^àlnZ¨oo™ý˜òo;])“ƒ¸ªQ)Usm)ã„Ô.ºÁJ%Œ¬d:á¨Ó?¬Æ]oþÂ-†ÊÜR& -­]Üù2�'ÄDK„É>§bWy,ÔÃ1©$z®¾4 +IA§HLÌŽºì* ºU�hج!´0¾ÃDW¹KÝèš�³çd»•‡Ó.³iªJ©/§dÖë&9D(å·")0�=H,qÈì�O:!bÌLI5ÉaFÚK#âHÊ¡¹•°B¼×BþpùÕ²õÕJé„ - 0V -!4‘ž‚õà‹_%1©é³žHOùM½‡þpXâ7µ[”r ˜ÑJª4¨ýatDƒ`íJYt–#9Þø� :â"-Ö†e\úâ.IÓ]6ªN‘1ÿ¹ôŠÍ Õ‚A5TS*8€6hˆ-ªžþÄÈæD¸‰áá<žå�3sH`ª;¢ëlhŒä´ýˆšÈISñ‡à£PÒûà9ÝÁȧ…}P{“±µ&8¥öÀw -¿Û¨`ŒâÎs[ðÅ…�3‰ìy�_6Ó -%Çi�ÂëC7f}YÃ,ê2Ó`Åèà -ýgq@Š:FP—•V®‡E|Uu[i-Et° Ò +�8v…e¶Ïvgs™.žTJg]«úfi·K­‰ -·)ô5ì.x· -ºÑ(ÐÔ�”Í�4Ö °}ž¦m«žxaŒ¶¾Í Š[cÿ02Tz®/òî%ÚYjƒâ02ß@¢ì\1M³¤›'ËœòZ‰;÷I5!2Ô*÷X+:l‡ž -ëmÅÈ»â4üÁU-÷ù°•̨MÃúÅ×á y»W0kUE'^H7J˜ØãW"°ù -pa­³O" x—ÂHé n@þºÅ›•ÍÐi¯ ›’nµ´<]"^HWzÊÓaËéÏ9k”„:4Tªïec®qB1Ñ­%cïBÃ~ÜÛZ�G\OC­ÔoX¯²QAÕáh5M : -§ühg" Œ~|5µH"ÿsOÃúÂäRûeu;Jæ�Rc3‘͉ïü%ÖdÃQQ Ë[d Ì “k‹�Ò�ȸÒHÌó ¥žžÂv»3j´y?\>�ª™„¶B}�%‰ÄC4ÁÓ3â#ìÆ9€íb€á}Ó`¸.¿Ëš|îáDGù†ŒÉL%pÌdUÞ2ÏâÌ&©Ýy¸Ã£dºáYš#¹¸±q‹epP|)+sÇÏߣÒg£‘éNÅV©È¼ª…ó&…ñN4Z_"ŠGâÆì¦CP,C� ¬ì3födðáô…ÆLBVò[˜iαÏ{OD]VÇ•D ‰Š -Í™�˜!Z YG�î“ 6Ô d¡áä-ßr¨8f¥š×ã�È+Õ SMoŸS,t!MOñÇ —êNWªJçý?m¥ -C¹””"Ø b ìÚ -U`8Ì~7Vú-UqHGû¥«8à½ôTq @“èÀõÊk…I«Ž]PçRkð(šük¨Í–cÐÎ úÊ1¸ª%)v%lŒÊ4 5¨ŠÙ……”ß-–j&fâÜyã*B­‚¹óžÄ˜â -hïRÞ4s¾,J*£ãËT‘NÐ&·,ï‚[ä\]ü%�튛NVr’j,€-˜ ­ºbsé’„X“–ÊK¯ë.oº¼²;O'y$›¸é˜øL4èÁ$æ,¾—„HW'©ê/î¹v�n|éF�îÁަH -C¹‡5€ º7Pø·*('•Vª{MqVÂ8‚�*ì@ŸwJ-­¸I€ë[®WÉ¡ÊÉ3´¶ÊrªVÁ6jÅqó.®Á®†”Ù2Ïj*1TâR'�ýz›ŲfUm¤�v‡pöf3ðŽ•¼eâ¡]‚·”ã¿ ÷çÞì`ÚÚ9Õsu\ÎÅ‘ÝÔO­R…îC²•»d©P]*f�°»àT[ Œ¦Ó^¥6lyµd‹¼eMµèàñ‚kƒgµæ`Šã@By ÐÄ´:.”bö�Um˜Ê^ŒWµ‹Ñ±-cÙ:lÄL�P-‚”.6[ܳöì‹d—WÒÝžKÝ«ÌI6°äž"™ý6Ž¢G¹ÌFK Jx*•ºøÓR^ܨ #ÔE­‘>�×¹hÒ. B!H5¥3Ic?£bĨéÓ·ÐH{áËÝÒÒŠ¨»,·;ª“Ï”`|Vã¡v]•‡xZþ©äø“Ü –éËmx¹©ÂY)lŸÓ¡wÞ²òW* ˆ–o‰ô>·…„g{bË ¥­“@Ø´Ð;EÓ#‘¸WõÃ6Ìisç³K*N}Ýk\€�2WQ åÁ¨½jï5¿³¥0Ú€Y!¤]þPÝ9e»#…vÊŶ¾í1c´ ³ sZó²±£Œ#J‚€àŒÛa{/¹Ój¬"Ht%âk+Oª£$L)³Ê Ö†R�ŽMG[Á‚¯80´>¤VðrÊë>XS±×T–2Ù¤9ùÌA!IØ)ë|N6ÙL;c‚Zkv ‰ºßTÁ@Y -ÆJýËh²›:²¾TBè;…Äi�QšqRÕÆºb•ÂɨCW$Åb²€~úµ %BBE!)øË°Àv¡zÐNXk¤í‚@áPºÊ©Îù„S}ÈÁQ -XµÃ2Ú‡¬ÑË]À@¡—߯«ÂÔXíÕ“ŽL‚ -ŸÌЫ=_Þua–­ŽÔ¾� JÉ¢´¶Ú Øâ9l~}ÏY– -@m*»‡ú4s?¾nz £ólÞ‹rFDÓî¾:ÿlô"†€¥ ,B±ør0ŽŠ®Áˆ,áF¿3Hߤz±“e¨à¤¢¦¦°EÕ¼lòQ+9f2Yc÷8[ -¼„a±¶NÒ�£´0Qï ÞɤwŒü«®‹ µ4F¸`•ë�ß|ìõçm¡V^0Ú†îÔ„O AÊ‚°lÓÁ4È uô D!åTÿ*šDO‰@Êy¡lì;ƒ#®RzÄ·½kJvÆ„»Ùøl°L9u­úzsV@�(YÒ-ÀÅ �˜uÑãEð>ìpÓ Z ¤AÀ†þU4S íN ;†¯?Ö•”F‰cë“,æ %–f`,{ŸÉ¨vš¾,úR‹f)s71~; Hý úÏЧݵ+··ä•"(jÕkÊ‚i²òMZGú�b÷Õd›`¸p¥¥J½<‚¡Á†æâ Yûîñ|ÛÂò•íç\ÍÆnô¡6ØlúG]³âó¥=¯¬6Š2€ÊxJ[Ážul$' -­¶®öè2P-ÔFj·ÃÞ ^€ƒ>ó×ÂáAŒšM\áöM»,ÃmKq)i6#ªÁƒ'¥’¡³…õÞ|Üàåì¡l|xSRœ‹2‘á¶¥J»M³ßí³†µ‘q¥lSd´Ï9±÷Œ3T5­jœs)®ÈáhÀíV«"°é2JŽ&”¨ã/K�‡��°c‘Å€¿´áŽhàjq³û†�9n†$СŠKC ·îöп|ÃÅø:´:#üž¬·Ï?)@Ÿ>‘fT€B›y�ª•‡™0gƒðQº°}Шv?eó}+«�dÂÝá…5]«o²YFÊZ¨£A*Õ»ÃQÆ* H›áèÆê\D“Å2’¡C …©}²zËFØ>D:Ig.|æ+¹lfø�+ØK¥eíàÙpÀ;ÞvEMQJ!ÿR|¡çÉ8�™ž"©nŽÒìÂøø•·M»«0Λùâ1êcÜÜáŸêJÉP(k…‰VÆΡ9(+’AQN ç¼ïZH7$ƒ¡Æ²$c�Ò~8è¦ ðH†DùпŠ&~’|û#h!ƒÞ -WŠzz&Í'¤¶�MÄx€êz¨õRÃa^–š£óšš…Ò wźíàÙxçÿZH6;WAÒ¢‚ÞÂã“&HZH�ÂØÃhy`œÿQ-.Ànëh¤$upB;ëöI=/$™›«|ÿ:9ùR–VBޝ�î!GdǼŒYÉ—G‘Y5YLªÇÅÆÀèq>’[‰4Å�PÜì¿-yÖ*õ(+1£è€ S—$«n×Tž`Ï4ÞÓ�T.n™”§ÈÞ¨ú°AΉ F i¡Ã¸½©xôðLY#”’ñTóêIëëdïm^îØ†’…QeÏÙÞµ|H•ަ é³”rŠvÀhd®ºl+çX®yGì[S|æ„ÉǪ%£æHZ_ )ƽ¶Ç"×\9]2!û¢ -¨ tèªæF[È"=œËç\�uYÛNŠ#›f¯#(`º_÷2�j—Âk3J1Û�Ù&`?>�i”¶ý‡yÂB¨¦$�o%FÓ¿’6q(b`eßI,ÅI„~•Š“¸10Gçô.ߟ*Ûê’Âb¥…e©Gt.pÖŸ¿°æmb’2Ü�åúŒE°6‚q—¸Ã;níMeîVmcûsukíóû‡�nß= _¼*ðwéG¡v%¼x}!‡×/þt!…þÿ ¯.Æ>?]Œy•Ò©9üïÅë2åU«Uù8O.…ô£EŠ#C+L‘Ôr3(µv´ƒÁ¸€ÑòἎ–]@dÕ$„=¼¿ÿôæðý›Û?ÞÝ>|ütGVUÆ—©-ˆÖn·2vƒ|¬ÿMzB‡ -endstream -endobj - -4975 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [243.07924 732.5514 254.07924 746.2134] - /Border [0 0 0] - /Dest 4552 0 R - /F 4 - /StructParent 260 - /Contents (63) ->> -endobj - -4976 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 261 - /Tabs /S - /Parent 1 0 R - /Contents 4977 0 R - /Annots [4975 0 R] ->> -endobj - -4977 0 obj -<< - /Length 4873 - /Filter /FlateDecode ->> -stream -xœÕ]�·íý~Å\ÏnºNO§ÏÑH�úÛ) Eî-ÉÃù|N\4kw³š‡þ÷bövfEŠ¢4;³vû_vwDQIñKœ«'›íûw7·Û櫯ΚæêÉv{sûóÝÛæû«ëì¿úî·7Ûß?Þ5W¯ïnÞÞmú¯®wŸ¿½ùéýúfûþÃúìñãæéógg/¾yvvõÝÇ›õÚ7Ͼ~ÞÈá×�©F6²¹T�—¢k[eoƒÐ¦³Íí/gW·²¹ýõL6¿Þ®Ïž^ŸÉæzsvõN6J5×ïƒû?׿œ}ÿ§¤”?lvÿ®vÿJãîÿJ»ÿ»ÿ¬Ûýïýwýíª¹TJ £epÍ=$)5eÔªQrøU;nlÿì¥>¾‰PËM¶Cñ|ügxz@qø;L«ýÔéG*ŵñô¥FZ@É9Kû:â.ÝØU£Ç}÷x�¡iÁ­YS«¬¡Äa Úˆ;åcÒKíWÍáÓ8ýŬ¦˜Ý}uÀê"~úþÃ:?°[5怗ˆã±Æ�ÍõßÎ^\Ÿý�cÅŠ±qÂùv†gÈ{Nñæ°” ©Û˜"ZŠ`¬òh�cM·tϨk�ô€dn»;£‰�ѦÆ+íælÍÝç«æúÌ솚Ý!}Ð 0ÆŽ ¶DK!áì|$v8¼(�À‘³wÂw^›dƒåC…6Ô$ðé‚^ŸýùšÁgCë¹\•d™X¬éó�ž5¨7Ü{M2 ëh3€oî ƒE~1¼&Ø“E+ -“ñ,.ª€–UÎZ‰ ìåÓâœVueŒØh4¢ 1Õ -¥eˆÈB^ýA;2è¦hv!ƒ O¡1ƒR=TÆÇÐyy¶F¹§¦„«ÆäXs�±M7B$ù~i+í™lÍ€:/w®uV\¹Z5Ö )¥4àK —ŽŽG:8aÚX*Œ’9íÁi'v^f²Õáü¢ç<†ýjd©ÈNåY-C,tða{º5¡ -6VÑ#Úà8#ûãò`®Bᄌ*†QœÐR¶Úäì�)Šà!jdJ‰8nø¸M15æó°( Z8T[Ú‹Ü«6P ¨`‰‘RøP‰A‰33Œ“ ‡WÐŒŠ¬í„ví|’ý§D/*²bŒ]']·½ÖUâfª©Eùá¦Oqtî“ðåç…3îtÜ['Ø…MFŸ?IJÌJüú(Š l@”ˆUœilù t„i›?٠ثƔ]}�rvl°BÛÞY;¹HQ^�“½[´ù_TAš·×µÒ¸“ÑK“¶D6Ⱥ٫È%Eçµ2ê�®R€®ƒè2r€á)š:ޕעuFÍÞ× -m©©ÓXuRY‡À„Ã…Ø`hÕ0a3Oúc¿c;Ï%Š]I~×%“ïãîãF2Æe&Œ[ä72ÅŒ3h †FÂE#xzñ`<ÏñõáÉÄ^-"Åö¡{°?ãt. à¯qòv4zé€`qAÞòà½!Ò!€tð¢UK±eµ³l…ñf–~ÄNO¿Â EÐ�jIoÆp/ÅŠØ™ €G�wÅdÐQÞ‹Ès%`É9–I!2…Ÿ— `¹Y2BÜ�Ûd¶zUQy��ÜÀ)^Ac>I·Û‰[ÅÑwÉ{ÑTÜ„‚Çɼ Zx¥fÉ<â#*0&¡Kö%É_8r ’y‰›‚@�šˆSð©nÉT"~‡Z -äúk¬›B`G¦ÉÉ8".‰#Ë©R™¡ÅðÜ£§v/ÌÅú<1ÏÚYàü£„)AÓŠ²�Êá#§.¦©ÐAç…¹—)¯…¶ g%¼RËÐ:8%2¹•±¸¬YÈ(_�-B#Æâú;\ãÉŸèÌ”ÇÒ Î0f ”™ÊÏMT¨MÅÙÁèÑÈ”­A{RxfÊ�§˜îe}…-{ F‘÷ƒ.tOUA&ÂdrÅ�fsïÎuÂu3Â(§ �7Æ -Ûig&— £�0Ñ—­ €‰ -Ê4­A(ûø”lÞE~N]2ˆè�ˆçVQJˆÐ Yl·æq‹K ÞP”{9âÒ~Y -¼:6ÜÄMY $¿±©÷{Ùšg­z^\°¢¸ˆ‹Ù•šFx-CW’­xš{ª\ÄF�&Ýø8Ž‚¤F/Ȫ?8ATH­ƒ©6=¯©„Ëê`E:6©j½Ÿb²UL!�Ðd¼�03^ã˜Tz_ÈC”$HTä„Ùíÿ49aX16JèÖœRŒË–vO*c„n½uÀœË*ÏØ"® à"74æÑ*J’“ô½¼¾H×3÷nT1Ÿ,Ýp®¹BH«4Z, ’cÃ#ö{ª…‘)q΢KžeÑ.¨ Ãæ#�ò¢•óªí�7Ã.•­sVK%oGÒž*-ƒp2Ç?9[zë+oZ'æf®¸‚Çdê“’\ZKŸð4-ÊJ ÔOUS™…{¶_ä¡~9…’8𗸀ù¬Æ97ŠšÈÌ¥&Žûræ½Aá¹jß°u„NÌŒ˜.Ì¥ól+´ë,v¾s—�Ðã šU$6Sâ]9”Y›�©[ÓéšKòp•›ÚG#CÊ{p°L[²† ²~JúÑCÓÄ ®–ÿtg²ò€�:šÃ6Šs™¯f�4 ŽŽÚj�f›nØþÖO˜UWò[-œ³.\ÿ‚ƒ -r>iešâð†Å¯ºâ5š;�0:iPd=#†ÄG\NWR³ÞEê+@ÐÍ�Ö¶'iKY±–ãî0ðÄ%uZ†5'èož¿¦÷Þ0l�5N´z^p�ãÍ#"\™úÑÄÈÊØwÕHñq¥ºnyUÕ 'IOg¬!￯=æ‹¢¦ã -D­rBµ³îíA=Oª)eZaû¢ì8'Þ·)Ø%¹xiž UÁiìñyÖALà¸<}~r³¿RGN4ÅqiòiJiÕ„ô:ÂãT·™²;›À)Ù‹Žc -·l5§ƒ†¬»4¬‹3&"Ÿª™ÄÃÀ5ŒÄd|X-ûìåD#�èü¼òC\}™š�Ê ©‚ô¨3ëâV-žçبA -gþ"ï¿Do¡13ްõÒYf¾œ�Ç€ïs'·õ¤wߤÌ÷!¢5ÛȶðÄ �²”@©eZfÍ sÿŽ --gÅô°£L÷²â[¾ÖWÄ×0.Õ(uŠé&TÝ9ÃUÝi¯„·Þtsvw‘DÊ�v~*³›RtŽ?P¦†�ütn4œù¼ºm$ƸjY™¦à!Ä�°V cÆûÉ›sôUr]3º¤V³Méð[¾Ê`7ÜQQ•¬¤éA˜˸¤Ø+™ý{~e7#"£Žê¹šéEÚ¿DÄYy3”À°VÉ苦"ßÉltwÅMËaS´�¹Ò3·À(X¨²-¹Pq¹ ƒ|¹À µæÖ•Íñ#Åé¦c•K[}5A"ƒ¬ËöVMæü,½ß{#S[+¬^¸÷[>؇j\HIIýX -„Pç>F�oö�Å%GTÌ–«›Í¥àøäldß�˜K%¡R‡TÈRThæãM@¥.u‡>R¯Irì÷˜L9 ç§æVû¶%•ÎI¥xðc+;[ÙÁ‰øç¨ìple‡6²GÛªORÚ¡�ðÎÄ =5Õ¿4½%˜ ÌÄ‹"J¥„SÄ�½H~M¤€$•é’,¯Wå*s>Ñ„ù™‰ØKЉLäü úN6†¾Û�@pÂ�@V뽕£ËÆ+4šl¼¸Gâî¡`Ñ�«|ßó’ÚbË9´òB†`ÍÿAÕ­ÖÂù®sþ´b4Måk~’Q ½['‰Læ›–Q­¤{¦—sºXI4’’5HŸÐ§Lg£C“:d —®¥ïÍge¨o“*³Ì/WM«ÄâþÑm<b±%ó|è©M9È ƒ™,ÌNñ€‚ù8,ÏhH¹·j'Ö½ ÉE‚)‘}Œ2Ÿã.Ê5ŸJ™¨¶‚�\.öÉ,Áƒçv°A_î€"RvO6Û÷ïnn·CÊy»½¹ýùîmóýÕÓÛí‡_~ì¿ýî·7Ûß?Þ5W/?|ØÞmú¯®wŸ¿½ùéýúfûþÚj´PÆw�S"(çŽ÷‚w+2õÿ ðæø -endstream -endobj - -4978 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [214.10814 643.7794 225.10814 657.4414] - /Border [0 0 0] - /Dest 4553 0 R - /F 4 - /StructParent 262 - /Contents (64) ->> -endobj - -4979 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [448.53702 520.8834 459.53702 534.5454] - /Border [0 0 0] - /Dest 4554 0 R - /F 4 - /StructParent 263 - /Contents (65) ->> -endobj - -4980 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [214.26477 397.9874 225.26477 411.6494] - /Border [0 0 0] - /Dest 4555 0 R - /F 4 - /StructParent 264 - /Contents (66) ->> -endobj - -4981 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [127.68758 213.58142 138.68758 227.24341] - /Border [0 0 0] - /Dest 4556 0 R - /F 4 - /StructParent 265 - /Contents (67) ->> -endobj - -4982 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [297.06018 172.5954 308.06018 186.25739] - /Border [0 0 0] - /Dest 4557 0 R - /F 4 - /StructParent 266 - /Contents (68) ->> -endobj - -4983 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [418.09393 172.5954 429.09393 186.25739] - /Border [0 0 0] - /Dest 4477 0 R - /F 4 - /StructParent 267 - /Contents (21) ->> -endobj - -4984 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [402.94513 158.93341 413.94513 172.5954] - /Border [0 0 0] - /Dest 4558 0 R - /F 4 - /StructParent 268 - /Contents (69) ->> -endobj - -4985 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4384 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 269 - /Tabs /S - /Parent 1 0 R - /Contents 4986 0 R - /Annots [4978 0 R 4979 0 R 4980 0 R 4981 0 R 4982 0 R 4983 0 R 4984 0 R] ->> -endobj - -4986 0 obj -<< - /Length 5815 - /Filter /FlateDecode ->> -stream -xœÍ][�[·~ß_q\Ûmäb¹¼_ -×¨ãø’ Rdß’<ì®×‰‹FN7 -ÐüûâH:Gäp8¤Ä³v^,¯DÉáp8üf8¼x~·yÿîêf3<}z6 Ï7›«›Ÿnßß]\~øå‡ñ«o»ÞüþËípñæöêííÝøÕåöïo®~|¿¾Ú¼ÿ°>{öløü‹g/¿~qvñí/Wë=µ¯_|ùÅÀ§_ÿ{&>ðá\ Ž3o­ÐƒÓ�IåõpóóÙÅ n~=ãï7ë³Ï/ÏøpywvñŽB —ï•Ç�˟Ͼûì{Îù÷\Úý§Y Ò ûo•Ü}r³ÿ´«áœ3˹ÚƒR×Ûïê5LMí«ëÕ ùL̤¿î ²Jì?9Õ1®÷´\B-»gÀÝjû¾ «AOÝÚWU3—’ÎÞ¥<¤;3 �*ýh_Dí‹È´ùiô…†À¤M#úŒ—ɸlc¡�bäÑôçºY2ö{�|EŽ mv›D,ýÂUê=?�‚b�JÖÜã™°]ý0\~uöòòì_ø‚ä‚V†g{4”n^z;‚»_!Ùý¼Éy•®qP*"‘G×y˜Ðæ’çò‹E¼VÒ5¾¥ú$�,á¢ÑÎÊ YZIõÃM[‡pPñ¤ƒe## ’•š×¿$˜¦ñ:‡‰sqS�°‘vפTŽÿûçÕúÇá³Ûõ -Yï˜Ú‰¬0LM‰¬¨ˆì~{�"¦ÁL¼×«á|ž¾w1³¸êyª"Wùð‚¥…žJ …ÜLdÏt§.(Wã“BX#¬dF8-ZxS]Î6Ê_Ë?a2qÐáPZ‰„Ì* ';)]�ȶh©3­(ù\5QñܤÆZjÀTïÌÃTñRÞ-ü Ä“u©¼x�Î=Ðh,9\ Ô2ü†mF#‚©µdJ¸Ð"—² —Ûn¼] —ÿ&7hãžI¡Â}-Š×¸ÏdΤK#už(N@h?áëÖ‰°ä~ÏÓFžÎ‹Ô¨Ò…1’c7ž)eÁš½#„/[ΙYƒ&�5íh“Å›îæ¯³vf:–\ëÍ xUŸ¹ºTA�κ6Ù•@ŸòV€Ù-,Œ°vœyÓ2 Ü,¹+ÚBÈYhb*œâl4ÕÉÃN ™EFLzck«Ó!«ÓHÉœ‚\�1¥ç7›ß®þsyû¿ÍðôÕËW¯8þų‰peO¬p;•úõ ¢³žR%Ö;æïQ«ó^¦0]�ØJJ&µ GìñùM”HJ55àóõ•íó¸!MN‚G·ÔaPé¶RgѲf ÉþìÀq…èX¼Ï¥óR46&&•á¬AÊØËÊχLd‘*O¢�˜O„nÌu*:#`ÖMŒídË:ì²­†ê`Y0Ü- RsËïšò°N3!—À0�º`Ç%™ÓÒ“ÊJerÖÞî÷İLͧ¬YHo¶v6J+¤Šb[ð/ùª¥[<.ÅH¼®Š‹DÄEŽ.¼R-òÒ·¾°#½â†y¼ënþE­yì঄eÒJ-{šŸwy5O¶¯Îv’SÊ1®Ç\/3¾_׸��ž”LI®ûeá§Zó˜y¨´cÞmú‡ÿ®Ö>fñ)#™ÐZ/ :ßä:\ï#è?�~à�b�´³¬Î#+CÑf ²Å’Cl©ÁÓXjý”/Ä)U˜Ù]ÜY†µ%ÈÝÒr¦­Õª1È=!£Ýy˜ƒNM -"ïø¢s!®ê6#Z”P¾dæ6œZþ‹ã¢uõ!v¢‰&Dð08B2 -ž'�GcA8ùºìŠ�ݬºF² -èÙñId¯[Ø‚ýÚqoQ Š<䘾i?ß“�.0§­šCwÁÉÊvîà5@#opѨ¨l40h)�®,ué@>Õ:#/ “ [®¡�ù$¥kµXý4F�=VYIâ"ª…Gow„å·WZ§Í¡�‚_�pI TrM�îCã SÆj³HÕA<ŸåÌk)ìºùGÌÉyI%cMv¸"¡EfF{Ž‚ƒ›´Jq]·ƒŒv×#÷ççÕèå™—_"z5g1qîÝÙÊ�Çk47Šþ–#Zr±=AD\”ySåEËeŠÒÀ ”ƒ�"¨]s€¥’¤~p‚ÙДµª’;6j¡‚þ„Û!Œ)(¸ 0Ò1+#ˆƒF¶G€àd+˜,+Õtb©¹E` Ù"-¥áØ& × õDPæ}®)°B£yŠ�óy¤®ŸJ+x>¦b�­È`Óõ‘âZdžO+E®nãW]�ÆëÚ®öšÝß0¡èÊ€û¼ÑWip?Ô¡g3ê€^Kê¦ÞÔû‰^7šû]”>ŒþWQ#EN5]ÅÊü¦óFú“j¢»¦ËQJS®£3n O9U(ÿÙzRÙ®@¡˜tܩùÿÔ[a5z �7÷b•‹¾h´(¡%óòUP8«‚ïøx±®f—·‡ßœBÂëf¿Ñ‚&e Û¹K(gméT]jZ ÆCã:R5¼s~EJ*‡j÷1w˜¶Ž9k–Xù¥9Å‘¼:F(mïH=ŠŠ#fΑ±T,pßf¶ÖÛxdá[ü5oÊðI±�vdžò5)V0«C ßj2¾½–"ô„Mb"&9·ÉjHÁ(Qæ­‘\1£}ÿü—˜|„Œæ5æKÉ™rRë%Ø/TdE½›Ø$ÆÅ¿NߊD‡¶+!�F¦XÍlƒrïm*NÖB�©†°¸ t ˆ, ó ‹j“‹¡Z+æe“¶è -:Òªpq×(Çe¿dmY¤ª,@ï.›Ðß‹¦ #�Þ^¶£Ü®ú™ð�õw«aŽ/&¤K"KsŠ[v5Ö“·•�àc7ºNÛ¨7#>r�ÓZÄ7éz/8UÛRxTöÔâ€k${lÖÛt°¸½_~q}xhíJ º/à>NpˆâœE.E<3„ªiŽbÄáÁ+,@t®¢åT-š íšC -µÌy}Ÿ!…Â9Æ�Ÿ}þ“ôºduèj2n@ò• &ÿõC�…, ¿U9.´0¡-YD:Rž¬iDªè€”� îè¤BÛ©'oeRìˆò#ZkÑGÕùÂNJK¦¹±®e¾È·ëZf^¸¥ƒ´þ¾Äåô7ƒÙêÊ ¦löþÙ…Y“Ê�ŒÐª»ù‹Zóè]Ê YàÊw ËSΟ?Viµ#Ç+7Þ. +kRbZæ5éÁéX&÷Ï?ì2š9!Åü+)©#büÎK汪¹6$ú¥�eBöEÖ.°érÞ�k‘ØÐ䈽z—�ÉQKõÜzë"=ˆ_§7:s» |�g9¥ß´›¦UtÔ§„‹ðÙ>�ʤÅfÇ{ø¸<Åó¦l{Ù{µ%L¦ÏÑV2m»¢Í�¹žân5;!7\V¯:œ–nÈ©’V°X<,X ­W½l+D @¨ÃoªKdßT«z £O;UIwšs®^äÈ9o%¡6�ê0äfJ™ÖM%|ŸF/#(ɳœ-$ˆŸ¸f§Æâoa2TÊÄFŒWzáÄ¥N!}wÙVCØÓ¯ÂÍV´ÃÍB3ëºòx�܉î—L² ÌÉÝevËl°ÖRn«´ôìBçInð´Ôt�=‰k€xuƒ¶J&¼fÒp/Z8Óvo6sœÅ;c<€î¥÷šâ†eE†nk.}¡Û ¸þvX!·øíÌã�E„°£à¦×—.Ì¢)Rx`ÆXç{¸Ü1bM!M�´Ú¹þIÞÎp� ¶�¦¦»M#ÖÒÔ'ûæ �ÉÄ«;Èê´•ªú23²'Çj”ÆFfŒÂc`pZ.ÙËŽ2Ëc?¼§EÝeΡêØûžì©® U£•hø'ÌÑ›æÙNfÚ¦ý6šó³ªÅ�•‡Í‚ªF"=@çÄ�xêñªŠ9¤l™ˆJ¼ê:µÚ›Ú×(/cK3®{žè·éý¥©¥jìŸCýû\1a¤í—ÃÇ-rƒýºèûYXã@o´ úÜn¬uàûr Öyz!o‡kèaµì«2"¨G(ù�68òz²rŠYïµìÍçJ(H+j~¸¯ê§j‚h¨thI{ÔU гÆk¯ô誇P¾?ûpJ‘~ŒÃÆÊã(ŸaQˆxû«y®HîíFþ°XYĸNYW:ÎM´„4{Q³š±þ:ú¨æÈ󰲜qiÿ ï 8É·A·ŠX–þ·HëutÑvšÈÃërðëÊ;)ySªlµïôáE~éÍ|9)©N -À½^P9Œô1Á~ðh*%´î½G6Ee–ê_ -TSšTÚ2eûr8}¸r‹oõ þoúcã=NHMo£±­I”Rbe²”Û¸G ïsÐç#:OR{@j•½ i‡´MKÜ_ÞzÅ*˦ Àù8éÈÊ�!f ì38:ßÇ8Cjˆñ% -ÞnŠ$¥:F�÷bE95‘ç²”ôÒlyÎÖ)\lªåî+w3ø© -z=ª¯öø$d9’‘£\ªÌ®ÎU²OÎ?ó°LvÞÝããIšc©’¿i58,—i㌣¸qqBNµA˜¸Šl¼ö¢xU��÷9•Œë¾'#+¡Ü§=”ÃtÖmÓñéaÓ;¤…ðø³¬ÐÇ%p „„Po2(´pÊv8`z}¢â¯ -‰–´¶š:=pL†@& ,Ú�Üçôz#ø×TßÓvQß®[„š7/òÖÊø¨�r=Øca×ôžIÎCaÿ9ù Meƒ­æ£©+1WéTYjìuœô¦ÌˆŽ¨Hi)l ÒÅs÷�èøÊ%ωÔåÝ!˜HF¾€`ëËÁc9ߊz ”Œ,·Úâ%]²2æDÏCp¹fƒ*:_dÎ1‚ðÝWë"ÍFí˜×J÷WÚr¤²rÊ0 ¸ú©[Ð�Hv¹áž72NÝ–£¿°¨xУC¡¾l4¬/+Ïk—‘Š"·8>HÞE‘Î�OM+ß³ò›\ ð:&¢®Kç¥ô¤·rã­†9{Þæ,�c&t<Ô•¢šóZ×c*ÜÔœŸF¼+3ÙøÓ -œVæ<òý+ÜÚC 5xâë:ÞhaŽ}W¦(h�ü%â¿æøH3&ìžÛªtz4ñ˜Ÿâ¡…³MaÒ€ q˜tÆŸÎ0eÿÈÚ‰Bä£FÈÇì‘¡„0çàB/$%É»Òð°MZA×.�ÕEYR1$”(ŠOzŽ¥V,(ÞuŽkÉľͤ?fΨ=›Ñ²ÇyÌ&gNImšÆÔõTšÇv¡³¾�£]¯¼{üYEθ³ÆuµÊ3ïà Ä(`ÆÛÏŽê;ïÍåÆ+vº“M½{Ìâ^0ëÂíW_zXÜ£ð†ãg is‹ø˜`˜¬jâ„@µÃGóØåçA°�6èI–ò%`3¨J½>QIdÓÔ º×}ÐsÕq]�ŒöW$*ê)�/@IÅ™´^¹OŸºcçÄQ’ÉC„T÷'`¤^ʦ®)ä}‰)?¾,Ýg/¬]I+Ügüì[k8iã!”âBË%X§±Tá… ÔáL8Y�½nùÑŸA�¡ÔRXf¹íÃEÐåA‚⧤˜=/¤da47l×Pš®íÔú–ŽYïŒ_€•Û9­žÂn„ûºÑtq/ f¸VL³’)ZÎ=ò2úë"/á!d!Ì Á]NZ#Ç�¢û1=¤9$ e-!ÊrܶM½í·+ÊÄOŸŸãÙ “_`^foNM“8Ï¡ò§tíÛã’Ýü§t}a¹¹Rɯ*.¢rû°L?±—îJåR�2Þ±’vœ*MWc :¬Ó²nf�k�VË*.qê-²ê‚�WN?èe†lLŸÞ–%}|Â&½Ô¢÷ZàÇ`g^¹è5üN~Zè”T*…ˆêrB³hÔ{›»�ST%ûRI‡XIf€2ŠÜ� ¿ÆA¾9ª±öåSÕ}0zS$O]ÅJbܤ0‹„DÓÂH6—U�HTÔ€àd–¹·²÷�ýbóNÃÁ@eËh8 ÎV²+š¸Ò›�n¾.˜Ô·ÂoÀOĦSQ–r¤)œ¹MPçz�L)\—$4A‚cèŠ ŽqË…_@·¼ uF �p¿@?š@Á1pD‰ñ,á…]€e±mx+Ê9/⛑cá¨p›ãÄ}¢@(¦¼ êcˆ-úJ�ðãí¬ÎžøÛ~nêÌÀN¡Z†úÒ(ºØ¹R+Å<a‰íäMEíÂCBlÖ€¢…$$¹GTÈðêìÐ&·£³µË�”®#ᤛn~2 -Ïû(/TØÕP¯P–§7Íö±'R8r ³¥ô†Y®ÂäzX!Ù}4³Ð‡�g§�ŠAȃ¼rŠNl0�&/ -žIå„é’°6](0BoÑ$#Ô"¾eõßêŒ@±j�~´éA�>d)<³Fu®õmV;@>/´`:ôåú@´ôJÔî¼,“Ax1ÿ#Výô8DôdV"?k 4•3ò®%B+µÕ#£ª–ö¯2r~\~¢¼_RÞ6OôÄ¢3�î•y&@�¡3–"0MÈf™�Þ��ÄÆ´?ø"y‹~twz¥;0¶e3îì0Ê|ØÜÞ�_]nÿþæêÇ÷ë«ÍûëÂ&”óƒ,cÂÉ¢µí:ñÿ~Øm  -endstream -endobj - -4987 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 642.7554 114.800316 656.4174] - /Border [0 0 0] - /Dest (sec:preliminary) - /F 4 - /StructParent 270 - /Contents (Section 2) ->> -endobj - -4988 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [348.7979 581.3074 402.13605 594.9694] - /Border [0 0 0] - /Dest (subsec:effects) - /F 4 - /StructParent 271 - /Contents (Section 2.1) ->> -endobj - -4989 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [338.8493 553.9834 349.8493 567.6454] - /Border [0 0 0] - /Dest 4559 0 R - /F 4 - /StructParent 272 - /Contents (70) ->> -endobj - -4990 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [355.08704 553.9834 366.08704 567.6454] - /Border [0 0 0] - /Dest 4560 0 R - /F 4 - /StructParent 273 - /Contents (71) ->> -endobj - -4991 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [419.0758 526.6594 430.0758 540.3214] - /Border [0 0 0] - /Dest 4561 0 R - /F 4 - /StructParent 274 - /Contents (72) ->> -endobj - -4992 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [245.40627 342.2534 256.40625 355.9154] - /Border [0 0 0] - /Dest 4562 0 R - /F 4 - /StructParent 275 - /Contents (73) ->> -endobj - -4993 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [193.23015 219.29541 244.80914 232.9574] - /Border [0 0 0] - /Dest (subsec:revertible-effects) - /F 4 - /StructParent 276 - /Contents (Section 3.1) ->> -endobj - -4994 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [395.6463 198.83337 406.6463 212.49542] - /Border [0 0 0] - /Dest 4563 0 R - /F 4 - /StructParent 277 - /Contents (74) ->> -endobj - -4995 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [360.2746 144.18542 371.2746 157.84741] - /Border [0 0 0] - /Dest 4564 0 R - /F 4 - /StructParent 278 - /Contents (75) ->> -endobj - -4996 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [378.12582 144.18542 389.12582 157.84741] - /Border [0 0 0] - /Dest 4565 0 R - /F 4 - /StructParent 279 - /Contents (76) ->> -endobj - -4997 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.57414 130.52338 86.57414 144.18542] - /Border [0 0 0] - /Dest 4566 0 R - /F 4 - /StructParent 280 - /Contents (77) ->> -endobj - -4998 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 281 - /Tabs /S - /Parent 1 0 R - /Contents 4999 0 R - /Annots [4987 0 R 4988 0 R 4989 0 R 4990 0 R 4991 0 R 4992 0 R 4993 0 R 4994 0 R 4995 0 R 4996 0 R 4997 0 R] ->> -endobj - -4999 0 obj -<< - /Length 5610 - /Filter /FlateDecode ->> -stream -xœ½][�d·�~ï_qfgìMOÐjÝ¥8^Œo±ñ"�û! ÛÝígë§R’œª:§$’¢t.=/ÓSUºPEQä'êöÍþðîíýã¡ûä“«®»}s8Ü?þíé§îûÛ»÷¿þ8|õÝo‡ýúÔÝ~ýtÿÓÓ~øêîøùÏ÷?¿ÛÝÞ½ß]}úi÷ÙŸ_}ùíçW·ßýz¿;·öíçß|ÑÉñ׿_©Nv²»Q]�"z¯ll}l÷øËÕí£ìÿq%»<î®>»»’ÝÝþêö­ì”éîÞ^*î~¹úþw?H)¸>þ+M¸þ±»ûï«/ï®þBÓ¡:bJmC‡”zøûêºS²;¥åù¯: §¿*ä¿+“6ñúºsSÒ�ÿÚs•ê85Ëo-…1ާê”*�S€òŒMGòâüÁ_w7ZöÂhÙ»ÓÈÎ?és}c¯;= Ú8ð«L{y•vñƒ4|V€D¢÷KéqçZû‘ËYÇû„â±ù‰&²ù±âEºëÎŽœz¹îÔ…" ÆC5|®idZs$)cbˉ¢‡Œ®«‘ S—é§‹8^XóÀò;«›95þ’iàíuçXÎKm.L¾ÑÔ$¤,ä…Ũëîf*œ±°PÁB&çË×Ö²aײô³|-£)ö„К‹*²ä’‘ÒÓw.—ËÏTzd�4 �ÌÑTj˜Å‘’×yHÖE¨ÁgÍÎГŠ6Ì2Bƒ¹]ú;Ðu�SáÓ’·éƒ�L\=_kV.[w`ÙV楼N}¼¬ ³å„Ù)¬Õ• Xµù´× GÐÕëÍè:OÝGÃ?Ÿi“ùŠ…mÂÓçÝùW ‚ˆê©µ¶¦÷´¼ƒä,ÚÔXçÙ)µN„(×è§3#¨ý—^ÿsÝÝ8'ä`ÔÙq�«ê81¥¬ˆRå7‰§(õo¢qóéJ­ÉL3R;8lþXæ?Û,DZY­âÒ¹‚Û¤[¾TmCžSá²Åd:MQ†,e¢á¾m NµrS¨2ÔiÊç!1!/;´ñ×�Æ6Mak+ôWÜÊȱ¶íÖ/Ùs¥“NÃeN+ 8²ŠÈh¡T\³|[m›ëîÆ8Ñ›^«l¡^S§ ri�êõ}·PÎ:YÚFz®¾åǾ•}Y`KrÐf (Ï�]Ø<œvë†AAÅ0˶,ŠK£òDSn«… ½nÁÁ:7%XŠjzš$®`'S ©A3ô¬fPQXçWi öÒQ¯»Qj®U¶tV§cú ôù òãÇ×pnõu b›˜#‡¨ûi%“¿F奇£Q‘ð½�ÎÆàØAVD«Â ¾TÅ!•vq�16 ÁTV -á¦RÒÆ©At®ÊÊ"kHâiæÎÄ–Ñ©ëÔš˜uH{iEè­5ËUBóÒ©ñëÄ™M×lÇ!žZz˜ÕpŽ¿f’J/C@HÕc“ŒuúrÒ‘$•û&—„RÃÿt¿û¹ûÝÓ˜£`¸h…1ë„g:áÔ¸Àxb÷÷Èæ^ôZö>o£â -¸¸´¨&dS©‰Œ1¢>ŸqÈ|Èèƒ{`=�CE8´3BJåš&ªé°Æü{ÈÌ$`±Ow¤Àãxdé¬ 7¯ûÇ*Ç(?²±Q„>ô›0l‰Ÿ ÕÉÑu:+ªc¢Ü‰Vj¡Œ—ný ¾fæ -l’¯“£È~ùÓ]MŽÜìÄY²n8žgBTã®ã6I¤ða…? X¤ÍFž¶Ød…3 Q’;‡ â¹¢ÎyOÖµ˜bN¹»¼ÜXæ)wÚàY€[8ŽÀVG™Ñ`#2gœ¥SÄú�`«í1"\ *ó§òËB&„Tý5DÎ6fHЂ§èΜ�GñùßÚH$Ð8¯çžžëáw.)·q¬++¶´ï¦§mD´Zys‘”tÂÒ]ø�©‚ÔÛ�ÌÒ™‚½6ìxx¬¢âz£œE5Y5cYG-Œ×εH†n³)FBwàŽ:—óßñïÛìÓ¾5¤(?²1Jxgœ_#ï‰ey÷”¿Ê+”Uf5_Tz×ÔÙØ˜(¢íWõ~šÔãýWÀD!µŒí7""Ñ5B¨ƒ†âq0~¶aGÝÒÕ¤õîýz2ŽT|Y“ ÊÐ6AŠÐ»-¸ðQƒ’Jí•ç×›Å^&c‹Vò’¶•Ú·'hƳ,©‹/oÃ[#ŒõvùĵAø Ž¥ñ¨r¶e„Ö½=µ1ÿ0ˆ2�@suÐ Y ÄC¸>–…4È‘¯rgÃæf¸³QÕªÌuà9„:ÛåufùCjST j:ÅgÇ ¾N¾ô/‡�Ìåú"ñA²³Z>é•8˜m›äš7äu/|\¡ žÑfž¥1´èuT^�î(¥’)KbS_ÔP³°?�œ ÏÎX¬e{"ãÙ)ÙdÐfãÛ¸áÜ5¯ ++5\wQŠ¡ vvOF>MHæÛg¬@¤’E\[öË*+ŒѬYm7uâ°ª2¸¸~]†Ö“�¦ÎÖÈÕt4Ù˜†:wXcEˆf.´,ø- ^�û',Åîkñ~°TÚèF±:^y!õ -�øB[Fáú^[³ÜˆË÷:�NçõE¡ p!ËQK‡*IX *m¨ÕúWÁ7�(‹0ãÞvÃhç츮$ö×C`LHV~?Ó™â⮬°mfй�ƒ‚lß ÞËšN`¯ƒ998ìV›¡‹;½mƒé¦ÅA8ï¢ -ç+T_÷�Ì ”Š�-Ô˜äfÄXu´uÀØ(÷ßp­f¼(D3A->²°›1½d!ò@èÁIGñV€f3AÕW)v5=4GüaC5ÅÀÞ-³1 -߯Šìhw‘EàwŽzG¢3a– -%Q°¡æ ®»Òç‚Iiö¹`Jæ@&[`ÇMÔ•ÖˆÀÔ‘Q±¢¢!¯“þJžf1vlo-JŽX!,M!‹²GîidOû´PžBmØ›{68!Í* 5éžé£º¿ìf¨þ˜›½hs·![µ°a|z.LýKެwj|¥ð¹ya~Ó/PšÑ’T®0ž¼¿‚¦]q€š:fSÖ6µÉøC �H‹Ð{>…¶Ù5ÌÝF¨Äš`JÖ+aÂ/Í [lðÏ)ʨfy°Öò—Ø0ÕExI*Ì·Qê¨6�¾ -ä°^ôJ™–I­â8\ -÷�0ÐÐ(ñ=§±<ÌWÝßbC_wDàᾜVÌ©à[b1䈑‘ÚªßÔPîc3d“q&6ñ¯­€92ûšj -œ¬n DmXÂg· ™¡V-ØÒ“×¶pí¡:·ì­RkƒjlzÛ›7A ©‚¥µ{Ö•L3+L DQMIóµoÂæõB�©Î @VPtSMÝ×4µqZÈÞ„q¬hê·„¾Ln¡\fý©�GÙz ¸7µ2ZѪX”P×§›�໡\âö1ËÔ·%ON ¥lbj»úÆ2<ú úÁà¡ÔU3M-ŠŽZ6¤4DèäûÀ!%§EpFöŸ´I3¢áM¦Á½v1�6nÙÒ0]÷(U“ò áBï”õ»´–šýC˸ò�K59žvÅΕˆ„Í. æ»ìgÆ�àÒ|'&8Ð2zpSY(¬;©¼°Jѯšþ`ÃOvÈF·¸?À«¿s¡ÌY'l0^êBœ÷¨"PfŠ)ì2åÄjPÔ¨'îN *›J5m�Ÿ^½"-: -±„GÎÚ„HÏÍ+éÅÁ£l¹¥«=s* <:ƒ!3m$°N’ Šè6 €W(£oØ“\Ë©¹¡´bÒJm‘ó¡$éEÐërl”Ý$ÂimLl9$ óЬï±éQÍ…[©.ÛS››OT˜Ä0µEÞ8GAÞÍ 4$¨�m¶$ã±�׿šç¹ô?�ì¡ØÞè%M€"ùäsÆ ¦­E�•$/Éx‘Û£”S²‰+$&‡£ -H8"VG¢-^2½rÍ5…rœÞÓ÷*ã,j_7`FòFÑ&•á™Æþò4±i×ZÝtëC|¡6ñ2ó˜@û7Lýån¦*½Üel�‘¤@Ûóœ5`?s°(hÌôÝ!0Žüˆ 1Qp)gAÕ]Cç âŠ$=– 5™Ð +×e¬@üj†æN< Nž‹2Ò`‚µZ·õ‚�‡K<+ ;@©¡‡nIâqÖ¿óµöª`øæŒ=ÆEÑ[¹çÖê:CÈ`áxŽ´{˜e«CZEò×€ñ0��`¼Új`C„Æ:¡Ã*ÿ‰ Rhe’œ]*w ì˜Ú^Ëg'0>`ÔŒè RJr'IišFêö“¶rÀÀj¿f›.�9* -¥­VzÖ‹Ñq¦m5>ëÑΩp«™P»æÈ´n^ ¥ìº9Èv(1ð©]ÞPÕú­fJ„Õ{m‘³òO¯ÖçØ -L™¢š*žÛ‹ƒžŽiìi{ù¡Ä±~ÎcšµÂÏ©§á—ù8uòF%¢“±ä¬NðzEý“†;.e¹_Á[<ç©y5k*Àl–Îbph¥ÇÈŠ4ÂTî•Ë©èQ8fÐOÙ] -–îœ ob¦ùV–| ãRU,¬^{#Œ\ã€Zz›¨Ó½°Q;M§¿Ý>E0è¯+j5¡«g¥×ãÔA…+ÇôÕ#A‡�e \ :¦°�ˆ‚†¬Ì´œm¼máÙY¬#(ˆçKŽÁKÑ�5ÅÁ†°´í…·Öª5>Ì•àËe£P2‹<Õ`¹¹OJr�màÁ+6M@0q©�0˜Tíi5+'d4.Þâ-ÌY#½­êž­@»�}­æÈ_Ÿwøª>–gÑ×4‹¾×à ½q�_òU��Ãð�1FÙ£G ¦ÕP¼þˆë¶‹¬Zq ¢žøtRyDáE­ßŠ‹±ØyS£X;•Z¡$wlÃ-.à™mºØ$ûçvM MÛ¬”2žÀ:³pÛðÈ!ë/f˜,d_k-Œ^å¤,=_[B,æÏÊ·[1“ÙšžèôÔû ª7B›!Sñì›ÿHçð��ñ&§'±áÖŠ(ûMdàë¦;>6ßÐr@ÄåwXÁSÂý3C%ÈO2àö½ÚúQ§))–Ïkk¶6ùb/(Õ%ºùy‘sè›ÿ¬p‰Èñ[v:ƒ¹Ý×o0xò‰5å…v½5-"Ñ„ÄÃz“j­r4 Ÿñˆ¶H;fù2,t ߀ë¥è‡„f+¸Ó…äão½Þú ææÈýÛ* (÷Úp�}-M@è@�Ñ­R¸çϪ¸´h‡†*Ôz;\Óºe�5<á8ŒB:«Üº¤£Â«ˆL_8a -ÇœWµÁ»Úà'KIÅ(TïY'L[&¯ó®¾ËœaUtc ,‘Þ¯ 6R×T BEåò“æN–R©üœ KM›A -…Ò<¶ B€¨[ÞÂ:@[Y±Éô,æP`Ý8y·sQ7Ñ54 š… Ëämÿ‘ÊwÉN 1 ú)ú­²AxoFvó'ƒ¾ž#Ó\Ço{mS¶¸ÓZ¯¿ŒÓ¶Þ<~»ÿÿ»§ºO¾úò«¯¤|óŧcËmoÞ€ Þ·Ÿs䲨Z¬pÆ®�Ç5H°²bxõö š®É/¢d¥ø‚ö�Ö™/Ê»ùl£ÐÙuZi*Tqö€òdT-Ã<ÛW¹µ­_1Ç ÍÁ;…é*G§ê ê™m÷°Ö4‹„U^Šô - Ø -Œ½“%ç*Ž�ˆà6jyñ˜~§:Ld,wˆæ-½à\¹EBk9mˆÚ3mÜ·®»âanêž?`ƒÈ™žuÍæ73QËC ¶óm˜¤›J¥4E‹òñ„Á‹±R…Ù…\Œ5×®%"‹yU6­¤é×d•›‡+ÔZDÀÂ<9-„f̦ÛÉezÖÝ+@›W–½„—‰54ãúM)QèðÛ±�,°B$�p¶Êc=ˆë·á�HºªœÎ{¯W‰h“«,R^*ã¥ÐÁú VÈ‘iUwA¤¼U&¨­¨hÇÆF*’mBJ»¨·bH� *fb¿MîÃHùo†,zÑ Ü-4gA§°ÇØåÚª˜9Õ ¼—Ýr A¦;ï©“šjªØ ­ˆ�ÝÂŒÎ>Ÿ'=’'j'\°ëzOC5Ö)[?úõD4-…ž²!z%tÔ[° ðY'¤íMY¾*äcÄ%iˆ*Ľ}!áÆXìbÆþÎ5G©s(.”×.E+]¥=÷÷GåffØ\ENP*^lè;Å9æÐ²g4«ãÜæ 3Ê4@zaa2_â›èÙû5Jõ"Æ5Á�6~­$EkkÑ+ã¸8ƒ%kÌx•u675v½—7}Ê.}M¼ûâj2ãK³ÎÚxS¼Ê -ò¯” R ïÈ]bC#!øhóÎéë©ðüÃßB+ˆXÉN£JbÏPÃX�v±œü – -Ñ•žó¹ÅÔ–€»A‰°·s†‹ÀZ[kV&Äg6W儲Yrf 8këUª—rQ•eAÒ,¡9¦¢˜ù]¬/tž!;0ò3hóHÑŽë£ÛŠkQ)ˆyN.ϯ ›šuYœ¦e> -endobj - -5001 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [288.27457 623.87244 299.27457 637.5344] - /Border [0 0 0] - /Dest 4567 0 R - /F 4 - /StructParent 283 - /Contents (78) ->> -endobj - -5002 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [307.49673 623.87244 318.49673 637.5344] - /Border [0 0 0] - /Dest 4568 0 R - /F 4 - /StructParent 284 - /Contents (79) ->> -endobj - -5003 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [116.09558 582.8864 127.09558 596.5484] - /Border [0 0 0] - /Dest 4569 0 R - /F 4 - /StructParent 285 - /Contents (80) ->> -endobj - -5004 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [467.82358 500.9144 518.84344 514.5764] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 286 - /Contents (Section 3.2) ->> -endobj - -5005 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [277.32913 384.8184 288.32913 398.4804] - /Border [0 0 0] - /Dest 4570 0 R - /F 4 - /StructParent 287 - /Contents (81) ->> -endobj - -5006 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [294.39148 384.8184 305.39148 398.4804] - /Border [0 0 0] - /Dest 4571 0 R - /F 4 - /StructParent 288 - /Contents (82) ->> -endobj - -5007 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [224.39613 193.55042 235.39613 207.2124] - /Border [0 0 0] - /Dest 4572 0 R - /F 4 - /StructParent 289 - /Contents (83) ->> -endobj - -5008 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [240.76514 193.55042 251.76514 207.2124] - /Border [0 0 0] - /Dest 4573 0 R - /F 4 - /StructParent 290 - /Contents (84) ->> -endobj - -5009 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4384 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 291 - /Tabs /S - /Parent 1 0 R - /Contents 5010 0 R - /Annots [5000 0 R 5001 0 R 5002 0 R 5003 0 R 5004 0 R 5005 0 R 5006 0 R 5007 0 R 5008 0 R] ->> -endobj - -5010 0 obj -<< - /Length 5477 - /Filter /FlateDecode ->> -stream -xœÍ=Ù’$7nïýÙž™•ÊÍæÍ¤C–ctËayõ›¤‡îÖŒvV�\[ŠØýû�¬ª<€ ó¨•_¦§ª˜  ."ï_ŽïÞ>>›�>ºišû×Çããó_ÞüØ|wÿðþ—º¯¾ýõéø÷_Þ4÷_½yüñÍ¡ûêáôù��?½Û?ß½ßß|üqóÉgŸÞ|þͧ7÷ßþò¸¿@ûæÓ¯?kdÿëÿݨF6²¹SM�¢õ^Ù&Ø(´imóüóÍý³lžÿz#›¿>ïo>y¸‘ÍÃáæþ­l”jÞŽw~¾ùîÃ凜ßK-wMtÍùÓáü�±»FËËwÒ¸ËÈþoØ5ªBJ{å/Ÿý®¹³A¨Ö*kúQ:$ðUÒm:Dêtré¸izdúQšEÊÈt�ÃRÀÜ•KôÉÝôÀ'ùö²`­j–Ò±ŠÖ�üV¦d5~Üñfר~ó5tè#Yj«]s7ìöSyp€g2kî·Ð°=m©má{ ÈÆ -Š$y _È„Z?4ÿyóùÃÍŸh X`œpÁ¯P‡]£ˆ­¯å�Ë:öýj€ìô@äTÔ/48�Û0ÀÀ›Úý}™< -¦Q!AóÐð7³ïÔ6Þ¦ ÛÙ5ÚåÅ`3¨§Óç»Ó‡Ý!‡ÈÀW½(‹�JTN/'sÒï¦ß½(ñ¡æøÐÇ(Œu*ž{d.«4—­5¡„—!ðŠz3¼F&3ô)sR˜ò2L4Ýùß#+*fטAú.OChR™ ¤ÆºÔ¦D*Ëna°Â·f�5qÁòP}’ÿ÷®qQøàUhÏK?­÷E÷Ïýð¿nÙ¥¥9biÊH!M6YšG¨Ž*�Pn—•¼¶ƒNÓSîà�3•ŽO0œSàì!„?7+<)I£Áâz-<ê4e5d‘?ÂiÏ�nÁ—Ã)Fž‡™$ÇF"ù¤%÷Ú“É)ÈÑá4䃬hÕ‘�°‰Y®©Ÿ´ ™žU:^ ©•ñ+D“Ü(xZj“0çÓDwké„Ô2†ÍÈQ©‘lyQåÁÍ–ØÜ:¯NI+bŒã—FSæ³¶k(6Œë6:&q>ð:9[So*3#4ØÿùL@»{@yÀB¯X6¡=•¢DV¢mÆÅ5gmÂDçwÜpZΡñ�jÛnËïz·grRbô�ÒÏ=÷iÕÉYÏ:À°c�ì^*`Ùàj*W àðJÏ)ÌðœvK«Ù!¨2=Œ{,¡Æ»o·E?켋£ä&8ý™¶ûß=îj>|³ß,ÝaÎ,­½hcXãDèt©{ÀGrô±ù4þI†/«=NŸ¤á Þ‚”º{Ôa}¶§—òWqhÊ[$ˆ­m1ÝÖP»ÆXÇëÕ“ðu÷�ªÁPaXÝá¼÷k>áòÙ®yønv*¤ÛVè`]XO¯Ó¾Æ" (ÿ_Ǹ#1¡<~#ƒ°Ñ³=þ­ˆåLÕ®Çâ„Äç%¦ ^£�ÐÒ†«ÉÐIñþKªÕ‘«%9!œºtøW“QIƒb1˜.6¨Ä YC;ŒòîʼçK§†uN8/m•^Ð…MNÄÁ@ÁëU~ŒàÖDJe¾ÙV 'cÖEûÍð&kE†¥´†–5A•Ú¸UKHL#Úä²L­ÊÇXå~ƒÁ·´¤Ufši -ãœæº.¥ÆÂ¯Ž…d @¤®è¡dܰ¡ü7`Òo´ (Mw}¬XWeЀÐZפM_ 3°±SO®�™žá” ¶n&SUû *rÀÅ(\0kÂJ:?“qiØDutBµÊé¥ÁÙ}áö“ƒªÅ7}ršlžÚ5¦ÏyÑk�QÐé±èri£CN„6ñªjŽtè)3«-'©)ê@E�…-U3$±`i‚­�HDWÓtaÞMÉC�”·å´Á+Å‹öÖëçã¯�ÿûðæoÇæ£/>ÿâ )_öq¹Æ?¹²'+ü›O9tÙ½k�ˆJ­ªÑÉ—�\öçJ$¦œ9¥”0mpí¤«ëйläØ�¥XÁ å¤r�SV´mƒ …ÂGR¾6¦§¢÷ºuÂo·jÛDÔðÎϹ™Á‡x)ì*�cÄ´ÜñÂÉIÕ¤¯Š3ozT•ć½ƒæ¤Ѭ*/…œ'á¤h�” -_üÀ?nvõ÷wÝ¡*då^B©EæÐyƒr±q4ÉœFY¢Qá^4X׬ØSWˆU'±îJÖÈÈÒ·F"%F)–Dèê–9ï—EÉ¥ò•ÖÑjÓ¥K׋î¢ë£é*Æë£5¥�†J9ÕŠÖšî$[»$Û*¡ÃÆ¢m”Bw­k£U™ƒÆ·ÝbµºNf†tjД«=?±ìøÑÏ‘™b4È€ðèšp!½P.ýž&© .j(¡‹Å_é#áý­8›¿f鶸´ 5ë8©/ŽÊËCÕ† UÛà…W«BÕ«…Ë(a­³R׳|d†��f㔼2p�—«� -× "is?c2 >•ÞÍAOk.>“&Ï --“*�#d•Ò°)[aäŠØ`öA] ÑÿgïëæD±³”µÕ­¥LNɦ5ýiAñyßÖ©oÕÓöZ}¥œjÚUî7k+e©¥¶ZDÕÚPC꺲”d½¿kàçõ”²TîQ-¼VJ¯Á¶ê -®¥r�:atTf=±NWp¿?©Ðfz[m„Æ Kv%‹V˜¨l»Aj:S!#ÝzDª®%;Êm4J -»ö@ב¢ì”[Íd@ó¾%œ(±ÁÓ¯ÛÓ0;Ýì‡ôºêƒáY’TWq9]:áëÄÛ5‡XÓk°‡ÍD¤{ìLß·EŒÉ6ñADÛÖ!ÉsõÄ WN(�¡®c—�,§ Þ9½]÷D+ùÞ#y›P·gŸ2•Éž¶+¨ÑN­'s†ÂÕýmÀ“°“�ƒT¦ï²w¬ :õñž9‹Ýæº>wÎkÖóÃïvx«¬àžŠ³Ž´B¢íZ½D=~©tC©ZHº©;i5 zÈŽ/6Âð7xGȾF…Í.kqÅ6»]‚[+6`á ¢¨Bê²<)}Dä$’¢`ЂÈ"ºª¶-<¬!?fÞš½XCZÝå}‰ÁW¢á9P’z6h¬­[×çuêAj†û)+” 6±«r¿hÛ¿˜mŸŸŒé¹B,�ë¾—!D®© ñ‚$9AÃ$å¹<3;Š)]¨$GŠ[ÍæÉ^-�cI^A€\‡üóõ›VºÎVÔšë´Èiˆß¢Ñ¢g³ Æ¡ºdèškûôÑ2•‰®KY?Þ,·P~&uUI]@úäu^%‰Ð›&é2ýÜpgfd**Üó ­™IóýiÐHãBcj z—®Lg[oø�ØSª=?1½”ý ©¸°Ò³7B�ŠÂ™kuã º’+!•‰Q›íÚ C�}]×Y¢WV<øútA /Ý�zÁÎ1ežÀªø‚2üÌöo ›³þÔJBK/^(í‹Ûš^Н›E×@àÃ_Ž�¾¯ªeÚ£>A g­55^Šú\JÒ”zyF÷¢Œ±œàòmèöI8³�z––YŒÏŽzL:цU±­S¨ã_þ‘òÂåóÓ®qF£�!³üè½É jv$¡öTê11µA_O}•—]bC¶5”ªÎÅ€e“Ga:&ŸÏGÀê,ü\ÃA -;êr<CEuúR– -:’¨ìþdìò”Éæž!¨-÷Žã½fuÖ¹i'ÉÒå.7ÏnÚxXÎ6³Þ°Ê^ÕQ -×½�1¹èI_‹í–j¼P1êè*_xÆgîùÁAðÚðÔF.¼ë³jnµÁÔüb zh"¡@ЖÝßÀT[%çwõ¼ éK‡Õ@®åXa*fË!È¡L¬ž%Çœ Î`Þ\ê£J°WHuh…³ÁêÅ*`ã›ÌwJŸ_´S�AžUIè �ÿvMPÓˆºTNi¯j)Jƒ¬ègC©”^LÞ}‚LYC‘üÜÛœŸ%Ñgó¾Ú)¡uWs²¾�TÚŠÓ +ep¡ºhúgW½9¹©�\ŒæŒûñ™†÷æê˜1I›üUïhİ(•‚Få“Ñ„òá•Hõ W<=)�à,®PMï$UƒcðžQ7ÁÒ°Þ¤Ÿ>8+f7¹”Ê�sÖ•v@‹Dè_ä~9 +W'‚)Eä�WÂé®adãó!ù@ÔÜâø|Ÿ‹H^Ü 3—Œ/A*PV�ÛWô„ž“Û(Ò�JÈZ§:Ô´[¯/^•åÿvå€Q‰$ŽÕ Úˆ6F«VÆWf¼ãåD N'ˆç›V‚AkZ(fæcÏdØ>²eÚŽ4�“gBÊ–�¹~gˆT]TpÏíÚ‚æ�eªÒÆË>¥ƒïJÏ‘vu’ÐL®Ï©öý�ZI¡M°æJÍx­¶uR�d;¸÷ž´8Ê:F‡Š‰®Ó¯'ŽGC9'£¿ºqFŒ¼\€6?ˆ]-$f¶îæùl�ÏJ1äæ2:"·i3[G`HKšúf«¯æ¿Ú °í»UôÂ…•!Wú’tÈž¾L‰(£±í*Bwµ¹=1þ,šl�’A°˜wHb�»Dl²q€ŠÂ·­2«¨]Õ?!�ít×.À¯œÒ/ XÁÝRa~mÜfhÔ7PhÉãX)‚w›ðÿ‰"÷E4È—ã8µUýZòí8]°'˜�Ô!nL &jºCgXš§Å†¢8™>e²“SVÖWƒy+<¶D%¹ ŽPXñó}.s…(�¦¬!+­‰¹¾àãNEËr×EXÎþ-î‹´¬Ó®Ú®1ÐFy_²ÔîtREiQ­/(›_’ØØsó\㎊Ýp/éx)™D˜0I0Ö6ÿë?Ï�ÇK€é–i¯ô©kߥ�ìvŠ5ãÎm�¦!È -F�bw*|Ç’é̲iNË5_¨oüœngÙ¡¢Á_I‡±~½òQèÎL¸Ò»_—Ö^e -*‹MéZÞ;1FH-YmXhD×_øž¼­¼¢i[KÙñQo‡Ö…°¿ß5qÔ=g?MÃCÛ:à -p 㦢ÃÂôdË&uõjúiR*Q"[ô§º®�®]Õ¦UîXžÈkÛÌñ•”†xá�³z•Ï>¯¢¨zöú¤kZ’E*VMƒj¬Æ€ÉZ ÂôTLhÉäi}ËŠm¬ôâɩܯ,‹¶|Õ['Ð-ZïTœ[‘­ç‹VøèW$ P=U*TS7J‹˜�ßÎË3„FÓ”Z(�ñ3 -±ÑTTè6;hÑË—’ÓýEv–ŒeGiŒ_¦öò).a&ª÷ñ¦³7�JL“ÍæÁy†J©¤°žË&I†“ÛT`KÃz –l™\à@� +:?Oýúp|÷öñùØ{ÖÇããó_ÞüØ|wÿÉûãñýÏ?tß~ûëÓñiî¿xÿþøæÐ}õpúüÇÇŸÞí�ïÞïÉ.lZ(ÚÆ)•sËýäÓ*cŠú?êß”Ó -endstream -endobj - -5011 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [406.6614 657.4414 417.6614 671.1034] - /Border [0 0 0] - /Dest 4532 0 R - /F 4 - /StructParent 292 - /Contents (45) ->> -endobj - -5012 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [313.45062 643.7794 324.45062 657.4414] - /Border [0 0 0] - /Dest 4533 0 R - /F 4 - /StructParent 293 - /Contents (46) ->> -endobj - -5013 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [468.4083 643.7794 519.39343 657.4414] - /Border [0 0 0] - /Dest (subsec:scaling) - /F 4 - /StructParent 294 - /Contents (Section 5.1) ->> -endobj - -5014 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [243.872 602.7934 254.872 616.4554] - /Border [0 0 0] - /Dest 4574 0 R - /F 4 - /StructParent 295 - /Contents (85) ->> -endobj - -5015 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [117.43649 589.1314 128.4365 602.7934] - /Border [0 0 0] - /Dest 4575 0 R - /F 4 - /StructParent 296 - /Contents (86) ->> -endobj - -5016 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [281.27063 589.1314 292.27063 602.7934] - /Border [0 0 0] - /Dest 4576 0 R - /F 4 - /StructParent 297 - /Contents (87) ->> -endobj - -5017 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.70145 561.8074 519.7015 575.46936] - /Border [0 0 0] - /Dest 4577 0 R - /F 4 - /StructParent 298 - /Contents (88) ->> -endobj - -5018 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [369.36508 534.4834 380.36508 548.1454] - /Border [0 0 0] - /Dest 4470 0 R - /F 4 - /StructParent 299 - /Contents (14) ->> -endobj - -5019 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [152.61218 493.4974 163.61218 507.1594] - /Border [0 0 0] - /Dest 4523 0 R - /F 4 - /StructParent 300 - /Contents (42) ->> -endobj - -5020 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [204.64723 493.4974 215.64723 507.1594] - /Border [0 0 0] - /Dest 4524 0 R - /F 4 - /StructParent 301 - /Contents (43) ->> -endobj - -5021 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [178.02861 466.1734 229.13483 479.8354] - /Border [0 0 0] - /Dest (subsec:loader-hmr) - /F 4 - /StructParent 302 - /Contents (Section 4.2) ->> -endobj - -5022 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [130.3328 336.4154 141.3328 350.0774] - /Border [0 0 0] - /Dest 4531 0 R - /F 4 - /StructParent 303 - /Contents (44) ->> -endobj - -5023 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [311.4504 322.75342 322.4504 336.4154] - /Border [0 0 0] - /Dest 4578 0 R - /F 4 - /StructParent 304 - /Contents (89) ->> -endobj - -5024 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [339.76633 309.09143 350.76633 322.75342] - /Border [0 0 0] - /Dest 4493 0 R - /F 4 - /StructParent 305 - /Contents (37) ->> -endobj - -5025 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [182.36285 281.7674 193.36285 295.42938] - /Border [0 0 0] - /Dest 4579 0 R - /F 4 - /StructParent 306 - /Contents (90) ->> -endobj - -5026 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [303.63855 281.7674 314.63855 295.42938] - /Border [0 0 0] - /Dest 4580 0 R - /F 4 - /StructParent 307 - /Contents (91) ->> -endobj - -5027 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [143.21643 240.78137 204.36157 254.44342] - /Border [0 0 0] - /Dest (subsubsec:motivation-plugins) - /F 4 - /StructParent 308 - /Contents (Section 1.2.1) ->> -endobj - -5028 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [339.1266 240.78137 350.1266 254.44342] - /Border [0 0 0] - /Dest 4581 0 R - /F 4 - /StructParent 309 - /Contents (92) ->> -endobj - -5029 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4354 0 R - /f2 4366 0 R - /f3 4378 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 310 - /Tabs /S - /Parent 1 0 R - /Contents 5030 0 R - /Annots [5011 0 R 5012 0 R 5013 0 R 5014 0 R 5015 0 R 5016 0 R 5017 0 R 5018 0 R 5019 0 R 5020 0 R 5021 0 R 5022 0 R 5023 0 R 5024 0 R 5025 0 R 5026 0 R 5027 0 R 5028 0 R] ->> -endobj - -5030 0 obj -<< - /Length 6837 - /Filter /FlateDecode ->> -stream -xœÍ=Ûr7vïüŠQ(mLï -ĽÇv"Ë7¥âÄ)ë%eù�–e¯¶bÊ™¥«²ŸêvOãÜ€4µy°h²q=88÷spýl÷öç›×w»�?¾Øí®ŸÝÝݼþó›Ÿvß_¿|÷Û㟾ûýÇ»¿ýöfwýõ››ŸÞìÇ?½<üþíÍ/oooîÞ¾»½øôÓÝgŸ?¿øâ›ç×ßývs{?Ú7Ï_|¾ÓÓ×ÿ¹0;½Ó»§f7h•b4~7ø¬¬K~÷ú׋ë×z÷ú¯z÷××·Ÿ½¼Ð»—û‹ëŸõΘÝËŸO�Ç/½øþƒWZëGã?¯´ ÇŸÎ_í¬Þ>½Ò.”_õñç¾øM;3þüÃÕÎ¥µÖ&ÌýÇVãñj÷Ô(mŸb<}½Ú-ÚFy¥µ/~ßK#Lm§•Ø(´>Œô�§ÿ}TÎ{\ë~€Gåœv˜~ŽMçmØi¶\šn9Ât`‡Å-ÎÓ^íÜüÛi'EW †Ú™«�™G˜ñB>fË÷c¸¸�–Ûœ¾Ïíæ-ñ£î®v~Zܾl>£¢%QúVZêýK¬±aD÷ꬫ°  A}ؽü׋/^^ü'M1ŒH1\PaˆçSŒ#œPþGpÂò\ç-ÿxÚ¸ËjÈÙhPnB-¤.JUТ‡O˜í€áNZx‰X{| À‚§s¹_5CЦ)~áí˜� 0â��B?8C;öáÅQpÆTÂy’¬Ý¯�×é¸]<]´u¥Vá¦ÝZá´!HÄýÐÓhŠo–œ÷{zørµØLÑÈÕVî¾ï¾5*ßs÷ç£>,{Gñ“ãbÄü²¶h7þß¿ÝÜþ²ûàÍí±ƒ4(wÜ�6Ê+íÀÈ;oÐŒOæÀ¼O;Ê{b�Hÿóa«íØÓIøp?ÀÏK´ŸÏÌ_ížNPú§¥x5M7Î8aì#þÞ-ùG@�/×?5.H�j§á‰°6¨à†`[N ŠCïï�ü§Ç%q›9w�‰t×{¹¡èLŠl�Êàçù�Ôj[Œ áM¬ÍSâ2š·àO“h>ÑÉãÎH Šn3±¿¶jŠÞ­¼¼óâ–N\f2T¹]ãƒD4cÔ�u—À8üØ#ù9á]!ˆ#\a“Œ -fðyσ"ÙÌx©§ë´”pó€ÃŸçõHE)~¼äÅ+Ûm¨e!X°Ù­@ì¿VIƒ<ŒŽ†fYP„qP«"F8_‰ºÿ~ÉýG(ÛIx´ÿ~â=1b¹«O¿J ¢H ¯Œí°Á,[Þùå~¬Vί BÀò -Êw�2£’%¤Ûù��Ù”Sì¡åÍRÐwðuCVÄjÖ;¨RÒ Ðçqôµt]­¤Fñ$àeâe’JßB -`dæⰅȱ$,Åý)ˆÉª³Ç˜_ÐÈ=²Í°¨°ç9*PlYZV•“‘(D­|ŒÞõÈÉŽ8†Å±«œ ) ìm!�sÉŽð5H“–œ­C²Ë¢Æ˜F¡h&Õ=ïë¼yâ!$¥+1Y\¨hOXÞаbpõ‹!DGÎí¦ÁTÓ´]pJ�†& ¶2@É;º°›Í:oIjÀ_kÛÊÔNrVÎ¥Æ�pwq¡²¾ü‹ds¥Ü4^•ƒóý+ø¼6=eóõ:ª�ˆÑõø�«ž)ë“7Cÿ*‹ø¢GMo­r1oB‘o%ê`1YXòJª×ó«]¢¹°ø¥�…ôº©G+10^ä`>ª¤{Œ…{,c§r -Ú 'Ñ‘:_ --KKK?©®ÀtRT±Éâu°.0²)¯s°[d<`ôÖh®ÆÙLܨ՟Щ��hMª†C¡ÆQlH*¸äC FUÊÁûJ›B4>‰ŽU¦³P†–ãi[Ý&¥:UHÑÇž»ÒÌ`(qÓé¤oûPå/‰šÝ8僎¶ŸVøKÙH>o}ÿ*šø‹¥x¼³Y™�¢ë éžCZß@ïN:54¸0&‚Éo -œ—'"ÃÚº0)VúÙZŒô³¥ƒ'¦_U_¤“ò:mp6¥„Ú¤Cþ;Ú„;ñ¸»ê~(Y*˜¬\v~ƒ }ÝJá­¥ç”ñ=î `Ëጤ'°V‡àUÎEɼQ¶aíÑp¨ÙN*ÅȽ!߸Ež,ãÏ?•Ëð ~?¥�óÅ=udŒ¥L8–‚ÀUg ã@^¼5ôü7ìrYì€[[H]ã9Ç{̸äÆWo ±+°ã‘°ÊIZ[ ÿBj›Ïˆñ ´Ÿ§ãÕËO©ÁZ5DcÄË¿êÙë»ßoþûå›ÿ½Û}üå_~©õ³Ï?�n“�ÜpdÎß<—V+;òLV>u9ò$ì4Z CÖÖÞ3¬žYÇ¿”dv�Õ… õĨͭXº µ4þJÇàA_Mà[–ÇûQ¶eN²ÒäeÌ{<â9‘ÕžÔc®3#>>Š–·ÚÑ5ð�á öaÌË4Û6­ì¥ÓA%“¶5gDer¶Ø†³°fü¾`°añŽ.æ -CTD:BA w tªâ…aâÅlZ ÈÖ6Ÿ)¥õZ—•‰.çžCmR{-¥öZïTl?Få&£ª¥”^|ïšT^G©¼6dÒ7êV@ªå�@6·Rx/U  ޼þŸÌbµ8ÐLÐ'^P\êùÚÖ] ô-Z­¥£õ5ù ¥=Qz)‘— �—¿Ôy*®Îjz-_pb<|ÈV™Ð9ô (> ¢Y±Ê$`ŒUƒM>÷줉:Ê`Ì ¼‹}Ó/Èa”FblWºaP¥‡”†aj�ïšSħfôÞ¥#»¸t§²µ•b^€£(“ä’_˜,öÀ~Ÿ1³&-Í G‰�vˆ*DíÃßRbIFÙAG·Ñ-©Æ¦8Rpɶmׄ”YrTyHq’Û€‡ ÀµFº‘t�-½Ô;‚&™éhf"¥Ñ–„ô<¬@û—aÕö[#Ùç§Zv‚–,Rjý=,R^–=†¤|îòJ%D6ªý÷£ÜG{eµ>¡K)–aSŒíCN,'(Í]ä•+ZDÿG-oMÚ“ÃÅOýTðÖ‹ ùwј——¼p•ý¥íPéF ©&t?""†RÐð�”‚É¥e‘ 0�û¿×-¸5Â#¦Ö…èUr]iQ^@‹kJü<è]F9oMDI„…�c¡ýdOäáé·F/Æ¥4©¦Cj𾪑õxì­Bâéñ�Ÿ®¨}#³xb,¯ÇM�1Œnë)jT¤=ëV?Áv”g2††�ef ey½\ìY�PzpÐNåì|%hR0<é’�´uÐ^BtP0r� OFÛX/ jú…§t¼0éÜ ÑX^ þÁ(3txû¿Ú¹zµ‰RI7jðѹDyËñ×þK<¨Ì³Èä´.HS(š·¤ õ24hçMšVÙ«�XzéÁ&IYo‘Ë« -*Õ½;[�]UŸ7 øàîTâd��¼IYDí“H Ü ‚îÊ ä ž°bTÛ‘»¬œuiánØAÏ—²dÐ-T/CŽš&:œ‘kO�4šK„–¨mQ…Ì0:Ö¼à§ÑdÉ@…JP};þó¬p³F1ÍXJFÎF¯bôЃ¦M2K #gcV.�6¸%‡R×Õ<Êã’î_F“Ô( Ò¥ ôà̤‚»OKÔ—µFνŽB23ÑGR¸´Vâþ‚ÎØQ ‡ÄpØ`�J>ö™ôPè"Ú=™Æo½Š6ÄSj튲Z·Ò8 -}%δ¶Â Kh©�_åzÙhâ0fYë§Ìo9|òÕ}Qªœ³Q%§Í° J“‡%šCaãªÁ‡ÖÒ+Pí2ºUch–>£P/§Š/’"�£vo�zx~�1Â.­LÚ›%w²îG¹P!¤Ìã¶CÖgÉ7ÓW*HŽÊ‘A–Õ€ z°F2ׯ™Ðëh ú+P¢mmBØ¿©Ðà ¶ÿ7­’ú"ck“DdÍrÖ1kXäÕ#Ofº�€ÞB±g‡H8L´¥ ˜¯X]j—^4uùU°æÆ¯�ÎtD¾K"fPƒÍË¢T³'E¬Ä:7o—Òç�TÖÞäžý¶iJ”¢f‚UÑX“úÁ}/B˜jØi¤T6]ÿBšt¥H©j&&å¬î;2ÒªÀ¬çEv1Y®£¡d¬—³Ê.[ûàx)5Åj¯¢¬Û�ª¢e$EfúWцD”dkÇB!ô�Ì¡$¨Ó©�'C­¢kãu]õ!•ä –²š½cœ©²Â�*ÆfÙ‹�a¼¶8;‚øä?Õnž(ªûdUŠ}5-{ýùPÿ<6‰•õíRBŠq#¡ Á¶ì·ªšOŠR5²H·�‹L,ýÉsó:Ç%%�”FÍ/ç-ÎŒ<‘±S[)Þ©“ŠCvihÏ׫Pt'`ÎîÉ ¿€i:‰¹Ž”é:™�Ì‚II™ ÍCÌ¡XæaÝŸH§·¾Ü'3‹dñ:ûRȶTz¤³›ËP9D:š*¿7-Š¡·DˆLE_¬¡”êcV&÷•]ÍŽ½UyÔ6=sò¨špŽjU��”¢‡¤´MÑl§sÊz€]\D¥º%R2«È8Ÿ\ÿ–¾†Ò:W�ÓâœPÔ›©qÊÔg¯” Åkë�¤WMÛ€(‹. Svš\ùJ1‘Ý:_\ui€Né5ü“{eã4Ì)R¯†Öb19Æ÷ºR>ÖRêÕOjH¡ÓD* XÓ•àüL* nûþ^çB;ª`áFæ·Ñfó¥W"z‰˜ƒ• ÙÝo~¾tfÍÿ»3nòuq§Q§b-ï�JC‡¯¨é¦Ã²üàÌ‚N4 (ômÃEzlTÈÔåÇ÷wàpQò›ô>¶æ›8WšWЮê†6´«PóÞð§îjÎHîE‚(²Në↠KoI!$hÓu™_\Âú÷«Ùne“²¦ïñ¡ÔM:¼·eNA¯΋ÈQèz£Ÿœ+™ %WDaþ2ø”NH£’·'’r�žðùV˜H¬ÐÎA&“Ÿ<°kb.ÀðT•™Se êzÖ -~àÍ>Hù)¥-¤ÈzLÜá1ÏìI];¢ˆ Wz’ÂÞÚꢃìž6cI¼>ÛÔ™&4¤J–LBSÞ_)Û½ ¢‡sÀf§ÂS�¯à3ãÑ*h$Ê=’Å¢ÎÕÐqTmÔ¥·D—˜BC‹¥²KJÙá -+Ž‘¿’OZÎÐÔϰH Rë‡O4ªæ�T …˜¨áµV)õY\ÏO] Nyï‚ߤ¤£\ŽMµAu?nhò©D¼×Šv :|H_žB]¸Jv0$kh=�äÐ%‰p`Kóˆ9¬}v-‘¹¸ø€rƒH?`¤áo{ÃÚ¿ê"B–n¾Kƒ²¶Ã4¹éfâW -WØwÂjØòpqÕ ù›q…Ü…¦#øÂßó%iSé§Ã!¶ÒÈÆj{U°0ˆÀ\�yÝ5E¼úÆrÒÍ�,»Õ üWYÖn:¾Iø(t¶é¯°~öäÆŸ¾žN^Ü¥"´w·àŒS›)AM=°ì½Š)gdÛœ×ò¼Ð1OEÄ[d“Dyƒ­Kʸ<Ø–i‹0(·\¼¹ ¡±ô2ÕhJ§<g÷ËËpÄóiUÿÀ<õõýká²ÖøLðé=d"T+áŒ/ÈmØ´ÉñÁšàÔàl°¨²S‘ŽP6j9_xžú \”…f6Ÿ À=¥Ô�"¡¥ç^ߊhL6M]Z�¬0QY7ål¾œJT/Ù~ÓU"@yV�=7FÕ}Æ[¤÷jè‹PÅáJµVªäU»=Sb�ËÊ{ý2D¢Qy˜¡÷l),L{k.<žè2³AEëSÏžš¢÷]fV+çl×ì‹àýj¶|¢\1Æ›îE4Åî'2¢×G¥½Þ<Þh|õpÕ¯…pT- -^ŒÞRþ«¥¬&um)ov÷Ÿ�Ý­/Áò ¿*ÉVQ¶}¾p&ÍYÏÈè½ „_ó³/Zñ›i +Ç<[$AÇ$m#7ÑÅ|Keõ‹Rgƒ†äÒßÅD:æ� 6{¾ì`ƒ‹ òHªü˜ -yBï’¼VX·ðŽP|tùSºLxòÎ÷÷j¨BÖ“Ñq|�²Ušøc&ëÉ3>¹¦jà}T}uš,'cmÿ*š8d&ËÉØa|Žr›ëJaw€<†š3­¿=…ð˜ -éÂ7‡%ç9IÈ«ŒÉ6ålLøÇ34¦0ÔPRÅ�UÆlûÖE}I”$�ÆÌ,—mË’*¹BO–õO&É¡†ŸI[�UOâC³¬î«Òyç=ŠðålÐÕß]Â} ×,c羕RoÊjòhWB_ ÷$F¬% â%”(J‹zâ¡�’fáůaùN´ J‡äº�ª�/’�D»¬†�ëÇ锪rd&‹ºm|‘”MBP~ð[aÝ «>j %‚õ9Áí—ñ™ dìW¤î¨ÄjiƒicdAÃkàZKÌÎæ¤|èsšxÒ™uÌ‹ä©Úd¨°£©ðt@°§�ÂE¤"¢5]õ,‚gË�`H'£Gé%5!Õ‹†�MËv�ëï@?ªœ2ïÍ¡ºÔ"žbÍÓEŸYEŠG©66béSî=´âtjžºêõShmòjÈÖÛ­k�å3¬Ò&›Bk=mºShiŒ$b¤r5㣠-d:wP1øº Ü$ÑM¾:—¬rq„Iÿ14þóÏu@��ì6XG“Tc4©°ä¤ô 7Ä éäb� õ…ß1–7u”24š|&.'•�Ãû@lRV×NE—Âfˆýê® R\7~ƒ…4b6)°›¬œ�!nBÉ9"½ÄËjÎ+WãîÚ2¶åBPîZ‚€M:e¨R -µûýÈs5Ü4²ˆ?eÜXñüG½W‘ªâ܇¨\JÆnR�Ö\ö¼w0.ø~e²XD”€k*tN¼`IòÙKÃÚuÏœh@ ™â~È÷"ÑñRÁì-§rd×öÛd•EoÁ?îáÖP·Zò‰¥h•kä È*�‘u‰0(û|)K‹" ­(ê>²ªü¡(·vvM?êT‹ƒí7t¯ÜJË_óÚéè7* $|Šè‰’M¤‘Ž0ç]×,<ñ[qx»DÄeIçfꌱ—Šy!òL6 ü•`tC+ì›�·Ie¨ð­ªÒ1ÜÕz§’î1'ïÅrhdĹÀS›¬¢ÏádáYo 0¤*î�²&z·$Î*Æ…¶v‡jü]6jB†,W«½rÑŒ:aï¿F5òÊ¥¾ õ£¯ðœ1dQÜàÇWhRÓ&›² =ç˜(ñ‡ù"å¥ê²5†ô®i£†·Á?êª@§lXUOÜÚ'ç•7)¤žU·Ù ©Þ»¬Œ�±hµ:Ü�¡ýrº{!mVKÆ …ñ©H?Z{�ÍqY¦#Šð+$yÆÒ@|émxÔVv2Õž�„¬†Ò`«ºƒ¤†_V–á�VÆ{o6_¬×Õc•Q?gð3Ì”-Ah¾ŠG º…�Zªs@¤êÑPKcŒqNŽT”‘ª—¾ŸæK‚º¢Ò“ �FP"нŸ�GC«¼ ‡F.Þ@c‘äÊþïL:Ì^gDXY0QùÔi¬3ü“L²(ö±,ò1o´CM°Ä´KvÄO¤2`îû�PŠ‚5†èlQÊ0' -We£UYœ¥û1óð' ætÍTb±žÿX4 Ðzº0Û¥¼³,œðïÏ@GA%å@S–ª€[® !ÚË5²p—5™2\;Uw­¶*Ù.GsFé·®HIŽÎŦ‚Fˆê¡´û7 -•¾R‹íÝJ+ -+Š¥Ñ#À,, ØJíäÁR=6ÎÛWåyåm— µpŸn»q À-)²®ŒK„Ãt”4BbÌÜÙL²J ÄZÚ&å1ÅÃåN“£�fUNA›0¥ZƒSœ�ïQˆt¥q™x}¯dßx¨’èúq-™…•2Û¾.^f¾�={*jIÛ'/Ñ™»#síy6æ¡cÛ©ÆÉ%;“n¯b�ÖHçF¸jO.Бa,œß¯À`�Y -�¬ U%b!m3åsŸÙª¥ø�T>äxBƒsØ3fM‘b 3p™ÐtŽ,ÐüeËK”¦m·�® W?ÙjÀ) «øÓé¨ÊW3i£ ÞŽ–ètÍ’ÝÚ�ÏÂàû*fÄö<™0èyzæ™/L+ÖÊ6ÑŒ¦í.ƒg· r¬ÒÆ: x`zèòB•%.?CAº4S³W÷RïìÇFÀH+ +ð–TYî�ªª -Û”™ºûXž'=Õ²ÔóDX ÅXг� POŸ¦sFuåÚcËå5š„XÛø¤Ìðžr$o­:ë:Håž ñ€}i¬áŒPx©b l\·¿¡. y!ìš$M„)ñ† =7úkúÀ´¶ümeJâcµ8toù¼š^Έ¡Ôl9%p¿’ ^%båã¼ -F÷„?ÊNž¤t°q ,Á¤ñ–˹ÃȬ÷V˜¾Aœ„}š„IÔI6f£uõâ� -iæÎb9i‰Že�mE`KÁ mëa�ŠMÄØ~Ë æH„=;ë0ŒâÎU!–Ð6V«ä»,’g˜R*é,c¾ÿ3H‹€XDš‚V�ÛhÁ€}×sFy¸[µ1R Zõ%y;t¦-ÛªpV^Š`×”­¡ÛŽœafí ÄÂû&è=F芻‹Syj$ĉ©\Fʌޓ‡ôiŒ±ÁÆd×WB€=¥h.¶ñÙŒ/¼¨ W‰Ý½›ØxVÇTWtNqnV{ƤŠ4‚™zÕ t€K¤¥P—ŸO5Å´Ÿx¹i(*âÅcèHBlÚFãYH‹„ ¹â„í´E ýÌNë½éz}�úÔÈ.†|éø#4ÿ—Œà˜ áöl÷öç›×w÷°{vwwóúÏo~Ú}ýÙ»»»w¿þ0þõ»ß¼ûÛoov×_¾{w÷f?þéåá÷oo~y{{s÷öÝ-™9o•qCÚ£² á|Qð€ öâÿø'w« -endstream -endobj - -5031 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [489.93527 732.5514 500.93527 746.2134] - /Border [0 0 0] - /Dest 4582 0 R - /F 4 - /StructParent 311 - /Contents (93) ->> -endobj - -5032 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.15146 732.5514 519.1514 746.2134] - /Border [0 0 0] - /Dest 4583 0 R - /F 4 - /StructParent 312 - /Contents (94) ->> -endobj - -5033 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [313.10226 718.8894 324.10226 732.5514] - /Border [0 0 0] - /Dest 4584 0 R - /F 4 - /StructParent 313 - /Contents (95) ->> -endobj - -5034 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [491.42682 691.5654 502.42682 705.2274] - /Border [0 0 0] - /Dest 4585 0 R - /F 4 - /StructParent 314 - /Contents (96) ->> -endobj - -5035 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.70145 691.5654 519.7015 705.2274] - /Border [0 0 0] - /Dest 4586 0 R - /F 4 - /StructParent 315 - /Contents (97) ->> -endobj - -5036 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [267.74725 677.9034 278.74725 691.5654] - /Border [0 0 0] - /Dest 4587 0 R - /F 4 - /StructParent 316 - /Contents (98) ->> -endobj - -5037 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [294.65292 664.2414 305.65292 677.9034] - /Border [0 0 0] - /Dest 4588 0 R - /F 4 - /StructParent 317 - /Contents (99) ->> -endobj - -5038 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [345.86566 664.2414 351.36566 677.9034] - /Border [0 0 0] - /Dest 4459 0 R - /F 4 - /StructParent 318 - /Contents (4) ->> -endobj - -5039 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [508.70145 664.2414 519.7015 677.9034] - /Border [0 0 0] - /Dest 4543 0 R - /F 4 - /StructParent 319 - /Contents (55) ->> -endobj - -5040 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [409.15625 473.5904 420.15625 487.2524] - /Border [0 0 0] - /Dest 4496 0 R - /F 4 - /StructParent 320 - /Contents (39) ->> -endobj - -5041 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [502.65146 473.5904 519.1514 487.2524] - /Border [0 0 0] - /Dest 4589 0 R - /F 4 - /StructParent 321 - /Contents (100) ->> -endobj - -5042 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [160.42686 377.9564 211.92822 391.6184] - /Border [0 0 0] - /Dest (subsec:reactive-coeffects) - /F 4 - /StructParent 322 - /Contents (Section 3.2) ->> -endobj - -5043 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [404.4731 330.1704 420.9731 343.8324] - /Border [0 0 0] - /Dest 4590 0 R - /F 4 - /StructParent 323 - /Contents (101) ->> -endobj - -5044 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [426.4229 330.1704 442.9229 343.8324] - /Border [0 0 0] - /Dest 4591 0 R - /F 4 - /StructParent 324 - /Contents (102) ->> -endobj - -5045 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [420.18588 302.84637 436.68588 316.50842] - /Border [0 0 0] - /Dest 4591 0 R - /F 4 - /StructParent 325 - /Contents (102) ->> -endobj - -5046 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [423.9508 275.5224 434.9508 289.1844] - /Border [0 0 0] - /Dest 4534 0 R - /F 4 - /StructParent 326 - /Contents (47) ->> -endobj - -5047 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [216.92166 248.19843 269.61102 261.8604] - /Border [0 0 0] - /Dest (subsec:scaling) - /F 4 - /StructParent 327 - /Contents (Section 5.1) ->> -endobj - -5048 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [75.88214 152.56439 135.71114 166.22638] - /Border [0 0 0] - /Dest (subsubsec:lifecycle-asynchrony) - /F 4 - /StructParent 328 - /Contents (Section 3.3.4) ->> -endobj - -5049 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [399.4341 132.10242 415.9341 145.7644] - /Border [0 0 0] - /Dest 4592 0 R - /F 4 - /StructParent 329 - /Contents (103) ->> -endobj - -5050 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [176.83247 118.44043 193.33247 132.10242] - /Border [0 0 0] - /Dest 4593 0 R - /F 4 - /StructParent 330 - /Contents (104) ->> -endobj - -5051 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [198.4779 118.44043 214.9779 132.10242] - /Border [0 0 0] - /Dest 4594 0 R - /F 4 - /StructParent 331 - /Contents (105) ->> -endobj - -5052 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [280.25635 91.116394 296.75635 104.77838] - /Border [0 0 0] - /Dest 4595 0 R - /F 4 - /StructParent 332 - /Contents (106) ->> -endobj - -5053 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4354 0 R - /f1 4360 0 R - /f2 4378 0 R - /f3 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 333 - /Tabs /S - /Parent 1 0 R - /Contents 5054 0 R - /Annots [5031 0 R 5032 0 R 5033 0 R 5034 0 R 5035 0 R 5036 0 R 5037 0 R 5038 0 R 5039 0 R 5040 0 R 5041 0 R 5042 0 R 5043 0 R 5044 0 R 5045 0 R 5046 0 R 5047 0 R 5048 0 R 5049 0 R 5050 0 R 5051 0 R 5052 0 R] ->> -endobj - -5054 0 obj -<< - /Length 6459 - /Filter /FlateDecode ->> -stream -xœÅ=ks·‘ßù+FGé.TŠ Þ�ÄQN–ÊUtÑ•ùÍö’–]�W>f]uù÷W³»3 4 ÌbVúb™$h4ºýÆÍËÇí‡÷wÛá‹/.†áæåv{÷ð÷w? ßßÜ~üõÇñWßýv¿ýç¯ï†›×ïî~z÷8þêv÷óÛ»Ÿ?lî¶>n.^¼¾üêÕÅ×o^]Ü|÷ëÝæ0Û›Wùjàãÿýõnóóð»w›«ièÿ^ˆ�|¸ƒwLY+ôàt`Ry=<ürqóÀ‡‡\ðᛋ/o/øpûxqóžB ·ï��ÿÜþrñýï~àœÿðx53ìÿŸ w5\ >ýÈÝôëÝ¿ÛýOʦ•bú÷j�ó·ÒFÉÝ”‚IɃŸÿªÀ\‡Ñâð³ä‡Ÿ5 ×éh5B0ofú-×ã·Ç_+|å®~nÿãâëÛ‹ÿÂ�E '!E`\‹–ƒôApnó=þ¾ü§ýv�»Ÿ0uØ–‹VZj"®®†èÔXU:�QÙ»‚šQº™¸óWƒž–xLqÅãß~Â'Þ�ù·ãÿ>™0Ñðí‘\&âñ¶'‚�·=¡AÄhxþhqÜŒO?nÊ0=½oÁèÀT¬<>ä R™rñ~»S3™¤3a­ð‚DxÁqæ÷RIfœ=�žÂƒŠ1c,ãb\¦Œ™ëdS(a¥³œF±àSãt†��f,ÌÄ‘-«d—؇{t\E$:퇄{¢Þñ~®!¦èy3æönåKrÂI0O˪„œg^—ØRÓ1Òç�‰ÈXxÆmìÓJ:¡Ë t³/&h+<©žÔÞ0)�´=L¹ƒä««áö¿‰Õ5ºz`AéúEÂÆÿè - „á|- Úå£EñL¡íJظ©á0 DØÑM_WèÁc‹Kż ZÊ£äU% B÷èm!šÜ2‘¬; -‡t`,{µa�Ûp”E*½o2Ý$ÿæÊALýk•™žO,1³åÏ#/G(CqÏTУÀ<�4š¦Àì %\ö-ÉUE¦É)©û¡h’»´”ôÌ >JìnöÜ”É*¦{ S؇,[fMÈ`‰ÂôvâÌ”ãg£KTys2™'Úcy®ƒæ¼ŽY•ÐZˆ�½c"äˆîIÑ?ÂU#[MJuî™4²KªÏÚg¬ÉqÂÒýš2®Îã·&T�œ®ô),?o`î`Ó@#¤ä4À-óÂÞ©§Ý?Å? mÈåàµ:[ñ)ð³WÊ}xš]ŸÏÉu ³2CÝ¢ã˜Ø0•[Ê�_¨ó½¡øÞÍLà=|�»TãeF¬ãLKÂþ;9B:dDr|,®“ñ`ì€�:QpâÞWiSGÁG/pª˜•Þԇɛ ˆÒTùà¿&xKiì0Âîß]#ŒsΣ£ç0¤ÐLÝPL×µ(èÁs7¶ ä¨Ic~Ú¢“µÆp˜%«½eNxßÃpm:2fÂê ˜–ÖË~~ßéÈu ¶,—kAÑnËŠPð+8.´Y Õ@ˆäÇ‚ù§—&j&ƒÄìÓr¤â|ÿÑÓ¶ˆ61ïÑ¢ÿX¿…Dåº,®õ5a _Í°ÎÆë¤—˜ºF˜J(Çp—ÖÁôPGÛ­€é�2hf� ²Ÿ8w·ÂªGÜ�nú¡hºî@çLYT?â[’Ÿ“sþ4ÿ§)D‹zÛµ`Â8{~²Q¨·]æ­±¶{ù›Úò˜.£Œ`j•å«ô‚)1j Î;eÝYé…¾Â!qÅh¬°æ×iÍm‘!M,Ô*F�±ÒÊâ›;®ú@7ó KW,¥õùyÆÑ&w/Õ¨¦0�ò¤É}nÎ ¤ÉݹzƒÉ­9©‹Å,ï -â…*¶†¥dÜ+qÝ3û+pšO,ºý¨(M ê‚¬-”j·©�Ln‡ð6,ÜzÃUCÚdËÆæà ªê^–'B÷åÑÅ9ú‹®ðAc -_õ˜ XÁa# -¶Wqòþ\I= á—¥¹¸SÊË_Z¯-Hq£F5¿/º ˆ¹�­-Fê…±,xË'¼óˆÁ¸R1ÑC�¤ K#�o"ª6Ä Š›°0¾Êk90Hâk>脼×g ‹Æ)Ù eœ‡{ËÛp±3@¶á ZDwÉ}AoÿL9ÈBGú%0Lb´AÌÐ�i™ôüÜ&4<šžPM7‘œ%¥qYÀ@F&‰8˜`»\¡qê”TUbC,E]‹9\3='›Ó²µe:N6ˉJb &MG„ÑxL’µoÕ~šH.UU+€”dM¡Â¦ t*:ò\˜‚$Ë™M¼­HÞ’YÑW.ó’A•RáþïEí¤Ê#E~–õ3ä–…òL^ÈÊ‚~ýUEßeõœÉDDã,SÞuÔgN×b„ô†RE�¹º‚\ *`'Oe›xÁ(¬´œoäô@ïcµ}žß<—ŽW8̼…»*š,yxF0'M“N4 -st`2f)ϸ|Šk-¢éÔê‚j´/@P¤aõLµÍD4š‹ -&=†èP¿$öEê‚èAQ�Æ“ƒª@йÓ11 -?U–B‚}بÔl«FžéE‰;©>W˜&ñe”OAeÄ©É2è¬Ç¶À¼Ëň†ï�g’s_ü ©Óó}X>.ÕÝ…åPã<…¾(�hH\"¹éàÄHEñ~ ®Þà=0ŸFmHX.Û#¬j[£¥ÑOÊ»£x#áâRt·N --EP¹¢Ž,1WcoÝáMEJSº°WƒÏÚ5€çnðd]øÙÊÕWøg)9Â�æne�Щhéðç•üØË+»²}–m´¹3mË‘!a Iž|÷’†¸SyÅQ¹X{­‘éÓWJ1ú|wu4$�C1c��ûŽ”N'™ÕÎï6»™s™üXžèÜWWC8LyYâe,Ñí­ïHça ÕÄõb¦�fxs'uöT¬?»›ZÌÈ{£±Î˜[…Àܘ¤ÙÃM)¢ž—¥�+0á1Cô‡m ^ò•Ã:°4G=fFki™–2¬‹”Ø£¹ìZ²Ð MÛ‹ h*»vÌ*¾.p�šz¡Diäg)Ÿñ´•#3ªË缸ÃîÎvL«Ô -?KÌJ?è—³ - -%Räl'ݲH…n6oSß#ôËJAuŽ�Ó#rôqð˜ÎÍ–“:rV¡XϢÃ}”×o«2º%�/£ç‹'³ÜÆÿÞu8JO?H¿§P-M„ß¡ïe“w‰Ê²h"ö~Eq -”táàBÙf8°Î¹HE¥µš™–N…~;JWD d§˜Ý]ÕŠŽ/cƦ†içBw´iÙ¡T‰ç�÷ý̹P£ ¨Ò¯,³½à4©”Õóµ`*¨®³HüF€¦Òäh˜ƒ”\„€R‰‹0m97¯c¼:ã°Úá‘õ(£ûmWéÒŸÍLë01"{23³m¸–š³ äŠ -œ1mðKÍÄ4 [”— -žÁRTÕV2´âgo¸B³¥Ou8!ø:·Ç íøZ<7¼~ †JÑØ‰vP51ºÜ塯Àd“Ùñ}>£�–=a2È‹©9¡Öp&”¦ÐDsw7ÈÅlVÌy~�çZã¼8¬Ÿ)ù$ %ZÊ1¸RM'X/”JË_ï“ÐêEg­û -†ë½é¢É¦º³€Wt�Œ¬½ý�Äí4ªŠ3ÌÞRcwJ.DÌ-zL‘—²è¢Ú×õ²8­3¯àè@@Eáúv`RKßOP5…;à -·bÁp¿ÂÙÜŒÿ©HÇmÝF“¢-8ªi«Àì¨çŸ‹D±:D<�›–ï÷Z>ZÊP]¬­Z[ͼ7ÊwëÖO©è3[ЗgŸ¡)uË´yâ .@·1­@EIW†#©k»”†W!!>å ¬D�’´¨’çiÜÓŒ@ŸŒ rÒ�»§(§½H¨g`Bÿí‚ -G8W™·¼¤£@6%’Ñ”Ûuït¢9Íë× ¿iUÝ&¥R¡GU_¯rˆêyÈêàcã¡9ÌF§À5ô:…‚Bhø×Í¥M|£z¹°,Haí*ÇuJú3D„:ªbÕ�¸à¨fn³Bp¹ÎžÐÃÂÝÐOpçÑ H#m£LFÀuE¶B=;ùæ‘„ž+á¿|Ú…+¹xƒ�Yžà÷0Ø×Îeäó£lÆÿéëYŠ%tvpÁr¡ƒ×=ÏÙ‚ðF:!âYðÐX*àA3†Ù²wY ΗˆÜ ö5ÊiÞI—,Æ’³Gëw#ŸGNÙ …´8�;¹ËIÔ`Œ”M ¹ª/åÚËÒz~jWa÷éé$&·óeq–?&iÑ©s¯úXd/0³ÈHµ»ò… EïzÍDmT+f•0Š$!0¨àØŸMÜ Éé™»¿6l°»:¨ëͺâ’ó^³šB€·fãQ8ÇeQ6È6è¹Y†xb ¥mûñùqiþ%kÄÊ6sꣂ"ÅÁè ïÎ¥áÉé¯èi êUËÙ, dF¸œIå´êÑ-� ±Øcx¸V»G�LÔÌ -¨“`¾ŠM¿ÎAŒŒÂÓ6ÖŠz ->è�šùäd¦  žPŠQÖÝ 1Dž5¬^ �-~ÒG­r”æäSRã $jþS¢�ú1ã©8jõchãu²s‹–×åk=‡ÇC8åÍ“AŒ=¢¥Š\M­Ù¢ù—4?fãÑv(YÂYK -^ÛÔ¸‹>ùí“JX¿{ÏŸ´‡<‚—rï\˜bŽâI@ ßo‚ií¶‚aÜIšCÛà0ÌZ½ ¥ƒ( ¼ŠÒòÆŽB�í_„—,ˆNçX¬U)Ï„q^|(àY’èìž7äô€É–Hþ-ý@TÖoº\öXœÿ+¸�s‹ å†FŽ T¬b}¯òO5e(Ó»œÏ)D:V‰‚ÞÝ&’»—$îÏ•þR?çå¥`Æ“¢&¢Ë|[$ ÙPFØÀäXŽ×ýèhíy×Ý&�bÆH/çÈváÝ7Sê ¿?¿0_Ò-h³€¶¾�3Öú Ð›>­�\Ä3ÄJBa€æÒ´Ԣw.ÒÆ#›*”¸7!L¤X§QCÍc“UîD 2­gRs©Zسš6Û»À ªß×aÅbƆ�Ï~yÓkKÀ.çŽe�ƪ»Ð¤<4†NÏ\ú¶–¹$Ð"Kü—�ëŸÊM»Wÿ年M,f&”aNˆU¶3·±jË«Ÿ™ùxÖ÷œÐ†O,…ɺàB‘1Ù{'ÕîÛæÈjÙÑb³S0DV2hÒÔžôWHµã�®¹åÏHöB:ÒµC÷üyq5;¦„iO›ùúà÷hGž™ìG—‚`Êê©ÿ×òŽ?ñO±cÝFY¶u¬bþp ³ÊՄɦêûd¯I¤0•­iˆHòÄg¯Aç+½ Üôòï|×ëºÝž.üíü”ë1£ïØR°z¾xïÍœ´¢ëx›’¤…ä…Þ#Zé¾õ³²D]E†Ds•…Ù•Øõ#£š+-ñ¦œY-…<³U:ÍÀ±„Rž1™TN²+.šˆ€è¯ž«¢ªèI´~Ž2z!iÍW -¦­éó)ò ë] ¯%™Trе6?W’~–Ç1g Wá ;ÓÜ…“LH­]¥ªl;˼Ÿ±Zá�b­®úK,ÙEÅÔZÐ4·5×'ü¾~UÄT˧„Ä.?)4 ½À´É{…]~r|ËÆ› Öat„ó°$±l |› eÚ¹eÃ<¸ÈìÅ'÷j^`U»Ê†ßV±×¼$�dm7|Òc>ôA,“¯‰}ÔTÝ-8|—zqíÕæŽy®4·�©v cê×R2o•y*‚hÕ²qY³G…ôÌó`UT­gWô¨O|ŒÉ1ƒPþá¯�È ‡ß‰ºz¥Tá¶Fµn®í�mxM¦Õ¬ÖÖ¸ë�?’”CQ{%‰$#l¾…š6ˉ�•Ó °Â«L%#YV᫵̓oz� ­–‘�¤1å;ƧIJåŠ'Y×@Ù\�æœÏbš(²ó`ÐLhÑ篆¥®µfZHΗÅGvÜÉ–Gß9ÊGxù‰³üÛ4±ß~¼]€5 ùò%«dŠÙ3Òf´W]ÇÞfO)´Í·çL«Ì -dw´��™02Xæz�i´P—m­l?2.I*>_ÆG¾VoƘñôŒ�Cæ-àÞmÕ@š×Kí4Ó:ˆZ¨i•éû<ÎÙë -Ó_’·Z?½Ÿîs¸©—�Ûïï¶ÓõµÝÞ=üýÝOÃ÷7_~Ün?þòãøÛï~»ßþó×wÃÍ7?nß=Ž¿ºÝýüöîç›»í‡�›B÷¡œŒ`Asºõ¼ë°ñçôÿ—V� -endstream -endobj - -5055 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [237.94225 435.3644 299.514 449.0264] - /Border [0 0 0] - /Dest (subsubsec:motivation-harnesses) - /F 4 - /StructParent 334 - /Contents (Section 1.2.2) ->> -endobj - -5056 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 281.5974 85.78214 295.2594] - /Border [0 0 0] - /Dest 4596 0 R - /F 4 - /StructParent 335 - /Contents ([1]) ->> -endobj - -5057 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [413.16415 267.93542 523.01013 281.5974] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/361598.361623) - >> - /F 4 - /StructParent 336 - /Contents (https://doi.org/10.1145/361598.361623) ->> -endobj - -5058 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 247.47339 85.78214 261.13538] - /Border [0 0 0] - /Dest 4597 0 R - /F 4 - /StructParent 337 - /Contents ([2]) ->> -endobj - -5059 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [169.31615 233.8114 290.16214 247.47339] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1053331.1053345) - >> - /F 4 - /StructParent 338 - /Contents (https://doi.org/10.1145/1053331.1053345) ->> -endobj - -5060 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 213.34943 85.78214 227.01141] - /Border [0 0 0] - /Dest 4598 0 R - /F 4 - /StructParent 339 - /Contents ([3]) ->> -endobj - -5061 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [442.35815 199.68738 521.95416 213.34943] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2890784) - >> - /F 4 - /StructParent 340 - /Contents (https://doi.org/10.1145/2890784) ->> -endobj - -5062 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 179.2254 85.78214 192.88739] - /Border [0 0 0] - /Dest 4599 0 R - /F 4 - /StructParent 341 - /Contents ([4]) ->> -endobj - -5063 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 158.76343 85.78214 172.42542] - /Border [0 0 0] - /Dest 4600 0 R - /F 4 - /StructParent 342 - /Contents ([5]) ->> -endobj - -5064 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [275.27914 117.777405 385.12515 131.43939] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/378795.378858) - >> - /F 4 - /StructParent 343 - /Contents (https://doi.org/10.1145/378795.378858) ->> -endobj - -5065 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 97.31543 85.78214 110.97742] - /Border [0 0 0] - /Dest 4601 0 R - /F 4 - /StructParent 344 - /Contents ([6]) ->> -endobj - -5066 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4366 0 R - /f1 4360 0 R - /f2 4354 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 345 - /Tabs /S - /Parent 1 0 R - /Contents 5067 0 R - /Annots [5055 0 R 5056 0 R 5057 0 R 5058 0 R 5059 0 R 5060 0 R 5061 0 R 5062 0 R 5063 0 R 5064 0 R 5065 0 R] ->> -endobj - -5067 0 obj -<< - /Length 5044 - /Filter /FlateDecode ->> -stream -xœÝ=[w$µÑïþíì&0l,ë®n�,,ää@ðÓ<ØÆ&›f‰3œ“üûœîiuK¥RI}Ù<|/Ï´.¥R©ªT·¾~ùtzýx{j>øà¢i®_žN·÷{ø¡ùöúæÍÏß÷?}óËÝé???4×|¸ýáá©ÿéføþÕí�¯�·§×oŽ~Ø|üê“‹O¿üäâú›Ÿo�ãh_~ò§W ïÿûâöøcóîÃñà›þóB4¼áÍ•hg­µB7NwLªV7÷?]\ßóæþ_¼ù×ýñâã› ÞÜ<]\?òFˆææqîÜÜütñí»ßqοã ŸOçoRašwÃß„;|ßÜüùâÓ›‹¯q€cÇYëŒÐ¦HQ’ÛCsÕÖrÁ»º®æj–K€Î¹?ÍøT�?•�ŸËóò9—ãs ‚ûáŽÓH6þô#zFDÓƒ(î§;__îbˆ¥+„+åÄ| -©à¾_ÎxІqι:?¾ŒFx¢&áa¥ñ�ñ?ƒrY¼7þ`Pd{6‡Fñã6B›ÖÅ«ì‰aDûAž2Q` ¾mþw‡@É7FNºéè”%šÊ¥…ã,I–£ 3În:ÍņKŽ6N(É:ÕI1=õ§Ì÷µé<£�< –'rª%ƒ­ž1�öì„ÿ��>4ršÄE|¸Æµ?eÎÍ4uÌItâÌ;X^08eĉŒhu6žð£óÕ_×ìNàlŸ�ì<âLäj¸ßI8*Eç—õ˜KE`·nU{ìyì¥`�Ðë�=XÚÄóTkãÆj-g¢�Î�Æ�*3<p‰8àP H€K[Ó8}XÅ€Èq‰^=€pÆ'ÈPˆ0*6RöÐȺý&ØÞÞà4HfKÀi"ö МÇ($¡ê•^f0ÅÁŽé…$ž—+°Uyå´À%4É%xˤ‘›¹ÄÔ¿R…[Êjpê™wÇwOÚÑ-Ò­šäoÈ­üÚê®@põŠ1æºXúÍgq‘Nw†~fDýçs\ËÄæ±+Hå ijÒy1Ôy±V3!:ê¼ÈF¨üyù•§‡£uLˆ]À.(1±�TÁ™ùÚ)îPZˆ#ñ©,ÓÆm¸œ< ì=oušI%�€ôyhÔØ:£s€Žð:3sœ“%65Ô'’gáÕ>Rr¯f/çá•¶r@/i½‚¼ÉÖ‚žï1]}#ûIEÄ/s-C+Ó×™‚- 8÷ó�Ñç›á6œpKÉûRfÈâÕ7×à -îl®|±Äf*+'-ɤd®3»)'¡m΃m"BAôÎ+¡ã¢ã.Á®"ZUKSlêj[¯âØ´9EBÌŽ 3�´ ,"øôA›È€šh àfïyÄ(àki¯+Yí•i™ãºU5”X0ÛŠFûó?zèÇ–1úßåèm’æÏ.S¨¢[€#XÐJ3i—ÛÏc‰Þ¡E•¹E"Žú�‚ cT›O[ _‚d_¼cB©ÿÑÝj³P»j5ã’wÖÄlxÆõ¯#ð3Aë9éd‰Î]³Ã>`Nß¼\Òã4ap•þUЖbÿH „ûƒ^zr¸Ÿ°[£�0Fì%)$óþ�šòd©‰ô`z‘¤TKQ’¸afãL³œ–ê�P¥3O:[Lg˜v[Ì®uVh®˜PZ« -x¯eé¨wŸá\HâöÍi¸I‹!ì°Ž#ÊÊ r•J!îÀ ‹��Gj¿3ÐXYàa!o|Z¾çkœ]‘ÀÍl3G‡¨;ƒö€/Ž€±¨œ£¢tÂI¿Šiky·E J,ú˜�Xš–×¶ê­xàðÉ×(Žsî—j�[è’Ò-gÊhij0½D鞎ŠCíT%¿ÃÐ4ö>í¨tcGÙvLöÂkrÃ÷{ƒÎ�Œ•3ï& ŒÃn!ôíJ/˜=¯ô¦Üd¦;Ãôn‘C—ˆÇ’¼Ê¶Lè-ÖÕ‚¹(Tá¤c�³¶…ŽøÉÒ‚ñ¤¸Mh ‰°Æ^q1 8�´ZýN{FˆØ=Â;`ž¨³Y• i;;«Ù†BðŽœ„µ -Χ|û*c:\é}�¯ˆ'ú/¾ÈVìEÞ£Ÿ[u J,Ë€²4&;˜8v–P -”³mgf¦Mé0Àyž²ÚÒ)ɸ[#Ó]·ÜÛ•‘ÌmºÉï…ʼnҺ >Î!°$‹´ëˆÏ� ñê�§±¶>Ç$�<އÞO²ª‚ðcɇ}…�ÇïBóH‚X}[Ënöð7$Ù*…$Bís’`ˆª, Vø“«Bá›íB’ <Ö]ÇZµ�)w“�˜ÙV “úpi·^!.át¸{^`'Ûlna±À…­¢3Îíöñc±œ`#0ÈÄi¾^[•~EoßvdŠÌ8J4³1Ý�ZNF¯î ñîŒ_iG(óÒ�£[Ë„ÛdçCÝè!”0X²Â%iΞõ¯J^Zß•sŽáø{%¬%ðD� êy¸¬Mö}FÎij֠¨åÇ‘O7’u ºwxxØÆt`è>2™²™ÈÛŠë`bѲ±nÑÁ�ÎIÓ1b.+lÒé£�dFlˆ]¯¯º™– ¬¥ïnñA«6EÆÀL.fŒê@\ÊÔ·ŽÛW …ͯû?Åü³Döƒßò¹†�Éøþ1Â[}]"›Ä’+ZÇÔ™æŒdÜl0$}qÆ]DfbEê�DÜ^[fÛnòzÜ¡©³i|[ཬ“ÆO“/ÞtL¨®¡í4Q88V ã§KJ4@M•Tý!�« ÊE�ž�¬®ì5Cú -‚Ò -)ô�±EVmÑù:R4¨–©v[üZôL+-4pÞA߮Ǧ£mƒû×Lk5AÚ aqè±Áï`„;ÒD_J@pªoÄÃÿ¡X’slJåX§¥4»ìæÒCöK§@9*úR\!–ó"»Žõ²dóúþ˜²¾„PeÑ M’VÌzâVCËïÞ*�R=k¼ÔTZºhÁÖ˯<óä%j!³%´ÔÌÉMF­LM�óJuO�ÒÎu¶@ðB Ëv‚�·gµŒêYr9™°Ò^®]¾,J‚`’î`ãzKMÒ3Ù;}¦÷||_Kêf‘ŠÊÑ9ðjy—³ÄÓ¼ÀÓç2{AÉØüµž�ÒQ'Ó&´ŒÛ]ã‡ÕušñÁ«1ÑMôŽh)Ò™Á€ã¦&O? -÷Õ€"—Ñy‰‡ØÁ’‚V0 ¤íw̯M‡ß/í)b�p4à)n´O*T2ñŽyLÈèxMÌpž†î0aÔ )Òÿ­:Ç4ÿ_åFWø"?§‘¿;p¤Ñ&S¡ž ¤Uµ§iíøF�vðúÁš¬Ÿd´·tðÓ}ÅN~Új¿Ü88ô‰W‰á$µÆ®’®ª–=”Î6éªV­b®¿^lõˆÑ&.0@æ62e¬ÕªPØ$I&ÞÇØøÝ'6?!Ýš^ÿžQ ûT�œ>:¼-†ÔåM28fÀ}7Û»Q7TÅ-9O§K;ì¿ô›^Èe¹Ñ€ylë� ¦«;¬Ì€,�tÒ!­gÜm3g!²Iræx+9b”>|kÕÍj§rD—uú$®çˆ¶yÌκ§„‰Ý'ù9 u$€[ (8;Ù³ÁŒ«¨¹·f±WkW„ìj÷.1Ò™­ŒeZl3êeI©6uéèQd|4T t‰þ¶:ûо\EÊSB2Ùö…„×Ö}áἎLj]øµêè;,ê1Pv#�^/Ùjf¥Tíj"z5û9>-VHÆœ6}’Nɾ”ÏvhذÉóé½Ò‚ñÎ /ì?,<ïß鑨uø‡õ˜õëþÏË”9Áve� t¸$_ÕÏ&¸&æ!Èd2€¶ÏKÐ% Hú ÖÇtä4 s]±"Ü”›`e5Ç©]f=Þ—†ßyúœ•¡¿Ö - ]LH3\°®•¢êì–òÑ`Ýã"xÅ3ÓWR´¢^8ðËûÓ/·ÿ¸yø÷©ùà³O?ûŒó—¯>ô#Ö1‘Ü¡¹ùû2»*ææŒÑqÖY¾)9ßäÌ2ã§§�Tí‰3GOöÈžÆgR¿õ9„xy’áù{ý›“bñ¢¸×˜™S -ŬíÓõ*0TP†&þ]PR'é1¯^¥@„#½&<‚Žñ5é8„È ]œŽ=é�‘‡&ï÷5?xIÒÈ©æ×È”6 -³Yi¡˜°Z˜6j^é³™§)–pXÔWzà>½?¡çÖÆ†¨ÑÅÅb×v#ûR©\¨-‹ÖúìÌHòÓ“i8Ó]«ÅFånDFY½k \l3nÌ—ÖÔÀŒØÀ/Ò60 1˜-óÎ4h•R.m;&œUUFËIL2��`iªÓ®Ó+¾û---†‹v‡“BPw�lK:é Yy‡´„bi’‘�IË9xüó"ÊE�;)ËZeµZ�ó`¿ W<Ç·¿ ¹k°0a;¦„íåîæå-¼¨ž2ÿ Ã"³-ÏCW�ÃÈŽ3ae/7¬ºJÒû.…eÊiÕm“ÀºJüS ðÍÀ|£î/Wœ‹Hú†ÉˆÕ$µ– £dç ã]ò¡ñ P‹ˆŸ¾D�A±`� 3‹KÈÕ¶‰'ãUMlèx�BÝ”´Ž·ý’/¾æÅ¾°÷`��îëpÉáFO‹5«cië¢�@_» vú|A ,D61Y|÷”±¤Í‚:°Km$—Þ“U¶YWà0\2'6¼ä.q ˆ�”HS®„¨:ÖöåkV±Ô�õÿÃcÐꈎ3ee¯alÞýU&˜ùR¿À³Ôð2ëoŸO_3 -÷å#hOØWÕ³èíA÷� í.±@ÓWÜM»ðÑ„›á·ëâb0½Üô/Õ5ZØ-‹©Rà,™8!Zɤá´æWÒŠ -œU4{ÝL¬\y®ƒ¥M�U)DyIÕx fa[B@±h½pŠ™�ÛÔ £Ä¦}bDÊçÀ…ˆÝÂw‚zFCÐ|k1?ýuPþÞ#Ê›�c\S|?ÏïG¤u4®ŠˆÆ® -ª/Ç܉JÜÒ„ÑØ‹HO‚ñj™Ôs"rЩÅ5'ÏàiÒ‚Ç5ˆScøûÓ -FX2JKXÁúÂõo{uÆV[ÐŶã’(l’·Œ §ç°+�ÐÞÆk³ÅlÓmÁ†/B � «U&áûtä 6ä—TL;âìÝ_ÌK­Â�Ã�PJ‘D%ƒa‹#àj‘®“ZidøÙJGüúÐO/ÀYiH·çf™jÓThœy4�Ïû±º;=³P:¾_‰Ð-Ò®×á`NÏÝÊãÌôrÕ\‰Ž ÞuÆlXqÑŽß×U®3¶fõ´lgþ]�Á{I -voÂ…B@XütÛB0d1Ò‚¸‰¥­)Dº S¨‰šdذòw†÷¨Œ#ÎGcX¸œþä× ï´*_‹À:,™éU¢äýš8>ó�[;mW”¼™äšr³‘)ßÁÕ»„G2¬¿X.Ùñá Bi¦'ÈÝw‘~{h„cº•F¤5Æ€²‹4=“'úJˆø…«0�lªH�ÆŒ’\D3ZTA:&[kTbëýn)Ê�Ð6ÐHLQŠ ”H ÿØže[~RclC¦`‡¦3+jžÂÙçá„(7ÿ½g³®ñ"¶�À@§ˆï ÊÞ’¤„#Ť„¤ LÏ„&f‚Þ‘ÐÄyËã�œµ\nq� H«l\Õ]ʲÓñ„/ˆ”‡p“`ü<1W…õXv²Ì9Ôé “®»àaôÓlˆsÓ]w^7h2c¥+.ó{ªÖ0!MoAذÐ*³�#3#çLi¾õ&n«nâÎÝf`<# =q–‰¶¯t]”ý{î2/‘‹â¡â"ÄÕ6:çÊj|Ǥm…ªZùâ˜àU/•‚èçIyÍ—C§»Œ§Š­Æ'ðQ@‘<|…Ï)§;ÅãDÙ¿É¿üò¼Ïžñż4Ñ¥’¬§ÌäoQÑ.v;îk^q× -¹Ç‰ -À€6&]sÇm£„†ìéÜjÿ,!«£ùOk™u­æÞò´£Ý•'¢ÝFƒë|ùtzýx{òNîÓéöþo?4ß^üætzóÓ÷ý¯ßürwúÏÏÍõgoÞœžúŸn†ï_Ýþøúx{zýæˆI&”k#X'ŒYOHƒÌýîÃþ_Üw -endstream -endobj - -5068 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 85.78214 759.87537] - /Border [0 0 0] - /Dest 4602 0 R - /F 4 - /StructParent 346 - /Contents ([7]) ->> -endobj - -5069 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [183.08813 732.5514 419.91815 746.2134] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://openai.com/index/harness-engineering/) - >> - /F 4 - /StructParent 347 - /Contents (https://openai.com/index/harness-engineering/) ->> -endobj - -5070 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 712.0894 85.78214 725.7514] - /Border [0 0 0] - /Dest 4602 0 R - /F 4 - /StructParent 348 - /Contents ([8]) ->> -endobj - -5071 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [242.77809 698.42737 526.4241 712.0894] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://www.anthropic.com/engineering/harness-design-long-running-apps) - >> - /F 4 - /StructParent 349 - /Contents (https://www.anthropic.com/engineering/harness-design-long-running-apps) ->> -endobj - -5072 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 684.7654 195.93614 698.42737] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://www.anthropic.com/engineering/harness-design-long-running-apps) - >> - /F 4 - /StructParent 350 - /Contents (https://www.anthropic.com/engineering/harness-design-long-running-apps) ->> -endobj - -5073 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 85.78214 677.9654] - /Border [0 0 0] - /Dest 4602 0 R - /F 4 - /StructParent 351 - /Contents ([9]) ->> -endobj - -5074 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [387.49014 650.6414 521.23914 664.3034] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/s11704-024-40231-1) - >> - /F 4 - /StructParent 352 - /Contents (https://doi.org/10.1007/s11704-024-40231-1) ->> -endobj - -5075 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 630.1794 91.28214 643.84143] - /Border [0 0 0] - /Dest 4603 0 R - /F 4 - /StructParent 353 - /Contents ([10]) ->> -endobj - -5076 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 616.5174 204.91214 630.1794] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3704435) - >> - /F 4 - /StructParent 354 - /Contents (https://doi.org/10.1145/3704435) ->> -endobj - -5077 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 596.0554 91.28214 609.7174] - /Border [0 0 0] - /Dest 4604 0 R - /F 4 - /StructParent 355 - /Contents ([11]) ->> -endobj - -5078 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 561.9314 91.28214 575.5934] - /Border [0 0 0] - /Dest 4605 0 R - /F 4 - /StructParent 356 - /Contents ([12]) ->> -endobj - -5079 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [355.66714 534.6074 467.96616 548.2694] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.24963/ijcai.2024/890) - >> - /F 4 - /StructParent 357 - /Contents (https://doi.org/10.24963/ijcai.2024/890) ->> -endobj - -5080 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 514.1454 91.28214 527.8074] - /Border [0 0 0] - /Dest 4606 0 R - /F 4 - /StructParent 358 - /Contents ([13]) ->> -endobj - -5081 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 466.3594 91.28214 480.0214] - /Border [0 0 0] - /Dest 4607 0 R - /F 4 - /StructParent 359 - /Contents ([14]) ->> -endobj - -5082 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 432.2354 91.28214 445.8974] - /Border [0 0 0] - /Dest 4608 0 R - /F 4 - /StructParent 360 - /Contents ([15]) ->> -endobj - -5083 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [233.44614 418.5734 379.90015 432.2354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/0890-5401(91)90052-4) - >> - /F 4 - /StructParent 361 - /Contents (https://doi.org/10.1016/0890-5401(91)90052-4) ->> -endobj - -5084 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 398.1114 91.28214 411.7734] - /Border [0 0 0] - /Dest 4608 0 R - /F 4 - /StructParent 362 - /Contents ([16]) ->> -endobj - -5085 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 350.3254 91.28214 363.9874] - /Border [0 0 0] - /Dest 4609 0 R - /F 4 - /StructParent 363 - /Contents ([17]) ->> -endobj - -5086 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [169.31615 309.33942 313.06415 323.0014] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/978-3-642-39212-2_35) - >> - /F 4 - /StructParent 364 - /Contents (https://doi.org/10.1007/978-3-642-39212-2_35) ->> -endobj - -5087 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 288.87738 91.28214 302.53943] - /Border [0 0 0] - /Dest 4609 0 R - /F 4 - /StructParent 365 - /Contents ([18]) ->> -endobj - -5088 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [310.53415 247.89142 431.38013 261.5534] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2951913.2951939) - >> - /F 4 - /StructParent 366 - /Contents (https://doi.org/10.1145/2951913.2951939) ->> -endobj - -5089 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 227.42938 91.28214 241.09143] - /Border [0 0 0] - /Dest 4610 0 R - /F 4 - /StructParent 367 - /Contents ([19]) ->> -endobj - -5090 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [264.92813 213.7674 344.52414 227.42938] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.2307/2266170) - >> - /F 4 - /StructParent 368 - /Contents (https://doi.org/10.2307/2266170) ->> -endobj - -5091 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 193.30542 91.28214 206.9674] - /Border [0 0 0] - /Dest 4610 0 R - /F 4 - /StructParent 369 - /Contents ([20]) ->> -endobj - -5092 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 172.84338 91.28214 186.50537] - /Border [0 0 0] - /Dest 4611 0 R - /F 4 - /StructParent 370 - /Contents ([21]) ->> -endobj - -5093 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 131.85742 224.16214 145.51941] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/73560.73564) - >> - /F 4 - /StructParent 371 - /Contents (https://doi.org/10.1145/73560.73564) ->> -endobj - -5094 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 111.395386 91.28214 125.05737] - /Border [0 0 0] - /Dest 4612 0 R - /F 4 - /StructParent 372 - /Contents ([22]) ->> -endobj - -5095 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 373 - /Tabs /S - /Parent 1 0 R - /Contents 5096 0 R - /Annots [5068 0 R 5069 0 R 5070 0 R 5071 0 R 5072 0 R 5073 0 R 5074 0 R 5075 0 R 5076 0 R 5077 0 R 5078 0 R 5079 0 R 5080 0 R 5081 0 R 5082 0 R 5083 0 R 5084 0 R 5085 0 R 5086 0 R 5087 0 R 5088 0 R 5089 0 R 5090 0 R 5091 0 R 5092 0 R 5093 0 R 5094 0 R] ->> -endobj - -5096 0 obj -<< - /Length 5301 - /Filter /FlateDecode ->> -stream -xœå][s·•~ç¯h­¤RÆ*�¸£aËôJ²¼ÙµT‘bîKL?P´èh+9̸*ù÷©îé pp€ƒf7¥‡}r¦q98¸}çÚ§Ïn®/¯ÍÓ§'Msúìp¸¼úëûŸ›OÏ?þöS÷Ó¿¿;üë·÷Íéß_þüþ¦ûé¼ÿþæò—ûËÇ�û“³³æù·/N^¾~qrúÃo—û¡µ×/þûÛ†�Oÿ~"Þðæ‰hg­µB7N{&U«›«_ON¯xsõ�Þüãjòüü„7ç7'§×¼¢9¿ž+wÎ=ùñœóo»×}¼ÜýÔœÿÏÉËó“·8!!Dpż’Bo@JÛ}Üï>.8·»æ‰2Ì+ã�núçgÇGÒÿ*C|·Ñ÷}¾á·Ý‡žë¡–Û5O„9¸àüØÈÍÐ4�ÿb�Ž�jDÏ㋹Ÿ°Á¡Y‰—ê>¤8s³k?þÐì=ü;7¾k‚ñè"YóïHo\ʘÕÒ=íJ5a?™Rš.õx×Èi8Âí {€žp&þN¸¾KaÐ -®È‹Ë/®ÂòýWKì6.˜6rÕÅ¥óÀ%ƒ„ê˜ä=–Þ†IsŸþjô�¥–̹–û X|»«QIøw×ø�÷q¨zÛ³’ºY·¿í¶º‡ã;žÛâ‹]#F!)ßïWi¿ÉU–ïc¡òí›ÅÃNï­áÒÉ“ñ¼ÜÉzQ¯UÆ�½2ggº[ÀÿPM -¿.È+f%pÂaP«ím„F´Ðë3$óÃ¥ö°À‰º…ø§3ë¤F®Øajd] ú¢Bj0­aZ¬ð—; ­Ï±Zp†èïÏ0�ÜA î�•†+|VࢮTÑ4®}Š”g¤áÌ:)T £ y&FrG·I"&µH瘱Nl0ý“žÏ÷IB‹~-Æjæ�Ýæúè¢/PÂÃe5QÃÉ�Ü­fÚ¹ÑýHFÓG/PZ]ª9k¥±¦f4 îx‹n…"ÓîPU­ß€ù!ò�I}{{NÜÐVÈÉœ¸j½ý&Ûåh}±XãfðsK+ÌÃ,¡­/Y]ëM}ɘÇ�¦²…î[Ñ 6�z‡Ç%'²ÜfAPµo6­×R£Ã–(-) -AaF‘;ÎÛbžˆÛK~ ¡�$¿ì,U2Ël.Z`e&Vªë_­zÓ„aÍpÅ _£Øº�°Ñ’XIXÖ:¡L �ŸKÚ0ŽI/Z‘6@�²¬ -÷znÄñ$˜yÜ":ôzÇú@[ÿT¢ìøŽ„|.™ .ð(jTgFœ·ðƒîvAsû<õÃÚ‰Çr�(ò‹L¦�4¦ÙÐÎ3×é/WïøP!§ � }^~gS.�šƒÃÁ&ºõ¬Õ«4ÍÉ ¤ßÝæ´õLµÛ¸Í�VaCCÀVSm–N0ç½�‘Æ„ð̶',Ô*ó`/îë-zýÒþ\q+-¢¥ƒÒj.Òk�ÝQqÈÇR`˜@ØCˆ -ãžVÙÿðö�]Ë`ÎnYfÄÃ�• P¾Wn×MgÙ1•�W¡([žË$p°XA_`Ê -Hsÿ]-¡ÿ6 ‘O8P‘¿(®3f²9}øƒ� !Ís ›À> >°á-Ö [ÒST ÅZÎU[³Þéq Np¤X¢—›'?È«ÿP¥.T*ËDËHz*X½ÀS¡�®uk FcOrÌËVXYò`Ñ»yÙÎ:Ab:®A€—‰w ÃÀ019}˜((­e¶5ÎÖLØ4ö«]czïg •Å7h€ �üìŒc÷C2çGÁž,Aè¦ úÌó‚cbÙ}¢Ò+x¥ùGóq*(ŸÇ]û–E\~�Ä FÚE0ÕþÊ)ÖŠUQzã!1 äÙ´X©úu¾7oÇë¡âvŒM¼˜2:©Åâ˱Â÷Ë­Ö•0­2Š)³�^«.Kµ%ÄÆÕåCú^´µ#lì$Ôç£Z÷@åüE°÷…¶¡FRàYØÑ½\²·$À©Ô'…¯AñÀ½Dh ì¢÷ ëŽÂÁ£a.1)›tUÞ[4;³²<2áÇÈ;Q™çŠéCa1 AQ~ð9-7¹£ ¯z¥<³m«åúPî,0ÍeŒ‹22LÛ2#¹â Ë0®Â•Þ1§¸­bÆçòn�œHeX¢ìßJ÷"YôYIæâ“9­$=ß‘×J†Ç�´JtÜä!&‘'~*æ|•ëá.m%‡zp-án.cÔnYâ7¯¤e\Ú±'ec�d®5Ê5ÔÖš¶KtV''º!ýˆâ§³,}ô4t3­'¸ÿÃMn£Õáø·ZÀŠcÖ}rHPWZ3#;�ï5Cª‚^• „ð–)ÕyЯÃ!¾%Ñ„×åݵž¨WŽóîwã:ò�܃ª—/ùBÑ f²{AUÍ éë¤÷ýî€q$N6ò®ìõðI6ó+!'ÃЪ¿±¸°,2¸¾t¨FáÈ:+f´%BÕÇ_H¯^_ôêΰֶZl³ß+ߪá SÇzª`H˜¶Lx¯@Äz¶ÀYú’wøöx¶€ƒ!ÖeÉ‚—…ÁøéóâÓèž}TJÀ�Ú ã–Þ"¡sE/T]F樓lÜ7/[�PönüÚ‚´ƒÅ¶OÚ~´ì¾†«ª%ÿ™Œ?€‰ž�?qY5Ÿ�¸Ÿ'ù~ñ%–a%“Ü®°¯•ŒOR2å<—·µ>͈<®7¯b¤÷I‚,0/Ü$Ö xÓLWW|w#�'¶P`ZŒø"á~cZ´è>œ`¦ó@ŽÍt~wΙ ÇO`Ǥ!m%ãÞxSµ¾ëmFÉrÂlF �˜üUDèɘüË$SúEÎz‚qîB·Ìh½æ•éóâ„«¢wèFÒJúî@‰øÞîóÕÓ\·IøYÆxT~ᤦ:fxø¢‰$D&®rgö²„'5‘ï9>.LáSzCgÚÇ݆P`¿Î -—yë”›ÉùÄ&EgkR¯óéÙänM¤'”fm+•ÿ|ïi\_Ô¸‰õ6¬ÙÃuÖ&ͱ§dRÁÑøo©™°råøª”K‚ UBh¦%ßLÚ¬} •à„½j=a"°#E/¡²Ì£¥-e"ŸÅmUÐ&HYY™$ '¯æìEêħkPG_I@¬ Æ�}Gšbü]æ˜w± (8mU²žqí­¬Z‹·–«ðï;t0p¼7$Z -h i¾öá{2§õ|Å“·¬Õš×±rÉ Î’%í HìEÝç -Rfà5hA£: °3k¢hGh˜Ÿ"uäŠTw”�âÿO‚�r }:; \ýG”)bv-JËÏn®/¯£§Øápyõ×÷?7?ž>ÿx8|üõ§î×~wø×oï›Óï>~<¼¿é~:ï¿¿¹üåÃþòðáãC(^2¡\ÛÁ¼0æöøk -#Š©ÿ7,Æš -endstream -endobj - -5097 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 91.28214 759.87537] - /Border [0 0 0] - /Dest 4613 0 R - /F 4 - /StructParent 374 - /Contents ([23]) ->> -endobj - -5098 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [245.49113 718.8894 369.07614 732.5514] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/3-540-45931-6_24) - >> - /F 4 - /StructParent 375 - /Contents (https://doi.org/10.1007/3-540-45931-6_24) ->> -endobj - -5099 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 698.42737 91.28214 712.0894] - /Border [0 0 0] - /Dest 4614 0 R - /F 4 - /StructParent 376 - /Contents ([24]) ->> -endobj - -5100 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 671.1034 263.56415 684.7654] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/978-3-642-00590-9_7) - >> - /F 4 - /StructParent 377 - /Contents (https://doi.org/10.1007/978-3-642-00590-9_7) ->> -endobj - -5101 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 650.6414 91.28214 664.3034] - /Border [0 0 0] - /Dest 4615 0 R - /F 4 - /StructParent 378 - /Contents ([25]) ->> -endobj - -5102 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [483.31345 636.9794 524.4094 650.6414] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.entcs.2015.12.003) - >> - /F 4 - /StructParent 379 - /Contents (https://doi.org/10.1016/j.entcs.2015.12.003) ->> -endobj - -5103 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 623.3174 191.81114 636.9794] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.entcs.2015.12.003) - >> - /F 4 - /StructParent 380 - /Contents (https://doi.org/10.1016/j.entcs.2015.12.003) ->> -endobj - -5104 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 602.8554 91.28214 616.5174] - /Border [0 0 0] - /Dest 4616 0 R - /F 4 - /StructParent 381 - /Contents ([26]) ->> -endobj - -5105 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [483.31345 589.1934 524.4094 602.8554] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.4204/eptcs.153.8) - >> - /F 4 - /StructParent 382 - /Contents (https://doi.org/10.4204/eptcs.153.8) ->> -endobj - -5106 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 575.5314 156.22614 589.1934] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.4204/eptcs.153.8) - >> - /F 4 - /StructParent 383 - /Contents (https://doi.org/10.4204/eptcs.153.8) ->> -endobj - -5107 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 555.0694 91.28214 568.73145] - /Border [0 0 0] - /Dest 4616 0 R - /F 4 - /StructParent 384 - /Contents ([27]) ->> -endobj - -5108 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 514.0834 224.77814 527.74536] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3009837.3009872) - >> - /F 4 - /StructParent 385 - /Contents (https://doi.org/10.1145/3009837.3009872) ->> -endobj - -5109 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 493.6214 91.28214 507.2834] - /Border [0 0 0] - /Dest 4617 0 R - /F 4 - /StructParent 386 - /Contents ([28]) ->> -endobj - -5110 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 466.2974 235.48114 479.9594] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.jlamp.2014.02.001) - >> - /F 4 - /StructParent 387 - /Contents (https://doi.org/10.1016/j.jlamp.2014.02.001) ->> -endobj - -5111 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 445.8354 91.28214 459.4974] - /Border [0 0 0] - /Dest 4618 0 R - /F 4 - /StructParent 388 - /Contents ([29]) ->> -endobj - -5112 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [287.61014 432.1734 367.20615 445.8354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3408995) - >> - /F 4 - /StructParent 389 - /Contents (https://doi.org/10.1145/3408995) ->> -endobj - -5113 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 411.7114 91.28214 425.3734] - /Border [0 0 0] - /Dest 4619 0 R - /F 4 - /StructParent 390 - /Contents ([30]) ->> -endobj - -5114 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [275.27914 370.7254 396.12515 384.3874] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2628136.2628160) - >> - /F 4 - /StructParent 391 - /Contents (https://doi.org/10.1145/2628136.2628160) ->> -endobj - -5115 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 350.2634 91.28214 363.9254] - /Border [0 0 0] - /Dest 4620 0 R - /F 4 - /StructParent 392 - /Contents ([31]) ->> -endobj - -5116 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [394.88446 336.6014 523.85944 350.2634] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.entcs.2008.05.029) - >> - /F 4 - /StructParent 393 - /Contents (https://doi.org/10.1016/j.entcs.2008.05.029) ->> -endobj - -5117 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 316.1394 91.28214 329.8014] - /Border [0 0 0] - /Dest 4621 0 R - /F 4 - /StructParent 394 - /Contents ([32]) ->> -endobj - -5118 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 275.15338 247.68015 288.81543] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/978-3-642-54833-8_19) - >> - /F 4 - /StructParent 395 - /Contents (https://doi.org/10.1007/978-3-642-54833-8_19) ->> -endobj - -5119 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 254.6914 91.28214 268.3534] - /Border [0 0 0] - /Dest 4622 0 R - /F 4 - /StructParent 396 - /Contents ([33]) ->> -endobj - -5120 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 227.36737 224.77814 241.02942] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1932681.1863568) - >> - /F 4 - /StructParent 397 - /Contents (https://doi.org/10.1145/1932681.1863568) ->> -endobj - -5121 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 206.9054 91.28214 220.56738] - /Border [0 0 0] - /Dest 4623 0 R - /F 4 - /StructParent 398 - /Contents ([34]) ->> -endobj - -5122 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.53815 165.91937 325.38416 179.58142] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/292540.292555) - >> - /F 4 - /StructParent 399 - /Contents (https://doi.org/10.1145/292540.292555) ->> -endobj - -5123 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 145.4574 91.28214 159.11938] - /Border [0 0 0] - /Dest 4623 0 R - /F 4 - /StructParent 400 - /Contents ([35]) ->> -endobj - -5124 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [250.87015 131.79541 360.71616 145.4574] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/360051.360056) - >> - /F 4 - /StructParent 401 - /Contents (https://doi.org/10.1145/360051.360056) ->> -endobj - -5125 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 111.333374 91.28214 124.99542] - /Border [0 0 0] - /Dest 4624 0 R - /F 4 - /StructParent 402 - /Contents ([36]) ->> -endobj - -5126 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [332.40213 97.67139 411.99814 111.333374] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3498692) - >> - /F 4 - /StructParent 403 - /Contents (https://doi.org/10.1145/3498692) ->> -endobj - -5127 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 404 - /Tabs /S - /Parent 1 0 R - /Contents 5128 0 R - /Annots [5097 0 R 5098 0 R 5099 0 R 5100 0 R 5101 0 R 5102 0 R 5103 0 R 5104 0 R 5105 0 R 5106 0 R 5107 0 R 5108 0 R 5109 0 R 5110 0 R 5111 0 R 5112 0 R 5113 0 R 5114 0 R 5115 0 R 5116 0 R 5117 0 R 5118 0 R 5119 0 R 5120 0 R 5121 0 R 5122 0 R 5123 0 R 5124 0 R 5125 0 R 5126 0 R] ->> -endobj - -5128 0 obj -<< - /Length 5218 - /Filter /FlateDecode ->> -stream -xœÕ]Ûr7’}çWCVØ-ŽÐ¸£ k$K²³k+l�¹/cù�¤)�6Ö-/§±ó÷UÝU‰K5Šòì ›]�kâv2ó kûânÿþÝÕ;{úô¬ë¶/öû«›¿ßþÜý¸½üðÛOã~¿Þÿó·Ûnû—Û«Ÿoï†G—ã÷ï¯~y¿»Ú¿ÿ°;{ö¬{ù嫳¯^¿:ÛþðÛÕîXÚëWÿñeG§_ÿ÷Œu´£ÝcÖJz­™ìŒ´„‹^v7¿žmohwó�3ÚýãfwöòòŒv—wgÛw´c¬»|ç2—¿žýøÙ[Jé—ß·”‰áS¾ÚüÔ]þçÙW—goð1¤AŒ -bgr…&©áσC»¨ÞtÒa-ïÆÙá¹Ð‡O®6S‡ŸÞR1þú蘕?U¢¨·Ç»$\'’¾Î6iÓ©¹ Cƒ¸kßt’¿ÝS˜Mg¦g»D™o†?O7�˜¢=u�äS'�Ÿ‚&;='é$ T!7Ÿ["&i ÐY×¶¨Bâ‹ç˜ÛÖc檖èØÞ¥{"m�áˆåµsƒ÷×ô¬‰'VaÅðá¿o¯v¿tŸÝî6Èò‘ª'Vñ^Õ¬–]=½7iö‰ìÝÔ ?Ï”ö°1¼½†R˜Š>q]’€(IÀß@„"ÊèÓE0Ï“¹‘þ$»Ûù‹iš L{k÷0§®7Ýc-Öªhš@pw@ȦP̼ù„£‚%=®´ihü�` ñ;¤[¹áÅ»·éÄô혙ÍÛmйwáSD~”‰ÒÔ�ÈlŒù­™ ùÃÄßaAW¿…�Ûl§ã,õtY<˜ÓÆLŒC™ŸÀJÝæÆF¡>LÖáfܼ|GbÆÛ¯çºVÄÉ"(M…LÅ91š±ìdðKzq³ÿýê.oÿoß=ýú«¯¿¦ôŗϦ‚ ³fê·Ùt—ÿ=¶1ÝX]ØÇ8#vøçÔ¹[œ+nB†Ÿ‡MûùügÞÆAúi>g|3|Ž{ÇÖÏüÍüxüª£,î4�· ÎèÂàDž\*"-c¢]œ‡½ï¹k·û>þEúýÜËa̽Ýz²<<Þο=qYö~ŠQÿå‹p[’@�í…ÚjF°ºF<8Ìédí6«iPF¤â+iÛ:MƒVXk› ªñX[Â-ëÙÊ(,¯nD‰Ȫضã¶‚çæ&tPæ¨uð|c�Â§Š¯oÄ]A4�è"”t|€}âí‚1„Û|ž,}lܧ®°óPZYð�âbøÏXÿ3F´Ò\ÕLé<ø%ƒz€ApZ4Ю_á¨s_G"ùdzSm™‹1J<–]’dQ“òvÝb,mÑ#2ÝJb¤2VMýÊ„7 ïbT6#6‘(ø™w‚ªÐó(?/ŠK`'*å„ ¡L�€€ë°Ýmà:,ë~À5ÀÕÀu« îW9'B4ù¤XLWF)í\æ7sÁÛ0Ki†ËÂ`$a¼ÁÙ j¦Ò0®ˆ`¬jo`5ª}2µ>L À®Ž`ÿô‹+Ñ�Þ?™á®)ÊÓœ¸DiÉT‹Lªp.39 «• Zë•€®¨º}a·¶ Á“Ìc-cýŠx”ùfÓ±i»»ˆ÷8�úÏaŠ©nˆ#æõ((—³9ƒê†LþöÈÓIWF§ ô:tŠw!§R€Ä ¸þAy̜Ͱ GØóÓíóF\äÆ':—§ ,[4˜ÀÇï¨KSJë×.Á¥’Jåé¸ôapžßa&Y þö"‡â£DÎÄqz°|ïÍcµzh2¸¼‚‘¾ó[0´j2&Û±ÄÜ](·Ô�'Ž™¸6„3ªj†ojmî<¡s¿…¶¶8—g|ŠÁY$•yåGè, ^.. ö`R×@`KÌU@ÀƘm¯Uµ‹oÆws‡Ë^Á„\c¶¤ñÝáß±ùß›É ›×DÈSÚw®…@·=lëçÈ�‚—×Í)Ƀ�Êbo1Å—YFzÆXSg«&—Y€Ié{ºÀÔU“«Â𷶉€µÉ‘ZÒ < õW·£‡Ì˜]²˜Ñ@ù2¤EøVX ”|�=�(<÷Øá6ÅMgI‚‚0�ÆXµîPt È¯ñ:™³÷ u�Z’îfHH™‘ ¬ \~Ä�oá*QA!�õ€,*NŒg‰µÖš¨uJË™iKÓ_-°’A)¯Y ÷ˆÎ<³ëŒk€Ì2Þ€s0ÕÌŠÂ1%áÌØœp–z`SRœ§^…–÷ p·²œpÖ@­IÚÄ}@Ì¥!¬—̳©yÐ4%Ð ìå!¥ÃÁÛ‰ÇbÒ5-¡’D°_gz°ˆSœ’˜+’KŒ|##¹‚ƒ¾TBp(‡_d©†fF‹uÈç›éRu¯C­:vzFÍ‹pÙ¶Ü¥F-hF·�8€Ñ��óùü¤ˆ£E�ýªLO”j±ÔM§ÝpÚ;WA -Cƒi7>´ÅN Ê€Ò„ó 6ô¡ - ‘ƒÇJõ„Z)ô:øØTácQð#´7 -äÇJF­U�–3Ø\OAWXYž½n: L -Þ!>XÜy «x†Èz9«i?F=ˆS™yÛsÖMQ–“b®û±©²™æk¸k!:ÄÍ]ÌtªÌt¶ÄÊž×-©“©8žºQqPKÙÎEuÃßZ¤$R40>F¨W¬ã3Å§Ô w¤ð˜ü&˜'>Q¶ÝaŠžoG+ŸçP²ò{$î„5®BÜ)®ÌÙ*�$šYÊkfÿk:˜L(³"L4n -/æÿžUou—­”Ó`Qû››&Bìº'”Ù‰ -èk,n´BL{²”ÏýÓ8q)w¨ÜA>MXÚEPëüy˜Sç ^ÍV3ÌÚð@'!–åÄëMƒ_\Å$1éú{�»» o|t}Íï?ö0RàbêÌ’QIƒ”Û™@¢g…tž,éÌíj¢-¬:f£«Ói<-X„,q@‹²ónÍ&Ó™ê+2¨C’KbLÏš:]¥¯I–ÓפÕD˵ø2¶J]“oVs›.ÜQç“4LõÊøÔ>·ãŠ%ä+Ð6`☹¦X‡¹–ùæcºK¢W»K’‚]�ª*¨S°Úýº�„ŠƒD/hÊž’Þj[³¶òúŠÅî¦2ˆµ#[6ÑB�LÊ:™ì9±}EçS ¾WØë%¼PÚØ4=Lú(\VVç4«ED~'PÃ…ï€@TÇI¹b‘"u*öˆ„IîQ*NÌQ.>ÙÀ˜¯˜ ´•°Ó•~‡0“Å­ó‘Ä“”�r_,*�±¢žÏ�D<±£$,â56¸™kè?0K#•…; R["8¿wúOÈÀù.aBEôœÇÑðŸgˆ8o÷E¡—:…"²˜8 ò©ƒ®}ºÊžôz-&Γ:èZÐ`šÛô2Z%†0Înô¦�ηrû01 êße ×8þ¬·%+Z:°9µDRÞ×Ȭ`Bõýêר̂³ºxŒ(Leâbà˜(&Ú9ÜÓÂÆ¾™˜CÀ}�ê‡?VY;"é@zubú èÞ‚šMF2Wcð&Éå‡y_„F HaÑ'ƒhUŽó"(ÑJ˜¦lÑùáá¸PY‹>HۈĦ6”·$<ŒŠ0Û@ãÉš½Ë+õóáFì`‹©h]íÊ®…óq…ƒÀQŸwoã°>þ ëg®*(è"ž/Ó~â?ø("øÖº†Ñyoˆft•!Xh܆H×B‹†=…ÁG1Ü4 š©–žT¡#•½'™$F´öœõ³�TÁ¥ÒÜ !Âgyp“@pbyÏôìQQ…ÓÓ7�Iy[ä.]tÄ¿¿ð« èáz\K™ �'@jÜò—9GV¼OŠ >]Ò< Q„¡ÜX©ÝoPoM•îa•4�_'Ó_Î�C(¸€b_ÄrÂ(x­1¦ñ&àôs’nˆ¥BJO8Ü赌ªý¶¤²PF¨i°Šœßc¸ÁÙ…kN(§VžNvÑE…YI”•ºFBÕ -"¦)Àyº H=VôE2’# O£a;�q—1-MQ`>Cët6r"ÆÆ†56ö4JÒÛàçÄÝd¨ÁĘÎöÖÒÄ.Æ«ñ¿è ‘¬�¾Ôctm© +ŸÒZüáæd�9*93„Šžšá-´'»^'Ø/a"DH¦õ) HL©ðxY±/8’&Ïœ¨ ^u×d‚î"GàÃdY÷F^‰š\&¯À,«“WJ3XÖ¿ĨSÖ}‘eÂÏÒ�†bDDÄwáù4Üeæuc"jÌÜÀ�"ÜX¶†ôëuÝð‰Ï×ðDà›&òÉuU+�úã¬&Œ+¦Zú_¥!k�Ó�…„÷­Ñ×½ÛûEY›ÂjlmQZEZO”è/ „F'†ßù -R\^AI ¿ÚtŒ›øÊõè>wÑYæÄ5Ïè²l*˜xÌÓ‹_)®{$ATÕŒÝgl÷S¬æºx‡S2Azï™Þùr.�ïiAT¢¥$`üÆhQÖ¶úªoNÔÄU_SÖ¶½mPX¢ySù–k·šÛSËͺ·n£b×½tkPŸ%ãDq©L�LëuЕ:îKÔÓE\’(q’RFœ‘Xì) -L¢�F EÜ�\'��!›£5 7¦³ -+IßK©W˜§PZN -*ãäåx+€Æ2“7ŠRÁô Åé•­Ûqš€¨É†”jLK)Ö@¢G‰±¨)Ä”ioTÊA9‘b¾{þ-úª˜ðº; ìÒ¥a‘·A’öMV‹,\£ÍT»‡ðæÍ5ž†:Û½¼3(JÝ=Š’Ì/Ñ™ÛB¾-'¤wŸ—šŒE‘Ä%@iȈÇòüæ - D»y4ìb™:—z´*6ì QPEå¢oÑ -ùéž±„ F°ñ’mßpߨC×0C ÓJé*)üQN(ŠØ Sä�0 µ»ãxh½Ç÷c©<‘wû„�Þ� Ù4X“×½Ú›Yºþ�q¿T¹fd|l½¤.”VÍ’¨I|ˆš'›¢è¯ŸÓžôÂx!Tê·§Ã�†y¾è]ªŒ—ŽÈ3üáE¹¢Q‹˜$Jrcj$¹$jQØÖ¶xû °û ¸�^[Äý08ǦÓi³_B¡Þž‘GêiMœ¤Ä”ÅîÙ†I½ð¨û0fª‹ÇžÉÞ¬ö…—ïpÓfþD®wÌw;7ÈjÝ‹š!j‹¢A-%ÒÝS¦Z$S¥ ö<§ reˆaz]PV)‚}ÁEØÞ"øþÕÇBJbÅô6ʘ쎅ã ó¡0ñ·ùú'xœN*Á½M�Bìao<ã˜ò9§K¬!Ñtp©ÃÛÃø›‰Ü¯>ž¾"Ä'ž5ºw\ -‹WŽ -,‚c…cgzö°fnÅ?6R Kk±ÈŒKI¨’Mº`MÈ ª‰4F;dBM¯�Íær<†\Ù¹[² id?91˜&uU à”hÔÜ�´;ŒüP¬1Æ­à–FnŸŠ& Ä.è0ƒ>‘Žˆ °x{òÞƒr\ÀËɋﳱ[ú]‡³/õnPZA%_+Ö½ÒÓ–´Šæ!|.ˆêõp7hr+L›Þ'9Gˆ>*ñL€D > ÂaãHŒÏ ‚R=öHºjTƒGëgUÕåq2H q:øYåîƒæ:[xŒIÓÍM8 @ªó’£Oòµ�H¦U'NtâÝŽzlƒ öb¼]ÂgV®{aþ �ðŠ’žÓáº]ÊSä�ð õØ�WÉ|HŽìMØ–¥ÀÐ!”0ŸÛ‘êgý*Û‚Uìû‰Ñðìû źÁ;O†ûw/”Öá’w㲞Muƒ&òQ‚‡ZÔ²¤‚1UÕ‹œ$A˜æ&çŽi’±CAº¿%ã#FuNYºî‹ªøXŸŸg:=²ÃqÚ€Ã�æË82ƒ©qºÚ0— =Yý¶E$Û¢Ù"Æê�B£î+N(Ÿï/×á£Ó=±²ù%fnºòîÅ6©$‡Î�UV‹`Š(Ñ[Ï:"YtñâIôbYyàA>ááO±Ï¨mgxWq/™nés•®j³á˜ìÉ8~ ]µŽàf ñÚ[Ù^ŒpC Ÿà8Íÿì½�ø.´K––М@ªô‹Âí/ò;Äå€Û˜9‘ÓžâòiD©rW ‹­‹ÿÄáÆ4©yuo%kþSêMmVj[$þwªLß ]5­KVjHx?Ãñs>CQ`êOñE¼}��¶„2&ú–lfÕY§áTÃ_ÛOÈ„qº(� ‹˜�ƒ“ÕÈó–õòaî_¡tAħÇã™x¬Ç®ÏË+t¨á;q:ZÀÊñ‡Eou -¡üÿí"]�È� Çq÷lØÉ4]Å40¡éàÐ ACW«0£Yâ;c’µÊ L]… -°Þ›[ô…‹=ä;q 'œ[~|£9É8EÔÏP²S!/ÌQ`F„‰?wÄ«tkg[€÷–x$êäá[¸î’…¦há°3 .º^xD—%œ%A$^¬ê6-¬ÅØ=N�hA ò–á å ¯—*.«òZ '=U¶j‰­;1GÆ"[ì`™ªîm"”÷=%»�..ÜØ.‘QT‰2‚H:ø?kzzõ€‰¨©/Èž�V� �8®�Q0ǯ|ˆ˜ËÄr?%J¢{ù‰ Åî0×3Fìv³¥;Ÿ�]8äÅÝþý»«›ýtËy¿¿ºùûíÏÝ�Û—öû¿þ4<ýá÷ëý?»í¶_ø°¿½]Žß¿¿úåýîjÿþÊ–6Ä€UŒX¦”=yP9”Ý¿‰dˆÿ -endstream -endobj - -5129 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 91.28214 759.87537] - /Border [0 0 0] - /Dest 4625 0 R - /F 4 - /StructParent 405 - /Contents ([37]) ->> -endobj - -5130 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 718.8894 202.77814 732.5514] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/38713.38742) - >> - /F 4 - /StructParent 406 - /Contents (https://doi.org/10.1145/38713.38742) ->> -endobj - -5131 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 698.42737 91.28214 712.0894] - /Border [0 0 0] - /Dest 4626 0 R - /F 4 - /StructParent 407 - /Contents ([38]) ->> -endobj - -5132 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 91.28214 677.9654] - /Border [0 0 0] - /Dest 4626 0 R - /F 4 - /StructParent 408 - /Contents ([39]) ->> -endobj - -5133 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [233.11613 650.6414 470.02313 664.3034] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://martinfowler.com/articles/injection.html) - >> - /F 4 - /StructParent 409 - /Contents (https://martinfowler.com/articles/injection.html) ->> -endobj - -5134 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 630.1794 91.28214 643.84143] - /Border [0 0 0] - /Dest 4627 0 R - /F 4 - /StructParent 410 - /Contents ([40]) ->> -endobj - -5135 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [264.81815 589.1934 388.24915 602.8554] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/3-540-57182-5\\_8) - >> - /F 4 - /StructParent 411 - /Contents (https://doi.org/10.1007/3-540-57182-5\\_8) ->> -endobj - -5136 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 568.73145 91.28214 582.39343] - /Border [0 0 0] - /Dest 4628 0 R - /F 4 - /StructParent 412 - /Contents ([41]) ->> -endobj - -5137 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 520.94543 91.28214 534.6074] - /Border [0 0 0] - /Dest 4629 0 R - /F 4 - /StructParent 413 - /Contents ([42]) ->> -endobj - -5138 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [387.86646 520.94543 524.4094 534.6074] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://webpack.js.org/api/hot-module-replacement/) - >> - /F 4 - /StructParent 414 - /Contents (https://webpack.js.org/api/hot-module-replacement/) ->> -endobj - -5139 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 507.2834 230.02515 520.94543] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://webpack.js.org/api/hot-module-replacement/) - >> - /F 4 - /StructParent 415 - /Contents (https://webpack.js.org/api/hot-module-replacement/) ->> -endobj - -5140 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 486.8214 91.28214 500.4834] - /Border [0 0 0] - /Dest 4630 0 R - /F 4 - /StructParent 416 - /Contents ([43]) ->> -endobj - -5141 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [292.59314 486.8214 447.93515 500.4834] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://vite.dev/guide/api-hmr) - >> - /F 4 - /StructParent 417 - /Contents (https://vite.dev/guide/api-hmr) ->> -endobj - -5142 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 466.3594 91.28214 480.0214] - /Border [0 0 0] - /Dest 4631 0 R - /F 4 - /StructParent 418 - /Contents ([44]) ->> -endobj - -5143 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 445.8974 91.28214 459.5594] - /Border [0 0 0] - /Dest 4632 0 R - /F 4 - /StructParent 419 - /Contents ([45]) ->> -endobj - -5144 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 418.5734 207.66214 432.2354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/32.60317) - >> - /F 4 - /StructParent 420 - /Contents (https://doi.org/10.1109/32.60317) ->> -endobj - -5145 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 398.1114 91.28214 411.7734] - /Border [0 0 0] - /Dest 4632 0 R - /F 4 - /StructParent 421 - /Contents ([46]) ->> -endobj - -5146 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [388.97513 370.7874 498.59015 384.4494] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/tse.2007.70733) - >> - /F 4 - /StructParent 422 - /Contents (https://doi.org/10.1109/tse.2007.70733) ->> -endobj - -5147 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 350.3254 91.28214 363.9874] - /Border [0 0 0] - /Dest 4633 0 R - /F 4 - /StructParent 423 - /Contents ([47]) ->> -endobj - -5148 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 309.33942 242.18015 323.0014] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/978-3-540-76778-7_1) - >> - /F 4 - /StructParent 424 - /Contents (https://doi.org/10.1007/978-3-540-76778-7_1) ->> -endobj - -5149 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 288.87738 91.28214 302.53943] - /Border [0 0 0] - /Dest 4634 0 R - /F 4 - /StructParent 425 - /Contents ([48]) ->> -endobj - -5150 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 254.75342 91.28214 268.4154] - /Border [0 0 0] - /Dest 4634 0 R - /F 4 - /StructParent 426 - /Contents ([49]) ->> -endobj - -5151 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 220.6294 91.28214 234.29138] - /Border [0 0 0] - /Dest 4634 0 R - /F 4 - /StructParent 427 - /Contents ([50]) ->> -endobj - -5152 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 186.50537 91.28214 200.16742] - /Border [0 0 0] - /Dest 4635 0 R - /F 4 - /StructParent 428 - /Contents ([51]) ->> -endobj - -5153 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [266.66614 159.1814 376.51215 172.84338] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/168619.168635) - >> - /F 4 - /StructParent 429 - /Contents (https://doi.org/10.1145/168619.168635) ->> -endobj - -5154 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 138.71942 91.28214 152.38141] - /Border [0 0 0] - /Dest 4636 0 R - /F 4 - /StructParent 430 - /Contents ([52]) ->> -endobj - -5155 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 431 - /Tabs /S - /Parent 1 0 R - /Contents 5156 0 R - /Annots [5129 0 R 5130 0 R 5131 0 R 5132 0 R 5133 0 R 5134 0 R 5135 0 R 5136 0 R 5137 0 R 5138 0 R 5139 0 R 5140 0 R 5141 0 R 5142 0 R 5143 0 R 5144 0 R 5145 0 R 5146 0 R 5147 0 R 5148 0 R 5149 0 R 5150 0 R 5151 0 R 5152 0 R 5153 0 R 5154 0 R] ->> -endobj - -5156 0 obj -<< - /Length 5106 - /Filter /FlateDecode ->> -stream -xœÝ=Ùr7’ïüŠÒÐÜq[!7P™4uͱRŒ´æ¾ÈòF�4ikbÜòrÚ3?QÕu‰ÝÕ–b÷¥È®Â‘H‰¼qzq¿ùpwu³iž<9jšÓ‹Íæêæ§ÛšïN/?þò}÷êÛ_¯7ÿúå¶9ýÓíÕ·÷Ý«Ëþ÷›«?¬¯6>®�ÎΚ§ÏŸ½xýìèôÛ_®ÖCk¯ŸýùyÃǯÿ{$Þðæ‘hgÞZ¡§[&•×ÍÍÏG§7¼¹ùÇoþq³>zzyÄ›Ëû£Ó;ÞÑ\ÞÍ•»?—?}÷å{Îùóî¡»‡ë/Vß7—9zqyô‡F ЮX«¤Ð€Gv�ãîñžs»jI®˜ðZè¦ÿn†O=Èï¹ì¡~0¼”ñGÕ|ÏåXx¨¬,(Åú ¾¥¥Í—~JŒâý€îÖmk÷ïíÛu¾…·x3­a ȪûŸ¿_¯9|û¯"l/–Z²ûïÕÕúÇæËÛõ -Y"JIæ•V²f…ˆâ -aÃHíª‘|yaã>D%ã †¿*\9ï¹Øþ¾F±‰–VânÆè´ îs¥û޾™–Çó\¹¯V�žík=ÌB0.®ú‚§Sií�kj5ƒá&W†g÷ŸÂÚi6æM€ùÖò]4›´ ã ›GJ3©­÷.F(¬)u°o&‚Ù½=…+ ë'n)ñP0é�Î ÊB°|dŒrDnL<¨5£±�. óÒ:Y³JÊGADþÐ"…•êøuprlÑqP¬æ»îÑvIyÚ‡Í!ÿqÜJy@Ê„‹=Šy¯÷]ügøZM¯‹mŒÇ×x(nñyRKñ A"¤`m÷ÏÞ“ß#ð|Æf~žNÃ|Ó=4ÀòfzyŒ|>qE�Ð"#”\2ç¼X4À~|Ç«æòo…Þ]‘ëã‚i#ÁõµU\Ÿ'f{)<.W/˜öN§Üëh©^Ç`næ…l²íL\\øU¦?DGÿØœ )¨½^g[z;Ó¢ûxH#�γyh€öMßÓÆ}z²'àÜK�“/0>Å¡”€�޹Ìñï=Í{«®%¹J/Y+—5+°Ì’´Ñ‘iŠ®S›hbñ-†h$:ÓgÊ¢VøKÉU£æ_™é7.ƒu®ñ·›Ý­ï¹µp M â‡z~G�eT¡L¦½á4žúO´A{´5míø@Î�é¡È�€²J¬šG{q�ÔQñ˜¡ˆ%Ǹ¯èí J“"×î4ÉÝ߿Π<˜ÙaVGR11‚ÜN¦t 7Ó®çP‘‹ï$èšsÈ»ß(fíQ9æ5ûM;¯”ùdz^ibÁ&Zv8®"훑ô‡«ÆÏ^M‡Ü1LjpœÕâ§Àä#© -u„^ÇËyú '“ ú&VÆÅêétWL»A…òÂnDÙh>·íž€*óÕ?ó°¾\²å�QtNZor¢}ñ WŠI¾@Íð|R œ×�ã-±“—ôp^‘ìÉ÷VµóZÑD0)ÉBæ¥ÖËbr\úkF|OåìšN:xöv{a$9_×ù&ßNï Ldí©çØBÐ -¢2: Ç�s ñŒAU¾ -0~”’¨.á«~1ã$ T¶¶zÇuÎB„BX Šc(cã‰F¢Ú€Å‰}-Zfô |dy¢“òjì¨eȇ,šäšY)¾54S@´ÜçꟅ‘�%­õ;ù‡q]Ppƒ,©¸Ì`ðÀ†ôY1ÆÙ¨²jÄLTz„}_6“F�îa$%µªåLXé|Íz++#bóRÞN Wbl_CìË[ìC|ø`ò7Ú$ê y‘Q6D;Ô¯Q(' Óáç†y¿LCmð:ÂJÞàÙ�YHǤuÚC#ï4¶Ê( Ú™ ÐßÌ”)w6- 4Æz—¦ÏÉÙÁ”4Ò ftÛÖLÇöÃ¥¨ýCÊëŽi#"‹û@Lµö7ÕW(qNL'�‹ý#Ž6ˆâ µu€–j”Ši­À°·}Îe©5F(ÞL+™ –æM9¡×å¬4ˆ-Õ®¥¤ññôžA´²u“U¹ÖT€Õƒ˜ˆ%¦¤‘V3/¼0ÀŸ.¶�Þ³íü%ejFÚÄœ#A‰²c-,=ˆï dnh ‘ùfgL‘+zR¤Õ]A”Î�ñ×LÆ‘ÑÙí’ÜNË(ã Ç0γÙK–}ž…“Ç€Ï~¶V?„¾ÊìîHŠš -óœÐ­d^*oªöÙ.ΪÉÂBßn1se› )jTŠ Z3­h-«Ü8ÎcŽñ5飡t‘;•еŽ„; "ùSExµ.†ikÕ‹="FkB´¥¬¶e®õʇ®?‚1_H¥4(föTκš@< §ÅÙyCÍà§cþ 3P'Ý.³V'Í}zÓµÂeB×­{m°Æö4]ï²0'œþ5lóêð#fqÇ~:Ò,¼!Qçˆý)8SÜ/Ǿ�ƳIí´u¦Íp«Ð¨*Ú͵o™×ýue%ìæ‹z†ˆ¶ì„hê@Õ=8´t1[·ÿyÎhÌÒ)[ÉL«±2ö"?M~ÞF¢2Œu&)M@OFNx’×y Hzæ@9°ÅIŸ\-ŠͶLùƒ8¨œVm4-‰�¶ q¹÷è‚ñóæ ­Ö �¦ÍÔ éhEç™’F¨š—%èq:à'‡—ט䄄 nË­Br.P…Ø +µž’¸À¸hé8³Ú× ¿<ß¹ú“bâ<ùAJÚ÷£ö¬•K#§æ4z?®Ÿ‹z MgÆ0)´ #Ñ¡û®ÜŽ €q+„GX\˜€(U!#†±ÔŽ7ò6òFâ‡è¸/ØgšŠ«¸ÝA§Ž`;ƒQjÃñƒºaE–`¬/àQ†ú£mçö$ÛÒ^Ièl -5|�`FϪEÁ ¹µ\Iï[ÚXŸÃ\¶/­ “v‘n¡°ŸŠÂÄ^Áyš´Ec™mÍÈêÒœÄ�N9h™Õ­ä|N‡ {‹ëö»šdO\M+(ËêÛ¬RB�è¶Su¬îíÔÓ‘¥Áh5ÆV$�Ÿà9.€ú6Ê�‚ wˆF3˜$¡Lgniµ:À‚u^ñ8ë¼HЩ±DÓÁññ©†:[dÂs‘ý™µ³]\³·Gଡ'Fˆð9ß�Å6D¢-3í"¿™¥PIG¦DÏé-°��à|Bë›Tï=ÍN_*ØìôŽBâ¸cÖÊeCªr1E…¼æ¢ Ú:ël«XgChã´õˆ5õRJüÚ×P\OÿÍï¶³Juë™i¹0K†]%ÉXY’dºôÊĵ¨.i®%ü´”¨Ü•×ÌHÞ‚|³…"˜;Olĉø¥™ÿDŒˆ×Á™K摉á€:øðr¹háá}¡#JÞ€¥³òFŠÇ„é -Ù¸ñ%"ýÅ-õ> -~՘׮l„;É7–°ø/ý¡ÔÅh1KOQlêŒ+®�§6ñ¥Tˬ÷Z.Q]ñÈþ âûGŒE¡ö¦œbÒÙ€çu;î8Ü]"H’x‡ чI•~~I–�a"¾Üiš2¡Óé¨w}°† žœ9cTÕ®ÓˆÏ7(AxÂÇ¥s©£_³§O§í6}þcb7äaÁ?åú|š“dñ­Ý…Å—–qiµú¿�vÚXôä-TÖ€#Rg�Œ?°—C'·&§MÂäE�¤eÕ„íàTŸ  ‰NQ<é&ú˜¨½­¢¶ ·wûœ…}Kˆ$X•|ÞhXt“äŠä†úŠ?„Õ[ É”ÕÊ‚(àÇÓÏ6d§j‚ƒûG� ‡7⦘`:¡ªE¥u-™ð½l´%U‘+Þ("[ÁZ~©ºÜÒŽ°4.(ޤÐÌ+'s ¨À÷(5Iâ -tæXÔÝ!qiN€3zÜŠÍUXÀÍá*ñu¾þÛB¶+B–KžhIh/ªbNÑ»Ö'žD¥¼wåy£UèéìhœÁ†¬3L±_©PFm:ÂMXº.G_&$í“Œä ¡ÖÔài÷a¯™à]NåDìšÐ˜' O½T¥uÇd -JŠÈÉ $Ñë?„fV˜JÄýZçÇ;*œ÷˧rŠ9ç(:…uÿ{ 4‰ß¢#³4®»‰bã4ŸÓu)¬a¥]’ÕÒyÖr[PcÂ�ÝÏë01edÜZx‹×–ÍË8d$PŠYU˜shNêX„¸ìë*%òÃŽ�,docbž4$Ñ® ôÄ�eÐÄŽái7' :¯žP}Ÿ�¸+AñÎú+GÛ…�`J-«v©éèͽ<2÷N7MD99mÕñ(72°–u%¡´‹¹WjÝez>€¹·‡þ÷ýÞîrz\„ë¼Cf%wh�£ír:v¶U½Ë�˜·cn‰(y§OY ”ŠY£ßýù2CFß1DÉ�‹!Jn’qé¬k“T}…RXîeXänÕ¸”g©—¡î<ß^"Á‚ïq‡Ä˜ÐïÞm"ƒïg@?†» a)B‹â1(�\­ ¿#ñ&PfבKPöE|f.¿ì•8%ã».`Y5Oò�‹¼$ˆæP.¥ìMsö`'7¬,Åß·ëçÀñ„^ò–µ­\pK%”OðÝ…,yÃ…­×?€*}öÕ'ó=ï LMÚÛÎ\�×Ô¡-¹aÂY_…ÞÏd•ƒˆHŒr°@Ñ& -Ï™q362X¡Ö—Lñ‚j¥˜i¸ƒÙ°rÍ«"Éf R‹N.S½%×&ãj­ײnÉÔ�Ò厽Lr2Á¸Q9L¦ñùÊÎ9‚æÖl‰[¾eF-õh -ÔT4·F¤bY Q¬)ɬFX¬k~°Î×Ç<¢¢g!“°=«¤^<¥²CQ9^þ|(Þ.~ÑùiW\•?‡ �Ð9KÛyÈ{N«î_ˆŒÔq¬Ì˜ây³U½B¯ÃDý¥"PþeÚ¤¬ô™L˜\…3Ì[¯ÅÞ[óëLH»=„¯�vÛûÍÕ®„MvœI¥d2>—¯ÄDê+K”}…@éù,Ê1&°FñbúdÞÁ?P¸2ˆ‚ax,æò’»ï"žb`!9‹“áæ…ÐüO+  Üý°ÆòÈзZ·˜ÖÇpϼê|v–‡ˆt`3·„ZHXÉ$·‹,•<õ«�¶é»8ûø7ÉÓ²ž�ei\0sðúa³ô·˜/­íîÏAoýMîÁ çÐ�±ÇÙB=ÂèÅ�©”³Ì)Ì¢±VyÞ´Åk¡sz‰/TÀÅצˆËØU> -endobj - -5158 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [392.97916 732.5514 510.96515 746.2134] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1002/SPE.4380210404) - >> - /F 4 - /StructParent 433 - /Contents (https://doi.org/10.1002/SPE.4380210404) ->> -endobj - -5159 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 712.0894 91.28214 725.7514] - /Border [0 0 0] - /Dest 4638 0 R - /F 4 - /StructParent 434 - /Contents ([54]) ->> -endobj - -5160 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [322.68915 684.7654 421.53516 698.42737] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/75277.75283) - >> - /F 4 - /StructParent 435 - /Contents (https://doi.org/10.1145/75277.75283) ->> -endobj - -5161 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 91.28214 677.9654] - /Border [0 0 0] - /Dest 4639 0 R - /F 4 - /StructParent 436 - /Contents ([55]) ->> -endobj - -5162 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 630.1794 91.28214 643.84143] - /Border [0 0 0] - /Dest 4640 0 R - /F 4 - /StructParent 437 - /Contents ([56]) ->> -endobj - -5163 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [322.68915 602.8554 443.53516 616.5174] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1190216.1190229) - >> - /F 4 - /StructParent 438 - /Contents (https://doi.org/10.1145/1190216.1190229) ->> -endobj - -5164 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 582.39343 91.28214 596.0554] - /Border [0 0 0] - /Dest 4641 0 R - /F 4 - /StructParent 439 - /Contents ([57]) ->> -endobj - -5165 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [386.45844 582.39343 526.60944 596.0554] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://www.typescriptlang.org/docs/handbook/declaration-merging.html) - >> - /F 4 - /StructParent 440 - /Contents (https://www.typescriptlang.org/docs/handbook/declaration-merging.html) ->> -endobj - -5166 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 568.73145 332.56714 582.39343] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://www.typescriptlang.org/docs/handbook/declaration-merging.html) - >> - /F 4 - /StructParent 441 - /Contents (https://www.typescriptlang.org/docs/handbook/declaration-merging.html) ->> -endobj - -5167 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 548.2694 91.28214 561.9314] - /Border [0 0 0] - /Dest 4642 0 R - /F 4 - /StructParent 442 - /Contents ([58]) ->> -endobj - -5168 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [204.53815 520.94543 325.38416 534.6074] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1869631.1869638) - >> - /F 4 - /StructParent 443 - /Contents (https://doi.org/10.1145/1869631.1869638) ->> -endobj - -5169 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 500.4834 91.28214 514.1454] - /Border [0 0 0] - /Dest 4643 0 R - /F 4 - /StructParent 444 - /Contents ([59]) ->> -endobj - -5170 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [401.79245 500.4834 524.4094 514.1454] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://docs.python.org/3/howto/descriptor.html) - >> - /F 4 - /StructParent 445 - /Contents (https://docs.python.org/3/howto/descriptor.html) ->> -endobj - -5171 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 486.8214 225.16315 500.4834] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://docs.python.org/3/howto/descriptor.html) - >> - /F 4 - /StructParent 446 - /Contents (https://docs.python.org/3/howto/descriptor.html) ->> -endobj - -5172 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 466.3594 91.28214 480.0214] - /Border [0 0 0] - /Dest 4644 0 R - /F 4 - /StructParent 447 - /Contents ([60]) ->> -endobj - -5173 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [169.31615 439.0354 268.16214 452.6974] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/38765.38821) - >> - /F 4 - /StructParent 448 - /Contents (https://doi.org/10.1145/38765.38821) ->> -endobj - -5174 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 418.5734 91.28214 432.2354] - /Border [0 0 0] - /Dest 4644 0 R - /F 4 - /StructParent 449 - /Contents ([61]) ->> -endobj - -5175 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [249.25314 377.5874 370.09915 391.2494] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1028976.1029004) - >> - /F 4 - /StructParent 450 - /Contents (https://doi.org/10.1145/1028976.1029004) ->> -endobj - -5176 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 357.1254 91.28214 370.7874] - /Border [0 0 0] - /Dest 4645 0 R - /F 4 - /StructParent 451 - /Contents ([62]) ->> -endobj - -5177 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [483.31345 343.4634 524.4094 357.1254] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/s12243-008-0072-z) - >> - /F 4 - /StructParent 452 - /Contents (https://doi.org/10.1007/s12243-008-0072-z) ->> -endobj - -5178 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 329.8014 191.08514 343.4634] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/s12243-008-0072-z) - >> - /F 4 - /StructParent 453 - /Contents (https://doi.org/10.1007/s12243-008-0072-z) ->> -endobj - -5179 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 309.33942 91.28214 323.0014] - /Border [0 0 0] - /Dest 4646 0 R - /F 4 - /StructParent 454 - /Contents ([63]) ->> -endobj - -5180 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [378.28314 295.67743 499.12915 309.33942] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2489837.2489840) - >> - /F 4 - /StructParent 455 - /Contents (https://doi.org/10.1145/2489837.2489840) ->> -endobj - -5181 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 275.2154 91.28214 288.87738] - /Border [0 0 0] - /Dest 4647 0 R - /F 4 - /StructParent 456 - /Contents ([64]) ->> -endobj - -5182 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [196.81615 247.89142 312.88815 261.5534] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.jss.2016.04.008) - >> - /F 4 - /StructParent 457 - /Contents (https://doi.org/10.1016/j.jss.2016.04.008) ->> -endobj - -5183 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 227.42938 91.28214 241.09143] - /Border [0 0 0] - /Dest 4648 0 R - /F 4 - /StructParent 458 - /Contents ([65]) ->> -endobj - -5184 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [147.31615 186.44342 268.16214 200.10541] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3426428.3426922) - >> - /F 4 - /StructParent 459 - /Contents (https://doi.org/10.1145/3426428.3426922) ->> -endobj - -5185 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 165.98138 91.28214 179.64337] - /Border [0 0 0] - /Dest 4649 0 R - /F 4 - /StructParent 460 - /Contents ([66]) ->> -endobj - -5186 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [260.94614 138.65741 377.01813 152.3194] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.jss.2012.02.018) - >> - /F 4 - /StructParent 461 - /Contents (https://doi.org/10.1016/j.jss.2012.02.018) ->> -endobj - -5187 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 118.19537 91.28214 131.85742] - /Border [0 0 0] - /Dest 4650 0 R - /F 4 - /StructParent 462 - /Contents ([67]) ->> -endobj - -5188 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [226.07614 90.8714 324.92215 104.53339] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/73560.73566) - >> - /F 4 - /StructParent 463 - /Contents (https://doi.org/10.1145/73560.73566) ->> -endobj - -5189 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 464 - /Tabs /S - /Parent 1 0 R - /Contents 5190 0 R - /Annots [5157 0 R 5158 0 R 5159 0 R 5160 0 R 5161 0 R 5162 0 R 5163 0 R 5164 0 R 5165 0 R 5166 0 R 5167 0 R 5168 0 R 5169 0 R 5170 0 R 5171 0 R 5172 0 R 5173 0 R 5174 0 R 5175 0 R 5176 0 R 5177 0 R 5178 0 R 5179 0 R 5180 0 R 5181 0 R 5182 0 R 5183 0 R 5184 0 R 5185 0 R 5186 0 R 5187 0 R 5188 0 R] ->> -endobj - -5190 0 obj -<< - /Length 5269 - /Filter /FlateDecode ->> -stream -xœí]Y“7r~Ÿ_QŒ½jÒÄà.€¢È奰ÍU˜\Í“Ž°‡©¥Ãʳ­ï¿wTuU™HÝU$7Âû2G7 -@&®/?df]<¾Ù¿wõfß=xpÖu�÷û«7yûs÷ÃÅå‡ß~>úî÷×û¿ýö¶»ø—·W?¿½>ºÿyõËûë«ýû×gvOž=={þíÓ³‹ï~»ºžjûöé¿>ëøüíÿœ‰Žw¼»'ºž3g­Ð]¯=“Êéîͯgox÷æ¯g¼ûë›ë³'—g¼»¼9»xÇ;!ºËwááá×å¯g?|ù#çüÙðC ?ôðãùî§îòßΞ_ž½¢{#ˆÞ®˜WRè úóã»]çy7þ}>~À¹Ýu÷„4¬çN«î˜bòð•4…š&Éä|*%m¾´«4xw×ISíÖãÃWjjHqø{éîá÷u¾¢W»N¨I w¡dï¦v ü-{Ôî¨�[ã?¯KšSb׉©ù²–_Ý E�óîÇe˜P)¢6=(�¬Ó*Wx+_ÏCªá;do¸8hç:ŒìŸ—Š+‹Eýéêú—îË·×;båh§XÏ}ÛÂå…3K¿Ÿt¤±çÁy7üìv�˜D:6vPýá‹×5áTM¸x[P†™Þž.#:nd†|z¦ñüÄ<óDøöö<§£E7ME±ì`‚*ØPMašÐ‘äžy§D“Š*;ç²OLc­“•yØp–�iNEÓÔ­T“ÙØæÉ­À¾3×d=e4“–î+ûè—&>C¦½î™d5¯‹7q%Ký+ Œ¤¬œ%߉¼É?vwש¥/‹¾ûøÐ8´z+_‡ØuƤ{m,åŒXf„2—’ýpJepZI„u¾cA1 lœ*(S-�Xˆš]JÕ÷c ¨à‚i#·óTÙàaž>3ê´ðüŸ×ã´%¿Þu÷ gNrïfM,˜,[â˜-ñz'J� =Í>Gç ÿ˜šèJú…ëXNk>+ [¥µgÆñÆåW>¥K2æHY$ý1€Ä(fí -²ñn@%ã’p1—–`­™Fa dŠHÖ â¶ÐPËŒ]‡‰0}v ÂÙiOœWU?�!9gR ”NƒFŽA7 )ç~lÉ­d|à ¸Î,û™d‡:�W›’‘îfr±¦ðüMÍú~„ðÃyUá¾xü*Åä°ìÖŸ¾¶éô•¼²$ÖvŸ«÷”d^+£%¼˜™©ðøpѱ±PX»®Ÿô:_mr݆¾—©i�²)G¶9c„óµE8}E™Œ6 @ÆE™yA“]Ø9bùÁ94ª^ph6g:Q¤ Qi¸ŽÒ'·Ê0™mCò -b·…<³ŠXZùñ9 -dÇ-i±o�“ËPgéx ¤8挞ýÿ‘;{ìæpgÿàÎ6çΤ w6‚8h:g±^({,{¦!{öh{öLê2{¶ZÝíìYüÕýÌísÄ–KO¿ïW姨$­Õ̬�.³&m Úg˜›8Üõmо/o!«;qb±ÛÞBç4û‘WÀÖ2®ÅÂ8…íù&j'm”—ÒÂ+a�>“opì¦`qfܽÎáûç| Ï"g¾ùùE©í9Ø,Òúîî:WÂ÷  töE -­Û÷Š8PÎ2mÜ&“ë5é)vY¾t÷eä3;„߉-lP#@Ûh*/êðÌM&"ž5MúÊ:íëÍ8 à‰ü’:znÅÊxI:ÂSj¦h€××�´úí×ïäq1c×SV,9Ýææ« Aݬ�Lz­ÕÛ¾oÚöUÅÑz}�ò …àŒ‹^»É*~ºë|.Óx1Wà- $È3u”ݲ“B&­0ñuÊÔ’n´�´ªo<ñ>N£�}Z[×í|µÑ]MI´H -ヺ×Ó-¼WRŽE©¢àÿ�—9õŒ–8E篙p]�—§ÿ=ݬæyˆÀ RòS‡×:Ñ<¬­aYYêgVI˜òþºØÏ>žó + )Ñ3­�æ³»Ø2q¾nà³ÐçÐYªê_.…`Ü:mZù™Ø,¬ˆ„¿ÀŠ\*\ôK†`KZ(#V`…ÒÖñfƒ®{Ú¥ÏTõIE™àÚzfz'ìú…Ÿ-kb1Òg‹}OšûcIi‚uQ_‹ç#óýJ"½‡{t$9sà 93W»-?£(‚@rÍŒrÂl Œcù™QÚEþ@S¾>o(é«BS4„’†)§‡qºÐM¤ŒrExÎ3|Ræ~:¯{k;„/>µcÊ; ®=ohÓ:5�Ò븂…Í`ÆæH³šòÜ�A %S&8àpWGÆÀZ2‘…ñAJS;°šµÄ¬íÓÓ:š²f5¬÷rÀKk§ç‰´N��˜YâÖDÞ·¡’óФªµŠÍ­�gN¯ ptÂÃÐÓ�Z;³ÉzÜuP'3(Z–¶è<©�R\µEÿåê­Ue0×v(Ù%Œe^roRp[³ý”röz �4h×Ñ„&/õªL¯ÀÒ$ßzè*R•�2©¥uLX9àÇÓ%l"LñþoŒë|Ì֣׃N«ðÕÔl‘µ=ÂN¼Ê2É÷0ͅ‰�t¶ŠJh,œnẒ >Tâ�qpRÌ}¤—Ñ9öÕˆ¼Ž(7C™;¤äþ.Å{ƒ—T�S7­¼ÃKG®z…—v š7w÷°Á�3Õ oñ|ׇ‚FT Bã- -nNÕBÕ»ÆêZ¯ÜjÞ3¯6r9é¢s@ä|Dä>7e´ä¢ŒŒ;™°+ -Ì4mׇ–Ýñ“&�7ÄLýþÒ÷Œ[kMË.o|¬‰Ô—({ã£ÒcCÌ>G<1‡æ*ÔudLs�ª äΟε�#MÕ>�¾òšÉþïÒ@çnp?Zü‚Ò°TâSɨù�l$•UÌÆ–2ªþ#XʉK•ýx–2j[ÊÕEW僌”¬·B—\\ïã7û߯þûòíÿî»ß<ÿæÎ?{8W\Y›Ë z°I¾}Zêº=f¿pœY±‚Ê:�n0¤Ñ-=S¾M=;2F$ÓqRZÂè²<ä%¼ÑÀÛ¦$cµ‡ôŸFm¢©cÝ@”FH+ƒ“äeCŒG[ÞAC™øªçŒû!°e…äM&¾-šøÊr& ßÄÄŸôS5òmÅÈ_ݧ$~ZJy ÙÂMFjå)"�h|o½¤ß%j¬% „¥³Ùq¥i$Gè0k¯óµ¼ŠòäÍOÚf)»ŸÓMÞjºª‚#wuÖGN(Ô˜2ضðŒ¡ÙÈò›B¹Ðêvˆ8Ôì ‰Ë_T‡²âl œgÚºÕÖapÚö¾É“†½î§�ë­ºßs}lä¼{nŸJßǾ8U ˆbHö 4Ùµ¾˜Qhˆ~çÜj±�ak› [_I)´¾G9ËÖ3«–[â°«`oà&\gO\Âã/¡…›~O¸�Ì,˼é™Ó[?äy‹ÈpHüSŽÄÔ-¬²h`£¢Éµü~¤áVÆÂãqw=Ÿë+‘n�ô§Þ|7»,‰Špèýô³<©á DßÎÍÃZSèö¡)A|0úkk±B2 c˜Òz•YÚ�y ]’€”­†õÜI^Lo•jÌnÕ2@4À+t:‘8«”#:é}†ó(Fb—2†�ÂXøj´ŸÒšYédÓ,ù(÷LXsi^h¬Ú­î™Òi™µr}ø¨€'ó¹žI©xÛˆ‘{JØvÏ„gvv¯ Y¹;Ò¬“k윜Ûþé–±7žÐë?vz"›IîaÒ€�m@<li9ózÄ�ëõüÑo¨@ëG™OÙ�«Ú 0{Æ…j•6š½àÅL!“r“̶wk ^ À\Ý£‡Qjͤ¶^ÇYg p^œ Dõ/^PT‚Pä8ù‘³x]sŠÚlI´rª8Ÿ1ýÞ¦ò…QZu Õ'¥k×Kè� ؽåºá=dé§ÎUI©Ýý3 6¿Û6“'Uøñ¯§çÕ7a/õ³½ŽõúBû\74Xé .Qº¡©*­ÃmO¼gƸ"áPV› -.„™0ƒ¾gª÷süeéž–üôoÂ͵¿Å=ª;aòá÷›¾—n:L¿LÓï6øIÞÇ"8éß{fuïšÖA»Q€çe·Ã2¹WÓÖŪ\®{Åœ·+Œ�ïa:N:&efõGÚ!TóÅÇäã'ß»"-ãý€Wëê>~”qœÑ�^Rß6ˆG¿aE3/¥0kÄûrìÂæ�oöïß]½ÙÏùŒöû«7yûs÷ÃÅ“ûý‡_>ýî÷×û¿ýö¶»øæÃ‡ýÛ›á£Ëñÿ—W¿¼¿¾Ú¿ÿpM&¶“L¨ÞuF0/Œñ'ÉAíPuÿ [m -endstream -endobj - -5191 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 91.28214 759.87537] - /Border [0 0 0] - /Dest 4651 0 R - /F 4 - /StructParent 465 - /Contents ([68]) ->> -endobj - -5192 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 732.5514 207.66214 746.2134] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/2.161279) - >> - /F 4 - /StructParent 466 - /Contents (https://doi.org/10.1109/2.161279) ->> -endobj - -5193 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 712.0894 91.28214 725.7514] - /Border [0 0 0] - /Dest 4652 0 R - /F 4 - /StructParent 467 - /Contents ([69]) ->> -endobj - -5194 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [266.44614 698.42737 377.49115 712.0894] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1006/inco.1994.1055) - >> - /F 4 - /StructParent 468 - /Contents (https://doi.org/10.1006/inco.1994.1055) ->> -endobj - -5195 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 677.9654 91.28214 691.6274] - /Border [0 0 0] - /Dest 4653 0 R - /F 4 - /StructParent 469 - /Contents ([70]) ->> -endobj - -5196 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [152.81615 650.6414 232.41214 664.3034] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3428194) - >> - /F 4 - /StructParent 470 - /Contents (https://doi.org/10.1145/3428194) ->> -endobj - -5197 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 630.1794 91.28214 643.84143] - /Border [0 0 0] - /Dest 4653 0 R - /F 4 - /StructParent 471 - /Contents ([71]) ->> -endobj - -5198 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [333.17215 602.8554 412.76813 616.5174] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3527320) - >> - /F 4 - /StructParent 472 - /Contents (https://doi.org/10.1145/3527320) ->> -endobj - -5199 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 582.39343 91.28214 596.0554] - /Border [0 0 0] - /Dest 4654 0 R - /F 4 - /StructParent 473 - /Contents ([72]) ->> -endobj - -5200 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [129.48514 568.73145 238.49515 582.39343] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://effect.website/) - >> - /F 4 - /StructParent 474 - /Contents (https://effect.website/) ->> -endobj - -5201 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 548.2694 91.28214 561.9314] - /Border [0 0 0] - /Dest 4655 0 R - /F 4 - /StructParent 475 - /Contents ([73]) ->> -endobj - -5202 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [215.53815 507.2834 344.51315 520.94543] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.entcs.2018.11.009) - >> - /F 4 - /StructParent 476 - /Contents (https://doi.org/10.1016/j.entcs.2018.11.009) ->> -endobj - -5203 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 486.8214 91.28214 500.4834] - /Border [0 0 0] - /Dest 4656 0 R - /F 4 - /StructParent 477 - /Contents ([74]) ->> -endobj - -5204 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 459.4974 183.52814 473.1594] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3341714) - >> - /F 4 - /StructParent 478 - /Contents (https://doi.org/10.1145/3341714) ->> -endobj - -5205 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 439.0354 91.28214 452.6974] - /Border [0 0 0] - /Dest 4657 0 R - /F 4 - /StructParent 479 - /Contents ([75]) ->> -endobj - -5206 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 411.7114 183.52814 425.3734] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3563319) - >> - /F 4 - /StructParent 480 - /Contents (https://doi.org/10.1145/3563319) ->> -endobj - -5207 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 391.2494 91.28214 404.9114] - /Border [0 0 0] - /Dest 4657 0 R - /F 4 - /StructParent 481 - /Contents ([76]) ->> -endobj - -5208 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [469.68445 377.5874 526.60944 391.2494] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/https://doi.org/10.1016/j.tcs.2023.114063) - >> - /F 4 - /StructParent 482 - /Contents (https://doi.org/https://doi.org/10.1016/j.tcs.2023.114063) ->> -endobj - -5209 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 363.9254 245.68915 377.5874] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/https://doi.org/10.1016/j.tcs.2023.114063) - >> - /F 4 - /StructParent 483 - /Contents (https://doi.org/https://doi.org/10.1016/j.tcs.2023.114063) ->> -endobj - -5210 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 343.4634 91.28214 357.1254] - /Border [0 0 0] - /Dest 4658 0 R - /F 4 - /StructParent 484 - /Contents ([77]) ->> -endobj - -5211 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [152.81615 316.1394 232.41214 329.8014] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3689750) - >> - /F 4 - /StructParent 485 - /Contents (https://doi.org/10.1145/3689750) ->> -endobj - -5212 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 295.67743 91.28214 309.33942] - /Border [0 0 0] - /Dest 4659 0 R - /F 4 - /StructParent 486 - /Contents ([78]) ->> -endobj - -5213 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [373.59714 282.01538 481.69415 295.67743] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.5381/jot.2008.7.3.a4) - >> - /F 4 - /StructParent 487 - /Contents (https://doi.org/10.5381/jot.2008.7.3.a4) ->> -endobj - -5214 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 261.5534 91.28214 275.2154] - /Border [0 0 0] - /Dest 4659 0 R - /F 4 - /StructParent 488 - /Contents ([79]) ->> -endobj - -5215 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [285.91614 234.22937 406.76215 247.89142] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1146841.1146842) - >> - /F 4 - /StructParent 489 - /Contents (https://doi.org/10.1145/1146841.1146842) ->> -endobj - -5216 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 213.7674 91.28214 227.42938] - /Border [0 0 0] - /Dest 4660 0 R - /F 4 - /StructParent 490 - /Contents ([80]) ->> -endobj - -5217 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [152.81615 186.44342 268.88815 200.10541] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1016/j.jss.2012.03.024) - >> - /F 4 - /StructParent 491 - /Contents (https://doi.org/10.1016/j.jss.2012.03.024) ->> -endobj - -5218 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 165.98138 91.28214 179.64337] - /Border [0 0 0] - /Dest 4661 0 R - /F 4 - /StructParent 492 - /Contents ([81]) ->> -endobj - -5219 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [264.81815 138.65741 363.33414 152.3194] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/BFb0053381) - >> - /F 4 - /StructParent 493 - /Contents (https://doi.org/10.1007/BFb0053381) ->> -endobj - -5220 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 118.19537 91.28214 131.85742] - /Border [0 0 0] - /Dest 4661 0 R - /F 4 - /StructParent 494 - /Contents ([82]) ->> -endobj - -5221 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 495 - /Tabs /S - /Parent 1 0 R - /Contents 5222 0 R - /Annots [5191 0 R 5192 0 R 5193 0 R 5194 0 R 5195 0 R 5196 0 R 5197 0 R 5198 0 R 5199 0 R 5200 0 R 5201 0 R 5202 0 R 5203 0 R 5204 0 R 5205 0 R 5206 0 R 5207 0 R 5208 0 R 5209 0 R 5210 0 R 5211 0 R 5212 0 R 5213 0 R 5214 0 R 5215 0 R 5216 0 R 5217 0 R 5218 0 R 5219 0 R 5220 0 R] ->> -endobj - -5222 0 obj -<< - /Length 5118 - /Filter /FlateDecode ->> -stream -xœÕ]Ys7’~ç¯(åµÛ -‚¸Y¢‡:3¶#�ù°–HšòhbMy9íˆ�¿QÕu‰ÄÑ�¢<óÒMváH$Žüò@ÖÙÅýöÃû«›m÷ôéQ×�]l·W7¿ý¹ûñìòão?õ?ýðûõö_¿Ývg¾½úùö¾ÿérøÿÍÕ/î®¶>Þ�ŸwÏ_¾8zõúÅÑÙ¿]Ý�­½~ñ——�žþïëhG»SÖJ¬ÖLvF:Â…•ÝͯGg7´»ùçíþyswôüòˆv—÷GgïiÇXwù~©Ü]þzôãï(¥/ûݸþãÕæ§îòÛ£W—GoqjB £‚8Á™\�žïû�“þã¥zÓ�ZF$¥FwÃãw”Ëáû~Ó15ÿÆ6�˜þ»3›ÎÐñ·»dƒo7c±Ç»RB�o½é¸×ר¿ÇRÌ$û¸ê?ˆOœ a#se•läѦ›èôˆ@946ʧƦq°…3 ïèÀÏc¿È@ï»»eÔ›{+¬ÞÿõýÕÝ/Ý·wd©Ή‘V×,–](ï(Ã÷v¥7ª»€ï7ŸX7N+E`ÔkMœqʶ¯óÌ’ì6�\fz^„¥�ÁvˆBãËrصœiq`ì×ÅöÂí’nïlnî»…Ðm©ù¡À“ùc¦W¥0�²p` E”Ñ I¹ûmØŸÕ¨0¹"‚ |3}Ë4žx,_~øúÆg®WNû[l÷t8ªž”F¥‘QqjˆÖ¼mTàN6Ýå?2½›¬Ìdа~îÛeæ“*™i K°•(3¹$Ö8Êm(Ò%B‘6 ÐE0ÜÃm -x;“±lƒñx^δ®“�ýêK\Œí¨=õ¤×T2, B”GSáY4Ç…þä¡ tXÇ _íÓõÈ?È'Ž c]QÆ+ÝH]³²JBVL³0~sé‰Ùé\Ѐ¿»yx?�È/;¶s�ÍÀ4ÑS—,YtÑ¡NŠ®"òÅ€¸¢‚hÅoßÅ™íU…Jä—�;eD*Þ*hBY±Œ lš+xA…¸X*ÈåÏï€ØÂ(pâ ë³Qž3މ>­‰”ƒôY‡ÏP =hOž‡JÊqÌ|Œ°Õ®,ÌÆéS-î’øLæD¾¶”8GE¾™YRV“U~·5ô:Üü„ ®˜ØÏò�¿/i‚×ã¶c›ît.1üøßÁ <‰Ë‚Ò ºgžÒ�&òÝÈñ€¢¥_ŸôQâïGE -P~ž§õ¢ŽªS6ãBâ4Œßi²¬5pýó¥ù@ &5êL!¨dfÀ¤Áÿ(šÜuöYš¬ûüˆ°*×ùY �ÖgƒQ—ö°.ìamˆàV˜Ý1·O¥!Fj!fØY=š�æÍ:~s.Ü×Ô@{«˜„Â@À§lgÓÚŸU…ak,ûFÓ €ùXùèÌL ;sgˆVÜÙªÙ̓g2›šóÓ„6‡iç"æã—›N.L‹m)›éeZòÃ3ˆ‚Ç%—¤ás”ïÚ4ENc:¯äœp-ô;Ç7Ê+íg €‚ØâN[Î@Ñ‹ùcÚ,×·‰ô”Èj#s…£H ¢u“kØ¿ŽÿYsL‹bŠË4S+ $cî¦XÌðX.Ó>ØL|V ¦TqÁ‰d½™«a4U —ó,è‚pÚjç2 OЍ—‹Â2m¥¢ÞSÆ)¡ÌQƒÃ^øüSã^ØøÂb«#_Ø-pî5Ùþjs(”~¼È¢Š‰ -Âr¨‹xƆåŠÏsæÁ›¡‰/ýƒ,7Ð=�w¦•‡ÂÖõÒ„|"š9¢d‹‰"¿"¸ ¤å8f®<çÆC,) ¶AŠ'üe®Ö®áÀ82OËÔ·ñ''ÔŸƒvÜÇHÑ=®�Eêœo9¦¿?U"À“*;–bÿqÃ<`Iy'û—<>ȳ­Jªƒ4¢µ\ÕìŸÕ40ðŒæP . Ð?!¨"ÖÒáZK»žÂ1O!3‚HjYÕ8kõ”ZͤÿÖ{Úγú†Ç[Ð"ùS†ûVÔ�©ƒB ïQ3›÷DýÁX^É€%Åñ`ú˜dœm™hOîÙ˜0e‘¬5&Ìø )"Qð.5Ó”‡]>Ü2–¡\5fû,Y÷qòÉ;Ê{NqÎy?¢RÕÇòóé6#:å�€¡q v‚ÁGiU&2¨ñ\³T¡t3„NV™z8V�årNºGì Û£ -�'1™Šáó‰Ú3^`‡_NÑú·$/=gÀ\gȰ:^gy¼7�ûìüø¿YÚͼ/nPÌT úh<ÍXv{úM]Ül¿úŸËÛÿÛvO¿yõÍ7”^¼<Ÿ®9ÙzŒ¹;Ü^¿ÈQ[0$(ÈQMö®dPFµP¨Å‘V±5h„výðtñ¢7‹Ï7k¶?Iy…Hè›C‘7E~¨¬TRŒp'¥XA,É:™Tðß´S„EVqbWÜí¸FT…Q÷I‡_؆Íwñ ³§”¡‚ž4ê³à:……w1ÛÕC¤×$Q̼'`ý(àEcöÛO¹ -}�z‘Îê Dy®f -=[bž&?Byijù;Ëa_ùêÏ OÓ´� À€Šsµè¥ó7±0D‹‡Ôµ3è¢aiÜä4ªO}К ´�áÁrãý¤@¦·à}ª00ÈpRêtä6ÃÌq Ìb"G…Õ°ÞA¸DÚG¦¼9ÂÏgpše^Ì`ˇA€Éšù0ÆY1š5F“è/ÃláX0Ù°°m-þÖE×|Ñ´$ì>š âLƒii6÷âÓ9QŸ˜Ö…ͽO—ZNÇ›‹1ÅzL»Š‹ÿ9ü˜iŸV™f^àÜ͸Ò5,ª÷žºÑ¢±(RZàC“ïq²å§Á-'•ötùò�!ôünêüV�ö{�é‡PyÔ¹>€F)d íƒHyèËË�з)„(Ó�õŒ|w ¡ºP PÉó›o!®S‹ŠZ¾™C '£DЖ;V�…s»xø÷ 2Þ]y1ÆKÔìɪ¶R‰Æ0E”°L­À•tü°<=(“] -�Ãt·T�ûHŽå‘Uö$ Z.Þ'’˜ýBHIm\©²¸J‘Óm¥uÄÊUQmϪT[Yðà6D"ÿü§dïêߺÞO£„-¾Øtl:'3…AoƒŠç¨K<ôkꤵ4VŠeKCå>§€%:%Á`ÅgáGŽâ·{_™òþG  ˆ:‰³j–_@Ø3`}F-�O>jzEGrL6‡Üˆ‚}ªÎéBˆ¿4š0Ûr!¨Ž‘é{u§RSÂ(µËÐaà­Nƒ¤v>x c(±²è{æÜ᜴5l]/,7ä@>,7,»^XnØn›»[bîn¡ÑÌT±vŸ¨Ü�ðڨܰÖë�[•™¨Ü°è3“Õô�33QÙN"Tó¤\§® K͉âüÓ9Í!î÷"C‹�² `¶‚(ÞÇY4Œ¥ -¾©¬Ã\JN¨^åvX�·\¼åÍA—Á)×Äj.¨ -Â+g¹œ=!œƒªt% ÚþjÓi$À”"¨-)ÑÇ=”é6Z ŠÁöS¦®½‡íë@Øóåš´½Ú2­—Âß`éÈã‚4@¬¤ÏØ@Ð`à áoQCHánQ�cÂË Q�±ÅHG)âÇÒNæ…�Ì-®É†‘�xÁ ± -Cx¡M©6Öáô¦DѼk ÑTYSÃ�ÕÐàM½�²«¡7ÐnzS˜Ö/8#Œ;·ÆZó÷1 ¼¾�Z±Ö-Ø4|EËAŽqn ¼,$'®*B«Øš¨¤[2IŒø„פ†uG \‹ÎC¿Ã‡Rý²¹€„“„›UîHé:èW@õÍAèG‰uJ2Íõúж�C?XªúÁÐ[ úÁ†ó2–†@1nm k#ù ±b¯§ö‚(’8Àpg‚…1Œ_zð>Ý ê);ø$kýbÎÔšîâª�›w´ùæK/R¨´¡].°2·�ÿˆÀJ]ð¹ K{'s^ ¬‚0Xí–ë1Vèøá¼ªY¯Z"”T¦†Åh„0Pç>ÌœÇT‡›îµæÃL6;êg¥(ÊSd>êÇã”p%VX}�& ¤À†•ž;W¦},&(1Ö’®IG�h¹R# -Õ˜ÓSjG´•R­0[8'FuRMÁg:$wU-Q5ÁuåÅH²Û²o÷½WzÛýeqRZpEna—Šhë˜jaVj×:‹Ú¥&Ò®rÃÉT¡vm -k§• $’\Q¢�fZ„WŽ¢3Ì÷ÁƒGq`4h”–úœý�l™2ø–Ã/’µ½L'Ç5Q×á¶¾+R•¦ÛË1Pt¢ú9=û8gGV ÐÌJ¿ØtZS}:ã·þ;¯EËfet“½9Ûc‡Iѹ¥BÚ|U2MÞ¾ÉÌö]iO—4qÁ‰åm™¡·zKŠr,¤1*4õÝùó·A2É�þC†Bö9ÑÆ²ú•v„Ýá‰nu1Ó-×–8Î�®™¬õ¢®çƒ‚¢ëÅͶ• ¦ -'ˆìý±í› p‘t×F•@'¶SÒñAÉÃìÉH sr‰ï°`Ž0Ýv; A‡‘ñÖðlN¯F²§µzyŸÉ¢ÀÕ]ì7"›Ð«e(U¸×dÓØrg‰¡| Ü[÷¶SðC4­ÕÂÉ ,c„ágì¹FœÂ ì3>Ý$ È Î�_L!Ix–§‰È#5Pø"OêÓtBÿÕ‰(Í�ì�ŽrÐîå‡ñ§;:6a¿“…9�pѸs,ØNé -¡©³å 8Ó˜b¤£tý PœT5›+�i\æ¢ßb¸ƒ†ÅÒö¹�É­"T¶\æ—ÛæÓ}º¿ó_Á*1ž õÚ»»J)éõŒ ×p_Ü¿�3/¦ÀŒ:²À4Ê‹lBµ § £ŒU1æ! � ·:±8³*¯Ëï"ònÌ ¯üñ+,÷AÜCÀÌS#Œ Ê™U¦ ”ÅçmÄŶ‡ßo;Éðcx¶(èAˆ×.8³ø& ìKˈv’©T¡˲èFK¢Œ]%CDå‹y -Ñ[í%�…Ö„9ëØŠÀm7‡(²ˆ…O -‡…½¼õ¯óʧ(xÅ%tÖ¦Z>N%öI!¡D²QÔV1½ŸXGÜ'M�ôUnôäaSõqm 9€¸¢Ä1-슱•»LšpmäbUóra ©6üÈÙp|7л€÷1­�\¡½áõy&SGÔüþ™:¬,Zè#Ô0«ª¦ëÊÔ9%T€²i'@á� ->‹àÞ¥ûŒ‚£<ðºÙÕû¢¶ýœþѯ…²fFp3¸-cÓiØô¿�õ2ã“iÐûã YÂÍð�dÞ¤âõ -îä—_TZðpq*´å-@`~æPr$Ój”V'›žÖܪR¹ü€þÓ㺌 -½øµøvõÁQ¥¸5U¼}ãqÄ:KCÞΫÜß Lx( X�§M$N¿O6EÃL¬¿+kr‡íÓ0z·8}ø 2a’‹56C�;`¥§=¬4,€Øq9énGšË¶”~‘<¶¦láLoéƒwqŽ -1¢Ì:"µm²9D©(ç¾SY¯ü -C9$˜õ¯àèÌ¦Ž -^H?ü¾`Œ0ª¡È ô}ôÚkm#3ªà²ËÞBcÚJµd+ÀåÊWu¹Bô[;IÑ.f½w� Áä¿^´ ÄA©|I¥±ǘ–ÄR­uÕ8 .JÿÞÆu0ålØN�*úÀ šy¶¸¼JÀ^2¢-o{—÷dHÜÕXdO|øá/î ¾AÒY³¯5䝸zQšÆú�{5]„Qô:Y�ÂØ€¿ÛÙŸVF†�åÞ÷ó©ûño,é-F4]¦Z-ˆ²Çö C«R-ÍëœÎ[“›¹½ÞÆhI»h%*V.tߢ›äÐ�ÊÅ]ºE_QÅžÃÌX\ñL›ÈËuÃf_×u;çQ˜ ~Ÿ,Ó!–; 2;¿¦á¦[¹ïÒ`™/<¢KN²<´|r_Púýro/CSi%&„Á¬Tñ´@ÄÓ&‡Ícù>öPR -ï•gÔ¥lƒ®y±fÔŒ3„rêœÎ†Í€RµZìëœFõ|€FÈhÙ~ψrŽê*Æ·j„ƒ¦¢UDªÜ·©ŸVUŒºÿTÊìW,±= u ÖhUØ~ -WÛÅýöÃû«›í”Of»½ºùûíÏÝ�gÏ?n·ý©ÿõ‡ß¯·ÿúí¶;ûæãÇíí}ÿÓåðÿ›«_>Ü]m?|¼ÃV¥ã„ c;ňcJ¹ƒƒ]¬CHúÿÿj -endstream -endobj - -5223 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 732.5514 248.90114 746.2134] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/3-540-45337-7_18) - >> - /F 4 - /StructParent 496 - /Contents (https://doi.org/10.1007/3-540-45337-7_18) ->> -endobj - -5224 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 712.0894 91.28214 725.7514] - /Border [0 0 0] - /Dest 4662 0 R - /F 4 - /StructParent 497 - /Contents ([83]) ->> -endobj - -5225 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [382.00113 684.7654 491.84714 698.42737] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/508386.508404) - >> - /F 4 - /StructParent 498 - /Contents (https://doi.org/10.1145/508386.508404) ->> -endobj - -5226 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 91.28214 677.9654] - /Border [0 0 0] - /Dest 4662 0 R - /F 4 - /StructParent 499 - /Contents ([84]) ->> -endobj - -5227 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [401.52615 636.9794 511.37213 650.6414] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/976270.976273) - >> - /F 4 - /StructParent 500 - /Contents (https://doi.org/10.1145/976270.976273) ->> -endobj - -5228 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 616.5174 91.28214 630.1794] - /Border [0 0 0] - /Dest 4663 0 R - /F 4 - /StructParent 501 - /Contents ([85]) ->> -endobj - -5229 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [266.72113 589.1934 376.56714 602.8554] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/378795.378798) - >> - /F 4 - /StructParent 502 - /Contents (https://doi.org/10.1145/378795.378798) ->> -endobj - -5230 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 568.73145 91.28214 582.39343] - /Border [0 0 0] - /Dest 4664 0 R - /F 4 - /StructParent 503 - /Contents ([86]) ->> -endobj - -5231 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [147.31615 527.74536 268.16214 541.4074] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1040305.1040321) - >> - /F 4 - /StructParent 504 - /Contents (https://doi.org/10.1145/1040305.1040321) ->> -endobj - -5232 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 507.2834 91.28214 520.94543] - /Border [0 0 0] - /Dest 4665 0 R - /F 4 - /StructParent 505 - /Contents ([87]) ->> -endobj - -5233 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [125.31614 479.9594 204.91214 493.6214] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2629460) - >> - /F 4 - /StructParent 506 - /Contents (https://doi.org/10.1145/2629460) ->> -endobj - -5234 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 459.4974 91.28214 473.1594] - /Border [0 0 0] - /Dest 4666 0 R - /F 4 - /StructParent 507 - /Contents ([88]) ->> -endobj - -5235 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [378.18414 432.1734 522.3831 445.8354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/SANER.2017.7884621) - >> - /F 4 - /StructParent 508 - /Contents (https://doi.org/10.1109/SANER.2017.7884621) ->> -endobj - -5236 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 411.7114 91.28214 425.3734] - /Border [0 0 0] - /Dest 4667 0 R - /F 4 - /StructParent 509 - /Contents ([89]) ->> -endobj - -5237 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 377.5874 91.28214 391.2494] - /Border [0 0 0] - /Dest 4668 0 R - /F 4 - /StructParent 510 - /Contents ([90]) ->> -endobj - -5238 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 343.4634 91.28214 357.1254] - /Border [0 0 0] - /Dest 4669 0 R - /F 4 - /StructParent 511 - /Contents ([91]) ->> -endobj - -5239 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 323.0014 91.28214 336.6634] - /Border [0 0 0] - /Dest 4670 0 R - /F 4 - /StructParent 512 - /Contents ([92]) ->> -endobj - -5240 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [444.26346 309.33942 523.85944 323.0014] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/3763067) - >> - /F 4 - /StructParent 513 - /Contents (https://doi.org/10.1145/3763067) ->> -endobj - -5241 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 288.87738 91.28214 302.53943] - /Border [0 0 0] - /Dest 4671 0 R - /F 4 - /StructParent 514 - /Contents ([93]) ->> -endobj - -5242 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [188.03815 261.5534 297.88416 275.2154] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/224964.224987) - >> - /F 4 - /StructParent 515 - /Contents (https://doi.org/10.1145/224964.224987) ->> -endobj - -5243 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 241.09143 91.28214 254.75342] - /Border [0 0 0] - /Dest 4671 0 R - /F 4 - /StructParent 516 - /Contents ([94]) ->> -endobj - -5244 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [376.65515 213.7674 497.50113 227.42938] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1065944.1065952) - >> - /F 4 - /StructParent 517 - /Contents (https://doi.org/10.1145/1065944.1065952) ->> -endobj - -5245 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 193.30542 91.28214 206.9674] - /Border [0 0 0] - /Dest 4672 0 R - /F 4 - /StructParent 518 - /Contents ([95]) ->> -endobj - -5246 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [385.25714 165.98138 495.10315 179.64337] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/165123.165164) - >> - /F 4 - /StructParent 519 - /Contents (https://doi.org/10.1145/165123.165164) ->> -endobj - -5247 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 145.51941 91.28214 159.1814] - /Border [0 0 0] - /Dest 4673 0 R - /F 4 - /StructParent 520 - /Contents ([96]) ->> -endobj - -5248 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [428.20114 131.85742 518.6981 145.51941] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1147/rd.53.0183) - >> - /F 4 - /StructParent 521 - /Contents (https://doi.org/10.1147/rd.53.0183) ->> -endobj - -5249 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 111.395386 91.28214 125.05737] - /Border [0 0 0] - /Dest 4673 0 R - /F 4 - /StructParent 522 - /Contents ([97]) ->> -endobj - -5250 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [319.92813 97.7334 415.92514 111.395386] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1147/rd.176.0525) - >> - /F 4 - /StructParent 523 - /Contents (https://doi.org/10.1147/rd.176.0525) ->> -endobj - -5251 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4366 0 R - /f1 4360 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 524 - /Tabs /S - /Parent 1 0 R - /Contents 5252 0 R - /Annots [5223 0 R 5224 0 R 5225 0 R 5226 0 R 5227 0 R 5228 0 R 5229 0 R 5230 0 R 5231 0 R 5232 0 R 5233 0 R 5234 0 R 5235 0 R 5236 0 R 5237 0 R 5238 0 R 5239 0 R 5240 0 R 5241 0 R 5242 0 R 5243 0 R 5244 0 R 5245 0 R 5246 0 R 5247 0 R 5248 0 R 5249 0 R 5250 0 R] ->> -endobj - -5252 0 obj -<< - /Length 5388 - /Filter /FlateDecode ->> -stream -xœÍ]YsÜF’~節CÖŽÛ -ë>4²4”lÇîXŠ5ÇÜ[~ hÉ£‰uËËiGìüû  TUVÖ�(î ›�NÔ‘uå—W�_Ü>¼¿¾9tOŸžuÝùÅáp}ó÷w¿t?�_}üýçþѼ=üë÷wÝù¿¿»þåÝmÿèjøþýõ¯öׇ÷gÏžu/¾~yöÍë—gç?ü~½K{ýò?¾îhÿß«ëý¯Ýïö»‰ôÎXG;Ú=f£‚8Á™”�‘ŽpaewóÛÙù ínþyF»ÞìÏ^\�Ñîêöìü=íë®Þû×û�«ßÎ~úâ ¥ô åbø<¿Ñã7Êå®cª;ÒÜŸ1½ë8x6ÑSs|ºû¹»úëÙ7Wg—xçÖʼnrš©–î°rwöcsô®‚8ª�0c‹)åã§Ê=ó}ûìH$XÄ&ÊÇŽf‹xºë�ªä*`ãTÖø® ëÚú†ò‘ˆ�DBî:>×-TÜò¸ö±™ÚMÀ�±)S�•ÿé¶Âòn×É€c3tÿù P;ü¼ÿcÂ'¥w&ʹÓç#3‹fVì:3=+N JkŸ+©TÎÔÈãg¾[2¬aèÐwóc1ÿç߯¬=^ÙK„"Êè‹�r�õ‘û[(°rEÓl‹öæAz¾ûÉö}ÀxafNŸûñŸÇ£0ü™&áð9üù/_‘«u_"ÝçÒGٺë®þQ¨]!µJ¬xÏaý$9•÷_˜õM�º2W×¶ç‘?Ê‚õÇ5á’R~ü�í:¥’íkÚ`”/¡ g{¼kîs…¿¡œî:G+mÛÙÜ -}j™æò\’.V•mÈ£p÷V8hÐø<Û Ëþi8ã¦e'1~¦}{¿ë4Gä®ب„'@�Y"<®§>†G%Δi4TV|8n  @ädMÎéìx1|jô'Üã &ì’gqmd*Ήь—_XÒÅÍá�ëÿ¾z÷¿‡îé·ß|û-¥_?› -nÙ´zÆ÷­×/ �µ•Ý‚2"_s²Ås2™M{¿üÍ�×cî$œ:[ë*ãàªh@Yb¹ã¬¥›e0@9’‡&\нӄ�Öï4Ecy”[Þ¼E1–Êe–â}€5¦Ep›£+f"høûlÑTL EÌU‘��.�ëæ}Ôa™fqÍäkÞlÕØ;Ò#_F#´�*1aW�[š\ ‡£ÀÅq‚àc ã‰ÐoZÑÐuؾ…påmr.ÔÚb]¨�[ý¼3dl ÆÓcgdú宓cY:Þ—ÆJÒ�ë|þ3|}^å†Ì¹ D+ÎT _Z‘yÿù(@\ÆÊ”Ð&8+ž½ž#8¸ò?÷ÿ~žšô•µ˜†a¨KXN(eLlÀWÔ}3ªñ ô‚øðŸGä€Ä£žój?1ð&#VÖ´®V¡&KðEkC·Âl€_Λð S•}fu‹^Gsµß>51V y\V¯À¬>oÊ -PÄ%܃ù‘eßz”Ó“º¾�PR}[¡ž/‘˜žoËW(ZšNaD—´±Ž’WR­\ôéßb°èÙ«óìõC7 ‰|çÿuï6Þµ ñÜæPìØH§ÒÝ€� ƒ°(>1بMs»HJ(•«àÀf@çÿ'¼xÒ/¶ŸN˜1=¼¨óùËó…ØBÌx"¶om"8Å„kʈâzˆa¸‡Ù1ÎÄ”¨ªªGŽAQņ÷�éôÞ6A ΋P‚9¢ä -]¢G¢ IpQÙ¢Ö6hZ!–МHJ�wpž(ä¿ ·1Ä KHÐ -ø=kA%Æc¡<1J§%”l"u¬HIž¦‡ç¬öŸ>£C¬Î®Uf’\‚íGÄÃ7µ’GB�Ì"9PÁ_B!X@¦BȸHƒžve±\ËeíÀ—Êk-‹é¾äZÈ (×Ö¸ –ˆ=Tk×hA+2µ!¼—'m´—;&©õQŽ6�I¼a~àúŸz5³ -DNš+H0"_×]‰Ð D„Ž) -Ójž*a’-Î/t¢!Uþ f漕̻¢™ÇF/ÚMÆùíå¤I±RØ¢|%µM4¡Ö>Úxbëk3Ñ<˪ëÓD(.ˆU®mÅ5{¾ÕZbÊ‹_9N8[ㄇlÒó²{6Oç¯Âß~þS�ÀÙªÑ ½ò,2–€¶Ú1«4ךÞkþ׳¹]h÷ÎInþoѽ_]–¤ê¶Ä1h'Œ&J÷ª¢ýl×-‰ëÊ0b”ÞB\×Mâº`•Õµ¶AÐMç1ãt� ´—ö"7Ð^C9¤î©,R÷†Çô¾TC -É €”Pëæ+Ì…¦?„ÂZ$zjíy5±§Âãc½!o{ñyöw�D}}¹Z„%€ú«J LqÈGY§ÐÄKÀbÇ⬤+¼ñ¹”/-áFTêÆA -$†TnkðJ­øÍ*e uRè5faè¥ Šq#1¯/è$BÁ˜‘Ÿ#k)þTÌ—²9⌋¿;¼™tc1Ú¢†³„ä„r-š&Î=¡MÀ‡Ä†~/¢½˜62Z&|L[Â…p¤¢B*Tu$«zƒp�’H±Bq�ôÀoUfÛì€zБ¤ÎŠ ú9dðW ±Ò¬SÌ“Ÿló¦¬ó`,4çáÕ‡æ¼Lõw •ã*×CåÞu±61�aUo‘Õ-ó¯=r*�QX8¤bñò~–§ô`Æõ 5£O!DD—dQä‚nð)æ]¤¾«ŽLÅÉ@ JŒYíãõdÞØ¶Å©ÕH3„ݨ­Zß„SRïz&±Ù’%œ7�Cµß8>·„iÞ#ÇÓû݆[]·2Jµ[àVÓ„[%­Lâµ š ±ÁÊ“„jjËÂʘ`v’ŠÂ -'�8l¤õ¢Òˆ|ô'î9¿O‹¥·Ö OqÌ].Û„ -¤8�ñíh>~ÿrîvØ›èݙáöa‘Á�[S‰¤É¶+VùFß2a3š†(‰ Žo| XÔÑfØ)+Š$é4Ñr…"éT¨Ç,±’3-îë�ò·{™vW};“WF_<ÖÆ“WÝëŒ#ŽYË[ƶŒ&JÈ)éT?0Œ*Ò/¬ùaFFž#múO“)r¥ž+¶(fç^ -'r8Üi¬�©Ž êâ.QT³~A†èE[$=xièw¢wL—A´Qå‹;¯–Håa¨E³eJÊÊ–g9qv�ŸÓZYYªbˆúú.�•GvG–1�t“[žÄ  §’8Æ×õ§I–¦$K͉⛸Z¹6¸GººA¨å„Y¢”TnT[_Àõ'ìˆzãÖ¶/×R%’>#ñ­ÊEŒ¤E­™šK­{�— ä)Ä´ʹŒN{š :o‘TwÇ"ÔX:›WÍ;6V³U £™ÄÞZÃæ±¥ˆ”H�zØ0Ñ…Zì«^Òj ÔU¨´Äêº -0Ú‰-ªï¸sÄqê� Ýi�ƒ »Ž½U,y½ä+_n PÕpXÎQJ(ÑÂϪV[ÌÇÿ”¨qWØ||¡Ö„ô…OY‘ŒøÝx…�jRE{€íb¨aá_æ˜Ò¿; … ` XGÜ¿ÿ9SÏà Œ@…i[FiЪÞ�Š-°åH¡s«’ªå|Ô†¿»€ó`Nxð=�hs†^0 -µd[C„±¬©ßK‚0rn`G•i[`éÓþϰÚ�òG?Ô¦Í), ^ìö÷ {~Gjw…¡Ia,aVn2(ñ|îï÷m#ò Äé±ë˜�’ÖËòJfrÎ+؆4aUL€%™$FlâGö¤ ‹¨ŠQiuƒhÕàˆL�h>£ .Uûìûá´A~Žôµ³Zue¡¯£ù¶˜¡ -C qiµ8‘´ê|Ë^Æ…žQ‰,X©M�j ¯P”H¦µn™FËò�4xtǬ!¡ª2кÀy)úa»£wÔø´$Ä턇ºÏÅħuÆ-ª /K"Vû¨@jVD¬ê°©ÿvÇÁºÛɱU&¢¨Ì£{Q¶�måí4@ò Aã,°±C.¾…óíQ$XTÓÀÝ%ÉÕg‚·‘| 󮤱dƒ­j‚üø=® -ÕD�E÷ma)Ñl­ -ð¢Ü–w²bu[Ý ’¨»ì11–L2ÇÈê?kꮸœ^Û5)ª@îÆ4îç%£g_ª¢Þ8ƒ¥>Ä^áå6öRM4&H�A²’‚¹}Õ¦Û\9˜Šì¶¥QeehLMý®Ê“ÿ9tòO�L$sü´*ñoRA¥œV~†‰^ñ JsÜÔÖdÅ[hMœZã¡3µà‘ÅÁŒwçé`´»Ny£·Ùu–EÉñLtdå¢ß=j‰@ƒÍ®Ó0|¡TA}{ÅíYj"íZ/¥'¾Qõý¹b"\Ý¢Ä^2­µÀQ Αù'€� ³š »ó2=þjÅý/dÿ-;/»ê0Á²àº÷p—b‹y1¶°>3*€y}£RŒ§‰¡VNÃÝH‚˜¸VØè®oÈyòX�©¡ RZ–&³†o\fNÒc«ÐdÈÓw›R&ÉÊPæäšïå£T|ö}†æiÁõ\pà�Èw L"Ü 7ETƒ 0?'؈ÖQÁÞ‚Áñwþ;Á%JWáúeœ-…½»h™Ùâ#LÙÉ#¼äMH·r}Å–]Ÿª|F=�¹"Z;Û8»àÚ•¸å�w€Ä/=©ZpZ”IÌ‘™·êGxY¤¶ü…1¥O"ä—=÷¡ÔÕŠB)müRoÝJC„Æ4#RJµ�z‹ÙqJ ºŽ]ÿuÓD7´˜daMWšl†•Ä"îqte†l‰L8­nPp×Q(MHG˜Ó:Øä‚ôqÅK¢³(-¦$âêDÏ’”Ö'œb4Ù›fGt^R×!ÁÒ ‚Ë»I½„vcÖàåT8À‚Ÿÿ¸OJ›6CbRWè?ö8«EÄõ éð/öu1Õ`\É Qšé–µp_™Ÿ #R[¤(g_Ô6˜ySÑ“XYçp5Hv¾4¤Äᥗ†ä†b>¯. 1K2bqcû»W$_—+–ÃS3 âöÄ$aÂÆpÇœiÚà¾vÈû¥È€˜tÛ@bXxâÞ6 #ÎTî—PÚuà‰ƒÜ-’´m2ïMK¥1’ -�S’° -u„Zàþc0 ‰ä–ôεLðá °wX1 òñÃSdÏÒþˆd0ÊÕŒ<–*x–×øXI Åµ$ÊØ𦲷Râ˜ù+®¶uX2¨w¼µ„ -ËÔ½^ü0}zŒ¥¡»VŽð[í4j6v†X+{©aE§›…-šG¹”„±µ^IÞZ[E¶b]Ý BXGwSNq`@œS-s,ÓjTšÞP@¿ö0 ¼š;ù õ÷·ï½(ú`%ÆnRÀ!¦…c·(„yµ�DnzHŒ—½V¬æ‡�¹è¦\&e3'å&J+*•t:¨«.a^Ò ø^nö«d¿îo¨’jUH` ÿ–ÜÝcÞßk&,ç§£T[O4¤XaÈMKïíŽ?À äŽ?@Q¹ãrö¸§�ê“Û]„‚Eó §Õ.Ï7œ-c“ŒLF‡·ýÅÛfdJg|>!o®!¨$r/Fïü´X˜Û.Býý%Fޝ@ý˜wk¦ÿ“ 0>P�Þaj«*Ûð@aFœQ¬�Q[ÄŽ°Ì½ÌÇç!e.ÇTüYÉ#UÅbç3’ðW<ßzY“I±«•ê¡×z£ièˆ; W–pFdÕ~c�S:CÔpyâš~·¡¯bŽ&æ4‚®°ŒyøÕæãâ*IšÖ·Ø•%Rj=­¹“%ö|‘L¨×ð;­üþªò{zÅHþºuø.2¿ÓL®7 L3ã·‡ùR£[c§ÏØ”‡y‡“òI–2Å€<˜ªÕg-­îÒÞy’N¹°ü ‹êIê**f9Ñz…cäŒe�8âáˆ4Ïr€Æ½Ço¤iÆÃéäëÅñ�&fgÁڗߤ^OÀ$4‘Ž9Ó2÷³bF (+&¨€¬ˆØ_Œ’‡RÑ ‹­QÉ8~º»ØaÅ›B2tPZ£Ó]ÕLîÚJµd+BöÚmMÙáxÞì_†í þ Ïã¾Àô¼ ºËanáüx§ -kãÙðä+pFá;³Ëjl¾Âì4x8ˆ�m6ù˜ãïb—ª;À).—£˜·Æn0 KqŠGñjøŽÒÑ]µ¿¨EÕ)¨`jU›ð‰+æÏbÒ%åÚ[ϽY­ŽO* ´Ö·F€sK¨²ý‘JgY4§s-†i$e_+Ø›‚k@š3þ|Äe¼9ÉJ,Û 2jÄq‚T(ç¥ôq”tô-#¶×° -ÚÞ@T¹'>¡o4öˆöÔ¡ ŠøŽ $!´™¶¶–\Õw­�E¥Î´­«¶DM*R†ƒ~»Ó|Ä­¦œšíOŞ܇—£KR1!‰µ\¸5¹ƒ22,&î§©Fa,ô mvέˆ#õ7¼|º>m0K%W”Úëœ[x½D¨k‰TÈêˆ3ñ' nðþÿ0ˆ”ÌÆÞ‡xh¿©tÇ(š—[Â)Ûf@jâ� <€âcèØ·á- àÁ˜×êýÓŒ¢‰ˆ˜%ÚY¶ª›MR£ÅèJÆ$‘œ®�¢½X×v7£•ØÊõMBnàŠN) ¯”Ëÿü -‹ ®-ñ¥ÌûlY—‰¢&¯ÌDzò¢è»O$&Æ-À³Š¦D§IM+R Tg]=�‘6ÄInš&àIPÌ¥ŒTÓ=A^':;H°Ñ‰ŽŒrÞVŸ�¶œõõ1´í¢_i ïGô«ŠàáH)1Ê®‰ØBhb¨‰Pèc3›ZyBS!1cAtÒ E§ÈÕWÌÂS�$,‰öô�ó¢¼ á‰avÁúl¨–‰-fá)(ÿðyÊÜz1é]2E¤÷ýýbh�¢.nÞ_ߦMâp¸¾ùû»_ºŸÎ_|<>þösÿô‡?Þþõû»îüÛ�ïnûGWÃ÷ï¯ý°¿>|ø¸Gý½y?`;ňcJ�.àÇ!æÝÿ¢‡\ -endstream -endobj - -5253 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 746.2134 91.28214 759.87537] - /Border [0 0 0] - /Dest 4674 0 R - /F 4 - /StructParent 525 - /Contents ([98]) ->> -endobj - -5254 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 705.2274 224.77814 718.8894] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/1244381.1244404) - >> - /F 4 - /StructParent 526 - /Contents (https://doi.org/10.1145/1244381.1244404) ->> -endobj - -5255 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 684.7654 91.28214 698.42737] - /Border [0 0 0] - /Dest 4675 0 R - /F 4 - /StructParent 527 - /Contents ([99]) ->> -endobj - -5256 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 664.3034 96.78214 677.9654] - /Border [0 0 0] - /Dest 4676 0 R - /F 4 - /StructParent 528 - /Contents ([100]) ->> -endobj - -5257 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 643.84143 96.78214 657.5034] - /Border [0 0 0] - /Dest 4677 0 R - /F 4 - /StructParent 529 - /Contents ([101]) ->> -endobj - -5258 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [147.31615 616.5174 248.28514 630.1794] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/SCC.2007.74) - >> - /F 4 - /StructParent 530 - /Contents (https://doi.org/10.1109/SCC.2007.74) ->> -endobj - -5259 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 596.0554 96.78214 609.7174] - /Border [0 0 0] - /Dest 4677 0 R - /F 4 - /StructParent 531 - /Contents ([102]) ->> -endobj - -5260 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [391.93414 568.73145 523.03217 582.39343] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1109/ICSE.2004.1317483) - >> - /F 4 - /StructParent 532 - /Contents (https://doi.org/10.1109/ICSE.2004.1317483) ->> -endobj - -5261 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 548.2694 96.78214 561.9314] - /Border [0 0 0] - /Dest 4678 0 R - /F 4 - /StructParent 533 - /Contents ([103]) ->> -endobj - -5262 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [169.31615 520.94543 279.16214 534.6074] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/258948.258973) - >> - /F 4 - /StructParent 534 - /Contents (https://doi.org/10.1145/258948.258973) ->> -endobj - -5263 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 500.4834 96.78214 514.1454] - /Border [0 0 0] - /Dest 4679 0 R - /F 4 - /StructParent 535 - /Contents ([104]) ->> -endobj - -5264 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [406.43213 473.1594 508.02814 486.8214] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1007/11693024_20) - >> - /F 4 - /StructParent 536 - /Contents (https://doi.org/10.1007/11693024_20) ->> -endobj - -5265 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 452.6974 96.78214 466.3594] - /Border [0 0 0] - /Dest 4679 0 R - /F 4 - /StructParent 537 - /Contents ([105]) ->> -endobj - -5266 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [391.82645 439.0354 524.4094 452.6974] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://infoscience.epfl.ch/record/176887) - >> - /F 4 - /StructParent 538 - /Contents (https://infoscience.epfl.ch/record/176887) ->> -endobj - -5267 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 425.3734 173.68314 439.0354] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://infoscience.epfl.ch/record/176887) - >> - /F 4 - /StructParent 539 - /Contents (https://infoscience.epfl.ch/record/176887) ->> -endobj - -5268 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 404.9114 96.78214 418.5734] - /Border [0 0 0] - /Dest 4680 0 R - /F 4 - /StructParent 540 - /Contents ([106]) ->> -endobj - -5269 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [103.932144 377.5874 224.77814 391.2494] - /Border [0 0 0] - /A << - /Type /Action - /S /URI - /URI (https://doi.org/10.1145/2501654.2501666) - >> - /F 4 - /StructParent 541 - /Contents (https://doi.org/10.1145/2501654.2501666) ->> -endobj - -5270 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 4402 0 R - >> - /Font << - /f0 4360 0 R - /f1 4366 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 542 - /Tabs /S - /Parent 1 0 R - /Contents 5271 0 R - /Annots [5253 0 R 5254 0 R 5255 0 R 5256 0 R 5257 0 R 5258 0 R 5259 0 R 5260 0 R 5261 0 R 5262 0 R 5263 0 R 5264 0 R 5265 0 R 5266 0 R 5267 0 R 5268 0 R 5269 0 R] ->> -endobj - -5271 0 obj -<< - /Length 3295 - /Filter /FlateDecode ->> -stream -xœÅ\ms· þ~¿b=r&>;æñu¹t¹¶%O›Ä3V£~I”éH²•:SK®r™iÿ}g_ø‚äžölОn� ‚ >�Ý<¿Ý¾¿:¿Ü6OŸ®šfó|»=¿ü×»·Í/›Ó›�¿ö·~úóbû¿�ïšÍ_ß�¿}wÛß:¾¿9ÿíýõùöýÍõêð°yqôruüúåjóÓÇóë‰Úë—;j¨ýõ?+ÖІ6�Y£)éÚ–ÉFKC¸èdsùaµ¹¤Íå+Úüqy½zqº¢ÍéíjsEÆšÓ+ÿpÿqúaõ˃3JéQyÒ_L9^ÿÚœ~¿:>]�àÜ0„F1‚3¹~Î(§ëÆÐføv0Þ¢íºy̸!”ªÇŸÎ(eëÆ(û�«þóáºáÔßZ7Âc놻æTŽŸBÆß3]Ù_‡NÎ(oó­» -ã 1�xÛ_îAίóOŸ¬fÇô¨ÀD@ívݰéÿfÝHw{Šžøé)õ¼ÿ¼2i›b±˜Ê8 g”龩Ÿ½nXVönx,e¦óýâcá"þ½çÇ d_SíY Hiý�%¼n„ªÏ›3•ÕÊ+«U(¢t»dµRr4ñGé$~¡£�G#sã�4EX±Çt“G´[+~Uÿ=”=U„ -®­ÚU—žèÿûñüú·æÁ»ë5"JN91ºíôI²¢$ɤ§m §[DÄvê­v�[íaã÷ LY.óM®BS9­€Ûló�î.GÙ†×�ôd…·a(Þ> -7NL_¯›Ç–½‡ý…f‰ lëEl-è½HZv¤ÛÀ—$8 kB‘:#4’¿SçLT–ÚW{ ³¢ÎäY½–5½–5½VœÝ2VTë�ìóËíŸçÿ>}÷ßmóôÕñ«W”>?:´„+úïþº9ý}`8Ϲªq7Έéÿ¹ë’…LºìHÛI&“½CD«m;)·]Ï -¥U%^Ý“±�N?ÞÖX(XgEúß…›:DH>ʈ¡ Q�‡Q댰kºÜ"J %ºã¼�£• .‚bÉ|§[JÒŠ9e¡’Ì7þ¹¿<ë/:A‘IçèÝqöŸÅtÊ£°[îøYêsëìðpùÁßz•Už-˜r¶Šæ­¾!ëÊŠ§áŠ/˜í­“ÛA †~ØÃ0ßD»‰ß›6NÆ·8(5Þ¸î6µ¡wüà’hݱE#ý¬Ñöf{7%´í4цîÃ}2Ï¥e=XÌP¿ÏZˆàôy´RëF'ÑjuŒÎc”R9 ˜Ø„ÜÊΚ¾ÓÞ—3Äcœ­ï‘ðžÈÔŠãþ øýo…ûOSO,DðH“^j�Wîåã½së9Œ²ügÚ£¦*ñ¸â¼N�¦©ªX¬¨ç­&‚wB/SôÀÈ<›§î/n9_vögèº�'÷IÁSLÕ©bÒ©ùL�W œ…Y×ϹMè¯Ã݇ôÖK “[Þº5‹—Ba•Ú­ÅjS%ðpÚ U Ú –t""Ò Æôä= _QØ#@ - -×·õxt<~Ö½*.zÙöÿɽ­ùñßú¢o+‹~)_Éš_7� ¡¼ßZF%¡¡Äï…Óñ}}ŸK¨%aÑøg»¨ò-xÑå;®„ôâÆèΟ´ÁG§Ð¹~"„Ð; u~XÏûËk÷ßW;Œ.;“ëh…ÇsnøŸµ(˜gqB“.s‹M´Y€q8ÊWùËÏœG8Öd¸À¢ª.=] -‰”Þ®!‘"&ïÅ4#$ÂºŠ¡‚pºÄ†Ø4ž™q.(ŠjcT;ÊûÛè¦ýN'ΨàA¼EŠÑ1 ú…¼Ü%ôËL=öÛÙ)ÍçH¸ŠR„[åþ2DXÒÁŒm}ˆ(æåć ¥p…L»žNUÀ£\Ó{‹DŽnAW¡É@;JCmˆ$6dë �ˆ™m%æNƒŠ#WW9 Y=�ÁüV){;6K‹vU!k¿]�!¢ÏŒ`Û�#9Œªª/·Ì%Dx6hxƃÝeñ)ŽzjRÁZ¦–s_ŠO=s¾î›8Xì¶Åî¡Ó~àg«:R�™DÙÞ©5ß}¤³âQ\–0»2†ÐŽî³Oòª¢v®Êú»˜3Ù%�1¬ó§j<�ÇÂx D�1Î -�±“.Jp4† ?¥¥Ë-fƒ~ð\”&‘ž:Žî°ÇÐËô2þîžÎËç‘?ÝO<€á�+€¤l7ß•`f iSvHpl'aÜ+�Ïþ‹+”͈ˆ†~?ó#HŸðÛwÒï_€ä ¹"y�­[ðŠÛ­:E$[”ßô=&Õ.•’rW—i¶�öWPäRÚuŒù„Øî8žëŽ´%‚3kn¿T”DšÂ[”38@ë�‘—Ùç0úŸÏ IUêSx!5=êvÈߊé%b˜å¸^t\#ÜH)öæ¹ÈYn‹ƒ¶˜/ì´¡Dº�6€óE�…CãæÒmY–^%ì7Î…ýãV–•8[pê'—¿“8Iƒ£"äòÞLOž<¤=EàáShH"2Bó~ôsè+ÜgÐ^2}»çëV%ÕDkÁÄ,•þRhH"{ AëA¹‚ÄC�Â0›5X“ø. ™JhÒŠbP¨,ñRú°`Dv\1q÷äá”Äg‚¸IÇŸ&λI¢ì A‡�ÅâËFº45Ibš�HæèKÖ‘Nq1GUçã“éÅÒFA£"}Û_X¶íÏ]Á`ZÚ3rdJ%é²È„ÿk¯doö Ìè±QkC]�>Auº­?°F`[3ý—k‡¤Ôi¨Âáá'1<>(´åS-êÉiCXÛ§l-í,ü,‹Õ�Š -¢èÒjÈ@à›YðYVN­³ÏÙ¸"\‰VN) ¼üsæsá¾( çC‰˜NCCZ¼Z9mÅ嵃ߺ”ØÆ¡,œ„>G¢aS7ÌB¸P¾kœ'“`êáû7vÃÍQðÒ” {N~’KJ”ÍDr?_rÛ§³´Ó·—aé.¤8Íðì*GYI�•�!�\ÛX^lš«RŒtBgg§GÖjµ&† -ÕÎÄ�}ž¥€m\½©L¾„Àê÷Uoö~ -ˆÃbÈDà…’-ØÖ/Ý0ÁD ÄGpÚ’åâ0Àc­6ÒÔ[�ûgU=ÁŽÌ%ï·N>K3v)”š¡Ö¸F¡�°ø·yO#냅Œ�ÂÊÁ¿Ô-aÝ¢,¼™gunÝ×áæƒ#†‡�Q`; yVÒÄqépeTö#ê­úF¶Ût]åëkò‘úvÇH½¥àaônpÏ ªÞ“?!QÏ´Ï6œ‰=hêO€T °Æm¸¶q)M”3æ‘Ä«ƒDsliG(ïëÙ ržÑ•ܩќïÏ�˜—<$Mņ,eë;€Ê[Ý{m¾Æ')õ¹Dù'KÞÞK– ›ãjéB³ý0(‡§ G3%xâ÷ÒÛü;&*e(î‡+ÖÁ¡Ã¼mF™œ­Ü BRš,´Íp$Å·n„ûr2,suÐB"D)¢M­•8Øá¤‡Ðé$À9…î$Zuäõµ²HU¥öTJNh»(Š^}|öäý0‚Ñý #¤­ ô‰¹Ðáaè uqƒA»(g�†uãCÁYkë¶=“©/�y‰‹³¢BèƒüSG�)ˆß˜„—ÌWèáwå²…Å1³7wÅ2§ðo¥Úƒö\à¤ãPÇî›0W^Bg=<5¤:ü�»,Ì7U‰Õœ{Þa–½q,ÝÂÒ“@-ÀF芨ŽHÁÕĈ=¶³À‡’1/e‹ÂÊ;J”’jZ‹?âK/›‘k‹<Ë1Ä´òtûÈï*æ+¿§Ñ1Ÿï±*d¸Ì¿4Dãj‘×�åxŽ•ÄuÔ(¥«YFH,ÃQtB�óh3U§ µbHÚ7d!xo^�ü•}µõX (# ×ËÊú@ø2<#â®%éÕ�ø0•‹[í'3ý ï!DhmÛj¡¡„RÖΙѻ§G 3µS¹›Î‚5¾oݨiæê{"�!JSÞíAÛ£õaNH+}ʽ–hà ¬F°L+AÒˆQNæyY4JUÊ‹EGIË>Ó;—ƒë@ -Óc¡íx©Ýß¹´`ä6AŒ*ÿ&á7Ûí͇øe¯nn¶å— G6†&tרþuhJ™…õ“±äþÿÆX -endstream -endobj - -5272 0 obj -<< - /Length 1412 - /Type /XObject - /Subtype /Form - /Filter /FlateDecode - /BBox [0 0 146.25 31.019531] - /Matrix [1 0 0 1 0 0] - /Resources << - /ExtGState << - /a0 << - /CA 1 - /ca 1 - >> - >> - /XObject << - /x6 5273 0 R - >> - >> ->> -stream -xœmV;%5 Ì} -]`…õ·r.°1õ -–d¡ŽOµÒ—åÁ&IÅ!I²7·9I³˜Ñß¿Ñ/ôçú²~úuÓ§è§“~þk}œ7Û–N¡Í.�ûÐæîÜuèïOt¿X.\"¤œ[é3¹°¦’²ØEÊg ùæ³›Œ·(½KH�EÆRƒ¢ÈXÃéEÖÜrȸ½$”œ}'Ùa‰$g D´äÚFÎZ‹,أȹŒ +š‚�O@gÑ@Œl2›¯�Ó™²$¶,Ž�…óãåæÖ$å(ðV›¥…°¼ì á}’´¹£hsª,zŸhÚlŽÿ•I›w€;½7"jónú°y{‘î0Ú¬žGr¡$�[ëaÍ$aïy9Á¦8*—Ú]ˆkå�Ò,çÐAŽ.j[¨9Ï$H8ܨ﵅×ÙS7¼2Ò¸+í`¹Ò2a• ÁOS�À�ÉRg�(o- £ú¦ó8–"[¯…ó™Î/ÃÑMg—pÒb7ÇéNáZÁmtæ™:ˆ“|ô�*ŸŠE�G/@¯¢`ESÔœ`æ¾PaÉ ‡góy¢„ÃÒÍ]¨7*;ݰŒäL5…õÄ"IÖ8`P6V”E8þ£dÊâb(ëÆ=ÄîΧ’'V8Õ¹é±jD€ö©x'âYP]Áq¤_Ù%§!Úž-n¡?lˆjaPi_ZÕ0+q/6°€7Îçœf”£-–5» ëU'XZ¸"Jœáøž*€Ž,bƒ!Â!}XZ“ˆõÂ?ÉÏÒâ¶3Ì杖¹JèšG‹yhYŒ:€<¾¹¡l ²‚�n‘å3Þ×|ÞV ‡=£5øy�M”‘ƒƒwºV™ï+o—¤zÀ‹þXz.縟Aö,%µ1eñQ„³\(À4ð/{p…¢_ZP�6fm£H>éG¤ÝO‰€À} pyç¸�Rt÷�{†î7í&îFýrH)0.!Eó䓵æ³Ý‘³ßqÏå<‡b{ö‚ CØÅ‰mîžXáè.ut@Â_€(#ʰ2† �*è5WƒKûب[s…t…·åˆT„%±Öó!j$vÅh×¹qG}¶� Üfá7’3Ù—ž&)Íu& 2G•Ûžt ‡ÝW “°c!£sZ<ŽÑ꣭K¡¦Â×u:š_]‚M£�§ý@¬a:Èͦ }¦7~ê ã@³De ˜‹ÆÅ'#ƒ×À!'X9?_†>ýLFƒÕ±í7£®ŠsFŽ[Ý g@ÃÂT“_Yÿ {Þ×wØlŽkt-pCÇb/¼§Àª»úóéw‰˜ÔÔ $R|,‘šš&"u½D†žÓ�¯ÂTá˜"f¤2´8ÃÍ5Ʊ§kÃR.¸É«þöNq_‡VÅÌvÝÆj�.ŒÝhDi“?¼Û ÅbÉ] •ÎL€H°Ø;æ?½jÓ‘Ó²¦s_. Êvm ïô…'_3ÀLÜq*0ÙXÏÕsÍ{Ñc™„M÷|¸‹i -U— …T�Á‚¸:bLï;Èu>ä»zw`”©&FyôHLo…‰iäø·þ�m¿¯�ë??‹eX -endstream -endobj - -5273 0 obj -<< - /Length 2113 - /BBox [0 0 147 32] - /Filter /FlateDecode - /Resources 5274 0 R - /Subtype /Form - /Type /XObject ->> -stream -xœmXIr,·Üóu‚2Á™Çð~t|Ù ½…íûG8Kjy¡h%‘X¥|×,{È•ï†ß¼ðÏÆï\×ß\¿ý/_ü“Ö¾G­W)w_ãúu­uË,�?†°Òˆ}}à�ï^û•|`ËÝÚætÞëÚåΘ”}·Y¯ñ(Àë^­­¶.™÷Z3P’qï2l±N÷{�®[q.PÎínw�›kqlÅÚzÏÞ\§DØË •½hÒÄ?1‹ã¥ÄV Â¹¼öÎç6i¡S ÐØqw‘N_Õ{õþŽ!Lî|︨Š×ªßð®:/®"\E QŸÀ5Cµ™÷˜ƒÂáEØÑ胺ï^‰<ÉõL;GWb -ÓS¹F³ˆ©äyºF�lIÚ¿x.Yàxˆ¦òØ*Tæ‘›Mn¿¥#z+8pãë ³÷uðÒd[·æ -— FŒr¥WœŠKly„F@ ××Ñ+̉Ù9ÜMÇ&ùE\EÙÃË%¢J>$hc?µl fvq¬_NX @C?k¡Óˆ� ”aÇ(Ó‘¼@èTVðê8ü„÷°lïŽéÛ‚»\}kT¹‰¶™uP H’Ë8ä(üYl-ÝY5«¯²B.‚)-½ìÐÑê -±Z,9ñaèÖĬYÊ�$¥;›‹¦à…üo}ç9óÎ��´,yœ‘ÀÁ‘Ù•É?°sfn Þà ðl%8Ä0vαq:±=qÁC"ðçÔÎÌ¡ùùpçjE5<›%ßÚÞ#iŽ~HX¨“‘&P8%°‘&¶iB°Ævâb;×Yã:9/\ãÃ7(fÍØ`Mø"X¬¡d¬*u9k*¬YdîÒÓ%ΚÅ$H³²ÞÆ nÞÚ(' TâUiBÿ ¬ËÔß0SW°fkÓŽ`Qš;k€¸ÓYè8ܱÅ(w®¬q¹‡5<µõ`�k伈 Ö¸91k¦kÜÁxiά‰˜7�¾3B¥7Ž|$Éè±ÆqίK²à’»F‹/îW22ŸvZŒ±0[šŠ–_¬ënø�È!ᅧ¯×¤7�9SYfÒ­gl¶ÜNgC…úºf]nº;ärÑKõ—Í´èØÔ»X_º<«•Ü$ªB ÆÅdÌ3PGµ½YKßf§²­6Ùz4î]Ý(Úse6Ð\“�b]^¬‚Ø Õ¢j;'}F._¥·óªÙk){?Ê–N¾ÿbàó¨ÚçÂï{ì¤Qµºâ\·>&Úò{ÀƒPSÕ[-"ôÜC°:^ßk6×µ¢óìJ÷²Øá{žƒŒTªë¥ÿ§Ç ŸÃýåy¶ Md!4Úµ8rÞ|ôº>Úë -;¡ÐØ ¬Ï‚Œ7‹¶X}ÑPif¼[Ì÷pR²¬ Pãy¯—¯0"þ lF²íÖ$ÇÊhÒµ›�õv<ûy%TÕ'àÒ›-Úž;|BÞŽçÏölmvˆ‡_Ø -úñÛs‹éö ¬Õ��°å3°“ÀÌOæ#päÃÉ &M3ô¤¯ ÇÌõÉ*ß²SÓ�D„ÜT¼1Žtu¢†‹ÖÍý^Õ3ÈÊéۀƬÕuB�t¿$¥­f`MV›…Y¥çìÅl‰âvák`Žg¾z$Ûîò.ÙÂV\D Œö#qŸ+íb]©è!*6=õ×�õÂ:yí�Oiw£žy Eû1£íÉӲЕvBUJk;‘ÚÅ�wUçN1ò©#´Öë»ðYj�Î -OXØ3G%Ö›ê-j|¢ª¼ü¡0%Bˆ†÷ÞŸyÑÌìu^$ë ›ø¤ÌÙÚpj©W¤ ÜJý�ç -bÀj…n~¡òŠäâ£,ëé–!íigºEŒЉ„é¶¥gÁrYpßéô­VýC ×­ø‚/…ÿ•À®jß¼vÅÀ!Sqþÿ2U±ý ^êA®š­ÃwrjKz(P¶U §HÁ @«£¨L‹ŒC0 äRŸùa­glïßÅÃè_ •e¥éw„`YÀsÅ1à,‹ÝÊ´ôÈ?|ðóƒj®]Pɵ¨æ�;2µÒ-¼sÄc ·yè¨ßK�nUóiúÂ7Üž?_�nàgÊ [-úìºòªœnée——Kð�êñ«HÐ)Ì9tƒõ-—gÞBåMÁ·Â2öå™+þùÆé¤�ŽÓ-àsÅ;¥ˆiöŸ#ºë�þ§×ó�%t 6™îé ßܸXà¦ÝÜ7G:<)çeê4yTûÎ#eÛ;µÈ¶®¯3J!(Møáïÿs¾ùC ƒF`cCÏ;ÎÓ÷ÙpÁO åo½`ßrV¨�ôÎçrþüyÐGú=ý P柡 -endstream -endobj - -5274 0 obj -<< - /ExtGState << - /a0 << - /CA 1 - /ca 1 - >> - >> ->> -endobj - -5275 0 obj -<< - /Title (A Programming Paradigm for Spatiotemporal Composability) - /Author (Yifan Shi, Wei Zhang, Tianyi Cui) - /Creator (Typst 0.14.2) - /ModDate (D:20260731154505+08'00) - /CreationDate (D:20260731154505+08'00) ->> -endobj - -5276 0 obj -<< - /Length 1223 - /Type /Metadata - /Subtype /XML ->> -stream -A Programming Paradigm for Spatiotemporal ComposabilityYifan Shi, Wei Zhang, Tianyi CuiTypst 0.14.2en2026-07-31T15:45:05+08:002026-07-31T15:45:05+08:0048application/pdf8/8Hb0n3/ti5Ewx/bKL9Ww==HHwsV4w2OKoHWq5hDV/GeA==proof1.7 -endstream -endobj - -5277 0 obj -<< - /Type /Catalog - /Pages 1 0 R - /Metadata 5276 0 R - /PageLabels 53 0 R - /Lang (en) - /StructTreeRoot 54 0 R - /MarkInfo << - /Marked true - /Suspects false - >> - /ViewerPreferences << - /Direction /L2R - >> - /Outlines 2 0 R - /Names << - /Dests << - /Names [(sec:conclusion) 4454 0 R (sec:discussion) 4448 0 R (sec:introduction) 4412 0 R (sec:preliminary) 4416 0 R (sec:related) 4453 0 R (sec:system) 4442 0 R (sec:theory) 4432 0 R (subsec:capabilities) 4444 0 R (subsec:coeffects) 4414 0 R (subsec:component-lifecycle) 4428 0 R (subsec:composability) 4406 0 R (subsec:context-paradigm) 4431 0 R (subsec:contributions) 4411 0 R (subsec:core-impl) 4437 0 R (subsec:effects) 4413 0 R (subsec:granularity) 4446 0 R (subsec:koishi) 4441 0 R (subsec:language) 4445 0 R (subsec:loader-hmr) 4440 0 R (subsec:motivation) 4410 0 R (subsec:reactive-coeffects) 4423 0 R (subsec:revertible-effects) 4419 0 R (subsec:rw-effects) 4449 0 R (subsec:rw-paradigms) 4450 0 R (subsec:rw-spatial) 4452 0 R (subsec:rw-temporal) 4451 0 R (subsec:scaling) 4443 0 R (subsec:versioning) 4447 0 R (subsubsec:coeff-context) 4420 0 R (subsubsec:coeff-isolate-intercept) 4422 0 R (subsubsec:coeff-reactive) 4421 0 R (subsubsec:coeffect-api) 4434 0 R (subsubsec:component-api) 4435 0 R (subsubsec:config-layer) 4438 0 R (subsubsec:context-access) 4436 0 R (subsubsec:context-situating) 4430 0 R (subsubsec:eff-composition) 4418 0 R (subsubsec:eff-formalization) 4417 0 R (subsubsec:eff-idempotent) 4424 0 R (subsubsec:effect-api) 4433 0 R (subsubsec:hmr) 4439 0 R (subsubsec:lifecycle-asynchrony) 4427 0 R (subsubsec:lifecycle-coherence) 4426 0 R (subsubsec:lifecycle-iteration) 4425 0 R (subsubsec:motivation-harnesses) 4408 0 R (subsubsec:motivation-plugins) 4407 0 R (subsubsec:motivation-workaround) 4409 0 R (subsubsec:unified-context) 4429 0 R] - >> - >> ->> -endobj - -xref -0 5278 -0000000000 65535 f -0000000016 00000 n -0000000507 00000 n -0000000588 00000 n -0000000726 00000 n -0000000839 00000 n -0000000999 00000 n -0000001101 00000 n -0000001232 00000 n -0000001349 00000 n -0000001448 00000 n -0000001604 00000 n -0000001700 00000 n -0000001813 00000 n -0000001939 00000 n -0000002124 00000 n -0000002274 00000 n -0000002379 00000 n -0000002497 00000 n -0000002662 00000 n -0000002769 00000 n -0000002905 00000 n -0000003022 00000 n -0000003188 00000 n -0000003298 00000 n -0000003413 00000 n -0000003528 00000 n -0000003629 00000 n -0000003781 00000 n -0000003887 00000 n -0000004008 00000 n -0000004181 00000 n -0000004325 00000 n -0000004431 00000 n -0000004556 00000 n -0000004681 00000 n -0000004786 00000 n -0000004949 00000 n -0000005071 00000 n -0000005184 00000 n -0000005291 00000 n -0000005445 00000 n -0000005554 00000 n -0000005687 00000 n -0000005826 00000 n -0000005975 00000 n -0000006096 00000 n -0000006252 00000 n -0000006368 00000 n -0000006493 00000 n -0000006619 00000 n -0000006729 00000 n -0000006840 00000 n -0000006933 00000 n -0000007532 00000 n -0000014516 00000 n -0000014895 00000 n -0000015760 00000 n -0000016283 00000 n -0000017013 00000 n -0000017878 00000 n -0000018842 00000 n -0000020661 00000 n -0000022246 00000 n -0000023804 00000 n -0000026919 00000 n -0000029386 00000 n -0000031583 00000 n -0000034005 00000 n -0000035860 00000 n -0000039569 00000 n -0000042567 00000 n -0000045664 00000 n -0000047951 00000 n -0000049707 00000 n -0000050941 00000 n -0000051905 00000 n -0000052914 00000 n -0000054697 00000 n -0000057011 00000 n -0000058857 00000 n -0000060550 00000 n -0000061991 00000 n -0000062973 00000 n -0000064522 00000 n -0000065900 00000 n -0000066648 00000 n -0000067333 00000 n -0000068036 00000 n -0000069120 00000 n -0000069715 00000 n -0000070670 00000 n -0000071433 00000 n -0000072180 00000 n -0000073255 00000 n -0000074402 00000 n -0000075061 00000 n -0000075968 00000 n -0000076875 00000 n -0000077694 00000 n -0000078577 00000 n -0000079485 00000 n -0000080409 00000 n -0000080909 00000 n -0000083583 00000 n -0000084559 00000 n -0000084648 00000 n -0000084732 00000 n -0000084854 00000 n -0000085006 00000 n -0000085097 00000 n -0000085179 00000 n -0000085331 00000 n -0000085420 00000 n -0000085504 00000 n -0000085612 00000 n -0000085826 00000 n -0000085908 00000 n -0000086060 00000 n -0000086149 00000 n -0000086233 00000 n -0000086358 00000 n -0000086510 00000 n -0000086601 00000 n -0000086683 00000 n -0000086835 00000 n -0000086924 00000 n -0000087008 00000 n -0000087130 00000 n -0000087282 00000 n -0000087376 00000 n -0000087458 00000 n -0000087610 00000 n -0000087699 00000 n -0000087783 00000 n -0000087905 00000 n -0000088057 00000 n -0000088151 00000 n -0000088233 00000 n -0000088385 00000 n -0000088474 00000 n -0000088558 00000 n -0000088686 00000 n -0000088838 00000 n -0000088929 00000 n -0000089011 00000 n -0000089163 00000 n -0000089252 00000 n -0000089336 00000 n -0000089444 00000 n -0000089535 00000 n -0000089617 00000 n -0000089769 00000 n -0000089858 00000 n -0000089942 00000 n -0000090039 00000 n -0000090121 00000 n -0000090272 00000 n -0000090361 00000 n -0000090445 00000 n -0000090563 00000 n -0000090714 00000 n -0000090808 00000 n -0000090890 00000 n -0000091041 00000 n -0000091130 00000 n -0000091214 00000 n -0000091336 00000 n -0000091489 00000 n -0000091589 00000 n -0000091671 00000 n -0000091824 00000 n -0000091913 00000 n -0000091997 00000 n -0000092118 00000 n -0000092271 00000 n -0000092370 00000 n -0000092452 00000 n -0000092604 00000 n -0000092693 00000 n -0000092777 00000 n -0000092899 00000 n -0000093051 00000 n -0000093145 00000 n -0000093227 00000 n -0000093379 00000 n -0000093468 00000 n -0000093552 00000 n -0000093677 00000 n -0000093829 00000 n -0000093923 00000 n -0000094005 00000 n -0000094157 00000 n -0000094246 00000 n -0000094330 00000 n -0000094452 00000 n -0000094604 00000 n -0000094701 00000 n -0000094783 00000 n -0000094935 00000 n -0000095024 00000 n -0000095108 00000 n -0000095227 00000 n -0000095379 00000 n -0000095470 00000 n -0000095552 00000 n -0000095704 00000 n -0000095793 00000 n -0000095877 00000 n -0000095974 00000 n -0000096056 00000 n -0000096208 00000 n -0000096297 00000 n -0000096381 00000 n -0000096481 00000 n -0000096563 00000 n -0000096715 00000 n -0000096804 00000 n -0000096888 00000 n -0000096996 00000 n -0000097090 00000 n -0000097172 00000 n -0000097324 00000 n -0000097413 00000 n -0000097497 00000 n -0000097619 00000 n -0000097771 00000 n -0000097865 00000 n -0000097947 00000 n -0000098099 00000 n -0000098188 00000 n -0000098272 00000 n -0000098397 00000 n -0000098549 00000 n -0000098640 00000 n -0000098722 00000 n -0000098874 00000 n -0000098963 00000 n -0000099047 00000 n -0000099172 00000 n -0000099324 00000 n -0000099418 00000 n -0000099500 00000 n -0000099652 00000 n -0000099741 00000 n -0000099825 00000 n -0000099947 00000 n -0000100099 00000 n -0000100193 00000 n -0000100275 00000 n -0000100427 00000 n -0000100516 00000 n -0000100600 00000 n -0000100722 00000 n -0000100874 00000 n -0000100968 00000 n -0000101050 00000 n -0000101202 00000 n -0000101291 00000 n -0000101375 00000 n -0000101497 00000 n -0000101649 00000 n -0000101742 00000 n -0000101824 00000 n -0000101975 00000 n -0000102064 00000 n -0000102148 00000 n -0000102422 00000 n -0000102573 00000 n -0000102717 00000 n -0000102799 00000 n -0000102952 00000 n -0000103041 00000 n -0000103125 00000 n -0000103262 00000 n -0000103415 00000 n -0000103511 00000 n -0000103602 00000 n -0000103684 00000 n -0000103836 00000 n -0000103925 00000 n -0000104009 00000 n -0000104134 00000 n -0000104286 00000 n -0000104377 00000 n -0000104459 00000 n -0000104611 00000 n -0000104700 00000 n -0000104784 00000 n -0000104906 00000 n -0000105058 00000 n -0000105152 00000 n -0000105234 00000 n -0000105386 00000 n -0000105475 00000 n -0000105559 00000 n -0000105678 00000 n -0000105830 00000 n -0000105924 00000 n -0000106006 00000 n -0000106158 00000 n -0000106247 00000 n -0000106331 00000 n -0000106456 00000 n -0000106608 00000 n -0000106699 00000 n -0000106781 00000 n -0000106933 00000 n -0000107022 00000 n -0000107106 00000 n -0000107231 00000 n -0000107445 00000 n -0000107536 00000 n -0000107618 00000 n -0000107770 00000 n -0000107859 00000 n -0000107943 00000 n -0000108065 00000 n -0000108217 00000 n -0000108308 00000 n -0000108390 00000 n -0000108542 00000 n -0000108631 00000 n -0000108715 00000 n -0000108837 00000 n -0000108989 00000 n -0000109080 00000 n -0000109162 00000 n -0000109314 00000 n -0000109403 00000 n -0000109487 00000 n -0000109609 00000 n -0000109761 00000 n -0000109855 00000 n -0000109937 00000 n -0000110089 00000 n -0000110178 00000 n -0000110262 00000 n -0000110373 00000 n -0000110525 00000 n -0000110607 00000 n -0000110759 00000 n -0000110848 00000 n -0000110932 00000 n -0000111054 00000 n -0000111206 00000 n -0000111300 00000 n -0000111382 00000 n -0000111534 00000 n -0000111623 00000 n -0000111707 00000 n -0000111832 00000 n -0000111984 00000 n -0000112075 00000 n -0000112157 00000 n -0000112309 00000 n -0000112398 00000 n -0000112482 00000 n -0000112603 00000 n -0000112755 00000 n -0000112845 00000 n -0000112927 00000 n -0000113078 00000 n -0000113167 00000 n -0000113251 00000 n -0000113369 00000 n -0000113520 00000 n -0000113610 00000 n -0000113692 00000 n -0000113843 00000 n -0000113932 00000 n -0000114016 00000 n -0000114142 00000 n -0000114295 00000 n -0000114391 00000 n -0000114473 00000 n -0000114626 00000 n -0000114715 00000 n -0000114799 00000 n -0000114924 00000 n -0000115076 00000 n -0000115167 00000 n -0000115249 00000 n -0000115401 00000 n -0000115490 00000 n -0000115574 00000 n -0000115699 00000 n -0000115851 00000 n -0000115945 00000 n -0000116027 00000 n -0000116179 00000 n -0000116268 00000 n -0000116352 00000 n -0000116477 00000 n -0000116629 00000 n -0000116720 00000 n -0000116802 00000 n -0000116954 00000 n -0000117043 00000 n -0000117127 00000 n -0000117246 00000 n -0000117398 00000 n -0000117492 00000 n -0000117574 00000 n -0000117726 00000 n -0000117815 00000 n -0000117899 00000 n -0000118021 00000 n -0000118235 00000 n -0000118326 00000 n -0000118408 00000 n -0000118560 00000 n -0000118649 00000 n -0000118733 00000 n -0000118855 00000 n -0000119007 00000 n -0000119107 00000 n -0000119189 00000 n -0000119341 00000 n -0000119430 00000 n -0000119514 00000 n -0000119636 00000 n -0000119788 00000 n -0000119882 00000 n -0000119964 00000 n -0000120116 00000 n -0000120205 00000 n -0000120289 00000 n -0000120394 00000 n -0000120608 00000 n -0000120690 00000 n -0000120842 00000 n -0000120931 00000 n -0000121015 00000 n -0000121140 00000 n -0000121292 00000 n -0000121383 00000 n -0000121465 00000 n -0000121617 00000 n -0000121706 00000 n -0000121790 00000 n -0000121895 00000 n -0000122109 00000 n -0000122191 00000 n -0000122343 00000 n -0000122432 00000 n -0000122516 00000 n -0000122635 00000 n -0000122787 00000 n -0000122881 00000 n -0000122963 00000 n -0000123115 00000 n -0000123204 00000 n -0000123288 00000 n -0000123396 00000 n -0000123490 00000 n -0000123572 00000 n -0000123724 00000 n -0000123813 00000 n -0000123897 00000 n -0000124015 00000 n -0000124167 00000 n -0000124260 00000 n -0000124342 00000 n -0000124493 00000 n -0000124582 00000 n -0000124666 00000 n -0000124782 00000 n -0000124933 00000 n -0000125025 00000 n -0000125107 00000 n -0000125258 00000 n -0000125347 00000 n -0000125431 00000 n -0000125542 00000 n -0000125636 00000 n -0000125718 00000 n -0000125870 00000 n -0000125959 00000 n -0000126043 00000 n -0000126168 00000 n -0000126320 00000 n -0000126411 00000 n -0000126493 00000 n -0000126645 00000 n -0000126734 00000 n -0000126818 00000 n -0000126932 00000 n -0000127023 00000 n -0000127105 00000 n -0000127257 00000 n -0000127346 00000 n -0000127430 00000 n -0000127538 00000 n -0000127632 00000 n -0000127714 00000 n -0000127866 00000 n -0000127955 00000 n -0000128039 00000 n -0000128150 00000 n -0000128241 00000 n -0000128323 00000 n -0000128475 00000 n -0000128564 00000 n -0000128648 00000 n -0000128770 00000 n -0000128922 00000 n -0000129016 00000 n -0000129098 00000 n -0000129250 00000 n -0000129339 00000 n -0000129423 00000 n -0000129545 00000 n -0000129697 00000 n -0000129791 00000 n -0000129873 00000 n -0000130025 00000 n -0000130114 00000 n -0000130198 00000 n -0000130326 00000 n -0000130478 00000 n -0000130569 00000 n -0000130651 00000 n -0000130803 00000 n -0000130892 00000 n -0000130976 00000 n -0000131084 00000 n -0000131175 00000 n -0000131257 00000 n -0000131409 00000 n -0000131498 00000 n -0000131582 00000 n -0000131687 00000 n -0000131839 00000 n -0000131921 00000 n -0000132073 00000 n -0000132162 00000 n -0000132246 00000 n -0000132351 00000 n -0000132565 00000 n -0000132647 00000 n -0000132799 00000 n -0000132888 00000 n -0000132972 00000 n -0000133083 00000 n -0000133180 00000 n -0000133262 00000 n -0000133414 00000 n -0000133503 00000 n -0000133587 00000 n -0000133712 00000 n -0000133864 00000 n -0000133958 00000 n -0000134040 00000 n -0000134192 00000 n -0000134281 00000 n -0000134365 00000 n -0000134476 00000 n -0000134628 00000 n -0000134710 00000 n -0000134862 00000 n -0000134951 00000 n -0000135035 00000 n -0000135142 00000 n -0000135238 00000 n -0000135320 00000 n -0000135471 00000 n -0000135560 00000 n -0000135644 00000 n -0000135760 00000 n -0000135911 00000 n -0000136003 00000 n -0000136085 00000 n -0000136236 00000 n -0000136325 00000 n -0000136409 00000 n -0000136531 00000 n -0000136684 00000 n -0000136780 00000 n -0000136862 00000 n -0000137015 00000 n -0000137104 00000 n -0000137188 00000 n -0000137313 00000 n -0000137466 00000 n -0000137557 00000 n -0000137639 00000 n -0000137791 00000 n -0000137880 00000 n -0000137964 00000 n -0000138086 00000 n -0000138238 00000 n -0000138332 00000 n -0000138414 00000 n -0000138566 00000 n -0000138655 00000 n -0000138739 00000 n -0000138861 00000 n -0000139013 00000 n -0000139104 00000 n -0000139186 00000 n -0000139338 00000 n -0000139427 00000 n -0000139511 00000 n -0000139633 00000 n -0000139785 00000 n -0000139879 00000 n -0000139961 00000 n -0000140113 00000 n -0000140202 00000 n -0000140286 00000 n -0000140405 00000 n -0000140557 00000 n -0000140654 00000 n -0000140736 00000 n -0000140888 00000 n -0000140977 00000 n -0000141061 00000 n -0000141186 00000 n -0000141338 00000 n -0000141432 00000 n -0000141514 00000 n -0000141666 00000 n -0000141755 00000 n -0000141839 00000 n -0000141969 00000 n -0000142121 00000 n -0000142215 00000 n -0000142306 00000 n -0000142388 00000 n -0000142540 00000 n -0000142629 00000 n -0000142713 00000 n -0000142832 00000 n -0000142984 00000 n -0000143078 00000 n -0000143160 00000 n -0000143312 00000 n -0000143401 00000 n -0000143485 00000 n -0000143607 00000 n -0000143759 00000 n -0000143853 00000 n -0000143935 00000 n -0000144087 00000 n -0000144176 00000 n -0000144260 00000 n -0000144379 00000 n -0000144593 00000 n -0000144690 00000 n -0000144772 00000 n -0000144924 00000 n -0000145013 00000 n -0000145097 00000 n -0000145216 00000 n -0000145430 00000 n -0000145521 00000 n -0000145603 00000 n -0000145755 00000 n -0000145844 00000 n -0000145928 00000 n -0000146050 00000 n -0000146202 00000 n -0000146296 00000 n -0000146378 00000 n -0000146529 00000 n -0000146618 00000 n -0000146702 00000 n -0000146822 00000 n -0000146973 00000 n -0000147065 00000 n -0000147147 00000 n -0000147298 00000 n -0000147387 00000 n -0000147471 00000 n -0000147585 00000 n -0000147677 00000 n -0000147759 00000 n -0000147912 00000 n -0000148001 00000 n -0000148085 00000 n -0000148214 00000 n -0000148367 00000 n -0000148462 00000 n -0000148544 00000 n -0000148696 00000 n -0000148785 00000 n -0000148869 00000 n -0000148977 00000 n -0000149068 00000 n -0000149150 00000 n -0000149302 00000 n -0000149391 00000 n -0000149475 00000 n -0000149597 00000 n -0000149749 00000 n -0000149840 00000 n -0000149922 00000 n -0000150074 00000 n -0000150163 00000 n -0000150247 00000 n -0000150375 00000 n -0000150527 00000 n -0000150621 00000 n -0000150703 00000 n -0000150855 00000 n -0000150944 00000 n -0000151028 00000 n -0000151153 00000 n -0000151305 00000 n -0000151399 00000 n -0000151481 00000 n -0000151633 00000 n -0000151722 00000 n -0000151806 00000 n -0000151917 00000 n -0000152011 00000 n -0000152093 00000 n -0000152245 00000 n -0000152334 00000 n -0000152418 00000 n -0000152540 00000 n -0000152692 00000 n -0000152783 00000 n -0000152865 00000 n -0000153017 00000 n -0000153106 00000 n -0000153190 00000 n -0000153290 00000 n -0000153372 00000 n -0000153524 00000 n -0000153613 00000 n -0000153697 00000 n -0000153811 00000 n -0000153902 00000 n -0000153984 00000 n -0000154136 00000 n -0000154225 00000 n -0000154309 00000 n -0000154442 00000 n -0000154594 00000 n -0000154688 00000 n -0000154779 00000 n -0000154861 00000 n -0000155013 00000 n -0000155102 00000 n -0000155186 00000 n -0000155297 00000 n -0000155388 00000 n -0000155470 00000 n -0000155622 00000 n -0000155711 00000 n -0000155795 00000 n -0000155928 00000 n -0000156080 00000 n -0000156171 00000 n -0000156262 00000 n -0000156344 00000 n -0000156496 00000 n -0000156585 00000 n -0000156669 00000 n -0000156799 00000 n -0000156951 00000 n -0000157048 00000 n -0000157139 00000 n -0000157221 00000 n -0000157373 00000 n -0000157462 00000 n -0000157546 00000 n -0000157654 00000 n -0000157867 00000 n -0000157949 00000 n -0000158100 00000 n -0000158189 00000 n -0000158273 00000 n -0000158381 00000 n -0000158532 00000 n -0000158614 00000 n -0000158765 00000 n -0000158854 00000 n -0000158938 00000 n -0000159049 00000 n -0000159140 00000 n -0000159222 00000 n -0000159374 00000 n -0000159463 00000 n -0000159547 00000 n -0000159672 00000 n -0000159824 00000 n -0000159918 00000 n -0000160000 00000 n -0000160152 00000 n -0000160241 00000 n -0000160325 00000 n -0000160433 00000 n -0000160524 00000 n -0000160606 00000 n -0000160758 00000 n -0000160847 00000 n -0000160931 00000 n -0000161056 00000 n -0000161208 00000 n -0000161299 00000 n -0000161381 00000 n -0000161533 00000 n -0000161622 00000 n -0000161706 00000 n -0000161828 00000 n -0000161980 00000 n -0000162071 00000 n -0000162153 00000 n -0000162305 00000 n -0000162394 00000 n -0000162478 00000 n -0000162597 00000 n -0000162749 00000 n -0000162846 00000 n -0000162928 00000 n -0000163080 00000 n -0000163189 00000 n -0000163311 00000 n -0000163463 00000 n -0000163628 00000 n -0000163722 00000 n -0000163813 00000 n -0000163904 00000 n -0000163994 00000 n -0000164104 00000 n -0000164531 00000 n -0000164621 00000 n -0000164713 00000 n -0000164866 00000 n -0000164958 00000 n -0000165111 00000 n -0000165264 00000 n -0000165417 00000 n -0000165513 00000 n -0000165787 00000 n -0000165940 00000 n -0000166034 00000 n -0000166187 00000 n -0000166339 00000 n -0000166432 00000 n -0000166525 00000 n -0000166677 00000 n -0000166829 00000 n -0000166981 00000 n -0000167076 00000 n -0000167271 00000 n -0000167423 00000 n -0000167516 00000 n -0000167609 00000 n -0000167761 00000 n -0000167913 00000 n -0000168008 00000 n -0000168107 00000 n -0000168230 00000 n -0000168492 00000 n -0000168644 00000 n -0000168796 00000 n -0000168948 00000 n -0000169100 00000 n -0000169252 00000 n -0000169404 00000 n -0000169556 00000 n -0000169707 00000 n -0000169858 00000 n -0000169952 00000 n -0000170272 00000 n -0000170425 00000 n -0000170519 00000 n -0000170672 00000 n -0000170825 00000 n -0000170978 00000 n -0000171130 00000 n -0000171223 00000 n -0000171375 00000 n -0000171527 00000 n -0000171622 00000 n -0000172020 00000 n -0000172172 00000 n -0000172265 00000 n -0000172358 00000 n -0000172510 00000 n -0000172662 00000 n -0000172755 00000 n -0000172907 00000 n -0000173059 00000 n -0000173211 00000 n -0000173363 00000 n -0000173515 00000 n -0000173667 00000 n -0000173819 00000 n -0000173910 00000 n -0000174062 00000 n -0000174152 00000 n -0000174246 00000 n -0000174495 00000 n -0000174619 00000 n -0000174887 00000 n -0000175039 00000 n -0000175191 00000 n -0000175282 00000 n -0000175376 00000 n -0000175467 00000 n -0000175558 00000 n -0000175649 00000 n -0000175740 00000 n -0000175892 00000 n -0000176044 00000 n -0000176139 00000 n -0000176365 00000 n -0000176517 00000 n -0000176616 00000 n -0000176768 00000 n -0000176859 00000 n -0000177011 00000 n -0000177163 00000 n -0000177257 00000 n -0000177358 00000 n -0000177509 00000 n -0000177630 00000 n -0000177923 00000 n -0000178075 00000 n -0000178227 00000 n -0000178379 00000 n -0000178473 00000 n -0000178625 00000 n -0000178720 00000 n -0000178898 00000 n -0000179050 00000 n -0000179141 00000 n -0000179232 00000 n -0000179384 00000 n -0000179479 00000 n -0000179711 00000 n -0000179802 00000 n -0000179893 00000 n -0000180045 00000 n -0000180197 00000 n -0000180349 00000 n -0000180440 00000 n -0000180592 00000 n -0000180687 00000 n -0000180791 00000 n -0000180942 00000 n -0000181069 00000 n -0000181160 00000 n -0000181272 00000 n -0000181371 00000 n -0000181586 00000 n -0000181739 00000 n -0000181892 00000 n -0000182045 00000 n -0000182197 00000 n -0000182308 00000 n -0000182403 00000 n -0000182562 00000 n -0000182653 00000 n -0000182805 00000 n -0000182900 00000 n -0000183043 00000 n -0000183139 00000 n -0000183241 00000 n -0000183337 00000 n -0000183432 00000 n -0000183578 00000 n -0000183730 00000 n -0000183821 00000 n -0000183912 00000 n -0000184003 00000 n -0000184127 00000 n -0000184223 00000 n -0000184318 00000 n -0000184479 00000 n -0000184631 00000 n -0000184742 00000 n -0000184837 00000 n -0000184932 00000 n -0000185026 00000 n -0000185256 00000 n -0000185355 00000 n -0000185451 00000 n -0000185547 00000 n -0000185681 00000 n -0000185792 00000 n -0000185934 00000 n -0000186030 00000 n -0000186126 00000 n -0000186249 00000 n -0000186414 00000 n -0000186510 00000 n -0000186606 00000 n -0000186702 00000 n -0000186798 00000 n -0000186894 00000 n -0000186990 00000 n -0000187135 00000 n -0000187622 00000 n -0000187773 00000 n -0000187926 00000 n -0000188128 00000 n -0000188283 00000 n -0000188438 00000 n -0000188592 00000 n -0000188687 00000 n -0000188841 00000 n -0000188936 00000 n -0000189150 00000 n -0000189304 00000 n -0000189458 00000 n -0000189553 00000 n -0000189648 00000 n -0000189802 00000 n -0000189956 00000 n -0000190110 00000 n -0000190261 00000 n -0000190354 00000 n -0000190447 00000 n -0000190601 00000 n -0000190698 00000 n -0000190906 00000 n -0000191060 00000 n -0000191155 00000 n -0000191250 00000 n -0000191345 00000 n -0000191440 00000 n -0000191577 00000 n -0000191673 00000 n -0000191758 00000 n -0000191903 00000 n -0000192076 00000 n -0000192161 00000 n -0000192306 00000 n -0000192478 00000 n -0000192599 00000 n -0000192692 00000 n -0000192789 00000 n -0000192886 00000 n -0000193022 00000 n -0000193396 00000 n -0000193549 00000 n -0000193703 00000 n -0000193857 00000 n -0000193954 00000 n -0000194087 00000 n -0000194241 00000 n -0000194419 00000 n -0000194514 00000 n -0000194668 00000 n -0000194822 00000 n -0000194976 00000 n -0000195073 00000 n -0000195176 00000 n -0000195308 00000 n -0000195442 00000 n -0000195596 00000 n -0000195692 00000 n -0000196146 00000 n -0000196240 00000 n -0000196394 00000 n -0000196548 00000 n -0000196645 00000 n -0000196760 00000 n -0000196857 00000 n -0000196951 00000 n -0000197180 00000 n -0000197273 00000 n -0000197366 00000 n -0000197459 00000 n -0000197554 00000 n -0000197647 00000 n -0000197742 00000 n -0000197835 00000 n -0000197989 00000 n -0000198112 00000 n -0000198215 00000 n -0000198328 00000 n -0000198445 00000 n -0000198541 00000 n -0000199035 00000 n -0000199188 00000 n -0000199342 00000 n -0000199439 00000 n -0000199605 00000 n -0000199759 00000 n -0000199913 00000 n -0000200067 00000 n -0000200164 00000 n -0000200315 00000 n -0000200469 00000 n -0000200623 00000 n -0000200720 00000 n -0000200865 00000 n -0000201008 00000 n -0000201101 00000 n -0000201194 00000 n -0000201279 00000 n -0000201424 00000 n -0000201596 00000 n -0000201681 00000 n -0000201826 00000 n -0000201998 00000 n -0000202120 00000 n -0000202205 00000 n -0000202350 00000 n -0000202522 00000 n -0000202607 00000 n -0000202752 00000 n -0000202924 00000 n -0000203045 00000 n -0000203157 00000 n -0000203252 00000 n -0000203397 00000 n -0000203959 00000 n -0000204036 00000 n -0000204130 00000 n -0000204277 00000 n -0000204426 00000 n -0000204503 00000 n -0000204580 00000 n -0000204665 00000 n -0000204812 00000 n -0000204915 00000 n -0000205062 00000 n -0000205212 00000 n -0000205358 00000 n -0000205435 00000 n -0000205512 00000 n -0000205589 00000 n -0000205674 00000 n -0000205820 00000 n -0000205905 00000 n -0000206051 00000 n -0000206128 00000 n -0000206205 00000 n -0000206282 00000 n -0000206359 00000 n -0000206444 00000 n -0000206590 00000 n -0000206702 00000 n -0000206850 00000 n -0000206998 00000 n -0000207146 00000 n -0000207294 00000 n -0000207371 00000 n -0000207448 00000 n -0000207533 00000 n -0000207679 00000 n -0000207764 00000 n -0000207912 00000 n -0000207989 00000 n -0000208066 00000 n -0000208143 00000 n -0000208228 00000 n -0000208376 00000 n -0000208470 00000 n -0000208618 00000 n -0000208768 00000 n -0000208845 00000 n -0000208930 00000 n -0000209078 00000 n -0000209181 00000 n -0000209329 00000 n -0000209480 00000 n -0000209628 00000 n -0000209705 00000 n -0000209782 00000 n -0000209859 00000 n -0000209944 00000 n -0000210092 00000 n -0000210177 00000 n -0000210325 00000 n -0000210402 00000 n -0000210479 00000 n -0000210556 00000 n -0000210633 00000 n -0000210718 00000 n -0000210866 00000 n -0000210978 00000 n -0000211130 00000 n -0000211280 00000 n -0000211430 00000 n -0000211580 00000 n -0000211657 00000 n -0000211734 00000 n -0000211811 00000 n -0000211896 00000 n -0000212044 00000 n -0000212129 00000 n -0000212279 00000 n -0000212356 00000 n -0000212441 00000 n -0000212589 00000 n -0000212692 00000 n -0000212840 00000 n -0000212991 00000 n -0000213139 00000 n -0000213216 00000 n -0000213293 00000 n -0000213378 00000 n -0000213526 00000 n -0000213620 00000 n -0000213768 00000 n -0000213918 00000 n -0000214003 00000 n -0000214151 00000 n -0000214228 00000 n -0000214330 00000 n -0000214428 00000 n -0000214572 00000 n -0000214668 00000 n -0000214792 00000 n -0000214877 00000 n -0000215022 00000 n -0000215195 00000 n -0000215280 00000 n -0000215425 00000 n -0000215598 00000 n -0000215696 00000 n -0000215814 00000 n -0000215910 00000 n -0000216006 00000 n -0000216151 00000 n -0000216785 00000 n -0000216862 00000 n -0000216956 00000 n -0000217104 00000 n -0000217254 00000 n -0000217331 00000 n -0000217416 00000 n -0000217564 00000 n -0000217685 00000 n -0000217833 00000 n -0000217984 00000 n -0000218132 00000 n -0000218283 00000 n -0000218430 00000 n -0000218507 00000 n -0000218584 00000 n -0000218661 00000 n -0000218746 00000 n -0000218893 00000 n -0000219014 00000 n -0000219161 00000 n -0000219311 00000 n -0000219458 00000 n -0000219608 00000 n -0000219755 00000 n -0000219832 00000 n -0000219909 00000 n -0000219986 00000 n -0000220063 00000 n -0000220148 00000 n -0000220295 00000 n -0000220452 00000 n -0000220599 00000 n -0000220748 00000 n -0000220898 00000 n -0000221045 00000 n -0000221195 00000 n -0000221342 00000 n -0000221492 00000 n -0000221639 00000 n -0000221788 00000 n -0000221865 00000 n -0000221942 00000 n -0000222027 00000 n -0000222174 00000 n -0000222277 00000 n -0000222424 00000 n -0000222574 00000 n -0000222721 00000 n -0000222798 00000 n -0000222875 00000 n -0000222952 00000 n -0000223037 00000 n -0000223184 00000 n -0000223296 00000 n -0000223446 00000 n -0000223595 00000 n -0000223744 00000 n -0000223893 00000 n -0000223970 00000 n -0000224055 00000 n -0000224202 00000 n -0000224314 00000 n -0000224464 00000 n -0000224611 00000 n -0000224761 00000 n -0000224908 00000 n -0000224985 00000 n -0000225062 00000 n -0000225147 00000 n -0000225294 00000 n -0000225388 00000 n -0000225535 00000 n -0000225684 00000 n -0000225769 00000 n -0000225916 00000 n -0000226010 00000 n -0000226157 00000 n -0000226306 00000 n -0000226383 00000 n -0000226468 00000 n -0000226615 00000 n -0000226700 00000 n -0000226847 00000 n -0000226924 00000 n -0000227009 00000 n -0000227156 00000 n -0000227268 00000 n -0000227421 00000 n -0000227570 00000 n -0000227719 00000 n -0000227868 00000 n -0000227945 00000 n -0000228022 00000 n -0000228107 00000 n -0000228254 00000 n -0000228375 00000 n -0000228522 00000 n -0000228672 00000 n -0000228819 00000 n -0000228969 00000 n -0000229116 00000 n -0000229193 00000 n -0000229270 00000 n -0000229355 00000 n -0000229502 00000 n -0000229659 00000 n -0000229809 00000 n -0000229958 00000 n -0000230107 00000 n -0000230257 00000 n -0000230407 00000 n -0000230556 00000 n -0000230706 00000 n -0000230853 00000 n -0000231002 00000 n -0000231079 00000 n -0000231156 00000 n -0000231233 00000 n -0000231318 00000 n -0000231465 00000 n -0000231559 00000 n -0000231706 00000 n -0000231855 00000 n -0000231932 00000 n -0000232017 00000 n -0000232164 00000 n -0000232276 00000 n -0000232426 00000 n -0000232573 00000 n -0000232723 00000 n -0000232870 00000 n -0000232947 00000 n -0000233024 00000 n -0000233109 00000 n -0000233256 00000 n -0000233350 00000 n -0000233497 00000 n -0000233646 00000 n -0000233731 00000 n -0000233878 00000 n -0000233955 00000 n -0000234056 00000 n -0000234153 00000 n -0000234320 00000 n -0000234415 00000 n -0000234510 00000 n -0000234603 00000 n -0000234698 00000 n -0000234792 00000 n -0000234888 00000 n -0000234982 00000 n -0000235127 00000 n -0000236139 00000 n -0000236216 00000 n -0000236310 00000 n -0000236456 00000 n -0000236604 00000 n -0000236681 00000 n -0000236766 00000 n -0000236912 00000 n -0000237033 00000 n -0000237181 00000 n -0000237332 00000 n -0000237480 00000 n -0000237631 00000 n -0000237779 00000 n -0000237856 00000 n -0000237941 00000 n -0000238089 00000 n -0000238183 00000 n -0000238331 00000 n -0000238481 00000 n -0000238558 00000 n -0000238643 00000 n -0000238791 00000 n -0000238948 00000 n -0000239096 00000 n -0000239247 00000 n -0000239395 00000 n -0000239546 00000 n -0000239694 00000 n -0000239845 00000 n -0000239993 00000 n -0000240144 00000 n -0000240292 00000 n -0000240369 00000 n -0000240446 00000 n -0000240523 00000 n -0000240600 00000 n -0000240677 00000 n -0000240762 00000 n -0000240910 00000 n -0000240995 00000 n -0000241145 00000 n -0000241222 00000 n -0000241299 00000 n -0000241376 00000 n -0000241461 00000 n -0000241609 00000 n -0000241712 00000 n -0000241860 00000 n -0000242011 00000 n -0000242159 00000 n -0000242236 00000 n -0000242313 00000 n -0000242390 00000 n -0000242467 00000 n -0000242552 00000 n -0000242700 00000 n -0000242821 00000 n -0000242969 00000 n -0000243120 00000 n -0000243268 00000 n -0000243419 00000 n -0000243567 00000 n -0000243644 00000 n -0000243721 00000 n -0000243798 00000 n -0000243875 00000 n -0000243960 00000 n -0000244108 00000 n -0000244229 00000 n -0000244377 00000 n -0000244528 00000 n -0000244676 00000 n -0000244827 00000 n -0000244975 00000 n -0000245052 00000 n -0000245129 00000 n -0000245206 00000 n -0000245283 00000 n -0000245360 00000 n -0000245445 00000 n -0000245593 00000 n -0000245714 00000 n -0000245862 00000 n -0000246012 00000 n -0000246163 00000 n -0000246311 00000 n -0000246461 00000 n -0000246538 00000 n -0000246615 00000 n -0000246692 00000 n -0000246777 00000 n -0000246925 00000 n -0000247028 00000 n -0000247176 00000 n -0000247327 00000 n -0000247475 00000 n -0000247552 00000 n -0000247629 00000 n -0000247706 00000 n -0000247783 00000 n -0000247868 00000 n -0000248016 00000 n -0000248137 00000 n -0000248285 00000 n -0000248436 00000 n -0000248584 00000 n -0000248735 00000 n -0000248883 00000 n -0000248960 00000 n -0000249037 00000 n -0000249114 00000 n -0000249191 00000 n -0000249276 00000 n -0000249424 00000 n -0000249545 00000 n -0000249693 00000 n -0000249844 00000 n -0000249992 00000 n -0000250143 00000 n -0000250291 00000 n -0000250368 00000 n -0000250445 00000 n -0000250522 00000 n -0000250599 00000 n -0000250676 00000 n -0000250761 00000 n -0000250909 00000 n -0000251066 00000 n -0000251214 00000 n -0000251364 00000 n -0000251515 00000 n -0000251663 00000 n -0000251814 00000 n -0000251962 00000 n -0000252113 00000 n -0000252261 00000 n -0000252411 00000 n -0000252488 00000 n -0000252565 00000 n -0000252642 00000 n -0000252719 00000 n -0000252804 00000 n -0000252952 00000 n -0000253064 00000 n -0000253214 00000 n -0000253364 00000 n -0000253513 00000 n -0000253662 00000 n -0000253739 00000 n -0000253816 00000 n -0000253901 00000 n -0000254048 00000 n -0000254151 00000 n -0000254298 00000 n -0000254448 00000 n -0000254595 00000 n -0000254672 00000 n -0000254749 00000 n -0000254826 00000 n -0000254911 00000 n -0000255058 00000 n -0000255143 00000 n -0000255292 00000 n -0000255369 00000 n -0000255454 00000 n -0000255601 00000 n -0000255758 00000 n -0000255905 00000 n -0000256055 00000 n -0000256202 00000 n -0000256352 00000 n -0000256499 00000 n -0000256649 00000 n -0000256796 00000 n -0000256946 00000 n -0000257093 00000 n -0000257170 00000 n -0000257247 00000 n -0000257324 00000 n -0000257409 00000 n -0000257556 00000 n -0000257668 00000 n -0000257818 00000 n -0000257967 00000 n -0000258116 00000 n -0000258265 00000 n -0000258342 00000 n -0000258427 00000 n -0000258574 00000 n -0000258686 00000 n -0000258836 00000 n -0000258983 00000 n -0000259133 00000 n -0000259280 00000 n -0000259357 00000 n -0000259442 00000 n -0000259589 00000 n -0000259692 00000 n -0000259839 00000 n -0000259989 00000 n -0000260136 00000 n -0000260213 00000 n -0000260298 00000 n -0000260445 00000 n -0000260548 00000 n -0000260695 00000 n -0000260845 00000 n -0000260992 00000 n -0000261069 00000 n -0000261146 00000 n -0000261231 00000 n -0000261378 00000 n -0000261472 00000 n -0000261619 00000 n -0000261768 00000 n -0000261853 00000 n -0000262000 00000 n -0000262077 00000 n -0000262178 00000 n -0000262275 00000 n -0000262456 00000 n -0000262551 00000 n -0000262646 00000 n -0000262741 00000 n -0000262836 00000 n -0000262929 00000 n -0000263022 00000 n -0000263119 00000 n -0000263234 00000 n -0000263327 00000 n -0000263422 00000 n -0000263582 00000 n -0000263736 00000 n -0000263890 00000 n -0000263983 00000 n -0000264108 00000 n -0000264216 00000 n -0000264310 00000 n -0000264483 00000 n -0000264576 00000 n -0000264680 00000 n -0000264774 00000 n -0000264867 00000 n -0000264960 00000 n -0000265317 00000 n -0000265411 00000 n -0000265507 00000 n -0000265603 00000 n -0000265698 00000 n -0000265792 00000 n -0000265885 00000 n -0000265993 00000 n -0000266088 00000 n -0000266182 00000 n -0000266275 00000 n -0000266383 00000 n -0000266478 00000 n -0000266572 00000 n -0000266665 00000 n -0000266782 00000 n -0000266877 00000 n -0000266972 00000 n -0000267066 00000 n -0000267163 00000 n -0000267305 00000 n -0000267400 00000 n -0000267495 00000 n -0000267588 00000 n -0000267742 00000 n -0000267837 00000 n -0000268020 00000 n -0000268113 00000 n -0000268218 00000 n -0000268313 00000 n -0000268407 00000 n -0000268500 00000 n -0000268617 00000 n -0000268712 00000 n -0000268807 00000 n -0000268901 00000 n -0000268994 00000 n -0000269099 00000 n -0000269194 00000 n -0000269288 00000 n -0000269381 00000 n -0000269486 00000 n -0000269581 00000 n -0000269675 00000 n -0000269768 00000 n -0000269873 00000 n -0000269968 00000 n -0000270062 00000 n -0000270155 00000 n -0000270260 00000 n -0000270355 00000 n -0000270449 00000 n -0000270562 00000 n -0000270655 00000 n -0000270758 00000 n -0000270882 00000 n -0000270975 00000 n -0000271129 00000 n -0000271263 00000 n -0000271447 00000 n -0000271540 00000 n -0000271636 00000 n -0000271731 00000 n -0000271826 00000 n -0000271921 00000 n -0000272014 00000 n -0000272132 00000 n -0000272593 00000 n -0000272746 00000 n -0000272843 00000 n -0000272937 00000 n -0000273036 00000 n -0000273130 00000 n -0000273389 00000 n -0000273544 00000 n -0000273640 00000 n -0000273739 00000 n -0000273833 00000 n -0000273929 00000 n -0000274025 00000 n -0000274180 00000 n -0000274276 00000 n -0000274372 00000 n -0000274468 00000 n -0000274623 00000 n -0000274768 00000 n -0000275060 00000 n -0000275137 00000 n -0000275240 00000 n -0000275388 00000 n -0000275539 00000 n -0000275687 00000 n -0000275764 00000 n -0000275841 00000 n -0000275926 00000 n -0000276074 00000 n -0000276213 00000 n -0000276361 00000 n -0000276517 00000 n -0000276667 00000 n -0000276817 00000 n -0000276968 00000 n -0000277116 00000 n -0000277266 00000 n -0000277343 00000 n -0000277420 00000 n -0000277505 00000 n -0000277653 00000 n -0000277783 00000 n -0000277939 00000 n -0000278089 00000 n -0000278239 00000 n -0000278390 00000 n -0000278538 00000 n -0000278688 00000 n -0000278765 00000 n -0000278842 00000 n -0000278919 00000 n -0000279004 00000 n -0000279152 00000 n -0000279237 00000 n -0000279386 00000 n -0000279463 00000 n -0000279548 00000 n -0000279695 00000 n -0000279798 00000 n -0000279945 00000 n -0000280095 00000 n -0000280242 00000 n -0000280319 00000 n -0000280396 00000 n -0000280481 00000 n -0000280628 00000 n -0000280722 00000 n -0000280869 00000 n -0000281018 00000 n -0000281103 00000 n -0000281250 00000 n -0000281327 00000 n -0000281428 00000 n -0000281525 00000 n -0000281763 00000 n -0000281917 00000 n -0000282012 00000 n -0000282166 00000 n -0000282261 00000 n -0000282356 00000 n -0000282451 00000 n -0000282544 00000 n -0000282639 00000 n -0000282734 00000 n -0000282827 00000 n -0000282981 00000 n -0000283098 00000 n -0000283270 00000 n -0000283424 00000 n -0000283578 00000 n -0000283671 00000 n -0000283766 00000 n -0000283861 00000 n -0000283954 00000 n -0000284087 00000 n -0000284241 00000 n -0000284336 00000 n -0000284490 00000 n -0000284635 00000 n -0000285485 00000 n -0000285562 00000 n -0000285665 00000 n -0000285812 00000 n -0000285962 00000 n -0000286109 00000 n -0000286186 00000 n -0000286263 00000 n -0000286340 00000 n -0000286425 00000 n -0000286572 00000 n -0000286657 00000 n -0000286806 00000 n -0000286883 00000 n -0000286968 00000 n -0000287115 00000 n -0000287218 00000 n -0000287365 00000 n -0000287515 00000 n -0000287662 00000 n -0000287739 00000 n -0000287816 00000 n -0000287893 00000 n -0000287978 00000 n -0000288125 00000 n -0000288264 00000 n -0000288411 00000 n -0000288560 00000 n -0000288710 00000 n -0000288857 00000 n -0000289007 00000 n -0000289154 00000 n -0000289303 00000 n -0000289380 00000 n -0000289465 00000 n -0000289612 00000 n -0000289715 00000 n -0000289862 00000 n -0000290012 00000 n -0000290159 00000 n -0000290236 00000 n -0000290321 00000 n -0000290468 00000 n -0000290562 00000 n -0000290709 00000 n -0000290858 00000 n -0000290935 00000 n -0000291012 00000 n -0000291097 00000 n -0000291243 00000 n -0000291337 00000 n -0000291483 00000 n -0000291631 00000 n -0000291716 00000 n -0000291862 00000 n -0000291965 00000 n -0000292111 00000 n -0000292260 00000 n -0000292406 00000 n -0000292483 00000 n -0000292560 00000 n -0000292637 00000 n -0000292722 00000 n -0000292868 00000 n -0000292953 00000 n -0000293101 00000 n -0000293178 00000 n -0000293263 00000 n -0000293409 00000 n -0000293512 00000 n -0000293660 00000 n -0000293811 00000 n -0000293959 00000 n -0000294036 00000 n -0000294113 00000 n -0000294190 00000 n -0000294275 00000 n -0000294423 00000 n -0000294553 00000 n -0000294705 00000 n -0000294855 00000 n -0000295054 00000 n -0000295205 00000 n -0000295353 00000 n -0000295503 00000 n -0000295580 00000 n -0000295665 00000 n -0000295813 00000 n -0000295916 00000 n -0000296064 00000 n -0000296215 00000 n -0000296363 00000 n -0000296440 00000 n -0000296525 00000 n -0000296673 00000 n -0000296830 00000 n -0000296982 00000 n -0000297181 00000 n -0000297332 00000 n -0000297480 00000 n -0000297631 00000 n -0000297783 00000 n -0000297933 00000 n -0000298084 00000 n -0000298232 00000 n -0000298309 00000 n -0000298394 00000 n -0000298542 00000 n -0000298654 00000 n -0000298802 00000 n -0000298953 00000 n -0000299105 00000 n -0000299304 00000 n -0000299381 00000 n -0000299458 00000 n -0000299543 00000 n -0000299691 00000 n -0000299785 00000 n -0000299933 00000 n -0000300083 00000 n -0000300168 00000 n -0000300316 00000 n -0000300419 00000 n -0000300567 00000 n -0000300718 00000 n -0000300866 00000 n -0000300943 00000 n -0000301020 00000 n -0000301097 00000 n -0000301182 00000 n -0000301330 00000 n -0000301415 00000 n -0000301565 00000 n -0000301642 00000 n -0000301727 00000 n -0000301875 00000 n -0000301978 00000 n -0000302126 00000 n -0000302277 00000 n -0000302425 00000 n -0000302502 00000 n -0000302579 00000 n -0000302656 00000 n -0000302741 00000 n -0000302889 00000 n -0000303028 00000 n -0000303176 00000 n -0000303326 00000 n -0000303477 00000 n -0000303625 00000 n -0000303776 00000 n -0000303924 00000 n -0000304074 00000 n -0000304151 00000 n -0000304236 00000 n -0000304384 00000 n -0000304496 00000 n -0000304648 00000 n -0000304798 00000 n -0000304948 00000 n -0000305098 00000 n -0000305175 00000 n -0000305260 00000 n -0000305408 00000 n -0000305511 00000 n -0000305659 00000 n -0000305810 00000 n -0000305958 00000 n -0000306035 00000 n -0000306120 00000 n -0000306268 00000 n -0000306398 00000 n -0000306550 00000 n -0000306700 00000 n -0000306850 00000 n -0000307001 00000 n -0000307149 00000 n -0000307299 00000 n -0000307376 00000 n -0000307461 00000 n -0000307609 00000 n -0000307721 00000 n -0000307888 00000 n -0000308035 00000 n -0000308185 00000 n -0000308332 00000 n -0000308409 00000 n -0000308486 00000 n -0000308571 00000 n -0000308718 00000 n -0000308812 00000 n -0000308959 00000 n -0000309108 00000 n -0000309193 00000 n -0000309340 00000 n -0000309417 00000 n -0000309518 00000 n -0000309615 00000 n -0000309928 00000 n -0000310023 00000 n -0000310118 00000 n -0000310213 00000 n -0000310308 00000 n -0000310406 00000 n -0000310501 00000 n -0000310596 00000 n -0000310691 00000 n -0000310845 00000 n -0000310941 00000 n -0000311037 00000 n -0000311122 00000 n -0000311267 00000 n -0000311440 00000 n -0000311525 00000 n -0000311670 00000 n -0000311842 00000 n -0000311937 00000 n -0000312032 00000 n -0000312127 00000 n -0000312222 00000 n -0000312317 00000 n -0000312471 00000 n -0000312625 00000 n -0000312770 00000 n -0000313233 00000 n -0000313310 00000 n -0000313404 00000 n -0000313551 00000 n -0000313700 00000 n -0000313777 00000 n -0000313862 00000 n -0000314009 00000 n -0000314094 00000 n -0000314241 00000 n -0000314318 00000 n -0000314403 00000 n -0000314550 00000 n -0000314671 00000 n -0000314818 00000 n -0000314968 00000 n -0000315115 00000 n -0000315265 00000 n -0000315412 00000 n -0000315489 00000 n -0000315583 00000 n -0000315730 00000 n -0000315859 00000 n -0000315980 00000 n -0000316127 00000 n -0000316277 00000 n -0000316424 00000 n -0000316574 00000 n -0000316721 00000 n -0000316798 00000 n -0000316883 00000 n -0000317030 00000 n -0000317133 00000 n -0000317280 00000 n -0000317430 00000 n -0000317577 00000 n -0000317654 00000 n -0000317739 00000 n -0000317886 00000 n -0000317971 00000 n -0000318118 00000 n -0000318195 00000 n -0000318272 00000 n -0000318349 00000 n -0000318434 00000 n -0000318581 00000 n -0000318693 00000 n -0000318843 00000 n -0000318990 00000 n -0000319140 00000 n -0000319287 00000 n -0000319364 00000 n -0000319441 00000 n -0000319518 00000 n -0000319595 00000 n -0000319680 00000 n -0000319827 00000 n -0000319930 00000 n -0000320080 00000 n -0000320229 00000 n -0000320378 00000 n -0000320455 00000 n -0000320532 00000 n -0000320617 00000 n -0000320764 00000 n -0000320849 00000 n -0000320996 00000 n -0000321073 00000 n -0000321150 00000 n -0000321227 00000 n -0000321312 00000 n -0000321459 00000 n -0000321553 00000 n -0000321700 00000 n -0000321849 00000 n -0000321926 00000 n -0000322003 00000 n -0000322097 00000 n -0000322244 00000 n -0000322373 00000 n -0000322467 00000 n -0000322614 00000 n -0000322763 00000 n -0000322848 00000 n -0000322995 00000 n -0000323072 00000 n -0000323172 00000 n -0000323268 00000 n -0000323837 00000 n -0000323934 00000 n -0000324028 00000 n -0000324125 00000 n -0000324280 00000 n -0000324376 00000 n -0000324470 00000 n -0000324625 00000 n -0000324721 00000 n -0000324820 00000 n -0000324975 00000 n -0000325071 00000 n -0000325167 00000 n -0000325263 00000 n -0000325362 00000 n -0000325458 00000 n -0000325552 00000 n -0000325707 00000 n -0000325928 00000 n -0000326024 00000 n -0000326179 00000 n -0000326282 00000 n -0000326378 00000 n -0000326474 00000 n -0000326629 00000 n -0000326784 00000 n -0000326880 00000 n -0000326974 00000 n -0000327098 00000 n -0000327383 00000 n -0000327479 00000 n -0000327634 00000 n -0000327733 00000 n -0000327832 00000 n -0000327928 00000 n -0000328024 00000 n -0000328179 00000 n -0000328278 00000 n -0000328374 00000 n -0000328473 00000 n -0000328569 00000 n -0000328665 00000 n -0000328763 00000 n -0000328908 00000 n -0000329272 00000 n -0000329349 00000 n -0000329434 00000 n -0000329584 00000 n -0000329661 00000 n -0000329738 00000 n -0000329815 00000 n -0000329892 00000 n -0000329977 00000 n -0000330125 00000 n -0000330210 00000 n -0000330358 00000 n -0000330435 00000 n -0000330512 00000 n -0000330589 00000 n -0000330666 00000 n -0000330743 00000 n -0000330828 00000 n -0000330976 00000 n -0000331160 00000 n -0000331308 00000 n -0000331458 00000 n -0000331606 00000 n -0000331754 00000 n -0000331905 00000 n -0000332053 00000 n -0000332201 00000 n -0000332353 00000 n -0000332503 00000 n -0000332653 00000 n -0000332800 00000 n -0000332949 00000 n -0000333026 00000 n -0000333103 00000 n -0000333180 00000 n -0000333257 00000 n -0000333342 00000 n -0000333489 00000 n -0000333601 00000 n -0000333751 00000 n -0000333900 00000 n -0000334049 00000 n -0000334198 00000 n -0000334275 00000 n -0000334352 00000 n -0000334429 00000 n -0000334514 00000 n -0000334661 00000 n -0000334773 00000 n -0000334923 00000 n -0000335072 00000 n -0000335221 00000 n -0000335370 00000 n -0000335447 00000 n -0000335524 00000 n -0000335609 00000 n -0000335756 00000 n -0000335850 00000 n -0000335997 00000 n -0000336146 00000 n -0000336231 00000 n -0000336378 00000 n -0000336455 00000 n -0000336556 00000 n -0000336653 00000 n -0000336849 00000 n -0000337003 00000 n -0000337098 00000 n -0000337202 00000 n -0000337356 00000 n -0000337510 00000 n -0000337605 00000 n -0000337700 00000 n -0000337854 00000 n -0000337999 00000 n -0000338507 00000 n -0000338584 00000 n -0000338678 00000 n -0000338825 00000 n -0000338974 00000 n -0000339051 00000 n -0000339136 00000 n -0000339283 00000 n -0000339368 00000 n -0000339515 00000 n -0000339592 00000 n -0000339669 00000 n -0000339746 00000 n -0000339831 00000 n -0000339978 00000 n -0000340099 00000 n -0000340264 00000 n -0000340414 00000 n -0000340561 00000 n -0000340708 00000 n -0000340857 00000 n -0000340934 00000 n -0000341011 00000 n -0000341088 00000 n -0000341165 00000 n -0000341250 00000 n -0000341397 00000 n -0000341500 00000 n -0000341650 00000 n -0000341799 00000 n -0000341948 00000 n -0000342025 00000 n -0000342102 00000 n -0000342187 00000 n -0000342334 00000 n -0000342419 00000 n -0000342566 00000 n -0000342643 00000 n -0000342720 00000 n -0000342805 00000 n -0000342952 00000 n -0000343082 00000 n -0000343256 00000 n -0000343406 00000 n -0000343556 00000 n -0000343703 00000 n -0000343850 00000 n -0000343997 00000 n -0000344074 00000 n -0000344151 00000 n -0000344236 00000 n -0000344383 00000 n -0000344513 00000 n -0000344672 00000 n -0000344822 00000 n -0000344969 00000 n -0000345115 00000 n -0000345264 00000 n -0000345410 00000 n -0000345487 00000 n -0000345564 00000 n -0000345641 00000 n -0000345726 00000 n -0000345872 00000 n -0000345966 00000 n -0000346112 00000 n -0000346260 00000 n -0000346337 00000 n -0000346414 00000 n -0000346499 00000 n -0000346645 00000 n -0000346739 00000 n -0000346885 00000 n -0000347033 00000 n -0000347118 00000 n -0000347264 00000 n -0000347385 00000 n -0000347560 00000 n -0000347712 00000 n -0000347860 00000 n -0000348008 00000 n -0000348158 00000 n -0000348235 00000 n -0000348320 00000 n -0000348468 00000 n -0000348598 00000 n -0000348761 00000 n -0000348913 00000 n -0000349061 00000 n -0000349209 00000 n -0000349360 00000 n -0000349508 00000 n -0000349585 00000 n -0000349662 00000 n -0000349747 00000 n -0000349895 00000 n -0000349989 00000 n -0000350137 00000 n -0000350287 00000 n -0000350372 00000 n -0000350520 00000 n -0000350597 00000 n -0000350699 00000 n -0000350797 00000 n -0000351027 00000 n -0000351123 00000 n -0000351234 00000 n -0000351353 00000 n -0000351449 00000 n -0000351604 00000 n -0000351700 00000 n -0000351855 00000 n -0000351958 00000 n -0000352077 00000 n -0000352175 00000 n -0000352422 00000 n -0000352520 00000 n -0000352614 00000 n -0000352710 00000 n -0000352809 00000 n -0000352905 00000 n -0000353028 00000 n -0000353124 00000 n -0000353235 00000 n -0000353390 00000 n -0000353486 00000 n -0000353637 00000 n -0000353792 00000 n -0000353885 00000 n -0000354004 00000 n -0000354139 00000 n -0000354235 00000 n -0000354330 00000 n -0000354423 00000 n -0000354542 00000 n -0000354669 00000 n -0000354765 00000 n -0000354860 00000 n -0000354953 00000 n -0000355072 00000 n -0000355207 00000 n -0000355303 00000 n -0000355398 00000 n -0000355504 00000 n -0000355658 00000 n -0000355780 00000 n -0000356039 00000 n -0000356134 00000 n -0000356229 00000 n -0000356383 00000 n -0000356487 00000 n -0000356582 00000 n -0000356677 00000 n -0000356772 00000 n -0000356867 00000 n -0000356962 00000 n -0000357116 00000 n -0000357214 00000 n -0000357309 00000 n -0000357404 00000 n -0000357612 00000 n -0000357707 00000 n -0000357802 00000 n -0000357909 00000 n -0000358004 00000 n -0000358158 00000 n -0000358253 00000 n -0000358407 00000 n -0000358511 00000 n -0000358606 00000 n -0000358751 00000 n -0000359412 00000 n -0000359489 00000 n -0000359583 00000 n -0000359730 00000 n -0000359879 00000 n -0000359956 00000 n -0000360041 00000 n -0000360188 00000 n -0000360291 00000 n -0000360438 00000 n -0000360588 00000 n -0000360735 00000 n -0000360812 00000 n -0000360897 00000 n -0000361044 00000 n -0000361129 00000 n -0000361276 00000 n -0000361353 00000 n -0000361430 00000 n -0000361515 00000 n -0000361662 00000 n -0000361774 00000 n -0000361924 00000 n -0000362073 00000 n -0000362223 00000 n -0000362370 00000 n -0000362447 00000 n -0000362524 00000 n -0000362609 00000 n -0000362756 00000 n -0000362859 00000 n -0000363006 00000 n -0000363156 00000 n -0000363303 00000 n -0000363380 00000 n -0000363457 00000 n -0000363542 00000 n -0000363689 00000 n -0000363801 00000 n -0000363951 00000 n -0000364100 00000 n -0000364249 00000 n -0000364398 00000 n -0000364475 00000 n -0000364552 00000 n -0000364629 00000 n -0000364714 00000 n -0000364860 00000 n -0000364954 00000 n -0000365100 00000 n -0000365248 00000 n -0000365325 00000 n -0000365410 00000 n -0000365556 00000 n -0000365677 00000 n -0000365823 00000 n -0000365972 00000 n -0000366118 00000 n -0000366267 00000 n -0000366413 00000 n -0000366490 00000 n -0000366575 00000 n -0000366721 00000 n -0000366824 00000 n -0000366972 00000 n -0000367123 00000 n -0000367271 00000 n -0000367348 00000 n -0000367425 00000 n -0000367510 00000 n -0000367658 00000 n -0000367752 00000 n -0000367900 00000 n -0000368050 00000 n -0000368135 00000 n -0000368283 00000 n -0000368377 00000 n -0000368525 00000 n -0000368675 00000 n -0000368752 00000 n -0000368837 00000 n -0000368985 00000 n -0000369097 00000 n -0000369249 00000 n -0000369399 00000 n -0000369549 00000 n -0000369699 00000 n -0000369776 00000 n -0000369853 00000 n -0000369938 00000 n -0000370086 00000 n -0000370207 00000 n -0000370355 00000 n -0000370506 00000 n -0000370658 00000 n -0000370808 00000 n -0000370958 00000 n -0000371035 00000 n -0000371112 00000 n -0000371197 00000 n -0000371345 00000 n -0000371457 00000 n -0000371609 00000 n -0000371759 00000 n -0000371910 00000 n -0000372058 00000 n -0000372135 00000 n -0000372212 00000 n -0000372289 00000 n -0000372374 00000 n -0000372522 00000 n -0000372616 00000 n -0000372764 00000 n -0000372914 00000 n -0000372991 00000 n -0000373076 00000 n -0000373224 00000 n -0000373327 00000 n -0000373475 00000 n -0000373626 00000 n -0000373774 00000 n -0000373851 00000 n -0000373936 00000 n -0000374084 00000 n -0000374187 00000 n -0000374335 00000 n -0000374486 00000 n -0000374634 00000 n -0000374711 00000 n -0000374788 00000 n -0000374873 00000 n -0000375021 00000 n -0000375115 00000 n -0000375263 00000 n -0000375413 00000 n -0000375498 00000 n -0000375646 00000 n -0000375723 00000 n -0000375825 00000 n -0000375923 00000 n -0000376089 00000 n -0000376185 00000 n -0000376284 00000 n -0000376383 00000 n -0000376490 00000 n -0000376586 00000 n -0000376741 00000 n -0000376994 00000 n -0000377101 00000 n -0000377204 00000 n -0000377315 00000 n -0000377422 00000 n -0000377577 00000 n -0000377684 00000 n -0000377780 00000 n -0000377876 00000 n -0000377972 00000 n -0000378126 00000 n -0000378244 00000 n -0000378389 00000 n -0000378543 00000 n -0000378697 00000 n -0000378851 00000 n -0000379005 00000 n -0000379098 00000 n -0000379235 00000 n -0000379340 00000 n -0000379553 00000 n -0000379637 00000 n -0000379915 00000 n -0000380008 00000 n -0000380163 00000 n -0000380258 00000 n -0000380395 00000 n -0000380493 00000 n -0000380586 00000 n -0000380723 00000 n -0000380818 00000 n -0000380955 00000 n -0000381065 00000 n -0000381158 00000 n -0000381295 00000 n -0000381390 00000 n -0000381527 00000 n -0000381634 00000 n -0000381727 00000 n -0000381864 00000 n -0000381959 00000 n -0000382096 00000 n -0000382203 00000 n -0000382296 00000 n -0000382451 00000 n -0000382546 00000 n -0000382683 00000 n -0000382784 00000 n -0000382877 00000 n -0000383014 00000 n -0000383109 00000 n -0000383246 00000 n -0000383359 00000 n -0000383452 00000 n -0000383589 00000 n -0000383684 00000 n -0000383821 00000 n -0000383934 00000 n -0000384027 00000 n -0000384191 00000 n -0000384286 00000 n -0000384381 00000 n -0000384545 00000 n -0000384658 00000 n -0000384765 00000 n -0000384858 00000 n -0000385034 00000 n -0000385129 00000 n -0000385224 00000 n -0000385319 00000 n -0000385495 00000 n -0000385596 00000 n -0000385697 00000 n -0000385795 00000 n -0000385888 00000 n -0000386025 00000 n -0000386120 00000 n -0000386257 00000 n -0000386367 00000 n -0000386460 00000 n -0000386606 00000 n -0000386770 00000 n -0000386874 00000 n -0000386973 00000 n -0000387066 00000 n -0000387220 00000 n -0000387314 00000 n -0000387451 00000 n -0000387550 00000 n -0000387634 00000 n -0000387912 00000 n -0000387996 00000 n -0000388274 00000 n -0000388361 00000 n -0000388454 00000 n -0000388617 00000 n -0000388713 00000 n -0000388894 00000 n -0000388990 00000 n -0000389135 00000 n -0000389231 00000 n -0000389327 00000 n -0000389414 00000 n -0000389498 00000 n -0000389759 00000 n -0000389848 00000 n -0000389995 00000 n -0000390323 00000 n -0000390478 00000 n -0000390574 00000 n -0000390670 00000 n -0000390769 00000 n -0000390879 00000 n -0000390974 00000 n -0000391072 00000 n -0000391167 00000 n -0000391321 00000 n -0000391416 00000 n -0000391511 00000 n -0000391609 00000 n -0000391704 00000 n -0000391802 00000 n -0000391897 00000 n -0000392051 00000 n -0000392144 00000 n -0000392280 00000 n -0000392375 00000 n -0000392470 00000 n -0000392624 00000 n -0000392739 00000 n -0000392965 00000 n -0000393119 00000 n -0000393212 00000 n -0000393366 00000 n -0000393459 00000 n -0000393613 00000 n -0000393706 00000 n -0000393799 00000 n -0000393953 00000 n -0000394046 00000 n -0000394178 00000 n -0000394316 00000 n -0000394470 00000 n -0000394624 00000 n -0000394720 00000 n -0000394991 00000 n -0000395087 00000 n -0000395182 00000 n -0000395277 00000 n -0000395374 00000 n -0000395537 00000 n -0000395691 00000 n -0000395807 00000 n -0000395902 00000 n -0000395999 00000 n -0000396093 00000 n -0000396226 00000 n -0000396332 00000 n -0000396486 00000 n -0000396631 00000 n -0000396778 00000 n -0000396871 00000 n -0000396991 00000 n -0000397092 00000 n -0000397185 00000 n -0000397279 00000 n -0000397372 00000 n -0000397480 00000 n -0000397573 00000 n -0000397667 00000 n -0000397792 00000 n -0000397885 00000 n -0000397995 00000 n -0000398098 00000 n -0000398240 00000 n -0000398333 00000 n -0000398426 00000 n -0000398527 00000 n -0000398624 00000 n -0000398779 00000 n -0000398872 00000 n -0000398977 00000 n -0000399071 00000 n -0000399164 00000 n -0000399263 00000 n -0000399357 00000 n -0000399450 00000 n -0000399546 00000 n -0000399640 00000 n -0000399772 00000 n -0000399869 00000 n -0000399968 00000 n -0000400064 00000 n -0000400414 00000 n -0000400513 00000 n -0000400612 00000 n -0000400711 00000 n -0000400810 00000 n -0000400909 00000 n -0000401008 00000 n -0000401107 00000 n -0000401206 00000 n -0000401309 00000 n -0000401408 00000 n -0000401571 00000 n -0000401727 00000 n -0000401820 00000 n -0000401926 00000 n -0000402025 00000 n -0000402120 00000 n -0000402213 00000 n -0000402319 00000 n -0000402426 00000 n -0000402520 00000 n -0000402613 00000 n -0000402718 00000 n -0000402816 00000 n -0000402910 00000 n -0000403002 00000 n -0000403197 00000 n -0000403310 00000 n -0000403411 00000 n -0000403514 00000 n -0000403659 00000 n -0000403757 00000 n -0000403911 00000 n -0000404012 00000 n -0000404110 00000 n -0000404228 00000 n -0000404352 00000 n -0000404450 00000 n -0000404604 00000 n -0000404727 00000 n -0000404827 00000 n -0000404982 00000 n -0000405075 00000 n -0000405174 00000 n -0000405268 00000 n -0000405361 00000 n -0000405538 00000 n -0000405633 00000 n -0000405728 00000 n -0000405823 00000 n -0000405918 00000 n -0000406013 00000 n -0000406108 00000 n -0000406202 00000 n -0000406295 00000 n -0000406479 00000 n -0000406574 00000 n -0000406669 00000 n -0000406764 00000 n -0000406859 00000 n -0000406954 00000 n -0000407049 00000 n -0000407143 00000 n -0000407236 00000 n -0000407326 00000 n -0000407419 00000 n -0000407556 00000 n -0000407666 00000 n -0000407760 00000 n -0000407854 00000 n -0000407948 00000 n -0000408042 00000 n -0000408131 00000 n -0000408277 00000 n -0000408484 00000 n -0000408639 00000 n -0000408733 00000 n -0000408829 00000 n -0000408925 00000 n -0000409021 00000 n -0000409117 00000 n -0000409213 00000 n -0000409351 00000 n -0000409450 00000 n -0000409561 00000 n -0000409676 00000 n -0000409769 00000 n -0000409906 00000 n -0000410106 00000 n -0000410237 00000 n -0000410333 00000 n -0000410464 00000 n -0000410560 00000 n -0000410691 00000 n -0000410787 00000 n -0000410918 00000 n -0000411014 00000 n -0000411145 00000 n -0000411241 00000 n -0000411369 00000 n -0000411464 00000 n -0000411562 00000 n -0000411657 00000 n -0000411746 00000 n -0000411894 00000 n -0000412051 00000 n -0000412205 00000 n -0000412300 00000 n -0000412395 00000 n -0000412490 00000 n -0000412585 00000 n -0000412733 00000 n -0000412834 00000 n -0000412935 00000 n -0000413036 00000 n -0000413137 00000 n -0000413264 00000 n -0000413365 00000 n -0000413460 00000 n -0000413639 00000 n -0000413836 00000 n -0000413963 00000 n -0000414061 00000 n -0000414168 00000 n -0000414260 00000 n -0000414512 00000 n -0000414608 00000 n -0000414704 00000 n -0000414803 00000 n -0000414899 00000 n -0000414995 00000 n -0000415091 00000 n -0000415187 00000 n -0000415283 00000 n -0000415382 00000 n -0000415478 00000 n -0000415577 00000 n -0000415673 00000 n -0000415787 00000 n -0000416003 00000 n -0000416099 00000 n -0000416195 00000 n -0000416294 00000 n -0000416393 00000 n -0000416516 00000 n -0000416679 00000 n -0000416773 00000 n -0000416880 00000 n -0000417006 00000 n -0000417102 00000 n -0000417205 00000 n -0000417298 00000 n -0000417435 00000 n -0000417545 00000 n -0000417641 00000 n -0000417737 00000 n -0000417833 00000 n -0000417929 00000 n -0000418018 00000 n -0000418166 00000 n -0000418368 00000 n -0000418523 00000 n -0000418619 00000 n -0000418774 00000 n -0000418885 00000 n -0000418981 00000 n -0000419075 00000 n -0000419214 00000 n -0000419345 00000 n -0000419444 00000 n -0000419543 00000 n -0000419688 00000 n -0000419890 00000 n -0000420011 00000 n -0000420202 00000 n -0000420443 00000 n -0000420644 00000 n -0000420797 00000 n -0000420986 00000 n -0000421071 00000 n -0000421221 00000 n -0000421306 00000 n -0000421468 00000 n -0000421553 00000 n -0000421703 00000 n -0000421788 00000 n -0000421938 00000 n -0000422023 00000 n -0000422173 00000 n -0000422258 00000 n -0000422414 00000 n -0000422499 00000 n -0000422655 00000 n -0000422740 00000 n -0000422890 00000 n -0000422975 00000 n -0000423128 00000 n -0000423213 00000 n -0000423363 00000 n -0000423448 00000 n -0000423604 00000 n -0000423689 00000 n -0000423839 00000 n -0000423924 00000 n -0000424080 00000 n -0000424193 00000 n -0000424297 00000 n -0000424400 00000 n -0000424517 00000 n -0000424618 00000 n -0000424722 00000 n -0000424885 00000 n -0000425050 00000 n -0000425197 00000 n -0000425290 00000 n -0000425394 00000 n -0000425497 00000 n -0000425590 00000 n -0000425683 00000 n -0000425787 00000 n -0000425884 00000 n -0000425977 00000 n -0000426070 00000 n -0000426157 00000 n -0000426259 00000 n -0000426358 00000 n -0000426453 00000 n -0000426546 00000 n -0000426652 00000 n -0000426751 00000 n -0000426846 00000 n -0000426939 00000 n -0000427045 00000 n -0000427144 00000 n -0000427239 00000 n -0000427358 00000 n -0000427481 00000 n -0000427592 00000 n -0000428055 00000 n -0000428187 00000 n -0000428298 00000 n -0000428405 00000 n -0000428511 00000 n -0000428650 00000 n -0000428744 00000 n -0000428840 00000 n -0000428936 00000 n -0000429050 00000 n -0000429172 00000 n -0000429327 00000 n -0000429426 00000 n -0000429627 00000 n -0000429721 00000 n -0000429940 00000 n -0000430135 00000 n -0000430220 00000 n -0000430371 00000 n -0000430456 00000 n -0000430623 00000 n -0000430708 00000 n -0000430859 00000 n -0000430944 00000 n -0000431095 00000 n -0000431180 00000 n -0000431331 00000 n -0000431416 00000 n -0000431575 00000 n -0000431660 00000 n -0000431819 00000 n -0000431904 00000 n -0000432055 00000 n -0000432140 00000 n -0000432295 00000 n -0000432380 00000 n -0000432531 00000 n -0000432616 00000 n -0000432771 00000 n -0000432856 00000 n -0000433007 00000 n -0000433092 00000 n -0000433251 00000 n -0000433429 00000 n -0000433528 00000 n -0000433635 00000 n -0000433734 00000 n -0000433849 00000 n -0000434004 00000 n -0000434107 00000 n -0000434261 00000 n -0000434410 00000 n -0000434513 00000 n -0000434620 00000 n -0000434723 00000 n -0000434822 00000 n -0000435101 00000 n -0000435283 00000 n -0000435381 00000 n -0000435479 00000 n -0000435577 00000 n -0000435678 00000 n -0000435812 00000 n -0000435905 00000 n -0000436008 00000 n -0000436189 00000 n -0000436284 00000 n -0000436379 00000 n -0000436533 00000 n -0000436626 00000 n -0000436724 00000 n -0000436817 00000 n -0000437714 00000 n -0000437807 00000 n -0000437905 00000 n -0000438059 00000 n -0000438172 00000 n -0000438270 00000 n -0000438362 00000 n -0000438459 00000 n -0000438558 00000 n -0000438655 00000 n -0000438984 00000 n -0000439083 00000 n -0000439179 00000 n -0000439303 00000 n -0000439396 00000 n -0000439533 00000 n -0000439643 00000 n -0000439739 00000 n -0000439835 00000 n -0000439931 00000 n -0000440027 00000 n -0000440116 00000 n -0000440264 00000 n -0000440522 00000 n -0000440677 00000 n -0000440773 00000 n -0000440872 00000 n -0000440968 00000 n -0000441062 00000 n -0000441158 00000 n -0000441254 00000 n -0000441361 00000 n -0000441455 00000 n -0000441549 00000 n -0000441712 00000 n -0000441859 00000 n -0000441952 00000 n -0000442058 00000 n -0000442169 00000 n -0000442264 00000 n -0000442357 00000 n -0000442471 00000 n -0000442582 00000 n -0000442677 00000 n -0000442783 00000 n -0000442898 00000 n -0000443081 00000 n -0000443209 00000 n -0000443308 00000 n -0000443402 00000 n -0000443508 00000 n -0000443651 00000 n -0000443806 00000 n -0000443905 00000 n -0000443999 00000 n -0000444123 00000 n -0000444313 00000 n -0000444468 00000 n -0000444579 00000 n -0000444678 00000 n -0000444837 00000 n -0000444936 00000 n -0000445035 00000 n -0000445180 00000 n -0000445634 00000 n -0000445719 00000 n -0000446038 00000 n -0000446123 00000 n -0000446274 00000 n -0000446359 00000 n -0000446526 00000 n -0000446611 00000 n -0000446762 00000 n -0000446847 00000 n -0000447014 00000 n -0000447099 00000 n -0000447250 00000 n -0000447335 00000 n -0000447486 00000 n -0000447571 00000 n -0000447758 00000 n -0000447843 00000 n -0000447994 00000 n -0000448079 00000 n -0000448234 00000 n -0000448319 00000 n -0000448470 00000 n -0000448555 00000 n -0000448734 00000 n -0000448819 00000 n -0000448970 00000 n -0000449055 00000 n -0000449206 00000 n -0000449291 00000 n -0000449548 00000 n -0000449633 00000 n -0000449783 00000 n -0000449868 00000 n -0000450030 00000 n -0000450115 00000 n -0000450265 00000 n -0000450350 00000 n -0000450512 00000 n -0000450597 00000 n -0000450747 00000 n -0000450832 00000 n -0000450982 00000 n -0000451067 00000 n -0000451244 00000 n -0000451329 00000 n -0000451479 00000 n -0000451564 00000 n -0000451717 00000 n -0000451802 00000 n -0000451952 00000 n -0000452037 00000 n -0000452223 00000 n -0000452308 00000 n -0000452458 00000 n -0000452543 00000 n -0000452693 00000 n -0000452778 00000 n -0000452964 00000 n -0000453049 00000 n -0000453199 00000 n -0000453284 00000 n -0000453446 00000 n -0000453531 00000 n -0000453681 00000 n -0000453766 00000 n -0000453928 00000 n -0000454013 00000 n -0000454163 00000 n -0000454248 00000 n -0000454398 00000 n -0000454483 00000 n -0000454636 00000 n -0000454721 00000 n -0000454871 00000 n -0000454956 00000 n -0000455109 00000 n -0000455194 00000 n -0000455344 00000 n -0000455429 00000 n -0000455592 00000 n -0000455677 00000 n -0000455826 00000 n -0000455911 00000 n -0000456060 00000 n -0000456214 00000 n -0000456317 00000 n -0000456416 00000 n -0000456515 00000 n -0000456614 00000 n -0000456720 00000 n -0000456874 00000 n -0000457200 00000 n -0000457303 00000 n -0000457406 00000 n -0000457541 00000 n -0000457652 00000 n -0000457763 00000 n -0000457857 00000 n -0000457968 00000 n -0000458071 00000 n -0000458174 00000 n -0000458268 00000 n -0000458367 00000 n -0000458466 00000 n -0000458569 00000 n -0000458663 00000 n -0000458762 00000 n -0000458877 00000 n -0000458980 00000 n -0000459291 00000 n -0000459393 00000 n -0000459499 00000 n -0000459625 00000 n -0000459719 00000 n -0000459817 00000 n -0000459942 00000 n -0000460049 00000 n -0000460194 00000 n -0000460648 00000 n -0000460733 00000 n -0000461004 00000 n -0000461089 00000 n -0000461240 00000 n -0000461325 00000 n -0000461492 00000 n -0000461577 00000 n -0000461728 00000 n -0000461813 00000 n -0000461980 00000 n -0000462065 00000 n -0000462216 00000 n -0000462301 00000 n -0000462452 00000 n -0000462537 00000 n -0000462724 00000 n -0000462809 00000 n -0000462960 00000 n -0000463045 00000 n -0000463200 00000 n -0000463285 00000 n -0000463436 00000 n -0000463521 00000 n -0000463680 00000 n -0000463765 00000 n -0000463916 00000 n -0000464001 00000 n -0000464152 00000 n -0000464237 00000 n -0000464536 00000 n -0000464621 00000 n -0000464772 00000 n -0000464857 00000 n -0000465024 00000 n -0000465109 00000 n -0000465260 00000 n -0000465345 00000 n -0000465512 00000 n -0000465597 00000 n -0000465748 00000 n -0000465833 00000 n -0000465984 00000 n -0000466069 00000 n -0000466256 00000 n -0000466341 00000 n -0000466492 00000 n -0000466577 00000 n -0000466732 00000 n -0000466817 00000 n -0000466968 00000 n -0000467053 00000 n -0000467244 00000 n -0000467329 00000 n -0000467480 00000 n -0000467565 00000 n -0000467716 00000 n -0000467801 00000 n -0000467976 00000 n -0000468061 00000 n -0000468212 00000 n -0000468297 00000 n -0000468464 00000 n -0000468549 00000 n -0000468700 00000 n -0000468785 00000 n -0000468936 00000 n -0000469021 00000 n -0000469172 00000 n -0000469257 00000 n -0000469408 00000 n -0000469493 00000 n -0000469660 00000 n -0000469745 00000 n -0000469896 00000 n -0000469981 00000 n -0000470136 00000 n -0000470221 00000 n -0000470372 00000 n -0000470457 00000 n -0000470619 00000 n -0000470704 00000 n -0000470854 00000 n -0000470939 00000 n -0000471089 00000 n -0000471238 00000 n -0000471339 00000 n -0000471437 00000 n -0000471535 00000 n -0000471633 00000 n -0000471736 00000 n -0000471881 00000 n -0000471988 00000 n -0000472086 00000 n -0000472193 00000 n -0000472291 00000 n -0000472454 00000 n -0000472601 00000 n -0000472694 00000 n -0000472805 00000 n -0000472930 00000 n -0000473024 00000 n -0000473117 00000 n -0000473222 00000 n -0000473341 00000 n -0000473435 00000 n -0000473539 00000 n -0000473649 00000 n -0000473859 00000 n -0000473960 00000 n -0000474060 00000 n -0000474176 00000 n -0000474268 00000 n -0000474364 00000 n -0000474511 00000 n -0000474605 00000 n -0000474699 00000 n -0000474798 00000 n -0000474929 00000 n -0000475271 00000 n -0000475370 00000 n -0000475469 00000 n -0000475568 00000 n -0000475679 00000 n -0000475778 00000 n -0000475877 00000 n -0000475996 00000 n -0000476107 00000 n -0000476206 00000 n -0000476305 00000 n -0000476404 00000 n -0000476515 00000 n -0000476614 00000 n -0000476733 00000 n -0000476832 00000 n -0000476931 00000 n -0000477030 00000 n -0000477129 00000 n -0000477263 00000 n -0000477418 00000 n -0000477525 00000 n -0000477670 00000 n -0000477936 00000 n -0000478061 00000 n -0000478174 00000 n -0000478278 00000 n -0000478381 00000 n -0000478529 00000 n -0000478627 00000 n -0000478734 00000 n -0000478835 00000 n -0000478933 00000 n -0000479087 00000 n -0000479179 00000 n -0000479350 00000 n -0000479463 00000 n -0000479556 00000 n -0000479659 00000 n -0000479783 00000 n -0000479881 00000 n -0000479988 00000 n -0000480182 00000 n -0000480775 00000 n -0000480868 00000 n -0000480970 00000 n -0000481067 00000 n -0000481202 00000 n -0000481362 00000 n -0000481465 00000 n -0000481620 00000 n -0000481723 00000 n -0000481842 00000 n -0000481996 00000 n -0000482141 00000 n -0000482260 00000 n -0000482379 00000 n -0000482498 00000 n -0000482609 00000 n -0000482937 00000 n -0000483022 00000 n -0000483237 00000 n -0000483322 00000 n -0000483473 00000 n -0000483558 00000 n -0000483709 00000 n -0000483794 00000 n -0000483945 00000 n -0000484030 00000 n -0000484197 00000 n -0000484282 00000 n -0000484433 00000 n -0000484518 00000 n -0000484669 00000 n -0000484754 00000 n -0000484929 00000 n -0000485014 00000 n -0000485165 00000 n -0000485250 00000 n -0000485401 00000 n -0000485486 00000 n -0000485637 00000 n -0000485722 00000 n -0000485901 00000 n -0000485986 00000 n -0000486137 00000 n -0000486222 00000 n -0000486373 00000 n -0000486458 00000 n -0000486621 00000 n -0000486706 00000 n -0000486857 00000 n -0000486942 00000 n -0000487093 00000 n -0000487178 00000 n -0000487329 00000 n -0000487414 00000 n -0000487565 00000 n -0000487650 00000 n -0000487801 00000 n -0000487886 00000 n -0000488037 00000 n -0000488122 00000 n -0000488277 00000 n -0000488362 00000 n -0000488513 00000 n -0000488598 00000 n -0000488749 00000 n -0000488834 00000 n -0000488985 00000 n -0000489070 00000 n -0000489237 00000 n -0000489322 00000 n -0000489473 00000 n -0000489558 00000 n -0000489709 00000 n -0000489850 00000 n -0000489949 00000 n -0000490048 00000 n -0000490147 00000 n -0000490253 00000 n -0000490422 00000 n -0000490541 00000 n -0000490660 00000 n -0000490763 00000 n -0000490862 00000 n -0000490961 00000 n -0000491124 00000 n -0000491289 00000 n -0000491382 00000 n -0000491488 00000 n -0000491607 00000 n -0000491702 00000 n -0000491795 00000 n -0000491913 00000 n -0000492029 00000 n -0000492133 00000 n -0000492227 00000 n -0000492320 00000 n -0000492437 00000 n -0000492550 00000 n -0000492663 00000 n -0000492757 00000 n -0000492850 00000 n -0000492967 00000 n -0000493080 00000 n -0000493187 00000 n -0000493281 00000 n -0000493412 00000 n -0000493513 00000 n -0000493632 00000 n -0000493736 00000 n -0000493916 00000 n -0000494044 00000 n -0000494137 00000 n -0000494247 00000 n -0000494350 00000 n -0000494477 00000 n -0000494631 00000 n -0000494785 00000 n -0000494904 00000 n -0000495543 00000 n -0000495635 00000 n -0000495729 00000 n -0000495852 00000 n -0000496038 00000 n -0000496193 00000 n -0000496348 00000 n -0000496447 00000 n -0000496546 00000 n -0000496669 00000 n -0000496768 00000 n -0000496971 00000 n -0000497070 00000 n -0000497169 00000 n -0000497268 00000 n -0000497371 00000 n -0000497470 00000 n -0000497577 00000 n -0000497671 00000 n -0000497816 00000 n -0000498043 00000 n -0000498184 00000 n -0000498307 00000 n -0000498406 00000 n -0000498505 00000 n -0000498611 00000 n -0000498716 00000 n -0000498815 00000 n -0000499014 00000 n -0000499162 00000 n -0000499373 00000 n -0000499521 00000 n -0000499676 00000 n -0000499824 00000 n -0000499975 00000 n -0000500123 00000 n -0000500281 00000 n -0000500426 00000 n -0000500592 00000 n -0000500695 00000 n -0000500870 00000 n -0000501065 00000 n -0000501254 00000 n -0000501339 00000 n -0000501489 00000 n -0000501574 00000 n -0000501724 00000 n -0000501809 00000 n -0000501959 00000 n -0000502044 00000 n -0000502200 00000 n -0000502285 00000 n -0000502438 00000 n -0000502523 00000 n -0000502673 00000 n -0000502758 00000 n -0000502908 00000 n -0000502993 00000 n -0000503143 00000 n -0000503228 00000 n -0000503384 00000 n -0000503509 00000 n -0000503613 00000 n -0000503726 00000 n -0000503829 00000 n -0000503935 00000 n -0000504036 00000 n -0000504235 00000 n -0000504382 00000 n -0000504580 00000 n -0000504727 00000 n -0000504880 00000 n -0000505027 00000 n -0000505177 00000 n -0000505324 00000 n -0000505479 00000 n -0000505714 00000 n -0000505818 00000 n -0000505919 00000 n -0000506020 00000 n -0000506118 00000 n -0000506216 00000 n -0000506317 00000 n -0000506418 00000 n -0000506519 00000 n -0000506620 00000 n -0000506721 00000 n -0000506822 00000 n -0000506920 00000 n -0000507023 00000 n -0000507124 00000 n -0000507223 00000 n -0000507320 00000 n -0000507442 00000 n -0000507549 00000 n -0000507652 00000 n -0000507797 00000 n -0000507999 00000 n -0000508093 00000 n -0000508300 00000 n -0000508495 00000 n -0000508580 00000 n -0000508731 00000 n -0000508816 00000 n -0000508983 00000 n -0000509068 00000 n -0000509219 00000 n -0000509304 00000 n -0000509455 00000 n -0000509540 00000 n -0000509691 00000 n -0000509776 00000 n -0000509931 00000 n -0000510016 00000 n -0000510175 00000 n -0000510260 00000 n -0000510411 00000 n -0000510496 00000 n -0000510651 00000 n -0000510736 00000 n -0000510887 00000 n -0000510972 00000 n -0000511127 00000 n -0000511212 00000 n -0000511363 00000 n -0000511448 00000 n -0000511603 00000 n -0000511718 00000 n -0000511821 00000 n -0000511927 00000 n -0000512071 00000 n -0000512178 00000 n -0000512281 00000 n -0000512388 00000 n -0000512491 00000 n -0000512636 00000 n -0000512739 00000 n -0000512838 00000 n -0000512937 00000 n -0000513040 00000 n -0000513143 00000 n -0000513242 00000 n -0000513349 00000 n -0000513448 00000 n -0000513565 00000 n -0000513684 00000 n -0000513847 00000 n -0000513994 00000 n -0000514087 00000 n -0000514193 00000 n -0000514308 00000 n -0000514403 00000 n -0000514496 00000 n -0000514602 00000 n -0000514709 00000 n -0000514804 00000 n -0000514923 00000 n -0000515038 00000 n -0000515149 00000 n -0000515516 00000 n -0000515641 00000 n -0000515745 00000 n -0000515846 00000 n -0000515949 00000 n -0000516082 00000 n -0000516186 00000 n -0000516287 00000 n -0000516388 00000 n -0000516535 00000 n -0000516628 00000 n -0000516763 00000 n -0000516876 00000 n -0000517010 00000 n -0000517111 00000 n -0000517205 00000 n -0000517298 00000 n -0000517433 00000 n -0000517540 00000 n -0000517662 00000 n -0000517760 00000 n -0000517854 00000 n -0000517988 00000 n -0000518085 00000 n -0000518182 00000 n -0000518279 00000 n -0000518407 00000 n -0000518624 00000 n -0000518727 00000 n -0000518830 00000 n -0000518933 00000 n -0000519036 00000 n -0000519135 00000 n -0000519234 00000 n -0000519333 00000 n -0000519432 00000 n -0000519531 00000 n -0000519630 00000 n -0000519729 00000 n -0000519828 00000 n -0000519935 00000 n -0000520042 00000 n -0000520145 00000 n -0000520248 00000 n -0000520443 00000 n -0000520546 00000 n -0000520693 00000 n -0000520792 00000 n -0000520891 00000 n -0000520990 00000 n -0000521089 00000 n -0000521188 00000 n -0000521333 00000 n -0000521499 00000 n -0000521584 00000 n -0000521767 00000 n -0000521852 00000 n -0000522003 00000 n -0000522088 00000 n -0000522255 00000 n -0000522340 00000 n -0000522491 00000 n -0000522576 00000 n -0000522731 00000 n -0000522816 00000 n -0000522971 00000 n -0000523056 00000 n -0000523207 00000 n -0000523292 00000 n -0000523447 00000 n -0000523532 00000 n -0000523683 00000 n -0000523768 00000 n -0000523923 00000 n -0000524051 00000 n -0000524154 00000 n -0000524257 00000 n -0000524363 00000 n -0000524498 00000 n -0000524601 00000 n -0000524700 00000 n -0000524803 00000 n -0000524948 00000 n -0000525175 00000 n -0000525316 00000 n -0000525439 00000 n -0000525538 00000 n -0000525637 00000 n -0000525743 00000 n -0000525897 00000 n -0000526000 00000 n -0000526103 00000 n -0000526202 00000 n -0000526301 00000 n -0000526400 00000 n -0000526503 00000 n -0000526606 00000 n -0000526709 00000 n -0000526808 00000 n -0000526971 00000 n -0000527119 00000 n -0000527342 00000 n -0000527490 00000 n -0000527648 00000 n -0000527954 00000 n -0000528057 00000 n -0000528172 00000 n -0000528327 00000 n -0000528462 00000 n -0000528565 00000 n -0000528748 00000 n -0000528851 00000 n -0000528966 00000 n -0000529065 00000 n -0000529164 00000 n -0000529263 00000 n -0000529374 00000 n -0000529484 00000 n -0000529585 00000 n -0000529683 00000 n -0000529790 00000 n -0000529935 00000 n -0000530137 00000 n -0000530222 00000 n -0000530405 00000 n -0000530490 00000 n -0000530640 00000 n -0000530725 00000 n -0000530887 00000 n -0000530972 00000 n -0000531122 00000 n -0000531207 00000 n -0000531357 00000 n -0000531442 00000 n -0000531592 00000 n -0000531677 00000 n -0000531830 00000 n -0000531915 00000 n -0000532068 00000 n -0000532153 00000 n -0000532303 00000 n -0000532388 00000 n -0000532541 00000 n -0000532626 00000 n -0000532776 00000 n -0000532861 00000 n -0000533023 00000 n -0000533108 00000 n -0000533258 00000 n -0000533343 00000 n -0000533496 00000 n -0000533633 00000 n -0000533737 00000 n -0000533838 00000 n -0000533939 00000 n -0000534042 00000 n -0000534160 00000 n -0000534261 00000 n -0000534359 00000 n -0000534531 00000 n -0000534635 00000 n -0000534751 00000 n -0000534898 00000 n -0000534991 00000 n -0000535096 00000 n -0000535199 00000 n -0000535292 00000 n -0000535385 00000 n -0000535489 00000 n -0000535590 00000 n -0000535683 00000 n -0000535789 00000 n -0000535904 00000 n -0000536083 00000 n -0000536211 00000 n -0000536305 00000 n -0000536404 00000 n -0000536510 00000 n -0000536602 00000 n -0000536783 00000 n -0000536938 00000 n -0000537041 00000 n -0000537144 00000 n -0000537243 00000 n -0000537342 00000 n -0000537497 00000 n -0000537590 00000 n -0000537730 00000 n -0000537849 00000 n -0000537960 00000 n -0000538054 00000 n -0000538149 00000 n -0000538242 00000 n -0000538374 00000 n -0000538473 00000 n -0000538576 00000 n -0000538670 00000 n -0000538765 00000 n -0000538858 00000 n -0000538964 00000 n -0000539058 00000 n -0000539153 00000 n -0000539373 00000 n -0000539471 00000 n -0000539587 00000 n -0000539685 00000 n -0000539783 00000 n -0000539914 00000 n -0000540018 00000 n -0000540116 00000 n -0000540214 00000 n -0000540336 00000 n -0000540449 00000 n -0000540566 00000 n -0000540711 00000 n -0000540804 00000 n -0000540926 00000 n -0000541019 00000 n -0000541140 00000 n -0000541291 00000 n -0000541384 00000 n -0000541476 00000 n -0000541629 00000 n -0000541771 00000 n -0000541892 00000 n -0000542047 00000 n -0000542163 00000 n -0000542309 00000 n -0000542402 00000 n -0000542520 00000 n -0000542618 00000 n -0000542713 00000 n -0000542806 00000 n -0000542928 00000 n -0000543026 00000 n -0000543121 00000 n -0000543268 00000 n -0000543423 00000 n -0000543517 00000 n -0000543611 00000 n -0000543753 00000 n -0000544107 00000 n -0000544262 00000 n -0000544417 00000 n -0000544572 00000 n -0000544727 00000 n -0000544826 00000 n -0000544925 00000 n -0000545024 00000 n -0000545123 00000 n -0000545222 00000 n -0000545321 00000 n -0000545420 00000 n -0000545574 00000 n -0000545728 00000 n -0000545868 00000 n -0000545961 00000 n -0000546058 00000 n -0000546281 00000 n -0000546400 00000 n -0000546498 00000 n -0000546617 00000 n -0000546754 00000 n -0000546873 00000 n -0000546989 00000 n -0000547143 00000 n -0000547296 00000 n -0000547392 00000 n -0000547592 00000 n -0000547766 00000 n -0000547909 00000 n -0000548064 00000 n -0000548219 00000 n -0000548313 00000 n -0000548427 00000 n -0000548654 00000 n -0000548809 00000 n -0000548964 00000 n -0000549119 00000 n -0000549274 00000 n -0000549429 00000 n -0000549528 00000 n -0000549627 00000 n -0000549829 00000 n -0000550061 00000 n -0000550155 00000 n -0000550310 00000 n -0000550429 00000 n -0000550548 00000 n -0000550647 00000 n -0000550802 00000 n -0000550957 00000 n -0000551055 00000 n -0000551268 00000 n -0000551406 00000 n -0000551525 00000 n -0000551632 00000 n -0000551730 00000 n -0000551846 00000 n -0000552000 00000 n -0000552154 00000 n -0000552251 00000 n -0000552372 00000 n -0000552526 00000 n -0000552693 00000 n -0000552880 00000 n -0000552973 00000 n -0000553071 00000 n -0000553169 00000 n -0000553267 00000 n -0000553377 00000 n -0000553531 00000 n -0000553685 00000 n -0000553793 00000 n -0000553900 00000 n -0000554053 00000 n -0000554167 00000 n -0000554332 00000 n -0000554425 00000 n -0000554565 00000 n -0000554719 00000 n -0000554816 00000 n -0000554910 00000 n -0000555003 00000 n -0000555159 00000 n -0000555313 00000 n -0000555410 00000 n -0000555564 00000 n -0000555661 00000 n -0000555755 00000 n -0000555848 00000 n -0000555980 00000 n -0000556134 00000 n -0000556231 00000 n -0000556325 00000 n -0000556418 00000 n -0000556565 00000 n -0000556658 00000 n -0000556812 00000 n -0000556909 00000 n -0000557003 00000 n -0000557229 00000 n -0000557383 00000 n -0000557537 00000 n -0000557630 00000 n -0000557784 00000 n -0000557938 00000 n -0000558034 00000 n -0000558127 00000 n -0000558220 00000 n -0000558336 00000 n -0000558476 00000 n -0000558630 00000 n -0000559103 00000 n -0000559256 00000 n -0000559388 00000 n -0000559503 00000 n -0000559723 00000 n -0000559877 00000 n -0000560031 00000 n -0000560185 00000 n -0000560339 00000 n -0000560493 00000 n -0000560647 00000 n -0000560779 00000 n -0000560900 00000 n -0000561054 00000 n -0000561208 00000 n -0000561404 00000 n -0000561499 00000 n -0000561594 00000 n -0000561679 00000 n -0000561824 00000 n -0000561996 00000 n -0000562091 00000 n -0000562186 00000 n -0000562283 00000 n -0000562913 00000 n -0000563007 00000 n -0000563101 00000 n -0000563220 00000 n -0000563305 00000 n -0000563450 00000 n -0000563622 00000 n -0000563707 00000 n -0000563852 00000 n -0000564023 00000 n -0000564118 00000 n -0000564215 00000 n -0000564309 00000 n -0000564426 00000 n -0000564548 00000 n -0000564690 00000 n -0000564844 00000 n -0000564998 00000 n -0000565144 00000 n -0000565237 00000 n -0000565366 00000 n -0000565459 00000 n -0000565556 00000 n -0000565650 00000 n -0000565743 00000 n -0000565872 00000 n -0000565965 00000 n -0000566062 00000 n -0000566156 00000 n -0000566253 00000 n -0000566383 00000 n -0000566573 00000 n -0000566727 00000 n -0000566881 00000 n -0000566974 00000 n -0000567066 00000 n -0000567219 00000 n -0000567332 00000 n -0000567533 00000 n -0000567619 00000 n -0000567762 00000 n -0000567919 00000 n -0000568005 00000 n -0000568148 00000 n -0000568314 00000 n -0000568408 00000 n -0000568520 00000 n -0000568606 00000 n -0000568749 00000 n -0000568915 00000 n -0000569009 00000 n -0000569095 00000 n -0000569238 00000 n -0000569404 00000 n -0000569498 00000 n -0000569584 00000 n -0000569727 00000 n -0000569893 00000 n -0000569987 00000 n -0000570073 00000 n -0000570216 00000 n -0000570382 00000 n -0000570476 00000 n -0000570562 00000 n -0000570705 00000 n -0000570871 00000 n -0000570965 00000 n -0000571086 00000 n -0000571172 00000 n -0000571315 00000 n -0000571481 00000 n -0000571575 00000 n -0000571661 00000 n -0000571804 00000 n -0000571970 00000 n -0000572064 00000 n -0000572150 00000 n -0000572293 00000 n -0000572459 00000 n -0000572553 00000 n -0000572639 00000 n -0000572782 00000 n -0000572948 00000 n -0000573042 00000 n -0000573128 00000 n -0000573271 00000 n -0000573437 00000 n -0000573531 00000 n -0000573617 00000 n -0000573760 00000 n -0000573926 00000 n -0000574020 00000 n -0000574141 00000 n -0000574227 00000 n -0000574370 00000 n -0000574536 00000 n -0000574630 00000 n -0000574724 00000 n -0000574810 00000 n -0000574953 00000 n -0000575119 00000 n -0000575213 00000 n -0000575299 00000 n -0000575442 00000 n -0000575608 00000 n -0000575701 00000 n -0000575787 00000 n -0000575930 00000 n -0000576094 00000 n -0000576187 00000 n -0000576299 00000 n -0000576385 00000 n -0000576528 00000 n -0000576692 00000 n -0000576785 00000 n -0000576871 00000 n -0000577014 00000 n -0000577237 00000 n -0000577330 00000 n -0000577416 00000 n -0000577559 00000 n -0000577725 00000 n -0000577819 00000 n -0000577905 00000 n -0000578048 00000 n -0000578214 00000 n -0000578308 00000 n -0000578394 00000 n -0000578537 00000 n -0000578703 00000 n -0000578797 00000 n -0000578883 00000 n -0000579026 00000 n -0000579192 00000 n -0000579286 00000 n -0000579434 00000 n -0000579528 00000 n -0000579614 00000 n -0000579757 00000 n -0000579923 00000 n -0000580017 00000 n -0000580103 00000 n -0000580246 00000 n -0000580412 00000 n -0000580506 00000 n -0000580592 00000 n -0000580735 00000 n -0000580901 00000 n -0000580995 00000 n -0000581107 00000 n -0000581193 00000 n -0000581336 00000 n -0000581502 00000 n -0000581596 00000 n -0000581682 00000 n -0000581825 00000 n -0000581991 00000 n -0000582085 00000 n -0000582171 00000 n -0000582314 00000 n -0000582480 00000 n -0000582574 00000 n -0000582660 00000 n -0000582803 00000 n -0000582969 00000 n -0000583063 00000 n -0000583149 00000 n -0000583292 00000 n -0000583458 00000 n -0000583552 00000 n -0000583655 00000 n -0000583741 00000 n -0000583884 00000 n -0000584050 00000 n -0000584144 00000 n -0000584230 00000 n -0000584373 00000 n -0000584539 00000 n -0000584633 00000 n -0000584719 00000 n -0000584862 00000 n -0000585028 00000 n -0000585122 00000 n -0000585208 00000 n -0000585351 00000 n -0000585517 00000 n -0000585611 00000 n -0000585705 00000 n -0000585791 00000 n -0000585934 00000 n -0000586100 00000 n -0000586194 00000 n -0000586280 00000 n -0000586423 00000 n -0000586589 00000 n -0000586683 00000 n -0000586769 00000 n -0000586912 00000 n -0000587078 00000 n -0000587172 00000 n -0000587258 00000 n -0000587401 00000 n -0000587567 00000 n -0000587661 00000 n -0000587764 00000 n -0000587850 00000 n -0000587993 00000 n -0000588159 00000 n -0000588253 00000 n -0000588339 00000 n -0000588482 00000 n -0000588648 00000 n -0000588742 00000 n -0000588828 00000 n -0000588971 00000 n -0000589137 00000 n -0000589231 00000 n -0000589317 00000 n -0000589460 00000 n -0000589626 00000 n -0000589720 00000 n -0000589832 00000 n -0000589918 00000 n -0000590061 00000 n -0000590227 00000 n -0000590321 00000 n -0000590424 00000 n -0000590510 00000 n -0000590653 00000 n -0000590819 00000 n -0000590913 00000 n -0000590999 00000 n -0000591142 00000 n -0000591308 00000 n -0000591402 00000 n -0000591488 00000 n -0000591631 00000 n -0000591797 00000 n -0000591891 00000 n -0000591977 00000 n -0000592120 00000 n -0000592284 00000 n -0000592377 00000 n -0000592463 00000 n -0000592606 00000 n -0000592770 00000 n -0000592863 00000 n -0000592949 00000 n -0000593092 00000 n -0000593256 00000 n -0000593349 00000 n -0000593456 00000 n -0000593664 00000 n -0000593757 00000 n -0000593850 00000 n -0000593943 00000 n -0000594036 00000 n -0000594129 00000 n -0000594222 00000 n -0000594313 00000 n -0000594424 00000 n -0000594595 00000 n -0000594766 00000 n -0000594887 00000 n -0000595058 00000 n -0000595229 00000 n -0000595400 00000 n -0000595490 00000 n -0000595550 00000 n -0000595610 00000 n -0000595670 00000 n -0000595730 00000 n -0000595790 00000 n -0000595850 00000 n -0000595910 00000 n -0000595970 00000 n -0000596030 00000 n -0000596091 00000 n -0000596152 00000 n -0000596213 00000 n -0000596274 00000 n -0000596335 00000 n -0000596396 00000 n -0000596457 00000 n -0000596518 00000 n -0000596579 00000 n -0000596640 00000 n -0000596701 00000 n -0000596762 00000 n -0000596823 00000 n -0000596884 00000 n -0000596945 00000 n -0000597006 00000 n -0000597067 00000 n -0000597128 00000 n -0000597189 00000 n -0000597250 00000 n -0000597311 00000 n -0000597372 00000 n -0000597433 00000 n -0000597494 00000 n -0000597555 00000 n -0000597616 00000 n -0000597677 00000 n -0000597738 00000 n -0000597799 00000 n -0000597860 00000 n -0000597921 00000 n -0000597982 00000 n -0000598043 00000 n -0000598104 00000 n -0000598165 00000 n -0000598226 00000 n -0000598287 00000 n -0000598348 00000 n -0000598409 00000 n -0000598593 00000 n -0000599339 00000 n -0000599431 00000 n -0000599686 00000 n -0000601251 00000 n -0000607801 00000 n -0000607988 00000 n -0000609151 00000 n -0000609243 00000 n -0000609502 00000 n -0000611612 00000 n -0000620396 00000 n -0000620582 00000 n -0000621445 00000 n -0000621537 00000 n -0000621798 00000 n -0000623535 00000 n -0000632415 00000 n -0000632605 00000 n -0000633280 00000 n -0000633372 00000 n -0000633638 00000 n -0000635021 00000 n -0000641745 00000 n -0000641913 00000 n -0000642183 00000 n -0000642275 00000 n -0000642555 00000 n -0000643972 00000 n -0000653610 00000 n -0000653789 00000 n -0000655702 00000 n -0000655794 00000 n -0000656046 00000 n -0000659375 00000 n -0000680853 00000 n -0000681041 00000 n -0000681297 00000 n -0000681384 00000 n -0000681638 00000 n -0000682339 00000 n -0000682789 00000 n -0000682962 00000 n -0000683236 00000 n -0000683325 00000 n -0000683619 00000 n -0000684418 00000 n -0000688825 00000 n -0000688865 00000 n -0000688905 00000 n -0000689265 00000 n -0000689689 00000 n -0000689744 00000 n -0000689799 00000 n -0000689854 00000 n -0000689910 00000 n -0000689965 00000 n -0000690020 00000 n -0000690075 00000 n -0000690130 00000 n -0000690185 00000 n -0000690240 00000 n -0000690295 00000 n -0000690350 00000 n -0000690405 00000 n -0000690461 00000 n -0000690516 00000 n -0000690572 00000 n -0000690628 00000 n -0000690684 00000 n -0000690740 00000 n -0000690795 00000 n -0000690851 00000 n -0000690906 00000 n -0000690961 00000 n -0000691017 00000 n -0000691071 00000 n -0000691124 00000 n -0000691179 00000 n -0000691234 00000 n -0000691289 00000 n -0000691344 00000 n -0000691399 00000 n -0000691454 00000 n -0000691509 00000 n -0000691564 00000 n -0000691620 00000 n -0000691675 00000 n -0000691730 00000 n -0000691785 00000 n -0000691840 00000 n -0000691896 00000 n -0000691951 00000 n -0000692006 00000 n -0000692061 00000 n -0000692116 00000 n -0000692171 00000 n -0000692227 00000 n -0000692282 00000 n -0000692337 00000 n -0000692392 00000 n -0000692447 00000 n -0000692503 00000 n -0000692558 00000 n -0000692614 00000 n -0000692670 00000 n -0000692726 00000 n -0000692783 00000 n -0000692839 00000 n -0000692894 00000 n -0000692949 00000 n -0000693004 00000 n -0000693059 00000 n -0000693115 00000 n -0000693170 00000 n -0000693226 00000 n -0000693281 00000 n -0000693336 00000 n -0000693391 00000 n -0000693446 00000 n -0000693501 00000 n -0000693556 00000 n -0000693612 00000 n -0000693668 00000 n -0000693724 00000 n -0000693779 00000 n -0000693834 00000 n -0000693889 00000 n -0000693945 00000 n -0000694000 00000 n -0000694055 00000 n -0000694110 00000 n -0000694165 00000 n -0000694220 00000 n -0000694275 00000 n -0000694331 00000 n -0000694387 00000 n -0000694443 00000 n -0000694498 00000 n -0000694553 00000 n -0000694608 00000 n -0000694663 00000 n -0000694718 00000 n -0000694774 00000 n -0000694830 00000 n -0000694885 00000 n -0000694940 00000 n -0000694995 00000 n -0000695050 00000 n -0000695104 00000 n -0000695159 00000 n -0000695214 00000 n -0000695269 00000 n -0000695324 00000 n -0000695379 00000 n -0000695435 00000 n -0000695490 00000 n -0000695545 00000 n -0000695600 00000 n -0000695655 00000 n -0000695710 00000 n -0000695766 00000 n -0000695822 00000 n -0000695877 00000 n -0000695932 00000 n -0000695987 00000 n -0000696043 00000 n -0000696099 00000 n -0000696154 00000 n -0000696209 00000 n -0000696264 00000 n -0000696320 00000 n -0000696376 00000 n -0000696432 00000 n -0000696489 00000 n -0000696545 00000 n -0000696601 00000 n -0000696656 00000 n -0000696711 00000 n -0000696766 00000 n -0000696821 00000 n -0000696876 00000 n -0000696932 00000 n -0000696987 00000 n -0000697042 00000 n -0000697098 00000 n -0000697154 00000 n -0000697209 00000 n -0000697264 00000 n -0000697319 00000 n -0000697374 00000 n -0000697429 00000 n -0000697484 00000 n -0000697540 00000 n -0000697595 00000 n -0000697650 00000 n -0000697705 00000 n -0000697761 00000 n -0000697816 00000 n -0000697872 00000 n -0000697927 00000 n -0000697983 00000 n -0000698038 00000 n -0000698093 00000 n -0000698148 00000 n -0000698203 00000 n -0000698258 00000 n -0000698313 00000 n -0000698368 00000 n -0000698423 00000 n -0000698478 00000 n -0000698533 00000 n -0000698588 00000 n -0000698643 00000 n -0000698699 00000 n -0000698755 00000 n -0000698811 00000 n -0000698866 00000 n -0000698921 00000 n -0000698976 00000 n -0000699031 00000 n -0000699086 00000 n -0000699141 00000 n -0000699196 00000 n -0000699251 00000 n -0000699306 00000 n -0000699361 00000 n -0000699416 00000 n -0000699471 00000 n -0000699526 00000 n -0000699582 00000 n -0000699638 00000 n -0000699694 00000 n -0000699749 00000 n -0000699804 00000 n -0000699859 00000 n -0000699914 00000 n -0000699969 00000 n -0000700024 00000 n -0000700080 00000 n -0000700135 00000 n -0000700190 00000 n -0000700245 00000 n -0000700301 00000 n -0000700357 00000 n -0000700413 00000 n -0000700469 00000 n -0000700524 00000 n -0000700580 00000 n -0000700635 00000 n -0000700691 00000 n -0000700747 00000 n -0000700803 00000 n -0000700860 00000 n -0000700916 00000 n -0000700972 00000 n -0000701027 00000 n -0000701083 00000 n -0000701138 00000 n -0000701193 00000 n -0000701249 00000 n -0000701306 00000 n -0000701362 00000 n -0000701419 00000 n -0000701476 00000 n -0000701533 00000 n -0000701589 00000 n -0000701645 00000 n -0000701701 00000 n -0000701757 00000 n -0000701813 00000 n -0000701870 00000 n -0000701927 00000 n -0000701984 00000 n -0000702039 00000 n -0000702095 00000 n -0000702151 00000 n -0000702206 00000 n -0000702263 00000 n -0000702318 00000 n -0000702373 00000 n -0000702431 00000 n -0000702488 00000 n -0000702544 00000 n -0000702601 00000 n -0000702658 00000 n -0000702714 00000 n -0000702770 00000 n -0000702826 00000 n -0000702882 00000 n -0000702937 00000 n -0000702993 00000 n -0000703049 00000 n -0000703105 00000 n -0000703159 00000 n -0000703215 00000 n -0000703273 00000 n -0000703330 00000 n -0000703387 00000 n -0000703442 00000 n -0000703498 00000 n -0000703554 00000 n -0000703609 00000 n -0000703666 00000 n -0000703722 00000 n -0000703777 00000 n -0000703833 00000 n -0000703889 00000 n -0000703946 00000 n -0000704002 00000 n -0000704058 00000 n -0000704114 00000 n -0000704170 00000 n -0000704225 00000 n -0000704282 00000 n -0000704339 00000 n -0000704395 00000 n -0000704451 00000 n -0000704507 00000 n -0000704562 00000 n -0000704618 00000 n -0000704674 00000 n -0000704730 00000 n -0000704786 00000 n -0000704842 00000 n -0000704898 00000 n -0000704955 00000 n -0000705313 00000 n -0000708227 00000 n -0000708515 00000 n -0000708875 00000 n -0000709200 00000 n -0000709524 00000 n -0000709911 00000 n -0000710298 00000 n -0000710602 00000 n -0000710893 00000 n -0000711167 00000 n -0000711452 00000 n -0000711839 00000 n -0000712238 00000 n -0000712568 00000 n -0000712892 00000 n -0000713270 00000 n -0000713604 00000 n -0000713936 00000 n -0000714325 00000 n -0000714707 00000 n -0000715048 00000 n -0000715393 00000 n -0000715703 00000 n -0000716015 00000 n -0000716332 00000 n -0000716674 00000 n -0000717004 00000 n -0000717398 00000 n -0000717754 00000 n -0000718055 00000 n -0000718382 00000 n -0000718727 00000 n -0000719071 00000 n -0000719680 00000 n -0000735800 00000 n -0000736144 00000 n -0000736469 00000 n -0000736788 00000 n -0000737179 00000 n -0000737525 00000 n -0000737847 00000 n -0000738130 00000 n -0000738461 00000 n -0000738833 00000 n -0000739226 00000 n -0000739662 00000 n -0000740044 00000 n -0000740332 00000 n -0000740694 00000 n -0000741034 00000 n -0000741377 00000 n -0000741715 00000 n -0000741998 00000 n -0000742265 00000 n -0000742757 00000 n -0000752615 00000 n -0000752795 00000 n -0000752977 00000 n -0000753159 00000 n -0000753339 00000 n -0000753521 00000 n -0000753944 00000 n -0000758522 00000 n -0000758713 00000 n -0000758905 00000 n -0000759085 00000 n -0000759265 00000 n -0000759447 00000 n -0000759629 00000 n -0000759810 00000 n -0000759993 00000 n -0000760176 00000 n -0000760359 00000 n -0000760540 00000 n -0000760998 00000 n -0000766535 00000 n -0000766718 00000 n -0000766901 00000 n -0000767086 00000 n -0000767269 00000 n -0000767452 00000 n -0000767633 00000 n -0000767844 00000 n -0000768056 00000 n -0000768268 00000 n -0000768478 00000 n -0000768671 00000 n -0000769110 00000 n -0000774558 00000 n -0000774752 00000 n -0000774933 00000 n -0000775116 00000 n -0000775300 00000 n -0000775483 00000 n -0000775664 00000 n -0000775845 00000 n -0000776026 00000 n -0000776209 00000 n -0000776393 00000 n -0000776577 00000 n -0000776761 00000 n -0000776945 00000 n -0000777128 00000 n -0000777312 00000 n -0000777496 00000 n -0000778000 00000 n -0000783888 00000 n -0000784073 00000 n -0000784255 00000 n -0000784438 00000 n -0000784623 00000 n -0000784808 00000 n -0000784993 00000 n -0000785176 00000 n -0000785361 00000 n -0000785562 00000 n -0000785758 00000 n -0000786208 00000 n -0000792215 00000 n -0000792414 00000 n -0000792599 00000 n -0000792996 00000 n -0000799004 00000 n -0000799194 00000 n -0000799544 00000 n -0000806569 00000 n -0000806906 00000 n -0000813126 00000 n -0000813340 00000 n -0000813554 00000 n -0000813951 00000 n -0000820546 00000 n -0000820728 00000 n -0000820910 00000 n -0000821123 00000 n -0000821529 00000 n -0000827821 00000 n -0000828034 00000 n -0000828422 00000 n -0000834403 00000 n -0000834740 00000 n -0000842762 00000 n -0000842969 00000 n -0000843179 00000 n -0000843371 00000 n -0000843563 00000 n -0000843755 00000 n -0000844198 00000 n -0000851556 00000 n -0000851750 00000 n -0000851943 00000 n -0000852127 00000 n -0000852320 00000 n -0000852534 00000 n -0000852977 00000 n -0000860386 00000 n -0000860577 00000 n -0000860759 00000 n -0000861194 00000 n -0000868220 00000 n -0000868409 00000 n -0000868601 00000 n -0000868998 00000 n -0000874886 00000 n -0000875101 00000 n -0000875310 00000 n -0000875745 00000 n -0000880996 00000 n -0000881206 00000 n -0000881390 00000 n -0000881806 00000 n -0000887252 00000 n -0000887464 00000 n -0000887676 00000 n -0000887870 00000 n -0000888073 00000 n -0000888277 00000 n -0000888476 00000 n -0000888665 00000 n -0000888879 00000 n -0000889074 00000 n -0000889264 00000 n -0000889733 00000 n -0000895270 00000 n -0000895465 00000 n -0000895672 00000 n -0000895881 00000 n -0000896093 00000 n -0000896305 00000 n -0000896516 00000 n -0000896711 00000 n -0000896904 00000 n -0000897355 00000 n -0000902759 00000 n -0000902953 00000 n -0000903170 00000 n -0000903366 00000 n -0000903578 00000 n -0000903790 00000 n -0000903982 00000 n -0000904195 00000 n -0000904386 00000 n -0000904856 00000 n -0000911913 00000 n -0000912105 00000 n -0000912318 00000 n -0000912513 00000 n -0000912726 00000 n -0000912920 00000 n -0000913115 00000 n -0000913319 00000 n -0000913540 00000 n -0000913755 00000 n -0000913949 00000 n -0000914136 00000 n -0000914326 00000 n -0000914520 00000 n -0000915035 00000 n -0000921333 00000 n -0000921526 00000 n -0000921746 00000 n -0000921939 00000 n -0000922123 00000 n -0000922519 00000 n -0000927813 00000 n -0000928031 00000 n -0000928242 00000 n -0000928434 00000 n -0000928652 00000 n -0000928863 00000 n -0000929056 00000 n -0000929266 00000 n -0000929457 00000 n -0000929651 00000 n -0000929865 00000 n -0000930353 00000 n -0000935931 00000 n -0000936132 00000 n -0000936346 00000 n -0000936762 00000 n -0000941877 00000 n -0000942062 00000 n -0000942247 00000 n -0000942663 00000 n -0000947793 00000 n -0000947987 00000 n -0000948170 00000 n -0000948567 00000 n -0000953113 00000 n -0000953305 00000 n -0000953497 00000 n -0000953700 00000 n -0000953892 00000 n -0000954108 00000 n -0000954321 00000 n -0000954539 00000 n -0000954757 00000 n -0000954940 00000 n -0000955122 00000 n -0000955591 00000 n -0000961222 00000 n -0000961433 00000 n -0000961616 00000 n -0000961802 00000 n -0000961986 00000 n -0000962382 00000 n -0000967555 00000 n -0000967737 00000 n -0000967950 00000 n -0000968132 00000 n -0000968314 00000 n -0000968511 00000 n -0000968697 00000 n -0000968882 00000 n -0000969286 00000 n -0000974760 00000 n -0000974962 00000 n -0000975154 00000 n -0000975338 00000 n -0000975520 00000 n -0000975732 00000 n -0000975916 00000 n -0000976100 00000 n -0000976285 00000 n -0000976470 00000 n -0000976654 00000 n -0000976838 00000 n -0000977024 00000 n -0000977208 00000 n -0000977394 00000 n -0000977577 00000 n -0000978072 00000 n -0000984103 00000 n -0000984287 00000 n -0000984637 00000 n -0000989591 00000 n -0000989775 00000 n -0000989959 00000 n -0000990143 00000 n -0000990329 00000 n -0000990514 00000 n -0000990699 00000 n -0000990884 00000 n -0000991307 00000 n -0000997203 00000 n -0000997403 00000 n -0000997603 00000 n -0000997785 00000 n -0000997969 00000 n -0000998151 00000 n -0000998335 00000 n -0000998548 00000 n -0000998732 00000 n -0000998916 00000 n -0000999102 00000 n -0000999286 00000 n -0000999726 00000 n -0001005417 00000 n -0001005632 00000 n -0001005817 00000 n -0001006002 00000 n -0001006186 00000 n -0001006398 00000 n -0001006582 00000 n -0001006766 00000 n -0001006951 00000 n -0001007136 00000 n -0001007577 00000 n -0001013135 00000 n -0001013317 00000 n -0001013501 00000 n -0001013701 00000 n -0001013881 00000 n -0001014064 00000 n -0001014248 00000 n -0001014432 00000 n -0001014616 00000 n -0001014800 00000 n -0001014984 00000 n -0001015188 00000 n -0001015370 00000 n -0001015553 00000 n -0001015739 00000 n -0001015924 00000 n -0001016109 00000 n -0001016328 00000 n -0001016512 00000 n -0001017034 00000 n -0001023952 00000 n -0001024136 00000 n -0001024319 00000 n -0001024503 00000 n -0001024687 00000 n -0001024870 00000 n -0001025054 00000 n -0001025238 00000 n -0001025421 00000 n -0001025604 00000 n -0001025788 00000 n -0001025972 00000 n -0001026184 00000 n -0001026367 00000 n -0001026550 00000 n -0001026737 00000 n -0001026919 00000 n -0001027121 00000 n -0001027341 00000 n -0001027525 00000 n -0001027712 00000 n -0001027897 00000 n -0001028084 00000 n -0001028642 00000 n -0001035182 00000 n -0001035399 00000 n -0001035582 00000 n -0001035877 00000 n -0001036062 00000 n -0001036361 00000 n -0001036546 00000 n -0001036830 00000 n -0001037014 00000 n -0001037199 00000 n -0001037496 00000 n -0001037680 00000 n -0001038120 00000 n -0001043245 00000 n -0001043429 00000 n -0001043739 00000 n -0001043922 00000 n -0001044282 00000 n -0001044644 00000 n -0001044827 00000 n -0001045131 00000 n -0001045316 00000 n -0001045598 00000 n -0001045782 00000 n -0001045966 00000 n -0001046264 00000 n -0001046448 00000 n -0001046632 00000 n -0001046816 00000 n -0001047124 00000 n -0001047308 00000 n -0001047492 00000 n -0001047801 00000 n -0001047987 00000 n -0001048286 00000 n -0001048472 00000 n -0001048755 00000 n -0001048940 00000 n -0001049126 00000 n -0001049418 00000 n -0001049605 00000 n -0001050170 00000 n -0001055552 00000 n -0001055737 00000 n -0001056037 00000 n -0001056222 00000 n -0001056528 00000 n -0001056712 00000 n -0001057017 00000 n -0001057324 00000 n -0001057508 00000 n -0001057797 00000 n -0001058088 00000 n -0001058273 00000 n -0001058573 00000 n -0001058757 00000 n -0001059064 00000 n -0001059248 00000 n -0001059530 00000 n -0001059714 00000 n -0001060012 00000 n -0001060196 00000 n -0001060502 00000 n -0001060686 00000 n -0001060997 00000 n -0001061181 00000 n -0001061482 00000 n -0001061667 00000 n -0001061963 00000 n -0001062148 00000 n -0001062443 00000 n -0001062630 00000 n -0001062914 00000 n -0001063506 00000 n -0001068805 00000 n -0001068990 00000 n -0001069281 00000 n -0001069466 00000 n -0001069650 00000 n -0001069966 00000 n -0001070151 00000 n -0001070453 00000 n -0001070639 00000 n -0001070824 00000 n -0001071144 00000 n -0001071466 00000 n -0001071650 00000 n -0001071930 00000 n -0001072114 00000 n -0001072298 00000 n -0001072582 00000 n -0001072766 00000 n -0001073062 00000 n -0001073246 00000 n -0001073554 00000 n -0001073740 00000 n -0001073925 00000 n -0001074110 00000 n -0001074296 00000 n -0001074591 00000 n -0001074777 00000 n -0001075333 00000 n -0001080520 00000 n -0001080705 00000 n -0001081001 00000 n -0001081185 00000 n -0001081476 00000 n -0001081660 00000 n -0001081845 00000 n -0001082143 00000 n -0001082328 00000 n -0001082687 00000 n -0001083048 00000 n -0001083232 00000 n -0001083531 00000 n -0001083715 00000 n -0001084028 00000 n -0001084343 00000 n -0001084527 00000 n -0001084817 00000 n -0001085001 00000 n -0001085299 00000 n -0001085483 00000 n -0001085784 00000 n -0001086087 00000 n -0001086272 00000 n -0001086572 00000 n -0001086757 00000 n -0001087060 00000 n -0001087246 00000 n -0001087546 00000 n -0001087732 00000 n -0001088035 00000 n -0001088221 00000 n -0001088511 00000 n -0001089121 00000 n -0001094471 00000 n -0001094656 00000 n -0001094940 00000 n -0001095124 00000 n -0001095421 00000 n -0001095605 00000 n -0001095887 00000 n -0001096072 00000 n -0001096354 00000 n -0001096539 00000 n -0001096807 00000 n -0001096991 00000 n -0001097298 00000 n -0001097482 00000 n -0001097765 00000 n -0001097949 00000 n -0001098232 00000 n -0001098416 00000 n -0001098750 00000 n -0001099085 00000 n -0001099269 00000 n -0001099551 00000 n -0001099737 00000 n -0001100037 00000 n -0001100221 00000 n -0001100521 00000 n -0001100706 00000 n -0001101010 00000 n -0001101196 00000 n -0001101485 00000 n -0001101671 00000 n -0001102263 00000 n -0001107462 00000 n -0001107762 00000 n -0001107946 00000 n -0001108241 00000 n -0001108425 00000 n -0001108719 00000 n -0001108903 00000 n -0001109197 00000 n -0001109383 00000 n -0001109682 00000 n -0001109867 00000 n -0001110149 00000 n -0001110333 00000 n -0001110636 00000 n -0001110820 00000 n -0001111004 00000 n -0001111188 00000 n -0001111372 00000 n -0001111655 00000 n -0001111841 00000 n -0001112135 00000 n -0001112321 00000 n -0001112620 00000 n -0001112805 00000 n -0001113101 00000 n -0001113286 00000 n -0001113575 00000 n -0001113762 00000 n -0001114053 00000 n -0001114627 00000 n -0001120096 00000 n -0001120281 00000 n -0001120580 00000 n -0001120765 00000 n -0001120950 00000 n -0001121136 00000 n -0001121426 00000 n -0001121611 00000 n -0001121915 00000 n -0001122100 00000 n -0001122395 00000 n -0001122580 00000 n -0001122870 00000 n -0001123055 00000 n -0001123356 00000 n -0001123659 00000 n -0001123844 00000 n -0001124143 00000 n -0001124618 00000 n -0001127994 00000 n -0001129714 00000 n -0001131985 00000 n -0001132073 00000 n -0001132313 00000 n -0001133628 00000 n -trailer -<< - /Size 5278 - /Root 5277 0 R - /Info 5275 0 R - /ID [(HHwsV4w2OKoHWq5hDV/GeA==) (8/8Hb0n3/ti5Ewx/bKL9Ww==)] ->> -startxref -1135503 -%%EOF \ No newline at end of file diff --git a/docs/cordis-primer.i18n.yaml b/docs/cordis-primer.i18n.yaml index cec0660aae..949846bee5 100644 --- a/docs/cordis-primer.i18n.yaml +++ b/docs/cordis-primer.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/cordis-primer.md cordis-primer.md: 2a3afe180623d89b006dfa3e73aba5567c15bbe9 -cordis-primer.zh.md: bdce14cf9f157959d6419f88c9c69570102b9c0c +cordis-primer.zh.md: d4d60f60717ffdc01499fdffadba2808557b285f diff --git a/docs/cordis-primer.zh.md b/docs/cordis-primer.zh.md index bdce14cf9f..d4d60f6071 100644 --- a/docs/cordis-primer.zh.md +++ b/docs/cordis-primer.zh.md @@ -12,6 +12,8 @@ Cordis 是 DeepSeek Harness 底层以 vendor æ–¹å¼�引入的æ�’件框架。本 - **类型化事件用于通信。** æœ�务通过 TypeScript 声明å�ˆå¹¶æ³¨å†Œäº‹ä»¶å��,然å�Žä»¥ `emit`ã€�`waterfall`(瀑布å¼�事件)ã€�`parallel` 或 `serial` æ–¹å¼�分å�‘,分别对应监å�¬è€…观察ã€�包装ã€�并行扇出或按åº�执行。 - **注册是å�¯é€†çš„副作用。** æ��示è¯�片段ã€�工具 schemaã€�适é…�器ã€�æ��供方和监å�¬å™¨é€šè¿‡ `ctx.effect()` 或 `ctx.on()` 安装,reload å’Œ teardown 时会按预期撤销。 + + ## 分å�‘模å¼� æ¯�个事件具有以下分å�‘模å¼�之一,且å�ªèƒ½é€šè¿‡å¯¹åº”方法分å�‘。 diff --git a/docs/cordis-tutorial/03-services.i18n.yaml b/docs/cordis-tutorial/03-services.i18n.yaml index 372e028a47..80ea0f275f 100644 --- a/docs/cordis-tutorial/03-services.i18n.yaml +++ b/docs/cordis-tutorial/03-services.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/cordis-tutorial/03-services.md -03-services.md: 32007284be99ef46b4621089c9b3a80317e77189 -03-services.zh.md: d82be29aa69686b8dc10cc6a45a658683c017cbd +03-services.md: ebfc400dbbc701a3c164c7d30c371dec879d7d73 +03-services.zh.md: fcfd8be7f7fe654a4f4943cf591b5ab7bfc27fc6 diff --git a/docs/cordis-tutorial/03-services.md b/docs/cordis-tutorial/03-services.md index 32007284be..ebfc400dbb 100644 --- a/docs/cordis-tutorial/03-services.md +++ b/docs/cordis-tutorial/03-services.md @@ -75,7 +75,7 @@ Swap the two lines in `cordis.yml` and rerun: same output. Try removing `./greet `inject` is not a one-shot boot check. If a required service disappears while the app runs — its provider was unloaded or hot-replaced — every dependent plugin is unloaded too, and loads again when the service returns. Combined with effects ([chapter 2](02-lifecycle-and-effects.md)), this prevents a running consumer from retaining a reference to an unavailable service: its own registrations are unwound when the dependency disappears. -This is also why service replacement works in config: unload the `dsh-bash-local` entry, mount a different `bash` provider, and every plugin injecting `'bash'` cleanly restarts against the new implementation. +This is also why service replacement works in config: unload the `dsh-bash-local` entry, mount a different `shell` provider, and every plugin injecting `'shell'` cleanly restarts against the new implementation. ## Optional dependencies diff --git a/docs/cordis-tutorial/03-services.zh.md b/docs/cordis-tutorial/03-services.zh.md index d82be29aa6..fcfd8be7f7 100644 --- a/docs/cordis-tutorial/03-services.zh.md +++ b/docs/cordis-tutorial/03-services.zh.md @@ -75,7 +75,7 @@ Hello, world! `inject` å¹¶é�žä¸€æ¬¡æ€§çš„å�¯åŠ¨æ£€æŸ¥ã€‚å¦‚æžœåº”ç”¨è¿�行期间所需æœ�务消失,例如æ��供方被å�¸è½½æˆ–热替æ�¢ï¼Œæ¯�个ä¾�èµ–æ�’件也会éš�之å�¸è½½ï¼Œå¹¶åœ¨æœ�务æ�¢å¤�å�Žå†�次加载。结å�ˆ effect([第 2 ç« ](02-lifecycle-and-effects.md)),这能防止è¿�行中的消费方ä¿�留对ä¸�å�¯ç”¨æœ�务的引用:ä¾�赖消失时,它自己的注册也会撤销。 -这也是é…�置中å�¯ä»¥æ›¿æ�¢æœ�务的原因:å�¸è½½ Cordis é…�置项 `dsh-bash-local`,挂载å�¦ä¸€ä¸ª `bash` æ��供方,所有注入 `'bash'` çš„æ�’件都会é‡�æ–°å�¯åŠ¨å¹¶ä½¿ç”¨æ–°å®žçŽ°ã€‚ +这也是é…�置中å�¯ä»¥æ›¿æ�¢æœ�务的原因:å�¸è½½ Cordis é…�置项 `dsh-bash-local`,挂载å�¦ä¸€ä¸ª `shell` æ��供方,所有注入 `'shell'` çš„æ�’件都会é‡�æ–°å�¯åŠ¨å¹¶ä½¿ç”¨æ–°å®žçŽ°ã€‚ ## å�¯é€‰ä¾�èµ– diff --git a/docs/cordis-tutorial/06-composition-and-hmr.i18n.yaml b/docs/cordis-tutorial/06-composition-and-hmr.i18n.yaml index 6a79850803..c61ee1a5ea 100644 --- a/docs/cordis-tutorial/06-composition-and-hmr.i18n.yaml +++ b/docs/cordis-tutorial/06-composition-and-hmr.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/cordis-tutorial/06-composition-and-hmr.md -06-composition-and-hmr.md: 87ea26014657ae8c8199e1ebb486556c827d96ca -06-composition-and-hmr.zh.md: 830f55de7c1be351fe701cb068197543602619a7 +06-composition-and-hmr.md: 2b53aa28be99851e77a71de76337f2beb4003e8d +06-composition-and-hmr.zh.md: cd4afa1d5465a5442bfd6b771ebcd61c46fe2983 diff --git a/docs/cordis-tutorial/06-composition-and-hmr.md b/docs/cordis-tutorial/06-composition-and-hmr.md index 87ea260146..2b53aa28be 100644 --- a/docs/cordis-tutorial/06-composition-and-hmr.md +++ b/docs/cordis-tutorial/06-composition-and-hmr.md @@ -18,7 +18,7 @@ A config entry accepts metadata beyond `name` and `config`: `id` gives the entry a stable identity so the loader can tell an edit to an existing entry apart from a removal plus an addition. `disabled: true` unmounts a plugin without deleting its entry — flip it back and the plugin (and everything PENDING on its services) loads again. -Groups nest a sub-list of entries that load and unload as one unit, and `isolate` gives a group its own instance of a service name — two groups can each see a differently-configured `bash` without affecting each other. The [Cordis primer](../cordis-primer.md) and the [service isolation example](../user/develop/framework/service.md#service-isolation) cover the details. +Groups nest a sub-list of entries that load and unload as one unit, and `isolate` gives a group its own instance of a service name — two groups can each see a differently configured `shell` provider without affecting each other. The [Cordis primer](../cordis-primer.md) and the [service isolation example](../user/develop/framework/service.md#service-isolation) cover the details. ## Hot module replacement diff --git a/docs/cordis-tutorial/06-composition-and-hmr.zh.md b/docs/cordis-tutorial/06-composition-and-hmr.zh.md index 830f55de7c..cd4afa1d54 100644 --- a/docs/cordis-tutorial/06-composition-and-hmr.zh.md +++ b/docs/cordis-tutorial/06-composition-and-hmr.zh.md @@ -18,7 +18,7 @@ Cordis é…�置项除了 `name` å’Œ `config`,还接å�—其他元数æ�®ï¼š `id` 为 Cordis é…�置项æ��供稳定标识,使 loader 能区分修改现有 Cordis é…�置项与先删除å†�添加。`disabled: true` 会å�¸è½½æ�’件而ä¸�删除其 Cordis é…�置项;改回原值å�Žï¼Œæ�’件以å�Šæ‰€æœ‰å› ä¾�èµ–å…¶æœ�务而处于 PENDING çš„æ�’件都会å†�次加载。 -组å�¯ä»¥åµŒå¥—一份 Cordis é…�置项å­�列表,并将其作为一个å�•元加载和å�¸è½½ï¼›`isolate` 则为一个组æ��ä¾›æŸ�项æœ�务å��称的独立实例,因此两个组å�¯ä»¥å�„自看到é…�ç½®ä¸�å�Œçš„ `bash`,互ä¸�å½±å“�。[Cordis 入门](../cordis-primer.md)å’Œ[æœ�务隔离示例](../user/develop/framework/service.md#service-isolation)介ç»�了详细内容。 +组å�¯ä»¥åµŒå¥—一份 Cordis é…�置项å­�列表,并将其作为一个å�•元加载和å�¸è½½ï¼›`isolate` 则为一个组æ��ä¾›æŸ�项æœ�务å��称的独立实例,因此两个组å�¯ä»¥å�„自看到é…�ç½®ä¸�å�Œçš„ `shell` æ��供方,互ä¸�å½±å“�。[Cordis 入门](../cordis-primer.md)å’Œ[æœ�务隔离示例](../user/develop/framework/service.md#service-isolation)介ç»�了详细内容。 ## 热模å�—替æ�¢ diff --git a/docs/cordis-tutorial/index.i18n.yaml b/docs/cordis-tutorial/index.i18n.yaml index 9e18b6899e..68591da3e4 100644 --- a/docs/cordis-tutorial/index.i18n.yaml +++ b/docs/cordis-tutorial/index.i18n.yaml @@ -3,4 +3,4 @@ # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/cordis-tutorial/index.md index.md: c51965e186ce8d78b577c1005c1c3e1831b91be1 -index.zh.md: 8811930eba0f3e24ecbc47521e65582502257473 +index.zh.md: 22e1918672a34219ca0cf5efaa43a8eb693e6996 diff --git a/docs/cordis-tutorial/index.zh.md b/docs/cordis-tutorial/index.zh.md index 8811930eba..22e1918672 100644 --- a/docs/cordis-tutorial/index.zh.md +++ b/docs/cordis-tutorial/index.zh.md @@ -10,6 +10,8 @@ Cordis 是 DeepSeek Harness 底层的æ�’件框架:它是一个å°�åž‹è¿�行时 如果你è¦�为 harness 本身编写æ�’件——由 `cordis.yml` 加载ã€�在 Web UI 中驱动,而ä¸�是下é�¢è¿™ä¸ªå�¯åŠ¨å™¨â€”â€”è¯·ä»Ž[第一个 Harness æ�’ä»¶](../user/develop/basic/index.md)开始。 + + ## 准备工作 你需è¦�克隆本仓库并安装ä¾�èµ–ï¼›[å¼€å�‘指å�—](../development.md#setup-tutorial)列出了å‰�ç½®æ�¡ä»¶ã€‚本教程ä¸�需è¦� API 密钥;所有示例å�‡å�¯åœ¨æ— å¯†é’¥çŽ¯å¢ƒä¸­è¿�行。 diff --git a/docs/defensive-patterns.i18n.yaml b/docs/defensive-patterns.i18n.yaml index e845e8182b..9a82a28afd 100644 --- a/docs/defensive-patterns.i18n.yaml +++ b/docs/defensive-patterns.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/defensive-patterns.md -defensive-patterns.md: b6e643cad6180ea35a363f2c4131b2c24f5f70af -defensive-patterns.zh.md: e1a6abdfd2138a51a13ceaf418bf6df1d0c65579 +defensive-patterns.md: 9db582354628a13abd43c5bd052dbbfd6e52f79f +defensive-patterns.zh.md: 7bebbe3c1964f2b826afc523eaa4af7be180e36e diff --git a/docs/defensive-patterns.md b/docs/defensive-patterns.md index b6e643cad6..9db5823546 100644 --- a/docs/defensive-patterns.md +++ b/docs/defensive-patterns.md @@ -27,3 +27,7 @@ A user-supplied listener that throws must not reject the promise it runs inside ## Never hand untrusted output the ambient environment or predictable paths Spawned commands get a scrubbed env (drop `*KEY*`/`*SECRET*`/`*TOKEN*`/`*PASSWORD*`) so harness credentials cannot leak into output, `env`, or spill files. Temp/spill files use a private (0700) dir, random names, and exclusive owner-only opens (`'wx'`, `0o600`) — predictable world-readable paths invite symlink races and disclosure. + +## Unlink link-shaped paths + +A path that may be a symlink or Windows junction is removed with `lstatSync().isSymbolicLink()` then `unlinkSync`: unlink deletes only the link and refuses a real directory, so it never follows the link into its target. Windows `rmSync(link)` throws `ERR_FS_EISDIR` on a junction; recursive deletion may descend through one into its target. Reserve recursive `rmSync` for known real directories. diff --git a/docs/defensive-patterns.zh.md b/docs/defensive-patterns.zh.md index e1a6abdfd2..7bebbe3c19 100644 --- a/docs/defensive-patterns.zh.md +++ b/docs/defensive-patterns.zh.md @@ -26,4 +26,8 @@ ## ç»�ä¸�将环境å�˜é‡�或å�¯é¢„测路径暴露给ä¸�å�¯ä¿¡è¾“出 -å�¯åŠ¨çš„å‘½ä»¤åº”ä½¿ç”¨ç»�过清ç�†çš„环境å�˜é‡�,移除å��称匹é…� `*KEY*`ã€�`*SECRET*`ã€�`*TOKEN*` 或 `*PASSWORD*` 的项,防止 harness 凭è¯�通过命令输出ã€�`env` 或 spill 文件泄æ¼�。临时文件和 spill 文件应放在æ�ƒé™�为 0700 çš„ç§�有目录中,使用éš�机文件å��,并以独å� ä¸”仅所有者å�¯è®¿é—®çš„æ–¹å¼�打开(`'wx'`ã€�`0o600`);å�¯é¢„测且所有用户å�‡å�¯è¯»çš„路径会引å�‘符å�·é“¾æŽ¥ç«žæ€�和信æ�¯æ³„露。 +å�¯åŠ¨çš„å‘½ä»¤åº”ä½¿ç”¨ç»�过清ç�†çš„环境å�˜é‡�,移除å��称匹é…� `*KEY*`ã€�`*SECRET*`ã€�`*TOKEN*` 或 `*PASSWORD*` 的项,防止 harness 凭è¯�通过命令输出ã€�`env` 或 spill 文件泄æ¼�。临时文件和 spill 文件应放在æ�ƒé™�为 0700 çš„ç§�有目录中,使用éš�机文件å��,并以独å� ä¸”仅所有者å�¯è®¿é—®çš„æ–¹å¼�打开(`'wx'`ã€�`0o600`);å�¯é¢„测且全局å�¯è¯»çš„路径会引å�‘符å�·é“¾æŽ¥ç«žæ€�和信æ�¯æ³„露。 + +## 用 unlink 删除链接形æ€�的路径 + +å�¯èƒ½æ˜¯ç¬¦å�·é“¾æŽ¥æˆ– Windows junction 的路径,应先用 `lstatSync().isSymbolicLink()` 判断,å†�用 `unlinkSync` 删除:unlink å�ªåˆ é™¤é“¾æŽ¥æœ¬èº«å¹¶æ‹’ç»�真实目录,因此ç»�ä¸�会跟éš�链接进入其目标。Windows 上对 junction 调用 `rmSync(link)` 会抛 `ERR_FS_EISDIR`;递归删除å�¯èƒ½ç©¿è¿‡ junction 进入其目标。真实目录æ‰�使用带 `recursive` çš„ `rmSync`。 diff --git a/docs/glossary.i18n.yaml b/docs/glossary.i18n.yaml index ddedb8d9c7..f462345f43 100644 --- a/docs/glossary.i18n.yaml +++ b/docs/glossary.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/glossary.md -glossary.md: 1c8bbc86544092b1e8c752e53eed0a1217baa329 -glossary.zh.md: 510853d3d6a6f579c8e4cd609d714fe891e9cf10 +glossary.md: 9bff818d5a9f7688e8d2a2425b6e6a9555be3847 +glossary.zh.md: 98bbbefb8bfd152324b23e9791eb938398c12602 diff --git a/docs/glossary.md b/docs/glossary.md index 1c8bbc8654..9bff818d5a 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -6,7 +6,7 @@ Domain vocabulary for DeepSeek Harness uses one canonical term per concept. Term ## capability-seam -- **seam** — a *swappable capability* with three roles: a **Service Definition** (the Cordis `Service` that owns its `ctx.` and vocabulary types — an abstract class such as `ShellExecutor`, or a concrete registry such as `WebRuntime`, never a TypeScript `interface`), one or more **Service providers**, and one or more **Consumers** that inject the service. `packages/shell` is the canonical example: `dsh-shell` (Service Definition), `dsh-bash-local` / `dsh-bash-sandbox` (providers), and `dsh-tool-bash` (Consumer). Roles normally occupy separate packages when they evolve independently, but a package may own multiple roles when they are one concern (`dsh-llm` owns its Service Definition and Consumer). The seam is the complete capability, never one role; reserve the term for that meaning and name a constituent by its role, class, service, contract, or extension point. +- **seam** — a *swappable capability* with three roles: a **Service Definition** (the Cordis `Service` that owns its `ctx.` and vocabulary types — an abstract class such as `ShellExecutor`, or a concrete registry such as `WebRuntime`, never a TypeScript `interface`), one or more **Service Providers**, and one or more **Consumers** that inject the service. `packages/shell` is the canonical example: `dsh-shell` (Service Definition), `dsh-bash-local` / `dsh-bash-sandbox` (providers), and `dsh-tool-bash` (Consumer). Roles normally occupy separate packages when they evolve independently, but a package may own multiple roles when they are one concern (`dsh-llm` owns its Service Definition and Consumer). The seam is the complete capability, never one role; reserve the term for that meaning and name a constituent by its role, class, service, contract, or extension point. ## agent-scope diff --git a/docs/glossary.zh.md b/docs/glossary.zh.md index 510853d3d6..98bbbefb8b 100644 --- a/docs/glossary.zh.md +++ b/docs/glossary.zh.md @@ -6,7 +6,7 @@ DeepSeek Harness 的领域è¯�汇为æ¯�个概念规定一个规范术语。å�„术 ## capability-seam -- **seam**:一ç§�包å�«ä¸‰ç§�角色的*å�¯æ›¿æ�¢èƒ½åŠ›*:**Service Definition**(拥有自身 `ctx.` å’Œè¯�汇类型的 Cordis `Service`——å�¯ä»¥æ˜¯ `ShellExecutor` 这样的抽象类,也å�¯ä»¥æ˜¯ `WebRuntime` 这样的具体注册表,ç»�ä¸�是 TypeScript `interface`)ã€�一个或多个 **Service provider**,以å�Šä¸€ä¸ªæˆ–多个注入该æœ�务的 **Consumer**。`packages/shell` 是规范范例:`dsh-shell`(Service Definition)ã€�`dsh-bash-local` / `dsh-bash-sandbox`(æ��供方),以å�Š `dsh-tool-bash`(Consumer)。角色需è¦�独立演进时通常ä½�于ä¸�å�ŒåŒ…,但属于å�Œä¸€å…³æ³¨ç‚¹æ—¶ï¼Œä¸€ä¸ªåŒ…也å�¯ä»¥æ‰¿æ‹…多个角色(`dsh-llm` å�Œæ—¶æ‰¿æ‹… Service Definition å’Œ Consumer)。seam 是完整能力,ç»�ä¸�是其中一个角色;该术语仅ä¿�留此义,能力æˆ�员应按其角色ã€�ç±»ã€�æœ�务ã€�约定或扩展点命å��。 +- **seam**:一ç§�包å�«ä¸‰ç§�角色的*å�¯æ›¿æ�¢èƒ½åŠ›*:**Service Definition**(拥有自身 `ctx.` å’Œè¯�汇类型的 Cordis `Service`——å�¯ä»¥æ˜¯ `ShellExecutor` 这样的抽象类,也å�¯ä»¥æ˜¯ `WebRuntime` 这样的具体注册表,ç»�ä¸�是 TypeScript `interface`)ã€�一个或多个 **Service Provider**,以å�Šä¸€ä¸ªæˆ–多个注入该æœ�务的 **Consumer**。`packages/shell` 是规范范例:`dsh-shell`(Service Definition)ã€�`dsh-bash-local` / `dsh-bash-sandbox`(æ��供方),以å�Š `dsh-tool-bash`(Consumer)。角色需è¦�独立演进时通常ä½�于ä¸�å�ŒåŒ…,但属于å�Œä¸€å…³æ³¨ç‚¹æ—¶ï¼Œä¸€ä¸ªåŒ…也å�¯ä»¥æ‰¿æ‹…多个角色(`dsh-llm` å�Œæ—¶æ‰¿æ‹… Service Definition å’Œ Consumer)。seam 是完整能力,ç»�ä¸�是其中一个角色;该术语仅ä¿�留此义,能力æˆ�员应按其角色ã€�ç±»ã€�æœ�务ã€�约定或扩展点命å��。 ## agent-scope diff --git a/docs/i18n/terminology.md b/docs/i18n/terminology.md index d1e58a99b4..feb1c96792 100644 --- a/docs/i18n/terminology.md +++ b/docs/i18n/terminology.md @@ -56,7 +56,8 @@ | Round | Round | | 回å�ˆã€�目标回å�ˆã€�Ralph 回å�ˆ | 外层策略使用 Round 时,领域层级为 Session > Round > Turn(轮次) > Step(步骤);Round 是å�¯é€‰çš„外层策略迭代,并é�žæ¯�个会è¯�轮次都具有的通用层级。Goal Round 与 Ralph Round å�‡ä¿�留英文。一个 Round 承载一个轮次,步骤隶属于该轮次;明确的零步骤轮次ä»�ä¿�æŒ�原义。 | | schema | schema | | | | | schema DSL | schema DSL | | | | -| seam | seam | | 接ç¼� | 一个å�¯æ›¿æ�¢èƒ½åŠ›çš„æ•´ä½“ï¼ŒåŒ…å�« Service Definition / Service provider / Consumer 三ç§�角色;角色需è¦�独立演化时æ‰�拆包,也å�¯ç”±å�Œä¸€åŒ…承担多个角色。以 `packages/shell` 为范例;Service Definition 是 Cordis `Service`(抽象类或具体 registry æœ�务),ä¸�是 TypeScript interface。任何å�•一角色ã€�普通边界或扩展点都ä¸�能称为 seam。本仓库正文ä¿�留英文;与 `extension point` 是ä¸�å�Œæ¦‚念 | +| seam | seam | | 接ç¼� | 一个å�¯æ›¿æ�¢èƒ½åŠ›çš„æ•´ä½“ï¼ŒåŒ…å�« Service Definition / Service Provider / Consumer 三ç§�角色;角色需è¦�独立演化时æ‰�拆包,也å�¯ç”±å�Œä¸€åŒ…承担多个角色。以 `packages/shell` 为范例;Service Definition 是 Cordis `Service`(抽象类或具体 registry æœ�务),ä¸�是 TypeScript interface。任何å�•一角色ã€�普通边界或扩展点都ä¸�能称为 seam。本仓库正文ä¿�留英文;与 `extension point` 是ä¸�å�Œæ¦‚念 | +| Service Provider | Service Provider | | Service provider | 能力 seam 的命å��角色;å�•数固定写作 Service Provider,å¤�数写作 Service Providers。泛指æ��ä¾›æœ�务的 provider ä¸�适用本è¯�æ�¡ | | skill | skill | skill(技能) | | | | slot | slot | | å�‘ä½�ã€�å­”ä½� | 客户端架构中的具å��å�¯æ³¨å†Œä½�置,ä¿�留英文 | | spill | spill | | | 工具输出超é™�è�½ç›˜æœºåˆ¶ï¼›ç»„å�ˆè¯�写 `spill 文件`ã€�`spill 路径` | @@ -97,7 +98,7 @@ | cancel | å�–消 | | | | | canary test | canary 测试 | | 金ä¸�雀测试 | 本仓库ä¿�ç•™ `canary` | | capability | 能力 | | | 必须与 `feature` → `功能` 区分 | -| capability seam | 能力 seam | | 功能 seamã€�能力接ç¼� | 本仓库 Service Definitionã€�Service provider 与 Consumer 三ç§�角色组æˆ�完整å�¯æ›¿æ�¢èƒ½åŠ›çš„å‘½å��架构概念;普通 `seam` ä»�按其è¯�æ�¡å¤„ç�† | +| capability seam | 能力 seam | | 功能 seamã€�能力接ç¼� | 本仓库 Service Definitionã€�Service Provider 与 Consumer 三ç§�角色组æˆ�完整å�¯æ›¿æ�¢èƒ½åŠ›çš„å‘½å��架构概念;普通 `seam` ä»�按其è¯�æ�¡å¤„ç�† | | feature | 功能 | | 能力 | SDK 产å“�与工程模型中的å�¯ç®¡ç�†äº§å“�å�•å…ƒ | | feature option | 功能选项 | | variant | 一项 SDK 功能内有é™�ã€�å�¯é€‰æ‹©çš„实现或é…�ç½® | | checkpoint | 检查点 | | | | diff --git a/docs/persistence-catalog.i18n.yaml b/docs/persistence-catalog.i18n.yaml index 37859f5f2e..bc6e3dde66 100644 --- a/docs/persistence-catalog.i18n.yaml +++ b/docs/persistence-catalog.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/persistence-catalog.md -persistence-catalog.md: 032f7ae45d05b688fd317e9aa46363f658f19b76 -persistence-catalog.zh.md: 4f3ace46f7abb2d87be1cd66cbead0ac6b0cccda +persistence-catalog.md: c400298f7d37c590918820bcbda10e6550f197e8 +persistence-catalog.zh.md: 65ec0e3fbdd226c51a371dc9a90f10db5c929c7a diff --git a/docs/persistence-catalog.md b/docs/persistence-catalog.md index 032f7ae45d..c400298f7d 100644 --- a/docs/persistence-catalog.md +++ b/docs/persistence-catalog.md @@ -96,6 +96,8 @@ Sources: [`packages/core/session/src/types.ts:336`](../packages/core/session/src ### `agent/*` + + #### `agent/inbox/spliced` — log-only ```ts persistence-catalog @@ -117,6 +119,8 @@ Source: [`packages/core/agent/src/types.ts:19`](../packages/core/agent/src/types ### `agent-preset/*` + + #### `agent-preset/selected` — log-only ```ts persistence-catalog @@ -133,6 +137,8 @@ Source: [`packages/preset/agent-presets/src/session.ts:26`](../packages/preset/a ### `approval/*` + + #### `approval/asked` — log-only ```ts persistence-catalog @@ -156,6 +162,8 @@ Types: [CallId](subsystems/core.md) Source: [`packages/interaction/user-approval/src/index.ts:44`](../packages/interaction/user-approval/src/index.ts) + + #### `approval/decided` — log-only ```ts persistence-catalog @@ -172,6 +180,8 @@ Source: [`packages/interaction/user-approval/src/index.ts:44`](../packages/inter Source: [`packages/interaction/user-approval/src/index.ts:55`](../packages/interaction/user-approval/src/index.ts) + + #### `approval/policy` — log-only ```ts persistence-catalog @@ -194,6 +204,8 @@ Source: [`packages/interaction/user-approval/src/index.ts:67`](../packages/inter ### `assistant/*` + + #### `assistant/chunk` — log-only ```ts persistence-catalog @@ -205,6 +217,8 @@ Types: [StreamChunk](subsystems/llm-streaming.md) Source: [`packages/core/session/src/types.ts:266`](../packages/core/session/src/types.ts) + + #### `assistant/message` — surface ```ts persistence-catalog @@ -223,6 +237,8 @@ Source: [`packages/core/session/src/types.ts:273`](../packages/core/session/src/ ### `command/*` + + #### `command/done` — log-only ```ts persistence-catalog @@ -242,6 +258,8 @@ Source: [`packages/core/session/src/types.ts:273`](../packages/core/session/src/ Source: [`packages/interaction/commands/src/types.ts:95`](../packages/interaction/commands/src/types.ts) + + #### `command/run` — log-only ```ts persistence-catalog @@ -262,6 +280,8 @@ Source: [`packages/interaction/commands/src/types.ts:88`](../packages/interactio ### `compaction/*` + + #### `compaction/end` — log-only ```ts persistence-catalog @@ -274,6 +294,8 @@ Source: [`packages/interaction/commands/src/types.ts:88`](../packages/interactio Source: [`packages/compaction/compaction/src/types.ts:71`](../packages/compaction/compaction/src/types.ts) + + #### `compaction/prune` — log-only ```ts persistence-catalog @@ -298,6 +320,8 @@ Source: [`packages/compaction/compaction/src/types.ts:71`](../packages/compactio Source: [`packages/compaction/compaction/src/types.ts:81`](../packages/compaction/compaction/src/types.ts) + + #### `compaction/start` — log-only ```ts persistence-catalog @@ -311,6 +335,8 @@ Source: [`packages/compaction/compaction/src/types.ts:81`](../packages/compactio Source: [`packages/compaction/compaction/src/types.ts:23`](../packages/compaction/compaction/src/types.ts) + + #### `compaction/summary` — log-only ```ts persistence-catalog @@ -365,6 +391,8 @@ Source: [`packages/compaction/compaction/src/types.ts:33`](../packages/compactio ### `feedback/*` + + #### `feedback/record` — log-only ```ts persistence-catalog @@ -379,6 +407,8 @@ Source: [`packages/feedback/command-feedback/src/index.ts:62`](../packages/feedb ### `goal/*` + + #### `goal/change` — log-only ```ts persistence-catalog @@ -392,6 +422,8 @@ Source: [`packages/goal/goal/src/domain.ts:66`](../packages/goal/goal/src/domain ### `hook/*` + + #### `hook/invoked` — log-only ```ts persistence-catalog @@ -415,6 +447,8 @@ Source: [`packages/goal/goal/src/domain.ts:66`](../packages/goal/goal/src/domain Source: [`packages/hooks/hook-protocol/src/types.ts:19`](../packages/hooks/hook-protocol/src/types.ts) + + #### `hook/result` — log-only ```ts persistence-catalog @@ -438,6 +472,8 @@ Source: [`packages/hooks/hook-protocol/src/types.ts:31`](../packages/hooks/hook- ### `llm/*` + + #### `llm/retry` — log-only ```ts persistence-catalog @@ -447,6 +483,8 @@ Source: [`packages/hooks/hook-protocol/src/types.ts:31`](../packages/hooks/hook- Source: [`packages/llm/llm-retry/src/types.ts:9`](../packages/llm/llm-retry/src/types.ts) + + #### `llm/retry-started` — log-only ```ts persistence-catalog @@ -458,6 +496,8 @@ Source: [`packages/llm/llm-retry/src/types.ts:11`](../packages/llm/llm-retry/src ### `permission/*` + + #### `permission/preset` — log-only ```ts persistence-catalog @@ -474,6 +514,8 @@ Source: [`packages/interaction/permission-presets/src/index.ts:50`](../packages/ ### `plan/*` + + #### `plan/mode` — log-only ```ts persistence-catalog @@ -489,6 +531,8 @@ Source: [`packages/plan/plan-mode/src/index.ts:53`](../packages/plan/plan-mode/s ### `request/*` + + #### `request/context` — log-only ```ts persistence-catalog @@ -501,6 +545,8 @@ Source: [`packages/plan/plan-mode/src/index.ts:53`](../packages/plan/plan-mode/s Source: [`packages/core/session/src/types.ts:309`](../packages/core/session/src/types.ts) + + #### `request/header` — log-only ```ts persistence-catalog @@ -515,6 +561,8 @@ Source: [`packages/core/session/src/types.ts:304`](../packages/core/session/src/ ### `sandbox/*` + + #### `sandbox/mode` — log-only ```ts persistence-catalog @@ -536,6 +584,8 @@ Source: [`packages/sandbox/sandbox-policy/src/session-mode.ts:33`](../packages/s ### `schedule/*` + + #### `schedule/change` — log-only ```ts persistence-catalog @@ -552,6 +602,8 @@ Source: [`packages/schedule/schedule/src/types.ts:219`](../packages/schedule/sch ### `session/*` + + #### `session/end-seed` — log-only ```ts persistence-catalog @@ -582,6 +634,8 @@ Source: [`packages/schedule/schedule/src/types.ts:219`](../packages/schedule/sch Source: [`packages/core/session/src/types.ts:332`](../packages/core/session/src/types.ts) + + #### `session/title` — log-only ```ts persistence-catalog @@ -596,6 +650,8 @@ Types: [SessionTitleEventData](subsystems/session-title.md) Source: [`packages/session/session-title/src/index.ts:100`](../packages/session/session-title/src/index.ts) + + #### `session/title-llm-request` — log-only ```ts persistence-catalog @@ -609,6 +665,8 @@ Source: [`packages/session/session-title-llm/src/index.ts:43`](../packages/sessi ### `step/*` + + #### `step/end` — log-only ```ts persistence-catalog @@ -618,6 +676,8 @@ Source: [`packages/session/session-title-llm/src/index.ts:43`](../packages/sessi Source: [`packages/core/session/src/types.ts:256`](../packages/core/session/src/types.ts) + + #### `step/start` — log-only ```ts persistence-catalog @@ -629,6 +689,8 @@ Source: [`packages/core/session/src/types.ts:254`](../packages/core/session/src/ ### `subagent/*` + + #### `subagent/descriptor` — log-only ```ts persistence-catalog @@ -646,6 +708,8 @@ Source: [`packages/subagent/subagent/src/descriptor.ts:37`](../packages/subagent ### `todo/*` + + #### `todo/write` — log-only ```ts persistence-catalog @@ -659,6 +723,8 @@ Source: [`packages/core/session/src/types.ts:299`](../packages/core/session/src/ ### `tool/*` + + #### `tool/call` — log-only ```ts persistence-catalog @@ -674,6 +740,8 @@ Types: [CallId](subsystems/core.md) Source: [`packages/core/session/src/types.ts:279`](../packages/core/session/src/types.ts) + + #### `tool/code-dispatch` — log-only ```ts persistence-catalog @@ -697,6 +765,8 @@ Source: [`packages/core/session/src/types.ts:279`](../packages/core/session/src/ Source: [`packages/core/tools/src/types.ts:56`](../packages/core/tools/src/types.ts) + + #### `tool/code-dispatch-start` — log-only ```ts persistence-catalog @@ -718,6 +788,8 @@ Source: [`packages/core/tools/src/types.ts:56`](../packages/core/tools/src/types Source: [`packages/core/tools/src/types.ts:40`](../packages/core/tools/src/types.ts) + + #### `tool/result` — surface ```ts persistence-catalog @@ -745,6 +817,8 @@ Source: [`packages/core/session/src/types.ts:291`](../packages/core/session/src/ ### `tool-workflow/*` + + #### `tool-workflow/agent-end` — log-only ```ts persistence-catalog @@ -757,6 +831,8 @@ Source: [`packages/core/session/src/types.ts:291`](../packages/core/session/src/ Source: [`packages/workflow/tool-workflow/src/types.ts:57`](../packages/workflow/tool-workflow/src/types.ts) + + #### `tool-workflow/agent-start` — log-only ```ts persistence-catalog @@ -769,6 +845,8 @@ Source: [`packages/workflow/tool-workflow/src/types.ts:57`](../packages/workflow Source: [`packages/workflow/tool-workflow/src/types.ts:52`](../packages/workflow/tool-workflow/src/types.ts) + + #### `tool-workflow/run-end` — log-only ```ts persistence-catalog @@ -781,6 +859,8 @@ Source: [`packages/workflow/tool-workflow/src/types.ts:52`](../packages/workflow Source: [`packages/workflow/tool-workflow/src/types.ts:62`](../packages/workflow/tool-workflow/src/types.ts) + + #### `tool-workflow/run-start` — log-only ```ts persistence-catalog @@ -795,6 +875,8 @@ Source: [`packages/workflow/tool-workflow/src/types.ts:47`](../packages/workflow ### `turn/*` + + #### `turn/end` — log-only ```ts persistence-catalog @@ -813,6 +895,8 @@ Types: [TurnEndReason](subsystems/session.md) Source: [`packages/core/session/src/types.ts:252`](../packages/core/session/src/types.ts) + + #### `turn/start` — log-only ```ts persistence-catalog @@ -829,6 +913,8 @@ Source: [`packages/core/session/src/types.ts:243`](../packages/core/session/src/ ### `user/*` + + #### `user/message` — surface ```ts persistence-catalog @@ -846,6 +932,8 @@ Source: [`packages/core/session/src/types.ts:264`](../packages/core/session/src/ ### `web/*` + + #### `web/deepseek-search-llm-request` — log-only ```ts persistence-catalog diff --git a/docs/persistence-catalog.zh.md b/docs/persistence-catalog.zh.md index 4f3ace46f7..65ec0e3fbd 100644 --- a/docs/persistence-catalog.zh.md +++ b/docs/persistence-catalog.zh.md @@ -98,6 +98,8 @@ export type SessionEvent = { ### `agent/*` + + #### `agent/inbox/spliced` — log-only ```ts persistence-catalog @@ -119,6 +121,8 @@ export type SessionEvent = { ### `agent-preset/*` + + #### `agent-preset/selected` — log-only ```ts persistence-catalog @@ -135,6 +139,8 @@ export type SessionEvent = { ### `approval/*` + + #### `approval/asked` — log-only ```ts persistence-catalog @@ -158,6 +164,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/interaction/user-approval/src/index.ts:44`](../packages/interaction/user-approval/src/index.ts) + + #### `approval/decided` — log-only ```ts persistence-catalog @@ -174,6 +182,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/interaction/user-approval/src/index.ts:55`](../packages/interaction/user-approval/src/index.ts) + + #### `approval/policy` — log-only ```ts persistence-catalog @@ -196,6 +206,8 @@ export type SessionEvent = { ### `assistant/*` + + #### `assistant/chunk` — log-only ```ts persistence-catalog @@ -207,6 +219,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/core/session/src/types.ts:266`](../packages/core/session/src/types.ts) + + #### `assistant/message` — surface ```ts persistence-catalog @@ -225,6 +239,8 @@ export type SessionEvent = { ### `command/*` + + #### `command/done` — log-only ```ts persistence-catalog @@ -244,6 +260,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/interaction/commands/src/types.ts:95`](../packages/interaction/commands/src/types.ts) + + #### `command/run` — log-only ```ts persistence-catalog @@ -264,6 +282,8 @@ export type SessionEvent = { ### `compaction/*` + + #### `compaction/end` — log-only ```ts persistence-catalog @@ -276,6 +296,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/compaction/compaction/src/types.ts:71`](../packages/compaction/compaction/src/types.ts) + + #### `compaction/prune` — log-only ```ts persistence-catalog @@ -300,6 +322,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/compaction/compaction/src/types.ts:81`](../packages/compaction/compaction/src/types.ts) + + #### `compaction/start` — log-only ```ts persistence-catalog @@ -313,6 +337,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/compaction/compaction/src/types.ts:23`](../packages/compaction/compaction/src/types.ts) + + #### `compaction/summary` — log-only ```ts persistence-catalog @@ -367,6 +393,8 @@ export type SessionEvent = { ### `feedback/*` + + #### `feedback/record` — log-only ```ts persistence-catalog @@ -381,6 +409,8 @@ export type SessionEvent = { ### `goal/*` + + #### `goal/change` — log-only ```ts persistence-catalog @@ -394,6 +424,8 @@ export type SessionEvent = { ### `hook/*` + + #### `hook/invoked` — log-only ```ts persistence-catalog @@ -417,6 +449,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/hooks/hook-protocol/src/types.ts:19`](../packages/hooks/hook-protocol/src/types.ts) + + #### `hook/result` — log-only ```ts persistence-catalog @@ -440,6 +474,8 @@ export type SessionEvent = { ### `llm/*` + + #### `llm/retry` — log-only ```ts persistence-catalog @@ -449,6 +485,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/llm/llm-retry/src/types.ts:9`](../packages/llm/llm-retry/src/types.ts) + + #### `llm/retry-started` — log-only ```ts persistence-catalog @@ -460,6 +498,8 @@ export type SessionEvent = { ### `permission/*` + + #### `permission/preset` — log-only ```ts persistence-catalog @@ -476,6 +516,8 @@ export type SessionEvent = { ### `plan/*` + + #### `plan/mode` — log-only ```ts persistence-catalog @@ -491,6 +533,8 @@ export type SessionEvent = { ### `request/*` + + #### `request/context` — log-only ```ts persistence-catalog @@ -503,6 +547,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/core/session/src/types.ts:309`](../packages/core/session/src/types.ts) + + #### `request/header` — log-only ```ts persistence-catalog @@ -517,6 +563,8 @@ export type SessionEvent = { ### `sandbox/*` + + #### `sandbox/mode` — log-only ```ts persistence-catalog @@ -538,6 +586,8 @@ export type SessionEvent = { ### `schedule/*` + + #### `schedule/change` — log-only ```ts persistence-catalog @@ -554,6 +604,8 @@ export type SessionEvent = { ### `session/*` + + #### `session/end-seed` — log-only ```ts persistence-catalog @@ -584,6 +636,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/core/session/src/types.ts:332`](../packages/core/session/src/types.ts) + + #### `session/title` — log-only ```ts persistence-catalog @@ -598,6 +652,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/session/session-title/src/index.ts:100`](../packages/session/session-title/src/index.ts) + + #### `session/title-llm-request` — log-only ```ts persistence-catalog @@ -611,6 +667,8 @@ export type SessionEvent = { ### `step/*` + + #### `step/end` — log-only ```ts persistence-catalog @@ -620,6 +678,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/core/session/src/types.ts:256`](../packages/core/session/src/types.ts) + + #### `step/start` — log-only ```ts persistence-catalog @@ -631,6 +691,8 @@ export type SessionEvent = { ### `subagent/*` + + #### `subagent/descriptor` — log-only ```ts persistence-catalog @@ -648,6 +710,8 @@ export type SessionEvent = { ### `todo/*` + + #### `todo/write` — log-only ```ts persistence-catalog @@ -661,6 +725,8 @@ export type SessionEvent = { ### `tool/*` + + #### `tool/call` — log-only ```ts persistence-catalog @@ -676,6 +742,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/core/session/src/types.ts:279`](../packages/core/session/src/types.ts) + + #### `tool/code-dispatch` — log-only ```ts persistence-catalog @@ -699,6 +767,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/core/tools/src/types.ts:56`](../packages/core/tools/src/types.ts) + + #### `tool/code-dispatch-start` — log-only ```ts persistence-catalog @@ -720,6 +790,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/core/tools/src/types.ts:40`](../packages/core/tools/src/types.ts) + + #### `tool/result` — surface ```ts persistence-catalog @@ -747,6 +819,8 @@ export type SessionEvent = { ### `tool-workflow/*` + + #### `tool-workflow/agent-end` — log-only ```ts persistence-catalog @@ -759,6 +833,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/workflow/tool-workflow/src/types.ts:57`](../packages/workflow/tool-workflow/src/types.ts) + + #### `tool-workflow/agent-start` — log-only ```ts persistence-catalog @@ -771,6 +847,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/workflow/tool-workflow/src/types.ts:52`](../packages/workflow/tool-workflow/src/types.ts) + + #### `tool-workflow/run-end` — log-only ```ts persistence-catalog @@ -783,6 +861,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/workflow/tool-workflow/src/types.ts:62`](../packages/workflow/tool-workflow/src/types.ts) + + #### `tool-workflow/run-start` — log-only ```ts persistence-catalog @@ -797,6 +877,8 @@ export type SessionEvent = { ### `turn/*` + + #### `turn/end` — log-only ```ts persistence-catalog @@ -815,6 +897,8 @@ export type SessionEvent = { æ�¥æº�:[`packages/core/session/src/types.ts:252`](../packages/core/session/src/types.ts) + + #### `turn/start` — log-only ```ts persistence-catalog @@ -831,6 +915,8 @@ export type SessionEvent = { ### `user/*` + + #### `user/message` — surface ```ts persistence-catalog @@ -848,6 +934,8 @@ export type SessionEvent = { ### `web/*` + + #### `web/deepseek-search-llm-request` — log-only ```ts persistence-catalog diff --git a/docs/subsystems/code-runtime.i18n.yaml b/docs/subsystems/code-runtime.i18n.yaml index cf1e004c03..6c5d91599c 100644 --- a/docs/subsystems/code-runtime.i18n.yaml +++ b/docs/subsystems/code-runtime.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/code-runtime.md -code-runtime.md: e677bcaef26f7999181825934b880514e425f615 -code-runtime.zh.md: e94dd77b1e430e7bd15633881d65521409819574 +code-runtime.md: 09036819d4fb6a4e2f83cf7923584780ca2211f8 +code-runtime.zh.md: 2e717f17313ce23cb37616199bd83776c0a40756 diff --git a/docs/subsystems/code-runtime.md b/docs/subsystems/code-runtime.md index e677bcaef2..09036819d4 100644 --- a/docs/subsystems/code-runtime.md +++ b/docs/subsystems/code-runtime.md @@ -2,7 +2,7 @@ English | [中文](code-runtime.zh.md) -The code-execution seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) whose Service Definition ([dsh-code-runtime](../../packages/code-runtime/code-runtime), `ctx.codeRuntime`) runs one model-written program against host-provided async bindings and reports what it printed and returned. Code execution is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). Backends differ by execution substrate and source language, both readonly descriptors on the service; the worker-thread Service provider and tool-registry Consumer are specified by the [Code Mode foundation](../../.agents/notes/implemented/feature/2026-06-15-code-mode.md) and [typed-return contract](../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md). +The code-execution seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) whose Service Definition ([dsh-code-runtime](../../packages/code-runtime/code-runtime), `ctx.codeRuntime`) runs one model-written program against host-provided async bindings and reports what it printed and returned. Code execution is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). Backends differ by execution substrate and source language, both readonly descriptors on the service; the worker-thread Service Provider and tool-registry Consumer are specified by the [Code Mode foundation](../../.agents/notes/implemented/feature/2026-06-15-code-mode.md) and [typed-return contract](../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md). Source: [`packages/code-runtime/code-runtime/src/types.ts`](../../packages/code-runtime/code-runtime/src/types.ts) diff --git a/docs/subsystems/code-runtime.zh.md b/docs/subsystems/code-runtime.zh.md index e94dd77b1e..2e717f1731 100644 --- a/docs/subsystems/code-runtime.zh.md +++ b/docs/subsystems/code-runtime.zh.md @@ -2,7 +2,7 @@ [English](code-runtime.md) | 中文 -代ç �执行 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md):其 Service Definition([dsh-code-runtime](../../packages/code-runtime/code-runtime),`ctx.codeRuntime`)使用宿主æ��供的异步绑定è¿�行一段模型编写的程åº�,并报告其打å�°å†…容与返回值。代ç �执行是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇定义在此而é�ž [core.md](core.md) 中。å�„å�Žç«¯çš„æ‰§è¡ŒåŸºåº•与æº�语言ä¸�å�Œï¼Œè¿™ä¸¤é¡¹å�‡ä¸ºæœ�务上的å�ªè¯»æ��述符;worker-thread Service provider 与工具注册表 Consumer 的约定è§� [Code Mode 基础设计](../../.agents/notes/implemented/feature/2026-06-15-code-mode.md) å’Œ[类型化返回约定](../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md)。 +代ç �执行 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md):其 Service Definition([dsh-code-runtime](../../packages/code-runtime/code-runtime),`ctx.codeRuntime`)使用宿主æ��供的异步绑定è¿�行一段模型编写的程åº�,并报告其打å�°å†…容与返回值。代ç �执行是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇定义在此而é�ž [core.md](core.md) 中。å�„å�Žç«¯çš„æ‰§è¡ŒåŸºåº•与æº�语言ä¸�å�Œï¼Œè¿™ä¸¤é¡¹å�‡ä¸ºæœ�务上的å�ªè¯»æ��述符;worker-thread Service Provider 与工具注册表 Consumer 的约定è§� [Code Mode 基础设计](../../.agents/notes/implemented/feature/2026-06-15-code-mode.md) å’Œ[类型化返回约定](../../.agents/notes/implemented/feature/2026-07-20-code-mode-typed-tool-returns.md)。 æº�ç �:[`packages/code-runtime/code-runtime/src/types.ts`](../../packages/code-runtime/code-runtime/src/types.ts) diff --git a/docs/subsystems/compaction.i18n.yaml b/docs/subsystems/compaction.i18n.yaml index b3c2ffad64..33e1c12cd8 100644 --- a/docs/subsystems/compaction.i18n.yaml +++ b/docs/subsystems/compaction.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/compaction.md -compaction.md: 1e14c60161ef945069d9e6f72767dabdfa42e702 -compaction.zh.md: 60f5afb8c673c94c9c6f5802fb4f12e224e04203 +compaction.md: 95a3d4b844c6126a09d4fdaafdedcf987b21d1c6 +compaction.zh.md: 3b72bb4f81675119d869fb2f7439f4640e6a5a86 diff --git a/docs/subsystems/compaction.md b/docs/subsystems/compaction.md index 1e14c60161..95a3d4b844 100644 --- a/docs/subsystems/compaction.md +++ b/docs/subsystems/compaction.md @@ -2,7 +2,7 @@ English | [中文](compaction.zh.md) -The compaction seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) split like bash: Service Definition ([dsh-compaction](../../packages/compaction/compaction), `ctx.compaction`), Service provider (a backend such as [dsh-compaction-basic](../../packages/compaction/compaction-basic)), and human Consumer ([dsh-command-compact](../../packages/compaction/command-compact)). Compaction is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A tokenizer- or template-based backend is a sibling package implementing the same interface. Unlike bash, the interface necessarily depends on `dsh-session` and `dsh-llm`: its verbs act on an agent-owned `Session`, and its durable summary event uses the `ContentBlock` vocabulary (see the [compaction capability-seam Agent Note](../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md)). +The compaction seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) split like bash: Service Definition ([dsh-compaction](../../packages/compaction/compaction), `ctx.compaction`), Service Provider (a backend such as [dsh-compaction-basic](../../packages/compaction/compaction-basic)), and human Consumer ([dsh-command-compact](../../packages/compaction/command-compact)). Compaction is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A tokenizer- or template-based backend is a sibling package implementing the same interface. Unlike bash, the interface necessarily depends on `dsh-session` and `dsh-llm`: its verbs act on an agent-owned `Session`, and its durable summary event uses the `ContentBlock` vocabulary (see the [compaction capability-seam Agent Note](../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md)). Source: [`packages/compaction/compaction/src/types.ts`](../../packages/compaction/compaction/src/types.ts) diff --git a/docs/subsystems/compaction.zh.md b/docs/subsystems/compaction.zh.md index 60f5afb8c6..3b72bb4f81 100644 --- a/docs/subsystems/compaction.zh.md +++ b/docs/subsystems/compaction.zh.md @@ -2,7 +2,7 @@ [English](compaction.md) | 中文 -压缩 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md),与 bash 一样分为 Service Definition([dsh-compaction](../../packages/compaction/compaction),`ctx.compaction`)ã€�Service provider(例如 [dsh-compaction-basic](../../packages/compaction/compaction-basic) å�Žç«¯ï¼‰å’Œé�¢å�‘用户的 Consumer([dsh-command-compact](../../packages/compaction/command-compact))。压缩是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇定义在此而é�ž [core.md](core.md) 中。基于 tokenizer 或模æ�¿çš„å�Žç«¯æ˜¯å®žçްå�Œä¸€æŽ¥å�£çš„兄弟包。与 bash ä¸�å�Œï¼Œè¯¥æŽ¥å�£å¿…ç„¶ä¾�èµ– `dsh-session` å’Œ `dsh-llm`:其动è¯�作用于 agent 所有的 `Session`,而其æŒ�久摘è¦�事件使用 `ContentBlock` è¯�汇(è§�[压缩能力 seam Agent Note](../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md))。 +压缩 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md),与 bash 一样分为 Service Definition([dsh-compaction](../../packages/compaction/compaction),`ctx.compaction`)ã€�Service Provider(例如 [dsh-compaction-basic](../../packages/compaction/compaction-basic) å�Žç«¯ï¼‰å’Œé�¢å�‘用户的 Consumer([dsh-command-compact](../../packages/compaction/command-compact))。压缩是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇定义在此而é�ž [core.md](core.md) 中。基于 tokenizer 或模æ�¿çš„å�Žç«¯æ˜¯å®žçްå�Œä¸€æŽ¥å�£çš„兄弟包。与 bash ä¸�å�Œï¼Œè¯¥æŽ¥å�£å¿…ç„¶ä¾�èµ– `dsh-session` å’Œ `dsh-llm`:其动è¯�作用于 agent 所有的 `Session`,而其æŒ�久摘è¦�事件使用 `ContentBlock` è¯�汇(è§�[压缩能力 seam Agent Note](../../.agents/notes/implemented/feature/2026-06-18-compaction-capability-seam.md))。 æº�ç �:[`packages/compaction/compaction/src/types.ts`](../../packages/compaction/compaction/src/types.ts) diff --git a/docs/subsystems/core.i18n.yaml b/docs/subsystems/core.i18n.yaml index 041f874d47..1265b726fe 100644 --- a/docs/subsystems/core.i18n.yaml +++ b/docs/subsystems/core.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/core.md -core.md: 6eda80cbd164168c3c4a846c9bc50a8fc12b0c92 -core.zh.md: 14c2e78bc3fff959fb0c0040eae0f382985ecdf4 +core.md: d14ad52e57572d5b0b110a0b16ff734e3499bdf5 +core.zh.md: 9ace28731f2532f571b66f2e7f6a3ea4a2c4e345 diff --git a/docs/subsystems/core.md b/docs/subsystems/core.md index 6eda80cbd1..d14ad52e57 100644 --- a/docs/subsystems/core.md +++ b/docs/subsystems/core.md @@ -257,6 +257,8 @@ Its full fields, the `defineTool`/`ValueSchemaSpec`/`ParameterSchemaSpec` typed Two patterns recur across every subsystem and are documented once, here. + + ### The `…Map → derived-union` pattern Almost every extensible sum type in the harness follows one pattern: an interface keyed by a discriminant tag (the `…Map`), from which the union is derived with `keyof`. Plugins add variants by **declaration merging** — no edit to the owning package. diff --git a/docs/subsystems/core.zh.md b/docs/subsystems/core.zh.md index 14c2e78bc3..9ace28731f 100644 --- a/docs/subsystems/core.zh.md +++ b/docs/subsystems/core.zh.md @@ -263,6 +263,8 @@ type SessionStartSource = 'startup' | 'resume' | 'clear' | 'compact' 两个模å¼�在æ¯�个å­�系统中å��å¤�出现,å�ªåœ¨æ­¤å¤„记录一次。 + + ### `…Map → derived-union` 模å¼� harness 中几乎所有å�¯æ‰©å±•的和类型都é�µå¾ªå�Œä¸€æ¨¡å¼�:一个以判别标签为键的接å�£ï¼ˆ`…Map`),è�”å�ˆç±»åž‹ç”± `keyof` 派生。æ�’件通过**声明å�ˆå¹¶**添加å�˜ä½“——无需修改拥有该类型的包。 diff --git a/docs/subsystems/jobs.i18n.yaml b/docs/subsystems/jobs.i18n.yaml index 83199a1ad8..747741008d 100644 --- a/docs/subsystems/jobs.i18n.yaml +++ b/docs/subsystems/jobs.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/jobs.md -jobs.md: 67998599f8bc8c9b50278e9eaab8b6a5c70a33bc -jobs.zh.md: 41f60e450dcb85ee867a6c44f1e0053950f3ec71 +jobs.md: b11dc7fbe869dcaa9e71e6956a76559476391775 +jobs.zh.md: 03c3ceee8953c8c4c70f060b7e9d88371c1ebd7b diff --git a/docs/subsystems/jobs.md b/docs/subsystems/jobs.md index 67998599f8..b11dc7fbe8 100644 --- a/docs/subsystems/jobs.md +++ b/docs/subsystems/jobs.md @@ -154,7 +154,7 @@ interface JobRead { ## Service behavior -The abstract [`JobRegistry`](../../packages/jobs/jobs/src/index.ts) Service Definition specifies atomic `start`, caller-scoped `get` and `list`, `read`, `kill`, bounded `wait`, failure-isolated `onJobDone` and `onJobsChanged` listeners, and when `attachController` becomes available; [`LocalJobRegistry`](../../packages/jobs/jobs-local/src/index.ts) is the process-local Service provider. Authorization compares owner sessions; owner cleanup and admission use the exact registered `Agent` instance. The local provider's positive-safe-integer `maxConcurrentJobsPerOwner` config defaults to `10` and counts `running` plus `stopping` records per exact owner, with one shared bucket for unowned jobs; terminal producer settlement releases capacity. See [`dsh-jobs`](../../packages/jobs/jobs/README.md) for the Service Definition contract, [`dsh-jobs-local`](../../packages/jobs/jobs-local/README.md) for the registry lifecycle and admission policy, and [`dsh-tool-jobs`](../../packages/jobs/tool-jobs/README.md) for the model-facing Consumer. +The abstract [`JobRegistry`](../../packages/jobs/jobs/src/index.ts) Service Definition specifies atomic `start`, caller-scoped `get` and `list`, `read`, `kill`, bounded `wait`, failure-isolated `onJobDone` and `onJobsChanged` listeners, and when `attachController` becomes available; [`LocalJobRegistry`](../../packages/jobs/jobs-local/src/index.ts) is the process-local Service Provider. Authorization compares owner sessions; owner cleanup and admission use the exact registered `Agent` instance. The local provider's positive-safe-integer `maxConcurrentJobsPerOwner` config defaults to `10` and counts `running` plus `stopping` records per exact owner, with one shared bucket for unowned jobs; terminal producer settlement releases capacity. See [`dsh-jobs`](../../packages/jobs/jobs/README.md) for the Service Definition contract, [`dsh-jobs-local`](../../packages/jobs/jobs-local/README.md) for the registry lifecycle and admission policy, and [`dsh-tool-jobs`](../../packages/jobs/tool-jobs/README.md) for the model-facing Consumer. diff --git a/docs/subsystems/jobs.zh.md b/docs/subsystems/jobs.zh.md index 41f60e450d..03c3ceee89 100644 --- a/docs/subsystems/jobs.zh.md +++ b/docs/subsystems/jobs.zh.md @@ -154,7 +154,7 @@ interface JobRead { ## æœ�务行为 -抽象的 [`JobRegistry`](../../packages/jobs/jobs/src/index.ts) Service Definition 规定原å­� `start`ã€�é™�定调用方作用域的 `get` å’Œ `list`ã€�`read`ã€�`kill`ã€�有界 `wait`ã€�故障隔离的 `onJobDone` 与 `onJobsChanged` 监å�¬å™¨ï¼Œä»¥å�Š `attachController` 何时å�¯ç”¨ï¼›[`LocalJobRegistry`](../../packages/jobs/jobs-local/src/index.ts) 是其进程局部 Service provider。授æ�ƒä¼šæ¯”较拥有者会è¯�;拥有者清ç�†ä¸Žå‡†å…¥ä¼šä½¿ç”¨ç¡®åˆ‡çš„已注册 `Agent` 实例。本地 Service provider çš„ `maxConcurrentJobsPerOwner` é…�置必须是正的安全整数,默认值为 `10`;它按确切 owner 统计 `running` 与 `stopping` 记录,所有无 owner 任务共享一个æœ�务级桶,并在生产方终止结算å�Žé‡Šæ”¾å®¹é‡�。Service Definition 约定è§� [`dsh-jobs`](../../packages/jobs/jobs/README.md),注册表生命周期与准入策略è§� [`dsh-jobs-local`](../../packages/jobs/jobs-local/README.md),é�¢å�‘模型的 Consumer è§� [`dsh-tool-jobs`](../../packages/jobs/tool-jobs/README.md)。 +抽象的 [`JobRegistry`](../../packages/jobs/jobs/src/index.ts) Service Definition 规定原å­� `start`ã€�é™�定调用方作用域的 `get` å’Œ `list`ã€�`read`ã€�`kill`ã€�有界 `wait`ã€�故障隔离的 `onJobDone` 与 `onJobsChanged` 监å�¬å™¨ï¼Œä»¥å�Š `attachController` 何时å�¯ç”¨ï¼›[`LocalJobRegistry`](../../packages/jobs/jobs-local/src/index.ts) 是其进程局部 Service Provider。授æ�ƒä¼šæ¯”较拥有者会è¯�;拥有者清ç�†ä¸Žå‡†å…¥ä¼šä½¿ç”¨ç¡®åˆ‡çš„已注册 `Agent` 实例。本地 Service Provider çš„ `maxConcurrentJobsPerOwner` é…�置必须是正的安全整数,默认值为 `10`;它按确切 owner 统计 `running` 与 `stopping` 记录,所有无 owner 任务共享一个æœ�务级桶,并在生产方终止结算å�Žé‡Šæ”¾å®¹é‡�。Service Definition 约定è§� [`dsh-jobs`](../../packages/jobs/jobs/README.md),注册表生命周期与准入策略è§� [`dsh-jobs-local`](../../packages/jobs/jobs-local/README.md),é�¢å�‘模型的 Consumer è§� [`dsh-tool-jobs`](../../packages/jobs/tool-jobs/README.md)。 diff --git a/docs/subsystems/llm-streaming.i18n.yaml b/docs/subsystems/llm-streaming.i18n.yaml index d1d2810cfe..8f287e2a0f 100644 --- a/docs/subsystems/llm-streaming.i18n.yaml +++ b/docs/subsystems/llm-streaming.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/llm-streaming.md -llm-streaming.md: 0f395245332e735c04997bd1ca82f66fa9286104 -llm-streaming.zh.md: fbaa47d14d57e7377be4db6ecaa04f11997572a6 +llm-streaming.md: 7c0e0865f8dcc0e7722bb2205d0129d9e0ca3086 +llm-streaming.zh.md: 5c31909ee79137c6c5eef101235b43a2419b1339 diff --git a/docs/subsystems/llm-streaming.md b/docs/subsystems/llm-streaming.md index 0f39524533..7c0e0865f8 100644 --- a/docs/subsystems/llm-streaming.md +++ b/docs/subsystems/llm-streaming.md @@ -151,10 +151,35 @@ type ContextFormed = | { readonly form: 'recall' } ``` + + ## `StreamChunk` — the raw protocol A streaming response interleaves several typed blocks (text, reasoning, multiple tool calls). `index` ties each delta to its block; `block-end` carries the fully-assembled `ContentBlock` so consumers don't have to re-assemble deltas themselves. It is a **closed** discriminated union — a `switch` over `type` ends with `assertNever`, so adding a variant breaks compilation at every consumer that must handle it. +```ts type-equiv +/** + * Adapter-private lossless-JSON state for replaying a successful response, + * carried by a terminal `finish` chunk and stored on the assembled assistant + * message's model source. Both halves stay opaque to the harness; only the + * split is shared vocabulary, so assembly can keep stored metadata aligned + * with stored content without reading either half. + */ +interface ReplayEnvelope { + /** Response-level adapter-private metadata (ids, native stop reason). */ + response: unknown + /** + * Per-block adapter-private metadata, one entry per emitted block in + * first-seen stream order. When assembly drops a block it drops the entry at + * the same position; entries whose length does not match the emitted block + * count discard the whole envelope. An adapter whose metadata is independent + * of block structure omits this field and the envelope passes through + * assembly unchanged. + */ + blocks?: readonly unknown[] +} +``` + ```ts type-equiv /** * Raw streaming protocol emitted by adapters. @@ -174,8 +199,8 @@ type StreamChunk = | { type: 'finish' reason: FinishReason - /** Adapter-private lossless-JSON state for replaying a successful response. */ - replayState?: unknown + /** Replay metadata for a successful response; see {@link ReplayEnvelope}. */ + replayState?: ReplayEnvelope } ``` @@ -211,7 +236,7 @@ Every adapter MUST obey these, and every consumer may rely on them: - **Context overflow has one canonical code.** Both DeepSeek adapters classify explicit provider detail through `isContextWindowExceededError()` and surface `CONTEXT_WINDOW_EXCEEDED`, whether the failure arrives as a thrown HTTP `LlmError` or an in-band finish error. Consumers route on the code, never provider text. - **An empty completion is a retryable error, not a silent success.** Both adapters map a terminal `stop` finish that carried no content blocks to `finish {kind:'error'}` with the canonical `EMPTY_RESPONSE` code, and `dsh-llm-retry` retries it by default; see [empty model responses are retryable](../../.agents/notes/implemented/bug-fix/2026-07-24-empty-model-response-is-retryable.md). - **Every provider HTTP request carries the app-attribution header.** Adapters send `attributionHeaders()` (below) - the `User-Agent` baseline - and prove it with a wire-level test. -- **Replay state is adapter-owned.** A successful `finish` may carry lossless-JSON state needed to reconstruct a native provider response. The loop stores it with the assembled assistant message. On a later request, `LlmRuntime` passes the state only when the historical provider and target provider are currently registered to the exact same adapter instance. That adapter validates the state and owns any cross-model or cross-provider conversion; other adapters receive the provider-neutral content plus provider/model fields without the private state. +- **Replay state is adapter-owned; its split is shared.** A successful `finish` may carry a `ReplayEnvelope`: opaque response-level metadata plus optional per-block entries aligned with the emitted block sequence. The alignment is the harness's vocabulary — when assembly drops a block it drops the entry at the same position, so stored metadata always describes stored content. The loop stores the pruned envelope with the assembled assistant message. On a later request, `LlmRuntime` passes the state only when the historical provider and target provider are currently registered to the exact same adapter instance. That adapter validates the state and owns any cross-model or cross-provider conversion; other adapters receive the provider-neutral content plus provider/model fields without the private state. Durable content stays authoritative: a stored state the reading adapter cannot use degrades that one message to provider-neutral conversion with a diagnostic instead of failing the request. ## `ResolvedRetryPolicy` @@ -265,6 +290,8 @@ interface TokenUsage { `BlockAssembler` ([`packages/llm/llm/src/assembler.ts`](../../packages/llm/llm/src/assembler.ts)) is the single shared implementation that folds a `StreamChunk` stream back into `ContentBlock`s, usage, finish reason, and replay state. The loop logs the raw chunks while feeding the same chunks through an assembler, then stores the assembled assistant content with the provider and model that produced it. A consumer that needs the assembled result without re-implementing the fold uses this. +One keep/drop decision covers content and metadata together: a `max-tokens` finish drops every tool call because a truncated call is unsafe to execute, and the same decision prunes the replay envelope's per-block entry at each dropped position. `blocks()` and `replayState` therefore cannot disagree, whatever assembly removes. + ```ts public-api /** * Incrementally assembles raw {@link StreamChunk}s into complete @@ -294,8 +321,12 @@ declare class BlockAssembler { get usage(): TokenUsage | undefined; /** Finish reason from the `finish` chunk; `{kind: 'stop'}` when the stream ended without one. */ get finish(): FinishReason; - /** Adapter-private replay state from the terminal finish chunk, if any. */ - get replayState(): unknown; + /** + * Replay metadata from the terminal finish chunk, if any, with per-block + * entries pruned in step with {@link blocks}. Undefined when the envelope's + * entries do not align with the emitted blocks. + */ + get replayState(): ReplayEnvelope | undefined; /** * The assembled assistant message. * @param source - producer attribution for the assembled message. diff --git a/docs/subsystems/llm-streaming.zh.md b/docs/subsystems/llm-streaming.zh.md index fbaa47d14d..5c31909ee7 100644 --- a/docs/subsystems/llm-streaming.zh.md +++ b/docs/subsystems/llm-streaming.zh.md @@ -157,6 +157,29 @@ type ContextFormed = 一个æµ�å¼�å“�应交错包å�«å¤šç§�类型的å�—(文本ã€�推ç�†ï¼ˆreasoning)ã€�多个工具调用)。`index` å°†æ¯�个 delta å…³è�”到其所属å�—ï¼›`block-end` æ�ºå¸¦å®Œæ•´ç»„装好的 `ContentBlock`,消费方无需自行é‡�新组装 delta。这是一个**å°�é—­çš„**å�¯è¾¨è¯†è�”å�ˆç±»åž‹ï¼šå¯¹ `type` çš„ `switch` 以 `assertNever` 结尾,因此新增å�˜ä½“会在æ¯�个必须处ç�†å®ƒçš„æ¶ˆè´¹æ–¹å¤„触å�‘编译错误。 +```ts type-equiv +/** + * Adapter-private lossless-JSON state for replaying a successful response, + * carried by a terminal `finish` chunk and stored on the assembled assistant + * message's model source. Both halves stay opaque to the harness; only the + * split is shared vocabulary, so assembly can keep stored metadata aligned + * with stored content without reading either half. + */ +interface ReplayEnvelope { + /** Response-level adapter-private metadata (ids, native stop reason). */ + response: unknown + /** + * Per-block adapter-private metadata, one entry per emitted block in + * first-seen stream order. When assembly drops a block it drops the entry at + * the same position; entries whose length does not match the emitted block + * count discard the whole envelope. An adapter whose metadata is independent + * of block structure omits this field and the envelope passes through + * assembly unchanged. + */ + blocks?: readonly unknown[] +} +``` + ```ts type-equiv /** * Raw streaming protocol emitted by adapters. @@ -176,8 +199,8 @@ type StreamChunk = | { type: 'finish' reason: FinishReason - /** Adapter-private lossless-JSON state for replaying a successful response. */ - replayState?: unknown + /** Replay metadata for a successful response; see {@link ReplayEnvelope}. */ + replayState?: ReplayEnvelope } ``` @@ -215,7 +238,7 @@ interface LlmFailure { - **上下文溢出å�ªæœ‰ä¸€ä¸ªè§„范 code。** 两个 DeepSeek 适é…�器都通过 `isContextWindowExceededError()` 对æ��供方的显å¼�细节分类并暴露 `CONTEXT_WINDOW_EXCEEDED`,无论失败以抛出的 HTTP `LlmError` 还是带内 finish error 到达。消费方按 code 路由,ç»�ä¸�ä¾�èµ–æ��供方文本。 - **空 completion 是å�¯é‡�试错误,而ä¸�是é�™é»˜çš„æˆ�功结果。** 两个适é…�器都把没有æ�ºå¸¦ä»»ä½•内容å�—的终止性 `stop` 结æ�Ÿæ˜ å°„为æ�ºå¸¦è§„范 `EMPTY_RESPONSE` code çš„ `finish {kind:'error'}`,`dsh-llm-retry` 默认会é‡�试它;详è§�[空模型å“�应å�¯é‡�试](../../.agents/notes/implemented/bug-fix/2026-07-24-empty-model-response-is-retryable.md)。 - **æ¯�个æ��供方 HTTP 请求都æ�ºå¸¦åº”用归属头。** 适é…�器å�‘é€� `attributionHeaders()`(è§�下文)作为 `User-Agent` 基线,并通过å��议级测试加以è¯�明。 -- **回放状æ€�归适é…�器所有。** æˆ�功的 `finish` å�¯ä»¥æ�ºå¸¦é‡�建æ��供方原生å“�应所需的无æ�Ÿ JSON 状æ€�。循环会将其与组装å�Žçš„ assistant 消æ�¯ä¸€èµ·å­˜å‚¨ã€‚å�Žç»­è¯·æ±‚中,仅当历å�²æ��供方与目标æ��供方当å‰�注册到完全相å�Œçš„适é…�器实例时,`LlmRuntime` æ‰�会传递该状æ€�。该适é…�器负责校验状æ€�并拥有所有跨模型或跨æ��供方转æ�¢ï¼›å…¶ä»–适é…�器å�ªä¼šæ”¶åˆ°æ��供方无关的内容以å�Šæ��供方ï¼�模型字段,ä¸�会收到ç§�有状æ€�。 +- **回放状æ€�归适é…�器所有;其切分是共享è¯�汇。** æˆ�功的 `finish` å�¯ä»¥æ�ºå¸¦ä¸€ä¸ª `ReplayEnvelope`:ä¸�é€�明的å“�应级元数æ�®ï¼ŒåŠ ä¸Šä¸Žå�‘å°„å�—åº�列对é½�çš„å�¯é€‰é€�å�—æ�¡ç›®ã€‚对é½�关系是 harness çš„è¯�汇——组装丢弃æŸ�个å�—时,å�Œä¸€ä½�置的æ�¡ç›®ä¸€å¹¶ä¸¢å¼ƒï¼Œå› æ­¤å­˜å‚¨çš„元数æ�®å§‹ç»ˆæ��述存储的内容。循环把è£�剪å�Žçš„æ•°æ�®ä¸Žç»„装å�Žçš„ assistant 消æ�¯ä¸€èµ·å­˜å‚¨ã€‚å�Žç»­è¯·æ±‚中,仅当历å�²æ��供方与目标æ��供方当å‰�注册到完全相å�Œçš„适é…�器实例时,`LlmRuntime` æ‰�会传递该状æ€�。该适é…�器负责校验状æ€�并拥有所有跨模型或跨æ��供方转æ�¢ï¼›å…¶ä»–适é…�器å�ªä¼šæ”¶åˆ°æ��供方无关的内容以å�Šæ��供方ï¼�模型字段,ä¸�会收到ç§�有状æ€�。æŒ�久化内容ä¿�æŒ�æ�ƒå¨�:读å�–适é…�器无法使用的已存状æ€�å�ªä¼šæŠŠè¿™ä¸€æ�¡æ¶ˆæ�¯é™�级为æ��供方无关转æ�¢å¹¶å¸¦å‡ºè¯Šæ–­ï¼Œè€Œä¸�是让请求失败。 ## `ResolvedRetryPolicy` @@ -273,6 +296,8 @@ interface TokenUsage { `BlockAssembler`([`packages/llm/llm/src/assembler.ts`](../../packages/llm/llm/src/assembler.ts))是唯一的共享实现,负责把 `StreamChunk` æµ�折å� å›ž `ContentBlock`ã€�usageã€�结æ�ŸåŽŸå› ä¸Žå›žæ”¾çŠ¶æ€�。循环在记录原始分片的å�Œæ—¶ï¼ŒæŠŠå�Œä¸€æ‰¹åˆ†ç‰‡é€�å…¥ assembler,å†�将组装å�Žçš„ assistant 内容连å�Œç”Ÿæˆ�它的æ��供方和模型一起存储。需è¦�组装结果ã€�å�ˆä¸�想é‡�新实现 fold 的消费方使用它。 +内容与元数æ�®å…±ç”¨å�Œä¸€æ¬¡ä¿�ç•™/丢弃决定:`max-tokens` 结æ�Ÿä¼šä¸¢å¼ƒæ¯�个工具调用,因为被截断的调用ä¸�能安全执行,而å�Œä¸€å†³å®šä¼šåœ¨æ¯�个被丢弃的ä½�ç½®è£�剪回放数æ�®çš„é€�å�—æ�¡ç›®ã€‚无论组装移除什么,`blocks()` 与 `replayState` 都ä¸�å�¯èƒ½ä¸�一致。 + ```ts public-api /** * Incrementally assembles raw {@link StreamChunk}s into complete @@ -302,8 +327,12 @@ declare class BlockAssembler { get usage(): TokenUsage | undefined; /** Finish reason from the `finish` chunk; `{kind: 'stop'}` when the stream ended without one. */ get finish(): FinishReason; - /** Adapter-private replay state from the terminal finish chunk, if any. */ - get replayState(): unknown; + /** + * Replay metadata from the terminal finish chunk, if any, with per-block + * entries pruned in step with {@link blocks}. Undefined when the envelope's + * entries do not align with the emitted blocks. + */ + get replayState(): ReplayEnvelope | undefined; /** * The assembled assistant message. * @param source - producer attribution for the assembled message. diff --git a/docs/subsystems/lsp.i18n.yaml b/docs/subsystems/lsp.i18n.yaml index d001f5c6d6..4de29d66b7 100644 --- a/docs/subsystems/lsp.i18n.yaml +++ b/docs/subsystems/lsp.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/lsp.md -lsp.md: 66317acc25860cfeaa3d8fb35daf2947e811e18c -lsp.zh.md: 8d975e30cb5065fd89645166c657050233eb81da +lsp.md: 18ed0e178c73702534a9964557a3dabf7bb9dd11 +lsp.zh.md: 8b154143057f05d74bf28b715a385a2ec65fbbff diff --git a/docs/subsystems/lsp.md b/docs/subsystems/lsp.md index 66317acc25..18ed0e178c 100644 --- a/docs/subsystems/lsp.md +++ b/docs/subsystems/lsp.md @@ -2,7 +2,7 @@ English | [中文](lsp.zh.md) -The LSP seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-07-15-lsp-capability-seam.md) exposing semantic code navigation on one `ctx.lsp` service, split across packages: Service Definition ([dsh-lsp](../../packages/lsp/lsp), `ctx.lsp` + the provider registry), a generic Service provider ([dsh-lsp-stdio](../../packages/lsp/lsp-stdio), a configured stdio language-server host), and Consumer ([dsh-tool-lsp](../../packages/lsp/tool-lsp), the `lsp` tool schema). LSP is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A provider swap does not change how the model asks for navigation. +The LSP seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-07-15-lsp-capability-seam.md) exposing semantic code navigation on one `ctx.lsp` service, split across packages: Service Definition ([dsh-lsp](../../packages/lsp/lsp), `ctx.lsp` + the provider registry), a generic Service Provider ([dsh-lsp-stdio](../../packages/lsp/lsp-stdio), a configured stdio language-server host), and Consumer ([dsh-tool-lsp](../../packages/lsp/tool-lsp), the `lsp` tool schema). LSP is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A provider swap does not change how the model asks for navigation. Source: [`packages/lsp/lsp/src/types.ts`](../../packages/lsp/lsp/src/types.ts) diff --git a/docs/subsystems/lsp.zh.md b/docs/subsystems/lsp.zh.md index 8d975e30cb..8b15414305 100644 --- a/docs/subsystems/lsp.zh.md +++ b/docs/subsystems/lsp.zh.md @@ -2,7 +2,7 @@ [English](lsp.md) | 中文 -LSP seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-07-15-lsp-capability-seam.md):它在å�•一 `ctx.lsp` æœ�务上公开语义代ç �导航,并拆分到多个包:Service Definition([dsh-lsp](../../packages/lsp/lsp),`ctx.lsp` + æ��供方注册表)ã€�通用 Service provider([dsh-lsp-stdio](../../packages/lsp/lsp-stdio),ç»�过é…�置的 stdio 语言æœ�务器宿主)和 Consumer([dsh-tool-lsp](../../packages/lsp/tool-lsp),å�³ `lsp` 工具 schema)。LSP 是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇定义在此而é�ž [core.md](core.md) 中。更æ�¢æ��供方ä¸�会改å�˜æ¨¡åž‹è¯·æ±‚导航的方å¼�。 +LSP seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-07-15-lsp-capability-seam.md):它在å�•一 `ctx.lsp` æœ�务上公开语义代ç �导航,并拆分到多个包:Service Definition([dsh-lsp](../../packages/lsp/lsp),`ctx.lsp` + æ��供方注册表)ã€�通用 Service Provider([dsh-lsp-stdio](../../packages/lsp/lsp-stdio),ç»�过é…�置的 stdio 语言æœ�务器宿主)和 Consumer([dsh-tool-lsp](../../packages/lsp/tool-lsp),å�³ `lsp` 工具 schema)。LSP 是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇定义在此而é�ž [core.md](core.md) 中。更æ�¢æ��供方ä¸�会改å�˜æ¨¡åž‹è¯·æ±‚导航的方å¼�。 æº�文件:[`packages/lsp/lsp/src/types.ts`](../../packages/lsp/lsp/src/types.ts) diff --git a/docs/subsystems/persistence.i18n.yaml b/docs/subsystems/persistence.i18n.yaml index 6d0ca447a2..2950610348 100644 --- a/docs/subsystems/persistence.i18n.yaml +++ b/docs/subsystems/persistence.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/persistence.md -persistence.md: fde8348d64a200eda5133abf66deedee6be09857 -persistence.zh.md: a2a836d81d153a2697c1d739345501e7e6770eef +persistence.md: 5b1b224e419aca205baba69894ed64467b8fb4e1 +persistence.zh.md: a91e7d66b92270c82287d054e619b665e96ea206 diff --git a/docs/subsystems/persistence.md b/docs/subsystems/persistence.md index fde8348d64..5b1b224e41 100644 --- a/docs/subsystems/persistence.md +++ b/docs/subsystems/persistence.md @@ -36,6 +36,8 @@ interface SessionLocation { } ``` + + ## `SessionHeader` — metadata beside the log Per-session metadata travels **separately** from the event log: format version, cwd, lineage, and the seed boundary are storage concerns, not conversation events, so they stay out of `SessionEventMap` and never reach `deriveMessages()`. The header is attached to a `Session` via `session.header`. diff --git a/docs/subsystems/persistence.zh.md b/docs/subsystems/persistence.zh.md index a2a836d81d..a91e7d66b9 100644 --- a/docs/subsystems/persistence.zh.md +++ b/docs/subsystems/persistence.zh.md @@ -36,6 +36,8 @@ interface SessionLocation { } ``` + + ## `SessionHeader`:日志æ—�的元数æ�® æ¯�个会è¯�的元数æ�®ä¸Žäº‹ä»¶æ—¥å¿—**分开**存储:格å¼�版本ã€�cwdã€�血统与 seed 边界是存储层关注点而é�žå¯¹è¯�事件,因此ä¸�进入 `SessionEventMap`,也ä¸�会到达 `deriveMessages()`。header 通过 `session.header` 附加到 `Session` 上。 diff --git a/docs/subsystems/session-query.i18n.yaml b/docs/subsystems/session-query.i18n.yaml index 0d9bb279a4..e53e0a969e 100644 --- a/docs/subsystems/session-query.i18n.yaml +++ b/docs/subsystems/session-query.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/session-query.md -session-query.md: 647b50a297a434308769ab3c5f1af0af7480b937 -session-query.zh.md: 7b03f8515501abe5e1ab35d50f6a6a230a96cf0c +session-query.md: 6ddde5b8a19ebc65952b5a24003c48f55ff5a244 +session-query.zh.md: b7d4ab4910c99c9f77c17f0279f2d4fd3c336659 diff --git a/docs/subsystems/session-query.md b/docs/subsystems/session-query.md index 647b50a297..6ddde5b8a1 100644 --- a/docs/subsystems/session-query.md +++ b/docs/subsystems/session-query.md @@ -332,7 +332,7 @@ interface SessionEventTraceObservation extends SessionEventTrace { ## Errors -The closed code union distinguishes request validation, missing targets, malformed surface logs, optional-backend failure, and contradictory source metadata. +The closed code union distinguishes request validation, missing targets, malformed surface logs, optional-backend failure, deployment-disabled search, and contradictory source metadata. ```ts type-equiv /** Stable machine-routable failure taxonomy for session reads, traces, and search. */ @@ -350,6 +350,7 @@ type SessionQueryErrorCode = | 'SESSION_QUERY_INVALID_SURFACE' | 'SESSION_QUERY_INVALID_WINDOW' | 'SESSION_QUERY_PERSISTENCE_FAILED' + | 'SESSION_QUERY_SEARCH_DISABLED' | 'SESSION_QUERY_SESSION_NOT_FOUND' | 'SESSION_QUERY_STALE_CURSOR' | 'SESSION_QUERY_SOURCE_CONFLICT' diff --git a/docs/subsystems/session-query.zh.md b/docs/subsystems/session-query.zh.md index 7b03f85155..b7d4ab4910 100644 --- a/docs/subsystems/session-query.zh.md +++ b/docs/subsystems/session-query.zh.md @@ -332,7 +332,7 @@ interface SessionEventTraceObservation extends SessionEventTrace { ## 错误 -å°�é—­çš„ code è�”å�ˆç±»åž‹åŒºåˆ†è¯·æ±‚校验ã€�目标缺失ã€�surface 日志格å¼�错误ã€�å�¯é€‰å�Žç«¯æ•…障与矛盾的æº�元数æ�®ã€‚ +å°�é—­çš„ code è�”å�ˆç±»åž‹åŒºåˆ†è¯·æ±‚校验ã€�目标缺失ã€�surface 日志格å¼�错误ã€�å�¯é€‰å�Žç«¯æ•…éšœã€�部署关闭æ�œç´¢ä¸ŽçŸ›ç›¾çš„æº�元数æ�®ã€‚ ```ts type-equiv /** Stable machine-routable failure taxonomy for session reads, traces, and search. */ @@ -350,6 +350,7 @@ type SessionQueryErrorCode = | 'SESSION_QUERY_INVALID_SURFACE' | 'SESSION_QUERY_INVALID_WINDOW' | 'SESSION_QUERY_PERSISTENCE_FAILED' + | 'SESSION_QUERY_SEARCH_DISABLED' | 'SESSION_QUERY_SESSION_NOT_FOUND' | 'SESSION_QUERY_STALE_CURSOR' | 'SESSION_QUERY_SOURCE_CONFLICT' diff --git a/docs/subsystems/session-telemetry.i18n.yaml b/docs/subsystems/session-telemetry.i18n.yaml index 31bcdef024..49f5b9c328 100644 --- a/docs/subsystems/session-telemetry.i18n.yaml +++ b/docs/subsystems/session-telemetry.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/session-telemetry.md -session-telemetry.md: f6a51dbd1de43525e0a1b062f11a140317a1cdd9 -session-telemetry.zh.md: 8cfd04121f9ab9741fd4a968c3f73eb6983992b7 +session-telemetry.md: dd00e428c3ecb1e0158be09cce83d1a262ab0c62 +session-telemetry.zh.md: 835fc0ff2f2daa1f4ac90fe615a62aa36f7fe41d diff --git a/docs/subsystems/session-telemetry.md b/docs/subsystems/session-telemetry.md index f6a51dbd1d..dd00e428c3 100644 --- a/docs/subsystems/session-telemetry.md +++ b/docs/subsystems/session-telemetry.md @@ -2,7 +2,7 @@ English | [中文](session-telemetry.zh.md) -Outbound session reporting is split as a [capability seam](../capability-seams.md): the Service Definition and capture coordinator ([dsh-session-telemetry](../../packages/session/session-telemetry), `ctx.sessionTelemetry`) own the capture points, fixed chunk projection, `session-telemetry/record` redaction waterfall, handoff cursor, and minimal backend contract; the Service provider a deployment loads ([dsh-session-telemetry-otel](../../packages/session/session-telemetry-otel)) is the OpenTelemetry JS SDK's log pipeline configured verbatim. It is one optional capability, not part of the agent-loop spine, and nothing here reaches a model request. The boundary axiom — the harness's aspect ends at `emit()`; batching, retry, queueing, and loss policy belong to the reporting SDK — and the rejected alternatives are pinned in the [revival Agent Note](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md); the capture points, cursor, and projection contracts live in the [Service Definition README](../../packages/session/session-telemetry/README.md). +Outbound session reporting is split as a [capability seam](../capability-seams.md): the Service Definition and capture coordinator ([dsh-session-telemetry](../../packages/session/session-telemetry), `ctx.sessionTelemetry`) own the capture points, fixed chunk projection, `session-telemetry/record` redaction waterfall, handoff cursor, and minimal backend contract; the Service Provider a deployment loads ([dsh-session-telemetry-otel](../../packages/session/session-telemetry-otel)) is the OpenTelemetry JS SDK's log pipeline configured verbatim. It is one optional capability, not part of the agent-loop spine, and nothing here reaches a model request. The boundary axiom — the harness's aspect ends at `emit()`; batching, retry, queueing, and loss policy belong to the reporting SDK — and the rejected alternatives are pinned in the [revival Agent Note](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md); the capture points, cursor, and projection contracts live in the [Service Definition README](../../packages/session/session-telemetry/README.md). Source: [`packages/session/session-telemetry/src/index.ts`](../../packages/session/session-telemetry/src/index.ts) diff --git a/docs/subsystems/session-telemetry.zh.md b/docs/subsystems/session-telemetry.zh.md index 8cfd04121f..835fc0ff2f 100644 --- a/docs/subsystems/session-telemetry.zh.md +++ b/docs/subsystems/session-telemetry.zh.md @@ -2,7 +2,7 @@ [English](session-telemetry.md) | 中文 -对外的会è¯�上报拆分为一项[能力 seam](../capability-seams.md):Service Definition 与æ�•获å��调器([dsh-session-telemetry](../../packages/session/session-telemetry),`ctx.sessionTelemetry`)拥有æ�•获点ã€�固定分片投影ã€�`session-telemetry/record` 脱æ•� waterfall(瀑布å¼�事件)ã€�handoff 游标与最å°�å�Žç«¯çº¦å®šï¼›éƒ¨ç½²æ–¹åŠ è½½çš„ Service provider([dsh-session-telemetry-otel](../../packages/session/session-telemetry-otel))则是原样é…�置的 OpenTelemetry JS SDK 日志æµ�水线。它是一项å�¯é€‰èƒ½åŠ›ï¼Œä¸�属于 agent loop(智能体循环)主干,这里也没有任何内容会进入模型请求。边界公ç�†ï¼ˆharness çš„è�Œè´£æ­¢äºŽ `emit()`;批处ç�†ã€�é‡�试ã€�排队与丢失策略都属于上报 SDK)连å�Œè¢«å�¦å†³çš„æ›¿ä»£æ–¹æ¡ˆï¼Œå�‡å·²åœ¨[å¤�æ´» Agent Note](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md)中定案;æ�•获点ã€�游标与投影的约定è§� [Service Definition README](../../packages/session/session-telemetry/README.md)。 +对外的会è¯�上报拆分为一项[能力 seam](../capability-seams.md):Service Definition 与æ�•获å��调器([dsh-session-telemetry](../../packages/session/session-telemetry),`ctx.sessionTelemetry`)拥有æ�•获点ã€�固定分片投影ã€�`session-telemetry/record` 脱æ•� waterfall(瀑布å¼�事件)ã€�handoff 游标与最å°�å�Žç«¯çº¦å®šï¼›éƒ¨ç½²æ–¹åŠ è½½çš„ Service Provider([dsh-session-telemetry-otel](../../packages/session/session-telemetry-otel))则是原样é…�置的 OpenTelemetry JS SDK 日志æµ�水线。它是一项å�¯é€‰èƒ½åŠ›ï¼Œä¸�属于 agent loop(智能体循环)主干,这里也没有任何内容会进入模型请求。边界公ç�†ï¼ˆharness çš„è�Œè´£æ­¢äºŽ `emit()`;批处ç�†ã€�é‡�试ã€�排队与丢失策略都属于上报 SDK)连å�Œè¢«å�¦å†³çš„æ›¿ä»£æ–¹æ¡ˆï¼Œå�‡å·²åœ¨[å¤�æ´» Agent Note](../../.agents/notes/implemented/feature/2026-07-23-session-telemetry-otel-revival.md)中定案;æ�•获点ã€�游标与投影的约定è§� [Service Definition README](../../packages/session/session-telemetry/README.md)。 æº�ç �:[`packages/session/session-telemetry/src/index.ts`](../../packages/session/session-telemetry/src/index.ts) diff --git a/docs/subsystems/session.i18n.yaml b/docs/subsystems/session.i18n.yaml index 8ee4185e54..1c33960769 100644 --- a/docs/subsystems/session.i18n.yaml +++ b/docs/subsystems/session.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/session.md -session.md: 4c40971fe58952b32635aa5eb767a42f73108b00 -session.zh.md: d958b03fcdad91b58cc277636e599cce46a2c7fb +session.md: aea9d00b38e384e7a973ce168c3a75a62e70a8bb +session.zh.md: 8c56029af5144569f1ab6df73a8fe2278f9ef5b4 diff --git a/docs/subsystems/session.md b/docs/subsystems/session.md index 4c40971fe5..aea9d00b38 100644 --- a/docs/subsystems/session.md +++ b/docs/subsystems/session.md @@ -149,6 +149,8 @@ interface TodoItem { } ``` + + ### The request header event: `request/header` The request envelope — the `EpochHeader` (call config + markers for adapter-supplied defaults + rendered system prompt + assembled tool schemas) — is logged session state, so every conversation request is a pure function of the log (the reconstructability Agent Note). A full `request/header` snapshot with reason `'initial'` or `'resume'` records each loop-instance boundary; a later changed request records another full snapshot with reason `'change'`. `foldRequestHeader(events)` reconstructs the header by selecting the latest snapshot. The event is not a `SurfaceEventType`: it produces no LLM message. @@ -586,7 +588,7 @@ An explicitly supplied empty seed writes `session/end-seed` at seq 0, which dist It exists because seed history and live work are otherwise byte-identical, which defeats any plugin owning a standalone open/close bracket: an unmatched `compaction/start` reads the same whether the writer crashed mid-compaction or is compacting right now. An opening marker before `session/end-seed` came from the constructor seed and belongs to an ended lifecycle, whatever ended it (a crash, a succeeding process, or a fork out of a still-running parent), so its owner may treat it as dead. That covers only brackets *this* session inherited: a concurrently live session holding an open bracket over the same history has its own boundary elsewhere, so tolerating concurrent writers needs a liveness signal beyond the log. Core writes the boundary and reads nothing from it — a bracket's vocabulary stays with its owning plugin, which is why crash repair closes turn/step/tool boundaries and never `compaction/*`. -Activity ordering excludes the boundary through `lastActivityTime(events)`: picking a session up is not work, and lazy resume means browsing writes one, so a resume picker or session list ordering by log tail would float every opened session to the top. +Consumers that order Sessions by human activity exclude this boundary: picking a Session up is not work, so ordering by the log tail would float every opened Session to the top. ## Plugin-contributed log-only events diff --git a/docs/subsystems/session.zh.md b/docs/subsystems/session.zh.md index d958b03fcd..8c56029af5 100644 --- a/docs/subsystems/session.zh.md +++ b/docs/subsystems/session.zh.md @@ -590,7 +590,7 @@ interface TurnEndReasonMap { 它之所以必è¦�,是因为ç§�å­�历å�²ä¸Žå®žæ—¶å·¥ä½œåœ¨å­—节层é�¢å®Œå…¨ç›¸å�Œï¼Œè¿™ä¼šè®©ä»»ä½•拥有独立开ï¼�闭括å�·çš„æ�’件失效:一个未é…�对的 `compaction/start`,无论写入方是在压缩中途崩溃ã€�还是此刻正在压缩,读起æ�¥éƒ½ä¸€æ ·ã€‚在 `session/end-seed` 之å‰�的开å�¯æ ‡è®°æ�¥è‡ªæž„造ç§�å­�,并且属于一个已结æ�Ÿçš„生命周期,无论结æ�ŸåŽŸå› ä¸ºä½•ï¼ˆå´©æºƒã€�进程接替,或从ä»�在è¿�行的父会è¯� fork 出æ�¥ï¼‰ï¼Œå› æ­¤å…¶æ‰€æœ‰æ–¹å�¯ä»¥è§†ä¹‹ä¸ºå·²æ­»ã€‚è¿™å�ªè¦†ç›–*本*会è¯�继承的括å�·ï¼šå�¦ä¸€ä¸ªå¹¶å�‘存活的会è¯�å�¯èƒ½åœ¨å�Œä¸€æ®µåކå�²ä¸ŠæŒ�有开放括å�·ï¼Œè€Œå®ƒè‡ªå·±çš„边界在别处,因此容å¿�å¹¶å�‘写入方还需è¦�日志之外的存活信å�·ã€‚核心写入该边界但ä¸�从中读å�–任何内容——括å�·çš„è¯�汇表ä»�归其所属æ�’件,这也正是崩溃修å¤�å�ªå…³é—­è½®æ¬¡ï¼�步骤ï¼�工具边界而从ä¸�处ç�† `compaction/*` 的原因。 -活动排åº�通过 `lastActivityTime(events)` 排除该边界:接手会è¯�ä¸�算工作,而惰性æ�¢å¤�æ„�味ç�€æµ�览就会写入一个,因此按日志尾部排åº�çš„æ�¢å¤�选择器或会è¯�列表会把æ¯�个打开过的会è¯�顶到最å‰�。 +按真人活动排åº� Session 的消费方会排除该边界:接手 Session ä¸�算工作,因此按日志尾部排åº�会把æ¯�个打开过的 Session 顶到最å‰�。 ## æ�’件贡献的仅日志事件 diff --git a/docs/subsystems/shell.i18n.yaml b/docs/subsystems/shell.i18n.yaml index 822ce1fb60..a7b6bf45fc 100644 --- a/docs/subsystems/shell.i18n.yaml +++ b/docs/subsystems/shell.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/shell.md -shell.md: 10f96936390a2b77f961ca6222d1e8c4019bbd9c -shell.zh.md: af0bc72b620c747ce107acdfeade699967e38568 +shell.md: b9f8e3aebb69348ea241be93d6fd5559068c4029 +shell.zh.md: 1ea086819f3badc92376d39cb13e584da772572b diff --git a/docs/subsystems/shell.md b/docs/subsystems/shell.md index 10f9693639..b9f8e3aebb 100644 --- a/docs/subsystems/shell.md +++ b/docs/subsystems/shell.md @@ -2,7 +2,7 @@ English | [中文](shell.zh.md) -The bash execution seam is split across a Service Definition ([dsh-shell](../../packages/shell/shell), `ctx.shell`), Service providers ([dsh-bash-local](../../packages/shell/bash-local) and [dsh-bash-sandbox](../../packages/shell/bash-sandbox)), and Consumer ([dsh-tool-bash](../../packages/shell/tool-bash), the `bash` schema). Generic background-job ids, ownership, and controls live in [jobs.md](jobs.md); this seam returns a task-free process handle. Raw process-group mechanics live behind the [subprocess seam](subprocess.md). +The bash execution seam is split across a Service Definition ([dsh-shell](../../packages/shell/shell), `ctx.shell`), Service Providers ([dsh-bash-local](../../packages/shell/bash-local) and [dsh-bash-sandbox](../../packages/shell/bash-sandbox)), and Consumer ([dsh-tool-bash](../../packages/shell/tool-bash), the `bash` schema). Generic background-job ids, ownership, and controls live in [jobs.md](jobs.md); this seam returns a task-free process handle. Raw process-group mechanics live behind the [subprocess seam](subprocess.md). Source: [`packages/shell/shell/src/types.ts`](../../packages/shell/shell/src/types.ts) diff --git a/docs/subsystems/shell.zh.md b/docs/subsystems/shell.zh.md index af0bc72b62..1ea086819f 100644 --- a/docs/subsystems/shell.zh.md +++ b/docs/subsystems/shell.zh.md @@ -2,7 +2,7 @@ [English](shell.md) | 中文 -bash 执行 seam 分为 Service Definition([dsh-shell](../../packages/shell/shell),`ctx.shell`)ã€�Service provider([dsh-bash-local](../../packages/shell/bash-local) 与 [dsh-bash-sandbox](../../packages/shell/bash-sandbox))和 Consumer([dsh-tool-bash](../../packages/shell/tool-bash),å�³ `bash` schema)。通用å�Žå�°ä»»åŠ¡çš„ job idã€�所有æ�ƒä¸ŽæŽ§åˆ¶ä½�于 [jobs.md](jobs.md);本 seam 返回一个ä¸�å�«ä»»åŠ¡æ¦‚å¿µçš„è¿›ç¨‹å�¥æŸ„。原始进程组机制å°�装在[å­�进程 seam](subprocess.md)之å�Žã€‚ +bash 执行 seam 分为 Service Definition([dsh-shell](../../packages/shell/shell),`ctx.shell`)ã€�Service Provider([dsh-bash-local](../../packages/shell/bash-local) 与 [dsh-bash-sandbox](../../packages/shell/bash-sandbox))和 Consumer([dsh-tool-bash](../../packages/shell/tool-bash),å�³ `bash` schema)。通用å�Žå�°ä»»åŠ¡çš„ job idã€�所有æ�ƒä¸ŽæŽ§åˆ¶ä½�于 [jobs.md](jobs.md);本 seam 返回一个ä¸�å�«ä»»åŠ¡æ¦‚å¿µçš„è¿›ç¨‹å�¥æŸ„。原始进程组机制å°�装在[å­�进程 seam](subprocess.md)之å�Žã€‚ æº�ç �:[`packages/shell/shell/src/types.ts`](../../packages/shell/shell/src/types.ts) diff --git a/docs/subsystems/skills.i18n.yaml b/docs/subsystems/skills.i18n.yaml index 97746ffff7..922f1eb95e 100644 --- a/docs/subsystems/skills.i18n.yaml +++ b/docs/subsystems/skills.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/skills.md -skills.md: 98d5efea0b534e8232aeae03eda3de10259756e3 -skills.zh.md: 8a2b03da4b7bab0a3142eab3cc07f66f379dfd28 +skills.md: cd935692c00f89544dc324b33e847d8d588b78a8 +skills.zh.md: f574db048e1850ee425309fe015cd21a075eefc6 diff --git a/docs/subsystems/skills.md b/docs/subsystems/skills.md index 98d5efea0b..cd935692c0 100644 --- a/docs/subsystems/skills.md +++ b/docs/subsystems/skills.md @@ -2,7 +2,7 @@ English | [中文](skills.zh.md) -The [skill capability family](../../packages/skill) includes the Service Definition ([dsh-skill](../../packages/skill/skill), `ctx.skills`), the local Service provider ([dsh-skill-filesystem](../../packages/skill/skill-filesystem)), the optional packaged badge provider ([dsh-skill-badge](../../packages/skill/skill-badge)), and the Consumer ([dsh-tool-skill](../../packages/skill/tool-skill)). The registry merges provider catalogs across its host and per-scope layers; providers contribute local or packaged skills; the Consumer owns the initial and replacement catalogs plus the model-facing `skill` tool. Skills are optional instructions, not session events, so their vocabulary lives here rather than in [core.md](core.md). +The [skill capability family](../../packages/skill) includes the Service Definition ([dsh-skill](../../packages/skill/skill), `ctx.skills`), the local Service Provider ([dsh-skill-filesystem](../../packages/skill/skill-filesystem)), the optional packaged badge provider ([dsh-skill-badge](../../packages/skill/skill-badge)), and the Consumer ([dsh-tool-skill](../../packages/skill/tool-skill)). The registry merges provider catalogs across its host and per-scope layers; providers contribute local or packaged skills; the Consumer owns the initial and replacement catalogs plus the model-facing `skill` tool. Skills are optional instructions, not session events, so their vocabulary lives here rather than in [core.md](core.md). Source: [`packages/skill/skill/src/index.ts`](../../packages/skill/skill/src/index.ts), [`packages/skill/skill-filesystem/src/index.ts`](../../packages/skill/skill-filesystem/src/index.ts), [`packages/skill/skill-badge/src/index.ts`](../../packages/skill/skill-badge/src/index.ts), and [`packages/skill/tool-skill/src/index.ts`](../../packages/skill/tool-skill/src/index.ts). diff --git a/docs/subsystems/skills.zh.md b/docs/subsystems/skills.zh.md index 8a2b03da4b..f574db048e 100644 --- a/docs/subsystems/skills.zh.md +++ b/docs/subsystems/skills.zh.md @@ -2,7 +2,7 @@ [English](skills.md) | 中文 -[skill(技能)能力æ—�](../../packages/skill) 包å�« Service Definition([dsh-skill](../../packages/skill/skill),`ctx.skills`)ã€�本地 Service provider([dsh-skill-filesystem](../../packages/skill/skill-filesystem))ã€�å�¯é€‰çš„éš�包徽章æ��供方([dsh-skill-badge](../../packages/skill/skill-badge))和 Consumer([dsh-tool-skill](../../packages/skill/tool-skill))。注册表在其宿主层与å�„ scope 层之间å�ˆå¹¶å�„æ��供方的目录;æ��供方贡献本地或éš�包 skillï¼›Consumer 拥有åˆ�始目录和替æ�¢ç›®å½•,以å�Šé�¢å�‘模型的 `skill` 工具。skill 是å�¯é€‰çš„æŒ‡ä»¤è€Œé�žä¼šè¯�事件,因此其è¯�汇定义在此处而é�ž [core.md](core.md)。 +[skill(技能)能力æ—�](../../packages/skill) 包å�« Service Definition([dsh-skill](../../packages/skill/skill),`ctx.skills`)ã€�本地 Service Provider([dsh-skill-filesystem](../../packages/skill/skill-filesystem))ã€�å�¯é€‰çš„éš�包徽章æ��供方([dsh-skill-badge](../../packages/skill/skill-badge))和 Consumer([dsh-tool-skill](../../packages/skill/tool-skill))。注册表在其宿主层与å�„ scope 层之间å�ˆå¹¶å�„æ��供方的目录;æ��供方贡献本地或éš�包 skillï¼›Consumer 拥有åˆ�始目录和替æ�¢ç›®å½•,以å�Šé�¢å�‘模型的 `skill` 工具。skill 是å�¯é€‰çš„æŒ‡ä»¤è€Œé�žä¼šè¯�事件,因此其è¯�汇定义在此处而é�ž [core.md](core.md)。 æº�ç �:[`packages/skill/skill/src/index.ts`](../../packages/skill/skill/src/index.ts)ã€�[`packages/skill/skill-filesystem/src/index.ts`](../../packages/skill/skill-filesystem/src/index.ts)ã€�[`packages/skill/skill-badge/src/index.ts`](../../packages/skill/skill-badge/src/index.ts) 与 [`packages/skill/tool-skill/src/index.ts`](../../packages/skill/tool-skill/src/index.ts)。 diff --git a/docs/subsystems/spill.i18n.yaml b/docs/subsystems/spill.i18n.yaml index 100914ab62..61283ed82a 100644 --- a/docs/subsystems/spill.i18n.yaml +++ b/docs/subsystems/spill.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/spill.md -spill.md: 97d18ca2cf06c2062655eb6b22547280e4ee93e7 -spill.zh.md: 32783c748d6097359a7b71950f14ad97ebc924f5 +spill.md: ad59e88b1f059d0127bdf48155450890b1bf7c9a +spill.zh.md: 015ff6fc378c21e30f1cd84c985843f8c06cd44a diff --git a/docs/subsystems/spill.md b/docs/subsystems/spill.md index 97d18ca2cf..ad59e88b1f 100644 --- a/docs/subsystems/spill.md +++ b/docs/subsystems/spill.md @@ -2,7 +2,7 @@ English | [中文](spill.zh.md) -The spill storage seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-07-08-tool-output-spill-files.md) that persists a tool's oversized text and returns a model-facing locator plus retrieval guidance, split across packages: Service Definition ([dsh-spill](../../packages/spill/spill), `ctx.spillStore`), Service provider ([dsh-spill-local](../../packages/spill/spill-local), private session-scoped files on the host filesystem), and Consumer ([dsh-spill-policy](../../packages/spill/spill-policy), the `tools/post-execute` policy). Spill is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). Preview mechanics stay in [dsh-output-retention](../../packages/util/output-retention); this seam only saves the final text the policy hands it. +The spill storage seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-07-08-tool-output-spill-files.md) that persists a tool's oversized text and returns a model-facing locator plus retrieval guidance, split across packages: Service Definition ([dsh-spill](../../packages/spill/spill), `ctx.spillStore`), Service Provider ([dsh-spill-local](../../packages/spill/spill-local), private session-scoped files on the host filesystem), and Consumer ([dsh-spill-policy](../../packages/spill/spill-policy), the `tools/post-execute` policy). Spill is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). Preview mechanics stay in [dsh-output-retention](../../packages/util/output-retention); this seam only saves the final text the policy hands it. Source: [`packages/spill/spill/src/types.ts`](../../packages/spill/spill/src/types.ts) diff --git a/docs/subsystems/spill.zh.md b/docs/subsystems/spill.zh.md index 32783c748d..015ff6fc37 100644 --- a/docs/subsystems/spill.zh.md +++ b/docs/subsystems/spill.zh.md @@ -2,7 +2,7 @@ [English](spill.md) | 中文 -spill 存储 seam 是一项[能力 seam](../../.agents/notes/implemented/architecture/2026-07-08-tool-output-spill-files.md),它æŒ�ä¹…ä¿�存工具的超大文本,并返回é�¢å�‘模型的定ä½�符与检索指引;该能力拆分到三个包:Service Definition([dsh-spill](../../packages/spill/spill),`ctx.spillStore`)ã€�Service provider([dsh-spill-local](../../packages/spill/spill-local),宿主文件系统中会è¯�作用域的ç§�有文件)和 Consumer([dsh-spill-policy](../../packages/spill/spill-policy),`tools/post-execute` 策略)。spill 是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇记录在此处,而ä¸�在 [core.md](core.md) 中。预览机制ä»�å½’ [dsh-output-retention](../../packages/util/output-retention) 所有;该 seam å�ªä¿�存策略交给它的最终文本。 +spill 存储 seam 是一项[能力 seam](../../.agents/notes/implemented/architecture/2026-07-08-tool-output-spill-files.md),它æŒ�ä¹…ä¿�存工具的超大文本,并返回é�¢å�‘模型的定ä½�符与检索指引;该能力拆分到三个包:Service Definition([dsh-spill](../../packages/spill/spill),`ctx.spillStore`)ã€�Service Provider([dsh-spill-local](../../packages/spill/spill-local),宿主文件系统中会è¯�作用域的ç§�有文件)和 Consumer([dsh-spill-policy](../../packages/spill/spill-policy),`tools/post-execute` 策略)。spill 是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇记录在此处,而ä¸�在 [core.md](core.md) 中。预览机制ä»�å½’ [dsh-output-retention](../../packages/util/output-retention) 所有;该 seam å�ªä¿�存策略交给它的最终文本。 æº�ç �:[`packages/spill/spill/src/types.ts`](../../packages/spill/spill/src/types.ts) diff --git a/docs/subsystems/storage.i18n.yaml b/docs/subsystems/storage.i18n.yaml index fa120bc1fa..68128fdb1b 100644 --- a/docs/subsystems/storage.i18n.yaml +++ b/docs/subsystems/storage.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/storage.md -storage.md: 33933f70176e1f4960eb423f9a1067f50b6762e4 -storage.zh.md: 2ab3473a83b7588f186ce8f3b83819b29985ae88 +storage.md: 7e7f8d2b5a98b20308ae8115484a25066c045d52 +storage.zh.md: 41d2d1520a846d988c6c7a0b08a7576cee44ff7a diff --git a/docs/subsystems/storage.md b/docs/subsystems/storage.md index 33933f7017..7e7f8d2b5a 100644 --- a/docs/subsystems/storage.md +++ b/docs/subsystems/storage.md @@ -2,7 +2,7 @@ English | [中文](storage.zh.md) -The storage subsystem persists everything that is not a session event log (session logs have their own seam — [persistence.md](persistence.md)). It is one optional capability, not part of the agent-loop spine, split as a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md): the hub and Service Definition ([dsh-storage](../../packages/storage/storage), `ctx.storage`), the Service providers ([dsh-storage-json](../../packages/storage/storage-json), registered as `json`, and [dsh-storage-sqlite](../../packages/storage/storage-sqlite), registered as `sqlite`), and the Consumer data form ([dsh-storage-domain](../../packages/storage/storage-domain), `ctx.storageDomain`, also reachable as `ctx.storage.domain`) — the backend contract's only Consumer and the typed API everything else uses. The hub performs no IO itself: backends own media, data forms own semantics, and product packages never touch backends directly. Design record: [domain KV storage Agent Note](../../.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md). +The storage subsystem persists everything that is not a session event log (session logs have their own seam — [persistence.md](persistence.md)). It is one optional capability, not part of the agent-loop spine, split as a [capability seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md): the hub and Service Definition ([dsh-storage](../../packages/storage/storage), `ctx.storage`), the Service Providers ([dsh-storage-json](../../packages/storage/storage-json), registered as `json`, and [dsh-storage-sqlite](../../packages/storage/storage-sqlite), registered as `sqlite`), and the Consumer data form ([dsh-storage-domain](../../packages/storage/storage-domain), `ctx.storageDomain`, also reachable as `ctx.storage.domain`) — the backend contract's only Consumer and the typed API everything else uses. The hub performs no IO itself: backends own media, data forms own semantics, and product packages never touch backends directly. Design record: [domain KV storage Agent Note](../../.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md). Source: [`packages/storage/storage/src/backend.ts`](../../packages/storage/storage/src/backend.ts) · [`packages/storage/storage-domain/src/spec.ts`](../../packages/storage/storage-domain/src/spec.ts) · [`packages/storage/storage-domain/src/events.ts`](../../packages/storage/storage-domain/src/events.ts) diff --git a/docs/subsystems/storage.zh.md b/docs/subsystems/storage.zh.md index 2ab3473a83..41d2d1520a 100644 --- a/docs/subsystems/storage.zh.md +++ b/docs/subsystems/storage.zh.md @@ -2,7 +2,7 @@ [English](storage.md) | 中文 -存储å­�系统æŒ�ä¹…ä¿�存一切ä¸�属于会è¯�事件日志的数æ�®ï¼ˆä¼šè¯�日志有自己的 seam——è§� [persistence.md](persistence.md))。它是一项å�¯é€‰èƒ½åŠ›ï¼Œä¸�属于 agent loop(智能体循环)主干,并按[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) 拆分:枢纽(hub)与 Service Definition([dsh-storage](../../packages/storage/storage),`ctx.storage`)ã€�Service provider(注册为 `json` çš„ [dsh-storage-json](../../packages/storage/storage-json) 与注册为 `sqlite` çš„ [dsh-storage-sqlite](../../packages/storage/storage-sqlite)),以å�Š Consumer æ•°æ�®å½¢å¼�([dsh-storage-domain](../../packages/storage/storage-domain),`ctx.storageDomain`,也å�¯ç»� `ctx.storage.domain` 访问)——它是å�Žç«¯çº¦å®šçš„唯一 Consumer,也是其他一切所使用的类型化 API。枢纽自身ä¸�å�šä»»ä½• IO:å�Žç«¯æ‹¥æœ‰ä»‹è´¨ï¼Œæ•°æ�®å½¢å¼�拥有语义,产å“�包ç»�ä¸�直接触碰å�Žç«¯ã€‚设计记录:[领域 KV 存储 Agent Note](../../.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md)。 +存储å­�系统æŒ�ä¹…ä¿�存一切ä¸�属于会è¯�事件日志的数æ�®ï¼ˆä¼šè¯�日志有自己的 seam——è§� [persistence.md](persistence.md))。它是一项å�¯é€‰èƒ½åŠ›ï¼Œä¸�属于 agent loop(智能体循环)主干,并按[能力 seam](../../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md) 拆分:枢纽(hub)与 Service Definition([dsh-storage](../../packages/storage/storage),`ctx.storage`)ã€�Service Provider(注册为 `json` çš„ [dsh-storage-json](../../packages/storage/storage-json) 与注册为 `sqlite` çš„ [dsh-storage-sqlite](../../packages/storage/storage-sqlite)),以å�Š Consumer æ•°æ�®å½¢å¼�([dsh-storage-domain](../../packages/storage/storage-domain),`ctx.storageDomain`,也å�¯ç»� `ctx.storage.domain` 访问)——它是å�Žç«¯çº¦å®šçš„唯一 Consumer,也是其他一切所使用的类型化 API。枢纽自身ä¸�å�šä»»ä½• IO:å�Žç«¯æ‹¥æœ‰ä»‹è´¨ï¼Œæ•°æ�®å½¢å¼�拥有语义,产å“�包ç»�ä¸�直接触碰å�Žç«¯ã€‚设计记录:[领域 KV 存储 Agent Note](../../.agents/notes/proposed/architecture/2026-07-24-domain-kv-storage-and-workspace.md)。 æº�ç �:[`packages/storage/storage/src/backend.ts`](../../packages/storage/storage/src/backend.ts) · [`packages/storage/storage-domain/src/spec.ts`](../../packages/storage/storage-domain/src/spec.ts) · [`packages/storage/storage-domain/src/events.ts`](../../packages/storage/storage-domain/src/events.ts) diff --git a/docs/subsystems/subagent.i18n.yaml b/docs/subsystems/subagent.i18n.yaml index d0a1715e39..a86dc8de4a 100644 --- a/docs/subsystems/subagent.i18n.yaml +++ b/docs/subsystems/subagent.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/subagent.md -subagent.md: 4d02c177533e8dbc192d5460b65bb4348f565c41 -subagent.zh.md: 483446187dcd2386f0f3d7d50d3fa7b97d09e02c +subagent.md: a683a679e6017351540ee4b73adc74375ef0a1d6 +subagent.zh.md: 61391cd297c0eb14f4c0d8eac4539b551cb60bda diff --git a/docs/subsystems/subagent.md b/docs/subsystems/subagent.md index 4d02c17753..a683a679e6 100644 --- a/docs/subsystems/subagent.md +++ b/docs/subsystems/subagent.md @@ -4,7 +4,7 @@ English | [中文](subagent.zh.md) The subagent seam lets an agent delegate work to a child agent. Like [bash](shell.md), it is **one optional capability**, not part of the agent loop, so its types live here rather than in [core.md](core.md). It differs from the other capability seams because **multiple provider implementations coexist** in one context, registered by name (`ctx.subagents`), while bash allows only one executor. Its registry follows the [LLM adapter registry](llm-streaming.md), not the single-service bash executor. -Service Definition: [dsh-subagent](../../packages/subagent/subagent) (`ctx.subagents` + the vocabulary below). Service providers are sibling packages (`dsh-subagent-spawn-in-process`, `-fork`, `-acp`, `-codex`, `-claude-code`, `-dsh-sdk`); the model-facing Consumers are [dsh-tool-subagent](../../packages/subagent/tool-subagent) (per-provider delegation), [dsh-tool-subagent-control](../../packages/subagent/tool-subagent-control) (the optional global `send_message`, `interrupt_agent`, and `list_agents` controls), and [dsh-tool-subagent-report](../../packages/subagent/tool-subagent-report) (the optional child-scoped `report` return channel). The same `ctx.subagents` service owns continuable-child orchestration through an internal activation manager and read-only child and descendant discovery straight from the session store and optional session persistence. Product-provider rationale lives in [the Codex and Claude Code Agent Note](../../.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md); common-seam rationale lives in [the subagent Agent Note](../../.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md), [the continuable subagents Agent Note](../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md), [the report-tool Agent Note](../../.agents/notes/implemented/feature/2026-07-30-continuable-subagent-report-tool.md), [the durable catalog Agent Note](../../.agents/notes/implemented/feature/2026-07-22-durable-subagent-catalog-and-list-agents.md), [the list-identity-projection Agent Note](../../.agents/notes/implemented/architecture/2026-08-06-subagent-list-identity-projection.md), and [the merged-service Agent Note](../../.agents/notes/implemented/simplification/2026-07-26-merge-subagent-control-service.md). +Service Definition: [dsh-subagent](../../packages/subagent/subagent) (`ctx.subagents` + the vocabulary below). Service Providers are sibling packages (`dsh-subagent-spawn-in-process`, `-fork`, `-acp`, `-codex`, `-claude-code`, `-dsh-sdk`); the model-facing Consumers are [dsh-tool-subagent](../../packages/subagent/tool-subagent) (per-provider delegation), [dsh-tool-subagent-control](../../packages/subagent/tool-subagent-control) (the optional global `send_message`, `interrupt_agent`, and `list_agents` controls), and [dsh-tool-subagent-report](../../packages/subagent/tool-subagent-report) (the optional child-scoped `report` return channel). The same `ctx.subagents` service owns continuable-child orchestration through an internal activation manager and read-only child and descendant discovery straight from the session store and optional session persistence. Product-provider rationale lives in [the Codex and Claude Code Agent Note](../../.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md); common-seam rationale lives in [the subagent Agent Note](../../.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md), [the continuable subagents Agent Note](../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md), [the report-tool Agent Note](../../.agents/notes/implemented/feature/2026-07-30-continuable-subagent-report-tool.md), [the durable catalog Agent Note](../../.agents/notes/implemented/feature/2026-07-22-durable-subagent-catalog-and-list-agents.md), [the list-identity-projection Agent Note](../../.agents/notes/implemented/architecture/2026-08-06-subagent-list-identity-projection.md), and [the merged-service Agent Note](../../.agents/notes/implemented/simplification/2026-07-26-merge-subagent-control-service.md). Sources: [`packages/subagent/subagent/src/types.ts`](../../packages/subagent/subagent/src/types.ts), [`packages/subagent/subagent/src/index.ts`](../../packages/subagent/subagent/src/index.ts), and [`packages/subagent/subagent/src/continuation.ts`](../../packages/subagent/subagent/src/continuation.ts) diff --git a/docs/subsystems/subagent.zh.md b/docs/subsystems/subagent.zh.md index 483446187d..61391cd297 100644 --- a/docs/subsystems/subagent.zh.md +++ b/docs/subsystems/subagent.zh.md @@ -4,7 +4,7 @@ subagent seam 让一个 agent(智能体)将工作委派给å­� agent。与 [bash](shell.md) 一样,它是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环),因此其类型定义在此而é�ž [core.md](core.md) 中。它ä¸�å�ŒäºŽå…¶ä»–能力 seam,因为**å�Œä¸€ä¸Šä¸‹æ–‡ä¸­å�¯å…±å­˜å¤šä¸ªæ��供方实现**,并按å��称注册(`ctx.subagents`),而 bash å�ªå…�许一个执行器。该注册表é�µå¾ª [LLM(大语言模型)适é…�器注册表](llm-streaming.md),而é�žå�•æœ�务的 bash 执行器。 -Service Definition:[dsh-subagent](../../packages/subagent/subagent)(`ctx.subagents` + 下文è¯�汇)。Service provider 是六个兄弟包:`dsh-subagent-spawn-in-process`ã€�`-fork`ã€�`-acp`ã€�`-codex`ã€�`-claude-code`ã€�`-dsh-sdk`ï¼›é�¢å�‘模型的 Consumer 包括 [dsh-tool-subagent](../../packages/subagent/tool-subagent)(按æ��供方委派)ã€�[dsh-tool-subagent-control](../../packages/subagent/tool-subagent-control)(å�¯é€‰çš„全局 `send_message`ã€�`interrupt_agent` 与 `list_agents` 控制工具)和 [dsh-tool-subagent-report](../../packages/subagent/tool-subagent-report)(å�¯é€‰çš„ child 作用域 `report` 返回通é�“)。å�Œä¸€ä¸ª `ctx.subagents` æœ�务通过内部激活管ç�†å™¨è´Ÿè´£å�¯ç»§ç»­å­� agent 编排,并直接基于会è¯�存储和å�¯é€‰çš„会è¯�æŒ�久化æ��ä¾›å�ªè¯»çš„ child 与å�Žä»£å�‘现。产å“�æ��供方设计ç�†ç”±è§� [Codex 与 Claude Code Agent Note](../../.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md);通用 seam 的设计ç�†ç”±è§� [subagent Agent Note](../../.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md)ã€�[å�¯ç»§ç»­ subagent Agent Note](../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md)ã€�[report 工具 Agent Note](../../.agents/notes/implemented/feature/2026-07-30-continuable-subagent-report-tool.md)ã€�[æŒ�久化目录 Agent Note](../../.agents/notes/implemented/feature/2026-07-22-durable-subagent-catalog-and-list-agents.md)ã€�[列表身份投影 Agent Note](../../.agents/notes/implemented/architecture/2026-08-06-subagent-list-identity-projection.md)å’Œ[æœ�务å�ˆå¹¶ Agent Note](../../.agents/notes/implemented/simplification/2026-07-26-merge-subagent-control-service.md)。 +Service Definition:[dsh-subagent](../../packages/subagent/subagent)(`ctx.subagents` + 下文è¯�汇)。Service Provider 是六个兄弟包:`dsh-subagent-spawn-in-process`ã€�`-fork`ã€�`-acp`ã€�`-codex`ã€�`-claude-code`ã€�`-dsh-sdk`ï¼›é�¢å�‘模型的 Consumer 包括 [dsh-tool-subagent](../../packages/subagent/tool-subagent)(按æ��供方委派)ã€�[dsh-tool-subagent-control](../../packages/subagent/tool-subagent-control)(å�¯é€‰çš„全局 `send_message`ã€�`interrupt_agent` 与 `list_agents` 控制工具)和 [dsh-tool-subagent-report](../../packages/subagent/tool-subagent-report)(å�¯é€‰çš„ child 作用域 `report` 返回通é�“)。å�Œä¸€ä¸ª `ctx.subagents` æœ�务通过内部激活管ç�†å™¨è´Ÿè´£å�¯ç»§ç»­å­� agent 编排,并直接基于会è¯�存储和å�¯é€‰çš„会è¯�æŒ�久化æ��ä¾›å�ªè¯»çš„ child 与å�Žä»£å�‘现。产å“�æ��供方设计ç�†ç”±è§� [Codex 与 Claude Code Agent Note](../../.agents/notes/implemented/feature/2026-08-04-claude-code-and-codex-subagent-backends.md);通用 seam 的设计ç�†ç”±è§� [subagent Agent Note](../../.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.md)ã€�[å�¯ç»§ç»­ subagent Agent Note](../../.agents/notes/implemented/feature/2026-07-28-continuable-subagent-conversations.md)ã€�[report 工具 Agent Note](../../.agents/notes/implemented/feature/2026-07-30-continuable-subagent-report-tool.md)ã€�[æŒ�久化目录 Agent Note](../../.agents/notes/implemented/feature/2026-07-22-durable-subagent-catalog-and-list-agents.md)ã€�[列表身份投影 Agent Note](../../.agents/notes/implemented/architecture/2026-08-06-subagent-list-identity-projection.md)å’Œ[æœ�务å�ˆå¹¶ Agent Note](../../.agents/notes/implemented/simplification/2026-07-26-merge-subagent-control-service.md)。 æº�ç �:[`packages/subagent/subagent/src/types.ts`](../../packages/subagent/subagent/src/types.ts)ã€�[`packages/subagent/subagent/src/index.ts`](../../packages/subagent/subagent/src/index.ts)å’Œ [`packages/subagent/subagent/src/continuation.ts`](../../packages/subagent/subagent/src/continuation.ts) diff --git a/docs/subsystems/subprocess.i18n.yaml b/docs/subsystems/subprocess.i18n.yaml index 191ea52af5..d063134567 100644 --- a/docs/subsystems/subprocess.i18n.yaml +++ b/docs/subsystems/subprocess.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/subprocess.md -subprocess.md: 3cc6e33ce2befc6bc65e258507881df542b7c149 -subprocess.zh.md: 1189ceb0526418ee92e0da280e118c10991508d5 +subprocess.md: af6770e8c04f79ab1981967d5a3bca5a39b954be +subprocess.zh.md: 19f20e7fcd675d87cf768258d1ab9c37bf80a836 diff --git a/docs/subsystems/subprocess.md b/docs/subsystems/subprocess.md index 3cc6e33ce2..af6770e8c0 100644 --- a/docs/subsystems/subprocess.md +++ b/docs/subsystems/subprocess.md @@ -2,7 +2,7 @@ English | [中文](subprocess.zh.md) -The subprocess seam is split across a Service Definition ([dsh-subprocess](../../packages/subprocess/subprocess), `ctx.subprocess`) and Service provider ([dsh-subprocess-local](../../packages/subprocess/subprocess-local)); its Consumers are other capability seams and out-of-process backends: the [bash executor family](shell.md) uses collected batch output, LSP uses raw protocol pipes, the PTY backend uses the terminal primitive, and the ACP subagent backend uses piped ndjson plus inherited stderr. This seam owns the managed `DSH_*` environment namespace, the shared credential scrub (`scrubbedParentEnv`), and the `CollectedOutput` shape; [dsh-shell](../../packages/shell/shell) re-exports the vocabulary so bash consumers keep one import root. +The subprocess seam is split across a Service Definition ([dsh-subprocess](../../packages/subprocess/subprocess), `ctx.subprocess`) and Service Provider ([dsh-subprocess-local](../../packages/subprocess/subprocess-local)); its Consumers are other capability seams and out-of-process backends: the [bash executor family](shell.md) uses collected batch output, LSP uses raw protocol pipes, the PTY backend uses the terminal primitive, and the ACP subagent backend uses piped ndjson plus inherited stderr. This seam owns the managed `DSH_*` environment namespace, the shared credential scrub (`scrubbedParentEnv`), and the `CollectedOutput` shape; [dsh-shell](../../packages/shell/shell) re-exports the vocabulary so bash consumers keep one import root. Source: [`packages/subprocess/subprocess/src/types.ts`](../../packages/subprocess/subprocess/src/types.ts) and [`packages/subprocess/subprocess/src/index.ts`](../../packages/subprocess/subprocess/src/index.ts) diff --git a/docs/subsystems/subprocess.zh.md b/docs/subsystems/subprocess.zh.md index 1189ceb052..19f20e7fcd 100644 --- a/docs/subsystems/subprocess.zh.md +++ b/docs/subsystems/subprocess.zh.md @@ -2,7 +2,7 @@ [English](subprocess.md) | 中文 -å­�进程 seam 分为 Service Definition([dsh-subprocess](../../packages/subprocess/subprocess),`ctx.subprocess`)与 Service provider([dsh-subprocess-local](../../packages/subprocess/subprocess-local));它的 Consumer 是其他能力 seam 与进程外å�Žç«¯ï¼š[bash 执行器家æ—�](shell.md)使用收集模å¼�的批é‡�输出,LSP 使用原始å��议管é�“,PTY å�Žç«¯ä½¿ç”¨ç»ˆç«¯åŽŸè¯­ï¼ŒACP(Agent Client Protocol)subagent å�Žç«¯åˆ™ä½¿ç”¨é€šè¿‡ç®¡é�“传输的 ndjson,并让 stderr 采用 inherit。该 seam 拥有å�—管的 `DSH_*` 环境命å��空间ã€�共享的凭æ�®æ¸…除(`scrubbedParentEnv`)与 `CollectedOutput` 形状;[dsh-shell](../../packages/shell/shell) é‡�导出这套è¯�汇,使 bash 消费方ä¿�æŒ�å�•一导入入å�£ã€‚ +å­�进程 seam 分为 Service Definition([dsh-subprocess](../../packages/subprocess/subprocess),`ctx.subprocess`)与 Service Provider([dsh-subprocess-local](../../packages/subprocess/subprocess-local));它的 Consumer 是其他能力 seam 与进程外å�Žç«¯ï¼š[bash 执行器家æ—�](shell.md)使用收集模å¼�的批é‡�输出,LSP 使用原始å��议管é�“,PTY å�Žç«¯ä½¿ç”¨ç»ˆç«¯åŽŸè¯­ï¼ŒACP(Agent Client Protocol)subagent å�Žç«¯åˆ™ä½¿ç”¨é€šè¿‡ç®¡é�“传输的 ndjson,并让 stderr 采用 inherit。该 seam 拥有å�—管的 `DSH_*` 环境命å��空间ã€�共享的凭æ�®æ¸…除(`scrubbedParentEnv`)与 `CollectedOutput` 形状;[dsh-shell](../../packages/shell/shell) é‡�导出这套è¯�汇,使 bash 消费方ä¿�æŒ�å�•一导入入å�£ã€‚ æº�ç �:[`packages/subprocess/subprocess/src/types.ts`](../../packages/subprocess/subprocess/src/types.ts) 与 [`packages/subprocess/subprocess/src/index.ts`](../../packages/subprocess/subprocess/src/index.ts) diff --git a/docs/subsystems/system-prompt.i18n.yaml b/docs/subsystems/system-prompt.i18n.yaml index 3ac169b4e0..0b69a5ca8c 100644 --- a/docs/subsystems/system-prompt.i18n.yaml +++ b/docs/subsystems/system-prompt.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/system-prompt.md -system-prompt.md: f03d11866bcdcf3bcb5c5fe96931b059cb8d0336 -system-prompt.zh.md: 23b3e0b20cc4772baf22727d2e57866aa7cbbeb0 +system-prompt.md: 8a6006d0b96552b52d0b050c304a11a95add8d9e +system-prompt.zh.md: 02be9eed795d3a6c8e43403048f135d493b6509d diff --git a/docs/subsystems/system-prompt.md b/docs/subsystems/system-prompt.md index f03d11866b..8a6006d0b9 100644 --- a/docs/subsystems/system-prompt.md +++ b/docs/subsystems/system-prompt.md @@ -117,6 +117,14 @@ section(section: PromptSection): () => void */ context(context: PromptContext): () => void +/** + * Suppress every dynamic runtime-context contribution in the calling + * context's scope without changing the services that own or enforce those + * facts. Multiple suppressors remain independently disposable. + * @returns the exact Cordis effect disposer. + */ +suppressRuntimeContext(): () => void + /** * Register a tool-schema provider in the calling context's scope. Global and * matching scoped providers both contribute; returning the reserved @@ -148,7 +156,7 @@ variable(name: string, provider: (context: AssembleContext) => string | undefine async assemble(context: AssembleContext = {}): Promise ``` -Source: [`packages/core/system-prompt/src/index.ts:334`](../../packages/core/system-prompt/src/index.ts) +Source: [`packages/core/system-prompt/src/index.ts:338`](../../packages/core/system-prompt/src/index.ts) diff --git a/docs/subsystems/system-prompt.zh.md b/docs/subsystems/system-prompt.zh.md index 23b3e0b20c..02be9eed79 100644 --- a/docs/subsystems/system-prompt.zh.md +++ b/docs/subsystems/system-prompt.zh.md @@ -117,6 +117,14 @@ section(section: PromptSection): () => void */ context(context: PromptContext): () => void +/** + * Suppress every dynamic runtime-context contribution in the calling + * context's scope without changing the services that own or enforce those + * facts. Multiple suppressors remain independently disposable. + * @returns the exact Cordis effect disposer. + */ +suppressRuntimeContext(): () => void + /** * Register a tool-schema provider in the calling context's scope. Global and * matching scoped providers both contribute; returning the reserved @@ -148,7 +156,7 @@ variable(name: string, provider: (context: AssembleContext) => string | undefine async assemble(context: AssembleContext = {}): Promise ``` -Source: [`packages/core/system-prompt/src/index.ts:334`](../../packages/core/system-prompt/src/index.ts) +Source: [`packages/core/system-prompt/src/index.ts:338`](../../packages/core/system-prompt/src/index.ts) diff --git a/docs/subsystems/web.i18n.yaml b/docs/subsystems/web.i18n.yaml index 3dfe626acd..840865ef35 100644 --- a/docs/subsystems/web.i18n.yaml +++ b/docs/subsystems/web.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/web.md -web.md: 741df8d92c20817cb3115dafffba7c7be9205aec -web.zh.md: 0cce8500834896c156ff85d935b9e80853a3196c +web.md: 3bcd3ac24927c8c51baeabd770e2bd91c5ad1b77 +web.zh.md: 3348be2b808dc286364f5a795b236cb299acd6a6 diff --git a/docs/subsystems/web.md b/docs/subsystems/web.md index 741df8d92c..3bcd3ac249 100644 --- a/docs/subsystems/web.md +++ b/docs/subsystems/web.md @@ -2,7 +2,7 @@ English | [中文](web.zh.md) -The web access seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md) that spans **two operations** (search and fetch) on one `ctx.web` service, split across packages: Service Definition ([dsh-web](../../packages/web/web), `ctx.web` + the provider registries), Service providers ([dsh-web-search-exa](../../packages/web/web-search-exa), [dsh-web-search-perplexity](../../packages/web/web-search-perplexity), [dsh-web-search-deepseek](../../packages/web/web-search-deepseek), [dsh-web-fetch-http](../../packages/web/web-fetch-http)), and Consumer ([dsh-tool-web](../../packages/web/tool-web), the `web_search`/`web_fetch` tool schemas). Web is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A search-provider swap does not change how the model asks for a query, and a fetch-provider swap does not change how the model asks for a URL. +The web access seam — a [capability seam](../../.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md) that spans **two operations** (search and fetch) on one `ctx.web` service, split across packages: Service Definition ([dsh-web](../../packages/web/web), `ctx.web` + the provider registries), Service Providers ([dsh-web-search-exa](../../packages/web/web-search-exa), [dsh-web-search-perplexity](../../packages/web/web-search-perplexity), [dsh-web-search-deepseek](../../packages/web/web-search-deepseek), [dsh-web-fetch-http](../../packages/web/web-fetch-http)), and Consumer ([dsh-tool-web](../../packages/web/tool-web), the `web_search`/`web_fetch` tool schemas). Web is **one optional capability**, not part of the agent-loop spine — so its vocabulary lives here, not in [core.md](core.md). A search-provider swap does not change how the model asks for a query, and a fetch-provider swap does not change how the model asks for a URL. Source: [`packages/web/web/src/types.ts`](../../packages/web/web/src/types.ts) diff --git a/docs/subsystems/web.zh.md b/docs/subsystems/web.zh.md index 0cce850083..3348be2b80 100644 --- a/docs/subsystems/web.zh.md +++ b/docs/subsystems/web.zh.md @@ -2,7 +2,7 @@ [English](web.md) | 中文 -Web 访问 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md),在å�Œä¸€ä¸ª `ctx.web` æœ�务上横跨**两项æ“�作**(search 与 fetch),并拆分到多个包:Service Definition([dsh-web](../../packages/web/web),`ctx.web` + æ��供方注册表)ã€�Service provider([dsh-web-search-exa](../../packages/web/web-search-exa)ã€�[dsh-web-search-perplexity](../../packages/web/web-search-perplexity)ã€�[dsh-web-search-deepseek](../../packages/web/web-search-deepseek)ã€�[dsh-web-fetch-http](../../packages/web/web-fetch-http))与 Consumer([dsh-tool-web](../../packages/web/tool-web),å�³ `web_search`/`web_fetch` 工具 schema)。Web 是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇定义在此而é�ž [core.md](core.md) 中。更æ�¢ search æ��供方ä¸�会改å�˜æ¨¡åž‹æ��交查询的方å¼�,更æ�¢ fetch æ��供方也ä¸�会改å�˜æ¨¡åž‹è¯·æ±‚ URL 的方å¼�。 +Web 访问 seam 是一个[能力 seam](../../.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md),在å�Œä¸€ä¸ª `ctx.web` æœ�务上横跨**两项æ“�作**(search 与 fetch),并拆分到多个包:Service Definition([dsh-web](../../packages/web/web),`ctx.web` + æ��供方注册表)ã€�Service Provider([dsh-web-search-exa](../../packages/web/web-search-exa)ã€�[dsh-web-search-perplexity](../../packages/web/web-search-perplexity)ã€�[dsh-web-search-deepseek](../../packages/web/web-search-deepseek)ã€�[dsh-web-fetch-http](../../packages/web/web-fetch-http))与 Consumer([dsh-tool-web](../../packages/web/tool-web),å�³ `web_search`/`web_fetch` 工具 schema)。Web 是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop(智能体循环)主干,因此其è¯�汇定义在此而é�ž [core.md](core.md) 中。更æ�¢ search æ��供方ä¸�会改å�˜æ¨¡åž‹æ��交查询的方å¼�,更æ�¢ fetch æ��供方也ä¸�会改å�˜æ¨¡åž‹è¯·æ±‚ URL 的方å¼�。 æº�ç �:[`packages/web/web/src/types.ts`](../../packages/web/web/src/types.ts) diff --git a/docs/subsystems/workflow.i18n.yaml b/docs/subsystems/workflow.i18n.yaml index 8f9d56e57e..2237e355a1 100644 --- a/docs/subsystems/workflow.i18n.yaml +++ b/docs/subsystems/workflow.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/subsystems/workflow.md -workflow.md: bf11ec3a40f9c964fbc535a0368b30e422b5452e -workflow.zh.md: b87bffd4780d167b4106276bfbca53e48ef6d833 +workflow.md: f2c987fbc2ca3a334c55bf0b299764e2b3e6bb06 +workflow.zh.md: b4e6e6afe73b20f1da39c1548c072cf7aeb1f441 diff --git a/docs/subsystems/workflow.md b/docs/subsystems/workflow.md index bf11ec3a40..f2c987fbc2 100644 --- a/docs/subsystems/workflow.md +++ b/docs/subsystems/workflow.md @@ -4,7 +4,7 @@ English | [中文](workflow.zh.md) The workflow seam lets an agent run a model-written orchestration SCRIPT that starts subagents. Like [subagent](subagent.md) it is **one optional capability**, not part of the agent loop, so its types and operations live here rather than in [core.md](core.md). Like bash, it permits ONE engine implementation per context to provide `ctx.workflowEngine`; there is no named-provider registry (a second engine replaces the first through plugin configuration rather than running beside it). -Service Definition: [dsh-workflow](../../packages/workflow/workflow) (`ctx.workflowEngine` + the vocabulary below). The Service provider is [dsh-workflow-worker-thread](../../packages/workflow/workflow-worker-thread) (a `node:worker_threads` engine — one worker per run, the script's vm context inside it); the model-facing Consumer is [dsh-tool-workflow](../../packages/workflow/tool-workflow). The proposal and rationale: [the dynamic-workflows Agent Note](../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md). +Service Definition: [dsh-workflow](../../packages/workflow/workflow) (`ctx.workflowEngine` + the vocabulary below). The Service Provider is [dsh-workflow-worker-thread](../../packages/workflow/workflow-worker-thread) (a `node:worker_threads` engine — one worker per run, the script's vm context inside it); the model-facing Consumer is [dsh-tool-workflow](../../packages/workflow/tool-workflow). The proposal and rationale: [the dynamic-workflows Agent Note](../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md). Sources: browser-safe vocabulary in [`packages/workflow/workflow/src/types.ts`](../../packages/workflow/workflow/src/types.ts), Host request and live-run handles in [`runtime-types.ts`](../../packages/workflow/workflow/src/runtime-types.ts). diff --git a/docs/subsystems/workflow.zh.md b/docs/subsystems/workflow.zh.md index b87bffd478..b4e6e6afe7 100644 --- a/docs/subsystems/workflow.zh.md +++ b/docs/subsystems/workflow.zh.md @@ -4,7 +4,7 @@ 工作æµ� seam å…�许 agent(智能体)è¿�行由模型编写ã€�会å�¯åЍ subagent 的编排脚本。与 [subagent](subagent.md) 一样,它是**一项å�¯é€‰èƒ½åŠ›**,ä¸�属于 agent loop,因此其类型和æ“�作记录在此处,而é�ž [core.md](core.md)。与 bash 一样,æ¯�个上下文å�ªå…�许一个引擎实现æ��ä¾› `ctx.workflowEngine`;没有命å��æ��供方注册表(第二个引擎通过æ�’ä»¶é…�置替æ�¢ç¬¬ä¸€ä¸ªï¼Œè€Œä¸�与它å�Œæ—¶è¿�行)。 -Service Definition:[dsh-workflow](../../packages/workflow/workflow)(`ctx.workflowEngine` + 下文è¯�汇)。Service provider 是 [dsh-workflow-worker-thread](../../packages/workflow/workflow-worker-thread)(一个 `node:worker_threads` 引擎——æ¯�个 run 一个 worker,脚本的 vm 上下文ä½�于其中);é�¢å�‘模型的 Consumer 是 [dsh-tool-workflow](../../packages/workflow/tool-workflow)。æ��案与设计ç�†ç”±è§� [dynamic-workflows Agent Note](../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md)。 +Service Definition:[dsh-workflow](../../packages/workflow/workflow)(`ctx.workflowEngine` + 下文è¯�汇)。Service Provider 是 [dsh-workflow-worker-thread](../../packages/workflow/workflow-worker-thread)(一个 `node:worker_threads` 引擎——æ¯�个 run 一个 worker,脚本的 vm 上下文ä½�于其中);é�¢å�‘模型的 Consumer 是 [dsh-tool-workflow](../../packages/workflow/tool-workflow)。æ��案与设计ç�†ç”±è§� [dynamic-workflows Agent Note](../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md)。 æº�ç �:æµ�览器安全è¯�汇ä½�于 [`packages/workflow/workflow/src/types.ts`](../../packages/workflow/workflow/src/types.ts),Host 请求与活跃è¿�行å�¥æŸ„ä½�于 [`runtime-types.ts`](../../packages/workflow/workflow/src/runtime-types.ts)。 diff --git a/docs/tool-catalog.i18n.yaml b/docs/tool-catalog.i18n.yaml index 9cbc5707a4..3ed16072ca 100644 --- a/docs/tool-catalog.i18n.yaml +++ b/docs/tool-catalog.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/tool-catalog.md -tool-catalog.md: ea89508500ec6e73e6e56c4e5d0ac2c35897b342 -tool-catalog.zh.md: 076cc63151e3b9ee8b3828ded65df9ebf09c9430 +tool-catalog.md: 50563c97c6cd5496871ea7fa52c4823a56b088fd +tool-catalog.zh.md: ed0c7e3f70cffbecd3d20a1556bcb0cd4204df00 diff --git a/docs/tool-catalog.md b/docs/tool-catalog.md index ea89508500..50563c97c6 100644 --- a/docs/tool-catalog.md +++ b/docs/tool-catalog.md @@ -40,6 +40,8 @@ This table connects model-visible tool names to the plugin package and service s | `@deepseek-ai/dsh-tool-workflow` | `workflow` | `ctx.tools`, `ctx.workflowEngine`, `ctx.systemPrompt`, `a calling Agent (exec.agent parents the script children)` | `tool/call`, `tool/result` | - | - | | `@deepseek-ai/dsh-tool-web` | `web_fetch`, `web_search` | `ctx.tools`, `ctx.web`, `ctx.systemPrompt` | `tool/call`, `tool/result` | - | web_search and web_fetch keep provider selection behind ctx.web so model-visible schemas stay stable across backend swaps. | + + ## `@deepseek-ai/dsh-tool-ask-user` ### `ask_user_question` @@ -112,11 +114,13 @@ Source: [`packages/interaction/tool-ask-user/src/index.ts`](../packages/interact ask_user_question pauses the tool call until the active UI provider returns a human answer. + + ## `@deepseek-ai/dsh-tools` ### `run_code` -Execute a TypeScript program against the available tools. Write the BODY of an async function (erasable syntax only; top-level `await` and `return` work) and call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it. +Execute a TypeScript program against the available tools. Takes two required arguments: `code`, the BODY of an async function (erasable syntax only; top-level `await` and `return` work), and `description`, a short summary of what the program does. Call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it. ```json { @@ -142,6 +146,8 @@ Source: [`packages/core/tools/src/code-mode.ts`](../packages/core/tools/src/code Owned by the tool registry as a reserved transport outside filterable capability layers under `mode: code` / `mode: both` (see the Code Mode Agent Note). Under `code` it is the registry's only wire contribution; the other visible capabilities are declared in a generated SDK section in the loaded runtime's language, and a program calls them through bindings scheduled under the native concurrency contract (submission-ordered starts and policy; concurrency-safe bodies overlap up to `maxParallelSubCalls`) that re-enter the complete guarded tool pipeline and link each nested execution to this outer result. + + ## `@deepseek-ai/dsh-plan-mode` ### `exit_plan_mode` @@ -167,6 +173,8 @@ Source: [`packages/plan/plan-mode/src/index.ts`](../packages/plan/plan-mode/src/ exit_plan_mode stays in the model-facing schema while planning is inactive so transitions add no tool-catalog churn on top of the plan-policy change. Its execute path rejects calls outside plan mode; in plan mode it presents the plan over the user-questions seam (approve / keep planning with feedback), and approval logs plan mode inactive at the step boundary. + + ## `@deepseek-ai/dsh-tool-bash` ### `bash` @@ -209,6 +217,8 @@ Source: [`packages/shell/tool-bash/src/index.ts`](../packages/shell/tool-bash/sr The bash tool is the model-facing consumer of the bash executor seam. A `run_in_background` run registers with the generic `ctx.jobs` runtime and is collected/stopped through the `job_*` tools from `@deepseek-ai/dsh-tool-jobs`; the `enableRunInBackground` config (default true) removes the parameter entirely when disabled. + + ## `@deepseek-ai/dsh-tool-pwsh` ### `pwsh` @@ -251,6 +261,8 @@ Source: [`packages/shell/tool-pwsh/src/index.ts`](../packages/shell/tool-pwsh/sr The pwsh tool is the PowerShell-dialect consumer of the bash executor seam for Windows compositions (a PowerShell executor such as `@deepseek-ai/dsh-pwsh-local` backs `ctx.shell`); it mirrors the bash tool call-for-call minus sandbox controls — `run_in_background` runs register with the generic `ctx.jobs` runtime and are collected/stopped through the `job_*` tools, and the managed `DSH_*` environment comes from `@deepseek-ai/dsh-shell-env`. Each call runs in a fresh process (no persistent PTY session), with native `C:\...` paths and `$env:NAME` variables. + + ## `@deepseek-ai/dsh-tool-cordis` ### `cordis_define` @@ -487,6 +499,8 @@ Source: [`packages/extensions/tool-cordis/src/index.ts`](../packages/extensions/ Not in any shipped tree (a deliberate opt-in — dynamic package code reaches the real runtime, see .agents/notes/implemented/feature/2026-07-08-self-referential-cordis-toolset.md). The toolset injects `ctx.dynamicCordisRunner` from `@deepseek-ai/dsh-cordis-host-runner`, which owns the definition registry and the vm sandbox; a composition missing it never activates the tools. A running package may register ADDITIONAL model-visible tools until it is stopped, undefined, or DSH restarts; a full changed request header logs those tool-set changes. + + ## `@deepseek-ai/dsh-tool-bash-persistent` ### `bash` @@ -512,6 +526,8 @@ Source: [`packages/shell/tool-bash-persistent/src/index.ts`](../packages/shell/t One owner-isolated persistent bash tool; deployment composition supplies the PTY backend and may override the model-facing environment description. + + ## `@deepseek-ai/dsh-tool-str-replace-editor` ### `str_replace_editor` @@ -580,6 +596,8 @@ Source: [`packages/fs/tool-str-replace-editor/src/index.ts`](../packages/fs/tool Standalone view/create/unique literal replace/line insert tool over the filesystem seam; it composes with any shell or terminal API. + + ## `@deepseek-ai/dsh-tool-fs` ### `edit` @@ -695,6 +713,8 @@ Source: [`packages/fs/tool-fs/src/index.ts`](../packages/fs/tool-fs/src/index.ts The read-before-write/edit policy is added by `@deepseek-ai/dsh-fs-observation-policy` (an `fs/*` event-gate plugin, no schema change); a deployment that loads these tools is expected to also load it. `read_image` is not registered without `ctx.attachments`; its schema is route-independent, and execution refuses unless the exact routed model declares image input. + + ## `@deepseek-ai/dsh-tool-fs-search` ### `glob` @@ -753,6 +773,8 @@ Source: [`packages/fs/tool-fs-search/src/index.ts`](../packages/fs/tool-fs-searc glob and grep are unconditional discovery tools that spawn the packaged ripgrep binary (`@vscode/ripgrep`) through ctx.subprocess as ordinary foreground calls (never background jobs) — no host `rg` install and no shell layer. The catalog uses `sampleOverCapGlobResults: true`; deployments must choose that behavior explicitly. Capped results save the complete formatted list through the optional ctx.spillStore backend; returned locators are follow-up-readable/searchable when the backend exposes local paths in co-located deployments. + + ## `@deepseek-ai/dsh-tool-terminal` ### `terminal_close` @@ -916,6 +938,8 @@ Source: [`packages/terminal/tool-terminal/src/index.ts`](../packages/terminal/to The six terminal tools are opt-in and complement one-shot shell/filesystem tools. `terminal_send(run_in_background: true)` registers with `ctx.jobs`; TUI, named key sequences, BEL, resize, auto-start, and cross-agent sharing are absent from the schema. + + ## `@deepseek-ai/dsh-tool-goal` ### `create_goal` @@ -1008,6 +1032,8 @@ Source: [`packages/goal/tool-goal/src/index.ts`](../packages/goal/tool-goal/src/ create, edit, pause, and resume require direct-human root authority; complete and blocked also accept the exact current goal round. The default blocked lower bound is three admitted rounds. + + ## `@deepseek-ai/dsh-schedule` ### `schedule_create` @@ -1103,6 +1129,8 @@ Source: [`packages/schedule/schedule/src/tools.ts`](../packages/schedule/schedul Registered only inside live root Agent scopes created after the opt-in Schedule plugin loads. Version 1 accepts after_seconds, explicit absolute at, and bounded fixed-rate every_seconds, and discloses session-local delivery; management reads and mutations require the shared Session persistence barrier. + + ## `@deepseek-ai/dsh-tool-lsp` ### `lsp` @@ -1149,6 +1177,8 @@ Source: [`packages/lsp/tool-lsp/src/index.ts`](../packages/lsp/tool-lsp/src/inde The lsp tool keeps provider selection and language-server subprocesses behind ctx.lsp, so its model-visible schema stays stable across providers. Requires a registered provider (e.g. `@deepseek-ai/dsh-lsp-stdio`) at runtime; without one, a query returns the structured `LSP_UNAVAILABLE` error rather than changing the schema. + + ## `@deepseek-ai/dsh-tool-ralph` ### `ralph` @@ -1178,6 +1208,8 @@ Source: [`packages/workflow/tool-ralph/src/index.ts`](../packages/workflow/tool- A fixed foreground workflow starts one fresh structured child per round; the model selects only the immutable objective and an optional round cap. + + ## `@deepseek-ai/dsh-tool-skill` ### `skill` @@ -1201,6 +1233,8 @@ Load the full instructions for an available skill. Call this with the exact skil Source: [`packages/skill/tool-skill/src/index.ts`](../packages/skill/tool-skill/src/index.ts) + + ## `@deepseek-ai/dsh-tool-session-query` ### `session_event_read` @@ -1434,6 +1468,8 @@ Source: [`packages/session-query/tool-session-query/src/index.ts`](../packages/s The five read-only tools hide provider cursors and authorize every result from the immutable calling agent session. The package is opt-in; compositions that need enforced deadlines or bounded inline output also mount the generic timeout or spill policies. + + ## `@deepseek-ai/dsh-tool-subagent` ### `subagent` @@ -1468,6 +1504,8 @@ Source: [`packages/subagent/tool-subagent/src/index.ts`](../packages/subagent/to The registered tool name is the load-time `toolName` config (default `subagent`); the schema above is that default. The shipped compositions load this package once per subagent backend, so the model additionally sees `subagent_fork` bound to the fork backend. Each instance's description, `run_in_background` parameter, and system-prompt policy follow its own `backgroundMode` and `enableRunInBackground`, so the two shipped schemas are not identical: `subagent` is `continuable` and defaults omitted calls to background with automatic settlement delivery, while `subagent_fork` stays `one-shot` and defaults them to foreground — see `packages/bundle/base/cordis.patch.yml` and `examples/acp-agent/cordis.yml`. + + ## `@deepseek-ai/dsh-tool-subagent-control` ### `interrupt_agent` @@ -1541,6 +1579,8 @@ Source: [`packages/subagent/tool-subagent-control/src/index.ts`](../packages/sub The globally named control tools over continuable background subagents: provider-bound `tool-subagent` instances register distinct delegation tools, while this package registers `send_message` and `interrupt_agent` once, plus `list_agents` from its separately loaded `/list-agents` plugin (whose catalog rows use the sessionProjections and live Agent registries). + + ## `@deepseek-ai/dsh-tool-subagent-report` ### `report` @@ -1566,6 +1606,8 @@ Source: [`packages/subagent/tool-subagent-report/src/index.ts`](../packages/suba Registered per continuable in-process child rather than globally, so this schema is visible only inside such a child and survives its global `toolFilter`. The same contribution installs the child-scoped `tool:report` prompt section, which this catalog does not render. The parent-facing `send_message` tool is installed independently. + + ## `@deepseek-ai/dsh-tool-jobs` ### `job_kill` @@ -1637,6 +1679,8 @@ Source: [`packages/jobs/tool-jobs/src/index.ts`](../packages/jobs/tool-jobs/src/ The kind-agnostic background-job controller: background bash commands, PTY sends, and subagents are read, listed, and killed through the same three tools. Loading the plugin attaches the controller that arms producers' `ctx.jobs.start()`. + + ## `@deepseek-ai/dsh-tool-todo` ### `todo_write` @@ -1685,6 +1729,8 @@ Source: [`packages/todo/tool-todo/src/index.ts`](../packages/todo/tool-todo/src/ todo_write is session-owned state; UIs render the latest todo/write event as a checklist. `allowParallelInProgress` is required with no default, so the catalog states its choice: `true`, whose description invites several `in_progress` items. A deployment choosing `false` receives the same tool with a description asking for exactly one active task. + + ## `@deepseek-ai/dsh-tool-workflow` ### `workflow` @@ -1778,6 +1824,8 @@ Constraints: concurrency and total-agent caps apply; no filesystem, network, tim Source: [`packages/workflow/tool-workflow/src/index.ts`](../packages/workflow/tool-workflow/src/index.ts) + + ## `@deepseek-ai/dsh-tool-web` ### `web_fetch` diff --git a/docs/tool-catalog.zh.md b/docs/tool-catalog.zh.md index 076cc63151..ed0c7e3f70 100644 --- a/docs/tool-catalog.zh.md +++ b/docs/tool-catalog.zh.md @@ -42,6 +42,8 @@ | `@deepseek-ai/dsh-tool-workflow` | `workflow` | `ctx.tools`ã€�`ctx.workflowEngine`ã€�`ctx.systemPrompt`ã€�`a calling Agent (exec.agent parents the script children)` | `tool/call`ã€�`tool/result` | - | - | | `@deepseek-ai/dsh-tool-web` | `web_fetch`ã€�`web_search` | `ctx.tools`ã€�`ctx.web`ã€�`ctx.systemPrompt` | `tool/call`ã€�`tool/result` | - | web_search å’Œ web_fetch å°†æ��供方选择置于 ctx.web 之å�Žï¼Œä½¿æ¨¡åž‹å�¯è§� schema 在更æ�¢å�Žç«¯æ—¶ä¿�æŒ�稳定。 | + + ## `@deepseek-ai/dsh-tool-ask-user` ### `ask_user_question` @@ -114,11 +116,13 @@ ask_user_question 会暂å�œå·¥å…·è°ƒç”¨ï¼Œç›´åˆ°å½“å‰� UI æ��供方返回人类答案。 + + ## `@deepseek-ai/dsh-tools` ### `run_code` -针对å�¯ç”¨å·¥å…·æ‰§è¡Œ TypeScript 程åº�。请编写异步函数的**函数体**(仅使用å�¯æ“¦é™¤è¯­æ³•;支æŒ�顶层 `await` å’Œ `return`),并根æ�®ç³»ç»Ÿæ��示è¯�中的声明,以 `await tools.name(args)` å½¢å¼�调用工具。å�ªæœ‰æ‰“å�°æˆ–返回的内容会传回,请谨慎筛选。 +针对å�¯ç”¨å·¥å…·æ‰§è¡Œ TypeScript 程åº�。接å�—两个必填å�‚数:`code`,å�³å¼‚步函数的**函数体**(仅使用å�¯æ“¦é™¤è¯­æ³•;支æŒ�顶层 `await` å’Œ `return`);以å�Š `description`,简è¦�说明该程åº�å�šä»€ä¹ˆã€‚请根æ�®ç³»ç»Ÿæ��示è¯�中的声明,以 `await tools.name(args)` å½¢å¼�调用工具。å�ªæœ‰æ‰“å�°æˆ–返回的内容会传回,请谨慎筛选。 ```json { @@ -144,6 +148,8 @@ ask_user_question 会暂å�œå·¥å…·è°ƒç”¨ï¼Œç›´åˆ°å½“å‰� UI æ��供方返回人类 在 `mode: code`ï¼�`mode: both` 下,它由工具注册表所有,作为å�¯è¿‡æ»¤èƒ½åŠ›å±‚ä¹‹å¤–çš„ä¿�留传输机制(å�‚è§� Code Mode Agent Note)。在 `code` 下,它是注册表对å��议格å¼�的唯一贡献;其他å�¯è§�能力在使用已加载è¿�行时语言生æˆ�çš„ SDK 章节中声明。程åº�通过 binding 调用这些能力,调用按照原生并å�‘约定调度:å�¯åŠ¨é¡ºåº�和策略é�µå¾ªæ��交顺åº�,并å�‘安全的函数体最多é‡�å� æ‰§è¡Œ `maxParallelSubCalls` 个。调用会é‡�新进入完整且å�—守å�«ä¿�护的工具æµ�水线,并将æ¯�个嵌套执行关è�”到此外层结果。 + + ## `@deepseek-ai/dsh-plan-mode` ### `exit_plan_mode` @@ -169,6 +175,8 @@ ask_user_question 会暂å�œå·¥å…·è°ƒç”¨ï¼Œç›´åˆ°å½“å‰� UI æ��供方返回人类 规划未激活时,exit_plan_mode ä»�ä¿�留在é�¢å�‘模型的 schema 中,这样状æ€�转æ�¢ä¸�会在规划策略å�˜æ›´ä¹‹å¤–é¢�外造æˆ�工具目录å�˜åŠ¨ã€‚å…¶æ‰§è¡Œè·¯å¾„ä¼šæ‹’ç»�规划模å¼�之外的调用;在规划模å¼�下,它通过用户交互 seam æ��交计划(批准ï¼�æ ¹æ�®å��馈继续规划),批准å�Žä¼šåœ¨æ­¥éª¤è¾¹ç•Œè®°å½•规划模å¼�å·²å�œç”¨ã€‚ + + ## `@deepseek-ai/dsh-tool-bash` ### `bash` @@ -211,6 +219,8 @@ ask_user_question 会暂å�œå·¥å…·è°ƒç”¨ï¼Œç›´åˆ°å½“å‰� UI æ��供方返回人类 bash 工具是 bash 执行器 seam é�¢å�‘模型的消费方。使用 `run_in_background` çš„è¿�行会注册到通用 `ctx.jobs` è¿�行时,并通过 `job_*` 工具(æ�¥è‡ª `@deepseek-ai/dsh-tool-jobs`)收集ï¼�å�œæ­¢ï¼›ç¦�用 `enableRunInBackground` é…�置(默认为 true)å�Žï¼Œè¯¥å�‚数会被完全移除。 + + ## `@deepseek-ai/dsh-tool-pwsh` ### `pwsh` @@ -253,6 +263,8 @@ bash 工具是 bash 执行器 seam é�¢å�‘模型的消费方。使用 `run_in_bac pwsh 工具是 Windows 组å�ˆä¸­ bash 执行器 seam çš„ PowerShell 方言消费方(由 `@deepseek-ai/dsh-pwsh-local` ç­‰ PowerShell 执行器为 `ctx.shell` æ��ä¾›å�Žç«¯ï¼‰ï¼›é™¤æ²™ç®±æŽ¥å�£å¤–,它é€�项对应 bash 工具调用。使用 `run_in_background` çš„è¿�行会注册到通用 `ctx.jobs` è¿�行时,并通过 `job_*` 工具收集ï¼�å�œæ­¢ï¼›æ‰˜ç®¡çš„ `DSH_*` 环境æ�¥è‡ª `@deepseek-ai/dsh-shell-env`。æ¯�次调用都在新进程中è¿�行,ä¸�使用æŒ�ä¹… PTY 会è¯�。路径采用原生 `C:\...` å½¢å¼�,å�˜é‡�采用 `$env:NAME`。 + + ## `@deepseek-ai/dsh-tool-cordis` ### `cordis_define` @@ -489,6 +501,8 @@ pwsh 工具是 Windows 组å�ˆä¸­ bash 执行器 seam çš„ PowerShell 方言消费 ä¸�在任何éš�产å“�å�‘布的树中,需è¦�显å¼�选择å�¯ç”¨ï¼›åЍæ€� Package 代ç �å�¯ä»¥è®¿é—®çœŸå®žè¿�行时,è§� .agents/notes/implemented/feature/2026-07-08-self-referential-cordis-toolset.md。该工具集注入 `@deepseek-ai/dsh-cordis-host-runner` æ��供的 `ctx.dynamicCordisRunner`,å�Žè€…拥有定义注册表和 vm 沙箱;组å�ˆç¼ºå°‘它时这些工具ä¸�会激活。è¿�行中的 Package 在å�œæ­¢ã€�undefine 或 DSH é‡�å�¯å‰�å�¯ä»¥æ³¨å†Œ**é¢�外的**模型å�¯è§�工具;å�‘生这类工具集å�˜åŒ–时,系统会记录完整且有å�˜åŠ¨çš„è¯·æ±‚å¤´ã€‚ + + ## `@deepseek-ai/dsh-tool-bash-persistent` ### `bash` @@ -514,6 +528,8 @@ pwsh 工具是 Windows 组å�ˆä¸­ bash 执行器 seam çš„ PowerShell 方言消费 一个按所有者隔离的æŒ�ä¹… bash 工具;部署组å�ˆæ��ä¾› PTY å�Žç«¯ï¼Œå¹¶å�¯è¦†ç›–é�¢å�‘模型的环境æ��述。 + + ## `@deepseek-ai/dsh-tool-str-replace-editor` ### `str_replace_editor` @@ -584,6 +600,8 @@ pwsh 工具是 Windows 组å�ˆä¸­ bash 执行器 seam çš„ PowerShell 方言消费 基于文件系统 seam 的独立查看ï¼�创建ï¼�唯一字é�¢é‡�替æ�¢ï¼�按行æ�’入工具;å�¯ä¸Žä»»ä½• shell 或终端接å�£ç»„å�ˆã€‚ + + ## `@deepseek-ai/dsh-tool-fs` ### `edit` @@ -699,6 +717,8 @@ pwsh 工具是 Windows 组å�ˆä¸­ bash 执行器 seam çš„ PowerShell 方言消费 先读å�Žå†™ï¼�编辑策略由 `@deepseek-ai/dsh-fs-observation-policy` 添加;它是一个 `fs/*` 事件门ç¦�æ�’件,ä¸�会改å�˜ schema。加载这些工具的部署按预期也应加载该æ�’件。没有 `ctx.attachments` æ—¶ `read_image` ä¸�会注册;其 schema 与路由无关,执行时除é�žç¡®åˆ‡è·¯ç”±çš„æ¨¡åž‹å£°æ˜Žå›¾åƒ�输入,å�¦åˆ™æ‹’ç»�。 + + ## `@deepseek-ai/dsh-tool-fs-search` ### `glob` @@ -757,6 +777,8 @@ pwsh 工具是 Windows 组å�ˆä¸­ bash 执行器 seam çš„ PowerShell 方言消费 glob å’Œ grep 是无æ�¡ä»¶å�¯ç”¨çš„å�‘现工具,通过 ctx.subprocess spawn éš�包æ��供的 ripgrep 二进制文件(`@vscode/ripgrep`),并作为普通å‰�å�°è°ƒç”¨è¿�行,ç»�ä¸�作为å�Žå�°ä»»åŠ¡ï¼›æ— éœ€åœ¨å®¿ä¸»æœºå®‰è£… `rg`,也ä¸�ç»�过 shell 层。本目录使用 `sampleOverCapGlobResults: true`;部署必须显å¼�选择该行为。结果超过上é™�时,会通过å�¯é€‰çš„ ctx.spillStore å�Žç«¯ä¿�存完整的格å¼�化列表;在共置部署中,如果å�Žç«¯å…¬å¼€æœ¬åœ°è·¯å¾„,返回的定ä½�ä¿¡æ�¯å�¯ä¾›å�Žç»­è¯»å�–ï¼�æ�œç´¢ã€‚ + + ## `@deepseek-ai/dsh-tool-terminal` ### `terminal_close` @@ -920,6 +942,8 @@ glob å’Œ grep 是无æ�¡ä»¶å�¯ç”¨çš„å�‘现工具,通过 ctx.subprocess spawn è¿™ 6 个终端工具需è¦�选择å�¯ç”¨ï¼Œç”¨äºŽè¡¥å……一次性 bashï¼�文件系统工具。`terminal_send(run_in_background: true)` 会注册到 `ctx.jobs`ï¼›schema ä¸�包å�« TUIã€�å…·å��按键åº�列ã€�BELã€�调整尺寸ã€�自动å�¯åŠ¨å’Œè·¨ agent 共享。 + + ## `@deepseek-ai/dsh-tool-goal` ### `create_goal` @@ -1012,6 +1036,8 @@ glob å’Œ grep 是无æ�¡ä»¶å�¯ç”¨çš„å�‘现工具,通过 ctx.subprocess spawn createã€�editã€�pause å’Œ resume è¦�求直接æ�¥è‡ªäººç±»çš„æ ¹æ�ƒé™�ï¼›complete å’Œ blocked 也接å�—确切的当å‰� Goal Round。blocked 的默认下é™�是 3 个获准的 Round。 + + ## `@deepseek-ai/dsh-schedule` ### `schedule_create` @@ -1107,6 +1133,8 @@ createã€�editã€�pause å’Œ resume è¦�求直接æ�¥è‡ªäººç±»çš„æ ¹æ�ƒé™�ï¼›complete 仅在选择å�¯ç”¨çš„ Schedule æ�’件加载å�Žåˆ›å»ºçš„ live æ ¹ Agent scope 内注册。版本 1 接å�— after_secondsã€�显å¼�ç»�对 at 和有界固定速率 every_seconds,并披露 session-local 交付;管ç�†è¯»å�–与å�˜æ›´å¿…须通过共享的 Session æŒ�久化 barrier。 + + ## `@deepseek-ai/dsh-tool-lsp` ### `lsp` @@ -1153,6 +1181,8 @@ createã€�editã€�pause å’Œ resume è¦�求直接æ�¥è‡ªäººç±»çš„æ ¹æ�ƒé™�ï¼›complete lsp 工具将æ��供方选择和语言æœ�务器å­�进程置于 ctx.lsp 之å�Žï¼Œå› æ­¤å…¶æ¨¡åž‹å�¯è§� schema 在更æ�¢æ��供方时ä¿�æŒ�稳定。è¿�行时è¦�求已注册æ��供方,例如 `@deepseek-ai/dsh-lsp-stdio`;如果没有æ��供方,查询会返回结构化 `LSP_UNAVAILABLE` 错误,而ä¸�会改å�˜ schema。 + + ## `@deepseek-ai/dsh-tool-ralph` ### `ralph` @@ -1182,6 +1212,8 @@ lsp 工具将æ��供方选择和语言æœ�务器å­�进程置于 ctx.lsp 之å�Žï¼Œ 固定的å‰�å�°å·¥ä½œæµ�会在æ¯�个 Round å�¯åŠ¨ä¸€ä¸ªå…¨æ–°çš„ç»“æž„åŒ–å­�级;模型å�ªèƒ½é€‰æ‹©ä¸�å�¯å�˜ç›®æ ‡å’Œå�¯é€‰çš„ Round 上é™�。 + + ## `@deepseek-ai/dsh-tool-skill` ### `skill` @@ -1205,6 +1237,8 @@ lsp 工具将æ��供方选择和语言æœ�务器å­�进程置于 ctx.lsp 之å�Žï¼Œ æ�¥æº�:[`packages/skill/tool-skill/src/index.ts`](../packages/skill/tool-skill/src/index.ts) + + ## `@deepseek-ai/dsh-tool-session-query` ### `session_event_read` @@ -1438,6 +1472,8 @@ lsp 工具将æ��供方选择和语言æœ�务器å­�进程置于 ctx.lsp 之å�Žï¼Œ è¿™ 5 个å�ªè¯»å·¥å…·ä¼šéš�è—�æ��供方游标,并根æ�®ä¸�å�¯å�˜çš„调用 agent 会è¯�为æ¯�个结果授æ�ƒã€‚该包需è¦�选择å�¯ç”¨ï¼›éœ€è¦�强制截止时间或é™�制行内输出的组å�ˆè¿˜ä¼šæŒ‚载通用超时或 spill 策略。 + + ## `@deepseek-ai/dsh-tool-subagent` ### `subagent` @@ -1472,6 +1508,8 @@ lsp 工具将æ��供方选择和语言æœ�务器å­�进程置于 ctx.lsp 之å�Žï¼Œ 注册的工具å��ç§°å�–决于加载时 `toolName` é…�置(默认为 `subagent`);上述 schema 对应默认值。éš�产å“�å�‘布的组å�ˆä¼šä¸ºæ¯�个 subagent å�Žç«¯åŠ è½½ä¸€æ¬¡è¯¥åŒ…ï¼Œå› æ­¤æ¨¡åž‹è¿˜ä¼šçœ‹åˆ°ç»‘å®šåˆ° fork å�Žç«¯çš„ `subagent_fork`。æ¯�个实例的æ��è¿°ã€�`run_in_background` å�‚数与 system prompt ç­–ç•¥å�–决于它自己的 `backgroundMode` å’Œ `enableRunInBackground`,因此两个éš�附 schema å¹¶ä¸�相å�Œï¼š`subagent` 为 `continuable`,çœ�ç•¥å�‚数时默认å�Žå�°è¿�行,并由 runtime 自动投递结æ�Ÿç»“果;`subagent_fork` ä¿�æŒ� `one-shot`,çœ�ç•¥å�‚数时默认å‰�å�°è¿�行。详è§� `packages/bundle/base/cordis.patch.yml` å’Œ `examples/acp-agent/cordis.yml`。 + + ## `@deepseek-ai/dsh-tool-subagent-control` ### `interrupt_agent` @@ -1545,6 +1583,8 @@ lsp 工具将æ��供方选择和语言æœ�务器å­�进程置于 ctx.lsp 之å�Žï¼Œ 这些是控制å�¯ç»§ç»­å�Žå�° subagent 的全局命å��工具:绑定æ��供方的 `tool-subagent` 实例注册ä¸�å�Œçš„委派工具;本包注册一次 `send_message` å’Œ `interrupt_agent`,å�¦ç”± `list_agents` 通过å�•独加载的 `/list-agents` æ�’ä»¶æ��供,其目录行使用 sessionProjections 和实时 Agent 注册表。 + + ## `@deepseek-ai/dsh-tool-subagent-report` ### `report` @@ -1570,6 +1610,8 @@ lsp 工具将æ��供方选择和语言æœ�务器å­�进程置于 ctx.lsp 之å�Žï¼Œ 按å�¯ç»§ç»­çš„进程内å­�级注册,而é�žå…¨å±€æ³¨å†Œï¼Œå› æ­¤è¯¥ schema 仅在这ç§�å­�级内部å�¯è§�,并且ä¸�å�—其全局 `toolFilter` å½±å“�。å�Œä¸€ä»½è´¡çŒ®è¿˜ä¼šå®‰è£…å­�级作用域的 `tool:report` 系统æ��示è¯� section,本目录ä¸�渲染该 section。é�¢å�‘父级的 `send_message` 工具å�•独安装。 + + ## `@deepseek-ai/dsh-tool-jobs` ### `job_kill` @@ -1641,6 +1683,8 @@ lsp 工具将æ��供方选择和语言æœ�务器å­�进程置于 ctx.lsp 之å�Žï¼Œ 与任务ç§�类无关的å�Žå�°ä»»åŠ¡æŽ§åˆ¶å™¨ï¼šå�Žå�° bash 命令ã€�PTY å�‘é€�å’Œ subagent 都通过相å�Œçš„ 3 个工具读å�–ã€�列出和终止。加载该æ�’件会挂接控制器,从而å�¯ç”¨ç”Ÿäº§æ–¹çš„ `ctx.jobs.start()`。 + + ## `@deepseek-ai/dsh-tool-todo` ### `todo_write` @@ -1689,6 +1733,8 @@ lsp 工具将æ��供方选择和语言æœ�务器å­�进程置于 ctx.lsp 之å�Žï¼Œ todo_write 是会è¯�所有的状æ€�ï¼›UI 将最新的 todo/write 事件渲染为检查清å�•。`allowParallelInProgress` 是没有默认值的必填项,因此本目录明确选择 `true`,对应æ��è¿°å…�许å�Œæ—¶å­˜åœ¨å¤šä¸ª `in_progress` 项。选择 `false` 的部署会获得å�Œä¸€å·¥å…·ï¼Œä½†æ��述会è¦�求å�ªèƒ½æœ‰ 1 个活动任务。 + + ## `@deepseek-ai/dsh-tool-workflow` ### `workflow` @@ -1783,6 +1829,8 @@ todo_write 是会è¯�所有的状æ€�ï¼›UI 将最新的 todo/write 事件渲染为 æ�¥æº�:[`packages/workflow/tool-workflow/src/index.ts`](../packages/workflow/tool-workflow/src/index.ts) + + ## `@deepseek-ai/dsh-tool-web` ### `web_fetch` diff --git a/docs/user/develop/basic/index.i18n.yaml b/docs/user/develop/basic/index.i18n.yaml index 0dd8723e1b..96e27f6c6d 100644 --- a/docs/user/develop/basic/index.i18n.yaml +++ b/docs/user/develop/basic/index.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/basic/index.md -index.md: 494b7869be6ffdf5767fac260b36b2585305b516 -index.zh.md: a55b8e31151c5cfa5445069974be9fa022fea1eb +index.md: 08199624e638aaf4a36b04446c39c228b2af6025 +index.zh.md: c45a30d0bfffaf4a6c78303f9ca043c3397c8a08 diff --git a/docs/user/develop/basic/index.md b/docs/user/develop/basic/index.md index 494b7869be..08199624e6 100644 --- a/docs/user/develop/basic/index.md +++ b/docs/user/develop/basic/index.md @@ -45,14 +45,16 @@ export function apply(ctx: Context) { ## Register it in cordis.yml -Create `scratch-plugin/cordis.yml` as a Web overlay that inserts the local plugin: +Run `pwd` from the repository root, then create `scratch-plugin/cordis.yml` as a Web overlay that inserts the local plugin. Replace `/absolute/path/to/deepseek-harness` below with the printed path: ```yaml - insert: - id: hello - name: './src/my-plugin.ts' + name: '/absolute/path/to/deepseek-harness/scratch-plugin/src/my-plugin.ts' ``` +The plugin path must be absolute. A patch file contributes configuration but does not change the profile directory from which the loader resolves module paths. + Start the Web UI with that overlay: ```sh diff --git a/docs/user/develop/basic/index.zh.md b/docs/user/develop/basic/index.zh.md index a55b8e3115..c45a30d0bf 100644 --- a/docs/user/develop/basic/index.zh.md +++ b/docs/user/develop/basic/index.zh.md @@ -45,14 +45,16 @@ export function apply(ctx: Context) { ## 注册到 cordis.yml -创建 `scratch-plugin/cordis.yml`,作为æ�’入本地æ�’ä»¶çš„ Web 覆盖层: +在仓库根目录è¿�行 `pwd`,然å�Žåˆ›å»º `scratch-plugin/cordis.yml`,作为æ�’入本地æ�’ä»¶çš„ Web 覆盖层。请将下文的 `/absolute/path/to/deepseek-harness` 替æ�¢ä¸ºå‘½ä»¤æ‰“å�°çš„路径: ```yaml - insert: - id: hello - name: './src/my-plugin.ts' + name: '/absolute/path/to/deepseek-harness/scratch-plugin/src/my-plugin.ts' ``` +æ�’件路径必须是ç»�对路径。patch 文件å�ªè´¡çŒ®é…�置,ä¸�会改å�˜ loader è§£æž�模å�—路径时使用的 profile 目录。 + 使用该覆盖层å�¯åЍ Web UI: ```sh diff --git a/docs/user/develop/basic/publish.i18n.yaml b/docs/user/develop/basic/publish.i18n.yaml index 649408dead..da1ac1e88c 100644 --- a/docs/user/develop/basic/publish.i18n.yaml +++ b/docs/user/develop/basic/publish.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/basic/publish.md -publish.md: 588531a28020ebe620643cd1aaaa43de000e658a -publish.zh.md: b86bd43369c027972705394fded43ae053248c0f +publish.md: 9548fe2f8e4636dd160c79cd0d50f01f8bdfd3d1 +publish.zh.md: 2cff05edcca55bac5fde9d2e7d24ed9c8b48a6f5 diff --git a/docs/user/develop/basic/publish.md b/docs/user/develop/basic/publish.md index 588531a280..9548fe2f8e 100644 --- a/docs/user/develop/basic/publish.md +++ b/docs/user/develop/basic/publish.md @@ -2,7 +2,9 @@ English | [中文](publish.zh.md) -The previous tutorials loaded a local plugin through a `--patch` overlay. This tutorial packages it as an installable **bundle**, installs it into a **profile** with `dsh plugin add`, and explains the layer order that determines the composed configuration. Complete [plugin configuration](./config.md) first. +The previous tutorials loaded a local plugin through a `--patch` overlay. This tutorial packages it as an installable **bundle**, installs it into a **profile** with `dsh plugin add`, and explains the layer order that determines the composed configuration. It assumes the `dsh` CLI is installed. Complete [plugin configuration](./config.md) first. + +To use a fresh source checkout instead, complete the [run-from-source section](../../../../README.md#run-from-source), keep this tutorial's `hello-plugin` directory at the repository root, and run the remaining `dsh ...` commands from there as `pnpm dsh ...`. See [source execution](../../../../apps/cli/reference/README.md#source-execution) for build and launcher behavior. ## Two concepts, two manifests @@ -15,6 +17,12 @@ A bundle is what you author and distribute; a profile is what a user boots with ### The bundle manifest +Create the package directory: + +```sh +mkdir -p hello-plugin +``` + ``` hello-plugin/ ├── package.json # declares dsh.bundle @@ -22,6 +30,8 @@ hello-plugin/ └── index.js # plugin modules the patch rows reference ``` +Create `hello-plugin/package.json`: + ```json { "name": "dsh-hello-plugin", @@ -33,7 +43,17 @@ hello-plugin/ } ``` -The patch file is a YAML array of patch entries, like the `--patch` overlays you have been writing, except plugin rows reference the package by name instead of a relative source path so Node resolution finds the installed code: +Create `hello-plugin/index.js` with the plugin entry point: + +```js +export const name = 'hello-plugin' + +export function apply() { + console.log('[hello-plugin] plugin loaded!') +} +``` + +Create `hello-plugin/cordis.patch.yml`. The patch is a YAML array like the `--patch` overlays you have been writing, except plugin rows reference the package by name instead of a relative source path so Node resolution finds the installed code: ```yaml - insert: @@ -54,11 +74,10 @@ You never write a profile manifest by hand: `dsh plugin` creates and maintains i ## Install into a profile -`dsh plugin --profile ` forwards to pnpm in the profile directory, so every pnpm verb works. Install your package from its checkout: +`dsh plugin --profile ` forwards to pnpm in the profile directory, so every pnpm verb works. From the directory that contains `hello-plugin`, install the package checkout: ```sh -cd hello-plugin -dsh plugin --profile demo add . +dsh plugin --profile demo add ./hello-plugin ``` The first use initializes the profile (with `@deepseek-ai/dsh-base` as its first bundle), pnpm links the checkout, and `dsh` appends the bundle to `dsh.profile.bundles` because the package declares `dsh.bundle`: diff --git a/docs/user/develop/basic/publish.zh.md b/docs/user/develop/basic/publish.zh.md index b86bd43369..2cff05edcc 100644 --- a/docs/user/develop/basic/publish.zh.md +++ b/docs/user/develop/basic/publish.zh.md @@ -2,7 +2,9 @@ [English](publish.md) | 中文 -å‰�几篇教程通过 `--patch` overlay 加载本地æ�’件。本教程把它打包æˆ�å�¯å®‰è£…çš„**组å�ˆåŒ…**(bundle),用 `dsh plugin add` 安装进一个 **profile**,并解释决定组å�ˆå�Žé…�置的层顺åº�。请先完æˆ�[æ�’ä»¶é…�ç½®](./config.md)。 +å‰�几篇教程通过 `--patch` overlay 加载本地æ�’件。本教程把它打包æˆ�å�¯å®‰è£…çš„**组å�ˆåŒ…**(bundle),用 `dsh plugin add` 安装进一个 **profile**,并解释决定组å�ˆå�Žé…�置的层顺åº�。本文å�‡è®¾ `dsh` CLI 已安装。请先完æˆ�[æ�’ä»¶é…�ç½®](./config.md)。 + +如果改用全新的æº�ç � checkout,请先按照[从æº�ç �è¿�行章节](../../../../README.md#run-from-source)完æˆ�准备,将本教程的 `hello-plugin` 目录放在仓库根目录,并从该目录把下文的 `dsh ...` 命令改为 `pnpm dsh ...`。构建与å�¯åŠ¨å™¨è¡Œä¸ºè§�[æº�ç �执行](../../../../apps/cli/reference/README.md#source-execution)。 ## 两个概念,两ç§� manifest @@ -15,6 +17,12 @@ ### 组å�ˆåŒ… manifest +创建包目录: + +```sh +mkdir -p hello-plugin +``` + ``` hello-plugin/ ├── package.json # declares dsh.bundle @@ -22,6 +30,8 @@ hello-plugin/ └── index.js # plugin modules the patch rows reference ``` +创建 `hello-plugin/package.json`: + ```json { "name": "dsh-hello-plugin", @@ -33,7 +43,17 @@ hello-plugin/ } ``` -patch 文件与一直在写的 `--patch` overlay 一样,是一个 patch æ�¡ç›®çš„ YAML 数组;区别是æ�’件行按包å��而ä¸�是相对æº�ç �路径引用这个包,这样 Node 的模å�—è§£æž�æ‰�能找到已安装的代ç �: +创建 `hello-plugin/index.js`,写入æ�’ä»¶å…¥å�£ï¼š + +```js +export const name = 'hello-plugin' + +export function apply() { + console.log('[hello-plugin] plugin loaded!') +} +``` + +创建 `hello-plugin/cordis.patch.yml`。这个 patch 与一直在写的 `--patch` overlay 一样,是一个 patch æ�¡ç›®çš„ YAML 数组;区别是æ�’件行按包å��而ä¸�是相对æº�ç �路径引用这个包,这样 Node 的模å�—è§£æž�æ‰�能找到已安装的代ç �: ```yaml - insert: @@ -54,11 +74,10 @@ profile manifest 从ä¸�需è¦�手写:`dsh plugin` 负责创建和维护它。 ## 安装进 profile -`dsh plugin --profile ` 在 profile 目录内转å�‘ç»™ pnpm,因此所有 pnpm å­�命令都å�¯ç”¨ã€‚从 checkout 安装你的包: +`dsh plugin --profile ` 在 profile 目录内转å�‘ç»™ pnpm,因此所有 pnpm å­�命令都å�¯ç”¨ã€‚在包å�« `hello-plugin` 的目录中安装该包的 checkout: ```sh -cd hello-plugin -dsh plugin --profile demo add . +dsh plugin --profile demo add ./hello-plugin ``` 首次使用会åˆ�始化 profile(`@deepseek-ai/dsh-base` 作为它的第一个组å�ˆåŒ…),pnpm 链接该 checkout,而 `dsh` 因为这个包声明了 `dsh.bundle`,把它追加进 `dsh.profile.bundles`: diff --git a/docs/user/develop/basic/tool.i18n.yaml b/docs/user/develop/basic/tool.i18n.yaml index 8044c4adaa..1b5cac6c87 100644 --- a/docs/user/develop/basic/tool.i18n.yaml +++ b/docs/user/develop/basic/tool.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/basic/tool.md -tool.md: a149f6876c573c9ece4b066ef6c211f69b0b03a8 -tool.zh.md: bcce5001497908cefa643749caee8da0e9859cf7 +tool.md: eb262d131a7f2b540827e86e56f8c0a28cb5f904 +tool.zh.md: d33d9946a73881df2cd44ebf3695819d02d013ab diff --git a/docs/user/develop/basic/tool.md b/docs/user/develop/basic/tool.md index a149f6876c..eb262d131a 100644 --- a/docs/user/develop/basic/tool.md +++ b/docs/user/develop/basic/tool.md @@ -49,4 +49,4 @@ Open `http://127.0.0.1:3080` and ask: `Use the greet tool to greet Ada.` The mod - [Plugin configuration](./config.md) — make the greeting configurable. - [Tool authoring reference](../../../cookbook/adding-a-tool.md) — look up nested schemas, canonical values, background work, policy hooks, Code Mode, and UI cards. -- [Capability layering](../practice/) — split a replaceable capability into Service Definition, Service provider, and Consumer packages. +- [Capability layering](../practice/) — split a replaceable capability into Service Definition, Service Provider, and Consumer packages. diff --git a/docs/user/develop/basic/tool.zh.md b/docs/user/develop/basic/tool.zh.md index bcce500149..d33d9946a7 100644 --- a/docs/user/develop/basic/tool.zh.md +++ b/docs/user/develop/basic/tool.zh.md @@ -49,4 +49,4 @@ pnpm dsh web --patch ./scratch-plugin/cordis.yml - [æ�’ä»¶é…�ç½®](./config.md) — 让问候语å�¯é…�置。 - [工具编写å�‚考](../../../cookbook/adding-a-tool.md) — 查阅嵌套 schemaã€�规范值ã€�å�Žå�°å·¥ä½œã€�策略钩å­�ã€�Code Mode å’Œ UI å�¡ç‰‡ã€‚ -- [能力分层](../practice/) — å°†å�¯æ›¿æ�¢èƒ½åŠ›æ‹†åˆ†ä¸º Service Definitionã€�Service provider å’Œ Consumer 三类包。 +- [能力分层](../practice/) — å°†å�¯æ›¿æ�¢èƒ½åŠ›æ‹†åˆ†ä¸º Service Definitionã€�Service Provider å’Œ Consumer 三类包。 diff --git a/docs/user/develop/framework/events.i18n.yaml b/docs/user/develop/framework/events.i18n.yaml index b5f1cc7745..7b62e40d71 100644 --- a/docs/user/develop/framework/events.i18n.yaml +++ b/docs/user/develop/framework/events.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/framework/events.md -events.md: 4a6ecbad614cf2debccaee9ace1086273d8fb95b -events.zh.md: c77747bf6ac767c69e4f2d9cfe7375b71bd388e6 +events.md: 1d9fe5c8f5068de6ad8b2abaa85cf67be35c8459 +events.zh.md: 8bb9447a270cc2db966b1e01298a831a60a1b9c1 diff --git a/docs/user/develop/framework/events.md b/docs/user/develop/framework/events.md index 4a6ecbad61..1d9fe5c8f5 100644 --- a/docs/user/develop/framework/events.md +++ b/docs/user/develop/framework/events.md @@ -40,7 +40,7 @@ ctx.on('my-plugin/ready', ({ id }) => { ### bail — short circuit -Listeners run in order; the first non-`undefined` result becomes the final result: +Listeners run in order; the first result other than `null`, `false`, or `undefined` becomes the final result: ```ts ignore-check // Dispatch @@ -49,13 +49,13 @@ const result = ctx.bail('some-check', input) // Listen: a returned value stops later listeners. ctx.on('some-check', (input) => { if (shouldBlock(input)) return 'blocked' - // Return undefined to continue to the next listener. + // Return null, false, or undefined to continue to the next listener. }) ``` ### serial — ordered execution -Listeners run in registration order and asynchronous results are awaited. The first listener to return a non-empty value stops further execution: +Listeners run in registration order and asynchronous results are awaited. The first result other than `null`, `false`, or `undefined` stops further execution: ```ts ignore-check await ctx.serial('setup-phase', context) diff --git a/docs/user/develop/framework/events.zh.md b/docs/user/develop/framework/events.zh.md index c77747bf6a..8bb9447a27 100644 --- a/docs/user/develop/framework/events.zh.md +++ b/docs/user/develop/framework/events.zh.md @@ -40,7 +40,7 @@ ctx.on('my-plugin/ready', ({ id }) => { ### bail — 短路 -ä¾�次调用监å�¬å™¨ï¼Œç¬¬ä¸€ä¸ªé�ž `undefined` 的返回值将作为最终结果: +监å�¬å™¨æŒ‰é¡ºåº�è¿�行,第一个ä¸�是 `null`ã€�`false` 或 `undefined` 的返回值会æˆ�为最终结果: ```ts ignore-check // Dispatch @@ -49,13 +49,13 @@ const result = ctx.bail('some-check', input) // Listen: a returned value stops later listeners. ctx.on('some-check', (input) => { if (shouldBlock(input)) return 'blocked' - // Return undefined to continue to the next listener. + // Return null, false, or undefined to continue to the next listener. }) ``` ### serial — 顺åº�执行 -监å�¬å™¨æŒ‰æ³¨å†Œé¡ºåº�ä¾�次执行,并等待异步结果;第一个返回é�žç©ºå€¼çš„监å�¬å™¨ä¼šç»ˆæ­¢å�Žç»­æ‰§è¡Œï¼š +监å�¬å™¨æŒ‰æ³¨å†Œé¡ºåº�ä¾�次执行,并等待异步结果;第一个ä¸�是 `null`ã€�`false` 或 `undefined` 的返回值会终止å�Žç»­æ‰§è¡Œï¼š ```ts ignore-check await ctx.serial('setup-phase', context) diff --git a/docs/user/develop/framework/service.i18n.yaml b/docs/user/develop/framework/service.i18n.yaml index 69b91821ba..507fc26f86 100644 --- a/docs/user/develop/framework/service.i18n.yaml +++ b/docs/user/develop/framework/service.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/framework/service.md -service.md: a9e873f1ba969b1f2d22266f8ec03207f84eeddc -service.zh.md: a201280bc38176f57f5354ab205ae700c7b04a89 +service.md: 03f4e7dc4df934495a4b203066183753b621339e +service.zh.md: 2f4c01e0ea6a87a87ca694b265b07e07098f3e59 diff --git a/docs/user/develop/framework/service.md b/docs/user/develop/framework/service.md index a9e873f1ba..03f4e7dc4d 100644 --- a/docs/user/develop/framework/service.md +++ b/docs/user/develop/framework/service.md @@ -117,7 +117,7 @@ This prevents a plugin from calling a service that no longer exists. name: '@deepseek-ai/cordis-plugin-group' group: true isolate: - bash: true + shell: true config: - name: '@deepseek-ai/dsh-bash-local' config: @@ -128,7 +128,7 @@ This prevents a plugin from calling a service that no longer exists. name: '@deepseek-ai/cordis-plugin-group' group: true isolate: - bash: true + shell: true config: - name: '@deepseek-ai/dsh-bash-local' config: diff --git a/docs/user/develop/framework/service.zh.md b/docs/user/develop/framework/service.zh.md index a201280bc3..2f4c01e0ea 100644 --- a/docs/user/develop/framework/service.zh.md +++ b/docs/user/develop/framework/service.zh.md @@ -108,6 +108,8 @@ export function apply(ctx: Context) { è¿™å�¯ä»¥é˜²æ­¢æ�’件调用已ä¸�存在的æœ�务。 + + ## æœ�务隔离 `cordis.yml` 支æŒ�æœ�务隔离——å�Œä¸€ä¸ªæœ�务å�¯ä»¥æœ‰å¤šä¸ªå®žä¾‹ï¼Œä¸�å�Œæ�’件组看到ä¸�å�Œå®žä¾‹ï¼š @@ -117,7 +119,7 @@ export function apply(ctx: Context) { name: '@deepseek-ai/cordis-plugin-group' group: true isolate: - bash: true + shell: true config: - name: '@deepseek-ai/dsh-bash-local' config: @@ -128,7 +130,7 @@ export function apply(ctx: Context) { name: '@deepseek-ai/cordis-plugin-group' group: true isolate: - bash: true + shell: true config: - name: '@deepseek-ai/dsh-bash-local' config: diff --git a/docs/user/develop/practice/index.i18n.yaml b/docs/user/develop/practice/index.i18n.yaml index dd582b0886..2db0900779 100644 --- a/docs/user/develop/practice/index.i18n.yaml +++ b/docs/user/develop/practice/index.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/practice/index.md -index.md: 3619a39f4a39b42cf4269d3778f233ecc1731933 -index.zh.md: 8bd378af5eaf2741c34d76a152fa8a62a947bf41 +index.md: cc6bd7a234305f6fa193341f15354b40855f72e9 +index.zh.md: aed13b00f9bc74946aace614953bed30705c8281 diff --git a/docs/user/develop/practice/index.md b/docs/user/develop/practice/index.md index 3619a39f4a..cc6bd7a234 100644 --- a/docs/user/develop/practice/index.md +++ b/docs/user/develop/practice/index.md @@ -6,14 +6,14 @@ This page has two parts: a concept reference for the three-role capability patte ## Concept reference -When a capability is general enough to need replaceable providers, such as Bash execution, Harness separates three roles: a **Service Definition**, a **Service provider**, and a **Consumer**. Put the roles in separate packages when they need to evolve or be replaced independently; a package may otherwise own more than one role. The complete capability is its seam. No individual role is a seam. +When a capability is general enough to need replaceable providers, such as Bash execution, Harness separates three roles: a **Service Definition**, a **Service Provider**, and a **Consumer**. Put the roles in separate packages when they need to evolve or be replaced independently; a package may otherwise own more than one role. The complete capability is its seam. No individual role is a seam. ## Bash example The Bash execution capability consists of: - **Service Definition** (`dsh-shell`) — defines the Cordis service and Bash request and result types -- **Service provider** (`dsh-bash-local`) — executes commands on the local machine +- **Service Provider** (`dsh-bash-local`) — executes commands on the local machine - **Consumer** (`dsh-tool-bash`) — exposes the capability as a model-callable tool ``` @@ -23,7 +23,7 @@ The Bash execution capability consists of: └─────────────┘ └──────────────────┘ └──────────────┘ â–² │ └────────────────────────────────────────────┘ - inject: ['bash'] + inject: ['shell'] ``` ## Benefits of the split @@ -44,14 +44,14 @@ The Service Definition and tool remain unchanged while the provider changes. ### Evolve independently - The Service Definition changes rarely after callers depend on its contract. -- Service providers can improve performance and security independently. +- Service Providers can improve performance and security independently. - Consumers can change how they present the capability to the model. ### Decouple dependencies -- The Service provider depends on the Service Definition. +- The Service Provider depends on the Service Definition. - The Consumer depends on the Service Definition. -- The Service provider and Consumer **do not depend on each other**. +- The Service Provider and Consumer **do not depend on each other**. The [capability-seam reference](../../../capability-seams.md) owns the current built-in families and package links. @@ -87,7 +87,7 @@ export interface MyCapResult { } ``` -### Step 2: write a Service provider +### Step 2: write a Service Provider ```ts ignore-check // packages/my-cap/my-cap-local/src/index.ts @@ -147,7 +147,7 @@ export function apply(ctx: Context) { ## Design points - **Do not split preemptively** — use separate packages only when the roles need to evolve independently. A simple tool plugin does not. -- **The Service Definition owns Request/Result types** — Service providers and Consumers depend only on the Service Definition package. +- **The Service Definition owns Request/Result types** — Service Providers and Consumers depend only on the Service Definition package. - **Explicit > implicit** — resolve defaults in an explicit `resolve(request): Spec` step rather than hiding `?? default` expressions inside `run()`. ## Next steps diff --git a/docs/user/develop/practice/index.zh.md b/docs/user/develop/practice/index.zh.md index 8bd378af5e..aed13b00f9 100644 --- a/docs/user/develop/practice/index.zh.md +++ b/docs/user/develop/practice/index.zh.md @@ -6,14 +6,14 @@ ## 概念å�‚考 -当一项能力足够通用,需è¦�支æŒ�å�¯æ›¿æ�¢çš„æ��供方时(例如 Bash 执行),harness 会区分三ç§�角色:**Service Definition**ã€�**Service provider** å’Œ **Consumer**。角色需è¦�独立演进或替æ�¢æ—¶ï¼Œå°†å®ƒä»¬æ”¾å…¥ä¸�å�ŒåŒ…ï¼›å�¦åˆ™ä¸€ä¸ªåŒ…å�¯ä»¥æ‰¿æ‹…多个角色。完整能力构æˆ�å…¶ seam。任何å�•一角色都ä¸�是 seam。 +当一项能力足够通用,需è¦�支æŒ�å�¯æ›¿æ�¢çš„æ��供方时(例如 Bash 执行),harness 会区分三ç§�角色:**Service Definition**ã€�**Service Provider** å’Œ **Consumer**。角色需è¦�独立演进或替æ�¢æ—¶ï¼Œå°†å®ƒä»¬æ”¾å…¥ä¸�å�ŒåŒ…ï¼›å�¦åˆ™ä¸€ä¸ªåŒ…å�¯ä»¥æ‰¿æ‹…多个角色。完整能力构æˆ�å…¶ seam。任何å�•一角色都ä¸�是 seam。 ## 以 Bash 为例 以 Bash 执行能力为例: - **Service Definition** (`dsh-shell`):定义 Cordis æœ�务以å�Š Bash 请求和结果类型 -- **Service provider** (`dsh-bash-local`):在本地计算机上执行命令 +- **Service Provider** (`dsh-bash-local`):在本地计算机上执行命令 - **Consumer** (`dsh-tool-bash`):将该能力公开为模型å�¯è°ƒç”¨çš„工具 ``` @@ -23,7 +23,7 @@ └─────────────┘ └──────────────────┘ └──────────────┘ â–² │ └────────────────────────────────────────────┘ - inject: ['bash'] + inject: ['shell'] ``` ## 拆分的好处 @@ -44,14 +44,14 @@ ### 独立演进 - 调用方开始ä¾�èµ– Service Definition 的约定å�Žï¼ŒService Definition 很少改动。 -- Service provider å�¯ä»¥ç‹¬ç«‹ä¼˜åŒ–性能和安全性。 +- Service Provider å�¯ä»¥ç‹¬ç«‹ä¼˜åŒ–性能和安全性。 - Consumer å�¯ä»¥è°ƒæ•´èƒ½åŠ›å�‘模型呈现的方å¼�。 ### ä¾�赖解耦 -- Service provider ä¾�èµ– Service Definition。 +- Service Provider ä¾�èµ– Service Definition。 - Consumer ä¾�èµ– Service Definition。 -- Service provider å’Œ Consumer **互ä¸�ä¾�èµ–**。 +- Service Provider å’Œ Consumer **互ä¸�ä¾�èµ–**。 当å‰�内置系列å�Šå…¶åŒ…链接由[能力 seam å�‚考](../../../capability-seams.md)负责。 @@ -87,7 +87,7 @@ export interface MyCapResult { } ``` -### 第二步:编写 Service provider +### 第二步:编写 Service Provider ```ts ignore-check // packages/my-cap/my-cap-local/src/index.ts @@ -147,7 +147,7 @@ export function apply(ctx: Context) { ## 设计è¦�点 - **ä¸�è¦�预防性拆分**:å�ªæœ‰è§’色需è¦�独立演进时,æ‰�使用ä¸�å�ŒåŒ…。简å�•的工具æ�’件无需拆分。 -- **Service Definition 拥有 Request/Result 类型**:Service provider å’Œ Consumer å�ªä¾�èµ– Service Definition 包。 +- **Service Definition 拥有 Request/Result 类型**:Service Provider å’Œ Consumer å�ªä¾�èµ– Service Definition 包。 - **显å¼�优于éš�å¼�**:实现应通过显å¼�çš„ `resolve(request): Spec` 步骤处ç�†é»˜è®¤å€¼ï¼Œè€Œä¸�是在 `run()` 中éš�è—� `?? default`。 ## 下一步 diff --git a/docs/user/develop/practice/llm-adapter.i18n.yaml b/docs/user/develop/practice/llm-adapter.i18n.yaml index 6c91f15cb1..d7d431bd5e 100644 --- a/docs/user/develop/practice/llm-adapter.i18n.yaml +++ b/docs/user/develop/practice/llm-adapter.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/develop/practice/llm-adapter.md -llm-adapter.md: aba4a6d0c8ee42e78ca5a804d9a0dd9b31c1e240 -llm-adapter.zh.md: 5c7a6483e29a28871257df6a31e13d859a245097 +llm-adapter.md: 882e82d880ac622cf886c6c24e75a1987e1c6702 +llm-adapter.zh.md: 27c480af2a19a68ac35900a2ce1b5e9dbdc85bf8 diff --git a/docs/user/develop/practice/llm-adapter.md b/docs/user/develop/practice/llm-adapter.md index aba4a6d0c8..882e82d880 100644 --- a/docs/user/develop/practice/llm-adapter.md +++ b/docs/user/develop/practice/llm-adapter.md @@ -32,12 +32,12 @@ class MyAdapter extends LlmAdapter { export interface Config { apiKey: string - models: string[] + providers: string[] } export const Config: Schema = Schema.object({ apiKey: Schema.string().required(), - models: Schema.array(Schema.string()).required(), + providers: Schema.array(Schema.string()).required(), }) export const name = 'my-llm-adapter' @@ -45,7 +45,7 @@ export const inject = ['llm'] export function apply(ctx: Context, config: Config) { const adapter = new MyAdapter(config.apiKey) - ctx.llm.registerAdapter(config.models, adapter) + ctx.llm.registerAdapter(config.providers, adapter) } ``` @@ -117,10 +117,10 @@ Override `resolveModel(provider, model, signal?)` to return exact provider/model ## Register an adapter ```ts ignore-check -ctx.llm.registerAdapter(['model-name-1', 'model-name-2'], adapter) +ctx.llm.registerAdapter(['my-provider'], adapter) ``` -The first argument lists the model names handled by the adapter. If `cordis.yml` selects `model: model-name-1`, the service routes that request to this adapter. +The first argument lists provider routes handled by the adapter. `GenerateOptions.provider` selects the registered adapter, while `GenerateOptions.model` passes an adapter-owned model id without lifecycle registration. Override `listModels()` when the adapter can advertise model choices to selectors. ## Use it from cordis.yml @@ -129,18 +129,16 @@ The first argument lists the model names handled by the adapter. If `cordis.yml` name: './src/my-llm-adapter.ts' config: apiKey: !!js process.env.MY_API_KEY - models: - - my-model-v1 - - my-model-v2 + providers: + - my-provider - id: agent-loop name: '@deepseek-ai/dsh-agent-loop' config: agents: - id: main - provider: my-llm - model: my-model-v1 # References the model registered above. - workspaceContext: false + provider: my-provider + model: my-model-v1 ``` ## Reference implementations diff --git a/docs/user/develop/practice/llm-adapter.zh.md b/docs/user/develop/practice/llm-adapter.zh.md index 5c7a6483e2..27c480af2a 100644 --- a/docs/user/develop/practice/llm-adapter.zh.md +++ b/docs/user/develop/practice/llm-adapter.zh.md @@ -32,12 +32,12 @@ class MyAdapter extends LlmAdapter { export interface Config { apiKey: string - models: string[] + providers: string[] } export const Config: Schema = Schema.object({ apiKey: Schema.string().required(), - models: Schema.array(Schema.string()).required(), + providers: Schema.array(Schema.string()).required(), }) export const name = 'my-llm-adapter' @@ -45,7 +45,7 @@ export const inject = ['llm'] export function apply(ctx: Context, config: Config) { const adapter = new MyAdapter(config.apiKey) - ctx.llm.registerAdapter(config.models, adapter) + ctx.llm.registerAdapter(config.providers, adapter) } ``` @@ -117,10 +117,10 @@ async function* exampleChunks(): AsyncIterable { ## 注册适é…�器 ```ts ignore-check -ctx.llm.registerAdapter(['model-name-1', 'model-name-2'], adapter) +ctx.llm.registerAdapter(['my-provider'], adapter) ``` -第一个å�‚数是该适é…�器支æŒ�的模型å��列表。当用户在 `cordis.yml` 中é…�ç½® `model: model-name-1` 时,框架会将请求路由到该适é…�器。 +第一个å�‚数是该适é…�器处ç�†çš„æ��供方路由列表。`GenerateOptions.provider` 选择已注册的适é…�器,`GenerateOptions.model` 则传入由适é…�器拥有ã€�无需在生命周期å�¯åŠ¨æ—¶æ³¨å†Œçš„æ¨¡åž‹ id。适é…�器能够å�‘选择器公布模型选项时,请覆写 `listModels()`。 ## 在 cordis.yml 中使用 @@ -129,18 +129,16 @@ ctx.llm.registerAdapter(['model-name-1', 'model-name-2'], adapter) name: './src/my-llm-adapter.ts' config: apiKey: !!js process.env.MY_API_KEY - models: - - my-model-v1 - - my-model-v2 + providers: + - my-provider - id: agent-loop name: '@deepseek-ai/dsh-agent-loop' config: agents: - id: main - provider: my-llm - model: my-model-v1 # References the model registered above. - workspaceContext: false + provider: my-provider + model: my-model-v1 ``` ## 实战å�‚考 diff --git a/docs/user/guide/index.i18n.yaml b/docs/user/guide/index.i18n.yaml index 51f8a8802d..ba745feed8 100644 --- a/docs/user/guide/index.i18n.yaml +++ b/docs/user/guide/index.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write docs/user/guide/index.md -index.md: 80d288b1aba37e7f0863fe5fc8237cbd2a6ab9b5 -index.zh.md: addfbc94ff93ed015e52f509a23a3f981e36770b +index.md: 2ae8847e3e04e131517e505bbc3c5f2c1047a45c +index.zh.md: 7e4a140e11ca409755d63ade41a31d9b3cc4d4b6 diff --git a/docs/user/guide/index.md b/docs/user/guide/index.md index 80d288b1ab..2ae8847e3e 100644 --- a/docs/user/guide/index.md +++ b/docs/user/guide/index.md @@ -2,16 +2,18 @@ English | [中文](index.zh.md) -Start the Web UI through the [root README](../../../README.md#run); the command prints its URL. This guide begins after that server is running. - -The invoking directory is the default workspace, so the agent can inspect and modify the project where you started `dsh`. +Start the Web UI through the [root README](../../../README.md#run); the command prints its URL. This guide begins after that server is running. The `dsh` process uses its invoking directory as the default filesystem location, but a fresh Web UI has no selected workspace until you add one. ## Configure a model -Open **Settings → Models**, enter a DeepSeek API key, and save it. The model route becomes usable immediately without restarting the server. +Open **Settings → Models**, enter a [DeepSeek API key](https://platform.deepseek.com/), and save it. The model route becomes usable immediately without restarting the server. The [model configuration guide](./providers.md) covers other providers and custom OpenAI-compatible endpoints. +## Choose a workspace + +Click **Choose workspace**, add the project directory where you started `dsh`, and select it. The session composer remains unavailable until a workspace is selected. + ## Run a task Start a session and send: diff --git a/docs/user/guide/index.zh.md b/docs/user/guide/index.zh.md index addfbc94ff..7e4a140e11 100644 --- a/docs/user/guide/index.zh.md +++ b/docs/user/guide/index.zh.md @@ -2,23 +2,25 @@ [English](index.md) | 中文 -先按照[æ ¹ README](../../../README.md#run)å�¯åЍ Web UI;命令会打å�°å…¶è®¿é—®åœ°å�€ã€‚本指å�—从æœ�务器已ç»�è¿�行的状æ€�开始。 - -调用目录是默认工作区,因此 agent(智能体)å�¯ä»¥æ£€æŸ¥å¹¶ä¿®æ”¹å�¯åЍ `dsh` 时所在的项目。 +请先按照[根目录 README](../../../README.md#run) 中的说明å�¯åЍ Web UI;命令会打å�°å…¶è®¿é—®åœ°å�€ã€‚本指å�—从æœ�务器已ç»�è¿�行的状æ€�开始。`dsh` 进程会把å�¯åŠ¨æ—¶æ‰€åœ¨çš„ç›®å½•ä½œä¸ºé»˜è®¤æ–‡ä»¶ç³»ç»Ÿä½�置;全新的 Web UI 则ä¸�会选中任何工作区,你需è¦�添加一个工作区。 ## é…�置模型 -打开**设置 → 模型**,输入 DeepSeek API 密钥并ä¿�存。模型路由会立å�³å�¯ç”¨ï¼Œä¸�需è¦�é‡�å�¯æœ�务器。 +打开**设置 → 模型**,输入 [DeepSeek API 密钥](https://platform.deepseek.com/)å¹¶ä¿�存。模型路由会立å�³å�¯ç”¨ï¼Œä¸�需è¦�é‡�å�¯æœ�务器。 [模型é…�置指å�—](./providers.md)介ç»�å…¶ä»–æ��供方和自定义 OpenAI 兼容端点。 +## 选择工作区 + +点击**选择工作区**,添加å�¯åЍ `dsh` 时所在的项目目录,然å�Žé€‰ä¸­å®ƒã€‚选中工作区å‰�,会è¯�输入框ä¸�å�¯ç”¨ã€‚ + ## è¿�行任务 å�¯åŠ¨ä¸€ä¸ªä¼šè¯�å¹¶å�‘é€�: > Summarize this repository and identify its main packages. -agent å�¯ä»¥è¯»å�–和编辑工作区文件ã€�è¿�行命令ã€�委派工作并维护计划。当æ“�作在当å‰�æ�ƒé™�策略下需è¦�审批时,Web UI 会先询问你。 +Agent(智能体)å�¯ä»¥è¯»å�–和编辑工作区文件ã€�è¿�行命令ã€�委派工作并维护计划。如果根æ�®å½“å‰�æ�ƒé™�策略,æŸ�项æ“�作需è¦�审批,Web UI 会先询问你。 ## 继续使用 diff --git a/examples/acp-agent/cordis.yml b/examples/acp-agent/cordis.yml index d37e09f2b8..ee44969d02 100644 --- a/examples/acp-agent/cordis.yml +++ b/examples/acp-agent/cordis.yml @@ -123,7 +123,8 @@ # Fork stays one-shot because a continuable child's `report` tool and prompt # section precede the inherited history a fork reuses; `run_in_background` is off -# because this example mounts no task service. See .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md. +# as an explicit foreground-only choice even though agent-spine-demo mounts the +# generic Job runtime. See .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md. - id: tool-subagent-fork name: '@deepseek-ai/dsh-tool-subagent' config: diff --git a/examples/acp-agent/product-subagent-both.cordis.snapshot.yml b/examples/acp-agent/product-subagent-both.cordis.snapshot.yml index 73d22eae27..0f8760cb91 100644 --- a/examples/acp-agent/product-subagent-both.cordis.snapshot.yml +++ b/examples/acp-agent/product-subagent-both.cordis.snapshot.yml @@ -27,12 +27,12 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code name: '@deepseek-ai/dsh-tool-subagent' config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed diff --git a/examples/acp-agent/product-subagent-both.cordis.yml b/examples/acp-agent/product-subagent-both.cordis.yml index ce9d054058..6a75bec332 100644 --- a/examples/acp-agent/product-subagent-both.cordis.yml +++ b/examples/acp-agent/product-subagent-both.cordis.yml @@ -1,5 +1,5 @@ -# Add both native product providers and the same independent foreground tool -# rows an Agent Preset may contribute. Loading the composition starts neither +# Add both native product providers and the same independent one-shot tool rows +# an Agent Preset may contribute. Loading the composition starts neither # product; the scenario pins both model-visible schemas. - id: base name: '@deepseek-ai/cordis-plugin-include' @@ -16,12 +16,12 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed - id: tool-subagent-claude-code name: '@deepseek-ai/dsh-tool-subagent' config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed diff --git a/examples/acp-agent/product-subagent-codex.cordis.snapshot.yml b/examples/acp-agent/product-subagent-codex.cordis.snapshot.yml index 8b8cd8604c..69171c7dbf 100644 --- a/examples/acp-agent/product-subagent-codex.cordis.snapshot.yml +++ b/examples/acp-agent/product-subagent-codex.cordis.snapshot.yml @@ -25,5 +25,5 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed diff --git a/examples/acp-agent/product-subagent-codex.cordis.yml b/examples/acp-agent/product-subagent-codex.cordis.yml index 55f9985b7d..2a95679e14 100644 --- a/examples/acp-agent/product-subagent-codex.cordis.yml +++ b/examples/acp-agent/product-subagent-codex.cordis.yml @@ -1,4 +1,4 @@ -# Add the native Codex product provider and its preset-shaped foreground tool to +# Add the native Codex product provider and its preset-shaped one-shot tool to # the real ACP composition. The model is told not to call it; the scenario pins # the assembled request schema without starting Codex. - id: base @@ -14,5 +14,5 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: provider-managed diff --git a/examples/acp-agent/tests/acp.snapshot.ts b/examples/acp-agent/tests/acp.snapshot.ts index db4a2b5d2f..87ef397ee2 100644 --- a/examples/acp-agent/tests/acp.snapshot.ts +++ b/examples/acp-agent/tests/acp.snapshot.ts @@ -348,6 +348,13 @@ const SCENARIOS: Scenario[] = [ // reply, and a clean completed retry turn. Its overlay only pins a deterministic // 1 ms zero-jitter delay, so it shares the default header class. { name: 'empty-response-retry', hasModelTurn: true, recorded: false, configPath: RETRY_CONFIG }, + // Keyless, authored (like error-finish): a live model cannot be coaxed into + // a deterministic mid-tool-call output-limit truncation. Turn 1's script ends + // at `max-tokens` with an unfinished tool call and adapter replay metadata for + // both blocks; the durable assistant/message pins assembly dropping the tool + // call AND pruning its per-block replay entry in the same decision, and turn 2 + // proves the session continues past the truncated step. + { name: 'max-tokens-continue', hasModelTurn: true, recorded: false }, // Keyless, authored (like error-finish/cancel): deterministically forcing a // LIVE model to repeat one call three times is not a stable recording, so // the fixture scripts five identical todo_write calls and pins BOTH reminder diff --git a/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/cordis.yml b/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/cordis.yml index fcdc0c4fb6..45b62f880f 100644 --- a/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/cordis.yml +++ b/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/cordis.yml @@ -1,4 +1,4 @@ -# Test-only composition of both public opt-in providers and foreground tools. +# Test-only composition of both public opt-in providers and one-shot task tools. # The owning e2e boots this tree but never invokes a model or product process. - id: fixture name: './fixture.ts' @@ -20,7 +20,7 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: 'provider-managed' - id: tool-subagent-claude-code @@ -28,7 +28,7 @@ config: provider: claude-code toolName: subagent_claude_code - enableRunInBackground: false + backgroundMode: one-shot maxDepth: 'provider-managed' - id: agent-spine diff --git a/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/driver.ts b/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/driver.ts index d7540e1a2d..c10e9d110c 100644 --- a/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/driver.ts +++ b/examples/acp-agent/tests/fixtures/subagent/subagent-claude-code/driver.ts @@ -53,11 +53,16 @@ try { required: tool.parameters.required, } }) + const jobTools = ctx.tools.schemas() + .map(schema => schema.name) + .filter(name => name === 'job_kill' || name === 'job_list' || name === 'job_output') + .sort() process.stdout.write(`${JSON.stringify({ registeredProviders: ctx.subagents.list(), providers, tools, + jobTools, starts, })}\n`) } finally { diff --git a/examples/acp-agent/tests/fixtures/subagent/subagent-codex/cordis.yml b/examples/acp-agent/tests/fixtures/subagent/subagent-codex/cordis.yml index e770b11c95..6afe2b888d 100644 --- a/examples/acp-agent/tests/fixtures/subagent/subagent-codex/cordis.yml +++ b/examples/acp-agent/tests/fixtures/subagent/subagent-codex/cordis.yml @@ -1,4 +1,4 @@ -# Test-only composition of the public opt-in provider and foreground tool. +# Test-only composition of the public opt-in provider and one-shot task tool. # The owning e2e boots this tree but never invokes the model or Codex. - id: fixture name: './fixture.ts' @@ -17,7 +17,7 @@ config: provider: codex toolName: subagent_codex - enableRunInBackground: false + backgroundMode: one-shot maxDepth: 'provider-managed' - id: agent-spine diff --git a/examples/acp-agent/tests/fixtures/subagent/subagent-codex/driver.ts b/examples/acp-agent/tests/fixtures/subagent/subagent-codex/driver.ts index 873f5e36de..51cd5eaa6f 100644 --- a/examples/acp-agent/tests/fixtures/subagent/subagent-codex/driver.ts +++ b/examples/acp-agent/tests/fixtures/subagent/subagent-codex/driver.ts @@ -31,6 +31,10 @@ try { if (typeof properties !== 'object' || properties === null || Array.isArray(properties)) { throw new Error('subagent_codex tool has invalid parameter properties') } + const jobTools = ctx.tools.schemas() + .map(schema => schema.name) + .filter(name => name === 'job_kill' || name === 'job_list' || name === 'job_output') + .sort() process.stdout.write(`${JSON.stringify({ providers: ctx.subagents.list(), @@ -44,6 +48,7 @@ try { parameterNames: Object.keys(properties).sort(), required: tool.parameters.required, }, + jobTools, starts, })}\n`) } finally { diff --git a/examples/acp-agent/tests/fs-diff-bound.cordis.snapshot.yml b/examples/acp-agent/tests/fs-diff-bound.cordis.snapshot.yml index 4cc6ba1f3e..ac89b962eb 100644 --- a/examples/acp-agent/tests/fs-diff-bound.cordis.snapshot.yml +++ b/examples/acp-agent/tests/fs-diff-bound.cordis.snapshot.yml @@ -41,6 +41,6 @@ - id: deepseek-v4-flash contextWindow: 1000000 defaultMaxTokens: 256000 - reasoningEfforts: ['off', 'high', 'max'] + reasoningEfforts: ['off', 'low', 'high', 'max'] defaultReasoningEffort: max - id: deepseek-v4-pro diff --git a/examples/acp-agent/tests/snapshots/advanced-toolchain/system-prompt.expected.md b/examples/acp-agent/tests/snapshots/advanced-toolchain/system-prompt.expected.md index 5e266ddbc0..1d2682498e 100644 --- a/examples/acp-agent/tests/snapshots/advanced-toolchain/system-prompt.expected.md +++ b/examples/acp-agent/tests/snapshots/advanced-toolchain/system-prompt.expected.md @@ -131,7 +131,7 @@ Use subagent in the background by default. Start independent delegations togethe ## Writing code for run_code -Pass `run_code` the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped). Inside the program: +`run_code` takes two required arguments: `code` — the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped) — and `description`, a short summary of what the program does. Inside the program: - Call tools as `await tools.name(args)` — quoted access for exotic names: `tools["my-tool"](args)`. Every call resolves to the tool's typed canonical JSON value. Tool arguments must be lossless JSON. - A FAILED tool call rejects with `ToolCallError`, whose `toolName` identifies the failed tool and whose `message` is human-readable — `try/catch` it to handle and continue. diff --git a/examples/acp-agent/tests/snapshots/advanced-toolchain/tool-schemas.expected.json b/examples/acp-agent/tests/snapshots/advanced-toolchain/tool-schemas.expected.json index eba901f611..aec8cea715 100644 --- a/examples/acp-agent/tests/snapshots/advanced-toolchain/tool-schemas.expected.json +++ b/examples/acp-agent/tests/snapshots/advanced-toolchain/tool-schemas.expected.json @@ -443,7 +443,7 @@ }, { "name": "run_code", - "description": "Execute a TypeScript program against the available tools. Write the BODY of an async function (erasable syntax only; top-level `await` and `return` work) and call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.", + "description": "Execute a TypeScript program against the available tools. Takes two required arguments: `code`, the BODY of an async function (erasable syntax only; top-level `await` and `return` work), and `description`, a short summary of what the program does. Call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.", "parameters": { "type": "object", "properties": { diff --git a/examples/acp-agent/tests/snapshots/both-mode-turn/system-prompt.expected.md b/examples/acp-agent/tests/snapshots/both-mode-turn/system-prompt.expected.md index 9ed911462a..57603571d8 100644 --- a/examples/acp-agent/tests/snapshots/both-mode-turn/system-prompt.expected.md +++ b/examples/acp-agent/tests/snapshots/both-mode-turn/system-prompt.expected.md @@ -25,7 +25,7 @@ Use subagent in the background by default. Start independent delegations togethe ## Writing code for run_code -Pass `run_code` the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped). Inside the program: +`run_code` takes two required arguments: `code` — the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped) — and `description`, a short summary of what the program does. Inside the program: - Call tools as `await tools.name(args)` — quoted access for exotic names: `tools["my-tool"](args)`. Every call resolves to the tool's typed canonical JSON value. Tool arguments must be lossless JSON. - A FAILED tool call rejects with `ToolCallError`, whose `toolName` identifies the failed tool and whose `message` is human-readable — `try/catch` it to handle and continue. diff --git a/examples/acp-agent/tests/snapshots/both-mode-turn/tool-schemas.expected.json b/examples/acp-agent/tests/snapshots/both-mode-turn/tool-schemas.expected.json index ae72cfca19..c76cd2ef49 100644 --- a/examples/acp-agent/tests/snapshots/both-mode-turn/tool-schemas.expected.json +++ b/examples/acp-agent/tests/snapshots/both-mode-turn/tool-schemas.expected.json @@ -246,7 +246,7 @@ }, { "name": "run_code", - "description": "Execute a TypeScript program against the available tools. Write the BODY of an async function (erasable syntax only; top-level `await` and `return` work) and call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.", + "description": "Execute a TypeScript program against the available tools. Takes two required arguments: `code`, the BODY of an async function (erasable syntax only; top-level `await` and `return` work), and `description`, a short summary of what the program does. Call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.", "parameters": { "type": "object", "properties": { diff --git a/examples/acp-agent/tests/snapshots/code-mode-turn/system-prompt.expected.md b/examples/acp-agent/tests/snapshots/code-mode-turn/system-prompt.expected.md index e0398b0322..0659f8e2a5 100644 --- a/examples/acp-agent/tests/snapshots/code-mode-turn/system-prompt.expected.md +++ b/examples/acp-agent/tests/snapshots/code-mode-turn/system-prompt.expected.md @@ -27,7 +27,7 @@ Use subagent in the background by default. Start independent delegations togethe ## Writing code for run_code -Pass `run_code` the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped). Inside the program: +`run_code` takes two required arguments: `code` — the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped) — and `description`, a short summary of what the program does. Inside the program: - Call tools as `await tools.name(args)` — quoted access for exotic names: `tools["my-tool"](args)`. Every call resolves to the tool's typed canonical JSON value. Tool arguments must be lossless JSON. - A FAILED tool call rejects with `ToolCallError`, whose `toolName` identifies the failed tool and whose `message` is human-readable — `try/catch` it to handle and continue. diff --git a/examples/acp-agent/tests/snapshots/code-mode-turn/tool-schemas.expected.json b/examples/acp-agent/tests/snapshots/code-mode-turn/tool-schemas.expected.json index a9ee29aa7a..2a94d503e2 100644 --- a/examples/acp-agent/tests/snapshots/code-mode-turn/tool-schemas.expected.json +++ b/examples/acp-agent/tests/snapshots/code-mode-turn/tool-schemas.expected.json @@ -2,7 +2,7 @@ "initial": [ { "name": "run_code", - "description": "Execute a TypeScript program against the available tools. Write the BODY of an async function (erasable syntax only; top-level `await` and `return` work) and call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.", + "description": "Execute a TypeScript program against the available tools. Takes two required arguments: `code`, the BODY of an async function (erasable syntax only; top-level `await` and `return` work), and `description`, a short summary of what the program does. Call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.", "parameters": { "type": "object", "properties": { diff --git a/examples/acp-agent/tests/snapshots/max-tokens-continue/input.json b/examples/acp-agent/tests/snapshots/max-tokens-continue/input.json new file mode 100644 index 0000000000..ebd0c642bb --- /dev/null +++ b/examples/acp-agent/tests/snapshots/max-tokens-continue/input.json @@ -0,0 +1,8 @@ +{ + "steps": [ + { "op": "initialize" }, + { "op": "newSession" }, + { "op": "prompt", "text": "This turn is cut off at the output limit while calling a tool." }, + { "op": "prompt", "text": "Continue: summarize what happened without retrying the tool." } + ] +} diff --git a/examples/acp-agent/tests/snapshots/max-tokens-continue/session.jsonl b/examples/acp-agent/tests/snapshots/max-tokens-continue/session.jsonl new file mode 100644 index 0000000000..6e2f7a6d1c --- /dev/null +++ b/examples/acp-agent/tests/snapshots/max-tokens-continue/session.jsonl @@ -0,0 +1,33 @@ +{"type":"session","version":0,"id":"7f1c9a04-5b52-4a7e-9a63-1d2ab7c90d11","createdAt":1786348800000,"cwd":"{{cwd}}","delegationDepth":0} +{"type":"agent/inbox/spliced","seq":0,"time":1786348800001,"data":{"target":"next-turn","start":0,"inserted":[{"content":[{"type":"text","text":"This turn is cut off at the output limit while calling a tool."}],"source":{"kind":"user"},"role":"user","id":"3a6a5c9e-0f9c-4c8f-9f57-6f2f7f3d5a01"}]}} +{"type":"turn/start","seq":1,"time":1786348800002,"data":{"turn":1}} +{"type":"agent/inbox/spliced","seq":2,"time":1786348800002,"data":{"target":"next-turn","start":0,"removedCount":1,"inserted":[]}} +{"type":"step/start","seq":3,"time":1786348800003,"data":{"turn":1,"step":1}} +{"type":"user/message","seq":4,"time":1786348800004,"data":{"content":[{"type":"text","text":"This turn is cut off at the output limit while calling a tool."}],"source":{"kind":"user"},"role":"user","id":"3a6a5c9e-0f9c-4c8f-9f57-6f2f7f3d5a01"},"surfaceOp":"append"} +{"type":"user/message","seq":5,"time":1786348800005,"data":{"content":[{"type":"text","text":"Current runtime context. This snapshot supersedes earlier runtime-context snapshots.\n\nCurrent DSH file policy: danger-full-access. The DSH file sandbox does not restrict file modifications by available operations.\n\nApproval prompts are disabled in this session: actions that require approval are rejected automatically — do not request sandbox escalation (do not set `sandbox_permissions`)."}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt","form":"snapshot","sections":[{"name":"sandbox:policy","text":"Current DSH file policy: danger-full-access. The DSH file sandbox does not restrict file modifications by available operations."},{"name":"approval:policy","text":"Approval prompts are disabled in this session: actions that require approval are rejected automatically — do not request sandbox escalation (do not set `sandbox_permissions`)."}]},"role":"user","id":"5b7f2d1c-9c44-4c58-8a3e-2f6f8b9d4c02"},"surfaceOp":"append"} +{"type":"session/title","seq":6,"time":1786348800005,"data":{"title":"This turn is cut off","messageSeqs":[4],"source":{"kind":"fallback"}}} +{"type":"request/header","seq":7,"time":1786348800006,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"{{system}}","tools":"{{tools}}"},"reason":"initial"}} +{"type":"request/context","seq":8,"time":1786348800006,"data":{"provider":"deepseek-official","model":"deepseek-v4-flash"}} +{"type":"assistant/chunk","seq":9,"time":1786348800010,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"text"}}} +{"type":"assistant/chunk","seq":10,"time":1786348800011,"data":{"turn":1,"step":1,"chunk":{"type":"text-delta","index":0,"text":"Starting the write now."}}} +{"type":"assistant/chunk","seq":11,"time":1786348800012,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"Starting the write now."}}}} +{"type":"assistant/chunk","seq":12,"time":1786348800013,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":1,"blockType":"tool-call"}}} +{"type":"assistant/chunk","seq":13,"time":1786348800014,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":1,"id":"call-cut","name":"bash","argumentsDelta":"{\"command\":\"echo demo > "}}} +{"type":"assistant/chunk","seq":14,"time":1786348800015,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":2864,"outputTokens":12}}}} +{"type":"assistant/chunk","seq":15,"time":1786348800016,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"max-tokens"},"replayState":{"response":{"kind":"pi-ai","version":2,"api":"openai-completions","provider":"deepseek-official","model":"deepseek-v4-flash","stopReason":"length"},"blocks":[{"type":"text"},{"type":"tool-call"}]}}}} +{"type":"assistant/message","seq":16,"time":1786348800016,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"text","text":"Starting the write now."}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash","replayState":{"response":{"kind":"pi-ai","version":2,"api":"openai-completions","provider":"deepseek-official","model":"deepseek-v4-flash","stopReason":"length"},"blocks":[{"type":"text"}]}},"id":"9d5f7c2a-1e63-4d6b-8f14-7a2c5e9b3d03"},"usage":{"inputTokens":2864,"outputTokens":12}},"sourceEventSeqs":[9,10,11,12,13,14,15],"surfaceOp":"append"} +{"type":"step/end","seq":17,"time":1786348800016,"data":{"turn":1,"step":1}} +{"type":"turn/end","seq":18,"time":1786348800016,"data":{"turn":1,"reason":{"kind":"max-tokens"}}} +{"type":"agent/inbox/spliced","seq":19,"time":1786348800020,"data":{"target":"next-turn","start":0,"inserted":[{"content":[{"type":"text","text":"Continue: summarize what happened without retrying the tool."}],"source":{"kind":"user"},"role":"user","id":"1c8e6b4f-3d27-4a91-b5c8-9e4f7a2d6c04"}]}} +{"type":"turn/start","seq":20,"time":1786348800021,"data":{"turn":2}} +{"type":"agent/inbox/spliced","seq":21,"time":1786348800021,"data":{"target":"next-turn","start":0,"removedCount":1,"inserted":[]}} +{"type":"step/start","seq":22,"time":1786348800022,"data":{"turn":2,"step":1}} +{"type":"user/message","seq":23,"time":1786348800023,"data":{"content":[{"type":"text","text":"Continue: summarize what happened without retrying the tool."}],"source":{"kind":"user"},"role":"user","id":"1c8e6b4f-3d27-4a91-b5c8-9e4f7a2d6c04"},"surfaceOp":"append"} +{"type":"assistant/chunk","seq":24,"time":1786348800030,"data":{"turn":2,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"text"}}} +{"type":"assistant/chunk","seq":25,"time":1786348800031,"data":{"turn":2,"step":1,"chunk":{"type":"text-delta","index":0,"text":"The previous reply hit the output limit while a tool call was still streaming, so that call was discarded and no tool ran."}}} +{"type":"assistant/chunk","seq":26,"time":1786348800032,"data":{"turn":2,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"The previous reply hit the output limit while a tool call was still streaming, so that call was discarded and no tool ran."}}}} +{"type":"assistant/chunk","seq":27,"time":1786348800033,"data":{"turn":2,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":64,"outputTokens":28}}}} +{"type":"assistant/chunk","seq":28,"time":1786348800034,"data":{"turn":2,"step":1,"chunk":{"type":"finish","reason":{"kind":"stop"}}}} +{"type":"assistant/message","seq":29,"time":1786348800034,"data":{"turn":2,"step":1,"message":{"role":"assistant","content":[{"type":"text","text":"The previous reply hit the output limit while a tool call was still streaming, so that call was discarded and no tool ran."}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"7e3d9f6b-5a18-4c72-9b4e-1f8c6d2a7e05"},"usage":{"inputTokens":64,"outputTokens":28}},"sourceEventSeqs":[24,25,26,27,28],"surfaceOp":"append"} +{"type":"step/end","seq":30,"time":1786348800034,"data":{"turn":2,"step":1}} +{"type":"turn/end","seq":31,"time":1786348800034,"data":{"turn":2,"reason":{"kind":"completed"}}} diff --git a/examples/acp-agent/tests/snapshots/max-tokens-continue/stdout.expected.jsonl b/examples/acp-agent/tests/snapshots/max-tokens-continue/stdout.expected.jsonl new file mode 100644 index 0000000000..bf555a8d1c --- /dev/null +++ b/examples/acp-agent/tests/snapshots/max-tokens-continue/stdout.expected.jsonl @@ -0,0 +1,6 @@ +{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,"agentInfo":{"name":"deepseek-harness-acp","version":"0.0.1"},"agentCapabilities":{"promptCapabilities":{"image":false,"audio":false,"embeddedContext":false}},"authMethods":[]}} +{"jsonrpc":"2.0","id":2,"result":{"sessionId":"{{sessionId}}"}} +{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"Starting the write now."}}}} +{"jsonrpc":"2.0","id":3,"result":{"stopReason":"end_turn"}} +{"jsonrpc":"2.0","method":"session/update","params":{"sessionId":"{{sessionId}}","update":{"sessionUpdate":"agent_message_chunk","content":{"type":"text","text":"The previous reply hit the output limit while a tool call was still streaming, so that call was discarded and no tool ran."}}}} +{"jsonrpc":"2.0","id":4,"result":{"stopReason":"end_turn"}} diff --git a/examples/acp-agent/tests/snapshots/product-subagent-both/tool-schemas.expected.json b/examples/acp-agent/tests/snapshots/product-subagent-both/tool-schemas.expected.json index 5c65ede244..e668036737 100644 --- a/examples/acp-agent/tests/snapshots/product-subagent-both/tool-schemas.expected.json +++ b/examples/acp-agent/tests/snapshots/product-subagent-both/tool-schemas.expected.json @@ -308,7 +308,7 @@ }, { "name": "subagent_claude_code", - "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the subagent and returns its result.", + "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the result by default. Set `run_in_background: true` to return a job id; collect with `job_output` and stop with `job_kill`.", "parameters": { "type": "object", "properties": { @@ -319,6 +319,10 @@ "prompt": { "type": "string", "description": "The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs." + }, + "run_in_background": { + "type": "boolean", + "description": "Whether to run as a background job and return its id. Defaults to false; collect with job_output or stop with job_kill." } }, "required": [ @@ -329,7 +333,7 @@ }, { "name": "subagent_codex", - "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the subagent and returns its result.", + "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the result by default. Set `run_in_background: true` to return a job id; collect with `job_output` and stop with `job_kill`.", "parameters": { "type": "object", "properties": { @@ -340,6 +344,10 @@ "prompt": { "type": "string", "description": "The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs." + }, + "run_in_background": { + "type": "boolean", + "description": "Whether to run as a background job and return its id. Defaults to false; collect with job_output or stop with job_kill." } }, "required": [ diff --git a/examples/acp-agent/tests/snapshots/product-subagent-codex/tool-schemas.expected.json b/examples/acp-agent/tests/snapshots/product-subagent-codex/tool-schemas.expected.json index 4310ffd76e..29a85eb6b3 100644 --- a/examples/acp-agent/tests/snapshots/product-subagent-codex/tool-schemas.expected.json +++ b/examples/acp-agent/tests/snapshots/product-subagent-codex/tool-schemas.expected.json @@ -308,7 +308,7 @@ }, { "name": "subagent_codex", - "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the subagent and returns its result.", + "description": "Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This call waits for the result by default. Set `run_in_background: true` to return a job id; collect with `job_output` and stop with `job_kill`.", "parameters": { "type": "object", "properties": { @@ -319,6 +319,10 @@ "prompt": { "type": "string", "description": "The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs." + }, + "run_in_background": { + "type": "boolean", + "description": "Whether to run as a background job and return its id. Defaults to false; collect with job_output or stop with job_kill." } }, "required": [ diff --git a/examples/headless-agent/cordis.yml b/examples/headless-agent/cordis.yml index bb75f55b98..6dcde61110 100644 --- a/examples/headless-agent/cordis.yml +++ b/examples/headless-agent/cordis.yml @@ -120,7 +120,8 @@ # Fork stays one-shot because a continuable child's `report` tool and prompt # section precede the inherited history a fork reuses; `run_in_background` is off -# because this example mounts no task service. See .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md. +# as an explicit foreground-only choice even though agent-spine-demo mounts the +# generic Job runtime. See .agents/notes/implemented/architecture/2026-08-10-fork-children-stay-one-shot.md. - id: tool-subagent-fork name: '@deepseek-ai/dsh-tool-subagent' config: diff --git a/examples/headless-agent/tests/fixtures/deepseek-defaults.cordis.yml b/examples/headless-agent/tests/fixtures/deepseek-defaults.cordis.yml index fab8ae1b7b..7f1c0b3e9e 100644 --- a/examples/headless-agent/tests/fixtures/deepseek-defaults.cordis.yml +++ b/examples/headless-agent/tests/fixtures/deepseek-defaults.cordis.yml @@ -6,7 +6,8 @@ - id: llm-deepseek config: baseURL: !!js process.env.DSH_SNAPSHOT_BASE_URL - thinking: disabled + thinking: enabled + reasoningEffort: low streamIdleTimeoutMs: 150 - id: agent-spine config: diff --git a/examples/headless-agent/tests/headless.snapshot.ts b/examples/headless-agent/tests/headless.snapshot.ts index 4f2eb28d40..d22a48a7ab 100644 --- a/examples/headless-agent/tests/headless.snapshot.ts +++ b/examples/headless-agent/tests/headless.snapshot.ts @@ -541,6 +541,7 @@ describe('headless stream-json snapshots', () => { expect(result.stderr).toBe('') expect(server.requests).toHaveLength(1) expect(server.requests[0]?.max_tokens).toBe(256_000) + expect(server.requests[0]?.reasoning_effort).toBe('low') const header = (parseJsonl(result.stdout) .map(record => record.event) .find((event): event is JsonObject => ( @@ -555,7 +556,7 @@ describe('headless stream-json snapshots', () => { "maxTokens": 256000, "model": "deepseek-v4-flash", "provider": "deepseek-official", - "reasoningEffort": "off", + "reasoningEffort": "low", } `) expect(header?.adapterDefaults).toEqual({ diff --git a/examples/headless-agent/tests/snapshots/advanced-toolchain/session.1.jsonl b/examples/headless-agent/tests/snapshots/advanced-toolchain/session.1.jsonl index dfe9a23a15..8fb937dee2 100644 --- a/examples/headless-agent/tests/snapshots/advanced-toolchain/session.1.jsonl +++ b/examples/headless-agent/tests/snapshots/advanced-toolchain/session.1.jsonl @@ -1,19 +1,19 @@ {"type":"session","version":0,"id":"22222222-2222-4222-8222-222222222222","createdAt":1783950001000,"cwd":"{{cwd}}","parentSession":"11111111-1111-4111-8111-111111111111","origin":"subagent","delegationDepth":1} -{"type":"agent/inbox/spliced","seq":0,"time":1785498583877,"data":{"target":"next-turn","start":0,"inserted":[{"content":[{"type":"text","text":"Reply with exactly DIRECT_CHILD_OK and nothing else."}],"source":{"kind":"user"},"role":"user","id":"77f5992c-b7ed-4453-96de-83c51b1e8041"}]}} +{"type":"agent/inbox/spliced","seq":0,"time":1785498583877,"data":{"target":"next-turn","start":0,"inserted":[{"content":[{"type":"text","text":"Reply with exactly DIRECT_CHILD_OK and nothing else."}],"source":{"kind":"user"},"role":"user","id":"c66e310e-2597-4d01-85c8-2d70a9d831c0"}]}} {"type":"turn/start","seq":1,"time":1785821454445,"data":{"turn":1}} {"type":"agent/inbox/spliced","seq":2,"time":1785821454445,"data":{"target":"next-turn","start":0,"removedCount":1,"inserted":[]}} {"type":"subagent/descriptor","seq":3,"time":1785821454466,"data":{"version":2,"mode":"one-shot","provider":"spawn","label":"Check direct child"}} {"type":"step/start","seq":4,"time":1785730501506,"data":{"turn":1,"step":1}} -{"type":"user/message","seq":5,"time":1785730501506,"data":{"content":[{"type":"text","text":"Reply with exactly DIRECT_CHILD_OK and nothing else."}],"source":{"kind":"user"},"role":"user","id":"77f5992c-b7ed-4453-96de-83c51b1e8041"},"surfaceOp":"append"} -{"type":"user/message","seq":6,"time":1786373992181,"data":{"content":[{"type":"text","text":"Current runtime context. This snapshot supersedes earlier runtime-context snapshots.\n\nYou are a delegated subagent: your permission scope was fixed when you were started and cannot be widened from inside this session — operations that require approval are rejected automatically. When the task needs access beyond that scope, do not retry the denied operation; state the limitation in your reply so the delegating agent can handle it."}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt","form":"snapshot","sections":[{"name":"subagent:delegation","text":"You are a delegated subagent: your permission scope was fixed when you were started and cannot be widened from inside this session — operations that require approval are rejected automatically. When the task needs access beyond that scope, do not retry the denied operation; state the limitation in your reply so the delegating agent can handle it."}]},"role":"user","id":"16344357-da11-40dc-a87f-b390a2c9686d"},"surfaceOp":"append"} +{"type":"user/message","seq":5,"time":1785730501506,"data":{"content":[{"type":"text","text":"Reply with exactly DIRECT_CHILD_OK and nothing else."}],"source":{"kind":"user"},"role":"user","id":"c66e310e-2597-4d01-85c8-2d70a9d831c0"},"surfaceOp":"append"} +{"type":"user/message","seq":6,"time":1786373992181,"data":{"content":[{"type":"text","text":"Current runtime context. This snapshot supersedes earlier runtime-context snapshots.\n\nYou are a delegated subagent: your permission scope was fixed when you were started and cannot be widened from inside this session — operations that require approval are rejected automatically. When the task needs access beyond that scope, do not retry the denied operation; state the limitation in your reply so the delegating agent can handle it."}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt","form":"snapshot","sections":[{"name":"subagent:delegation","text":"You are a delegated subagent: your permission scope was fixed when you were started and cannot be widened from inside this session — operations that require approval are rejected automatically. When the task needs access beyond that scope, do not retry the denied operation; state the limitation in your reply so the delegating agent can handle it."}]},"role":"user","id":"fd0a0587-8df4-46b2-809a-317346a4c0f4"},"surfaceOp":"append"} {"type":"session/title","seq":7,"time":1786373992181,"data":{"title":"Reply with exactly DIRECT_CHILD_OK and","messageSeqs":[5],"source":{"kind":"fallback"}}} -{"type":"request/header","seq":8,"time":1785498583897,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"You are an AI agent powered by DeepSeek Harness.\n\nYou are headless-agent, a coding assistant powered by the deepseek-v4-flash model. Your working directory is {{cwd}}.\n\nVerify your work by running the code or tests. Keep answers brief and factual.\n\n\nUse the read tool — not shell commands like cat — to inspect text files. Results include line numbers. Use offset and limit to continue reading large files.\n\nUse the write tool to create files or completely replace file contents. Existing files are overwritten, so read an existing file first (the default fs-observation-policy requires it) and prefer edit for targeted changes.\n\nUse the edit tool for targeted changes to existing UTF-8 text files. It replaces literal old_string with new_string; by default old_string must appear exactly once. If old_string appears multiple times, provide a more specific old_string or set replace_all to true. Read the file first (the default fs-observation-policy requires it), unless you just created or edited it in this session.\n\nCheck the [exit code: N] marker on every bash result; investigate failures before moving on.\n\nTrack every background job id you start. You are notified in-session when a job finishes — do not busy-poll or sleep on one; keep working on independent steps and do not duplicate a running job's work. Before giving a final answer, collect every still-relevant job with job_output (set wait: true only when you are genuinely blocked on it), and job_kill jobs that stopped mattering.\n\nUse the workflow tool ONLY when the user explicitly asks for a workflow or for large multi-agent orchestration: you write a JavaScript script (the tool description documents the exact format) that fans work out across many subagents with phases and structured results. For one or two delegations, prefer plain subagent calls.\n\n# Dynamic Cordis Plugins\n\nDynamic Cordis plugins temporarily extend the current DSH process. A Plugin uses apply(ctx) to consume Services, listen to Events, provide Services, register model Tools, or register browser UI in Slots.\n\n- Plugin and Package definitions exist only in the current process. define itself does not modify repository source, configuration, or disk, and definitions do not survive a process restart.\n- The restricted execution environment prevents accidental misuse; it is not a security boundary for malicious code. Services obtained by dynamic code connect to the real runtime.\n\n## Make the user-facing plan clear first\n\n- Dynamic Cordis Plugins are one available implementation mechanism, not the default for every request. Consider whether one could help only when the user intends to design or create something, or when a temporary interface could materially aid the current work. The presence of these instructions or Tools, and discussion of Cordis itself, do not make a request a dynamic-Plugin task.\n- When Cordis is a plausible fit, infer the intended work target and lifetime from the request and conversation. Use it only when the outcome belongs to the current running harness and should be delivered as a temporary runtime extension. If that distinction is materially ambiguous, ask at most one concise question about the intended result or lifetime. Otherwise proceed with the matching workflow; do not require the user to know or choose Cordis as an implementation mechanism.\n- Once a dynamic Plugin is appropriate, decide whether the task creates a new Plugin or modifies the Plugin named by the user with @pluginId. Proceed directly when the goal is clear; do not ask for repeated confirmation.\n- Choose Host, Client, or both from the requested outcome. Do not propose a Client/browser UI when the task does not need visible page behavior, and do not avoid Client when the requested outcome is visual, interactive, or depends on page state. Host versus Client is an implementation choice; do not make the user choose it.\n- When a design direction or a potentially useful interface would materially affect the result, ask at most one concise outcome or creative-preference question and offer a few candidate directions. Otherwise proceed directly; do not conduct a multi-round interview or a complex questionnaire.\n- cordis_define only defines and presents code; it does not run it. After definition, explain the pluginId and packageId returned by the Host and whether the next step is a run or update.\n- cordis_run may require user approval. When it returns awaiting-approval, explain that the user must allow or reject it in the UI. Do not wait, retry, or claim that it is running.\n- When it returns starting, explain that the request has entered the asynchronous flow and the Client is still activating. starting does not mean success. Wait for the system to report the final result through steering context.\n- Do not request approval again after the user rejects it. After a technical failure, fix the same Plugin from its diagnostics; do not silently create a replacement Plugin.\n\n## Recommended workflow and Tools\n\nBefore creating, modifying, or repairing a Plugin, load the cordis-plugin-development Skill. The Skill provides requirement navigation, capability composition, complete examples, and troubleshooting. Treat Inspect Provider results as the source of truth for exact APIs.\n\n1. cordis_inspect_list: discover the current Host and Client Providers and their read-only query methods.\n2. cordis_inspect_query: use the returned platform, provider, method, and schema to query exact Service, Event, Builtin, Slot, Theme token, or Tool information.\n3. cordis_inspect_self: inspect the current Session's Plugins, Packages, version pointers, source, and diagnostics. Source is returned only when both pluginId and packageId are specified.\n4. cordis_define: create the first Package for a new Plugin or append an immutable Package to an existing Plugin. It defines code but does not run it.\n5. cordis_run: activate an exact Package. Use run for the first activation, restarting current, or rollback; use update to switch versions.\n6. cordis_stop: remove the current Run and pending approval request while retaining definitions, grants, and version pointers.\n7. cordis_undefine: permanently stop and delete a Plugin and all of its Packages. Use it only after confirming that the user no longer needs them.\n\n- Inspect and Catalog data only confirm capabilities, names, signatures, types, and registration protocols before code is written; they do not replace business APIs.\n- Query Service.listService and Event.listEvents without input to choose from their compact signature directories, then query the exact service or event before using it. Exact queries return the structured contract and only its referenced types.\n- At runtime, a Plugin must call real Services or listen to real Events. Do not cache, display, or depend on Inspect results as business data.\n\n## Identity, versions, and approval\n\n- pluginId identifies a Plugin that can be modified over time. For a new Plugin, submit only a semantic idPrefix of 3–6 lowercase English letters; the Host allocates the final ID.\n- packageId identifies one immutable Host/Client source version under a Plugin. To change code, define a new Package; never overwrite an old version.\n- pluginRunId identifies one activation attempt and connects its approval, Host/Client loading, private RPC, Run card, and errors.\n- currentPackageId is the most recent fully successful Package. Stopping, starting an update, or failing an update does not clear it.\n- nextPackageId is the target awaiting approval, being attempted, awaiting Client activation, or most recently failed.\n- A single check mark authorizes only the current Package; double check marks authorize future versions of the same Plugin. A grant remains in effect after a technical failure.\n- An update stops the old Run before starting the target Package. Failure does not automatically restart the old version; retry next with update or roll back to current with run.\n\nWhen the user enters @pluginId, the system injects identity, the default base Package, version pointers, and runtime status, but not source code:\n\n1. Call cordis_inspect_self(pluginId, packageId) to read the target source.\n2. Use cordis_define in existing mode to append a Package to the same Plugin.\n3. Call cordis_run in run or update mode according to the version relationship.\n\nNever silently create another Plugin for @pluginId. If the reference is unavailable because it was removed, belongs to another Session, or was lost on process restart, tell the user directly.\n\n## High-frequency errors that must be avoided\n\n### Services: ctx.get and inject\n\n- Read an optional Service with ctx.get('serviceName') by default and handle undefined.\n- Declare inject: ['serviceName'] on the returned Plugin object only when the Service is a hard dependency and the Plugin must enter waiting until Cordis reactivates it after the Service appears.\n- Read ctx.serviceName only after declaring that Service in inject. Never access an undeclared Service as a ctx property.\n\n```js\nreturn {\n inject: ['requiredService'],\n apply(ctx) {\n ctx.requiredService.someMethod()\n const optionalService = ctx.get('optionalService')\n if (optionalService !== undefined) optionalService.someMethod()\n },\n}\n```\n\n### Code: use plain JavaScript only\n\n- Host and Client code is not transformed by TypeScript, JSX, or a bundler.\n- Do not use TypeScript types, as, decorators, import, require, or JSX.\n- Client React code must use React.createElement(...); never write .\n- Do not assume that process, Buffer, window, document, fetch, native timers, or any other global is available. Query the corresponding platform's Builtins and Services first.\n\n### Data: do not serialize live data\n\n- Services, Events, Slots, Sessions, and their derived Cordis/DSH objects are internal live data, not ordinary JSON that can be dumped.\n- Do not apply JSON.stringify, structuredClone, recursive enumeration, full copying, or whole-object display to live data.\n- Read only the leaf fields required by the task, then construct the smallest owned data object without Host references.\n\n### Lifecycle: every side effect must be reversible\n\n- Services, Events, Tools, handlers, timers, Slots, styles, and theme overrides must all belong to the current Fiber.\n- Use ctx.effect(), ctx.on(), or official APIs that return a disposer so stop, update, or undefine removes every side effect.\n- The cordis-plugin-development Skill contains complete timer, Waterfall, Slot, theme, Tool, RPC, and React examples and troubleshooting guidance.\n\n## Host and Client\n\n- Host runs in the DSH Node.js process and is appropriate for files, networking, commands, Agent/Session access, Host Events, Services, model Tools, and JSON methods callable by the Client.\n- Client runs in the browser page and is appropriate for themes, layout, current page state, Tool cards, and Slot UI.\n- Host and Client communicate through Package-private JSON methods: Host uses harness.handle(method, handler), and Client uses host.call(method, args). The direction is Client→Host, and only lossless JSON may cross it.\n- Client UI must be registered in a queried Slot; apply() cannot directly return a React Element. Query Slots.listSubTree without root to choose from the compact purpose/topology tree, then query the exact root for its full registration contract and props before writing code.\n- See the Skill and Inspect Providers for Run-specific panels and exact Slot registration patterns.\n\n## Asynchronous results and recovery\n\n- Do not wait inside a Tool for approval or browser work that can happen only after the current turn ends.\n- Asynchronous success, rejection, and runtime errors update Run state and notify you through steering context.\n- After a technical failure, use cordis_inspect_self to read the exact Package source and its message/stack. Define a corrected Package under the same Plugin and retry autonomously.\n- Use the cordis-plugin-development Skill for other failure causes, repair procedures, and complete extension patterns.\n\nUse the ralph tool ONLY when the direct human explicitly asks for a Ralph loop or fresh-agent iterative execution. Each Ralph round starts a fresh child with no conversation seed and uses the shared workspace as durable memory. Completion and blockers are worker reports, not independent evaluation. Use same-session goal tools for ordinary long-running objectives, and plain subagents or workflows for bounded delegation and fan-out.\n\nUse subagent in the background by default. Start independent delegations together in one assistant message and continue useful work while they run. Set `run_in_background: false` only when your next action depends on that subagent's result. When a background run settles, the runtime sends you a notice containing its outcome and any final assistant message.\n\n## Writing code for run_code\n\nPass `run_code` the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped). Inside the program:\n\n- Call tools as `await tools.name(args)` — quoted access for exotic names: `tools[\"my-tool\"](args)`. Every call resolves to the tool's typed canonical JSON value. Tool arguments must be lossless JSON.\n- A FAILED tool call rejects with `ToolCallError`, whose `toolName` identifies the failed tool and whose `message` is human-readable — `try/catch` it to handle and continue.\n- Independent read-only calls MAY overlap under `Promise.all` (safe calls run concurrently; mutating calls run alone, in submission order). Sequence dependent work with `await`.\n- Emit results with `return` and/or `console.log(...)`. ONLY what you print or return comes back to you — intermediate tool results never enter the conversation, so extract just what you need.\n\nThe available tools:\n\n```ts\ntype JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }\n\ninterface ToolArgsMap {\n /** Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`. */\n bash: {\n /** The bash command to execute. */\n command: string;\n /** Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\". */\n description: string;\n /** Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry. */\n timeoutMs?: number;\n /** Working directory for this command. Defaults to the session workspace; a relative path is resolved against it. */\n workdir?: string;\n /** Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies. */\n run_in_background?: boolean;\n } & Record;\n /** Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs. */\n cordis_define: {\n plugin: {\n kind: \"new\";\n /** Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix. */\n idPrefix: string;\n } | {\n kind: \"existing\";\n /** Exact ID of an existing Plugin; the new Package is appended to that instance. */\n pluginId: string;\n };\n /** Short, readable Package name. */\n name: string;\n /** One-sentence, user-facing description of the Package purpose. */\n purpose: string;\n code: {\n /** Plain JavaScript function body that returns the Host-half Cordis Plugin. */\n host?: string;\n /** Plain JavaScript function body that returns the browser Client-half Cordis Plugin. */\n client?: string;\n };\n } & Record;\n /** List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call. */\n cordis_inspect_list: Record;\n /** Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props. */\n cordis_inspect_query: {\n /** Runtime platform that owns the Provider. */\n platform: \"host\" | \"client\";\n /** Exact Provider ID returned by cordis_inspect_list. */\n provider: string;\n /** Exact method name declared by the Provider manifest. */\n method: string;\n /** Optional query input; it must satisfy the method input schema. */\n input?: JsonValue;\n } & Record;\n /** Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers. */\n cordis_inspect_self: {\n /** Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin. */\n pluginId?: string;\n /** Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned. */\n packageId?: string;\n } & Record;\n /** Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it. */\n cordis_run: {\n /** Stable Plugin ID returned by cordis_define. */\n pluginId: string;\n /** Exact immutable Package ID to activate under that Plugin. */\n packageId: string;\n /** Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package. */\n mode: \"run\" | \"update\";\n } & Record;\n /** Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal. */\n cordis_stop: {\n /** Stable dynamic Plugin ID to stop. */\n pluginId: string;\n } & Record;\n /** Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead. */\n cordis_undefine: {\n /** Stable dynamic Plugin ID to remove permanently. */\n pluginId: string;\n } & Record;\n /** Edit an existing UTF-8 text file by replacing literal text. */\n edit: {\n /** Path to edit, resolved by the filesystem backend. */\n file_path: string;\n /** Literal text to replace. Must match exactly. */\n old_string: string;\n /** Literal replacement text. Use an empty string to delete the match. */\n new_string: string;\n /** Replace all matches. Defaults to false; when false, old_string must appear exactly once. */\n replace_all?: boolean;\n } & Record;\n /** Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op. */\n interrupt_agent: {\n /** The agent id of the running agent to interrupt. */\n agent_id: string;\n } & Record;\n /** Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops. */\n job_kill: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Optional short reason, recorded in the log and forwarded to the job. */\n reason?: string;\n } & Record;\n /** List your background jobs (running and finished) with their ids, kinds, and statuses. */\n job_list: Record;\n /** Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap. */\n job_output: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive. */\n wait?: boolean;\n /** Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum. */\n timeout_ms?: number;\n } & Record;\n /** Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools. */\n ralph: {\n /** The immutable completion objective for every fresh Ralph round. */\n objective: string;\n /** Optional positive safe-integer round cap, bounded by the deployment ceiling. */\n maxRounds?: number;\n } & Record;\n /** Read a UTF-8 text file and return line-numbered content. */\n read: {\n /** Path to read, resolved by the filesystem backend. */\n file_path: string;\n /** 1-based first line to return. Defaults to 1. */\n offset?: number;\n /** Maximum number of lines to return. Defaults to 2000. */\n limit?: number;\n } & Record;\n /** Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered. */\n send_message: {\n /** The subagent id returned when the background subagent was started. */\n subagent_id: string;\n /** The message to deliver to the subagent. */\n message: string;\n } & Record;\n /** Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill. */\n skill: {\n /** The exact skill name from the available skills list. */\n name: string;\n } & Record;\n /** Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result. */\n subagent: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs. */\n prompt: string;\n /** Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it. */\n run_in_background?: boolean;\n } & Record;\n /** Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result. */\n subagent_fork: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new. */\n prompt: string;\n } & Record;\n /** Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished). */\n todo_write: {\n /** The COMPLETE task list, replacing any previous list. */\n todos: ({\n /** What the task is — a short imperative line. */\n content: string;\n /** pending (not started) | in_progress (now) | completed (done). */\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n } & Record;\n /** Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn. The workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result. Script-body hooks: - `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly. - `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages. - `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`. - `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim. Misused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`. Constraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes. */\n workflow: {\n /** The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `). */\n script: string;\n /** The workflow identity block (plain JSON — never code). */\n meta: {\n /** Short kebab-case workflow name. */\n name: string;\n /** One-line description of what the workflow does. */\n description: string;\n /** Optional guidance on when this workflow applies. */\n whenToUse?: string;\n /** Optional phase declarations matched by phase() calls. */\n phases?: ({\n /** The phase title phase() calls match by exact string. */\n title: string;\n /** Optional one-line description of the phase. */\n detail?: string;\n /** Optional provider override this phase is expected to use. */\n provider?: string;\n /** Optional model override this phase is expected to use. */\n model?: string;\n } & Record)[];\n } & Record;\n /** Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}). */\n args?: Record;\n } & Record;\n /** Create or fully replace a UTF-8 text file. */\n write: {\n /** Path to write, resolved by the filesystem backend. */\n file_path: string;\n /** Full UTF-8 text content to write. */\n content: string;\n } & Record;\n}\n\ninterface ToolOutputMap {\n bash: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"foreground\";\n exitCode: number | null;\n signal: string | null;\n timedOut: boolean;\n aborted: boolean;\n timeoutMs: number;\n stdout: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n stderr: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n sandbox?: {\n mode: string;\n denied: boolean;\n enforcement?: string;\n runnerFailed?: boolean;\n };\n };\n cordis_define: {\n pluginId: string;\n packageId: string;\n name: string;\n purpose: string;\n hasHostHalf: boolean;\n hasClientHalf: boolean;\n };\n cordis_inspect_list: JsonValue;\n cordis_inspect_query: JsonValue;\n cordis_inspect_self: JsonValue;\n cordis_run: JsonValue;\n cordis_stop: {\n pluginId: string;\n };\n cordis_undefine: {\n pluginId: string;\n wasRunning: boolean;\n };\n edit: {\n path: string;\n before: string;\n after: string;\n };\n interrupt_agent: {\n accepted: boolean;\n };\n job_kill: {\n outcome: \"cancellation-requested\" | \"already-finished\";\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n job_list: ({\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n })[];\n job_output: {\n text: string;\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n ralph: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n read: {\n path: string;\n offset: number;\n lines: {\n number: number;\n text: string;\n }[];\n totalLines: number;\n };\n send_message: {\n messageId: string;\n };\n skill: {\n name: string;\n provider: string;\n resourceBase?: {\n kind: \"directory\";\n path: string;\n } | {\n kind: \"url\";\n url: string;\n } | {\n kind: \"opaque\";\n description: string;\n };\n content: string;\n };\n subagent: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n subagent_fork: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n todo_write: {\n todos: ({\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n counts: {\n pending: number;\n inProgress: number;\n completed: number;\n };\n };\n workflow: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n write: {\n path: string;\n operation: \"create\" | \"update\";\n before: string | null;\n after: string;\n };\n}\n\ntype ToolName = keyof ToolOutputMap\n\ndeclare class ToolCallError extends Error {\n readonly name: \"ToolCallError\";\n readonly toolName: ToolName;\n}\n\ndeclare const tools: {\n [K in ToolName]: (args: ToolArgsMap[K]) => Promise;\n}\n```","tools":[{"name":"bash","description":"Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`.","parameters":{"type":"object","properties":{"command":{"type":"string","description":"The bash command to execute."},"description":{"type":"string","description":"Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\"."},"timeoutMs":{"type":"number","description":"Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."},"workdir":{"type":"string","description":"Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."},"run_in_background":{"type":"boolean","description":"Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."}},"required":["command","description"]}},{"name":"cordis_define","description":"Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs.","parameters":{"type":"object","properties":{"plugin":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"new"},"idPrefix":{"type":"string","description":"Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix."}},"required":["kind","idPrefix"]},{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"existing"},"pluginId":{"type":"string","description":"Exact ID of an existing Plugin; the new Package is appended to that instance."}},"required":["kind","pluginId"]}]},"name":{"type":"string","description":"Short, readable Package name."},"purpose":{"type":"string","description":"One-sentence, user-facing description of the Package purpose."},"code":{"type":"object","additionalProperties":false,"properties":{"host":{"type":"string","description":"Plain JavaScript function body that returns the Host-half Cordis Plugin."},"client":{"type":"string","description":"Plain JavaScript function body that returns the browser Client-half Cordis Plugin."}}}},"required":["plugin","name","purpose","code"]}},{"name":"cordis_inspect_list","description":"List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call.","parameters":{"type":"object","properties":{}}},{"name":"cordis_inspect_query","description":"Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props.","parameters":{"type":"object","properties":{"platform":{"type":"string","description":"Runtime platform that owns the Provider.","enum":["host","client"]},"provider":{"type":"string","description":"Exact Provider ID returned by cordis_inspect_list."},"method":{"type":"string","description":"Exact method name declared by the Provider manifest."},"input":{"description":"Optional query input; it must satisfy the method input schema."}},"required":["platform","provider","method"]}},{"name":"cordis_inspect_self","description":"Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin."},"packageId":{"type":"string","description":"Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned."}}}},{"name":"cordis_run","description":"Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define."},"packageId":{"type":"string","description":"Exact immutable Package ID to activate under that Plugin."},"mode":{"type":"string","description":"Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package.","enum":["run","update"]}},"required":["pluginId","packageId","mode"]}},{"name":"cordis_stop","description":"Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to stop."}},"required":["pluginId"]}},{"name":"cordis_undefine","description":"Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to remove permanently."}},"required":["pluginId"]}},{"name":"edit","description":"Edit an existing UTF-8 text file by replacing literal text.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to edit, resolved by the filesystem backend."},"old_string":{"type":"string","description":"Literal text to replace. Must match exactly."},"new_string":{"type":"string","description":"Literal replacement text. Use an empty string to delete the match."},"replace_all":{"type":"boolean","description":"Replace all matches. Defaults to false; when false, old_string must appear exactly once."}},"required":["file_path","old_string","new_string"]}},{"name":"interrupt_agent","description":"Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op.","parameters":{"type":"object","properties":{"agent_id":{"type":"string","description":"The agent id of the running agent to interrupt."}},"required":["agent_id"]}},{"name":"job_kill","description":"Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"reason":{"type":"string","description":"Optional short reason, recorded in the log and forwarded to the job."}},"required":["job_id"]}},{"name":"job_list","description":"List your background jobs (running and finished) with their ids, kinds, and statuses.","parameters":{"type":"object","properties":{}}},{"name":"job_output","description":"Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"wait":{"type":"boolean","description":"Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive."},"timeout_ms":{"type":"number","description":"Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum."}},"required":["job_id"]}},{"name":"ralph","description":"Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools.","parameters":{"type":"object","properties":{"objective":{"type":"string","description":"The immutable completion objective for every fresh Ralph round."},"maxRounds":{"type":"number","description":"Optional positive safe-integer round cap, bounded by the deployment ceiling."}},"required":["objective"]}},{"name":"read","description":"Read a UTF-8 text file and return line-numbered content.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to read, resolved by the filesystem backend."},"offset":{"type":"number","description":"1-based first line to return. Defaults to 1."},"limit":{"type":"number","description":"Maximum number of lines to return. Defaults to 2000."}},"required":["file_path"]}},{"name":"run_code","description":"Execute a TypeScript program against the available tools. Write the BODY of an async function (erasable syntax only; top-level `await` and `return` work) and call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.","parameters":{"type":"object","properties":{"code":{"type":"string","description":"The program: the body of an async TypeScript function."},"description":{"type":"string","description":"Clear, concise description of what this program does in active voice, 5-10 words (shown in the UI). Examples: \"Count TODO markers across packages\"; \"Read failing test and its fixture\"; \"Rename config key in every cordis.yml\"."}},"required":["code","description"]}},{"name":"send_message","description":"Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered.","parameters":{"type":"object","properties":{"subagent_id":{"type":"string","description":"The subagent id returned when the background subagent was started."},"message":{"type":"string","description":"The message to deliver to the subagent."}},"required":["subagent_id","message"]}},{"name":"skill","description":"Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill.","parameters":{"type":"object","properties":{"name":{"type":"string","description":"The exact skill name from the available skills list."}},"required":["name"]}},{"name":"subagent","description":"Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs."},"run_in_background":{"type":"boolean","description":"Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it."}},"required":["description","prompt"]}},{"name":"subagent_fork","description":"Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new."}},"required":["description","prompt"]}},{"name":"todo_write","description":"Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished).","parameters":{"type":"object","properties":{"todos":{"type":"array","description":"The COMPLETE task list, replacing any previous list.","items":{"type":"object","additionalProperties":false,"properties":{"content":{"type":"string","description":"What the task is — a short imperative line."},"status":{"type":"string","description":"pending (not started) | in_progress (now) | completed (done).","enum":["pending","in_progress","completed"]}},"required":["content","status"]}}},"required":["todos"]}},{"name":"workflow","description":"Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn.\n\nThe workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result.\n\nScript-body hooks:\n- `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly.\n- `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages.\n- `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`.\n- `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim.\n\nMisused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`.\n\nConstraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes.","parameters":{"type":"object","properties":{"script":{"type":"string","description":"The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `)."},"meta":{"type":"object","description":"The workflow identity block (plain JSON — never code).","additionalProperties":true,"properties":{"name":{"type":"string","description":"Short kebab-case workflow name."},"description":{"type":"string","description":"One-line description of what the workflow does."},"whenToUse":{"type":"string","description":"Optional guidance on when this workflow applies."},"phases":{"type":"array","description":"Optional phase declarations matched by phase() calls.","items":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string","description":"The phase title phase() calls match by exact string."},"detail":{"type":"string","description":"Optional one-line description of the phase."},"provider":{"type":"string","description":"Optional provider override this phase is expected to use."},"model":{"type":"string","description":"Optional model override this phase is expected to use."}},"required":["title"]}}},"required":["name","description"]},"args":{"type":"object","description":"Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}).","additionalProperties":true}},"required":["script","meta"]}},{"name":"write","description":"Create or fully replace a UTF-8 text file.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to write, resolved by the filesystem backend."},"content":{"type":"string","description":"Full UTF-8 text content to write."}},"required":["file_path","content"]}}]},"reason":"initial"}} +{"type":"request/header","seq":8,"time":1785498583897,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"You are an AI agent powered by DeepSeek Harness.\n\nYou are headless-agent, a coding assistant powered by the deepseek-v4-flash model. Your working directory is {{cwd}}.\n\nVerify your work by running the code or tests. Keep answers brief and factual.\n\n\nUse the read tool — not shell commands like cat — to inspect text files. Results include line numbers. Use offset and limit to continue reading large files.\n\nUse the write tool to create files or completely replace file contents. Existing files are overwritten, so read an existing file first (the default fs-observation-policy requires it) and prefer edit for targeted changes.\n\nUse the edit tool for targeted changes to existing UTF-8 text files. It replaces literal old_string with new_string; by default old_string must appear exactly once. If old_string appears multiple times, provide a more specific old_string or set replace_all to true. Read the file first (the default fs-observation-policy requires it), unless you just created or edited it in this session.\n\nCheck the [exit code: N] marker on every bash result; investigate failures before moving on.\n\nTrack every background job id you start. You are notified in-session when a job finishes — do not busy-poll or sleep on one; keep working on independent steps and do not duplicate a running job's work. Before giving a final answer, collect every still-relevant job with job_output (set wait: true only when you are genuinely blocked on it), and job_kill jobs that stopped mattering.\n\nUse the workflow tool ONLY when the user explicitly asks for a workflow or for large multi-agent orchestration: you write a JavaScript script (the tool description documents the exact format) that fans work out across many subagents with phases and structured results. For one or two delegations, prefer plain subagent calls.\n\n# Dynamic Cordis Plugins\n\nDynamic Cordis plugins temporarily extend the current DSH process. A Plugin uses apply(ctx) to consume Services, listen to Events, provide Services, register model Tools, or register browser UI in Slots.\n\n- Plugin and Package definitions exist only in the current process. define itself does not modify repository source, configuration, or disk, and definitions do not survive a process restart.\n- The restricted execution environment prevents accidental misuse; it is not a security boundary for malicious code. Services obtained by dynamic code connect to the real runtime.\n\n## Make the user-facing plan clear first\n\n- Dynamic Cordis Plugins are one available implementation mechanism, not the default for every request. Consider whether one could help only when the user intends to design or create something, or when a temporary interface could materially aid the current work. The presence of these instructions or Tools, and discussion of Cordis itself, do not make a request a dynamic-Plugin task.\n- When Cordis is a plausible fit, infer the intended work target and lifetime from the request and conversation. Use it only when the outcome belongs to the current running harness and should be delivered as a temporary runtime extension. If that distinction is materially ambiguous, ask at most one concise question about the intended result or lifetime. Otherwise proceed with the matching workflow; do not require the user to know or choose Cordis as an implementation mechanism.\n- Once a dynamic Plugin is appropriate, decide whether the task creates a new Plugin or modifies the Plugin named by the user with @pluginId. Proceed directly when the goal is clear; do not ask for repeated confirmation.\n- Choose Host, Client, or both from the requested outcome. Do not propose a Client/browser UI when the task does not need visible page behavior, and do not avoid Client when the requested outcome is visual, interactive, or depends on page state. Host versus Client is an implementation choice; do not make the user choose it.\n- When a design direction or a potentially useful interface would materially affect the result, ask at most one concise outcome or creative-preference question and offer a few candidate directions. Otherwise proceed directly; do not conduct a multi-round interview or a complex questionnaire.\n- cordis_define only defines and presents code; it does not run it. After definition, explain the pluginId and packageId returned by the Host and whether the next step is a run or update.\n- cordis_run may require user approval. When it returns awaiting-approval, explain that the user must allow or reject it in the UI. Do not wait, retry, or claim that it is running.\n- When it returns starting, explain that the request has entered the asynchronous flow and the Client is still activating. starting does not mean success. Wait for the system to report the final result through steering context.\n- Do not request approval again after the user rejects it. After a technical failure, fix the same Plugin from its diagnostics; do not silently create a replacement Plugin.\n\n## Recommended workflow and Tools\n\nBefore creating, modifying, or repairing a Plugin, load the cordis-plugin-development Skill. The Skill provides requirement navigation, capability composition, complete examples, and troubleshooting. Treat Inspect Provider results as the source of truth for exact APIs.\n\n1. cordis_inspect_list: discover the current Host and Client Providers and their read-only query methods.\n2. cordis_inspect_query: use the returned platform, provider, method, and schema to query exact Service, Event, Builtin, Slot, Theme token, or Tool information.\n3. cordis_inspect_self: inspect the current Session's Plugins, Packages, version pointers, source, and diagnostics. Source is returned only when both pluginId and packageId are specified.\n4. cordis_define: create the first Package for a new Plugin or append an immutable Package to an existing Plugin. It defines code but does not run it.\n5. cordis_run: activate an exact Package. Use run for the first activation, restarting current, or rollback; use update to switch versions.\n6. cordis_stop: remove the current Run and pending approval request while retaining definitions, grants, and version pointers.\n7. cordis_undefine: permanently stop and delete a Plugin and all of its Packages. Use it only after confirming that the user no longer needs them.\n\n- Inspect and Catalog data only confirm capabilities, names, signatures, types, and registration protocols before code is written; they do not replace business APIs.\n- Query Service.listService and Event.listEvents without input to choose from their compact signature directories, then query the exact service or event before using it. Exact queries return the structured contract and only its referenced types.\n- At runtime, a Plugin must call real Services or listen to real Events. Do not cache, display, or depend on Inspect results as business data.\n\n## Identity, versions, and approval\n\n- pluginId identifies a Plugin that can be modified over time. For a new Plugin, submit only a semantic idPrefix of 3–6 lowercase English letters; the Host allocates the final ID.\n- packageId identifies one immutable Host/Client source version under a Plugin. To change code, define a new Package; never overwrite an old version.\n- pluginRunId identifies one activation attempt and connects its approval, Host/Client loading, private RPC, Run card, and errors.\n- currentPackageId is the most recent fully successful Package. Stopping, starting an update, or failing an update does not clear it.\n- nextPackageId is the target awaiting approval, being attempted, awaiting Client activation, or most recently failed.\n- A single check mark authorizes only the current Package; double check marks authorize future versions of the same Plugin. A grant remains in effect after a technical failure.\n- An update stops the old Run before starting the target Package. Failure does not automatically restart the old version; retry next with update or roll back to current with run.\n\nWhen the user enters @pluginId, the system injects identity, the default base Package, version pointers, and runtime status, but not source code:\n\n1. Call cordis_inspect_self(pluginId, packageId) to read the target source.\n2. Use cordis_define in existing mode to append a Package to the same Plugin.\n3. Call cordis_run in run or update mode according to the version relationship.\n\nNever silently create another Plugin for @pluginId. If the reference is unavailable because it was removed, belongs to another Session, or was lost on process restart, tell the user directly.\n\n## High-frequency errors that must be avoided\n\n### Services: ctx.get and inject\n\n- Read an optional Service with ctx.get('serviceName') by default and handle undefined.\n- Declare inject: ['serviceName'] on the returned Plugin object only when the Service is a hard dependency and the Plugin must enter waiting until Cordis reactivates it after the Service appears.\n- Read ctx.serviceName only after declaring that Service in inject. Never access an undeclared Service as a ctx property.\n\n```js\nreturn {\n inject: ['requiredService'],\n apply(ctx) {\n ctx.requiredService.someMethod()\n const optionalService = ctx.get('optionalService')\n if (optionalService !== undefined) optionalService.someMethod()\n },\n}\n```\n\n### Code: use plain JavaScript only\n\n- Host and Client code is not transformed by TypeScript, JSX, or a bundler.\n- Do not use TypeScript types, as, decorators, import, require, or JSX.\n- Client React code must use React.createElement(...); never write .\n- Do not assume that process, Buffer, window, document, fetch, native timers, or any other global is available. Query the corresponding platform's Builtins and Services first.\n\n### Data: do not serialize live data\n\n- Services, Events, Slots, Sessions, and their derived Cordis/DSH objects are internal live data, not ordinary JSON that can be dumped.\n- Do not apply JSON.stringify, structuredClone, recursive enumeration, full copying, or whole-object display to live data.\n- Read only the leaf fields required by the task, then construct the smallest owned data object without Host references.\n\n### Lifecycle: every side effect must be reversible\n\n- Services, Events, Tools, handlers, timers, Slots, styles, and theme overrides must all belong to the current Fiber.\n- Use ctx.effect(), ctx.on(), or official APIs that return a disposer so stop, update, or undefine removes every side effect.\n- The cordis-plugin-development Skill contains complete timer, Waterfall, Slot, theme, Tool, RPC, and React examples and troubleshooting guidance.\n\n## Host and Client\n\n- Host runs in the DSH Node.js process and is appropriate for files, networking, commands, Agent/Session access, Host Events, Services, model Tools, and JSON methods callable by the Client.\n- Client runs in the browser page and is appropriate for themes, layout, current page state, Tool cards, and Slot UI.\n- Host and Client communicate through Package-private JSON methods: Host uses harness.handle(method, handler), and Client uses host.call(method, args). The direction is Client→Host, and only lossless JSON may cross it.\n- Client UI must be registered in a queried Slot; apply() cannot directly return a React Element. Query Slots.listSubTree without root to choose from the compact purpose/topology tree, then query the exact root for its full registration contract and props before writing code.\n- See the Skill and Inspect Providers for Run-specific panels and exact Slot registration patterns.\n\n## Asynchronous results and recovery\n\n- Do not wait inside a Tool for approval or browser work that can happen only after the current turn ends.\n- Asynchronous success, rejection, and runtime errors update Run state and notify you through steering context.\n- After a technical failure, use cordis_inspect_self to read the exact Package source and its message/stack. Define a corrected Package under the same Plugin and retry autonomously.\n- Use the cordis-plugin-development Skill for other failure causes, repair procedures, and complete extension patterns.\n\nUse the ralph tool ONLY when the direct human explicitly asks for a Ralph loop or fresh-agent iterative execution. Each Ralph round starts a fresh child with no conversation seed and uses the shared workspace as durable memory. Completion and blockers are worker reports, not independent evaluation. Use same-session goal tools for ordinary long-running objectives, and plain subagents or workflows for bounded delegation and fan-out.\n\nUse subagent in the background by default. Start independent delegations together in one assistant message and continue useful work while they run. Set `run_in_background: false` only when your next action depends on that subagent's result. When a background run settles, the runtime sends you a notice containing its outcome and any final assistant message.\n\n## Writing code for run_code\n\n`run_code` takes two required arguments: `code` — the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped) — and `description`, a short summary of what the program does. Inside the program:\n\n- Call tools as `await tools.name(args)` — quoted access for exotic names: `tools[\"my-tool\"](args)`. Every call resolves to the tool's typed canonical JSON value. Tool arguments must be lossless JSON.\n- A FAILED tool call rejects with `ToolCallError`, whose `toolName` identifies the failed tool and whose `message` is human-readable — `try/catch` it to handle and continue.\n- Independent read-only calls MAY overlap under `Promise.all` (safe calls run concurrently; mutating calls run alone, in submission order). Sequence dependent work with `await`.\n- Emit results with `return` and/or `console.log(...)`. ONLY what you print or return comes back to you — intermediate tool results never enter the conversation, so extract just what you need.\n\nThe available tools:\n\n```ts\ntype JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }\n\ninterface ToolArgsMap {\n /** Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`. */\n bash: {\n /** The bash command to execute. */\n command: string;\n /** Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\". */\n description: string;\n /** Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry. */\n timeoutMs?: number;\n /** Working directory for this command. Defaults to the session workspace; a relative path is resolved against it. */\n workdir?: string;\n /** Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies. */\n run_in_background?: boolean;\n } & Record;\n /** Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs. */\n cordis_define: {\n plugin: {\n kind: \"new\";\n /** Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix. */\n idPrefix: string;\n } | {\n kind: \"existing\";\n /** Exact ID of an existing Plugin; the new Package is appended to that instance. */\n pluginId: string;\n };\n /** Short, readable Package name. */\n name: string;\n /** One-sentence, user-facing description of the Package purpose. */\n purpose: string;\n code: {\n /** Plain JavaScript function body that returns the Host-half Cordis Plugin. */\n host?: string;\n /** Plain JavaScript function body that returns the browser Client-half Cordis Plugin. */\n client?: string;\n };\n } & Record;\n /** List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call. */\n cordis_inspect_list: Record;\n /** Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props. */\n cordis_inspect_query: {\n /** Runtime platform that owns the Provider. */\n platform: \"host\" | \"client\";\n /** Exact Provider ID returned by cordis_inspect_list. */\n provider: string;\n /** Exact method name declared by the Provider manifest. */\n method: string;\n /** Optional query input; it must satisfy the method input schema. */\n input?: JsonValue;\n } & Record;\n /** Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers. */\n cordis_inspect_self: {\n /** Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin. */\n pluginId?: string;\n /** Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned. */\n packageId?: string;\n } & Record;\n /** Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it. */\n cordis_run: {\n /** Stable Plugin ID returned by cordis_define. */\n pluginId: string;\n /** Exact immutable Package ID to activate under that Plugin. */\n packageId: string;\n /** Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package. */\n mode: \"run\" | \"update\";\n } & Record;\n /** Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal. */\n cordis_stop: {\n /** Stable dynamic Plugin ID to stop. */\n pluginId: string;\n } & Record;\n /** Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead. */\n cordis_undefine: {\n /** Stable dynamic Plugin ID to remove permanently. */\n pluginId: string;\n } & Record;\n /** Edit an existing UTF-8 text file by replacing literal text. */\n edit: {\n /** Path to edit, resolved by the filesystem backend. */\n file_path: string;\n /** Literal text to replace. Must match exactly. */\n old_string: string;\n /** Literal replacement text. Use an empty string to delete the match. */\n new_string: string;\n /** Replace all matches. Defaults to false; when false, old_string must appear exactly once. */\n replace_all?: boolean;\n } & Record;\n /** Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op. */\n interrupt_agent: {\n /** The agent id of the running agent to interrupt. */\n agent_id: string;\n } & Record;\n /** Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops. */\n job_kill: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Optional short reason, recorded in the log and forwarded to the job. */\n reason?: string;\n } & Record;\n /** List your background jobs (running and finished) with their ids, kinds, and statuses. */\n job_list: Record;\n /** Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap. */\n job_output: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive. */\n wait?: boolean;\n /** Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum. */\n timeout_ms?: number;\n } & Record;\n /** Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools. */\n ralph: {\n /** The immutable completion objective for every fresh Ralph round. */\n objective: string;\n /** Optional positive safe-integer round cap, bounded by the deployment ceiling. */\n maxRounds?: number;\n } & Record;\n /** Read a UTF-8 text file and return line-numbered content. */\n read: {\n /** Path to read, resolved by the filesystem backend. */\n file_path: string;\n /** 1-based first line to return. Defaults to 1. */\n offset?: number;\n /** Maximum number of lines to return. Defaults to 2000. */\n limit?: number;\n } & Record;\n /** Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered. */\n send_message: {\n /** The subagent id returned when the background subagent was started. */\n subagent_id: string;\n /** The message to deliver to the subagent. */\n message: string;\n } & Record;\n /** Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill. */\n skill: {\n /** The exact skill name from the available skills list. */\n name: string;\n } & Record;\n /** Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result. */\n subagent: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs. */\n prompt: string;\n /** Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it. */\n run_in_background?: boolean;\n } & Record;\n /** Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result. */\n subagent_fork: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new. */\n prompt: string;\n } & Record;\n /** Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished). */\n todo_write: {\n /** The COMPLETE task list, replacing any previous list. */\n todos: ({\n /** What the task is — a short imperative line. */\n content: string;\n /** pending (not started) | in_progress (now) | completed (done). */\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n } & Record;\n /** Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn. The workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result. Script-body hooks: - `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly. - `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages. - `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`. - `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim. Misused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`. Constraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes. */\n workflow: {\n /** The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `). */\n script: string;\n /** The workflow identity block (plain JSON — never code). */\n meta: {\n /** Short kebab-case workflow name. */\n name: string;\n /** One-line description of what the workflow does. */\n description: string;\n /** Optional guidance on when this workflow applies. */\n whenToUse?: string;\n /** Optional phase declarations matched by phase() calls. */\n phases?: ({\n /** The phase title phase() calls match by exact string. */\n title: string;\n /** Optional one-line description of the phase. */\n detail?: string;\n /** Optional provider override this phase is expected to use. */\n provider?: string;\n /** Optional model override this phase is expected to use. */\n model?: string;\n } & Record)[];\n } & Record;\n /** Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}). */\n args?: Record;\n } & Record;\n /** Create or fully replace a UTF-8 text file. */\n write: {\n /** Path to write, resolved by the filesystem backend. */\n file_path: string;\n /** Full UTF-8 text content to write. */\n content: string;\n } & Record;\n}\n\ninterface ToolOutputMap {\n bash: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"foreground\";\n exitCode: number | null;\n signal: string | null;\n timedOut: boolean;\n aborted: boolean;\n timeoutMs: number;\n stdout: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n stderr: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n sandbox?: {\n mode: string;\n denied: boolean;\n enforcement?: string;\n runnerFailed?: boolean;\n };\n };\n cordis_define: {\n pluginId: string;\n packageId: string;\n name: string;\n purpose: string;\n hasHostHalf: boolean;\n hasClientHalf: boolean;\n };\n cordis_inspect_list: JsonValue;\n cordis_inspect_query: JsonValue;\n cordis_inspect_self: JsonValue;\n cordis_run: JsonValue;\n cordis_stop: {\n pluginId: string;\n };\n cordis_undefine: {\n pluginId: string;\n wasRunning: boolean;\n };\n edit: {\n path: string;\n before: string;\n after: string;\n };\n interrupt_agent: {\n accepted: boolean;\n };\n job_kill: {\n outcome: \"cancellation-requested\" | \"already-finished\";\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n job_list: ({\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n })[];\n job_output: {\n text: string;\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n ralph: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n read: {\n path: string;\n offset: number;\n lines: {\n number: number;\n text: string;\n }[];\n totalLines: number;\n };\n send_message: {\n messageId: string;\n };\n skill: {\n name: string;\n provider: string;\n resourceBase?: {\n kind: \"directory\";\n path: string;\n } | {\n kind: \"url\";\n url: string;\n } | {\n kind: \"opaque\";\n description: string;\n };\n content: string;\n };\n subagent: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n subagent_fork: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n todo_write: {\n todos: ({\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n counts: {\n pending: number;\n inProgress: number;\n completed: number;\n };\n };\n workflow: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n write: {\n path: string;\n operation: \"create\" | \"update\";\n before: string | null;\n after: string;\n };\n}\n\ntype ToolName = keyof ToolOutputMap\n\ndeclare class ToolCallError extends Error {\n readonly name: \"ToolCallError\";\n readonly toolName: ToolName;\n}\n\ndeclare const tools: {\n [K in ToolName]: (args: ToolArgsMap[K]) => Promise;\n}\n```","tools":[{"name":"bash","description":"Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`.","parameters":{"type":"object","properties":{"command":{"type":"string","description":"The bash command to execute."},"description":{"type":"string","description":"Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\"."},"timeoutMs":{"type":"number","description":"Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."},"workdir":{"type":"string","description":"Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."},"run_in_background":{"type":"boolean","description":"Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."}},"required":["command","description"]}},{"name":"cordis_define","description":"Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs.","parameters":{"type":"object","properties":{"plugin":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"new"},"idPrefix":{"type":"string","description":"Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix."}},"required":["kind","idPrefix"]},{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"existing"},"pluginId":{"type":"string","description":"Exact ID of an existing Plugin; the new Package is appended to that instance."}},"required":["kind","pluginId"]}]},"name":{"type":"string","description":"Short, readable Package name."},"purpose":{"type":"string","description":"One-sentence, user-facing description of the Package purpose."},"code":{"type":"object","additionalProperties":false,"properties":{"host":{"type":"string","description":"Plain JavaScript function body that returns the Host-half Cordis Plugin."},"client":{"type":"string","description":"Plain JavaScript function body that returns the browser Client-half Cordis Plugin."}}}},"required":["plugin","name","purpose","code"]}},{"name":"cordis_inspect_list","description":"List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call.","parameters":{"type":"object","properties":{}}},{"name":"cordis_inspect_query","description":"Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props.","parameters":{"type":"object","properties":{"platform":{"type":"string","description":"Runtime platform that owns the Provider.","enum":["host","client"]},"provider":{"type":"string","description":"Exact Provider ID returned by cordis_inspect_list."},"method":{"type":"string","description":"Exact method name declared by the Provider manifest."},"input":{"description":"Optional query input; it must satisfy the method input schema."}},"required":["platform","provider","method"]}},{"name":"cordis_inspect_self","description":"Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin."},"packageId":{"type":"string","description":"Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned."}}}},{"name":"cordis_run","description":"Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define."},"packageId":{"type":"string","description":"Exact immutable Package ID to activate under that Plugin."},"mode":{"type":"string","description":"Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package.","enum":["run","update"]}},"required":["pluginId","packageId","mode"]}},{"name":"cordis_stop","description":"Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to stop."}},"required":["pluginId"]}},{"name":"cordis_undefine","description":"Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to remove permanently."}},"required":["pluginId"]}},{"name":"edit","description":"Edit an existing UTF-8 text file by replacing literal text.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to edit, resolved by the filesystem backend."},"old_string":{"type":"string","description":"Literal text to replace. Must match exactly."},"new_string":{"type":"string","description":"Literal replacement text. Use an empty string to delete the match."},"replace_all":{"type":"boolean","description":"Replace all matches. Defaults to false; when false, old_string must appear exactly once."}},"required":["file_path","old_string","new_string"]}},{"name":"interrupt_agent","description":"Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op.","parameters":{"type":"object","properties":{"agent_id":{"type":"string","description":"The agent id of the running agent to interrupt."}},"required":["agent_id"]}},{"name":"job_kill","description":"Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"reason":{"type":"string","description":"Optional short reason, recorded in the log and forwarded to the job."}},"required":["job_id"]}},{"name":"job_list","description":"List your background jobs (running and finished) with their ids, kinds, and statuses.","parameters":{"type":"object","properties":{}}},{"name":"job_output","description":"Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"wait":{"type":"boolean","description":"Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive."},"timeout_ms":{"type":"number","description":"Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum."}},"required":["job_id"]}},{"name":"ralph","description":"Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools.","parameters":{"type":"object","properties":{"objective":{"type":"string","description":"The immutable completion objective for every fresh Ralph round."},"maxRounds":{"type":"number","description":"Optional positive safe-integer round cap, bounded by the deployment ceiling."}},"required":["objective"]}},{"name":"read","description":"Read a UTF-8 text file and return line-numbered content.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to read, resolved by the filesystem backend."},"offset":{"type":"number","description":"1-based first line to return. Defaults to 1."},"limit":{"type":"number","description":"Maximum number of lines to return. Defaults to 2000."}},"required":["file_path"]}},{"name":"run_code","description":"Execute a TypeScript program against the available tools. Takes two required arguments: `code`, the BODY of an async function (erasable syntax only; top-level `await` and `return` work), and `description`, a short summary of what the program does. Call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.","parameters":{"type":"object","properties":{"code":{"type":"string","description":"The program: the body of an async TypeScript function."},"description":{"type":"string","description":"Clear, concise description of what this program does in active voice, 5-10 words (shown in the UI). Examples: \"Count TODO markers across packages\"; \"Read failing test and its fixture\"; \"Rename config key in every cordis.yml\"."}},"required":["code","description"]}},{"name":"send_message","description":"Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered.","parameters":{"type":"object","properties":{"subagent_id":{"type":"string","description":"The subagent id returned when the background subagent was started."},"message":{"type":"string","description":"The message to deliver to the subagent."}},"required":["subagent_id","message"]}},{"name":"skill","description":"Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill.","parameters":{"type":"object","properties":{"name":{"type":"string","description":"The exact skill name from the available skills list."}},"required":["name"]}},{"name":"subagent","description":"Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs."},"run_in_background":{"type":"boolean","description":"Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it."}},"required":["description","prompt"]}},{"name":"subagent_fork","description":"Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new."}},"required":["description","prompt"]}},{"name":"todo_write","description":"Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished).","parameters":{"type":"object","properties":{"todos":{"type":"array","description":"The COMPLETE task list, replacing any previous list.","items":{"type":"object","additionalProperties":false,"properties":{"content":{"type":"string","description":"What the task is — a short imperative line."},"status":{"type":"string","description":"pending (not started) | in_progress (now) | completed (done).","enum":["pending","in_progress","completed"]}},"required":["content","status"]}}},"required":["todos"]}},{"name":"workflow","description":"Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn.\n\nThe workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result.\n\nScript-body hooks:\n- `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly.\n- `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages.\n- `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`.\n- `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim.\n\nMisused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`.\n\nConstraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes.","parameters":{"type":"object","properties":{"script":{"type":"string","description":"The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `)."},"meta":{"type":"object","description":"The workflow identity block (plain JSON — never code).","additionalProperties":true,"properties":{"name":{"type":"string","description":"Short kebab-case workflow name."},"description":{"type":"string","description":"One-line description of what the workflow does."},"whenToUse":{"type":"string","description":"Optional guidance on when this workflow applies."},"phases":{"type":"array","description":"Optional phase declarations matched by phase() calls.","items":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string","description":"The phase title phase() calls match by exact string."},"detail":{"type":"string","description":"Optional one-line description of the phase."},"provider":{"type":"string","description":"Optional provider override this phase is expected to use."},"model":{"type":"string","description":"Optional model override this phase is expected to use."}},"required":["title"]}}},"required":["name","description"]},"args":{"type":"object","description":"Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}).","additionalProperties":true}},"required":["script","meta"]}},{"name":"write","description":"Create or fully replace a UTF-8 text file.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to write, resolved by the filesystem backend."},"content":{"type":"string","description":"Full UTF-8 text content to write."}},"required":["file_path","content"]}}]},"reason":"initial"}} {"type":"request/context","seq":9,"time":1785730501507,"data":{"provider":"deepseek-official","model":"deepseek-v4-flash"}} {"type":"assistant/chunk","seq":10,"time":1783957884564,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"text"}}} {"type":"assistant/chunk","seq":11,"time":1783957884564,"data":{"turn":1,"step":1,"chunk":{"type":"text-delta","index":0,"text":"DIRECT_CHILD_OK"}}} {"type":"assistant/chunk","seq":12,"time":1783957884564,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"DIRECT_CHILD_OK"}}}} {"type":"assistant/chunk","seq":13,"time":1785498583897,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} {"type":"assistant/chunk","seq":14,"time":1785730501507,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"stop"}}}} -{"type":"assistant/message","seq":15,"time":1785730501507,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"text","text":"DIRECT_CHILD_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"ce699f54-ef07-41e3-86e9-ef57995549f0"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[10,11,12,13,14],"surfaceOp":"append"} +{"type":"assistant/message","seq":15,"time":1785730501507,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"text","text":"DIRECT_CHILD_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"02dd8a61-a39a-46d0-8f6f-457533271cae"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[10,11,12,13,14],"surfaceOp":"append"} {"type":"step/end","seq":16,"time":1785730501507,"data":{"turn":1,"step":1}} {"type":"turn/end","seq":17,"time":1785730501507,"data":{"turn":1,"reason":{"kind":"completed"}}} diff --git a/examples/headless-agent/tests/snapshots/advanced-toolchain/session.2.jsonl b/examples/headless-agent/tests/snapshots/advanced-toolchain/session.2.jsonl index 6d26883f39..e05489ba1f 100644 --- a/examples/headless-agent/tests/snapshots/advanced-toolchain/session.2.jsonl +++ b/examples/headless-agent/tests/snapshots/advanced-toolchain/session.2.jsonl @@ -1,19 +1,19 @@ {"type":"session","version":0,"id":"33333333-3333-4333-8333-333333333333","createdAt":1783950002000,"cwd":"{{cwd}}","parentSession":"11111111-1111-4111-8111-111111111111","origin":"subagent","delegationDepth":1} -{"type":"agent/inbox/spliced","seq":0,"time":1785498584048,"data":{"target":"next-turn","start":0,"inserted":[{"content":[{"type":"text","text":"Reply with exactly WORKFLOW_CHILD_OK and nothing else."}],"source":{"kind":"user"},"role":"user","id":"893169a9-49fc-4849-96ce-18bd7132f2e3"}]}} +{"type":"agent/inbox/spliced","seq":0,"time":1785498584048,"data":{"target":"next-turn","start":0,"inserted":[{"content":[{"type":"text","text":"Reply with exactly WORKFLOW_CHILD_OK and nothing else."}],"source":{"kind":"user"},"role":"user","id":"8b3cd23c-82f1-4903-8a3f-b9082059b40c"}]}} {"type":"turn/start","seq":1,"time":1785821454599,"data":{"turn":1}} {"type":"agent/inbox/spliced","seq":2,"time":1785821454599,"data":{"target":"next-turn","start":0,"removedCount":1,"inserted":[]}} {"type":"subagent/descriptor","seq":3,"time":1785821454618,"data":{"version":2,"mode":"one-shot","provider":"spawn"}} {"type":"step/start","seq":4,"time":1785730501645,"data":{"turn":1,"step":1}} -{"type":"user/message","seq":5,"time":1785730501645,"data":{"content":[{"type":"text","text":"Reply with exactly WORKFLOW_CHILD_OK and nothing else."}],"source":{"kind":"user"},"role":"user","id":"893169a9-49fc-4849-96ce-18bd7132f2e3"},"surfaceOp":"append"} -{"type":"user/message","seq":6,"time":1786373992411,"data":{"content":[{"type":"text","text":"Current runtime context. This snapshot supersedes earlier runtime-context snapshots.\n\nYou are a delegated subagent: your permission scope was fixed when you were started and cannot be widened from inside this session — operations that require approval are rejected automatically. When the task needs access beyond that scope, do not retry the denied operation; state the limitation in your reply so the delegating agent can handle it."}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt","form":"snapshot","sections":[{"name":"subagent:delegation","text":"You are a delegated subagent: your permission scope was fixed when you were started and cannot be widened from inside this session — operations that require approval are rejected automatically. When the task needs access beyond that scope, do not retry the denied operation; state the limitation in your reply so the delegating agent can handle it."}]},"role":"user","id":"61a17dbb-19d2-4053-8251-ff867a552522"},"surfaceOp":"append"} +{"type":"user/message","seq":5,"time":1785730501645,"data":{"content":[{"type":"text","text":"Reply with exactly WORKFLOW_CHILD_OK and nothing else."}],"source":{"kind":"user"},"role":"user","id":"8b3cd23c-82f1-4903-8a3f-b9082059b40c"},"surfaceOp":"append"} +{"type":"user/message","seq":6,"time":1786373992411,"data":{"content":[{"type":"text","text":"Current runtime context. This snapshot supersedes earlier runtime-context snapshots.\n\nYou are a delegated subagent: your permission scope was fixed when you were started and cannot be widened from inside this session — operations that require approval are rejected automatically. When the task needs access beyond that scope, do not retry the denied operation; state the limitation in your reply so the delegating agent can handle it."}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt","form":"snapshot","sections":[{"name":"subagent:delegation","text":"You are a delegated subagent: your permission scope was fixed when you were started and cannot be widened from inside this session — operations that require approval are rejected automatically. When the task needs access beyond that scope, do not retry the denied operation; state the limitation in your reply so the delegating agent can handle it."}]},"role":"user","id":"823e5037-9e96-4ef5-8c5b-cbe73b993ee2"},"surfaceOp":"append"} {"type":"session/title","seq":7,"time":1786373992411,"data":{"title":"Reply with exactly WORKFLOW_CHILD_OK and","messageSeqs":[5],"source":{"kind":"fallback"}}} -{"type":"request/header","seq":8,"time":1785498584067,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"You are an AI agent powered by DeepSeek Harness.\n\nYou are headless-agent, a coding assistant powered by the deepseek-v4-flash model. Your working directory is {{cwd}}.\n\nVerify your work by running the code or tests. Keep answers brief and factual.\n\n\nUse the read tool — not shell commands like cat — to inspect text files. Results include line numbers. Use offset and limit to continue reading large files.\n\nUse the write tool to create files or completely replace file contents. Existing files are overwritten, so read an existing file first (the default fs-observation-policy requires it) and prefer edit for targeted changes.\n\nUse the edit tool for targeted changes to existing UTF-8 text files. It replaces literal old_string with new_string; by default old_string must appear exactly once. If old_string appears multiple times, provide a more specific old_string or set replace_all to true. Read the file first (the default fs-observation-policy requires it), unless you just created or edited it in this session.\n\nCheck the [exit code: N] marker on every bash result; investigate failures before moving on.\n\nTrack every background job id you start. You are notified in-session when a job finishes — do not busy-poll or sleep on one; keep working on independent steps and do not duplicate a running job's work. Before giving a final answer, collect every still-relevant job with job_output (set wait: true only when you are genuinely blocked on it), and job_kill jobs that stopped mattering.\n\nUse the workflow tool ONLY when the user explicitly asks for a workflow or for large multi-agent orchestration: you write a JavaScript script (the tool description documents the exact format) that fans work out across many subagents with phases and structured results. For one or two delegations, prefer plain subagent calls.\n\n# Dynamic Cordis Plugins\n\nDynamic Cordis plugins temporarily extend the current DSH process. A Plugin uses apply(ctx) to consume Services, listen to Events, provide Services, register model Tools, or register browser UI in Slots.\n\n- Plugin and Package definitions exist only in the current process. define itself does not modify repository source, configuration, or disk, and definitions do not survive a process restart.\n- The restricted execution environment prevents accidental misuse; it is not a security boundary for malicious code. Services obtained by dynamic code connect to the real runtime.\n\n## Make the user-facing plan clear first\n\n- Dynamic Cordis Plugins are one available implementation mechanism, not the default for every request. Consider whether one could help only when the user intends to design or create something, or when a temporary interface could materially aid the current work. The presence of these instructions or Tools, and discussion of Cordis itself, do not make a request a dynamic-Plugin task.\n- When Cordis is a plausible fit, infer the intended work target and lifetime from the request and conversation. Use it only when the outcome belongs to the current running harness and should be delivered as a temporary runtime extension. If that distinction is materially ambiguous, ask at most one concise question about the intended result or lifetime. Otherwise proceed with the matching workflow; do not require the user to know or choose Cordis as an implementation mechanism.\n- Once a dynamic Plugin is appropriate, decide whether the task creates a new Plugin or modifies the Plugin named by the user with @pluginId. Proceed directly when the goal is clear; do not ask for repeated confirmation.\n- Choose Host, Client, or both from the requested outcome. Do not propose a Client/browser UI when the task does not need visible page behavior, and do not avoid Client when the requested outcome is visual, interactive, or depends on page state. Host versus Client is an implementation choice; do not make the user choose it.\n- When a design direction or a potentially useful interface would materially affect the result, ask at most one concise outcome or creative-preference question and offer a few candidate directions. Otherwise proceed directly; do not conduct a multi-round interview or a complex questionnaire.\n- cordis_define only defines and presents code; it does not run it. After definition, explain the pluginId and packageId returned by the Host and whether the next step is a run or update.\n- cordis_run may require user approval. When it returns awaiting-approval, explain that the user must allow or reject it in the UI. Do not wait, retry, or claim that it is running.\n- When it returns starting, explain that the request has entered the asynchronous flow and the Client is still activating. starting does not mean success. Wait for the system to report the final result through steering context.\n- Do not request approval again after the user rejects it. After a technical failure, fix the same Plugin from its diagnostics; do not silently create a replacement Plugin.\n\n## Recommended workflow and Tools\n\nBefore creating, modifying, or repairing a Plugin, load the cordis-plugin-development Skill. The Skill provides requirement navigation, capability composition, complete examples, and troubleshooting. Treat Inspect Provider results as the source of truth for exact APIs.\n\n1. cordis_inspect_list: discover the current Host and Client Providers and their read-only query methods.\n2. cordis_inspect_query: use the returned platform, provider, method, and schema to query exact Service, Event, Builtin, Slot, Theme token, or Tool information.\n3. cordis_inspect_self: inspect the current Session's Plugins, Packages, version pointers, source, and diagnostics. Source is returned only when both pluginId and packageId are specified.\n4. cordis_define: create the first Package for a new Plugin or append an immutable Package to an existing Plugin. It defines code but does not run it.\n5. cordis_run: activate an exact Package. Use run for the first activation, restarting current, or rollback; use update to switch versions.\n6. cordis_stop: remove the current Run and pending approval request while retaining definitions, grants, and version pointers.\n7. cordis_undefine: permanently stop and delete a Plugin and all of its Packages. Use it only after confirming that the user no longer needs them.\n\n- Inspect and Catalog data only confirm capabilities, names, signatures, types, and registration protocols before code is written; they do not replace business APIs.\n- Query Service.listService and Event.listEvents without input to choose from their compact signature directories, then query the exact service or event before using it. Exact queries return the structured contract and only its referenced types.\n- At runtime, a Plugin must call real Services or listen to real Events. Do not cache, display, or depend on Inspect results as business data.\n\n## Identity, versions, and approval\n\n- pluginId identifies a Plugin that can be modified over time. For a new Plugin, submit only a semantic idPrefix of 3–6 lowercase English letters; the Host allocates the final ID.\n- packageId identifies one immutable Host/Client source version under a Plugin. To change code, define a new Package; never overwrite an old version.\n- pluginRunId identifies one activation attempt and connects its approval, Host/Client loading, private RPC, Run card, and errors.\n- currentPackageId is the most recent fully successful Package. Stopping, starting an update, or failing an update does not clear it.\n- nextPackageId is the target awaiting approval, being attempted, awaiting Client activation, or most recently failed.\n- A single check mark authorizes only the current Package; double check marks authorize future versions of the same Plugin. A grant remains in effect after a technical failure.\n- An update stops the old Run before starting the target Package. Failure does not automatically restart the old version; retry next with update or roll back to current with run.\n\nWhen the user enters @pluginId, the system injects identity, the default base Package, version pointers, and runtime status, but not source code:\n\n1. Call cordis_inspect_self(pluginId, packageId) to read the target source.\n2. Use cordis_define in existing mode to append a Package to the same Plugin.\n3. Call cordis_run in run or update mode according to the version relationship.\n\nNever silently create another Plugin for @pluginId. If the reference is unavailable because it was removed, belongs to another Session, or was lost on process restart, tell the user directly.\n\n## High-frequency errors that must be avoided\n\n### Services: ctx.get and inject\n\n- Read an optional Service with ctx.get('serviceName') by default and handle undefined.\n- Declare inject: ['serviceName'] on the returned Plugin object only when the Service is a hard dependency and the Plugin must enter waiting until Cordis reactivates it after the Service appears.\n- Read ctx.serviceName only after declaring that Service in inject. Never access an undeclared Service as a ctx property.\n\n```js\nreturn {\n inject: ['requiredService'],\n apply(ctx) {\n ctx.requiredService.someMethod()\n const optionalService = ctx.get('optionalService')\n if (optionalService !== undefined) optionalService.someMethod()\n },\n}\n```\n\n### Code: use plain JavaScript only\n\n- Host and Client code is not transformed by TypeScript, JSX, or a bundler.\n- Do not use TypeScript types, as, decorators, import, require, or JSX.\n- Client React code must use React.createElement(...); never write .\n- Do not assume that process, Buffer, window, document, fetch, native timers, or any other global is available. Query the corresponding platform's Builtins and Services first.\n\n### Data: do not serialize live data\n\n- Services, Events, Slots, Sessions, and their derived Cordis/DSH objects are internal live data, not ordinary JSON that can be dumped.\n- Do not apply JSON.stringify, structuredClone, recursive enumeration, full copying, or whole-object display to live data.\n- Read only the leaf fields required by the task, then construct the smallest owned data object without Host references.\n\n### Lifecycle: every side effect must be reversible\n\n- Services, Events, Tools, handlers, timers, Slots, styles, and theme overrides must all belong to the current Fiber.\n- Use ctx.effect(), ctx.on(), or official APIs that return a disposer so stop, update, or undefine removes every side effect.\n- The cordis-plugin-development Skill contains complete timer, Waterfall, Slot, theme, Tool, RPC, and React examples and troubleshooting guidance.\n\n## Host and Client\n\n- Host runs in the DSH Node.js process and is appropriate for files, networking, commands, Agent/Session access, Host Events, Services, model Tools, and JSON methods callable by the Client.\n- Client runs in the browser page and is appropriate for themes, layout, current page state, Tool cards, and Slot UI.\n- Host and Client communicate through Package-private JSON methods: Host uses harness.handle(method, handler), and Client uses host.call(method, args). The direction is Client→Host, and only lossless JSON may cross it.\n- Client UI must be registered in a queried Slot; apply() cannot directly return a React Element. Query Slots.listSubTree without root to choose from the compact purpose/topology tree, then query the exact root for its full registration contract and props before writing code.\n- See the Skill and Inspect Providers for Run-specific panels and exact Slot registration patterns.\n\n## Asynchronous results and recovery\n\n- Do not wait inside a Tool for approval or browser work that can happen only after the current turn ends.\n- Asynchronous success, rejection, and runtime errors update Run state and notify you through steering context.\n- After a technical failure, use cordis_inspect_self to read the exact Package source and its message/stack. Define a corrected Package under the same Plugin and retry autonomously.\n- Use the cordis-plugin-development Skill for other failure causes, repair procedures, and complete extension patterns.\n\nUse the ralph tool ONLY when the direct human explicitly asks for a Ralph loop or fresh-agent iterative execution. Each Ralph round starts a fresh child with no conversation seed and uses the shared workspace as durable memory. Completion and blockers are worker reports, not independent evaluation. Use same-session goal tools for ordinary long-running objectives, and plain subagents or workflows for bounded delegation and fan-out.\n\nUse subagent in the background by default. Start independent delegations together in one assistant message and continue useful work while they run. Set `run_in_background: false` only when your next action depends on that subagent's result. When a background run settles, the runtime sends you a notice containing its outcome and any final assistant message.\n\n## Writing code for run_code\n\nPass `run_code` the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped). Inside the program:\n\n- Call tools as `await tools.name(args)` — quoted access for exotic names: `tools[\"my-tool\"](args)`. Every call resolves to the tool's typed canonical JSON value. Tool arguments must be lossless JSON.\n- A FAILED tool call rejects with `ToolCallError`, whose `toolName` identifies the failed tool and whose `message` is human-readable — `try/catch` it to handle and continue.\n- Independent read-only calls MAY overlap under `Promise.all` (safe calls run concurrently; mutating calls run alone, in submission order). Sequence dependent work with `await`.\n- Emit results with `return` and/or `console.log(...)`. ONLY what you print or return comes back to you — intermediate tool results never enter the conversation, so extract just what you need.\n\nThe available tools:\n\n```ts\ntype JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }\n\ninterface ToolArgsMap {\n /** Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`. */\n bash: {\n /** The bash command to execute. */\n command: string;\n /** Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\". */\n description: string;\n /** Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry. */\n timeoutMs?: number;\n /** Working directory for this command. Defaults to the session workspace; a relative path is resolved against it. */\n workdir?: string;\n /** Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies. */\n run_in_background?: boolean;\n } & Record;\n /** Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs. */\n cordis_define: {\n plugin: {\n kind: \"new\";\n /** Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix. */\n idPrefix: string;\n } | {\n kind: \"existing\";\n /** Exact ID of an existing Plugin; the new Package is appended to that instance. */\n pluginId: string;\n };\n /** Short, readable Package name. */\n name: string;\n /** One-sentence, user-facing description of the Package purpose. */\n purpose: string;\n code: {\n /** Plain JavaScript function body that returns the Host-half Cordis Plugin. */\n host?: string;\n /** Plain JavaScript function body that returns the browser Client-half Cordis Plugin. */\n client?: string;\n };\n } & Record;\n /** List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call. */\n cordis_inspect_list: Record;\n /** Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props. */\n cordis_inspect_query: {\n /** Runtime platform that owns the Provider. */\n platform: \"host\" | \"client\";\n /** Exact Provider ID returned by cordis_inspect_list. */\n provider: string;\n /** Exact method name declared by the Provider manifest. */\n method: string;\n /** Optional query input; it must satisfy the method input schema. */\n input?: JsonValue;\n } & Record;\n /** Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers. */\n cordis_inspect_self: {\n /** Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin. */\n pluginId?: string;\n /** Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned. */\n packageId?: string;\n } & Record;\n /** Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it. */\n cordis_run: {\n /** Stable Plugin ID returned by cordis_define. */\n pluginId: string;\n /** Exact immutable Package ID to activate under that Plugin. */\n packageId: string;\n /** Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package. */\n mode: \"run\" | \"update\";\n } & Record;\n /** Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal. */\n cordis_stop: {\n /** Stable dynamic Plugin ID to stop. */\n pluginId: string;\n } & Record;\n /** Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead. */\n cordis_undefine: {\n /** Stable dynamic Plugin ID to remove permanently. */\n pluginId: string;\n } & Record;\n /** Edit an existing UTF-8 text file by replacing literal text. */\n edit: {\n /** Path to edit, resolved by the filesystem backend. */\n file_path: string;\n /** Literal text to replace. Must match exactly. */\n old_string: string;\n /** Literal replacement text. Use an empty string to delete the match. */\n new_string: string;\n /** Replace all matches. Defaults to false; when false, old_string must appear exactly once. */\n replace_all?: boolean;\n } & Record;\n /** Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op. */\n interrupt_agent: {\n /** The agent id of the running agent to interrupt. */\n agent_id: string;\n } & Record;\n /** Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops. */\n job_kill: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Optional short reason, recorded in the log and forwarded to the job. */\n reason?: string;\n } & Record;\n /** List your background jobs (running and finished) with their ids, kinds, and statuses. */\n job_list: Record;\n /** Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap. */\n job_output: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive. */\n wait?: boolean;\n /** Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum. */\n timeout_ms?: number;\n } & Record;\n /** Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools. */\n ralph: {\n /** The immutable completion objective for every fresh Ralph round. */\n objective: string;\n /** Optional positive safe-integer round cap, bounded by the deployment ceiling. */\n maxRounds?: number;\n } & Record;\n /** Read a UTF-8 text file and return line-numbered content. */\n read: {\n /** Path to read, resolved by the filesystem backend. */\n file_path: string;\n /** 1-based first line to return. Defaults to 1. */\n offset?: number;\n /** Maximum number of lines to return. Defaults to 2000. */\n limit?: number;\n } & Record;\n /** Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered. */\n send_message: {\n /** The subagent id returned when the background subagent was started. */\n subagent_id: string;\n /** The message to deliver to the subagent. */\n message: string;\n } & Record;\n /** Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill. */\n skill: {\n /** The exact skill name from the available skills list. */\n name: string;\n } & Record;\n /** Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result. */\n subagent: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs. */\n prompt: string;\n /** Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it. */\n run_in_background?: boolean;\n } & Record;\n /** Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result. */\n subagent_fork: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new. */\n prompt: string;\n } & Record;\n /** Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished). */\n todo_write: {\n /** The COMPLETE task list, replacing any previous list. */\n todos: ({\n /** What the task is — a short imperative line. */\n content: string;\n /** pending (not started) | in_progress (now) | completed (done). */\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n } & Record;\n /** Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn. The workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result. Script-body hooks: - `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly. - `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages. - `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`. - `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim. Misused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`. Constraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes. */\n workflow: {\n /** The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `). */\n script: string;\n /** The workflow identity block (plain JSON — never code). */\n meta: {\n /** Short kebab-case workflow name. */\n name: string;\n /** One-line description of what the workflow does. */\n description: string;\n /** Optional guidance on when this workflow applies. */\n whenToUse?: string;\n /** Optional phase declarations matched by phase() calls. */\n phases?: ({\n /** The phase title phase() calls match by exact string. */\n title: string;\n /** Optional one-line description of the phase. */\n detail?: string;\n /** Optional provider override this phase is expected to use. */\n provider?: string;\n /** Optional model override this phase is expected to use. */\n model?: string;\n } & Record)[];\n } & Record;\n /** Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}). */\n args?: Record;\n } & Record;\n /** Create or fully replace a UTF-8 text file. */\n write: {\n /** Path to write, resolved by the filesystem backend. */\n file_path: string;\n /** Full UTF-8 text content to write. */\n content: string;\n } & Record;\n}\n\ninterface ToolOutputMap {\n bash: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"foreground\";\n exitCode: number | null;\n signal: string | null;\n timedOut: boolean;\n aborted: boolean;\n timeoutMs: number;\n stdout: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n stderr: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n sandbox?: {\n mode: string;\n denied: boolean;\n enforcement?: string;\n runnerFailed?: boolean;\n };\n };\n cordis_define: {\n pluginId: string;\n packageId: string;\n name: string;\n purpose: string;\n hasHostHalf: boolean;\n hasClientHalf: boolean;\n };\n cordis_inspect_list: JsonValue;\n cordis_inspect_query: JsonValue;\n cordis_inspect_self: JsonValue;\n cordis_run: JsonValue;\n cordis_stop: {\n pluginId: string;\n };\n cordis_undefine: {\n pluginId: string;\n wasRunning: boolean;\n };\n edit: {\n path: string;\n before: string;\n after: string;\n };\n interrupt_agent: {\n accepted: boolean;\n };\n job_kill: {\n outcome: \"cancellation-requested\" | \"already-finished\";\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n job_list: ({\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n })[];\n job_output: {\n text: string;\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n ralph: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n read: {\n path: string;\n offset: number;\n lines: {\n number: number;\n text: string;\n }[];\n totalLines: number;\n };\n send_message: {\n messageId: string;\n };\n skill: {\n name: string;\n provider: string;\n resourceBase?: {\n kind: \"directory\";\n path: string;\n } | {\n kind: \"url\";\n url: string;\n } | {\n kind: \"opaque\";\n description: string;\n };\n content: string;\n };\n subagent: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n subagent_fork: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n todo_write: {\n todos: ({\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n counts: {\n pending: number;\n inProgress: number;\n completed: number;\n };\n };\n workflow: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n write: {\n path: string;\n operation: \"create\" | \"update\";\n before: string | null;\n after: string;\n };\n}\n\ntype ToolName = keyof ToolOutputMap\n\ndeclare class ToolCallError extends Error {\n readonly name: \"ToolCallError\";\n readonly toolName: ToolName;\n}\n\ndeclare const tools: {\n [K in ToolName]: (args: ToolArgsMap[K]) => Promise;\n}\n```","tools":[{"name":"bash","description":"Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`.","parameters":{"type":"object","properties":{"command":{"type":"string","description":"The bash command to execute."},"description":{"type":"string","description":"Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\"."},"timeoutMs":{"type":"number","description":"Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."},"workdir":{"type":"string","description":"Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."},"run_in_background":{"type":"boolean","description":"Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."}},"required":["command","description"]}},{"name":"cordis_define","description":"Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs.","parameters":{"type":"object","properties":{"plugin":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"new"},"idPrefix":{"type":"string","description":"Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix."}},"required":["kind","idPrefix"]},{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"existing"},"pluginId":{"type":"string","description":"Exact ID of an existing Plugin; the new Package is appended to that instance."}},"required":["kind","pluginId"]}]},"name":{"type":"string","description":"Short, readable Package name."},"purpose":{"type":"string","description":"One-sentence, user-facing description of the Package purpose."},"code":{"type":"object","additionalProperties":false,"properties":{"host":{"type":"string","description":"Plain JavaScript function body that returns the Host-half Cordis Plugin."},"client":{"type":"string","description":"Plain JavaScript function body that returns the browser Client-half Cordis Plugin."}}}},"required":["plugin","name","purpose","code"]}},{"name":"cordis_inspect_list","description":"List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call.","parameters":{"type":"object","properties":{}}},{"name":"cordis_inspect_query","description":"Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props.","parameters":{"type":"object","properties":{"platform":{"type":"string","description":"Runtime platform that owns the Provider.","enum":["host","client"]},"provider":{"type":"string","description":"Exact Provider ID returned by cordis_inspect_list."},"method":{"type":"string","description":"Exact method name declared by the Provider manifest."},"input":{"description":"Optional query input; it must satisfy the method input schema."}},"required":["platform","provider","method"]}},{"name":"cordis_inspect_self","description":"Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin."},"packageId":{"type":"string","description":"Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned."}}}},{"name":"cordis_run","description":"Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define."},"packageId":{"type":"string","description":"Exact immutable Package ID to activate under that Plugin."},"mode":{"type":"string","description":"Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package.","enum":["run","update"]}},"required":["pluginId","packageId","mode"]}},{"name":"cordis_stop","description":"Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to stop."}},"required":["pluginId"]}},{"name":"cordis_undefine","description":"Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to remove permanently."}},"required":["pluginId"]}},{"name":"edit","description":"Edit an existing UTF-8 text file by replacing literal text.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to edit, resolved by the filesystem backend."},"old_string":{"type":"string","description":"Literal text to replace. Must match exactly."},"new_string":{"type":"string","description":"Literal replacement text. Use an empty string to delete the match."},"replace_all":{"type":"boolean","description":"Replace all matches. Defaults to false; when false, old_string must appear exactly once."}},"required":["file_path","old_string","new_string"]}},{"name":"interrupt_agent","description":"Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op.","parameters":{"type":"object","properties":{"agent_id":{"type":"string","description":"The agent id of the running agent to interrupt."}},"required":["agent_id"]}},{"name":"job_kill","description":"Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"reason":{"type":"string","description":"Optional short reason, recorded in the log and forwarded to the job."}},"required":["job_id"]}},{"name":"job_list","description":"List your background jobs (running and finished) with their ids, kinds, and statuses.","parameters":{"type":"object","properties":{}}},{"name":"job_output","description":"Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"wait":{"type":"boolean","description":"Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive."},"timeout_ms":{"type":"number","description":"Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum."}},"required":["job_id"]}},{"name":"ralph","description":"Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools.","parameters":{"type":"object","properties":{"objective":{"type":"string","description":"The immutable completion objective for every fresh Ralph round."},"maxRounds":{"type":"number","description":"Optional positive safe-integer round cap, bounded by the deployment ceiling."}},"required":["objective"]}},{"name":"read","description":"Read a UTF-8 text file and return line-numbered content.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to read, resolved by the filesystem backend."},"offset":{"type":"number","description":"1-based first line to return. Defaults to 1."},"limit":{"type":"number","description":"Maximum number of lines to return. Defaults to 2000."}},"required":["file_path"]}},{"name":"run_code","description":"Execute a TypeScript program against the available tools. Write the BODY of an async function (erasable syntax only; top-level `await` and `return` work) and call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.","parameters":{"type":"object","properties":{"code":{"type":"string","description":"The program: the body of an async TypeScript function."},"description":{"type":"string","description":"Clear, concise description of what this program does in active voice, 5-10 words (shown in the UI). Examples: \"Count TODO markers across packages\"; \"Read failing test and its fixture\"; \"Rename config key in every cordis.yml\"."}},"required":["code","description"]}},{"name":"send_message","description":"Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered.","parameters":{"type":"object","properties":{"subagent_id":{"type":"string","description":"The subagent id returned when the background subagent was started."},"message":{"type":"string","description":"The message to deliver to the subagent."}},"required":["subagent_id","message"]}},{"name":"skill","description":"Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill.","parameters":{"type":"object","properties":{"name":{"type":"string","description":"The exact skill name from the available skills list."}},"required":["name"]}},{"name":"subagent","description":"Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs."},"run_in_background":{"type":"boolean","description":"Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it."}},"required":["description","prompt"]}},{"name":"subagent_fork","description":"Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new."}},"required":["description","prompt"]}},{"name":"todo_write","description":"Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished).","parameters":{"type":"object","properties":{"todos":{"type":"array","description":"The COMPLETE task list, replacing any previous list.","items":{"type":"object","additionalProperties":false,"properties":{"content":{"type":"string","description":"What the task is — a short imperative line."},"status":{"type":"string","description":"pending (not started) | in_progress (now) | completed (done).","enum":["pending","in_progress","completed"]}},"required":["content","status"]}}},"required":["todos"]}},{"name":"workflow","description":"Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn.\n\nThe workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result.\n\nScript-body hooks:\n- `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly.\n- `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages.\n- `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`.\n- `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim.\n\nMisused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`.\n\nConstraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes.","parameters":{"type":"object","properties":{"script":{"type":"string","description":"The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `)."},"meta":{"type":"object","description":"The workflow identity block (plain JSON — never code).","additionalProperties":true,"properties":{"name":{"type":"string","description":"Short kebab-case workflow name."},"description":{"type":"string","description":"One-line description of what the workflow does."},"whenToUse":{"type":"string","description":"Optional guidance on when this workflow applies."},"phases":{"type":"array","description":"Optional phase declarations matched by phase() calls.","items":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string","description":"The phase title phase() calls match by exact string."},"detail":{"type":"string","description":"Optional one-line description of the phase."},"provider":{"type":"string","description":"Optional provider override this phase is expected to use."},"model":{"type":"string","description":"Optional model override this phase is expected to use."}},"required":["title"]}}},"required":["name","description"]},"args":{"type":"object","description":"Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}).","additionalProperties":true}},"required":["script","meta"]}},{"name":"write","description":"Create or fully replace a UTF-8 text file.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to write, resolved by the filesystem backend."},"content":{"type":"string","description":"Full UTF-8 text content to write."}},"required":["file_path","content"]}}]},"reason":"initial"}} +{"type":"request/header","seq":8,"time":1785498584067,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"You are an AI agent powered by DeepSeek Harness.\n\nYou are headless-agent, a coding assistant powered by the deepseek-v4-flash model. Your working directory is {{cwd}}.\n\nVerify your work by running the code or tests. Keep answers brief and factual.\n\n\nUse the read tool — not shell commands like cat — to inspect text files. Results include line numbers. Use offset and limit to continue reading large files.\n\nUse the write tool to create files or completely replace file contents. Existing files are overwritten, so read an existing file first (the default fs-observation-policy requires it) and prefer edit for targeted changes.\n\nUse the edit tool for targeted changes to existing UTF-8 text files. It replaces literal old_string with new_string; by default old_string must appear exactly once. If old_string appears multiple times, provide a more specific old_string or set replace_all to true. Read the file first (the default fs-observation-policy requires it), unless you just created or edited it in this session.\n\nCheck the [exit code: N] marker on every bash result; investigate failures before moving on.\n\nTrack every background job id you start. You are notified in-session when a job finishes — do not busy-poll or sleep on one; keep working on independent steps and do not duplicate a running job's work. Before giving a final answer, collect every still-relevant job with job_output (set wait: true only when you are genuinely blocked on it), and job_kill jobs that stopped mattering.\n\nUse the workflow tool ONLY when the user explicitly asks for a workflow or for large multi-agent orchestration: you write a JavaScript script (the tool description documents the exact format) that fans work out across many subagents with phases and structured results. For one or two delegations, prefer plain subagent calls.\n\n# Dynamic Cordis Plugins\n\nDynamic Cordis plugins temporarily extend the current DSH process. A Plugin uses apply(ctx) to consume Services, listen to Events, provide Services, register model Tools, or register browser UI in Slots.\n\n- Plugin and Package definitions exist only in the current process. define itself does not modify repository source, configuration, or disk, and definitions do not survive a process restart.\n- The restricted execution environment prevents accidental misuse; it is not a security boundary for malicious code. Services obtained by dynamic code connect to the real runtime.\n\n## Make the user-facing plan clear first\n\n- Dynamic Cordis Plugins are one available implementation mechanism, not the default for every request. Consider whether one could help only when the user intends to design or create something, or when a temporary interface could materially aid the current work. The presence of these instructions or Tools, and discussion of Cordis itself, do not make a request a dynamic-Plugin task.\n- When Cordis is a plausible fit, infer the intended work target and lifetime from the request and conversation. Use it only when the outcome belongs to the current running harness and should be delivered as a temporary runtime extension. If that distinction is materially ambiguous, ask at most one concise question about the intended result or lifetime. Otherwise proceed with the matching workflow; do not require the user to know or choose Cordis as an implementation mechanism.\n- Once a dynamic Plugin is appropriate, decide whether the task creates a new Plugin or modifies the Plugin named by the user with @pluginId. Proceed directly when the goal is clear; do not ask for repeated confirmation.\n- Choose Host, Client, or both from the requested outcome. Do not propose a Client/browser UI when the task does not need visible page behavior, and do not avoid Client when the requested outcome is visual, interactive, or depends on page state. Host versus Client is an implementation choice; do not make the user choose it.\n- When a design direction or a potentially useful interface would materially affect the result, ask at most one concise outcome or creative-preference question and offer a few candidate directions. Otherwise proceed directly; do not conduct a multi-round interview or a complex questionnaire.\n- cordis_define only defines and presents code; it does not run it. After definition, explain the pluginId and packageId returned by the Host and whether the next step is a run or update.\n- cordis_run may require user approval. When it returns awaiting-approval, explain that the user must allow or reject it in the UI. Do not wait, retry, or claim that it is running.\n- When it returns starting, explain that the request has entered the asynchronous flow and the Client is still activating. starting does not mean success. Wait for the system to report the final result through steering context.\n- Do not request approval again after the user rejects it. After a technical failure, fix the same Plugin from its diagnostics; do not silently create a replacement Plugin.\n\n## Recommended workflow and Tools\n\nBefore creating, modifying, or repairing a Plugin, load the cordis-plugin-development Skill. The Skill provides requirement navigation, capability composition, complete examples, and troubleshooting. Treat Inspect Provider results as the source of truth for exact APIs.\n\n1. cordis_inspect_list: discover the current Host and Client Providers and their read-only query methods.\n2. cordis_inspect_query: use the returned platform, provider, method, and schema to query exact Service, Event, Builtin, Slot, Theme token, or Tool information.\n3. cordis_inspect_self: inspect the current Session's Plugins, Packages, version pointers, source, and diagnostics. Source is returned only when both pluginId and packageId are specified.\n4. cordis_define: create the first Package for a new Plugin or append an immutable Package to an existing Plugin. It defines code but does not run it.\n5. cordis_run: activate an exact Package. Use run for the first activation, restarting current, or rollback; use update to switch versions.\n6. cordis_stop: remove the current Run and pending approval request while retaining definitions, grants, and version pointers.\n7. cordis_undefine: permanently stop and delete a Plugin and all of its Packages. Use it only after confirming that the user no longer needs them.\n\n- Inspect and Catalog data only confirm capabilities, names, signatures, types, and registration protocols before code is written; they do not replace business APIs.\n- Query Service.listService and Event.listEvents without input to choose from their compact signature directories, then query the exact service or event before using it. Exact queries return the structured contract and only its referenced types.\n- At runtime, a Plugin must call real Services or listen to real Events. Do not cache, display, or depend on Inspect results as business data.\n\n## Identity, versions, and approval\n\n- pluginId identifies a Plugin that can be modified over time. For a new Plugin, submit only a semantic idPrefix of 3–6 lowercase English letters; the Host allocates the final ID.\n- packageId identifies one immutable Host/Client source version under a Plugin. To change code, define a new Package; never overwrite an old version.\n- pluginRunId identifies one activation attempt and connects its approval, Host/Client loading, private RPC, Run card, and errors.\n- currentPackageId is the most recent fully successful Package. Stopping, starting an update, or failing an update does not clear it.\n- nextPackageId is the target awaiting approval, being attempted, awaiting Client activation, or most recently failed.\n- A single check mark authorizes only the current Package; double check marks authorize future versions of the same Plugin. A grant remains in effect after a technical failure.\n- An update stops the old Run before starting the target Package. Failure does not automatically restart the old version; retry next with update or roll back to current with run.\n\nWhen the user enters @pluginId, the system injects identity, the default base Package, version pointers, and runtime status, but not source code:\n\n1. Call cordis_inspect_self(pluginId, packageId) to read the target source.\n2. Use cordis_define in existing mode to append a Package to the same Plugin.\n3. Call cordis_run in run or update mode according to the version relationship.\n\nNever silently create another Plugin for @pluginId. If the reference is unavailable because it was removed, belongs to another Session, or was lost on process restart, tell the user directly.\n\n## High-frequency errors that must be avoided\n\n### Services: ctx.get and inject\n\n- Read an optional Service with ctx.get('serviceName') by default and handle undefined.\n- Declare inject: ['serviceName'] on the returned Plugin object only when the Service is a hard dependency and the Plugin must enter waiting until Cordis reactivates it after the Service appears.\n- Read ctx.serviceName only after declaring that Service in inject. Never access an undeclared Service as a ctx property.\n\n```js\nreturn {\n inject: ['requiredService'],\n apply(ctx) {\n ctx.requiredService.someMethod()\n const optionalService = ctx.get('optionalService')\n if (optionalService !== undefined) optionalService.someMethod()\n },\n}\n```\n\n### Code: use plain JavaScript only\n\n- Host and Client code is not transformed by TypeScript, JSX, or a bundler.\n- Do not use TypeScript types, as, decorators, import, require, or JSX.\n- Client React code must use React.createElement(...); never write .\n- Do not assume that process, Buffer, window, document, fetch, native timers, or any other global is available. Query the corresponding platform's Builtins and Services first.\n\n### Data: do not serialize live data\n\n- Services, Events, Slots, Sessions, and their derived Cordis/DSH objects are internal live data, not ordinary JSON that can be dumped.\n- Do not apply JSON.stringify, structuredClone, recursive enumeration, full copying, or whole-object display to live data.\n- Read only the leaf fields required by the task, then construct the smallest owned data object without Host references.\n\n### Lifecycle: every side effect must be reversible\n\n- Services, Events, Tools, handlers, timers, Slots, styles, and theme overrides must all belong to the current Fiber.\n- Use ctx.effect(), ctx.on(), or official APIs that return a disposer so stop, update, or undefine removes every side effect.\n- The cordis-plugin-development Skill contains complete timer, Waterfall, Slot, theme, Tool, RPC, and React examples and troubleshooting guidance.\n\n## Host and Client\n\n- Host runs in the DSH Node.js process and is appropriate for files, networking, commands, Agent/Session access, Host Events, Services, model Tools, and JSON methods callable by the Client.\n- Client runs in the browser page and is appropriate for themes, layout, current page state, Tool cards, and Slot UI.\n- Host and Client communicate through Package-private JSON methods: Host uses harness.handle(method, handler), and Client uses host.call(method, args). The direction is Client→Host, and only lossless JSON may cross it.\n- Client UI must be registered in a queried Slot; apply() cannot directly return a React Element. Query Slots.listSubTree without root to choose from the compact purpose/topology tree, then query the exact root for its full registration contract and props before writing code.\n- See the Skill and Inspect Providers for Run-specific panels and exact Slot registration patterns.\n\n## Asynchronous results and recovery\n\n- Do not wait inside a Tool for approval or browser work that can happen only after the current turn ends.\n- Asynchronous success, rejection, and runtime errors update Run state and notify you through steering context.\n- After a technical failure, use cordis_inspect_self to read the exact Package source and its message/stack. Define a corrected Package under the same Plugin and retry autonomously.\n- Use the cordis-plugin-development Skill for other failure causes, repair procedures, and complete extension patterns.\n\nUse the ralph tool ONLY when the direct human explicitly asks for a Ralph loop or fresh-agent iterative execution. Each Ralph round starts a fresh child with no conversation seed and uses the shared workspace as durable memory. Completion and blockers are worker reports, not independent evaluation. Use same-session goal tools for ordinary long-running objectives, and plain subagents or workflows for bounded delegation and fan-out.\n\nUse subagent in the background by default. Start independent delegations together in one assistant message and continue useful work while they run. Set `run_in_background: false` only when your next action depends on that subagent's result. When a background run settles, the runtime sends you a notice containing its outcome and any final assistant message.\n\n## Writing code for run_code\n\n`run_code` takes two required arguments: `code` — the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped) — and `description`, a short summary of what the program does. Inside the program:\n\n- Call tools as `await tools.name(args)` — quoted access for exotic names: `tools[\"my-tool\"](args)`. Every call resolves to the tool's typed canonical JSON value. Tool arguments must be lossless JSON.\n- A FAILED tool call rejects with `ToolCallError`, whose `toolName` identifies the failed tool and whose `message` is human-readable — `try/catch` it to handle and continue.\n- Independent read-only calls MAY overlap under `Promise.all` (safe calls run concurrently; mutating calls run alone, in submission order). Sequence dependent work with `await`.\n- Emit results with `return` and/or `console.log(...)`. ONLY what you print or return comes back to you — intermediate tool results never enter the conversation, so extract just what you need.\n\nThe available tools:\n\n```ts\ntype JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }\n\ninterface ToolArgsMap {\n /** Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`. */\n bash: {\n /** The bash command to execute. */\n command: string;\n /** Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\". */\n description: string;\n /** Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry. */\n timeoutMs?: number;\n /** Working directory for this command. Defaults to the session workspace; a relative path is resolved against it. */\n workdir?: string;\n /** Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies. */\n run_in_background?: boolean;\n } & Record;\n /** Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs. */\n cordis_define: {\n plugin: {\n kind: \"new\";\n /** Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix. */\n idPrefix: string;\n } | {\n kind: \"existing\";\n /** Exact ID of an existing Plugin; the new Package is appended to that instance. */\n pluginId: string;\n };\n /** Short, readable Package name. */\n name: string;\n /** One-sentence, user-facing description of the Package purpose. */\n purpose: string;\n code: {\n /** Plain JavaScript function body that returns the Host-half Cordis Plugin. */\n host?: string;\n /** Plain JavaScript function body that returns the browser Client-half Cordis Plugin. */\n client?: string;\n };\n } & Record;\n /** List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call. */\n cordis_inspect_list: Record;\n /** Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props. */\n cordis_inspect_query: {\n /** Runtime platform that owns the Provider. */\n platform: \"host\" | \"client\";\n /** Exact Provider ID returned by cordis_inspect_list. */\n provider: string;\n /** Exact method name declared by the Provider manifest. */\n method: string;\n /** Optional query input; it must satisfy the method input schema. */\n input?: JsonValue;\n } & Record;\n /** Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers. */\n cordis_inspect_self: {\n /** Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin. */\n pluginId?: string;\n /** Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned. */\n packageId?: string;\n } & Record;\n /** Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it. */\n cordis_run: {\n /** Stable Plugin ID returned by cordis_define. */\n pluginId: string;\n /** Exact immutable Package ID to activate under that Plugin. */\n packageId: string;\n /** Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package. */\n mode: \"run\" | \"update\";\n } & Record;\n /** Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal. */\n cordis_stop: {\n /** Stable dynamic Plugin ID to stop. */\n pluginId: string;\n } & Record;\n /** Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead. */\n cordis_undefine: {\n /** Stable dynamic Plugin ID to remove permanently. */\n pluginId: string;\n } & Record;\n /** Edit an existing UTF-8 text file by replacing literal text. */\n edit: {\n /** Path to edit, resolved by the filesystem backend. */\n file_path: string;\n /** Literal text to replace. Must match exactly. */\n old_string: string;\n /** Literal replacement text. Use an empty string to delete the match. */\n new_string: string;\n /** Replace all matches. Defaults to false; when false, old_string must appear exactly once. */\n replace_all?: boolean;\n } & Record;\n /** Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op. */\n interrupt_agent: {\n /** The agent id of the running agent to interrupt. */\n agent_id: string;\n } & Record;\n /** Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops. */\n job_kill: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Optional short reason, recorded in the log and forwarded to the job. */\n reason?: string;\n } & Record;\n /** List your background jobs (running and finished) with their ids, kinds, and statuses. */\n job_list: Record;\n /** Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap. */\n job_output: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive. */\n wait?: boolean;\n /** Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum. */\n timeout_ms?: number;\n } & Record;\n /** Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools. */\n ralph: {\n /** The immutable completion objective for every fresh Ralph round. */\n objective: string;\n /** Optional positive safe-integer round cap, bounded by the deployment ceiling. */\n maxRounds?: number;\n } & Record;\n /** Read a UTF-8 text file and return line-numbered content. */\n read: {\n /** Path to read, resolved by the filesystem backend. */\n file_path: string;\n /** 1-based first line to return. Defaults to 1. */\n offset?: number;\n /** Maximum number of lines to return. Defaults to 2000. */\n limit?: number;\n } & Record;\n /** Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered. */\n send_message: {\n /** The subagent id returned when the background subagent was started. */\n subagent_id: string;\n /** The message to deliver to the subagent. */\n message: string;\n } & Record;\n /** Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill. */\n skill: {\n /** The exact skill name from the available skills list. */\n name: string;\n } & Record;\n /** Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result. */\n subagent: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs. */\n prompt: string;\n /** Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it. */\n run_in_background?: boolean;\n } & Record;\n /** Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result. */\n subagent_fork: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new. */\n prompt: string;\n } & Record;\n /** Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished). */\n todo_write: {\n /** The COMPLETE task list, replacing any previous list. */\n todos: ({\n /** What the task is — a short imperative line. */\n content: string;\n /** pending (not started) | in_progress (now) | completed (done). */\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n } & Record;\n /** Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn. The workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result. Script-body hooks: - `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly. - `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages. - `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`. - `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim. Misused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`. Constraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes. */\n workflow: {\n /** The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `). */\n script: string;\n /** The workflow identity block (plain JSON — never code). */\n meta: {\n /** Short kebab-case workflow name. */\n name: string;\n /** One-line description of what the workflow does. */\n description: string;\n /** Optional guidance on when this workflow applies. */\n whenToUse?: string;\n /** Optional phase declarations matched by phase() calls. */\n phases?: ({\n /** The phase title phase() calls match by exact string. */\n title: string;\n /** Optional one-line description of the phase. */\n detail?: string;\n /** Optional provider override this phase is expected to use. */\n provider?: string;\n /** Optional model override this phase is expected to use. */\n model?: string;\n } & Record)[];\n } & Record;\n /** Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}). */\n args?: Record;\n } & Record;\n /** Create or fully replace a UTF-8 text file. */\n write: {\n /** Path to write, resolved by the filesystem backend. */\n file_path: string;\n /** Full UTF-8 text content to write. */\n content: string;\n } & Record;\n}\n\ninterface ToolOutputMap {\n bash: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"foreground\";\n exitCode: number | null;\n signal: string | null;\n timedOut: boolean;\n aborted: boolean;\n timeoutMs: number;\n stdout: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n stderr: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n sandbox?: {\n mode: string;\n denied: boolean;\n enforcement?: string;\n runnerFailed?: boolean;\n };\n };\n cordis_define: {\n pluginId: string;\n packageId: string;\n name: string;\n purpose: string;\n hasHostHalf: boolean;\n hasClientHalf: boolean;\n };\n cordis_inspect_list: JsonValue;\n cordis_inspect_query: JsonValue;\n cordis_inspect_self: JsonValue;\n cordis_run: JsonValue;\n cordis_stop: {\n pluginId: string;\n };\n cordis_undefine: {\n pluginId: string;\n wasRunning: boolean;\n };\n edit: {\n path: string;\n before: string;\n after: string;\n };\n interrupt_agent: {\n accepted: boolean;\n };\n job_kill: {\n outcome: \"cancellation-requested\" | \"already-finished\";\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n job_list: ({\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n })[];\n job_output: {\n text: string;\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n ralph: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n read: {\n path: string;\n offset: number;\n lines: {\n number: number;\n text: string;\n }[];\n totalLines: number;\n };\n send_message: {\n messageId: string;\n };\n skill: {\n name: string;\n provider: string;\n resourceBase?: {\n kind: \"directory\";\n path: string;\n } | {\n kind: \"url\";\n url: string;\n } | {\n kind: \"opaque\";\n description: string;\n };\n content: string;\n };\n subagent: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n subagent_fork: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n todo_write: {\n todos: ({\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n counts: {\n pending: number;\n inProgress: number;\n completed: number;\n };\n };\n workflow: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n write: {\n path: string;\n operation: \"create\" | \"update\";\n before: string | null;\n after: string;\n };\n}\n\ntype ToolName = keyof ToolOutputMap\n\ndeclare class ToolCallError extends Error {\n readonly name: \"ToolCallError\";\n readonly toolName: ToolName;\n}\n\ndeclare const tools: {\n [K in ToolName]: (args: ToolArgsMap[K]) => Promise;\n}\n```","tools":[{"name":"bash","description":"Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`.","parameters":{"type":"object","properties":{"command":{"type":"string","description":"The bash command to execute."},"description":{"type":"string","description":"Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\"."},"timeoutMs":{"type":"number","description":"Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."},"workdir":{"type":"string","description":"Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."},"run_in_background":{"type":"boolean","description":"Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."}},"required":["command","description"]}},{"name":"cordis_define","description":"Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs.","parameters":{"type":"object","properties":{"plugin":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"new"},"idPrefix":{"type":"string","description":"Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix."}},"required":["kind","idPrefix"]},{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"existing"},"pluginId":{"type":"string","description":"Exact ID of an existing Plugin; the new Package is appended to that instance."}},"required":["kind","pluginId"]}]},"name":{"type":"string","description":"Short, readable Package name."},"purpose":{"type":"string","description":"One-sentence, user-facing description of the Package purpose."},"code":{"type":"object","additionalProperties":false,"properties":{"host":{"type":"string","description":"Plain JavaScript function body that returns the Host-half Cordis Plugin."},"client":{"type":"string","description":"Plain JavaScript function body that returns the browser Client-half Cordis Plugin."}}}},"required":["plugin","name","purpose","code"]}},{"name":"cordis_inspect_list","description":"List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call.","parameters":{"type":"object","properties":{}}},{"name":"cordis_inspect_query","description":"Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props.","parameters":{"type":"object","properties":{"platform":{"type":"string","description":"Runtime platform that owns the Provider.","enum":["host","client"]},"provider":{"type":"string","description":"Exact Provider ID returned by cordis_inspect_list."},"method":{"type":"string","description":"Exact method name declared by the Provider manifest."},"input":{"description":"Optional query input; it must satisfy the method input schema."}},"required":["platform","provider","method"]}},{"name":"cordis_inspect_self","description":"Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin."},"packageId":{"type":"string","description":"Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned."}}}},{"name":"cordis_run","description":"Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define."},"packageId":{"type":"string","description":"Exact immutable Package ID to activate under that Plugin."},"mode":{"type":"string","description":"Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package.","enum":["run","update"]}},"required":["pluginId","packageId","mode"]}},{"name":"cordis_stop","description":"Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to stop."}},"required":["pluginId"]}},{"name":"cordis_undefine","description":"Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to remove permanently."}},"required":["pluginId"]}},{"name":"edit","description":"Edit an existing UTF-8 text file by replacing literal text.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to edit, resolved by the filesystem backend."},"old_string":{"type":"string","description":"Literal text to replace. Must match exactly."},"new_string":{"type":"string","description":"Literal replacement text. Use an empty string to delete the match."},"replace_all":{"type":"boolean","description":"Replace all matches. Defaults to false; when false, old_string must appear exactly once."}},"required":["file_path","old_string","new_string"]}},{"name":"interrupt_agent","description":"Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op.","parameters":{"type":"object","properties":{"agent_id":{"type":"string","description":"The agent id of the running agent to interrupt."}},"required":["agent_id"]}},{"name":"job_kill","description":"Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"reason":{"type":"string","description":"Optional short reason, recorded in the log and forwarded to the job."}},"required":["job_id"]}},{"name":"job_list","description":"List your background jobs (running and finished) with their ids, kinds, and statuses.","parameters":{"type":"object","properties":{}}},{"name":"job_output","description":"Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"wait":{"type":"boolean","description":"Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive."},"timeout_ms":{"type":"number","description":"Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum."}},"required":["job_id"]}},{"name":"ralph","description":"Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools.","parameters":{"type":"object","properties":{"objective":{"type":"string","description":"The immutable completion objective for every fresh Ralph round."},"maxRounds":{"type":"number","description":"Optional positive safe-integer round cap, bounded by the deployment ceiling."}},"required":["objective"]}},{"name":"read","description":"Read a UTF-8 text file and return line-numbered content.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to read, resolved by the filesystem backend."},"offset":{"type":"number","description":"1-based first line to return. Defaults to 1."},"limit":{"type":"number","description":"Maximum number of lines to return. Defaults to 2000."}},"required":["file_path"]}},{"name":"run_code","description":"Execute a TypeScript program against the available tools. Takes two required arguments: `code`, the BODY of an async function (erasable syntax only; top-level `await` and `return` work), and `description`, a short summary of what the program does. Call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.","parameters":{"type":"object","properties":{"code":{"type":"string","description":"The program: the body of an async TypeScript function."},"description":{"type":"string","description":"Clear, concise description of what this program does in active voice, 5-10 words (shown in the UI). Examples: \"Count TODO markers across packages\"; \"Read failing test and its fixture\"; \"Rename config key in every cordis.yml\"."}},"required":["code","description"]}},{"name":"send_message","description":"Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered.","parameters":{"type":"object","properties":{"subagent_id":{"type":"string","description":"The subagent id returned when the background subagent was started."},"message":{"type":"string","description":"The message to deliver to the subagent."}},"required":["subagent_id","message"]}},{"name":"skill","description":"Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill.","parameters":{"type":"object","properties":{"name":{"type":"string","description":"The exact skill name from the available skills list."}},"required":["name"]}},{"name":"subagent","description":"Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs."},"run_in_background":{"type":"boolean","description":"Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it."}},"required":["description","prompt"]}},{"name":"subagent_fork","description":"Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new."}},"required":["description","prompt"]}},{"name":"todo_write","description":"Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished).","parameters":{"type":"object","properties":{"todos":{"type":"array","description":"The COMPLETE task list, replacing any previous list.","items":{"type":"object","additionalProperties":false,"properties":{"content":{"type":"string","description":"What the task is — a short imperative line."},"status":{"type":"string","description":"pending (not started) | in_progress (now) | completed (done).","enum":["pending","in_progress","completed"]}},"required":["content","status"]}}},"required":["todos"]}},{"name":"workflow","description":"Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn.\n\nThe workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result.\n\nScript-body hooks:\n- `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly.\n- `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages.\n- `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`.\n- `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim.\n\nMisused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`.\n\nConstraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes.","parameters":{"type":"object","properties":{"script":{"type":"string","description":"The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `)."},"meta":{"type":"object","description":"The workflow identity block (plain JSON — never code).","additionalProperties":true,"properties":{"name":{"type":"string","description":"Short kebab-case workflow name."},"description":{"type":"string","description":"One-line description of what the workflow does."},"whenToUse":{"type":"string","description":"Optional guidance on when this workflow applies."},"phases":{"type":"array","description":"Optional phase declarations matched by phase() calls.","items":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string","description":"The phase title phase() calls match by exact string."},"detail":{"type":"string","description":"Optional one-line description of the phase."},"provider":{"type":"string","description":"Optional provider override this phase is expected to use."},"model":{"type":"string","description":"Optional model override this phase is expected to use."}},"required":["title"]}}},"required":["name","description"]},"args":{"type":"object","description":"Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}).","additionalProperties":true}},"required":["script","meta"]}},{"name":"write","description":"Create or fully replace a UTF-8 text file.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to write, resolved by the filesystem backend."},"content":{"type":"string","description":"Full UTF-8 text content to write."}},"required":["file_path","content"]}}]},"reason":"initial"}} {"type":"request/context","seq":9,"time":1785730501646,"data":{"provider":"deepseek-official","model":"deepseek-v4-flash"}} {"type":"assistant/chunk","seq":10,"time":1783957884701,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"text"}}} {"type":"assistant/chunk","seq":11,"time":1783957884701,"data":{"turn":1,"step":1,"chunk":{"type":"text-delta","index":0,"text":"WORKFLOW_CHILD_OK"}}} {"type":"assistant/chunk","seq":12,"time":1783957884701,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"WORKFLOW_CHILD_OK"}}}} {"type":"assistant/chunk","seq":13,"time":1785498584067,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} {"type":"assistant/chunk","seq":14,"time":1785730501646,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"stop"}}}} -{"type":"assistant/message","seq":15,"time":1785730501646,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"text","text":"WORKFLOW_CHILD_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"9091fda5-4d10-4d7d-8cd2-53aa493c9dd1"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[10,11,12,13,14],"surfaceOp":"append"} +{"type":"assistant/message","seq":15,"time":1785730501646,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"text","text":"WORKFLOW_CHILD_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"cd78f077-1fad-4cdc-ab56-09d39d9095cd"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[10,11,12,13,14],"surfaceOp":"append"} {"type":"step/end","seq":16,"time":1785730501646,"data":{"turn":1,"step":1}} {"type":"turn/end","seq":17,"time":1785730501646,"data":{"turn":1,"reason":{"kind":"completed"}}} diff --git a/examples/headless-agent/tests/snapshots/advanced-toolchain/session.jsonl b/examples/headless-agent/tests/snapshots/advanced-toolchain/session.jsonl index a7183e045c..19e4ec8138 100644 --- a/examples/headless-agent/tests/snapshots/advanced-toolchain/session.jsonl +++ b/examples/headless-agent/tests/snapshots/advanced-toolchain/session.jsonl @@ -1,20 +1,20 @@ {"type":"session","version":0,"id":"11111111-1111-4111-8111-111111111111","createdAt":1783950000000,"cwd":"{{cwd}}","delegationDepth":0} -{"type":"agent/inbox/spliced","seq":0,"time":1785498583746,"data":{"target":"next-turn","start":0,"inserted":[{"content":[{"type":"text","text":"Run this advanced flow exactly once: define a host-only dynamic Cordis Package named Snapshot Marker; run and inspect snap-1/pkg-1 through run_code; delegate once to a direct spawn child; run one workflow that delegates to another spawn child; remove snap-1; then reply with exactly ADVANCED_HEADLESS_OK."}],"source":{"kind":"user"},"role":"user","id":"eeafe3ec-26b4-4e44-ae07-96422e3691ac"}]}} +{"type":"agent/inbox/spliced","seq":0,"time":1785498583746,"data":{"target":"next-turn","start":0,"inserted":[{"content":[{"type":"text","text":"Run this advanced flow exactly once: define a host-only dynamic Cordis Package named Snapshot Marker; run and inspect snap-1/pkg-1 through run_code; delegate once to a direct spawn child; run one workflow that delegates to another spawn child; remove snap-1; then reply with exactly ADVANCED_HEADLESS_OK."}],"source":{"kind":"user"},"role":"user","id":"8a0ac233-283c-4eb4-8bbd-5c50b7e99afe"}]}} {"type":"turn/start","seq":1,"time":1785821454304,"data":{"turn":1}} {"type":"agent/inbox/spliced","seq":2,"time":1785821454304,"data":{"target":"next-turn","start":0,"removedCount":1,"inserted":[]}} {"type":"step/start","seq":3,"time":1783957884486,"data":{"turn":1,"step":1}} -{"type":"user/message","seq":4,"time":1785498583779,"data":{"content":[{"type":"text","text":"Run this advanced flow exactly once: define a host-only dynamic Cordis Package named Snapshot Marker; run and inspect snap-1/pkg-1 through run_code; delegate once to a direct spawn child; run one workflow that delegates to another spawn child; remove snap-1; then reply with exactly ADVANCED_HEADLESS_OK."}],"source":{"kind":"user"},"role":"user","id":"eeafe3ec-26b4-4e44-ae07-96422e3691ac"},"surfaceOp":"append"} +{"type":"user/message","seq":4,"time":1785498583779,"data":{"content":[{"type":"text","text":"Run this advanced flow exactly once: define a host-only dynamic Cordis Package named Snapshot Marker; run and inspect snap-1/pkg-1 through run_code; delegate once to a direct spawn child; run one workflow that delegates to another spawn child; remove snap-1; then reply with exactly ADVANCED_HEADLESS_OK."}],"source":{"kind":"user"},"role":"user","id":"8a0ac233-283c-4eb4-8bbd-5c50b7e99afe"},"surfaceOp":"append"} {"type":"session/title","seq":5,"time":1785498583779,"data":{"title":"Run this advanced flow exactly","messageSeqs":[4],"source":{"kind":"fallback"}}} -{"type":"request/header","seq":6,"time":1785498583782,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"You are an AI agent powered by DeepSeek Harness.\n\nYou are headless-agent, a coding assistant powered by the deepseek-v4-flash model. Your working directory is {{cwd}}.\n\nVerify your work by running the code or tests. Keep answers brief and factual.\n\n\nUse the read tool — not shell commands like cat — to inspect text files. Results include line numbers. Use offset and limit to continue reading large files.\n\nUse the write tool to create files or completely replace file contents. Existing files are overwritten, so read an existing file first (the default fs-observation-policy requires it) and prefer edit for targeted changes.\n\nUse the edit tool for targeted changes to existing UTF-8 text files. It replaces literal old_string with new_string; by default old_string must appear exactly once. If old_string appears multiple times, provide a more specific old_string or set replace_all to true. Read the file first (the default fs-observation-policy requires it), unless you just created or edited it in this session.\n\nCheck the [exit code: N] marker on every bash result; investigate failures before moving on.\n\nTrack every background job id you start. You are notified in-session when a job finishes — do not busy-poll or sleep on one; keep working on independent steps and do not duplicate a running job's work. Before giving a final answer, collect every still-relevant job with job_output (set wait: true only when you are genuinely blocked on it), and job_kill jobs that stopped mattering.\n\nUse the workflow tool ONLY when the user explicitly asks for a workflow or for large multi-agent orchestration: you write a JavaScript script (the tool description documents the exact format) that fans work out across many subagents with phases and structured results. For one or two delegations, prefer plain subagent calls.\n\n# Dynamic Cordis Plugins\n\nDynamic Cordis plugins temporarily extend the current DSH process. A Plugin uses apply(ctx) to consume Services, listen to Events, provide Services, register model Tools, or register browser UI in Slots.\n\n- Plugin and Package definitions exist only in the current process. define itself does not modify repository source, configuration, or disk, and definitions do not survive a process restart.\n- The restricted execution environment prevents accidental misuse; it is not a security boundary for malicious code. Services obtained by dynamic code connect to the real runtime.\n\n## Make the user-facing plan clear first\n\n- Dynamic Cordis Plugins are one available implementation mechanism, not the default for every request. Consider whether one could help only when the user intends to design or create something, or when a temporary interface could materially aid the current work. The presence of these instructions or Tools, and discussion of Cordis itself, do not make a request a dynamic-Plugin task.\n- When Cordis is a plausible fit, infer the intended work target and lifetime from the request and conversation. Use it only when the outcome belongs to the current running harness and should be delivered as a temporary runtime extension. If that distinction is materially ambiguous, ask at most one concise question about the intended result or lifetime. Otherwise proceed with the matching workflow; do not require the user to know or choose Cordis as an implementation mechanism.\n- Once a dynamic Plugin is appropriate, decide whether the task creates a new Plugin or modifies the Plugin named by the user with @pluginId. Proceed directly when the goal is clear; do not ask for repeated confirmation.\n- Choose Host, Client, or both from the requested outcome. Do not propose a Client/browser UI when the task does not need visible page behavior, and do not avoid Client when the requested outcome is visual, interactive, or depends on page state. Host versus Client is an implementation choice; do not make the user choose it.\n- When a design direction or a potentially useful interface would materially affect the result, ask at most one concise outcome or creative-preference question and offer a few candidate directions. Otherwise proceed directly; do not conduct a multi-round interview or a complex questionnaire.\n- cordis_define only defines and presents code; it does not run it. After definition, explain the pluginId and packageId returned by the Host and whether the next step is a run or update.\n- cordis_run may require user approval. When it returns awaiting-approval, explain that the user must allow or reject it in the UI. Do not wait, retry, or claim that it is running.\n- When it returns starting, explain that the request has entered the asynchronous flow and the Client is still activating. starting does not mean success. Wait for the system to report the final result through steering context.\n- Do not request approval again after the user rejects it. After a technical failure, fix the same Plugin from its diagnostics; do not silently create a replacement Plugin.\n\n## Recommended workflow and Tools\n\nBefore creating, modifying, or repairing a Plugin, load the cordis-plugin-development Skill. The Skill provides requirement navigation, capability composition, complete examples, and troubleshooting. Treat Inspect Provider results as the source of truth for exact APIs.\n\n1. cordis_inspect_list: discover the current Host and Client Providers and their read-only query methods.\n2. cordis_inspect_query: use the returned platform, provider, method, and schema to query exact Service, Event, Builtin, Slot, Theme token, or Tool information.\n3. cordis_inspect_self: inspect the current Session's Plugins, Packages, version pointers, source, and diagnostics. Source is returned only when both pluginId and packageId are specified.\n4. cordis_define: create the first Package for a new Plugin or append an immutable Package to an existing Plugin. It defines code but does not run it.\n5. cordis_run: activate an exact Package. Use run for the first activation, restarting current, or rollback; use update to switch versions.\n6. cordis_stop: remove the current Run and pending approval request while retaining definitions, grants, and version pointers.\n7. cordis_undefine: permanently stop and delete a Plugin and all of its Packages. Use it only after confirming that the user no longer needs them.\n\n- Inspect and Catalog data only confirm capabilities, names, signatures, types, and registration protocols before code is written; they do not replace business APIs.\n- Query Service.listService and Event.listEvents without input to choose from their compact signature directories, then query the exact service or event before using it. Exact queries return the structured contract and only its referenced types.\n- At runtime, a Plugin must call real Services or listen to real Events. Do not cache, display, or depend on Inspect results as business data.\n\n## Identity, versions, and approval\n\n- pluginId identifies a Plugin that can be modified over time. For a new Plugin, submit only a semantic idPrefix of 3–6 lowercase English letters; the Host allocates the final ID.\n- packageId identifies one immutable Host/Client source version under a Plugin. To change code, define a new Package; never overwrite an old version.\n- pluginRunId identifies one activation attempt and connects its approval, Host/Client loading, private RPC, Run card, and errors.\n- currentPackageId is the most recent fully successful Package. Stopping, starting an update, or failing an update does not clear it.\n- nextPackageId is the target awaiting approval, being attempted, awaiting Client activation, or most recently failed.\n- A single check mark authorizes only the current Package; double check marks authorize future versions of the same Plugin. A grant remains in effect after a technical failure.\n- An update stops the old Run before starting the target Package. Failure does not automatically restart the old version; retry next with update or roll back to current with run.\n\nWhen the user enters @pluginId, the system injects identity, the default base Package, version pointers, and runtime status, but not source code:\n\n1. Call cordis_inspect_self(pluginId, packageId) to read the target source.\n2. Use cordis_define in existing mode to append a Package to the same Plugin.\n3. Call cordis_run in run or update mode according to the version relationship.\n\nNever silently create another Plugin for @pluginId. If the reference is unavailable because it was removed, belongs to another Session, or was lost on process restart, tell the user directly.\n\n## High-frequency errors that must be avoided\n\n### Services: ctx.get and inject\n\n- Read an optional Service with ctx.get('serviceName') by default and handle undefined.\n- Declare inject: ['serviceName'] on the returned Plugin object only when the Service is a hard dependency and the Plugin must enter waiting until Cordis reactivates it after the Service appears.\n- Read ctx.serviceName only after declaring that Service in inject. Never access an undeclared Service as a ctx property.\n\n```js\nreturn {\n inject: ['requiredService'],\n apply(ctx) {\n ctx.requiredService.someMethod()\n const optionalService = ctx.get('optionalService')\n if (optionalService !== undefined) optionalService.someMethod()\n },\n}\n```\n\n### Code: use plain JavaScript only\n\n- Host and Client code is not transformed by TypeScript, JSX, or a bundler.\n- Do not use TypeScript types, as, decorators, import, require, or JSX.\n- Client React code must use React.createElement(...); never write .\n- Do not assume that process, Buffer, window, document, fetch, native timers, or any other global is available. Query the corresponding platform's Builtins and Services first.\n\n### Data: do not serialize live data\n\n- Services, Events, Slots, Sessions, and their derived Cordis/DSH objects are internal live data, not ordinary JSON that can be dumped.\n- Do not apply JSON.stringify, structuredClone, recursive enumeration, full copying, or whole-object display to live data.\n- Read only the leaf fields required by the task, then construct the smallest owned data object without Host references.\n\n### Lifecycle: every side effect must be reversible\n\n- Services, Events, Tools, handlers, timers, Slots, styles, and theme overrides must all belong to the current Fiber.\n- Use ctx.effect(), ctx.on(), or official APIs that return a disposer so stop, update, or undefine removes every side effect.\n- The cordis-plugin-development Skill contains complete timer, Waterfall, Slot, theme, Tool, RPC, and React examples and troubleshooting guidance.\n\n## Host and Client\n\n- Host runs in the DSH Node.js process and is appropriate for files, networking, commands, Agent/Session access, Host Events, Services, model Tools, and JSON methods callable by the Client.\n- Client runs in the browser page and is appropriate for themes, layout, current page state, Tool cards, and Slot UI.\n- Host and Client communicate through Package-private JSON methods: Host uses harness.handle(method, handler), and Client uses host.call(method, args). The direction is Client→Host, and only lossless JSON may cross it.\n- Client UI must be registered in a queried Slot; apply() cannot directly return a React Element. Query Slots.listSubTree without root to choose from the compact purpose/topology tree, then query the exact root for its full registration contract and props before writing code.\n- See the Skill and Inspect Providers for Run-specific panels and exact Slot registration patterns.\n\n## Asynchronous results and recovery\n\n- Do not wait inside a Tool for approval or browser work that can happen only after the current turn ends.\n- Asynchronous success, rejection, and runtime errors update Run state and notify you through steering context.\n- After a technical failure, use cordis_inspect_self to read the exact Package source and its message/stack. Define a corrected Package under the same Plugin and retry autonomously.\n- Use the cordis-plugin-development Skill for other failure causes, repair procedures, and complete extension patterns.\n\nUse the ralph tool ONLY when the direct human explicitly asks for a Ralph loop or fresh-agent iterative execution. Each Ralph round starts a fresh child with no conversation seed and uses the shared workspace as durable memory. Completion and blockers are worker reports, not independent evaluation. Use same-session goal tools for ordinary long-running objectives, and plain subagents or workflows for bounded delegation and fan-out.\n\nUse subagent in the background by default. Start independent delegations together in one assistant message and continue useful work while they run. Set `run_in_background: false` only when your next action depends on that subagent's result. When a background run settles, the runtime sends you a notice containing its outcome and any final assistant message.\n\n## Writing code for run_code\n\nPass `run_code` the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped). Inside the program:\n\n- Call tools as `await tools.name(args)` — quoted access for exotic names: `tools[\"my-tool\"](args)`. Every call resolves to the tool's typed canonical JSON value. Tool arguments must be lossless JSON.\n- A FAILED tool call rejects with `ToolCallError`, whose `toolName` identifies the failed tool and whose `message` is human-readable — `try/catch` it to handle and continue.\n- Independent read-only calls MAY overlap under `Promise.all` (safe calls run concurrently; mutating calls run alone, in submission order). Sequence dependent work with `await`.\n- Emit results with `return` and/or `console.log(...)`. ONLY what you print or return comes back to you — intermediate tool results never enter the conversation, so extract just what you need.\n\nThe available tools:\n\n```ts\ntype JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }\n\ninterface ToolArgsMap {\n /** Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`. */\n bash: {\n /** The bash command to execute. */\n command: string;\n /** Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\". */\n description: string;\n /** Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry. */\n timeoutMs?: number;\n /** Working directory for this command. Defaults to the session workspace; a relative path is resolved against it. */\n workdir?: string;\n /** Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies. */\n run_in_background?: boolean;\n } & Record;\n /** Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs. */\n cordis_define: {\n plugin: {\n kind: \"new\";\n /** Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix. */\n idPrefix: string;\n } | {\n kind: \"existing\";\n /** Exact ID of an existing Plugin; the new Package is appended to that instance. */\n pluginId: string;\n };\n /** Short, readable Package name. */\n name: string;\n /** One-sentence, user-facing description of the Package purpose. */\n purpose: string;\n code: {\n /** Plain JavaScript function body that returns the Host-half Cordis Plugin. */\n host?: string;\n /** Plain JavaScript function body that returns the browser Client-half Cordis Plugin. */\n client?: string;\n };\n } & Record;\n /** List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call. */\n cordis_inspect_list: Record;\n /** Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props. */\n cordis_inspect_query: {\n /** Runtime platform that owns the Provider. */\n platform: \"host\" | \"client\";\n /** Exact Provider ID returned by cordis_inspect_list. */\n provider: string;\n /** Exact method name declared by the Provider manifest. */\n method: string;\n /** Optional query input; it must satisfy the method input schema. */\n input?: JsonValue;\n } & Record;\n /** Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers. */\n cordis_inspect_self: {\n /** Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin. */\n pluginId?: string;\n /** Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned. */\n packageId?: string;\n } & Record;\n /** Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it. */\n cordis_run: {\n /** Stable Plugin ID returned by cordis_define. */\n pluginId: string;\n /** Exact immutable Package ID to activate under that Plugin. */\n packageId: string;\n /** Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package. */\n mode: \"run\" | \"update\";\n } & Record;\n /** Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal. */\n cordis_stop: {\n /** Stable dynamic Plugin ID to stop. */\n pluginId: string;\n } & Record;\n /** Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead. */\n cordis_undefine: {\n /** Stable dynamic Plugin ID to remove permanently. */\n pluginId: string;\n } & Record;\n /** Edit an existing UTF-8 text file by replacing literal text. */\n edit: {\n /** Path to edit, resolved by the filesystem backend. */\n file_path: string;\n /** Literal text to replace. Must match exactly. */\n old_string: string;\n /** Literal replacement text. Use an empty string to delete the match. */\n new_string: string;\n /** Replace all matches. Defaults to false; when false, old_string must appear exactly once. */\n replace_all?: boolean;\n } & Record;\n /** Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op. */\n interrupt_agent: {\n /** The agent id of the running agent to interrupt. */\n agent_id: string;\n } & Record;\n /** Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops. */\n job_kill: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Optional short reason, recorded in the log and forwarded to the job. */\n reason?: string;\n } & Record;\n /** List your background jobs (running and finished) with their ids, kinds, and statuses. */\n job_list: Record;\n /** Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap. */\n job_output: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive. */\n wait?: boolean;\n /** Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum. */\n timeout_ms?: number;\n } & Record;\n /** Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools. */\n ralph: {\n /** The immutable completion objective for every fresh Ralph round. */\n objective: string;\n /** Optional positive safe-integer round cap, bounded by the deployment ceiling. */\n maxRounds?: number;\n } & Record;\n /** Read a UTF-8 text file and return line-numbered content. */\n read: {\n /** Path to read, resolved by the filesystem backend. */\n file_path: string;\n /** 1-based first line to return. Defaults to 1. */\n offset?: number;\n /** Maximum number of lines to return. Defaults to 2000. */\n limit?: number;\n } & Record;\n /** Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered. */\n send_message: {\n /** The subagent id returned when the background subagent was started. */\n subagent_id: string;\n /** The message to deliver to the subagent. */\n message: string;\n } & Record;\n /** Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill. */\n skill: {\n /** The exact skill name from the available skills list. */\n name: string;\n } & Record;\n /** Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result. */\n subagent: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs. */\n prompt: string;\n /** Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it. */\n run_in_background?: boolean;\n } & Record;\n /** Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result. */\n subagent_fork: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new. */\n prompt: string;\n } & Record;\n /** Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished). */\n todo_write: {\n /** The COMPLETE task list, replacing any previous list. */\n todos: ({\n /** What the task is — a short imperative line. */\n content: string;\n /** pending (not started) | in_progress (now) | completed (done). */\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n } & Record;\n /** Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn. The workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result. Script-body hooks: - `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly. - `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages. - `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`. - `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim. Misused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`. Constraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes. */\n workflow: {\n /** The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `). */\n script: string;\n /** The workflow identity block (plain JSON — never code). */\n meta: {\n /** Short kebab-case workflow name. */\n name: string;\n /** One-line description of what the workflow does. */\n description: string;\n /** Optional guidance on when this workflow applies. */\n whenToUse?: string;\n /** Optional phase declarations matched by phase() calls. */\n phases?: ({\n /** The phase title phase() calls match by exact string. */\n title: string;\n /** Optional one-line description of the phase. */\n detail?: string;\n /** Optional provider override this phase is expected to use. */\n provider?: string;\n /** Optional model override this phase is expected to use. */\n model?: string;\n } & Record)[];\n } & Record;\n /** Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}). */\n args?: Record;\n } & Record;\n /** Create or fully replace a UTF-8 text file. */\n write: {\n /** Path to write, resolved by the filesystem backend. */\n file_path: string;\n /** Full UTF-8 text content to write. */\n content: string;\n } & Record;\n}\n\ninterface ToolOutputMap {\n bash: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"foreground\";\n exitCode: number | null;\n signal: string | null;\n timedOut: boolean;\n aborted: boolean;\n timeoutMs: number;\n stdout: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n stderr: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n sandbox?: {\n mode: string;\n denied: boolean;\n enforcement?: string;\n runnerFailed?: boolean;\n };\n };\n cordis_define: {\n pluginId: string;\n packageId: string;\n name: string;\n purpose: string;\n hasHostHalf: boolean;\n hasClientHalf: boolean;\n };\n cordis_inspect_list: JsonValue;\n cordis_inspect_query: JsonValue;\n cordis_inspect_self: JsonValue;\n cordis_run: JsonValue;\n cordis_stop: {\n pluginId: string;\n };\n cordis_undefine: {\n pluginId: string;\n wasRunning: boolean;\n };\n edit: {\n path: string;\n before: string;\n after: string;\n };\n interrupt_agent: {\n accepted: boolean;\n };\n job_kill: {\n outcome: \"cancellation-requested\" | \"already-finished\";\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n job_list: ({\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n })[];\n job_output: {\n text: string;\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n ralph: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n read: {\n path: string;\n offset: number;\n lines: {\n number: number;\n text: string;\n }[];\n totalLines: number;\n };\n send_message: {\n messageId: string;\n };\n skill: {\n name: string;\n provider: string;\n resourceBase?: {\n kind: \"directory\";\n path: string;\n } | {\n kind: \"url\";\n url: string;\n } | {\n kind: \"opaque\";\n description: string;\n };\n content: string;\n };\n subagent: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n subagent_fork: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n todo_write: {\n todos: ({\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n counts: {\n pending: number;\n inProgress: number;\n completed: number;\n };\n };\n workflow: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n write: {\n path: string;\n operation: \"create\" | \"update\";\n before: string | null;\n after: string;\n };\n}\n\ntype ToolName = keyof ToolOutputMap\n\ndeclare class ToolCallError extends Error {\n readonly name: \"ToolCallError\";\n readonly toolName: ToolName;\n}\n\ndeclare const tools: {\n [K in ToolName]: (args: ToolArgsMap[K]) => Promise;\n}\n```","tools":[{"name":"bash","description":"Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`.","parameters":{"type":"object","properties":{"command":{"type":"string","description":"The bash command to execute."},"description":{"type":"string","description":"Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\"."},"timeoutMs":{"type":"number","description":"Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."},"workdir":{"type":"string","description":"Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."},"run_in_background":{"type":"boolean","description":"Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."}},"required":["command","description"]}},{"name":"cordis_define","description":"Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs.","parameters":{"type":"object","properties":{"plugin":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"new"},"idPrefix":{"type":"string","description":"Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix."}},"required":["kind","idPrefix"]},{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"existing"},"pluginId":{"type":"string","description":"Exact ID of an existing Plugin; the new Package is appended to that instance."}},"required":["kind","pluginId"]}]},"name":{"type":"string","description":"Short, readable Package name."},"purpose":{"type":"string","description":"One-sentence, user-facing description of the Package purpose."},"code":{"type":"object","additionalProperties":false,"properties":{"host":{"type":"string","description":"Plain JavaScript function body that returns the Host-half Cordis Plugin."},"client":{"type":"string","description":"Plain JavaScript function body that returns the browser Client-half Cordis Plugin."}}}},"required":["plugin","name","purpose","code"]}},{"name":"cordis_inspect_list","description":"List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call.","parameters":{"type":"object","properties":{}}},{"name":"cordis_inspect_query","description":"Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props.","parameters":{"type":"object","properties":{"platform":{"type":"string","description":"Runtime platform that owns the Provider.","enum":["host","client"]},"provider":{"type":"string","description":"Exact Provider ID returned by cordis_inspect_list."},"method":{"type":"string","description":"Exact method name declared by the Provider manifest."},"input":{"description":"Optional query input; it must satisfy the method input schema."}},"required":["platform","provider","method"]}},{"name":"cordis_inspect_self","description":"Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin."},"packageId":{"type":"string","description":"Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned."}}}},{"name":"cordis_run","description":"Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define."},"packageId":{"type":"string","description":"Exact immutable Package ID to activate under that Plugin."},"mode":{"type":"string","description":"Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package.","enum":["run","update"]}},"required":["pluginId","packageId","mode"]}},{"name":"cordis_stop","description":"Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to stop."}},"required":["pluginId"]}},{"name":"cordis_undefine","description":"Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to remove permanently."}},"required":["pluginId"]}},{"name":"edit","description":"Edit an existing UTF-8 text file by replacing literal text.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to edit, resolved by the filesystem backend."},"old_string":{"type":"string","description":"Literal text to replace. Must match exactly."},"new_string":{"type":"string","description":"Literal replacement text. Use an empty string to delete the match."},"replace_all":{"type":"boolean","description":"Replace all matches. Defaults to false; when false, old_string must appear exactly once."}},"required":["file_path","old_string","new_string"]}},{"name":"interrupt_agent","description":"Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op.","parameters":{"type":"object","properties":{"agent_id":{"type":"string","description":"The agent id of the running agent to interrupt."}},"required":["agent_id"]}},{"name":"job_kill","description":"Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"reason":{"type":"string","description":"Optional short reason, recorded in the log and forwarded to the job."}},"required":["job_id"]}},{"name":"job_list","description":"List your background jobs (running and finished) with their ids, kinds, and statuses.","parameters":{"type":"object","properties":{}}},{"name":"job_output","description":"Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"wait":{"type":"boolean","description":"Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive."},"timeout_ms":{"type":"number","description":"Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum."}},"required":["job_id"]}},{"name":"ralph","description":"Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools.","parameters":{"type":"object","properties":{"objective":{"type":"string","description":"The immutable completion objective for every fresh Ralph round."},"maxRounds":{"type":"number","description":"Optional positive safe-integer round cap, bounded by the deployment ceiling."}},"required":["objective"]}},{"name":"read","description":"Read a UTF-8 text file and return line-numbered content.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to read, resolved by the filesystem backend."},"offset":{"type":"number","description":"1-based first line to return. Defaults to 1."},"limit":{"type":"number","description":"Maximum number of lines to return. Defaults to 2000."}},"required":["file_path"]}},{"name":"run_code","description":"Execute a TypeScript program against the available tools. Write the BODY of an async function (erasable syntax only; top-level `await` and `return` work) and call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.","parameters":{"type":"object","properties":{"code":{"type":"string","description":"The program: the body of an async TypeScript function."},"description":{"type":"string","description":"Clear, concise description of what this program does in active voice, 5-10 words (shown in the UI). Examples: \"Count TODO markers across packages\"; \"Read failing test and its fixture\"; \"Rename config key in every cordis.yml\"."}},"required":["code","description"]}},{"name":"send_message","description":"Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered.","parameters":{"type":"object","properties":{"subagent_id":{"type":"string","description":"The subagent id returned when the background subagent was started."},"message":{"type":"string","description":"The message to deliver to the subagent."}},"required":["subagent_id","message"]}},{"name":"skill","description":"Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill.","parameters":{"type":"object","properties":{"name":{"type":"string","description":"The exact skill name from the available skills list."}},"required":["name"]}},{"name":"subagent","description":"Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs."},"run_in_background":{"type":"boolean","description":"Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it."}},"required":["description","prompt"]}},{"name":"subagent_fork","description":"Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new."}},"required":["description","prompt"]}},{"name":"todo_write","description":"Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished).","parameters":{"type":"object","properties":{"todos":{"type":"array","description":"The COMPLETE task list, replacing any previous list.","items":{"type":"object","additionalProperties":false,"properties":{"content":{"type":"string","description":"What the task is — a short imperative line."},"status":{"type":"string","description":"pending (not started) | in_progress (now) | completed (done).","enum":["pending","in_progress","completed"]}},"required":["content","status"]}}},"required":["todos"]}},{"name":"workflow","description":"Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn.\n\nThe workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result.\n\nScript-body hooks:\n- `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly.\n- `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages.\n- `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`.\n- `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim.\n\nMisused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`.\n\nConstraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes.","parameters":{"type":"object","properties":{"script":{"type":"string","description":"The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `)."},"meta":{"type":"object","description":"The workflow identity block (plain JSON — never code).","additionalProperties":true,"properties":{"name":{"type":"string","description":"Short kebab-case workflow name."},"description":{"type":"string","description":"One-line description of what the workflow does."},"whenToUse":{"type":"string","description":"Optional guidance on when this workflow applies."},"phases":{"type":"array","description":"Optional phase declarations matched by phase() calls.","items":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string","description":"The phase title phase() calls match by exact string."},"detail":{"type":"string","description":"Optional one-line description of the phase."},"provider":{"type":"string","description":"Optional provider override this phase is expected to use."},"model":{"type":"string","description":"Optional model override this phase is expected to use."}},"required":["title"]}}},"required":["name","description"]},"args":{"type":"object","description":"Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}).","additionalProperties":true}},"required":["script","meta"]}},{"name":"write","description":"Create or fully replace a UTF-8 text file.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to write, resolved by the filesystem backend."},"content":{"type":"string","description":"Full UTF-8 text content to write."}},"required":["file_path","content"]}}]},"reason":"initial"}} +{"type":"request/header","seq":6,"time":1785498583782,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"You are an AI agent powered by DeepSeek Harness.\n\nYou are headless-agent, a coding assistant powered by the deepseek-v4-flash model. Your working directory is {{cwd}}.\n\nVerify your work by running the code or tests. Keep answers brief and factual.\n\n\nUse the read tool — not shell commands like cat — to inspect text files. Results include line numbers. Use offset and limit to continue reading large files.\n\nUse the write tool to create files or completely replace file contents. Existing files are overwritten, so read an existing file first (the default fs-observation-policy requires it) and prefer edit for targeted changes.\n\nUse the edit tool for targeted changes to existing UTF-8 text files. It replaces literal old_string with new_string; by default old_string must appear exactly once. If old_string appears multiple times, provide a more specific old_string or set replace_all to true. Read the file first (the default fs-observation-policy requires it), unless you just created or edited it in this session.\n\nCheck the [exit code: N] marker on every bash result; investigate failures before moving on.\n\nTrack every background job id you start. You are notified in-session when a job finishes — do not busy-poll or sleep on one; keep working on independent steps and do not duplicate a running job's work. Before giving a final answer, collect every still-relevant job with job_output (set wait: true only when you are genuinely blocked on it), and job_kill jobs that stopped mattering.\n\nUse the workflow tool ONLY when the user explicitly asks for a workflow or for large multi-agent orchestration: you write a JavaScript script (the tool description documents the exact format) that fans work out across many subagents with phases and structured results. For one or two delegations, prefer plain subagent calls.\n\n# Dynamic Cordis Plugins\n\nDynamic Cordis plugins temporarily extend the current DSH process. A Plugin uses apply(ctx) to consume Services, listen to Events, provide Services, register model Tools, or register browser UI in Slots.\n\n- Plugin and Package definitions exist only in the current process. define itself does not modify repository source, configuration, or disk, and definitions do not survive a process restart.\n- The restricted execution environment prevents accidental misuse; it is not a security boundary for malicious code. Services obtained by dynamic code connect to the real runtime.\n\n## Make the user-facing plan clear first\n\n- Dynamic Cordis Plugins are one available implementation mechanism, not the default for every request. Consider whether one could help only when the user intends to design or create something, or when a temporary interface could materially aid the current work. The presence of these instructions or Tools, and discussion of Cordis itself, do not make a request a dynamic-Plugin task.\n- When Cordis is a plausible fit, infer the intended work target and lifetime from the request and conversation. Use it only when the outcome belongs to the current running harness and should be delivered as a temporary runtime extension. If that distinction is materially ambiguous, ask at most one concise question about the intended result or lifetime. Otherwise proceed with the matching workflow; do not require the user to know or choose Cordis as an implementation mechanism.\n- Once a dynamic Plugin is appropriate, decide whether the task creates a new Plugin or modifies the Plugin named by the user with @pluginId. Proceed directly when the goal is clear; do not ask for repeated confirmation.\n- Choose Host, Client, or both from the requested outcome. Do not propose a Client/browser UI when the task does not need visible page behavior, and do not avoid Client when the requested outcome is visual, interactive, or depends on page state. Host versus Client is an implementation choice; do not make the user choose it.\n- When a design direction or a potentially useful interface would materially affect the result, ask at most one concise outcome or creative-preference question and offer a few candidate directions. Otherwise proceed directly; do not conduct a multi-round interview or a complex questionnaire.\n- cordis_define only defines and presents code; it does not run it. After definition, explain the pluginId and packageId returned by the Host and whether the next step is a run or update.\n- cordis_run may require user approval. When it returns awaiting-approval, explain that the user must allow or reject it in the UI. Do not wait, retry, or claim that it is running.\n- When it returns starting, explain that the request has entered the asynchronous flow and the Client is still activating. starting does not mean success. Wait for the system to report the final result through steering context.\n- Do not request approval again after the user rejects it. After a technical failure, fix the same Plugin from its diagnostics; do not silently create a replacement Plugin.\n\n## Recommended workflow and Tools\n\nBefore creating, modifying, or repairing a Plugin, load the cordis-plugin-development Skill. The Skill provides requirement navigation, capability composition, complete examples, and troubleshooting. Treat Inspect Provider results as the source of truth for exact APIs.\n\n1. cordis_inspect_list: discover the current Host and Client Providers and their read-only query methods.\n2. cordis_inspect_query: use the returned platform, provider, method, and schema to query exact Service, Event, Builtin, Slot, Theme token, or Tool information.\n3. cordis_inspect_self: inspect the current Session's Plugins, Packages, version pointers, source, and diagnostics. Source is returned only when both pluginId and packageId are specified.\n4. cordis_define: create the first Package for a new Plugin or append an immutable Package to an existing Plugin. It defines code but does not run it.\n5. cordis_run: activate an exact Package. Use run for the first activation, restarting current, or rollback; use update to switch versions.\n6. cordis_stop: remove the current Run and pending approval request while retaining definitions, grants, and version pointers.\n7. cordis_undefine: permanently stop and delete a Plugin and all of its Packages. Use it only after confirming that the user no longer needs them.\n\n- Inspect and Catalog data only confirm capabilities, names, signatures, types, and registration protocols before code is written; they do not replace business APIs.\n- Query Service.listService and Event.listEvents without input to choose from their compact signature directories, then query the exact service or event before using it. Exact queries return the structured contract and only its referenced types.\n- At runtime, a Plugin must call real Services or listen to real Events. Do not cache, display, or depend on Inspect results as business data.\n\n## Identity, versions, and approval\n\n- pluginId identifies a Plugin that can be modified over time. For a new Plugin, submit only a semantic idPrefix of 3–6 lowercase English letters; the Host allocates the final ID.\n- packageId identifies one immutable Host/Client source version under a Plugin. To change code, define a new Package; never overwrite an old version.\n- pluginRunId identifies one activation attempt and connects its approval, Host/Client loading, private RPC, Run card, and errors.\n- currentPackageId is the most recent fully successful Package. Stopping, starting an update, or failing an update does not clear it.\n- nextPackageId is the target awaiting approval, being attempted, awaiting Client activation, or most recently failed.\n- A single check mark authorizes only the current Package; double check marks authorize future versions of the same Plugin. A grant remains in effect after a technical failure.\n- An update stops the old Run before starting the target Package. Failure does not automatically restart the old version; retry next with update or roll back to current with run.\n\nWhen the user enters @pluginId, the system injects identity, the default base Package, version pointers, and runtime status, but not source code:\n\n1. Call cordis_inspect_self(pluginId, packageId) to read the target source.\n2. Use cordis_define in existing mode to append a Package to the same Plugin.\n3. Call cordis_run in run or update mode according to the version relationship.\n\nNever silently create another Plugin for @pluginId. If the reference is unavailable because it was removed, belongs to another Session, or was lost on process restart, tell the user directly.\n\n## High-frequency errors that must be avoided\n\n### Services: ctx.get and inject\n\n- Read an optional Service with ctx.get('serviceName') by default and handle undefined.\n- Declare inject: ['serviceName'] on the returned Plugin object only when the Service is a hard dependency and the Plugin must enter waiting until Cordis reactivates it after the Service appears.\n- Read ctx.serviceName only after declaring that Service in inject. Never access an undeclared Service as a ctx property.\n\n```js\nreturn {\n inject: ['requiredService'],\n apply(ctx) {\n ctx.requiredService.someMethod()\n const optionalService = ctx.get('optionalService')\n if (optionalService !== undefined) optionalService.someMethod()\n },\n}\n```\n\n### Code: use plain JavaScript only\n\n- Host and Client code is not transformed by TypeScript, JSX, or a bundler.\n- Do not use TypeScript types, as, decorators, import, require, or JSX.\n- Client React code must use React.createElement(...); never write .\n- Do not assume that process, Buffer, window, document, fetch, native timers, or any other global is available. Query the corresponding platform's Builtins and Services first.\n\n### Data: do not serialize live data\n\n- Services, Events, Slots, Sessions, and their derived Cordis/DSH objects are internal live data, not ordinary JSON that can be dumped.\n- Do not apply JSON.stringify, structuredClone, recursive enumeration, full copying, or whole-object display to live data.\n- Read only the leaf fields required by the task, then construct the smallest owned data object without Host references.\n\n### Lifecycle: every side effect must be reversible\n\n- Services, Events, Tools, handlers, timers, Slots, styles, and theme overrides must all belong to the current Fiber.\n- Use ctx.effect(), ctx.on(), or official APIs that return a disposer so stop, update, or undefine removes every side effect.\n- The cordis-plugin-development Skill contains complete timer, Waterfall, Slot, theme, Tool, RPC, and React examples and troubleshooting guidance.\n\n## Host and Client\n\n- Host runs in the DSH Node.js process and is appropriate for files, networking, commands, Agent/Session access, Host Events, Services, model Tools, and JSON methods callable by the Client.\n- Client runs in the browser page and is appropriate for themes, layout, current page state, Tool cards, and Slot UI.\n- Host and Client communicate through Package-private JSON methods: Host uses harness.handle(method, handler), and Client uses host.call(method, args). The direction is Client→Host, and only lossless JSON may cross it.\n- Client UI must be registered in a queried Slot; apply() cannot directly return a React Element. Query Slots.listSubTree without root to choose from the compact purpose/topology tree, then query the exact root for its full registration contract and props before writing code.\n- See the Skill and Inspect Providers for Run-specific panels and exact Slot registration patterns.\n\n## Asynchronous results and recovery\n\n- Do not wait inside a Tool for approval or browser work that can happen only after the current turn ends.\n- Asynchronous success, rejection, and runtime errors update Run state and notify you through steering context.\n- After a technical failure, use cordis_inspect_self to read the exact Package source and its message/stack. Define a corrected Package under the same Plugin and retry autonomously.\n- Use the cordis-plugin-development Skill for other failure causes, repair procedures, and complete extension patterns.\n\nUse the ralph tool ONLY when the direct human explicitly asks for a Ralph loop or fresh-agent iterative execution. Each Ralph round starts a fresh child with no conversation seed and uses the shared workspace as durable memory. Completion and blockers are worker reports, not independent evaluation. Use same-session goal tools for ordinary long-running objectives, and plain subagents or workflows for bounded delegation and fan-out.\n\nUse subagent in the background by default. Start independent delegations together in one assistant message and continue useful work while they run. Set `run_in_background: false` only when your next action depends on that subagent's result. When a background run settles, the runtime sends you a notice containing its outcome and any final assistant message.\n\n## Writing code for run_code\n\n`run_code` takes two required arguments: `code` — the body of an async TypeScript function (erasable syntax only — no `enum` or namespaces; type annotations are advisory, the code runs type-stripped) — and `description`, a short summary of what the program does. Inside the program:\n\n- Call tools as `await tools.name(args)` — quoted access for exotic names: `tools[\"my-tool\"](args)`. Every call resolves to the tool's typed canonical JSON value. Tool arguments must be lossless JSON.\n- A FAILED tool call rejects with `ToolCallError`, whose `toolName` identifies the failed tool and whose `message` is human-readable — `try/catch` it to handle and continue.\n- Independent read-only calls MAY overlap under `Promise.all` (safe calls run concurrently; mutating calls run alone, in submission order). Sequence dependent work with `await`.\n- Emit results with `return` and/or `console.log(...)`. ONLY what you print or return comes back to you — intermediate tool results never enter the conversation, so extract just what you need.\n\nThe available tools:\n\n```ts\ntype JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }\n\ninterface ToolArgsMap {\n /** Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`. */\n bash: {\n /** The bash command to execute. */\n command: string;\n /** Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\". */\n description: string;\n /** Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry. */\n timeoutMs?: number;\n /** Working directory for this command. Defaults to the session workspace; a relative path is resolved against it. */\n workdir?: string;\n /** Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies. */\n run_in_background?: boolean;\n } & Record;\n /** Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs. */\n cordis_define: {\n plugin: {\n kind: \"new\";\n /** Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix. */\n idPrefix: string;\n } | {\n kind: \"existing\";\n /** Exact ID of an existing Plugin; the new Package is appended to that instance. */\n pluginId: string;\n };\n /** Short, readable Package name. */\n name: string;\n /** One-sentence, user-facing description of the Package purpose. */\n purpose: string;\n code: {\n /** Plain JavaScript function body that returns the Host-half Cordis Plugin. */\n host?: string;\n /** Plain JavaScript function body that returns the browser Client-half Cordis Plugin. */\n client?: string;\n };\n } & Record;\n /** List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call. */\n cordis_inspect_list: Record;\n /** Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props. */\n cordis_inspect_query: {\n /** Runtime platform that owns the Provider. */\n platform: \"host\" | \"client\";\n /** Exact Provider ID returned by cordis_inspect_list. */\n provider: string;\n /** Exact method name declared by the Provider manifest. */\n method: string;\n /** Optional query input; it must satisfy the method input schema. */\n input?: JsonValue;\n } & Record;\n /** Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers. */\n cordis_inspect_self: {\n /** Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin. */\n pluginId?: string;\n /** Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned. */\n packageId?: string;\n } & Record;\n /** Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it. */\n cordis_run: {\n /** Stable Plugin ID returned by cordis_define. */\n pluginId: string;\n /** Exact immutable Package ID to activate under that Plugin. */\n packageId: string;\n /** Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package. */\n mode: \"run\" | \"update\";\n } & Record;\n /** Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal. */\n cordis_stop: {\n /** Stable dynamic Plugin ID to stop. */\n pluginId: string;\n } & Record;\n /** Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead. */\n cordis_undefine: {\n /** Stable dynamic Plugin ID to remove permanently. */\n pluginId: string;\n } & Record;\n /** Edit an existing UTF-8 text file by replacing literal text. */\n edit: {\n /** Path to edit, resolved by the filesystem backend. */\n file_path: string;\n /** Literal text to replace. Must match exactly. */\n old_string: string;\n /** Literal replacement text. Use an empty string to delete the match. */\n new_string: string;\n /** Replace all matches. Defaults to false; when false, old_string must appear exactly once. */\n replace_all?: boolean;\n } & Record;\n /** Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op. */\n interrupt_agent: {\n /** The agent id of the running agent to interrupt. */\n agent_id: string;\n } & Record;\n /** Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops. */\n job_kill: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Optional short reason, recorded in the log and forwarded to the job. */\n reason?: string;\n } & Record;\n /** List your background jobs (running and finished) with their ids, kinds, and statuses. */\n job_list: Record;\n /** Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap. */\n job_output: {\n /** Job id returned by the tool that started the background work. */\n job_id: string;\n /** Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive. */\n wait?: boolean;\n /** Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum. */\n timeout_ms?: number;\n } & Record;\n /** Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools. */\n ralph: {\n /** The immutable completion objective for every fresh Ralph round. */\n objective: string;\n /** Optional positive safe-integer round cap, bounded by the deployment ceiling. */\n maxRounds?: number;\n } & Record;\n /** Read a UTF-8 text file and return line-numbered content. */\n read: {\n /** Path to read, resolved by the filesystem backend. */\n file_path: string;\n /** 1-based first line to return. Defaults to 1. */\n offset?: number;\n /** Maximum number of lines to return. Defaults to 2000. */\n limit?: number;\n } & Record;\n /** Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered. */\n send_message: {\n /** The subagent id returned when the background subagent was started. */\n subagent_id: string;\n /** The message to deliver to the subagent. */\n message: string;\n } & Record;\n /** Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill. */\n skill: {\n /** The exact skill name from the available skills list. */\n name: string;\n } & Record;\n /** Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result. */\n subagent: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs. */\n prompt: string;\n /** Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it. */\n run_in_background?: boolean;\n } & Record;\n /** Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result. */\n subagent_fork: {\n /** A short (3-5 word) description of the delegated task, for display. */\n description: string;\n /** The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new. */\n prompt: string;\n } & Record;\n /** Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished). */\n todo_write: {\n /** The COMPLETE task list, replacing any previous list. */\n todos: ({\n /** What the task is — a short imperative line. */\n content: string;\n /** pending (not started) | in_progress (now) | completed (done). */\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n } & Record;\n /** Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn. The workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result. Script-body hooks: - `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly. - `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages. - `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`. - `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim. Misused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`. Constraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes. */\n workflow: {\n /** The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `). */\n script: string;\n /** The workflow identity block (plain JSON — never code). */\n meta: {\n /** Short kebab-case workflow name. */\n name: string;\n /** One-line description of what the workflow does. */\n description: string;\n /** Optional guidance on when this workflow applies. */\n whenToUse?: string;\n /** Optional phase declarations matched by phase() calls. */\n phases?: ({\n /** The phase title phase() calls match by exact string. */\n title: string;\n /** Optional one-line description of the phase. */\n detail?: string;\n /** Optional provider override this phase is expected to use. */\n provider?: string;\n /** Optional model override this phase is expected to use. */\n model?: string;\n } & Record)[];\n } & Record;\n /** Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}). */\n args?: Record;\n } & Record;\n /** Create or fully replace a UTF-8 text file. */\n write: {\n /** Path to write, resolved by the filesystem backend. */\n file_path: string;\n /** Full UTF-8 text content to write. */\n content: string;\n } & Record;\n}\n\ninterface ToolOutputMap {\n bash: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"foreground\";\n exitCode: number | null;\n signal: string | null;\n timedOut: boolean;\n aborted: boolean;\n timeoutMs: number;\n stdout: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n stderr: {\n text: string;\n truncated: boolean;\n spillPath?: string;\n };\n sandbox?: {\n mode: string;\n denied: boolean;\n enforcement?: string;\n runnerFailed?: boolean;\n };\n };\n cordis_define: {\n pluginId: string;\n packageId: string;\n name: string;\n purpose: string;\n hasHostHalf: boolean;\n hasClientHalf: boolean;\n };\n cordis_inspect_list: JsonValue;\n cordis_inspect_query: JsonValue;\n cordis_inspect_self: JsonValue;\n cordis_run: JsonValue;\n cordis_stop: {\n pluginId: string;\n };\n cordis_undefine: {\n pluginId: string;\n wasRunning: boolean;\n };\n edit: {\n path: string;\n before: string;\n after: string;\n };\n interrupt_agent: {\n accepted: boolean;\n };\n job_kill: {\n outcome: \"cancellation-requested\" | \"already-finished\";\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n job_list: ({\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n })[];\n job_output: {\n text: string;\n job: {\n id: string;\n kind: string;\n label: string;\n status: \"running\" | \"stopping\" | \"completed\" | \"killed\" | \"failed\";\n detail?: string;\n startedAt: number;\n finishedAt?: number;\n };\n };\n ralph: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n read: {\n path: string;\n offset: number;\n lines: {\n number: number;\n text: string;\n }[];\n totalLines: number;\n };\n send_message: {\n messageId: string;\n };\n skill: {\n name: string;\n provider: string;\n resourceBase?: {\n kind: \"directory\";\n path: string;\n } | {\n kind: \"url\";\n url: string;\n } | {\n kind: \"opaque\";\n description: string;\n };\n content: string;\n };\n subagent: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n subagent_fork: {\n kind: \"background\";\n jobId: string;\n } | {\n kind: \"continuable\";\n subagentId: string;\n } | {\n kind: \"foreground\";\n runId: string;\n output: JsonValue[];\n };\n todo_write: {\n todos: ({\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n })[];\n counts: {\n pending: number;\n inProgress: number;\n completed: number;\n };\n };\n workflow: {\n runId: string;\n agentsStarted: number;\n result: JsonValue;\n };\n write: {\n path: string;\n operation: \"create\" | \"update\";\n before: string | null;\n after: string;\n };\n}\n\ntype ToolName = keyof ToolOutputMap\n\ndeclare class ToolCallError extends Error {\n readonly name: \"ToolCallError\";\n readonly toolName: ToolName;\n}\n\ndeclare const tools: {\n [K in ToolName]: (args: ToolArgsMap[K]) => Promise;\n}\n```","tools":[{"name":"bash","description":"Execute a bash command (`bash -c`) and return its stdout/stderr. Each call runs in a fresh shell: no state (cwd, variables, functions) persists between calls — pass `workdir` instead of using `cd`. Non-zero exits are reported as `[exit code: N]`. Current harness environment facts are exposed through managed `$DSH_*` variables; inspect them when needed. Commands may run under a file sandbox; a blocked file operation is reported as `[sandbox: file access denied under mode]` — a policy denial, not a bug in the command; do not retry another way. Long output is truncated to its tail; the full output is saved to a file whose path is reported when available. Set `run_in_background: true` for long-running commands: the call returns a job id immediately; read its output with `job_output` and stop it with `job_kill`.","parameters":{"type":"object","properties":{"command":{"type":"string","description":"The bash command to execute."},"description":{"type":"string","description":"Clear, concise description of what this command does in active voice, 5-10 words (shown in the UI). Examples: \"ls\" → \"List files in current directory\"; \"git status\" → \"Show working tree status\"; \"npm install\" → \"Install package dependencies\"."},"timeoutMs":{"type":"number","description":"Timeout in milliseconds. The executor applies its configured default and cap, and kills the command on expiry."},"workdir":{"type":"string","description":"Working directory for this command. Defaults to the session workspace; a relative path is resolved against it."},"run_in_background":{"type":"boolean","description":"Run in the background and return a job id immediately (collect with job_output, stop with job_kill). No timeout applies."}},"required":["command","description"]}},{"name":"cordis_define","description":"Define an immutable Cordis Package. For a new Plugin, use kind:\"new\" and provide only a semantic prefix of 3–6 lowercase English letters; the Host returns the final pluginId and packageId. To modify an existing Plugin, use kind:\"existing\" with its exact pluginId to append a Package without overwriting older versions. Provide at least one of code.host and code.client. Each value is a plain JavaScript function body that returns a Cordis Plugin; no TypeScript, JSX, or import transformation occurs. Query Inspect before depending on a Service, Event, Builtin, Slot, or token. Define only validates parameters and syntax and records source: it does not request approval, execute apply, or change currentPackageId. On success, call cordis_run with the returned IDs.","parameters":{"type":"object","properties":{"plugin":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"new"},"idPrefix":{"type":"string","description":"Suggested semantic prefix of 3–6 lowercase English letters; the Host adds a unique numeric suffix."}},"required":["kind","idPrefix"]},{"type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","const":"existing"},"pluginId":{"type":"string","description":"Exact ID of an existing Plugin; the new Package is appended to that instance."}},"required":["kind","pluginId"]}]},"name":{"type":"string","description":"Short, readable Package name."},"purpose":{"type":"string","description":"One-sentence, user-facing description of the Package purpose."},"code":{"type":"object","additionalProperties":false,"properties":{"host":{"type":"string","description":"Plain JavaScript function body that returns the Host-half Cordis Plugin."},"client":{"type":"string","description":"Plain JavaScript function body that returns the browser Client-half Cordis Plugin."}}}},"required":["plugin","name","purpose","code"]}},{"name":"cordis_inspect_list","description":"List every Cordis Inspect Provider currently known to the Host, including local Host Providers and the latest manifests synchronized from the Client. Each entry includes its platform, purpose, read-only methods, and input/output schemas. Call this Tool before creating or modifying a Package, then select the provider and method for cordis_inspect_query from its result. Do not guess names or treat an Inspect method as a business Service that Plugin code can call.","parameters":{"type":"object","properties":{}}},{"name":"cordis_inspect_query","description":"Run a read-only query explicitly declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before cordis_define to read exact Service methods, Event modes, Builtin signatures, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime. For Service.listService and Event.listEvents, query without input to navigate the compact signature directory, then query the exact service or event for its structured contract and referenced types. For Slots.listSubTree, query without root to navigate the compact tree, then query the exact root for its complete registration contract and props.","parameters":{"type":"object","properties":{"platform":{"type":"string","description":"Runtime platform that owns the Provider.","enum":["host","client"]},"provider":{"type":"string","description":"Exact Provider ID returned by cordis_inspect_list."},"method":{"type":"string","description":"Exact method name declared by the Provider manifest."},"input":{"description":"Optional query input; it must satisfy the method input schema."}},"required":["platform","provider","method"]}},{"name":"cordis_inspect_self","description":"Inspect dynamic Cordis objects owned by the current Session at increasing levels of detail. With no IDs, list only Plugin summaries. With pluginId alone, return version pointers, the latest Run, and every Package summary. Only pluginId plus packageId returns that immutable Package's Host/Client source and runtime diagnostics. packageId cannot be supplied alone. Query an exact Package before handling @pluginId, repairing an asynchronous failure, or defining an updated version. This Tool is read-only: it neither executes code nor changes version pointers.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define or injected by @pluginId; omit it to list every current Plugin."},"packageId":{"type":"string","description":"Exact immutable Package ID owned by pluginId; when specified, source and diagnostics are returned."}}}},{"name":"cordis_run","description":"Activate one exact Package of a dynamic Plugin. Use mode:\"run\" for the first activation, restarting currentPackageId, or rollback. When current exists, use mode:\"update\" to switch to a different Package, even if the Plugin is currently stopped. An unauthorized Client Package creates an approval request and returns awaiting-approval; an authorized Package returns starting and continues asynchronously in the browser. Neither result waits for the final outcome inside the Tool. currentPackageId changes only after complete success; on failure, the old current and target next remain. Asynchronous success, rejection, or technical failure is reported through state and steering. After a technical failure, read diagnostics with cordis_inspect_self, correct the same Plugin, and retry autonomously. Do not request approval again after the user rejects it.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable Plugin ID returned by cordis_define."},"packageId":{"type":"string","description":"Exact immutable Package ID to activate under that Plugin."},"mode":{"type":"string","description":"Use run for the first activation, restarting current, or rollback; use update to switch from current to a different Package.","enum":["run","update"]}},"required":["pluginId","packageId","mode"]}},{"name":"cordis_stop","description":"Stop the current Run of a dynamic Plugin and cancel unfinished approval or activation requests. Retain the Plugin, every immutable Package, grants, currentPackageId, and nextPackageId so it can later run or update directly. Stopping an already stopped Plugin succeeds idempotently. Use this Tool to disable effects temporarily; use cordis_undefine for permanent removal.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to stop."}},"required":["pluginId"]}},{"name":"cordis_undefine","description":"Permanently remove a dynamic Plugin owned by the current Session. If it is running or awaiting approval, first stop it and cancel the request, then delete every Package, grant, and version pointer. After this returns, its pluginId, packageIds, @ reference, and Package business views are invalid; historical cards retain only a \"Plugin removed\" record. Do not call this Tool when versions must remain available for restart or rollback; use cordis_stop instead.","parameters":{"type":"object","properties":{"pluginId":{"type":"string","description":"Stable dynamic Plugin ID to remove permanently."}},"required":["pluginId"]}},{"name":"edit","description":"Edit an existing UTF-8 text file by replacing literal text.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to edit, resolved by the filesystem backend."},"old_string":{"type":"string","description":"Literal text to replace. Must match exactly."},"new_string":{"type":"string","description":"Literal replacement text. Use an empty string to delete the match."},"replace_all":{"type":"boolean","description":"Replace all matches. Defaults to false; when false, old_string must appear exactly once."}},"required":["file_path","old_string","new_string"]}},{"name":"interrupt_agent","description":"Request cancellation of a background agent's current turn by its agent id. The target may be your direct child or a deeper agent created under you. Only the current turn stops: messages already queued for the agent stay parked until a later send_message, agents it started keep running, and the agent itself stays available for follow-ups. This call returns as soon as the stop request is accepted, so the target may keep running briefly; interrupting an agent that already finished is an accepted no-op.","parameters":{"type":"object","properties":{"agent_id":{"type":"string","description":"The agent id of the running agent to interrupt."}},"required":["agent_id"]}},{"name":"job_kill","description":"Request cancellation of a running background job by job id. Returns immediately; the job settles as killed once its work actually stops.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"reason":{"type":"string","description":"Optional short reason, recorded in the log and forwarded to the job."}},"required":["job_id"]}},{"name":"job_list","description":"List your background jobs (running and finished) with their ids, kinds, and statuses.","parameters":{"type":"object","properties":{}}},{"name":"job_output","description":"Read a background job. Stream jobs return only output since the previous read; final-output jobs return their result after settlement. Every response ends with `[status: ...]`. Reads are non-blocking unless `wait: true`, which waits up to the configured cap.","parameters":{"type":"object","properties":{"job_id":{"type":"string","description":"Job id returned by the tool that started the background work."},"wait":{"type":"boolean","description":"Block until the job reaches a terminal status or the timeout expires. A timed-out wait returns [status: running] and leaves the job alive."},"timeout_ms":{"type":"number","description":"Max wait in milliseconds (only meaningful with wait: true). Defaults to the configured wait timeout; capped by the configured maximum."}},"required":["job_id"]}},{"name":"ralph","description":"Run a foreground fresh-agent Ralph loop toward one immutable objective. Use only when the direct human explicitly asks for Ralph or fresh-agent iteration. Each round opens a new child with no parent conversation or prior child session; the shared workspace is long-term memory, and only a bounded structured report crosses rounds. The call returns when a worker reports completion or a concrete blocker, or at the round limit. Ordinary long-running same-session work belongs to goal tools.","parameters":{"type":"object","properties":{"objective":{"type":"string","description":"The immutable completion objective for every fresh Ralph round."},"maxRounds":{"type":"number","description":"Optional positive safe-integer round cap, bounded by the deployment ceiling."}},"required":["objective"]}},{"name":"read","description":"Read a UTF-8 text file and return line-numbered content.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to read, resolved by the filesystem backend."},"offset":{"type":"number","description":"1-based first line to return. Defaults to 1."},"limit":{"type":"number","description":"Maximum number of lines to return. Defaults to 2000."}},"required":["file_path"]}},{"name":"run_code","description":"Execute a TypeScript program against the available tools. Takes two required arguments: `code`, the BODY of an async function (erasable syntax only; top-level `await` and `return` work), and `description`, a short summary of what the program does. Call tools as `await tools.name(args)` per the declarations in the system prompt. Only what you print or return comes back — curate it.","parameters":{"type":"object","properties":{"code":{"type":"string","description":"The program: the body of an async TypeScript function."},"description":{"type":"string","description":"Clear, concise description of what this program does in active voice, 5-10 words (shown in the UI). Examples: \"Count TODO markers across packages\"; \"Read failing test and its fixture\"; \"Rename config key in every cordis.yml\"."}},"required":["code","description"]}},{"name":"send_message","description":"Send a message to a background subagent by its subagent id, continuing the same conversation. It becomes the subagent's next turn: if it is still working, the message waits until its current turn finishes, so it cannot redirect work already underway. This call returns no answer from the subagent — only confirmation that the message was delivered — so use it to give it more work. A failure means the message was NOT delivered.","parameters":{"type":"object","properties":{"subagent_id":{"type":"string","description":"The subagent id returned when the background subagent was started."},"message":{"type":"string","description":"The message to deliver to the subagent."}},"required":["subagent_id","message"]}},{"name":"skill","description":"Load the full instructions for an available skill. Call this with the exact skill name from the session skill catalog before acting on a task that names or clearly matches that skill.","parameters":{"type":"object","properties":{"name":{"type":"string","description":"The exact skill name from the available skills list."}},"required":["name"]}},{"name":"subagent","description":"Delegate a self-contained task to a subagent (a separate agent that works in its own context) to offload focused, independent work — research, a scoped implementation, an analysis — so it does not consume this conversation's context. The subagent returns its result, not its intermediate steps. Give it a complete, standalone prompt: it does not see this conversation. This tool runs in the background by default, immediately returns a durable subagent id, and keeps the child conversation available for later turns. When that run settles, the runtime sends the parent a notice containing its outcome and any final assistant message; `send_message` starts a later turn in the same child conversation. Set `run_in_background: false` only when your next action depends on receiving the result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The complete, self-contained task for the subagent. It does not share this conversation's context, so include everything it needs."},"run_in_background":{"type":"boolean","description":"Whether to run in the background and return a durable subagent id immediately. Defaults to true. Set false to wait for the result when your next action depends on it."}},"required":["description","prompt"]}},{"name":"subagent_fork","description":"Delegate a task to a subagent that inherits this conversation: a child agent seeded with all completed turns so far (it does not see the current in-flight turn). Use this when the subtask builds on this conversation's context — a follow-up analysis, a review, a continuation — without consuming this conversation's context for the work itself. You receive its result, not its intermediate steps. This call waits for the subagent and returns its result.","parameters":{"type":"object","properties":{"description":{"type":"string","description":"A short (3-5 word) description of the delegated task, for display."},"prompt":{"type":"string","description":"The task for the subagent. It already sees this conversation's completed turns, so build on them freely and state only what is new."}},"required":["description","prompt"]}},{"name":"todo_write","description":"Record and update a structured task list for the current work. Send the ENTIRE list every call — it REPLACES the previous list (there are no partial updates, no per-item edits). Use it to plan multi-step work and show progress: add one todo per concrete step before you start. Mark every todo being actively worked on `in_progress` — several at once when work genuinely runs in parallel (e.g. concurrent subagents or background commands), one for sequential work; while work remains, at least one task should be `in_progress`. Mark a todo `completed` the moment it is done (do not batch completions), and allow no `in_progress` item only once all work is complete. Skip the list for trivial single-step tasks. Statuses: `pending` (not started), `in_progress` (being worked on now), `completed` (finished).","parameters":{"type":"object","properties":{"todos":{"type":"array","description":"The COMPLETE task list, replacing any previous list.","items":{"type":"object","additionalProperties":false,"properties":{"content":{"type":"string","description":"What the task is — a short imperative line."},"status":{"type":"string","description":"pending (not started) | in_progress (now) | completed (done).","enum":["pending","in_progress","completed"]}},"required":["content","status"]}}},"required":["todos"]}},{"name":"workflow","description":"Run a JavaScript workflow script that orchestrates subagents at scale. Use this for work that fans out across many independent pieces — an audit over many files, a migration, multi-angle research, adversarial verification of findings — where you write the orchestration as a script instead of delegating turn by turn.\n\nThe workflow's identity rides the `meta` parameter as JSON: required `name` (short kebab-case) and `description` strings, optional `whenToUse` string and `phases` array (`{title, detail?, provider?, model?}`). The `script` parameter is the plain JavaScript body ONLY (NOT TypeScript, and NO `export const meta` statement — meta is a parameter, not code), running with top-level await; end with `return ` — the value must be JSON-serializable and is this tool's result.\n\nScript-body hooks:\n- `agent(prompt, opts?): Promise` — run one subagent to completion. Without `opts.schema` it resolves to the child's final text; with `opts.schema` (an object-rooted JSON Schema using ONLY type/properties/required/additionalProperties/items/enum/const/oneOf — no pattern/format/numeric bounds) it resolves to the validated object. Resolves `null` when the child fails (filter with `.filter(Boolean)`). Other opts: `label` (display), `phase` (progress group), and independent `provider`/`model` LLM target overrides (either may be provided alone). Anything else (`effort`/`isolation`/`agentType`) is rejected loudly.\n- `pipeline(items, ...stages): Promise` — run each item through the stages independently with NO barrier between stages (prefer this for multi-stage work). Each stage receives `(prev, item, index)`. An ordinary stage throw drops that ITEM to `null` and skips its remaining stages.\n- `parallel(thunks): Promise` — run zero-argument functions concurrently and await ALL of them (a barrier; use only when a stage genuinely needs every prior result together). A throwing thunk resolves to `null`.\n- `phase(title)` — start a progress phase; `log(message)` — narrate progress; `args` — the tool call's `args` input, verbatim.\n\nMisused hooks (bad arguments, unknown options, unsupported schemas, tripped caps) throw errors that ALWAYS kill the script — they never dissolve into a per-item `null`.\n\nConstraints: concurrency and total-agent caps apply; no filesystem, network, timers, or Node.js APIs are provided — the agents do the work, the script only coordinates them. The run executes in the foreground: this call returns when the whole script finishes.","parameters":{"type":"object","properties":{"script":{"type":"string","description":"The plain-JS workflow script body (top-level await allowed; NO `export const meta` statement; end with `return `)."},"meta":{"type":"object","description":"The workflow identity block (plain JSON — never code).","additionalProperties":true,"properties":{"name":{"type":"string","description":"Short kebab-case workflow name."},"description":{"type":"string","description":"One-line description of what the workflow does."},"whenToUse":{"type":"string","description":"Optional guidance on when this workflow applies."},"phases":{"type":"array","description":"Optional phase declarations matched by phase() calls.","items":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string","description":"The phase title phase() calls match by exact string."},"detail":{"type":"string","description":"Optional one-line description of the phase."},"provider":{"type":"string","description":"Optional provider override this phase is expected to use."},"model":{"type":"string","description":"Optional model override this phase is expected to use."}},"required":["title"]}}},"required":["name","description"]},"args":{"type":"object","description":"Optional JSON input exposed to the script as the `args` global (wrap a bare list as a field, e.g. {\"files\": [...]}).","additionalProperties":true}},"required":["script","meta"]}},{"name":"write","description":"Create or fully replace a UTF-8 text file.","parameters":{"type":"object","properties":{"file_path":{"type":"string","description":"Path to write, resolved by the filesystem backend."},"content":{"type":"string","description":"Full UTF-8 text content to write."}},"required":["file_path","content"]}}]},"reason":"initial"}} {"type":"request/context","seq":7,"time":1785730501403,"data":{"provider":"deepseek-official","model":"deepseek-v4-flash"}} {"type":"assistant/chunk","seq":8,"time":1783950000007,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} {"type":"assistant/chunk","seq":9,"time":1783950000008,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":0,"id":"advanced-define","name":"cordis_define","argumentsDelta":"{\"plugin\":{\"kind\":\"new\",\"idPrefix\":\"snap\"},\"name\":\"Snapshot Marker\",\"purpose\":\"Exercise the dynamic Cordis Package lifecycle in the snapshot.\",\"code\":{\"host\":\"return { apply() {} }\"}}"}}} {"type":"assistant/chunk","seq":10,"time":1783950000009,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"advanced-define","name":"cordis_define","arguments":"{\"plugin\":{\"kind\":\"new\",\"idPrefix\":\"snap\"},\"name\":\"Snapshot Marker\",\"purpose\":\"Exercise the dynamic Cordis Package lifecycle in the snapshot.\",\"code\":{\"host\":\"return { apply() {} }\"}}"}}}} {"type":"assistant/chunk","seq":11,"time":1785498583784,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} {"type":"assistant/chunk","seq":12,"time":1785730501404,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":13,"time":1785730501404,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-define","name":"cordis_define","arguments":"{\"plugin\":{\"kind\":\"new\",\"idPrefix\":\"snap\"},\"name\":\"Snapshot Marker\",\"purpose\":\"Exercise the dynamic Cordis Package lifecycle in the snapshot.\",\"code\":{\"host\":\"return { apply() {} }\"}}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"79c1bd38-584a-4756-8854-211919937987"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[8,9,10,11,12],"surfaceOp":"append"} +{"type":"assistant/message","seq":13,"time":1785730501404,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-define","name":"cordis_define","arguments":"{\"plugin\":{\"kind\":\"new\",\"idPrefix\":\"snap\"},\"name\":\"Snapshot Marker\",\"purpose\":\"Exercise the dynamic Cordis Package lifecycle in the snapshot.\",\"code\":{\"host\":\"return { apply() {} }\"}}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"e0351488-7bca-48d6-b7af-87d533858f47"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[8,9,10,11,12],"surfaceOp":"append"} {"type":"tool/call","seq":14,"time":1785730501404,"data":{"turn":1,"step":1,"callId":"advanced-define","name":"cordis_define","arguments":"{\"plugin\":{\"kind\":\"new\",\"idPrefix\":\"snap\"},\"name\":\"Snapshot Marker\",\"purpose\":\"Exercise the dynamic Cordis Package lifecycle in the snapshot.\",\"code\":{\"host\":\"return { apply() {} }\"}}"}} -{"type":"tool/result","seq":15,"time":1785730501413,"data":{"turn":1,"step":1,"message":{"source":{"kind":"tool","callId":"advanced-define"},"content":[{"type":"tool-result","toolCallId":"advanced-define","content":[{"type":"text","text":"Defined snap-1/pkg-1 (Snapshot Marker); it is not running yet. Use cordis_run to activate this Package."}],"isError":false}],"role":"user","id":"8255947c-3d5d-4872-8359-914555595bd3"},"meta":{"pluginId":"snap-1","packageId":"pkg-1"}},"sourceEventSeqs":[14],"surfaceOp":"append"} +{"type":"tool/result","seq":15,"time":1785730501413,"data":{"turn":1,"step":1,"message":{"source":{"kind":"tool","callId":"advanced-define"},"content":[{"type":"tool-result","toolCallId":"advanced-define","content":[{"type":"text","text":"Defined snap-1/pkg-1 (Snapshot Marker); it is not running yet. Use cordis_run to activate this Package."}],"isError":false}],"role":"user","id":"9fd9ba62-1b6d-4bb7-98c6-97815e983026"},"meta":{"pluginId":"snap-1","packageId":"pkg-1"}},"sourceEventSeqs":[14],"surfaceOp":"append"} {"type":"step/end","seq":16,"time":1785730501413,"data":{"turn":1,"step":1}} {"type":"step/start","seq":17,"time":1785730501423,"data":{"turn":1,"step":2}} {"type":"assistant/chunk","seq":18,"time":1783950000017,"data":{"turn":1,"step":2,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} @@ -22,13 +22,13 @@ {"type":"assistant/chunk","seq":20,"time":1783950000019,"data":{"turn":1,"step":2,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"advanced-code","name":"run_code","arguments":"{\"code\":\"const run = await tools.cordis_run({ pluginId: 'snap-1', packageId: 'pkg-1', mode: 'run' });\\nconst inspected = await tools.cordis_inspect_self({ pluginId: 'snap-1' });\\nreturn { run, inspected };\",\"description\":\"Run and inspect the dynamic Cordis Package\"}"}}}} {"type":"assistant/chunk","seq":21,"time":1785498583804,"data":{"turn":1,"step":2,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} {"type":"assistant/chunk","seq":22,"time":1785730501424,"data":{"turn":1,"step":2,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":23,"time":1785730501424,"data":{"turn":1,"step":2,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-code","name":"run_code","arguments":"{\"code\":\"const run = await tools.cordis_run({ pluginId: 'snap-1', packageId: 'pkg-1', mode: 'run' });\\nconst inspected = await tools.cordis_inspect_self({ pluginId: 'snap-1' });\\nreturn { run, inspected };\",\"description\":\"Run and inspect the dynamic Cordis Package\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"e73246e2-257d-4d38-a8cd-5e5f713d4ad3"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[18,19,20,21,22],"surfaceOp":"append"} +{"type":"assistant/message","seq":23,"time":1785730501424,"data":{"turn":1,"step":2,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-code","name":"run_code","arguments":"{\"code\":\"const run = await tools.cordis_run({ pluginId: 'snap-1', packageId: 'pkg-1', mode: 'run' });\\nconst inspected = await tools.cordis_inspect_self({ pluginId: 'snap-1' });\\nreturn { run, inspected };\",\"description\":\"Run and inspect the dynamic Cordis Package\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"6f6c3cc3-350b-4afb-a3d1-8f91b9494628"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[18,19,20,21,22],"surfaceOp":"append"} {"type":"tool/call","seq":24,"time":1785730501424,"data":{"turn":1,"step":2,"callId":"advanced-code","name":"run_code","arguments":"{\"code\":\"const run = await tools.cordis_run({ pluginId: 'snap-1', packageId: 'pkg-1', mode: 'run' });\\nconst inspected = await tools.cordis_inspect_self({ pluginId: 'snap-1' });\\nreturn { run, inspected };\",\"description\":\"Run and inspect the dynamic Cordis Package\"}"}} {"type":"tool/code-dispatch-start","seq":25,"time":1785730501473,"data":{"rootCallId":"advanced-code","parentCallId":"advanced-code","subCallId":"advanced-code:code:1","name":"cordis_run","arguments":{"pluginId":"snap-1","packageId":"pkg-1","mode":"run"}}} {"type":"tool/code-dispatch","seq":26,"time":1785730501474,"data":{"rootCallId":"advanced-code","parentCallId":"advanced-code","subCallId":"advanced-code:code:1","name":"cordis_run","arguments":{"pluginId":"snap-1","packageId":"pkg-1","mode":"run"},"isError":false,"content":[{"type":"text","text":"snap-1/pkg-1 is running (run-1)."}]}} {"type":"tool/code-dispatch-start","seq":27,"time":1786558903189,"data":{"rootCallId":"advanced-code","parentCallId":"advanced-code","subCallId":"advanced-code:code:2","name":"cordis_inspect_self","arguments":{"pluginId":"snap-1"}}} {"type":"tool/code-dispatch","seq":28,"time":1786558903189,"data":{"rootCallId":"advanced-code","parentCallId":"advanced-code","subCallId":"advanced-code:code:2","name":"cordis_inspect_self","arguments":{"pluginId":"snap-1"},"isError":false,"content":[{"type":"text","text":"{\n \"mode\": \"plugin\",\n \"pluginId\": \"snap-1\",\n \"name\": \"Snapshot Marker\",\n \"packageCount\": 1,\n \"state\": \"running\",\n \"currentPackageId\": \"pkg-1\",\n \"activeRun\": {\n \"pluginRunId\": \"run-1\",\n \"packageId\": \"pkg-1\"\n },\n \"packages\": [\n {\n \"packageId\": \"pkg-1\",\n \"name\": \"Snapshot Marker\",\n \"purpose\": \"Exercise the dynamic Cordis Package lifecycle in the snapshot.\",\n \"hasHostHalf\": true,\n \"hasClientHalf\": false,\n \"isCurrent\": true,\n \"isNext\": false\n }\n ]\n}"}]}} -{"type":"tool/result","seq":29,"time":1786558903193,"data":{"turn":1,"step":2,"message":{"source":{"kind":"tool","callId":"advanced-code"},"content":[{"type":"tool-result","toolCallId":"advanced-code","content":[{"type":"text","text":"{\n \"run\": {\n \"status\": \"running\",\n \"pluginId\": \"snap-1\",\n \"packageId\": \"pkg-1\",\n \"pluginRunId\": \"run-1\",\n \"currentPackageId\": \"pkg-1\",\n \"host\": {\n \"status\": \"running\",\n \"provides\": [],\n \"waitingFor\": []\n },\n \"client\": {\n \"status\": \"absent\",\n \"waitingFor\": []\n }\n },\n \"inspected\": {\n \"mode\": \"plugin\",\n \"pluginId\": \"snap-1\",\n \"name\": \"Snapshot Marker\",\n \"packageCount\": 1,\n \"state\": \"running\",\n \"currentPackageId\": \"pkg-1\",\n \"activeRun\": {\n \"pluginRunId\": \"run-1\",\n \"packageId\": \"pkg-1\"\n },\n \"packages\": [\n {\n \"packageId\": \"pkg-1\",\n \"name\": \"Snapshot Marker\",\n \"purpose\": \"Exercise the dynamic Cordis Package lifecycle in the snapshot.\",\n \"hasHostHalf\": true,\n \"hasClientHalf\": false,\n \"isCurrent\": true,\n \"isNext\": false\n }\n ]\n }\n}"}],"isError":false}],"role":"user","id":"acb0a833-2535-41ff-9e1d-926c092329b6"}},"sourceEventSeqs":[24],"surfaceOp":"append"} +{"type":"tool/result","seq":29,"time":1786558903193,"data":{"turn":1,"step":2,"message":{"source":{"kind":"tool","callId":"advanced-code"},"content":[{"type":"tool-result","toolCallId":"advanced-code","content":[{"type":"text","text":"{\n \"run\": {\n \"status\": \"running\",\n \"pluginId\": \"snap-1\",\n \"packageId\": \"pkg-1\",\n \"pluginRunId\": \"run-1\",\n \"currentPackageId\": \"pkg-1\",\n \"host\": {\n \"status\": \"running\",\n \"provides\": [],\n \"waitingFor\": []\n },\n \"client\": {\n \"status\": \"absent\",\n \"waitingFor\": []\n }\n },\n \"inspected\": {\n \"mode\": \"plugin\",\n \"pluginId\": \"snap-1\",\n \"name\": \"Snapshot Marker\",\n \"packageCount\": 1,\n \"state\": \"running\",\n \"currentPackageId\": \"pkg-1\",\n \"activeRun\": {\n \"pluginRunId\": \"run-1\",\n \"packageId\": \"pkg-1\"\n },\n \"packages\": [\n {\n \"packageId\": \"pkg-1\",\n \"name\": \"Snapshot Marker\",\n \"purpose\": \"Exercise the dynamic Cordis Package lifecycle in the snapshot.\",\n \"hasHostHalf\": true,\n \"hasClientHalf\": false,\n \"isCurrent\": true,\n \"isNext\": false\n }\n ]\n }\n}"}],"isError":false}],"role":"user","id":"40a17cbf-a853-4813-bbb5-7970cfbc7010"}},"sourceEventSeqs":[24],"surfaceOp":"append"} {"type":"step/end","seq":30,"time":1786558903193,"data":{"turn":1,"step":2}} {"type":"step/start","seq":31,"time":1786558903203,"data":{"turn":1,"step":3}} {"type":"assistant/chunk","seq":32,"time":1785037378923,"data":{"turn":1,"step":3,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} @@ -36,9 +36,9 @@ {"type":"assistant/chunk","seq":34,"time":1785730501484,"data":{"turn":1,"step":3,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"advanced-direct-child","name":"subagent","arguments":"{\"description\":\"Check direct child\",\"prompt\":\"Reply with exactly DIRECT_CHILD_OK and nothing else.\",\"run_in_background\":false}"}}}} {"type":"assistant/chunk","seq":35,"time":1786558903204,"data":{"turn":1,"step":3,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} {"type":"assistant/chunk","seq":36,"time":1786558903204,"data":{"turn":1,"step":3,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":37,"time":1786558903204,"data":{"turn":1,"step":3,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-direct-child","name":"subagent","arguments":"{\"description\":\"Check direct child\",\"prompt\":\"Reply with exactly DIRECT_CHILD_OK and nothing else.\",\"run_in_background\":false}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"32da94eb-ef97-4929-8dec-dea761506e90"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[32,33,34,35,36],"surfaceOp":"append"} +{"type":"assistant/message","seq":37,"time":1786558903204,"data":{"turn":1,"step":3,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-direct-child","name":"subagent","arguments":"{\"description\":\"Check direct child\",\"prompt\":\"Reply with exactly DIRECT_CHILD_OK and nothing else.\",\"run_in_background\":false}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"8bdea090-4a9a-451f-bb21-459af50472fa"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[32,33,34,35,36],"surfaceOp":"append"} {"type":"tool/call","seq":38,"time":1786558903205,"data":{"turn":1,"step":3,"callId":"advanced-direct-child","name":"subagent","arguments":"{\"description\":\"Check direct child\",\"prompt\":\"Reply with exactly DIRECT_CHILD_OK and nothing else.\",\"run_in_background\":false}"}} -{"type":"tool/result","seq":39,"time":1786558903240,"data":{"turn":1,"step":3,"message":{"source":{"kind":"tool","callId":"advanced-direct-child"},"content":[{"type":"tool-result","toolCallId":"advanced-direct-child","content":[{"type":"text","text":"DIRECT_CHILD_OK"}],"isError":false}],"role":"user","id":"29fcc9e2-dee3-4bf7-b3a9-e167c00a755b"}},"sourceEventSeqs":[38],"surfaceOp":"append"} +{"type":"tool/result","seq":39,"time":1786558903240,"data":{"turn":1,"step":3,"message":{"source":{"kind":"tool","callId":"advanced-direct-child"},"content":[{"type":"tool-result","toolCallId":"advanced-direct-child","content":[{"type":"text","text":"DIRECT_CHILD_OK"}],"isError":false}],"role":"user","id":"c978c208-8ebd-4dd6-b997-606ca7de787e"}},"sourceEventSeqs":[38],"surfaceOp":"append"} {"type":"step/end","seq":40,"time":1786558903240,"data":{"turn":1,"step":3}} {"type":"step/start","seq":41,"time":1786558903249,"data":{"turn":1,"step":4}} {"type":"assistant/chunk","seq":42,"time":1785037378946,"data":{"turn":1,"step":4,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} @@ -46,13 +46,13 @@ {"type":"assistant/chunk","seq":44,"time":1785730501522,"data":{"turn":1,"step":4,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"advanced-workflow","name":"workflow","arguments":"{\"script\":\"phase('Delegate')\\nconst reply = await agent('Reply with exactly WORKFLOW_CHILD_OK and nothing else.', { label: 'workflow-child' })\\nreturn { reply }\",\"meta\":{\"name\":\"advanced-headless-snapshot\",\"description\":\"exercise one workflow child through the headless agent\"}}"}}}} {"type":"assistant/chunk","seq":45,"time":1786558903250,"data":{"turn":1,"step":4,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} {"type":"assistant/chunk","seq":46,"time":1786558903250,"data":{"turn":1,"step":4,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":47,"time":1786558903250,"data":{"turn":1,"step":4,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-workflow","name":"workflow","arguments":"{\"script\":\"phase('Delegate')\\nconst reply = await agent('Reply with exactly WORKFLOW_CHILD_OK and nothing else.', { label: 'workflow-child' })\\nreturn { reply }\",\"meta\":{\"name\":\"advanced-headless-snapshot\",\"description\":\"exercise one workflow child through the headless agent\"}}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"6fff1bc7-3e35-415b-ae02-e018d360fe09"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[42,43,44,45,46],"surfaceOp":"append"} +{"type":"assistant/message","seq":47,"time":1786558903250,"data":{"turn":1,"step":4,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-workflow","name":"workflow","arguments":"{\"script\":\"phase('Delegate')\\nconst reply = await agent('Reply with exactly WORKFLOW_CHILD_OK and nothing else.', { label: 'workflow-child' })\\nreturn { reply }\",\"meta\":{\"name\":\"advanced-headless-snapshot\",\"description\":\"exercise one workflow child through the headless agent\"}}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"e55b2b2e-497c-45d2-8115-16f317ae573f"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[42,43,44,45,46],"surfaceOp":"append"} {"type":"tool/call","seq":48,"time":1786558903250,"data":{"turn":1,"step":4,"callId":"advanced-workflow","name":"workflow","arguments":"{\"script\":\"phase('Delegate')\\nconst reply = await agent('Reply with exactly WORKFLOW_CHILD_OK and nothing else.', { label: 'workflow-child' })\\nreturn { reply }\",\"meta\":{\"name\":\"advanced-headless-snapshot\",\"description\":\"exercise one workflow child through the headless agent\"}}"}} {"type":"tool-workflow/run-start","seq":49,"time":1786558903255,"data":{"runId":"cd3d2666-94a1-4285-804e-c99630bc7b51","name":"advanced-headless-snapshot"}} {"type":"tool-workflow/agent-start","seq":50,"time":1786558903485,"data":{"runId":"cd3d2666-94a1-4285-804e-c99630bc7b51","seq":1,"label":"workflow-child","phase":"Delegate","childId":"33333333-3333-4333-8333-333333333333"}} {"type":"tool-workflow/agent-end","seq":51,"time":1786558903518,"data":{"runId":"cd3d2666-94a1-4285-804e-c99630bc7b51","seq":1,"outcome":"completed"}} {"type":"tool-workflow/run-end","seq":52,"time":1786558903521,"data":{"runId":"cd3d2666-94a1-4285-804e-c99630bc7b51","stopReason":"completed"}} -{"type":"tool/result","seq":53,"time":1786558903521,"data":{"turn":1,"step":4,"message":{"source":{"kind":"tool","callId":"advanced-workflow"},"content":[{"type":"tool-result","toolCallId":"advanced-workflow","content":[{"type":"text","text":"workflow \"advanced-headless-snapshot\" completed (1 agent).\nReturn value:\n{\n \"reply\": \"WORKFLOW_CHILD_OK\"\n}"}],"isError":false}],"role":"user","id":"82895074-35a8-470a-a622-b951d2fc2665"}},"sourceEventSeqs":[48],"surfaceOp":"append"} +{"type":"tool/result","seq":53,"time":1786558903521,"data":{"turn":1,"step":4,"message":{"source":{"kind":"tool","callId":"advanced-workflow"},"content":[{"type":"tool-result","toolCallId":"advanced-workflow","content":[{"type":"text","text":"workflow \"advanced-headless-snapshot\" completed (1 agent).\nReturn value:\n{\n \"reply\": \"WORKFLOW_CHILD_OK\"\n}"}],"isError":false}],"role":"user","id":"f85f58fc-8d7e-4c9f-a0fe-caff480a9fec"}},"sourceEventSeqs":[48],"surfaceOp":"append"} {"type":"step/end","seq":54,"time":1786558903521,"data":{"turn":1,"step":4}} {"type":"step/start","seq":55,"time":1786558903530,"data":{"turn":1,"step":5}} {"type":"assistant/chunk","seq":56,"time":1786359174239,"data":{"turn":1,"step":5,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} @@ -60,9 +60,9 @@ {"type":"assistant/chunk","seq":58,"time":1786359174239,"data":{"turn":1,"step":5,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"advanced-undefine","name":"cordis_undefine","arguments":"{\"pluginId\":\"snap-1\"}"}}}} {"type":"assistant/chunk","seq":59,"time":1786558903530,"data":{"turn":1,"step":5,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} {"type":"assistant/chunk","seq":60,"time":1786558903530,"data":{"turn":1,"step":5,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":61,"time":1786558903530,"data":{"turn":1,"step":5,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-undefine","name":"cordis_undefine","arguments":"{\"pluginId\":\"snap-1\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"b1219ecf-66a4-4de1-b822-a39b6651bd90"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[56,57,58,59,60],"surfaceOp":"append"} +{"type":"assistant/message","seq":61,"time":1786558903530,"data":{"turn":1,"step":5,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-undefine","name":"cordis_undefine","arguments":"{\"pluginId\":\"snap-1\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"68bd993f-a0bd-4ea8-ad16-6b1a19e09bd3"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[56,57,58,59,60],"surfaceOp":"append"} {"type":"tool/call","seq":62,"time":1786558903531,"data":{"turn":1,"step":5,"callId":"advanced-undefine","name":"cordis_undefine","arguments":"{\"pluginId\":\"snap-1\"}"}} -{"type":"tool/result","seq":63,"time":1786558903537,"data":{"turn":1,"step":5,"message":{"source":{"kind":"tool","callId":"advanced-undefine"},"content":[{"type":"tool-result","toolCallId":"advanced-undefine","content":[{"type":"text","text":"Removed dynamic Plugin snap-1 and all of its Packages."}],"isError":false}],"role":"user","id":"30c8e3bb-2ada-4576-9764-6e87f5b8fc94"}},"sourceEventSeqs":[62],"surfaceOp":"append"} +{"type":"tool/result","seq":63,"time":1786558903537,"data":{"turn":1,"step":5,"message":{"source":{"kind":"tool","callId":"advanced-undefine"},"content":[{"type":"tool-result","toolCallId":"advanced-undefine","content":[{"type":"text","text":"Removed dynamic Plugin snap-1 and all of its Packages."}],"isError":false}],"role":"user","id":"2d90e3b5-2a4c-4408-a1a0-3d009786a07b"}},"sourceEventSeqs":[62],"surfaceOp":"append"} {"type":"step/end","seq":64,"time":1786558903537,"data":{"turn":1,"step":5}} {"type":"step/start","seq":65,"time":1786558903547,"data":{"turn":1,"step":6}} {"type":"assistant/chunk","seq":66,"time":1786359174249,"data":{"turn":1,"step":6,"chunk":{"type":"block-start","index":0,"blockType":"text"}}} @@ -70,6 +70,6 @@ {"type":"assistant/chunk","seq":68,"time":1786359174249,"data":{"turn":1,"step":6,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"ADVANCED_HEADLESS_OK"}}}} {"type":"assistant/chunk","seq":69,"time":1786558903548,"data":{"turn":1,"step":6,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} {"type":"assistant/chunk","seq":70,"time":1786558903548,"data":{"turn":1,"step":6,"chunk":{"type":"finish","reason":{"kind":"stop"}}}} -{"type":"assistant/message","seq":71,"time":1786558903548,"data":{"turn":1,"step":6,"message":{"role":"assistant","content":[{"type":"text","text":"ADVANCED_HEADLESS_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"9b46dd3a-e3ea-4f25-a246-814f31826e9e"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[66,67,68,69,70],"surfaceOp":"append"} +{"type":"assistant/message","seq":71,"time":1786558903548,"data":{"turn":1,"step":6,"message":{"role":"assistant","content":[{"type":"text","text":"ADVANCED_HEADLESS_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"f3823367-2e25-43d2-a129-70dc492b2a90"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[66,67,68,69,70],"surfaceOp":"append"} {"type":"step/end","seq":72,"time":1786558903549,"data":{"turn":1,"step":6}} {"type":"turn/end","seq":73,"time":1786558903549,"data":{"turn":1,"reason":{"kind":"completed"}}} diff --git a/examples/jsonrpc-agent/README.i18n.yaml b/examples/jsonrpc-agent/README.i18n.yaml index b8cf6969df..78a96ee6ac 100644 --- a/examples/jsonrpc-agent/README.i18n.yaml +++ b/examples/jsonrpc-agent/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write examples/jsonrpc-agent/README.md -README.md: 5166d94e92e2e4bcdda5026fa65ba6b77b87fe40 -README.zh.md: f84ab95132e820cf0fcf45bff4ae30d9bccb55c1 +README.md: ec94fa7ceec5a51585241851eaee2cfcf938738f +README.zh.md: 64a5e607bd37e97b60cb0a4f6ee89a7c766d7464 diff --git a/examples/jsonrpc-agent/README.md b/examples/jsonrpc-agent/README.md index 5166d94e92..ec94fa7cee 100644 --- a/examples/jsonrpc-agent/README.md +++ b/examples/jsonrpc-agent/README.md @@ -30,7 +30,7 @@ Pass the config path through the Python SDK's `cordis` option or `DSH_CORDIS_CON ## Minimal variant -[`minimal.cordis.yml`](minimal.cordis.yml) is the complete standalone counterpart of the Web `minimal` preset. `DSH_SYSTEM_PROMPT` selects its system prompt, with `You are a helpful software engineer assistant.` as the fallback, and no context-compaction plugin is mounted. Its model-facing tools are exactly: +[`minimal.cordis.yml`](minimal.cordis.yml) is the complete standalone counterpart of the Web `minimal` preset. `DSH_SYSTEM_PROMPT` selects its system prompt, with `You are a helpful software engineer assistant.` as the fallback. It suppresses every system-prompt runtime-context contribution for fresh sessions and mounts no context-compaction plugin. Its model-facing tools are exactly: - owner-scoped persistent `bash` - `str_replace_editor` with `view`, `create`, `str_replace`, and `insert` diff --git a/examples/jsonrpc-agent/README.zh.md b/examples/jsonrpc-agent/README.zh.md index f84ab95132..64a5e607bd 100644 --- a/examples/jsonrpc-agent/README.zh.md +++ b/examples/jsonrpc-agent/README.zh.md @@ -30,7 +30,7 @@ ## �简�体 -[`minimal.cordis.yml`](minimal.cordis.yml) 是 Web `minimal` preset 的完整独立版本。`DSH_SYSTEM_PROMPT` 选择它的系统�示�,未设置时使用 `You are a helpful software engineer assistant.`,且�挂载上下文压缩�件。��模型的工具严格�有: +[`minimal.cordis.yml`](minimal.cordis.yml) 是 Web `minimal` preset 的完整独立版本。`DSH_SYSTEM_PROMPT` 选择它的系统�示�,未设置时使用 `You are a helpful software engineer assistant.`。它为新建会�抑制�个 system-prompt runtime-context 贡献,且�挂载上下文压缩�件。��模型的工具严格�有: - 所有者作用域内�久化的 `bash` - �供 `view`�`create`�`str_replace` 与 `insert` 的 `str_replace_editor` diff --git a/examples/jsonrpc-agent/minimal.cordis.yml b/examples/jsonrpc-agent/minimal.cordis.yml index 8d6e9b8181..e23d52a866 100644 --- a/examples/jsonrpc-agent/minimal.cordis.yml +++ b/examples/jsonrpc-agent/minimal.cordis.yml @@ -1,6 +1,7 @@ # Complete unattended minimal-agent composition for the Python SDK. The model # sees one deployment-selected system prompt and only the owner-scoped -# persistent Bash and string-replace editor tools. Context compaction is absent. +# persistent Bash and string-replace editor tools. Runtime-context injection and +# context compaction are absent. - id: sdk-jsonrpc-server name: '@deepseek-ai/dsh-sdk-jsonrpc-server' @@ -47,6 +48,7 @@ name: '@deepseek-ai/dsh-agent-spine-demo' config: includeHarnessIdentity: false + includeRuntimeContext: false persona: !!js process.env.DSH_SYSTEM_PROMPT ?? 'You are a helpful software engineer assistant.' workspaceContext: false skills: diff --git a/examples/jsonrpc-agent/tests/sdk.snapshot.ts b/examples/jsonrpc-agent/tests/sdk.snapshot.ts index 85667cf64d..9b45292df5 100644 --- a/examples/jsonrpc-agent/tests/sdk.snapshot.ts +++ b/examples/jsonrpc-agent/tests/sdk.snapshot.ts @@ -77,8 +77,8 @@ interface SdkScenario { expectedSystem?: string /** Exact model-facing descriptions for selected tools. */ expectedToolDescriptions?: Readonly> - /** Stable policy-context clauses the real assembled request must include or omit. */ - policyContext?: { includes: readonly string[]; excludes: readonly string[] } + /** Expected runtime-context state in the real assembled request. */ + runtimeContext?: false | { includes: readonly string[]; excludes: readonly string[] } } const SCENARIOS: SdkScenario[] = [ @@ -111,10 +111,7 @@ const SCENARIOS: SdkScenario[] = [ expectedTools: { bash: ['command'], str_replace_editor: ['command', 'path'] }, expectedSystem: MINIMAL_SYSTEM_PROMPT, expectedToolDescriptions: { bash: MINIMAL_BASH_DESCRIPTION }, - policyContext: { - includes: ['Current DSH file policy: danger-full-access.', 'file modifications by available operations'], - excludes: ['write and edit tools', 'terminal sessions', 'one-shot bash commands'], - }, + runtimeContext: false, }, ] @@ -182,8 +179,8 @@ function assembledSystem(log: PersistedLog): string { return system } -function assembledPolicyContext(log: PersistedLog): string { - const contexts = log.content.trimEnd().split('\n').flatMap((line) => { +function assembledRuntimeContexts(log: PersistedLog): string[] { + return log.content.trimEnd().split('\n').flatMap((line) => { const event = JSON.parse(line) as { type?: string data?: { source?: { kind?: string; plugin?: string }; content?: Array<{ type?: string; text?: unknown }> } @@ -193,8 +190,6 @@ function assembledPolicyContext(log: PersistedLog): string { || event.data.source.plugin !== '@deepseek-ai/dsh-system-prompt') return [] return event.data.content?.flatMap(block => block.type === 'text' && typeof block.text === 'string' ? [block.text] : []) ?? [] }) - if (contexts.length !== 1) throw new Error(`session log has ${String(contexts.length)} runtime-context snapshots; expected one`) - return contexts[0] as string } function contextOf(logs: readonly { content: string; header: Record }[], cwd: string): NormalizeContext { @@ -447,14 +442,20 @@ describe('TypeScript SDK snapshots over the jsonrpc runtime', () => { if (parent === undefined) throw new Error(`${scenario.name} has no parent session log`) expect(assembledToolDescriptions(parent)).toMatchObject(scenario.expectedToolDescriptions) } - if (scenario.policyContext !== undefined) { + if (scenario.runtimeContext !== undefined) { const parent = ordered[0] if (parent === undefined) throw new Error(`${scenario.name} has no parent session log`) - const context = assembledPolicyContext(parent) - for (const clause of scenario.policyContext.includes) expect(context).toContain(clause) - for (const clause of scenario.policyContext.excludes) expect(context).not.toContain(clause) - const system = assembledSystem(parent) - for (const clause of scenario.policyContext.includes) expect(system).not.toContain(clause) + const contexts = assembledRuntimeContexts(parent) + if (scenario.runtimeContext === false) { + expect(contexts).toEqual([]) + } else { + expect(contexts).toHaveLength(1) + const context = contexts[0] as string + for (const clause of scenario.runtimeContext.includes) expect(context).toContain(clause) + for (const clause of scenario.runtimeContext.excludes) expect(context).not.toContain(clause) + const system = assembledSystem(parent) + for (const clause of scenario.runtimeContext.includes) expect(system).not.toContain(clause) + } } if (scenario.children > 0) { expect(notifications.some(n => n.method === 'subagent.started')).toBe(true) diff --git a/examples/jsonrpc-agent/tests/snapshots/persistent-tools/notifications.expected.jsonl b/examples/jsonrpc-agent/tests/snapshots/persistent-tools/notifications.expected.jsonl index ea8f220308..550d3495f9 100644 --- a/examples/jsonrpc-agent/tests/snapshots/persistent-tools/notifications.expected.jsonl +++ b/examples/jsonrpc-agent/tests/snapshots/persistent-tools/notifications.expected.jsonl @@ -4,76 +4,75 @@ {"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"agent/inbox/spliced","seq":2,"time":0,"data":{"target":"next-turn","start":0,"removedCount":1,"inserted":[]}}}} {"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":3,"time":0,"data":{"turn":1,"step":1}}}} {"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"user/message","seq":4,"time":0,"data":{"content":[{"type":"text","text":"Prove that bash state persists. Then create {{cwd}}/note.txt with a tab-indented line, view it, replace that literal tab-indented line, and make the persistent shell exit with code 9."}],"source":{"kind":"user"},"role":"user","id":"{{sessionId}}"},"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"user/message","seq":5,"time":0,"data":{"content":[{"type":"text","text":"Current runtime context. This snapshot supersedes earlier runtime-context snapshots.\n\nCurrent DSH file policy: danger-full-access. The DSH file sandbox does not restrict file modifications by available operations."}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt","form":"snapshot","sections":[{"name":"sandbox:policy","text":"Current DSH file policy: danger-full-access. The DSH file sandbox does not restrict file modifications by available operations."}]},"role":"user","id":"{{sessionId}}"},"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"session/title","seq":6,"time":0,"data":{"title":"Prove that bash state persists.","messageSeqs":[4],"source":{"kind":"fallback"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"request/header","seq":7,"time":0,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"{{system}}","tools":"{{tools}}"},"reason":"initial"}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"request/context","seq":8,"time":0,"data":{"provider":"deepseek-official","model":"deepseek-v4-flash"}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":9,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":10,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-1","name":"bash","argumentsDelta":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":11,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":12,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":13,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":14,"time":0,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[9,10,11,12,13],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":15,"time":0,"data":{"turn":1,"step":1,"callId":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":16,"time":0,"data":{"turn":1,"step":1,"message":{"source":{"kind":"tool","callId":"bash-1"},"content":[{"type":"tool-result","toolCallId":"bash-1","content":[{"type":"text","text":"COUNT=1 CWD=/tmp"}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[15],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":17,"time":0,"data":{"turn":1,"step":1}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":18,"time":0,"data":{"turn":1,"step":2}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":19,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":20,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-2","name":"bash","argumentsDelta":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":21,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":22,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":23,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":24,"time":0,"data":{"turn":1,"step":2,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[19,20,21,22,23],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":25,"time":0,"data":{"turn":1,"step":2,"callId":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":26,"time":0,"data":{"turn":1,"step":2,"message":{"source":{"kind":"tool","callId":"bash-2"},"content":[{"type":"tool-result","toolCallId":"bash-2","content":[{"type":"text","text":"COUNT=2 CWD=/tmp"}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[25],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":27,"time":0,"data":{"turn":1,"step":2}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":28,"time":0,"data":{"turn":1,"step":3}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":29,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":30,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-create","name":"str_replace_editor","argumentsDelta":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":31,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":32,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":33,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":34,"time":0,"data":{"turn":1,"step":3,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[29,30,31,32,33],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":35,"time":0,"data":{"turn":1,"step":3,"callId":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":36,"time":0,"data":{"turn":1,"step":3,"message":{"source":{"kind":"tool","callId":"editor-create"},"content":[{"type":"tool-result","toolCallId":"editor-create","content":[{"type":"text","text":"New file created successfully at: {{cwd}}/note.txt"}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[35],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":37,"time":0,"data":{"turn":1,"step":3}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":38,"time":0,"data":{"turn":1,"step":4}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":39,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":40,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-view","name":"str_replace_editor","argumentsDelta":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":41,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":42,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":43,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":44,"time":0,"data":{"turn":1,"step":4,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[39,40,41,42,43],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":45,"time":0,"data":{"turn":1,"step":4,"callId":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":46,"time":0,"data":{"turn":1,"step":4,"message":{"source":{"kind":"tool","callId":"editor-view"},"content":[{"type":"tool-result","toolCallId":"editor-view","content":[{"type":"text","text":"Here's the content of {{cwd}}/note.txt with line numbers (which has a total of 3 lines):\n 1 target:\n 2 \told\n 3 \n"}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[45],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":47,"time":0,"data":{"turn":1,"step":4}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":48,"time":0,"data":{"turn":1,"step":5}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":49,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":50,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-replace","name":"str_replace_editor","argumentsDelta":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":51,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":52,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":53,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":54,"time":0,"data":{"turn":1,"step":5,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[49,50,51,52,53],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":55,"time":0,"data":{"turn":1,"step":5,"callId":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":56,"time":0,"data":{"turn":1,"step":5,"message":{"source":{"kind":"tool","callId":"editor-replace"},"content":[{"type":"tool-result","toolCallId":"editor-replace","content":[{"type":"text","text":"The file {{cwd}}/note.txt has been edited successfully."}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[55],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":57,"time":0,"data":{"turn":1,"step":5}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":58,"time":0,"data":{"turn":1,"step":6}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":59,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":60,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-exit","name":"bash","argumentsDelta":"{\"command\":\"exit 9\"}"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":61,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":62,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":63,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":64,"time":0,"data":{"turn":1,"step":6,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[59,60,61,62,63],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":65,"time":0,"data":{"turn":1,"step":6,"callId":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":66,"time":0,"data":{"turn":1,"step":6,"message":{"source":{"kind":"tool","callId":"bash-exit"},"content":[{"type":"tool-result","toolCallId":"bash-exit","content":[{"type":"text","text":"exit\n[shell exited: code 9]\nThe persistent bash shell was reset; the next bash call starts from the workspace with a fresh current directory and environment."}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[65],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":67,"time":0,"data":{"turn":1,"step":6}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":68,"time":0,"data":{"turn":1,"step":7}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":69,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"block-start","index":0,"blockType":"text"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":70,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"text-delta","index":0,"text":"PERSISTENT_TOOLS_OK"}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":71,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"PERSISTENT_TOOLS_OK"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":72,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":73,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"finish","reason":{"kind":"stop"}}}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":74,"time":0,"data":{"turn":1,"step":7,"message":{"role":"assistant","content":[{"type":"text","text":"PERSISTENT_TOOLS_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[69,70,71,72,73],"surfaceOp":"append"}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":75,"time":0,"data":{"turn":1,"step":7}}}} -{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"turn/end","seq":76,"time":0,"data":{"turn":1,"reason":{"kind":"completed"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"session/title","seq":5,"time":0,"data":{"title":"Prove that bash state persists.","messageSeqs":[4],"source":{"kind":"fallback"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"request/header","seq":6,"time":0,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"{{system}}","tools":"{{tools}}"},"reason":"initial"}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"request/context","seq":7,"time":0,"data":{"provider":"deepseek-official","model":"deepseek-v4-flash"}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":8,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":9,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-1","name":"bash","argumentsDelta":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":10,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":11,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":12,"time":0,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":13,"time":0,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[8,9,10,11,12],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":14,"time":0,"data":{"turn":1,"step":1,"callId":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":15,"time":0,"data":{"turn":1,"step":1,"message":{"source":{"kind":"tool","callId":"bash-1"},"content":[{"type":"tool-result","toolCallId":"bash-1","content":[{"type":"text","text":"COUNT=1 CWD=/tmp"}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[14],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":16,"time":0,"data":{"turn":1,"step":1}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":17,"time":0,"data":{"turn":1,"step":2}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":18,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":19,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-2","name":"bash","argumentsDelta":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":20,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":21,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":22,"time":0,"data":{"turn":1,"step":2,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":23,"time":0,"data":{"turn":1,"step":2,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[18,19,20,21,22],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":24,"time":0,"data":{"turn":1,"step":2,"callId":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":25,"time":0,"data":{"turn":1,"step":2,"message":{"source":{"kind":"tool","callId":"bash-2"},"content":[{"type":"tool-result","toolCallId":"bash-2","content":[{"type":"text","text":"COUNT=2 CWD=/tmp"}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[24],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":26,"time":0,"data":{"turn":1,"step":2}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":27,"time":0,"data":{"turn":1,"step":3}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":28,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":29,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-create","name":"str_replace_editor","argumentsDelta":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":30,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":31,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":32,"time":0,"data":{"turn":1,"step":3,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":33,"time":0,"data":{"turn":1,"step":3,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[28,29,30,31,32],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":34,"time":0,"data":{"turn":1,"step":3,"callId":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":35,"time":0,"data":{"turn":1,"step":3,"message":{"source":{"kind":"tool","callId":"editor-create"},"content":[{"type":"tool-result","toolCallId":"editor-create","content":[{"type":"text","text":"New file created successfully at: {{cwd}}/note.txt"}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[34],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":36,"time":0,"data":{"turn":1,"step":3}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":37,"time":0,"data":{"turn":1,"step":4}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":38,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":39,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-view","name":"str_replace_editor","argumentsDelta":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":40,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":41,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":42,"time":0,"data":{"turn":1,"step":4,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":43,"time":0,"data":{"turn":1,"step":4,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[38,39,40,41,42],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":44,"time":0,"data":{"turn":1,"step":4,"callId":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":45,"time":0,"data":{"turn":1,"step":4,"message":{"source":{"kind":"tool","callId":"editor-view"},"content":[{"type":"tool-result","toolCallId":"editor-view","content":[{"type":"text","text":"Here's the content of {{cwd}}/note.txt with line numbers (which has a total of 3 lines):\n 1 target:\n 2 \told\n 3 \n"}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[44],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":46,"time":0,"data":{"turn":1,"step":4}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":47,"time":0,"data":{"turn":1,"step":5}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":48,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":49,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-replace","name":"str_replace_editor","argumentsDelta":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":50,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":51,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":52,"time":0,"data":{"turn":1,"step":5,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":53,"time":0,"data":{"turn":1,"step":5,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[48,49,50,51,52],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":54,"time":0,"data":{"turn":1,"step":5,"callId":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":55,"time":0,"data":{"turn":1,"step":5,"message":{"source":{"kind":"tool","callId":"editor-replace"},"content":[{"type":"tool-result","toolCallId":"editor-replace","content":[{"type":"text","text":"The file {{cwd}}/note.txt has been edited successfully."}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[54],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":56,"time":0,"data":{"turn":1,"step":5}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":57,"time":0,"data":{"turn":1,"step":6}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":58,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":59,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-exit","name":"bash","argumentsDelta":"{\"command\":\"exit 9\"}"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":60,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":61,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":62,"time":0,"data":{"turn":1,"step":6,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":63,"time":0,"data":{"turn":1,"step":6,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[58,59,60,61,62],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/call","seq":64,"time":0,"data":{"turn":1,"step":6,"callId":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"tool/result","seq":65,"time":0,"data":{"turn":1,"step":6,"message":{"source":{"kind":"tool","callId":"bash-exit"},"content":[{"type":"tool-result","toolCallId":"bash-exit","content":[{"type":"text","text":"exit\n[shell exited: code 9]\nThe persistent bash shell was reset; the next bash call starts from the workspace with a fresh current directory and environment."}],"isError":false}],"role":"user","id":"{{sessionId}}"}},"sourceEventSeqs":[64],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":66,"time":0,"data":{"turn":1,"step":6}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/start","seq":67,"time":0,"data":{"turn":1,"step":7}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":68,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"block-start","index":0,"blockType":"text"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":69,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"text-delta","index":0,"text":"PERSISTENT_TOOLS_OK"}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":70,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"PERSISTENT_TOOLS_OK"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":71,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/chunk","seq":72,"time":0,"data":{"turn":1,"step":7,"chunk":{"type":"finish","reason":{"kind":"stop"}}}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"assistant/message","seq":73,"time":0,"data":{"turn":1,"step":7,"message":{"role":"assistant","content":[{"type":"text","text":"PERSISTENT_TOOLS_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{sessionId}}"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[68,69,70,71,72],"surfaceOp":"append"}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"step/end","seq":74,"time":0,"data":{"turn":1,"step":7}}}} +{"method":"session.event","params":{"sessionId":"{{sessionId}}","event":{"type":"turn/end","seq":75,"time":0,"data":{"turn":1,"reason":{"kind":"completed"}}}}} {"method":"session.status","params":{"sessionId":"{{sessionId}}","status":"idle"}} diff --git a/examples/jsonrpc-agent/tests/snapshots/persistent-tools/session.jsonl b/examples/jsonrpc-agent/tests/snapshots/persistent-tools/session.jsonl index be559eeb9a..77fe6f03a6 100644 --- a/examples/jsonrpc-agent/tests/snapshots/persistent-tools/session.jsonl +++ b/examples/jsonrpc-agent/tests/snapshots/persistent-tools/session.jsonl @@ -4,75 +4,74 @@ {"type":"agent/inbox/spliced","seq":2,"time":1785821461907,"data":{"target":"next-turn","start":0,"removedCount":1,"inserted":[]}} {"type":"step/start","seq":3,"time":1785331618312,"data":{"turn":1,"step":1}} {"type":"user/message","seq":4,"time":1785498592368,"data":{"content":[{"type":"text","text":"Prove that bash state persists. Then create {{cwd}}/note.txt with a tab-indented line, view it, replace that literal tab-indented line, and make the persistent shell exit with code 9."}],"source":{"kind":"user"},"role":"user","id":"9a08e199-69d7-4b85-bfa4-27b41a92672a"},"surfaceOp":"append"} -{"type":"user/message","seq":5,"time":1785730508088,"data":{"content":[{"type":"text","text":"Current runtime context. This snapshot supersedes earlier runtime-context snapshots.\n\nCurrent DSH file policy: danger-full-access. The DSH file sandbox does not restrict file modifications by available operations."}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt","form":"snapshot","sections":[{"name":"sandbox:policy","text":"Current DSH file policy: danger-full-access. The DSH file sandbox does not restrict file modifications by available operations."}]},"role":"user","id":"bb38bdc2-276e-46ec-87a1-089732acbc8d"},"surfaceOp":"append"} -{"type":"session/title","seq":6,"time":1785730508088,"data":{"title":"Prove that bash state persists.","messageSeqs":[4],"source":{"kind":"fallback"}}} -{"type":"request/header","seq":7,"time":1785498592370,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"{{system}}","tools":"{{tools}}"},"reason":"initial"}} -{"type":"request/context","seq":8,"time":1785730508089,"data":{"provider":"deepseek-official","model":"deepseek-v4-flash"}} -{"type":"assistant/chunk","seq":9,"time":1785331618326,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} -{"type":"assistant/chunk","seq":10,"time":1785331618326,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-1","name":"bash","argumentsDelta":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}} -{"type":"assistant/chunk","seq":11,"time":1785331618326,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}} -{"type":"assistant/chunk","seq":12,"time":1785498592372,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} -{"type":"assistant/chunk","seq":13,"time":1785730508090,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":14,"time":1785730508090,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"0d064526-8eff-482d-8525-ac478e1d1791"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[9,10,11,12,13],"surfaceOp":"append"} -{"type":"tool/call","seq":15,"time":1785730508090,"data":{"turn":1,"step":1,"callId":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}} -{"type":"tool/result","seq":16,"time":1785730508425,"data":{"turn":1,"step":1,"message":{"source":{"kind":"tool","callId":"bash-1"},"content":[{"type":"tool-result","toolCallId":"bash-1","content":[{"type":"text","text":"COUNT=1 CWD=/tmp"}],"isError":false}],"role":"user","id":"2c01f81a-01ea-47e2-bf92-f7825b7cc69f"}},"sourceEventSeqs":[15],"surfaceOp":"append"} -{"type":"step/end","seq":17,"time":1785730508425,"data":{"turn":1,"step":1}} -{"type":"step/start","seq":18,"time":1785730508425,"data":{"turn":1,"step":2}} -{"type":"assistant/chunk","seq":19,"time":1785331618652,"data":{"turn":1,"step":2,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} -{"type":"assistant/chunk","seq":20,"time":1785331618652,"data":{"turn":1,"step":2,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-2","name":"bash","argumentsDelta":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}} -{"type":"assistant/chunk","seq":21,"time":1785331618652,"data":{"turn":1,"step":2,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}} -{"type":"assistant/chunk","seq":22,"time":1785498592702,"data":{"turn":1,"step":2,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} -{"type":"assistant/chunk","seq":23,"time":1785730508426,"data":{"turn":1,"step":2,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":24,"time":1785730508426,"data":{"turn":1,"step":2,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"ba4078ce-0e18-419a-b720-339918aecf26"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[19,20,21,22,23],"surfaceOp":"append"} -{"type":"tool/call","seq":25,"time":1785730508426,"data":{"turn":1,"step":2,"callId":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}} -{"type":"tool/result","seq":26,"time":1785730508537,"data":{"turn":1,"step":2,"message":{"source":{"kind":"tool","callId":"bash-2"},"content":[{"type":"tool-result","toolCallId":"bash-2","content":[{"type":"text","text":"COUNT=2 CWD=/tmp"}],"isError":false}],"role":"user","id":"6e3ad5e1-1149-44d5-bd20-d9cc0139c747"}},"sourceEventSeqs":[25],"surfaceOp":"append"} -{"type":"step/end","seq":27,"time":1785730508537,"data":{"turn":1,"step":2}} -{"type":"step/start","seq":28,"time":1785730508537,"data":{"turn":1,"step":3}} -{"type":"assistant/chunk","seq":29,"time":1785331618762,"data":{"turn":1,"step":3,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} -{"type":"assistant/chunk","seq":30,"time":1785331618762,"data":{"turn":1,"step":3,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-create","name":"str_replace_editor","argumentsDelta":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}} -{"type":"assistant/chunk","seq":31,"time":1785331618762,"data":{"turn":1,"step":3,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}}} -{"type":"assistant/chunk","seq":32,"time":1785498592812,"data":{"turn":1,"step":3,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} -{"type":"assistant/chunk","seq":33,"time":1785730508538,"data":{"turn":1,"step":3,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":34,"time":1785730508538,"data":{"turn":1,"step":3,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"e5769b2d-ea91-42fe-a78f-2f7f408f545e"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[29,30,31,32,33],"surfaceOp":"append"} -{"type":"tool/call","seq":35,"time":1785730508538,"data":{"turn":1,"step":3,"callId":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}} -{"type":"tool/result","seq":36,"time":1785730508551,"data":{"turn":1,"step":3,"message":{"source":{"kind":"tool","callId":"editor-create"},"content":[{"type":"tool-result","toolCallId":"editor-create","content":[{"type":"text","text":"New file created successfully at: {{cwd}}/note.txt"}],"isError":false}],"role":"user","id":"af41060c-7007-4ada-89d6-8b15a0e8be7c"}},"sourceEventSeqs":[35],"surfaceOp":"append"} -{"type":"step/end","seq":37,"time":1785730508551,"data":{"turn":1,"step":3}} -{"type":"step/start","seq":38,"time":1785730508552,"data":{"turn":1,"step":4}} -{"type":"assistant/chunk","seq":39,"time":1785331618784,"data":{"turn":1,"step":4,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} -{"type":"assistant/chunk","seq":40,"time":1785331618784,"data":{"turn":1,"step":4,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-view","name":"str_replace_editor","argumentsDelta":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}} -{"type":"assistant/chunk","seq":41,"time":1785331618784,"data":{"turn":1,"step":4,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}}} -{"type":"assistant/chunk","seq":42,"time":1785498592825,"data":{"turn":1,"step":4,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} -{"type":"assistant/chunk","seq":43,"time":1785730508552,"data":{"turn":1,"step":4,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":44,"time":1785730508552,"data":{"turn":1,"step":4,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"0e9afabb-10a6-444c-ae22-fcdbb5e14695"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[39,40,41,42,43],"surfaceOp":"append"} -{"type":"tool/call","seq":45,"time":1785730508553,"data":{"turn":1,"step":4,"callId":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}} -{"type":"tool/result","seq":46,"time":1785730508554,"data":{"turn":1,"step":4,"message":{"source":{"kind":"tool","callId":"editor-view"},"content":[{"type":"tool-result","toolCallId":"editor-view","content":[{"type":"text","text":"Here's the content of {{cwd}}/note.txt with line numbers (which has a total of 3 lines):\n 1 target:\n 2 \told\n 3 \n"}],"isError":false}],"role":"user","id":"a4472b37-6311-4880-bce2-cc369f9bc34b"}},"sourceEventSeqs":[45],"surfaceOp":"append"} -{"type":"step/end","seq":47,"time":1785730508554,"data":{"turn":1,"step":4}} -{"type":"step/start","seq":48,"time":1785730508554,"data":{"turn":1,"step":5}} -{"type":"assistant/chunk","seq":49,"time":1785331618801,"data":{"turn":1,"step":5,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} -{"type":"assistant/chunk","seq":50,"time":1785331618801,"data":{"turn":1,"step":5,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-replace","name":"str_replace_editor","argumentsDelta":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}} -{"type":"assistant/chunk","seq":51,"time":1785331618801,"data":{"turn":1,"step":5,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}}} -{"type":"assistant/chunk","seq":52,"time":1785498592826,"data":{"turn":1,"step":5,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} -{"type":"assistant/chunk","seq":53,"time":1785730508555,"data":{"turn":1,"step":5,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":54,"time":1785730508555,"data":{"turn":1,"step":5,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"ba189070-d46e-461e-969b-9bca032bb154"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[49,50,51,52,53],"surfaceOp":"append"} -{"type":"tool/call","seq":55,"time":1785730508555,"data":{"turn":1,"step":5,"callId":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}} -{"type":"tool/result","seq":56,"time":1785730508564,"data":{"turn":1,"step":5,"message":{"source":{"kind":"tool","callId":"editor-replace"},"content":[{"type":"tool-result","toolCallId":"editor-replace","content":[{"type":"text","text":"The file {{cwd}}/note.txt has been edited successfully."}],"isError":false}],"role":"user","id":"17331db9-174b-4699-9c9e-3140921956c4"}},"sourceEventSeqs":[55],"surfaceOp":"append"} -{"type":"step/end","seq":57,"time":1785730508564,"data":{"turn":1,"step":5}} -{"type":"step/start","seq":58,"time":1785730508565,"data":{"turn":1,"step":6}} -{"type":"assistant/chunk","seq":59,"time":1785331618804,"data":{"turn":1,"step":6,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} -{"type":"assistant/chunk","seq":60,"time":1785331618804,"data":{"turn":1,"step":6,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-exit","name":"bash","argumentsDelta":"{\"command\":\"exit 9\"}"}}} -{"type":"assistant/chunk","seq":61,"time":1785331618804,"data":{"turn":1,"step":6,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}}}} -{"type":"assistant/chunk","seq":62,"time":1785498592838,"data":{"turn":1,"step":6,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} -{"type":"assistant/chunk","seq":63,"time":1785730508565,"data":{"turn":1,"step":6,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} -{"type":"assistant/message","seq":64,"time":1785730508565,"data":{"turn":1,"step":6,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"7fa07d0f-e70a-460d-b685-bf8a63b6a8a0"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[59,60,61,62,63],"surfaceOp":"append"} -{"type":"tool/call","seq":65,"time":1785730508565,"data":{"turn":1,"step":6,"callId":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}} -{"type":"tool/result","seq":66,"time":1785730508641,"data":{"turn":1,"step":6,"message":{"source":{"kind":"tool","callId":"bash-exit"},"content":[{"type":"tool-result","toolCallId":"bash-exit","content":[{"type":"text","text":"exit\n[shell exited: code 9]\nThe persistent bash shell was reset; the next bash call starts from the workspace with a fresh current directory and environment."}],"isError":false}],"role":"user","id":"ccb91a28-4034-49bf-967d-450f68f7f9b8"}},"sourceEventSeqs":[65],"surfaceOp":"append"} -{"type":"step/end","seq":67,"time":1785730508641,"data":{"turn":1,"step":6}} -{"type":"step/start","seq":68,"time":1785730508642,"data":{"turn":1,"step":7}} -{"type":"assistant/chunk","seq":69,"time":1785331618807,"data":{"turn":1,"step":7,"chunk":{"type":"block-start","index":0,"blockType":"text"}}} -{"type":"assistant/chunk","seq":70,"time":1785331618807,"data":{"turn":1,"step":7,"chunk":{"type":"text-delta","index":0,"text":"PERSISTENT_TOOLS_OK"}}} -{"type":"assistant/chunk","seq":71,"time":1785331618807,"data":{"turn":1,"step":7,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"PERSISTENT_TOOLS_OK"}}}} -{"type":"assistant/chunk","seq":72,"time":1785498592934,"data":{"turn":1,"step":7,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} -{"type":"assistant/chunk","seq":73,"time":1785730508642,"data":{"turn":1,"step":7,"chunk":{"type":"finish","reason":{"kind":"stop"}}}} -{"type":"assistant/message","seq":74,"time":1785730508642,"data":{"turn":1,"step":7,"message":{"role":"assistant","content":[{"type":"text","text":"PERSISTENT_TOOLS_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"43efc58a-46a1-4813-995f-1dc489438942"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[69,70,71,72,73],"surfaceOp":"append"} -{"type":"step/end","seq":75,"time":1785730508642,"data":{"turn":1,"step":7}} -{"type":"turn/end","seq":76,"time":1785730508642,"data":{"turn":1,"reason":{"kind":"completed"}}} +{"type":"session/title","seq":5,"time":1785498592368,"data":{"title":"Prove that bash state persists.","messageSeqs":[4],"source":{"kind":"fallback"}}} +{"type":"request/header","seq":6,"time":1786547087174,"data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"system":"{{system}}","tools":"{{tools}}"},"reason":"initial"}} +{"type":"request/context","seq":7,"time":1786547087175,"data":{"provider":"deepseek-official","model":"deepseek-v4-flash"}} +{"type":"assistant/chunk","seq":8,"time":1786547087175,"data":{"turn":1,"step":1,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} +{"type":"assistant/chunk","seq":9,"time":1786547087175,"data":{"turn":1,"step":1,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-1","name":"bash","argumentsDelta":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}} +{"type":"assistant/chunk","seq":10,"time":1785331618326,"data":{"turn":1,"step":1,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}} +{"type":"assistant/chunk","seq":11,"time":1785331618326,"data":{"turn":1,"step":1,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} +{"type":"assistant/chunk","seq":12,"time":1785331618326,"data":{"turn":1,"step":1,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} +{"type":"assistant/message","seq":13,"time":1786547087175,"data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"0d064526-8eff-482d-8525-ac478e1d1791"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[8,9,10,11,12],"surfaceOp":"append"} +{"type":"tool/call","seq":14,"time":1786547087176,"data":{"turn":1,"step":1,"callId":"bash-1","name":"bash","arguments":"{\"command\":\"cd /tmp && export DSH_EXAMPLE_COUNT=1 && printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}} +{"type":"tool/result","seq":15,"time":1786547094340,"data":{"turn":1,"step":1,"message":{"source":{"kind":"tool","callId":"bash-1"},"content":[{"type":"tool-result","toolCallId":"bash-1","content":[{"type":"text","text":"COUNT=1 CWD=/tmp"}],"isError":false}],"role":"user","id":"2c01f81a-01ea-47e2-bf92-f7825b7cc69f"}},"sourceEventSeqs":[14],"surfaceOp":"append"} +{"type":"step/end","seq":16,"time":1786547094340,"data":{"turn":1,"step":1}} +{"type":"step/start","seq":17,"time":1786547094341,"data":{"turn":1,"step":2}} +{"type":"assistant/chunk","seq":18,"time":1786547094341,"data":{"turn":1,"step":2,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} +{"type":"assistant/chunk","seq":19,"time":1786547094341,"data":{"turn":1,"step":2,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-2","name":"bash","argumentsDelta":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}} +{"type":"assistant/chunk","seq":20,"time":1785331618652,"data":{"turn":1,"step":2,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}}}} +{"type":"assistant/chunk","seq":21,"time":1785331618652,"data":{"turn":1,"step":2,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} +{"type":"assistant/chunk","seq":22,"time":1785331618652,"data":{"turn":1,"step":2,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} +{"type":"assistant/message","seq":23,"time":1786547094341,"data":{"turn":1,"step":2,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"ba4078ce-0e18-419a-b720-339918aecf26"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[18,19,20,21,22],"surfaceOp":"append"} +{"type":"tool/call","seq":24,"time":1786547094341,"data":{"turn":1,"step":2,"callId":"bash-2","name":"bash","arguments":"{\"command\":\"DSH_EXAMPLE_COUNT=$((DSH_EXAMPLE_COUNT + 1)); printf \\\"COUNT=%s CWD=%s\\\\n\\\" \\\"$DSH_EXAMPLE_COUNT\\\" \\\"$PWD\\\"\"}"}} +{"type":"tool/result","seq":25,"time":1786547097878,"data":{"turn":1,"step":2,"message":{"source":{"kind":"tool","callId":"bash-2"},"content":[{"type":"tool-result","toolCallId":"bash-2","content":[{"type":"text","text":"COUNT=2 CWD=/tmp"}],"isError":false}],"role":"user","id":"6e3ad5e1-1149-44d5-bd20-d9cc0139c747"}},"sourceEventSeqs":[24],"surfaceOp":"append"} +{"type":"step/end","seq":26,"time":1786547097878,"data":{"turn":1,"step":2}} +{"type":"step/start","seq":27,"time":1786547097878,"data":{"turn":1,"step":3}} +{"type":"assistant/chunk","seq":28,"time":1786547097878,"data":{"turn":1,"step":3,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} +{"type":"assistant/chunk","seq":29,"time":1786547097878,"data":{"turn":1,"step":3,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-create","name":"str_replace_editor","argumentsDelta":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}} +{"type":"assistant/chunk","seq":30,"time":1785331618762,"data":{"turn":1,"step":3,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}}}} +{"type":"assistant/chunk","seq":31,"time":1785331618762,"data":{"turn":1,"step":3,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} +{"type":"assistant/chunk","seq":32,"time":1785331618762,"data":{"turn":1,"step":3,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} +{"type":"assistant/message","seq":33,"time":1786547097878,"data":{"turn":1,"step":3,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"e5769b2d-ea91-42fe-a78f-2f7f408f545e"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[28,29,30,31,32],"surfaceOp":"append"} +{"type":"tool/call","seq":34,"time":1786547097879,"data":{"turn":1,"step":3,"callId":"editor-create","name":"str_replace_editor","arguments":"{\"command\":\"create\",\"path\":\"{{cwd}}/note.txt\",\"file_text\":\"target:\\n\\told\\n\"}"}} +{"type":"tool/result","seq":35,"time":1786547097885,"data":{"turn":1,"step":3,"message":{"source":{"kind":"tool","callId":"editor-create"},"content":[{"type":"tool-result","toolCallId":"editor-create","content":[{"type":"text","text":"New file created successfully at: {{cwd}}/note.txt"}],"isError":false}],"role":"user","id":"af41060c-7007-4ada-89d6-8b15a0e8be7c"}},"sourceEventSeqs":[34],"surfaceOp":"append"} +{"type":"step/end","seq":36,"time":1786547097885,"data":{"turn":1,"step":3}} +{"type":"step/start","seq":37,"time":1786547097885,"data":{"turn":1,"step":4}} +{"type":"assistant/chunk","seq":38,"time":1786547097886,"data":{"turn":1,"step":4,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} +{"type":"assistant/chunk","seq":39,"time":1786547097886,"data":{"turn":1,"step":4,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-view","name":"str_replace_editor","argumentsDelta":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}} +{"type":"assistant/chunk","seq":40,"time":1785331618784,"data":{"turn":1,"step":4,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}}}} +{"type":"assistant/chunk","seq":41,"time":1785331618784,"data":{"turn":1,"step":4,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} +{"type":"assistant/chunk","seq":42,"time":1785331618784,"data":{"turn":1,"step":4,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} +{"type":"assistant/message","seq":43,"time":1786547097886,"data":{"turn":1,"step":4,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"0e9afabb-10a6-444c-ae22-fcdbb5e14695"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[38,39,40,41,42],"surfaceOp":"append"} +{"type":"tool/call","seq":44,"time":1786547097886,"data":{"turn":1,"step":4,"callId":"editor-view","name":"str_replace_editor","arguments":"{\"command\":\"view\",\"path\":\"{{cwd}}/note.txt\"}"}} +{"type":"tool/result","seq":45,"time":1786547097887,"data":{"turn":1,"step":4,"message":{"source":{"kind":"tool","callId":"editor-view"},"content":[{"type":"tool-result","toolCallId":"editor-view","content":[{"type":"text","text":"Here's the content of {{cwd}}/note.txt with line numbers (which has a total of 3 lines):\n 1 target:\n 2 \told\n 3 \n"}],"isError":false}],"role":"user","id":"a4472b37-6311-4880-bce2-cc369f9bc34b"}},"sourceEventSeqs":[44],"surfaceOp":"append"} +{"type":"step/end","seq":46,"time":1786547097887,"data":{"turn":1,"step":4}} +{"type":"step/start","seq":47,"time":1786547097887,"data":{"turn":1,"step":5}} +{"type":"assistant/chunk","seq":48,"time":1786547097887,"data":{"turn":1,"step":5,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} +{"type":"assistant/chunk","seq":49,"time":1786547097887,"data":{"turn":1,"step":5,"chunk":{"type":"tool-call-delta","index":0,"id":"editor-replace","name":"str_replace_editor","argumentsDelta":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}} +{"type":"assistant/chunk","seq":50,"time":1785331618801,"data":{"turn":1,"step":5,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}}}} +{"type":"assistant/chunk","seq":51,"time":1785331618801,"data":{"turn":1,"step":5,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} +{"type":"assistant/chunk","seq":52,"time":1785331618801,"data":{"turn":1,"step":5,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} +{"type":"assistant/message","seq":53,"time":1786547097887,"data":{"turn":1,"step":5,"message":{"role":"assistant","content":[{"type":"tool-call","id":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"ba189070-d46e-461e-969b-9bca032bb154"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[48,49,50,51,52],"surfaceOp":"append"} +{"type":"tool/call","seq":54,"time":1786547097887,"data":{"turn":1,"step":5,"callId":"editor-replace","name":"str_replace_editor","arguments":"{\"command\":\"str_replace\",\"path\":\"{{cwd}}/note.txt\",\"old_str\":\"\\told\",\"new_str\":\"\\tnew\"}"}} +{"type":"tool/result","seq":55,"time":1786547097892,"data":{"turn":1,"step":5,"message":{"source":{"kind":"tool","callId":"editor-replace"},"content":[{"type":"tool-result","toolCallId":"editor-replace","content":[{"type":"text","text":"The file {{cwd}}/note.txt has been edited successfully."}],"isError":false}],"role":"user","id":"17331db9-174b-4699-9c9e-3140921956c4"}},"sourceEventSeqs":[54],"surfaceOp":"append"} +{"type":"step/end","seq":56,"time":1786547097892,"data":{"turn":1,"step":5}} +{"type":"step/start","seq":57,"time":1786547097892,"data":{"turn":1,"step":6}} +{"type":"assistant/chunk","seq":58,"time":1786547097893,"data":{"turn":1,"step":6,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}}} +{"type":"assistant/chunk","seq":59,"time":1786547097893,"data":{"turn":1,"step":6,"chunk":{"type":"tool-call-delta","index":0,"id":"bash-exit","name":"bash","argumentsDelta":"{\"command\":\"exit 9\"}"}}} +{"type":"assistant/chunk","seq":60,"time":1785331618804,"data":{"turn":1,"step":6,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}}}} +{"type":"assistant/chunk","seq":61,"time":1785331618804,"data":{"turn":1,"step":6,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} +{"type":"assistant/chunk","seq":62,"time":1785331618804,"data":{"turn":1,"step":6,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}} +{"type":"assistant/message","seq":63,"time":1786547097893,"data":{"turn":1,"step":6,"message":{"role":"assistant","content":[{"type":"tool-call","id":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"7fa07d0f-e70a-460d-b685-bf8a63b6a8a0"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[58,59,60,61,62],"surfaceOp":"append"} +{"type":"tool/call","seq":64,"time":1786547097893,"data":{"turn":1,"step":6,"callId":"bash-exit","name":"bash","arguments":"{\"command\":\"exit 9\"}"}} +{"type":"tool/result","seq":65,"time":1786547098003,"data":{"turn":1,"step":6,"message":{"source":{"kind":"tool","callId":"bash-exit"},"content":[{"type":"tool-result","toolCallId":"bash-exit","content":[{"type":"text","text":"exit\n[shell exited: code 9]\nThe persistent bash shell was reset; the next bash call starts from the workspace with a fresh current directory and environment."}],"isError":false}],"role":"user","id":"ccb91a28-4034-49bf-967d-450f68f7f9b8"}},"sourceEventSeqs":[64],"surfaceOp":"append"} +{"type":"step/end","seq":66,"time":1786547098003,"data":{"turn":1,"step":6}} +{"type":"step/start","seq":67,"time":1786547098003,"data":{"turn":1,"step":7}} +{"type":"assistant/chunk","seq":68,"time":1786547098003,"data":{"turn":1,"step":7,"chunk":{"type":"block-start","index":0,"blockType":"text"}}} +{"type":"assistant/chunk","seq":69,"time":1786547098003,"data":{"turn":1,"step":7,"chunk":{"type":"text-delta","index":0,"text":"PERSISTENT_TOOLS_OK"}}} +{"type":"assistant/chunk","seq":70,"time":1785331618807,"data":{"turn":1,"step":7,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"PERSISTENT_TOOLS_OK"}}}} +{"type":"assistant/chunk","seq":71,"time":1785331618807,"data":{"turn":1,"step":7,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3}}}} +{"type":"assistant/chunk","seq":72,"time":1785331618807,"data":{"turn":1,"step":7,"chunk":{"type":"finish","reason":{"kind":"stop"}}}} +{"type":"assistant/message","seq":73,"time":1786547098003,"data":{"turn":1,"step":7,"message":{"role":"assistant","content":[{"type":"text","text":"PERSISTENT_TOOLS_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"43efc58a-46a1-4813-995f-1dc489438942"},"usage":{"inputTokens":3,"outputTokens":3}},"sourceEventSeqs":[68,69,70,71,72],"surfaceOp":"append"} +{"type":"step/end","seq":74,"time":1786547098003,"data":{"turn":1,"step":7}} +{"type":"turn/end","seq":75,"time":1786547098004,"data":{"turn":1,"reason":{"kind":"completed"}}} diff --git a/knip.json b/knip.json index e06fa48220..3017292382 100644 --- a/knip.json +++ b/knip.json @@ -9,6 +9,7 @@ "musl-gcc", "python3", "sandbox-exec", + "tar", "taskkill", "where.exe" ], diff --git a/native/landlock-run/package.json b/native/landlock-run/package.json index 0fb9b3ddfb..be0ca9732d 100644 --- a/native/landlock-run/package.json +++ b/native/landlock-run/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/node-addon-landlock-run-workspace", - "version": "0.0.1", + "version": "0.1.1", "private": true, "type": "module", "license": "BSD-3-Clause", @@ -19,6 +19,7 @@ "release:assemble-prebuilds": "node ./scripts/assemble-prebuilds.mjs", "release:verify": "node ./scripts/verify-release.mjs", "release:pack": "node ./scripts/pack-release.mjs", + "release:publish": "node ./scripts/publish-release.mjs", "release:verify-packed-install": "node ./scripts/verify-packed-install.mjs" }, "devDependencies": { diff --git a/native/landlock-run/packages/entry/package.json b/native/landlock-run/packages/entry/package.json index b3384a58c0..5e34cf96f0 100644 --- a/native/landlock-run/packages/entry/package.json +++ b/native/landlock-run/packages/entry/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/node-addon-landlock-run", - "version": "0.0.1", + "version": "0.1.1", "type": "module", "description": "Landlock self-restrict-then-exec launcher for sandboxing subprocesses on Linux: per-platform prebuilt static binaries plus the JS seam that resolves, probes, and speaks their CLI contract", "repository": { @@ -32,7 +32,7 @@ }, "license": "BSD-3-Clause", "publishConfig": { - "access": "restricted" + "access": "public" }, "optionalDependencies": { "@deepseek-ai/node-addon-landlock-run-linux-arm64": "workspace:*", diff --git a/native/landlock-run/packages/linux-arm64/package.json b/native/landlock-run/packages/linux-arm64/package.json index 11d9384c87..8e6affec6a 100644 --- a/native/landlock-run/packages/linux-arm64/package.json +++ b/native/landlock-run/packages/linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/node-addon-landlock-run-linux-arm64", - "version": "0.0.1", + "version": "0.1.1", "description": "Prebuilt landlock-run Landlock launcher binary for linux-arm64 (static musl) — resolved as a file path by @deepseek-ai/node-addon-landlock-run, never imported", "repository": { "type": "git", @@ -26,6 +26,6 @@ }, "license": "BSD-3-Clause", "publishConfig": { - "access": "restricted" + "access": "public" } } diff --git a/native/landlock-run/packages/linux-x64/package.json b/native/landlock-run/packages/linux-x64/package.json index 6e3ad395e6..7e9cab7a1a 100644 --- a/native/landlock-run/packages/linux-x64/package.json +++ b/native/landlock-run/packages/linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@deepseek-ai/node-addon-landlock-run-linux-x64", - "version": "0.0.1", + "version": "0.1.1", "description": "Prebuilt landlock-run Landlock launcher binary for linux-x64 (static musl) — resolved as a file path by @deepseek-ai/node-addon-landlock-run, never imported", "repository": { "type": "git", @@ -26,6 +26,6 @@ }, "license": "BSD-3-Clause", "publishConfig": { - "access": "restricted" + "access": "public" } } diff --git a/native/landlock-run/scripts/publish-release.mjs b/native/landlock-run/scripts/publish-release.mjs new file mode 100644 index 0000000000..76c875b8d3 --- /dev/null +++ b/native/landlock-run/scripts/publish-release.mjs @@ -0,0 +1,165 @@ +#!/usr/bin/env node +/** + * Publish the packed launcher family from the tarballs `pack-release.mjs` + * produced, in `publish-order.txt` order. + * + * What goes out is decided per package against the registry, never from the + * order file alone: a version the registry lacks is published, a version whose + * published tarball has the same integrity is skipped, and a version whose + * published tarball differs fails the run — that last case means the content + * changed without a version bump. Skipping on identical integrity is what makes + * re-running the publish step over the same artifact safe, which matters here + * because a partial publication used to leave no way forward: republishing an + * existing version fails permanently. + * + * Usage: `node scripts/publish-release.mjs [packed dir]`. + */ + +import fs from 'node:fs'; +import path from 'node:path'; +import crypto from 'node:crypto'; +import { spawnSync } from 'node:child_process'; +import { setTimeout as sleep } from 'node:timers/promises'; +import { root } from './repo.mjs'; + +/** + * Registry codes that answer a write which did not settle, rather than a + * rejection of what was sent. `E409 Failed to save packument` is the one this + * sequence actually hits: publishing the platform packages and the entry back + * to back can outrun the registry's own processing. A rejected payload (`E403` + * over an existing version, a malformed manifest) never clears on a retry. + */ +const TRANSIENT_PUBLISH_CODES = ['E409', 'E429', 'E500', 'E502', 'E503', 'E504', 'ETIMEDOUT', 'ECONNRESET', 'EAI_AGAIN']; + +/** How many times one tarball's publish is attempted before the run fails. */ +const PUBLISH_ATTEMPTS = 4; + +/** + * Shortest gap between two publishes, and the first retry backoff. The registry + * needs a moment to commit a packument before the next write; back to back + * publishes are what produce `E409`. + */ +const PUBLISH_SPACING_MS = 2_000; + +const destination = path.resolve(process.argv.slice(2).find((arg) => !arg.startsWith('--')) || path.join(root, 'dist', 'npm')); + +/** + * @param {string} output Combined npm output. + * @returns {boolean} True when the registry reported a write it did not commit. + */ +function isTransientFailure(output) { + return TRANSIENT_PUBLISH_CODES.some((code) => output.includes(`code ${code}`)); +} + +/** + * @param {string} tarball Absolute tarball path. + * @returns {string} The `sha512-` integrity npm records for it. + */ +function integrityOf(tarball) { + return `sha512-${crypto.createHash('sha512').update(fs.readFileSync(tarball)).digest('base64')}`; +} + +/** + * @param {string} tarball Absolute tarball path. + * @returns {{name: string, version: string}} What the packed manifest declares. + */ +function packedIdentity(tarball) { + const result = spawnSync('tar', ['-xOzf', tarball, 'package/package.json'], { encoding: 'utf8' }); + if (result.status !== 0) throw new Error(`cannot read the manifest inside ${tarball}:\n${result.stderr}`); + const manifest = JSON.parse(result.stdout); + if (typeof manifest.name !== 'string' || typeof manifest.version !== 'string') { + throw new Error(`${tarball} manifest lacks name/version`); + } + return { name: manifest.name, version: manifest.version }; +} + +/** + * Ask the registry whether a version exists, and with what integrity. + * @param {string} name Package name. + * @param {string} version Package version. + * @returns {{kind: 'absent'} | {kind: 'present', integrity: string}} Registry state. + */ +function registryState(name, version) { + const result = spawnSync('npm', ['view', `${name}@${version}`, 'dist.integrity', '--json'], { encoding: 'utf8' }); + if (result.status !== 0) { + const output = `${result.stdout}${result.stderr}`; + if (output.includes('E404') || output.includes('404 Not Found')) return { kind: 'absent' }; + throw new Error(`npm view ${name}@${version} failed:\n${output}`); + } + const parsed = JSON.parse(result.stdout); + if (typeof parsed !== 'string' || parsed === '') { + throw new Error(`registry reported no dist.integrity for ${name}@${version}`); + } + return { kind: 'present', integrity: parsed }; +} + +/** + * Publish one tarball, retrying a registry write that did not settle. + * + * Every retry re-reads the registry first, because `E409` can answer a write + * that landed anyway: republishing a version that now exists fails permanently, + * so the same integrity appearing under the failed attempt counts as success. + * @param {string} tarball Absolute tarball path. + * @param {string} name Package name the tarball declares. + * @param {string} version Package version the tarball declares. + */ +async function publishTarball(tarball, name, version) { + // A prerelease version never takes the latest dist-tag. + const tagArgs = version.includes('-') ? ['--tag', 'next'] : []; + for (let tries = 1; tries <= PUBLISH_ATTEMPTS; tries += 1) { + // No --access: publishConfig.access in each manifest decides, and a + // command-line flag would override it. + const result = spawnSync('npm', ['publish', tarball, ...tagArgs], { encoding: 'utf8' }); + const output = `${result.stdout}${result.stderr}`; + if (result.status === 0) return; + + const settled = registryState(name, version); + if (settled.kind === 'present' && settled.integrity === integrityOf(tarball)) { + console.log(`landlock publish: ${name}@${version} landed despite a reported failure, continuing`); + return; + } + if (tries === PUBLISH_ATTEMPTS || !isTransientFailure(output)) { + throw new Error(`npm publish ${name}@${version} failed:\n${output}`); + } + const backoff = PUBLISH_SPACING_MS * 2 ** (tries - 1); + console.log( + `landlock publish: ${name}@${version} hit a transient registry failure` + + ` (attempt ${tries} of ${PUBLISH_ATTEMPTS}), retrying in ${backoff}ms`, + ); + await sleep(backoff); + } +} + +const order = fs + .readFileSync(path.join(destination, 'publish-order.txt'), 'utf8') + .split('\n') + .filter((line) => line !== ''); + +let published = 0; +let skipped = 0; +for (const filename of order) { + const tarball = path.join(destination, filename); + const { name, version } = packedIdentity(tarball); + const state = registryState(name, version); + if (state.kind === 'present') { + const local = integrityOf(tarball); + if (state.integrity !== local) { + throw new Error( + `${name}@${version} is already published with different content` + + `\n registry: ${state.integrity}\n packed: ${local}` + + '\nBump the version, or investigate why the build is not reproducible.', + ); + } + console.log(`landlock publish: ${name}@${version} already published, skipping`); + skipped += 1; + continue; + } + // Space out the writes: the gap belongs between publishes, so a run that only + // skips does not wait at all. + if (published > 0) await sleep(PUBLISH_SPACING_MS); + await publishTarball(tarball, name, version); + console.log(`landlock publish: ${name}@${version} published`); + published += 1; +} + +console.log(`landlock publish: ${published} published, ${skipped} already present`); diff --git a/package.json b/package.json index edfec2bae8..517d0c56d1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "@deepseek-ai/dsh-root", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", + "license": "MIT", "private": true, "type": "module", "packageManager": "pnpm@11.7.0", @@ -65,9 +66,11 @@ "doc-typecheck:contracts-ready": "tsx scripts/doc-typecheck.ts", "verify-md-wrap": "tsx scripts/verify-md-wrap.ts", "verify-md-links": "tsx scripts/verify-md-links.ts", + "verify-doc-site-fragments": "tsx scripts/verify-doc-site-fragments.ts", "verify-public-repository-links": "tsx scripts/verify-public-repository-links.ts", "verify-doc-refs": "tsx scripts/verify-doc-refs.ts", "verify-package-paths": "tsx scripts/verify-package-paths.ts", + "verify-dsh-package-licenses": "tsx scripts/verify-dsh-package-licenses.ts", "verify-config-source-ownership": "tsx scripts/verify-config-source-ownership.ts", "verify-package-invariants": "tsx scripts/verify-package-invariants.ts", "verify-built-package-invariants": "node scripts/verify-built-package-invariants.mjs", @@ -84,14 +87,15 @@ "gen-translation-brief": "tsx scripts/gen-translation-brief.ts", "verify-doc-budgets": "tsx scripts/verify-doc-budgets.ts", "docs:dev": "pnpm --filter @deepseek-ai/website run dev", - "docs:build": "pnpm --filter @deepseek-ai/website run build", - "docs:build:mpa": "pnpm --filter @deepseek-ai/website exec vitepress build . --mpa", + "docs:build": "pnpm --filter @deepseek-ai/website run build && pnpm run verify-doc-site-fragments", + "docs:build:mpa": "pnpm --filter @deepseek-ai/website exec vitepress build . --mpa && pnpm run verify-doc-site-fragments", "docs:preview": "pnpm --filter @deepseek-ai/website run preview", - "docs:check": "pnpm exec vitest run scripts/project-doc-site.spec.ts && pnpm run docs:build", + "docs:check": "pnpm exec vitest run scripts/project-doc-site.spec.ts scripts/verify-doc-site-fragments.spec.ts && pnpm run docs:build", "website:dev": "pnpm run docs:dev", "website:build": "pnpm run docs:build", "verify-package-readme-limitations": "tsx scripts/verify-package-readme-limitations.ts", "verify-node-next-types": "tsx scripts/verify-node-next-types.ts", + "verify-optional-dependency-imports": "tsx scripts/verify-optional-dependency-imports.ts", "verify-runtime-closure": "tsx scripts/verify-runtime-closure.ts", "verify-vendored-links": "tsx scripts/verify-vendored-links.ts", "verify-cordis-config": "tsx scripts/verify-cordis-config.ts", @@ -122,7 +126,7 @@ "verify-module-graph": "tsx scripts/gen-module-graph.ts --check", "constraints": "tsx scripts/check-workspace-constraints.ts", "doc-sync": "tsx scripts/run-gates.ts doc-sync", - "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-runtime-closure && pnpm run verify-vendored-links", + "hygiene": "pnpm run rescope-vendor:check && pnpm run knip && pnpm run publint && pnpm run constraints && pnpm run verify-dsh-package-licenses && pnpm run verify-package-invariants && pnpm run verify-built-package-invariants && pnpm run verify-cordis-config && pnpm run verify-node-next-types && pnpm run verify-optional-dependency-imports && pnpm run verify-runtime-closure && pnpm run verify-vendored-links", "publish:npm-baseline": "tsx scripts/publish-npm-baseline.ts", "release:dsh": "tsx scripts/release/bump.ts --family dsh", "release:vendor": "tsx scripts/release/bump.ts --family vendor", diff --git a/packages/README.i18n.yaml b/packages/README.i18n.yaml index 856b455103..cdc5428234 100644 --- a/packages/README.i18n.yaml +++ b/packages/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/README.md -README.md: 2e28b190378ed8ca25102d6311bd8a2c8d5e1c58 -README.zh.md: e0e1973d146c241d4846c4c237ed0e5f6a0d7b8a +README.md: 7904ec1fea8dbab361fcd90b2b32f1c743ce5537 +README.zh.md: c39b65dad7e9c277779a85d7327982597628e007 diff --git a/packages/README.md b/packages/README.md index 2e28b19037..7904ec1fea 100644 --- a/packages/README.md +++ b/packages/README.md @@ -64,6 +64,6 @@ New packages join existing groups; new groups update their README and this table The dependency graph is generated: [docs/module-graph.md](../docs/module-graph.md) (`pnpm run gen-module-graph`, freshness-gated in CI). -**Extension plugins depend on Service Definitions, never concrete providers.** `dsh-agent-loop` is swappable; UI, hook, and tool plugins use `dsh-agent`. Composition bundles, including `dsh-agent-spine-demo`, may depend on spine plugins. Capabilities separate Service Definition / Service provider / Consumer roles when they evolve independently; see [capability seams](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md). +**Extension plugins depend on Service Definitions, never concrete providers.** `dsh-agent-loop` is swappable; UI, hook, and tool plugins use `dsh-agent`. Composition bundles, including `dsh-agent-spine-demo`, may depend on spine plugins. Capabilities separate Service Definition / Service Provider / Consumer roles when they evolve independently; see [capability seams](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md). Package READMEs cover purpose, APIs, extension points, and [Model Experience](../docs/cookbook/adding-a-package.md#4-write-the-package-readme) unless on the model-agnostic [omission allowlist](../scripts/verify-package-readme-model-experience.ts). They also carry `## Known Limitations and Deferred Work` or use its [allowlist](../scripts/verify-package-readme-limitations.ts). diff --git a/packages/README.zh.md b/packages/README.zh.md index e0e1973d14..c39b65dad7 100644 --- a/packages/README.zh.md +++ b/packages/README.zh.md @@ -10,53 +10,53 @@ npm scope 为 `@deepseek-ai/dsh-*`;Cordis `Service` �类和函数�件通 | 组 | �责 | �布预期 | |---|---|---| -| [`core/`](core/README.md) | 产� API 主干:会���示��工具�agent(智能体)�务与具体循环 | 产�:稳定接� | -| [`api/`](api/README.md) | Remote BFF 装�与 Typert RPC Gateway | 产�:稳定接� | -| [`typert/`](typert/README.md) | 类型图生��产物加载与�行时注册表 | 产�:稳定接� | -| [`goal/`](goal/README.md) | �会� goal 的�久化与生命周期 | 产�:稳定接� | -| [`schedule/`](schedule/README.md) | 仅�会�内的定时�续轮次 | 产�:稳定接� | -| [`feedback/`](feedback/README.md) | 人类�馈 | 产�:稳定接� | -| [`identity/`](identity/README.md) | 共享匿�身份 | 产�:稳定接� | -| [`llm/`](llm/README.md) | LLM(大语言模型)能力系列:抽象�务 + �供方适�器 | 产�:稳定接� | +| [`core/`](core/README.md) | 产� API 主干:会���示��工具�agent(智能体)�务与具体循环 | 产�:稳定 API | +| [`api/`](api/README.md) | Remote BFF 装�与 Typert RPC 网关 | 产�:稳定 API | +| [`typert/`](typert/README.md) | 类型图生��产物加载与�行时注册表 | 产�:稳定 API | +| [`goal/`](goal/README.md) | �会� goal 的�久化与生命周期 | 产�:稳定 API | +| [`schedule/`](schedule/README.md) | 仅�会�内的定时�续�作 | 产�:稳定 API | +| [`feedback/`](feedback/README.md) | 人类�馈 | 产�:稳定 API | +| [`identity/`](identity/README.md) | 共享匿�身份 | 产�:稳定 API | +| [`llm/`](llm/README.md) | LLM(大语言模型)能力系列:抽象�务 + �供方适�器 | 产�:稳定 API | | [`e2b/`](e2b/README.md) | E2B �供方 | POC | -| [`subprocess/`](subprocess/README.md) | �进程能力系列:Service Definition + 本地进程树�供方 | 产�:稳定接� | -| [`shell/`](shell/README.md) | Bash 能力系列:执行器 seam�本地实现���模型的工具 | 产�:稳定接� | -| [`terminal/`](terminal/README.md) | �久 PTY 能力系列:按所有者隔离的会��本地实现和��模型的工具 | 产�:稳定接� | -| [`code-runtime/`](code-runtime/README.md) | 代�执行能力系列:Service Definition + worker 线程�供方 + Code Mode Consumer | 产�:稳定接� | -| [`sandbox/`](sandbox/README.md) | 进程�制 seam;bwrap/Landlock/Seatbelt �端 | 产�:稳定接� | -| [`fs/`](fs/README.md) | 文件系统能力系列:seam�本地实现���模型的文件工具�由 bash 支�的�现工具 | 产�:稳定接� | -| [`lsp/`](lsp/README.md) | LSP 能力系列:seam�通用 stdio �供方和 `lsp` 工具 | 产�:稳定接� | -| [`skill/`](skill/README.md) | skill(技能)能力系列:�供方注册表�本地�供方和��模型的目录�loader | 产�:稳定接� | -| [`compaction/`](compaction/README.md) | 压缩(compaction)能力系列:Service Definition + 基础�供方 + 命令 Consumer | 产�:稳定接� | -| [`context/`](context/README.md) | 模型��请求上下文,包括 workspace 指令和时间上下文 | 产�:稳定接� | -| [`subagent/`](subagent/README.md) | subagent 能力系列:�供方注册表约定和��模型的委托工具 | 产�:稳定接� | -| [`jobs/`](jobs/README.md) | 通用��任务�行时和��模型的 `job_*` 控制工具 | 产�:稳定接� | -| [`workflow/`](workflow/README.md) | 工作� seam�worker 线程引擎和��模型的 `workflow`/`ralph` 工具 | 产�:稳定接� | -| [`web/`](web/README.md) | Web 能力系列:seam��索�获��供方实现和��模型的 Web 工具 | 产�:稳定接� | -| [`attachment/`](attachment/README.md) | �久附件标识�校验�本地内容寻�存储 | 产�:稳定接� | -| [`spill/`](spill/README.md) | spill 能力系列:存储 seam�本地实现�工具结果 spill 策略 | 产�:稳定接� | -| [`todo/`](todo/README.md) | ��模型的 `todo_write` 工具 | 产�:稳定接� | -| [`plan/`](plan/README.md) | Plan �作状�,�供直接进入命令与�评审的退出 | 产�:稳定接� | -| [`preset/`](preset/README.md) | 由 preset `cordis.yml` 按会�组装 agent | 产�:稳定接� | -| [`guard/`](guard/README.md) | 循环�生守�:建议性��调用�醒 + `tools/execute` 截止时间强制执行器 | 产�:稳定接� | -| [`bundle/`](bundle/README.md) | �安装的 `dsh --profile` 补�层 | 产�:稳定接� | -| [`extensions/`](extensions/README.md) | agent �行时自修改:实时�件��务检查和模型所写�件挂载��载([设计](../.agents/notes/implemented/feature/2026-07-08-self-referential-cordis-toolset.md)) | 产�:稳定接� | -| [`hooks/`](hooks/README.md) | 钩�桥接 + 共享 Claude Code�Codex �议格�库 | 产�:稳定接� | -| [`session/`](session/README.md) | �久会�数�平�:�久化 seam + JSONL/SQLite �端�投影 seam�基于日志的标题�会�上报 | 产�:稳定接� | -| [`session-query/`](session-query/README.md) | 会�检索系列:逻辑语料库�有界读��血缘�事件关系�语义过滤和 SQLite 全文�索 | 产�:稳定接� | -| [`settings/`](settings/README.md) | 用户设置 seam + 基于文件的�供方 | 产�:稳定接� | -| [`credentials/`](credentials/README.md) | 凭�引用 seam + 环境��优先于 `.env` 的�供方 | 产�:稳定接� | -| [`storage/`](storage/README.md) | �会�存储中枢 + �端 + 领域形� | 产�:稳定接� | -| [`workspace/`](workspace/README.md) | Workspace 实体 | 产�:稳定接� | -| [`sdk/`](sdk/README.md) | 进程外�行时 SDK:JSON-RPC �议�TypeScript 客户端和�务器�件 | 产�:稳定接� | -| [`acp/`](acp/README.md) | 仅��自动化的 ACP(Agent Client Protocol)�务器 | 产�:稳定接� | -| [`interaction/`](interaction/README.md) | 人机�作平�:批准�交互 seam���预设�命令�询问用户的工具 | 产�:稳定接� | -| [`boot/`](boot/README.md) | 共享的 app bin �动粘�层 | 产�:稳定接� | -| [`host/`](host/README.md) | web GUI 宿主�侧:API 网关 + HTTP 路由�务器 | 产�:稳定接� | -| [`client/`](client/README.md) | web GUI �览器�侧:shell��议层�对象�务�slot�`ui-*` �件 | 产�:稳定接� | +| [`subprocess/`](subprocess/README.md) | �进程能力系列:Service Definition + 本地进程树�供方 | 产�:稳定 API | +| [`shell/`](shell/README.md) | Bash 能力系列:执行器 seam�本地实现���模型的工具 | 产�:稳定 API | +| [`terminal/`](terminal/README.md) | �久 PTY 能力系列:�定所有者范围的会��本地实现和��模型的工具 | 产�:稳定 API | +| [`code-runtime/`](code-runtime/README.md) | 代�执行能力系列:Service Definition + worker 线程�供方 + Code Mode Consumer | 产�:稳定 API | +| [`sandbox/`](sandbox/README.md) | 进程�制 seam;bwrap/Landlock/Seatbelt �端 | 产�:稳定 API | +| [`fs/`](fs/README.md) | 文件系统能力系列:seam�本地实现���模型的文件工具�由 bash 支�的�现工具 | 产�:稳定 API | +| [`lsp/`](lsp/README.md) | LSP 能力系列:seam�通用 stdio �供方和 `lsp` 工具 | 产�:稳定 API | +| [`skill/`](skill/README.md) | skill(技能)能力系列:�供方注册表�本地�供方和��模型的目录�loader | 产�:稳定 API | +| [`compaction/`](compaction/README.md) | 压缩(compaction)能力系列:Service Definition + 基础�供方 + 命令 Consumer | 产�:稳定 API | +| [`context/`](context/README.md) | 模型��请求上下文,包括 workspace 指令和时间上下文 | 产�:稳定 API | +| [`subagent/`](subagent/README.md) | subagent 能力系列:�供方注册表约定和��模型的委托工具 | 产�:稳定 API | +| [`jobs/`](jobs/README.md) | 通用��任务�行时和��模型的 `job_*` 控制工具 | 产�:稳定 API | +| [`workflow/`](workflow/README.md) | 工作� seam�worker 线程引擎和��模型的 `workflow`/`ralph` 工具 | 产�:稳定 API | +| [`web/`](web/README.md) | Web 能力系列:seam��索�获��供方实现和��模型的 Web 工具 | 产�:稳定 API | +| [`attachment/`](attachment/README.md) | �久附件标识�校验�本地内容寻�存储 | 产�:稳定 API | +| [`spill/`](spill/README.md) | spill 能力系列:存储 seam�本地实现�工具结果 spill 策略 | 产�:稳定 API | +| [`todo/`](todo/README.md) | ��模型的 `todo_write` 工具 | 产�:稳定 API | +| [`plan/`](plan/README.md) | Plan �作状�,�供直接进入命令与�评审的退出 | 产�:稳定 API | +| [`preset/`](preset/README.md) | 由 preset `cordis.yml` 按会�组装 agent | 产�:稳定 API | +| [`guard/`](guard/README.md) | 循环�生守�:建议性��调用�醒 + `tools/execute` 截止时间强制执行器 | 产�:稳定 API | +| [`bundle/`](bundle/README.md) | �安装的 `dsh --profile` 补�层 | 产�:稳定 API | +| [`extensions/`](extensions/README.md) | agent �行时自修改:实时�件��务检查和模型所写�件挂载��载([设计](../.agents/notes/implemented/feature/2026-07-08-self-referential-cordis-toolset.md)) | 产�:稳定 API | +| [`hooks/`](hooks/README.md) | 钩�桥接 + 共享的 Claude Code�Codex 线�议库 | 产�:稳定 API | +| [`session/`](session/README.md) | �久会�数�平�:�久化 seam + JSONL/SQLite �端�投影 seam�基于日志的标题�会�上报 | 产�:稳定 API | +| [`session-query/`](session-query/README.md) | 会�检索系列:逻辑语料库�有界读��血缘�事件关系�语义过滤和 SQLite 全文�索 | 产�:稳定 API | +| [`settings/`](settings/README.md) | 用户设置 seam + 基于文件的�供方 | 产�:稳定 API | +| [`credentials/`](credentials/README.md) | 凭�引用 seam + 环境��优先于 `.env` 的�供方 | 产�:稳定 API | +| [`storage/`](storage/README.md) | �会�存储中枢 + �端 + 领域形� | 产�:稳定 API | +| [`workspace/`](workspace/README.md) | Workspace 实体 | 产�:稳定 API | +| [`sdk/`](sdk/README.md) | 进程外�行时 SDK:JSON-RPC �议�TypeScript 客户端和�务器�件 | 产�:稳定 API | +| [`acp/`](acp/README.md) | 仅��自动化的 ACP(Agent Client Protocol)�务器 | 产�:稳定 API | +| [`interaction/`](interaction/README.md) | 人机�作平�:批准�交互 seam���预设�命令�询问用户的工具 | 产�:稳定 API | +| [`boot/`](boot/README.md) | 共享的 app bin �动粘�层 | 产�:稳定 API | +| [`host/`](host/README.md) | web GUI 宿主�侧:API 网关 + HTTP 路由�务器 | 产�:稳定 API | +| [`client/`](client/README.md) | web GUI �览器�侧:shell��议层�对象�务�slot�`ui-*` �件 | 产�:稳定 API | | [`examples/`](examples/README.md) | 演示组�包(agent-spine + CLI(命令行界�)/ACP/JSON-RPC bin),由�节点加载 | 支�:示例基础设施 | | [`test-support/`](test-support/README.md) | 支�基础设施(testkit�����回放�Loader 冒烟测试) | 支�:兼容性预期较低 | -| [`util/`](util/README.md) | 组间共享的低层零�赖工具(`Branded`�Harness home�路径辅助函数�超时��留策略) | 支�:�型�稳定�无 harness �赖 | +| [`util/`](util/README.md) | 组间共享的低层零�赖工具(`Branded`�Harness home�路径辅助函数�超时�留存) | 支�:�型�稳定�无 harness �赖 | 新包加入现有组;新组更新其 README 和此表。 @@ -64,6 +64,6 @@ npm scope 为 `@deepseek-ai/dsh-*`;Cordis `Service` �类和函数�件通 �赖图由工具生�:[docs/module-graph.md](../docs/module-graph.md)(`pnpm run gen-module-graph`,CI 中有新鲜度门�)。 -**扩展�件�赖 Service Definition,���赖具体�供方。** `dsh-agent-loop` �替�;UI�钩�和工具�件使用 `dsh-agent`。包括 `dsh-agent-spine-demo` 在内的组�包�以�赖主干�件。能力在 Service Definition�Service provider�Consumer 角色需�独立演进时将其分离;详�[能力 seam](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)。 +**扩展�件�赖 Service Definition,���赖具体�供方。** `dsh-agent-loop` �替�;UI�钩�和工具�件使用 `dsh-agent`。包括 `dsh-agent-spine-demo` 在内的组�包�以�赖主干�件。能力会将需�独立演进的 Service Definition�Service Provider�Consumer 角色分离;详�[能力 seam](../.agents/notes/implemented/architecture/2026-06-13-capability-seams.md)。 包 README 覆盖用途�API�扩展点和[模型体验](../docs/cookbook/adding-a-package.md#4-write-the-package-readme);列入模型无关[�略�许清�](../scripts/verify-package-readme-model-experience.ts)的包除外。它们还�包� `## Known Limitations and Deferred Work`,或列入其[�许清�](../scripts/verify-package-readme-limitations.ts)。 diff --git a/packages/acp/acp/package.json b/packages/acp/acp/package.json index 5aedb8fd5b..d5f08d2028 100644 --- a/packages/acp/acp/package.json +++ b/packages/acp/acp/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-acp", "description": "Automation-only Agent Client Protocol server for driving DeepSeek Harness agents over JSON-RPC stdio", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@agentclientprotocol/sdk": "0.25.1", "@deepseek-ai/schemastery": "workspace:^" diff --git a/packages/api/gateway/package.json b/packages/api/gateway/package.json index 66c34a9b1f..9d128595d8 100644 --- a/packages/api/gateway/package.json +++ b/packages/api/gateway/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-api-gateway", "description": "Typert Remote Host dispatcher and Client API endpoint", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -54,7 +54,7 @@ "lib/types/**/*.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-typert-protocol": "workspace:^" }, diff --git a/packages/api/remotes/package.json b/packages/api/remotes/package.json index ae2f56dd0c..edc6d65704 100644 --- a/packages/api/remotes/package.json +++ b/packages/api/remotes/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-api-remotes", "description": "Remote BFF assembly and Host Agent/Session lookup policy", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "files": [ "lib/index.js", "lib/invariant.js", diff --git a/packages/attachment/attachment-local/package.json b/packages/attachment/attachment-local/package.json index bc350a8106..844479fc40 100644 --- a/packages/attachment/attachment-local/package.json +++ b/packages/attachment/attachment-local/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-attachment-local", "description": "Private content-addressed DSH_HOME attachment storage", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -20,7 +20,7 @@ "./package.json": "./package.json" }, "files": ["lib/index.js", "lib/invariant.js", "lib/types/**/*.d.ts"], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/attachment/attachment/package.json b/packages/attachment/attachment/package.json index 4819bd7674..3f11676e71 100644 --- a/packages/attachment/attachment/package.json +++ b/packages/attachment/attachment/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-attachment", "description": "Durable immutable attachment storage seam for the DeepSeek Harness", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -20,7 +20,7 @@ "./package.json": "./package.json" }, "files": ["lib/index.js", "lib/invariant.js", "lib/types/**/*.d.ts"], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-brand": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/boot/app-boot/package.json b/packages/boot/app-boot/package.json index cafa235de1..c602dc9399 100644 --- a/packages/boot/app-boot/package.json +++ b/packages/boot/app-boot/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-app-boot", "description": "Shared boot glue for the app bins: .env loading, fail-loud Loader guards, snapshot-aware config resolution, and the Loader boot sequence", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "js-yaml": "^4.2.0" }, diff --git a/packages/boot/app-boot/src/profile.ts b/packages/boot/app-boot/src/profile.ts index 59dac77d69..8f982bed80 100644 --- a/packages/boot/app-boot/src/profile.ts +++ b/packages/boot/app-boot/src/profile.ts @@ -24,7 +24,7 @@ import { createRequire } from 'node:module' import { - existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, rmSync, symlinkSync, writeFileSync, + existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, symlinkSync, unlinkSync, writeFileSync, } from 'node:fs' import { basename, dirname, join } from 'node:path' import type { EntryOptions } from '@deepseek-ai/cordis-plugin-loader' @@ -182,7 +182,9 @@ function ensureSymlink(link: string, target: string): void { throw new Error(`dsh: ${link} exists and is not a symlink; remove it so dsh can manage the installation fallback`) } if (readlinkSync(link) === target) return - rmSync(link) + // unlink deletes the reparse point itself on Windows too; rmSync treats a + // junction as a directory and throws EISDIR unless recursive. + unlinkSync(link) } try { symlinkSync(target, link, 'junction') @@ -209,7 +211,7 @@ function ensureSymlink(link: string, target: string): void { * installation" contract. The closure (not just direct dependencies) is * required for out-of-tree plugins: their peer dependencies name Service * Definition packages (`dsh-compaction`, `dsh-invariants`, ...) that the app - * reaches only through its Service provider packages. Symlinked packages + * reaches only through its Service Provider packages. Symlinked packages * resolve their own dependencies from their real directories (Node's default * symlink-following), so each package needs only its one flat link. * Idempotent: correct links are kept and moved installations are diff --git a/packages/boot/app-boot/tests/hmr-config.spec.ts b/packages/boot/app-boot/tests/hmr-config.spec.ts index c248643130..5f52ab5e2a 100644 --- a/packages/boot/app-boot/tests/hmr-config.spec.ts +++ b/packages/boot/app-boot/tests/hmr-config.spec.ts @@ -62,7 +62,7 @@ describe('HMR exact config paths', () => { expect(cacheHas).toHaveBeenCalledWith(expected) } finally { await ctx.fiber.dispose() - rmSync(alias, { force: true }) + unlinkSync(alias) rmSync(target, { recursive: true, force: true }) } }) @@ -78,7 +78,7 @@ describe('HMR exact config paths', () => { .rejects.toThrow('config path already registered') } finally { await ctx.fiber.dispose() - rmSync(alias, { force: true }) + unlinkSync(alias) rmSync(target, { recursive: true, force: true }) } }) diff --git a/packages/boot/cmdline/package.json b/packages/boot/cmdline/package.json index a679d4e3fe..a91d6b8cd2 100644 --- a/packages/boot/cmdline/package.json +++ b/packages/boot/cmdline/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-cmdline", "description": "Immutable command-line handoff from a dsh launcher to any app plugin that injects cmdlineArgs", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -30,7 +30,7 @@ "lib/invariant.js", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", "@deepseek-ai/dsh-invariants": "workspace:^", diff --git a/packages/bundle/base/README.i18n.yaml b/packages/bundle/base/README.i18n.yaml index cae813eb1d..483784e547 100644 --- a/packages/bundle/base/README.i18n.yaml +++ b/packages/bundle/base/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/bundle/base/README.md -README.md: bd38f39f58ee1f765ff34d40cf57cc6daed2b32b -README.zh.md: bcf4463587f42a245126f87388f3c0a4e57f0976 +README.md: 00a177d4dd65de8706aa0e27a79d06a9a50eb55a +README.zh.md: ad70fc16035d3dd70b04e78c31aea90acf61119b diff --git a/packages/bundle/base/README.md b/packages/bundle/base/README.md index bd38f39f58..00a177d4dd 100644 --- a/packages/bundle/base/README.md +++ b/packages/bundle/base/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -The shared dsh core as a profile bundle: [`cordis.patch.yml`](cordis.patch.yml) inserts every base plugin row — model adapters, the shared [`agent-default-model`](../../core/agent-default-model/README.md) selection, tools, persistence, policy, settings/credentials, telemetry, and host-level subagent providers — over the empty profile root, as the first layer of every profile's `dsh.profile.bundles` list. Codex and Claude Code providers load dormant; Agent Presets independently decide whether their agent contributes either model-facing delegation tool. Later bundle layers (e.g. [`dsh-web-app`](../web-app/README.md)) and the user's profile `cordis.patch.yml` override these rows by id; a patch replaces a row's whole `config`, so mode-specific values live in mode bundles, not here. The package has no runtime API; the profile composer resolves the patch through the `dsh.bundle.patch` manifest field, never through code. +The shared dsh core as a profile bundle: [`cordis.patch.yml`](cordis.patch.yml) inserts every base plugin row — model adapters, the shared [`agent-default-model`](../../core/agent-default-model/README.md) selection, tools, persistence, policy, settings/credentials, telemetry, and host-level subagent providers — over the empty profile root, as the first layer of every profile's `dsh.profile.bundles` list. This bundle neither depends on nor mounts the optional Codex and Claude Code providers; an opting-in Profile installs and mounts the selected provider once on the host plane, while Agent Presets decide whether their agents receive the corresponding model-facing delegation tools. Later bundle layers (e.g. [`dsh-web-app`](../web-app/README.md)) and the user's profile `cordis.patch.yml` override these rows by id; a patch replaces a row's whole `config`, so mode-specific values live in mode bundles, not here. The package has no runtime API; the profile composer resolves the patch through the `dsh.bundle.patch` manifest field, never through code. The patch gates both shell stacks by platform on its own rows: `bash-sandbox`/`tool-bash` carry `disabled: !!js process.platform === 'win32'` (bash has no Windows runner), and their twins `pwsh-sandbox`/`tool-pwsh` mount on win32 only with the inverted expression — one shared patch file, exactly one shell stack per host. The permission surface stays exactly as on POSIX: `sandbox`/`sandbox-policy` enforce the file-effect policy through the Windows ACL restricted-token runner (the win32 chain of `dsh-sandbox-local` → `@deepseek-ai/dsh-sandbox-windows-acl`), the permission switcher and the approval service run unchanged, and `fs-sandbox` keeps fencing `ctx.fs` writes — mounting `dsh-fs-local` alongside it would double-register `ctx.fs` and fail the load. A Windows host that prefers the unconfined local pwsh executor or full access overrides these rows through its profile or home `cordis.patch.yml` (the bash-restore recipe must be complete: disable `pwsh-sandbox`/`tool-pwsh` AND re-enable `bash-sandbox`/`tool-bash` — both executor families register the same `bash` service, so an incomplete recipe fails loud at load). POSIX hosts see the pwsh rows disabled. @@ -19,5 +19,4 @@ None directly; each inserted row's package owns its effect. ## Known Limitations and Deferred Work - **A patch replaces whole row configs** — profile overrides must restate every field a row keeps; there is no deep-merge layer. -- **Claude's SDK platform CLI remains in the Profile install closure** — the base bundle depends on the Claude provider, whose production path resolves the host `claude`; removing the SDK's unused optional payload is deferred to the product installation-closure follow-up. - **The Windows temp grant is a private per-session subdirectory** — `workspace-write` confines writes to the workspace plus the session's own temp subdirectory (`\dsh-`, TMP/TEMP rewritten for confined children); `read-only` grants nothing. See `@deepseek-ai/dsh-sandbox-windows-acl`. diff --git a/packages/bundle/base/README.zh.md b/packages/bundle/base/README.zh.md index bcf4463587..ad70fc1603 100644 --- a/packages/bundle/base/README.zh.md +++ b/packages/bundle/base/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -以 profile 组�包形�交付的共享 dsh 核心:[`cordis.patch.yml`](cordis.patch.yml) 在空的 profile 根之上�入全部基础�件行——模型适�器�共享的 [`agent-default-model`](../../core/agent-default-model/README.md) 选择�工具��久化�策略�settings�credentials��测与宿主级 subagent provider——作为�个 profile 的 `dsh.profile.bundles` 列表中的第一层。Codex 与 Claude Code provider 以休眠状�加载;Agent Preset 分别决定自己的 agent 是�贡献任一��模型的委派工具。�续的组�包层(例如 [`dsh-web-app`](../web-app/README.md))和用户 profile 的 `cordis.patch.yml` 按 id 覆盖这些行;patch 会替�目标行的整个 `config`,因此模�专属的值放在�模�组�包中,而�是这里。该包没有�行时 API;profile 组�器通过 manifest(元数�清�)的 `dsh.bundle.patch` 字段解� patch,��通过代�。 +以 profile 组�包形�交付的共享 dsh 核心:[`cordis.patch.yml`](cordis.patch.yml) 在空的 profile 根之上�入全部基础�件行——模型适�器�共享的 [`agent-default-model`](../../core/agent-default-model/README.md) 选择�工具��久化�策略�settings�credentials��测与宿主级 subagent provider——作为�个 profile 的 `dsh.profile.bundles` 列表中的第一层。这个 bundle 既��赖也�挂载�选的 Codex 与 Claude Code provider;选择产�集�的 Profile 会安装目标 provider 并在 host plane(宿主平�)挂载一次,Agent Preset 则决定自己的 agent 是�获得对应的��模型委派工具。�续的组�包层(例如 [`dsh-web-app`](../web-app/README.md))和用户 profile 的 `cordis.patch.yml` 按 id 覆盖这些行;patch 会替�目标行的整个 `config`,因此模�专属的值放在�模�组�包中,而�是这里。该包没有�行时 API;profile 组�器通过 manifest(元数�清�)的 `dsh.bundle.patch` 字段解� patch,��通过代�。 patch 在自身上按平�门控两个 shell 栈:`bash-sandbox`/`tool-bash` �带 `disabled: !!js process.platform === 'win32'`(bash 没有 Windows runner),它们的孪生行 `pwsh-sandbox`/`tool-pwsh` 以��的表达�仅在 win32 挂载——�一份 patch 文件,�个宿主�好挂载一个 shell 栈。���与 POSIX 完全一致:`sandbox`/`sandbox-policy` 通过 Windows ACL ��令牌 runner(`dsh-sandbox-local` 的 win32 链 → `@deepseek-ai/dsh-sandbox-windows-acl`)执行文件效果策略,��切�器与 approval �务原样�行,`fs-sandbox` 继续围� `ctx.fs` 写入——在其��挂载 `dsh-fs-local` 会��注册 `ctx.fs` 并在加载时失败。�好��沙盒约�的本地 pwsh 执行器或完整访问的 Windows 主机通过其 profile 或 home 的 `cordis.patch.yml` 覆盖这些行(bash ���方必须完整:�用 `pwsh-sandbox`/`tool-pwsh` 并�新�用 `bash-sandbox`/`tool-bash`——两个执行器家�注册�一个 `bash` �务,�方�完整会在加载时直接报错)。POSIX 主机看到的是被�用的 pwsh 行。 @@ -19,5 +19,4 @@ patch 在自身上按平�门控两个 shell 栈:`bash-sandbox`/`tool-bash` ## 已知�制与暂缓事项 - **patch 会替�整行 `config`**:profile 覆盖必须�述该行需��留的�个字段;�存在深度�并层。 -- **Claude SDK 的平� CLI(命令行界�)�在 Profile 安装闭包中**:base 组�包�赖 Claude �供方,其生产路径解�宿主�供的 `claude`;移除 SDK 中未使用的�选载�,推迟到产�安装闭包�续项处�。 - **Windows 的临时目录授�是按会�的�有�目录**——`workspace-write` 把写入�制在工作区与会�自己的 temp �目录(`\dsh-`,���进程的 TMP/TEMP 被改写);`read-only` �授予任何临时目录写入��。� `@deepseek-ai/dsh-sandbox-windows-acl`。 diff --git a/packages/bundle/base/cordis.patch.yml b/packages/bundle/base/cordis.patch.yml index 2f5b5c6a12..e9567d9206 100644 --- a/packages/bundle/base/cordis.patch.yml +++ b/packages/bundle/base/cordis.patch.yml @@ -106,13 +106,19 @@ - id: attachment-local name: '@deepseek-ai/dsh-attachment-local' - # Raw configs can supply a process-local path or disable this shared session - # capability. The neutral default is process-local and opens only when used. + # Full-text session search is opt-in. `openAt: never` keeps + # ctx.sessionQuery mounted — exact reads, titles, and lineage traces + # (session export, subagent-fork Workspace inheritance) stay available — + # while search calls fail with SESSION_QUERY_SEARCH_DISABLED and SQLite is + # never opened; the Web sidebar search matches titles and workspace names + # only. Deployments enabling content search override `openAt` to + # `first-search` or `startup` in a later patch layer (profile + # cordis.patch.yml or a --patch overlay), typically with a durable `path`. - id: session-query-sqlite name: '@deepseek-ai/dsh-session-query-sqlite' config: path: ':memory:' - openAt: first-search + openAt: never # Shared projection registry: subagent catalog identity (mode/label) folds # through its registered units, so the `list_agents` surface below fails @@ -296,15 +302,6 @@ config: providerName: fork - # Product providers stay on the host plane because the registry is a - # process singleton. Agent presets decide whether their own model sees the - # matching delegation tools; loading either provider starts no product. - - id: subagent-codex - name: '@deepseek-ai/dsh-subagent-codex' - - - id: subagent-claude-code - name: '@deepseek-ai/dsh-subagent-claude-code' - # Continuable background children are selected per delegation tool. The # separately loaded follow-up tool registers the one global `send_message`. - id: tool-subagent-control diff --git a/packages/bundle/base/package.json b/packages/bundle/base/package.json index 392a6f63d5..9351c491a9 100644 --- a/packages/bundle/base/package.json +++ b/packages/bundle/base/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-base", "description": "The shared dsh core as a profile bundle: every profile's first patch layer, inserting the base plugin rows over the empty profile root", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -32,7 +32,7 @@ "cordis.patch.yml", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dsh": { "bundle": { "patch": "./cordis.patch.yml" @@ -85,8 +85,6 @@ "@deepseek-ai/dsh-spill-local": "workspace:^", "@deepseek-ai/dsh-spill-policy": "workspace:^", "@deepseek-ai/dsh-subagent": "workspace:^", - "@deepseek-ai/dsh-subagent-claude-code": "workspace:^", - "@deepseek-ai/dsh-subagent-codex": "workspace:^", "@deepseek-ai/dsh-subagent-fork-in-process": "workspace:^", "@deepseek-ai/dsh-subagent-spawn-in-process": "workspace:^", "@deepseek-ai/dsh-subprocess-local": "workspace:^", diff --git a/packages/bundle/base/tests/base.spec.ts b/packages/bundle/base/tests/base.spec.ts index 8f904ac60b..e70bc0ff74 100644 --- a/packages/bundle/base/tests/base.spec.ts +++ b/packages/bundle/base/tests/base.spec.ts @@ -35,12 +35,10 @@ describe('dsh-base bundle', () => { expect(rows.find(row => row.id === 'session-telemetry-otel')?.config?.['mode']).toEqual({ __jsExpr: "process.env.DSH_TELEMETRY_MODE || 'DISABLED'", }) - expect(rows.filter(row => row.id === 'subagent-codex')).toHaveLength(1) - expect(rows.filter(row => row.id === 'subagent-claude-code')).toHaveLength(1) - expect(manifest.dependencies).toMatchObject({ - '@deepseek-ai/dsh-subagent-codex': 'workspace:^', - '@deepseek-ai/dsh-subagent-claude-code': 'workspace:^', - }) + expect(rows.filter(row => row.id === 'subagent-codex')).toHaveLength(0) + expect(rows.filter(row => row.id === 'subagent-claude-code')).toHaveLength(0) + expect(manifest.dependencies).not.toHaveProperty('@deepseek-ai/dsh-subagent-codex') + expect(manifest.dependencies).not.toHaveProperty('@deepseek-ai/dsh-subagent-claude-code') }) it('gates each shell stack by platform with a symmetric disabled expression', () => { diff --git a/packages/bundle/headless/package.json b/packages/bundle/headless/package.json index 652c5802da..886fdc593e 100644 --- a/packages/bundle/headless/package.json +++ b/packages/bundle/headless/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-headless", "description": "The dsh one-shot bundle: a direct core Agent/Session runner over dsh-base with no Host, HTTP, or browser layer", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -37,7 +37,7 @@ "cordis.patch.yml", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dsh": { "bundle": { "patch": "./cordis.patch.yml" diff --git a/packages/bundle/web-app/README.i18n.yaml b/packages/bundle/web-app/README.i18n.yaml index 45da05fcf3..220b4d78ff 100644 --- a/packages/bundle/web-app/README.i18n.yaml +++ b/packages/bundle/web-app/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/bundle/web-app/README.md -README.md: 3f7fbe7bbbeba2ee753ab2dfa8c945e798dd6a02 -README.zh.md: 357ca9946ed7fef1bf4c691c6666156bb293b5e0 +README.md: 90d1566b5a7a25f6a827079c4a8ab776e05cc7a3 +README.zh.md: b7156bcab66b53964bb2f0e1c87d9e9a806e3f75 diff --git a/packages/bundle/web-app/README.md b/packages/bundle/web-app/README.md index 3f7fbe7bbb..90d1566b5a 100644 --- a/packages/bundle/web-app/README.md +++ b/packages/bundle/web-app/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -The dsh browser-surface bundle. [`cordis.patch.yml`](cordis.patch.yml) rides over [`dsh-base`](../base/README.md): it sets the coding persona, inserts the Web host rows (webserver, API gateway, workspace, projection cache, storage) and the browser plugin roster, the always-on client-plugin reload chain ([`dsh-client-hmr`](../../client/hmr/README.md), idle until a rebuild watcher rewrites client bundles), and mounts this package's `web-runtime` glue plugin (config `{printUrl, surfaceContext, trustedHosts}`). That plugin resolves the built frontend dist through `@deepseek-ai/dsh-web-frontend`'s exports, samples bind-dependent LAN trust once, provides it as `webRuntime` to the browser-trust fence and client roster, mounts the [`frontend-static`](../../host/frontend-static/README.md) fallback owner, registers the harness-source and web-surface prompt sections plus the bash-visible `DSH_WEB_URL` runtime variable when `surfaceContext` is true, and prints the `dsh web:` URL line when `printUrl` is true, after its Loader tree settles so a sibling failure cannot announce a dead app. This bundle also owns the app command line: the ordinary `web-startup` provider ([`src/startup.ts`](src/startup.ts)) injects `ctx.cmdlineArgs` ([`dsh-cmdline`](../../boot/cmdline/README.md)), parses `--host`, `--port`, repeatable `--trusted-host`, and the app's `--help`, then provides `webStartup`. Flag-configured rows inject that service and read it directly from lazy config, so nothing binds a port before argument resolution and `dsh --profile web --help` starts no server. [`dsh-headless`](../headless/README.md) is a sibling surface over the same base and does not mount this bundle. +The dsh browser-surface bundle. [`cordis.patch.yml`](cordis.patch.yml) rides over [`dsh-base`](../base/README.md): it sets the coding persona, inserts the Web host rows (webserver, API gateway, workspace, projection cache, storage) and the browser plugin roster, the always-on client-plugin reload chain ([`dsh-client-hmr`](../../client/hmr/README.md), idle until a rebuild watcher rewrites client bundles), and mounts this package's `web-runtime` glue plugin (config `{printUrl, surfaceContext, trustedHosts}`). That plugin resolves the built frontend dist through `@deepseek-ai/dsh-web-frontend`'s exports, samples bind-dependent LAN trust once, provides it as `webRuntime` to the browser-trust fence and client roster, mounts the [`frontend-static`](../../host/frontend-static/README.md) fallback owner, registers the harness-source and web-surface prompt sections plus the bash-visible `DSH_WEB_URL` runtime variable when `surfaceContext` is true, and prints the `dsh web:` URL line when `printUrl` is true, after its Loader tree settles so a sibling failure cannot announce a dead app. This bundle also owns the app command line: the ordinary `web-startup` provider ([`src/startup.ts`](src/startup.ts)) injects `ctx.cmdlineArgs` ([`dsh-cmdline`](../../boot/cmdline/README.md)), parses `--host`, `--port`, repeatable `--trusted-host`, and the app's `--help`, then provides `webStartup`. It rejects `--host 0.0.0.0` before publishing that service because the CLI intentionally does not support all-interfaces binding yet. Flag-configured rows inject the service and read it directly from lazy config, so nothing binds a port before argument resolution and `dsh --profile web --help` starts no server. [`dsh-headless`](../headless/README.md) is a sibling surface over the same base and does not mount this bundle. ## Model Experience diff --git a/packages/bundle/web-app/README.zh.md b/packages/bundle/web-app/README.zh.md index 357ca9946e..b7156bcab6 100644 --- a/packages/bundle/web-app/README.zh.md +++ b/packages/bundle/web-app/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -dsh �览器表层组�包。[`cordis.patch.yml`](cordis.patch.yml) �加在 [`dsh-base`](../base/README.md) 之上:设置 coding persona,�入 Web 宿主行(webserver�API 网关�workspace�投影缓存�存储)��览器�件�录与始终挂载的客户端�件�载链([`dsh-client-hmr`](../../client/hmr/README.md),在�建 watcher 改写客户端 bundle 之���空闲),并挂载本包的 `web-runtime` 粘��件(�置为 `{printUrl, surfaceContext, trustedHosts}`)。该�件通过 `@deepseek-ai/dsh-web-frontend` 的 exports 解�已构建的�端 dist,�采样一次�赖 bind 的 LAN 信任信�并将其作为 `webRuntime` �供给�览器信任栅�和客户端�录,挂载 [`frontend-static`](../../host/frontend-static/README.md) 回退席�所有者,在 `surfaceContext` 为 true 时注册 Harness ��与 Web 表层�示�段�,以� bash ��的 `DSH_WEB_URL` �行时��,并在 `printUrl` 为 true 时等自身的 Loader �置树结算��打� `dsh web:` URL 行,��兄弟行失败时公告一个已失效的应用。本组�包还�有应用命令行:普通 `web-startup` �供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.md)),解� `--host`�`--port`����的 `--trusted-host` 以�应用自己的 `--help`,��供 `webStartup`。由 flag �置的行会注入该�务,并在惰性�置中直接读�它,因此�数解�完���会有任何东西绑定端�,`dsh --profile web --help` 也�会�动�务器。[`dsh-headless`](../headless/README.md) 是�一 base 之上的�级表层,�挂载本组�包。 +dsh �览器表层组�包。[`cordis.patch.yml`](cordis.patch.yml) �加在 [`dsh-base`](../base/README.md) 之上:设置 coding persona,�入 Web 宿主行(webserver�API 网关�workspace�投影缓存�存储)��览器�件�录与始终挂载的客户端�件�载链([`dsh-client-hmr`](../../client/hmr/README.md),在�建 watcher 改写客户端 bundle 之���空闲),并挂载本包的 `web-runtime` 粘��件(�置为 `{printUrl, surfaceContext, trustedHosts}`)。该�件通过 `@deepseek-ai/dsh-web-frontend` 的 exports 解�已构建的�端 dist,�采样一次�赖 bind 的 LAN 信任信�并将其作为 `webRuntime` �供给�览器信任栅�和客户端�录,挂载 [`frontend-static`](../../host/frontend-static/README.md) 回退席�所有者,在 `surfaceContext` 为 true 时注册 Harness ��与 Web 表层�示�段�,以� bash ��的 `DSH_WEB_URL` �行时��,并在 `printUrl` 为 true 时等自身的 Loader �置树结算��打� `dsh web:` URL 行,��兄弟行失败时公告一个已失效的应用。本组�包还�有应用命令行:普通 `web-startup` �供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.md)),解� `--host`�`--port`����的 `--trusted-host` 以�应用自己的 `--help`,��供 `webStartup`。它会在�布该�务�拒� `--host 0.0.0.0`,因为 CLI 目�有��支�绑定所有网络接�。由 flag �置的行会注入该�务,并在惰性�置中直接读�它,因此�数解�完���会有任何东西绑定端�,`dsh --profile web --help` 也�会�动�务器。[`dsh-headless`](../headless/README.md) 是�一 base 之上的�级表层,�挂载本组�包。 ## 模型体验 diff --git a/packages/bundle/web-app/cordis.patch.yml b/packages/bundle/web-app/cordis.patch.yml index d8922fdfd1..b06e63b54f 100644 --- a/packages/bundle/web-app/cordis.patch.yml +++ b/packages/bundle/web-app/cordis.patch.yml @@ -22,14 +22,15 @@ - id: hmr disabled: true -# Web content search runs on an ephemeral in-memory index. The service -# activates at boot, while first-search defers the node:sqlite import and -# in-memory handle so Node 22 startup stays quiet until content search -# actually uses SQLite. That search then reconciles this boot's sources. +# Full-text session search is opt-in (the base row's `openAt: never`). This +# restatement keeps the Web values on one ephemeral in-memory index; a +# deployment enabling content search overrides `openAt` to `first-search` in a +# later patch layer, which defers the node:sqlite import and in-memory handle +# to the first search so Node 22 startup stays quiet. - id: session-query-sqlite config: path: ':memory:' - openAt: first-search + openAt: never - id: tools config: diff --git a/packages/bundle/web-app/package.json b/packages/bundle/web-app/package.json index 227f0b5dfb..13ca525731 100644 --- a/packages/bundle/web-app/package.json +++ b/packages/bundle/web-app/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-web-app", "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -37,7 +37,7 @@ "cordis.patch.yml", "lib/types/**/*.d.ts" ], - "license": "BSD-3-Clause", + "license": "MIT", "dsh": { "bundle": { "patch": "./cordis.patch.yml" diff --git a/packages/bundle/web-app/src/startup.ts b/packages/bundle/web-app/src/startup.ts index 2aaf89a742..af6997cff7 100644 --- a/packages/bundle/web-app/src/startup.ts +++ b/packages/bundle/web-app/src/startup.ts @@ -45,28 +45,30 @@ function webCommand(): Command { .name('dsh --profile web') .description('Serve the DeepSeek Harness browser UI.') .helpOption('-h, --help', 'show this help') - .option('--host ', 'bind host; pass 0.0.0.0 to reach it from another machine') + .option('--host ', 'bind host') .option('--port ', 'listen port; pass 0 to let the OS pick a free one') .option('--trusted-host ', 'extra authority the /api browser-trust fence accepts (host or host:port; repeatable)') .addHelpText('after', ` Examples: dsh --profile web serve on the composed host and port dsh --profile web --port 8080 serve on another port - dsh --profile web --host 0.0.0.0 reach it from another machine on the LAN `) } /** * Parse and provide the Web invocation as an ordinary Cordis service. The - * command's action publishes the flags this invocation named; a non-numeric - * `--port` is a usage error, so on rejection (and on `--help`) nothing is - * provided. + * command's action publishes the flags this invocation named; `--host 0.0.0.0` + * or a non-numeric `--port` is a usage error, so on rejection (and on `--help`) + * nothing is provided. * @param ctx - plugin context carrying the command line. */ export function apply(ctx: Context): void { const program = webCommand() program.action(() => { const options = program.opts() + if (options.host === '0.0.0.0') { + program.error('error: --host 0.0.0.0 is intentionally not supported yet for safety: it would expose remote code execution to the network; use 127.0.0.1 instead') + } if (options.port !== undefined && !/^\d+$/.test(options.port)) { program.error(`error: --port must be a number, got ${JSON.stringify(options.port)}`) } diff --git a/packages/bundle/web-app/tests/startup.spec.ts b/packages/bundle/web-app/tests/startup.spec.ts index a00405378a..26e347a503 100644 --- a/packages/bundle/web-app/tests/startup.spec.ts +++ b/packages/bundle/web-app/tests/startup.spec.ts @@ -88,13 +88,13 @@ export const apply = ctx => globalThis.__webStartupApply(ctx) describe('web command-line provider', () => { it('publishes each flag and releases direct service expressions', async () => { const { values, observed } = await bootProvider([ - '--host', '0.0.0.0', + '--host', '127.0.0.1', '--port', '8080', '--trusted-host', 'lab.internal', 'lab-2.internal', '--trusted-host', '10.0.0.9', ]) expect(values).toEqual({ - host: '0.0.0.0', + host: '127.0.0.1', port: 8080, trustedHosts: ['lab.internal', 'lab-2.internal', '10.0.0.9'], }) @@ -128,4 +128,12 @@ describe('web command-line provider', () => { expect(observed.readerConfig).toBeUndefined() expect(observed.exits).toEqual([1]) }) + + it('rejects the intentionally unsupported all-interfaces host before the consumer activates', async () => { + const { values, observed } = await bootProvider(['--host', '0.0.0.0']) + expect(observed.out).toContain('--host 0.0.0.0 is intentionally not supported yet for safety: it would expose remote code execution to the network; use 127.0.0.1 instead') + expect(values).toBeUndefined() + expect(observed.readerConfig).toBeUndefined() + expect(observed.exits).toEqual([1]) + }) }) diff --git a/packages/client/connection/README.i18n.yaml b/packages/client/connection/README.i18n.yaml index 38c31ad05c..4745644cc5 100644 --- a/packages/client/connection/README.i18n.yaml +++ b/packages/client/connection/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/connection/README.md -README.md: 3315552dd0400697d5a96639598c5f5bb2bb4f5b -README.zh.md: 0dc251f1e5410bd0d74ef450c6d8df3dc9cdab81 +README.md: f0a707cc5f3a962c7852f7323c727d0a39a57b10 +README.zh.md: b529eebf9af93e36b6b92c19964678b7f5a04ea1 diff --git a/packages/client/connection/README.md b/packages/client/connection/README.md index 3315552dd0..f0a707cc5f 100644 --- a/packages/client/connection/README.md +++ b/packages/client/connection/README.md @@ -6,7 +6,7 @@ Wire consumer layer: the client plugin's apply mounts `ctx.connection` (shared a ## /api browser-trust fence -The node half guards every entry under `/api` before bridging or upgrading (`src/api-request-trust.ts`). Every request — browser-marked or not — must present a `Host` that is a loopback authority or matches a `trustedHosts` entry: exact on `host:port` entries, any port on port-less entries, both sides compared through WHATWG normalization (DNS-rebinding defense). There is deliberately no shortcut for unmarked HTTP requests: over plain HTTP a browser attaches neither `Origin` nor Fetch-Metadata to image and navigation reads, so an unmarked request may still be a rebound browser read with a readable response, and Host is the one header rebinding cannot forge; a browser WebSocket handshake carries `Origin` and passes the same comparison. Non-browser clients pass the same fence via loopback, the CLI-derived LAN IP literals, or a declared authority. When markers are present, an attached `Origin` must equal the Host authority, and an explicit `sec-fetch-site: cross-site` marker is refused. A `trustedHosts` entry that is not a bare, canonical `host[:port]` authority — one WHATWG parsing reads back exactly as written — fails the plugin load loudly: parsing would otherwise quietly authorize the hostname inside `harness.internal/path`, or broaden a dangling-colon or zero-padded port to an any-port grant. HTTP failures answer plain 403 before any RPC dispatch; upgrade failures reject the handshake before any event stream starts. A non-loopback (`--host 0.0.0.0`) deployment therefore needs its serving authorities trusted: the dsh CLI derives the machine's LAN IP literals itself and its `--trusted-host` flag declares named ones, so `trustedHosts` in cordis.yml is for compositions the CLI does not boot. The fence is a reachability policy, not authentication; the Web carrier provides no authentication layer. Decision record: [the api browser-trust boundary Agent Note](../../../.agents/notes/implemented/architecture/2026-07-28-api-browser-trust-boundary.md). +The node half guards every entry under `/api` before bridging or upgrading (`src/api-request-trust.ts`). Every request — browser-marked or not — must present a `Host` that is a loopback authority or matches a `trustedHosts` entry: exact on `host:port` entries, any port on port-less entries, both sides compared through WHATWG normalization (DNS-rebinding defense). There is deliberately no shortcut for unmarked HTTP requests: over plain HTTP a browser attaches neither `Origin` nor Fetch-Metadata to image and navigation reads, so an unmarked request may still be a rebound browser read with a readable response, and Host is the one header rebinding cannot forge; a browser WebSocket handshake carries `Origin` and passes the same comparison. Non-browser clients pass the same fence via loopback, deployment-derived LAN IP literals, or a declared authority. When markers are present, an attached `Origin` must equal the Host authority, and an explicit `sec-fetch-site: cross-site` marker is refused. A `trustedHosts` entry that is not a bare, canonical `host[:port]` authority — one WHATWG parsing reads back exactly as written — fails the plugin load loudly: parsing would otherwise quietly authorize the hostname inside `harness.internal/path`, or broaden a dangling-colon or zero-padded port to an any-port grant. HTTP failures answer plain 403 before any RPC dispatch; upgrade failures reject the handshake before any event stream starts. Non-loopback compositions must trust their serving authorities explicitly: the Web runtime derives LAN IP literals from an all-interfaces server config, while `trustedHosts` in cordis.yml and the CLI's `--trusted-host` flag declare named authorities. `dsh web --host 0.0.0.0` is intentionally unsupported until remote access has an authentication layer. The fence is a reachability policy, not authentication; the Web carrier provides no authentication layer. Decision record: [the api browser-trust boundary Agent Note](../../../.agents/notes/implemented/architecture/2026-07-28-api-browser-trust-boundary.md). ## `/api` WebSocket downlinks diff --git a/packages/client/connection/README.zh.md b/packages/client/connection/README.zh.md index 0dc251f1e5..b529eebf9a 100644 --- a/packages/client/connection/README.zh.md +++ b/packages/client/connection/README.zh.md @@ -6,7 +6,7 @@ ## /api �览器信任栅� -node �侧在桥接或 upgrade �守� `/api` 下的�个入�(`src/api-request-trust.ts`)。�个请求——无论是�带�览器标记——`Host` 都必须是回环地���,或与�个 `trustedHosts` �目匹�:带端�的 `host:port` �目精确匹�,�带端�的�目匹�任�端�,两侧�� WHATWG 归一化�比较(DNS rebinding 防御)。刻��为无�览器标记的 HTTP 请求开�径:明文 HTTP 下�览器的图片与导航读�既�带 `Origin` 也�带 Fetch-Metadata,因此无标记请求��能是被�绑页��起的��应�被读走的读�,而 Host 是�绑唯一伪造�了的请求头;WebSocket �览器�手会带 `Origin` 并通过�一�比较。��览器客户端�由回环地��CLI(命令行界�)推导的 LAN IP 字��或已声明的��通过�一�栅�。当标记存在时,如附带 `Origin`,则它必须与 Host ��完全一致;显�的 `sec-fetch-site: cross-site` 标记一律拒�。�是纯的�规范形 `host[:port]` ��的 `trustedHosts` �目——� WHATWG 解�读回�与原文�完全一致的——会让�件加载明确报错:�则解�会悄悄授� `harness.internal/path` 这类笔误里的 hostname,或把悬空冒��补零端�放大�任�端�授�。HTTP 失败在任何 RPC 分�之�以纯 403 应答,upgrade 失败在�动任何事件��拒��手。因此�回环(`--host 0.0.0.0`)部署需�让自己的�务��被信任:dsh CLI 会自行推导本机的 LAN IP 字��,其 `--trusted-host` flag 用于声明具���,所以 cordis.yml 中的 `trustedHosts` �� CLI ��与引导的组�。这�栅�是�达性策略,而�是认�;Web 载体��供认�层。决策记录:[api �览器信任边界 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-28-api-browser-trust-boundary.md)。 +node �侧在桥接或 upgrade �守� `/api` 下的�个入�(`src/api-request-trust.ts`)。�个请求——无论是�带�览器标记——`Host` 都必须是回环地���,或与�个 `trustedHosts` �目匹�:带端�的 `host:port` �目精确匹�,�带端�的�目匹�任�端�,两侧�� WHATWG 归一化�比较(DNS rebinding 防御)。刻��为无�览器标记的 HTTP 请求开�径:明文 HTTP 下�览器的图片与导航读�既�带 `Origin` 也�带 Fetch-Metadata,因此无标记请求��能是被�绑页��起的��应�被读走的读�,而 Host 是�绑唯一伪造�了的请求头;WebSocket �览器�手会带 `Origin` 并通过�一�比较。��览器客户端�由回环地��部署推导的 LAN IP 字��或已声明的��通过�一�栅�。当标记存在时,如附带 `Origin`,则它必须与 Host ��完全一致;显�的 `sec-fetch-site: cross-site` 标记一律拒�。�是纯的�规范形 `host[:port]` ��的 `trustedHosts` �目——� WHATWG 解�读回�与原文�完全一致的——会让�件加载明确报错:�则解�会悄悄授� `harness.internal/path` 这类笔误里的 hostname,或把悬空冒��补零端�放大�任�端�授�。HTTP 失败在任何 RPC 分�之�以纯 403 应答,upgrade 失败在�动任何事件��拒��手。�回环组�必须显�信任其�务��:Web �行时从全接��务器�置推导 LAN IP 字��,cordis.yml 中的 `trustedHosts` 与 CLI(命令行界�)的 `--trusted-host` flag 则声明具���。`dsh web --host 0.0.0.0` 在远程访问具备认�层之�有���支�。这�栅�是�达性策略,而�是认�;Web 载体��供认�层。决策记录:[api �览器信任边界 Agent Note](../../../.agents/notes/implemented/architecture/2026-07-28-api-browser-trust-boundary.md)。 ## `/api` WebSocket 下行 diff --git a/packages/client/connection/package.json b/packages/client/connection/package.json index 537e3817cd..00d4e6da21 100644 --- a/packages/client/connection/package.json +++ b/packages/client/connection/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-connection", "description": "Wire consumer layer: HTTP-up/WebSocket-down client, ConnectionController dual streams with reconnect, and fixture api", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -36,7 +36,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", "@deepseek-ai/dsh-host-apiproxy": "workspace:^", diff --git a/packages/client/connection/src/api-request-trust.ts b/packages/client/connection/src/api-request-trust.ts index 141092c63b..ea8914ccc6 100644 --- a/packages/client/connection/src/api-request-trust.ts +++ b/packages/client/connection/src/api-request-trust.ts @@ -7,8 +7,8 @@ * nor Fetch-Metadata to reads (images and navigations — those * headers go only to trustworthy destinations), so an unmarked request may * still be a rebound browser read and Host is the one header rebinding cannot - * forge. Non-browser and remote clients pass the same fence via loopback, the - * CLI-derived LAN IP literals, or a declared `trustedHosts` authority. + * forge. Non-browser and remote clients pass the same fence via loopback, + * deployment-derived LAN IP literals, or a declared `trustedHosts` authority. * Network reachability and authentication stay out of scope: binding policy * belongs to the webserver config, and this fence is not an auth layer. */ diff --git a/packages/client/connection/tests/node-half.host.spec.ts b/packages/client/connection/tests/node-half.host.spec.ts index 6c8b42b5ab..0b30ce6520 100644 --- a/packages/client/connection/tests/node-half.host.spec.ts +++ b/packages/client/connection/tests/node-half.host.spec.ts @@ -199,8 +199,8 @@ describe('connection node half', () => { const loopback = fakeResponse() await routes[0]!.handler(fakeRequest({ host: '127.0.0.1:3080' }), loopback.response) expect(loopback.state.status).toBe(404) - // LAN authority declared as a port-less IP literal — the shape the CLI - // derives for `--host 0.0.0.0` — passes markerless curl on any port. + // An all-interfaces composition derives port-less LAN IP literals, which + // pass markerless curl on any port. const lan = fakeResponse() await routes[0]!.handler(fakeRequest({ host: '192.168.1.5:3080' }), lan.response) expect(lan.state.status).toBe(404) diff --git a/packages/client/hmr/package.json b/packages/client/hmr/package.json index 4190458443..f1ab0c4044 100644 --- a/packages/client/hmr/package.json +++ b/packages/client/hmr/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-hmr", "description": "Dev-only hot-reload driver for script-loaded client entries: SSE rebuilt frames → invalidate/prefetch → fiber swap through the vendored Loader entry", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -36,7 +36,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/client/locale/package.json b/packages/client/locale/package.json index 4aa1561131..0184f72d18 100644 --- a/packages/client/locale/package.json +++ b/packages/client/locale/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-locale", "description": "Locale plugin: Host-backed zh/en preference, browser-derived fallback, locale snapshots, and typed namespace dictionaries", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -41,7 +41,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/modules/package.json b/packages/client/modules/package.json index a18247368f..dd45276a7a 100644 --- a/packages/client/modules/package.json +++ b/packages/client/modules/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-modules", "description": "Client module system, dual-face: node half composes the __DSH_BOOT__ entry graph (incremental dsh.client scan, bundle route, index tap, webPlugins service); browser half is the lazy-CJS module table the vendored cordis Loader consumes as its internal seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -40,7 +40,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "devDependencies": { "@deepseek-ai/cordis-plugin-loader": "workspace:^", "@deepseek-ai/dsh-host-webserver": "workspace:^", diff --git a/packages/client/runtime/package.json b/packages/client/runtime/package.json index 36aeaa4bf2..1da3ac6428 100644 --- a/packages/client/runtime/package.json +++ b/packages/client/runtime/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-runtime", "description": "Client core services: SlotRegistry, SessionRuntime (scope tree + object layer)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -40,7 +40,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-agent": "workspace:^", "@deepseek-ai/dsh-attachment": "workspace:^", diff --git a/packages/client/schema-form/package.json b/packages/client/schema-form/package.json index fca815aae0..e8e3a0228a 100644 --- a/packages/client/schema-form/package.json +++ b/packages/client/schema-form/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-schema-form", "description": "Schema/draft model layer for settings editors: rehydrates a serialized schemastery schema, validates drafts, and edits them immutably by path", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/schemastery": "workspace:^" }, diff --git a/packages/client/ui-agent-preset/package.json b/packages/client/ui-agent-preset/package.json index 418e6642e7..f705158d1e 100644 --- a/packages/client/ui-agent-preset/package.json +++ b/packages/client/ui-agent-preset/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-agent-preset", "description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-agent-preset/src/client/locales.ts b/packages/client/ui-agent-preset/src/client/locales.ts index 54acc298a1..de19803a29 100644 --- a/packages/client/ui-agent-preset/src/client/locales.ts +++ b/packages/client/ui-agent-preset/src/client/locales.ts @@ -37,7 +37,7 @@ export const en: Record = { presetStandardName: 'Standard mode', presetStandardDescription: 'Full coding agent with file editing, shell, file and web search, skills, planning, goals, subagents, and workflows.', - presetCodeName: 'Code mode', + presetCodeName: 'PTC mode', presetCodeDescription: 'All Standard mode capabilities, with tools exposed through the Code Mode SDK so the model can combine multi-step operations in one TypeScript program.', presetMinimalName: 'Minimal mode', diff --git a/packages/client/ui-agent-preset/src/client/settings-store.ts b/packages/client/ui-agent-preset/src/client/settings-store.ts index 4f4e26bdf8..9589d5c2bb 100644 --- a/packages/client/ui-agent-preset/src/client/settings-store.ts +++ b/packages/client/ui-agent-preset/src/client/settings-store.ts @@ -216,7 +216,7 @@ export class AgentPresetSettingsController { // The roster says what may be chosen; `settings.describe` says whether // this browser may write the choice down. A non-loopback browser reaches // neither method, so a refused describe leaves the row read-only rather - // than offering a control whose write answers `settings-not-exposed`. + // than offering a control whose write the Host would refuse. const described = await this.api.settings.describe({}) this.set({ status: 'ready', diff --git a/packages/client/ui-agent-preset/tests/settings-store.client.spec.ts b/packages/client/ui-agent-preset/tests/settings-store.client.spec.ts index 0a98138233..54fd600a60 100644 --- a/packages/client/ui-agent-preset/tests/settings-store.client.spec.ts +++ b/packages/client/ui-agent-preset/tests/settings-store.client.spec.ts @@ -67,8 +67,8 @@ describe('the agent-preset settings controller', () => { await controller.load() // `settings.describe` is loopback-only and reports a read-only provider; - // offering a control whose write answers `settings-not-exposed` would - // promise a switch the host refuses. + // offering a control whose write answers `settings-rejected` would promise + // a switch the host refuses. expect(controller.store.getSnapshot().writable).toBe(false) expect(controller.store.getSnapshot().currentValue).toBe('standard') }) diff --git a/packages/client/ui-attachment/package.json b/packages/client/ui-attachment/package.json index 837353dc5b..c257166e2a 100644 --- a/packages/client/ui-attachment/package.json +++ b/packages/client/ui-attachment/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-attachment", "description": "Pure React attachment atoms for the dsh web UI: draft-image rail, message image gallery, and original-image lightbox (zero cordis)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-attachment": "workspace:^", "@deepseek-ai/dsh-client-ui-primitives": "workspace:^", diff --git a/packages/client/ui-commands/package.json b/packages/client/ui-commands/package.json index 9b55563f85..cf80e20f3f 100644 --- a/packages/client/ui-commands/package.json +++ b/packages/client/ui-commands/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-commands", "description": "Client command surface: global directory cache, '/' source, three command UI kinds, popupSelect registry", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -45,7 +45,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-conversation/README.i18n.yaml b/packages/client/ui-conversation/README.i18n.yaml index 954ba5d7af..6d866e05e7 100644 --- a/packages/client/ui-conversation/README.i18n.yaml +++ b/packages/client/ui-conversation/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-conversation/README.md -README.md: ecf463da619662fe158511079e7773ee3c627ac8 -README.zh.md: f8922b160cdc6feca94dea998163c25d803a5535 +README.md: d1a265b5789d9f1d9b5e630e0548ae5f619eebbf +README.zh.md: 3f303391d39bc040b4a6a5a2d1f6a34fe8891919 diff --git a/packages/client/ui-conversation/README.md b/packages/client/ui-conversation/README.md index ecf463da61..d1a265b578 100644 --- a/packages/client/ui-conversation/README.md +++ b/packages/client/ui-conversation/README.md @@ -6,7 +6,7 @@ Conversation domain: skeleton (header/tabs/composer/empty state), chat view (gro Compaction renders as one collapsed row at the checkpoint's flow position without replacing the transcript above it. Automatic compaction uses the context-compacted title. Every completed marker with a loaded `compaction/summary` event shows the replaced-item and estimated-token counts and discloses the summary on click. Manual `/compact` starts as a running `compact` row; on successful settlement its explicit summary-event reference folds that command into the checkpoint row under the same React key. A completed checkpoint keeps the context-compaction icon at rest and replaces it with the collapsed or expanded disclosure only on hover or keyboard focus. Input rejection, no compactable history, cancellation, and failure retain the generic command row and its handler-authored text. Pairing never depends on adjacency because durable context may be injected while compaction is running. The framed checkpoint payload is model-facing and never renders; when the cited `compaction/summary` event is outside the loaded window, the checkpoint remains visible but non-expandable. -The resident conversation shell survives no-session and session transitions. Without a current session it locks message actions and presents the whole dashed composer card as a trigger for the root-scoped `conversation.hero.workspace` Workspace picker; the textarea remains read-only and keyboard-accessible. Selecting a Workspace connects or reuses its Host-owned blank session and opens that session without replacing the shell. The root always owns the same scrollport and Hero/composer subtree; separate strict-session header and body outlets fill their regions when the first Session arrives, so the Workspace picker, scroll body, composer seat, and textarea retain their React and DOM identity. Blank sessions render the same composer body as active sessions, while the InputHub carries drafts across Workspace switches and mirrors them into the session store. In the active phase the session header shows only the current session title and view tabs as ordinary column chrome; fork lineage remains session data and is not projected into the header. Beneath it the scrollport (`data-conversation-scroll`) holds the flowing views and the sticky composer stack (stats dock + input docks + bar). That scrollport reserves its scrollbar gutter unconditionally, and a view opting into a composer overlay leaves it a scroll container, so the input card keeps one horizontal position whether or not the transcript scrolls and whichever view tab is shown ([decision](../../../.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md)). Wheel over the textarea chains: the capped draft scrolls locally until its edge, then forwards to that host. +The resident conversation shell survives no-session and session transitions. Without a current session it locks message actions and presents the whole dashed composer card as a trigger for the root-scoped `conversation.hero.workspace` Workspace picker; the textarea remains read-only and keyboard-accessible. Selecting a Workspace connects or reuses its Host-owned blank session and opens that session without replacing the shell. The root always owns the same scrollport and Hero/composer subtree; separate strict-session header and body outlets fill their regions when the first Session arrives, so the Workspace picker, scroll body, composer seat, and textarea retain their React and DOM identity. Blank sessions render the same composer body as active sessions, while the InputHub carries drafts across Workspace switches and mirrors them into the session store. In the active phase the session header shows only the current session title and view tabs as ordinary column chrome; fork lineage remains session data and is not projected into the header. Beneath it the scrollport (`data-conversation-scroll`) holds the flowing views and the sticky composer stack (stats dock + input docks + bar). That scrollport reserves its scrollbar gutter unconditionally, and a view opting into a composer overlay leaves it a scroll container, so the input card keeps one horizontal position whether or not the transcript scrolls and whichever view tab is shown ([decision](../../../.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md)). Wheel over the textarea chains: the capped draft scrolls locally until its edge, then forwards to that host. Safari alone receives a pre-paint recovery when a native edit shortens the draft and leaves stale soft-wrap overflow; draft growth, programmatic updates, and other browsers never read layout for that recovery ([decision](../../../.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.md)). Another plugin can make one session's composer inert through `ctx.conversation.blocks`: it sets a block carrying its own localized reason, and the bar renders the same disabled textarea with that reason as the placeholder — the no-workspace posture, reused. The push direction is the constraint, not a preference: the plugins that know a session cannot send (ui-model-selection, when no adapter serves its route) already depend on this package, so this package cannot read them. The model seat is the one control a block leaves live — every block this contract has is cleared by choosing a model, so locking it too would leave the composer asking for the only thing it prevents. A block is an affordance only; the Host refuses a prompt it cannot route regardless of what any client disables. The no-workspace state wins when both hold, because picking a workspace is the earlier prerequisite. diff --git a/packages/client/ui-conversation/README.zh.md b/packages/client/ui-conversation/README.zh.md index f8922b160c..3f303391d3 100644 --- a/packages/client/ui-conversation/README.zh.md +++ b/packages/client/ui-conversation/README.zh.md @@ -6,7 +6,7 @@ 压缩(compaction)在检查点自身的消���置渲染为一行折�标记,�替�其上方的 transcript(文本记录)。自动压缩使用「上下文已压缩�标题。�个已加载对应 `compaction/summary` 事件的完�标记都会显示被替��目数�和估算 token 数�,并�点击展开摘�。手动 `/compact` 开始时显示为�行中的 `compact` 行;�功结算�,其显�摘�事件引用会在���一 React key 的��下把该命令折�进检查点行。完�的检查点�止时�留上下文压缩(context compaction)图标,仅在悬�或键盘�焦时将其替�为收起�展开指示图标。输入被拒��没有�压缩历���消和失败时�使用通用命令行�处�器撰写的文本。�对���赖相邻关系,因为压缩�行期间�能注入�久上下文。��模型的带框检查点载���渲染;被引用的 `compaction/summary` 事件�于已加载窗�之外时,检查点�然��但��展开。 -常驻会�壳会跨无会�与会�状�切�而�留。没有当�会�时,它会�定消��作,并让整张虚线编辑器�片�为根作用域 `conversation.hero.workspace` Workspace picker 的入�;textarea ���读且支�键盘�作。选择 Workspace 会连接或�用由 Host 拥有的空白会�,并在�替�会�壳的情况下打开该会�。根组件始终拥有�一个滚动容器与 Hero�编辑器�树;首个会�到达时,彼此独立的严格会�页头和主体 outlet �填入�自区域,因此 Workspace picker�滚动主体�编辑器 seat 与 textarea 都�留原有 React 和 DOM identity。空白会�与活跃会�渲染相�的输入区主体;InputHub 则在 Workspace 切�间�带�稿,并将�稿镜�到会� store。活跃阶段,会�标题�作为普通列 chrome,仅显示当�会�标题和视图标签;fork 谱系��留为会�数�,�投影到标题�。其下滚动容器(`data-conversation-scroll`)承载�动排版的�视图与 sticky 编辑器栈(统计 dock+输入区 dock+输入�)。该滚动容器无�件预留自己的滚动�槽,选用编辑器 overlay 的视图也�把它�留为滚动容器,因此无论对�记录是�滚动�无论展示哪个视图标签,输入�片都���一个横��置([决策](../../../.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md))。textarea 上的滚轮会链�处�:�高�稿先在本地滚动,到达边缘��转交给该宿主。 +常驻会�壳会跨无会�与会�状�切�而�留。没有当�会�时,它会�定消��作,并让整张虚线编辑器�片�为根作用域 `conversation.hero.workspace` Workspace picker 的入�;textarea ���读且支�键盘�作。选择 Workspace 会连接或�用由 Host 拥有的空白会�,并在�替�会�壳的情况下打开该会�。根组件始终拥有�一个滚动容器与 Hero�编辑器�树;首个会�到达时,彼此独立的严格会�页头和主体 outlet �填入�自区域,因此 Workspace picker�滚动主体�编辑器 seat 与 textarea 都�留原有 React 和 DOM identity。空白会�与活跃会�渲染相�的输入区主体;InputHub 则在 Workspace 切�间�带�稿,并将�稿镜�到会� store。活跃阶段,会�标题�作为普通列 chrome,仅显示当�会�标题和视图标签;fork 谱系��留为会�数�,�投影到标题�。其下滚动容器(`data-conversation-scroll`)承载�动排版的�视图与 sticky 编辑器栈(统计 dock+输入区 dock+输入�)。该滚动容器无�件预留自己的滚动�槽,选用编辑器 overlay 的视图也�把它�留为滚动容器,因此无论对�记录是�滚动�无论展示哪个视图标签,输入�片都���一个横��置([决策](../../../.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md))。textarea 上的滚轮会链�处�:�高�稿先在本地滚动,到达边缘��转交给该宿主。�有 Safari 会在原生编辑缩短�稿并留下陈旧软�行溢出时执行绘制���;�稿增长�程�化更新与其他�览器都�会为这项��读�布局([决策](../../../.agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.md))。 别的�件�以� `ctx.conversation.blocks` 让�个会�的编辑器�为惰性:它设置一个�带自己本地化�由的 block,输入�就渲染�一个�用的 textarea,并把该�由作为 placeholder——�用无 Workspace 时的那套姿�。推�方�是约�而��好:知��会���出消�的�件(ui-model-selection,在没有适�器�务其路由时)本就�赖本包,因此本包读�到它们。模型 seat 是 block 唯一�留�用的控件——这份约定里的�个 block 都�选模型�解除,把它一起�上会让编辑器索�它自己拦下的那件事。block �是�示性设计;无论客户端�用了什么,宿主都会拒�一个它无法路由的�示�。两者�时�立时以无 Workspace 姿�为准,因为选 Workspace 是更��的��。 diff --git a/packages/client/ui-conversation/package.json b/packages/client/ui-conversation/package.json index 608817a1e8..2fc12605c1 100644 --- a/packages/client/ui-conversation/package.json +++ b/packages/client/ui-conversation/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-conversation", "description": "Conversation domain: skeleton, ordered chat flow, composer with the Host-backed busy-Enter preference, and details host", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", "clsx": "^2.0.0", diff --git a/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css b/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css index 6a8eb15559..6146d42810 100644 --- a/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css +++ b/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css @@ -272,12 +272,17 @@ .scrollBody:has([data-conversation-composer-overlay]) { position: relative; /* A clipping box nothing scrolls out of, stated as a scroll container on both - axes rather than `overflow: hidden`: WebKit honours the reservation above - only in the `overflow-y: auto` form, and a single-axis scroller computes - the other axis to `auto` - ([decision](../../../../../../.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md)). */ + axes rather than `overflow: hidden`: a single-axis scroller computes the + other axis to `auto`, and the seat's absolute positioning below needs the + box to stay a containing block in every engine. */ overflow-x: hidden; overflow-y: auto; + /* The view owns its own scrollers (the trajectory ledger scrolls inside the + view), so this box never scrolls here; reserving a gutter would only + narrow the view's content by the bar's width. Chat keeps the reservation + on the same element, so the seat below compensates with the bar's width + ([decision](../../../../../../.agents/notes/implemented/bug-fix/2026-08-04-composer-tab-gutter-reservation.md)). */ + scrollbar-gutter: auto; } .scrollBody:has([data-conversation-composer-overlay]) > :global([data-slot='conversation.session']) > .viewArea { @@ -288,7 +293,15 @@ .scrollBody:has([data-conversation-composer-overlay]) > .composerSeat { position: absolute; - right: 0; + /* Chat's seat rides this box's content box, which its own scrolling shortens + by the bar's width; the overlay seat is against the padding box, so it + must give back the same width to keep the input card in place across + tabs. Reads ui-theme's --dsh-scrollbar-width, which mirrors the WebKit + bar's layout width. Chat reserves the engine-resolved width, so on an + engine where the resolved width differs from this fixed 8px the card + drifts by half the difference — accepted residual risk, recorded in + ([decision](../../../../../../.agents/notes/implemented/bug-fix/2026-08-12-composer-overlay-seat-width-compensation.md)). */ + right: var(--dsh-scrollbar-width); bottom: 0; left: 0; } diff --git a/packages/client/ui-conversation/src/client/skeleton/InputBar.tsx b/packages/client/ui-conversation/src/client/skeleton/InputBar.tsx index 9585677ae3..000174f513 100644 --- a/packages/client/ui-conversation/src/client/skeleton/InputBar.tsx +++ b/packages/client/ui-conversation/src/client/skeleton/InputBar.tsx @@ -6,7 +6,7 @@ * region-slot content) ride the owner props. Session facts * (running/removed/promptError) are self-selected via useSession. */ -import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react' import type { ChangeEvent, KeyboardEvent, MouseEvent, ReactNode } from 'react' import clsx from 'clsx' import { @@ -31,6 +31,7 @@ import { } from '../image-labels.ts' import { ContextMeter } from './ContextMeter.tsx' import { PermissionSelect } from './PermissionSelect.tsx' +import { isSafariBrowser, repairSafariTextareaLayout } from './safari.ts' import css from './InputBar.module.css' /** Decoration product of the no-session state (no machine, empty draft). */ @@ -106,6 +107,8 @@ export function InputBar({ const dragDepthRef = useRef(0) const scrollRef = useRef(null) const mirrorRef = useRef(null) + const safari = useMemo(() => isSafariBrowser(navigator), []) + const safariNativeShrinkRef = useRef(false) // IME guard: composition Enter picks a candidate, it must not send. The ref outlives renders; // clearing is deferred one tick because Safari delivers the closing keydown AFTER compositionend. const composingRef = useRef(false) @@ -154,6 +157,18 @@ export function InputBar({ } }, [attachments, input?.imageIds, inputActions]) + // A native Safari edit that shortens the draft may leave the previous + // soft-wrap layout behind after the mirror shrinks. The native-change signal + // keeps ordinary typing and programmatic draft updates from reading layout; + // the helper then repairs only measured overflow before paint while + // preserving native editing state. See + // .agents/notes/implemented/bug-fix/2026-08-13-safari-textarea-soft-wrap-reflow.md. + useLayoutEffect(() => { + const nativeShrink = safariNativeShrinkRef.current + safariNativeShrinkRef.current = false + if (safari && nativeShrink) repairSafariTextareaLayout(inputRef.current) + }, [draft, safari]) + useEffect(() => { if (preview !== null && !attachments.some(attachment => attachment.id === preview.id)) setPreview(null) }, [attachments, preview]) @@ -343,6 +358,7 @@ export function InputBar({ if (keyboard === undefined || locked) return // disabled/read-only states cannot edit the draft if (machineBusy) return // submitting is the read-only span; adjudicating holds the pending lock const next = e.target.value + safariNativeShrinkRef.current = safari && next.length < draft.length keyboard.setDraft(next) // selectionStart is number|null in lib.dom; the type-aware lint program narrows it. // oxlint-disable-next-line typescript/no-unnecessary-condition diff --git a/packages/client/ui-conversation/src/client/skeleton/safari.ts b/packages/client/ui-conversation/src/client/skeleton/safari.ts new file mode 100644 index 0000000000..d563b25e6c --- /dev/null +++ b/packages/client/ui-conversation/src/client/skeleton/safari.ts @@ -0,0 +1,42 @@ +/** Safari-specific textarea layout recovery for the conversation composer. */ + +/** Browser identity fields needed to distinguish Safari from other WebKit-based browsers. */ +export interface BrowserIdentity { + readonly userAgent: string + readonly vendor: string +} + +const ALTERNATE_IOS_BROWSER = /\b(?:CriOS|FxiOS|EdgiOS|OPiOS|OPT|DuckDuckGo|Brave)(?:\/|\b)/ + +/** + * Detect Safari's `Version/... Safari/...` form while excluding known alternate iOS browser tokens. + * @param identity - Browser user-agent and vendor values. + * @returns Whether the identity should use the Safari-specific recovery. + */ +export function isSafariBrowser(identity: BrowserIdentity): boolean { + return identity.vendor === 'Apple Computer, Inc.' + && /\bVersion\/[\d.]+.*\bSafari\/[\d.]+/.test(identity.userAgent) + && !ALTERNATE_IOS_BROWSER.test(identity.userAgent) +} + +/** + * Repair Safari's stale native textarea layout and the scrollport auto height it can contaminate. + * @param input - Composer textarea whose own scrollable overflow must stay zero. + */ +export function repairSafariTextareaLayout(input: HTMLTextAreaElement | null): void { + if (input === null || input.scrollHeight <= input.clientHeight) return + const scrollport = input.closest('[data-input-scroll]') + if (scrollport === null) return + + const inputHeight = input.style.height + input.style.height = `${String(input.clientHeight + 1)}px` + void input.offsetHeight + input.style.height = inputHeight + void input.offsetHeight + + const scrollportHeight = scrollport.style.height + scrollport.style.height = `${String(scrollport.clientHeight + 1)}px` + void scrollport.offsetHeight + scrollport.style.height = scrollportHeight + void scrollport.offsetHeight +} diff --git a/packages/client/ui-conversation/tests/input-bar.client.spec.tsx b/packages/client/ui-conversation/tests/input-bar.client.spec.tsx index 94354bd316..f7d5e02a7f 100644 --- a/packages/client/ui-conversation/tests/input-bar.client.spec.tsx +++ b/packages/client/ui-conversation/tests/input-bar.client.spec.tsx @@ -824,6 +824,116 @@ describe('running and lock semantics', () => { expect(backdrop.textContent).toBe('line\n'.repeat(40)) }) + it('repairs Safari native overflow after the mirror shrinks the draft', () => { + const vendor = vi.spyOn(window.navigator, 'vendor', 'get').mockReturnValue('Apple Computer, Inc.') + const userAgent = vi.spyOn(window.navigator, 'userAgent', 'get').mockReturnValue( + 'Mozilla/5.0 (Macintosh) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5 Safari/605.1.15', + ) + onTestFinished(() => { + vendor.mockRestore() + userAgent.mockRestore() + }) + const { textarea } = bench({ draft: 'two wrapped lines' }) + const scrollport = textarea.closest('[data-input-scroll]')! + let inputRepaired = false + let scrollportRepaired = false + const inputLayouts: string[] = [] + const scrollportLayouts: string[] = [] + Object.defineProperty(textarea, 'clientHeight', { + configurable: true, + get: () => textarea.style.height === '29px' ? 29 : 28, + }) + Object.defineProperty(textarea, 'scrollHeight', { + configurable: true, + get: () => inputRepaired ? 28 : 52, + }) + Object.defineProperty(textarea, 'offsetHeight', { + configurable: true, + get: () => { + inputLayouts.push(textarea.style.height) + if (textarea.style.height === '') inputRepaired = true + return textarea.clientHeight + }, + }) + Object.defineProperty(scrollport, 'clientHeight', { + configurable: true, + get: () => { + if (scrollport.style.height === '53px') return 53 + if (inputRepaired && !scrollportRepaired) return 52 + return 28 + }, + }) + Object.defineProperty(scrollport, 'offsetHeight', { + configurable: true, + get: () => { + scrollportLayouts.push(scrollport.style.height) + if (scrollport.style.height === '') scrollportRepaired = true + return scrollport.clientHeight + }, + }) + textarea.setSelectionRange(5, 5) + + fireEvent.change(textarea, { target: { value: 'one line' } }) + + expect(inputLayouts).toEqual(['29px', '']) + expect(scrollportLayouts).toEqual(['53px', '']) + expect(textarea.style.height).toBe('') + expect(scrollport.style.height).toBe('') + expect(textarea.scrollHeight).toBe(textarea.clientHeight) + expect(scrollport.clientHeight).toBe(28) + }) + + it('does not force the Safari recovery for another iOS browser', () => { + const vendor = vi.spyOn(window.navigator, 'vendor', 'get').mockReturnValue('Apple Computer, Inc.') + const userAgent = vi.spyOn(window.navigator, 'userAgent', 'get').mockReturnValue( + 'Mozilla/5.0 (iPhone) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/140.0.0.0 Mobile/15E148 Safari/604.1', + ) + onTestFinished(() => { + vendor.mockRestore() + userAgent.mockRestore() + }) + const { textarea } = bench({ draft: 'two wrapped lines' }) + const scrollport = textarea.closest('[data-input-scroll]')! + Object.defineProperty(textarea, 'clientHeight', { configurable: true, value: 28 }) + Object.defineProperty(textarea, 'scrollHeight', { configurable: true, value: 52 }) + Object.defineProperty(textarea, 'offsetHeight', { + configurable: true, + get: () => { throw new Error('non-Safari browser must not force textarea layout') }, + }) + Object.defineProperty(scrollport, 'offsetHeight', { + configurable: true, + get: () => { throw new Error('non-Safari browser must not force scrollport layout') }, + }) + + fireEvent.change(textarea, { target: { value: 'one line' } }) + + expect(scrollport.style.height).toBe('') + }) + + it('does not read Safari layout while a native edit grows the draft', () => { + const vendor = vi.spyOn(window.navigator, 'vendor', 'get').mockReturnValue('Apple Computer, Inc.') + const userAgent = vi.spyOn(window.navigator, 'userAgent', 'get').mockReturnValue( + 'Mozilla/5.0 (Macintosh) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5 Safari/605.1.15', + ) + onTestFinished(() => { + vendor.mockRestore() + userAgent.mockRestore() + }) + const { textarea, shell } = bench({ draft: 'one line' }) + Object.defineProperty(textarea, 'clientHeight', { + configurable: true, + get: () => { throw new Error('growing Safari input must not read layout') }, + }) + Object.defineProperty(textarea, 'scrollHeight', { + configurable: true, + get: () => { throw new Error('growing Safari input must not read layout') }, + }) + + fireEvent.change(textarea, { target: { value: 'one line grows' } }) + + expect(shell.snapshot.draft).toBe('one line grows') + }) + it('an edit the composer performs itself scrolls the caret back into view', async () => { // Paste and cut suppress the native edit, so no engine reveals the caret // for them. jsdom has no layout: the rects are stubbed, diff --git a/packages/client/ui-conversation/tests/safari.client.spec.ts b/packages/client/ui-conversation/tests/safari.client.spec.ts new file mode 100644 index 0000000000..895680d693 --- /dev/null +++ b/packages/client/ui-conversation/tests/safari.client.spec.ts @@ -0,0 +1,131 @@ +// @vitest-environment jsdom + +import { describe, expect, it } from 'vitest' +import { isSafariBrowser, repairSafariTextareaLayout } from '../src/client/skeleton/safari.ts' + +describe('Safari browser detection', () => { + it.each([ + { + name: 'desktop Safari', + vendor: 'Apple Computer, Inc.', + userAgent: 'Mozilla/5.0 (Macintosh) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.5 Safari/605.1.15', + expected: true, + }, + { + name: 'mobile Safari', + vendor: 'Apple Computer, Inc.', + userAgent: 'Mozilla/5.0 (iPhone) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1', + expected: true, + }, + { + name: 'desktop Chromium', + vendor: 'Google Inc.', + userAgent: 'Mozilla/5.0 (Macintosh) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36', + expected: false, + }, + { + name: 'Chrome on iOS', + vendor: 'Apple Computer, Inc.', + userAgent: 'Mozilla/5.0 (iPhone) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/140.0.0.0 Mobile/15E148 Safari/604.1', + expected: false, + }, + { + name: 'Edge on iOS with Safari tokens', + vendor: 'Apple Computer, Inc.', + userAgent: 'Mozilla/5.0 (iPhone) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 EdgiOS/140.0 Mobile/15E148 Safari/604.1', + expected: false, + }, + { + name: 'Opera on iOS with Safari tokens', + vendor: 'Apple Computer, Inc.', + userAgent: 'Mozilla/5.0 (iPhone) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 OPiOS/6.0 Mobile/15E148 Safari/604.1', + expected: false, + }, + { + name: 'Apple web view', + vendor: 'Apple Computer, Inc.', + userAgent: 'Mozilla/5.0 (iPhone) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148', + expected: false, + }, + ])('identifies $name', ({ vendor, userAgent, expected }) => { + expect(isSafariBrowser({ vendor, userAgent })).toBe(expected) + }) +}) + +describe('Safari textarea layout recovery', () => { + it('does nothing while the textarea owns no scrollable overflow', () => { + const input = document.createElement('textarea') + Object.defineProperty(input, 'clientHeight', { value: 28 }) + Object.defineProperty(input, 'scrollHeight', { value: 28 }) + + repairSafariTextareaLayout(input) + + expect(input.style.height).toBe('') + }) + + it('invalidates a stale native layout and restores the owned height', () => { + const input = document.createElement('textarea') + const scrollport = document.createElement('div') + scrollport.setAttribute('data-input-scroll', '') + scrollport.appendChild(input) + input.value = 'abcdef' + input.setSelectionRange(3, 3) + input.style.height = '100%' + scrollport.style.height = '100%' + let inputRepaired = false + let scrollportRepaired = false + const inputLayouts: string[] = [] + const scrollportLayouts: string[] = [] + Object.defineProperty(input, 'clientHeight', { + get: () => input.style.height === '29px' ? 29 : 28, + }) + Object.defineProperty(input, 'scrollHeight', { + get: () => inputRepaired ? 28 : 52, + }) + Object.defineProperty(input, 'offsetHeight', { + get: () => { + inputLayouts.push(input.style.height) + if (input.style.height === '100%') inputRepaired = true + return input.clientHeight + }, + }) + Object.defineProperty(scrollport, 'clientHeight', { + get: () => { + if (scrollport.style.height === '53px') return 53 + if (inputRepaired && !scrollportRepaired) return 52 + return 28 + }, + }) + Object.defineProperty(scrollport, 'offsetHeight', { + get: () => { + scrollportLayouts.push(scrollport.style.height) + if (scrollport.style.height === '100%') scrollportRepaired = true + return scrollport.clientHeight + }, + }) + + repairSafariTextareaLayout(input) + + expect(inputLayouts).toEqual(['29px', '100%']) + expect(scrollportLayouts).toEqual(['53px', '100%']) + expect(input.style.height).toBe('100%') + expect(scrollport.style.height).toBe('100%') + expect(input.scrollHeight).toBe(input.clientHeight) + expect(scrollport.clientHeight).toBe(28) + expect([input.selectionStart, input.selectionEnd]).toEqual([3, 3]) + }) + + it('does nothing outside the composer scrollport', () => { + const input = document.createElement('textarea') + Object.defineProperty(input, 'clientHeight', { value: 28 }) + Object.defineProperty(input, 'scrollHeight', { value: 52 }) + + repairSafariTextareaLayout(input) + + expect(input.style.height).toBe('') + }) + + it('accepts an absent textarea during teardown', () => { + expect(() => { repairSafariTextareaLayout(null) }).not.toThrow() + }) +}) diff --git a/packages/client/ui-deliverables/package.json b/packages/client/ui-deliverables/package.json index ecac18c55f..ac7f264f62 100644 --- a/packages/client/ui-deliverables/package.json +++ b/packages/client/ui-deliverables/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-deliverables", "description": "Produced-files turn tail and clickable final-response file references for Web", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "react": "^18.2.0" }, diff --git a/packages/client/ui-directory-picker-browse/package.json b/packages/client/ui-directory-picker-browse/package.json index a63fe3038a..0cc14700fc 100644 --- a/packages/client/ui-directory-picker-browse/package.json +++ b/packages/client/ui-directory-picker-browse/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-browse", "description": "In-app directory browsing surface: the workspace directory-flow owner rendering the host's listing and creation primitives", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-directory-picker-native/package.json b/packages/client/ui-directory-picker-native/package.json index 73e8646f14..74b8e7845b 100644 --- a/packages/client/ui-directory-picker-native/package.json +++ b/packages/client/ui-directory-picker-native/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-directory-picker-native", "description": "Native directory-picker surface: the renderless workspace directory-flow occupant driving the host's OS chooser", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -42,7 +42,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", diff --git a/packages/client/ui-goal/package.json b/packages/client/ui-goal/package.json index acea46c02c..6076aab741 100644 --- a/packages/client/ui-goal/package.json +++ b/packages/client/ui-goal/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-goal", "description": "Session goal surface: GoalBar docked above the composer, read from the goal session projection", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-client-locale": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-input-trigger/package.json b/packages/client/ui-input-trigger/package.json index f9b10d5975..a4ca2afe84 100644 --- a/packages/client/ui-input-trigger/package.json +++ b/packages/client/ui-input-trigger/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-input-trigger", "description": "Input trigger pipeline: '/' and '@' detection, candidate menu, pick routing to registered sources", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -42,7 +42,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-jobs/package.json b/packages/client/ui-jobs/package.json index 92be42fbce..a59d064dda 100644 --- a/packages/client/ui-jobs/package.json +++ b/packages/client/ui-jobs/package.json @@ -1,7 +1,7 @@ { "name": "@deepseek-ai/dsh-client-ui-jobs", "description": "Session-header background-job list: live registry state mirrored from session/jobs frames", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "type": "module", "main": "lib/index.js", "types": "lib/types/index.d.ts", @@ -36,14 +36,14 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "repository": { "type": "git", "url": "git+https://github.com/deepseek-ai/deepseek-harness.git", "directory": "packages/client/ui-jobs" }, "publishConfig": { - "access": "restricted" + "access": "public" }, "dependencies": { "react": "^18.2.0" diff --git a/packages/client/ui-jobs/src/client/JobListAction.tsx b/packages/client/ui-jobs/src/client/JobListAction.tsx index b4cd08c56d..8834abf82b 100644 --- a/packages/client/ui-jobs/src/client/JobListAction.tsx +++ b/packages/client/ui-jobs/src/client/JobListAction.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react' import type { JobView } from '@deepseek-ai/dsh-client-runtime/client' -import { IconChevronDownOutline14, StateDot, type StateDotState } from '@deepseek-ai/dsh-client-ui-primitives' +import { IconChevronDownOutline14, StateDot, useDismissOnOutsidePointer, type StateDotState } from '@deepseek-ai/dsh-client-ui-primitives' import type { PropsLocale, PropsRuntime, TranslateNS } from '@deepseek-ai/dsh-client-ui-slots' import { NS } from './locales.ts' import type {} from '@deepseek-ai/dsh-client-ui-conversation/client' @@ -101,16 +101,7 @@ export function JobListAction({ sessionId, useSessions, t }: JobListActionProps) const rows = useMemo(() => ordered(jobs), [jobs]) const liveCount = useMemo(() => jobs.filter(isLive).length, [jobs]) - useEffect(() => { - if (!open) return - const closeOutside = (event: PointerEvent): void => { - if (event.target instanceof Node && !rootRef.current?.contains(event.target)) { - setOpen(false) - } - } - document.addEventListener('pointerdown', closeOutside) - return () => { document.removeEventListener('pointerdown', closeOutside) } - }, [open]) + useDismissOnOutsidePointer(rootRef, open, setOpen) // The clock only runs while an open list is showing something that moves. useEffect(() => { diff --git a/packages/client/ui-layout/package.json b/packages/client/ui-layout/package.json index d600913ce9..d3ab329297 100644 --- a/packages/client/ui-layout/package.json +++ b/packages/client/ui-layout/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-layout", "description": "Shell plugin: three-column AppFrame with drag handles, ctx.layout viewing-state service (navigation + panels)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -42,7 +42,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-client-runtime": "workspace:^", "@deepseek-ai/dsh-client-ui-slots": "workspace:^", diff --git a/packages/client/ui-message-feedback/package.json b/packages/client/ui-message-feedback/package.json index f59a70fe1d..481d02aa03 100644 --- a/packages/client/ui-message-feedback/package.json +++ b/packages/client/ui-message-feedback/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-message-feedback", "description": "Per-message feedback controls contributed to the assistant-message action strip, backed by the messageFeedback Host Remote", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-connection": "workspace:^", diff --git a/packages/client/ui-model-selection/package.json b/packages/client/ui-model-selection/package.json index 1e85054714..298fd8b133 100644 --- a/packages/client/ui-model-selection/package.json +++ b/packages/client/ui-model-selection/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-model-selection", "description": "Model selection: the /model popupSelect over session.models / session.selectModel", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-connection": "workspace:^", diff --git a/packages/client/ui-permission-presets/package.json b/packages/client/ui-permission-presets/package.json index 89b3de4ca2..62f03cbd07 100644 --- a/packages/client/ui-permission-presets/package.json +++ b/packages/client/ui-permission-presets/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-permission-presets", "description": "Permission surfaces: a new-session default in General settings and a current-session /permission popup over the permissions projection", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-plan/package.json b/packages/client/ui-plan/package.json index c06c45ca13..233a8a72fe 100644 --- a/packages/client/ui-plan/package.json +++ b/packages/client/ui-plan/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-plan", "description": "Plan-mode composer control: the conversation.input.plan seat over the plan projection and the /plan command channel", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", diff --git a/packages/client/ui-primitives/package.json b/packages/client/ui-primitives/package.json index 0000405054..b6e01b4f5a 100644 --- a/packages/client/ui-primitives/package.json +++ b/packages/client/ui-primitives/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-primitives", "description": "Pure React atoms for the dsh web UI: controls, icons, markdown, and JSON inspectors (zero cordis)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@shikijs/langs": "^4.3.1", "@types/mdast": "^4.0.4", diff --git a/packages/client/ui-primitives/src/index.ts b/packages/client/ui-primitives/src/index.ts index 05baf26f8d..1e8c3e576d 100644 --- a/packages/client/ui-primitives/src/index.ts +++ b/packages/client/ui-primitives/src/index.ts @@ -13,6 +13,7 @@ export { Input } from './Input.tsx' export { Menu } from './Menu.tsx' export type { MenuEntry, MenuItem, MenuSeparator, MenuLabel } from './Menu.tsx' export { useAnchoredMaxHeight } from './useAnchoredMaxHeight.ts' +export { useDismissOnOutsidePointer } from './useDismissOnOutsidePointer.ts' export { HoverCard } from './HoverCard.tsx' export { Modal } from './Modal.tsx' export { OnboardingSurface } from './OnboardingSurface.tsx' diff --git a/packages/client/ui-primitives/src/useDismissOnOutsidePointer.ts b/packages/client/ui-primitives/src/useDismissOnOutsidePointer.ts new file mode 100644 index 0000000000..3706d13bfc --- /dev/null +++ b/packages/client/ui-primitives/src/useDismissOnOutsidePointer.ts @@ -0,0 +1,29 @@ +/** + * Outside-pointer dismissal for trigger-owned popovers (jobs list, Cordis + * panel): while the surface is open, a pointerdown outside the root closes it. + */ +import { useEffect } from 'react' +import type { RefObject } from 'react' + +/** + * Close an open popover when a pointerdown lands outside its root element. + * @param root - element containing both the trigger and the open surface. + * @param open - whether the surface is showing; false detaches the listener. + * @param setOpen - state setter invoked with false on an outside pointerdown. + */ +export function useDismissOnOutsidePointer( + root: RefObject, + open: boolean, + setOpen: (open: boolean) => void, +): void { + useEffect(() => { + if (!open) return + const closeOutside = (event: PointerEvent): void => { + if (event.target instanceof Node && !root.current?.contains(event.target)) { + setOpen(false) + } + } + document.addEventListener('pointerdown', closeOutside) + return () => { document.removeEventListener('pointerdown', closeOutside) } + }, [root, open, setOpen]) +} diff --git a/packages/client/ui-settings-general/README.i18n.yaml b/packages/client/ui-settings-general/README.i18n.yaml index 3a0fae8d41..77b5c4e2d3 100644 --- a/packages/client/ui-settings-general/README.i18n.yaml +++ b/packages/client/ui-settings-general/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-settings-general/README.md -README.md: d02230d281482d03545a7dd9bb06fd5f1085d017 -README.zh.md: 9e2011902227c8d656f57813d4ecec92147d0f6f +README.md: c59b77617cfd5848553ba340e97bafe37b7b2a2f +README.zh.md: ea4896284b677a7b430cceb949b53aa6e3a5a242 diff --git a/packages/client/ui-settings-general/README.md b/packages/client/ui-settings-general/README.md index d02230d281..c59b77617c 100644 --- a/packages/client/ui-settings-general/README.md +++ b/packages/client/ui-settings-general/README.md @@ -2,13 +2,13 @@ English | [中文](README.zh.md) -Settings shell, ownerless-copy, and product-onboarding plugin. It occupies `sidebar.settings` with the trigger chrome and modal settings panel, projects the `settings.section` ledger into the navigation and the `settings.onboarding` ledger into one mounted page at a time, and registers everything on the Settings pages that belongs to no single feature — the trigger/header/close chrome content, the local configuration-file action, the General section and its `settings.general.item` slot, the `settings` dictionaries, and the first ordered welcome step. The slot types it renders into belong to ui-settings, the settings domain base; only the shell's own contract types live here, because they reference ui-sidebar's slot type and the base layer must depend on no `ui-*` package. Feature-owned rows (Permission, Language, Appearance), sections (Models), and conditional onboarding steps stay with their feature packages. +Settings shell, ownerless copy, and durable product-onboarding namespace. It occupies `sidebar.settings` with the trigger chrome and modal settings panel, projects the `settings.section` ledger into the navigation and the `settings.onboarding` ledger into one mounted step at a time, and registers everything on the Settings pages that belongs to no single feature — the trigger/header/close chrome content, the local configuration-file action, the General section and its `settings.general.item` slot, and the `settings` dictionaries. The slot types it renders into belong to ui-settings, the settings domain base; only the shell's own contract types live here, because they reference ui-sidebar's slot type and the base layer must depend on no `ui-*` package. Feature-owned rows (Permission, Language, Appearance), sections (Models), and conditional onboarding steps stay with their feature packages. -The shell ships no copy of its own — all text arrives from registrants. Nav labels may be locale-following thunks, so the nav projection resolves them through `resolveSlotLabel` and re-renders on the section ledger bump or the locale revision (an optional `ctx.get('locale')` read; no hard locale dependency). The onboarding ledger projects in ascending order and mounts exactly one page at a time; the takeover chrome (body-level stage, mask, app-root `inert`) belongs to the step itself through ui-primitives' `OnboardingSurface`, so a mounted step still resolving its private facts renders null and neither paints nor blocks anything — the shell shows no empty stage while a step decides. The active registrant receives its id, `complete()`, and an `openSection(id)` callback; completing or skipping transfers ownership to the next entry. Registrants own durable completion, capability readiness, copy, mutations, and the surface wrap, so independently registered flows cannot stack and the shell does not become a second configuration fact source. +The shell ships no onboarding copy of its own — all text arrives from registrants. Nav labels may be locale-following thunks, so the nav projection resolves them through `resolveSlotLabel` and re-renders on the section ledger bump or the locale revision (an optional `ctx.get('locale')` read; no hard locale dependency). The onboarding ledger projects in ascending order and mounts exactly one step at a time. Visible steps own their dialog chrome and app-root `inert` lifecycle; a mounted step still resolving private facts renders null, so nothing paints or blocks while it decides. The active registrant receives its id, `complete()`, and an `openSection(id)` callback; completing or skipping transfers ownership to the next entry. Registrants own durable completion, capability readiness, copy, mutations, and their visible wrapper, so independently registered flows cannot stack and the shell does not become a second configuration fact source. A loopback browser loads the provider's `hasDocument` capability through `settings.describe` and renders **Open configuration file** only when the Host confirms that a provider-owned local document can be prepared. The action sends the pathless, loopback-only `settings.openDocument` request; the Host resolves the provider path again, materializes an absent document, and hands it to a native text editor (`open -t` on macOS, bypassing a browser file association; the desktop file association on Linux and Windows; Windows association after `wslpath -w` translation on WSL). Open failures keep the action available and render a localized error. Reopening the dialog or reconnecting refreshes availability after a transient read failure or Host topology change. Remote browsers never register the action and never issue the privileged settings read. -`src/onboarding-copy.ts` is the single editable owner of the complete notice plus `WELCOME_NOTICE_VERSION`; both supported GUI locales intentionally render the same Chinese copy. The Host half registers `ui-onboarding` in the user-settings seam. A loopback browser compares `welcomeNoticeVersion` for exact equality and writes the current value only after Continue succeeds. The path mutation is idempotent across tabs and preserves sibling settings, while `host/settings-changed` makes an externally acknowledged notice advance without a reload. A non-loopback browser cannot access the privileged settings API: it still presents the notice, but Continue advances only the current browser process and a reload presents the notice again. A different version deliberately presents the notice again. The welcome page preserves every authored paragraph, gives the requested clause in the final paragraph the sole emphasis, initially focuses the title, and has no close, Escape, mask-click, or secondary path. None of its copy or acknowledgement enters a Session log or model request. The notice states that session telemetry is disabled by default, names the `FEEDBACK_ONLY` and `FULL` opt-in modes, and discloses that `FULL` also enables dsh-sdk command telemetry. +The Host half registers `ui-onboarding` in the user-settings seam. The welcome step contributed by `ui-settings-models` reads and writes its `welcomeNoticeVersion` through the existing public settings boundary; the shell itself remains policy-free. ## Model Experience diff --git a/packages/client/ui-settings-general/README.zh.md b/packages/client/ui-settings-general/README.zh.md index 9e20119022..ea4896284b 100644 --- a/packages/client/ui-settings-general/README.zh.md +++ b/packages/client/ui-settings-general/README.zh.md @@ -2,13 +2,13 @@ [English](README.md) | 中文 -设置外壳�无特定功能归属文案与产�引导�件。它以触�控件和模�设置���用 `sidebar.settings`,把 `settings.section` 账本投影�导航�把 `settings.onboarding` 账本投影��次�挂载一页的引导�程,并在设置页�上注册所有�属于�一功能的内容:触�器�标题�与关闭控件内容�本地�置文件�作,「通用�分区�其 `settings.general.item` slot�`settings` 字典,以�第一个有�欢迎步骤。它渲染进的那些 slot 类型归 ui-settings——设置领域底座——所有;�有外壳自身的契约类型放在这里,因为它们引用 ui-sidebar 的 slot 类型,而底座�得�赖任何 `ui-*` 包。归具体功能所有的行(「����「语言��「外观�)�分区(「模型�)和�件�首次使用引导步骤�由�自的功能包�供。 +设置外壳�无特定功能归属文案与�久化产�引导 namespace。它以触�控件和模�设置���用 `sidebar.settings`,把 `settings.section` 账本投影�导航�把 `settings.onboarding` 账本投影��次�挂载一个步骤的引导�程,并在设置页�上注册所有�属于�一功能的内容:触�器�标题�与关闭控件内容�本地�置文件�作,「通用�分区�其 `settings.general.item` slot,以� `settings` 字典。它渲染进的那些 slot 类型归 ui-settings——设置领域底座——所有;�有外壳自身的契约类型放在这里,因为它们引用 ui-sidebar 的 slot 类型,而底座�得�赖任何 `ui-*` 包。归具体功能所有的行(「����「语言��「外观�)�分区(「模型�)和�件�首次使用引导步骤�由�自的功能包�供。 -外壳�自带文案:所有文本都�自注册方。导航 label �以是跟�语言的 thunk,因此导航投影� `resolveSlotLabel` 解�,并在分区账本更新或 locale revision �化时�新渲染(`ctx.get('locale')` �选读�,无硬 locale �赖)。首次使用引导记录按��投影,�次�挂载一个页�;接管界�框架(body 层级的展示层��罩�应用根节点 `inert`)� ui-primitives 的 `OnboardingSurface` 由步骤自身�有,因此已挂载但�在判定�有事实的步骤渲染 null 时�绘制也�阻塞任何内容——步骤判定期间外壳�会露出空白展示层。当�注册方会收到该�目的 id�`complete()` 和 `openSection(id)` 回调;完�或跳过当�页��,所有�转交给下一项。�久化完�状��能力就绪状��文案��更�作以�展示层包装�由注册方�有,因此独立注册的�程无法堆�,外壳也�会�为第二个�置事实��。 +外壳�自带引导文案:所有文本都�自注册方。导航 label �以是跟�语言的 thunk,因此导航投影� `resolveSlotLabel` 解�,并在分区账本更新或 locale revision �化时�新渲染(`ctx.get('locale')` �选读�,无硬 locale �赖)。首次使用引导记录按��投影,�次�挂载一个步骤;��步骤自行�有弹窗框架和应用根节点 `inert` 生命周期。已挂载但�在判定�有事实的步骤渲染 null,因此判定期间�绘制也�阻塞任何内容。当�注册方会收到该�目的 id�`complete()` 和 `openSection(id)` 回调;完�或跳过当�步骤�,所有�转交给下一项。�久化完�状��能力就绪状��文案��更�作以���包装�由注册方�有,因此独立注册的�程无法堆�,外壳也�会�为第二个�置事实��。 回环�览器通过 `settings.describe` 加载�供方的 `hasDocument` 能力,且�有在 Host 确认�准备好一份由�供方�有的本地文档时�渲染**打开�置文件**。该�作��无路径�数且仅�回环访问的 `settings.openDocument` 请求;Host 会�次解��供方路径�在文档缺失时将其创建出�,并交给原生文本编辑器(macOS 上使用 `open -t`,绕过�览器文件关�;Linux 和 Windows 上使用桌�文件关�;WSL 上� `wslpath -w` 转��使用 Windows 文件关�)。打开失败时该�作��使用,并渲染本地化错误。临时读�失败或 Host 拓扑�化�,�新打开对�框或�新连接会刷新�用性。远程�览器从�注册该�作,也从��起这项特�设置读�。 -`src/onboarding-copy.ts` 是完整通知文案和 `WELCOME_NOTICE_VERSION` 的唯一�编辑��;GUI 支�的两� locale 都有�渲染�一份中文文案。宿主端在用户设置 seam 中注册 `ui-onboarding`。回环�览器会比较 `welcomeNoticeVersion` 是�精确相等,仅在「继续��作�功�写入当�值。该路径�更在��标签页间幂等,并会�留�级设置;`host/settings-changed` 则让页�在通知被外部确认�,无需�新加载��推进。�回环�览器�能访问��护的设置 API:它�会显示通知,但「继续��推进当��览器进程,�新加载�会�次显示通知。版本��时,系统也会有��新显示通知。欢迎页�留原文的�个段�,仅强调最�一段中指定的�段,�始焦点�在标题上,并且没有关闭�作�Escape�点击�罩或次��作路径。其文案和确认状���会进入会�日志或模型请求。通知说明会��测默认�用,列出 `FEEDBACK_ONLY` 和 `FULL` 两�显��用模�,并披露 `FULL` �时会�用 dsh-sdk 命令�测。 +宿主端在用户设置 seam 中注册 `ui-onboarding`。`ui-settings-models` �供的欢迎步骤通过既有公开 settings 边界读写其中的 `welcomeNoticeVersion`;外壳本身���有产�策略。 ## 模型体验 diff --git a/packages/client/ui-settings-general/package.json b/packages/client/ui-settings-general/package.json index 3da8aff119..c5207dfc9d 100644 --- a/packages/client/ui-settings-general/package.json +++ b/packages/client/ui-settings-general/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-general", "description": "Settings ownerless-copy and product onboarding plugin: the General section, shell trigger/header chrome content, settings dictionaries, and the versioned welcome notice", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -46,7 +46,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@deepseek-ai/dsh-settings": "workspace:^", "@deepseek-ai/schemastery": "workspace:^", diff --git a/packages/client/ui-settings-general/src/client/SettingsRoot.module.css b/packages/client/ui-settings-general/src/client/SettingsRoot.module.css index 060e8d115b..03e0f6372c 100644 --- a/packages/client/ui-settings-general/src/client/SettingsRoot.module.css +++ b/packages/client/ui-settings-general/src/client/SettingsRoot.module.css @@ -1,19 +1,19 @@ /* Settings shell (figma 501:29904 mask context / 501:29947 panel): sidebar foot trigger row + centered 1080x700 modal panel. The trigger uses the - sidebar's 34px compact row / 36px rail circle rhythm; the + sidebar foot's 42px row / 36px rail circle rhythm; the panel is a two-column layout — 188px nav rail + content column with a 54px header and the 24px-padded options area. */ -/* Trigger row: match the other wide sidebar controls' compact vertical rhythm. */ +/* Trigger row: the 42px foot-row box shared with the Cordis footer action. */ .trigger { flex: none; display: flex; align-items: center; gap: 8px; - width: calc(100% + 8px); - height: 34px; - margin: 4px -4px 4px; - padding: 6px 2px 6px 10px; + width: calc(100% + 4px); + height: 42px; + margin: 4px -2px; + padding: 0 10px 0 8px; box-sizing: border-box; border: none; border-radius: 12px; diff --git a/packages/client/ui-settings-general/src/client/SettingsRoot.tsx b/packages/client/ui-settings-general/src/client/SettingsRoot.tsx index fb14059f05..762747500d 100644 --- a/packages/client/ui-settings-general/src/client/SettingsRoot.tsx +++ b/packages/client/ui-settings-general/src/client/SettingsRoot.tsx @@ -7,9 +7,8 @@ * aria-labelledby the title node; close: visually-hidden slot text). Modal * open state and the active section id are component-local viewing state; * the onboarding coordinator mounts exactly one ordered registrant while the - * sessions-derived empty-Hero fact is active — the takeover chrome - * (OnboardingSurface) belongs to the step, so a mounted-but-deciding step - * paints nothing here. + * sessions-derived empty-Hero fact is active. Visible dialog chrome belongs + * to the step, so a mounted-but-deciding step paints nothing here. */ import { useCallback, useEffect, useId, useRef, useState } from 'react' import clsx from 'clsx' @@ -160,10 +159,9 @@ export function SettingsRoot(props: SettingsRootComponentProps) { onClose={close} /> )} - {/* The takeover chrome (OnboardingSurface: mask, opaque stage, `#root` - inert) lives inside the step component, wrapped around its visible - content — a step still deciding (private facts loading) renders - null, so nothing paints or blocks while it decides. */} + {/* Dialog chrome and `#root` inert ownership live inside each step's + visible branch. A step still deciding (private facts loading) + renders null, so nothing paints or blocks while it decides. */} {onboardingStep !== undefined && renderSlot('settings.onboarding', { stepId: onboardingStep.id, complete: () => { completeOnboardingStep(onboardingStep.id) }, diff --git a/packages/client/ui-settings-general/src/client/WelcomeNotice.module.css b/packages/client/ui-settings-general/src/client/WelcomeNotice.module.css deleted file mode 100644 index a1727b8033..0000000000 --- a/packages/client/ui-settings-general/src/client/WelcomeNotice.module.css +++ /dev/null @@ -1,155 +0,0 @@ -.page { - position: relative; - z-index: 1; - width: min(640px, calc(100vw - 64px)); - max-height: 100vh; - padding: clamp(64px, 9vh, 104px) 0 40px; - box-sizing: border-box; - overflow-y: auto; - color: var(--dsw-alias-label-primary); - --welcome-ease-out: cubic-bezier(0.23, 1, 0.32, 1); -} - -.brand { - display: flex; - align-items: center; - margin-bottom: 42px; - color: var(--dsw-alias-label-primary); -} - -.title { - margin: 0; - font-size: 28px; - line-height: 36px; - font-weight: 600; - letter-spacing: -0.02em; - outline: none; -} - -.opening, -.reflection, -.feedback, -.error { - margin: 0; -} - -.opening { - margin-top: 30px; -} - -.reflection { - margin-top: 36px; - padding: 0; -} - -.feedback { - margin-top: 30px; -} - -.opening, -.reflection, -.feedback { - font-size: 16px; - line-height: 28px; - color: var(--dsw-alias-label-secondary); -} - -.feedback strong { - color: inherit; - font-weight: 500; -} - -.footer { - display: flex; - justify-content: flex-end; - margin-top: 32px; -} - -.error { - margin-top: 20px; - font-size: 14px; - line-height: 22px; - color: var(--dsw-alias-state-error-primary); -} - -.primary { - min-width: 120px; - transition: transform 140ms var(--welcome-ease-out); -} - -.primary:active:not(:disabled) { - transform: scale(0.97); -} - -.brand, -.title, -.opening, -.reflection, -.feedback, -.footer { - animation: welcome-enter 280ms var(--welcome-ease-out) both; -} - -.title { animation-delay: 40ms; } -.opening { animation-delay: 80ms; } -.reflection { animation-delay: 120ms; } -.feedback { animation-delay: 160ms; } -.footer { animation-delay: 200ms; } - -@keyframes welcome-enter { - from { - opacity: 0; - transform: translateY(8px); - } - - to { - opacity: 1; - transform: translateY(0); - } -} - -@media (prefers-reduced-motion: reduce) { - .brand, - .title, - .opening, - .reflection, - .feedback, - .footer { - animation: none; - } - - .primary { - transition: none; - } -} - -@media (max-width: 560px) { - .page { - width: calc(100vw - 40px); - padding-top: 38px; - } - - .brand { - margin-bottom: 30px; - } - - .opening { - margin-top: 24px; - } - - .reflection { - margin-top: 28px; - } - - .feedback { - margin-top: 28px; - } - - .footer { - margin-top: 30px; - } - - .primary { - width: 100%; - } -} diff --git a/packages/client/ui-settings-general/src/client/WelcomeNotice.tsx b/packages/client/ui-settings-general/src/client/WelcomeNotice.tsx deleted file mode 100644 index 34187073a1..0000000000 --- a/packages/client/ui-settings-general/src/client/WelcomeNotice.tsx +++ /dev/null @@ -1,91 +0,0 @@ -/** Product-wide, versioned first-run welcome step. */ - -import { useCallback, useEffect, useRef } from 'react' -import type { ReactNode } from 'react' -import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots' -import { BrandWordmark, Button, OnboardingSurface } from '@deepseek-ai/dsh-client-ui-primitives' -import type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-web-react' -import type { WelcomeNoticeState, WelcomeNoticeStore } from './welcome-store.ts' -import css from './WelcomeNotice.module.css' - -function emphasizedFeedback(paragraph: string, emphasis: string): ReactNode { - const index = paragraph.indexOf(emphasis) - /* v8 ignore next -- both locale values derive from one owner object that contains the emphasis */ - if (index < 0) return paragraph - return ( - <> - {paragraph.slice(0, index)} - {emphasis} - {paragraph.slice(index + emphasis.length)} - - ) -} - -/** Registrant-owned dependencies of {@link WelcomeNotice}. */ -export interface WelcomeNoticeInjected { - controller: WelcomeNoticeStore - useSnapshot: SnapshotSelectorHook -} - -/** Coordinator owner props plus the welcome step's injected face. */ -export type WelcomeNoticeProps = - PropsRuntime<'settings.onboarding'> & PropsLocale<'settings'> & WelcomeNoticeInjected - -/** Render the mandatory notice until its current version is acknowledged. */ -export function WelcomeNotice(props: WelcomeNoticeProps): ReactNode { - const { complete, controller, useSnapshot, t } = props - const state = useSnapshot(snapshot => snapshot) - const finished = useRef(false) - const titleRef = useRef(null) - const finish = useCallback((): void => { - if (finished.current) return - finished.current = true - complete() - }, [complete]) - - useEffect(() => { - if (state.status === 'idle') void controller.load() - }, [controller, state.status]) - - useEffect(() => { - if (state.acknowledged) finish() - }, [finish, state.acknowledged]) - - useEffect(() => { - if (state.status === 'ready' && !state.acknowledged) titleRef.current?.focus() - }, [state.acknowledged, state.status]) - - // Null while the acknowledgement fact is still loading (or already given): - // the takeover chrome below is part of THIS render, so deciding not to - // show paints and blocks nothing. - if (state.status === 'idle' || state.status === 'loading' || state.acknowledged) return null - - const acknowledge = async (): Promise => { - if (await controller.acknowledge()) finish() - } - - return ( - -
- -

{t('welcome.title')}

-

{t('welcome.paragraph.0')}

-
{t('welcome.paragraph.1')}
-

- {emphasizedFeedback(t('welcome.paragraph.2'), t('welcome.feedbackEmphasis'))} -

- {state.error === null ? null :

{t('welcome.error')}

} -
- -
-
-
- ) -} diff --git a/packages/client/ui-settings-general/src/client/index.ts b/packages/client/ui-settings-general/src/client/index.ts index 3a868dc3b4..e1a94934c7 100644 --- a/packages/client/ui-settings-general/src/client/index.ts +++ b/packages/client/ui-settings-general/src/client/index.ts @@ -17,9 +17,6 @@ import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react' import type {} from '@deepseek-ai/dsh-client-ui-settings/client' // Type-only: pulls ctx.locale into this program. import type {} from '@deepseek-ai/dsh-client-locale/client' -// Type-only: pulls the ctx.remote merge and the forwarded-event key face -// (the settings invalidation rides the allowlist) into this program. -import type {} from '@deepseek-ai/dsh-api-remotes/client' import type { SettingsOnboardingStep, SettingsRootInjected, SettingsSectionRow, } from './shell-contract.ts' @@ -29,10 +26,6 @@ import { GeneralSection } from './GeneralSection.tsx' import { SettingsDocumentAction } from './SettingsDocumentAction.tsx' import type { SettingsDocumentActionInjected } from './SettingsDocumentAction.tsx' import { refreshDocumentIfLoaded, SettingsDocumentStore } from './settings-document-store.ts' -import type { WelcomeNoticeInjected } from './WelcomeNotice.tsx' -import { WelcomeNotice } from './WelcomeNotice.tsx' -import { refreshWelcomeIfLoaded, WelcomeNoticeStore } from './welcome-store.ts' -import { WELCOME_NOTICE_SETTINGS_NAMESPACE } from '../onboarding-copy.ts' import { en, zh, type SettingsKey } from './locales.ts' export type { @@ -44,8 +37,6 @@ export type { export type { SettingsDocumentActionInjected, SettingsDocumentActionProps } from './SettingsDocumentAction.tsx' export type { SettingsDocumentState } from './settings-document-store.ts' export { SettingsDocumentStore } from './settings-document-store.ts' -export type { WelcomeNoticeInjected, WelcomeNoticeProps } from './WelcomeNotice.tsx' -export type { WelcomeNoticeState } from './welcome-store.ts' export type { SettingsKey } from './locales.ts' declare module '@deepseek-ai/dsh-client-ui-slots' { @@ -63,7 +54,7 @@ const NS = 'settings' * ui-settings' apply, whose activation order relative to this one is NOT * constrained; registrations depend on their slots through `slots.inject()`. */ -export const inject = ['slots', 'locale', 'connection', 'remote'] +export const inject = ['slots', 'locale', 'connection'] /** * Register the `settings` dictionaries, the chrome content, and the General @@ -87,27 +78,9 @@ export function apply(ctx: ClientContext): void { const useSnapshot = bindSnapshotSelector(documentController.store) return (): SettingsDocumentActionInjected => ({ controller: documentController, useSnapshot }) })() - const welcomeController = new WelcomeNoticeStore(connection.api, connection.isLoopback ? 'host' : 'memory') - const useWelcomeSnapshot = bindSnapshotSelector(welcomeController.store) - const welcomeInjected = (): WelcomeNoticeInjected => ({ - controller: welcomeController, - useSnapshot: useWelcomeSnapshot, - }) - - ctx.effect(() => { - const refresh = (): void => { refreshWelcomeIfLoaded(welcomeController) } - const disposers = [ - ctx.remote.$on('settings/document-updated', (ns) => { - if (ns !== WELCOME_NOTICE_SETTINGS_NAMESPACE) return - refresh() - }), - ctx.on('connection/reset', () => { - refresh() - refreshDocumentIfLoaded(documentController) - }), - ] - return () => { for (const dispose of disposers) dispose() } - }, 'ui-settings-general: metadata invalidations') + ctx.effect(() => ctx.on('connection/reset', () => { + refreshDocumentIfLoaded(documentController) + }), 'ui-settings-general: metadata invalidations') // The settings shell: this package occupies the sidebar-owned hole and // declares the settings slots. Ledger → nav-row projection as an observable // source (uSES contract: getSnapshot returns the cached rows until the @@ -202,11 +175,4 @@ export function apply(ctx: ClientContext): void { locale: NS, children: { 'settings.general.item': { kind: 'list', scope: 'root' } }, }, GeneralSection)) - ctx.slots.inject('settings.onboarding', () => ctx.slots.register({ - name: 'settings.onboarding', - id: 'welcome-notice', - order: -100, - locale: NS, - inject: welcomeInjected, - }, WelcomeNotice)) } diff --git a/packages/client/ui-settings-general/src/client/locales.ts b/packages/client/ui-settings-general/src/client/locales.ts index 41a44eae3f..a557855323 100644 --- a/packages/client/ui-settings-general/src/client/locales.ts +++ b/packages/client/ui-settings-general/src/client/locales.ts @@ -1,5 +1,4 @@ -/** Shell chrome, General-nav, and welcome-notice dictionaries; feature rows own their copy. */ -import { WELCOME_NOTICE_COPY } from '../onboarding-copy.ts' +/** Shell chrome and General-nav dictionaries; feature rows own their copy. */ /** Simplified Chinese dictionary (the key-set source of truth). */ export const zh = { @@ -9,13 +8,6 @@ export const zh = { 'openDocument': '打开�置文件', 'openDocument.error': '无法打开�置文件', 'general.nav': '通用设置', - 'welcome.title': WELCOME_NOTICE_COPY.zh.title, - 'welcome.paragraph.0': WELCOME_NOTICE_COPY.zh.paragraphs[0], - 'welcome.paragraph.1': WELCOME_NOTICE_COPY.zh.paragraphs[1], - 'welcome.paragraph.2': WELCOME_NOTICE_COPY.zh.paragraphs[2], - 'welcome.feedbackEmphasis': WELCOME_NOTICE_COPY.zh.feedbackEmphasis, - 'welcome.continue': WELCOME_NOTICE_COPY.zh.continueLabel, - 'welcome.error': '暂时无法�存确认状�,请�试。', } satisfies Record /** The settings namespace key union. */ @@ -29,11 +21,4 @@ export const en = { 'openDocument': 'Open configuration file', 'openDocument.error': 'Could not open configuration file', 'general.nav': 'General', - 'welcome.title': WELCOME_NOTICE_COPY.en.title, - 'welcome.paragraph.0': WELCOME_NOTICE_COPY.en.paragraphs[0], - 'welcome.paragraph.1': WELCOME_NOTICE_COPY.en.paragraphs[1], - 'welcome.paragraph.2': WELCOME_NOTICE_COPY.en.paragraphs[2], - 'welcome.feedbackEmphasis': WELCOME_NOTICE_COPY.en.feedbackEmphasis, - 'welcome.continue': WELCOME_NOTICE_COPY.en.continueLabel, - 'welcome.error': 'The acknowledgement could not be saved. Please try again.', } satisfies Record diff --git a/packages/client/ui-settings-general/src/index.ts b/packages/client/ui-settings-general/src/index.ts index 0cea245db5..ed600b1c1c 100644 --- a/packages/client/ui-settings-general/src/index.ts +++ b/packages/client/ui-settings-general/src/index.ts @@ -3,28 +3,24 @@ import type { Context } from '@deepseek-ai/cordis' import z from '@deepseek-ai/schemastery' import { settingsNamespace } from '@deepseek-ai/dsh-settings' -import { - WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, -} from './onboarding-copy.ts' -export { - WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_COPY, WELCOME_NOTICE_SETTINGS_NAMESPACE, - WELCOME_NOTICE_VERSION, -} from './onboarding-copy.ts' +/** Durable settings namespace for product-wide GUI onboarding facts. */ +const ONBOARDING_SETTINGS_NAMESPACE = 'ui-onboarding' interface OnboardingSettings { + /** Last version acknowledged by the current product welcome step. */ welcomeNoticeVersion?: string } const OnboardingSettingsSchema: z = z.object({ - [WELCOME_NOTICE_ACK_FIELD]: z.string(), + welcomeNoticeVersion: z.string(), }) /** Register the durable GUI-onboarding section when a settings provider exists. */ export function apply(ctx: Context): void { ctx.inject(['settings'], (settingsCtx) => { settingsCtx.settings.register( - settingsNamespace(WELCOME_NOTICE_SETTINGS_NAMESPACE), + settingsNamespace(ONBOARDING_SETTINGS_NAMESPACE), OnboardingSettingsSchema, ) }) diff --git a/packages/client/ui-settings-general/src/invariant.ts b/packages/client/ui-settings-general/src/invariant.ts index adfd582ca6..10db92524e 100644 --- a/packages/client/ui-settings-general/src/invariant.ts +++ b/packages/client/ui-settings-general/src/invariant.ts @@ -16,7 +16,7 @@ export const inject = ['invariants'] /** * No runtime invariant: the settings seam validates and publishes the durable - * welcome section, while slot conflicts fail loud in the slot core. The local + * onboarding section, while slot conflicts fail loud in the slot core. The local * document action is browser state over typed RPC responses and is covered by * store/component tests rather than a Cordis runtime relationship. */ diff --git a/packages/client/ui-settings-general/src/onboarding-copy.ts b/packages/client/ui-settings-general/src/onboarding-copy.ts deleted file mode 100644 index 8b29402b4b..0000000000 --- a/packages/client/ui-settings-general/src/onboarding-copy.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** Durable settings namespace for product-wide GUI onboarding facts. */ -export const WELCOME_NOTICE_SETTINGS_NAMESPACE = 'ui-onboarding' - -/** Field storing the last welcome notice version the user acknowledged. */ -export const WELCOME_NOTICE_ACK_FIELD = 'welcomeNoticeVersion' - -/** - * Bump only when the notice changes materially and every user should see it - * again. The acknowledgement is compared for exact equality. - */ -export const WELCOME_NOTICE_VERSION = '2026-08-11.1' - -/** The complete editable welcome notice in both supported GUI locales. */ -export const WELCOME_NOTICE_COPY = { - zh: { - title: '内测声明', - paragraphs: [ - '感谢您愿�拨冗试用 DeepSeek Harness。当�版本�处于内部测试阶段,功能�待完善,体验难�有些粗糙。', - '“如切如磋,如�如磨。� 产�的�长,离�开一次次真实的碰撞与�诚的�馈。您在真实使用中�现的问题,也�能促使我们�新审视,甚至推翻已有的设计。', - '内测版本默认�会上传 Session Log。如需在�交�馈时共享会�日志,�以设置环境�� DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需�续上传,�以设置 DSH_TELEMETRY_MODE=FULL,但该模��时会�用 dsh-sdk 命令�测,上报匿� ID�命令结果以�脱��的项目�置。�外,如果您有任何�馈与建议,请在�业微信群中留言告诉我们。�一��馈,都会帮助我们把它打磨得更好。', - ], - feedbackEmphasis: '如果您有任何�馈与建议,请在�业微信群中留言告诉我们', - continueLabel: '继续', - }, - en: { - title: '内测声明', - paragraphs: [ - '感谢您愿�拨冗试用 DeepSeek Harness。当�版本�处于内部测试阶段,功能�待完善,体验难�有些粗糙。', - '“如切如磋,如�如磨。� 产�的�长,离�开一次次真实的碰撞与�诚的�馈。您在真实使用中�现的问题,也�能促使我们�新审视,甚至推翻已有的设计。', - '内测版本默认�会上传 Session Log。如需在�交�馈时共享会�日志,�以设置环境�� DSH_TELEMETRY_MODE=FEEDBACK_ONLY;如需�续上传,�以设置 DSH_TELEMETRY_MODE=FULL,但该模��时会�用 dsh-sdk 命令�测,上报匿� ID�命令结果以�脱��的项目�置。�外,如果您有任何�馈与建议,请在�业微信群中留言告诉我们。�一��馈,都会帮助我们把它打磨得更好。', - ], - feedbackEmphasis: '如果您有任何�馈与建议,请在�业微信群中留言告诉我们', - continueLabel: '继续', - }, -} as const diff --git a/packages/client/ui-settings-general/tests/apply.client.spec.ts b/packages/client/ui-settings-general/tests/apply.client.spec.ts index 6c0f5131f2..d6c3ffff02 100644 --- a/packages/client/ui-settings-general/tests/apply.client.spec.ts +++ b/packages/client/ui-settings-general/tests/apply.client.spec.ts @@ -1,18 +1,15 @@ -/** Ownerless-copy registrations: the six seats, dictionaries, thunked labels, and HMR recovery. */ +/** Ownerless-copy registrations: the five seats, dictionaries, thunked labels, and HMR recovery. */ import { Context } from '@deepseek-ai/cordis' import { describe, expect, it, vi } from 'vitest' import { resolveSlotLabel } from '@deepseek-ai/dsh-client-ui-slots' import { SlotRegistry } from '@deepseek-ai/dsh-client-runtime/client' import { LocaleRuntime } from '@deepseek-ai/dsh-client-locale/client' -import { TestRemote, usePinnedBrowserLanguages } from '@deepseek-ai/dsh-client-test-runtime' +import { usePinnedBrowserLanguages } from '@deepseek-ai/dsh-client-test-runtime' import { apply, inject } from '@deepseek-ai/dsh-client-ui-settings-general/client' import { CloseLabel, HeaderContent, TriggerContent } from '../src/client/chrome.tsx' import { GeneralSection } from '../src/client/GeneralSection.tsx' import { SettingsDocumentAction } from '../src/client/SettingsDocumentAction.tsx' import type { SettingsDocumentActionInjected } from '../src/client/SettingsDocumentAction.tsx' -import { WelcomeNotice } from '../src/client/WelcomeNotice.tsx' -import type { WelcomeNoticeInjected } from '../src/client/WelcomeNotice.tsx' -import { WELCOME_NOTICE_SETTINGS_NAMESPACE } from '../src/onboarding-copy.ts' // The service reads its initial locale from the browser; these specs assert // the shipped Chinese copy, so they state the browser they assume. @@ -25,7 +22,6 @@ const SEATS = [ ['settings.action', SettingsDocumentAction], ['settings.close', CloseLabel], ['settings.section', GeneralSection], - ['settings.onboarding', WelcomeNotice], ] as const async function bench(isLoopback = true) { @@ -33,9 +29,6 @@ async function bench(isLoopback = true) { await ctx.plugin(SlotRegistry).await() const locale = new LocaleRuntime(ctx) ctx.provide('locale', locale) - // The plugins inject `remote`; forwarded events reach them through the - // same `$dispatch` handoff the connection sink makes. - new TestRemote(ctx) const settingsDescribe = vi.fn(() => Promise.resolve({ rpcId: 'settings-general' as never, result: { @@ -43,14 +36,7 @@ async function bench(isLoopback = true) { value: { writable: true, hasDocument: true, - namespaces: [{ - ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, - schema: {}, - value: {}, - applies: 'live' as const, - secrets: [], - revision: 0, - }], + namespaces: [], }, }, })) @@ -89,10 +75,10 @@ function generalEntry(slots: SlotRegistry) { describe('ui-settings-general apply', () => { it('declares the services it uses', () => { - expect(inject).toEqual(['slots', 'locale', 'connection', 'remote']) + expect(inject).toEqual(['slots', 'locale', 'connection']) }) - it('fills all six seats for declarations before or after apply', async () => { + it('fills all five seats for declarations before or after apply', async () => { const before = await bench() declare(before.slots) await before.ctx.plugin({ inject: [...inject], apply }).await() @@ -105,8 +91,9 @@ describe('ui-settings-general apply', () => { expect(resolveSlotLabel(entry.options.label)).toBe('通用设置') expect(before.slots.spec('settings.general.item')).toEqual({ kind: 'list', scope: 'root' }) expect(before.slots.entries('settings.general.item')).toEqual([]) - const welcome = before.slots.entries('settings.onboarding')[0]! - expect(welcome.options).toMatchObject({ id: 'welcome-notice', order: -100 }) + // The onboarding hole stays declared for feature-owned steps; this plugin + // no longer seats one. + expect(before.slots.entries('settings.onboarding')).toEqual([]) const action = before.slots.entries('settings.action')[0]! const actionInjected = (action.inject as unknown as () => SettingsDocumentActionInjected)() expect(actionInjected.controller.store.getSnapshot().status).toBe('idle') @@ -162,22 +149,6 @@ describe('ui-settings-general apply', () => { expect(resolveSlotLabel(generalEntry(b.slots)!.options.label)).toBe('通用设置') }) - it('refreshes loaded welcome state only for its settings namespace or a reconnect', async () => { - const b = await bench() - declare(b.slots) - await b.ctx.plugin({ inject: [...inject], apply }).await() - const entry = b.slots.entries('settings.onboarding')[0]! - const { controller } = (entry.inject as unknown as () => WelcomeNoticeInjected)() - await controller.load() - expect(b.settingsDescribe).toHaveBeenCalledOnce() - b.ctx.remote.$dispatch('settings/document-updated', ['unrelated', 1]) - expect(b.settingsDescribe).toHaveBeenCalledOnce() - b.ctx.remote.$dispatch('settings/document-updated', [WELCOME_NOTICE_SETTINGS_NAMESPACE, 1]) - await vi.waitFor(() => { expect(b.settingsDescribe).toHaveBeenCalledTimes(2) }) - b.ctx.emit('connection/reset') - await vi.waitFor(() => { expect(b.settingsDescribe).toHaveBeenCalledTimes(3) }) - }) - it('refreshes loaded document availability on reconnect without reading it eagerly', async () => { const b = await bench() declare(b.slots) @@ -192,19 +163,13 @@ describe('ui-settings-general apply', () => { await vi.waitFor(() => { expect(b.settingsDescribe).toHaveBeenCalledTimes(2) }) }) - it('keeps remote welcome acknowledgement process-local', async () => { + it('withholds the loopback-only document action off-loopback', async () => { const b = await bench(false) declare(b.slots) const fiber = b.ctx.plugin({ inject: [...inject], apply }) await fiber.await() - const entry = b.slots.entries('settings.onboarding')[0]! - const { controller } = (entry.inject as unknown as () => WelcomeNoticeInjected)() - - await controller.load() - await expect(controller.acknowledge()).resolves.toBe(true) - expect(controller.store.getSnapshot()).toMatchObject({ status: 'ready', acknowledged: true }) - expect(b.settingsDescribe).not.toHaveBeenCalled() expect(b.slots.entries('settings.action')).toEqual([]) + expect(b.settingsDescribe).not.toHaveBeenCalled() await fiber.dispose() for (const [name] of SEATS) expect(b.slots.entries(name)).toEqual([]) }) diff --git a/packages/client/ui-settings-general/tests/host.client.spec.ts b/packages/client/ui-settings-general/tests/host.client.spec.ts index 5e82764f47..f5bc43b3e1 100644 --- a/packages/client/ui-settings-general/tests/host.client.spec.ts +++ b/packages/client/ui-settings-general/tests/host.client.spec.ts @@ -2,7 +2,9 @@ import { Context } from '@deepseek-ai/cordis' import { describe, expect, it } from 'vitest' import { SettingsProvider, settingsNamespace, type SettingsNamespace } from '@deepseek-ai/dsh-settings' import { apply } from '../src/index.ts' -import { WELCOME_NOTICE_SETTINGS_NAMESPACE } from '../src/onboarding-copy.ts' + +/** Mirrors the module-local namespace id in src/index.ts. */ +const ONBOARDING_SETTINGS_NAMESPACE = 'ui-onboarding' class MemorySettings extends SettingsProvider { readonly writable = true @@ -19,11 +21,11 @@ describe('ui-settings-general host', () => { const fiber = ctx.plugin({ apply }) await fiber.await() expect(ctx.settings.describe().map(row => row.ns)).toContain( - settingsNamespace(WELCOME_NOTICE_SETTINGS_NAMESPACE), + settingsNamespace(ONBOARDING_SETTINGS_NAMESPACE), ) await fiber.dispose() expect(ctx.settings.describe().map(row => row.ns)).not.toContain( - settingsNamespace(WELCOME_NOTICE_SETTINGS_NAMESPACE), + settingsNamespace(ONBOARDING_SETTINGS_NAMESPACE), ) }) }) diff --git a/packages/client/ui-settings-general/tests/settings-root.client.spec.tsx b/packages/client/ui-settings-general/tests/settings-root.client.spec.tsx index 430bb2daee..c9ec593974 100644 --- a/packages/client/ui-settings-general/tests/settings-root.client.spec.tsx +++ b/packages/client/ui-settings-general/tests/settings-root.client.spec.tsx @@ -229,7 +229,7 @@ describe('SettingsPanel navigation', () => { it('paints no takeover chrome of its own around the mounted step', () => { // The chrome (mask, opaque stage, #root inert) belongs to the step via - // the OnboardingSurface primitive — a mounted-but-deciding step that + // the step-owned dialog surface — a mounted-but-deciding step that // renders null must show and block nothing (the reload white-flash fix; // onboarding-surface.spec.tsx pins the primitive's half). const appRoot = document.createElement('div') diff --git a/packages/client/ui-settings-general/tests/shell.client.spec.ts b/packages/client/ui-settings-general/tests/shell.client.spec.ts index 0c95e8b8d3..32c354deda 100644 --- a/packages/client/ui-settings-general/tests/shell.client.spec.ts +++ b/packages/client/ui-settings-general/tests/shell.client.spec.ts @@ -49,7 +49,7 @@ const CHILD_SPECS = { describe('ui-settings apply', () => { it('declares only the slot registry (a pure composition face, no locale)', () => { - expect(inject).toEqual(['slots', 'locale', 'connection', 'remote']) + expect(inject).toEqual(['slots', 'locale', 'connection']) }) it('registers the shell and declares every child slot, before or after the declaration', async () => { @@ -110,8 +110,6 @@ describe('ui-settings apply', () => { b.slots.register({ name: 'settings.onboarding', id: 'default-order' } as never, () => null) const steps = onboardingSteps.getSnapshot() expect(steps).toEqual([ - // This package's own onboarding page, registered by the same apply. - { id: 'welcome-notice', order: -100 }, { id: 'welcome', order: -100 }, { id: 'credential', order: 0 }, { id: 'default-order', order: 0 }, diff --git a/packages/client/ui-settings-models/README.i18n.yaml b/packages/client/ui-settings-models/README.i18n.yaml index ddd679e690..f26ca67bc3 100644 --- a/packages/client/ui-settings-models/README.i18n.yaml +++ b/packages/client/ui-settings-models/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-settings-models/README.md -README.md: 642dc3ffc7f3f45a523cd6e84b13d34e2d25dc2a -README.zh.md: 408f2017636ef2d9a5a57fef253f2f05b61a22fb +README.md: f0094c4f2687beaf6a5e5f7a1a8dc3d4ebdbcbc0 +README.zh.md: 68bb64ddeebfd65644edbb5e11fd2e147214d44a diff --git a/packages/client/ui-settings-models/README.md b/packages/client/ui-settings-models/README.md index 642dc3ffc7..f0094c4f26 100644 --- a/packages/client/ui-settings-models/README.md +++ b/packages/client/ui-settings-models/README.md @@ -2,11 +2,13 @@ English | [中文](README.zh.md) -Models settings plugin: the provider configuration page and official-DeepSeek conditional onboarding step. It joins three wire domains into one shared snapshot — `llm.providers` (the configurable-provider directory with each route's live/dormant state), `settings.describe` (serialized schemas, layered redacted values, secret slots), and `credentials.describe` (value-free configured/source/writable badges) — and renders provider rows with one editor card at a time, without presenting route liveness as provider status. +Models settings and product-onboarding plugin. The same client Cordis plugin registers the Models page plus two ordered first-run dialogs: a versioned internal-testing notice and the conditional official-DeepSeek credential step. Both steps share one modal wrapper and remain sequenced by `settings.onboarding`. The Models plane joins three wire domains into one shared snapshot — `llm.providers` (the configurable-provider directory with each route's live/dormant state), `settings.describe` (serialized schemas, layered redacted values, secret slots), and `credentials.describe` (value-free configured/source/writable badges) — and renders provider rows with one editor card at a time, without presenting route liveness as provider status. Rows are the *configured* providers (their profile resolves in the owning namespace); a whole-section provider whose key is not configured anywhere renders as its open setup card instead of a row, but only in the first-run posture — while no provider is registered with the credential its profile names — and only until the user closes that card, after which it is an ordinary row carrying the missing-key dot. Each card kind owns its own open state, so closing one never discards a draft in another. The add flow is a card carrying the dormant-directory provider select — a bare-mounted `llm-pi-ai` offers its whole installed catalog before any route exists. The pi-ai card additionally edits that route's **model list** and can ask the provider what it serves. A row labels API-key state with a green solid dot only when a referenced credential is confirmed configured, and with a red solid dot only when a named reference is confirmed missing; reference-free provider-native authentication and unavailable credential enrichment remain unmarked. The editor is a hand-written card per adapter family: the primary field is a single **API key** input — the page never asks for an environment-variable name; a typed key stores **write-only** through `credentials.set` under the profile's reference, deriving `_API_KEY` when the profile has none, and the pi-ai profile records that derivation as `apiKeyEnv`, so `settings.yaml` never carries a key value. Leaving a new pi-ai provider's key blank saves a reference-free profile and therefore preserves provider-native authentication such as the Bedrock credential chain or Vertex ADC. A successful Apply emits a local accessible status message without echoing secret material. The collapsed 自定义设置 fold carries the curated extras — `baseURL` for both families (the deepseek placeholder shows the public endpoint), each adapter's model catalog, and the **display name** and **API protocol** of a pi-ai route the adapter does not ship. Those two are what a hand-declared route names for itself: the create card asks for both because nothing can default them, so the editor reaches both rather than leaving them to `settings.yaml`. Clearing the name unsets it and the route falls back to its id, which is what the placeholder shows; the protocol has no such fallback. A catalog route gets neither — it defaults its name from its catalog entry, and its models each carry their own protocol, so a route-level one could only override every one of them. The Provider ID stays fixed: it is the settings key, the name every other namespace and every logged session references, and the stem of a credential reference the page cannot read back to move. Reasoning effort is deliberately NOT among them: it is a per-model capability and the models under one provider disagree about which levels they accept, so a provider-scoped control could only be set to a value some of them reject — which would hide even the models that support the level. The composer's model picker offers each model its own levels, and a switch there records provider, model, and effort together as the default for the next session. The profile field stays in `settings.yaml` for a deployment that knows its route. Each DeepSeek row edits `id`, optional display `name`, and optional `contextWindow`/`maxTokens`; existing fields outside that curated set survive edits, while every other profile field stays owned by `settings.yaml`. A row is deletable only when the user layer alone carries it (removal restores the composition base), and its localized confirmation dialog names the provider in the title, description, and final action. A row is tagged **Custom** when the directory entry says the owning adapter ships nothing under that key. The tag follows that answer alone: having a stored profile does not make a route custom — narrowing a shipped provider's models stores one too — and an adapter that reports nothing leaves its rows untagged rather than being read as shipped. -The DeepSeek step projects first-run readiness from that same joined snapshot after earlier onboarding pages complete. The step exists to leave the user with a model to talk to, so ANY provider they can already reach ends it without rendering — a registered route whose named credential reference is stored, including a read-only launch-environment credential, or one whose profile names no reference at all and therefore authenticates natively. Only a user with none of those is asked about DeepSeek, the one route the prompt can offer a key field for. It recognizes the official adapter through its `llm-deepseek` configurable-provider declaration, so an undeclared live route with the same provider id is not treated as repairable configuration. Only a mounted, active adapter with a missing writable reference shows the page that opens Settings on Models, whose existing setup card exclusively owns key input and `credentials.set`; the step never holds a secret. An absent adapter, inactive route, failed join, read-only deployment, or unusable settings or credential capability completes the step without rendering so onboarding cannot block the product; Models remains the diagnostic surface. +The notice step owns its exact copy and version in `src/onboarding-copy.ts`. On loopback it compares and writes `ui-onboarding.welcomeNoticeVersion` through the existing settings API; only an explicit Continue records the current version. A non-loopback browser cannot use that Host-only namespace, so acknowledgement is process-local and the notice returns after reload. + +After that notice completes, the DeepSeek step projects first-run readiness from the same joined Models snapshot. ANY provider the user can already reach ends it without rendering — a registered route whose named credential reference is stored, including a read-only launch-environment credential, or one whose profile names no reference and therefore authenticates natively. Only a user with none is asked for the official DeepSeek key. A mounted, active adapter with a missing writable reference renders the existing `ProviderEditor` in credential-only mode inside the shared onboarding modal; `credentials.set` stays the only secret write, and no provider settings are changed. Configure later completes only this coordinator pass. An absent adapter, inactive route, failed join, read-only deployment, or unusable settings or credential capability completes the step without rendering; Models remains the diagnostic surface. Every edit lands as `settings.mutate` path ops against the stored section — a set per changed field, an unset per cleared one, and a single unset for a deleted provider row. The page only ever holds the REDACTED descriptor, so it mutates the fields it can see rather than rebuilding a section. DeepSeek's `models` is one replace-by-value array: the editor shows inherited effective rows until the first model edit materializes the complete array in the user layer, while reset unsets that override. A row carries the model id and display name; its context window and output cap sit behind the row's own disclosure, with the same fields the pi-ai provider form uses. Either capacity is typed as a count with an optional decimal `K` or `M` suffix (`256K`, `1M`; `1M` is 1000K) and stored as the plain count, spelled back in the shortest form that round-trips. Empty ids, duplicate ids, empty explicit names, and unreadable, non-positive, or fractional capacities fail before any write. A typed API key is judged on its own field the same way: after trimming, it must be non-empty and every character must be printable ASCII (`[\x21-\x7E]`), which is exactly what an HTTP header value can carry — the twin of `normalizeApiKey` in `@deepseek-ai/dsh-llm`, mirrored here because the source-plane split forbids importing it. A value matching a pasted `NAME=value` environment line or wrapped in matching quotes is refused as the same format failure; that pasted-line check runs only in the browser, since a false positive in a resolver would leave the environment refusing the key as well. A field holding only whitespace fails rather than being silently dropped, while an empty field is not a failure at all: it means keep the stored key on an editor card, and authenticate some other way on a create card. A refused key blocks both the write and the endpoint interrogation, so the page never spends a round trip to be told what the field already says. Each settings write carries the card's current `revision`, so a concurrent write from another tab or an external `settings.yaml` edit is refused as `settings-conflict`; after settings commit, the card adopts the returned redacted user subtree and revision before storing the credential, which makes a failed credential stage retry only that stage. Deletion removes a configured, writable credential only when the profile names the page's derived `_API_KEY` target, then unsets the profile; both operations are idempotent, and a partial failure remains in the identified confirmation dialog for retry. Environment credentials, custom references, and credentials whose target cannot be identified remain untouched. Once loaded, the page subscribes directly to forwarded `settings/document-updated`, `credentials/updated`, and `llm/adapters-updated` owner events, plus local `connection/reset`, so an external `settings.yaml` edit, a second tab, or a settings-born route converges without polling. diff --git a/packages/client/ui-settings-models/README.zh.md b/packages/client/ui-settings-models/README.zh.md index 408f201763..68bb64ddee 100644 --- a/packages/client/ui-settings-models/README.zh.md +++ b/packages/client/ui-settings-models/README.zh.md @@ -2,11 +2,13 @@ [English](README.md) | 中文 -模型设置�件:�供方�置页和按�件显示的 DeepSeek 官方首次使用引导步骤。它把三个�议领域汇�为一个共享快照:`llm.providers`(��置�供方目录,���路由的存活�休眠状�)�`settings.describe`(�列化 schema�分层脱�值�secret slot)与 `credentials.describe`(��值的 configured/source/writable 徽标);页��此渲染�供方行,一次�展开一张编辑�片,且�把路由存活状�呈现为�供方状�。 +模型设置与产�引导�件。�一个 client Cordis �件会注册 Models 页�和两个有�的首次使用弹窗:版本化内测声明,以�按�件显示的 DeepSeek 官方凭�步骤。两个步骤共用�一套弹窗组件,并继续由 `settings.onboarding` 排�。Models 平�把三个�议领域汇�为一个共享快照:`llm.providers`(��置�供方目录,���路由的存活�休眠状�)�`settings.describe`(�列化 schema�分层脱�值�secret slot)与 `credentials.describe`(��值的 configured/source/writable 徽标);页��此渲染�供方行,一次�展开一张编辑�片,且�把路由存活状�呈现为�供方状�。 行是*已�置*的�供方(其 profile 在所属 namespace 中解�得出);其�置键未在任何�置�置的整分节�供方会渲染为其展开的设置�片而�一行,但仅�首次�行姿�——�尚无任何�供方已注册且备�其 profile 所指�的凭�——且仅�续到用户关闭该�片为止,此�它就是一行带缺失密钥点的普通行。�一类�片�自�有自己的展开状�,因此关掉其中一张��会丢弃�一张里的�稿。「新增��程则是一张承载休眠目录�供方选择框的�片——裸挂载的 `llm-pi-ai` 在任何路由存在之�就能�供其完整的已安装 catalog。pi-ai �片还会编辑该路由的**模型列表**,并�查询�供方所�供的模型。�有确认引用的凭�已�置时,行�会以绿色实心点标示 API 密钥状�;�有确认具�引用缺失时,�会以红色实心点标示。无引用的�供方原生认�以�无法�得凭�补充信�时都�显示状�点。编辑器是�个适�器家��一张的手写�片:主字段是�独一个 **API 密钥**输入框——页�从�询问环境���;键入的密钥� `credentials.set` 以**�写**方�存入 profile 的引用之下,profile 没有引用时便派生 `_API_KEY`,pi-ai profile 会把这次派生记录为 `apiKeyEnv`,因此 `settings.yaml` 从��带密钥值。为新的 pi-ai �供方留空密钥会�存一个�带引用的 profile,因此能�留�供方原生认�,例如 Bedrock 凭�链或 Vertex ADC。「应用��功�会�出本地无障�状�消�,且��回显任何机密内容。收起的「自定义设置�折�区承载精选的�外字段——两个家�都有 `baseURL`(deepseek 的��符显示公共端点)��适�器自己的模型目录,以�适�器未�供的那类 pi-ai 路由的**显示�称**与 **API �议**。这两个字段是手工声明路由为自己命�的东西:创建�片之所以索�它们,正因为没有东西能为它们兜底,因此编辑器也够得�这两个,而�是把它们留给 `settings.yaml`。清空�称��消设置,路由退回自己的 id——��符显示的就是它;�议没有这样的兜底。内置目录路由两个都�给:它的�称由目录�目兜底,它的�个模型�自带�自己的�议,路由级�议��能把它们全部覆盖掉。Provider ID ��固定:它是 settings 的键�是其他�个 namespace 与�一�已记录会�引用的�字,也是页�读�回�因而��走的凭�引用�干。推�等级刻�**�在**其中:它是按模型的能力,而�一�供方下�模型接�的档�并�一致,因此�供方级的控件��能被设�其中一些模型会拒�的值——那会连支�该档�的模型也一并��。输入框的模型选择器为�个模型�供它自己的档�,在那里切�会把�供方�模型�推�等级一并记为下一个会�的默认值。profile 字段�留在 `settings.yaml`,供清楚自己路由的部署使用。�� DeepSeek 模型行�编辑 `id`��选的显示�称 `name` 与�选的 `contextWindow`/`maxTokens`;精选集�以外的现有字段会在编辑��留,其余�个 profile 字段�归 `settings.yaml` 所有。�有当�行仅由用户层承载时它��删除(删除会还原组� base),其本地化确认对�框会在标题�说明和最终�作中点�该�供方。当目录�目表明拥有该路由的适�器在这个键下什么都没有时,该行会带上 **自定义** 标签。标签�跟�这个答案:存了 profile 并�使一�路由�为自定义——收窄一个内置�供方的模型�样会存下 profile——而什么都�回答的适�器,其路由��无标签,�会被当�内置。 -��首次使用引导页�完��,DeepSeek 步骤会从�一个�接快照得出首次�行就绪状�。该步骤的存在是为了让用户手上有一个�对�的模型,因此��用户已�能触达**任何**一个�供方,它就直接完�而�渲染——已注册且其具�凭�引用已存储的路由(包括�自�动环境且�读的凭�),或 profile 根本�指�任何引用�因而走原生认�的路由。�有二者皆无的用户�会被问到 DeepSeek,�这��示唯一能为其�供密钥输入框的路由。它通过 `llm-deepseek` 的��置�供方声明识别官方适�器,因此� id 但未声明的存活路由�属于�修��置。�有已挂载且活跃�引用�写但尚未�置的适�器�会显示�往「设置�Models 分区的页�;密钥输入和 `credentials.set` 仅由该分区已有的设置�片负责,该步骤���有 secret。适�器缺失�路由�活跃��接失败�部署�读或设置�凭�能力��用时,该步骤��渲染并直接完�,以�首次使用引导阻塞产�;Models 页�是诊断界�。 +声明步骤在 `src/onboarding-copy.ts` 中�有完整文案和版本。回环访问会通过既有 settings API 比较并写入 `ui-onboarding.welcomeNoticeVersion`;�有明确点击「继续��会记录当�版本。�回环�览器无法使用这项仅� Host 的 namespace,因此确认仅在当�进程有效,�载�声明会�次出现。 + +声明完��,DeepSeek 步骤会从�一个 Models �接快照得出首次�行就绪状�。��用户已�能触达**任何**一个�供方,它就直接完�而�渲染——已注册且其具�凭�引用已存储的路由(包括�自�动环境且�读的凭�),或 profile 根本�指�引用�因而走原生认�的路由。�有二者皆无的用户�会被�求填写 DeepSeek 官方密钥。适�器已挂载且活跃�引用�写但尚未�置时,既有 `ProviderEditor` 会以仅凭�模�渲染在共用引导弹窗中;`credentials.set` �是唯一的 secret 写入,且�会改��供方设置。「���置��完��调器当�这一轮。适�器缺失�路由�活跃��接失败�部署�读或设置�凭�能力��用时,该步骤�渲染并直接完�;Models 页�是诊断界�。 �一次编辑都以 `settings.mutate` 的路径 op �到已存分节上——�个�更字段一� set��个清空字段一� unset�删除�供方行则是�独一� unset。页�自始至终��有**脱��**的 descriptor,因此它�修改自己看得�的字段,而��建分节。DeepSeek 的 `models` 是一个按值整体替�的数组:编辑器会显示继承而�的生效模型行,直到第一次模型编辑将完整数组具化到用户层;�置则会�消该覆盖。�个模型行承载模型 ID 与显示�称,其上下文窗�与最大输出 token 数则收在该行自己的折�区里,使用与 pi-ai �供方表�相�的字段。两项容�都按数值键入,�带�进制的 `K` 或 `M` �缀(`256K`�`1M`;`1M` � 1000K),存储为纯数值,回显时写�能够往返的最短形�。空 ID��� ID�显�填写的空�称,以�无法读���正数或�整数的容�都会在写入�失败。键入的 API 密钥�样在它自己的字段上被判定:trim 之�必须�空,且�个字符都是�打� ASCII(`[\x21-\x7E]`)——这正是 HTTP 标头值所能承载的范围,是 `@deepseek-ai/dsh-llm` 中 `normalizeApiKey` 的孪生体,因��平�分割�止直接引入而在此镜�。与整行粘贴的 `NAME=value` 环境��匹�或首尾�对引�包裹的值,会以�一�格�失败被拒�;这项粘贴行检查�在�览器中�行,因为 resolver 中的一次误判会连带让环境��这�路也拒�该密钥。��空白的输入框会失败而�是被�默丢弃;留空则完全�是失败:在编辑�片上�味���已存储的密钥,在新建�片上则�味�以其他方�鉴�。被拒�的密钥会�时拦截写入与端点探测,因此页��会白花一次往返去��字段上已�写明的答案。�次 settings 写入都�带�片当�的 `revision`,因此�自�一个标签页或对 `settings.yaml` 的外部编辑所产生的并�写入会以 `settings-conflict` 被拒�;settings �交�功�,�片会在存储凭��采用�应返回的脱�用户�树与 revision,因此凭�阶段失败时,�试�会��该阶段。删除�作�会在 profile 指�页�派生的 `_API_KEY` 目标时清除已�置且�写的凭�,���消设置 profile;两项�作都具备幂等性,部分失败会�留在点�目标的确认对�框中供�试。环境凭��自定义引用和无法识别目标的凭�����。页�加载完��会直接订阅转�的 owner 事件 `settings/document-updated`�`credentials/updated`�`llm/adapters-updated`,以�本地 `connection/reset`,因此外部的 `settings.yaml` 编辑�第二个标签页或 settings 新生的路由都无需轮询��收敛。 diff --git a/packages/client/ui-settings-models/package.json b/packages/client/ui-settings-models/package.json index 71dbde5bd4..423755475c 100644 --- a/packages/client/ui-settings-models/package.json +++ b/packages/client/ui-settings-models/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-models", - "description": "Models settings and official-DeepSeek first-run routing over one live provider/settings/credential join", - "version": "0.0.1-rc.5", + "description": "Models settings and shared product-onboarding dialogs over existing settings and credential joins", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.module.css b/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.module.css index 221239d7bb..9f7ecbc611 100644 --- a/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.module.css +++ b/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.module.css @@ -1,99 +1,16 @@ -.page { - position: relative; - z-index: 1; - width: min(640px, calc(100vw - 64px)); - max-height: 100vh; - padding: clamp(104px, 18vh, 156px) 0 40px; - box-sizing: border-box; - overflow-y: auto; - color: var(--dsw-alias-label-primary); -} - -.brand { - display: flex; - align-items: center; - margin-bottom: 42px; - color: var(--dsw-alias-label-primary); -} - -.title { - margin: 0; - font-size: 28px; - line-height: 36px; - font-weight: 600; - letter-spacing: -0.02em; - outline: none; -} - .description { - margin: 16px 0 0; - font-size: 16px; - line-height: 28px; + margin: 0; + font-size: 14px; + line-height: 24px; color: var(--dsw-alias-label-secondary); } -.actions { - display: flex; - align-items: center; - justify-content: flex-end; - gap: 12px; - margin-top: 32px; -} - -.primary { - min-width: 132px; -} - -.brand, -.title, -.description, -.actions { - animation: credential-enter 280ms cubic-bezier(0.23, 1, 0.32, 1) both; -} - -.title { animation-delay: 40ms; } -.description { animation-delay: 80ms; } -.actions { animation-delay: 120ms; } - -@keyframes credential-enter { - from { - opacity: 0; - transform: translateY(8px); - } - - to { - opacity: 1; - transform: translateY(0); - } -} - -@media (prefers-reduced-motion: reduce) { - .brand, - .title, - .description, - .actions { - animation: none; - } +.editor { + margin-top: 24px; } @media (max-width: 560px) { - .page { - width: calc(100vw - 40px); - padding-top: 64px; - } - - .brand { - margin-bottom: 30px; - } - - .actions { - align-items: stretch; - flex-direction: column-reverse; - margin-top: 32px; - } - - .primary, - .later { - width: 100%; + .editor { + margin-top: 20px; } } diff --git a/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx b/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx index 302d4592f8..24e2112096 100644 --- a/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx +++ b/packages/client/ui-settings-models/src/client/DeepSeekOnboardingDialog.tsx @@ -2,33 +2,39 @@ * Official-DeepSeek first-run step. Readiness comes from the same * provider/settings/credential join as the Models page: any provider the user * can already talk to ends the step, and only a user with none is offered the - * official DeepSeek route. The prompt itself only routes to that page's single - * credential editor. + * official DeepSeek route. The step reuses that page's credential editor in + * the onboarding plugin's shared modal, so the key is entered once. */ -import { useEffect, useRef } from 'react' +import { useEffect } from 'react' import type { ReactNode } from 'react' -import type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots' -import { BrandWordmark, Button, OnboardingSurface } from '@deepseek-ai/dsh-client-ui-primitives' -import type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-web-react' +import type { IApiClient } from '@deepseek-ai/dsh-api-remotes/client' +import type { SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client' +import type { InjectFace, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots' import type { ModelsSettingsState, ModelsSettingsStore } from './store.ts' import { onboardingReadiness } from './store.ts' +import { ProviderEditor } from './ProviderEditor.tsx' import type { en } from './locales.ts' +import { OnboardingModal } from './OnboardingModal.tsx' import styles from './DeepSeekOnboardingDialog.module.css' -/** Injected dependencies of {@link DeepSeekOnboardingDialog}. */ +/** Registration-side dependencies of {@link DeepSeekOnboardingDialog}. */ export interface DeepSeekOnboardingInjected { + hooks: { + /** Shared Models-page join state, bound by the slot renderer. */ + models: SnapshotStore + } /** Shared Models-page join controller. */ controller: ModelsSettingsStore - /** Subscription hook bound to the shared join snapshot. */ - useSnapshot: SnapshotSelectorHook + /** Existing wire face reused by the Models credential editor. */ + api: Pick /** Feature copy. */ t: (key: keyof typeof en) => string } /** Slot owner props plus the feature's injected dependencies. */ export type DeepSeekOnboardingDialogProps = - PropsRuntime<'settings.onboarding'> & DeepSeekOnboardingInjected + PropsRuntime<'settings.onboarding'> & InjectFace /* v8 ignore next 3 -- closed-union defaults only defend future source widening */ function assertNever(_value: never): never { @@ -36,16 +42,15 @@ function assertNever(_value: never): never { } /** - * Prompt a first-run user to open Models while no provider can serve requests - * and the official adapter exists with an unconfigured effective credential. + * Prompt a first-run user for the official DeepSeek credential while no + * provider can serve requests and that credential is writable. * @param props - settings-shell owner state and Models feature dependencies. - * @returns the onboarding page or null when onboarding needs no intervention. + * @returns the onboarding modal or null when onboarding needs no intervention. */ export function DeepSeekOnboardingDialog(props: DeepSeekOnboardingDialogProps): ReactNode { - const { complete, openSection, controller, useSnapshot, t } = props - const state = useSnapshot(snapshot => snapshot) + const { complete, controller, useModels, api, t } = props + const state = useModels(snapshot => snapshot) const readiness = onboardingReadiness(state) - const titleRef = useRef(null) useEffect(() => { if (state.status === 'idle') void controller.load() @@ -59,18 +64,6 @@ export function DeepSeekOnboardingDialog(props: DeepSeekOnboardingDialogProps): ) complete() }, [complete, readiness.kind]) - useEffect(() => { - if (readiness.kind === 'credential-missing') titleRef.current?.focus() - }, [readiness.kind]) - - const openModels = (): void => { - complete() - openSection('models') - } - - // Null covers the still-deciding and nothing-to-do states alike: the - // takeover chrome below is part of THIS render, so declining paints and - // blocks nothing while the shared join is in flight. switch (readiness.kind) { case 'loading': case 'adapter-absent': @@ -84,28 +77,44 @@ export function DeepSeekOnboardingDialog(props: DeepSeekOnboardingDialogProps): return assertNever(readiness) } + const row = state.rows.find(candidate => + candidate.entry.provider === 'deepseek-official' + && candidate.entry.settingsNs === 'llm-deepseek' + && candidate.entry.settingsPath.length === 0) + const namespace = state.namespaces.get('llm-deepseek') + /* v8 ignore next 2 -- credential-missing is derived only from this exact joined row. */ + if (row === undefined || namespace === undefined) return null + + const finishCredential = (changed: boolean): void => { + if (!changed) { + complete() + return + } + void controller.load() + } + return ( - -
- -

- {t('onboardingTitle')} -

-

{t('onboardingDescription')}

-
- - -
-
-
+ +

{t('onboardingDescription')}

+
+ +
+
) } diff --git a/packages/client/ui-settings-models/src/client/EditorFooter.tsx b/packages/client/ui-settings-models/src/client/EditorFooter.tsx index adcb009cdf..6306609ca5 100644 --- a/packages/client/ui-settings-models/src/client/EditorFooter.tsx +++ b/packages/client/ui-settings-models/src/client/EditorFooter.tsx @@ -29,6 +29,8 @@ export interface EditorFooterProps { submitLabel: keyof typeof en /** Commit label while a commit is in flight. */ submitBusyLabel: keyof typeof en + /** Dismiss label; defaults to the settings editor copy. */ + cancelLabel?: keyof typeof en /** Dismiss the card without committing. */ onCancel: () => void /** Run the card's commit. */ @@ -50,7 +52,7 @@ export function EditorFooter(props: EditorFooterProps): ReactNode { disabled={props.busy} onClick={props.onCancel} > - {t('cancel')} + {t(props.cancelLabel ?? 'cancel')} + + + ) +} diff --git a/packages/client/ui-settings-models/src/client/index.ts b/packages/client/ui-settings-models/src/client/index.ts index 08d77a1832..dc7f32e370 100644 --- a/packages/client/ui-settings-models/src/client/index.ts +++ b/packages/client/ui-settings-models/src/client/index.ts @@ -1,8 +1,9 @@ /** - * Models settings plugin, browser half. Registers the `models` nav entry and - * official-DeepSeek first-run overlay into shell-declared slots. Both consume - * one provider/settings/credential join; the overlay routes missing-key users - * to the full page's single credential editor. Export discipline: + * Models settings and product-onboarding plugin, browser half. It registers + * the Models page plus the ordered internal-testing and official-DeepSeek + * onboarding dialogs, whose UI shares this package's modal wrapper. The Host + * settings and credential contracts stay behind their existing wire APIs. + * Export discipline: * packages/client/AGENTS.md. */ import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client' @@ -19,15 +20,19 @@ import { ModelsSection } from './ModelsSection.tsx' import type { ModelsSectionInjected } from './ModelsSection.tsx' import { DeepSeekOnboardingDialog } from './DeepSeekOnboardingDialog.tsx' import type { DeepSeekOnboardingInjected } from './DeepSeekOnboardingDialog.tsx' +import { WelcomeNotice } from './WelcomeNotice.tsx' +import type { WelcomeNoticeInjected } from './WelcomeNotice.tsx' +import { refreshWelcomeIfLoaded, WelcomeNoticeStore } from './welcome-store.ts' import { ModelsSettingsStore } from './store.ts' import { en, zh, type ModelsKey } from './locales.ts' +import { WELCOME_NOTICE_SETTINGS_NAMESPACE } from '../onboarding-copy.ts' export type { ModelsSectionInjected, ModelsSectionProps } from './ModelsSection.tsx' export type { ModelsKey } from './locales.ts' declare module '@deepseek-ai/dsh-client-ui-slots' { interface LocaleNamespaceMap { - /** The Models page + onboarding overlay copy. */ + /** The Models page + product-onboarding copy. */ 'settings.models': ModelsKey } } @@ -74,21 +79,38 @@ export function apply(ctx: ClientContext): void { api: connection.api, t, }) - const onboardingInjected = (): DeepSeekOnboardingInjected => ({ + const deepSeekOnboardingInjected = (): DeepSeekOnboardingInjected => ({ controller, - useSnapshot, + hooks: { models: controller.store }, + api: connection.api, + t, + }) + const welcomeController = new WelcomeNoticeStore( + connection.api, + connection.isLoopback ? 'host' : 'memory', + ) + const welcomeInjected = (): WelcomeNoticeInjected => ({ + controller: welcomeController, + hooks: { welcome: welcomeController.store }, t, }) // Pushed invalidations converge every open surface without polling: any // settings/credentials/topology change refetches once the page loaded. ctx.effect(() => { - const refresh = (): void => { refreshIfLoaded(controller) } + const refreshModels = (): void => { refreshIfLoaded(controller) } + const refreshAll = (): void => { + refreshModels() + refreshWelcomeIfLoaded(welcomeController) + } const disposers = [ - ctx.remote.$on('settings/document-updated', refresh), - ctx.remote.$on('credentials/updated', refresh), - ctx.remote.$on('llm/adapters-updated', refresh), - ctx.on('connection/reset', refresh), + ctx.remote.$on('settings/document-updated', (ns) => { + refreshModels() + if (ns === WELCOME_NOTICE_SETTINGS_NAMESPACE) refreshWelcomeIfLoaded(welcomeController) + }), + ctx.remote.$on('credentials/updated', refreshModels), + ctx.remote.$on('llm/adapters-updated', refreshModels), + ctx.on('connection/reset', refreshAll), ] return () => { for (const dispose of disposers) dispose() } }, 'ui-settings-models: pushed invalidations') @@ -100,10 +122,16 @@ export function apply(ctx: ClientContext): void { label: () => t('nav'), inject: injected, }, ModelsSection)) + ctx.slots.inject('settings.onboarding', () => ctx.slots.register({ + name: 'settings.onboarding', + id: 'welcome-notice', + order: -100, + inject: welcomeInjected, + }, WelcomeNotice)) ctx.slots.inject('settings.onboarding', () => ctx.slots.register({ name: 'settings.onboarding', id: 'deepseek-official', order: 0, - inject: onboardingInjected, + inject: deepSeekOnboardingInjected, }, DeepSeekOnboardingDialog)) } diff --git a/packages/client/ui-settings-models/src/client/locales.ts b/packages/client/ui-settings-models/src/client/locales.ts index 561a5df494..a49a4f0ef2 100644 --- a/packages/client/ui-settings-models/src/client/locales.ts +++ b/packages/client/ui-settings-models/src/client/locales.ts @@ -1,5 +1,7 @@ /** Copy dictionaries for the Models settings section. */ +import { WELCOME_NOTICE_COPY } from '../onboarding-copy.ts' + /** English strings (the key-set source of truth for this pair). */ export const en = { nav: 'Models', @@ -85,17 +87,23 @@ export const en = { customNeedsModels: 'A custom provider needs at least one model.', create: 'Create provider', creating: 'Creating\u2026', + welcomeTitle: WELCOME_NOTICE_COPY.en.title, + welcomeBody: WELCOME_NOTICE_COPY.en.body, + welcomeContinue: WELCOME_NOTICE_COPY.en.continueLabel, + welcomeError: 'The acknowledgement could not be saved. Please try again.', onboardingTitle: 'Add an API key to get started', onboardingDescription: 'Configure the official DeepSeek provider to start building.', - onboardingGoToSettings: 'Go to settings', onboardingLater: 'Configure later', + onboardingSave: 'Save and continue', + onboardingSaving: 'Saving…', + keyRequired: 'Enter an API key to continue.', } /** The settings.models namespace key union. */ export type ModelsKey = keyof typeof en /** Chinese strings (same keys as {@link en}). */ -export const zh: typeof en = { +export const zh: { [Key in keyof typeof en]: string } = { nav: '模型', title: '模型', intro: '填入��供方的 API 密钥��使用其模型。', @@ -179,8 +187,14 @@ export const zh: typeof en = { customNeedsModels: '自定义�供方至少需�一个模型。', create: '创建�供方', creating: '创建中\u2026', + welcomeTitle: WELCOME_NOTICE_COPY.zh.title, + welcomeBody: WELCOME_NOTICE_COPY.zh.body, + welcomeContinue: WELCOME_NOTICE_COPY.zh.continueLabel, + welcomeError: '暂时无法�存确认状�,请�试。', onboardingTitle: '添加一个 API Key 开始使用', onboardingDescription: '�置 DeepSeek 官方模型,��开始使用。', - onboardingGoToSettings: '�往�置', onboardingLater: '���置', + onboardingSave: '�存并继续', + onboardingSaving: '�存中…', + keyRequired: '请输入 API 密钥�继续。', } diff --git a/packages/client/ui-settings-general/src/client/welcome-store.ts b/packages/client/ui-settings-models/src/client/welcome-store.ts similarity index 94% rename from packages/client/ui-settings-general/src/client/welcome-store.ts rename to packages/client/ui-settings-models/src/client/welcome-store.ts index 48f96bcb94..6e139f1a43 100644 --- a/packages/client/ui-settings-general/src/client/welcome-store.ts +++ b/packages/client/ui-settings-models/src/client/welcome-store.ts @@ -74,8 +74,7 @@ export class WelcomeNoticeStore { } /** - * Acknowledge this copy version. The Host path mutation is idempotent across - * tabs and preserves sibling settings; remote fallback changes only this store. + * Persist this copy version, or advance only this process for a remote browser. * @returns true when the selected persistence mode accepted the acknowledgement. */ async acknowledge(): Promise { @@ -118,8 +117,7 @@ export class WelcomeNoticeStore { /** * Refresh only after welcome state has left idle. A memory-mode load retains - * acknowledgement so reconnect and settings-change refreshes do not reopen a - * process-local notice. + * acknowledgement so reconnect does not reopen a process-local notice. * @param controller - welcome state owner whose current status decides whether to load. */ export function refreshWelcomeIfLoaded(controller: WelcomeNoticeStore): void { diff --git a/packages/client/ui-settings-models/src/onboarding-copy.ts b/packages/client/ui-settings-models/src/onboarding-copy.ts new file mode 100644 index 0000000000..d52371a9cf --- /dev/null +++ b/packages/client/ui-settings-models/src/onboarding-copy.ts @@ -0,0 +1,25 @@ +/** Durable settings namespace for product-wide GUI onboarding facts. */ +export const WELCOME_NOTICE_SETTINGS_NAMESPACE = 'ui-onboarding' + +/** Field storing the last welcome notice version the user acknowledged. */ +export const WELCOME_NOTICE_ACK_FIELD = 'welcomeNoticeVersion' + +/** + * Bump only when the notice changes materially and every user should see it + * again. The acknowledgement is compared for exact equality. + */ +export const WELCOME_NOTICE_VERSION = '2026-08-13.1' + +/** The complete editable internal-testing notice in both supported GUI locales. */ +export const WELCOME_NOTICE_COPY = { + zh: { + title: '内测声明', + body: 'DeepSeek Harness 目�的 0.1 版本�处在�� Harness 开�者进行测试的阶段,还有许多地方需��续改进和打磨,希望��广大开�者的�馈建议。预计 DeepSeek Harness 的核心�件以�基础 API 都会在接下�的一段时间内快速迭代��续演化。\n\n我们期待与全�开�者一起,在开��开放���用��组�的基础设施之上,共�探索智能上�。欢迎全� Harness 开�者加入 DSH �件生�。', + continueLabel: '继续', + }, + en: { + title: 'Internal Testing Notice', + body: "DeepSeek Harness 0.1 remains in testing for Harness developers. Many areas need further improvement, and we welcome feedback from the developer community. DeepSeek Harness's core plugins and foundational APIs will continue to evolve rapidly over the coming months.\n\nWe look forward to exploring the limits of intelligence with developers around the world, building on open-source, open, reusable, and composable infrastructure. We welcome Harness developers everywhere to join the DSH plugin ecosystem.", + continueLabel: 'Continue', + }, +} as const diff --git a/packages/client/ui-settings-models/tests/apply.client.spec.ts b/packages/client/ui-settings-models/tests/apply.client.spec.ts index e914b1fe5b..39ba3e4b65 100644 --- a/packages/client/ui-settings-models/tests/apply.client.spec.ts +++ b/packages/client/ui-settings-models/tests/apply.client.spec.ts @@ -8,12 +8,13 @@ import { TestRemote, usePinnedBrowserLanguages } from '@deepseek-ai/dsh-client-t import { apply, inject, refreshIfLoaded } from '@deepseek-ai/dsh-client-ui-settings-models/client' import { ModelsSection } from '../src/client/ModelsSection.tsx' import { DeepSeekOnboardingDialog } from '../src/client/DeepSeekOnboardingDialog.tsx' +import { WelcomeNotice } from '../src/client/WelcomeNotice.tsx' // The service reads its initial locale from the browser; these specs assert // the shipped Chinese copy, so they state the browser they assume. usePinnedBrowserLanguages('zh-CN') -async function bench() { +async function bench(isLoopback = true) { const ctx = new Context() await ctx.plugin(SlotRegistry).await() const locale = new LocaleRuntime(ctx) @@ -23,7 +24,7 @@ async function bench() { new TestRemote(ctx) // The apply path only captures the wire face; no call leaves this fake // until a section actually loads. - ctx.provide('connection', { api: {} } as never) + ctx.provide('connection', { api: {}, isLoopback } as never) return { ctx, slots: ctx.get('slots') as SlotRegistry, locale } } @@ -60,9 +61,20 @@ describe('ui-settings-models apply', () => { expect(typeof injected.controller.load).toBe('function') expect(typeof injected.useSnapshot).toBe('function') expect(injected.api).toBeDefined() - const onboarding = before.slots.entries('settings.onboarding')[0]! - expect(onboarding.component).toBe(DeepSeekOnboardingDialog) - expect(onboarding.options).toMatchObject({ id: 'deepseek-official', order: 0 }) + const onboarding = before.slots.entries('settings.onboarding') + expect(onboarding).toHaveLength(2) + expect(onboarding.find(entry => entry.options.id === 'welcome-notice')).toMatchObject({ + component: WelcomeNotice, + options: { id: 'welcome-notice', order: -100 }, + }) + const deepSeek = onboarding.find(entry => entry.options.id === 'deepseek-official')! + expect(deepSeek.component).toBe(DeepSeekOnboardingDialog) + expect(deepSeek.options).toMatchObject({ id: 'deepseek-official', order: 0 }) + const deepSeekInjected = ( + deepSeek.inject as unknown as () => import('../src/client/DeepSeekOnboardingDialog.tsx').DeepSeekOnboardingInjected + )() + expect(deepSeekInjected.hooks.models).toBe(injected.controller.store) + expect(deepSeekInjected.api).toBeDefined() const after = await bench() await after.ctx.plugin({ inject: [...inject], apply }).await() @@ -71,7 +83,7 @@ describe('ui-settings-models apply', () => { declare(after.slots) await Promise.resolve() expect(after.slots.entries('settings.section')[0]!.component).toBe(ModelsSection) - expect(after.slots.entries('settings.onboarding')[0]!.component).toBe(DeepSeekOnboardingDialog) + expect(after.slots.entries('settings.onboarding')).toHaveLength(2) // The self-inflicted ledger notifications hit the duplicate guard. expect(after.slots.entries('settings.section')).toHaveLength(1) }) @@ -110,7 +122,7 @@ describe('ui-settings-models apply', () => { declare(b.slots) await Promise.resolve() expect(b.slots.entries('settings.section')[0]!.component).toBe(ModelsSection) - expect(b.slots.entries('settings.onboarding')[0]!.component).toBe(DeepSeekOnboardingDialog) + expect(b.slots.entries('settings.onboarding')).toHaveLength(2) // The locale path also recovers through the same ledger re-check. b.locale.setLocale('en') expect(resolveSlotLabel(b.slots.entries('settings.section')[0]!.options.label)).toBe('Models') @@ -130,6 +142,22 @@ describe('ui-settings-models apply', () => { expect(() => b.locale.register('settings.models', 'zh', {})).not.toThrow() expect(() => b.locale.register('settings.models', 'en', {})).not.toThrow() }) + + it('keeps remote-browser acknowledgement in process memory', async () => { + const b = await bench(false) + declare(b.slots) + await b.ctx.plugin({ inject: [...inject], apply }).await() + const entry = b.slots.entries('settings.onboarding') + .find(candidate => candidate.options.id === 'welcome-notice')! + const injected = ( + entry.inject as unknown as () => import('../src/client/WelcomeNotice.tsx').WelcomeNoticeInjected + )() + + await injected.controller.load() + expect(injected.controller.store.getSnapshot()).toEqual({ + status: 'ready', acknowledged: false, error: null, + }) + }) }) describe('pushed invalidations', () => { @@ -164,8 +192,10 @@ describe('pushed invalidations', () => { const b = await bench() declare(b.slots) await b.ctx.plugin({ inject: [...inject], apply }).await() + const entry = b.slots.entries('settings.onboarding') + .find(candidate => candidate.options.id === 'deepseek-official')! const injected = ( - b.slots.entries('settings.onboarding')[0]!.inject as unknown as + entry.inject as unknown as () => import('../src/client/DeepSeekOnboardingDialog.tsx').DeepSeekOnboardingInjected )() injected.controller.store.update((state) => { state.status = 'ready' }) @@ -173,4 +203,25 @@ describe('pushed invalidations', () => { b.ctx.remote.$dispatch('credentials/updated', ['DEEPSEEK_API_KEY']) expect(load).toHaveBeenCalledTimes(1) }) + + it('routes only the onboarding namespace invalidation into welcome state', async () => { + const b = await bench() + declare(b.slots) + await b.ctx.plugin({ inject: [...inject], apply }).await() + const entry = b.slots.entries('settings.onboarding') + .find(candidate => candidate.options.id === 'welcome-notice')! + const injected = ( + entry.inject as unknown as + () => import('../src/client/WelcomeNotice.tsx').WelcomeNoticeInjected + )() + injected.hooks.welcome.update((state) => { state.status = 'ready' }) + const load = vi.spyOn(injected.controller, 'load').mockResolvedValue() + + b.ctx.remote.$dispatch('settings/document-updated', ['llm-deepseek', 1]) + expect(load).not.toHaveBeenCalled() + b.ctx.remote.$dispatch('settings/document-updated', ['ui-onboarding', 2]) + expect(load).toHaveBeenCalledOnce() + b.ctx.emit('connection/reset') + expect(load).toHaveBeenCalledTimes(2) + }) }) diff --git a/packages/client/ui-settings-models/tests/components.client.spec.tsx b/packages/client/ui-settings-models/tests/components.client.spec.tsx index 01f0a32349..66ba8d33a4 100644 --- a/packages/client/ui-settings-models/tests/components.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/components.client.spec.tsx @@ -48,7 +48,7 @@ const PiAiConfig = Schema.object({ const DeepSeekConfig = Schema.object({ apiKeyEnv: Schema.string().role('credential-ref'), baseURL: Schema.string().pattern(/^https:\/\//), - reasoningEffort: Schema.union(['off', 'high', 'max']), + reasoningEffort: Schema.union(['off', 'low', 'high', 'max']), defaultContextWindow: Schema.number().step(1).min(1), models: Schema.array(Schema.object({ id: Schema.string().required(), @@ -355,6 +355,65 @@ describe('ModelsSection', () => { expect(screen.queryByRole('status')).toBeNull() }) + it('reuses the provider editor as a required credential-only onboarding form', async () => { + let finishSet: ((response: RpcResponse>) => void) | undefined + const set = vi.fn(() => new Promise>>((resolve) => { + finishSet = resolve + })) + const { face, mutate } = scriptedFace({ set }) + const onClose = vi.fn() + const { ProviderEditor } = await import('../src/client/ProviderEditor.tsx') + + render() + + const key = screen.getByLabelText(en.keyInput) + const save = screen.getByText(en.onboardingSave) + expect(document.activeElement).toBe(key) + expect(key.required).toBe(true) + expect(save.disabled).toBe(true) + expect(screen.getByText(en.onboardingLater)).toBeTruthy() + expect(screen.queryByText(en.customized)).toBeNull() + expect(screen.queryByLabelText(en.baseUrl)).toBeNull() + + fireEvent.change(key, { target: { value: ' ' } }) + expect(screen.getByText(en.keyRequired)).toBeTruthy() + expect(key.getAttribute('aria-invalid')).toBe('true') + expect(save.disabled).toBe(true) + + fireEvent.change(key, { target: { value: ' sk-onboarding ' } }) + expect(screen.queryByText(en.keyRequired)).toBeNull() + expect(save.disabled).toBe(false) + fireEvent.click(save) + + expect(await screen.findByText(en.onboardingSaving)).toBeTruthy() + expect(set).toHaveBeenCalledWith({ ref: 'DEEPSEEK_API_KEY', value: 'sk-onboarding' }) + expect(mutate).not.toHaveBeenCalled() + expect(onClose).not.toHaveBeenCalled() + + if (finishSet === undefined) throw new Error('credential write did not start') + await act(async () => { + finishSet?.(ok({})) + await Promise.resolve() + }) + expect(onClose).toHaveBeenCalledWith(true) + }) + it('applies customized deepseek fields as path ops', async () => { const { mutate } = await mountDeepSeekCard({ mutate: vi.fn(() => Promise.resolve(ok(wireNamespaces()[0]))), diff --git a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx index 2aea95b705..ebb5992cfe 100644 --- a/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/onboarding-dialog.client.spec.tsx @@ -2,14 +2,18 @@ /** First-run DeepSeek prompt behavior over the shared Models join. */ import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react' import { afterEach, describe, expect, it, vi } from 'vitest' -import type { RpcResponse } from '@deepseek-ai/dsh-api-remotes/client' +import Schema from '@deepseek-ai/schemastery' +import type { RpcResponse, SettingsNamespaceView } from '@deepseek-ai/dsh-api-remotes/client' import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react' import { DeepSeekOnboardingDialog } from '../src/client/DeepSeekOnboardingDialog.tsx' import type { DeepSeekOnboardingDialogProps } from '../src/client/DeepSeekOnboardingDialog.tsx' import { ModelsSettingsStore } from '../src/client/store.ts' import { en } from '../src/client/locales.ts' -afterEach(cleanup) +afterEach(() => { + cleanup() + document.getElementById('root')?.remove() +}) let nextRpc = 0 function ok(value: T): RpcResponse { @@ -22,6 +26,33 @@ function fail(message: string): RpcResponse { } } +const DeepSeekConfig = Schema.object({ + apiKeyEnv: Schema.string().role('credential-ref'), + baseURL: Schema.string().pattern(/^https:\/\//), + reasoningEffort: Schema.union(['off', 'low', 'high', 'max']), + defaultContextWindow: Schema.number().step(1).min(1), + models: Schema.array(Schema.object({ + id: Schema.string().required(), + name: Schema.string(), + description: Schema.string(), + contextWindow: Schema.number().step(1).min(1), + })), +}) + +function deepSeekNamespace(apiKeyEnv: string | null): SettingsNamespaceView { + const value = apiKeyEnv === null ? {} : { apiKeyEnv } + return { + ns: 'llm-deepseek', + schema: JSON.parse(JSON.stringify(DeepSeekConfig.toJSON())) as unknown, + value, + base: value, + user: {}, + applies: 'live', + secrets: [], + revision: 0, + } +} + function harness(options: { provider?: boolean providerSettingsNs?: string @@ -33,9 +64,24 @@ function harness(options: { describeFailure?: string settingsWritable?: boolean providersReject?: boolean + setFailure?: string + setReject?: string } = {}) { + if (document.getElementById('root') === null) { + const appRoot = document.createElement('div') + appRoot.id = 'root' + document.body.append(appRoot) + } let fileConfigured = false const configured = options.configured ?? (() => fileConfigured) + const apiKeyEnv = options.apiKeyEnv === undefined ? 'DEEPSEEK_API_KEY' : options.apiKeyEnv + const mutate = vi.fn(() => Promise.resolve(ok(deepSeekNamespace(apiKeyEnv)))) + const set = vi.fn((_payload: { ref: string; value: string }) => { + if (options.setReject !== undefined) return Promise.reject(new Error(options.setReject)) + if (options.setFailure !== undefined) return Promise.resolve(fail(options.setFailure)) + fileConfigured = true + return Promise.resolve(ok({})) + }) const face = { llm: { providers: () => { @@ -56,19 +102,10 @@ function harness(options: { settings: { describe: () => Promise.resolve(ok({ writable: options.settingsWritable ?? true, - namespaces: options.settingsNamespace === false - ? [] - : [{ - ns: 'llm-deepseek', - schema: {}, - value: options.apiKeyEnv === null - ? {} - : { apiKeyEnv: options.apiKeyEnv ?? 'DEEPSEEK_API_KEY' }, - applies: 'live' as const, - secrets: [], - revision: 0, - }], + hasDocument: false, + namespaces: options.settingsNamespace === false ? [] : [deepSeekNamespace(apiKeyEnv)], })), + mutate, }, credentials: { describe: () => options.describeFailure === undefined @@ -84,6 +121,7 @@ function harness(options: { }, })) : Promise.resolve(fail(options.describeFailure)), + set, }, } const controller = new ModelsSettingsStore(face as never) @@ -97,40 +135,91 @@ function harness(options: { useSessions: unusedHook, useWorkspaces: unusedHook, controller, - useSnapshot: bindSnapshotSelector(controller.store), + useModels: bindSnapshotSelector(controller.store), + api: face as never, t: key => en[key], } - return { controller, complete, openSection, props, configure: () => { fileConfigured = true } } + return { + controller, complete, openSection, props, mutate, set, + configure: () => { fileConfigured = true }, + } } describe('DeepSeekOnboardingDialog', () => { - it('loads on first entry and presents one accessible route to Models', async () => { + it('renders when the shell root is absent', async () => { const h = harness() + document.getElementById('root')!.remove() render() - expect(await screen.findByRole('region', { name: en.onboardingTitle })).toBeTruthy() - expect(screen.getByText(en.onboardingDescription)).toBeTruthy() - const action = screen.getByRole('button', { name: en.onboardingGoToSettings }) - expect(action).toBeTruthy() - expect(document.activeElement).toBe(screen.getByRole('heading', { name: en.onboardingTitle })) - expect(screen.queryByRole('textbox')).toBeNull() + expect(await screen.findByRole('dialog', { name: en.onboardingTitle })).toBeTruthy() }) - it('opens the Models section and dismisses the prompt', async () => { + it('loads a credential-only modal, inerts the product, and focuses the key', async () => { const h = harness() render() - await screen.findByRole('region') - fireEvent.click(screen.getByRole('button', { name: en.onboardingGoToSettings })) - expect(h.complete).toHaveBeenCalledOnce() - expect(h.openSection).toHaveBeenCalledWith('models') + expect(await screen.findByRole('dialog', { name: en.onboardingTitle })).toBeTruthy() + expect(document.getElementById('root')?.inert).toBe(true) + expect(screen.getByText(en.onboardingDescription)).toBeTruthy() + const key = screen.getByLabelText(en.keyInput) + await waitFor(() => { expect(document.activeElement).toBe(key) }) + expect(screen.queryByText(en.customized)).toBeNull() + }) + + it('cannot be dismissed implicitly and restores the previous inert state', async () => { + const h = harness() + const appRoot = document.getElementById('root')! + appRoot.inert = true + const view = render() + await screen.findByRole('dialog') + + fireEvent.keyDown(document, { key: 'Escape' }) + fireEvent.click(document.querySelector('[class*="mask"]')!) + expect(screen.getByRole('dialog')).toBeTruthy() + expect(h.complete).not.toHaveBeenCalled() + + view.unmount() + expect(appRoot.inert).toBe(true) + }) + + it('requires a non-blank key before Save and continue is available', async () => { + const h = harness() + render() + await screen.findByRole('dialog') + const save = screen.getByRole('button', { name: en.onboardingSave }) + expect(save.disabled).toBe(true) + fireEvent.change(screen.getByLabelText(en.keyInput), { target: { value: ' ' } }) + expect(save.disabled).toBe(true) + expect(screen.getByText(en.keyRequired)).toBeTruthy() + expect(h.set).not.toHaveBeenCalled() + }) + + it('keeps the modal open and reports rejected and failed credential writes', async () => { + for (const [options, message] of [ + [{ setFailure: 'credential was rejected' }, 'credential was rejected'], + [{ setReject: 'connection lost' }, 'connection lost'], + ] as const) { + const h = harness(options) + const view = render() + await screen.findByRole('dialog') + fireEvent.change(screen.getByLabelText(en.keyInput), { target: { value: 'sk-live' } }) + fireEvent.click(screen.getByRole('button', { name: en.onboardingSave })) + expect(await screen.findByText(message)).toBeTruthy() + expect(screen.getByRole('dialog')).toBeTruthy() + expect(screen.getByRole('button', { name: en.onboardingSave }).disabled).toBe(false) + expect(h.complete).not.toHaveBeenCalled() + expect(h.mutate).not.toHaveBeenCalled() + view.unmount() + } }) it('allows configure-later dismissal without opening settings', async () => { const h = harness() render() - await screen.findByRole('region') + await screen.findByRole('dialog') fireEvent.click(screen.getByRole('button', { name: en.onboardingLater })) expect(h.complete).toHaveBeenCalledOnce() expect(h.openSection).not.toHaveBeenCalled() + expect(h.set).not.toHaveBeenCalled() + expect(h.mutate).not.toHaveBeenCalled() }) it('does not block the product when DeepSeek setup is unavailable', async () => { @@ -145,7 +234,7 @@ describe('DeepSeekOnboardingDialog', () => { ]) { const view = render() await act(async () => { await h.controller.load() }) - expect(screen.queryByRole('region')).toBeNull() + expect(screen.queryByRole('dialog')).toBeNull() await waitFor(() => { expect(h.complete).toHaveBeenCalledOnce() }) expect(h.openSection).not.toHaveBeenCalled() view.unmount() @@ -160,7 +249,7 @@ describe('DeepSeekOnboardingDialog', () => { ]) { const view = render() await act(async () => { await h.controller.load() }) - expect(screen.queryByRole('region')).toBeNull() + expect(screen.queryByRole('dialog')).toBeNull() await waitFor(() => { expect(h.complete).toHaveBeenCalledOnce() }) view.unmount() } @@ -169,10 +258,10 @@ describe('DeepSeekOnboardingDialog', () => { it('closes when an external credential invalidation refreshes the shared join', async () => { const h = harness() render() - await screen.findByRole('region') + await screen.findByRole('dialog') h.configure() await act(async () => { await h.controller.load() }) - await waitFor(() => { expect(screen.queryByRole('region')).toBeNull() }) + await waitFor(() => { expect(screen.queryByRole('dialog')).toBeNull() }) expect(h.complete).toHaveBeenCalledOnce() }) }) diff --git a/packages/client/ui-settings-general/tests/welcome-notice.client.spec.tsx b/packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx similarity index 60% rename from packages/client/ui-settings-general/tests/welcome-notice.client.spec.tsx rename to packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx index 74feea89a5..8b8858c64a 100644 --- a/packages/client/ui-settings-general/tests/welcome-notice.client.spec.tsx +++ b/packages/client/ui-settings-models/tests/welcome-notice.client.spec.tsx @@ -5,19 +5,25 @@ import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react' import { WelcomeNotice } from '../src/client/WelcomeNotice.tsx' import type { WelcomeNoticeProps } from '../src/client/WelcomeNotice.tsx' import { WelcomeNoticeStore } from '../src/client/welcome-store.ts' -import { zh } from '../src/client/locales.ts' +import { en, zh } from '../src/client/locales.ts' import { WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_COPY, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, } from '../src/onboarding-copy.ts' -afterEach(cleanup) +afterEach(() => { + cleanup() + document.getElementById('root')?.remove() +}) function response(value: T) { return { rpcId: 'welcome-rpc' as never, result: { ok: true as const, value } } } function mount(version?: string, mutateImpl: () => Promise = () => Promise.resolve(response({}))) { + const appRoot = document.createElement('div') + appRoot.id = 'root' + document.body.append(appRoot) const mutate = vi.fn(mutateImpl) const api = { settings: { @@ -28,6 +34,8 @@ function mount(version?: string, mutateImpl: () => Promise = () => Prom ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, schema: {}, value: version === undefined ? {} : { [WELCOME_NOTICE_ACK_FIELD]: version }, + base: {}, + user: {}, applies: 'live' as const, secrets: [], revision: 0, @@ -46,35 +54,44 @@ function mount(version?: string, mutateImpl: () => Promise = () => Prom useSessions: unusedHook, useWorkspaces: unusedHook, controller, - useSnapshot: bindSnapshotSelector(controller.store), - t: key => key in zh ? zh[key as keyof typeof zh] : key, + useWelcome: bindSnapshotSelector(controller.store), + t: key => zh[key], } - return { ...render(), complete, controller, mutate } + return { ...render(), complete, controller, mutate, appRoot } } describe('WelcomeNotice', () => { - it('uses the same Chinese owner copy in both GUI locales', () => { - expect(WELCOME_NOTICE_COPY.en).toEqual(WELCOME_NOTICE_COPY.zh) + it('uses the exact owner copy in both GUI locales', () => { + expect(WELCOME_NOTICE_COPY.en).toEqual({ + title: 'Internal Testing Notice', + body: "DeepSeek Harness 0.1 remains in testing for Harness developers. Many areas need further improvement, and we welcome feedback from the developer community. DeepSeek Harness's core plugins and foundational APIs will continue to evolve rapidly over the coming months.\n\nWe look forward to exploring the limits of intelligence with developers around the world, building on open-source, open, reusable, and composable infrastructure. We welcome Harness developers everywhere to join the DSH plugin ecosystem.", + continueLabel: 'Continue', + }) + expect(en.welcomeBody).toBe(WELCOME_NOTICE_COPY.en.body) + expect(zh.welcomeBody).toBe(WELCOME_NOTICE_COPY.zh.body) }) - it('renders the owner copy with one primary action and no dismissal control', async () => { + it('renders one blocking modal action and focuses the title', async () => { const h = mount() - const page = await screen.findByRole('region', { name: WELCOME_NOTICE_COPY.zh.title }) - expect(screen.getByText(WELCOME_NOTICE_COPY.zh.title)).toBeTruthy() - for (const text of WELCOME_NOTICE_COPY.zh.paragraphs) expect(page.textContent).toContain(text) - expect(page.textContent?.match(/感谢您愿�拨冗试用 DeepSeek Harness/g) ?? []).toHaveLength(1) - const buttons = page.querySelectorAll('button') - expect(buttons).toHaveLength(1) + const dialog = await screen.findByRole('dialog', { name: WELCOME_NOTICE_COPY.zh.title }) + for (const paragraph of WELCOME_NOTICE_COPY.zh.body.split('\n\n')) { + expect(screen.getByText(paragraph, { exact: true })).toBeTruthy() + } + expect(dialog.querySelectorAll('p')).toHaveLength(2) + expect(dialog.querySelectorAll('button')).toHaveLength(1) expect(screen.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel })).toBeTruthy() expect(document.activeElement).toBe(screen.getByRole('heading', { name: WELCOME_NOTICE_COPY.zh.title })) + expect(h.appRoot.inert).toBe(true) + fireEvent.keyDown(document, { key: 'Escape' }) + fireEvent.click(document.querySelector('[class*="mask"]')!) expect(h.complete).not.toHaveBeenCalled() - expect(screen.getByRole('region')).toBeTruthy() + expect(screen.getByRole('dialog')).toBeTruthy() }) it('completes only after the acknowledgement write commits', async () => { const h = mount() - await screen.findByRole('region') + await screen.findByRole('dialog') fireEvent.click(screen.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel })) await act(async () => { await Promise.resolve() }) expect(h.mutate).toHaveBeenCalledOnce() @@ -84,7 +101,7 @@ describe('WelcomeNotice', () => { it('skips itself when this exact version was already acknowledged', async () => { const h = mount(WELCOME_NOTICE_VERSION) await act(async () => { await h.controller.load() }) - expect(screen.queryByRole('region')).toBeNull() + expect(screen.queryByRole('dialog')).toBeNull() expect(h.complete).toHaveBeenCalledOnce() }) @@ -92,15 +109,22 @@ describe('WelcomeNotice', () => { let resolveWrite!: (value: unknown) => void const write = new Promise((resolve) => { resolveWrite = resolve }) const h = mount(undefined, () => write) - await screen.findByRole('region') + await screen.findByRole('dialog') const action = screen.getByRole('button', { name: WELCOME_NOTICE_COPY.zh.continueLabel }) fireEvent.click(action) expect(action.disabled).toBe(true) resolveWrite({ rpcId: 'welcome-refused' as never, - result: { ok: false, error: { code: 'settings-rejected', message: 'read only', details: { ns: WELCOME_NOTICE_SETTINGS_NAMESPACE } } }, + result: { + ok: false, + error: { + code: 'settings-rejected', + message: 'read only', + details: { ns: WELCOME_NOTICE_SETTINGS_NAMESPACE }, + }, + }, }) - expect((await screen.findByRole('alert')).textContent).toBe('暂时无法�存确认状�,请�试。') + expect((await screen.findByRole('alert')).textContent).toBe(zh.welcomeError) expect(h.complete).not.toHaveBeenCalled() }) }) diff --git a/packages/client/ui-settings-general/tests/welcome-store.client.spec.ts b/packages/client/ui-settings-models/tests/welcome-store.client.spec.ts similarity index 88% rename from packages/client/ui-settings-general/tests/welcome-store.client.spec.ts rename to packages/client/ui-settings-models/tests/welcome-store.client.spec.ts index bfa5e16999..e1fa7572c3 100644 --- a/packages/client/ui-settings-general/tests/welcome-store.client.spec.ts +++ b/packages/client/ui-settings-models/tests/welcome-store.client.spec.ts @@ -1,7 +1,6 @@ import { describe, expect, it, vi } from 'vitest' import type { RpcResponse } from '@deepseek-ai/dsh-api-remotes/client' -import { WelcomeNoticeStore } from '../src/client/welcome-store.ts' -import { refreshWelcomeIfLoaded } from '../src/client/welcome-store.ts' +import { refreshWelcomeIfLoaded, WelcomeNoticeStore } from '../src/client/welcome-store.ts' import { WELCOME_NOTICE_ACK_FIELD, WELCOME_NOTICE_SETTINGS_NAMESPACE, WELCOME_NOTICE_VERSION, } from '../src/onboarding-copy.ts' @@ -16,6 +15,8 @@ function namespace(version?: string) { ns: WELCOME_NOTICE_SETTINGS_NAMESPACE, schema: {}, value: version === undefined ? {} : { [WELCOME_NOTICE_ACK_FIELD]: version }, + base: {}, + user: {}, applies: 'live' as const, secrets: [], revision: 0, @@ -53,7 +54,9 @@ describe('WelcomeNoticeStore', () => { ] as const) { const api = { settings: { - describe: vi.fn(() => Promise.resolve(ok({ writable: true, hasDocument: false, namespaces: [namespace(version)] }))), + describe: vi.fn(() => Promise.resolve(ok({ + writable: true, hasDocument: false, namespaces: [namespace(version)], + }))), }, } const controller = new WelcomeNoticeStore(api as never) @@ -88,8 +91,7 @@ describe('WelcomeNoticeStore', () => { const nonError = new WelcomeNoticeStore({ // Durable/wire failures are unknown; exercise containment of a non-Error rejection. - // oxlint-disable-next-line typescript/prefer-promise-reject-errors - settings: { describe: () => Promise.reject('offline string') }, + settings: { describe: () => Promise.reject(new Error('offline string')) }, } as never) await nonError.load() expect(nonError.store.getSnapshot().error).toBe('offline string') @@ -123,7 +125,14 @@ describe('WelcomeNoticeStore', () => { const save = new WelcomeNoticeStore({ settings: { mutate: () => Promise.resolve({ rpcId: 'failed-save' as never, - result: { ok: false, error: { code: 'settings-rejected', message: 'denied', details: { ns: WELCOME_NOTICE_SETTINGS_NAMESPACE } } }, + result: { + ok: false, + error: { + code: 'settings-rejected', + message: 'denied', + details: { ns: WELCOME_NOTICE_SETTINGS_NAMESPACE }, + }, + }, }) }, } as never) await expect(save.acknowledge()).resolves.toBe(false) @@ -134,11 +143,15 @@ describe('WelcomeNoticeStore', () => { const first = deferred>() const describe = vi.fn() .mockImplementationOnce(() => first.promise) - .mockImplementationOnce(() => Promise.resolve(ok({ writable: true, hasDocument: false, namespaces: [namespace()] }))) + .mockImplementationOnce(() => Promise.resolve(ok({ + writable: true, hasDocument: false, namespaces: [namespace()], + }))) const controller = new WelcomeNoticeStore({ settings: { describe } } as never) const stale = controller.load() await controller.load() - first.resolve(ok({ writable: true, hasDocument: false, namespaces: [namespace(WELCOME_NOTICE_VERSION)] })) + first.resolve(ok({ + writable: true, hasDocument: false, namespaces: [namespace(WELCOME_NOTICE_VERSION)], + })) await stale expect(controller.store.getSnapshot().acknowledged).toBe(false) @@ -157,7 +170,9 @@ describe('WelcomeNoticeStore', () => { it('contains stale acknowledgement settlements and refreshes only a loaded store', async () => { const write = deferred>() - const describe = vi.fn(() => Promise.resolve(ok({ writable: true, hasDocument: false, namespaces: [namespace()] }))) + const describe = vi.fn(() => Promise.resolve(ok({ + writable: true, hasDocument: false, namespaces: [namespace()], + }))) const controller = new WelcomeNoticeStore({ settings: { mutate: () => write.promise, describe }, } as never) diff --git a/packages/client/ui-settings-plugin-inventory/package.json b/packages/client/ui-settings-plugin-inventory/package.json index 9b24c3e6af..95af8a15fa 100644 --- a/packages/client/ui-settings-plugin-inventory/package.json +++ b/packages/client/ui-settings-plugin-inventory/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugin-inventory", "description": "Read-only Cordis Loader inventory tab in Web Plugins settings", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -44,7 +44,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-locale": "workspace:^", diff --git a/packages/client/ui-settings-plugins/README.i18n.yaml b/packages/client/ui-settings-plugins/README.i18n.yaml index 09e742cf23..ae8c3a78bf 100644 --- a/packages/client/ui-settings-plugins/README.i18n.yaml +++ b/packages/client/ui-settings-plugins/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-settings-plugins/README.md -README.md: 53418f8939649bae4413625a37630e46e7060d15 -README.zh.md: 8d4a2bf8d1af662e9f8e05ccc607cc8b66731731 +README.md: 92ba426b6bee3ae73e184dfcfd418e889bd47086 +README.zh.md: dc319ea9f128016b6df821575cb4d75740f04579 diff --git a/packages/client/ui-settings-plugins/README.md b/packages/client/ui-settings-plugins/README.md index 53418f8939..92ba426b6b 100644 --- a/packages/client/ui-settings-plugins/README.md +++ b/packages/client/ui-settings-plugins/README.md @@ -6,13 +6,13 @@ The **Plugins** settings section and its **Plugin configuration** tab. The secti ## What appears here -A card renders only when its namespace is both registered by a live Host plugin and served to the browser. A deployment that does not compose the owning plugin — or serves the namespace to no client — renders nothing for it rather than an empty or disabled card, so the configurable tab reflects what this deployment actually runs. +The configurable tab reads which settings namespaces the Host serves and dispatches one slot key per namespace, so what renders is the intersection of two ledgers: the namespaces a live Host plugin registered, and the cards registered under those keys. A served namespace no card claims renders nothing — another surface owns it, or this deployment ships no browser half for it — and a card whose namespace this deployment does not serve is never dispatched, so an uncomposed plugin leaves no trace and does not hold the tab back from its empty line. The empty line waits for the Host's first answer, so an unanswered read never reads as "this deployment configures no plugin". Cards appear in the order they registered, which is stable for the cards one package installs together and not stable across plugins: apply order between packages is unconstrained. -The first batch covers the shell executor (`bash`), the agent loop's tool-call parallelism (`agent-loop`), and the DeepSeek search provider (`web-search-deepseek`). +The cards this package ships cover the shell executor (`bash`), the agent loop's tool-call parallelism (`agent-loop`), and the DeepSeek search provider (`web-search-deepseek`). ## Extension point -The section declares `settings.plugins.tab`, a root list slot whose labels become ordered tabs. It keeps a tab mounted after its first selection, so local drafts and read-only snapshots survive tab switches. The package registers its own `configurable` contribution, which declares the nested `settings.plugin.item` list slot. A plugin that ships a browser half registers its own card into that nested slot and owns its controls; this package neither enumerates namespaces nor renders a form it was not given. Both levels follow the contribution's `order`. +The section declares `settings.plugins.tab`, a root list slot whose labels become ordered tabs. It keeps a tab mounted after its first selection, so local drafts and read-only snapshots survive tab switches. The package registers its own `configurable` contribution, which declares the nested `settings.plugin.item` slot — keyed on the settings namespace a card edits. A plugin that ships a browser half registers its own card under its own namespace and owns every part of it: chrome, controls, and copy. Keying on the namespace is what lets a plugin distributed outside this repository appear here — it registers the namespace on the Host and the card in the browser, and the tab pairs the two without learning what the namespace means. Tabs follow the contribution's `order`; cards follow registration order. ## Writes @@ -35,6 +35,6 @@ None; this package neither assembles nor sends a provider request. ## Known Limitations and Deferred Work - **Only host-plane plugins appear** — a plugin an agent preset mounts carries its configuration inline in that preset's `agent.cordis.yml` and cannot register a settings namespace at all (a second session mounting the same preset would fail on a duplicate registration), so this section lists nothing for it. Editing those values remains the preset editor's job. -- **Exposure is a Host allowlist, not a plugin declaration** — a namespace absent from the api-proxy's allowlist answers `settings-not-exposed` even when its owner registered it, so a plugin distributed outside this repository cannot surface its own configuration here without a change in `packages/host/apiproxy`. +- **A card still needs a browser bundle** — the browser half must be a `dsh.client` package built in the client module system's lazy-CJS factory format, and the `clientBundle` preset that emits it lives in `packages/client/tsdown.client.ts` rather than a published package, so a plugin outside this repository has to reproduce that build itself. The bundle-purity gate also forbids importing this package's card chrome or form model as values, so such a card owns its own staging and revision fencing. +- **The served namespaces re-read on two signals only** — the wire announces settings-document commits and connection resets, not registrations, so a namespace whose owner registers after the tab's read joins the list on the next document commit or reconnect. - **The shell card follows the composed executor** — the POSIX and PowerShell executor families share the `bash` namespace because a host composes exactly one of them, so the served schema differs by platform (PowerShell adds `pwshPath`) even though the card edits the same two fields on both, and a deployment composing neither shows no card. -- **The empty line counts registered cards, not visible ones** — a card whose namespace this deployment does not expose renders nothing, but still counts, so a deployment that exposes none shows an empty list rather than the empty line. The count is also read once, because the renderer caches a root entry's inject face; a card registered later does not raise it. diff --git a/packages/client/ui-settings-plugins/README.zh.md b/packages/client/ui-settings-plugins/README.zh.md index 8d4a2bf8d1..dc319ea9f1 100644 --- a/packages/client/ui-settings-plugins/README.zh.md +++ b/packages/client/ui-settings-plugins/README.zh.md @@ -6,13 +6,13 @@ ## 这里会出现什么 -�有当�个命�空间既被存活的 Host �件注册��被�务给�览器时,它的�片�会渲染。未组装该�件的部署——或未�任何客户端�务该命�空间的部署——�会渲染空�片或�用�片,而是什么都�渲染,因此“�件�置�标签页�映的是该部署实际�行的东西。 +“�件�置�标签页读� Host �务了哪些 settings 命�空间,并为�个命�空间派�一个 slot 键,因此渲染出�的是两份账本的交集:存活 Host �件注册的命�空间,以�注册在这些键上的�片。被�务�无人认领的命�空间什么都�渲染——它归别的界�所有,或本部署没有为它�供�览器�侧;而命�空间未被本部署�务的�片根本�会被派�,因此未组装的�件�留任何痕迹,也�会挡�那行空�文案。空�文案�等 Host 的第一次答�,因此一次尚未答�的读���会被读�“本部署没有��置的�件�。�片按自身注册的顺�出现;对�一个包一起安装的�片这是稳定的,对跨�件的�片则�稳定:包与包之间的 apply 顺�是无约�的。 -第一批覆盖 shell 执行器(`bash`)�agent 循环的工具调用并行度(`agent-loop`)以� DeepSeek �索�供方(`web-search-deepseek`)。 +本包自带的�片覆盖 shell 执行器(`bash`)�agent 循环的工具调用并行度(`agent-loop`)以� DeepSeek �索�供方(`web-search-deepseek`)。 ## 扩展点 -本分区声明根级列表 slot `settings.plugins.tab`,其标签会�为有�标签页。�个标签页首次被选择�会��挂载,因此本地�稿与�读快照在切�标签页时�会丢失。本包注册自己的 `configurable` 贡献,由它声明嵌套的 `settings.plugin.item` 列表 slot。带�览器�侧的�件把自己的�片注册进这个嵌套 slot 并拥有其控件;本包既�枚举命�空间,也�渲染未被交给它的表�。两层排�都�循贡献的 `order`。 +本分区声明根级列表 slot `settings.plugins.tab`,其标签会�为有�标签页。�个标签页首次被选择�会��挂载,因此本地�稿与�读快照在切�标签页时�会丢失。本包注册自己的 `configurable` 贡献,由它声明嵌套的 `settings.plugin.item` slot——以�片所编辑的 settings 命�空间为键。带�览器�侧的�件把自己的�片注册在自己的命�空间上,并拥有它的全部:外观�控件与文案。以命�空间为键,正是在本仓库之外分�的�件能出现在这里的原因——它在 Host 上注册命�空间�在�览器里注册�片,由标签页把两者�对,而无需知�命�空间�味�什么。标签页�循贡献的 `order`;�片�循注册顺�。 ## 写入 @@ -35,6 +35,6 @@ ## 已知�制与暂缓事项 - **�有宿主平�的�件会出现**——由 agent preset 挂载的�件把�置内�在该 preset 的 `agent.cordis.yml` 中,且根本无法注册 settings 命�空间(�一 preset 挂载第二个会�时会因��注册而失败),因此本分区�会列出它。编辑那些值�是 preset 编辑器的�责。 -- **暴露是 Host 的白��,而��件的声明**——�在 api-proxy 白��中的命�空间,�便其拥有方已注册,也�会得到 `settings-not-exposed`,因此在本仓库之外分�的�件无法在�改动 `packages/host/apiproxy` 的��下让自己的�置出现在这里。 +- **�片�然需�一份�览器 bundle**——�览器�侧必须是按客户端模�系统的 lazy-CJS factory 格�构建的 `dsh.client` 包,而产出它的 `clientBundle` 预设�于 `packages/client/tsdown.client.ts`,并�已�布的包,因此本仓库之外的�件得自行�刻该构建。bundle 纯净度门��时�止以值的形�导入本包的�片外观与表�模型,所以这样的�片�自行拥有暂存与 revision 设栅。 +- **被�务的命�空间�在两�信�上�读**——�议通告的是 settings 文档�交与连接�置,而�注册行为,因此在标签页读�之��被其拥有方注册的命�空间,�等下一次文档�交或�连�会加入列表。 - **shell �片跟�被组装的执行器**——POSIX 与 PowerShell 两个执行器家�共用 `bash` 命�空间,因为一个宿主�组装其中之一,所以被�务的 schema �平���(PowerShell 多出 `pwshPath`),尽管�片在两者下编辑的都是�样两个字段;而两者都�组装的部署�会显示这张�片。 -- **空�数的是已注册�片,�是���片**——命�空间未被本部署暴露的�片什么都�渲染,但�计入数�,因此一个都�暴露的部署看到的是空列表而�那行空�文案。该计数还�读�一次,因为渲染器会缓存根级 entry 的 inject face;之�注册的�片�会让它�大。 diff --git a/packages/client/ui-settings-plugins/package.json b/packages/client/ui-settings-plugins/package.json index a5464633ab..a9fd7b8e9d 100644 --- a/packages/client/ui-settings-plugins/package.json +++ b/packages/client/ui-settings-plugins/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-settings-plugins", "description": "Plugins settings section with feature-owned tabs and configurable host-plane plugin cards", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -45,7 +45,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-settings-plugins/src/client/ConfigurablePluginsTab.tsx b/packages/client/ui-settings-plugins/src/client/ConfigurablePluginsTab.tsx index 4e7b575fd5..c9b4365a3a 100644 --- a/packages/client/ui-settings-plugins/src/client/ConfigurablePluginsTab.tsx +++ b/packages/client/ui-settings-plugins/src/client/ConfigurablePluginsTab.tsx @@ -1,25 +1,43 @@ -/** Configurable Host plugins contributed to the shared Plugins section. */ +/** + * Configurable Host plugins contributed to the shared Plugins section. + * + * The tab enumerates settings namespaces but never interprets one — a card + * arrives through `settings.plugin.item` keyed by the namespace it edits, so a + * plugin that ships a browser half owns its own card and this tab only decides + * which keys to dispatch. + */ +import { Fragment } from 'react' import type { InjectFace, PropsLocale, PropsRenderSlots, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots' import type {} from './slot-contract.ts' +import type { ConfigurablePluginsTabFace } from './tab-store.ts' import css from './PluginsSettingsSection.module.css' -/** Registration-side business face for the configurable tab. */ -export interface ConfigurablePluginsTabInjected { - /** How many cards the slot ledger held when the tab registration mounted. */ - cardCount: number -} - /** Props the renderer binds for the configurable tab. */ export type ConfigurablePluginsTabProps = PropsRuntime<'settings.plugins.tab'> & PropsLocale<'settings.plugins'> & PropsRenderSlots<'settings.plugin.item'> - & InjectFace + & InjectFace -/** Render cards registered by plugins that expose editable settings. */ -export function ConfigurablePluginsTab({ t, renderSlot, cardCount }: ConfigurablePluginsTabProps) { - return cardCount === 0 - ?

{t('empty')}

- :
    {renderSlot('settings.plugin.item', {})}
+/** + * Render cards registered by plugins that expose editable settings. + * @param props - locale copy, slot rendering, and the namespaces to dispatch. + * @returns the card list, or the empty line once the Host has answered. + */ +export function ConfigurablePluginsTab(props: ConfigurablePluginsTabProps) { + const { t, renderSlot } = props + const { loaded, namespaces } = props.useConfigurablePlugins(snapshot => snapshot) + if (namespaces.length > 0) { + return ( +
    + {namespaces.map(ns => ( + // One dispatch per namespace, so the list identity is the namespace + // rather than a position that shifts as cards arrive. + {renderSlot('settings.plugin.item', {}, { entryKey: ns })} + ))} +
+ ) + } + return loaded ?

{t('empty')}

: null } diff --git a/packages/client/ui-settings-plugins/src/client/index.ts b/packages/client/ui-settings-plugins/src/client/index.ts index dd0b80d89a..82dea6d796 100644 --- a/packages/client/ui-settings-plugins/src/client/index.ts +++ b/packages/client/ui-settings-plugins/src/client/index.ts @@ -23,17 +23,18 @@ import type {} from '@deepseek-ai/dsh-api-remotes/client' import { AgentLoopCard } from './AgentLoopCard.tsx' import { BashCard } from './BashCard.tsx' import { ConfigurablePluginsTab } from './ConfigurablePluginsTab.tsx' -import type { ConfigurablePluginsTabInjected } from './ConfigurablePluginsTab.tsx' import { PluginsSettingsSection } from './PluginsSettingsSection.tsx' import type { PluginsSettingsSectionInjected, PluginsSettingsTabEntry } from './PluginsSettingsSection.tsx' import { WebSearchCard } from './WebSearchCard.tsx' import { AGENT_LOOP_NS, AgentLoopCardController } from './agent-loop-card-controller.ts' import { SHELL_NS, BashCardController } from './bash-card-controller.ts' +import { ConfigurablePluginsTabController } from './tab-store.ts' import { WEB_SEARCH_NS, WebSearchCardController } from './web-search-card-controller.ts' import { en, zh } from './locales.ts' export type { PluginsSettingsSectionInjected, PluginsSettingsSectionProps } from './PluginsSettingsSection.tsx' -export type { ConfigurablePluginsTabInjected, ConfigurablePluginsTabProps } from './ConfigurablePluginsTab.tsx' +export type { ConfigurablePluginsTabProps } from './ConfigurablePluginsTab.tsx' +export type { ConfigurablePluginsTabFace, ConfigurablePluginsTabState } from './tab-store.ts' export type { PluginCardProps } from './PluginCard.tsx' export type { SettingsPluginItemOwnerProps } from './slot-contract.ts' export type { FieldProps } from './fields.tsx' @@ -71,6 +72,27 @@ export function apply(ctx: ClientContext): void { 'ui-settings-plugins: credential invalidations', ) + // Which namespaces the Host serves is a registration fact the wire does not + // announce, so the directory re-reads on the two signals that can carry a + // changed composition: a settings document commit and a reconnect. + const configurable = new ConfigurablePluginsTabController( + api, () => ctx.slots.entries('settings.plugin.item')) + ctx.effect(() => () => { configurable.dispose() }, 'ui-settings-plugins: tab directory') + ctx.effect( + () => ctx.remote.$on('settings/document-updated', () => { void configurable.load() }), + 'ui-settings-plugins: served-namespace invalidations', + ) + ctx.effect( + () => ctx.on('connection/reset', () => { void configurable.load() }), + 'ui-settings-plugins: served-namespace reconnect', + ) + // A card registered after the first read joins the list without a wire call. + ctx.effect( + () => ctx.slots.subscribe('settings.plugin.item', () => { configurable.refresh() }), + 'ui-settings-plugins: card ledger', + ) + void configurable.load() + let tabsVersion = -1 let tabsRevision = -1 let tabs: readonly PluginsSettingsTabEntry[] = [] @@ -126,31 +148,26 @@ export function apply(ctx: ClientContext): void { order: 0, label: () => t('configurableTab'), locale: NS, - inject: (): ConfigurablePluginsTabInjected => ({ - cardCount: ctx.slots.entries('settings.plugin.item').length, - }), - children: { 'settings.plugin.item': { kind: 'list', scope: 'root' } }, + inject: () => configurable.inject(), + children: { 'settings.plugin.item': { kind: 'keyed', scope: 'root' } }, }, ConfigurablePluginsTab)) ctx.slots.inject('settings.plugin.item', function* () { yield ctx.slots.register({ name: 'settings.plugin.item', - id: 'bash', - order: 0, + key: SHELL_NS, locale: NS, inject: () => bash.inject(), }, BashCard) yield ctx.slots.register({ name: 'settings.plugin.item', - id: 'agent-loop', - order: 10, + key: AGENT_LOOP_NS, locale: NS, inject: () => agentLoop.inject(), }, AgentLoopCard) yield ctx.slots.register({ name: 'settings.plugin.item', - id: 'web-search', - order: 20, + key: WEB_SEARCH_NS, locale: NS, inject: () => webSearch.inject(), }, WebSearchCard) diff --git a/packages/client/ui-settings-plugins/src/client/slot-contract.ts b/packages/client/ui-settings-plugins/src/client/slot-contract.ts index 02b00ea35b..ecb84acadc 100644 --- a/packages/client/ui-settings-plugins/src/client/slot-contract.ts +++ b/packages/client/ui-settings-plugins/src/client/slot-contract.ts @@ -1,19 +1,22 @@ /** - * The `settings.plugin.item` slot type — one plugin's card inside the plugin - * configuration section. Options: `id` (card key), `order` (card position). - * A card draws its own internals; the section only stacks them and reports - * how many there are. + * The `settings.plugin.item` slot type — one plugin's card inside the + * configurable-plugins tab, keyed by the settings namespace the card edits. + * Options: `key` (the namespace). A card draws its own internals; the tab only + * decides which namespaces to dispatch and stacks what comes back. * - * TYPE HOME RATIONALE: unlike `settings.general.item`, whose registrants span - * packages that cannot reference its declarer, every current registrant of - * this slot ships in this package, and a plugin registering its own card - * already depends on this package for the card chrome. The type therefore - * lives with the section that declares it at runtime. + * Keying on the namespace is what lets a plugin distributed outside this + * repository contribute a card: it registers its own settings namespace on the + * Host and its own card under that key in the browser, and the tab pairs the + * two without ever learning what the namespace means. + * + * TYPE HOME RATIONALE: the tab declares this slot at runtime, and a plugin + * registering its own card already depends on this package for the slot's + * declaration. The type therefore lives with its declarer. */ declare module '@deepseek-ai/dsh-client-ui-slots' { interface SlotMap { /** One plugin's card inside the plugin configuration section (see module JSDoc). */ - 'settings.plugin.item': { kind: 'list'; scope: 'root'; owner: SettingsPluginItemOwnerProps } + 'settings.plugin.item': { kind: 'keyed'; scope: 'root'; owner: SettingsPluginItemOwnerProps } } } diff --git a/packages/client/ui-settings-plugins/src/client/tab-store.ts b/packages/client/ui-settings-plugins/src/client/tab-store.ts new file mode 100644 index 0000000000..a4ed4439f2 --- /dev/null +++ b/packages/client/ui-settings-plugins/src/client/tab-store.ts @@ -0,0 +1,123 @@ +/** + * The configurable-plugins tab's card list. + * + * The tab dispatches its slot by settings namespace, so what it renders is + * the intersection of two ledgers: the namespaces the Host serves and the + * cards registered into `settings.plugin.item`. A served namespace no card + * claims renders nothing — another surface owns it, or this deployment ships + * no browser half for it — and a card whose namespace the Host does not serve + * is never dispatched, so a plugin this deployment did not compose leaves no + * trace and does not count toward the empty line. + */ + +import type { IApiClient } from '@deepseek-ai/dsh-client-connection/client' +import type { StoredEntry } from '@deepseek-ai/dsh-client-ui-slots' +import { createSnapshotStore, type SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client' + +/** What the section renders. */ +export interface ConfigurablePluginsTabState { + /** + * Whether the Host has answered once. The empty line waits for it: an + * unanswered read is not the same statement as "this deployment configures + * no plugin", and saying the second while the first is true would flash a + * wrong answer on every open. + */ + loaded: boolean + /** + * Namespaces to dispatch, in the order their cards registered, narrowed to + * those the Host serves. Card registration order rather than the Host's + * description order: the latter follows plugin activation, which async + * settings injection can reorder between boots, and a settings page whose + * cards move between visits is worse than one whose order a registrant + * chose. + */ + namespaces: string[] +} + +/** The registration-side face the tab's slot entry injects. */ +export interface ConfigurablePluginsTabFace { + hooks: { + /** Section snapshot bound by the renderer as usePluginConfigSection. */ + configurablePlugins: SnapshotStore + } +} + +/** Reads the served namespaces and pairs them with the cards that claim them. */ +export class ConfigurablePluginsTabController { + private readonly store = createSnapshotStore({ loaded: false, namespaces: [] }) + /** Last Host answer; kept so a slot mutation republishes without a wire read. */ + private served: readonly string[] = [] + private loaded = false + private generation = 0 + private disposed = false + + /** + * @param api - settings wire face. + * @param entries - reads the cards currently registered into the section's slot. + */ + constructor( + private readonly api: Pick, + private readonly entries: () => readonly StoredEntry[], + ) {} + + /** Opaque read of {@link disposed}: control flow cannot narrow it across awaits. */ + private isDisposed(): boolean { + return this.disposed + } + + /** + * Re-read the served namespaces from the Host and republish. + * @returns settlement after the read, or immediately once disposed. + */ + async load(): Promise { + if (this.isDisposed()) return + const generation = ++this.generation + let response: Awaited> + try { + response = await this.api.settings.describe({}) + } catch (_settingsReadFailure) { + // The tab keeps the namespaces it last knew; the next invalidation + // or reconnect reads again. + return + } + if (this.isDisposed() || generation !== this.generation || !response.result.ok) return + this.served = response.result.value.namespaces.map(view => view.ns) + this.loaded = true + this.publish() + } + + /** Republish after the slot ledger changed; a card registered late joins here. */ + refresh(): void { + if (this.disposed) return + this.publish() + } + + /** Stop publishing; an in-flight read settles without touching the store. */ + dispose(): void { + this.disposed = true + this.generation += 1 + } + + /** + * Build the face the tab's slot registration injects. + * @returns the tab's snapshot source. + */ + inject(): ConfigurablePluginsTabFace { + return { hooks: { configurablePlugins: this.store } } + } + + private publish(): void { + const served = new Set(this.served) + const namespaces = this.entries().flatMap(entry => + entry.options.key !== undefined && served.has(entry.options.key) ? [entry.options.key] : []) + const previous = this.store.getSnapshot() + // Every settings-document commit re-reads, and most of them change nothing + // this section shows. An observable source must keep its snapshot + // reference until the fact moves, or each unrelated save re-renders the + // whole card list (packages/client/AGENTS.md reactive rule 5). + if (previous.loaded === this.loaded + && previous.namespaces.length === namespaces.length + && previous.namespaces.every((ns, index) => ns === namespaces[index])) return + this.store.set({ loaded: this.loaded, namespaces }) + } +} diff --git a/packages/client/ui-settings-plugins/src/invariant.ts b/packages/client/ui-settings-plugins/src/invariant.ts index 5e21f38157..4b0eba850c 100644 --- a/packages/client/ui-settings-plugins/src/invariant.ts +++ b/packages/client/ui-settings-plugins/src/invariant.ts @@ -16,8 +16,8 @@ export const inject = ['invariants'] /** * No runtime invariant: this is a browser-side settings surface whose node half owns no event - * stream or mutable runtime data; the layering, write refusals, and exposure boundary are Host - * contracts covered by the owning plugins and the api-proxy. + * stream or mutable runtime data; the layering and write refusals are Host contracts covered by + * the owning plugins and the api-proxy. */ const install: InvariantInstaller = () => {} diff --git a/packages/client/ui-settings-plugins/tests/apply.client.spec.ts b/packages/client/ui-settings-plugins/tests/apply.client.spec.ts index 112f088006..2934097b94 100644 --- a/packages/client/ui-settings-plugins/tests/apply.client.spec.ts +++ b/packages/client/ui-settings-plugins/tests/apply.client.spec.ts @@ -9,19 +9,38 @@ import { TestRemote, usePinnedBrowserLanguages } from '@deepseek-ai/dsh-client-t import { SettingsScopeBinder } from '@deepseek-ai/dsh-client-ui-settings/client' import { apply, inject } from '@deepseek-ai/dsh-client-ui-settings-plugins/client' import type { - ConfigurablePluginsTabInjected, PluginsSettingsSectionInjected, + ConfigurablePluginsTabFace, PluginsSettingsSectionInjected, } from '@deepseek-ai/dsh-client-ui-settings-plugins/client' // The service reads its initial locale from the browser; these specs assert // the shipped Chinese copy, so they state the browser they assume. usePinnedBrowserLanguages('zh-CN') -async function bench() { +/** + * @param served - namespaces the Host describes; omitted answers a failed read, + * which is what most of these specs want (no card has anything to render). + */ +async function bench(served?: string[]) { const ctx = new Context() await ctx.plugin(SlotRegistry).await() const locale = new LocaleRuntime(ctx) ctx.provide('locale', locale) const describeCredentials = vi.fn(() => Promise.resolve({ rpcId: 'c', result: { ok: false, error: {} } })) + const describeSettings = vi.fn(() => Promise.resolve(served === undefined + ? { rpcId: 's', result: { ok: false, error: {} } } + : { + rpcId: 's', + result: { + ok: true, + value: { + writable: true, + hasDocument: true, + namespaces: served.map(ns => ({ + ns, schema: {}, value: {}, applies: 'live', secrets: [], revision: 0, + })), + }, + }, + })) // The section binds its scopes through the Settings surface's service, and // forwarded Host events reach it through the same `$dispatch` handoff the // connection sink makes. @@ -29,12 +48,12 @@ async function bench() { ctx.provide('connection', { isLoopback: true, api: { - settings: { describe: vi.fn(() => Promise.resolve({ rpcId: 's', result: { ok: false, error: {} } })) }, + settings: { describe: describeSettings }, credentials: { describe: describeCredentials }, }, } as never) await ctx.plugin(SettingsScopeBinder).await() - return { ctx, slots: ctx.get('slots') as SlotRegistry, describeCredentials } + return { ctx, slots: ctx.get('slots') as SlotRegistry, describeCredentials, describeSettings } } function declareRoot(slots: SlotRegistry): () => void { @@ -63,20 +82,11 @@ describe('ui-settings-plugins apply', () => { const tab = slots.entries('settings.plugins.tab')[0]! expect(tab.options).toMatchObject({ id: 'configurable', order: 0 }) expect(resolveSlotLabel(tab.options.label)).toBe('�件�置') - expect(slots.spec('settings.plugin.item')).toMatchObject({ kind: 'list', scope: 'root' }) + expect(slots.spec('settings.plugin.item')).toMatchObject({ kind: 'keyed', scope: 'root' }) }) - it('registers one card per host-plane section it ships, in a stable order', async () => { - const { ctx, slots } = await bench() - declareRoot(slots) - await ctx.plugin({ inject: [...inject], apply }).await() - - expect(slots.entries('settings.plugin.item').map(entry => entry.options.id)) - .toEqual(['bash', 'agent-loop', 'web-search']) - }) - - it('injects a live tab projection, a card count, and one business face per card', async () => { + it('injects a live tab projection, the card directory, and one business face per card', async () => { const { ctx, slots } = await bench() declareRoot(slots) await ctx.plugin({ inject: [...inject], apply }).await() @@ -99,7 +109,8 @@ describe('ui-settings-plugins apply', () => { unsubscribe() const tab = slots.entries('settings.plugins.tab')[0]! - expect((tab.inject as unknown as () => ConfigurablePluginsTabInjected)()).toEqual({ cardCount: 3 }) + const tabFace = (tab.inject as unknown as () => ConfigurablePluginsTabFace)() + expect(Object.keys(tabFace.hooks)).toEqual(['configurablePlugins']) for (const entry of slots.entries('settings.plugin.item')) { const face = (entry as { inject?: () => unknown }).inject?.() as { hooks: Record } // Each card injects exactly one snapshot store plus its own actions. @@ -107,6 +118,58 @@ describe('ui-settings-plugins apply', () => { } }) + it('keys each card it ships on the settings namespace that card edits', async () => { + const { ctx, slots } = await bench() + declareRoot(slots) + + await ctx.plugin({ inject: [...inject], apply }).await() + + expect(slots.entries('settings.plugin.item').map(entry => entry.options.key)) + .toEqual(['shell', 'agent-loop', 'web-search-deepseek']) + }) + + it('dispatches the served namespaces its cards claim, and no others', async () => { + // ui-theme is served but belongs to another surface, and a deployment + // composing no PowerShell/POSIX executor serves no `bash` at all. + const { ctx, slots } = await bench(['agent-loop', 'ui-theme', 'web-search-deepseek']) + declareRoot(slots) + await ctx.plugin({ inject: [...inject], apply }).await() + + const tab = slots.entries('settings.plugins.tab')[0]! + const face = (tab.inject as unknown as () => ConfigurablePluginsTabFace)() + await vi.waitFor(() => { + expect(face.hooks.configurablePlugins.getSnapshot().namespaces) + .toEqual(['agent-loop', 'web-search-deepseek']) + }) + }) + + it('re-reads the served namespaces when the Host commits a settings document', async () => { + // Which namespaces the Host serves is a registration fact the wire never + // announces on its own, so the tab rides the invalidation that can + // accompany a changed composition. + const { ctx, slots, describeSettings } = await bench(['bash']) + declareRoot(slots) + await ctx.plugin({ inject: [...inject], apply }).await() + await vi.waitFor(() => { expect(describeSettings).toHaveBeenCalled() }) + describeSettings.mockClear() + + ctx.remote.$dispatch('settings/document-updated', ['bash', 1]) + + await vi.waitFor(() => { expect(describeSettings).toHaveBeenCalled() }) + }) + + it('re-reads the served namespaces after a reconnect', async () => { + const { ctx, slots, describeSettings } = await bench(['bash']) + declareRoot(slots) + await ctx.plugin({ inject: [...inject], apply }).await() + await vi.waitFor(() => { expect(describeSettings).toHaveBeenCalled() }) + describeSettings.mockClear() + + ctx.emit('connection/reset') + + await vi.waitFor(() => { expect(describeSettings).toHaveBeenCalled() }) + }) + it('re-reads the credential when the Host reports the watched reference changed', async () => { const { ctx, slots, describeCredentials } = await bench() declareRoot(slots) diff --git a/packages/client/ui-settings-plugins/tests/section.client.spec.tsx b/packages/client/ui-settings-plugins/tests/section.client.spec.tsx index fda55c3bf1..f521d7189f 100644 --- a/packages/client/ui-settings-plugins/tests/section.client.spec.tsx +++ b/packages/client/ui-settings-plugins/tests/section.client.spec.tsx @@ -22,6 +22,7 @@ import type { WebSearchCardProps } from '../src/client/WebSearchCard.tsx' import type { AgentLoopCardState } from '../src/client/agent-loop-card-controller.ts' import type { BashCardState } from '../src/client/bash-card-controller.ts' import type { CardFieldState, CardShell } from '../src/client/card-form.ts' +import type { ConfigurablePluginsTabState } from '../src/client/tab-store.ts' import type { WebSearchCardState } from '../src/client/web-search-card-controller.ts' import { en } from '../src/client/locales.ts' @@ -59,11 +60,20 @@ function renderSection(rows: readonly PluginsSettingsTabEntry[]) { render() } -function renderConfigurable(cardCount: number, cards = 'cards') { +/** + * Render the tab over the namespaces it was told to dispatch, with `cards` + * standing in for the slot ledger: a key it names renders that text, and one + * it does not renders nothing, exactly as an unclaimed key does. + */ +function renderConfigurable(namespaces: string[], cards: Record = {}, loaded = true) { + const store = createSnapshotStore({ loaded, namespaces }) const props = { t, - cardCount, - renderSlot: () =>
  • {cards}
  • , + useConfigurablePlugins: bindSnapshotSelector(store), + renderSlot: (_name: string, _owner: object, opts?: { entryKey?: string }) => { + const card = opts?.entryKey === undefined ? undefined : cards[opts.entryKey] + return card === undefined ? null :
  • {card}
  • + }, } as unknown as ConfigurablePluginsTabProps render() } @@ -153,16 +163,24 @@ describe('PluginsSettingsSection', () => { describe('ConfigurablePluginsTab', () => { it('says so when no plugin contributed a card', () => { - renderConfigurable(0) + renderConfigurable([], { bash: 'shell' }) expect(screen.getByText(en.empty)).toBeTruthy() - expect(screen.queryByText('cards')).toBeNull() + expect(screen.queryByText('shell')).toBeNull() }) - it('renders the card list once a plugin contributed one', () => { - renderConfigurable(1) + it('withholds the empty line until the Host has answered once', () => { + // An unanswered read is not the statement that this deployment configures + // no plugin; saying it anyway would flash a wrong answer on every open. + renderConfigurable([], { bash: 'shell' }, false) - expect(screen.getByText('cards')).toBeTruthy() + expect(screen.queryByText(en.empty)).toBeNull() + }) + + it('dispatches one card per namespace, keyed by it', () => { + renderConfigurable(['bash', 'agent-loop'], { bash: 'shell', 'agent-loop': 'loop' }) + + expect(screen.getAllByRole('listitem').map(item => item.textContent)).toEqual(['shell', 'loop']) expect(screen.queryByText(en.empty)).toBeNull() }) }) diff --git a/packages/client/ui-settings-plugins/tests/stores.client.spec.ts b/packages/client/ui-settings-plugins/tests/stores.client.spec.ts index 15ad7cf76a..9901bc5eb1 100644 --- a/packages/client/ui-settings-plugins/tests/stores.client.spec.ts +++ b/packages/client/ui-settings-plugins/tests/stores.client.spec.ts @@ -8,6 +8,7 @@ import { stubSettingsScope, type StubSettingsScope } from '@deepseek-ai/dsh-clie import { CardForm, numberField, textField } from '../src/client/card-form.ts' import { AgentLoopCardController, type AgentLoopSettings } from '../src/client/agent-loop-card-controller.ts' import { BashCardController, type BashSettings } from '../src/client/bash-card-controller.ts' +import { ConfigurablePluginsTabController } from '../src/client/tab-store.ts' import { WebSearchCardController, type WebSearchSettings } from '../src/client/web-search-card-controller.ts' /** Make the stub behave like a Host that accepts every write. */ @@ -380,7 +381,7 @@ describe('AgentLoopCardController', () => { }) describe('WebSearchCardController', () => { - it('reads the credential state for the reference the section names', async () => { + it('reads the credential state for the reference the tab names', async () => { const host = stubSettingsScope() const credentials = credentialsApi(true) const controller = new WebSearchCardController(host.scope, credentials.api) @@ -460,7 +461,7 @@ describe('WebSearchCardController', () => { }) }) - it('addresses the reference the section declares rather than the default', async () => { + it('addresses the reference the tab declares rather than the default', async () => { const host = stubSettingsScope() const credentials = credentialsApi(false) const controller = new WebSearchCardController(host.scope, credentials.api) @@ -538,3 +539,131 @@ describe('WebSearchCardController', () => { expect(credentials.set).not.toHaveBeenCalled() }) }) + +describe('ConfigurablePluginsTabController', () => { + function settingsApi(namespaces: string[]) { + const describe = vi.fn(() => Promise.resolve({ + rpcId: 's-1' as never, + result: { + ok: true as const, + value: { + writable: true, + hasDocument: true, + namespaces: namespaces.map(ns => ({ + ns, schema: {}, value: {}, applies: 'live' as const, secrets: [], revision: 0, + })), + }, + }, + })) + return { api: { settings: { describe } } as never, describe } + } + + /** Slot ledger stand-in: one stored entry per registered card key. */ + function ledger(...keys: string[]) { + return keys.map(key => ({ component: null, options: { key } })) + } + + it('dispatches the served namespaces a card claims, in card registration order', async () => { + const settings = settingsApi(['bash', 'ui-theme', 'agent-loop']) + const controller = new ConfigurablePluginsTabController(settings.api, () => ledger('agent-loop', 'bash')) + + await controller.load() + + // ui-theme is served but claimed by no card here — another surface owns + // it. The order is the cards', not the Host's: plugin activation can + // reorder the description between boots. + expect(controller.inject().hooks.configurablePlugins.getSnapshot().namespaces) + .toEqual(['agent-loop', 'bash']) + }) + + it('never dispatches a card whose namespace this deployment does not serve', async () => { + const settings = settingsApi(['bash']) + const controller = new ConfigurablePluginsTabController(settings.api, () => ledger('bash', 'web-search-deepseek')) + + await controller.load() + + expect(controller.inject().hooks.configurablePlugins.getSnapshot().namespaces).toEqual(['bash']) + }) + + it('takes a card registered after the read without asking the Host again', async () => { + const settings = settingsApi(['bash']) + let entries = ledger() + const controller = new ConfigurablePluginsTabController(settings.api, () => entries) + await controller.load() + expect(controller.inject().hooks.configurablePlugins.getSnapshot().namespaces).toEqual([]) + + entries = ledger('bash') + controller.refresh() + + expect(controller.inject().hooks.configurablePlugins.getSnapshot().namespaces).toEqual(['bash']) + expect(settings.describe).toHaveBeenCalledOnce() + }) + + it('keeps the namespaces it knew when a read fails', async () => { + const settings = settingsApi(['bash']) + const controller = new ConfigurablePluginsTabController(settings.api, () => ledger('bash')) + await controller.load() + settings.describe.mockRejectedValueOnce(new Error('offline')) + + await controller.load() + + expect(controller.inject().hooks.configurablePlugins.getSnapshot().namespaces).toEqual(['bash']) + }) + + it('publishes nothing once disposed, and never claims it was answered', async () => { + const settings = settingsApi(['bash']) + const controller = new ConfigurablePluginsTabController(settings.api, () => ledger('bash')) + + controller.dispose() + await controller.load() + + expect(controller.inject().hooks.configurablePlugins.getSnapshot()) + .toEqual({ loaded: false, namespaces: [] }) + expect(settings.describe).not.toHaveBeenCalled() + }) + + it('ignores a slot-ledger change that arrives after disposal', async () => { + const settings = settingsApi(['bash']) + let entries = ledger() + const controller = new ConfigurablePluginsTabController(settings.api, () => entries) + await controller.load() + + controller.dispose() + entries = ledger('bash') + controller.refresh() + + expect(controller.inject().hooks.configurablePlugins.getSnapshot().namespaces).toEqual([]) + }) + + it('drops a read a newer one superseded', async () => { + // The section re-reads on every settings-document invalidation, so a slow + // first answer must not overwrite the newer one that already landed. + const settings = settingsApi(['bash']) + const controller = new ConfigurablePluginsTabController(settings.api, () => ledger('bash', 'agent-loop')) + const slow = Promise.withResolvers() + settings.describe.mockReturnValueOnce(slow.promise as never) + const stale = controller.load() + + await controller.load() + expect(controller.inject().hooks.configurablePlugins.getSnapshot().namespaces).toEqual(['bash']) + slow.resolve({ + rpcId: 's-0', + result: { ok: true, value: { writable: true, hasDocument: true, namespaces: [ + { ns: 'agent-loop', schema: {}, value: {}, applies: 'live', secrets: [], revision: 0 }, + ] } }, + }) + await stale + + expect(controller.inject().hooks.configurablePlugins.getSnapshot().namespaces).toEqual(['bash']) + }) + + it('reports the Host answered even when it serves nothing this tab shows', async () => { + const settings = settingsApi(['ui-theme']) + const controller = new ConfigurablePluginsTabController(settings.api, () => ledger('bash')) + + await controller.load() + + expect(controller.inject().hooks.configurablePlugins.getSnapshot()) + .toEqual({ loaded: true, namespaces: [] }) + }) +}) diff --git a/packages/client/ui-settings/package.json b/packages/client/ui-settings/package.json index 96114115e7..485092d2b9 100644 --- a/packages/client/ui-settings/package.json +++ b/packages/client/ui-settings/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-settings", "description": "Settings domain base plugin: the settings-namespace scope service and the canonical settings slot-type contract", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-settings/src/client/contract/slots.ts b/packages/client/ui-settings/src/client/contract/slots.ts index 76c5f540f9..5413f8cb29 100644 --- a/packages/client/ui-settings/src/client/contract/slots.ts +++ b/packages/client/ui-settings/src/client/contract/slots.ts @@ -64,13 +64,11 @@ declare module '@deepseek-ai/dsh-client-ui-slots' { * Root-scoped onboarding steps contributed by settings features. The * shell mounts one ordered step at a time; the active registrant either * completes itself or keeps ownership until the user completes its sole - * path. Registrants own readiness, copy, dialog behavior, AND the - * takeover chrome: a step wraps its visible content in the - * OnboardingSurface primitive (mask, opaque stage, `#root` inert) and - * renders null while its private facts are still loading — the shell - * paints no chrome of its own, so a mounted-but-deciding step shows and - * blocks nothing (prevents a white flash on reload: a bare unwrapped step - * would render without mask or stage). + * path. Registrants own readiness, copy, dialog behavior, AND visible + * chrome: a step wraps its visible content in its modal surface (including + * `#root` inert ownership) and renders null while private facts are still + * loading. The shell paints no chrome of its own, so a mounted-but-deciding + * step shows and blocks nothing. */ 'settings.onboarding': { kind: 'list'; scope: 'root'; owner: SettingsOnboardingOwnerProps } /** diff --git a/packages/client/ui-sidebar/README.i18n.yaml b/packages/client/ui-sidebar/README.i18n.yaml index 562396d88f..ac3531b205 100644 --- a/packages/client/ui-sidebar/README.i18n.yaml +++ b/packages/client/ui-sidebar/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-sidebar/README.md -README.md: 9974118f69901de985e012e1b62f95a0bcee64c2 -README.zh.md: 11b0aa142cf62626ab6105e2c405d506e35349b0 +README.md: 7cc4fe0a722fe5f8cf0e983a0e3fdb30cd31bb64 +README.zh.md: 96b6f60f871758c126e6c387c6ce3f0993039af0 diff --git a/packages/client/ui-sidebar/README.md b/packages/client/ui-sidebar/README.md index 9974118f69..7cc4fe0a72 100644 --- a/packages/client/ui-sidebar/README.md +++ b/packages/client/ui-sidebar/README.md @@ -8,6 +8,8 @@ New Session starts the runtime's page-local frontend Session Intent. The runtime `SidebarRootComponentProps` composes the layout owner share, the global `useSessions` and `useWorkspaces` hooks, the declared `sidebar.workspaces` and `sidebar.settings` child slots, and injected `startSession` plus sidebar-toggle callbacks. There is no plugin store. +During a live collapse, the shell holds the expanded content at its current width while it fades out for 150ms. The four upper controls—the shell toggle and New Session plus add and search rendered through `sidebar.workspaces`—then share one 150ms fade and 49px leftward translation into the 56px rail, ending with the layout's 300ms column slide; every 36px control box follows the same path to the rail's 10px left inset. The bottom-pinned `sidebar.settings` control shares the fade timing but has no horizontal translation. A page that starts collapsed renders the rail statically, and reduced-motion mode disables both transitions. + Scrollbars in the column are a pointer affordance: the shell rebinds ui-theme's [scrollbar indirection](../ui-theme/README.md) to `transparent` whenever the pointer is outside it, and keeps the thumb drawn for 2s after the pointer leaves, so a list nobody is pointing at carries no bar. The reservation that keeps rows from moving belongs to the scrolling region ([ui-workspace](../ui-workspace/README.md)), so revealing a thumb never reflows. The foot is the `sidebar.settings` seat: the sidebar renders only the bottom-pinned layout slot and shares its column state (`wide`); ui-settings registers the trigger row and settings panel there. diff --git a/packages/client/ui-sidebar/README.zh.md b/packages/client/ui-sidebar/README.zh.md index 11b0aa142c..96b6f60f87 100644 --- a/packages/client/ui-sidebar/README.zh.md +++ b/packages/client/ui-sidebar/README.zh.md @@ -8,6 +8,8 @@ New Session 会å�¯åЍè¿�行时的页é�¢å±€éƒ¨å‰�端 Session Intent。è¿�行时 `SidebarRootComponentProps` 组å�ˆå¸ƒå±€ owner shareã€�全局 `useSessions` å’Œ `useWorkspaces` é’©å­�ã€�已声明的 `sidebar.workspaces` 与 `sidebar.settings` å­� slot,以å�Šæ³¨å…¥çš„ `startSession` 与侧边æ �切æ�¢å›žè°ƒã€‚这里没有æ�’ä»¶ store。 +实时收起时,外壳会把展开内容固定在当å‰�宽度,并用 150ms 将其淡出。éš�å�Žï¼Œä¸Šæ–¹å››ä¸ªæŽ§ä»¶â€”—外壳的侧æ �切æ�¢ä¸Žæ–°å»ºä¼šè¯�,以å�Šé€šè¿‡ `sidebar.workspaces` 渲染的添加和æ�œç´¢â€”—共用一次 150ms 的淡入和 49px 左移,在布局的 300ms æ �滑动结æ�Ÿæ—¶ä¸€èµ·è¿›å…¥ 56px 轨é�“ï¼›æ¯�个 36px 控件盒都会沿å�Œä¸€æ�¡è·¯å¾„到达轨é�“左侧 10px 的内边è·�。固定在底部的 `sidebar.settings` 控件å�ªå…±ç”¨æ·¡å…¥æ—¶åº�,ä¸�å�‘生横å�‘ä½�移。页é�¢åˆ�å§‹å�³ä¸ºæ”¶èµ·çжæ€�时会é�™æ€�渲染轨é�“ï¼›å‡�少动æ€�效果模å¼�会ç¦�用两段过渡。 + æ �内的滚动æ�¡æ˜¯ä¸€ç§�指针å�¯ä¾›æ€§ï¼šå�ªè¦�指针ä¸�在æ �内,外壳就把 ui-theme çš„[滚动æ�¡é—´æŽ¥å±‚](../ui-theme/README.md)é‡�新绑定为 `transparent`;指针离开å�Žæ»‘å�—å†�ä¿�ç•™ 2 秒,因此没人指å�‘的列表ä¸�会带ç�€æ»šåЍæ�¡ã€‚é�¿å…�行ä½�移的空间预留属于滚动区域本身([ui-workspace](../ui-workspace/README.md)),所以显示滑å�—ä¸�会引起é‡�排。 页脚承载 `sidebar.settings`:侧边æ �å�ªæ¸²æŸ“固定在底部的布局 slot,并共享其æ �状æ€�(`wide`);ui-settings 在此注册触å�‘行和设置é�¢æ�¿ã€‚ diff --git a/packages/client/ui-sidebar/package.json b/packages/client/ui-sidebar/package.json index fa43d4ac8f..cfda6d55fc 100644 --- a/packages/client/ui-sidebar/package.json +++ b/packages/client/ui-sidebar/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-sidebar", "description": "Sidebar plugin: session multi-level tree, search, grouping, state dots", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-sidebar/src/client/SidebarRoot.module.css b/packages/client/ui-sidebar/src/client/SidebarRoot.module.css index be8f12efb6..300075b88d 100644 --- a/packages/client/ui-sidebar/src/client/SidebarRoot.module.css +++ b/packages/client/ui-sidebar/src/client/SidebarRoot.module.css @@ -58,24 +58,35 @@ from { opacity: 0; } } -/* Rail controls hold hidden while the column slides shut, then fade in over - the slide's tail: .railIn applies at settle (150ms into the 0.3s AppFrame - track transition), so a 100ms delay + 150ms fade starts just before the - slide ends (250ms) and finishes at 400ms; `backwards` keeps them at - opacity 0 through the delay. Only a live collapse gets .railIn — a - refresh straight into the collapsed state renders statically. */ +/* At the 150ms rail settle, the four upper controls enter from the former + rail right edge over the remaining 150ms of the AppFrame track transition. + The bottom-pinned settings seat shares their opacity timeline but stays + horizontally fixed. Only a live collapse gets .railIn; a cold collapsed + render stays static. */ .railIn .iconButton, .railIn .newSession, +.railIn .regionArea { + animation: rail-in 150ms var(--ds-ease-in-out) backwards; +} + .railIn .footArea { - animation: rail-in 150ms var(--ds-ease-in-out) 100ms backwards; + animation: rail-fade-in 150ms var(--ds-ease-in-out) backwards; } @keyframes rail-in { + from { + opacity: 0; + transform: translateX(49px); + } +} + +@keyframes rail-fade-in { from { opacity: 0; } } -/* Logo row (figma pad (4,8,4,8)): brand left, panel toggle right-anchored — - the toggle is the rail's expand control and slides in with the right edge. */ +/* Logo row (figma pad (4,8,4,8)): expanded keeps the panel toggle at the + right edge; the rail gives every control the same base left anchor before + the shared entry translation is applied. */ .logoRow { flex: none; display: flex; @@ -93,6 +104,7 @@ height: 36px; padding: 0; margin-bottom: 12px; + justify-content: flex-start; } /* Brand group (figma I133:7632): the full wordmark rides the text ink @@ -185,6 +197,8 @@ } .collapsed .newSession { + align-self: flex-start; + width: 36px; height: 36px; padding: 0; margin: 0 0 12px; @@ -262,7 +276,8 @@ .fading > *, .railIn .iconButton, .railIn .newSession, - .railIn .footArea { + .railIn .footArea, + .railIn .regionArea { transition: none; animation: none; } diff --git a/packages/client/ui-sidebar/src/client/SidebarRoot.tsx b/packages/client/ui-sidebar/src/client/SidebarRoot.tsx index 9f63b9d2f5..d3fe6a63c1 100644 --- a/packages/client/ui-sidebar/src/client/SidebarRoot.tsx +++ b/packages/client/ui-sidebar/src/client/SidebarRoot.tsx @@ -2,12 +2,13 @@ * Sidebar shell: column geometry only. Collapse is a slide plus crossfade: * content freezes at its expanded width (inline style) and fades out in place * while the sliding column (AppFrame grid tracks) clips it — nothing reflows - * mid-slide. At settle the wide-only content unmounts and the control rows - * snap to the 56px rail (one icon each, same top-down order) fading in as the - * slide ends. The workspace/session browsing region between the New Session - * button and the foot is the `sidebar.workspaces` registrant's, and the foot - * holds `sidebar.settings` plus `sidebar.footer.action`; the shell hands them the wide flag - * (plus an expand request callback for the browser). + * mid-slide. At settle the wide-only content unmounts and the four upper + * controls enter the 56px rail from the same horizontal offset (one icon each, + * same top-down order) on one fade that ends with the slide. The bottom-pinned + * settings control only fades. The workspace/session browsing region between + * the New Session button and the foot is the `sidebar.workspaces` registrant's, + * and the foot holds `sidebar.settings` plus `sidebar.footer.action`; the shell + * hands them the wide flag (plus an expand request callback for the browser). * * The column also owns whether the scroll regions nested in it draw a * scrollbar at all: the shell tracks the pointer and rebinds ui-theme's diff --git a/packages/client/ui-sidebar/tests/sidebar-styles.client.spec.ts b/packages/client/ui-sidebar/tests/sidebar-styles.client.spec.ts index c4abce1911..19e7a54380 100644 --- a/packages/client/ui-sidebar/tests/sidebar-styles.client.spec.ts +++ b/packages/client/ui-sidebar/tests/sidebar-styles.client.spec.ts @@ -1,4 +1,4 @@ -/** Sidebar shell inset contract shared with the nested workspace browser. */ +/** Sidebar shell style contracts shared with its slot-owned controls. */ import { readFileSync } from 'node:fs' import { fileURLToPath } from 'node:url' import { describe, expect, it } from 'vitest' @@ -25,7 +25,7 @@ function declarations(selector: string): Map | undefined { return undefined } -describe('SidebarRoot.module.css inset', () => { +describe('SidebarRoot.module.css', () => { it('shares and cancels the wide shell trailing padding structurally', () => { const root = declarations('.root') expect(root?.get('--dsh-sidebar-inline-padding')).toBe('12px') @@ -39,4 +39,28 @@ describe('SidebarRoot.module.css inset', () => { expect(declarations('.collapsed .regionArea')?.get('padding-left')).toBe('0') expect(declarations('.collapsed .regionArea')?.get('margin-right')).toBe('0') }) + + it('moves the four upper controls while the settings seat only fades', () => { + const animation = 'rail-in 150ms var(--ds-ease-in-out) backwards' + for (const selector of [ + '.railIn .iconButton', + '.railIn .newSession', + '.railIn .regionArea', + ]) { + expect(declarations(selector)?.get('animation')).toBe(animation) + } + expect(declarations('.railIn .footArea')?.get('animation')).toBe( + 'rail-fade-in 150ms var(--ds-ease-in-out) backwards', + ) + expect(css).toMatch( + /@keyframes rail-in\s*\{\s*from\s*\{\s*opacity: 0;\s*transform: translateX\(49px\);\s*}\s*}/, + ) + expect(css).toMatch(/@keyframes rail-fade-in\s*\{\s*from\s*\{\s*opacity: 0;\s*}\s*}/) + }) + + it('gives shell rail controls the same base anchor for their shared translation', () => { + expect(declarations('.collapsed .logoRow')?.get('justify-content')).toBe('flex-start') + expect(declarations('.collapsed .newSession')?.get('align-self')).toBe('flex-start') + expect(declarations('.collapsed .newSession')?.get('width')).toBe('36px') + }) }) diff --git a/packages/client/ui-skill/package.json b/packages/client/ui-skill/package.json index bfea498ad0..b2026095f2 100644 --- a/packages/client/ui-skill/package.json +++ b/packages/client/ui-skill/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-skill", "description": "Web skill references and the dedicated skill tool row", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -45,7 +45,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/dsh-api-remotes": "workspace:^", "@deepseek-ai/dsh-client-connection": "workspace:^", diff --git a/packages/client/ui-slots/package.json b/packages/client/ui-slots/package.json index 99db753250..351daf442b 100644 --- a/packages/client/ui-slots/package.json +++ b/packages/client/ui-slots/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-slots", "description": "Slot registry pure core: SlotMap declaration merging, single register composition API, four-share props types, store-seat types, renderer install seam", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -25,7 +25,7 @@ "./src/*": "./src/*", "./package.json": "./package.json" }, - "license": "BSD-3-Clause", + "license": "MIT", "devDependencies": { "@deepseek-ai/dsh-invariants": "workspace:^", "@types/react": "~18.3.1", diff --git a/packages/client/ui-subagent/package.json b/packages/client/ui-subagent/package.json index 20cc8ef3ba..0e0b7aadae 100644 --- a/packages/client/ui-subagent/package.json +++ b/packages/client/ui-subagent/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-subagent", "description": "Subagent conversation catalog, continuation routing UI, and '@' reference source", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -45,7 +45,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "react": "^18.2.0" }, diff --git a/packages/client/ui-theme/README.i18n.yaml b/packages/client/ui-theme/README.i18n.yaml index 6187195b04..0e5c91000d 100644 --- a/packages/client/ui-theme/README.i18n.yaml +++ b/packages/client/ui-theme/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-theme/README.md -README.md: 9388d5c05e5625d1a38b27c4565edf3ed47b3b6d -README.zh.md: 9995980e4a64b07c376f90e223c1ec83b5881b73 +README.md: e84a21f085eaef7546321edc90847a9a3f9bb2b8 +README.zh.md: 758b6f52d330f4518a2df5267117b61446102ea7 diff --git a/packages/client/ui-theme/README.md b/packages/client/ui-theme/README.md index 9388d5c05e..e84a21f085 100644 --- a/packages/client/ui-theme/README.md +++ b/packages/client/ui-theme/README.md @@ -8,7 +8,7 @@ When the host composition includes an HTTP server, the host half injects a synch `src/styles/` holds five sheets, all imported by the web shell's `base.css`: `base.css`, `design-platform.css`, `scrollbar.css`, `gradient-shadow-text.css`, and `shiki.css`. `scrollbar.css` is the sole consumer of the `--dsw-alias-scrollbar-*` tokens and must follow `design-platform.css`, which declares them. -Scrollbar rebinding contract: `scrollbar.css` binds `--dsh-scrollbar-thumb` and `--dsh-scrollbar-thumb-hover` on `body` to the l1 (base-surface) tokens, and both rendering paths read that pair. An elevated surface (menu, popover, dialog) sets `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` and `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)` on its own container; one rebind retints whichever path the engine took. The pair's other legal target is `transparent`, which draws no thumb at all — [ui-sidebar](../ui-sidebar/README.md) rebinds its column that way while the pointer is elsewhere. A rebind to the l1 pair is not a rebind; it restates the base-surface default. +Scrollbar rebinding contract: `scrollbar.css` binds `--dsh-scrollbar-thumb` and `--dsh-scrollbar-thumb-hover` on `body` to the l1 (base-surface) tokens, and both rendering paths read that pair. An elevated surface (menu, popover, dialog) sets `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` and `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)` on its own container; one rebind retints whichever path the engine took. The pair's other legal target is `transparent`, which draws no thumb at all — [ui-sidebar](../ui-sidebar/README.md) rebinds its column that way while the pointer is elsewhere. A rebind to the l1 pair is not a rebind; it restates the base-surface default. `--dsh-scrollbar-width` mirrors the WebKit bar's layout width for surfaces that align themselves beside a space-consuming bar — [ui-conversation](../ui-conversation/README.md) reads it for the overlay composer seat's `right` offset — and the scrollbar-styles spec pairs it with the mirrored rule and the consumer. The two paths are mutually exclusive by construction. `scrollbar-width`/`scrollbar-color` sit inside `@supports not selector(::-webkit-scrollbar)` because a non-`auto` value of either makes Chromium and Safari discard every `::-webkit-scrollbar*` rule for that element, `::-webkit-scrollbar-thumb:hover` included — declaring both unconditionally leaves `--dsh-scrollbar-thumb-hover` with no rendering anywhere. Firefox therefore takes the standard properties and WebKit-based engines take the pseudo-elements, so the hover token only ever renders through the pseudo-element path. Reasoning and the measured computed values: [the scrollbar Agent Note](../../../.agents/notes/implemented/bug-fix/2026-07-28-themed-scrollbars-and-reserved-gutter.md). diff --git a/packages/client/ui-theme/README.zh.md b/packages/client/ui-theme/README.zh.md index 9995980e4a..758b6f52d3 100644 --- a/packages/client/ui-theme/README.zh.md +++ b/packages/client/ui-theme/README.zh.md @@ -8,7 +8,7 @@ `src/styles/` 下有五张样å¼�表,全部由 web 壳的 `base.css` 导入:`base.css`ã€�`design-platform.css`ã€�`scrollbar.css`ã€�`gradient-shadow-text.css` 与 `shiki.css`。`scrollbar.css` 是 `--dsw-alias-scrollbar-*` token 的唯一消费方,必须排在声明这些 token çš„ `design-platform.css` 之å�Žã€‚ -滚动æ�¡é‡�新绑定约定:`scrollbar.css` 在 `body` 上把 `--dsh-scrollbar-thumb` 与 `--dsh-scrollbar-thumb-hover` 绑定到 l1(基础表é�¢ï¼‰token,两æ�¡æ¸²æŸ“路径都读å�–这一组å�˜é‡�。高层级表é�¢ï¼ˆè�œå�•ã€�浮层ã€�对è¯�框)在自己的容器上设置 `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` 与 `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)`;一次é‡�新绑定å�³å�¯ä¸ºå¼•擎实际走的那æ�¡è·¯å¾„æ�¢è‰²ã€‚这组å�˜é‡�çš„å�¦ä¸€ä¸ªå�ˆæ³•目标是 `transparent`,å�³å®Œå…¨ä¸�绘制滑å�———[ui-sidebar](../ui-sidebar/README.md) 在指针ä¸�在æ �内时就这样é‡�新绑定自己的列。绑回 l1 那组ä¸�ç®—é‡�新绑定,它å�ªæ˜¯é‡�述基础表é�¢çš„默认值。 +滚动æ�¡é‡�新绑定约定:`scrollbar.css` 在 `body` 上把 `--dsh-scrollbar-thumb` 与 `--dsh-scrollbar-thumb-hover` 绑定到 l1(基础表é�¢ï¼‰token,两æ�¡æ¸²æŸ“路径都读å�–这一组å�˜é‡�。高层级表é�¢ï¼ˆè�œå�•ã€�浮层ã€�对è¯�框)在自己的容器上设置 `--dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)` 与 `--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2)`;一次é‡�新绑定å�³å�¯ä¸ºå¼•擎实际走的那æ�¡è·¯å¾„æ�¢è‰²ã€‚这组å�˜é‡�çš„å�¦ä¸€ä¸ªå�ˆæ³•目标是 `transparent`,å�³å®Œå…¨ä¸�绘制滑å�———[ui-sidebar](../ui-sidebar/README.md) 在指针ä¸�在æ �内时就这样é‡�新绑定自己的列。绑回 l1 那组ä¸�ç®—é‡�新绑定,它å�ªæ˜¯é‡�述基础表é�¢çš„默认值。`--dsh-scrollbar-width` 镜åƒ� WebKit 滚动æ�¡çš„布局宽度,供需è¦�与å� å¸ƒå±€å®½åº¦çš„æ»šåЍæ�¡å¯¹é½�的表é�¢ä½¿ç”¨â€”—[ui-conversation](../ui-conversation/README.md) 用它作为覆盖 composer 座ä½� `right` å��移——scrollbar-styles 规格把它与镜åƒ�规则å�Šæ¶ˆè´¹è€…é…�对检查。 两æ�¡è·¯å¾„在构造上互斥。`scrollbar-width`ï¼�`scrollbar-color` 写在 `@supports not selector(::-webkit-scrollbar)` 之内,因为这两个属性中的任一个å�ªè¦�å�–é�ž `auto` 值,Chromium 与 Safari 就会丢弃该元素上的全部 `::-webkit-scrollbar*` 规则,`::-webkit-scrollbar-thumb:hover` 也在其中——若无æ�¡ä»¶åœ°å�Œæ—¶å£°æ˜Žï¼Œ`--dsh-scrollbar-thumb-hover` 在任何引擎上都ä¸�会被渲染。因此 Firefox 走标准属性,WebKit 系引擎走伪元素,hover token å�ªç»�由伪元素这æ�¡è·¯å¾„渲染。相关原ç�†ä¸Žå®žæµ‹è®¡ç®—值è§�[滚动æ�¡ Agent Note](../../../.agents/notes/implemented/bug-fix/2026-07-28-themed-scrollbars-and-reserved-gutter.md)。 diff --git a/packages/client/ui-theme/package.json b/packages/client/ui-theme/package.json index 85bc5eada4..6f320cd92f 100644 --- a/packages/client/ui-theme/package.json +++ b/packages/client/ui-theme/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-theme", "description": "Theme plugin: Host bootstrap for the pre-plugin palette; DOM-free ThemeRuntime for light/dark/system state; --dsw-* token styles and Appearance settings row", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -43,7 +43,7 @@ "immediately": true } }, - "license": "BSD-3-Clause", + "license": "MIT", "peerDependencies": { "@deepseek-ai/cordis": "workspace:^", "@deepseek-ai/dsh-api-remotes": "workspace:^", diff --git a/packages/client/ui-theme/src/styles/scrollbar.css b/packages/client/ui-theme/src/styles/scrollbar.css index 31b5a8aabe..71f67d4f57 100644 --- a/packages/client/ui-theme/src/styles/scrollbar.css +++ b/packages/client/ui-theme/src/styles/scrollbar.css @@ -17,6 +17,11 @@ body { --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l1); --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l1); + /* The WebKit bar's layout width, mirrored by the ::-webkit-scrollbar rule + below. A surface that must align itself beside a space-consuming bar + (ConversationRoot's overlay composer seat) reads this instead of + hardcoding the number. */ + --dsh-scrollbar-width: 8px; } /* The two paths are mutually exclusive, and the gate is load-bearing rather diff --git a/packages/client/ui-theme/tests/scrollbar-styles.client.spec.ts b/packages/client/ui-theme/tests/scrollbar-styles.client.spec.ts index b6ed3f0c90..e9234846eb 100644 --- a/packages/client/ui-theme/tests/scrollbar-styles.client.spec.ts +++ b/packages/client/ui-theme/tests/scrollbar-styles.client.spec.ts @@ -2,10 +2,11 @@ * Scrollbar stylesheet contract, asserted against the CSS text on disk: every * --dsw-alias-scrollbar-* token design-platform.css defines has a consumer, * scrollbar.css binds the base-surface pair through the rebindable - * indirection, and elevated surfaces rebind that indirection in complete - * pairs. The expected token set is scanned out of design-platform.css, so - * adding, renaming, or dropping a scrollbar token moves these assertions with - * it. + * indirection, the width variable mirrors the ::-webkit-scrollbar rule for + * consumers that align beside the bar, and elevated surfaces rebind that + * indirection in complete pairs. The expected token set is scanned out of + * design-platform.css, so adding, renaming, or dropping a scrollbar token + * moves these assertions with it. */ import { readdirSync, readFileSync } from 'node:fs' import { join } from 'node:path' @@ -341,6 +342,67 @@ describe('scrollbar.css base-surface binding', () => { }) }) +describe('scrollbar.css width variable', () => { + const WIDTH_VARIABLE = `${INDIRECTION_PREFIX}width` + + it('defines the width variable on body as a static length', () => { + // The overlay seat compensation reads a fixed number, not a second + // indirection: the mirror check below compares the WebKit rule against + // this value, so a var()-to-var() chain would compare one indirection to + // another instead of pinning the number. + const value = scrollbarRules + .filter(rule => rule.selectors.includes('body')) + .flatMap(rule => rule.declarations) + .findLast(([property]) => property === WIDTH_VARIABLE)?.[1] + expect(value, WIDTH_VARIABLE).toBeDefined() + expect(value, WIDTH_VARIABLE).toMatch(/^\d+(?:\.\d+)?px$/) + }) + + it('mirrors the ::-webkit-scrollbar width rule with the variable value', () => { + // The compensation stays aligned with the WebKit bar only while both read + // the same number. A change to one side without the other puts the overlay + // seat a band off from Chat on WebKit engines. + const variableValue = scrollbarRules + .filter(rule => rule.selectors.includes('body')) + .flatMap(rule => rule.declarations) + .findLast(([property]) => property === WIDTH_VARIABLE)?.[1] + const webkitWidth = scrollbarRules + .filter(rule => rule.selectors.includes('::-webkit-scrollbar')) + .flatMap(rule => rule.declarations) + .findLast(([property]) => property === 'width')?.[1] + expect(webkitWidth, '::-webkit-scrollbar width').toBeDefined() + expect(webkitWidth).toBe(variableValue) + }) + + it('every reader of the width variable outside ui-theme references a defined variable', () => { + // The consumer is ConversationRoot's overlay composer seat + // (`right: var(--dsh-scrollbar-width)`); a rename in scrollbar.css without + // the consumer, or a typo in the consumer, leaves the value + // guaranteed-invalid and the seat loses the band. The equal-rectangle e2e + // would catch it only on an engine that draws the bar, so the sheet + // contract states it here. + const defined = new Set( + scrollbarRules + .flatMap(rule => rule.declarations) + .filter(([property]) => property.startsWith(INDIRECTION_PREFIX)) + .map(([property]) => property), + ) + expect(defined).toContain(WIDTH_VARIABLE) + const readers: string[] = [] + for (const file of packageStylesheets()) { + if (file === fileURLToPath(new URL('scrollbar.css', STYLES))) continue + for (const rule of parseRules(readFileSync(file, 'utf8'))) { + for (const [property, value] of rule.declarations) { + for (const name of varReferences(value)) { + if (name === WIDTH_VARIABLE) readers.push(`${file} ${rule.selectors.join(', ')}: ${property}`) + } + } + } + } + expect(readers.length, 'compensation consumer').toBeGreaterThan(0) + }) +}) + describe('scrollbar.css selectors', () => { const scrollbarColorSelectors = scrollbarRules .filter(rule => rule.declarations.some(([property]) => property === 'scrollbar-color')) diff --git a/packages/client/ui-tool/package.json b/packages/client/ui-tool/package.json index 42acc17b65..80bc4f2586 100644 --- a/packages/client/ui-tool/package.json +++ b/packages/client/ui-tool/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-tool", "description": "Client Tool call-tree renderer and keyed per-tool presentation slot", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "clsx": "^2.0.0" }, diff --git a/packages/client/ui-trajectory/README.i18n.yaml b/packages/client/ui-trajectory/README.i18n.yaml index b3b7d8ac47..c3a40c880f 100644 --- a/packages/client/ui-trajectory/README.i18n.yaml +++ b/packages/client/ui-trajectory/README.i18n.yaml @@ -2,5 +2,5 @@ # side as of the last confirmed-consistent state. Both languages carry equal authority; # after editing either side, bring the other along and re-record with: # pnpm run verify-translation-pairing --write packages/client/ui-trajectory/README.md -README.md: d3786b6460c5df7eaa6d24e68c80025e7fb29ae4 -README.zh.md: b3bc88d8ab73ccc0da9a49d1867fe2c66be5ca43 +README.md: 9ad42a3d3bcfb8fbf4842a66577e65794a716dfd +README.zh.md: df7661ef7d4861dbc6c8e365a18b3e3252d4d4af diff --git a/packages/client/ui-trajectory/README.md b/packages/client/ui-trajectory/README.md index d3786b6460..9ad42a3d3b 100644 --- a/packages/client/ui-trajectory/README.md +++ b/packages/client/ui-trajectory/README.md @@ -2,7 +2,7 @@ English | [中文](README.zh.md) -Trajectory renders a turn-aware event ledger with selectable User, Assistant, Tool, and nested Subtool records. Thick rules mark Turn boundaries, compact inline markers identify Steps, and the main ledger keeps only index, event, and content; selection opens a local inspector for token usage, duration, Input, Output, and Timing. Scrollable Summary regions keep their scrollbar thumbs transparent until the region is hovered or contains keyboard focus, without changing the reserved scroll geometry. A standalone compaction request appears chronologically in its own `Between turns` section, while a numbered compaction remains inside its owning turn. Long ledgers open at the current tail, load one older page when the user reaches the loaded range's top, and mount only the visible row window plus a small overscan; request-only separators share the next measurable virtual item, while semantic row keys and ARIA indexes survive prepends. Selection, timeline navigation, folding, search, and Request totals cover the currently loaded window. The ledger covers records with an explicit loading row until the initial tail is positioned and while an older page is pending. A fixed Overview above the ledger projects real record start/duration timing from left to right; when earlier records remain unloaded and the viewport includes the loaded domain's start, a neutral ellipsis control identifies the omitted prefix and loads one earlier page without assigning unknown history fabricated duration. Assistant spans divide recorded TTFT from decoding, and a 500 ms hover reveals exact clock and duration details. Dragging an interval focuses the ledger on every record active at any point in that inclusive range, while clearing the selection restores the full loaded ledger. Wheel gestures zoom the time domain. A right-button click clears the selected interval, while a right-button drag pans an already zoomed viewport without changing it. The initial view and streaming updates stay at the tail; scrolling upward suspends following so new records do not interrupt inspection of earlier rows. Content-only stream frames preserve virtual row keys and heights, reuse measurements, and do not issue repeated tail-scroll writes. Completed replies retain assembled blocks, timing, and usage in Trajectory target State, while the shared Session window keeps the raw Events. Trajectory asks the conversation shell to float the composer over the full-height ledger, while its responsive vertical scrollers reserve the composer's live height so final rows remain reachable. Trajectory-owned Definitions assemble business records, including cancellation-frozen Assistant and Tool records, from the shared Session window, so Trajectory neither reads nor changes the Chat conversation snapshot. The package provides no service and declares no Context merge; it registers target-specific Event Definitions, a Trajectory view builder, and one tab in the conversation's `'conversation.view'` slot ring. Contract: api-contracts v3 §8. +Trajectory renders a turn-aware event ledger with selectable User, Assistant, Tool, and nested Subtool records. Thick rules mark Turn boundaries, compact inline markers identify Steps, and the main ledger keeps only index, event, and content; selection opens a local inspector for token usage, duration, Input, Output, and Timing. Scrollable Summary regions keep their scrollbar thumbs transparent until the region is hovered or contains keyboard focus, without changing the reserved scroll geometry. A standalone compaction request appears chronologically in its own `Between turns` section, while a numbered compaction remains inside its owning turn. Long ledgers open at the current tail, load one older page when the user reaches the loaded range's top, and mount only the visible row window plus a small overscan; request-only separators share the next measurable virtual item, while semantic row keys and ARIA indexes survive prepends. Selection, timeline navigation, folding, search, and Request totals cover the currently loaded window. The ledger covers records with an explicit loading row until the initial tail is positioned. While an older prefix remains unloaded, a first-row control precedes the loaded records, loads one earlier page on click, and changes in place to a disabled loading status while that page is pending. A fixed Overview above the ledger projects real record start/duration timing from left to right; when earlier records remain unloaded and the viewport includes the loaded domain's start, a neutral ellipsis control identifies the omitted prefix and loads one earlier page without assigning unknown history fabricated duration. Assistant spans divide recorded TTFT from decoding, and a 500 ms hover reveals exact clock and duration details. Dragging an interval focuses the ledger on every record active at any point in that inclusive range, while clearing the selection restores the full loaded ledger. Wheel gestures zoom the time domain. A right-button click clears the selected interval, while a right-button drag pans an already zoomed viewport without changing it. The initial view and streaming updates stay at the tail; scrolling upward suspends following so new records do not interrupt inspection of earlier rows. Content-only stream frames preserve virtual row keys and heights, reuse measurements, and do not issue repeated tail-scroll writes. Completed replies retain assembled blocks, timing, and usage in Trajectory target State, while the shared Session window keeps the raw Events. Trajectory asks the conversation shell to float the composer over the full-height ledger, while its responsive vertical scrollers reserve the composer's live height so final rows remain reachable. Trajectory-owned Definitions assemble business records, including cancellation-frozen Assistant and Tool records, from the shared Session window, so Trajectory neither reads nor changes the Chat conversation snapshot. The package provides no service and declares no Context merge; it registers target-specific Event Definitions, a Trajectory view builder, and one tab in the conversation's `'conversation.view'` slot ring. Contract: api-contracts v3 §8. ## Model Experience diff --git a/packages/client/ui-trajectory/README.zh.md b/packages/client/ui-trajectory/README.zh.md index b3bc88d8ab..df7661ef7d 100644 --- a/packages/client/ui-trajectory/README.zh.md +++ b/packages/client/ui-trajectory/README.zh.md @@ -2,7 +2,7 @@ [English](README.md) | 中文 -Trajectory 渲染按轮次组织的事件记录表,其中å�¯é€‰æ‹©ç”¨æˆ·ã€�助手ã€�工具和嵌套å­�工具记录。较粗的分割线标示轮次边界,紧凑的行内标记标识步骤,主记录表仅ä¿�留索引ã€�事件和内容;选择记录则会打开局部检查器,查看 token 用é‡�ã€�耗时ã€�输入ã€�输出和计时。å�¯æ»šåŠ¨çš„æ¦‚è¿°åŒºåŸŸé»˜è®¤ä¿�æŒ�滚动æ�¡æ»‘å�—é€�明,直到鼠标悬å�œè¯¥åŒºåŸŸæˆ–其中包å�«é”®ç›˜ç„¦ç‚¹æ—¶æ‰�显示,å�Œæ—¶ä¸�改å�˜æ»šåЍæ�¡é¢„留的几何空间。独立è¿�行的压缩(compaction)请求会按时间顺åº�显示在自己的 `Between turns` 区段中,而带编å�·çš„压缩ä»�ä½�于其所属轮次内。长记录表打开时定ä½�于当å‰�尾部,用户到达已加载范围顶部时加载一页更早的历å�²ï¼Œå¹¶ä¸”å�ªæŒ‚è½½å�¯è§�行窗å�£å’Œå°‘é‡�é¢�外缓冲行;仅å�«è¯·æ±‚的分隔行并入下一个具备å�¯æµ‹é«˜åº¦çš„虚拟项,语义行键和 ARIA 索引在å�‘å‰�补页å�Žä¿�æŒ�ä¸�å�˜ã€‚选择ã€�时间线导航ã€�折å� ã€�æ�œç´¢å’Œè¯·æ±‚汇总å�ªè¦†ç›–当å‰�已加载的窗å�£ã€‚åˆ�始尾部完æˆ�定ä½�å‰�以å�Šæ›´æ—©é¡µé�¢çš„加载尚未完æˆ�时,记录表会用明确的加载行é�®ä½�真实记录。固定在记录表上方的 Overview 区域从左到å�³æŠ•影记录的真实开始时间与耗时;ä»�有更早记录未加载且 viewport 包å�«å·²åŠ è½½æ—¶é—´åŸŸèµ·ç‚¹æ—¶ï¼Œä¸­æ€§çš„çœ�ç•¥å�·æŽ§ä»¶ä¼šæ ‡è¯†è¢«çœ�略的å‰�缀,并å�¯åŠ è½½ä¸€é¡µæ›´æ—©åŽ†å�²ï¼Œè€Œä¸�会为未知部分虚构耗时。助手时间æ�¡ä¼šåŒºåˆ†è®°å½•到的 TTFT 与解ç �时间,悬å�œ 500 ms å�Žå�¯æŸ¥çœ‹ç²¾ç¡®æ—¶åˆ»å’Œè€—时详情。拖选一个区间会将记录表è�šç„¦åˆ°æ´»åŠ¨åŒºé—´ä¸Žè¯¥é—­åŒºé—´æœ‰é‡�å� çš„æ‰€æœ‰è®°å½•,清除选择则æ�¢å¤�完整的已加载记录表。滚轮手势用于缩放时间域。å�³é”®å�•击会清除所选区间;在已放大的 viewport 上按ä½�å�³é”®æ‹–动则å�ªä¼šå¹³ç§»è§†å›¾ï¼Œä¸�会改å�˜è¯¥åŒºé—´ã€‚åˆ�始视图和æµ�å¼�更新都会å�œç•™åœ¨å°¾éƒ¨ï¼›å�‘上滚动会暂å�œè·Ÿéš�,因此新记录ä¸�会打断对旧记录的检查。仅å�«å†…容更新的æµ�å¼�帧会ä¿�æŒ�虚拟行的键和高度ä¸�å�˜ã€�å¤�用测é‡�结果,并且ä¸�会é‡�å¤�写入末尾滚动ä½�置。已完æˆ�的回å¤�会在 Trajectory target State 中ä¿�留组装å�Žçš„ blocksã€�计时与用é‡�,共享 Session 窗å�£åˆ™ä¿�留原始 Event。Trajectory è¦�求会è¯�壳将 composer 作为浮层置于全高记录表上方;其å“�应å¼�纵å�‘滚动容器会预留 composer 的实时高度,确ä¿�ä»�å�¯æ»šåŠ¨åˆ°æœ€å�Žå‡ è¡Œã€‚Trajectory 自有的 Definition 从共享 Session 窗å�£ç»„装业务记录,其中包括因å�–消而冻结的助手和工具记录,因此 Trajectory æ—¢ä¸�读å�–也ä¸�改å�˜ Chat 会è¯�快照。该包ä¸�æ��ä¾› service,也ä¸�声明 Context å�ˆå¹¶ï¼›å®ƒä¼šæ³¨å†Œ target 专属 Event Definitionã€�Trajectory view builder,以å�Šä¼šè¯� `'conversation.view'` slot 环中的一个视图标签页。约定:api-contracts v3 §8。 +Trajectory 渲染按轮次组织的事件记录表,其中å�¯é€‰æ‹©ç”¨æˆ·ã€�助手ã€�工具和嵌套å­�工具记录。较粗的分割线标示轮次边界,紧凑的行内标记标识步骤,主记录表仅ä¿�留索引ã€�事件和内容;选择记录则会打开局部检查器,查看 token 用é‡�ã€�耗时ã€�输入ã€�输出和计时。å�¯æ»šåŠ¨çš„æ¦‚è¿°åŒºåŸŸé»˜è®¤ä¿�æŒ�滚动æ�¡æ»‘å�—é€�明,直到鼠标悬å�œè¯¥åŒºåŸŸæˆ–其中包å�«é”®ç›˜ç„¦ç‚¹æ—¶æ‰�显示,å�Œæ—¶ä¸�改å�˜æ»šåЍæ�¡é¢„留的几何空间。独立è¿�行的压缩(compaction)请求会按时间顺åº�显示在自己的 `Between turns` 区段中,而带编å�·çš„压缩ä»�ä½�于其所属轮次内。长记录表打开时定ä½�于当å‰�尾部,用户到达已加载范围顶部时加载一页更早的历å�²ï¼Œå¹¶ä¸”å�ªæŒ‚è½½å�¯è§�行窗å�£å’Œå°‘é‡�é¢�外缓冲行;仅å�«è¯·æ±‚的分隔行并入下一个具备å�¯æµ‹é«˜åº¦çš„虚拟项,语义行键和 ARIA 索引在å�‘å‰�补页å�Žä¿�æŒ�ä¸�å�˜ã€‚选择ã€�时间线导航ã€�折å� ã€�æ�œç´¢å’Œè¯·æ±‚汇总å�ªè¦†ç›–当å‰�已加载的窗å�£ã€‚åˆ�始尾部完æˆ�定ä½�å‰�,记录表会用明确的加载行é�®ä½�真实记录。更早的å‰�ç¼€ä»�未加载时,已加载记录å‰�会始终ä¿�留首行控件;å�•击它会加载一页更早的历å�²ï¼Œé¡µé�¢åŠ è½½æœŸé—´åˆ™ä¼šåŽŸåœ°å�˜ä¸ºç¦�用的加载状æ€�。固定在记录表上方的 Overview 区域从左到å�³æŠ•影记录的真实开始时间与耗时;ä»�有更早记录未加载且 viewport 包å�«å·²åŠ è½½æ—¶é—´åŸŸèµ·ç‚¹æ—¶ï¼Œä¸­æ€§çš„çœ�ç•¥å�·æŽ§ä»¶ä¼šæ ‡è¯†è¢«çœ�略的å‰�缀,并å�¯åŠ è½½ä¸€é¡µæ›´æ—©åŽ†å�²ï¼Œè€Œä¸�会为未知部分虚构耗时。助手时间æ�¡ä¼šåŒºåˆ†è®°å½•到的 TTFT 与解ç �时间,悬å�œ 500 ms å�Žå�¯æŸ¥çœ‹ç²¾ç¡®æ—¶åˆ»å’Œè€—时详情。拖选一个区间会将记录表è�šç„¦åˆ°æ´»åŠ¨åŒºé—´ä¸Žè¯¥é—­åŒºé—´æœ‰é‡�å� çš„æ‰€æœ‰è®°å½•,清除选择则æ�¢å¤�完整的已加载记录表。滚轮手势用于缩放时间域。å�³é”®å�•击会清除所选区间;在已放大的 viewport 上按ä½�å�³é”®æ‹–动则å�ªä¼šå¹³ç§»è§†å›¾ï¼Œä¸�会改å�˜è¯¥åŒºé—´ã€‚åˆ�始视图和æµ�å¼�更新都会å�œç•™åœ¨å°¾éƒ¨ï¼›å�‘上滚动会暂å�œè·Ÿéš�,因此新记录ä¸�会打断对旧记录的检查。仅å�«å†…容更新的æµ�å¼�帧会ä¿�æŒ�虚拟行的键和高度ä¸�å�˜ã€�å¤�用测é‡�结果,并且ä¸�会é‡�å¤�写入末尾滚动ä½�置。已完æˆ�的回å¤�会在 Trajectory target State 中ä¿�留组装å�Žçš„ blocksã€�计时与用é‡�,共享 Session 窗å�£åˆ™ä¿�留原始 Event。Trajectory è¦�求会è¯�壳将 composer 作为浮层置于全高记录表上方;其å“�应å¼�纵å�‘滚动容器会预留 composer 的实时高度,确ä¿�ä»�å�¯æ»šåŠ¨åˆ°æœ€å�Žå‡ è¡Œã€‚Trajectory 自有的 Definition 从共享 Session 窗å�£ç»„装业务记录,其中包括因å�–消而冻结的助手和工具记录,因此 Trajectory æ—¢ä¸�读å�–也ä¸�改å�˜ Chat 会è¯�快照。该包ä¸�æ��ä¾› service,也ä¸�声明 Context å�ˆå¹¶ï¼›å®ƒä¼šæ³¨å†Œ target 专属 Event Definitionã€�Trajectory view builder,以å�Šä¼šè¯� `'conversation.view'` slot 环中的一个视图标签页。约定:api-contracts v3 §8。 ## 模型体验 diff --git a/packages/client/ui-trajectory/package.json b/packages/client/ui-trajectory/package.json index 0c3da436e6..375053ba7c 100644 --- a/packages/client/ui-trajectory/package.json +++ b/packages/client/ui-trajectory/package.json @@ -1,9 +1,9 @@ { "name": "@deepseek-ai/dsh-client-ui-trajectory", "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)", - "version": "0.0.1-rc.5", + "version": "0.1.0-rc.6", "publishConfig": { - "access": "restricted" + "access": "public" }, "repository": { "type": "git", @@ -43,7 +43,7 @@ "bundle": "tsdown", "watch": "tsdown --watch" }, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { "@tanstack/react-virtual": "^3.14.9", "diff": "^9.0.0" diff --git a/packages/client/ui-trajectory/src/client/TrajectoryTable.module.css b/packages/client/ui-trajectory/src/client/TrajectoryTable.module.css index b1d9be9930..71d0b3031b 100644 --- a/packages/client/ui-trajectory/src/client/TrajectoryTable.module.css +++ b/packages/client/ui-trajectory/src/client/TrajectoryTable.module.css @@ -55,6 +55,53 @@ animation: history-loading-spin 700ms linear infinite; } +.table tbody .historyLoadRow td { + height: 30px; + padding: 0; +} + +/* The pagination control does not create a trajectory turn boundary. */ +.table tbody .historyLoadRow + tr[data-turn-start='true'] td::before { + content: none; +} + +.historyLoadButton { + display: flex; + width: 100%; + height: 29px; + align-items: center; + justify-content: center; + gap: 6px; + border: 0; + background: var(--dsw-alias-bg-layer-1); + color: var(--dsw-alias-label-secondary); + cursor: pointer; + font: var(--dsw-font-xxs-12); +} + +.historyLoadButton:hover:not(:disabled) { + background: var(--dsw-alias-interactive-bg-hover); + color: var(--dsw-alias-label-primary); +} + +.historyLoadButton:focus-visible { + outline: 2px solid var(--dsw-alias-state-business-primary); + outline-offset: -2px; +} + +.historyLoadButton:disabled { + cursor: default; +} + +.visuallyHidden { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0 0 0 0); + white-space: nowrap; +} + .table:not([data-scroll-ready='true']) { visibility: hidden; } @@ -137,7 +184,7 @@ border: 0; } -.table tbody tr:not([data-collapsed-summary]):not([data-virtual-spacer]) { +.table tbody tr:not([data-collapsed-summary]):not([data-virtual-spacer]):not([data-history-load]) { cursor: default; outline: none; transition: @@ -149,7 +196,7 @@ opacity: 0.24; } -.table tbody tr:not([data-collapsed-summary]):not([data-virtual-spacer]):not([data-selected='true']):hover { +.table tbody tr:not([data-collapsed-summary]):not([data-virtual-spacer]):not([data-history-load]):not([data-selected='true']):hover { background: var(--dsw-alias-interactive-bg-hover); } diff --git a/packages/client/ui-trajectory/src/client/TrajectoryTable.tsx b/packages/client/ui-trajectory/src/client/TrajectoryTable.tsx index 5d2d4d8e31..dab72e6778 100644 --- a/packages/client/ui-trajectory/src/client/TrajectoryTable.tsx +++ b/packages/client/ui-trajectory/src/client/TrajectoryTable.tsx @@ -30,6 +30,7 @@ import css from './TrajectoryTable.module.css' const BOTTOM_FOLLOW_THRESHOLD_PX = 2 const OLDER_LOAD_THRESHOLD_PX = 48 +const HISTORY_LOAD_ROW_HEIGHT_PX = 30 const VIRTUALIZATION_THRESHOLD = 100 const VIRTUAL_OVERSCAN_ROWS = 12 const VIRTUAL_INITIAL_VIEWPORT_HEIGHT_PX = 600 @@ -364,6 +365,8 @@ export interface TrajectoryTableProps { recordFocus?: { readonly index: number } | null /** Whether the initial history tail is still loading. */ historyLoading?: boolean + /** Whether one older history page request is pending anywhere. */ + olderHistoryLoading?: boolean /** First loaded raw event, used to preserve scroll position after prepending a page. */ historyStartSeq?: number | undefined /** Whether one older history page can be requested. */ @@ -1698,6 +1701,7 @@ export function TrajectoryTable({ recordSelection = null, recordFocus = null, historyLoading = false, + olderHistoryLoading = false, historyStartSeq, hasOlderRecords = false, onLoadOlder, @@ -1769,6 +1773,7 @@ export function TrajectoryTable({ const virtualRowStructure = useStableVirtualRowStructure(projectedVirtualRows) const virtualizationEnabled = hasOlderRecords || records.length > VIRTUALIZATION_THRESHOLD + const virtualScrollMargin = hasOlderRecords ? HISTORY_LOAD_ROW_HEIGHT_PX : 0 const estimateVirtualRowSize = useCallback( (index: number) => virtualRowStructure[index]?.height ?? 30, [virtualRowStructure], @@ -1787,6 +1792,7 @@ export function TrajectoryTable({ initialRect: { width: 0, height: VIRTUAL_INITIAL_VIEWPORT_HEIGHT_PX }, anchorTo: 'end', overscan: VIRTUAL_OVERSCAN_ROWS, + scrollMargin: virtualScrollMargin, scrollEndThreshold: BOTTOM_FOLLOW_THRESHOLD_PX, }) const virtualIndexByRecordId = useMemo(() => { @@ -1801,10 +1807,15 @@ export function TrajectoryTable({ return indexes }, [projectedVirtualRows]) const virtualItems = virtualizationEnabled ? rowVirtualizer.getVirtualItems() : [] - const virtualTop = virtualItems[0]?.start ?? 0 + const virtualTop = Math.max(0, (virtualItems[0]?.start ?? 0) - virtualScrollMargin) const virtualBottom = virtualItems.length === 0 ? 0 - : Math.max(0, rowVirtualizer.getTotalSize() - (virtualItems.at(-1)?.end ?? 0)) + : Math.max( + 0, + rowVirtualizer.getTotalSize() + + virtualScrollMargin + - (virtualItems.at(-1)?.end ?? 0), + ) const renderedRecords = virtualizationEnabled ? virtualItems.flatMap((item) => { const row = projectedVirtualRows[item.index] @@ -2123,12 +2134,13 @@ export function TrajectoryTable({ virtualIndexByRecordId, virtualizationEnabled, ]) - const requestOlder = useCallback((pane: HTMLDivElement) => { + const requestOlder = useCallback((pane: HTMLDivElement, requireTop: boolean) => { if ( !hasOlderRecords || onLoadOlder === undefined || loadingOlder.current - || pane.scrollTop > OLDER_LOAD_THRESHOLD_PX + || olderHistoryLoading + || (requireTop && pane.scrollTop > OLDER_LOAD_THRESHOLD_PX) ) return loadingOlder.current = true setOlderLoading(true) @@ -2143,7 +2155,7 @@ export function TrajectoryTable({ loadingOlder.current = false setOlderLoading(false) }) - }, [hasOlderRecords, historyStartSeq, onLoadOlder]) + }, [hasOlderRecords, historyStartSeq, olderHistoryLoading, onLoadOlder]) useLayoutEffect(() => { const pane = tablePaneRef.current if (pane === null) return @@ -2176,10 +2188,9 @@ export function TrajectoryTable({ virtualizationEnabled, ]) - const loadingLabel = olderLoading - ? 'Loading earlier history…' - : 'Loading trajectory…' - const showLoading = historyLoading || olderLoading || !tableScrollReady + const olderBusy = olderHistoryLoading || olderLoading + const showInitialLoading = historyLoading || !tableScrollReady + const historyRowOffset = hasOlderRecords ? 1 : 0 return (
    @@ -2192,30 +2203,62 @@ export function TrajectoryTable({ followsTableTail.current = pane.scrollHeight - pane.clientHeight - pane.scrollTop <= BOTTOM_FOLLOW_THRESHOLD_PX - requestOlder(pane) + requestOlder(pane, true) }} onClick={(event) => { if (event.target === event.currentTarget) clearAllSelections() }} > - {showLoading && ( + {showInitialLoading && (
    )} + {hasOlderRecords && ( + + + + )} {virtualTop > 0 && (
    + +