@nmnmcc/ability 0.2.0 → 1.0.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 +462 -454
- package/dist/Authorizer.d.ts +241 -0
- package/dist/Authorizer.d.ts.map +1 -0
- package/dist/Authorizer.js +340 -0
- package/dist/Authorizer.js.map +1 -0
- package/dist/Condition.d.ts +915 -0
- package/dist/Condition.d.ts.map +1 -0
- package/dist/Condition.js +1123 -0
- package/dist/Condition.js.map +1 -0
- package/dist/Decision.d.ts +131 -0
- package/dist/Decision.d.ts.map +1 -0
- package/dist/Decision.js +83 -0
- package/dist/Decision.js.map +1 -0
- package/dist/Domain.d.ts +158 -0
- package/dist/Domain.d.ts.map +1 -0
- package/dist/Domain.js +76 -0
- package/dist/Domain.js.map +1 -0
- package/dist/HttpApi.d.ts +173 -0
- package/dist/HttpApi.d.ts.map +1 -0
- package/dist/HttpApi.js +185 -0
- package/dist/HttpApi.js.map +1 -0
- package/dist/Policy.d.ts +687 -0
- package/dist/Policy.d.ts.map +1 -0
- package/dist/Policy.js +1339 -0
- package/dist/Policy.js.map +1 -0
- package/dist/Principal.d.ts +35 -0
- package/dist/Principal.d.ts.map +1 -0
- package/dist/Principal.js +37 -0
- package/dist/Principal.js.map +1 -0
- package/dist/Resource.d.ts +364 -0
- package/dist/Resource.d.ts.map +1 -0
- package/dist/Resource.js +844 -0
- package/dist/Resource.js.map +1 -0
- package/dist/Rule.d.ts +275 -0
- package/dist/Rule.d.ts.map +1 -0
- package/dist/Rule.js +257 -0
- package/dist/Rule.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.js +1 -2
- package/dist/index.d.ts +9 -3
- package/dist/index.js +9 -3
- package/package.json +61 -72
- package/src/Authorizer.ts +894 -0
- package/src/Condition.ts +2997 -0
- package/src/Decision.ts +117 -0
- package/src/Domain.ts +246 -0
- package/src/HttpApi.ts +348 -0
- package/src/Policy.ts +3315 -0
- package/src/Principal.ts +41 -0
- package/src/Resource.ts +1805 -0
- package/src/Rule.ts +683 -0
- package/src/index.ts +57 -0
- package/dist/Ability.d.ts +0 -491
- package/dist/Ability.js +0 -207
- package/dist/AbilityExtra.d.ts +0 -79
- package/dist/AbilityExtra.js +0 -187
- package/dist/internal/ability.d.ts +0 -90
- package/dist/internal/ability.js +0 -550
- package/dist/internal/serializable.js +0 -22
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import * as Schema from "effect/Schema";
|
|
2
|
+
declare namespace Resource_d_exports {
|
|
3
|
+
export { Action, Any, Class, Data, Descriptor, FieldDomain, FieldRef, Kind, Options, PathSegment, Resource, Struct, Value, anyDomain, descriptor, domainOf, fieldPaths, hasGetter, hasMatchingGetter, hasMatchingPath, hasNoValue, hasPath, hasValue, isPlainField, isResource, kindOf, make };
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* One part of a resource path. A string is a fixed part. A field reference
|
|
7
|
+
* takes the part from a field of the value.
|
|
8
|
+
*
|
|
9
|
+
* @stability stable
|
|
10
|
+
* @category models
|
|
11
|
+
* @since 0.3.0
|
|
12
|
+
*/
|
|
13
|
+
export type PathSegment = string | FieldRef<string>;
|
|
14
|
+
/**
|
|
15
|
+
* A reference to a top-level field of a resource, used in a path.
|
|
16
|
+
*
|
|
17
|
+
* @stability stable
|
|
18
|
+
* @category models
|
|
19
|
+
* @since 0.3.0
|
|
20
|
+
*/
|
|
21
|
+
export interface FieldRef<Name extends string> {
|
|
22
|
+
readonly _tag: "Field";
|
|
23
|
+
readonly field: Name;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The runtime data of a resource.
|
|
27
|
+
*
|
|
28
|
+
* @stability stable
|
|
29
|
+
* @category models
|
|
30
|
+
* @since 0.3.0
|
|
31
|
+
*/
|
|
32
|
+
export interface Descriptor {
|
|
33
|
+
readonly kind: string;
|
|
34
|
+
readonly actions: ReadonlyArray<string>;
|
|
35
|
+
readonly path: ReadonlyArray<PathSegment> | undefined;
|
|
36
|
+
/** The paths of the data fields, with dots for nested fields. */
|
|
37
|
+
readonly fieldPaths: ReadonlyArray<string>;
|
|
38
|
+
/**
|
|
39
|
+
* The paths in {@link fieldPaths} of fields that hold more than one value,
|
|
40
|
+
* such as a record, a map or an array. The parts of such a field are not
|
|
41
|
+
* in `fieldPaths`, but a rule may name them.
|
|
42
|
+
*/
|
|
43
|
+
readonly openPaths: ReadonlyArray<string>;
|
|
44
|
+
/**
|
|
45
|
+
* A struct Schema of the data of the values, with the `_tag` field. It is a
|
|
46
|
+
* struct also for a `Resource.Class`. The class Schema must not be read
|
|
47
|
+
* before the class is made, because Effect then binds the class Schema to
|
|
48
|
+
* the base class, and the values lose the getters of the class.
|
|
49
|
+
*/
|
|
50
|
+
readonly schema: Schema.Top;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A resource. `Kind` is its name, `Action` is the union of its actions, `Data`
|
|
54
|
+
* is the type of its Schema fields, and `Value` is the type of its values.
|
|
55
|
+
*
|
|
56
|
+
* @stability stable
|
|
57
|
+
* @category models
|
|
58
|
+
* @since 0.3.0
|
|
59
|
+
*/
|
|
60
|
+
export interface Resource<Kind extends string, Action extends string, Data extends object, Value extends {
|
|
61
|
+
readonly _tag: Kind;
|
|
62
|
+
}> {
|
|
63
|
+
readonly descriptor: Descriptor;
|
|
64
|
+
readonly "~Resource"?: {
|
|
65
|
+
readonly Kind: Kind;
|
|
66
|
+
readonly Action: Action;
|
|
67
|
+
readonly Data: Data;
|
|
68
|
+
readonly Value: Value;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Any resource.
|
|
73
|
+
*
|
|
74
|
+
* @stability stable
|
|
75
|
+
* @category models
|
|
76
|
+
* @since 0.3.0
|
|
77
|
+
*/
|
|
78
|
+
export type Any = Resource<string, string, object, {
|
|
79
|
+
readonly _tag: string;
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* The kind name of a resource.
|
|
83
|
+
*
|
|
84
|
+
* @stability stable
|
|
85
|
+
* @category utility types
|
|
86
|
+
* @since 0.3.0
|
|
87
|
+
*/
|
|
88
|
+
export type Kind<R> = R extends Resource<infer K, any, any, any> ? K : never;
|
|
89
|
+
/**
|
|
90
|
+
* The actions of a resource.
|
|
91
|
+
*
|
|
92
|
+
* @stability stable
|
|
93
|
+
* @category utility types
|
|
94
|
+
* @since 0.3.0
|
|
95
|
+
*/
|
|
96
|
+
export type Action<R> = R extends Resource<any, infer A, any, any> ? A : never;
|
|
97
|
+
/**
|
|
98
|
+
* The type of the Schema fields of a resource, without `_tag`.
|
|
99
|
+
*
|
|
100
|
+
* @stability stable
|
|
101
|
+
* @category utility types
|
|
102
|
+
* @since 0.3.0
|
|
103
|
+
*/
|
|
104
|
+
export type Data<R> = R extends Resource<any, any, infer D, any> ? D : never;
|
|
105
|
+
/**
|
|
106
|
+
* The type of the values of a resource.
|
|
107
|
+
*
|
|
108
|
+
* @stability stable
|
|
109
|
+
* @category utility types
|
|
110
|
+
* @since 0.3.0
|
|
111
|
+
*/
|
|
112
|
+
export type Value<R> = R extends Resource<any, any, any, infer V> ? V : never;
|
|
113
|
+
/**
|
|
114
|
+
* The options of a resource.
|
|
115
|
+
*
|
|
116
|
+
* @stability stable
|
|
117
|
+
* @category models
|
|
118
|
+
* @since 0.3.0
|
|
119
|
+
*/
|
|
120
|
+
export interface Options<Actions extends ReadonlyArray<string>, Fields extends Schema.Struct.Fields> {
|
|
121
|
+
readonly actions: Actions;
|
|
122
|
+
readonly fields: Fields;
|
|
123
|
+
/**
|
|
124
|
+
* Gives the path of the resource. The function gets one reference for each
|
|
125
|
+
* top-level field.
|
|
126
|
+
*/
|
|
127
|
+
readonly path?: (fields: { readonly [K in keyof Fields & string]: FieldRef<K>; }) => ReadonlyArray<string | FieldRef<keyof Fields & string>>;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Tests if a path names a getter of a class Schema, such as a getter of a
|
|
131
|
+
* `Schema.Class` or a `Principal.Class`, at its root or in a nested field. A
|
|
132
|
+
* condition reads such a field, and the types of a condition take it, so the
|
|
133
|
+
* check of a policy takes it too. It goes into the fields of a struct, the
|
|
134
|
+
* values of a record, the members of a union, `Schema.suspend`, and a class
|
|
135
|
+
* with an annotation or a check.
|
|
136
|
+
*
|
|
137
|
+
* @stability stable
|
|
138
|
+
* @category predicates
|
|
139
|
+
* @since 1.0.0
|
|
140
|
+
*/
|
|
141
|
+
export declare const hasGetter: (schema: unknown, path: string) => boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Tests if a Schema has a getter of a class at a path whose parts fit
|
|
144
|
+
* `parts`, as `hasGetter` does for one path. A part fits a name when `fits`
|
|
145
|
+
* says so, as a part with `*` fits many names. A part `**` stands for any
|
|
146
|
+
* number of parts, also none.
|
|
147
|
+
*
|
|
148
|
+
* @stability stable
|
|
149
|
+
* @category predicates
|
|
150
|
+
* @since 1.0.0
|
|
151
|
+
*/
|
|
152
|
+
export declare const hasMatchingGetter: (schema: unknown, parts: ReadonlyArray<string>, fits: (part: string, name: string) => boolean) => boolean;
|
|
153
|
+
/**
|
|
154
|
+
* Gives the paths of all the fields of a Schema, with dots for nested fields.
|
|
155
|
+
* A nested struct gives its own path and the paths of its fields. Arrays are
|
|
156
|
+
* left out. It throws when a field name has a dot or is empty, because such a
|
|
157
|
+
* name would give two fields one path, or a path with an empty part.
|
|
158
|
+
*
|
|
159
|
+
* @stability stable
|
|
160
|
+
* @category getters
|
|
161
|
+
* @since 1.0.0
|
|
162
|
+
*/
|
|
163
|
+
export declare const fieldPaths: (schema: Schema.Top) => ReadonlyArray<string>;
|
|
164
|
+
/**
|
|
165
|
+
* Tests if a path names a plain scalar field of a Schema: a string, a number,
|
|
166
|
+
* a boolean, a literal, `null`, or an optional field or a union of these. Its
|
|
167
|
+
* only checks may be integer and finite checks: another check, such as
|
|
168
|
+
* `isGreaterThan(0)`, stops values that the search does not know about. On
|
|
169
|
+
* the way, each part must be a required field of a plain struct with no
|
|
170
|
+
* checks, with a name that is not a name of `Object.prototype`.
|
|
171
|
+
*
|
|
172
|
+
* `Policy.coverage` and `Condition.satisfiable` answer `All`, `None` or
|
|
173
|
+
* `Some` only when each field of the condition is such a field. Their model of
|
|
174
|
+
* the values of a field is exact for these Schemas. For other Schemas, such as
|
|
175
|
+
* classes, records, unions of structs or declarations, a value may have data
|
|
176
|
+
* that the Schema does not show, and the answer is `Unknown`.
|
|
177
|
+
*
|
|
178
|
+
* @stability stable
|
|
179
|
+
* @category predicates
|
|
180
|
+
* @since 1.0.0
|
|
181
|
+
*/
|
|
182
|
+
export declare const isPlainField: (schema: Schema.Top, path: string) => boolean;
|
|
183
|
+
/**
|
|
184
|
+
* Tests if a path names a field of a Schema that holds a value with no named
|
|
185
|
+
* fields: a scalar, or a value such as a record or an array. It goes into
|
|
186
|
+
* records by their keys, and into recursive Schemas as far as the path goes.
|
|
187
|
+
* So it finds paths that {@link fieldPaths} does not list.
|
|
188
|
+
*
|
|
189
|
+
* @stability stable
|
|
190
|
+
* @category predicates
|
|
191
|
+
* @since 1.0.0
|
|
192
|
+
*/
|
|
193
|
+
export declare const hasPath: (schema: Schema.Top, path: string) => boolean;
|
|
194
|
+
/**
|
|
195
|
+
* Tests if a Schema has a field whose path fits a pattern. `parts` are the
|
|
196
|
+
* parts of the pattern, split at the dots. A part `**` stands for any number
|
|
197
|
+
* of parts, also none. Another part fits a name when `fits` says so, as a
|
|
198
|
+
* part with `*` fits many names. For a record, the walk asks if the key
|
|
199
|
+
* Schema takes a key that fits the part. For a template literal key Schema,
|
|
200
|
+
* with parts that are literals and strings, the answer is exact. For another key Schema, the walk tries sample keys, so it may miss a
|
|
201
|
+
* key, and then the answer is `false`.
|
|
202
|
+
*
|
|
203
|
+
* @stability stable
|
|
204
|
+
* @category predicates
|
|
205
|
+
* @since 1.0.0
|
|
206
|
+
*/
|
|
207
|
+
export declare const hasMatchingPath: (schema: Schema.Top, parts: ReadonlyArray<string>, fits: (part: string, name: string) => boolean) => boolean;
|
|
208
|
+
/**
|
|
209
|
+
* Tests if a Schema surely has a value: each required field, at each depth,
|
|
210
|
+
* has a type that has values, with no checks other than integer and finite
|
|
211
|
+
* checks on numbers. A check such as a minimum length may stop every value,
|
|
212
|
+
* and the library can not see that, so such a Schema gives `false`. So does a
|
|
213
|
+
* required field that holds the struct itself again.
|
|
214
|
+
*
|
|
215
|
+
* @stability stable
|
|
216
|
+
* @category predicates
|
|
217
|
+
* @since 1.0.0
|
|
218
|
+
*/
|
|
219
|
+
export declare const hasValue: (schema: Schema.Top) => boolean;
|
|
220
|
+
/**
|
|
221
|
+
* Tests if a Schema has no value at all: a required field of it, at some
|
|
222
|
+
* depth, has no value, as `Schema.Never` has none. A required field that
|
|
223
|
+
* holds the struct itself again, with no way to stop, has no finite value
|
|
224
|
+
* either. Other checks, such as a minimum and a maximum that do not meet, are
|
|
225
|
+
* not seen, so a "no" does not prove that the Schema has a value.
|
|
226
|
+
*
|
|
227
|
+
* @stability stable
|
|
228
|
+
* @category predicates
|
|
229
|
+
* @since 1.0.0
|
|
230
|
+
*/
|
|
231
|
+
export declare const hasNoValue: (schema: Schema.Top) => boolean;
|
|
232
|
+
/**
|
|
233
|
+
* The values that one field of a resource may hold, as a condition sees them.
|
|
234
|
+
* A missing field and `undefined` are `null`. The domain may be larger than
|
|
235
|
+
* the real set of values: Schema checks other than finite and integer checks
|
|
236
|
+
* are left out. A larger domain only makes a check say "no" more often.
|
|
237
|
+
*
|
|
238
|
+
* @stability stable
|
|
239
|
+
* @category models
|
|
240
|
+
* @since 1.0.0
|
|
241
|
+
*/
|
|
242
|
+
export interface FieldDomain {
|
|
243
|
+
/** The field may be `null` or missing. */
|
|
244
|
+
readonly null: boolean;
|
|
245
|
+
/** The field may hold a value with parts, or a value that is not a scalar. */
|
|
246
|
+
readonly object: boolean;
|
|
247
|
+
/** The field may hold `true` and `false`. */
|
|
248
|
+
readonly boolean: boolean;
|
|
249
|
+
/** The field may hold any string. */
|
|
250
|
+
readonly string: boolean;
|
|
251
|
+
/** The numbers that the field may hold. */
|
|
252
|
+
readonly number: "none" | "integer" | "finite" | "any";
|
|
253
|
+
/** Single values that the field may hold, other than the ones above. */
|
|
254
|
+
readonly literals: ReadonlyArray<string | number | boolean>;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* The domain of a field with no Schema: any value.
|
|
258
|
+
*
|
|
259
|
+
* @stability stable
|
|
260
|
+
* @category constants
|
|
261
|
+
* @since 1.0.0
|
|
262
|
+
*/
|
|
263
|
+
export declare const anyDomain: FieldDomain;
|
|
264
|
+
/**
|
|
265
|
+
* Gives the domain of a field of a Schema, by its path with dots. A path that
|
|
266
|
+
* the Schema does not name gives `null`, as a condition reads such a field.
|
|
267
|
+
*
|
|
268
|
+
* @stability stable
|
|
269
|
+
* @category getters
|
|
270
|
+
* @since 1.0.0
|
|
271
|
+
*/
|
|
272
|
+
export declare const domainOf: (schema: Schema.Top, path: string) => FieldDomain;
|
|
273
|
+
/**
|
|
274
|
+
* The type of a class made by {@link Class}.
|
|
275
|
+
*
|
|
276
|
+
* @stability stable
|
|
277
|
+
* @category models
|
|
278
|
+
* @since 0.3.0
|
|
279
|
+
*/
|
|
280
|
+
export type Class<Self, Kind extends string, Actions extends ReadonlyArray<string>, Fields extends Schema.Struct.Fields> = Schema.Class<Self, Schema.TaggedStruct<Kind, Fields>, {}> & Resource<Kind, Actions[number], Schema.Struct.Type<Fields>, Self & {
|
|
281
|
+
readonly _tag: Kind;
|
|
282
|
+
}> & {
|
|
283
|
+
readonly kind: Kind;
|
|
284
|
+
readonly actions: Actions;
|
|
285
|
+
};
|
|
286
|
+
/**
|
|
287
|
+
* Makes a resource as a Schema class. Use it in the same way as
|
|
288
|
+
* `Schema.TaggedClass`.
|
|
289
|
+
*
|
|
290
|
+
* @example
|
|
291
|
+
* ```ts
|
|
292
|
+
* import { Schema } from "effect"
|
|
293
|
+
* import { Resource } from "@nmnmcc/ability"
|
|
294
|
+
*
|
|
295
|
+
* class Bot extends Resource.Class<Bot>()("Bot", {
|
|
296
|
+
* actions: ["read", "update"],
|
|
297
|
+
* fields: {
|
|
298
|
+
* id: Schema.String,
|
|
299
|
+
* ownerUserId: Schema.NullOr(Schema.String),
|
|
300
|
+
* },
|
|
301
|
+
* path: (f) => ["user", f.ownerUserId, "bot", f.id],
|
|
302
|
+
* }) {}
|
|
303
|
+
*
|
|
304
|
+
* const bot = new Bot({ id: "b1", ownerUserId: "u1" })
|
|
305
|
+
* ```
|
|
306
|
+
*
|
|
307
|
+
* @stability stable
|
|
308
|
+
* @category constructors
|
|
309
|
+
* @since 0.3.0
|
|
310
|
+
*/
|
|
311
|
+
export declare const Class: <Self = never>(identifier?: string) => <const Kind extends string, const Actions extends ReadonlyArray<string>, const Fields extends Schema.Struct.Fields>(kind: Kind, options: Options<Actions, Fields>) => [Self] extends [never] ? "Missing `Self` type: use Resource.Class<Self>()(...)" : Class<Self, Kind, Actions, Fields>;
|
|
312
|
+
/**
|
|
313
|
+
* A resource made by {@link make}. Its values are plain objects.
|
|
314
|
+
*
|
|
315
|
+
* @stability stable
|
|
316
|
+
* @category models
|
|
317
|
+
* @since 0.3.0
|
|
318
|
+
*/
|
|
319
|
+
export interface Struct<Kind extends string, Actions extends ReadonlyArray<string>, Fields extends Schema.Struct.Fields> extends Resource<Kind, Actions[number], Schema.Struct.Type<Fields>, Schema.Struct.Type<Fields> & {
|
|
320
|
+
readonly _tag: Kind;
|
|
321
|
+
}> {
|
|
322
|
+
readonly kind: Kind;
|
|
323
|
+
readonly actions: Actions;
|
|
324
|
+
readonly schema: Schema.TaggedStruct<Kind, Fields>;
|
|
325
|
+
/** Makes a value. It puts the `_tag` field on the value for you. */
|
|
326
|
+
readonly make: (input: Schema.Struct.Type<Fields>) => Schema.Struct.Type<Fields> & {
|
|
327
|
+
readonly _tag: Kind;
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Makes a resource from plain fields. Its values are plain objects with a
|
|
332
|
+
* `_tag` field.
|
|
333
|
+
*
|
|
334
|
+
* @stability stable
|
|
335
|
+
* @category constructors
|
|
336
|
+
* @since 0.3.0
|
|
337
|
+
*/
|
|
338
|
+
export declare const make: <const Kind extends string, const Actions extends ReadonlyArray<string>, const Fields extends Schema.Struct.Fields>(kind: Kind, options: Options<Actions, Fields>) => Struct<Kind, Actions, Fields>;
|
|
339
|
+
/**
|
|
340
|
+
* Tests if a value is a resource.
|
|
341
|
+
*
|
|
342
|
+
* @stability stable
|
|
343
|
+
* @category guards
|
|
344
|
+
* @since 0.3.0
|
|
345
|
+
*/
|
|
346
|
+
export declare const isResource: (u: unknown) => u is Any;
|
|
347
|
+
/**
|
|
348
|
+
* Gets the runtime data of a resource.
|
|
349
|
+
*
|
|
350
|
+
* @stability stable
|
|
351
|
+
* @category getters
|
|
352
|
+
* @since 0.3.0
|
|
353
|
+
*/
|
|
354
|
+
export declare const descriptor: (resource: Any) => Descriptor;
|
|
355
|
+
/**
|
|
356
|
+
* Gives the kind name of a resource value, from its `_tag` field.
|
|
357
|
+
*
|
|
358
|
+
* @stability stable
|
|
359
|
+
* @category getters
|
|
360
|
+
* @since 1.0.0
|
|
361
|
+
*/
|
|
362
|
+
export declare const kindOf: (value: unknown) => string | undefined;
|
|
363
|
+
export { Resource_d_exports };
|
|
364
|
+
//# sourceMappingURL=Resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Resource.d.ts","names":[],"sources":["../src/Resource.ts"],"mappings":";;;;;;;;;;;;YAwCY,uBAAuB;;;;;;;;iBASlB,SAAS;WAChB;WACA,OAAO;;;;;;;;;iBAUA;WACP;WACA,SAAS;WACT,MAAM,cAAc;;WAEpB,YAAY;;;;;;WAMZ,WAAW;;;;;;;WAOX,QAAQ,OAAO;;;;;;;;;;iBAWR,SAChB,qBACA,uBACA,qBACA;WAAyB,MAAM;;WAEtB,YAAY;WACZ;aACC,MAAM;aACN,QAAQ;aACR,MAAM;aACN,OAAO;;;;;;;;;;YAWN,MAAM;WAA4C;;;;;;;;;YASlD,KAAK,KAAK,UAAU,eAAe,oBAAoB;;;;;;;;YASvD,OAAO,KAAK,UAAU,oBAAoB,eAAe;;;;;;;;YASzD,KAAK,KAAK,UAAU,yBAAyB,UAAU;;;;;;;;YASvD,MAAM,KAAK,UAAU,8BAA8B,KAAK;;;;;;;;iBASnD,QAChB,gBAAgB,uBAChB,eAAe,OAAO,OAAO;WAEpB,SAAS;WACT,QAAQ;;;;;WAKR,QAAQ,oBACN,WAAW,kBAAkB,SAAS,UAC3C,uBAAuB,eAAe;;;;;;;;;;;;;;qBAiEhC,YAAS,iBAAmB;;;;;;;;;;;qBAgC5B,oBAAiB,iBACd,OACR,uBAAqB,OACrB,cAAc;;;;;;;;;;;qBAuRT,aAAU,QAAY,OAAO,QAAM;;;;;;;;;;;;;;;;;;;qBA0EnC,eAAY,QAAY,OAAO,KAAG;;;;;;;;;;;qBAmClC,UAAO,QAAY,OAAO,KAAG;;;;;;;;;;;;;;qBAuF7B,kBAAe,QACnB,OAAO,KAAG,OACX,uBAAqB,OACrB,cAAc;;;;;;;;;;;;qBAkVT,WAAQ,QAAY,OAAO;;;;;;;;;;;;qBAiJ3B,aAAU,QAAY,OAAO;;;;;;;;;;;iBA0CzB;;WAEP;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA,UAAU;;;;;;;;;qBAyBP,WAAW;;;;;;;;;qBA0MX,WAAQ,QAAY,OAAO,KAAG,iBAAiB;;;;;;;;YAsIhD,MACX,MACA,qBACA,gBAAgB,uBAChB,eAAe,OAAO,OAAO,UAC1B,OAAO,MAAM,MAAM,OAAO,aAAa,MAAM,eAChD,SACC,MACA,iBACA,OAAO,OAAO,KAAK,SACnB;WAAkB,MAAM;;WAEf,MAAM;WACN,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA4BP,QAAQ,cACpB,+BAEM,2BACA,gBAAgB,6BAChB,eAAe,OAAO,OAAO,QAEnC,MAAM,MACN,SAAS,QAAQ,SAAS,aACrB,iFAEH,MAAM,MAAM,MAAM,SAAS;;;;;;;;iBAyBb,OAChB,qBACA,gBAAgB,uBAChB,eAAe,OAAO,OAAO,gBACpB,SACT,MACA,iBACA,OAAO,OAAO,KAAK,SACnB,OAAO,OAAO,KAAK;WAAqB,MAAM;;WAErC,MAAM;WACN,SAAS;WACT,QAAQ,OAAO,aAAa,MAAM;;WAElC,OACR,OAAO,OAAO,OAAO,KAAK,YACtB,OAAO,OAAO,KAAK;aAAqB,MAAM;;;;;;;;;;;qBAWvC,aACN,2BACA,gBAAgB,6BAChB,eAAe,OAAO,OAAO,QAEnC,MAAM,MACN,SAAS,QAAQ,SAAS,YACtB,OAAO,MAAM,SAAS;;;;;;;;qBA0Bd,aAAU,eAAiB,KAAK;;;;;;;;qBAUhC,aAAU,UAAc,QAAM;;;;;;;;qBAS9B,SAAM"}
|