@diister/quick-permission 0.9.0-beta.5 → 0.9.0-beta.7
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 +218 -675
- package/dist/mod.d.ts +2 -2
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +1 -1
- package/dist/mod.js.map +1 -1
- package/dist/system.d.ts +45 -70
- package/dist/system.d.ts.map +1 -1
- package/dist/system.js +264 -245
- package/dist/system.js.map +1 -1
- package/mod.ts +9 -1
- package/package.json +1 -1
- package/system.ts +349 -325
package/dist/mod.d.ts
CHANGED
|
@@ -18,8 +18,8 @@ export { defineRule, inputMatch, matchPath, requireSelf } from "./rules.ts";
|
|
|
18
18
|
export type { DefineRuleOpts } from "./rules.ts";
|
|
19
19
|
export { intermediate, permission } from "./permission.ts";
|
|
20
20
|
export type { IntermediateBuilder, IntermediateConfig, PermissionBuilder, PermissionConfig, } from "./permission.ts";
|
|
21
|
-
export { createSystem } from "./system.ts";
|
|
22
|
-
export type { CanContext, Provider, ProviderFn, ProviderObject, System, } from "./system.ts";
|
|
21
|
+
export { createSystem, isCapabilityQuery, isWildcardSegment, refType, } from "./system.ts";
|
|
22
|
+
export type { CanContext, PermissionErrorEvent, Provider, ProviderFetchEvent, ProviderFn, ProviderObject, System, SystemHooks, } from "./system.ts";
|
|
23
23
|
export { applyFilter, pickFields } from "./core/filtering.ts";
|
|
24
24
|
export type { FilterSpec } from "./core/merging.ts";
|
|
25
25
|
//# sourceMappingURL=mod.d.ts.map
|
package/dist/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,YAAY,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,KAAK,EACL,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,cAAc,EACd,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,OAAO,EACP,UAAU,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,cAAc,EACd,QAAQ,GACT,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EACV,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,YAAY,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,KAAK,EACL,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,cAAc,EACd,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,OAAO,EACP,UAAU,EACV,UAAU,EACV,cAAc,EACd,UAAU,EACV,cAAc,EACd,QAAQ,GACT,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EACV,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,OAAO,GACR,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,UAAU,EACV,oBAAoB,EACpB,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,MAAM,EACN,WAAW,GACZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC9D,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/mod.js
CHANGED
|
@@ -19,7 +19,7 @@ export { defineRule, inputMatch, matchPath, requireSelf } from "./rules.js";
|
|
|
19
19
|
// ─── Permission builders ─────────────────────────────────────────────────
|
|
20
20
|
export { intermediate, permission } from "./permission.js";
|
|
21
21
|
// ─── System ──────────────────────────────────────────────────────────────
|
|
22
|
-
export { createSystem } from "./system.js";
|
|
22
|
+
export { createSystem, isCapabilityQuery, isWildcardSegment, refType, } from "./system.js";
|
|
23
23
|
// ─── Field-projection helpers (used outside permission checks too) ───────
|
|
24
24
|
export { applyFilter, pickFields } from "./core/filtering.js";
|
|
25
25
|
//# sourceMappingURL=mod.js.map
|
package/dist/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,4EAA4E;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAgC1C,4EAA4E;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,4EAA4E;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO1D,4EAA4E;AAC5E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG5E,4EAA4E;AAC5E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAQ3D,4EAA4E;AAC5E,OAAO,
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,4EAA4E;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAgC1C,4EAA4E;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,4EAA4E;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO1D,4EAA4E;AAC5E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG5E,4EAA4E;AAC5E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAQ3D,4EAA4E;AAC5E,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,OAAO,GACR,MAAM,aAAa,CAAC;AAYrB,4EAA4E;AAC5E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/system.d.ts
CHANGED
|
@@ -1,43 +1,47 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Moteur d'orchestration resource-pipe.
|
|
3
|
-
*
|
|
4
|
-
* Responsabilités :
|
|
5
|
-
* - Maintenir un cache `(resource.id, dedupKey) → Promise<T>` par context()
|
|
6
|
-
* - Filtrer les rules actives (activeWhen) avant de fetcher leurs needs
|
|
7
|
-
* - Lancer les fetches en parallèle (Promise.all) avec dedup
|
|
8
|
-
* - Évaluer les rules d'un grant en série (préserve l'ordre des reasons)
|
|
9
|
-
* - OR sémantique entre grants : un grant qui passe = `ok: true`
|
|
10
|
-
* - Validation d'arity du target au boot et au check
|
|
11
|
-
*
|
|
12
|
-
* Cf. RFC §"Sémantique d'exécution".
|
|
13
|
-
*/
|
|
14
1
|
import type { CanResult, Grant, IndirectResourceInfo, ListEntry, Permission, Resource, Subject, TreeNode } from "./types.ts";
|
|
15
2
|
import { type IndirectResource } from "./indirect-resource.ts";
|
|
16
3
|
export type ProviderFn = (subject: Subject, key: string, target?: readonly unknown[]) => readonly Grant[] | Promise<readonly Grant[]>;
|
|
17
|
-
/**
|
|
18
|
-
* Provider sous forme objet : permet d'opt-in à la dedup de grants
|
|
19
|
-
* (cacheKey) et au filtrage par préfixe de key (keys/matches).
|
|
20
|
-
*
|
|
21
|
-
* - `keys`/`matches` : le provider est skip si la key demandée ne match pas
|
|
22
|
-
* - `cacheKey` : grants memoizés par (subject, key, target) au sein d'un context
|
|
23
|
-
*/
|
|
24
4
|
export type ProviderObject = {
|
|
5
|
+
readonly name?: string;
|
|
25
6
|
readonly keys?: readonly string[];
|
|
26
7
|
readonly matches?: (key: string) => boolean;
|
|
27
|
-
readonly
|
|
8
|
+
readonly targetType?: string | readonly string[];
|
|
9
|
+
readonly cacheKey?: (subject: Subject, key: string, target?: readonly unknown[]) => string | undefined;
|
|
28
10
|
readonly fetch: ProviderFn;
|
|
29
11
|
};
|
|
30
12
|
export type Provider = ProviderFn | ProviderObject;
|
|
13
|
+
export type ProviderFetchEvent = {
|
|
14
|
+
readonly provider: string;
|
|
15
|
+
readonly subject: Subject;
|
|
16
|
+
readonly key: string;
|
|
17
|
+
readonly target: readonly unknown[] | undefined;
|
|
18
|
+
readonly durationMs: number;
|
|
19
|
+
readonly grantCount: number;
|
|
20
|
+
};
|
|
21
|
+
export type PermissionErrorEvent = {
|
|
22
|
+
readonly source: "provider";
|
|
23
|
+
readonly provider: string;
|
|
24
|
+
readonly subject: Subject;
|
|
25
|
+
readonly key: string;
|
|
26
|
+
readonly target: readonly unknown[] | undefined;
|
|
27
|
+
readonly error: unknown;
|
|
28
|
+
} | {
|
|
29
|
+
readonly source: "rule";
|
|
30
|
+
readonly grantId: string | undefined;
|
|
31
|
+
readonly subject: Subject;
|
|
32
|
+
readonly key: string;
|
|
33
|
+
readonly target: readonly unknown[] | undefined;
|
|
34
|
+
readonly error: unknown;
|
|
35
|
+
};
|
|
36
|
+
export type SystemHooks = {
|
|
37
|
+
readonly onProviderFetch?: (event: ProviderFetchEvent) => void;
|
|
38
|
+
readonly onError?: (event: PermissionErrorEvent) => void;
|
|
39
|
+
};
|
|
40
|
+
export declare function refType(segment: unknown): string | undefined;
|
|
31
41
|
export type CanContext = {
|
|
32
42
|
readonly checkDate?: Date;
|
|
33
43
|
readonly checkIp?: string;
|
|
34
|
-
/**
|
|
35
|
-
readonly broadMatch?: boolean;
|
|
36
|
-
/**
|
|
37
|
-
* Check-time payload exposed to rules as `ctx.input`. Distinct from
|
|
38
|
-
* `grant.payload` (static, seed-time). Consumed by `inputMatch()` to
|
|
39
|
-
* validate a CREATE body against `grant.with`.
|
|
40
|
-
*/
|
|
44
|
+
/** Check-time payload read by `inputMatch()`, as opposed to the grant's static `payload`. */
|
|
41
45
|
readonly input?: unknown;
|
|
42
46
|
};
|
|
43
47
|
export type System<TMeta = unknown> = {
|
|
@@ -46,68 +50,39 @@ export type System<TMeta = unknown> = {
|
|
|
46
50
|
readonly children: Readonly<Record<string, TreeNode<TMeta>>>;
|
|
47
51
|
};
|
|
48
52
|
schema(key: string): Permission<TMeta> | undefined;
|
|
49
|
-
/**
|
|
50
|
-
* Every distinct indirect resource referenced by the schema's rules,
|
|
51
|
-
* deduped by id. Returned in declaration-walk order (first-occurrence
|
|
52
|
-
* wins for dedup). Function fields are stripped — see
|
|
53
|
-
* `IndirectResourceInfo`. Empty if no permission uses `.match()` on an
|
|
54
|
-
* `indirectResource`.
|
|
55
|
-
*/
|
|
53
|
+
/** Deduplicated by id, in declaration order, without their functions. */
|
|
56
54
|
indirectResources(): readonly IndirectResourceInfo[];
|
|
57
|
-
/**
|
|
58
|
-
* Indirect resources referenced by a single permission's rules.
|
|
59
|
-
* `[]` if `key` is unknown or has no `indirect-match` rule. Useful so
|
|
60
|
-
* matrix UIs only render the indirect-match editor on permissions where
|
|
61
|
-
* it has a semantic.
|
|
62
|
-
*/
|
|
63
55
|
indirectsUsedBy(key: string): readonly IndirectResourceInfo[];
|
|
64
|
-
/**
|
|
56
|
+
/** Nothing is cached across calls; prefer `context()` for a request. */
|
|
65
57
|
can(subject: Subject, key: string, target?: readonly unknown[], context?: CanContext): Promise<CanResult>;
|
|
66
|
-
/**
|
|
67
|
-
* Crée un context request-scoped avec cache de fetches partagé entre
|
|
68
|
-
* tous les `can()` qui en découlent.
|
|
69
|
-
*/
|
|
58
|
+
/** Resources and provider grants are cached across every `can()` of the context. */
|
|
70
59
|
context(bound: {
|
|
71
60
|
readonly subject: Subject;
|
|
72
61
|
} & CanContext): {
|
|
73
|
-
/**
|
|
74
|
-
* `perCall` overrides the bound `CanContext` for this single check.
|
|
75
|
-
* Canonical use : passing `input` for a CREATE while keeping the
|
|
76
|
-
* shared (per-request) context. Other fields stay bound — override
|
|
77
|
-
* only when truly per-call.
|
|
78
|
-
*/
|
|
62
|
+
/** `perCall` overrides the bound context for this check only, typically `input` on a create. */
|
|
79
63
|
can(key: string, target?: readonly unknown[], perCall?: CanContext): Promise<CanResult>;
|
|
80
64
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* per-doc projection check doesn't hit the DB again.
|
|
85
|
-
*
|
|
86
|
-
* `dedupKey(doc)` MUST return the same target segments the resource's
|
|
87
|
-
* `dedupKey` would compute at fetch time — otherwise the cache key
|
|
88
|
-
* won't match and the preseed is silently ineffective. For most
|
|
89
|
-
* resources whose dedupKey is `target[i]`, just return `[doc._id]`
|
|
90
|
-
* (or the relevant segments).
|
|
91
|
-
*
|
|
92
|
-
* `value(doc)` is optional. Defaults to identity (the doc itself,
|
|
93
|
-
* used for direct resources). Provide it for indirect resources
|
|
94
|
-
* where the cached value is an array of joined docs nested under
|
|
95
|
-
* an alias (e.g. `d => d._memberships_of_participant`).
|
|
65
|
+
* `dedupKey(doc)` must return the segments the resource's own `dedupKey`
|
|
66
|
+
* computes at fetch time, or the seeded value is never found. `value(doc)`
|
|
67
|
+
* defaults to the doc; an indirect resource caches its joined docs instead.
|
|
96
68
|
*/
|
|
97
69
|
preseed<T, V = T>(resource: Resource<unknown> | IndirectResource | string, docs: ReadonlyArray<T>, opts: {
|
|
98
70
|
dedupKey: (doc: T) => readonly unknown[];
|
|
99
71
|
value?: (doc: T) => V;
|
|
100
72
|
}): void;
|
|
101
|
-
/** Compteurs de fetches par resource.id (debug / observabilité). */
|
|
102
73
|
getFetchCounters(): Readonly<Record<string, number>>;
|
|
103
|
-
/**
|
|
74
|
+
/** Resets the counters, never the cache. */
|
|
104
75
|
clearCounters(): void;
|
|
105
|
-
/**
|
|
76
|
+
/** Only the grants of cached providers already consulted in this context. */
|
|
106
77
|
dumpGrants(): Promise<readonly Grant[]>;
|
|
107
78
|
};
|
|
108
79
|
};
|
|
80
|
+
/** A query with any wildcard segment asks "could this subject, on some target"; rules that need a concrete document pass silently. */
|
|
81
|
+
export declare function isCapabilityQuery(target: readonly unknown[] | undefined): boolean;
|
|
82
|
+
export declare function isWildcardSegment(seg: unknown): boolean;
|
|
109
83
|
export declare function createSystem<TMeta = unknown>(opts: {
|
|
110
84
|
readonly schema: Readonly<Record<string, Permission<TMeta>>>;
|
|
111
85
|
readonly providers?: readonly Provider[];
|
|
86
|
+
readonly hooks?: SystemHooks;
|
|
112
87
|
}): System<TMeta>;
|
|
113
88
|
//# sourceMappingURL=system.d.ts.map
|
package/dist/system.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../system.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,SAAS,EAGT,KAAK,EACL,oBAAoB,EACpB,SAAS,EACT,UAAU,EACV,QAAQ,EAGR,OAAO,EACP,QAAQ,EACT,MAAM,YAAY,CAAC;AASpB,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,KACxB,SAAS,KAAK,EAAE,GAAG,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;AAElD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAClB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,KACxB,MAAM,GAAG,SAAS,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC5B;IACE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;CAC1D,CAAC;AAeF,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI5D;AAmCD,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,MAAM,CAAC,KAAK,GAAG,OAAO,IAAI;IACpC,IAAI,IAAI,SAAS,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;IACpC,IAAI,IAAI;QAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC;IACzE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IACnD,yEAAyE;IACzE,iBAAiB,IAAI,SAAS,oBAAoB,EAAE,CAAC;IACrD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAAC;IAC9D,wEAAwE;IACxE,GAAG,CACD,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,EAC3B,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,SAAS,CAAC,CAAC;IACtB,oFAAoF;IACpF,OAAO,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,UAAU,GAAG;QAC1D,gGAAgG;QAChG,GAAG,CACD,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,EAC3B,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,SAAS,CAAC,CAAC;QACtB;;;;WAIG;QACH,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EACd,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,gBAAgB,GAAG,MAAM,EACvD,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EACtB,IAAI,EAAE;YACJ,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,OAAO,EAAE,CAAC;YACzC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;SACvB,GACA,IAAI,CAAC;QACR,gBAAgB,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACrD,4CAA4C;QAC5C,aAAa,IAAI,IAAI,CAAC;QACtB,6EAA6E;QAC7E,UAAU,IAAI,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;KACzC,CAAC;CACH,CAAC;AAkCF,sIAAsI;AACtI,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,GACrC,OAAO,CAGT;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAEvD;AA+OD,wBAAgB,YAAY,CAAC,KAAK,GAAG,OAAO,EAAE,IAAI,EAAE;IAClD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;CAC9B,GAAG,MAAM,CAAC,KAAK,CAAC,CAihBhB"}
|