@intentius/sql-yodeler 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -5
- package/dist/brand.d.ts +12 -0
- package/dist/brand.js +14 -0
- package/dist/brand.js.map +1 -0
- package/dist/ci/render.d.ts +7 -3
- package/dist/ci/render.js +36 -14
- package/dist/ci/render.js.map +1 -1
- package/dist/commands/ci.js +5 -0
- package/dist/commands/ci.js.map +1 -1
- package/dist/config/define.d.ts +16 -0
- package/dist/config/define.js +7 -0
- package/dist/config/define.js.map +1 -1
- package/dist/config/load.js +16 -5
- package/dist/config/load.js.map +1 -1
- package/dist/exit.d.ts +1 -1
- package/dist/exit.js +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.js +1 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/report/render.js +4 -1
- package/dist/report/render.js.map +1 -1
- package/dist/schema-docs/render.js +4 -1
- package/dist/schema-docs/render.js.map +1 -1
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -1,8 +1,28 @@
|
|
|
1
|
+
<p align="center"><img src="docs-site/public/brand/hat-160.png" width="160" height="148" alt="SQL Yodeler's logo, a pixel-art cowboy hat with a database on it"></p>
|
|
2
|
+
|
|
1
3
|
# SQL Yodeler
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
Declarative schema migrations for ClickHouse and Postgres. Declare your schema in TypeScript, and SQL Yodeler works out the change: it plans and applies it against the live database, or writes it as a versioned migration, behind an approval bound to the plan. Built on chant's `sql` lexicon.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
// src/schema.ts
|
|
9
|
+
import { database, table } from "@intentius/chant-lexicon-sql/clickhouse";
|
|
10
|
+
|
|
11
|
+
export const db = database`CREATE DATABASE events ENGINE = Atomic`;
|
|
12
|
+
|
|
13
|
+
export const events = table`
|
|
14
|
+
CREATE TABLE ${db}.events (
|
|
15
|
+
id UInt64,
|
|
16
|
+
kind LowCardinality(String),
|
|
17
|
+
at DateTime
|
|
18
|
+
)
|
|
19
|
+
ENGINE = MergeTree
|
|
20
|
+
ORDER BY (kind, at)`;
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Each export is one object in the database's own DDL; `${db}` is a reference, so the build orders the objects and checks them against a pinned server's catalog. [Declaring the schema](docs/schema.md) has the whole form, both dialects.
|
|
4
24
|
|
|
5
|
-
SQL Yodeler is built on [chant](https://
|
|
25
|
+
SQL Yodeler is built on [chant](https://intentius.io/chant/), a declarative infrastructure-as-code toolkit in TypeScript. You need chant's CLI (`@intentius/chant` on npm) for two things only: `chant init` to make a project from a template, and `chant emulator up` for a local database. Run the CLI as `npx @intentius/chant@latest` before the project exists, and as `npx chant` inside it, where `npm install` put it. You approve a plan with `yodel approve`, which records chant's approval for you.
|
|
6
26
|
|
|
7
27
|
## Getting started
|
|
8
28
|
|
|
@@ -18,7 +38,7 @@ export DEV_CLICKHOUSE_READER_USER=reader DEV_CLICKHOUSE_READER_PASSWORD= DEV_CLI
|
|
|
18
38
|
npx yodel new init && npx yodel lint
|
|
19
39
|
git add -A && git commit -m "feat: the first migration"
|
|
20
40
|
YODEL_CREDENTIALS=writer npx yodel apply dev # stops at the approval
|
|
21
|
-
npx
|
|
41
|
+
npx yodel approve dev # shows the plan; type dev to approve
|
|
22
42
|
YODEL_CREDENTIALS=writer npx yodel apply dev
|
|
23
43
|
```
|
|
24
44
|
|
|
@@ -26,7 +46,7 @@ yodel refuses an environment whose reader and writer are one user, so dev reads
|
|
|
26
46
|
|
|
27
47
|
For Postgres, use `templates/postgres` with `--param name=app-schema --param schema=app`.
|
|
28
48
|
|
|
29
|
-
Each template gives `chant.config.ts` with a profile per environment (`dev`, `prod`), `yodel.config.ts`, a migrate Op per environment (`yodel apply` behind a gate bound to the plan digest), a `WatchOp` per environment for drift on a schedule, and pipelines for GitHub Actions, GitLab CI and Forgejo Actions: `yodel lint` and the plan comment on pull requests with read-only credentials, `yodel apply` on a push to main with the writer, and the drift watch on its cron with the reader. `yodel ci` (`npm run ci`) renders the pipelines from the installed package, so upgrading yodel and rendering again brings its pipeline fixes, and the project's own jobs, declared in a module `yodel.config.ts` `ci.jobs` names, are kept. The parameters are in each template's `chant.template.json`; the template's README covers the credentials and each forge's setup.
|
|
49
|
+
Each template gives `chant.config.ts` with a profile per environment (`dev`, `prod`), `yodel.config.ts`, a migrate Op per environment (`yodel apply` behind a gate bound to the plan digest), a `WatchOp` per environment for drift on a schedule, and pipelines for GitHub Actions, GitLab CI and Forgejo Actions: `yodel lint` and the plan comment on pull requests with read-only credentials, `yodel apply` on a push to main with the writer, and the drift watch on its cron with the reader. `yodel ci` (`npm run ci`) renders the pipelines from the installed package, so upgrading yodel and rendering again brings its pipeline fixes, and the project's own jobs, declared in a module `yodel.config.ts` `ci.jobs` names, are kept. The parameters are in each template's `chant.template.json`; the template's README covers the credentials and each forge's setup, and so does [Setting up each forge](docs/forges.md).
|
|
30
50
|
|
|
31
51
|
## Documentation
|
|
32
52
|
|
|
@@ -89,7 +109,7 @@ export const op = Op({
|
|
|
89
109
|
});
|
|
90
110
|
```
|
|
91
111
|
|
|
92
|
-
`yodel apply prod` stops at the gate
|
|
112
|
+
`yodel apply prod` stops at the gate; approve at a terminal with `npx yodel approve prod`, then run it again. A script, which has no terminal to ask, runs the `chant approve migrate-prod approve-migrate-prod --plan <digest>` command that `yodel apply` prints instead. `yodel apply prod --plan` prints the pending migrations and the digest without applying. Running `chant run migrate-prod` directly needs `yodel` on PATH.
|
|
93
113
|
|
|
94
114
|
## yodel lint
|
|
95
115
|
|
package/dist/brand.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL Yodeler's logo, the hat, for the pages yodel writes (yodel report --html
|
|
3
|
+
* and yodel docs). It is inlined as a PNG data URI, drawn at twice the size it
|
|
4
|
+
* is shown, so each page stays one self-contained file.
|
|
5
|
+
*/
|
|
6
|
+
export declare const HAT_PNG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGgAAABgCAYAAADxTzfMAAA5MUlEQVR42u29aZhdV3Um/K619xnuUPOkUmmWrFmeZLCxwbKDgYQpkO4yIU0CIQGSMOaBjCSRRXcnH9+XoTM1/aXzJCEJHdpFBgIOMWCwCXjCgzxJtkZrVs1153vO2Xuv/rHPvVUQ0kAG4TZ9n6eeKl2Vru496+y13/Wud72b8H/AY/8+6AP3wHzw6v7/sHpi6M9Sa9zCUnOm1pQHFmrpXzx0vPo3h4AUACYBNQU4AILnwUM954OzH3zgo7C/cuXgm7fv2fh73/Pyy2lifCDYsG6458S5yvaZevq6ob7wtXtH4sreMJj+WD2tA8B+gO/59oJE+wEenQTv2gU+dOj/BuibPm6fhHrXR+B+YVvp5hfevGfqFa+7rpA02qrVyOiRp87JfUfnBax0GKhxYv73aYC37hkMZ4cW0ic/Cth9gD71TYIkAGEf9JdOw90NyKFD/uufGeR/9Yd+rgZHALoVwJt70T++eeR3bnzlC4QVXJKmfOH8HL769Cw1DFFJQxIHAUQCxUMB8R8NbSj96Kta7gN3TLce7KS9nYAc8KnPr5b9IBwACHC4BwYAvX19uI1CbEozLp9otP/uwCzqAGj5Lf3fAHUfU5PgqSnYD10z9Lbrb9y9O4y0TRPDtVqCINLIyF83JyCIUMAEASQVuLgYvUQF5u5bS/yb9Vrj96ZmcbGzIrAPfOAemAMH/AV/xxg2TKwbfmfcG28jpV6dpimliUFfIzq0vs/+6Z8eq3+4E9TvRJDoubp6IIL3b+sZuvZFW558xb9/0YgRRXGpSIcfeQaV2QV8+t5TOHi6hkLAUCQIGSASsH8Jy0wqIqDdTg5Zi/vaJvvwHefSo/mKCrftKO5Sxei9o+PD33vN3o1jPeUIjx2+gHYrcXOVpswvNdVcPUG1Yf568WL1Jz7XwOx3YiU9N1fQfhARuV+9aeK9V1972VirldkgIlaK0dNXQnVmHpvGevDYqSqMIzALRPx1cxAQoKwTaYGsDqOdStxONvpNr14T3tUXyalrNgxsHx8fuGnnVVtodGIEi7OL5onHn6Usc/zMdIufPl+DE3GR1rZQ0K+PhjE0ub76MhyCvdQI8bkYIKIDcO9c3TM0PDrwU+XBHklaKesoBjGjd6Bn6bST8qY1fXrk0DRmmw6KABEB0XIeIhESQFuCM44kNS5aVVKvvH73GC6/dge2XbEF4sQ8fN/TfOLIGc1MeORUBUcv1BEFDCZwaoUtUVYsRjcu1Ms//XnUP5zDeHupLgY/B2seBQA9vcnbd20bG9BRaJ2A0lYCJw46Cvt1GOhCHGDNUBHGOlgAxhFIBAKAiQBiJEaw2LCcplbdsH0ofeubrq+85k3fY3a9YJtkmcVdf/+QPnHoJDsQ7jk8j2Pnq4g1AeIgImAInHPaEtlCUPiFF6/u2ToFuP2X8Lo951bQoVGIAPTb68Z2DE8MwhhLrBRMlsFkBqXeEqJSAabZwvqxXjx2pgYnglQEARMYQGKB1BFiANuHg/R7rt/ML37pVWHcUwo0K5qbqVW//IVHSrbZVhyH+ORXL+BiLcNAzBBxPsiAT5YQcs4hCrkvavN7ALzr0CUM0HNtBdEnPkGWABkeG7h+zaYJStoJMQPOCdrtFDoMEYQazgGXrenDaJFhrU9vLQMsJEA7E6wrIbn1pk3Z+979ffyyf7ePgjiGZkUzs/XkC595yNlmQnXLmHrgPGZrKUqhQtP61yASCMnyViPCDs4Gmn50b0/h2inAXqpV9JwK0O2Tkywi+OCe3jfu3rtlHQWBFSvsBGBinHjqdIO0Mmu2b3ICccVShC3DBRQUIXVA6gTDyuC1Vw3jLT90XfV73/hSt2rjhDaJUUGhYI88M92469MPRGRNf8OA/+bBc1hsZIg0w4kDQ9A0AusILACJgP2+RgwiYlVM2ZUB4NAlQsDPuRS3H+CeVf2v27hjfcBxZIgJEIGD4NSRUyVViOw1N12DpYtzNHPiDK65Yg3Ozh/BUsti74a+9CU3bKtu2bt1eHh0YCRrZ1DMsDqo3f3ZR6fPHr+wplAIkFrgLx84i3pqEAYKTgQQQCAgIigGmAQAwQkAIhCBrUCUCi4ACXZeIiT3nAmQAERTn7DXAz3vXD/yskJ/GVkmKohjuDRFs50BRDjy6BFZv21jbcuey/rJWfQ3Gnj1PivNetJ+6StfaEa2TAxQZmGtkzRz2aMPHtGL87Xs/OnZTaViyCLAXU9Mo9rOEAcKVvKdBgIrQMACBuX7D0DkI+FAMNZSNUkYAA58t4GE23KE/KI1he39fYUeYhYRAxUo2AQ4/sw5GOsgVvST9z8e3Piq65rbr95ebNSb2HnNDgJzTEFILrVZvdJMzp+dKx576jQtzi6BFA/29cRYrCf4+4MXMFNLEQXsV47fY0D5imEAIM73oGUCwSM6EZWRvZTX5TkToF2Tk4SpKazd2vczm7eu1cRsQaSiQoza7AKWluoAMVRAOHf8nL7/cw9VxsaHiqX+XlGK5muV2lD/QG/zsa8eaS9ML7SrS41iGAVBVIjABNSaGT5zcBpztRSRJl/Ykk+fHrUxCD61MTkYobyuEohAGCAw1U0QLCBNLxmj8JwJ0OTtt7vJW0kNxKOb1+5cL1maEkQQlYuwAljjoJSCEwcVBNHJQ6dGjz5xEmEcEUTCLDNgrbU1pi/QajAqRAARjDUohgoPHZ3FdKWNYsSwTvzOL/5LsLz/hApgBnSHmXAEIoLkuc6J0HfdChKAiFgABG/4ycK6uBRRq2UFEOg4woXpmoiAwAQxBGMstNaIQoZzDgTq1UEAAUIdhhARESfUrWScA5yDYlne9PPUJisZyS5qI1/sisD/hgcLzkmz3WzWLuW1eU7A7KlJMCD04Revmtx21WV9Ttg5JxTFEapLzaWLp2aXwjAAQOIRFcE6gXU+BFZErLUQ53xAREhE4MSBmJFawUA5RCnS6G47+aV3+T4jeeDY/8nvSQQQMwQQ6xyiQKd71g71fdcFCJgEAOkd7vnR7ZdvCqx1wgRyRO7Y4yeQZWbAUXdBgLUCON9H/FPErEDEEOe6+wsTgQmwTlCIFDYOF5AaC9VZQfCrpQvXQGD2X5RfHCJAETizYuOA1yZJ+l/yd8zfNSnuDZ/4hP3jfYh1qTAozM5ZR2EUImlli2ePnXVRFMCKp4A6F1UpBWssnBMwc359fVoi5/x3JhD7ALVTi1W9Ic6XAyw2LQJF+b6TpzwRKAaKARD6ZeT3J3EACKklMQ4w1i0BwMwlKlS/4yvo9kkoEcHppfClW3avuZxD5VyWMSslJw49W2jWmwOOFUSESClQ3qgTEIgZvpB16KQ+IgIpDSgFIfI1jfg2RBhobBwqgkg8HZ2/FgMQImgSRKqzaigvWgkOhMQxQAxLbL+rUtxTM/5OLJWLGybWjgDWktKMViMxx5961gRBoJ1zcM7BWQvWGqwUkFf/WikorcHM8PuOAM56RtpaEAGZsSAQUusw2heiN1RwzqM2Ed+qgAj6I0AzdwEEQcBEqGeMzHm0FxDPfNcESAA6cA+ZNwP9G/Zse9/olnXSbqaso8g989gxW1us9QoRnHVgpXylkl/YTlpz4u9+Zy2IGCCAlQ+WCMDMsK4L0gBmrB8p+gDBo7bO5lbQvvZhzr8T4ERQTQRMvimYipjvmgDdth8ECAYGMFHuLW4JIs1MoKSVJaefOd0MQg3rxJcgzqcxay2cNWACWKnu3Q8iiDgopX0vh/w+JdbBGIcON22cYNVAAf3FAJmRTiHaDRbnLQsiglaEeub/DeUBDgmL3zUB2nXIZ5OBkWjV+JphgZBVQYDzz14sNGrNQSiVby35viMOlKM3J507X/KA+CA6Y8D5SgL554213bJfBAgUYe1gDMqf5bwNy3nKY4/cQALUU09ni4fvsNZ899RBT+3cLwLQ6l2bfmzrlZvJZBk54fTIwaNNv68oMLMvIDknY/I9o4OuQIBY21lEcB2YnUcjsxbt1HRXBZwgNQ7rB2Os7tUwvh5GUQMhCzT5oAcMNA2hmQGKPVx31qKZOfmuCdCHPvQhR4AUS+GVUSEEc0gXz8zPLc1VRQcazvnNgxWDiOHy1QIiSL6xKKX8ngOAlAYp7lb/oVaYq7RRbRlonQMLApx1EFbYOFLCWMFD7f4ICDXBieQaB+B83aGzGJ3zdFw54IsAMHqJuLjvWIAmc3j9azeMvn7D+v51rUbLkQqzYwefKTChZK1ArEdjlDPKRORrG2IPDJz1YhGt0dkkmBgE8l1RAMYtUznSrUn9XtbXE2PdUAEb+hg9Be1JU8UIFTDdELRNJ+3lNwWAirmkKPs7F6CdM/sIAMIoePHwQKlUn6+gUa83F6cXoMMAECtwNt9jPJfWEYP49CbdfQnOdWG2QJZZAWIY6zd4vyVJt/ZBDg6GBvvQU9AI2YOQWBEW24TZJqCZuv8XAWQFCMELAJ7/Dbtdo6MyCYQ61LsQBWhX6nLm9LxzhEGtFVwmxIH2l9Z5mO2cIA4YDhrGiE+BklPS4BxedxYMQfJ01iEZIDlC6wAN5xAEGiODPZidX4KCoNoWnKxIzvMsd4R8fB3E2ealbNh9R1bQ/v3gW6embHEEO8dXD7wiLMZotRJ17uSFPmIWiG8tMHuoWyyFEOvAAM6db2JxMYUIIYoCFIshCoUAUcAeecF5CjQvZF2ul1tuKsjKiw5rLaIwwMToECop4ehiZwfLwUjOOJDn9KR+ia/Vd2QFdeC1EvSWiiFYk2snGaeZVcwMJ5BQk4OQqlcSnJltWsScOkI4sI7VwlwbZ05bZC2HgBRKpQj9PSF6yhpRxMjSHFaLeK4uJ0c7wkby7KpnG5xfZZoJ5xp+zwryhl6n9eCZICISqYdOL+SjSM//ht3mLWO3jE8MAA5iMgtrAa0JsSZq1Jrq3HTVjm4ceHjvDau3XnGtLhAl0tsvEEOoVA2mL2Q4/2wbZ57NMHsuwdkzMKOFols1FoVMBDF+JSn2vF2H6aYOm73ie2oMrPWozQnAndDQMuvtALSo+bzXZtOtU7B7geLAWO9PDA73wJiM0sRAANGK6aGnLl4IIvvZH/ulTT8wPBYO6qLpk1qdnDikdQLg0Fsk9G9T2LarDBADqUW9pbPP/Om0Of7okoyO9kf9vaFPcXkDTnhZCGKt7dJFlCc+28EeK3hqAuV/LyCgqRpoPa9R3P7842+KMdzTExeEFawjaicZCOLECR451njkg3f8j98cHWuFWje2tGcqLk0hJlMQ8jVPlgGthkFryaE9nyCpGcTUKkz+5EjPq94xZi/Wq5ieayEMVM6rCTTnnVIItPZ7nMDXPZkRZC6ne/x8RYenAIgkJyYaIdB+fsPs/f5bqYC+QjEo+zRDlGUOWoFnFlP7oivs1fjMy9c0hV/lsjSLS4HSikjgrBPlBIGAFFhFYBWAOICAkSVKmnPW7bkyLL71pyfw8LMLSStxrhBpcE7pMAGw0m1bEDGYCMfn2sjcMkT/2vTmgaKx7pIJFr/jddCOK9e8f9u21ciyzDknMJlBIda0ULMY6GuNQ6c/1zzz5QdYntmcOfsFsKvH5UAVIrBSmgTsBDAiRgSuc1EpjizXZhp21bg17/jZdcnUo/OWnPGrpcOrMnnyVTq1lKCVmC6YwAqkxyvwnGJZgEcIl2yY65IH6MCH4PbuRVAsRzeXyxFMZuGMhbUOmoBmZpUlY9AX3FgoXPnfWxOfo3Dr/S9V4xs3mrb5qHX2qLNZEheE417oMHREZKCkBegwdWH/6Z7tr/iLpUMDHzv+5XPtWmKpWm/7cqoDuZmXGVIIQIxczQCXc3yS94OWlxLBgg2ezwNckuvSKw+jEK7jXhAD4shYh8xYlOIQtcTi8iGrXU1Ej27YGjQevrd99kP/f3LwD/8y2nPgfeh/PavGX6y1S09cJcmJzRTSmwEzHay9ct7MVLNGde29j/7Gb6wpJY2XPHWEhqOgiChQXdjdHU8BdVkFJ55AVcw+9XXg9Qo5cB6mZCcQTgLmwPMRZk9NgjEF++MvGf+RXbvW9hkRp5Ti2ZlKLodilIsK5Z4AzJmQ7m3qkCekVnlzli3+TPrUL7WM+eAhUeWnVTTypJiRz/PaF16bzF88ufjlOzfOHj8Xts7P/7RJeUTHDvOuiIgcwlDDCq2geTrdO8/ZOedytCfLd1LeWc2fUWByWvH1tqSuP9Cwd1+qQa5LGqDJnf7zForh6ydW91JqxULASWKglB8jGR8u4uc+sQ5DGxcaL9g+WoAwnK2fd7DjTG60WFCjoOZNoGeR1I6i8tm/rWV1tc1OZ+sCQ0hKCjYVJJbcYku4oAHNgHEOzLSc5nJeTjHDOYGxvqDlfDcTCGSF+idfeBwLLwEWU8/DPYjoQ16GFgRqWFhBAHbOwWTW91tMhj96KpTWDe/GLfs30mceoKfQFxyMooZlxXG9BbdYtXapAlOta9tuC0JNPUyyriHaNYwSY0UCJSjGxNVMoxyxbzX4lkHOdK+86j7FWSfLwfBynm7bvBMJ4wR1Qva8RHG3T4IhoA/uKU/u2Dmxg4LAQogl58u01milRuaSiEpr9lz83jfe+qlXvv7P17/57X81f+TYiQ0SFLl/kHhg0Kn+HqMLYaZIUiSWJGTIYMnwaI8lUqCFNuFXvlLAfFLEpn4FKwTNnDMKvl1BeRtBKUYrdbCdGogICpTzeshF9d3IOZORe16ChFy9I3B212B/IXDOGYJF0s6QJAalksZcy6ImBVc9XS2vv/F17b/46mvvfc8P/fiVf/vp2tjY8Gq3a6PlqzanuGKLwfZ1wCC1MTTg6O8OF7CwWMLMXAtfPR3jC6cGUY3XYa07jZFCEwDBOeNFJQI4Z/0ek8+hXqyk+eiJl/hKDq8pBwtCnotzkAYH6YKn4p5HIEEAuu0euB8sYWzV5onXl/rLyNKMtdJoNhuwDgiVQiUBtXUvCprK03NLb3xCtl74z39356FPfeoLC2eOnJh48ORp+bs7z1B2+yxK3MB4uYTda4dw8Fw/nr2QQXrGQayhR2LhdgVL8w262EixThFSwzDWS4G7ICFPb2k+Qil5PqOuPBJ5L8jvSs65LGnAPO9W0G37QQcOwL0lxrqJVf2Xx+VYatU2WyHMLzRArABxWGpYoGcVaSbpLQfx6dn6xlPn3cYTi30oXbYPO14YUhAKsmYd1bkZnD38LO44dQHFXRswvNugcfEsUDmN9PTDRGEJ2dqX4BO1iyhcvIArVkWoJD4gvtbhXD4MpMbmokfu6rI7E+PINfvihEhQKQL1512AOu2FUhSO9ZYjl8t1yWYG7SSD0hq1Voar18ZYe/YwqriR4lIsLBlq9RZOHz1DxjiwVgjiGIVSEaWhQajxXgyO7sLSwfvRylLQhYeFkgZt3Lrlk621148219/yIlOvu48//nHmuTuxYyRCrZXCiUd2oI5Sx0IToCjnJPL+j+Qrx4MJhgPRsUtc2F8SkHDrFCwAXnPZ6M9v2DLGWWqgFaNeT2Ctr0GKAfCp44wzixmaX/4ThMqSLpYpa6fEilEoxwiiEBCHRrWKC8fP4uJTT2PuyUMwSQqX1CHEsABqe96084pbf3Ro44RG0S1S0rsZf/VUE7VGG0opKD+x4GVaADK3TC54x5+8TOpQQTnZEzBVAWTfEapn/37w7ZOTKucz+V9xzJxAhDGgMDJSuqxUjr0UVzEqlVZX/SnO4qkZi75bfhzjE6Pyhf3vQvXEYWQIYXQJCAoAK4AApRlhqKEDBaWV178xQOKImNGwwWUPPH5664kj51B7+PNkD30esbSRZtb/e/Zi+U5fyLk8peX7Umf0hCl3LyFmYtj+UrD1+uHyLwOQyUtk5aY7wTlwAA6Y8nxZPjYzOQk1NfUvq5b3A3RAIDdEGBsZ6Sm5fBDHZBatdgpWDIYgMYKlFqQ5M0M3/dB752r3frz92V9651CwZleRh3dD+sagy8NwugxoDZelEGpAKQcX9UJMAywZkNZR4IYEfUNoLy0RiGAZiBiIA4LJbFdTp8TBdMDDStOxFSlOQNAQKBJhxbERWQ9cuukGvR8+OD+zuXj1xMaRt2bEN1Ub7QdbSeM///pU9fi/mNLYB5Z7RH5hd98Htm1fXTTWGa1ZN2pt1GstBGEAxYR2IqihRO1WAw985ZHSD775fYU1N7x09vN//Idrzj/2l8o6BwQxqDgE7p+AKwyBgiFw8xz0uYfhXAaqngJHvWjf9TuUHrsPhgqwS88iapzBhl4GK+WHvoTAyosR25lFO3MIO5tSzr1JXq92x1OoQ6ZKcklBwm2A4Mr+91z/sr2/vGv7+PATjx7Dlx45s6ttw1e9c8/gz/7+Ewsf3Qfoe3yQvu28e9tNcHQP5DZF6wPNZIwQMyMz0tVLKwJmaxkq6EUhDgGi4l0PHMPIyHi556a3YvyKKiSpIl28iGzuHFrTp0DTTwFJDSbuhw4UoMrIBjdDNS/C1WeBr05hMMhgOcT2YgOb+gKfInONt2d6CEdn22g7Qphrszv7jdfgdRmhPEAOAcklnW7QP79Bv+TKvZf9xssmb9L33Xm/+diXnuXTVetizaOjsfqT9141svG3H529bT/AB/DtFWj794NxG+TH/jC4fOfu9XvCUuQazYyjKMDSUqPbc3EiKAVAH7ewBEahFCMKBBfOnMfRL98NJ0DU24+gdxRq62aU98SwzTaSyhzs/FkYLoDnjwOLZ4B2BRIUEMYxXjyWYHUfUIj7UYhDL6LPNdhOHBwIM7UMgBcpxjoXKuZjJ7KC1e7MCRlL6SVFceFI/5XX3XJNQ4xJ7rznEI7OtZkZum3FnWmKO9fC/jdv6fmPBwA3OblSLfYtPO72n7NQwAtWDRfXKqUcMZEI0G75TEFMSIxgw2gZL+6/iNqTn0ccOnChhID9Ju1Mhtb8NConDmH+iXux+Ni9qB36CtKLx2FnjwNH74KbOQzdnPM1lbXQpok4UNi8dhADfUVolWu8c2kwsydnrfXZ24LQNOInGfIgQTy6U5wjJln21LxkAeod7XvPyHh/X6Pe1NV6yqH2xZoiYYajuRS2SuEvvX5d/MtTU7CT+NaDtGsUsh/gck/vnlJfSYyxxDm8TRILZoLNDGAdqm2HN1zVhz3uaRy542NoLiyAgtgrbMIAHPgvHcdQgYZkTbjFM5BWBaIC/5ZU6AUkJAjIoRQyssx68WInTeXDYIDAiiCzrpsTHAhtSzmq67TpvpZcLWl14ZIGiLUugclGkValvhK1UpczvB5xKgjXHZssKH7oVWtKH5la3ovom9E7t06Rvb+IsY1bht8+sX6EkjRjHShUllrIjFfVWGNgjUFmBMVI4Rdv6ceV1ftx9r99ADP33wlKGlAEcBBDRQVwDrcJDtCBn4BYIXhzNgNaC+jlFHGglrXVzrcPXL73iHXIjPhOavfz+o/UtoCTvEgV6YIFEaCV2UtLli4tNloLCw2sXTsofYN95Nx03nVEpy4gAXRKyhYK8U+8dgMWVg01bvuDh7vI7hvuSbd16vQmSr2FIM7bk9BKYXa26u9q9hPbSmkIBPVWhsH+Mt7/8nF88fEz+PM7/it0oRcm7IMt9INKg+DSECQu51pthaxZhSKBadYQSoKyrWJXqY6RUBBHQVdJaq2DEOdT3/5ti8sNNElWfBCBA6Nh/AhKpJxPjwCLOIRa5oFLN92gZ2eqPRfOLUyv3bNp9ZW7Vp/66y8+M+qECn6qwL9r8aSiaoNNISj84rkZWgvUf0TwNS6U/6gAwgFg27b+N2y6bJxExCnFbKxDu535FkPX88B100m90Ubc04uXX1dCT3wGZ+aXMFObw0zVYXFeoanKaFEBbRUjiooYapyCAChrg97A4vJBh0IUYvVIP3oKGqmxfpPX7EFCPiERKY2ZWhuZcdCaVsh9vXyY4C3OjMvdR0hgnINJsks6YacJOPzwg0dXv/Ble+vbrtxeIvqChXN5M9HfXZI7QjlAt0BZFIU/fPNYqUnTjXfvA+QbQHA64JtzqtAXv3XdhiFkxiKMAiwuNFGvtaF1rvTsTrcxLCxAjEajhVArvPjqdfABTVGtNrBYT7BYzzC7tIQLlRQWGpdvU2hlFqsHi2hnFoN9Ja+dEyx3SXNzPu+B4K1giAjPzrfzbNExVsr1cHm0qKMXyn8uxRr1cnE36tV7L9l0Q6jpT44ePvWHM6dn04l1w+Xv/769Z/7mjofKpXLcdfLoKC99l9EFKZMtlaN3vKqgH7nj2cof5HWS+XqGB5BgzVhfQSlGmvkRkTTJvCMIdWxc8uZZbjhBYrwU11mkqSdSwyjA2KpBjOfecVmaodVM0E4NenqKy46/VjAzX0NmXQ4MvCOJk878KecBcBBhWJFcvLj8jrtTeytMajX7wBUihlK8H8CfHQAal4KT4zAoPF6t1JO//9QDZ1WpIC+5bkeTQLPs+1Sy7ArpbyWf7sCk2IDpv9w8Gr3tHsDsy1mJDr0DJ3RjOfrVNZtXrerpL1pWfjakstTMuTdBEATddjR1Nu9cI2CtJzKttUiSDK12hka9hWYzgbECFYQo9xThrIM1FmlqkGYGxnZMLDwhaoxFProNEQdnrB+1J4Jx6KZxygEEd8jSvD6DSBe2igiMdQ6XULzIxd6LB6M4PHrfXQ/HF49d/PKL9u1atXvH6kqWZKTUCto9Z3o7msvMiYJShXIp+oPvXR1/4B4vRXKTgDoAuHFCYfV473946tHz9A93HSeXWRAD9VoTgWaw1ySAyY8q+rs7JzE5nzV1rmt+1GGYRZCvCockSb1nTwcmO8m/XFdvEMcageYcsub2MPA3QGa9sB6dockOxUOdudTOWD669jBwrg7gktE96p5TkBvXlsezVvtVpaH+2rYrtqzbtrpPvvAPh5xzEhFRrtvM/Qmo44grBJCDVk4zv/Sykhre3s/P/HXFLkwC6jFg1QvWDrwfWgdfenwGzbkGoZ0iaWZIoRBq8qZ6Dqg1DcoFjXIcQClfj3iWmkHMrqNcBzM557oXs4t984LXGodWO1uWTOXCeV+M5hBbeaf61Dgcm23napaOYz3ByYoZFRACZvTFCswkJERLdXPqVCP5yKVs2EmhGP5ZrZ7+wtNPnkpek5qlrZdvKe3cvu6LX33k6PcVSrEjJ+wcLWubvZ4aEGEWAWuWQhC9J0nS17xm0P7Q1IK5f11UfFlfpAtn69aeaLGaPVzBoekE21f34NhSgmLEGCwpTC80sVhN4JzDQE+ADaNFbBjSSJK0mRlXLBRCVoGG7Vy1IIAzVqSzrrmTfwVZZmCs7Q5/iRCsdb4GgvX2ME7AAcOIIDMOPktwF0n6dL4c+O5nzlepFd8BuFQNITU5CfXfPlObu35N385zZ6ZfMrFp4vjE5tVrLls/dv5TdzwkUaAGiUhy843ucg9IELIgYEHgx29sGPCgCvgtm4tUdmHhLTtWlUeOLBooJjJO0BZCO79oxgGn59qwzuGHvmerbFkzQPNLqXz20WlaPahPv+5tr3+yf83qCjt3KM3SetZOKGslsFkWKljSSnXlNVoxFCs0minaqemK2Fz+XSvOez/+Q0SKsNg0OD7X6jbvOq4l6OoQ8vuBgd6QkdN3XKlnh083049eqqNr1OQh0D0AblhVPGqsvOvIM+cqt7z8qvnB8b6rxdKDX7nv8IZSIWRAyLtwCAISKLhlaZJPEwzAFWJW1ZRucBSM9JYiPFsxFCl/b46UQhQjlResjCRNsVBp4+SFJi02M0RayeGzS3TShk++493fN1EMQ7f52quTrddfu7T1BVdUV1+2cW5g1VAziOPp6sJSFhB6FLNUGhmVIwVnDUiAONQ5APCyKsCDD8m9RwMCFhoWJxfa0KpL6CxP4HUm8uBNL0qh34DFgRca2aEzzfR/jAJ86FIE6B5Abp+Eev8XmheuW9dfrM4t3tw/3P/0xu1rNu3YMt7z8MGTp+ZmF8fCUAsREecGrN0yCb6X7ycBhEImOVMXN1qOiZhpMfFyJhAwWAoQKA8OtGaZXajT+nWDx1/7yj2Pfu4fjg6KUoWnTs3j+16x8+yL1oQ7n/j85/pnTxwbWDh1otxcnNdxMewbnliVbbz52tMH7z548tChUzuWXCT3PVOhg6erOHyxjbOVDM0MmOgP4Sj3j++8zzztaSZcqCQ4V0kRKMrrsI5mu7Pf+mUVKaAnUiA/EMHzdfPU2Wb6P3ddogAxADw15QtolaW/Gxbjnk9O3bOtPlu9N+ovjb3v3a8ZMsYtAUQKkIh90bZi5XT7Ojk8pdSx2jRUpMW2QLP/e82EqAOpfRsZjWaKq3atru7YsSoguJjEoZGaZM/m0WbWbARRsRgP9caDZc42uKXpnRcee3jjkbs/v/nYX05d45Zmv+fOw1X87WPz/LZbLsOr9m7AaLGAEgc4eLqFR8+1MRgqxKzgjJ9DhQhCBZRjBZuvG8XeJ1vl4EflVmQ6fz5gL2KEeNdFJ0j37dt3yfSECgDuAeTQJNQffbFV/cxEz0J9sf6GmYXqEy98wdY1I0O9vfVmcvHxx04O9BQDlLVQapdlsx7ZcZeWTw2w0CZsHynhRNV0pDPojQP0lULkgicwEV2Yqbo3vPaK40dPzA0dPnx+NRTj5Eyt+bM/sS8s2sbgqQs1mfriWSzWLRxrlEoFKpdixTooHn7iTHzfqSZahnB+oY0TM3W0UouhnhjTjQwPnqpjtBhhru7wzMUU5+YTPHI+wdHZDGeWHC5UDSotwDpCZv15D5n1MN04QtMwEktoZcBcGzi5JDzdVrZJ4c7K+XMnvtxuH8yPYHP/1ijOS3On4G4DKJ4N/tD22x87/OjxG+bOzR0a3jC+961vemn6uTsfeTKx2F3Syg0WmeuJQTuxuRuuTwk6h7q1RPDsYhvGCgLt7cAivdylUExIjUOoVbpt88jaR588uEppJa12RnGkFifGetrts7OYXUrxybtPU28pgDhg9UQPPvyea9BuGlmstVHLhFaVAsA5JE7QP1C0z8415Wwl1cyMe041YEQQagU4oJE6WOdwrmqgFWEpA1zaGRD2n4PFF8guT4uOGC6IoJWCaC2RyzRltTS/sf93WoyOAbrg22x0fkNVDwFyCKDfOnu2FRDealrt4v/3oY/1nT8xfa7QV9j2M+//AanVkwsNCXiiP5QXbuzFNZf1Y/NwhO1rerF3yxD27RnD664bxwvXRvj8M4uYr2doJg4kQE8hyE8n8bRJK8lQLIZy7Nk59+zpBRTiALVmhqGB8kIc8ADEYLGaoaeoMNgbwUGgNdBbCpEmhlqJpdQxSqFClllsWN2LX/vATdlgb2Sb7QyhJhRDhUgROHcLUUyINCMOCAEDmXPIRJD5bgQsCBkxDKhrDkgAQuV9TBWE4CxIzOLXX/T9AHtlFNT+fdAHAHdg+TAoobzDvH8fdK4Iom+FkfiaXDoF2NsnoW6dmnvk7btH/qQ6V3nbR373bx687f95a3jDTbs2TT5+3cm//vRXV7WGeunmbcMSFEvkRBCE2lM2RGClsGPHOozfeQT3HVlEtd7GkorgVIDRsqAnIvSHGkSEvlJU+IM/un+9haBUCFFrpti6fbSpxBYB4OT5Ol2ca0KEUGukWDdWQiHSaNRaqLUMHDHKkYJ1DoN9hWbSatPiUlP7VeO5ts41cLJ8ShcR0M7b3x3H+Y4OYdkYNTeWpWXo3XHZakGC/QB/ei/4oYfgbrvNK2dX2o+8Osa60mAs9Ua7fkcFTQESr5z62pS4bx/06D2Qf0qYo7+ByNDtB/jQudmfGVo7vPv4kyd2PXrf03dfc/Oe177ph2/ecfHi0uOPPX5y9+4NTm2KDIwQXGKRZLllWECICkW88fuvwBWHz+DYiTk8faGOs7UlnGpGaGaCWDGUAsb7Yoz1FVTEQCFg1FqJbNi06gIUrk2t4DW3XIbRVWUcP72Eg4fnsH5NH1hrNGpNLDYzECkUI41qtY1VI0VdrSWu0cqUze/6jlFfl3DDMvkw37SeoJCvVfJ8TdNRus7b3ucHQgpAyFw7ADg8DNexsnvP5mBvb188XigV3gHQ+XZqXpcJ9aSuXN9kpWGMWxTwtALNLFbaX1pYqP+tGoS54x5vEDg5CXX7FBx9XSrU37gZCppaROUtq+0besqFT/3+b/3ljT8/1PvxbXs2TP7yr/zg6l/71dsP3v3I6ctHb16r41DDGEs69O6HYh2yxEAHCldesQm7dm3ANWemMTNdwdkLSyj296GaAk+cruK+k4uIwwbKIWGsJ8RC2+HqNeFV1RMndWWuhm1rV+Gq3avgiFFtZLDGIJUAWStFpe0QkEakGdY62bJxwNXrCZqJJRAQdHQFeaug403aMbTAinpnZUQ6rZWONq6rvfTtCm61LaTerv/sKuworR15W1QOX0xMS4VY31SMVDDYG6PRynBxsQUnAmNtQYRGmGlDh0oKYvUjpf5itZXaxdetTT5hE/uJqanW/ZSnyhXHif7TObCjh/vJdX0DdW0/Y0gP/8ff/MnK5svXX50uVM787q//FVWmF9e89IXjfmoagNIKxN6ZV5GAlIJSjDAKAAGq1RYCsog0YXGpgT//zDM4uZhhtiWoJoSBIuOmy0dRIIOe0GFipITRoRIG+oroG+xFqa+MsFxu3/VXX5aPfulc4UxSwPUberFQTdwVO1fNkJPS5756pufwfAs7xso5m+B5trZxyKyDZkZmDC42bNddnvIph+VQdNBpzkPGMRIDwDls6RP84JXF8+M9UX9PMSqGIWO+lkIrwldPNeWxcy1nMyPT1VRpzbk5LYSYMBCTTPQoKUZa9ReIMgtkmcNSI7NJy/y2S1q/8fEzrfMrtYj0TVShfABwH37ttp6jR+f+oW1lza/+9k89vXbDyA2Nar328T++63Tl1JkNey9fXWLtz1UIogjIpbUd+N0ZfdeKu2pNZx0WZhYxO7OE6fk6Li61MNwb45Fji3KqBkrhZb0D5RBDRcJ4n8bakRirBuK0dmFW/uRgO8pUEVeMl2AskKYWkQKOLrZxfL6FXatKME662oJmZmGdr2tamcVs0+SF6/JcaoddZ/bCkcw66ECBmLFvQ4Rd63tw7YYyhvtiLLQcTs4m9qFjC/T46Ya0M8u1tqVGJtCMnCVfod4QeKmXeGaiJ1aypk9j00BgFUO12paml9pP1xuVyTvOZk92rv03RRGdX/zh1T1DUuQ7odS6X/+v7zk3tnXVlXa2eu7zn/xKe/7kmTUjw0VVKEfaWic60ESslw3HxeXWlsubLed3KIhgjEGSWGit8NgTp7CwWMN8pYX5hsFim7DYEjSMwLJGFDBKIWGhZbHQJhRCjZ5QoacQSG/IdHS2gVomuGww9o263CS22s5gBQgVo5pazDcN9ErLl9xQ1lmg0khQiLyT4xtuGMPr944hJqCnJ8Jjp2q4/8icHL/YxNPnmtTKVamUtzGU8v9frFfMGa2QFUuuwWt7MRMGiwpbhxTGe3UGJ8H0UvNko2lf+qnTlZP7V2KUbyVI73zB6qG0kXzaEG1567u+/+EX79t9HRT1nX3m7PTT9z3ex6YVF8oFGOMn2JTWy7m+8y7zpo44C3HkHXyZoBSDWCEMA6RphlazjVq9jVojwWKlhen5OuZrKaoti1risG4wwKPn2zhVA1IHZI6RGOchtFJdLi7Q2pOp4udgi6FCM3NopBZeC+JrNyeCSiNBMda48aoJ9ETAT718LUZ7Cjg3n+DYdBN/+sVnMb3Ywlw1RagJgSIEmhFy7gfEnrtT5GG8w7JdPjGtYF86o/9ANRW0MsF4WWHPqtiUAtHPXqw9eWY6e/mrm83pb7kz2AnSu7cM9i5Y8xetNH3Jza+89m/f9a5X34BQbWhVmjh+8Gjj4jPHXakn7rEQgJVopahjRcl5aqN8ZYl1vlfjchNypTugGEopaK18/4YZaWbRaCVoNhLUGyl6eiI8fXwWZ6crqDQzVBOHhaZDb+yhdz0DmpmFEYXpFmGm4fwBUbmyh5jQbrUBAfrKIUb6IkzevBGKGW9/5WXQzLj34AXz0JE5fe/hOTz4zAzKcQiAUIp86yUgL1GLNHXlW5LbCXSO+qTcW0h1rBk6qBDLrZvEAEttjzz3juuspFxw9Gz11z57sfGL31brthOkyZ0Ix8PRj7Ta5k3jm9c+/YEP/kChp1zYJA7qwpnpiycfOZRJ0lobhBoShN0TRzpn9XR8SEVyEaHLrfZsx58697nOV573wGaQoo5CCtb5OiZNUiSJRb2ZoNlKsVRPEWjGhbk6FqotWOuQOkYtcUhzA9NG5jC72MLI+jFQIcRP37ob28b7sX6kDMXc+J+fOxJ99M4jar6ato6cWSr2lwKEyqetYqR8aqTl1riskARY5xlz6nj+ECFgQWY9NOPcQXhZ8+D5QCuEuYZFxCIvXBtJvZFOn11ovfTb7q3vB/g2gdxGIPuidT9wcbFxQMd69av+3Y3HXj15/QCM29yoNhsnHn3qQqtaH0qbrQFSDKWD7o5J8BbHnSEp8T5XgAisyfL2N/thX/JtAh1of4aPXVaKSu5c6Z3ivdi9oy9otRK0kgz1psH0bAU2szg3U8eZmUZ9cNUAbrlxq77h2k3xyHAJSWKRGm6++9e/GMzMNeonzi8Wmy0ThaHCQClAwP5MB7dSSJ//bJx09xmXy6TE5Z+JlqVTtlNT0bIVAHXdIH3QUiNYbDus7Qvshl5WJy9W//yfK37obnvv2z48nir8Sr2dvn58w6rj7/25yd7xicGtIAorMwvNmWfPxJWZBcqaCXXqEFYq97t2XiCS1yUwFjb3J2VmHwzxAkMdBnBOlo+fwTIy6tzGHeVRx6hCM6FRbeL89FIrLhVF4oIbnBhq73vJtkI5DkoL1cSePFdrfPD3vlQCqHbo2HRMxHEcacRaUAwIgc71EB1Val5Hhn4DQ2b9JmMFiPK2SttIV+3qXOeoHHStaBT7YHU6tZ3moCJCIwNS67B7iGShmtK/SJ2ysqh695Wr9rXS7LeE1VU3vuLqv3/N918rA4OlFyPUPe25CirzVSycu+CSZkLtWoOc9UBCujMeDGcNnPV3HyvldWni/EFNOQ3jz2jwK8a/hm9ZO+sAa2HTFAIYscJQXBtYPRIIs2y5YlNhaLQPSFJ+/OlpPHN87tD/+8cPro+jgE5PV2LNxMVYQ5FIOQSpzki+5OhuhbLHy7n8HhIqfwShzf22E7dc9HacG1l5h5MoBxNW8iInn7RgWg6QCDDXNLK2BGJr5v815EM0OQmemoJ98xV9/ZENfyLL7E+10zT4gTfeeHz3VZvD7Xs2bABoBGmGpJWgMldBY6kqjcUKmpWa2MxIlmSq2wEE/IkmuYuvE7/SuiDQGn8ns0KWZEL+xC0JQu0KvWWKyqXzYxvGhyJNemBsMIAmJJXW9Cc++5SbW2gufuRjD24hYktMMRFRMWJoFgnYkfdFWK6PJBeadCYbwnzSIcsVp23jf0crQtbl83ID23x1+JEW8oPLeZq3AsR52uyIIzuNw7mGk5Im6uXk/L+avmvlanr/NWtekKTp9zaa7R9PM4vrbrz8wtY9G8r7bt6dRf3FdRDuhbMaSYqklaKyUJPK7JxkzUSSRhOtWp2dsQATMStkaZrfuQomSyWMo0YQh9yuNWRk8/p2GOrBMApdsa9HjaweAjRbGEeHnj7n2NkzH/vkY+Wnj82eP3j4wmWsuFCIQ1JMXlmkAUWue1zaMv+2nDI7IhlfdOc/56lMM2C6UtTldLXi5AJoWmbLfTPQj7mEOQPjulMUnvObbYrrD0BlNl/91xbg0f59UAfu8SrTD792W8/Fc0vXzC80fyczMjQ2McjrN43Pbdw6EW/etlqvXTPo+ob6GIEuANILkRiZRdZooVVroNloIyzGaFbqWJpbNEppKvcWVdTTk5T7+5A0G3ZguFwEAZJaUKwX/+aTB5eqtZYMDpbdr/7250YajTY7QRQGOgyjwOd/axAHnTu70xOg7nSdW0GwUKe4Ji8RRu6aZQQoKqBpluXBnXh2XlczEJKgniE/jlpgHPwhUvCBVbQiaxDBOYeZunOrCsQFMj/1b6KQ3A8w9oE7gQII/+kV28ZnpuffWa+nV7etbAp0sLFQilShoOcGhvvm128ZX7zssonmuk1jQ6Nj/aWgp1gGUw/aaRlhmMC5OFe0z0Kcg5JeJLb+mc89dr6/txhOffKR4Xaapg8+esoaS+tYsY1irZgkv2vhmMCBQn5AoSx30vLcjxW9gO4qWmFWrzvBzL1+rFs2BXSgLkPSQXRBTnlZEb/yci8GyZEr8wr7zTygjdRJtWVlJDANtnLLv7WElfYDdODreiAPvX1v8OcPn99Tb2TbssxcIZCdRLxFCMNhoMqFUpgODPcvrlk7PDMwOkAnT83b7Tsm9OVXbWz/5u98xi4tNEsbN49lmtl9+s7HLicI++E5LhSKAfKzNhxERJEjv1dT52AtWKHu+d3uazX/3f6Q7eI16kLEriwrLz47faTOuQ7IqSWXF6j+5vArw+T1EVbcFF3bmc6ROAwsNp2BiO5B8t67L9R+55JpjAWg2/ZBHRqFfKPRfhGh//SK3WsW5pf2JEl6eTtNL2dSGyrtbGyh7dYHSqsMsEEQKCJCKzEQEfT2FGCd80J4dJznffdUQMiswHRRoNh8SoP8XJYfx5QVOrgOn73yrDzJX7UTxI6usWNVRvkERSf4Kj+3qHPaZNsSFOdeDORRn8qL3c4aUiRop9Y0U9Ka3KmZC/Pb3wKkl9TB9utX1qFJ0M4Z0D8VNAD4jZ++rvDoXSdXJSmty4xsTqxbD5FNYK4ZkS9mSbZVgLUCXmNFrXbOjIC4aEQ+TqT6BNgJZ7cJUVErRqQ6w44CrxERZxzICShz4Lb1LQonyzptAnVlz4o7ejmvwdB585E7gns/6dW1k7FCXUi9bHG2XPQyPAI0Vmy9ZZSz9iw79/2vnqscPIBLbDH87QQNXpXhDnybqpnr1qAg6WjvAzMz053nXjg4uMaxHYFSV7Lit5Jgwjo7Ugh0uRz6q6e8dFSMn02RtmWqGWbjD9QlI74Y7ZxOTMTQihFqRqwkDxjDwZ8xwd1s6Jt0Ll8lxvl9CDnFI86JMeJSI8oYe6+26VsemKsd/ZbbDc+ZwAE0s88HbnQUsnMKcvcK0csovrav37Fq+Ua9/i1ApIvFwTCOr49CvlnETSjmNQWNazR568xIMyLdQVgixomzAmTWy84smCyYMufZBCKvlg3YzxN1ap9u5UOcgwgBgSS/H6SVOm0zC2vdhy/OLBw4C7RWliz/JwTon01Drfgz5UGjqWWlzT96XN3f/xJLbtyANkRavy7S2MhEg8wI40AhVH6P04xcUiwutU4SR+TAYAIpAowAzvfMXef8ZAaTiJBzQt4j1RulZ8bOsNAvPDg990crlFbfvOX9PH90AsYzAH396us8dmKkrPvSESMy0lsqvNY52SHiJpSmUUU0QOT6AwaU8krUjlx4+dQvglvxc2b9icjWuUVn3Ve04jvEmc8+NFM5kbe5/9HN890aoH9Sh9ExSfrfWd/sHR8vmiQZyJx5Xaj0FWCMQWSMicaU5iKLcyTS65g+Io40E1aLYJSIBg3k953N7np0tnrs6/Uf3+j/+l+E75w4tIR68AAAAABJRU5ErkJggg==";
|
|
7
|
+
/** The favicon link a page's head carries. */
|
|
8
|
+
export declare const HAT_ICON = "<link rel=\"icon\" type=\"image/png\" href=\"data:image/png;base64,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\">";
|
|
9
|
+
/** The hat beside a page's heading; decorative, since the heading names the page. */
|
|
10
|
+
export declare const HAT_IMG = "<img class=\"hat\" src=\"data:image/png;base64,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\" width=\"52\" height=\"48\" alt=\"\">";
|
|
11
|
+
/** CSS for a heading that leads with the hat. */
|
|
12
|
+
export declare const HAT_CSS = "h1.brand{display:flex;align-items:center;gap:12px}.hat{flex:none}";
|
package/dist/brand.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Written by scripts/brand.py; run it again rather than editing this file.
|
|
2
|
+
/**
|
|
3
|
+
* SQL Yodeler's logo, the hat, for the pages yodel writes (yodel report --html
|
|
4
|
+
* and yodel docs). It is inlined as a PNG data URI, drawn at twice the size it
|
|
5
|
+
* is shown, so each page stays one self-contained file.
|
|
6
|
+
*/
|
|
7
|
+
export const HAT_PNG = "data:image/png;base64,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";
|
|
8
|
+
/** The favicon link a page's head carries. */
|
|
9
|
+
export const HAT_ICON = `<link rel="icon" type="image/png" href="${HAT_PNG}">`;
|
|
10
|
+
/** The hat beside a page's heading; decorative, since the heading names the page. */
|
|
11
|
+
export const HAT_IMG = `<img class="hat" src="${HAT_PNG}" width="52" height="48" alt="">`;
|
|
12
|
+
/** CSS for a heading that leads with the hat. */
|
|
13
|
+
export const HAT_CSS = "h1.brand{display:flex;align-items:center;gap:12px}.hat{flex:none}";
|
|
14
|
+
//# sourceMappingURL=brand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,wqmBAAwqmB,CAAC;AAEhsmB,8CAA8C;AAC9C,MAAM,CAAC,MAAM,QAAQ,GAAG,2CAA2C,OAAO,IAAI,CAAC;AAE/E,qFAAqF;AACrF,MAAM,CAAC,MAAM,OAAO,GAAG,yBAAyB,OAAO,kCAAkC,CAAC;AAE1F,iDAAiD;AACjD,MAAM,CAAC,MAAM,OAAO,GAAG,mEAAmE,CAAC"}
|
package/dist/ci/render.d.ts
CHANGED
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
* The apply pipeline's waves are yodel.config.ts `waves`, in order; without
|
|
20
20
|
* it, one wave per environment in profile order, each with gate `always`.
|
|
21
21
|
*
|
|
22
|
+
* yodel.config.ts `ci.apply: false` (#175) leaves out the apply pipeline and
|
|
23
|
+
* the waves spec on every forge: the pull request checks and the watches
|
|
24
|
+
* remain, and no job holds a writer.
|
|
25
|
+
*
|
|
22
26
|
* Three pipelines per forge, each declared with chant: yodel-pr with the
|
|
23
27
|
* github lexicon's Workflow, Job and Step (Forgejo renders the same
|
|
24
28
|
* declaration through the forgejo lexicon's dialect) and the gitlab
|
|
@@ -68,7 +72,7 @@
|
|
|
68
72
|
* in that image instead, which carries node, yodel, chant and the lexicons
|
|
69
73
|
* on PATH, and no job runs `npm ci` ({@link Toolchain}).
|
|
70
74
|
*/
|
|
71
|
-
import { type ApprovalMode, type CiLogin } from "../config/define.js";
|
|
75
|
+
import { type ApprovalMode, type CiLogin, type WaveGate } from "../config/define.js";
|
|
72
76
|
import { type CloudToken, type Role } from "../credentials.js";
|
|
73
77
|
import type { Declarable } from "@intentius/chant/declarable";
|
|
74
78
|
export type Forge = "github" | "gitlab" | "forgejo";
|
|
@@ -127,6 +131,8 @@ export interface Environments {
|
|
|
127
131
|
credentials?: Record<string, EnvCredentials>;
|
|
128
132
|
/** yodel.config.ts `ci.login` (#132): the cloud login a job runs before yodel when a role it holds is cloud-minted. */
|
|
129
133
|
login?: CiLogin;
|
|
134
|
+
/** yodel.config.ts `ci.apply: false` (#175): no apply pipeline, so no job holds a writer. */
|
|
135
|
+
apply?: false;
|
|
130
136
|
}
|
|
131
137
|
/** What a job holding one role of an environment needs: the variables it reads, and the cloud identity its token source mints from. */
|
|
132
138
|
export interface RoleNeeds {
|
|
@@ -233,8 +239,6 @@ export declare function actionsReview(forge: Actions, envs_: Environments): Rend
|
|
|
233
239
|
export declare const GITLAB_WATCH_FILE = ".gitlab/yodel-watch.gitlab-ci.yml";
|
|
234
240
|
export declare const GITLAB_APPLY_FILE = ".gitlab/yodel-apply.gitlab-ci.yml";
|
|
235
241
|
export declare function gitlabPipeline(envs_: Environments): RenderedFile;
|
|
236
|
-
/** When a wave waits for an approval; yodel.config.ts `waves[].gate`. */
|
|
237
|
-
export type WaveGate = "always" | "on-destructive" | "never";
|
|
238
242
|
export interface Wave {
|
|
239
243
|
env: string;
|
|
240
244
|
gate: WaveGate;
|
package/dist/ci/render.js
CHANGED
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
* The apply pipeline's waves are yodel.config.ts `waves`, in order; without
|
|
20
20
|
* it, one wave per environment in profile order, each with gate `always`.
|
|
21
21
|
*
|
|
22
|
+
* yodel.config.ts `ci.apply: false` (#175) leaves out the apply pipeline and
|
|
23
|
+
* the waves spec on every forge: the pull request checks and the watches
|
|
24
|
+
* remain, and no job holds a writer.
|
|
25
|
+
*
|
|
22
26
|
* Three pipelines per forge, each declared with chant: yodel-pr with the
|
|
23
27
|
* github lexicon's Workflow, Job and Step (Forgejo renders the same
|
|
24
28
|
* declaration through the forgejo lexicon's dialect) and the gitlab
|
|
@@ -71,7 +75,7 @@
|
|
|
71
75
|
import { existsSync } from "node:fs";
|
|
72
76
|
import { join, resolve } from "node:path";
|
|
73
77
|
import { pathToFileURL } from "node:url";
|
|
74
|
-
import { APPROVAL_MODES } from "../config/define.js";
|
|
78
|
+
import { APPROVAL_MODES, WAVE_GATES, waveGateHint } from "../config/define.js";
|
|
75
79
|
import { audience, CLOUD_OF, jobLogins, loginSteps } from "./login.js";
|
|
76
80
|
import { RECORD_PLANS_ENV } from "../approval-mode/index.js";
|
|
77
81
|
import { cloudToken, credentialsOf, roleVariables } from "../credentials.js";
|
|
@@ -98,6 +102,8 @@ const CHECKOUT = "actions/checkout@v7";
|
|
|
98
102
|
const SETUP_NODE = "actions/setup-node@v7";
|
|
99
103
|
/** DEV for dev: the prefix of an environment's variables. */
|
|
100
104
|
export const prefixOf = (env) => env.toUpperCase().replace(/[^A-Z0-9]/g, "_");
|
|
105
|
+
/** Whether the apply pipeline is rendered: unless yodel.config.ts `ci.apply` is false. */
|
|
106
|
+
const rendersApply = (envs) => envs.apply !== false;
|
|
101
107
|
/** DEV_CLICKHOUSE for dev on ClickHouse: what an environment's variables start with. */
|
|
102
108
|
export const variablePrefix = (env, dialect) => `${prefixOf(env)}_${dialect.toUpperCase()}`;
|
|
103
109
|
/** The variables a job reading `env` holds: the URL and the reader (the variables credentials() names; none for a token-minted password). */
|
|
@@ -461,9 +467,11 @@ export function gitlabPipeline(envs_) {
|
|
|
461
467
|
}
|
|
462
468
|
for (const [name, job] of Object.entries(ownJobs(own?.gitlab, Object.fromEntries(jobs), "gitlab")))
|
|
463
469
|
jobs.set(name, job);
|
|
470
|
+
const apply = rendersApply(envs_);
|
|
464
471
|
const variables = envs.flatMap((env) => {
|
|
465
472
|
const creds = envs_.credentials?.[env];
|
|
466
|
-
|
|
473
|
+
// With ci.apply: false no job holds a writer, so no writer variable is set.
|
|
474
|
+
const writer = apply ? writerVariables(env, dialect, creds).slice(1) : [];
|
|
467
475
|
return [
|
|
468
476
|
`# ${readerVariables(env, dialect, creds).join(", ")}: not protected (merge request`,
|
|
469
477
|
"# pipelines run on unprotected branches), masked; no environment scope.",
|
|
@@ -475,8 +483,15 @@ export function gitlabPipeline(envs_) {
|
|
|
475
483
|
const header = [
|
|
476
484
|
...HEADER,
|
|
477
485
|
"#",
|
|
478
|
-
|
|
479
|
-
|
|
486
|
+
...(apply
|
|
487
|
+
? [
|
|
488
|
+
"# Merge requests: lint and the plan comment (stage review). A push to the",
|
|
489
|
+
`# default branch: the apply waves, one stage each, in ${GITLAB_APPLY_FILE}.`,
|
|
490
|
+
]
|
|
491
|
+
: [
|
|
492
|
+
"# Merge requests: lint and the plan comment (stage review). No apply",
|
|
493
|
+
"# pipeline (yodel.config.ts ci.apply: false): migrations are applied outside CI.",
|
|
494
|
+
]),
|
|
480
495
|
`# The drift watches are in ${GITLAB_WATCH_FILE} (stage ops).`,
|
|
481
496
|
"#",
|
|
482
497
|
"# GitLab gives every job the project's CI/CD variables unless a variable is",
|
|
@@ -495,25 +510,30 @@ export function gitlabPipeline(envs_) {
|
|
|
495
510
|
"# the plan comment and the drift watch's tracking issue; CI_JOB_TOKEN",
|
|
496
511
|
"# cannot write merge request notes or issues.",
|
|
497
512
|
]),
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
513
|
+
...(apply
|
|
514
|
+
? [
|
|
515
|
+
"# The jobs that hold no writer read with the reader: chant.config.ts picks an",
|
|
516
|
+
"# environment's writer only under YODEL_CREDENTIALS=writer:<env>, which only",
|
|
517
|
+
"# that environment's wave job sets.",
|
|
518
|
+
]
|
|
519
|
+
: ["# Every job reads with the reader; none holds a writer."]),
|
|
520
|
+
...identityHeader("gitlab", cloudsOf(envs_, envs.flatMap((env) => [...planRoles(waves, env), ...(apply ? waveRoles(waves, env) : []), [env, "reader"]]))),
|
|
502
521
|
];
|
|
503
522
|
// The stages this file's jobs use (review, then any the project's own jobs add), then the apply file's waves and the watch file's ops.
|
|
504
523
|
// A pr-review wave (#48) adds the merge request job that records the plans, in chant's stage "plans".
|
|
505
524
|
const jobStages = [...jobs.values()].map((job) => job.props?.stage).filter((stage) => typeof stage === "string");
|
|
506
|
-
|
|
525
|
+
// ci.apply: false (#175): no apply file, so neither its include nor its stages.
|
|
526
|
+
const plans = apply && waves.some((w) => w.approval === "pr-review") ? [PLANS_STAGE] : [];
|
|
527
|
+
const applyStages = apply ? [...plans, ...waveStages(waves), ...(envs_.resume ? [RESUME_STAGE] : [])] : [];
|
|
507
528
|
const pipeline = new GitLabPipeline({
|
|
508
529
|
comment: asComment(header),
|
|
509
|
-
include: [{ local: GITLAB_APPLY_FILE }, { local: GITLAB_WATCH_FILE }],
|
|
510
|
-
stages: [...new Set([...jobStages, ...
|
|
530
|
+
include: [...(apply ? [{ local: GITLAB_APPLY_FILE }] : []), { local: GITLAB_WATCH_FILE }],
|
|
531
|
+
stages: [...new Set([...jobStages, ...applyStages, "ops"])],
|
|
511
532
|
variables: { GIT_DEPTH: "0" },
|
|
512
533
|
});
|
|
513
534
|
const entities = new Map([["pipeline", pipeline], ["workflow", workflow], ...jobs]);
|
|
514
535
|
return { path: ".gitlab-ci.yml", content: oneFile("gitlab", gitlabSerializer.serialize(entities)) };
|
|
515
536
|
}
|
|
516
|
-
const WAVE_GATES = ["always", "on-destructive", "never"];
|
|
517
537
|
/** The environment `env`'s wave requires, as a list. */
|
|
518
538
|
const requiredOf = (waves, env) => {
|
|
519
539
|
const r = waves.find((w) => w.env === env)?.requires;
|
|
@@ -744,7 +764,7 @@ export async function readWaves(dir, envs) {
|
|
|
744
764
|
throw new Error(`yodel.config.ts: waves[${String(i)}].env ${env} is not an environment (${envs.join(", ")})`);
|
|
745
765
|
const gate = (w.gate ?? "always");
|
|
746
766
|
if (!WAVE_GATES.includes(gate))
|
|
747
|
-
throw new Error(`yodel.config.ts: waves[${String(i)}].gate ${String(w.gate)} is not ${WAVE_GATES.join(", ")}`);
|
|
767
|
+
throw new Error(`yodel.config.ts: waves[${String(i)}].gate ${String(w.gate)} is not ${WAVE_GATES.join(", ")}${waveGateHint(w.gate)}`);
|
|
748
768
|
const requires = w.requires === false ? undefined : w.requires === undefined ? (i > 0 ? String(all[i - 1]?.env) : undefined) : typeof w.requires === "string" ? w.requires : JSON.stringify(w.requires);
|
|
749
769
|
if (requires !== undefined && !envs.includes(requires))
|
|
750
770
|
throw new Error(`yodel.config.ts: waves[${String(i)}].requires ${requires} is not an environment (${envs.join(", ")})`);
|
|
@@ -912,6 +932,7 @@ export async function environments(dir) {
|
|
|
912
932
|
...(ci?.image ? { image: ci.image } : {}),
|
|
913
933
|
...(ci?.resume ? { resume: { schedule: ci.resume.schedule } } : {}),
|
|
914
934
|
...(ci?.login ? { login: ci.login } : {}),
|
|
935
|
+
...(ci?.apply === false ? { apply: false } : {}),
|
|
915
936
|
};
|
|
916
937
|
}
|
|
917
938
|
/** The roles of each environment whose profile is made with credentials(). */
|
|
@@ -981,7 +1002,8 @@ export function forgeOf(path) {
|
|
|
981
1002
|
export async function render(dir) {
|
|
982
1003
|
const envs = await environments(dir);
|
|
983
1004
|
const forges = envs.forges ?? FORGES;
|
|
984
|
-
|
|
1005
|
+
// ci.apply: false (#175): no waves spec and no apply pipeline on any forge.
|
|
1006
|
+
const files = [...review(envs), ...(rendersApply(envs) ? await applyPipelines(dir, envs) : []), ...(await watchPipelines(dir, envs))];
|
|
985
1007
|
return files.filter((f) => {
|
|
986
1008
|
const forge = forgeOf(f.path);
|
|
987
1009
|
return forge === undefined || forges.includes(forge);
|