@lowlighter/is 1.3.3
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 +33 -0
- package/is.d.ts +40 -0
- package/is.js +338 -0
- package/mod.d.ts +1 -0
- package/mod.js +2 -0
- package/package.json +25 -0
- package/testing/mod.d.ts +1 -0
- package/testing/mod.js +2 -0
- package/testing/spec.d.ts +48 -0
- package/testing/spec.js +504 -0
package/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 🪪 Is
|
|
2
|
+
|
|
3
|
+
[](https://jsr.io/@libs/is) [](https://jsr.io/@libs/is)
|
|
4
|
+
|
|
5
|
+
A wrapper around [Zod](https://zod.dev/) to ease type validation and assertions.
|
|
6
|
+
|
|
7
|
+
It also contains some additional validators, in addition to a spec checker.
|
|
8
|
+
|
|
9
|
+
- [`📚 Documentation`](https://jsr.io/@libs/is/doc)
|
|
10
|
+
|
|
11
|
+
## 📖 Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { coerce, duration, is, parse, url } from "@libs/is"
|
|
15
|
+
|
|
16
|
+
// `is` re-exports Zod, augmented with additional validators and transformers
|
|
17
|
+
const schema = is.object({
|
|
18
|
+
origin: url,
|
|
19
|
+
timeout: duration(is.number().min(0)),
|
|
20
|
+
retries: coerce(is.number().int().nonnegative()).default(3),
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
// `parse()` works like `schema.parse()` but throws a `TypeError` with prettified issues instead of a `ZodError`
|
|
24
|
+
parse(schema, { origin: "https://example.com", timeout: "1m 30s", retries: "5" })
|
|
25
|
+
// { origin: "https://example.com", timeout: 90000, retries: 5 }
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 📜 License
|
|
29
|
+
|
|
30
|
+
```plaintext
|
|
31
|
+
Copyright (c) Simon Lecoq <@lowlighter>. (MIT License)
|
|
32
|
+
https://github.com/lowlighter/libs/blob/main/LICENSE
|
|
33
|
+
```
|
package/is.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ParseOptions as ParseArgsOptions } from "@std/cli/parse-args";
|
|
2
|
+
import * as is from "@zod/zod";
|
|
3
|
+
export * as is from "@zod/zod";
|
|
4
|
+
export type * from "@zod/zod";
|
|
5
|
+
/** Coalesces a parsed value to `undefined` so schema defaults can be applied. */ export declare function coalesce<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
|
|
6
|
+
/** Coerces a parsed value into `number` type when possible. */ export declare function coerce<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
|
|
7
|
+
/** Allows the `null` value and makes it the default value in schemas. */ export declare function nullable<T extends is.ZodType>(schema: T): is.ZodDefault<is.ZodNullable<T>>;
|
|
8
|
+
/** Ensures a parsed value is compatible with `structuredClone` algorithm. */ export declare function clonable<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
|
|
9
|
+
/** Transforms a parsed value into an array if it is not already one. */ export declare function arrayable<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
|
|
10
|
+
/** Transforms a CLI arguments string into an object or array. */ export declare function cliable<T extends is.ZodType>(schema: T, options?: ParseArgsOptions): is.ZodPreprocess<T>;
|
|
11
|
+
/** Parses a regular expression back into a `RegExp`. */ export declare function regex<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
|
|
12
|
+
/** Parses a date string back into a `Date`. */ export declare function date<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
|
|
13
|
+
/** Parses a duration string into milliseconds. */ export declare function duration<T extends is.ZodType>(schema: T): is.ZodPreprocess<T>;
|
|
14
|
+
/** Type alias for primitive values. */ export declare const primitive: is.ZodUnion<readonly [is.ZodString, is.ZodNumber, is.ZodBigInt, is.ZodBoolean, is.ZodUndefined, is.ZodNull, is.ZodDate, is.ZodCustom<Error, Error>]>;
|
|
15
|
+
/** Type alias for typed arrays. */ export declare const typedArray: is.ZodUnion<readonly [is.ZodCustom<Int8Array, Int8Array>, is.ZodCustom<Uint8Array, Uint8Array>, is.ZodCustom<Uint8ClampedArray, Uint8ClampedArray>, is.ZodCustom<Int16Array, Int16Array>, is.ZodCustom<Uint16Array, Uint16Array>, is.ZodCustom<Int32Array, Int32Array>, is.ZodCustom<Uint32Array, Uint32Array>, is.ZodCustom<Float16Array, Float16Array>, is.ZodCustom<Float32Array, Float32Array>, is.ZodCustom<Float64Array, Float64Array>, is.ZodCustom<BigInt64Array, BigInt64Array>, is.ZodCustom<BigUint64Array, BigUint64Array>]>;
|
|
16
|
+
/** Type alias for URLs with supported protocols. */ export declare const url: is.ZodURL & {
|
|
17
|
+
/** Create a new type alias for URLs with additional custom supported protocols. */ with(additional: string[], params?: Omit<is.z.core.$ZodURLParams, "protocol">): is.ZodURL;
|
|
18
|
+
};
|
|
19
|
+
/** Type alias for body init. */ export declare const bodyInit: is.ZodNullable<is.ZodUnion<readonly [is.ZodString, is.ZodCustom<String, String>, is.ZodCustom<Blob, Blob>, is.ZodCustom<ArrayBuffer, ArrayBuffer>, is.ZodCustom<DataView, DataView>, is.ZodCustom<FormData, FormData>, is.ZodCustom<ReadableStream, ReadableStream>, is.ZodCustom<URLSearchParams, URLSearchParams>, typeof typedArray]>>;
|
|
20
|
+
/** Type alias factory for permissions object. */ export declare function permissions<T extends keyof Deno.PermissionOptionsObject>(options?: {
|
|
21
|
+
set?: T[];
|
|
22
|
+
expand?: false;
|
|
23
|
+
}): is.ZodUnion<readonly [is.ZodObject<Record<T, is.ZodOptional<is.ZodPreprocess<is.ZodUnion<[is.ZodLiteral<"inherit">, is.ZodBoolean, is.ZodArray<is.ZodString>]>>>>>, is.ZodUnion<readonly [is.ZodLiteral<"inherit">, is.ZodLiteral<"none">]>]>;
|
|
24
|
+
/** Type alias factory for permissions object. */ export declare function permissions<T extends keyof Deno.PermissionOptionsObject>(options: {
|
|
25
|
+
set?: T[];
|
|
26
|
+
expand: true;
|
|
27
|
+
}): is.ZodPreprocess<is.ZodObject<Record<T, is.ZodPreprocess<is.ZodUnion<[is.ZodLiteral<"inherit">, is.ZodLiteral<true>, is.ZodArray<is.ZodString>]>>>>>;
|
|
28
|
+
/** Type alias for expression strings. */ export declare const expression: is.ZodString;
|
|
29
|
+
/** Type alias for callable values. */ export declare const callable: is.ZodCustom<Function, unknown>;
|
|
30
|
+
/** Type alias for Zod schemas. */ export declare const parser: is.ZodCustom<is.ZodType, unknown>;
|
|
31
|
+
/** Options for {@linkcode parse()}. */ export type ParseOptions = {
|
|
32
|
+
/** Whether to parse asynchronously. */ async?: boolean;
|
|
33
|
+
/** Whether to throw a `ZodError` rather than a `TypeError` in case of failure */ zodError?: boolean;
|
|
34
|
+
};
|
|
35
|
+
/** Parse a schema synchronously. */ export declare function parse<T extends is.ZodType>(schema: T, values: unknown, options?: Omit<ParseOptions, "async"> & {
|
|
36
|
+
async?: false;
|
|
37
|
+
}): is.infer<T>;
|
|
38
|
+
/** Parse a schema asynchronously. */ export declare function parse<T extends is.ZodType>(schema: T, values: unknown, options: Omit<ParseOptions, "async"> & {
|
|
39
|
+
async: true;
|
|
40
|
+
}): Promise<is.infer<T>>;
|
package/is.js
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
// Imports
|
|
2
|
+
// deno-lint-ignore-file no-explicit-any ban-types
|
|
3
|
+
import { parseArgs } from "@std/cli/parse-args";
|
|
4
|
+
import * as is from "@zod/zod";
|
|
5
|
+
export * as is from "@zod/zod";
|
|
6
|
+
/** Coalesces a parsed value to `undefined` so schema defaults can be applied. */ export function coalesce(schema) {
|
|
7
|
+
return is.preprocess((value)=>{
|
|
8
|
+
return value ?? undefined;
|
|
9
|
+
}, schema);
|
|
10
|
+
}
|
|
11
|
+
/** Coerces a parsed value into `number` type when possible. */ export function coerce(schema) {
|
|
12
|
+
return is.preprocess((value)=>{
|
|
13
|
+
if (typeof value === "string") {
|
|
14
|
+
const coerced = Number(value);
|
|
15
|
+
if (!Number.isNaN(coerced) || value === "NaN") return coerced;
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}, schema);
|
|
19
|
+
}
|
|
20
|
+
/** Allows the `null` value and makes it the default value in schemas. */ export function nullable(schema) {
|
|
21
|
+
return schema.nullable().default(null);
|
|
22
|
+
}
|
|
23
|
+
/** Ensures a parsed value is compatible with `structuredClone` algorithm. */ export function clonable(schema) {
|
|
24
|
+
return is.preprocess((value, context)=>{
|
|
25
|
+
try {
|
|
26
|
+
structuredClone(value);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
context.addIssue(`Invalid input: Value must be compatible with structuredClone algorithm: ${error}`);
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}, schema);
|
|
32
|
+
}
|
|
33
|
+
/** Transforms a parsed value into an array if it is not already one. */ export function arrayable(schema) {
|
|
34
|
+
return is.preprocess((value)=>{
|
|
35
|
+
if (!Array.isArray(value)) return [
|
|
36
|
+
value
|
|
37
|
+
];
|
|
38
|
+
return value;
|
|
39
|
+
}, schema);
|
|
40
|
+
}
|
|
41
|
+
/** Transforms a CLI arguments string into an object or array. */ export function cliable(schema, options) {
|
|
42
|
+
return is.preprocess((value, context)=>{
|
|
43
|
+
if (typeof value === "string") {
|
|
44
|
+
const args = [];
|
|
45
|
+
let current = "";
|
|
46
|
+
let quoted = "";
|
|
47
|
+
let escape = false;
|
|
48
|
+
let quotes = false;
|
|
49
|
+
for (const char of value){
|
|
50
|
+
if (escape) {
|
|
51
|
+
current += char;
|
|
52
|
+
escape = false;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (quoted === '"' && char === "\\") {
|
|
56
|
+
escape = true;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (!quoted && (char === '"' || char === "'")) {
|
|
60
|
+
quoted = char;
|
|
61
|
+
quotes = true;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (quoted === char) {
|
|
65
|
+
quoted = "";
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (!quoted && char === " ") {
|
|
69
|
+
if (current || quotes) {
|
|
70
|
+
args.push(current);
|
|
71
|
+
current = "";
|
|
72
|
+
quotes = false;
|
|
73
|
+
}
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
current += char;
|
|
77
|
+
}
|
|
78
|
+
if (quoted) {
|
|
79
|
+
context.addIssue(`Unclosed quote: ${quoted}${current}`);
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
if (current || quotes) args.push(current);
|
|
83
|
+
return options ? parseArgs(args, options) : args;
|
|
84
|
+
}
|
|
85
|
+
return value;
|
|
86
|
+
}, schema);
|
|
87
|
+
}
|
|
88
|
+
/** Parses a regular expression back into a `RegExp`. */ export function regex(schema) {
|
|
89
|
+
const definition = /^\/(?<pattern>.*?)\/(?<flags>[dgimsuvy]*)$/s;
|
|
90
|
+
return is.preprocess((value)=>{
|
|
91
|
+
if (typeof value === "string") {
|
|
92
|
+
const groups = value.match(definition)?.groups;
|
|
93
|
+
if (groups) {
|
|
94
|
+
const { pattern, flags } = groups;
|
|
95
|
+
try {
|
|
96
|
+
return new RegExp(pattern, flags);
|
|
97
|
+
} catch {
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return value;
|
|
103
|
+
}, schema);
|
|
104
|
+
}
|
|
105
|
+
/** Parses a date string back into a `Date`. */ export function date(schema) {
|
|
106
|
+
return is.preprocess((value)=>{
|
|
107
|
+
if (typeof value === "string") {
|
|
108
|
+
const date = new Date(value);
|
|
109
|
+
if (!Number.isNaN(date.getTime())) return date;
|
|
110
|
+
}
|
|
111
|
+
return value;
|
|
112
|
+
}, schema);
|
|
113
|
+
}
|
|
114
|
+
/** Parses a duration string into milliseconds. */ export function duration(schema) {
|
|
115
|
+
return is.preprocess((value)=>{
|
|
116
|
+
if (typeof value === "string") {
|
|
117
|
+
const groups = value.match(/^\s*(?:(?<days>\d+)d(?:ays?)?)?\s*(?:(?<hours>\d+)h(?:(?:ou)?rs?)?)?\s*(?:(?<minutes>\d+)m(?:in(?:ute)?s?)?)?\s*(?:(?<seconds>\d+)s(?:ec(?:ond)?s?)?)?\s*(?:(?<milliseconds>\d+)(?:m(?:illi)?s(?:ec(?:ond)?s?)?)?)?\s*$/)?.groups;
|
|
118
|
+
if (groups) {
|
|
119
|
+
let { days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0 } = Object.fromEntries(Object.entries(groups).map(([key, value])=>[
|
|
120
|
+
key,
|
|
121
|
+
Number(value)
|
|
122
|
+
]).filter(([_, value])=>Number.isFinite(value)));
|
|
123
|
+
hours += days * 24;
|
|
124
|
+
minutes += hours * 60;
|
|
125
|
+
seconds += minutes * 60;
|
|
126
|
+
milliseconds += seconds * 1000;
|
|
127
|
+
return milliseconds;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return value;
|
|
131
|
+
}, schema);
|
|
132
|
+
}
|
|
133
|
+
/** Type alias for primitive values. */ export const primitive = is.union([
|
|
134
|
+
is.string(),
|
|
135
|
+
is.number(),
|
|
136
|
+
is.bigint(),
|
|
137
|
+
is.boolean(),
|
|
138
|
+
is.undefined(),
|
|
139
|
+
is.null(),
|
|
140
|
+
is.date(),
|
|
141
|
+
is.instanceof(Error)
|
|
142
|
+
]);
|
|
143
|
+
/** Type alias for typed arrays. */ export const typedArray = is.union([
|
|
144
|
+
is.instanceof(Int8Array),
|
|
145
|
+
is.instanceof(Uint8Array),
|
|
146
|
+
is.instanceof(Uint8ClampedArray),
|
|
147
|
+
is.instanceof(Int16Array),
|
|
148
|
+
is.instanceof(Uint16Array),
|
|
149
|
+
is.instanceof(Int32Array),
|
|
150
|
+
is.instanceof(Uint32Array),
|
|
151
|
+
is.instanceof(Float16Array),
|
|
152
|
+
is.instanceof(Float32Array),
|
|
153
|
+
is.instanceof(Float64Array),
|
|
154
|
+
is.instanceof(BigInt64Array),
|
|
155
|
+
is.instanceof(BigUint64Array)
|
|
156
|
+
]);
|
|
157
|
+
/** Supported protocols for {@linkcode url} type alias. */ const protocols = [
|
|
158
|
+
"https?",
|
|
159
|
+
"file",
|
|
160
|
+
"wasm",
|
|
161
|
+
"data",
|
|
162
|
+
"blob",
|
|
163
|
+
"jsr",
|
|
164
|
+
"npm"
|
|
165
|
+
];
|
|
166
|
+
/** Type alias for URLs with supported protocols. */ export const url = Object.assign(is.url({
|
|
167
|
+
protocol: new RegExp(`^(?:${protocols.join("|")})$`),
|
|
168
|
+
hostname: /.*/
|
|
169
|
+
}), {
|
|
170
|
+
with (additional, { hostname = /.*/, ...options } = {}) {
|
|
171
|
+
const escaped = additional.map((protocol)=>protocol.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
|
|
172
|
+
return is.url({
|
|
173
|
+
...options,
|
|
174
|
+
protocol: new RegExp(`^(?:${[
|
|
175
|
+
...protocols,
|
|
176
|
+
...escaped
|
|
177
|
+
].join("|")})$`),
|
|
178
|
+
hostname
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
/** Type alias for body init. */ export const bodyInit = is.union([
|
|
183
|
+
is.string(),
|
|
184
|
+
is.instanceof(String),
|
|
185
|
+
is.instanceof(Blob),
|
|
186
|
+
is.instanceof(ArrayBuffer),
|
|
187
|
+
is.instanceof(DataView),
|
|
188
|
+
is.instanceof(FormData),
|
|
189
|
+
is.instanceof(ReadableStream),
|
|
190
|
+
is.instanceof(URLSearchParams),
|
|
191
|
+
typedArray
|
|
192
|
+
]).nullable();
|
|
193
|
+
/**
|
|
194
|
+
* System permissions flags.
|
|
195
|
+
*
|
|
196
|
+
* See {@link https://docs.deno.com/runtime/fundamentals/security/#system-information}.
|
|
197
|
+
*/ const sysflags = [
|
|
198
|
+
"hostname",
|
|
199
|
+
"osRelease",
|
|
200
|
+
"osUptime",
|
|
201
|
+
"loadavg",
|
|
202
|
+
"networkInterfaces",
|
|
203
|
+
"systemMemoryInfo",
|
|
204
|
+
"uid",
|
|
205
|
+
"gid"
|
|
206
|
+
];
|
|
207
|
+
/** Type alias factory for permission descriptors. */ function permission({ expand = false, urls = false, sys = false } = {}) {
|
|
208
|
+
return is.preprocess((value)=>{
|
|
209
|
+
if (value === "inherit") return value;
|
|
210
|
+
if (typeof value === "string") value = [
|
|
211
|
+
value
|
|
212
|
+
];
|
|
213
|
+
if (expand) {
|
|
214
|
+
if (value === undefined || value === false) value = [];
|
|
215
|
+
}
|
|
216
|
+
if (urls && Array.isArray(value)) value = value.map((value)=>value instanceof URL ? value.href : value);
|
|
217
|
+
return value;
|
|
218
|
+
}, is.union([
|
|
219
|
+
is.literal("inherit"),
|
|
220
|
+
is.boolean(),
|
|
221
|
+
is.array(sys ? is.enum(sysflags) : is.string())
|
|
222
|
+
]));
|
|
223
|
+
}
|
|
224
|
+
export function permissions({ set = [
|
|
225
|
+
"read",
|
|
226
|
+
"write",
|
|
227
|
+
"net",
|
|
228
|
+
"env",
|
|
229
|
+
"run",
|
|
230
|
+
"sys",
|
|
231
|
+
"ffi",
|
|
232
|
+
"import"
|
|
233
|
+
], expand = false } = {}) {
|
|
234
|
+
const validator = is.object({
|
|
235
|
+
read: permission({
|
|
236
|
+
expand,
|
|
237
|
+
urls: true
|
|
238
|
+
}),
|
|
239
|
+
write: permission({
|
|
240
|
+
expand,
|
|
241
|
+
urls: true
|
|
242
|
+
}),
|
|
243
|
+
net: permission({
|
|
244
|
+
expand
|
|
245
|
+
}),
|
|
246
|
+
env: permission({
|
|
247
|
+
expand
|
|
248
|
+
}),
|
|
249
|
+
sys: permission({
|
|
250
|
+
expand,
|
|
251
|
+
sys: true
|
|
252
|
+
}),
|
|
253
|
+
run: permission({
|
|
254
|
+
expand,
|
|
255
|
+
urls: true
|
|
256
|
+
}),
|
|
257
|
+
ffi: permission({
|
|
258
|
+
expand,
|
|
259
|
+
urls: true
|
|
260
|
+
}),
|
|
261
|
+
import: permission({
|
|
262
|
+
expand
|
|
263
|
+
})
|
|
264
|
+
}).pick(Object.fromEntries(set.map((key)=>[
|
|
265
|
+
key,
|
|
266
|
+
true
|
|
267
|
+
]))).strict();
|
|
268
|
+
// Return either the compact or expanded version
|
|
269
|
+
if (!expand) return validator.partial().or(is.union([
|
|
270
|
+
is.literal("inherit"),
|
|
271
|
+
is.literal("none")
|
|
272
|
+
]));
|
|
273
|
+
return is.preprocess((value)=>{
|
|
274
|
+
if (value === "inherit" || value === "none") return Object.fromEntries(set.map((key)=>[
|
|
275
|
+
key,
|
|
276
|
+
value === "none" ? [] : value
|
|
277
|
+
]));
|
|
278
|
+
if (typeof value === "string") value = [
|
|
279
|
+
value
|
|
280
|
+
];
|
|
281
|
+
if (Array.isArray(value)) return {
|
|
282
|
+
...Object.fromEntries(set.map((permission)=>[
|
|
283
|
+
permission,
|
|
284
|
+
false
|
|
285
|
+
])),
|
|
286
|
+
...Object.fromEntries(value.map((permission)=>[
|
|
287
|
+
permission,
|
|
288
|
+
"inherit"
|
|
289
|
+
]))
|
|
290
|
+
};
|
|
291
|
+
return value;
|
|
292
|
+
}, validator);
|
|
293
|
+
}
|
|
294
|
+
/** Type alias for expression strings. */ export const expression = is.string().regex(/\$\{.*\}/);
|
|
295
|
+
/** Type alias for callable values. */ export const callable = is.unknown().refine((value)=>typeof value === "function", {
|
|
296
|
+
message: "Invalid input: Value must be callable"
|
|
297
|
+
});
|
|
298
|
+
/** Type alias for Zod schemas. */ export const parser = is.custom((value)=>value instanceof is.ZodType || value && typeof value === "object" && typeof value.parse === "function", {
|
|
299
|
+
message: "Invalid input: Value must be a Zod schema"
|
|
300
|
+
});
|
|
301
|
+
/** Convert a property key path to a string. */ function toPath(path = []) {
|
|
302
|
+
const segments = [];
|
|
303
|
+
for (const segment of path){
|
|
304
|
+
if (typeof segment === "number") segments.push(`[${segment}]`);
|
|
305
|
+
else if (typeof segment === "symbol" || /[^\w$]/.test(String(segment))) segments.push(`[${JSON.stringify(String(segment))}]`);
|
|
306
|
+
else segments.push(`.${segment}`);
|
|
307
|
+
}
|
|
308
|
+
return segments.join("");
|
|
309
|
+
}
|
|
310
|
+
/** Prettify validation issues in a more detailed way. */ function prettifyIssue(errors, { indent = "" } = {}) {
|
|
311
|
+
const lines = [];
|
|
312
|
+
errors = [
|
|
313
|
+
...errors
|
|
314
|
+
].sort((a, b)=>(a.path ?? []).length - (b.path ?? []).length);
|
|
315
|
+
for (const error of errors){
|
|
316
|
+
lines.push(`${indent}✘ ${error.message}`);
|
|
317
|
+
if (error.path?.length) lines.push(`${indent} → at ${toPath(error.path)}`);
|
|
318
|
+
if (error.errors?.length) {
|
|
319
|
+
lines.push(`${indent} → tried to fit into one of the allowed types:`);
|
|
320
|
+
for (const suberror of error.errors)lines.push(prettifyIssue(suberror, {
|
|
321
|
+
indent: `${indent} `
|
|
322
|
+
}).replace(" ✘", "- ✘"));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return lines.join("\n");
|
|
326
|
+
}
|
|
327
|
+
export function parse(schema, values, { async = false, zodError } = {}) {
|
|
328
|
+
try {
|
|
329
|
+
return async ? schema.parseAsync(values).catch((error)=>{
|
|
330
|
+
if (!(error instanceof is.ZodError) || zodError) throw error;
|
|
331
|
+
throw new TypeError(`Validation failed: \n${prettifyIssue(error.issues)}`);
|
|
332
|
+
}) : schema.parse(values);
|
|
333
|
+
} catch (error) {
|
|
334
|
+
if (!(error instanceof is.ZodError) || zodError) throw error;
|
|
335
|
+
throw new TypeError(`Validation failed: \n${prettifyIssue(error.issues)}`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvaXMvaXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuLy8gZGVuby1saW50LWlnbm9yZS1maWxlIG5vLWV4cGxpY2l0LWFueSBiYW4tdHlwZXNcbmltcG9ydCB0eXBlIHsgUGFyc2VPcHRpb25zIGFzIFBhcnNlQXJnc09wdGlvbnMgfSBmcm9tIFwiQHN0ZC9jbGkvcGFyc2UtYXJnc1wiXG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tIFwiQHN0ZC9jbGkvcGFyc2UtYXJnc1wiXG5pbXBvcnQgKiBhcyBpcyBmcm9tIFwiQHpvZC96b2RcIlxuZXhwb3J0ICogYXMgaXMgZnJvbSBcIkB6b2Qvem9kXCJcbmV4cG9ydCB0eXBlICogZnJvbSBcIkB6b2Qvem9kXCJcblxuLyoqIENvYWxlc2NlcyBhIHBhcnNlZCB2YWx1ZSB0byBgdW5kZWZpbmVkYCBzbyBzY2hlbWEgZGVmYXVsdHMgY2FuIGJlIGFwcGxpZWQuICovXG5leHBvcnQgZnVuY3Rpb24gY29hbGVzY2U8VCBleHRlbmRzIGlzLlpvZFR5cGU+KHNjaGVtYTogVCk6IGlzLlpvZFByZXByb2Nlc3M8VD4ge1xuICByZXR1cm4gaXMucHJlcHJvY2VzcygodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgPz8gdW5kZWZpbmVkXG4gIH0sIHNjaGVtYSlcbn1cblxuLyoqIENvZXJjZXMgYSBwYXJzZWQgdmFsdWUgaW50byBgbnVtYmVyYCB0eXBlIHdoZW4gcG9zc2libGUuICovXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlPFQgZXh0ZW5kcyBpcy5ab2RUeXBlPihzY2hlbWE6IFQpOiBpcy5ab2RQcmVwcm9jZXNzPFQ+IHtcbiAgcmV0dXJuIGlzLnByZXByb2Nlc3MoKHZhbHVlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgY29lcmNlZCA9IE51bWJlcih2YWx1ZSlcbiAgICAgIGlmICgoIU51bWJlci5pc05hTihjb2VyY2VkKSkgfHwgKHZhbHVlID09PSBcIk5hTlwiKSlcbiAgICAgICAgcmV0dXJuIGNvZXJjZWRcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0sIHNjaGVtYSlcbn1cblxuLyoqIEFsbG93cyB0aGUgYG51bGxgIHZhbHVlIGFuZCBtYWtlcyBpdCB0aGUgZGVmYXVsdCB2YWx1ZSBpbiBzY2hlbWFzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bGxhYmxlPFQgZXh0ZW5kcyBpcy5ab2RUeXBlPihzY2hlbWE6IFQpOiBpcy5ab2REZWZhdWx0PGlzLlpvZE51bGxhYmxlPFQ+PiB7XG4gIHJldHVybiBzY2hlbWEubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpXG59XG5cbi8qKiBFbnN1cmVzIGEgcGFyc2VkIHZhbHVlIGlzIGNvbXBhdGlibGUgd2l0aCBgc3RydWN0dXJlZENsb25lYCBhbGdvcml0aG0uICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmFibGU8VCBleHRlbmRzIGlzLlpvZFR5cGU+KHNjaGVtYTogVCk6IGlzLlpvZFByZXByb2Nlc3M8VD4ge1xuICByZXR1cm4gaXMucHJlcHJvY2VzcygodmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICB0cnkge1xuICAgICAgc3RydWN0dXJlZENsb25lKHZhbHVlKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmFkZElzc3VlKGBJbnZhbGlkIGlucHV0OiBWYWx1ZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBzdHJ1Y3R1cmVkQ2xvbmUgYWxnb3JpdGhtOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9LCBzY2hlbWEpXG59XG5cbi8qKiBUcmFuc2Zvcm1zIGEgcGFyc2VkIHZhbHVlIGludG8gYW4gYXJyYXkgaWYgaXQgaXMgbm90IGFscmVhZHkgb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5YWJsZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBUKTogaXMuWm9kUHJlcHJvY2VzczxUPiB7XG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICByZXR1cm4gW3ZhbHVlXVxuICAgIHJldHVybiB2YWx1ZVxuICB9LCBzY2hlbWEpXG59XG5cbi8qKiBUcmFuc2Zvcm1zIGEgQ0xJIGFyZ3VtZW50cyBzdHJpbmcgaW50byBhbiBvYmplY3Qgb3IgYXJyYXkuICovXG5leHBvcnQgZnVuY3Rpb24gY2xpYWJsZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBULCBvcHRpb25zPzogUGFyc2VBcmdzT3B0aW9ucyk6IGlzLlpvZFByZXByb2Nlc3M8VD4ge1xuICByZXR1cm4gaXMucHJlcHJvY2VzcygodmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBhcmdzID0gW11cbiAgICAgIGxldCBjdXJyZW50ID0gXCJcIlxuICAgICAgbGV0IHF1b3RlZCA9IFwiXCJcbiAgICAgIGxldCBlc2NhcGUgPSBmYWxzZVxuICAgICAgbGV0IHF1b3RlcyA9IGZhbHNlXG4gICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdmFsdWUpIHtcbiAgICAgICAgaWYgKGVzY2FwZSkge1xuICAgICAgICAgIGN1cnJlbnQgKz0gY2hhclxuICAgICAgICAgIGVzY2FwZSA9IGZhbHNlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHF1b3RlZCA9PT0gJ1wiJykgJiYgKGNoYXIgPT09IFwiXFxcXFwiKSkge1xuICAgICAgICAgIGVzY2FwZSA9IHRydWVcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGlmICgoIXF1b3RlZCkgJiYgKChjaGFyID09PSAnXCInKSB8fCAoY2hhciA9PT0gXCInXCIpKSkge1xuICAgICAgICAgIHF1b3RlZCA9IGNoYXJcbiAgICAgICAgICBxdW90ZXMgPSB0cnVlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVvdGVkID09PSBjaGFyKSB7XG4gICAgICAgICAgcXVvdGVkID0gXCJcIlxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCghcXVvdGVkKSAmJiAoY2hhciA9PT0gXCIgXCIpKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgfHwgcXVvdGVzKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goY3VycmVudClcbiAgICAgICAgICAgIGN1cnJlbnQgPSBcIlwiXG4gICAgICAgICAgICBxdW90ZXMgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgKz0gY2hhclxuICAgICAgfVxuICAgICAgaWYgKHF1b3RlZCkge1xuICAgICAgICBjb250ZXh0LmFkZElzc3VlKGBVbmNsb3NlZCBxdW90ZTogJHtxdW90ZWR9JHtjdXJyZW50fWApXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnQgfHwgcXVvdGVzKVxuICAgICAgICBhcmdzLnB1c2goY3VycmVudClcbiAgICAgIHJldHVybiBvcHRpb25zID8gcGFyc2VBcmdzKGFyZ3MsIG9wdGlvbnMpIDogYXJnc1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfSwgc2NoZW1hKVxufVxuXG4vKiogUGFyc2VzIGEgcmVndWxhciBleHByZXNzaW9uIGJhY2sgaW50byBhIGBSZWdFeHBgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2V4PFQgZXh0ZW5kcyBpcy5ab2RUeXBlPihzY2hlbWE6IFQpOiBpcy5ab2RQcmVwcm9jZXNzPFQ+IHtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IC9eXFwvKD88cGF0dGVybj4uKj8pXFwvKD88ZmxhZ3M+W2RnaW1zdXZ5XSopJC9zXG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IHZhbHVlLm1hdGNoKGRlZmluaXRpb24pPy5ncm91cHNcbiAgICAgIGlmIChncm91cHMpIHtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBmbGFncyB9ID0gZ3JvdXBzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZ3MpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9LCBzY2hlbWEpXG59XG5cbi8qKiBQYXJzZXMgYSBkYXRlIHN0cmluZyBiYWNrIGludG8gYSBgRGF0ZWAuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBUKTogaXMuWm9kUHJlcHJvY2VzczxUPiB7XG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSlcbiAgICAgICAgcmV0dXJuIGRhdGVcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0sIHNjaGVtYSlcbn1cblxuLyoqIFBhcnNlcyBhIGR1cmF0aW9uIHN0cmluZyBpbnRvIG1pbGxpc2Vjb25kcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkdXJhdGlvbjxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBUKTogaXMuWm9kUHJlcHJvY2VzczxUPiB7XG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IGdyb3VwcyA9IHZhbHVlLm1hdGNoKC9eXFxzKig/Oig/PGRheXM+XFxkKylkKD86YXlzPyk/KT9cXHMqKD86KD88aG91cnM+XFxkKyloKD86KD86b3UpP3JzPyk/KT9cXHMqKD86KD88bWludXRlcz5cXGQrKW0oPzppbig/OnV0ZSk/cz8pPyk/XFxzKig/Oig/PHNlY29uZHM+XFxkKylzKD86ZWMoPzpvbmQpP3M/KT8pP1xccyooPzooPzxtaWxsaXNlY29uZHM+XFxkKykoPzptKD86aWxsaSk/cyg/OmVjKD86b25kKT9zPyk/KT8pP1xccyokLyk/Lmdyb3Vwc1xuICAgICAgaWYgKGdyb3Vwcykge1xuICAgICAgICBsZXQgeyBkYXlzID0gMCwgaG91cnMgPSAwLCBtaW51dGVzID0gMCwgc2Vjb25kcyA9IDAsIG1pbGxpc2Vjb25kcyA9IDAgfSA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhncm91cHMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBOdW1iZXIodmFsdWUpXSkuZmlsdGVyKChbXywgdmFsdWVdKSA9PiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSlcbiAgICAgICAgaG91cnMgKz0gZGF5cyAqIDI0XG4gICAgICAgIG1pbnV0ZXMgKz0gaG91cnMgKiA2MFxuICAgICAgICBzZWNvbmRzICs9IG1pbnV0ZXMgKiA2MFxuICAgICAgICBtaWxsaXNlY29uZHMgKz0gc2Vjb25kcyAqIDEwMDBcbiAgICAgICAgcmV0dXJuIG1pbGxpc2Vjb25kc1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfSwgc2NoZW1hKVxufVxuXG4vKiogVHlwZSBhbGlhcyBmb3IgcHJpbWl0aXZlIHZhbHVlcy4gKi9cbmV4cG9ydCBjb25zdCBwcmltaXRpdmUgPSBpcy51bmlvbihbaXMuc3RyaW5nKCksIGlzLm51bWJlcigpLCBpcy5iaWdpbnQoKSwgaXMuYm9vbGVhbigpLCBpcy51bmRlZmluZWQoKSwgaXMubnVsbCgpLCBpcy5kYXRlKCksIGlzLmluc3RhbmNlb2YoRXJyb3IpXSkgYXMgaXMuWm9kVW5pb248XG4gIHJlYWRvbmx5IFtpcy5ab2RTdHJpbmcsIGlzLlpvZE51bWJlciwgaXMuWm9kQmlnSW50LCBpcy5ab2RCb29sZWFuLCBpcy5ab2RVbmRlZmluZWQsIGlzLlpvZE51bGwsIGlzLlpvZERhdGUsIGlzLlpvZEN1c3RvbTxFcnJvciwgRXJyb3I+XVxuPlxuXG4vKiogVHlwZSBhbGlhcyBmb3IgdHlwZWQgYXJyYXlzLiAqL1xuZXhwb3J0IGNvbnN0IHR5cGVkQXJyYXkgPSBpcy51bmlvbihbXG4gIGlzLmluc3RhbmNlb2YoSW50OEFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihVaW50OEFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihVaW50OENsYW1wZWRBcnJheSksXG4gIGlzLmluc3RhbmNlb2YoSW50MTZBcnJheSksXG4gIGlzLmluc3RhbmNlb2YoVWludDE2QXJyYXkpLFxuICBpcy5pbnN0YW5jZW9mKEludDMyQXJyYXkpLFxuICBpcy5pbnN0YW5jZW9mKFVpbnQzMkFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihGbG9hdDE2QXJyYXkpLFxuICBpcy5pbnN0YW5jZW9mKEZsb2F0MzJBcnJheSksXG4gIGlzLmluc3RhbmNlb2YoRmxvYXQ2NEFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihCaWdJbnQ2NEFycmF5KSxcbiAgaXMuaW5zdGFuY2VvZihCaWdVaW50NjRBcnJheSksXG5dKSBhcyBpcy5ab2RVbmlvbjxcbiAgcmVhZG9ubHkgW1xuICAgIGlzLlpvZEN1c3RvbTxJbnQ4QXJyYXksIEludDhBcnJheT4sXG4gICAgaXMuWm9kQ3VzdG9tPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+LFxuICAgIGlzLlpvZEN1c3RvbTxVaW50OENsYW1wZWRBcnJheSwgVWludDhDbGFtcGVkQXJyYXk+LFxuICAgIGlzLlpvZEN1c3RvbTxJbnQxNkFycmF5LCBJbnQxNkFycmF5PixcbiAgICBpcy5ab2RDdXN0b208VWludDE2QXJyYXksIFVpbnQxNkFycmF5PixcbiAgICBpcy5ab2RDdXN0b208SW50MzJBcnJheSwgSW50MzJBcnJheT4sXG4gICAgaXMuWm9kQ3VzdG9tPFVpbnQzMkFycmF5LCBVaW50MzJBcnJheT4sXG4gICAgaXMuWm9kQ3VzdG9tPEZsb2F0MTZBcnJheSwgRmxvYXQxNkFycmF5PixcbiAgICBpcy5ab2RDdXN0b208RmxvYXQzMkFycmF5LCBGbG9hdDMyQXJyYXk+LFxuICAgIGlzLlpvZEN1c3RvbTxGbG9hdDY0QXJyYXksIEZsb2F0NjRBcnJheT4sXG4gICAgaXMuWm9kQ3VzdG9tPEJpZ0ludDY0QXJyYXksIEJpZ0ludDY0QXJyYXk+LFxuICAgIGlzLlpvZEN1c3RvbTxCaWdVaW50NjRBcnJheSwgQmlnVWludDY0QXJyYXk+LFxuICBdXG4+XG5cbi8qKiBTdXBwb3J0ZWQgcHJvdG9jb2xzIGZvciB7QGxpbmtjb2RlIHVybH0gdHlwZSBhbGlhcy4gKi9cbmNvbnN0IHByb3RvY29scyA9IFtcImh0dHBzP1wiLCBcImZpbGVcIiwgXCJ3YXNtXCIsIFwiZGF0YVwiLCBcImJsb2JcIiwgXCJqc3JcIiwgXCJucG1cIl1cblxuLyoqIFR5cGUgYWxpYXMgZm9yIFVSTHMgd2l0aCBzdXBwb3J0ZWQgcHJvdG9jb2xzLiAqL1xuZXhwb3J0IGNvbnN0IHVybCA9IE9iamVjdC5hc3NpZ24oaXMudXJsKHsgcHJvdG9jb2w6IG5ldyBSZWdFeHAoYF4oPzoke3Byb3RvY29scy5qb2luKFwifFwiKX0pJGApLCBob3N0bmFtZTogLy4qLyB9KSwge1xuICB3aXRoKGFkZGl0aW9uYWw6IHN0cmluZ1tdLCB7IGhvc3RuYW1lID0gLy4qLywgLi4ub3B0aW9ucyB9OiBPbWl0PGlzLnouY29yZS4kWm9kVVJMUGFyYW1zLCBcInByb3RvY29sXCI+ID0ge30pIHtcbiAgICBjb25zdCBlc2NhcGVkID0gYWRkaXRpb25hbC5tYXAoKHByb3RvY29sKSA9PiBwcm90b2NvbC5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIikpXG4gICAgcmV0dXJuIGlzLnVybCh7IC4uLm9wdGlvbnMsIHByb3RvY29sOiBuZXcgUmVnRXhwKGBeKD86JHtbLi4ucHJvdG9jb2xzLCAuLi5lc2NhcGVkXS5qb2luKFwifFwiKX0pJGApLCBob3N0bmFtZSB9KVxuICB9LFxufSkgYXMgaXMuWm9kVVJMICYge1xuICAvKiogQ3JlYXRlIGEgbmV3IHR5cGUgYWxpYXMgZm9yIFVSTHMgd2l0aCBhZGRpdGlvbmFsIGN1c3RvbSBzdXBwb3J0ZWQgcHJvdG9jb2xzLiAqL1xuICB3aXRoKGFkZGl0aW9uYWw6IHN0cmluZ1tdLCBwYXJhbXM/OiBPbWl0PGlzLnouY29yZS4kWm9kVVJMUGFyYW1zLCBcInByb3RvY29sXCI+KTogaXMuWm9kVVJMXG59XG5cbi8qKiBUeXBlIGFsaWFzIGZvciBib2R5IGluaXQuICovXG5leHBvcnQgY29uc3QgYm9keUluaXQgPSBpcy51bmlvbihbXG4gIGlzLnN0cmluZygpLFxuICBpcy5pbnN0YW5jZW9mKFN0cmluZyksXG4gIGlzLmluc3RhbmNlb2YoQmxvYiksXG4gIGlzLmluc3RhbmNlb2YoQXJyYXlCdWZmZXIpLFxuICBpcy5pbnN0YW5jZW9mKERhdGFWaWV3KSxcbiAgaXMuaW5zdGFuY2VvZihGb3JtRGF0YSksXG4gIGlzLmluc3RhbmNlb2YoUmVhZGFibGVTdHJlYW0pLFxuICBpcy5pbnN0YW5jZW9mKFVSTFNlYXJjaFBhcmFtcyksXG4gIHR5cGVkQXJyYXksXG5dKS5udWxsYWJsZSgpIGFzIGlzLlpvZE51bGxhYmxlPFxuICBpcy5ab2RVbmlvbjxcbiAgICByZWFkb25seSBbXG4gICAgICBpcy5ab2RTdHJpbmcsXG4gICAgICBpcy5ab2RDdXN0b208U3RyaW5nLCBTdHJpbmc+LFxuICAgICAgaXMuWm9kQ3VzdG9tPEJsb2IsIEJsb2I+LFxuICAgICAgaXMuWm9kQ3VzdG9tPEFycmF5QnVmZmVyLCBBcnJheUJ1ZmZlcj4sXG4gICAgICBpcy5ab2RDdXN0b208RGF0YVZpZXcsIERhdGFWaWV3PixcbiAgICAgIGlzLlpvZEN1c3RvbTxGb3JtRGF0YSwgRm9ybURhdGE+LFxuICAgICAgaXMuWm9kQ3VzdG9tPFJlYWRhYmxlU3RyZWFtLCBSZWFkYWJsZVN0cmVhbT4sXG4gICAgICBpcy5ab2RDdXN0b208VVJMU2VhcmNoUGFyYW1zLCBVUkxTZWFyY2hQYXJhbXM+LFxuICAgICAgdHlwZW9mIHR5cGVkQXJyYXksXG4gICAgXVxuICA+XG4+XG5cbi8qKlxuICogU3lzdGVtIHBlcm1pc3Npb25zIGZsYWdzLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmRlbm8uY29tL3J1bnRpbWUvZnVuZGFtZW50YWxzL3NlY3VyaXR5LyNzeXN0ZW0taW5mb3JtYXRpb259LlxuICovXG5jb25zdCBzeXNmbGFncyA9IFtcImhvc3RuYW1lXCIsIFwib3NSZWxlYXNlXCIsIFwib3NVcHRpbWVcIiwgXCJsb2FkYXZnXCIsIFwibmV0d29ya0ludGVyZmFjZXNcIiwgXCJzeXN0ZW1NZW1vcnlJbmZvXCIsIFwidWlkXCIsIFwiZ2lkXCJdIGFzIGNvbnN0XG5cbi8qKiBUeXBlIGFsaWFzIGZhY3RvcnkgZm9yIHBlcm1pc3Npb24gZGVzY3JpcHRvcnMuICovXG5mdW5jdGlvbiBwZXJtaXNzaW9uKHsgZXhwYW5kID0gZmFsc2UsIHVybHMgPSBmYWxzZSwgc3lzID0gZmFsc2UgfSA9IHt9KSB7XG4gIHJldHVybiBpcy5wcmVwcm9jZXNzKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJpbmhlcml0XCIpXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgICAgdmFsdWUgPSBbdmFsdWVdXG4gICAgaWYgKGV4cGFuZCkge1xuICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB8fCAodmFsdWUgPT09IGZhbHNlKSlcbiAgICAgICAgdmFsdWUgPSBbXVxuICAgIH1cbiAgICBpZiAodXJscyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKCh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBVUkwgPyB2YWx1ZS5ocmVmIDogdmFsdWUpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH0sIGlzLnVuaW9uKFtpcy5saXRlcmFsKFwiaW5oZXJpdFwiKSwgaXMuYm9vbGVhbigpLCBpcy5hcnJheShzeXMgPyBpcy5lbnVtKHN5c2ZsYWdzKSA6IGlzLnN0cmluZygpKV0pKVxufVxuXG4vKiogVHlwZSBhbGlhcyBmYWN0b3J5IGZvciBwZXJtaXNzaW9ucyBvYmplY3QuICovXG5leHBvcnQgZnVuY3Rpb24gcGVybWlzc2lvbnM8VCBleHRlbmRzIGtleW9mIERlbm8uUGVybWlzc2lvbk9wdGlvbnNPYmplY3Q+KFxuICBvcHRpb25zPzogeyBzZXQ/OiBUW107IGV4cGFuZD86IGZhbHNlIH0sXG4pOiBpcy5ab2RVbmlvbjxyZWFkb25seSBbaXMuWm9kT2JqZWN0PFJlY29yZDxULCBpcy5ab2RPcHRpb25hbDxpcy5ab2RQcmVwcm9jZXNzPGlzLlpvZFVuaW9uPFtpcy5ab2RMaXRlcmFsPFwiaW5oZXJpdFwiPiwgaXMuWm9kQm9vbGVhbiwgaXMuWm9kQXJyYXk8aXMuWm9kU3RyaW5nPl0+Pj4+PiwgaXMuWm9kVW5pb248cmVhZG9ubHkgW2lzLlpvZExpdGVyYWw8XCJpbmhlcml0XCI+LCBpcy5ab2RMaXRlcmFsPFwibm9uZVwiPl0+XT5cbi8qKiBUeXBlIGFsaWFzIGZhY3RvcnkgZm9yIHBlcm1pc3Npb25zIG9iamVjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNzaW9uczxUIGV4dGVuZHMga2V5b2YgRGVuby5QZXJtaXNzaW9uT3B0aW9uc09iamVjdD4oXG4gIG9wdGlvbnM6IHsgc2V0PzogVFtdOyBleHBhbmQ6IHRydWUgfSxcbik6IGlzLlpvZFByZXByb2Nlc3M8aXMuWm9kT2JqZWN0PFJlY29yZDxULCBpcy5ab2RQcmVwcm9jZXNzPGlzLlpvZFVuaW9uPFtpcy5ab2RMaXRlcmFsPFwiaW5oZXJpdFwiPiwgaXMuWm9kTGl0ZXJhbDx0cnVlPiwgaXMuWm9kQXJyYXk8aXMuWm9kU3RyaW5nPl0+Pj4+PlxuZXhwb3J0IGZ1bmN0aW9uIHBlcm1pc3Npb25zPFQgZXh0ZW5kcyBrZXlvZiBEZW5vLlBlcm1pc3Npb25PcHRpb25zT2JqZWN0Pih7IHNldCA9IFtcInJlYWRcIiwgXCJ3cml0ZVwiLCBcIm5ldFwiLCBcImVudlwiLCBcInJ1blwiLCBcInN5c1wiLCBcImZmaVwiLCBcImltcG9ydFwiXSBhcyBUW10sIGV4cGFuZCA9IGZhbHNlIH06IHsgc2V0PzogVFtdOyBleHBhbmQ/OiBib29sZWFuIH0gPSB7fSkge1xuICBjb25zdCB2YWxpZGF0b3IgPSBpcy5vYmplY3Qoe1xuICAgIHJlYWQ6IHBlcm1pc3Npb24oeyBleHBhbmQsIHVybHM6IHRydWUgfSksXG4gICAgd3JpdGU6IHBlcm1pc3Npb24oeyBleHBhbmQsIHVybHM6IHRydWUgfSksXG4gICAgbmV0OiBwZXJtaXNzaW9uKHsgZXhwYW5kIH0pLFxuICAgIGVudjogcGVybWlzc2lvbih7IGV4cGFuZCB9KSxcbiAgICBzeXM6IHBlcm1pc3Npb24oeyBleHBhbmQsIHN5czogdHJ1ZSB9KSxcbiAgICBydW46IHBlcm1pc3Npb24oeyBleHBhbmQsIHVybHM6IHRydWUgfSksXG4gICAgZmZpOiBwZXJtaXNzaW9uKHsgZXhwYW5kLCB1cmxzOiB0cnVlIH0pLFxuICAgIGltcG9ydDogcGVybWlzc2lvbih7IGV4cGFuZCB9KSxcbiAgfSkucGljazxhbnk+KE9iamVjdC5mcm9tRW50cmllcyhzZXQubWFwKChrZXkpID0+IFtrZXksIHRydWVdKSkpLnN0cmljdCgpXG5cbiAgLy8gUmV0dXJuIGVpdGhlciB0aGUgY29tcGFjdCBvciBleHBhbmRlZCB2ZXJzaW9uXG4gIGlmICghZXhwYW5kKVxuICAgIHJldHVybiB2YWxpZGF0b3IucGFydGlhbCgpLm9yKGlzLnVuaW9uKFtpcy5saXRlcmFsKFwiaW5oZXJpdFwiKSwgaXMubGl0ZXJhbChcIm5vbmVcIildKSlcbiAgcmV0dXJuIGlzLnByZXByb2Nlc3MoKHZhbHVlKSA9PiB7XG4gICAgaWYgKCh2YWx1ZSA9PT0gXCJpbmhlcml0XCIpIHx8ICh2YWx1ZSA9PT0gXCJub25lXCIpKVxuICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhzZXQubWFwKChrZXkpID0+IFtrZXksIHZhbHVlID09PSBcIm5vbmVcIiA/IFtdIDogdmFsdWVdKSlcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgICAgdmFsdWUgPSBbdmFsdWVdXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgcmV0dXJuIHsgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHNldC5tYXAoKHBlcm1pc3Npb24pID0+IFtwZXJtaXNzaW9uLCBmYWxzZV0pKSwgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHZhbHVlLm1hcCgocGVybWlzc2lvbikgPT4gW3Blcm1pc3Npb24sIFwiaW5oZXJpdFwiXSkpIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfSwgdmFsaWRhdG9yKSBhcyB1bmtub3duXG59XG5cbi8qKiBUeXBlIGFsaWFzIGZvciBleHByZXNzaW9uIHN0cmluZ3MuICovXG5leHBvcnQgY29uc3QgZXhwcmVzc2lvbiA9IGlzLnN0cmluZygpLnJlZ2V4KC9cXCRcXHsuKlxcfS8pIGFzIGlzLlpvZFN0cmluZ1xuXG4vKiogVHlwZSBhbGlhcyBmb3IgY2FsbGFibGUgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IGNhbGxhYmxlID0gaXMudW5rbm93bigpLnJlZmluZSgodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiLCB7IG1lc3NhZ2U6IFwiSW52YWxpZCBpbnB1dDogVmFsdWUgbXVzdCBiZSBjYWxsYWJsZVwiIH0pIGFzIHVua25vd24gYXMgaXMuWm9kQ3VzdG9tPEZ1bmN0aW9uLCB1bmtub3duPlxuXG4vKiogVHlwZSBhbGlhcyBmb3IgWm9kIHNjaGVtYXMuICovXG5leHBvcnQgY29uc3QgcGFyc2VyID0gaXMuY3VzdG9tKCh2YWx1ZSkgPT4gKHZhbHVlIGluc3RhbmNlb2YgaXMuWm9kVHlwZSkgfHwgKHZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpICYmICh0eXBlb2YgKHZhbHVlIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pLnBhcnNlID09PSBcImZ1bmN0aW9uXCIpKSwgeyBtZXNzYWdlOiBcIkludmFsaWQgaW5wdXQ6IFZhbHVlIG11c3QgYmUgYSBab2Qgc2NoZW1hXCIgfSkgYXMgaXMuWm9kQ3VzdG9tPFxuICBpcy5ab2RUeXBlLFxuICB1bmtub3duXG4+XG5cbi8qKiBPYmplY3QgdGhhdCByZXNzZW1ibGUgYSBab2RFcnJvci4gKi9cbnR5cGUgWm9kRXJyb3JMaWtlID0geyBwYXRoPzogUHJvcGVydHlLZXlbXTsgbWVzc2FnZTogc3RyaW5nOyBlcnJvcnM/OiBab2RFcnJvckxpa2VbXVtdIH1cblxuLyoqIENvbnZlcnQgYSBwcm9wZXJ0eSBrZXkgcGF0aCB0byBhIHN0cmluZy4gKi9cbmZ1bmN0aW9uIHRvUGF0aChwYXRoOiBQcm9wZXJ0eUtleVtdID0gW10pOiBzdHJpbmcge1xuICBjb25zdCBzZWdtZW50cyA9IFtdXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiBzZWdtZW50ID09PSBcIm51bWJlclwiKVxuICAgICAgc2VnbWVudHMucHVzaChgWyR7c2VnbWVudH1dYClcbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VnbWVudCA9PT0gXCJzeW1ib2xcIiB8fCAvW15cXHckXS8udGVzdChTdHJpbmcoc2VnbWVudCkpKVxuICAgICAgc2VnbWVudHMucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKHNlZ21lbnQpKX1dYClcbiAgICBlbHNlXG4gICAgICBzZWdtZW50cy5wdXNoKGAuJHtzZWdtZW50fWApXG4gIH1cbiAgcmV0dXJuIHNlZ21lbnRzLmpvaW4oXCJcIilcbn1cblxuLyoqIFByZXR0aWZ5IHZhbGlkYXRpb24gaXNzdWVzIGluIGEgbW9yZSBkZXRhaWxlZCB3YXkuICovXG5mdW5jdGlvbiBwcmV0dGlmeUlzc3VlKGVycm9yczogWm9kRXJyb3JMaWtlW10sIHsgaW5kZW50ID0gXCJcIiB9ID0ge30pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IFtdXG4gIGVycm9ycyA9IFsuLi5lcnJvcnNdLnNvcnQoKGEsIGIpID0+IChhLnBhdGggPz8gW10pLmxlbmd0aCAtIChiLnBhdGggPz8gW10pLmxlbmd0aClcbiAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICBsaW5lcy5wdXNoKGAke2luZGVudH3inJggJHtlcnJvci5tZXNzYWdlfWApXG4gICAgaWYgKGVycm9yLnBhdGg/Lmxlbmd0aClcbiAgICAgIGxpbmVzLnB1c2goYCR7aW5kZW50fSAg4oaSIGF0ICR7dG9QYXRoKGVycm9yLnBhdGgpfWApXG4gICAgaWYgKGVycm9yLmVycm9ycz8ubGVuZ3RoKSB7XG4gICAgICBsaW5lcy5wdXNoKGAke2luZGVudH0gIOKGkiB0cmllZCB0byBmaXQgaW50byBvbmUgb2YgdGhlIGFsbG93ZWQgdHlwZXM6YClcbiAgICAgIGZvciAoY29uc3Qgc3ViZXJyb3Igb2YgZXJyb3IuZXJyb3JzKVxuICAgICAgICBsaW5lcy5wdXNoKHByZXR0aWZ5SXNzdWUoc3ViZXJyb3IsIHsgaW5kZW50OiBgJHtpbmRlbnR9ICAgICAgYCB9KS5yZXBsYWNlKFwiICDinJhcIiwgXCItIOKcmFwiKSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIilcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgcGFyc2UoKX0uICovXG5leHBvcnQgdHlwZSBQYXJzZU9wdGlvbnMgPSB7XG4gIC8qKiBXaGV0aGVyIHRvIHBhcnNlIGFzeW5jaHJvbm91c2x5LiAqL1xuICBhc3luYz86IGJvb2xlYW5cbiAgLyoqIFdoZXRoZXIgdG8gdGhyb3cgYSBgWm9kRXJyb3JgIHJhdGhlciB0aGFuIGEgYFR5cGVFcnJvcmAgaW4gY2FzZSBvZiBmYWlsdXJlICovXG4gIHpvZEVycm9yPzogYm9vbGVhblxufVxuXG4vKiogUGFyc2UgYSBzY2hlbWEgc3luY2hyb25vdXNseS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBULCB2YWx1ZXM6IHVua25vd24sIG9wdGlvbnM/OiBPbWl0PFBhcnNlT3B0aW9ucywgXCJhc3luY1wiPiAmIHsgYXN5bmM/OiBmYWxzZSB9KTogaXMuaW5mZXI8VD5cbi8qKiBQYXJzZSBhIHNjaGVtYSBhc3luY2hyb25vdXNseS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBULCB2YWx1ZXM6IHVua25vd24sIG9wdGlvbnM6IE9taXQ8UGFyc2VPcHRpb25zLCBcImFzeW5jXCI+ICYgeyBhc3luYzogdHJ1ZSB9KTogUHJvbWlzZTxpcy5pbmZlcjxUPj5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZTxUIGV4dGVuZHMgaXMuWm9kVHlwZT4oc2NoZW1hOiBULCB2YWx1ZXM6IHVua25vd24sIHsgYXN5bmMgPSBmYWxzZSwgem9kRXJyb3IgfTogUGFyc2VPcHRpb25zID0ge30pIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXN5bmNcbiAgICAgID8gc2NoZW1hLnBhcnNlQXN5bmModmFsdWVzKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKCghKGVycm9yIGluc3RhbmNlb2YgaXMuWm9kRXJyb3IpKSB8fCB6b2RFcnJvcilcbiAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogXFxuJHtwcmV0dGlmeUlzc3VlKGVycm9yLmlzc3Vlcyl9YClcbiAgICAgIH0pXG4gICAgICA6IHNjaGVtYS5wYXJzZSh2YWx1ZXMpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCghKGVycm9yIGluc3RhbmNlb2YgaXMuWm9kRXJyb3IpKSB8fCB6b2RFcnJvcilcbiAgICAgIHRocm93IGVycm9yXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6IFxcbiR7cHJldHRpZnlJc3N1ZShlcnJvci5pc3N1ZXMpfWApXG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1Ysa0RBQWtEO0FBRWxELFNBQVMsU0FBUyxRQUFRLHNCQUFxQjtBQUMvQyxZQUFZLFFBQVEsV0FBVTtBQUM5QixPQUFPLEtBQUssRUFBRSxNQUFNLFdBQVU7QUFHOUIsK0VBQStFLEdBQy9FLE9BQU8sU0FBUyxTQUErQixNQUFTO0VBQ3RELE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNwQixPQUFPLFNBQVM7RUFDbEIsR0FBRztBQUNMO0FBRUEsNkRBQTZELEdBQzdELE9BQU8sU0FBUyxPQUE2QixNQUFTO0VBQ3BELE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNwQixJQUFJLE9BQU8sVUFBVSxVQUFVO01BQzdCLE1BQU0sVUFBVSxPQUFPO01BQ3ZCLElBQUksQUFBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLFlBQWMsVUFBVSxPQUN6QyxPQUFPO0lBQ1g7SUFDQSxPQUFPO0VBQ1QsR0FBRztBQUNMO0FBRUEsdUVBQXVFLEdBQ3ZFLE9BQU8sU0FBUyxTQUErQixNQUFTO0VBQ3RELE9BQU8sT0FBTyxRQUFRLEdBQUcsT0FBTyxDQUFDO0FBQ25DO0FBRUEsMkVBQTJFLEdBQzNFLE9BQU8sU0FBUyxTQUErQixNQUFTO0VBQ3RELE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxPQUFPO0lBQzNCLElBQUk7TUFDRixnQkFBZ0I7SUFDbEIsRUFBRSxPQUFPLE9BQU87TUFDZCxRQUFRLFFBQVEsQ0FBQyxDQUFDLHdFQUF3RSxFQUFFLE9BQU87SUFDckc7SUFDQSxPQUFPO0VBQ1QsR0FBRztBQUNMO0FBRUEsc0VBQXNFLEdBQ3RFLE9BQU8sU0FBUyxVQUFnQyxNQUFTO0VBQ3ZELE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNwQixJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsUUFDakIsT0FBTztNQUFDO0tBQU07SUFDaEIsT0FBTztF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
|
package/mod.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./is.js";
|
package/mod.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from "./is.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvaXMvbW9kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2lzLmpzXCJcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVMifQ==
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lowlighter/is",
|
|
3
|
+
"version": "1.3.3",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./mod.js",
|
|
6
|
+
"types": "./mod.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./mod.d.ts",
|
|
10
|
+
"import": "./mod.js",
|
|
11
|
+
"default": "./mod.js"
|
|
12
|
+
},
|
|
13
|
+
"./testing": {
|
|
14
|
+
"types": "./testing/mod.d.ts",
|
|
15
|
+
"import": "./testing/mod.js",
|
|
16
|
+
"default": "./testing/mod.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@jsr/std__cli": "^1.0.28",
|
|
21
|
+
"@jsr/std__collections": "^1.1.6",
|
|
22
|
+
"@jsr/zod__zod": "^4.4.3",
|
|
23
|
+
"@lowlighter/testing": "^6.0.0"
|
|
24
|
+
}
|
|
25
|
+
}
|
package/testing/mod.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./spec.js";
|
package/testing/mod.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from "./spec.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvaXMvdGVzdGluZy9tb2QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vc3BlYy5qc1wiXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxZQUFXIn0=
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { is } from "../is.js";
|
|
2
|
+
/** Test case definition. */ export type testcase = {
|
|
3
|
+
a: unknown;
|
|
4
|
+
b?: unknown;
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
};
|
|
7
|
+
/** Configuration options for {@linkcode spec()}. */ export type SpecOptions = {
|
|
8
|
+
/** Whether to perform a prefault check. */ prefault?: boolean;
|
|
9
|
+
/** Whether to perform a strictness check. */ strict?: boolean;
|
|
10
|
+
/** Setup function to run before tests. */ setup?: () => void;
|
|
11
|
+
};
|
|
12
|
+
/** Specification check helper. */ export declare const spec: ((name: string, schema: is.ZodType, testsuites: Array<testcase> | Record<PropertyKey, Array<testcase>>, options?: SpecOptions) => void) & {
|
|
13
|
+
optional: Array<testcase>;
|
|
14
|
+
nullable: Array<testcase>;
|
|
15
|
+
primitive: Array<testcase>;
|
|
16
|
+
boolean: Array<testcase>;
|
|
17
|
+
string: {
|
|
18
|
+
arrayable: Array<testcase>;
|
|
19
|
+
} & Array<testcase>;
|
|
20
|
+
positive: {
|
|
21
|
+
int: Array<testcase>;
|
|
22
|
+
finite: Array<testcase>;
|
|
23
|
+
infinity: Array<testcase>;
|
|
24
|
+
};
|
|
25
|
+
record: {
|
|
26
|
+
primitive: Array<testcase>;
|
|
27
|
+
} & Array<testcase>;
|
|
28
|
+
array: {
|
|
29
|
+
unique: Array<testcase>;
|
|
30
|
+
typed: Array<testcase>;
|
|
31
|
+
};
|
|
32
|
+
response: {
|
|
33
|
+
body: {
|
|
34
|
+
init: Array<testcase>;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
ulid: Array<testcase>;
|
|
38
|
+
url: Array<testcase>;
|
|
39
|
+
date: Array<testcase>;
|
|
40
|
+
error: Array<testcase>;
|
|
41
|
+
expression: Array<testcase>;
|
|
42
|
+
callable: Array<testcase>;
|
|
43
|
+
parser: Array<testcase>;
|
|
44
|
+
unknown: Array<testcase>;
|
|
45
|
+
meta: (meta: ImportMeta) => Array<testcase>;
|
|
46
|
+
enum: (values: readonly string[]) => Array<testcase>;
|
|
47
|
+
default: (b: unknown, options?: Omit<testcase, "a" | "b">) => Array<testcase>;
|
|
48
|
+
};
|
package/testing/spec.js
ADDED
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
// Imports
|
|
2
|
+
import { is } from "../is.js";
|
|
3
|
+
import { pick } from "@std/collections";
|
|
4
|
+
import { expect } from "@lowlighter/testing";
|
|
5
|
+
import { inspect } from "@lowlighter/testing/highlight";
|
|
6
|
+
/** Specification check helper. */ export const spec = Object.assign(function(name, schema, testsuites, { prefault = true, strict = true, setup } = {}) {
|
|
7
|
+
if (Array.isArray(testsuites)) testsuites = {
|
|
8
|
+
"*": testsuites
|
|
9
|
+
};
|
|
10
|
+
// Prefault check
|
|
11
|
+
if (prefault) Deno.test(`\`${name}.parse()\` has prefault`, ()=>expect(schema.parse(undefined)).toMatchObject({}));
|
|
12
|
+
// Strictness check
|
|
13
|
+
if (strict) Deno.test(`\`${name}.parse()\` is strict`, ()=>expect(()=>schema.parse({
|
|
14
|
+
__strictness_test__: true
|
|
15
|
+
})).toThrow());
|
|
16
|
+
// Parsing checks
|
|
17
|
+
for (const [key, testcases] of Object.entries(testsuites)){
|
|
18
|
+
for (const testcase of testcases){
|
|
19
|
+
const a = key === "*" ? testcase.a : {
|
|
20
|
+
[key]: testcase.a
|
|
21
|
+
};
|
|
22
|
+
const b = "b" in testcase ? testcase.b : testcase.a;
|
|
23
|
+
Deno.test(`\`${name}.parse(${inspect(a)})\` ${b === Error ? "throws error" : `is parsed${"b" in testcase ? ` as \`${inspect(b)}\`` : ""}`}${"env" in testcase ? ` with \`${inspect(testcase.env)}\`` : ""}`, {
|
|
24
|
+
permissions: {
|
|
25
|
+
env: testcase.env ? true : false
|
|
26
|
+
}
|
|
27
|
+
}, ()=>{
|
|
28
|
+
const env = {};
|
|
29
|
+
try {
|
|
30
|
+
setup?.();
|
|
31
|
+
// Apply environment variables
|
|
32
|
+
if (testcase.env) {
|
|
33
|
+
for (const [key, value] of Object.entries(testcase.env)){
|
|
34
|
+
if (Deno.env.has(key)) env[key] = Deno.env.get(key);
|
|
35
|
+
Deno.env.set(key, value);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Apply test
|
|
39
|
+
if (b === Error) expect(()=>schema.parse(a)).toThrow();
|
|
40
|
+
else {
|
|
41
|
+
if (key === "*" && (typeof b !== "object" || b === null)) {
|
|
42
|
+
expect(schema.parse(a)).toEqual(b);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (b instanceof Date || b === "2024-01-01T00:00:00.000Z") {
|
|
46
|
+
const da = schema.parse(a);
|
|
47
|
+
expect((key === "*" ? da : da[key]).getTime()).toBe(new Date(b).getTime());
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
expect(schema.parse(a)).toMatchObject(key === "*" ? b : {
|
|
51
|
+
[key]: b
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
} finally{
|
|
55
|
+
for (const [key, value] of Object.entries(env))Deno.env.set(key, value);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}, {
|
|
61
|
+
optional: [
|
|
62
|
+
{
|
|
63
|
+
a: undefined,
|
|
64
|
+
b: undefined
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
nullable: [
|
|
68
|
+
{
|
|
69
|
+
a: null
|
|
70
|
+
}
|
|
71
|
+
],
|
|
72
|
+
primitive: [
|
|
73
|
+
{
|
|
74
|
+
a: "foo"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
a: 123
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
a: 123n
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
a: true
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
a: undefined
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
a: null
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
a: new Date("2024-01-01T00:00:00.000Z")
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
a: new Error("Testing")
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
a: Symbol.for("@@testing"),
|
|
99
|
+
b: Error
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
a: {},
|
|
103
|
+
b: Error
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
a: [],
|
|
107
|
+
b: Error
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
a: function() {},
|
|
111
|
+
b: Error
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
boolean: [
|
|
115
|
+
{
|
|
116
|
+
a: true
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
a: false
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
string: Object.assign([
|
|
123
|
+
{
|
|
124
|
+
a: "foo"
|
|
125
|
+
}
|
|
126
|
+
], {
|
|
127
|
+
arrayable: [
|
|
128
|
+
{
|
|
129
|
+
a: "a",
|
|
130
|
+
b: [
|
|
131
|
+
"a"
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
a: [
|
|
136
|
+
"a",
|
|
137
|
+
"b"
|
|
138
|
+
],
|
|
139
|
+
b: [
|
|
140
|
+
"a",
|
|
141
|
+
"b"
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
]
|
|
145
|
+
}),
|
|
146
|
+
positive: {
|
|
147
|
+
int: [
|
|
148
|
+
{
|
|
149
|
+
a: 1
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
a: "1",
|
|
153
|
+
b: 1
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
a: -1,
|
|
157
|
+
b: Error
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
a: "-1",
|
|
161
|
+
b: Error
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
a: "NaN",
|
|
165
|
+
b: Error
|
|
166
|
+
}
|
|
167
|
+
],
|
|
168
|
+
finite: [
|
|
169
|
+
{
|
|
170
|
+
a: 1
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
a: NaN,
|
|
174
|
+
b: Error
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
a: Infinity,
|
|
178
|
+
b: Error
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
infinity: [
|
|
182
|
+
{
|
|
183
|
+
a: Infinity
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
a: "Infinity",
|
|
187
|
+
b: Infinity
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
},
|
|
191
|
+
record: Object.assign([
|
|
192
|
+
{
|
|
193
|
+
a: {
|
|
194
|
+
foo: "bar",
|
|
195
|
+
baz: 123
|
|
196
|
+
},
|
|
197
|
+
b: {
|
|
198
|
+
foo: "bar",
|
|
199
|
+
baz: 123
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
a: "foo",
|
|
204
|
+
b: Error
|
|
205
|
+
}
|
|
206
|
+
], {
|
|
207
|
+
primitive: [
|
|
208
|
+
{
|
|
209
|
+
a: {
|
|
210
|
+
foo: "bar"
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
a: {
|
|
215
|
+
foo: 123
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
a: {
|
|
220
|
+
foo: 123n
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
a: {
|
|
225
|
+
foo: true
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
a: {
|
|
230
|
+
foo: undefined
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
a: {
|
|
235
|
+
foo: null
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
a: {
|
|
240
|
+
foo: Symbol.for("@@testing")
|
|
241
|
+
},
|
|
242
|
+
b: Error
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
a: {
|
|
246
|
+
foo: {}
|
|
247
|
+
},
|
|
248
|
+
b: Error
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
a: {
|
|
252
|
+
foo: []
|
|
253
|
+
},
|
|
254
|
+
b: Error
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
a: {
|
|
258
|
+
foo: function() {}
|
|
259
|
+
},
|
|
260
|
+
b: Error
|
|
261
|
+
}
|
|
262
|
+
]
|
|
263
|
+
}),
|
|
264
|
+
array: {
|
|
265
|
+
unique: [
|
|
266
|
+
{
|
|
267
|
+
a: [
|
|
268
|
+
"a",
|
|
269
|
+
"b",
|
|
270
|
+
"b",
|
|
271
|
+
"a",
|
|
272
|
+
"c"
|
|
273
|
+
],
|
|
274
|
+
b: [
|
|
275
|
+
"a",
|
|
276
|
+
"b",
|
|
277
|
+
"c"
|
|
278
|
+
]
|
|
279
|
+
}
|
|
280
|
+
],
|
|
281
|
+
typed: [
|
|
282
|
+
{
|
|
283
|
+
a: new Int8Array()
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
a: new Uint8Array()
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
a: new Uint8ClampedArray()
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
a: new Int16Array()
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
a: new Uint16Array()
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
a: new Int32Array()
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
a: new Uint32Array()
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
a: new Float16Array()
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
a: new Float32Array()
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
a: new Float64Array()
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
a: new BigInt64Array()
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
a: new BigUint64Array()
|
|
317
|
+
}
|
|
318
|
+
]
|
|
319
|
+
},
|
|
320
|
+
response: {
|
|
321
|
+
body: {
|
|
322
|
+
init: [
|
|
323
|
+
{
|
|
324
|
+
a: null
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
a: "foo"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
a: new Blob()
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
a: new ArrayBuffer(8)
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
a: new DataView(new ArrayBuffer(8))
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
a: new FormData()
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
a: new ReadableStream()
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
a: new URLSearchParams()
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
a: new Int8Array()
|
|
349
|
+
}
|
|
350
|
+
]
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
ulid: [
|
|
354
|
+
{
|
|
355
|
+
a: "0".repeat(26)
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
a: "TEST_INVALID_ULID",
|
|
359
|
+
b: Error
|
|
360
|
+
}
|
|
361
|
+
],
|
|
362
|
+
url: [
|
|
363
|
+
{
|
|
364
|
+
a: "http://example.com"
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
a: "https://example.com"
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
a: "jsr:@scope/test"
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
a: "npm:@scope/test"
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
a: "file:///test/path"
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
a: "data:application/test,null"
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
a: "test_invalid_url",
|
|
383
|
+
b: Error
|
|
384
|
+
}
|
|
385
|
+
],
|
|
386
|
+
date: [
|
|
387
|
+
{
|
|
388
|
+
a: new Date("2024-01-01T00:00:00.000Z")
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
a: "test_invalid_date",
|
|
392
|
+
b: Error
|
|
393
|
+
}
|
|
394
|
+
],
|
|
395
|
+
error: [
|
|
396
|
+
{
|
|
397
|
+
a: new Error("Test error")
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
a: `${new Error("Test error")}`,
|
|
401
|
+
b: Error
|
|
402
|
+
}
|
|
403
|
+
],
|
|
404
|
+
expression: [
|
|
405
|
+
{
|
|
406
|
+
a: "${foo + 1}"
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
a: "foo + 1",
|
|
410
|
+
b: Error
|
|
411
|
+
}
|
|
412
|
+
],
|
|
413
|
+
callable: [
|
|
414
|
+
{
|
|
415
|
+
a: ()=>{}
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
a: async ()=>{}
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
a: null,
|
|
422
|
+
b: Error
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
a: {},
|
|
426
|
+
b: Error
|
|
427
|
+
}
|
|
428
|
+
],
|
|
429
|
+
parser: [
|
|
430
|
+
{
|
|
431
|
+
a: Object.assign(is.object({
|
|
432
|
+
foo: is.string()
|
|
433
|
+
}), {
|
|
434
|
+
[Symbol.for("Deno.customInspect")]: ()=>"schema"
|
|
435
|
+
})
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
a: {
|
|
439
|
+
parse: ()=>({})
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
],
|
|
443
|
+
unknown: [
|
|
444
|
+
{
|
|
445
|
+
a: null
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
a: 123
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
a: "string"
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
a: true
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
a: []
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
a: {}
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
a: {
|
|
464
|
+
foo: "bar"
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
],
|
|
468
|
+
meta (meta) {
|
|
469
|
+
return [
|
|
470
|
+
{
|
|
471
|
+
a: pick(meta, [
|
|
472
|
+
"url",
|
|
473
|
+
"dirname",
|
|
474
|
+
"filename"
|
|
475
|
+
])
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
a: {},
|
|
479
|
+
b: Error
|
|
480
|
+
}
|
|
481
|
+
];
|
|
482
|
+
},
|
|
483
|
+
enum (values) {
|
|
484
|
+
return [
|
|
485
|
+
...values.map((a)=>({
|
|
486
|
+
a
|
|
487
|
+
})),
|
|
488
|
+
{
|
|
489
|
+
a: "TEST_INVALID_ENUM_VALUE",
|
|
490
|
+
b: Error
|
|
491
|
+
}
|
|
492
|
+
];
|
|
493
|
+
},
|
|
494
|
+
default (b, options) {
|
|
495
|
+
return [
|
|
496
|
+
{
|
|
497
|
+
a: undefined,
|
|
498
|
+
b,
|
|
499
|
+
...options
|
|
500
|
+
}
|
|
501
|
+
];
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvaXMvdGVzdGluZy9zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCB0eXBlIHsgdGVzdGluZyB9IGZyb20gXCJAbGlicy90ZXN0aW5nXCJcbmltcG9ydCB7IGlzIH0gZnJvbSBcIi4uL2lzLmpzXCJcbmltcG9ydCB7IHBpY2sgfSBmcm9tIFwiQHN0ZC9jb2xsZWN0aW9uc1wiXG5pbXBvcnQgeyBleHBlY3QgfSBmcm9tIFwiQGxpYnMvdGVzdGluZ1wiXG5pbXBvcnQgeyBpbnNwZWN0IH0gZnJvbSBcIkBsaWJzL3Rlc3RpbmcvaGlnaGxpZ2h0XCJcblxuLyoqIFRlc3QgY2FzZSBkZWZpbml0aW9uLiAqL1xuZXhwb3J0IHR5cGUgdGVzdGNhc2UgPSB7IGE6IHVua25vd247IGI/OiB1bmtub3duOyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1cblxuLyoqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3Ige0BsaW5rY29kZSBzcGVjKCl9LiAqL1xuZXhwb3J0IHR5cGUgU3BlY09wdGlvbnMgPSB7XG4gIC8qKiBXaGV0aGVyIHRvIHBlcmZvcm0gYSBwcmVmYXVsdCBjaGVjay4gKi9cbiAgcHJlZmF1bHQ/OiBib29sZWFuXG4gIC8qKiBXaGV0aGVyIHRvIHBlcmZvcm0gYSBzdHJpY3RuZXNzIGNoZWNrLiAqL1xuICBzdHJpY3Q/OiBib29sZWFuXG4gIC8qKiBTZXR1cCBmdW5jdGlvbiB0byBydW4gYmVmb3JlIHRlc3RzLiAqL1xuICBzZXR1cD86ICgpID0+IHZvaWRcbn1cblxuLyoqIFNwZWNpZmljYXRpb24gY2hlY2sgaGVscGVyLiAqL1xuZXhwb3J0IGNvbnN0IHNwZWMgPSBPYmplY3QuYXNzaWduKGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIHNjaGVtYTogaXMuWm9kVHlwZSwgdGVzdHN1aXRlczogQXJyYXk8dGVzdGNhc2U+IHwgUmVjb3JkPFByb3BlcnR5S2V5LCBBcnJheTx0ZXN0Y2FzZT4+LCB7IHByZWZhdWx0ID0gdHJ1ZSwgc3RyaWN0ID0gdHJ1ZSwgc2V0dXAgfTogU3BlY09wdGlvbnMgPSB7fSk6IHZvaWQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0ZXN0c3VpdGVzKSlcbiAgICB0ZXN0c3VpdGVzID0geyBcIipcIjogdGVzdHN1aXRlcyB9XG4gIC8vIFByZWZhdWx0IGNoZWNrXG4gIGlmIChwcmVmYXVsdClcbiAgICBEZW5vLnRlc3QoYFxcYCR7bmFtZX0ucGFyc2UoKVxcYCBoYXMgcHJlZmF1bHRgLCAoKSA9PiBleHBlY3Qoc2NoZW1hLnBhcnNlKHVuZGVmaW5lZCkpLnRvTWF0Y2hPYmplY3Qoe30pKVxuICAvLyBTdHJpY3RuZXNzIGNoZWNrXG4gIGlmIChzdHJpY3QpXG4gICAgRGVuby50ZXN0KGBcXGAke25hbWV9LnBhcnNlKClcXGAgaXMgc3RyaWN0YCwgKCkgPT4gZXhwZWN0KCgpID0+IHNjaGVtYS5wYXJzZSh7IF9fc3RyaWN0bmVzc190ZXN0X186IHRydWUgfSkpLnRvVGhyb3coKSlcbiAgLy8gUGFyc2luZyBjaGVja3NcbiAgZm9yIChjb25zdCBba2V5LCB0ZXN0Y2FzZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRlc3RzdWl0ZXMpKSB7XG4gICAgZm9yIChjb25zdCB0ZXN0Y2FzZSBvZiB0ZXN0Y2FzZXMpIHtcbiAgICAgIGNvbnN0IGEgPSBrZXkgPT09IFwiKlwiID8gdGVzdGNhc2UuYSA6IHsgW2tleV06IHRlc3RjYXNlLmEgfVxuICAgICAgY29uc3QgYiA9IFwiYlwiIGluIHRlc3RjYXNlID8gdGVzdGNhc2UuYiA6IHRlc3RjYXNlLmFcbiAgICAgIERlbm8udGVzdChgXFxgJHtuYW1lfS5wYXJzZSgke2luc3BlY3QoYSl9KVxcYCAke2IgPT09IEVycm9yID8gXCJ0aHJvd3MgZXJyb3JcIiA6IGBpcyBwYXJzZWQke1wiYlwiIGluIHRlc3RjYXNlID8gYCBhcyBcXGAke2luc3BlY3QoYil9XFxgYCA6IFwiXCJ9YH0ke1wiZW52XCIgaW4gdGVzdGNhc2UgPyBgIHdpdGggXFxgJHtpbnNwZWN0KHRlc3RjYXNlLmVudil9XFxgYCA6IFwiXCJ9YCwgeyBwZXJtaXNzaW9uczogeyBlbnY6IHRlc3RjYXNlLmVudiA/IHRydWUgOiBmYWxzZSB9IH0sICgpID0+IHtcbiAgICAgICAgY29uc3QgZW52ID0ge30gYXMgTm9uTnVsbGFibGU8dGVzdGNhc2VbXCJlbnZcIl0+XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0dXA/LigpXG5cbiAgICAgICAgICAvLyBBcHBseSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICAgICAgICBpZiAodGVzdGNhc2UuZW52KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0ZXN0Y2FzZS5lbnYpKSB7XG4gICAgICAgICAgICAgIGlmIChEZW5vLmVudi5oYXMoa2V5KSlcbiAgICAgICAgICAgICAgICBlbnZba2V5XSA9IERlbm8uZW52LmdldChrZXkpIVxuICAgICAgICAgICAgICBEZW5vLmVudi5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXBwbHkgdGVzdFxuICAgICAgICAgIGlmIChiID09PSBFcnJvcilcbiAgICAgICAgICAgIGV4cGVjdCgoKSA9PiBzY2hlbWEucGFyc2UoYSkpLnRvVGhyb3coKVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKChrZXkgPT09IFwiKlwiKSAmJiAoKHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSB8fCAoYiA9PT0gbnVsbCkpKSB7XG4gICAgICAgICAgICAgIGV4cGVjdChzY2hlbWEucGFyc2UoYSkpLnRvRXF1YWwoYiBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoYiBpbnN0YW5jZW9mIERhdGUpIHx8IChiID09PSBcIjIwMjQtMDEtMDFUMDA6MDA6MDAuMDAwWlwiKSkge1xuICAgICAgICAgICAgICBjb25zdCBkYSA9IHNjaGVtYS5wYXJzZShhKSBhcyBEYXRlXG4gICAgICAgICAgICAgIGV4cGVjdCgoa2V5ID09PSBcIipcIiA/IGRhIDogKGRhIGFzIHRlc3RpbmcpW2tleV0pLmdldFRpbWUoKSkudG9CZShuZXcgRGF0ZShiKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhwZWN0KHNjaGVtYS5wYXJzZShhKSkudG9NYXRjaE9iamVjdChrZXkgPT09IFwiKlwiID8gYiBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+IDogeyBba2V5XTogYiB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnYpKVxuICAgICAgICAgICAgRGVuby5lbnYuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59LCB7XG4gIG9wdGlvbmFsOiBbXG4gICAgeyBhOiB1bmRlZmluZWQsIGI6IHVuZGVmaW5lZCB9LFxuICBdLFxuICBudWxsYWJsZTogW1xuICAgIHsgYTogbnVsbCB9LFxuICBdLFxuICBwcmltaXRpdmU6IFtcbiAgICB7IGE6IFwiZm9vXCIgfSxcbiAgICB7IGE6IDEyMyB9LFxuICAgIHsgYTogMTIzbiB9LFxuICAgIHsgYTogdHJ1ZSB9LFxuICAgIHsgYTogdW5kZWZpbmVkIH0sXG4gICAgeyBhOiBudWxsIH0sXG4gICAgeyBhOiBuZXcgRGF0ZShcIjIwMjQtMDEtMDFUMDA6MDA6MDAuMDAwWlwiKSB9LFxuICAgIHsgYTogbmV3IEVycm9yKFwiVGVzdGluZ1wiKSB9LFxuICAgIHsgYTogU3ltYm9sLmZvcihcIkBAdGVzdGluZ1wiKSwgYjogRXJyb3IgfSxcbiAgICB7IGE6IHt9LCBiOiBFcnJvciB9LFxuICAgIHsgYTogW10sIGI6IEVycm9yIH0sXG4gICAgeyBhOiBmdW5jdGlvbiAoKSB7fSwgYjogRXJyb3IgfSxcbiAgXSxcbiAgYm9vbGVhbjogW1xuICAgIHsgYTogdHJ1ZSB9LFxuICAgIHsgYTogZmFsc2UgfSxcbiAgXSxcbiAgc3RyaW5nOiBPYmplY3QuYXNzaWduKFtcbiAgICB7IGE6IFwiZm9vXCIgfSxcbiAgXSwge1xuICAgIGFycmF5YWJsZTogW1xuICAgICAgeyBhOiBcImFcIiwgYjogW1wiYVwiXSB9LFxuICAgICAgeyBhOiBbXCJhXCIsIFwiYlwiXSwgYjogW1wiYVwiLCBcImJcIl0gfSxcbiAgICBdLFxuICB9KSxcbiAgcG9zaXRpdmU6IHtcbiAgICBpbnQ6IFtcbiAgICAgIHsgYTogMSB9LFxuICAgICAgeyBhOiBcIjFcIiwgYjogMSB9LFxuICAgICAgeyBhOiAtMSwgYjogRXJyb3IgfSxcbiAgICAgIHsgYTogXCItMVwiLCBiOiBFcnJvciB9LFxuICAgICAgeyBhOiBcIk5hTlwiLCBiOiBFcnJvciB9LFxuICAgIF0sXG4gICAgZmluaXRlOiBbXG4gICAgICB7IGE6IDEgfSxcbiAgICAgIHsgYTogTmFOLCBiOiBFcnJvciB9LFxuICAgICAgeyBhOiBJbmZpbml0eSwgYjogRXJyb3IgfSxcbiAgICBdLFxuICAgIGluZmluaXR5OiBbXG4gICAgICB7IGE6IEluZmluaXR5IH0sXG4gICAgICB7IGE6IFwiSW5maW5pdHlcIiwgYjogSW5maW5pdHkgfSxcbiAgICBdLFxuICB9LFxuICByZWNvcmQ6IE9iamVjdC5hc3NpZ24oW1xuICAgIHsgYTogeyBmb286IFwiYmFyXCIsIGJhejogMTIzIH0sIGI6IHsgZm9vOiBcImJhclwiLCBiYXo6IDEyMyB9IH0sXG4gICAgeyBhOiBcImZvb1wiLCBiOiBFcnJvciB9LFxuICBdLCB7XG4gICAgcHJpbWl0aXZlOiBbXG4gICAgICB7IGE6IHsgZm9vOiBcImJhclwiIH0gfSxcbiAgICAgIHsgYTogeyBmb286IDEyMyB9IH0sXG4gICAgICB7IGE6IHsgZm9vOiAxMjNuIH0gfSxcbiAgICAgIHsgYTogeyBmb286IHRydWUgfSB9LFxuICAgICAgeyBhOiB7IGZvbzogdW5kZWZpbmVkIH0gfSxcbiAgICAgIHsgYTogeyBmb286IG51bGwgfSB9LFxuICAgICAgeyBhOiB7IGZvbzogU3ltYm9sLmZvcihcIkBAdGVzdGluZ1wiKSB9LCBiOiBFcnJvciB9LFxuICAgICAgeyBhOiB7IGZvbzoge30gfSwgYjogRXJyb3IgfSxcbiAgICAgIHsgYTogeyBmb286IFtdIH0sIGI6IEVycm9yIH0sXG4gICAgICB7IGE6IHsgZm9vOiBmdW5jdGlvbiAoKSB7fSB9LCBiOiBFcnJvciB9LFxuICAgIF0sXG4gIH0pLFxuICBhcnJheToge1xuICAgIHVuaXF1ZTogW1xuICAgICAgeyBhOiBbXCJhXCIsIFwiYlwiLCBcImJcIiwgXCJhXCIsIFwiY1wiXSwgYjogW1wiYVwiLCBcImJcIiwgXCJjXCJdIH0sXG4gICAgXSxcbiAgICB0eXBlZDogW1xuICAgICAgeyBhOiBuZXcgSW50OEFycmF5KCkgfSxcbiAgICAgIHsgYTogbmV3IFVpbnQ4QXJyYXkoKSB9LFxuICAgICAgeyBhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoKSB9LFxuICAgICAgeyBhOiBuZXcgSW50MTZBcnJheSgpIH0sXG4gICAgICB7IGE6IG5ldyBVaW50MTZBcnJheSgpIH0sXG4gICAgICB7IGE6IG5ldyBJbnQzMkFycmF5KCkgfSxcbiAgICAgIHsgYTogbmV3IFVpbnQzMkFycmF5KCkgfSxcbiAgICAgIHsgYTogbmV3IEZsb2F0MTZBcnJheSgpIH0sXG4gICAgICB7IGE6IG5ldyBGbG9hdDMyQXJyYXkoKSB9LFxuICAgICAgeyBhOiBuZXcgRmxvYXQ2NEFycmF5KCkgfSxcbiAgICAgIHsgYTogbmV3IEJpZ0ludDY0QXJyYXkoKSB9LFxuICAgICAgeyBhOiBuZXcgQmlnVWludDY0QXJyYXkoKSB9LFxuICAgIF0sXG4gIH0sXG4gIHJlc3BvbnNlOiB7XG4gICAgYm9keToge1xuICAgICAgaW5pdDogW1xuICAgICAgICB7IGE6IG51bGwgfSxcbiAgICAgICAgeyBhOiBcImZvb1wiIH0sXG4gICAgICAgIHsgYTogbmV3IEJsb2IoKSB9LFxuICAgICAgICB7IGE6IG5ldyBBcnJheUJ1ZmZlcig4KSB9LFxuICAgICAgICB7IGE6IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoOCkpIH0sXG4gICAgICAgIHsgYTogbmV3IEZvcm1EYXRhKCkgfSxcbiAgICAgICAgeyBhOiBuZXcgUmVhZGFibGVTdHJlYW0oKSB9LFxuICAgICAgICB7IGE6IG5ldyBVUkxTZWFyY2hQYXJhbXMoKSB9LFxuICAgICAgICB7IGE6IG5ldyBJbnQ4QXJyYXkoKSB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuICB1bGlkOiBbXG4gICAgeyBhOiBcIjBcIi5yZXBlYXQoMjYpIH0sXG4gICAgeyBhOiBcIlRFU1RfSU5WQUxJRF9VTElEXCIsIGI6IEVycm9yIH0sXG4gIF0sXG4gIHVybDogW1xuICAgIHsgYTogXCJodHRwOi8vZXhhbXBsZS5jb21cIiB9LFxuICAgIHsgYTogXCJodHRwczovL2V4YW1wbGUuY29tXCIgfSxcbiAgICB7IGE6IFwianNyOkBzY29wZS90ZXN0XCIgfSxcbiAgICB7IGE6IFwibnBtOkBzY29wZS90ZXN0XCIgfSxcbiAgICB7IGE6IFwiZmlsZTovLy90ZXN0L3BhdGhcIiB9LFxuICAgIHsgYTogXCJkYXRhOmFwcGxpY2F0aW9uL3Rlc3QsbnVsbFwiIH0sXG4gICAgeyBhOiBcInRlc3RfaW52YWxpZF91cmxcIiwgYjogRXJyb3IgfSxcbiAgXSxcbiAgZGF0ZTogW1xuICAgIHsgYTogbmV3IERhdGUoXCIyMDI0LTAxLTAxVDAwOjAwOjAwLjAwMFpcIikgfSxcbiAgICB7IGE6IFwidGVzdF9pbnZhbGlkX2RhdGVcIiwgYjogRXJyb3IgfSxcbiAgXSxcbiAgZXJyb3I6IFtcbiAgICB7IGE6IG5ldyBFcnJvcihcIlRlc3QgZXJyb3JcIikgfSxcbiAgICB7IGE6IGAke25ldyBFcnJvcihcIlRlc3QgZXJyb3JcIil9YCwgYjogRXJyb3IgfSxcbiAgXSxcbiAgZXhwcmVzc2lvbjogW1xuICAgIHsgYTogXCIke2ZvbyArIDF9XCIgfSxcbiAgICB7IGE6IFwiZm9vICsgMVwiLCBiOiBFcnJvciB9LFxuICBdLFxuICBjYWxsYWJsZTogW1xuICAgIHsgYTogKCkgPT4ge30gfSxcbiAgICB7IGE6IGFzeW5jICgpID0+IHt9IH0sXG4gICAgeyBhOiBudWxsLCBiOiBFcnJvciB9LFxuICAgIHsgYToge30sIGI6IEVycm9yIH0sXG4gIF0sXG4gIHBhcnNlcjogW1xuICAgIHsgYTogT2JqZWN0LmFzc2lnbihpcy5vYmplY3QoeyBmb286IGlzLnN0cmluZygpIH0pLCB7IFtTeW1ib2wuZm9yKFwiRGVuby5jdXN0b21JbnNwZWN0XCIpXTogKCkgPT4gXCJzY2hlbWFcIiB9KSB9LFxuICAgIHsgYTogeyBwYXJzZTogKCkgPT4gKHt9KSB9IH0sXG4gIF0sXG4gIHVua25vd246IFtcbiAgICB7IGE6IG51bGwgfSxcbiAgICB7IGE6IDEyMyB9LFxuICAgIHsgYTogXCJzdHJpbmdcIiB9LFxuICAgIHsgYTogdHJ1ZSB9LFxuICAgIHsgYTogW10gfSxcbiAgICB7IGE6IHt9IH0sXG4gICAgeyBhOiB7IGZvbzogXCJiYXJcIiB9IH0sXG4gIF0sXG4gIG1ldGEobWV0YTogSW1wb3J0TWV0YSkge1xuICAgIHJldHVybiBbXG4gICAgICB7IGE6IHBpY2sobWV0YSwgW1widXJsXCIsIFwiZGlybmFtZVwiLCBcImZpbGVuYW1lXCJdKSB9LFxuICAgICAgeyBhOiB7fSwgYjogRXJyb3IgfSxcbiAgICBdXG4gIH0sXG4gIGVudW0odmFsdWVzOiByZWFkb25seSBzdHJpbmdbXSkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi52YWx1ZXMubWFwKChhKSA9PiAoeyBhIH0pKSxcbiAgICAgIHsgYTogXCJURVNUX0lOVkFMSURfRU5VTV9WQUxVRVwiLCBiOiBFcnJvciB9LFxuICAgIF1cbiAgfSxcbiAgZGVmYXVsdChiOiB1bmtub3duLCBvcHRpb25zPzogT21pdDx0ZXN0Y2FzZSwgXCJhXCIgfCBcImJcIj4pIHtcbiAgICByZXR1cm4gW1xuICAgICAgeyBhOiB1bmRlZmluZWQsIGIsIC4uLm9wdGlvbnMgfSxcbiAgICBdXG4gIH0sXG59KSBhcyAoKG5hbWU6IHN0cmluZywgc2NoZW1hOiBpcy5ab2RUeXBlLCB0ZXN0c3VpdGVzOiBBcnJheTx0ZXN0Y2FzZT4gfCBSZWNvcmQ8UHJvcGVydHlLZXksIEFycmF5PHRlc3RjYXNlPj4sIG9wdGlvbnM/OiBTcGVjT3B0aW9ucykgPT4gdm9pZCkgJiB7XG4gIG9wdGlvbmFsOiBBcnJheTx0ZXN0Y2FzZT5cbiAgbnVsbGFibGU6IEFycmF5PHRlc3RjYXNlPlxuICBwcmltaXRpdmU6IEFycmF5PHRlc3RjYXNlPlxuICBib29sZWFuOiBBcnJheTx0ZXN0Y2FzZT5cbiAgc3RyaW5nOiB7XG4gICAgYXJyYXlhYmxlOiBBcnJheTx0ZXN0Y2FzZT5cbiAgfSAmIEFycmF5PHRlc3RjYXNlPlxuICBwb3NpdGl2ZToge1xuICAgIGludDogQXJyYXk8dGVzdGNhc2U+XG4gICAgZmluaXRlOiBBcnJheTx0ZXN0Y2FzZT5cbiAgICBpbmZpbml0eTogQXJyYXk8dGVzdGNhc2U+XG4gIH1cbiAgcmVjb3JkOiB7XG4gICAgcHJpbWl0aXZlOiBBcnJheTx0ZXN0Y2FzZT5cbiAgfSAmIEFycmF5PHRlc3RjYXNlPlxuICBhcnJheToge1xuICAgIHVuaXF1ZTogQXJyYXk8dGVzdGNhc2U+XG4gICAgdHlwZWQ6IEFycmF5PHRlc3RjYXNlPlxuICB9XG4gIHJlc3BvbnNlOiB7XG4gICAgYm9keToge1xuICAgICAgaW5pdDogQXJyYXk8dGVzdGNhc2U+XG4gICAgfVxuICB9XG4gIHVsaWQ6IEFycmF5PHRlc3RjYXNlPlxuICB1cmw6IEFycmF5PHRlc3RjYXNlPlxuICBkYXRlOiBBcnJheTx0ZXN0Y2FzZT5cbiAgZXJyb3I6IEFycmF5PHRlc3RjYXNlPlxuICBleHByZXNzaW9uOiBBcnJheTx0ZXN0Y2FzZT5cbiAgY2FsbGFibGU6IEFycmF5PHRlc3RjYXNlPlxuICBwYXJzZXI6IEFycmF5PHRlc3RjYXNlPlxuICB1bmtub3duOiBBcnJheTx0ZXN0Y2FzZT5cbiAgbWV0YTogKG1ldGE6IEltcG9ydE1ldGEpID0+IEFycmF5PHRlc3RjYXNlPlxuICBlbnVtOiAodmFsdWVzOiByZWFkb25seSBzdHJpbmdbXSkgPT4gQXJyYXk8dGVzdGNhc2U+XG4gIGRlZmF1bHQ6IChiOiB1bmtub3duLCBvcHRpb25zPzogT21pdDx0ZXN0Y2FzZSwgXCJhXCIgfCBcImJcIj4pID0+IEFycmF5PHRlc3RjYXNlPlxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFFVixTQUFTLEVBQUUsUUFBUSxXQUFVO0FBQzdCLFNBQVMsSUFBSSxRQUFRLG1CQUFrQjtBQUN2QyxTQUFTLE1BQU0sUUFBUSxnQkFBZTtBQUN0QyxTQUFTLE9BQU8sUUFBUSwwQkFBeUI7QUFlakQsZ0NBQWdDLEdBQ2hDLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTSxDQUFDLFNBQVUsSUFBWSxFQUFFLE1BQWtCLEVBQUUsVUFBa0UsRUFBRSxFQUFFLFdBQVcsSUFBSSxFQUFFLFNBQVMsSUFBSSxFQUFFLEtBQUssRUFBZSxHQUFHLENBQUMsQ0FBQztFQUMzTSxJQUFJLE1BQU0sT0FBTyxDQUFDLGFBQ2hCLGFBQWE7SUFBRSxLQUFLO0VBQVc7RUFDakMsaUJBQWlCO0VBQ2pCLElBQUksVUFDRixLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLHVCQUF1QixDQUFDLEVBQUUsSUFBTSxPQUFPLE9BQU8sS0FBSyxDQUFDLFlBQVksYUFBYSxDQUFDLENBQUM7RUFDckcsbUJBQW1CO0VBQ25CLElBQUksUUFDRixLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLG9CQUFvQixDQUFDLEVBQUUsSUFBTSxPQUFPLElBQU0sT0FBTyxLQUFLLENBQUM7UUFBRSxxQkFBcUI7TUFBSyxJQUFJLE9BQU87RUFDcEgsaUJBQWlCO0VBQ2pCLEtBQUssTUFBTSxDQUFDLEtBQUssVUFBVSxJQUFJLE9BQU8sT0FBTyxDQUFDLFlBQWE7SUFDekQsS0FBSyxNQUFNLFlBQVksVUFBVztNQUNoQyxNQUFNLElBQUksUUFBUSxNQUFNLFNBQVMsQ0FBQyxHQUFHO1FBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO01BQUM7TUFDekQsTUFBTSxJQUFJLE9BQU8sV0FBVyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUM7TUFDbkQsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxPQUFPLEVBQUUsUUFBUSxHQUFHLElBQUksRUFBRSxNQUFNLFFBQVEsaUJBQWlCLENBQUMsU0FBUyxFQUFFLE9BQU8sV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLFNBQVMsV0FBVyxDQUFDLFFBQVEsRUFBRSxRQUFRLFNBQVMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRTtRQUFFLGFBQWE7VUFBRSxLQUFLLFNBQVMsR0FBRyxHQUFHLE9BQU87UUFBTTtNQUFFLEdBQUc7UUFDbFEsTUFBTSxNQUFNLENBQUM7UUFDYixJQUFJO1VBQ0Y7VUFFQSw4QkFBOEI7VUFDOUIsSUFBSSxTQUFTLEdBQUcsRUFBRTtZQUNoQixLQUFLLE1BQU0sQ0FBQyxLQUFLLE1BQU0sSUFBSSxPQUFPLE9BQU8sQ0FBQyxTQUFTLEdBQUcsRUFBRztjQUN2RCxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUNmLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDO2NBQzFCLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLO1lBQ3BCO1VBQ0Y7VUFDQSxhQUFhO1VBQ2IsSUFBSSxNQUFNLE9BQ1IsT0FBTyxJQUFNLE9BQU8sS0FBSyxDQUFDLElBQUksT0FBTztlQUNsQztZQUNILElBQUksQUFBQyxRQUFRLE9BQVEsQ0FBQyxBQUFDLE9BQU8sTUFBTSxZQUFjLE1BQU0sSUFBSyxHQUFHO2NBQzlELE9BQU8sT0FBTyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUM7Y0FDaEM7WUFDRjtZQUNBLElBQUksQUFBQyxhQUFhLFFBQVUsTUFBTSw0QkFBNkI7Y0FDN0QsTUFBTSxLQUFLLE9BQU8sS0FBSyxDQUFDO2NBQ3hCLE9BQU8sQ0FBQyxRQUFRLE1BQU0sS0FBSyxBQUFDLEVBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxPQUFPO2NBQ3BGO1lBQ0Y7WUFDQSxPQUFPLE9BQU8sS0FBSyxDQUFDLElBQUksYUFBYSxDQUFDLFFBQVEsTUFBTSxJQUFvQztjQUFFLENBQUMsSUFBSSxFQUFFO1lBQUU7VUFDckc7UUFDRixTQUFVO1VBQ1IsS0FBSyxNQUFNLENBQUMsS0FBSyxNQUFNLElBQUksT0FBTyxPQUFPLENBQUMsS0FDeEMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUs7UUFDdEI7TUFDRjtJQUNGO0VBQ0Y7QUFDRixHQUFHO0VBQ0QsVUFBVTtJQUNSO01BQUUsR0FBRztNQUFXLEdBQUc7SUFBVTtHQUM5QjtFQUNELFVBQVU7SUFDUjtNQUFFLEdBQUc7SUFBSztHQUNYO0VBQ0QsV0FBVztJQUNUO01BQUUsR0FBRztJQUFNO0lBQ1g7TUFBRSxHQUFHO0lBQUk7SUFDVDtNQUFFLEdBQUcsSUFBSTtJQUFDO0lBQ1Y7TUFBRSxHQUFHO0lBQUs7SUFDVjtNQUFFLEdBQUc7SUFBVTtJQUNmO01BQUUsR0FBRztJQUFLO0lBQ1Y7TUFBRSxHQUFHLElBQUksS0FBSztJQUE0QjtJQUMxQztNQUFFLEdBQUcsSUFBSSxNQUFNO0lBQVc7SUFDMUI7TUFBRSxHQUFHLE9BQU8sR0FBRyxDQUFDO01BQWMsR0FBRztJQUFNO0lBQ3ZDO01BQUUsR0FBRyxDQUFDO01BQUcsR0FBRztJQUFNO0lBQ2xCO01BQUUsR0FBRyxFQUFFO01BQUUsR0FBRztJQUFNO0lBQ2xCO01BQUUsR0FBRyxZQUFhO01BQUcsR0FBRztJQUFNO0dBQy9CO0VBQ0QsU0FBUztJQUNQO01BQUUsR0FBRztJQUFLO0lBQ1Y7TUFBRSxHQUFHO0lBQU07R0FDWjtFQUNELFFBQVEsT0FBTyxNQUFNLENBQUM7SUFDcEI7TUFBRSxHQUFHO0lBQU07R0FDWixFQUFFO0lBQ0QsV0FBVztNQUNUO1FBQUUsR0FBRztRQUFLLEdBQUc7VUFBQztTQUFJO01BQUM7TUFDbkI7UUFBRSxHQUFHO1VBQUM7VUFBSztTQUFJO1FBQUUsR0FBRztVQUFDO1VBQUs7U0FBSTtNQUFDO0tBQ2hDO0VBQ0g7RUFDQSxVQUFVO0lBQ1IsS0FBSztNQUNIO1FBQUUsR0FBRztNQUFFO01BQ1A7UUFBRSxHQUFHO1FBQUssR0FBRztNQUFFO01BQ2Y7UUFBRSxHQUFHLENBQUM7UUFBRyxHQUFHO01BQU07TUFDbEI7UUFBRSxHQUFHO1FBQU0sR0FBRztNQUFNO01BQ3BCO1FBQUUsR0FBRztRQUFPLEdBQUc7TUFBTTtLQUN0QjtJQUNELFFBQVE7TUFDTjtRQUFFLEdBQUc7TUFBRTtNQUNQO1FBQUUsR0FBRztRQUFLLEdBQUc7TUFBTTtNQUNuQjtRQUFFLEdBQUc7UUFBVSxHQUFHO01BQU07S0FDekI7SUFDRCxVQUFVO01BQ1I7UUFBRSxHQUFHO01BQVM7TUFDZDtRQUFFLEdBQUc7UUFBWSxHQUFHO01BQVM7S0FDOUI7RUFDSDtFQUNBLFFBQVEsT0FBTyxNQUFNLENBQUM7SUFDcEI7TUFBRSxHQUFHO1FBQUUsS0FBSztRQUFPLEtBQUs7TUFBSTtNQUFHLEdBQUc7UUFBRSxLQUFLO1FBQU8sS0FBSztNQUFJO0lBQUU7SUFDM0Q7TUFBRSxHQUFHO01BQU8sR0FBRztJQUFNO0dBQ3RCLEVBQUU7SUFDRCxXQUFXO01BQ1Q7UUFBRSxHQUFHO1VBQUUsS0FBSztRQUFNO01BQUU7TUFDcEI7UUFBRSxHQUFHO1VBQUUsS0FBSztRQUFJO01BQUU7TUFDbEI7UUFBRSxHQUFHO1VBQUUsS0FBSyxJQUFJO1FBQUM7TUFBRTtNQUNuQjtRQUFFLEdBQUc7VUFBRSxLQUFLO1FBQUs7TUFBRTtNQUNuQjtRQUFFLEdBQUc7VUFBRSxLQUFLO1FBQVU7TUFBRTtNQUN4QjtRQUFFLEdBQUc7VUFBRSxLQUFLO1FBQUs7TUFBRTtNQUNuQjtRQUFFLEdBQUc7VUFBRSxLQUFLLE9BQU8sR0FBRyxDQUFDO1FBQWE7UUFBRyxHQUFHO01BQU07TUFDaEQ7UUFBRSxHQUFHO1VBQUUsS0FBSyxDQUFDO1FBQUU7UUFBRyxHQUFHO01BQU07TUFDM0I7UUFBRSxHQUFHO1VBQUUsS0FBSyxFQUFFO1FBQUM7UUFBRyxHQUFHO01BQU07TUFDM0I7UUFBRSxHQUFHO1VBQUUsS0FBSyxZQUFhO1FBQUU7UUFBRyxHQUFHO01BQU07S0FDeEM7RUFDSDtFQUNBLE9BQU87SUFDTCxRQUFRO01BQ047UUFBRSxHQUFHO1VBQUM7VUFBSztVQUFLO1VBQUs7VUFBSztTQUFJO1FBQUUsR0FBRztVQUFDO1VBQUs7VUFBSztTQUFJO01BQUM7S0FDcEQ7SUFDRCxPQUFPO01BQ0w7UUFBRSxHQUFHLElBQUk7TUFBWTtNQUNyQjtRQUFFLEdBQUcsSUFBSTtNQUFhO01BQ3RCO1FBQUUsR0FBRyxJQUFJO01BQW9CO01BQzdCO1FBQUUsR0FBRyxJQUFJO01BQWE7TUFDdEI7UUFBRSxHQUFHLElBQUk7TUFBYztNQUN2QjtRQUFFLEdBQUcsSUFBSTtNQUFhO01BQ3RCO1FBQUUsR0FBRyxJQUFJO01BQWM7TUFDdkI7UUFBRSxHQUFHLElBQUk7TUFBZTtNQUN4QjtRQUFFLEdBQUcsSUFBSTtNQUFlO01BQ3hCO1FBQUUsR0FBRyxJQUFJO01BQWU7TUFDeEI7UUFBRSxHQUFHLElBQUk7TUFBZ0I7TUFDekI7UUFBRSxHQUFHLElBQUk7TUFBaUI7S0FDM0I7RUFDSDtFQUNBLFVBQVU7SUFDUixNQUFNO01BQ0osTUFBTTtRQUNKO1VBQUUsR0FBRztRQUFLO1FBQ1Y7VUFBRSxHQUFHO1FBQU07UUFDWDtVQUFFLEdBQUcsSUFBSTtRQUFPO1FBQ2hCO1VBQUUsR0FBRyxJQUFJLFlBQVk7UUFBRztRQUN4QjtVQUFFLEdBQUcsSUFBSSxTQUFTLElBQUksWUFBWTtRQUFJO1FBQ3RDO1VBQUUsR0FBRyxJQUFJO1FBQVc7UUFDcEI7VUFBRSxHQUFHLElBQUk7UUFBaUI7UUFDMUI7VUFBRSxHQUFHLElBQUk7UUFBa0I7UUFDM0I7VUFBRSxHQUFHLElBQUk7UUFBWTtPQUN0QjtJQUNIO0VBQ0Y7RUFDQSxNQUFNO0lBQ0o7TUFBRSxHQUFHLElBQUksTUFBTSxDQUFDO0lBQUk7SUFDcEI7TUFBRSxHQUFHO01BQXFCLEdBQUc7SUFBTTtHQUNwQztFQUNELEtBQUs7SUFDSDtNQUFFLEdBQUc7SUFBcUI7SUFDMUI7TUFBRSxHQUFHO0lBQXNCO0lBQzNCO01BQUUsR0FBRztJQUFrQjtJQUN2QjtNQUFFLEdBQUc7SUFBa0I7SUFDdkI7TUFBRSxHQUFHO0lBQW9CO0lBQ3pCO01BQUUsR0FBRztJQUE2QjtJQUNsQztNQUFFLEdBQUc7TUFBb0IsR0FBRztJQUFNO0dBQ25DO0VBQ0QsTUFBTTtJQUNKO01BQUUsR0FBRyxJQUFJLEtBQUs7SUFBNEI7SUFDMUM7TUFBRSxHQUFHO01BQXFCLEdBQUc7SUFBTTtHQUNwQztFQUNELE9BQU87SUFDTDtNQUFFLEdBQUcsSUFBSSxNQUFNO0lBQWM7SUFDN0I7TUFBRSxHQUFHLEdBQUcsSUFBSSxNQUFNLGVBQWU7TUFBRSxHQUFHO0lBQU07R0FDN0M7RUFDRCxZQUFZO0lBQ1Y7TUFBRSxHQUFHO0lBQWE7SUFDbEI7TUFBRSxHQUFHO01BQVcsR0FBRztJQUFNO0dBQzFCO0VBQ0QsVUFBVTtJQUNSO01BQUUsR0FBRyxLQUFPO0lBQUU7SUFDZDtNQUFFLEdBQUcsV0FBYTtJQUFFO0lBQ3BCO01BQUUsR0FBRztNQUFNLEdBQUc7SUFBTTtJQUNwQjtNQUFFLEdBQUcsQ0FBQztNQUFHLEdBQUc7SUFBTTtHQUNuQjtFQUNELFFBQVE7SUFDTjtNQUFFLEdBQUcsT0FBTyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7UUFBRSxLQUFLLEdBQUcsTUFBTTtNQUFHLElBQUk7UUFBRSxDQUFDLE9BQU8sR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQU07TUFBUztJQUFHO0lBQzVHO01BQUUsR0FBRztRQUFFLE9BQU8sSUFBTSxDQUFDLENBQUMsQ0FBQztNQUFFO0lBQUU7R0FDNUI7RUFDRCxTQUFTO0lBQ1A7TUFBRSxHQUFHO0lBQUs7SUFDVjtNQUFFLEdBQUc7SUFBSTtJQUNUO01BQUUsR0FBRztJQUFTO0lBQ2Q7TUFBRSxHQUFHO0lBQUs7SUFDVjtNQUFFLEdBQUcsRUFBRTtJQUFDO0lBQ1I7TUFBRSxHQUFHLENBQUM7SUFBRTtJQUNSO01BQUUsR0FBRztRQUFFLEtBQUs7TUFBTTtJQUFFO0dBQ3JCO0VBQ0QsTUFBSyxJQUFnQjtJQUNuQixPQUFPO01BQ0w7UUFBRSxHQUFHLEtBQUssTUFBTTtVQUFDO1VBQU87VUFBVztTQUFXO01BQUU7TUFDaEQ7UUFBRSxHQUFHLENBQUM7UUFBRyxHQUFHO01BQU07S0FDbkI7RUFDSDtFQUNBLE1BQUssTUFBeUI7SUFDNUIsT0FBTztTQUNGLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBTSxDQUFDO1VBQUU7UUFBRSxDQUFDO01BQzNCO1FBQUUsR0FBRztRQUEyQixHQUFHO01BQU07S0FDMUM7RUFDSDtFQUNBLFNBQVEsQ0FBVSxFQUFFLE9BQW1DO0lBQ3JELE9BQU87TUFDTDtRQUFFLEdBQUc7UUFBVztRQUFHLEdBQUcsT0FBTztNQUFDO0tBQy9CO0VBQ0g7QUFDRixHQW9DQyJ9
|