@vibes.diy/identity 3.0.3 → 4.0.2
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 +5 -5
- package/clerk-claim.d.ts +1 -0
- package/clerk-claim.js.map +1 -1
- package/dash-api/clerk-token.d.ts +1 -1
- package/dash-api/clerk-token.js +1 -1
- package/dash-api/clerk-token.js.map +1 -1
- package/dash-api/dash-client.d.ts +1 -1
- package/dash-api/dash-client.js.map +1 -1
- package/dash-api/protocols-base-jwt.d.ts +23 -0
- package/dash-api/protocols-base-jwt.js +13 -0
- package/dash-api/protocols-base-jwt.js.map +1 -0
- package/dash-api/protocols-cloud-types.d.ts +127 -0
- package/dash-api/protocols-cloud-types.js +45 -0
- package/dash-api/protocols-cloud-types.js.map +1 -0
- package/dash-api/protocols-dashboard/dash-types.d.ts +27 -0
- package/dash-api/protocols-dashboard/dash-types.js +2 -0
- package/dash-api/protocols-dashboard/dash-types.js.map +1 -0
- package/dash-api/protocols-dashboard/fp-api-interface.d.ts +24 -0
- package/dash-api/protocols-dashboard/fp-api-interface.js +2 -0
- package/dash-api/protocols-dashboard/fp-api-interface.js.map +1 -0
- package/dash-api/protocols-dashboard/index.d.ts +13 -0
- package/dash-api/protocols-dashboard/index.js +6 -0
- package/dash-api/protocols-dashboard/index.js.map +1 -0
- package/dash-api/protocols-dashboard/msg-is.d.ts +68 -0
- package/dash-api/protocols-dashboard/msg-is.js +184 -0
- package/dash-api/protocols-dashboard/msg-is.js.map +1 -0
- package/dash-api/protocols-dashboard/msg-types.d.ts +429 -0
- package/dash-api/protocols-dashboard/msg-types.js +4 -0
- package/dash-api/protocols-dashboard/msg-types.js.map +1 -0
- package/dash-api/protocols-dashboard/token.d.ts +37 -0
- package/dash-api/protocols-dashboard/token.js +7 -0
- package/dash-api/protocols-dashboard/token.js.map +1 -0
- package/dash-api/token.d.ts +3 -3
- package/dash-api/token.js +8 -1
- package/dash-api/token.js.map +1 -1
- package/device-id/ca.d.ts +6 -2
- package/device-id/ca.js.map +1 -1
- package/device-id/certor.d.ts +3 -2
- package/device-id/certor.js.map +1 -1
- package/device-id/csr.d.ts +2 -1
- package/device-id/csr.js.map +1 -1
- package/device-id/device-id-wire-golden.fixture.json +23 -0
- package/device-id/key.d.ts +2 -2
- package/device-id/key.js +1 -1
- package/device-id/key.js.map +1 -1
- package/device-id/register-golden.test.d.ts +1 -0
- package/device-id/register-golden.test.js +98 -0
- package/device-id/register-golden.test.js.map +1 -0
- package/device-id/register.d.ts +22 -0
- package/device-id/register.js +162 -0
- package/device-id/register.js.map +1 -0
- package/device-id/sign.d.ts +3 -1
- package/device-id/sign.js.map +1 -1
- package/device-id/test-helpers.d.ts +19 -0
- package/device-id/test-helpers.js +72 -0
- package/device-id/test-helpers.js.map +1 -0
- package/device-id/validator.d.ts +2 -1
- package/device-id/validator.js +1 -1
- package/device-id/validator.js.map +1 -1
- package/device-id/verify.d.ts +3 -2
- package/device-id/verify.js +1 -1
- package/device-id/verify.js.map +1 -1
- package/device-id/wire-golden.test.d.ts +1 -0
- package/device-id/wire-golden.test.js +20 -0
- package/device-id/wire-golden.test.js.map +1 -0
- package/golden-fixtures.d.ts +21 -0
- package/golden-fixtures.js +48 -0
- package/golden-fixtures.js.map +1 -0
- package/index.d.ts +8 -4
- package/index.js +2 -1
- package/index.js.map +1 -1
- package/keybag/key-bag-file.d.ts +1 -1
- package/keybag/key-bag-memory.d.ts +1 -1
- package/keybag/key-bag.d.ts +3 -1
- package/keybag/key-bag.js.map +1 -1
- package/keybag/keybag-golden.fixture.json +70 -70
- package/keybag/keybag-golden.test.js +9 -9
- package/keybag/keybag-golden.test.js.map +1 -1
- package/keybag/keybag.d.ts +1 -1
- package/keybag/sys-file-system/deno-filesystem.d.ts +1 -1
- package/keybag/sys-file-system/factory.d.ts +1 -1
- package/keybag/sys-file-system/node-filesystem.d.ts +1 -1
- package/node.d.ts +4 -4
- package/node.js +1 -1
- package/node.js.map +1 -1
- package/package.json +9 -8
- package/runtime/superthis.d.ts +10 -0
- package/runtime/superthis.js +276 -0
- package/runtime/superthis.js.map +1 -0
- package/runtime/superthis.test.d.ts +1 -0
- package/runtime/superthis.test.js +47 -0
- package/runtime/superthis.test.js.map +1 -0
- package/runtime-context.d.ts +1 -1
- package/runtime-context.js +1 -1
- package/runtime-context.js.map +1 -1
- package/server.d.ts +1 -1
- package/server.js +1 -1
- package/server.js.map +1 -1
- package/sts/index.d.ts +53 -0
- package/sts/index.js +312 -0
- package/sts/index.js.map +1 -0
- package/sts/sts-golden.test.d.ts +1 -0
- package/sts/sts-golden.test.js +63 -0
- package/sts/sts-golden.test.js.map +1 -0
- package/sts/text-blocks.d.ts +10 -0
- package/sts/text-blocks.js +90 -0
- package/sts/text-blocks.js.map +1 -0
- package/testing.d.ts +7 -0
- package/testing.js +7 -0
- package/testing.js.map +1 -0
- package/types/cert-payload.d.ts +45 -1
- package/types/cert-payload.js.map +1 -1
- package/types/device-id-payload.d.ts +67 -1
- package/types/device-id-payload.js.map +1 -1
- package/types/device-id-payload.test.js +5 -17
- package/types/device-id-payload.test.js.map +1 -1
- package/types/device-id-types.d.ts +93 -0
- package/types/device-id-types.js +2 -0
- package/types/device-id-types.js.map +1 -0
- package/types/keybag-item.d.ts +15 -0
- package/types/keybag-item.js +2 -0
- package/types/keybag-item.js.map +1 -0
- package/types/sthis.d.ts +84 -0
- package/types/sthis.js +2 -0
- package/types/sthis.js.map +1 -0
- package/types/wire.d.ts +53 -1
- package/types/wire.js.map +1 -1
- package/types/wire.test.js +5 -9
- package/types/wire.test.js.map +1 -1
package/sts/index.js
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { BuildURI, KeyedResolvOnce, Option, Result, exception2Result, timeouted } from "@adviser/cement";
|
|
2
|
+
import { exportJWK, importJWK as joseImportJWK, jwtVerify, importSPKI } from "jose";
|
|
3
|
+
import { base58btc } from "multiformats/bases/base58";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { ensureSuperThis } from "../runtime/superthis.js";
|
|
6
|
+
import { JWKPrivateSchema, JWKPublicSchema, toJwksAlg } from "../types/wire.js";
|
|
7
|
+
import { mimeBlockParser, filterOk } from "./text-blocks.js";
|
|
8
|
+
export const envKeyDefaults = {
|
|
9
|
+
SECRET: "CLOUD_SESSION_TOKEN_SECRET",
|
|
10
|
+
PUBLIC: "CLOUD_SESSION_TOKEN_PUBLIC",
|
|
11
|
+
};
|
|
12
|
+
export async function importJWK(jwk, alg, options) {
|
|
13
|
+
let algorithm;
|
|
14
|
+
if (alg) {
|
|
15
|
+
algorithm = alg;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const rAlg = toJwksAlg(jwk);
|
|
19
|
+
if (rAlg.isErr()) {
|
|
20
|
+
return Result.Err(rAlg);
|
|
21
|
+
}
|
|
22
|
+
algorithm = rAlg.Ok();
|
|
23
|
+
}
|
|
24
|
+
const rKey = await exception2Result(() => joseImportJWK(jwk, algorithm, options));
|
|
25
|
+
if (rKey.isErr()) {
|
|
26
|
+
return Result.Err(rKey);
|
|
27
|
+
}
|
|
28
|
+
return Result.Ok({ key: rKey.Ok(), alg: algorithm });
|
|
29
|
+
}
|
|
30
|
+
export async function jwk2env(jwk, sthis = ensureSuperThis()) {
|
|
31
|
+
const rJwk = await exception2Result(() => exportJWK(jwk));
|
|
32
|
+
const inPubKey = rJwk.isOk() ? rJwk.Ok() : jwk;
|
|
33
|
+
return base58btc.encode(sthis.txt.encode(JSON.stringify(inPubKey)));
|
|
34
|
+
}
|
|
35
|
+
export async function env2jwk(env, alg, sthis = ensureSuperThis()) {
|
|
36
|
+
const jwks = await coerceJWK(sthis, env);
|
|
37
|
+
if (jwks.length === 0) {
|
|
38
|
+
throw new Error("No valid JWK found in env");
|
|
39
|
+
}
|
|
40
|
+
const keys = [];
|
|
41
|
+
for (const jwk of jwks) {
|
|
42
|
+
const rKey = await importJWK(jwk, alg, { extractable: true });
|
|
43
|
+
if (rKey.isErr()) {
|
|
44
|
+
throw rKey.Err();
|
|
45
|
+
}
|
|
46
|
+
keys.push(rKey.Ok().key);
|
|
47
|
+
}
|
|
48
|
+
return keys;
|
|
49
|
+
}
|
|
50
|
+
function coercesJWKplainOrkeysObject(keyOrkeys, validator) {
|
|
51
|
+
const keys = [];
|
|
52
|
+
const isKeys = z.object({ keys: z.array(z.any()) }).safeParse(keyOrkeys);
|
|
53
|
+
if (isKeys.success) {
|
|
54
|
+
keys.push(...isKeys.data.keys);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
keys.push(keyOrkeys);
|
|
58
|
+
}
|
|
59
|
+
return keys.map((key) => {
|
|
60
|
+
const parsed = validator.safeParse(key);
|
|
61
|
+
if (parsed.success) {
|
|
62
|
+
return Result.Ok(parsed.data);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
return Result.Err(parsed.error);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
export async function coerceJWKWithSchema(sthis, validator, ...inputs) {
|
|
70
|
+
return Promise.all(inputs.flat().map(async (keys) => {
|
|
71
|
+
if (typeof keys === "string") {
|
|
72
|
+
const jwkKeys = [];
|
|
73
|
+
for (const { content, begin, end } of mimeBlockParser(keys)) {
|
|
74
|
+
if (begin && end) {
|
|
75
|
+
const pem = `${begin}\n${content}\n${end}\n`;
|
|
76
|
+
const rKey = await exception2Result(() => importSPKI(pem, "RS256"));
|
|
77
|
+
if (rKey.isErr()) {
|
|
78
|
+
jwkKeys.push(Result.Err(rKey.Err()));
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const key = rKey.Ok();
|
|
82
|
+
const jwk = await exportJWK(key);
|
|
83
|
+
const parsed = validator.safeParse({ ...jwk, alg: "RS256" });
|
|
84
|
+
if (parsed.success) {
|
|
85
|
+
jwkKeys.push(Result.Ok(parsed.data));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
jwkKeys.push(Result.Err(parsed.error));
|
|
89
|
+
}
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
let encodingFailed = Option.Some(Result.Err("Failed to decode JWK string with any known encoding"));
|
|
93
|
+
for (const decodeFn of [
|
|
94
|
+
(a) => a,
|
|
95
|
+
(a) => sthis.txt.base64.decode(a),
|
|
96
|
+
(a) => sthis.txt.base58.decode(a),
|
|
97
|
+
]) {
|
|
98
|
+
const res = exception2Result(() => decodeFn(content));
|
|
99
|
+
if (res.isErr()) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const resStr = res.Ok();
|
|
103
|
+
const keyOrkeys = exception2Result(() => JSON.parse(resStr));
|
|
104
|
+
if (keyOrkeys.isErr()) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
encodingFailed = Option.None();
|
|
108
|
+
for (const rKey of coercesJWKplainOrkeysObject(keyOrkeys.Ok(), validator)) {
|
|
109
|
+
jwkKeys.push(rKey);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (encodingFailed.IsSome()) {
|
|
113
|
+
jwkKeys.push(encodingFailed.Unwrap());
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return jwkKeys;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
return coercesJWKplainOrkeysObject(keys, validator);
|
|
120
|
+
}
|
|
121
|
+
})).then((a) => a.flat());
|
|
122
|
+
}
|
|
123
|
+
export async function coerceJWK(sthis, ...i) {
|
|
124
|
+
const priv = await coerceJWKWithSchema(sthis, JWKPrivateSchema, ...i);
|
|
125
|
+
const pub = await coerceJWKWithSchema(sthis, JWKPublicSchema, ...i);
|
|
126
|
+
if (priv.length !== pub.length) {
|
|
127
|
+
throw new Error("Mismatched number of private and public keys");
|
|
128
|
+
}
|
|
129
|
+
const ret = [];
|
|
130
|
+
for (let idx = 0; idx < priv.length; idx++) {
|
|
131
|
+
const rPriv = priv[idx];
|
|
132
|
+
const rPub = pub[idx];
|
|
133
|
+
if (rPriv.isOk()) {
|
|
134
|
+
ret.push(rPriv);
|
|
135
|
+
}
|
|
136
|
+
else if (rPub.isOk()) {
|
|
137
|
+
ret.push(rPub);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
if (rPriv.Err()) {
|
|
141
|
+
ret.push(Result.Err(rPriv.Err()));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
ret.push(Result.Err(rPub.Err()));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return filterOk(ret);
|
|
149
|
+
}
|
|
150
|
+
export async function coerceJWKPublic(sthis, ...i) {
|
|
151
|
+
return filterOk(await coerceJWKWithSchema(sthis, JWKPublicSchema, ...i));
|
|
152
|
+
}
|
|
153
|
+
export async function coerceJWKPrivate(sthis, ...i) {
|
|
154
|
+
return filterOk(await coerceJWKWithSchema(sthis, JWKPrivateSchema, ...i));
|
|
155
|
+
}
|
|
156
|
+
export async function verifyToken(token, presetPubKey, wellKnownUrls, iopts = {}) {
|
|
157
|
+
const opts = {
|
|
158
|
+
fetchTimeoutMs: 1000,
|
|
159
|
+
parseSchema: (payload) => {
|
|
160
|
+
return Result.Ok(payload);
|
|
161
|
+
},
|
|
162
|
+
fetch: (...args) => globalThis.fetch(...args),
|
|
163
|
+
verifyToken: async (token, pubKey) => {
|
|
164
|
+
const rKey = await importJWK(pubKey);
|
|
165
|
+
if (rKey.isErr()) {
|
|
166
|
+
return Result.Err(rKey);
|
|
167
|
+
}
|
|
168
|
+
const rRes = await exception2Result(() => jwtVerify(token, rKey.Ok().key));
|
|
169
|
+
if (rRes.isErr()) {
|
|
170
|
+
return Result.Err(rRes);
|
|
171
|
+
}
|
|
172
|
+
const res = rRes.Ok();
|
|
173
|
+
if (!res) {
|
|
174
|
+
return Result.Err("JWT verification failed");
|
|
175
|
+
}
|
|
176
|
+
return Result.Ok(res);
|
|
177
|
+
},
|
|
178
|
+
...iopts,
|
|
179
|
+
sthis: iopts.sthis ?? ensureSuperThis(),
|
|
180
|
+
};
|
|
181
|
+
for (const pubKey of presetPubKey) {
|
|
182
|
+
const coercedKeys = await coerceJWKPublic(opts.sthis, pubKey);
|
|
183
|
+
for (const key of coercedKeys) {
|
|
184
|
+
const rVerify = await internVerifyToken(token, key, opts);
|
|
185
|
+
if (rVerify.isOk()) {
|
|
186
|
+
return rVerify;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const errors = [];
|
|
191
|
+
for (const url of wellKnownUrls) {
|
|
192
|
+
const rPubKeys = await fetchWellKnownJwks([url], opts);
|
|
193
|
+
for (const pubKey of rPubKeys) {
|
|
194
|
+
switch (true) {
|
|
195
|
+
case isFetchWellKnownJwksResultErr(pubKey):
|
|
196
|
+
case isFetchWellKnownJwksResultTimeout(pubKey):
|
|
197
|
+
errors.push(pubKey);
|
|
198
|
+
continue;
|
|
199
|
+
case isFetchWellKnownJwksResultOk(pubKey):
|
|
200
|
+
{
|
|
201
|
+
for (const key of pubKey.keys) {
|
|
202
|
+
const rVerify = await internVerifyToken(token, key, opts);
|
|
203
|
+
if (rVerify.isOk()) {
|
|
204
|
+
return rVerify;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
errors.push({
|
|
208
|
+
type: "error",
|
|
209
|
+
error: rVerify.Err(),
|
|
210
|
+
url: pubKey.url,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
break;
|
|
216
|
+
default:
|
|
217
|
+
throw new Error("unreachable");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return Result.Err(`No well-known JWKS URL could verify the token:\n${JSON.stringify(errors, null, 2)}`);
|
|
222
|
+
}
|
|
223
|
+
async function internVerifyToken(token, presetPubKey, opts) {
|
|
224
|
+
const rVerify = await opts.verifyToken(token, presetPubKey);
|
|
225
|
+
if (rVerify.isErr()) {
|
|
226
|
+
return Result.Err(rVerify);
|
|
227
|
+
}
|
|
228
|
+
return opts.parseSchema(rVerify.Ok().payload);
|
|
229
|
+
}
|
|
230
|
+
export function isFetchWellKnownJwksResultOk(r) {
|
|
231
|
+
return r.type === "ok";
|
|
232
|
+
}
|
|
233
|
+
export function isFetchWellKnownJwksResultErr(r) {
|
|
234
|
+
return r.type === "error";
|
|
235
|
+
}
|
|
236
|
+
export function isFetchWellKnownJwksResultTimeout(r) {
|
|
237
|
+
return r.type === "timeout";
|
|
238
|
+
}
|
|
239
|
+
const keysFromWellKnownJwksCache = new KeyedResolvOnce({
|
|
240
|
+
resetAfter: 30 * 60 * 1000,
|
|
241
|
+
});
|
|
242
|
+
export async function fetchWellKnownJwks(urls, iopts = {}) {
|
|
243
|
+
const opts = {
|
|
244
|
+
fetchTimeoutMs: 1000,
|
|
245
|
+
fetch: (...args) => globalThis.fetch(...args),
|
|
246
|
+
...iopts,
|
|
247
|
+
};
|
|
248
|
+
return Promise.all((Array.isArray(urls) ? urls : [urls])
|
|
249
|
+
.flat()
|
|
250
|
+
.map((u) => {
|
|
251
|
+
if (!u) {
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
const buri = BuildURI.from(u);
|
|
255
|
+
const url = buri.URI();
|
|
256
|
+
if (url.pathname === "" || url.pathname === "/") {
|
|
257
|
+
buri.pathname("/.well-known/jwks.json");
|
|
258
|
+
}
|
|
259
|
+
return buri.toString();
|
|
260
|
+
})
|
|
261
|
+
.filter((u) => !!u)
|
|
262
|
+
.map(async (url) => {
|
|
263
|
+
const onceFn = keysFromWellKnownJwksCache.get(url);
|
|
264
|
+
return onceFn.once(async () => {
|
|
265
|
+
const timeout = await timeouted(opts
|
|
266
|
+
.fetch(url, {
|
|
267
|
+
method: "GET",
|
|
268
|
+
})
|
|
269
|
+
.then((res) => {
|
|
270
|
+
if (!res.ok) {
|
|
271
|
+
throw new Error(`Failed to fetch well-known JWKS from ${url}: ${res.status} ${res.statusText}`);
|
|
272
|
+
}
|
|
273
|
+
return res.json();
|
|
274
|
+
}), {
|
|
275
|
+
timeout: opts.fetchTimeoutMs || 1000,
|
|
276
|
+
});
|
|
277
|
+
switch (timeout.state) {
|
|
278
|
+
case "timeout":
|
|
279
|
+
onceFn.reset();
|
|
280
|
+
return {
|
|
281
|
+
type: "timeout",
|
|
282
|
+
url,
|
|
283
|
+
};
|
|
284
|
+
case "error":
|
|
285
|
+
onceFn.reset();
|
|
286
|
+
return {
|
|
287
|
+
type: "error",
|
|
288
|
+
error: timeout.error,
|
|
289
|
+
url,
|
|
290
|
+
};
|
|
291
|
+
case "success": {
|
|
292
|
+
const parsed = z.object({ keys: JWKPublicSchema.array() }).safeParse(timeout.value);
|
|
293
|
+
if (!parsed.success) {
|
|
294
|
+
return {
|
|
295
|
+
type: "error",
|
|
296
|
+
error: new Error(`Invalid JWKS format from ${url}: ${parsed.error.message}`),
|
|
297
|
+
url,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
type: "ok",
|
|
302
|
+
keys: parsed.data.keys,
|
|
303
|
+
url,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
default:
|
|
307
|
+
throw new Error("unreachable");
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=index.js.map
|
package/sts/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../jsr/sts/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzG,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEpF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI7D,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,4BAA4B;IACpC,MAAM,EAAE,4BAA4B;CACrC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAQ,EACR,GAAY,EACZ,OAAmC;IAEnC,IAAI,SAAS,CAAC;IACd,IAAI,GAAG,EAAE,CAAC;QACR,SAAS,GAAG,GAAG,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IACxB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAClF,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAoB,EAAE,KAAK,GAAc,eAAe,EAAE;IAItF,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAsC,CAAC,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/C,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,GAAY,EAAE,KAAK,GAAc,eAAe,EAAE;IAC3F,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAU,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,2BAA2B,CAAC,SAAkB,EAAE,SAAuB;IAC9E,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACzE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAgB,EAChB,SAAuB,EACvB,GAAG,MAAiB;IAEpB,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAsB,EAAE,CAAC;YACtC,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5D,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;oBACjB,MAAM,GAAG,GAAG,GAAG,KAAK,KAAK,OAAO,KAAK,GAAG,IAAI,CAAC;oBAC7C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;oBACpE,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;wBACjB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;wBACrC,SAAS;oBACX,CAAC;oBACD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;oBACtB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;oBACjC,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;oBACvC,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACzC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,IAAI,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;gBACpG,KAAK,MAAM,QAAQ,IAAI;oBACrB,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC;oBAChB,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;oBACzC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;iBAC1C,EAAE,CAAC;oBACF,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;oBACtD,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;wBAChB,SAAS;oBACX,CAAC;oBACD,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC;oBACxB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC7D,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;wBACtB,SAAS;oBACX,CAAC;oBACD,cAAc,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC/B,KAAK,MAAM,IAAI,IAAI,2BAA2B,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;wBAC1E,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrB,CAAC;gBACH,CAAC;gBACD,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC5B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,2BAA2B,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CACH,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAgB,EAAE,GAAG,CAAY;IAC/D,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC;IACpE,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;gBAChB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAgB,EAAE,GAAG,CAAY;IACrE,OAAO,QAAQ,CAAC,MAAM,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,CAAgB,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAgB,EAAE,GAAG,CAAY;IACtE,OAAO,QAAQ,CAAC,MAAM,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAiB,CAAC;AAC5F,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,YAAuC,EACvC,aAAgC,EAChC,KAAK,GAAgC,EAAE;IAEvC,MAAM,IAAI,GAAuB;QAC/B,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,CAAC,OAAgB,EAAE,EAAE;YAChC,OAAO,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAyC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAClF,WAAW,EAAE,KAAK,EAAE,KAAa,EAAE,MAAW,EAAE,EAAE;YAChD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3E,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,GAAG,KAAK;QACR,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,eAAe,EAAE;KACxC,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9D,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,GAAqB,EAAE,IAAI,CAAC,CAAC;YAC5E,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnB,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACvD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,6BAA6B,CAAC,MAAM,CAAC,CAAC;gBAC3C,KAAK,iCAAiC,CAAC,MAAM,CAAC;oBAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpB,SAAS;gBACX,KAAK,4BAA4B,CAAC,MAAM,CAAC;oBACvC,CAAC;wBACC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;4BAC9B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,GAAqB,EAAE,IAAI,CAAC,CAAC;4BAC5E,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gCACnB,OAAO,OAAO,CAAC;4BACjB,CAAC;iCAAM,CAAC;gCACN,MAAM,CAAC,IAAI,CAAC;oCACV,IAAI,EAAE,OAAO;oCACb,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE;oCACpB,GAAG,EAAE,MAAM,CAAC,GAAG;iCAChB,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR;oBACE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,mDAAmD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1G,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,KAAa,EAAE,YAAiB,EAAE,IAAwB;IACzF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC,WAAW,CAAE,OAAO,CAAC,EAAE,EAA2B,CAAC,OAAO,CAAC,CAAC;AAC1E,CAAC;AAkBD,MAAM,UAAU,4BAA4B,CAAC,CAA2B;IACtE,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;AACzB,CAAC;AACD,MAAM,UAAU,6BAA6B,CAAC,CAA2B;IACvE,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AAC5B,CAAC;AACD,MAAM,UAAU,iCAAiC,CAAC,CAA2B;IAC3E,OAAO,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;AAC9B,CAAC;AAED,MAAM,0BAA0B,GAAG,IAAI,eAAe,CAA2B;IAC/E,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAqC,EACrC,KAAK,GAAkE,EAAE;IAEzE,MAAM,IAAI,GAAG;QACX,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,CAAC,GAAG,IAAyC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAClF,GAAG,KAAK;KACT,CAAC;IACF,OAAO,OAAO,CAAC,GAAG,CAChB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAClC,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/B,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACjB,MAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,OAAO,GAAG,MAAM,SAAS,CAC7B,IAAI;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,MAAM,EAAE,KAAK;aACd,CAAC;iBACD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACZ,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;gBAClG,CAAC;gBACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;YACpB,CAAC,CAAC,EACJ;gBACE,OAAO,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;aACrC,CACF,CAAC;YACF,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC;gBACtB,KAAK,SAAS;oBACZ,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO;wBACL,IAAI,EAAE,SAAS;wBACf,GAAG;qBACwB,CAAC;gBAChC,KAAK,OAAO;oBACV,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO;wBACL,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,GAAG;qBACwB,CAAC;gBAChC,KAAK,SAAS,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACpF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBACpB,OAAO;4BACL,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE,IAAI,KAAK,CAAC,4BAA4B,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;4BAC5E,GAAG;yBACwB,CAAC;oBAChC,CAAC;oBACD,OAAO;wBACL,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;wBACtB,GAAG;qBACwB,CAAC;gBAChC,CAAC;gBACD;oBACE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { importJWK as joseImportJWK, exportJWK, SignJWT } from "jose";
|
|
3
|
+
import { ensureSuperThis } from "../index.js";
|
|
4
|
+
import * as exSts from "./index.js";
|
|
5
|
+
import { ES256_PUB_JWK, ES256_PRIV_JWK, JWK2ENV_PUB } from "../golden-fixtures.js";
|
|
6
|
+
const sthis = ensureSuperThis();
|
|
7
|
+
const PUB = { ...ES256_PUB_JWK, alg: "ES256" };
|
|
8
|
+
async function sign(privJwk, claims, expDelta = 300) {
|
|
9
|
+
const key = await joseImportJWK(privJwk, "ES256");
|
|
10
|
+
const now = Math.floor(Date.now() / 1000);
|
|
11
|
+
return new SignJWT(claims)
|
|
12
|
+
.setProtectedHeader({ alg: "ES256" })
|
|
13
|
+
.setIssuedAt(now)
|
|
14
|
+
.setExpirationTime(now + expDelta)
|
|
15
|
+
.sign(key);
|
|
16
|
+
}
|
|
17
|
+
describe("sts lift — byte-compat against the frozen fireproof contract", () => {
|
|
18
|
+
it("jwk2env: extracted output is byte-identical to the frozen fireproof value", async () => {
|
|
19
|
+
const pubKey = await joseImportJWK({ ...ES256_PUB_JWK }, "ES256", { extractable: true });
|
|
20
|
+
expect(await exSts.jwk2env(pubKey, sthis)).toBe(JWK2ENV_PUB);
|
|
21
|
+
});
|
|
22
|
+
it("env2jwk: decodes the frozen env material back to the exact frozen key (Charlie #2858)", async () => {
|
|
23
|
+
const keys = await exSts.env2jwk(JWK2ENV_PUB, undefined, sthis);
|
|
24
|
+
expect(keys.length).toBe(1);
|
|
25
|
+
const jwk = await exportJWK(keys[0]);
|
|
26
|
+
expect({ kty: jwk.kty, crv: jwk.crv, x: jwk.x, y: jwk.y }).toEqual({
|
|
27
|
+
kty: ES256_PUB_JWK.kty,
|
|
28
|
+
crv: ES256_PUB_JWK.crv,
|
|
29
|
+
x: ES256_PUB_JWK.x,
|
|
30
|
+
y: ES256_PUB_JWK.y,
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
it("importJWK: ES256 alg + ok", async () => {
|
|
34
|
+
const r = await exSts.importJWK({ ...PUB });
|
|
35
|
+
expect(r.isOk()).toBe(true);
|
|
36
|
+
expect(r.Ok().alg).toBe("ES256");
|
|
37
|
+
});
|
|
38
|
+
it("verifyToken (preset key): a token signed by the frozen key verifies", async () => {
|
|
39
|
+
const token = await sign({ ...ES256_PRIV_JWK, alg: "ES256" }, { sub: "wire-compat" });
|
|
40
|
+
const r = await exSts.verifyToken(token, [PUB], []);
|
|
41
|
+
expect(r.isOk()).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it("verifyToken (preset key): a token signed by a DIFFERENT key is rejected (no false accept)", async () => {
|
|
44
|
+
const { privateKey, publicKey } = await (await import("jose")).generateKeyPair("ES256", { extractable: true });
|
|
45
|
+
const token = await new SignJWT({ sub: "x" })
|
|
46
|
+
.setProtectedHeader({ alg: "ES256" })
|
|
47
|
+
.setIssuedAt()
|
|
48
|
+
.setExpirationTime("5m")
|
|
49
|
+
.sign(privateKey);
|
|
50
|
+
void publicKey;
|
|
51
|
+
const r = await exSts.verifyToken(token, [PUB], []);
|
|
52
|
+
expect(r.isOk()).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it("verifyToken (well-known JWKS): fetches the JWKS and verifies via the URL branch", async () => {
|
|
55
|
+
const token = await sign({ ...ES256_PRIV_JWK, alg: "ES256" }, { sub: "jwks-path" });
|
|
56
|
+
const jwks = { keys: [{ ...(await exportJWK(await joseImportJWK({ ...ES256_PUB_JWK }, "ES256"))), alg: "ES256" }] };
|
|
57
|
+
const fetchMock = (async () => new Response(JSON.stringify(jwks), { status: 200, headers: { "content-type": "application/json" } }));
|
|
58
|
+
const url = `https://clerk.example.test/${Math.random().toString(36).slice(2)}/.well-known/jwks.json`;
|
|
59
|
+
const r = await exSts.verifyToken(token, [], [url], { fetch: fetchMock });
|
|
60
|
+
expect(r.isOk()).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=sts-golden.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sts-golden.test.js","sourceRoot":"","sources":["../../jsr/sts/sts-golden.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Result } from "@adviser/cement";
|
|
2
|
+
export interface MimeBlock {
|
|
3
|
+
readonly preBegin: string | undefined;
|
|
4
|
+
readonly begin: string | undefined;
|
|
5
|
+
readonly content: string;
|
|
6
|
+
readonly end: string | undefined;
|
|
7
|
+
readonly postEnd: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export declare function mimeBlockParser(mime: string): MimeBlock[];
|
|
10
|
+
export declare function filterOk<T>(results: Result<T>[]): T[];
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export function mimeBlockParser(mime) {
|
|
2
|
+
const blocks = [];
|
|
3
|
+
const lines = mime.split("\n");
|
|
4
|
+
let i = 0;
|
|
5
|
+
let lastProcessedIndex = -1;
|
|
6
|
+
while (i < lines.length) {
|
|
7
|
+
const line = lines[i];
|
|
8
|
+
const beginMatch = line.match(/^(-{3,})\s*(BEGIN)\s+(.+?)\s*(-{3,})$/i);
|
|
9
|
+
if (beginMatch) {
|
|
10
|
+
const leadingDashes = beginMatch[1].length;
|
|
11
|
+
const trailingDashes = beginMatch[4].length;
|
|
12
|
+
const blockType = beginMatch[3];
|
|
13
|
+
const escapedBlockType = blockType.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
14
|
+
const endPattern = new RegExp(`^-{${leadingDashes}}\\s*(END)\\s+${escapedBlockType}\\s*-{${trailingDashes}}$`, "i");
|
|
15
|
+
const preBegin = [];
|
|
16
|
+
for (let j = lastProcessedIndex + 1; j < i; j++) {
|
|
17
|
+
preBegin.push(lines[j]);
|
|
18
|
+
}
|
|
19
|
+
i++;
|
|
20
|
+
const contentLines = [];
|
|
21
|
+
let foundEnd = false;
|
|
22
|
+
let endLine = "";
|
|
23
|
+
while (i < lines.length) {
|
|
24
|
+
if (endPattern.test(lines[i])) {
|
|
25
|
+
foundEnd = true;
|
|
26
|
+
endLine = lines[i];
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
contentLines.push(lines[i]);
|
|
30
|
+
i++;
|
|
31
|
+
}
|
|
32
|
+
if (foundEnd) {
|
|
33
|
+
i++;
|
|
34
|
+
const postEnd = [];
|
|
35
|
+
while (i < lines.length && !lines[i].match(/^-{3,}\s*BEGIN\s+.+-{3,}$/i)) {
|
|
36
|
+
postEnd.push(lines[i]);
|
|
37
|
+
i++;
|
|
38
|
+
}
|
|
39
|
+
blocks.push({
|
|
40
|
+
preBegin: preBegin.length > 0 ? preBegin.join("\n") : undefined,
|
|
41
|
+
begin: line,
|
|
42
|
+
content: contentLines.join("\n"),
|
|
43
|
+
end: endLine,
|
|
44
|
+
postEnd: postEnd.length > 0 ? postEnd.join("\n") : undefined,
|
|
45
|
+
});
|
|
46
|
+
lastProcessedIndex = i - 1;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const allContent = [...preBegin, line, ...contentLines];
|
|
50
|
+
blocks.push({
|
|
51
|
+
begin: undefined,
|
|
52
|
+
end: undefined,
|
|
53
|
+
content: allContent.join("\n"),
|
|
54
|
+
preBegin: undefined,
|
|
55
|
+
postEnd: undefined,
|
|
56
|
+
});
|
|
57
|
+
lastProcessedIndex = i - 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
i++;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (lastProcessedIndex < lines.length - 1) {
|
|
65
|
+
const remainingLines = [];
|
|
66
|
+
for (let j = lastProcessedIndex + 1; j < lines.length; j++) {
|
|
67
|
+
remainingLines.push(lines[j]);
|
|
68
|
+
}
|
|
69
|
+
if (remainingLines.length > 0) {
|
|
70
|
+
blocks.push({
|
|
71
|
+
begin: undefined,
|
|
72
|
+
end: undefined,
|
|
73
|
+
content: remainingLines.join("\n"),
|
|
74
|
+
preBegin: undefined,
|
|
75
|
+
postEnd: undefined,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return blocks;
|
|
80
|
+
}
|
|
81
|
+
export function filterOk(results) {
|
|
82
|
+
const okValues = [];
|
|
83
|
+
for (const res of results) {
|
|
84
|
+
if (res.isOk()) {
|
|
85
|
+
okValues.push(res.Ok());
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return okValues;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=text-blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-blocks.js","sourceRoot":"","sources":["../../jsr/sts/text-blocks.ts"],"names":[],"mappings":"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"}
|
package/testing.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createTestDeviceCA, createTestUser } from "./device-id/test-helpers.js";
|
|
2
|
+
export type { CreateTestUserParams, TestUser } from "./device-id/test-helpers.js";
|
|
3
|
+
export { DeviceIdKey } from "./device-id/key.js";
|
|
4
|
+
export { DeviceIdSignMsg } from "./device-id/sign.js";
|
|
5
|
+
export { DeviceIdCSR } from "./device-id/csr.js";
|
|
6
|
+
export { DeviceIdVerifyMsg } from "./device-id/verify.js";
|
|
7
|
+
export { DeviceIdCA } from "./device-id/ca.js";
|
package/testing.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createTestDeviceCA, createTestUser } from "./device-id/test-helpers.js";
|
|
2
|
+
export { DeviceIdKey } from "./device-id/key.js";
|
|
3
|
+
export { DeviceIdSignMsg } from "./device-id/sign.js";
|
|
4
|
+
export { DeviceIdCSR } from "./device-id/csr.js";
|
|
5
|
+
export { DeviceIdVerifyMsg } from "./device-id/verify.js";
|
|
6
|
+
export { DeviceIdCA } from "./device-id/ca.js";
|
|
7
|
+
//# sourceMappingURL=testing.js.map
|
package/testing.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../jsr/testing.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
package/types/cert-payload.d.ts
CHANGED
|
@@ -1,3 +1,47 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import type
|
|
2
|
+
import { type Subject, type Extensions } from "./device-id-payload.js";
|
|
3
|
+
import { type JWKPublic } from "./wire.js";
|
|
4
|
+
import { type ClerkClaim } from "../clerk-claim.js";
|
|
5
|
+
export interface Certificate {
|
|
6
|
+
version: "3";
|
|
7
|
+
serialNumber: string;
|
|
8
|
+
subject: Subject;
|
|
9
|
+
issuer: Subject;
|
|
10
|
+
validity: {
|
|
11
|
+
notBefore: string;
|
|
12
|
+
notAfter: string;
|
|
13
|
+
};
|
|
14
|
+
subjectPublicKeyInfo: JWKPublic;
|
|
15
|
+
signatureAlgorithm: "ES256";
|
|
16
|
+
keyUsage: ("digitalSignature" | "nonRepudiation" | "keyEncipherment" | "dataEncipherment" | "keyAgreement" | "keyCertSign" | "cRLSign" | "encipherOnly" | "decipherOnly")[];
|
|
17
|
+
extendedKeyUsage: ("serverAuth" | "clientAuth" | "codeSigning" | "emailProtection" | "timeStamping" | "OCSPSigning" | "ipsecIKE" | "msCodeInd" | "msCodeCom" | "msCTLSign" | "msEFS")[];
|
|
18
|
+
extensions?: Extensions;
|
|
19
|
+
}
|
|
20
|
+
export type CertificatePayload = Readonly<{
|
|
21
|
+
iss: string;
|
|
22
|
+
sub: string;
|
|
23
|
+
aud: string | string[];
|
|
24
|
+
iat: number;
|
|
25
|
+
nbf: number;
|
|
26
|
+
exp: number;
|
|
27
|
+
jti: string;
|
|
28
|
+
certificate: Certificate;
|
|
29
|
+
creatingUser?: {
|
|
30
|
+
type: "clerk";
|
|
31
|
+
claims: ClerkClaim;
|
|
32
|
+
};
|
|
33
|
+
}>;
|
|
34
|
+
export interface IssueCertificateResult {
|
|
35
|
+
readonly certificateJWT: string;
|
|
36
|
+
readonly certificatePayload: CertificatePayload;
|
|
37
|
+
readonly format: "JWS";
|
|
38
|
+
readonly serialNumber: string;
|
|
39
|
+
readonly issuer: string;
|
|
40
|
+
readonly subject: string;
|
|
41
|
+
readonly validityPeriod: {
|
|
42
|
+
readonly notBefore: Date;
|
|
43
|
+
readonly notAfter: Date;
|
|
44
|
+
};
|
|
45
|
+
readonly publicKey: JWKPublic;
|
|
46
|
+
}
|
|
3
47
|
export declare const CertificatePayloadSchema: z.ZodType<CertificatePayload>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cert-payload.js","sourceRoot":"","sources":["../../jsr/types/cert-payload.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"cert-payload.js","sourceRoot":"","sources":["../../jsr/types/cert-payload.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAiC,MAAM,wBAAwB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAkB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AA2EtE,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACxB,MAAM,EAAE,gBAAgB;CACzB,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACvB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,aAAa;IACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC;IACF,oBAAoB,EAAE,eAAe;IACrC,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,IAAI,CAAC;QACL,kBAAkB;QAClB,gBAAgB;QAChB,iBAAiB;QACjB,kBAAkB;QAClB,cAAc;QACd,aAAa;QACb,SAAS;QACT,cAAc;QACd,cAAc;KACf,CAAC,CACH;IACD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CACvB,CAAC,CAAC,IAAI,CAAC;QACL,YAAY;QACZ,YAAY;QACZ,aAAa;QACb,iBAAiB;QACjB,cAAc;QACd,aAAa;QACb,UAAU;QACV,WAAW;QACX,WAAW;QACX,WAAW;QACX,OAAO;KACR,CAAC,CACH;IACD,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAQH,MAAM,CAAC,MAAM,wBAAwB,GAAkC,CAAC;KACrE,MAAM,CAAC;IACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,WAAW,EAAE,iBAAiB;IAC9B,YAAY,EAAE,kBAAkB,CAAC,QAAQ,EAAE;CAC5C,CAAC;KACD,QAAQ,EAAmC,CAAC"}
|