Remove the task Project tab; ⌘P selects the project

This commit is contained in:
Ian Gulliver
2026-10-21 20:53:54 -07:00
parent f0213e2aed
commit e6da67087e
10 changed files with 230 additions and 281 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ A server and macOS app for running many coding agents (Claude Code, Codex and An
- **Merge.** One click: the agent merges the default branch in and resolves conflicts, then byre squashes, pushes and closes the task, with co-author trailers and a git note recording the task. Merge after review, and one merge per project at a time with a queue.
- **Subtasks and teams.** Agents can spawn subtasks on their own branches and merge them back, or several agents can share one worktree and talk through a board.
- **Workflows.** Named sequences of stages that run in order or in parallel, with each stage running as its own task.
- **TODO.md.** A project's `TODO.md` items show in the Project tab; start or discuss one in a click.
- **TODO.md.** A project's `TODO.md` items show on the project's dashboard (⌘P); start or discuss one in a click.
- **Changes, Files and Terminal.** Per-task diff view with line comments sent to the agent, a read-only file browser, and shells in the worktree, including ones that start by running a saved command.
- **Previews.** Agents expose dev servers, and the app opens each at a local `*.localhost` address forwarded over the tailnet.
- **Screen and app control.** Agents can see and drive the Mac byre runs on (screen capture, accessibility, Orion, Chrome DevTools) and the Macs you have the app open on (shell, files, the same screen tools).
+1 -1
View File
@@ -1544,7 +1544,7 @@ components:
workflow: { type: string, description: "For a workflow run's task: the name of the workflow it froze at creation (getTaskWorkflow has its copy). A run's task has no agent, worktree or branch (branch, worktree_path and base_ref are empty); its stage tasks are its subtasks, and it closes once they all have, as merged when any of them merged. Absent for other tasks." }
workflow_stage: { type: string, description: "For a stage task of a workflow run: the name of the stage it runs; parent_task_id is the run's task. Absent for other tasks." }
audit: { type: string, description: "The default branch commit an audit audits, on the task of a run of its project's audit workflow; absent for other tasks." }
background: { type: boolean, description: "Whether the task is an audit's run or stage task that hasn't asked for attention yet: no question, ready_for_merge or error so far (for a run, from any of its stage tasks). The app keeps it out of the task switcher and shows it muted on the Project tab, and the lead gets no signals about it." }
background: { type: boolean, description: "Whether the task is an audit's run or stage task that hasn't asked for attention yet: no question, ready_for_merge or error so far (for a run, from any of its stage tasks). The app keeps it out of the task switcher and shows it muted on the project's dashboard, and the lead gets no signals about it." }
state:
type: string
description: "The one state the task is in, kept by the store in the same transaction as every change to it (a task.state event carries each change). The first that holds: merged or discarded once closed; for a workflow run's task, finished once the run finished, running while one of its stage tasks is running, else idle; discarding; asking while it has an open question; pushing once a Merge's turn has ended and byre is pushing its squash commit to the remote (a task.pushing event names the commit); merging while a Merge or a merge into its parent is otherwise under way; merge_held while its Merge waits for another merge in the project; merge_after_review while a Merge with after_review waits for its review; running while one of its agents is mid-turn or has subagents running; reviewing while a review runs; review_pending between a turn's end and its snapshot's review starting or being skipped; ready_to_merge or discard_suggested when the agent's latest ready_for_merge or suggest_discard still stands; finished when it runs a workflow stage whose finish_stage has taken; idle; no_agent when it has no live agent."
+2 -2
View File
@@ -33,8 +33,8 @@ const leadGuidance = `You are the human's lead agent in byre, shown in the left
- You can create tasks, start TODO items, message, interrupt and compact task agents, and merge or discard tasks. Merge pushes to the default branch and Discard destroys work: do either only when the human asks for it.
- Projects: when the human asks you to add a project, create it with create_project from its name and the path of its git repository on this machine.
- Workflows: you manage the server's workflows with list_workflows, read_workflow, save_workflow and delete_workflow, and run one by giving its name to create_task or start_todo. A workflow is a tree of steps run in order, each a stage, an order or a parallel; every stage runs as its own task on the stage's model once the step before it has finished, so stages fan out (a parallel after a stage) and fan in (a stage after a parallel); a stage's agent calls finish_stage to hand its output to the stages after it, signals tell you when a stage starts and when the workflow finishes, and the workflow finishes once every stage has; byre then discards the run's other stage tasks, leaving the task of each last stage (one per branch when it ends in a parallel) to merge. Each last stage's agent is asked whether its task is ready to merge as soon as its own stage has finished and been reviewed, without waiting for the other last stages. Whenever you show or propose a workflow, draw it as a fenced diagram block (its format is the diagrams knowledge-base article) of its stage names only, with no models: one row per step, a parallel's stages side by side in one row, and an arrow into each stage from the stages before it. For example, rows holding Build; Review and Test; Fix, with the arrows "build -> review", "build -> test", "review -> fix" and "test -> fix".
- Schedules: when the human asks for work to run on a timer (every Monday, nightly), you manage it with list_schedules, save_schedule and delete_schedule; the human sees and edits the same schedules in the Project tab. On each run, byre creates a task from a schedule's prompt or workflow as create_task would, created by byre, and you get its created signal; a run that fails to start reaches you as a signal.
- Whenever you name a task in a message, link it as a Markdown link to #/task/<task_id>, for example [Fix login redirect](#/task/tskDa7e4K7305e). byre draws it in that task's color, and clicking it shows the task in the right pane. To also open one of its other views over the human's left pane, append it: #/task/<task_id>/<view>, where view is changes, files, terminal, board or project.
- Schedules: when the human asks for work to run on a timer (every Monday, nightly), you manage it with list_schedules, save_schedule and delete_schedule; the human sees and edits the same schedules on the project's dashboard. On each run, byre creates a task from a schedule's prompt or workflow as create_task would, created by byre, and you get its created signal; a run that fails to start reaches you as a signal.
- Whenever you name a task in a message, link it as a Markdown link to #/task/<task_id>, for example [Fix login redirect](#/task/tskDa7e4K7305e). byre draws it in that task's color, and clicking it shows the task in the right pane. To also open one of its other views over the human's left pane, append it: #/task/<task_id>/<view>, where view is changes, files, terminal or board. To show a project's dashboard in the right pane, link to #/project/<project_id>.
- Keep messages short; the human reads them in half the screen. Put long detail in collapsed sections: a line <details><summary>Title</summary>, the Markdown content, then a line </details>.
- You are long-running. Your context window is large. byre sends you a signal once your context passes a quarter of its window; then call compact_self at a logical point (a piece of work wrapped up, a topic closed), and not before; when the turn ends, byre replaces you with a fresh session that starts from your handoff.
- Don't commit, push, or touch git branches yourself.`
+1 -1
View File
@@ -203,7 +203,7 @@ func (m *Manager) scheduleTools(l *live, tool func(name, description, schema str
"every hour runs at minute past each hour (hour 0); day at hour:minute; week at hour:minute on each of weekdays; month at hour:minute on day_of_month, or the month's last day when shorter. "+
"weekdays only for week, day_of_month only for month. Each run's agent sees nothing else, so the prompt must be a complete brief. "+
"With workflow, each run starts that workflow, prompt is optional and is its brief, and model can't be given; the workflow is looked up by name at each run. "+
"A run missed while byre was down happens once when it starts. The human sees and edits schedules in the Project tab. Only when the human asks.",
"A run missed while byre was down happens once when it starts. The human sees and edits schedules on the project's dashboard. Only when the human asks.",
`{"type": "object", "properties": {
"project_id": {"type": "string"},
"schedule_id": {"type": "string"},
+199 -199
View File
@@ -1483,7 +1483,7 @@ type Task struct {
// Audit The default branch commit an audit audits, on the task of a run of its project's audit workflow; absent for other tasks.
Audit *string `json:"audit,omitempty"`
// Background Whether the task is an audit's run or stage task that hasn't asked for attention yet: no question, ready_for_merge or error so far (for a run, from any of its stage tasks). The app keeps it out of the task switcher and shows it muted on the Project tab, and the lead gets no signals about it.
// Background Whether the task is an audit's run or stage task that hasn't asked for attention yet: no question, ready_for_merge or error so far (for a run, from any of its stage tasks). The app keeps it out of the task switcher and shows it muted on the project's dashboard, and the lead gets no signals about it.
Background bool `json:"background"`
BaseRef string `json:"base_ref"`
Branch string `json:"branch"`
@@ -4914,204 +4914,204 @@ var swaggerSpec = []string{
"2EclaruR2tyFtX/DnYFpUS5vFNUfDOpc/GSRC6zETwDDHwGA/PulXK61UU/bsK7EJcUTwg8uAmSdeD26",
"7aY5LmQA005n8E8QK+OMvykhTD1VBmOQ+oKFdFBvwTf0r696welYaxlLdl9TwZ7k7UjfRENFTzrN5Iji",
"PnRhAftDxqOCLc7whKuHuyxfJLNgJF51OkgZgjLQpdipcA7ktEtRhPF9i2vrFqR9s05QnKm3mADlEXZA",
"gTgcrrGL6+8G9o8pLQqwgV1SlC6BKU6OI5odEnvKVamD2LShszG8itlq5FVWs1DJWqxUoItAr4xsfMoq",
"W9YwXEmvFlyxeQzx6fgF0lzsL09C6lTpWSIl72CWmI6vlLG0Tclt6gU7ILIo+ucX0e1gKxsVAtb948Jy",
"ki32mK1JCuwQIDQKwiF3AWs4qhr3BfgC9NNc2fK9/hDxIw+jY+IaFXwhIYejvbiVGolPVBDlHFAV/0LX",
"ihogMxhBXClo7BTEI9V7tVhySgWYablID5jScHTZPXqKLTmRH+UO6jJYyj5V2SFiNOUXNAoJ37eDnK0Y",
"YJB/sm9XugQoxTQllpUt+4Ldp9Sx+Da6aP7aSp9ofTHialjeyBFAYxqiYOnYF6GXpUM6xJtmOarSh5Rt",
"YZr4MFwxTISV6jFGOg+hYxNcSmXMlEqbVUIFa5Yqy3qCx8xTrCqX/IHNWqvmDgSN1nCM09F4J2hlG3mj",
"fFZQjz7oeJwYPhB8WjC7Gwca10/uygGa00E2pzh8j3b6SR18oi85BYl8siA+Gb6NahpaJzbctviDtfYU",
"AxnXOo3YIDDAdbAgM/W+VWy6pGYaHbkZHTgSiToY4E+ke/ySl8w3mw7TOnz6YHE4AzbJC7R30XEu0aqo",
"K6e5IjDZB6vjaaBB8uDqHPHuRNcOJjMGJghXXV4JvuqQkDzKKRxgxEBRkhfpc+JyDpi+bVRQmGKuczVI",
"2KB8QoYKC85q08bGmmpHE2PVSx4wF09jrS6gA8aOpoPz9HPxIqRURmjIJPIsuvQXlSinLKmyNgtQVqP7",
"T7Jkxy3FHAdX9l16gNJibgqNEKCCXbi+oz3aZb3DM/qs6yN/GHvbL9ZYilYKqnfTgxRzo7YBNFMhZfaL",
"rrYo2TlpPBVhg22liFECJrlTYPo+ABL1jisv5bhjJplsVJ229LzESRKNJi7nIvpWjU9B1RkTE1EHsSA+",
"rTq9C2IIGr5H3HuPoKnGK1QqX4iOY7sAcaLrRgcSNg1iYRInLhKRw8kwYT1hqglfjClk/EKHSC2TwZTN",
"MRgbm2Ac2xOUEUcyK+vji3jZxasx5nrsKOSQImrfaQA4f9+t3FFHagG3YFq1T1cFu1Kkmyh2nd+9sYse",
"F9Sf1phL6rqG/+nhxfQuknYpN79RjkIkqvySP77IQu7iLHhQ10JOW/pjseXSulcq3CplBOWmJH8Y3Drc",
"qi7aZZCeEsYn9pkDPy6YKAXbyZgjMtPZ2CKFTZnQRgIqf7TgTrjkJlG6i+5ARNctWJwY1Vege2lolySj",
"5AXjv7ELdiDhrlgbibrL5B98jOmvD9r0gH5HDqWaMXIPLWBFw2GcHDmRZA0RZWdFrr2a9bei67LbiSOJ",
"MihcBjbI9IgNkOnvzPrYfYYzepUAMngxePgygSg9epVglR59lwOt962qC+36D3+yTxmc6dHTCNd+Xz8Q",
"fPsPnwKcX0cwZ6uR9e6NfcnQHk7hsoN6uR4UCvNlFLjbPrX+aeyrezQCTes72OCMSKxeHKUq7nksjhXH",
"o9RXKZ1kOllGHaVHngxueD5Qi/Zc4uiu0GEoNVR9FzrkkCMXkxmiyi7VtrYLXSyXMpJ53vz83c/zTY21",
"P/qj5d4ld+Jrp+Mevp/iGFgXITdpXqkRZWT5p8pVS+LRSgXAjpi7ITm4LO129xiS13Z9R/oYk45H30Hr",
"WLoWj+j/7t0iRYJGnR0Vl4ONfHwxYlSkU7nEwJYjHSIPHZkg9EuH1MioMYsMFu4zKzDDWm2SU8nTu4N8",
"MRGA+v1QfkGtcb4R4x2g1nxVXYi+bBU9kzsw33m+CdD3qmnCvhm5gJ+UqMP+M9Vr1HFmmZOms5tEvX93",
"FY4uwKEkPHHB5RSrp13v62embAjPuvStgyJ30k/IFVGd5Mj5GuQcGWMyzjs1yyn00FOI85mQE/6ymGIi",
"KRi2sELb9jgvGG8ivUBzh1owWZ3FUs0Bp0oLdyotplfx45oEJFKXoe8yYnedFnJ4/gOURMjzPOLSJrfv",
"voEcwE5zlAbWwOicrXvBeJyrDgl2ppRq9E2KhKit8nPxkw3jeMWPTjf7JuOPsQmRNB7ZumNSqE5HE12S",
"HnB0cXLBB+2jvmYQn5gLy6xamgDAnYIUaQrYYi5+4YtYd7nMot4SrvuQcut1LolT9/1c9MKmugn+1ZSm",
"uD+2MJJxOUhTBNgDgrg2PihZQxO6UjnfSeeUH+/L8yS8o61LptsDVmRvDedQqLv6G/g3rRq1DDHLgQwR",
"NDqIK7W0BIdMz8Y9/XVGidzwT/ypzgU9wr7o0V9n1WBMIfMriUJQxZu8rM/4zioB98PEKX7DkfGFc7w/",
"HH6AzxBVn+hO78LFvYoeR7oXR4NrnTKZ39lT527FxEYZ67Ihp0jeL8fFvjI+EYOXRzXxPVzR4cZHYa0K",
"tftqBQJt4IyYe4P5eNDvui+OzlnAC88GKy5cyc1LtblSbk89/wO0Mwb/y8ZbLMxDh2SUvOmYjJyxY2iR",
"gqCUZF9xzABhrwUmI/jmyRPQBzq5DMr5SrRG/9qSJij78E6E+w3SZp6CvSWq41pUWXqyWzjbKLG///JG",
"xBDkPXF78bhCEfrxdsQ0F8fzIz0ScMh9q+t+39QuOQXaMISDZrU/4NjZ24OtRkm1Gj/jL/dOC473ZLaN",
"omHl6YB4MUWDcCK4W7hwS7p9yhHFRcJrazueinqnfThQzWDgSkNuSFHalYHxz05YkhJKHIcbtrZYnvQQ",
"XvDEY/9/m1hxLHU6YPYt5QqXXozrg0KHJ5QrygQSkpOjwGSGP/7ounUINqAIvnjHkC/0BEsEEWy84UZJ",
"p3wQayVrLrP8VqX5FczY42odR7FhceLI8sG0O+9c2FesZoounlyBLEKHkzsfpjNJorSYaDwCYGrDJo4M",
"iIutL7n6qiY3H2dxlRJrGFDIVOt9mj2cmuVaJldYaVia0R4j/CbweDo2+1ijOA4eLDEixwKuCCd2Ry54",
"fO6NoD4u0dP+WfVC8jp+hj8vzZZ8yUdzdeof6N5foj27nj+4pxwKKHBixZqYMVpG13K5RaODQuNhLZZO",
"1Tr4pGpLRi30LQKdFueAlxHJ0TcQ+ITOKTrOr3ig+sXPJjzJqGSSJymZQwOOd7igKfqyD9lWIXUSG0VM",
"Bt/8VIcKUGxNyfE2R3tT4y79gmMepL3Z6rt5Tm49J56aiMnD1FjptkPhhosWkNCTog3KYQaRELZe+f2R",
"BL6QcdIEvXLyrQ67CXdB2dblGKOlrdW7w6eFe4jtq96QkxDjbRgdmUZelTjfy7V1JA4nxyvEi3J6fb2Z",
"cpmlnTzh89BDVNteIRHXBvjZMCgteCUxrrw1Id2QPC4dAc5SqILff2Bw1oJaHn9QYELjTltfVyLYG2V8",
"FbUW6AO1VW6JFWi9atSSbLEbiZney0e9WFni6QaWK/DlHkBNw4OAPR3d0d8QyuaCA7E/z1IB2FP/h2wq",
"1QxZhRtjbw19MyqogMjF62WoljG0JJTJW7kr7SwQ3uBaVZFDQMyBAGtIdUqikTt5t2mf+FyyCpBLW/le",
"jsm294iF+CpWAIm6E0zRh91P1Gf4hNUzji5yUc1MVtlosY2ljfZR7nEtpI+plVGcwRDKFe33FHr8Ge+H",
"MZLcG2CD9Rxd5CNmHcosrhvMTR1a+PgWMT2sWzhZTs+qmSdrRS/9VjfDgt6jIL9leUk7LUdURlD8ZKZC",
"v2JGG9bDrs5BbX0V5Tu80ucQYUFll1EbV+UKQfJ/8FGPyHrF6C2EvWVRX2AzSz4UF8RF7UnrnI2jfXIo",
"oUKQXRVT1FGiWhOGjOky8DN/kvLpF2p79mD3vmDvXtlTeHgKviansWbxKdYxVG52DqQFNXdqe7yMGbfx",
"Mqjt3Yri0zhFTOM+X7eFejK4Z1M1Fz5K5xY3cr8AXwhrryNCquiu6FpTJrCTRIz2t8SgRrUBz/TEMxof",
"nS2sgyaGgBftVscFoTOd6OyaGm2XGeB7jjy8pgNbfBmKIg2aKifYXOx3nHgCDk2VlQwEBDsRfi23d6yA",
"HnNbTBtbuIKZ43qzPqQsOij8cyIH627IWhYep6DZuwXL9tKqFGa6D59Kvp0cVICBTUjbwGlZ/Jxc+ngx",
"IfnMsYdKloYF50IV7HtNUvqR5BePVcH4w37mB55GF+j5gDkgEIToR/RLGrV71nlkdc/YJat7kPlkdQ+T",
"P1D3KPeV6p72c0Hw0hdTeqssT4pPRq8h+KOv+bEoXT7HOFTmUJBNLTsD+44vUv2xZ1FW799ex8ORsmoR",
"B2kds6p0Vkhl/rgi4gZvt9LJplENqBioi3QpxjOfu4RkNQXj4e9u6nOOlfGhq8EgmR+o2Es5VREaNOsm",
"Urhzp5IZvG45qpb6Qc4gKLk5p4TvsknOqKaXkyeZO7H0GfsKVLHOdWJL2Cbj19JRPfMrK12du0xzZjPC",
"m2wqdyhzndmN7mZ15zUfbT86F6ttOP0NteRQTSOegZRfiZUCW0L31hrxtJP74+axYzFhlhHPUFWAXQws",
"2BjFz3jXyyYaFTz3ZZsQl0p+AmoblxQPN/tB87auqDJaCbHhE8LhO9/2kR8bbltE5oJ7B+K/8rHYVufT",
"jzW3Ds01P3AcJUOn5pPNfE8u6D7G5Ra9C9rduOUws/w1ow++jiuBc0q0JtEPPHUfgx17KjDEow9E+V4m",
"0GmnkWPn92EfiScfsVJhxz3ixt1N2F1npQuH81PsqS45Gv9GU5j4wOV8wVQgpo8gkg6/0htWyxfF1m1P",
"5Z+nJrmvuWAAEJx2Kpw4hsUHzMt2jeZHZtsxCwLaDZznJPTzJ/MnMKzdKiO3enY++938yfx3sFgZ1gg6",
"zDkk6402Z9tUvxPfbK0vnTNU+sWk+hrytXG1516JTchFkkIwYGKnkI/TnwisIZnuAX8Tv6bIEP4aK8bs",
"VBC1WmrMZfYLxniQ1YE+oHB4afIil0QcKs7a+vsngnWBcCYAX7DVixoq6cM0XmULrmbREwcX/9snT8is",
"bALHEEKVT1bhnP2Dy4oR0TpaSu7GK/BmH6pCqSgqRCO2yhFg5vDh7588mRopreGMS1lhv9ked/7yK0oX",
"0gfLn1Tg7FwfCY8D0gyMUFjyJRXaXCvZsIszmijm43Xg89NlZgeZWk/fYPKAy+oP9OHDgVRPvRROc2pf",
"zFd4qcqGm/gtwskpGZVgw2ZyxQlN+qAhjeIYOqhD/iNb8x8KMB2p45vxy+3Km6Fzm8dD9u29DtlVY6/2",
"EM/LYJ1CooVep0j0Wq+o1jU7hxL7Dqb95BIob6k9OfcD3YBXtQpoTe1UHZiHCdFhQ4mDxauf/lSJ/3j1",
"/E+V+NOL74V1kE7u1Vw8DVQ67/fipf4jCQND7IgJ2vciBU7rbKWv+xuSTCdX2kjMKz++7ejTf2zV6r7f",
"bs29P71VV9u7fnsE2n7zydAWIT+FrYBFtQBcuzOqVrNvv/ndfRH77D3896L+sI/eJpzZe6D/zRBnvIkA",
"yRNPR7bqco0ziPCQ8+Z+e4ftIsmOXBhm5395P9MwHseZECs+oz2cDbG5ytY0XMHfIhoMklNmeDA02aS0",
"lVSrn/g90mmQyqP1XF7upVyeZ1WasJSCF5SiknNhkxsXE0ifwj9oNskC2pXTk+nzbbPrfYxB5rsovKJg",
"q2t09sAgJ7IMwf78EXjWHyy7iymXx01j35C+2KDdJs/HmbTO0PMaPndq28glfwraX8ylXqK5nJ6Tpj48",
"Qt88+WYM5kvKD5UCLzqgx0x3H3GXxb1W79Ry+kp7TaHCybcSbjLel5dyKaTnvxZX0q8x0oPqnvydMufj",
"u1MY4u+YcYGyzYW8Gjt6HJDu7EpJh944NyqZ/7Af0v0b8cf/9/XzxZuf//P5TzhIZhTkULES3J+/U8sM",
"6J+eAaLOYZjPzf10I79GSWKKGsXtowqP73RYLDEPoBen30TXd48qINCc3eimUbXQURz53Sebb0bI+pP8",
"yZKLGqOW9vHUcZiUDrHgsFyCR0ajak4/whsaVSW/jTJh95lPXUVVD5zZHXqvFM6D3xk6DyVm/TUVdRHs",
"LJacjOV2CyqpZ41tawE9kH75FqM+u3TzeqANDq3PyNGzSO/qEXliP/qulzHDf6mYtFzCAh4S03GAozD9",
"2ykIqvoTUC5MQ3KtHBRK4Z995qWUGL7hbAtOLYMFpaDhakWDKwmvqYro0uqfmLZBBOnQHYEJDmXGiNp6",
"2KC5QBE3psfI8XOQ6wu+QjQcb+Sf4ka+4UXdTaqFyX4SFka65Vq/fSg2pduxu7EqE1L0xOYKcFQv7C5q",
"pq6tu/sGP10u1TZwdpnqozb6VVva6GNO7T33+H7HFevv3wML4nHFZAd+8liSUugUnSOp6VygKgX/oDpc",
"mqP11K8XopZBRtH5+VuuJ/Yflz//NKc/Y3mHH6UPp/jk9MV34hHTYHr3a6vcTiQkfYzhocjJ7bpbAnOa",
"xBn9QiWLUL1bUcIotERyTKbikZ0SHplH5FMbJev/CzE6fhE7zINUqHIpFkmiKka8DOwC7Je3RjmxstyH",
"pYGx+FiB26ES/tTFrHwQ6UrpjmIPUrOqhFXT+Yu5T4Ro12UyOn98V1n540mqMPEpALX0XXLVAXJygLSC",
"dEEofEpZwfvn7iAlJRSlTz/iEGEqsckz9ALeYrSEH7igiO91E4h/cI6ZFmsUn4Bge75s6JrMGA0OaCX8",
"gpA2HG4CuQZb0EuccOcN/Ii9j+4OxzE2uCKumn8EUnwCYwGOOBG3NUKilzIsWcxRG59M2dql+GI/F9+R",
"wylG8GASMmw8H2HRGQnUp6g4npb8/qTfki6Tmqs6uR/DtaohqV8nnYM5CByhYt4yCqrmvKuxmhWLh9Hq",
"HJ9S0bC8Fhq8pszWsokDQBRusebbm1g8HJQPHCgOmVgiie0yO8sGcz11C+rC+CMYhxHzyRmFZ1EK96cp",
"pPnGNHqtCbYF6R18E8gFgXz/ExiRjlPy3jilqgO4qBXcQD2XhgQ0mmeKw+pBmRweiqIwFRh7ihv/MBIC",
"ovVrhibnnvjMulVMfD7B00ZEuY9i9cm3d2r9h/tS+bMeZMqH8ynrxPKyfUQbNPmg+PaKbZFzERs7Km6d",
"12GFplF1hg7QGPJFFXQAw0yWWC+LPnBKtCbibAnRCAPqeFE8MKbVD6F3+fRUHBCQA8ESbf56sfA9TPGA",
"MaBb/gMquTIYl2EKE+1U7N2N+DCCK4Hlfvr1PmTPau3hkOIxf5Bxqwny8R0NrMYJS7u7Bk833eekwkKv",
"xUQ8jKWU+Y51uhCVQYVHoYfaqVsugBCL4RnMW97UF9x1yq0RBW5Sk8nQzQVknjaU6AsvoKMvXwr3eAv5",
"RM8/1xHdqH3H8qV6WEcI5SYVzVnShb7TQ8k7gef5EC4JKaTqs/sjKHeI9jNw7qv+3KizGDs47VBymwWz",
"5JuCMUm3cjcXFGkIvweRhuRl0jH7JrELN0l3XQo2rERQNBClKgYHYGyMrgiQEKzZpSLGaONrneHm1kwF",
"OjLPjrm9J5xcngI0HgaRsOv/kihU8K3af5xP/MCPhspFaM+GXcAi1pE+5xA4R1m7OLULucF0VXkwCk+H",
"eXKSou4x/zs/qRWlJ2ClWYiZK3g+0aACqcQoS+GUxuISuv5UXmLHxfRkIx7LHI78lD586G7wgTEZRave",
"IA9zAvIh4Pfnlub6cDwCbp/mWJy951/MARMmjvfhO3w+2odDanX6rH4gFjVN/Z6mlRKR/WpR7cm/EKrd",
"V/u7UWccTn6aInKm7/7QC+Af0PA98fylbWel4ksOYn+Ibe8N8V/yrr22y/1O2d9jgwdcJw1QWOgvMQHM",
"AE2cXq2D2EqjyBN/nwdzdIroMklRYbvohtX1dZJKBFYcdO9EkFdFZ4YOJp8e5TJwfD5cm9yDzOkTMeVz",
"khUwkR2y0BY4QfiMubK+wanCUEoKqrxd24bqQGERK6x6hObXWB7K/49vTsI6T4yfGQD4p1e/ovE2e8Oh",
"yLH6qjLxpfacZefxXLyCSaCD2RVYen2qLoXTTMZl6F7GGLAp7vFHJeu9FtWB7Yl6+0TmT66N23W1ke8o",
"6+Lvnzyp9udg/NsDojMC5BWmGhij9J8xQgfnzv8+4gtM/P7J40psm9ajSya85HIlXUWXwo7OS3gbPUb3",
"eOSjs2lyvo+moxI2c4r+VLRF0uNYZ7mQN5BF6FSRMy85Aw/joFw5jqp8suIdE5iA4yoifwHvXtLHP5IJ",
"+yGIII9wFyPNbz+dYA3Q5orYUzSxB/8coLcAxGCFdQm2WFL4Y+5oRChjg5qmg1N3ZYc+XO4B68hhOVb2",
"E9xxGr6+aT6tMdUx66mxNxiVHXNMrBQs2TZ+PkmifrJUp/vhhds42rGCLcJ1Pgnxs/fw31GSVhr5y0tZ",
"NOf7GQLi8hm77373xtKP9PkQs55SzQVyWo9l5rjAoKkj/09JU9+FaYy6VJ8xfLJPEo7UmPAEh7iVZ+Ty",
"hzSl4GYOslDSOmY15PDyqqgCNEUmOBkU5fvDo66vdwUlq2H3DLStkAs7XFRTUtY4IdnDkPxS4rP/gvLW",
"Vhp1moSuvTJLricn2UVTcU1UTJuB/EJ66+ybHWUHaw3e6xiJAq9y3mCH5vKsS7CnJZ6BzvFSGgH5kkkV",
"3uziyEvpY6ECvEmsbQSt46qETJcqvJJGPaTk1PX/BR3AN+qMi9qcYmDs3nhnavga230kZsu61pRa4VUv",
"P8Ex5bnG8f3jKknon5FXKx8RFuAvHOINc860OmGvCafWerUm7/VfsV2PLrLoPQ0uIPuvYqPPEjFPgx1D",
"7Z82TdQdHKMZjz0/0Cmg3r+Mf1MC2rSLEwPqI45YBPXZe/51wBMkh/cD3R0H1t1f86dm9hIU7sfvlcB5",
"Jttah9O8ms6DzaM6oC7GqWSlejDZO7AtZKSj26grHVauFH+CKmXlAxcAi5mmSQGAQ4Ct7nou6A5IysA5",
"X/1Vzp1KE2eVsoPnncfK3GtZY8BlcrJMzTu/ZizoYh1Ea9hNnAgmQPJVrNC30qGXon90sz6Fz1JpmQel",
"K2mUz8ydHThhkUG7L3W5r5qyeHgoRerXcXoGOWBjTnZ46AeoGB14fRdLjGog9LM0/RMTe9h3ZIqoSkVX",
"/xtXvxZchTnXbaP2i/kZksT2lfDWGuUDIQnVMUcJPzbJnCbSo5LXxB1cJdJkP4ubBI92tMAfZ/d13fNT",
"jpbEIXoh08T53hmx9ng5sS+l7N9G6ez3N72Q9YqcQrjVQ1npufsv4gySsGWa901A+qJHHu3qewWtN9ji",
"c5wxCog47nx1RIirCTPTRWTnX+rMZVU7s7qyqTRrun+7JQ/rzWJ7UMhzOdFUQ9JHa5F1/YqZFRcPhDMM",
"Bx1jkGTI3lM+67yCM/ZK09FFZ2daEO7iwxzprE7sv1+szqGDzEXgJq9tPIKw0Vl9N2QKrU3JRqdRTJsY",
"ts7Z3keSNVahe0BGCvvfE1nhMWOIB7z34lo2XnUiVqHOnbEREP9CkjhsckeyvyCXQBVJMUwwL45fCYcs",
"QPRhgGfRipwK7vek5y6EsVelL3IegwDGTnbWjYqZi3uayLX0XeIjDHUoxp5LF1INwQeiVani3X+HFR5L",
"2FiQPHtPPwDjr7UBbPJn77Wp1bsPx+F9/P5OaF+Vc3Xg+OAQZj0q1ZO1Bcc48bFJLPbwBHNMj+eE8z9m",
"Qj23mAOObDKviyjr2imM8ZFxUpQzvrYmzhe9370ydRf/kJVYtOJavxMWw6T1yliOqyr7vdEIlxy//iDu",
"b9kQXyZMhjQUU8eJQPrZ7v0kU569jz9Hvgglx4JcrLtgZk6HWD5a+CBLslsdnRKqsit5Lr19WQeHDhif",
"RF32OmbK66CGDniYbJ5t6wpm3QaVOUhBlZ2jJWD2Vf/aJOAnn00C/uzSb/TAOHvPvw4YiqKDxwPC6Bjf",
"Mp7sQ52cCIr78aglmJ6xR89xF/U9JzDFoD6lWkiKEgNw5yeRwyR+dS1Nba+vxaOVlU2Fqd3ZN8kHGRQ8",
"kbWgrGq9kGN0t2mUfwxOE4rTYqB1mxqHbrsoMeCGi9YCxZCk8+HX1nRMKrKtzA0nHjhOspTHo4qfM81Q",
"dVfERjVcNsk2dbf+cpZP3KYczR8gDx8N8vW6bkY44zbeSlZy3OOmui/LWzxCWA3Dtdsvc4iex7pxXNiY",
"XH9HCPQiTnKSUn7erUxAw31MSWm+7E72PL8/90ZexshWFPsQw1MioeSiHFUkGeUC4pnirpk+JVKK/Wgf",
"veCroQf5r61qVSoGsIzlnjg0G8MqOp9yaxs0LqCCUnaenhMoB17y7A3+7+prjuBfjwjV1ybJB6kbo8Je",
"hWSq7AcOHCexwil+JwzWyuqF+1P0PZb4iymZWeAFZbWiGqhklzI2GaUq4W2qD5xfu5AVeimN8HpFTw1m",
"GjZZQVXNqYjkFSg+DSvqcYKlGxV0oPT2QdWgPMSkB3uN0grAdt7fEX/jz97Dfwc436TAf7AVTCuoMuXU",
"J0/kiiu/H6PbB94Z1rc7jqTfZ9Qpev7KesqaR9X7ktEIZpObapU7Zz2sT8X4oMdoao8BPnzNwyvodaL4",
"WC/UCMkP1UgiHju66uNBoTbRhbgrMTcm+KXzA8t7Y/+IsH0Y6o59wzB3oe/fTnhBWE+chmM/4QjV8NWS",
"5B4Os3fFJIV+nuWsN7mNMhkmH5GDG/rDoZ2wrkRr6BcCozXByeUNPId5qSUi0XylA+oW1WOuRIlFJWER",
"Mkt2CEyFW6nTK+lVQkdgRTIb6X6TVbR5em2WzOis9FtlKKApLoMvHtTOdumfOCEiZtPtchniHGDpmnWv",
"8RWX+VOyPrwQKq8BkEtrmJo5rU+91bb1+Vg4B1wQ1jmE2bhWTd5J/uYZb/aITg7LZfDEgo3LoInw4uI+",
"dAuqKB0+7iPGQ0ROMMatrsG5W/xkg5BNY28jWOJikq58mBUV9mx2J2390xxC5pwjESLWyJTGS5v+3gkn",
"OUqCyydjPuWIHpMT5K9nexX4o0n2EOq8D+TiblMZ5/QX7Q9YI6SLKo3OTmaNejw54aC2H5tj+CMt94yE",
"hav/lXKnaF72QYavLd3gZ2YuIGXtXr65Nfpaqxpz28KJtIZTyl+pcKuUgTtferqWOw+SVY8SzKcoxXcw",
"+nHB49Kru9rXSv3AFD9FP7whH92PbeoF97WXR3u4/Au6UbgNU65PMizX/+5nxE0eEahX2VVWiCIfp/6K",
"L7TyMQ9EwDD+lBLMBHwJf9XIq2BYXKOug7BtuBCJe6mF4rbaeF2rIo8E32qzbNrIIG6kuymnok0H0B26",
"pi8b6denXkEjika48rZpgxLWCacaSe4QtjgjZ20KeLCOsxakewTeTt0gX/RQfKcdOCPuKQOS9vzEx535",
"dz8kWP//88uplJE9Qz6WKeFgqhr2nwOWAUdvnQ7d2YmBglXUb8WkjV31p4GiEpOuaMNazl4WDB3zHBgQ",
"NUxNddlvtVdCevRYj1JzTOmRWXOQJTOWvqEXsiZxR2yUNOiCdCFqZ7eUIQTTOyBnfBGjb4c2IkizgKln",
"deBRnIJwWl+mHaaOwk5MdgvdwzwjJek+FLzbiuvuc2cknFYRrPghu9s7tYGCrAOfqtSf9nG0LiH9lYLB",
"00goqACE2QHLt1fwqb+g8mvYDbmRLoHFbLfiWuqGxEGinGGd3k1kz4WRygqp3342hVTFiV9omdE1lsHw",
"RaxGg5N+RF4kxofgpKFXsfo/hOAO0zJQTqJ+OqJGcrguaV65eg2kcICk/v2uh9ZMQigSv6A1F4uNBbIB",
"KemSjIMl8TD6qOAKU3F/fjvoUgbxCLryFvCPjL3wSthr/vX4gtM78RG4UWobEyCg8hmreEwFnACa3CW7",
"0iesLYNpHMrJlb558uDZlY5y3kfIHOO9TymXcEVxH7KcS08ef/3qXxC29pQcdWrVNtKxv3TOf87FG/WO",
"7QpwKag6ngDh9T85W8eFoNJY+H1sKYyNNVn38I4gOTw483iAPbwT//CgMtQz7miCsgN4/70ZRCwlPI3I",
"qTr4CI8pz/5L6W5qe8vNyDGOvpAhyOV6QxXJYPqcH+1YPJsPCoZXWC4cB7j8f/5UiSUQcRTa1LugDDpI",
"TZ+KFxuyFx9TBerT4/C/aoVp/3b1P95tmi9eoBqwLxao/vc+rihbfH5pLkWP8yHFaSyCDk06vktrrrUD",
"hQk+Zp1Klr0LLe7sY46SFHdzqk2VhBuNJWff6oAnGPoGZTj7s2HHRcc7YQCxmiaWB/C/ttKvJ2QqbYJF",
"QTQaOqDbus+pDtZozaHouzasqRL+LjPBpgrg9jQ2OIUGDkQghwQU0+hkpi3IABFb+0psW1yG5hSCULar",
"EtdQA/HaulsZM9l2E1uu1fIGIBlsTN5kehJmSbQsiJK4+jp5AHGUDb7SPWD0hMRkGEq5DqPV6BGBkzyD",
"FlhLTHgVHudxQCgtG9v1oA2MsnLK++Go0WzGMBsoBErZC2knIS5Mv2PhQ6DLSGuCbrqVLxuLJeoGcUZj",
"pydWl6XZRgkZ1p2KcGIuRDLUVCyPsIiMybMIZPykC/5kmKqakBVOBfUxCBJl6FLNemqRVC0wI39DJeh4",
"jkE8og0Q+pqdW2IS0MdVAmmcHwEindM6Ft3KZ6lNf+gfnj/9LgYVKlNH04S97jfjNKuMNwtY5IIXSHjR",
"bYp5XFJPdBAbbAtX0s62gwcZQnIunmvGadwj6KKsBSloN6IN194a3mkU9BYxvgaOC4zJiL1T4XxYdze5",
"DPDJyDvoHY6NrFVFSirtI2FJ0b74kJZQdY583E2frnAq4iQ5c95An9RcXRBT3ziqPSs/soTGVHBtCP2L",
"TL1GuwC6sW2krjJXEBgbsmi+R98++cNj0ZoGznqWkyTrnCENAvsCnbIf8daBDotPk7EcRJiD83E1VkRy",
"8UXOfytJrcYkchApCiTXKW+bt6R22+Fd1+hl8OnQGNFIU3cUVngrriVfAHyT2AVOlK+b/Hp5lE0PmOn8",
"HVZnJEeNGnUXnbf4zlOpmVzZx9GQq1TiF6lwPE35nXnOWo/onkpem7yxPfSldvChn4sXAbV1DqDng0SM",
"wfRtu8W1dQuc+nBbY6jmboCRPM2MDJHfAzbX+dVSzjrsVh8baV7OkoeRw9Vsmz16P8sxaswh4WSIQubK",
"5P5BvMMJzLwtjL2dz6qRrb6apZMwns6PkZjnyAjPorqLkAg+7o0FNL+L9xsPmWHmhEMncl6djwI2PcdL",
"oNGYlDJQjaX/47diuZZOLoNyeNsSk0pWqO5cz8cyQjWj9+MJwAfiUXaEH5/HCVkTbM5AjHi4Od8L5/Gy",
"TB8ULt4LJDf9+xxmqgzo3/6CEyFpU5kw+9twCdXs3Sk0PX0rHXDrwMNHdIaVvaTPsyevuKcP5fSMn88/",
"eZ+enACX6cIrpD4VXujB0tMsrX68La0TjxIuP6ZAcUq1/nW7N48ls1Nc3GlOJMpBmb9g3UF564UURDpG",
"t1Ysuct377hOPzS6SLQ6sYyFVDvSLFWDwzyFATig9Qu590YeCPDklsFgvn6Fb5RVP7/wnQLaegxM4ur3",
"EbWOimVuk5PcDDvxrpRB7DErwT9VTYroubjkobPp5GF2eJZTMbUpQ+xB2Wrytn/xxSOMGOblULGvnERt",
"iWYcyOxmXSigm3q3tT7y8fTHApoOK+nFEnt1L9ACWgrTYo2ALtgjD/SohAWj+LaBK/yHN29eVUO5vJOJ",
"rcss3ROGuldxrZ8nNTCnCDg2bxXN7esneigSQNqNbRsOpBl4I2+UZ8NwDACLjsCPKBw35o3y5CbMjdD+",
"9zivmZNJaJqrx3ehDPhpa/KPO3qS+O848hrr5SgTy/EDkpVQJt7HeWTZMREAcZyPu8y+EqVz9b6cswQ3",
"f29Ph43aUxjm5O29zKgVVWyqomKBD7SAgTPbECBbsg+dCwm05eWPVPWJdVdyuz3x5O6AbFdSg4Vdo/xa",
"KRDzaVqZfQt1so2VtSfxO+6SWEqHbi1SeGnqK/tOsA3y9FItW6fD7vSVbfSSotJiAaqtMlEniRodjmpj",
"h7ZmJ5bSnAQhlyGC4emrFzEyHKat3B7r12t5+1/JJPybs9/8t1npk9J51N/sTSKTirAnAk0RhkX9D3KB",
"7WqlfFjwTZ1iMONd3tVkp4+D7b7lbxbch4I67PjhnNqiAip5BMW7oZSjiOf9Gtf3BQSeCLf667/rj2EO",
"k0chNq1QrbNVLguP6tldipzZ68/ImL2+E1/2L8OWFSoxFXIjf+31kHryxUR1qK9nKw4lWDD9hUwFTHZh",
"tzpE0X2zDf0kL+XMB5wx+UGTtXDvXybB6jHyd+bg/a8hdEfSeBRhTY2HBuwoW8votMAWhQ6vPNh0VRew",
"e6ucSiG5NwpQLICF05+B9F2a5dl78+E4oZvMUM7eRg/ypNSVYTJVe4LDZ0nVzqMdS4sS4P8FiH+cKuzX",
"Gbg0P5hKsiwQmrsnsDyQSTamJGWv+lIG7CzxdO7+fRLjqKMgyCkJ+rQYNemAYNq0yg87oLZLa94q5xHr",
"OFLYB2tTiuR+MO5bZWrr2Fwbh0H3chIHMzJ1klN1ihof5LSlQqvonbAvFAP9MbjuDFue4pyi/bDLQ4Br",
"iv3LILqqxOW83d9bd3PZxTP/d2baw4Q9q+r2oEaBo7K/liuvZRxIVoJNK88+5179CtEbWFiacaThiHlr",
"VHKhSWjFCSOi0QnEMqzi5rC5wjqTDBcU1So4H51XHFVLHGn2pbvJKt89FGeTjfDZywHeN2HlAOWCchtt",
"ZOO/gAdoNOrEOUwwuOykA0RZmnqh66pUhZgKwXAjpIm7befs1qlx/RrqwVAOpnrXuailSQTUOuMI1NkJ",
"he2OHZEomPcSOpxOBy79zRvu+qFSgnP3XywteFrflFQWQfuF49kSrp+9jz8PWCB+kGZFhC1bBiAb7vlY",
"nILrdLTjh0gAfnU/bc6EjvsXdXVplzcqcMgEeWxmXpORgEeAoP1W/5PaLW0DGkxkxon1IP04cxgkat7G",
"WyJtLt0QS2VAt7x12qDON8T4WtuGbctCKZws5SEAtIEHHJgUvcZoTKrYxKOhwaDQlA05MHX0KsUKtOnl",
"2jY15Y5KR0T/s/P2jrRAvdPRn5zWyV6qt0R1aiW+ffLkSSIU0BwwObQ+xfkq6ffGimT4cES4CGzAXhK7",
"NyxvItYPdvP+nQ416N88+WaMeJe3OkRkA7B0aLh1Ntilbf49VOJlGacjOZ9EZssr/03qALKSfJ2mFaqo",
"OfvPFPuOlkaOiK2yjEZwdKODeerItYaLIwnrIklBHq0r6TMXP8qgnFBYaBLOTc0J4zMVA/ZWWzBBEQs4",
"IUXwCepV83tAjXu/nl/BwAOQM2kFX79sH2d65lpzqP4ehUUMNwkQhqRoLsqsvdDk6wu+Qdpw/YpAwOmk",
"SQxEIbxgDAkqpgpwu9ibxFtKbbYB2LUodUPn/Njz6HSDeOoWMC/mcgARfi6+ffItI2vXscYaqZKwdgK7",
"4o6/bh80K3s+zJSxAM9W3IevEbVyYWE6vV9GaSj9RcdmNHalDd27norBd3x+RTvLH/eVlXBlA9Z0++6F",
"dZztopMg/Jzd2tmONwzA0igZXDkr66X0IeZc2Mod2N1T/j1uHW9t0DVORu8nkDwkYcomcojJ9r30rPEQ",
"77fr/JJafQ5FahyNxedj9KmEVnExLJDxzZLadX5jRQicvYd3A3a/VIJk+qrZU4JEvJHkUymZDAI9zBJB",
"LO129zEs/iTZ+hw067tE5aewL9ua7kp4IAqG/30KjVfUFqM7Chdn6d18ybksWxPpYgH9tE8xCHBnfiOC",
"Fd88edKLQciwImq+CDt64wzxhBQelMtEB+EUjOcH8woWpwE0TC/XYtN6DIASVwpVGIbu4VjvrRcAdRu7",
"7z2gRVHgRjGRbpsj3RFyDIxwOLPXp1eITKHt5ytTMyJxEyaigAG+A2byq1FSf/jwvwYA",
"gTgcrrGL6+8G9o8pLQqwgV1SlC6BKU6OI5odEnvKVamD2LShszEU8lZmtQuVrMVKBboQ9MrIxqfssmVN",
"w5X0asGVm8eQn45jIA3G/jIlpFaVniVT8hJmyen4ihlL25Tcp16wIyKLpH9+Ed0PtrJRIWD9Py4wJ9ly",
"j1mbpMAOAUKjYBxyG7CGo6txf4A/QH/NlS3f7w8RR/IwuiauVcEXE3I62otbqZEIRUVRzglV8S90sagB",
"MoMRxJWCxk5BXFK9V5slp1SBmbaL9IEpHUeX5aOn4JITeVLuoDaDpexTmR0iSlP+QaPQ8H07yFmLAQb5",
"J/t2pUuEUkxXYlnpsi/ofUoti2+jq+avrfSJ5hcjr4ZljhwBNKYjCpaOfRF6WVqkQzxqlqsqfUhZF6aJ",
"D8MVw0VYuR5jpfNQOt0jqYlSabNKqGDNUmXZT/CYeYpZ5dI/sFlr1dyBoNEajnE+Gu8ErWwjb5TPCuvR",
"Bx2vE8MIgk8LZrfjQOP6yV05QHM6yOYUh+/TTk+pg0/0JacgkV8WxC/Dt1FdQ+vEhtsWf7D2nmIh41qn",
"ERsEB7gOFmSu3reKTZfcTKNDN6MDRyRRBwP8iXSPX/KS+WbTYVqXTx8sDmfCJrmB9i460CVaFXXmNFcE",
"JvtidbwNNEieXJ1D3p3o2sGkxsAM4arLK8FXHRKSZzmFBYwYKUr2In1OXM4B07eNCgpTzXUuBwkblE/I",
"UGHhWW3a2FhTDWlisHpJBObiaazZBXTA2NF0cJ5+Ll6ElNIIDZpEnkWXBqMS5dQlVdZmAUprdANKFu24",
"pZjr4Mq+Sw9QasxNohECVLgL13e0Z7usd3hGn3V95A9jb/vFG0tRS0H1bnqQZm7UNoCGKqQMf9HlFiU8",
"J42nYmywrRQ5SsAktwpM4wdAot5x5aVcd8wsk62q05qelzhJotHE5VxEH6vxKag6o2Ii6iAexKdVp39B",
"DEED+IiL7xE01XiFyuUL0XFsFyBWdN3oQEKnQSxMYsVFInI4GSasJ0w14YsxhYxf6BCpZTKcslkGY2QT",
"jGN7gjLiSGZtfXwRL7t4Ncacjx2FHFJE7TtNAOfxu5U76kgt4BZMq/bpqmCXinQTxa7zuzd20eOC+tMa",
"c0ld1/A/PbyY3kXSMuVmOMpViESVX/LHF1noXZwFD+payG1Lfyy2XGL3SoVbpYygHJXkF4Nbh1vVRb0M",
"0lTC+MQ+cwDIBROlYDtZc0RmOltbpLApI9pIUOWPFtwJl94kSnfRHYjowgWLE6M6C3QvDe2TZJy8YPw3",
"dsGOJNwVayVRh5n8hI8xAfZBmx7Q78ihVDNG7qElrGhAjJMjZ5KsIaLsrMi1V7P+VnRddjtxJFEGxcvA",
"FpkesSEy/Z1ZIbvPcEavEkAGLwYPXyYQpUevEqzSo+9yoPW+VXWhXf/hT/YpgzM9ehrh2u/rB4Jv/+FT",
"gPPrCOZsNbLevbEvGdrDKVx2UC/XhUJhvowCd9un1j+NfXWPRqBpfQcbnBGJ1YujVMY9z8WxAnmUAiul",
"lUwny6ij9MmTQQ7PB+rRnmsc3RU6DKWGqu9Khxxy5GIyg1TZtdrWdqGLZVNGMs+bn7/7eb6psQZIf7Tc",
"y+ROfO10/MP3UxwD6yLkJs0rNaLMLP9UuWpJPFqpANgRczgkR5el3e4eQxLbru9IH2Py8ehDaB1L1+IR",
"/d+9W6SI0KizoyJzsJGPL0aMinQqlxjYgqRD5KEjE4T+6ZAiGTVmkcHCfWZFZlirTXIueXp3kC8mAlG/",
"H8ovqD3ON2K8A9Sar6oL0ZetoodyB+Y7zzcB+l61TdhHIxfwkxJ12H+meo06ziyD0nSWk6j/767C0QU4",
"lIQnLricYvW07H39zJQt4VmXxnVQ7E76CbkiqpMcOWGDnCNjbMZ5p2Y5hR56inE+E3LCbxZTTSQFwxZW",
"aNse5wXjTaQZaO5QEyart1iqPeBUaeFOpcX0Kn9ck4BE6jL0YUbsrtNCDs9/gJIIeZ5HXNrk9t03oAPY",
"aY7WwFoYndN1LyiPc9Yhwc6UUo2+SRERtVV+Ln6yYRy3+NFpZ99k/DE2IZLGI1t3TCrV6aiiS9IDji5O",
"LvygfdTXDOIUc2GZVUsTALhTsCJNAVvMxS98Eesup1nUW8J1H1KOvc41ceq+n4te+FQ3wb+a0hT3xxhG",
"Mi4H6YoAe0AQ18YHJWtoQlcq5z3pnPPjfXmehHe0dcl0e8CK7K3hXAp1V4cD/6ZVo5YhZjuQIYJGB3Gl",
"lpbgkOnZuKe/ziihG/6JP9W5oEfYFz3666wajClkfiVRKKp4k5f3Gd9ZJeB+mDjFbzhCvnCO94fFD/AZ",
"ousT3elduLhX0fNI9+JpcK1TpvM7e+zcrajYKHNdNuQUyfvluBhYxidi8PLoJr6HKzrc+CisVaGGX61A",
"oA2cGXNvUB8P+l33xdG5C3jh2WDFhSu5eak2V8rtqet/gHbGJACy8RYL9NAhGSVxOiYzZ+wYWqRgKCXZ",
"ZxwzQdhrgUkJvnnyBPSBTi6Dcr4SrdG/tqQJyj68E+F+g7SZp2Bvieq4FlWWnuwWzjZK7O+/vBExFHlP",
"/F48rlCMfrwdMd3F8fxIjwQccuPqut83tUtOhTYM5aBZ7Q88dvb2YKtRcq3Gz/jLvdOC4z2ZdaNoWHk6",
"IF5M0SCsCO4WLuCSbp9yZHGR8Nrajqei3mkfDlQ1GLjUkDtSlHZlYPyzE5akhBLH4YatLZYpPYQXPPHY",
"/98mVhxLng6YfUs5w6UX4zqh0OEJ5YwygYTk5CgwmemPP7puHYINKIIv3jHkEz3BEkEkG2+4UdIpH8Ra",
"yZrLLb9VaX4FM/a4asdRbFicOLJ8MO3OSxf2FauaoqsnVyKL0OEkz4fpTJIoLSYcjwCY2rCJIwPiYutL",
"Lr+qyc3HWXylxFoGFDrVep9mD6dmuZbJJVYalma0x0i/CTyejtE+1iiOgwdLjMixgCvCid2SC56feyOp",
"j0v4tH9WvdC8jp/hz0uzJZ/y0Vyd+ge6+Zdoz67nF+4plwIKnFi5JmaOltHFXG7R6KDQeFiLpVO1Dj6p",
"2pJRC32LQKfFueBlRHL0EQQ+oXOOjvMrHqh+EbQJTzIqneRJSuYQgeMdLmiKvuxDtlVIncRGEZPBNz/V",
"owIUW1OSvM3RXtW4S7/gmAdpb7b6bp6TW88JqCZi8zBFVrrtULjh4gUk9KSog3K4QSSErVd+f0SBL2Se",
"NEGvnHyrw27CXVC2dTnWaGlr9e7waeEeYvuqN+QkxHgbRkemkVclzvdybR2Jw8nxCvGinGZfb6ZcZ2kn",
"T/g89BDVtldIxLUBfjYMSgxeSYwvb01INySPS0eAsxWq4PcfGJy1oJbHHxSY0LjT1teVCPZGGV9FrQX6",
"QG2VW2IlWq8atSRb7EZixvfyUS9WmHi6geUKfLkHUNPwIGBPR3n0N4SyuuBA7M+zVAD21P8hm0o1Q1bh",
"xthbQ9+MCisgcvF6GaplDC0JZfJW7ko7C4Q3uFZV5BAQcyHAGlK9kmjkTt5t2ic+l6wC5NJWvpdj0u09",
"YiG+ipVAou4EU/Vh9xN1Gj5hFY2ji11UM5NVOFpsY4mjfZR7XBPpY2pmFGcwhHJF+z2FHn/G+2GMJPcG",
"2GA9Rxf7iNmHMovrBnNUhxY+vkVMD+sWTpbTs2rmyVrRS8PVzbCg9yjIb1l+0k7LEZURFEeZqdCvmNGG",
"9bCrc1BbX0X5Dq/0OURaUPll1MZVuUKQ/B981COyXjF6C2FvWfQX2MySD8UFcVF70jtn42ifHEqoIGRX",
"zRR1lKjWhCFj2gz8zJ+kvPqFGp892L0v2LtX9hQenoKvyWmsXXyK9QyVm50DaUHNndoeL2PGbbwManu3",
"4vg0ThHTuM/XbaGuDO7ZVO2Fj9K5xY3cL8AXwtvriJAquiu61pQJ7CQRo/0tMahRbcAzPfGMxkdnDeug",
"iaHgRbvVccHoTCc6u6ZG22UG+J4jD6/pwBZfhqJIg6bKCTYX+x0noIBDU2WlAwHBToRfy+0dK6HHHBfT",
"xhauZOa47qwPKZsOCv+c0MG6G7KWhccpePZuQbO99CqFme7Dp5JvJwcVYIAT0jZwWhY/J5c+XkxIPnPs",
"oZKlY8G5UCX7XpOUhiT5xWN1MP6wnwGCp9EFfD5gLggEIfoR/ZJG7Z51HlndM3bJ6h5kPlndw+QP1D3K",
"faW6p/2cELz0xZTeKsuX4pPRawj+6Gt+LEqXzzEOlTkUZFPLzsC+44tUf+xZlNX9t9fxcKTsWsRBWses",
"Kp0VUpk/roi4wdutdLJpVAMqBuoiXYrxzOcuIVltwXj4u5v6nGNlfOhqMUjmByr2Uk7VhAbNuokU7typ",
"pAavW46upX6QMwhKbs4p8btskjOq6eXmSeZOLIHGvgJVrHed2BK2yfi1dFTXHMMAc5dpznBGeJNN5Q7l",
"rjO70d2s7rzmo+1H52K1Dae/oZYcsmnEM5DyK7FSYEvo3lojnnZyf9w8diwmzDLiGaoKsIuBBRuj+Rnv",
"ellFo4LnvmwT4lLJT0Bt45Li4WY/aN7WFVVIKyE2fEI4fOfbPvJjw22LyFxw70D8Vz4W3ep8+rH21qG5",
"5geOo2To1Hyyme/JCd3HuNyid0G7G7ccZpa/ZvTB13ElcE6J1iT6gafuY7BjTyWGePSBKN/LBDrtNHLs",
"/D7sI/HkI1Yq8LhH3Li7CbvrrHThcJ6KPVUmR+PfaAoXH7icL5gKxDQSRNLhV3rDavmi2LrtqfzzFCX3",
"NRcMAILTTgUUx7D4gPnZrtH8yGw7ZkNAu4HznIx+/mT+BIa1W2XkVs/OZ7+bP5n/DhYrwxpBh7mHZL3R",
"5myb6njim631pXOGSr+YXF9D3jau+twrtQk5SVIIBkzsFPJy+hOBtSTTPeBv4tcUGcJfY+WYnQqiVkuN",
"Oc1+wRgPsjrQBxQWL01e7JKIQ8XZW3//RLAuEM4E4Au2elFDRX2YxqtswdUseuLg4n/75AmZlU3gGEKo",
"9skqnLN/cHkxIlpHS8ndeAXe7ENVKBlFBWnEVjkCzBw+/P2TJ1MjpTWccUkr7Dfb485ffkVpQ/pg+ZMK",
"nKXrI+FxQJqBEQpLvqSCm2slG3ZxRhPFfLwOfH66zOwgU+vpG0wecFn9gT58OJDyqZfKaU7ti3kLL1XZ",
"cBO/RTg5JaMSbNhMrjixSR80pFEcQwd1yH9ka/5DAaYjdXwzfrldeTN0bvN4yL691yG7auzVHuJ5GaxT",
"SLTQ6xSJXusV1bxm51Bi38G0n1wC5S21J+d+oBvwqlYBramdqgPzMSE6bCiBsHj1058q8R+vnv+pEn96",
"8b2wDtLKvZqLp4FK6P1evNR/JGFgiB0xUftepMBpna30dX9DkunkShuJ+eXHtx19+o+tWt33262596e3",
"6mp712+PQNtvPhnaIuSnsBWwqBaAa3dG1Wr27Te/uy9in72H/17UH/bR24Qzew/0vxnijDcRIHni6chW",
"Xc5xBhEect7cb++wXSTZkQvD7Pwv72caxuM4E2LFZ7SHsyE2V9mahiv4W0SDQZLKDA+GJpuUvpJq9hO/",
"RzoNUnm0nsvMvZTL86xaE5ZU8IJSVXJObHLjYgLpU/gHzSZZQLuyejJ9vm12vY8xyHwXhVcUbHWNzh4Y",
"5ESWIdifPwLP+oNldzHl8rhp7BvSGBu02+R5OZPWGXpew+dObRu55E9B+4s51Us0l9N00tSHR+ibJ9+M",
"wXxJeaJS4EUH9Jjx7iPusrjX6p1aTl9prylUOPlWwk3G+/JSLoX0/NfiSvo1RnpQ/ZO/UwZ9fHcKQ/wd",
"My5Q1rmQV2VHjwPSnV0p6dAb50Yl8x/2Q7p/I/74/75+vnjz838+/wkHyYyCHCpWgvvzd2qZAf3TM0DU",
"OQzzubmfbuTXKElMUaO4fVTp8Z0OiyXmA/Ti9Jvo+u5RBQSasxvdNKoWOoojv/tk880IWX+SP1lyUWPU",
"0j6eOg6T0iEWHpZL8MhoVM3pR3hDo6rkt1Em7D7zqauo6oEzu0PvlcJ58DtD56HErL+m4i6CncWSk7Hc",
"bkEl9ayxbS2gB9Iv32LUZ5d2Xg+0waH1GTl6FuldPSJP7Eff9TJm+C8Vk5ZLWMBDYjoOcBSmfzsFQVV/",
"AsqFaUiulYOCKfyzz7yUEsQ3nG3BqWWwoBQ0XLVocCXhNVURXVr9E9M2iCAduiMwwaHMGFFbDxs0Fyji",
"xvQYOX4Ocn3BV4iG4438U9zIN7you0m1MNlPwsJIt1zrtw/FpnQ7djdWZUKKnthcAY7qhd1FzdS1dXff",
"4KfLpdoGzi5TfdRGv2pLG33Mqb3nHt/vuGId/ntgQTyumOzATx5LUgqdonMkNZ0LVKXgH1SPS3O0nvr1",
"QtQyyCg6P3/LdcX+4/Lnn+b0Zyzz8KP04RSfnL74TjxiGkzvfm2V24mEpI8xPBQ5uV13S2BOkzijX6h0",
"Eap3K0oYhZZIjslUPLJTwiPziHxqo2T9fyFGxy9ih3mQClUwxWJJVM2Il4FdgP3y1ignVpb7sDQwFiEr",
"cDtUyp+6mJUPIl0p3VHsQWpWlbBqOo8x94kQ7bpMRueP7yorgzxJFSY+BaCWvkuuOkBODpBWkC4IhU8p",
"O3j/3B2kpISi9OlHHCJMJTZ5hl7AW4yW8AMXFPG9bgLxD84x02KN4hMQbM+XDV2TGaPBAa2EXxDShsNN",
"INdgC3qJE+68gR+x99Hd4TjGBlfE1fOPQIpPYCzAESfitkZI9FKGJYs5auOTKVu7FF/s5+I7cjjFCB5M",
"QoaN5yMsOiOB+hQVx9OS35/0W9JlUnNVJ/djuFY1JPXrpHMwB4EjVMxbRkHVnHc1VrVi8TBaneNTKh6W",
"10SD15ThWjZxAIjCLdZ+exOLiIPygQPFIRNLJLFdhmfZYK6nbkFdGH8E4zBiPjmj8CxK4f40hTTfmEav",
"NcG2IL2DbwK5IJDvfwIj0nFK3hunVHUAF7WCG6jn0pCARvNMcVg9KJPDQ1EUpkJjT3HjH0ZCQLR+zdDk",
"3BOfWbeKCdAneNqIKPdRrD759k6t/3BfKn/Wg0z5cD5lnVhevo9ogyYfFN9esS1yLmJjR0Wu83qs0DSq",
"ztABGkO+qJIOYJjJEutl0QdOidZEnC0hGmFAHS+KB8a0+iH0Lp+eigMCciBYos1fLxa+hykeMAZ0y39A",
"JVcG4zJMYaKdir27ER9GcCWw3E+/3ofsWa09HFI85g8ybjVBPr6jgdU4YWl31+DppvucVFjotZiIh7GU",
"Mt+xTheiMqgAKfRQO3XLhRBiUTyDecub+oK7Trk1osBNajIZurmAzNOGEn3hBXT05UvhHm8hn+j55zqi",
"G7XvWL5UD+sIodykojlLutB3eih5J/A8H8IlIYVUfXZ/BOUO0X4Gzn3Vnxt1FmMHpx1KbrNglnxTMCbp",
"Vu7mgiIN4fcg0pC8TDpm3yR24SbprkvBhpUIigaiVMXgAIyN0RUBEoI1u1TMGG18rTPc3JqpQEfm2TG3",
"94STy1OAxsMgEnb9XxKFCr5V+4/ziR/40VC5CO3ZsAtYxDrS5xwC5yhrF6d2ITeYrjoPRuHpME9OUtQ9",
"5n/nJ7Wi9ASsNAsxcwXPJxpUIJUYZSmc0lhcQtefykvsuJiebMRjmcORn9KHD90NPjAmo2jVG+RhTkA+",
"BPz+3NJcH45HwO3THIuz9/yLOWDCxPE+fIfPR/twSK1On9UPxKKmqd/TtFIisl8tqj35F0K1+2p/N+qM",
"w8lPU0TO9N0fegH8Axq+J56/tO2sVHzJQewPse29If5L3rXXdrnfKft7bPCA66QBCgv9JSaAGaCJ06t1",
"EFtpFHni7/Ngjk4RXSYpKnAX3bC6vk5SqcCKg+6dCPKq6MzQweTTo1wGjs+Ha5N7kDl9IqZ8TrICJrJD",
"FtoCJwifMVfWNzhVGEpJQZW3a9tQHSgsYoVVj9D8GstD+f/xzUlY54nxMwMA//TqVzTeZm84FDlWYVUm",
"vtSes+w8notXMAl0MLsCS69P1aVwmsm4DN3LGAM2xT3+qGS916I6sD1Rb5/I/Mk1cruuNvIdZV38/ZMn",
"1f4cjH97QHRGgLzCVANjlP4zRujg3PnfR3yBid8/eVyJbdN6dMmEl1yupKvoUtjReQlvo8foHo98dDZN",
"zvfRdFTCZk7Rn4q2SHoc6y0X8gayCJ0qcuYlZ+BhHJQrx1G1T1a8YwITcFxF5C/g3Uv6+EcyYT8EEeQR",
"7mKk+e2nE6wB2lwZe4om9uCfA/QWgBissC7BFksLf8wdjQhlbFDTdHDqruzQh8s9YB05LMfKfoI7TsPX",
"N82nNaY6Zj019gajsmOOiZWCJdvGzydJ1E+W6nU/vHAbRztWsEW4zichfvYe/jtK0kojf3kpi+Z8P0NA",
"XD5j993v3lj6kT4fYtZTqrlATuuxzBwXGDR15P8paeq7MI1Rl+ozhk/2ScKRGhOe4BC38oxc/pCmFNzM",
"QRZKWseshhxeXhVVgqbIBCeDonx/eNT19a6gZDXsnoG2FXJhh4tqSsoaJyR7GJJfSnz2X1De2kqjTpPQ",
"tVdmyfXkJLtoKq6JimkzkF9Ib519s6PsYK3Bex0jUeBVzhvs0FyedQn2tMQz0DleSiMgXzKpwptdHHkp",
"fSxUgDeJtY2gdVyVkOlShVfSqIeUnLr+v6AD+EadcVGbUwyM3RvvTA1fY7uPxGxZ15pSK7zq5Sc4pjzX",
"OL5/XCUJ/TPyauUjwgL8hUO8Yc6ZVifsNeHUWq/W5L3+K7br0UUWvafBBWT/VWz0WSLmabBjqP3Tpom6",
"g2M047HnBzoF1PuX8W9KQJt2cWJAfcQRi6A+e8+/DniC5PB+oLvjwLr7a/7UzF6Cwv34vRI4z2Rb63Ca",
"V9N5sHlUB9TFOJWsVA8mewe2hYx0dBt1pcPKleJPUKWsfOACYDHTNCkAcAiw1V3PBd0BSRk456u/yrlT",
"aeKsUnbwvPNYmXstawy4TE6WqXnn14wFXayDaA27iRPBBEi+ihX6Vjr0UvSPbtan8FkqLfOgdCWN8pm5",
"swMnLDJo96Uu91VTFg8PpUj9Ok7PIAdszMkOD/0AFaMDr+9iiVENhH6Wpn9iYg/7jkwRVano6n/j6teC",
"qzDnum3UfjE/Q5LYvhLeWqN8ICShOuYo4ccmmdNEelTymriDq0Sa7Gdxk+DRjhb44+y+rnt+ytGSOEQv",
"ZJo43zsj1h4vJ/allP3bKJ39/qYXsl6RUwi3eigrPXf/RZxBErZM874JSF/0yKNdfa+g9QZbfI4zRgER",
"x52vjghxNWFmuojs/EuduaxqZ1ZXNpVmTfdvt+RhvVlsDwp5Lieaakj6aC2yrl8xs+LigXCG4aBjDJIM",
"2XvKZ51XcMZeaTq66OxMC8JdfJgjndWJ/feL1Tl0kLkI3OS1jUcQNjqr74ZMobUp2eg0imkTw9Y52/tI",
"ssYqdA/ISGH/eyIrPGYM8YD3XlzLxqtOxCrUuTM2AuJfSBKHTe5I9hfkEqgiKYYJ5sXxK+GQBYg+DPAs",
"WpFTwf2e9NyFMPaq9EXOYxDA2MnOulExc3FPE7mWvkt8hKEOxdhz6UKqIfhAtCpVvPvvsMJjCRsLkmfv",
"6Qdg/LU2gE3+7L02tXr34Ti8j9/fCe2rcq4OHB8cwqxHpXqytuAYJz42icUenmCO6fGccP7HTKjnFnPA",
"kU3mdRFlXTuFMT4yTopyxtfWxPmi97tXpu7iH7ISi1Zc63fCYpi0XhnLcVVlvzca4ZLj1x/E/S0b4suE",
"yZCGYuo4EUg/272fZMqz9/HnyBeh5FiQi3UXzMzpEMtHCx9kSXaro1NCVXYlz6W3L+vg0AHjk6jLXsdM",
"eR3U0AEPk82zbV3BrNugMgcpqLJztATMvupfmwT85LNJwJ9d+o0eGGfv+dcBQ1F08HhAGB3jW8aTfaiT",
"E0FxPx61BNMz9ug57qK+5wSmGNSnVAtJUWIA7vwkcpjEr66lqe31tXi0srKpMLU7+yb5IIOCJ7IWlFWt",
"F3KM7jaN8o/BaUJxWgy0blPj0G0XJQbccNFaoBiSdD782pqOSUW2lbnhxAPHSZbyeFTxc6YZqu6K2KiG",
"yybZpu7WX87yiduUo/kD5OGjQb5e180IZ9zGW8lKjnvcVPdleYtHCKthuHb7ZQ7R81g3jgsbk+vvCIFe",
"xElOUsrPu5UJaLiPKSnNl93Jnuf3597IyxjZimIfYnhKJJRclKOKJKNcQDxT3DXTp0RKsR/toxd8NfQg",
"/7VVrUrFAJax3BOHZmNYRedTbm2DxgVUUMrO03MC5cBLnr3B/119zRH86xGh+tok+SB1Y1TYq5BMlf3A",
"geMkVjjF74TBWlm9cH+KvscSfzElMwu8oKxWVAOV7FLGJqNUJbxN9YHzaxeyQi+lEV6v6KnBTMMmK6iq",
"ORWRvALFp2FFPU6wdKOCDpTePqgalIeY9GCvUVoB2M77O+Jv/Nl7+O8A55sU+A+2gmkFVaac+uSJXHHl",
"92N0+8A7w/p2x5H0+4w6Rc9fWU9Z86h6XzIawWxyU61y56yH9akYH/QYTe0xwIeveXgFvU4UH+uFGiH5",
"oRpJxGNHV308KNQmuhB3JebGBL90fmB5b+wfEbYPQ92xbxjmLvT92wkvCOuJ03DsJxyhGr5aktzDYfau",
"mKTQz7Oc9Sa3USbD5CNycEN/OLQT1pVoDf1CYLQmOLm8gecwL7VEJJqvdEDdonrMlSixqCQsQmbJDoGp",
"cCt1eiW9SugIrEhmI91vsoo2T6/NkhmdlX6rDAU0xWXwxYPa2S79EydExGy6XS5DnAMsXbPuNb7iMn9K",
"1ocXQuU1AHJpDVMzp/Wpt9q2Ph8L54ALwjqHMBvXqsk7yd88480e0clhuQyeWLBxGTQRXlzch25BFaXD",
"x33EeIjICca41TU4d4ufbBCyaextBEtcTNKVD7Oiwp7N7qStf5pDyJxzJELEGpnSeGnT3zvhJEdJcPlk",
"zKcc0WNygvz1bK8CfzTJHkKd94Fc3G0q45z+ov0Ba4R0UaXR2cmsUY8nJxzU9mNzDH+k5Z6RsHD1v1Lu",
"FM3LPsjwtaUb/MzMBaSs3cs3t0Zfa1Vjbls4kdZwSvkrFW6VMnDnS0/XcudBsupRgvkUpfgORj8ueFx6",
"dVf7WqkfmOKn6Ic35KP7sU294L728mgPl39BNwq3Ycr1SYbl+t/9jLjJIwL1KrvKClHk49Rf8YVWPuaB",
"CBjGn1KCmYAv4a8aeRUMi2vUdRC2DRcicS+1UNxWG69rVeSR4Fttlk0bGcSNdDflVLTpALpD1/RlI/36",
"1CtoRNEIV942bVDCOuFUI8kdwhZn5KxNAQ/WcdaCdI/A26kb5Iseiu+0A2fEPWVA0p6f+Lgz/+6HBOv/",
"f345lTKyZ8jHMiUcTFXD/nPAMuDordOhOzsxULCK+q2YtLGr/jRQVGLSFW1Yy9nLgqFjngMDooapqS77",
"rfZKSI8e61Fqjik9MmsOsmTG0jf0QtYk7oiNkgZdkC5E7eyWMoRgegfkjC9i9O3QRgRpFjD1rA48ilMQ",
"TuvLtMPUUdiJyW6he5hnpCTdh4J3W3Hdfe6MhNMqghU/ZHd7pzZQkHXgU5X60z6O1iWkv1IweBoJBRWA",
"MDtg+fYKPvUXVH4NuyE30iWwmO1WXEvdkDhIlDOs07uJ7LkwUlkh9dvPppCqOPELLTO6xjIYvojVaHDS",
"j8iLxPgQnDT0Klb/hxDcYVoGyknUT0fUSA7XJc0rV6+BFA6Q1L/f9dCaSQhF4he05mKxsUA2ICVdknGw",
"JB5GHxVcYSruz28HXcogHkFX3gL+kbEXXgl7zb8eX3B6Jz4CN0ptYwIEVD5jFY+pgBNAk7tkV/qEtWUw",
"jUM5udI3Tx48u9JRzvsImWO89ynlEq4o7kOWc+nJ469f/QvC1p6So06t2kY69pfO+c+5eKPesV0BLgVV",
"xxMgvP4nZ+u4EFQaC7+PLYWxsSbrHt4RJIcHZx4PsId34h8eVIZ6xh1NUHYA7783g4ilhKcROVUHH+Ex",
"5dl/Kd1NbW+5GTnG0RcyBLlcb6giGUyf86Mdi2fzQcHwCsuF4wCX/8+fKrEEIo5Cm3oXlEEHqelT8WJD",
"9uJjqkB9ehz+V60w7d+u/se7TfPFC1QD9sUC1f/exxVli88vzaXocT6kOI1F0KFJx3dpzbV2oDDBx6xT",
"ybJ3ocWdfcxRkuJuTrWpknCjseTsWx3wBEPfoAxnfzbsuOh4JwwgVtPE8gD+11b69YRMpU2wKIhGQwd0",
"W/c51cEarTkUfdeGNVXC32Um2FQB3J7GBqfQwIEI5JCAYhqdzLQFGSBia1+JbYvL0JxCEMp2VeIaaiBe",
"W3crYybbbmLLtVreACSDjcmbTE/CLImWBVESV18nDyCOssFXugeMnpCYDEMp12G0Gj0icJJn0AJriQmv",
"wuM8DgilZWO7HrSBUVZOeT8cNZrNGGYDhUApeyHtJMSF6XcsfAh0GWlN0E238mVjsUTdIM5o7PTE6rI0",
"2yghw7pTEU7MhUiGmorlERaRMXkWgYyfdMGfDFNVE7LCqaA+BkGiDF2qWU8tkqoFZuRvqAQdzzGIR7QB",
"Ql+zc0tMAvq4SiCN8yNApHNax6Jb+Sy16Q/9w/On38WgQmXqaJqw1/1mnGaV8WYBi1zwAgkvuk0xj0vq",
"iQ5ig23hStrZdvAgQ0jOxXPNOI17BF2UtSAF7Ua04dpbwzuNgt4ixtfAcYExGbF3KpwP6+4mlwE+GXkH",
"vcOxkbWqSEmlfSQsKdoXH9ISqs6Rj7vp0xVORZwkZ84b6JOaqwti6htHtWflR5bQmAquDaF/kanXaBdA",
"N7aN1FXmCgJjQxbN9+jbJ394LFrTwFnPcpJknTOkQWBfoFP2I9460GHxaTKWgwhzcD6uxopILr7I+W8l",
"qdWYRA4iRYHkOuVt85bUbju86xq9DD4dGiMaaeqOwgpvxbXkC4BvErvAifJ1k18vj7LpATOdv8PqjOSo",
"UaPuovMW33kqNZMr+zgacpVK/CIVjqcpvzPPWesR3VPJa5M3toe+1A4+9HPxIqC2zgH0fJCIMZi+bbe4",
"tm6BUx9uawzV3A0wkqeZkSHye8DmOr9aylmH3epjI83LWfIwcriabbNH72c5Ro05JJwMUchcmdw/iHc4",
"gZm3hbG381k1stVXs3QSxtP5MRLzHBnhWVR3ERLBx72xgOZ38X7jITPMnHDoRM6r81HApud4CTQak1IG",
"qrH0f/xWLNfSyWVQDm9bYlLJCtWd6/lYRqhm9H48AfhAPMqO8OPzOCFrgs0ZiBEPN+d74TxelumDwsV7",
"geSmf5/DTJUB/dtfcCIkbSoTZn8bLqGavTuFpqdvpQNuHXj4iM6wspf0efbkFff0oZye8fP5J+/TkxPg",
"Ml14hdSnwgs9WHqapdWPt6V14lHC5ccUKE6p1r9u9+axZHaKizvNiUQ5KPMXrDsob72QgkjH6NaKJXf5",
"7h3X6YdGF4lWJ5axkGpHmqVqcJinMAAHtH4h997IAwGe3DIYzNev8I2y6ucXvlNAW4+BSVz9PqLWUbHM",
"bXKSm2En3pUyiD1mJfinqkkRPReXPHQ2nTzMDs9yKqY2ZYg9KFtN3vYvvniEEcO8HCr2lZOoLdGMA5nd",
"rAsFdFPvttZHPp7+WEDTYSW9WGKv7gVaQEthWqwR0AV75IEelbBgFN82cIX/8ObNq2ool3cysXWZpXvC",
"UPcqrvXzpAbmFAHH5q2iuX39RA9FAki7sW3DgTQDb+SN8mwYjgFg0RH4EYXjxrxRntyEuRHa/x7nNXMy",
"CU1z9fgulAE/bU3+cUdPEv8dR15jvRxlYjl+QLISysT7OI8sOyYCII7zcZfZV6J0rt6Xc5bg5u/t6bBR",
"ewrDnLy9lxm1oopNVVQs8IEWMHBmGwJkS/ahcyGBtrz8kao+se5KbrcnntwdkO1KarCwa5RfKwViPk0r",
"s2+hTraxsvYkfsddEkvp0K1FCi9NfWXfCbZBnl6qZet02J2+so1eUlRaLEC1VSbqJFGjw1Ft7NDW7MRS",
"mpMg5DJEMDx99SJGhsO0ldtj/Xotb/8rmYR/c/ab/zYrfVI6j/qbvUlkUhH2RKApwrCo/0EusF2tlA8L",
"vqlTDGa8y7ua7PRxsN23/M2C+1BQhx0/nFNbVEAlj6B4N5RyFPG8X+P6voDAE+FWf/13/THMYfIoxKYV",
"qnW2ymXhUT27S5Eze/0ZGbPXd+LL/mXYskIlpkJu5K+9HlJPvpioDvX1bMWhBAumv5CpgMku7FaHKLpv",
"tqGf5KWc+YAzJj9oshbu/cskWD1G/s4cvP81hO5IGo8irKnx0IAdZWsZnRbYotDhlQebruoCdm+VUykk",
"90YBigWwcPozkL5Lszx7bz4cJ3STGcrZ2+hBnpS6Mkymak9w+Cyp2nm0Y2lRAvy/APGPU4X9OgOX5gdT",
"SZYFQnP3BJYHMsnGlKTsVV/KgJ0lns7dv09iHHUUBDklQZ8WoyYdEEybVvlhB9R2ac1b5TxiHUcK+2Bt",
"SpHcD8Z9q0xtHZtr4zDoXk7iYEamTnKqTlHjg5y2VGgVvRP2hWKgPwbXnWHLU5xTtB92eQhwTbF/GURX",
"lbict/t7624uu3jm/85Me5iwZ1XdHtQocFT213LltYwDyUqwaeXZ59yrXyF6AwtLM440HDFvjUouNAmt",
"OGFENDqBWIZV3Bw2V1hnkuGColoF56PziqNqiSPNvnQ3WeW7h+JsshE+eznA+yasHKBcUG6jjWz8F/AA",
"jUadOIcJBpeddIAoS1MvdF2VqhBTIRhuhDRxt+2c3To1rl9DPRjKwVTvOhe1NImAWmccgTo7obDdsSMS",
"BfNeQofT6cClv3nDXT9USnDu/oulBU/rm5LKImi/cDxbwvWz9/HnAQvED9KsiLBlywBkwz0fi1NwnY52",
"/BAJwK/up82Z0HH/oq4u7fJGBQ6ZII/NzGsyEvAIELTf6n9Su6VtQIOJzDixHqQfZw6DRM3beEukzaUb",
"YqkM6Ja3ThvU+YYYX2vbsG1ZKIWTpTwEgDbwgAOTotcYjUkVm3g0NBgUmrIhB6aOXqVYgTa9XNumptxR",
"6Yjof3be3pEWqHc6+pPTOtlL9ZaoTq3Et0+ePEmEApoDJofWpzhfJf3eWJEMH44IF4EN2Eti94blTcT6",
"wW7ev9OhBv2bJ9+MEe/yVoeIbACWDg23zga7tM2/h0q8LON0JOeTyGx55b9JHUBWkq/TtEIVNWf/mWLf",
"0dLIEbFVltEIjm50ME8dudZwcSRhXSQpyKN1JX3m4kcZlBMKC03Cuak5YXymYsDeagsmKGIBJ6QIPkG9",
"an4PqHHv1/MrGHgAciat4OuX7eNMz1xrDtXfo7CI4SYBwpAUzUWZtReafH3BN0gbrl8RCDidNImBKIQX",
"jCFBxVQBbhd7k3hLqc02ALsWpW7onB97Hp1uEE/dAubFXA4gws/Ft0++ZWTtOtZYI1US1k5gV9zx1+2D",
"ZmXPh5kyFuDZivvwNaJWLixMp/fLKA2lv+jYjMautKF711Mx+I7Pr2hn+eO+shKubMCabt+9sI6zXXQS",
"hJ+zWzvb8YYBWBolgytnZb2UPsScC1u5A7t7yr/HreOtDbrGyej9BJKHJEzZRA4x2b6XnjUe4v12nV9S",
"q8+hSI2jsfh8jD6V0CouhgUyvllSu85vrAiBs/fwbsDul0qQTF81e0qQiDeSfColk0Ggh1kiiKXd7j6G",
"xZ8kW5+DZn2XqPwU9mVb010JD0TB8L9PofGK2mJ0R+HiLL2bLzmXZWsiXSygn/YpBgHuzG9EsOKbJ096",
"MQgZVkTNF2FHb5whnpDCg3KZ6CCcgvH8YF7B4jSAhunlWmxajwFQ4kqhCsPQPRzrvfUCoG5j970HtCgK",
"3Cgm0m1zpDtCjoERDmf2+vQKkSm0/XxlakYkbsJEFDDAd8BMfjVK6g8f/tcA",
}
// decodeSpec returns the embedded OpenAPI spec as raw JSON bytes,
-1
View File
@@ -52,7 +52,6 @@ final class Overlays {
var switcher: SwitcherModel?
var leftTab = LeftTab.lead
var leadFocus = 0
var projectFocus = 0
@ObservationIgnored var pickerFrame: CGRect = .zero
@ObservationIgnored var menuHover = false
var paneFrame: CGRect = .zero
+9 -8
View File
@@ -10,7 +10,6 @@ let tabLabels: [TaskTab: String] = [
.page: "Page",
.terminal: "Terminal",
.workflow: "Workflow",
.project: "Project",
]
struct HalfSplit: Layout {
@@ -191,9 +190,13 @@ private struct TaskPane: View {
VStack(spacing: 0) {
TaskBar()
VStack(spacing: 0) {
TabStrip()
TaskTabBody(tab: store.primaryTab)
.frame(maxWidth: .infinity, maxHeight: .infinity)
if store.selectedTaskId == nil {
ProjectView()
} else {
TabStrip()
TaskTabBody(tab: store.primaryTab)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
.overlay {
if let sheet = store.sheet, sheet.owner == .lead {
@@ -239,8 +242,6 @@ struct TaskTabBody: View {
TerminalTab()
case .workflow:
WorkflowView()
case .project:
ProjectView()
}
}
}
@@ -377,13 +378,13 @@ private struct TabStrip: View {
private func info() -> Info {
let tab = store.sheet.flatMap { $0.owner == .lead ? nil : $0.tab } ?? store.primaryTab
guard let taskId = store.selectedTaskId else {
return Info(order: [.project], tab: .project)
return Info(order: [], tab: tab)
}
let run = store.findTask(taskId)?.workflow != nil
let team = !store.team(taskId).isEmpty
let order = taskTabs.filter { t in
if run {
return t == .workflow || t == .project
return t == .workflow
}
if t == tab {
return true
+8 -56
View File
@@ -8,48 +8,22 @@ private let refreshKinds: Set<String> = ["task.merged", "project.created"]
struct ProjectView: View {
@Environment(Store.self) private var store
@Environment(Overlays.self) private var overlays
@ViewState private var todos: [String: Result<Todo, ApiError>] = [:]
@ViewState private var off: (() -> Void)?
@FocusState private var keys: Bool
var body: some View {
ScrollViewReader { proxy in
ScrollView {
if let p = store.focusedProject() {
ProjectBlock(project: p, todo: todos[p.id])
.padding(.horizontal, 16)
.padding(.top, 8)
.padding(.bottom, 16)
} else {
Muted(text: "No project selected.")
}
}
.onChange(of: store.selectedTaskId) {
if let id = store.selectedTaskId {
proxy.scrollTo(id)
}
ScrollView {
if let p = store.focusedProject() {
ProjectBlock(project: p, todo: todos[p.id])
.padding(.horizontal, 16)
.padding(.top, 8)
.padding(.bottom, 16)
} else {
Muted(text: "No project selected.")
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.focusable()
.focusEffectDisabled()
.focused($keys)
.onKeyPress(keys: [.upArrow, .downArrow]) { press in
step(press.key == .downArrow ? 1 : -1)
return .handled
}
.onKeyPress(.return) {
guard store.selectedTaskId != nil, store.focusedProject() != nil else {
return .ignored
}
store.sheet = nil
return .handled
}
.onAppear {
if !(overlays.window?.firstResponder is NSTextView) {
keys = true
}
off = store.events.add { ev in
if refreshKinds.contains(ev.kind), let projectId = ev.projectId {
load(projectId)
@@ -57,9 +31,6 @@ struct ProjectView: View {
}
refresh()
}
.onChange(of: overlays.projectFocus) {
keys = true
}
.onDisappear {
off?()
off = nil
@@ -79,25 +50,6 @@ struct ProjectView: View {
}
}
private func step(_ by: Int) {
guard let p = store.focusedProject() else {
return
}
let active = (store.tasks[p.id] ?? []).filter { $0.status == .active }
let rows = nested(store, active).map(\.task.id)
if rows.isEmpty {
return
}
let next: Int
if let i = rows.firstIndex(where: { $0 == store.selectedTaskId }) {
next = min(max(i + by, 0), rows.count - 1)
} else {
next = by > 0 ? 0 : rows.count - 1
}
store.sheet = Sheet(owner: .task(rows[next]), view: .tab(.project))
store.focusTask(rows[next])
}
private func refresh() {
if let p = store.focusedProject() {
load(p.id)
+4 -7
View File
@@ -3,10 +3,10 @@ import Observation
import SwiftData
enum TaskTab: String {
case transcript, board, changes, files, page, terminal, workflow, project
case transcript, board, changes, files, page, terminal, workflow
}
let taskTabs: [TaskTab] = [.transcript, .board, .changes, .files, .page, .terminal, .workflow, .project]
let taskTabs: [TaskTab] = [.transcript, .board, .changes, .files, .page, .terminal, .workflow]
enum JumpTarget: Equatable {
case question(String)
@@ -470,10 +470,7 @@ final class Store {
}
var primaryTab: TaskTab {
guard let id = selectedTaskId else {
return .project
}
return findTask(id)?.workflow != nil ? .workflow : .transcript
selectedTaskId.flatMap { findTask($0) }?.workflow != nil ? .workflow : .transcript
}
func openTab(_ tab: TaskTab) {
@@ -661,7 +658,7 @@ final class Store {
func selectTask(_ taskId: String?) {
if case .task(let owner)? = sheet?.owner, owner != taskId {
sheet = sheet?.tab == .project && taskId != nil ? Sheet(owner: .task(taskId), view: .tab(.project)) : nil
sheet = nil
}
markVisited(selectedTaskId)
markVisited(taskId)
+5 -5
View File
@@ -17,10 +17,10 @@ func runGo(_ key: String, _ store: Store, _ overlays: Overlays) {
createTask(project.id, .init(), store, overlays)
}
case "p":
overlays.window?.makeFirstResponder(nil)
overlays.projectFocus += 1
if let id = store.selectedTaskId {
store.sheet = Sheet(owner: .task(id), view: .tab(.project))
overlays.switcher?.close()
store.sheet = nil
if let project = store.focusedProject() ?? store.projects.first {
store.focusProject(project.id)
}
case "l":
overlays.switcher?.close()
@@ -71,7 +71,7 @@ private let shortcuts: [(String, [(String, String)])] = [
("Anywhere", [
("⌘K", "Switch task, or create one"),
("⌘N", "New task in the current project"),
("⌘P", "Open the Project tab"),
("⌘P", "Show the current project's dashboard"),
("⌘L", "Open the Lead tab and its composer, closing any view opened over a pane"),
("⌘S", "Merge the right pane's task, or discard it when the agent suggests discarding"),
("⌘[ ⌘]", "Bring the previous or next server's window forward"),