@f-o-t/pdf 0.1.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.
@@ -0,0 +1,492 @@
1
+ import {
2
+ createArray,
3
+ createDictionary,
4
+ createName,
5
+ createRef,
6
+ createStream
7
+ } from "./chunk-6dengthp.js";
8
+
9
+ // src/schemas.ts
10
+ import { z } from "zod";
11
+ var PDFRefSchema = z.object({
12
+ objectNumber: z.number().int().positive(),
13
+ generation: z.number().int().nonnegative()
14
+ });
15
+ var PDFNameSchema = z.object({
16
+ type: z.literal("name"),
17
+ value: z.string()
18
+ });
19
+ var PageSizeSchema = z.union([
20
+ z.enum(["A4", "Letter", "Legal", "A3", "A5", "Tabloid"]),
21
+ z.object({
22
+ width: z.number().positive(),
23
+ height: z.number().positive()
24
+ })
25
+ ]);
26
+ var RGBColorSchema = z.object({
27
+ type: z.literal("rgb"),
28
+ r: z.number().min(0).max(1),
29
+ g: z.number().min(0).max(1),
30
+ b: z.number().min(0).max(1)
31
+ });
32
+ var CMYKColorSchema = z.object({
33
+ type: z.literal("cmyk"),
34
+ c: z.number().min(0).max(1),
35
+ m: z.number().min(0).max(1),
36
+ y: z.number().min(0).max(1),
37
+ k: z.number().min(0).max(1)
38
+ });
39
+ var GrayColorSchema = z.object({
40
+ type: z.literal("gray"),
41
+ gray: z.number().min(0).max(1)
42
+ });
43
+ var PDFColorSchema = z.union([
44
+ RGBColorSchema,
45
+ CMYKColorSchema,
46
+ GrayColorSchema
47
+ ]);
48
+ var TextOptionsSchema = z.object({
49
+ x: z.number(),
50
+ y: z.number(),
51
+ size: z.number().positive().optional(),
52
+ font: z.string().optional(),
53
+ color: PDFColorSchema.optional(),
54
+ align: z.enum(["left", "center", "right"]).optional()
55
+ });
56
+ var RectOptionsSchema = z.object({
57
+ x: z.number(),
58
+ y: z.number(),
59
+ width: z.number().positive(),
60
+ height: z.number().positive(),
61
+ fill: PDFColorSchema.optional(),
62
+ stroke: PDFColorSchema.optional(),
63
+ lineWidth: z.number().positive().optional()
64
+ });
65
+ var LineOptionsSchema = z.object({
66
+ x1: z.number(),
67
+ y1: z.number(),
68
+ x2: z.number(),
69
+ y2: z.number(),
70
+ color: PDFColorSchema.optional(),
71
+ lineWidth: z.number().positive().optional()
72
+ });
73
+ var PDFMetadataSchema = z.object({
74
+ title: z.string().optional(),
75
+ author: z.string().optional(),
76
+ subject: z.string().optional(),
77
+ keywords: z.array(z.string()).optional(),
78
+ creator: z.string().optional(),
79
+ producer: z.string().optional(),
80
+ creationDate: z.date().optional(),
81
+ modificationDate: z.date().optional()
82
+ });
83
+ var PDFDictionarySchema = z.lazy(() => z.record(z.string(), PDFValueSchema));
84
+ var PDFArraySchema = z.lazy(() => z.array(PDFValueSchema));
85
+ var PDFStreamSchema = z.object({
86
+ dictionary: PDFDictionarySchema,
87
+ data: z.instanceof(Uint8Array)
88
+ });
89
+ var PDFValueSchema = z.lazy(() => z.union([
90
+ z.boolean(),
91
+ z.number(),
92
+ z.string(),
93
+ PDFNameSchema,
94
+ PDFArraySchema,
95
+ PDFDictionarySchema,
96
+ PDFStreamSchema,
97
+ z.null(),
98
+ PDFRefSchema
99
+ ]));
100
+ var PDFIndirectObjectSchema = z.object({
101
+ ref: PDFRefSchema,
102
+ value: PDFValueSchema
103
+ });
104
+ var PDFObjectTypeSchema = z.enum([
105
+ "boolean",
106
+ "number",
107
+ "string",
108
+ "name",
109
+ "array",
110
+ "dictionary",
111
+ "stream",
112
+ "null",
113
+ "indirect"
114
+ ]);
115
+ var PDFVersionSchema = z.enum(["1.4", "1.5", "1.6", "1.7"]);
116
+
117
+ // src/generation/fonts.ts
118
+ var STANDARD_FONTS = {
119
+ "Times-Roman": "Times-Roman",
120
+ "Times-Bold": "Times-Bold",
121
+ "Times-Italic": "Times-Italic",
122
+ "Times-BoldItalic": "Times-BoldItalic",
123
+ Helvetica: "Helvetica",
124
+ "Helvetica-Bold": "Helvetica-Bold",
125
+ "Helvetica-Oblique": "Helvetica-Oblique",
126
+ "Helvetica-BoldOblique": "Helvetica-BoldOblique",
127
+ Courier: "Courier",
128
+ "Courier-Bold": "Courier-Bold",
129
+ "Courier-Oblique": "Courier-Oblique",
130
+ "Courier-BoldOblique": "Courier-BoldOblique",
131
+ Symbol: "Symbol",
132
+ ZapfDingbats: "ZapfDingbats"
133
+ };
134
+ var FONT_FAMILIES = {
135
+ times: {
136
+ regular: "Times-Roman",
137
+ bold: "Times-Bold",
138
+ italic: "Times-Italic",
139
+ boldItalic: "Times-BoldItalic"
140
+ },
141
+ helvetica: {
142
+ regular: "Helvetica",
143
+ bold: "Helvetica-Bold",
144
+ oblique: "Helvetica-Oblique",
145
+ boldOblique: "Helvetica-BoldOblique"
146
+ },
147
+ courier: {
148
+ regular: "Courier",
149
+ bold: "Courier-Bold",
150
+ oblique: "Courier-Oblique",
151
+ boldOblique: "Courier-BoldOblique"
152
+ },
153
+ symbol: {
154
+ regular: "Symbol"
155
+ },
156
+ zapfDingbats: {
157
+ regular: "ZapfDingbats"
158
+ }
159
+ };
160
+ function isStandardFont(font) {
161
+ return font in STANDARD_FONTS;
162
+ }
163
+ function getFontRefName(font) {
164
+ return `F${Object.keys(STANDARD_FONTS).indexOf(font) + 1}`;
165
+ }
166
+
167
+ // src/generation/page.ts
168
+ var PAGE_SIZES = {
169
+ A4: { width: 595, height: 842 },
170
+ Letter: { width: 612, height: 792 },
171
+ Legal: { width: 612, height: 1008 },
172
+ A3: { width: 842, height: 1191 },
173
+ A5: { width: 420, height: 595 },
174
+ Tabloid: { width: 792, height: 1224 }
175
+ };
176
+
177
+ class PDFPage {
178
+ ref;
179
+ size;
180
+ parent;
181
+ contentStream = [];
182
+ resources;
183
+ constructor(ref, options = {}) {
184
+ this.ref = ref;
185
+ this.size = PageSizeSchema.parse(options.size ?? "A4");
186
+ this.parent = options.parent;
187
+ this.resources = createDictionary({
188
+ Font: createDictionary()
189
+ });
190
+ }
191
+ getDimensions() {
192
+ if (typeof this.size === "string") {
193
+ return PAGE_SIZES[this.size];
194
+ }
195
+ return this.size;
196
+ }
197
+ setFillColor(color) {
198
+ if (color.type === "rgb") {
199
+ this.contentStream.push(`${color.r} ${color.g} ${color.b} rg`);
200
+ } else if (color.type === "cmyk") {
201
+ this.contentStream.push(`${color.c} ${color.m} ${color.y} ${color.k} k`);
202
+ } else if (color.type === "gray") {
203
+ this.contentStream.push(`${color.gray} g`);
204
+ }
205
+ }
206
+ setStrokeColor(color) {
207
+ if (color.type === "rgb") {
208
+ this.contentStream.push(`${color.r} ${color.g} ${color.b} RG`);
209
+ } else if (color.type === "cmyk") {
210
+ this.contentStream.push(`${color.c} ${color.m} ${color.y} ${color.k} K`);
211
+ } else if (color.type === "gray") {
212
+ this.contentStream.push(`${color.gray} G`);
213
+ }
214
+ }
215
+ drawText(text, options) {
216
+ const validOptions = TextOptionsSchema.parse(options);
217
+ const { x, y, size = 12, font = "Helvetica", color, align = "left" } = validOptions;
218
+ const fontName = font || "Helvetica";
219
+ if (!isStandardFont(fontName)) {
220
+ throw new Error(`Font "${fontName}" is not a standard PDF font. Use one of: ${Object.keys(STANDARD_FONTS).join(", ")}`);
221
+ }
222
+ const fontRefName = getFontRefName(fontName);
223
+ const fontDict = this.resources.Font;
224
+ if (!fontDict[fontRefName]) {
225
+ const fontObj = createDictionary({
226
+ Type: createName("Font"),
227
+ Subtype: createName("Type1"),
228
+ BaseFont: createName(fontName)
229
+ });
230
+ fontDict[fontRefName] = fontObj;
231
+ }
232
+ let xPos = x;
233
+ if (align === "center") {
234
+ xPos = x - text.length * size * 0.3;
235
+ } else if (align === "right") {
236
+ xPos = x - text.length * size * 0.6;
237
+ }
238
+ if (color) {
239
+ this.setFillColor(color);
240
+ }
241
+ this.contentStream.push("BT");
242
+ this.contentStream.push(`/${fontRefName} ${size} Tf`);
243
+ this.contentStream.push(`${xPos} ${y} Td`);
244
+ const escapedText = text.replace(/\\/g, "\\\\").replace(/\(/g, "\\(").replace(/\)/g, "\\)");
245
+ this.contentStream.push(`(${escapedText}) Tj`);
246
+ this.contentStream.push("ET");
247
+ }
248
+ drawRectangle(options) {
249
+ const validOptions = RectOptionsSchema.parse(options);
250
+ const { x, y, width, height, fill, stroke, lineWidth = 1 } = validOptions;
251
+ if (lineWidth && stroke) {
252
+ this.contentStream.push(`${lineWidth} w`);
253
+ }
254
+ if (fill) {
255
+ this.setFillColor(fill);
256
+ }
257
+ if (stroke) {
258
+ this.setStrokeColor(stroke);
259
+ }
260
+ this.contentStream.push(`${x} ${y} ${width} ${height} re`);
261
+ if (fill && stroke) {
262
+ this.contentStream.push("B");
263
+ } else if (fill) {
264
+ this.contentStream.push("f");
265
+ } else if (stroke) {
266
+ this.contentStream.push("S");
267
+ } else {
268
+ this.contentStream.push("S");
269
+ }
270
+ }
271
+ drawLine(options) {
272
+ const validOptions = LineOptionsSchema.parse(options);
273
+ const { x1, y1, x2, y2, color, lineWidth = 1 } = validOptions;
274
+ if (lineWidth) {
275
+ this.contentStream.push(`${lineWidth} w`);
276
+ }
277
+ if (color) {
278
+ this.setStrokeColor(color);
279
+ }
280
+ this.contentStream.push(`${x1} ${y1} m`);
281
+ this.contentStream.push(`${x2} ${y2} l`);
282
+ this.contentStream.push("S");
283
+ }
284
+ getContentStreamRef() {
285
+ return createRef(this.ref.objectNumber + 1, 0);
286
+ }
287
+ toContentStream() {
288
+ const content = this.contentStream.join(`
289
+ `);
290
+ const data = new TextEncoder().encode(content);
291
+ const dict = createDictionary({
292
+ Length: data.length
293
+ });
294
+ return createStream(data, dict);
295
+ }
296
+ toDictionary() {
297
+ const dims = this.getDimensions();
298
+ const dict = createDictionary({
299
+ Type: createName("Page"),
300
+ MediaBox: createArray([0, 0, dims.width, dims.height]),
301
+ Contents: this.getContentStreamRef(),
302
+ Resources: this.resources
303
+ });
304
+ if (this.parent) {
305
+ dict.Parent = this.parent;
306
+ }
307
+ return dict;
308
+ }
309
+ }
310
+
311
+ // src/generation/writer.ts
312
+ function serializeValue(value) {
313
+ if (value === null) {
314
+ return "null";
315
+ }
316
+ if (typeof value === "boolean") {
317
+ return value ? "true" : "false";
318
+ }
319
+ if (typeof value === "number") {
320
+ return value.toString();
321
+ }
322
+ if (typeof value === "string") {
323
+ const escaped = value.replace(/\\/g, "\\\\").replace(/\(/g, "\\(").replace(/\)/g, "\\)");
324
+ return `(${escaped})`;
325
+ }
326
+ if (isName(value)) {
327
+ return `/${value.value}`;
328
+ }
329
+ if (isRef(value)) {
330
+ return `${value.objectNumber} ${value.generation} R`;
331
+ }
332
+ if (Array.isArray(value)) {
333
+ return `[${value.map(serializeValue).join(" ")}]`;
334
+ }
335
+ if (typeof value === "object" && !Array.isArray(value)) {
336
+ const dict = value;
337
+ const entries = Object.entries(dict).map(([key, val]) => `/${key} ${serializeValue(val)}`).join(`
338
+ `);
339
+ return `<<
340
+ ${entries}
341
+ >>`;
342
+ }
343
+ return "";
344
+ }
345
+ function serializeStream(stream) {
346
+ const dictStr = serializeValue(stream.dictionary);
347
+ const header = new TextEncoder().encode(`${dictStr}
348
+ stream
349
+ `);
350
+ const footer = new TextEncoder().encode(`
351
+ endstream`);
352
+ const result = new Uint8Array(header.length + stream.data.length + footer.length);
353
+ result.set(header, 0);
354
+ result.set(stream.data, header.length);
355
+ result.set(footer, header.length + stream.data.length);
356
+ return result;
357
+ }
358
+ function serializeObject(objectNumber, generation, value) {
359
+ const header = `${objectNumber} ${generation} obj
360
+ `;
361
+ let body;
362
+ if (isStream(value)) {
363
+ body = serializeStream(value);
364
+ } else {
365
+ body = new TextEncoder().encode(serializeValue(value));
366
+ }
367
+ const footer = new TextEncoder().encode(`
368
+ endobj
369
+ `);
370
+ const result = new Uint8Array(header.length + body.length + footer.length);
371
+ result.set(new TextEncoder().encode(header), 0);
372
+ result.set(body, header.length);
373
+ result.set(footer, header.length + body.length);
374
+ return result;
375
+ }
376
+ function isName(value) {
377
+ return typeof value === "object" && value !== null && value.type === "name";
378
+ }
379
+ function isRef(value) {
380
+ return typeof value === "object" && value !== null && "objectNumber" in value && "generation" in value;
381
+ }
382
+ function isStream(value) {
383
+ return typeof value === "object" && value !== null && "data" in value && value.data instanceof Uint8Array;
384
+ }
385
+
386
+ // src/generation/document.ts
387
+ class PDFDocument {
388
+ version;
389
+ metadata;
390
+ objects = new Map;
391
+ nextObjectNumber = 1;
392
+ catalog;
393
+ pages;
394
+ pagesArray = [];
395
+ constructor(options = {}) {
396
+ this.version = PDFVersionSchema.parse(options.version ?? "1.7");
397
+ this.metadata = PDFMetadataSchema.parse(options.metadata ?? {});
398
+ this.catalog = this.allocateRef();
399
+ this.pages = this.allocateRef();
400
+ const catalogDict = createDictionary({
401
+ Type: createName("Catalog"),
402
+ Pages: this.pages
403
+ });
404
+ this.objects.set(this.catalog.objectNumber, catalogDict);
405
+ const pagesDict = createDictionary({
406
+ Type: createName("Pages"),
407
+ Kids: createArray([]),
408
+ Count: 0
409
+ });
410
+ this.objects.set(this.pages.objectNumber, pagesDict);
411
+ if (Object.keys(this.metadata).length > 0) {
412
+ const infoRef = this.allocateRef();
413
+ const infoDict = createDictionary({ ...this.metadata });
414
+ this.objects.set(infoRef.objectNumber, infoDict);
415
+ }
416
+ }
417
+ allocateRef() {
418
+ return createRef(this.nextObjectNumber++, 0);
419
+ }
420
+ addPage(options) {
421
+ const pageRef = this.allocateRef();
422
+ const contentStreamRef = this.allocateRef();
423
+ const page = new PDFPage(pageRef, { ...options, parent: this.pages });
424
+ this.pagesArray.push(page);
425
+ const pagesDict = this.objects.get(this.pages.objectNumber);
426
+ const kids = pagesDict.Kids;
427
+ kids.push(pageRef);
428
+ pagesDict.Count = pagesDict.Count + 1;
429
+ this.objects.set(pageRef.objectNumber, page.toDictionary());
430
+ this.objects.set(contentStreamRef.objectNumber, page.toContentStream());
431
+ return page;
432
+ }
433
+ save() {
434
+ for (const page of this.pagesArray) {
435
+ this.objects.set(page.ref.objectNumber, page.toDictionary());
436
+ const contentStreamRef = page.getContentStreamRef();
437
+ this.objects.set(contentStreamRef.objectNumber, page.toContentStream());
438
+ }
439
+ const parts = [];
440
+ const header = new TextEncoder().encode(`%PDF-${this.version}
441
+ %âãÏÓ
442
+ `);
443
+ parts.push(header);
444
+ const offsets = [0];
445
+ let currentOffset = header.length;
446
+ const objectNumbers = Array.from(this.objects.keys()).sort((a, b) => a - b);
447
+ for (const objNum of objectNumbers) {
448
+ const obj = this.objects.get(objNum);
449
+ const objBytes = serializeObject(objNum, 0, obj);
450
+ parts.push(objBytes);
451
+ offsets[objNum] = currentOffset;
452
+ currentOffset += objBytes.length;
453
+ }
454
+ const xrefStart = currentOffset;
455
+ const xrefLines = [`xref
456
+ 0 ${offsets.length}
457
+ `];
458
+ xrefLines.push(`0000000000 65535 f
459
+ `);
460
+ for (let i = 1;i < offsets.length; i++) {
461
+ const offset = offsets[i] || 0;
462
+ const offsetStr = offset.toString().padStart(10, "0");
463
+ xrefLines.push(`${offsetStr} 00000 n
464
+ `);
465
+ }
466
+ const xref = new TextEncoder().encode(xrefLines.join(""));
467
+ parts.push(xref);
468
+ const trailerDict = serializeValue(createDictionary({
469
+ Size: offsets.length,
470
+ Root: this.catalog
471
+ }));
472
+ const trailer = new TextEncoder().encode(`trailer
473
+ ${trailerDict}
474
+ startxref
475
+ ${xrefStart}
476
+ %%EOF
477
+ `);
478
+ parts.push(trailer);
479
+ const totalLength = parts.reduce((sum, part) => sum + part.length, 0);
480
+ const result = new Uint8Array(totalLength);
481
+ let position = 0;
482
+ for (const part of parts) {
483
+ result.set(part, position);
484
+ position += part.length;
485
+ }
486
+ return result;
487
+ }
488
+ }
489
+ export { PDFRefSchema, PDFNameSchema, PageSizeSchema, RGBColorSchema, CMYKColorSchema, GrayColorSchema, PDFColorSchema, TextOptionsSchema, RectOptionsSchema, LineOptionsSchema, PDFMetadataSchema, PDFDictionarySchema, PDFArraySchema, PDFStreamSchema, PDFValueSchema, PDFIndirectObjectSchema, PDFObjectTypeSchema, PDFVersionSchema, STANDARD_FONTS, FONT_FAMILIES, isStandardFont, getFontRefName, PDFPage, serializeValue, serializeStream, serializeObject, PDFDocument };
490
+
491
+ //# debugId=D1F9D9F23EC0B1AD64756E2164756E21
492
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3NjaGVtYXMudHMiLCAic3JjL2dlbmVyYXRpb24vZm9udHMudHMiLCAic3JjL2dlbmVyYXRpb24vcGFnZS50cyIsICJzcmMvZ2VuZXJhdGlvbi93cml0ZXIudHMiLCAic3JjL2dlbmVyYXRpb24vZG9jdW1lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLyoqXG4gKiBQREYgUmVmZXJlbmNlIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgUERGUmVmU2NoZW1hID0gei5vYmplY3Qoe1xuICAgb2JqZWN0TnVtYmVyOiB6Lm51bWJlcigpLmludCgpLnBvc2l0aXZlKCksXG4gICBnZW5lcmF0aW9uOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG59KTtcblxuLyoqXG4gKiBQREYgTmFtZSBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERk5hbWVTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICB0eXBlOiB6LmxpdGVyYWwoXCJuYW1lXCIpLFxuICAgdmFsdWU6IHouc3RyaW5nKCksXG59KTtcblxuLyoqXG4gKiBQYWdlIHNpemUgc2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBQYWdlU2l6ZVNjaGVtYSA9IHoudW5pb24oW1xuICAgei5lbnVtKFtcIkE0XCIsIFwiTGV0dGVyXCIsIFwiTGVnYWxcIiwgXCJBM1wiLCBcIkE1XCIsIFwiVGFibG9pZFwiXSksXG4gICB6Lm9iamVjdCh7XG4gICAgICB3aWR0aDogei5udW1iZXIoKS5wb3NpdGl2ZSgpLFxuICAgICAgaGVpZ2h0OiB6Lm51bWJlcigpLnBvc2l0aXZlKCksXG4gICB9KSxcbl0pO1xuXG4vKipcbiAqIFJHQiBjb2xvciBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFJHQkNvbG9yU2NoZW1hID0gei5vYmplY3Qoe1xuICAgdHlwZTogei5saXRlcmFsKFwicmdiXCIpLFxuICAgcjogei5udW1iZXIoKS5taW4oMCkubWF4KDEpLFxuICAgZzogei5udW1iZXIoKS5taW4oMCkubWF4KDEpLFxuICAgYjogei5udW1iZXIoKS5taW4oMCkubWF4KDEpLFxufSk7XG5cbi8qKlxuICogQ01ZSyBjb2xvciBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IENNWUtDb2xvclNjaGVtYSA9IHoub2JqZWN0KHtcbiAgIHR5cGU6IHoubGl0ZXJhbChcImNteWtcIiksXG4gICBjOiB6Lm51bWJlcigpLm1pbigwKS5tYXgoMSksXG4gICBtOiB6Lm51bWJlcigpLm1pbigwKS5tYXgoMSksXG4gICB5OiB6Lm51bWJlcigpLm1pbigwKS5tYXgoMSksXG4gICBrOiB6Lm51bWJlcigpLm1pbigwKS5tYXgoMSksXG59KTtcblxuLyoqXG4gKiBHcmF5IGNvbG9yIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgR3JheUNvbG9yU2NoZW1hID0gei5vYmplY3Qoe1xuICAgdHlwZTogei5saXRlcmFsKFwiZ3JheVwiKSxcbiAgIGdyYXk6IHoubnVtYmVyKCkubWluKDApLm1heCgxKSxcbn0pO1xuXG4vKipcbiAqIFBERiBDb2xvciBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERkNvbG9yU2NoZW1hID0gei51bmlvbihbXG4gICBSR0JDb2xvclNjaGVtYSxcbiAgIENNWUtDb2xvclNjaGVtYSxcbiAgIEdyYXlDb2xvclNjaGVtYSxcbl0pO1xuXG4vKipcbiAqIFRleHQgb3B0aW9ucyBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRPcHRpb25zU2NoZW1hID0gei5vYmplY3Qoe1xuICAgeDogei5udW1iZXIoKSxcbiAgIHk6IHoubnVtYmVyKCksXG4gICBzaXplOiB6Lm51bWJlcigpLnBvc2l0aXZlKCkub3B0aW9uYWwoKSxcbiAgIGZvbnQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgIGNvbG9yOiBQREZDb2xvclNjaGVtYS5vcHRpb25hbCgpLFxuICAgYWxpZ246IHouZW51bShbXCJsZWZ0XCIsIFwiY2VudGVyXCIsIFwicmlnaHRcIl0pLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBSZWN0YW5nbGUgb3B0aW9ucyBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFJlY3RPcHRpb25zU2NoZW1hID0gei5vYmplY3Qoe1xuICAgeDogei5udW1iZXIoKSxcbiAgIHk6IHoubnVtYmVyKCksXG4gICB3aWR0aDogei5udW1iZXIoKS5wb3NpdGl2ZSgpLFxuICAgaGVpZ2h0OiB6Lm51bWJlcigpLnBvc2l0aXZlKCksXG4gICBmaWxsOiBQREZDb2xvclNjaGVtYS5vcHRpb25hbCgpLFxuICAgc3Ryb2tlOiBQREZDb2xvclNjaGVtYS5vcHRpb25hbCgpLFxuICAgbGluZVdpZHRoOiB6Lm51bWJlcigpLnBvc2l0aXZlKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIExpbmUgb3B0aW9ucyBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IExpbmVPcHRpb25zU2NoZW1hID0gei5vYmplY3Qoe1xuICAgeDE6IHoubnVtYmVyKCksXG4gICB5MTogei5udW1iZXIoKSxcbiAgIHgyOiB6Lm51bWJlcigpLFxuICAgeTI6IHoubnVtYmVyKCksXG4gICBjb2xvcjogUERGQ29sb3JTY2hlbWEub3B0aW9uYWwoKSxcbiAgIGxpbmVXaWR0aDogei5udW1iZXIoKS5wb3NpdGl2ZSgpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBQREYgbWV0YWRhdGEgc2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBQREZNZXRhZGF0YVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgIHRpdGxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICBhdXRob3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgIHN1YmplY3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgIGtleXdvcmRzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICBjcmVhdG9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICBwcm9kdWNlcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgY3JlYXRpb25EYXRlOiB6LmRhdGUoKS5vcHRpb25hbCgpLFxuICAgbW9kaWZpY2F0aW9uRGF0ZTogei5kYXRlKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFBERiBEaWN0aW9uYXJ5IHNjaGVtYSAocmVjdXJzaXZlKVxuICovXG5leHBvcnQgY29uc3QgUERGRGljdGlvbmFyeVNjaGVtYTogei5ab2RUeXBlPFJlY29yZDxzdHJpbmcsIGFueT4+ID0gei5sYXp5KCgpID0+XG4gICB6LnJlY29yZCh6LnN0cmluZygpLCBQREZWYWx1ZVNjaGVtYSksXG4pO1xuXG4vKipcbiAqIFBERiBBcnJheSBzY2hlbWEgKHJlY3Vyc2l2ZSlcbiAqL1xuZXhwb3J0IGNvbnN0IFBERkFycmF5U2NoZW1hOiB6LlpvZFR5cGU8YW55W10+ID0gei5sYXp5KCgpID0+XG4gICB6LmFycmF5KFBERlZhbHVlU2NoZW1hKSxcbik7XG5cbi8qKlxuICogUERGIFN0cmVhbSBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERlN0cmVhbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgIGRpY3Rpb25hcnk6IFBERkRpY3Rpb25hcnlTY2hlbWEsXG4gICBkYXRhOiB6Lmluc3RhbmNlb2YoVWludDhBcnJheSksXG59KTtcblxuLyoqXG4gKiBQREYgVmFsdWUgc2NoZW1hIChyZWN1cnNpdmUgdW5pb24pXG4gKi9cbmV4cG9ydCBjb25zdCBQREZWYWx1ZVNjaGVtYTogei5ab2RUeXBlPGFueT4gPSB6LmxhenkoKCkgPT5cbiAgIHoudW5pb24oW1xuICAgICAgei5ib29sZWFuKCksXG4gICAgICB6Lm51bWJlcigpLFxuICAgICAgei5zdHJpbmcoKSxcbiAgICAgIFBERk5hbWVTY2hlbWEsXG4gICAgICBQREZBcnJheVNjaGVtYSxcbiAgICAgIFBERkRpY3Rpb25hcnlTY2hlbWEsXG4gICAgICBQREZTdHJlYW1TY2hlbWEsXG4gICAgICB6Lm51bGwoKSxcbiAgICAgIFBERlJlZlNjaGVtYSxcbiAgIF0pLFxuKTtcblxuLyoqXG4gKiBQREYgSW5kaXJlY3QgT2JqZWN0IHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgUERGSW5kaXJlY3RPYmplY3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICByZWY6IFBERlJlZlNjaGVtYSxcbiAgIHZhbHVlOiBQREZWYWx1ZVNjaGVtYSxcbn0pO1xuXG4vKipcbiAqIFBERiBPYmplY3QgVHlwZSBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERk9iamVjdFR5cGVTY2hlbWEgPSB6LmVudW0oW1xuICAgXCJib29sZWFuXCIsXG4gICBcIm51bWJlclwiLFxuICAgXCJzdHJpbmdcIixcbiAgIFwibmFtZVwiLFxuICAgXCJhcnJheVwiLFxuICAgXCJkaWN0aW9uYXJ5XCIsXG4gICBcInN0cmVhbVwiLFxuICAgXCJudWxsXCIsXG4gICBcImluZGlyZWN0XCIsXG5dKTtcblxuLyoqXG4gKiBQREYgdmVyc2lvbiBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERlZlcnNpb25TY2hlbWEgPSB6LmVudW0oW1wiMS40XCIsIFwiMS41XCIsIFwiMS42XCIsIFwiMS43XCJdKTtcbiIsCiAgICAiLyoqXG4gKiBQREYgU3RhbmRhcmQgMTQgRm9udHNcbiAqIFRoZXNlIGZvbnRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGF2YWlsYWJsZSBpbiBhbGwgUERGIHJlYWRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFNUQU5EQVJEX0ZPTlRTID0ge1xuICAgLy8gU2VyaWYgZm9udHNcbiAgIFwiVGltZXMtUm9tYW5cIjogXCJUaW1lcy1Sb21hblwiLFxuICAgXCJUaW1lcy1Cb2xkXCI6IFwiVGltZXMtQm9sZFwiLFxuICAgXCJUaW1lcy1JdGFsaWNcIjogXCJUaW1lcy1JdGFsaWNcIixcbiAgIFwiVGltZXMtQm9sZEl0YWxpY1wiOiBcIlRpbWVzLUJvbGRJdGFsaWNcIixcblxuICAgLy8gU2Fucy1zZXJpZiBmb250c1xuICAgSGVsdmV0aWNhOiBcIkhlbHZldGljYVwiLFxuICAgXCJIZWx2ZXRpY2EtQm9sZFwiOiBcIkhlbHZldGljYS1Cb2xkXCIsXG4gICBcIkhlbHZldGljYS1PYmxpcXVlXCI6IFwiSGVsdmV0aWNhLU9ibGlxdWVcIixcbiAgIFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI6IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCIsXG5cbiAgIC8vIE1vbm9zcGFjZSBmb250c1xuICAgQ291cmllcjogXCJDb3VyaWVyXCIsXG4gICBcIkNvdXJpZXItQm9sZFwiOiBcIkNvdXJpZXItQm9sZFwiLFxuICAgXCJDb3VyaWVyLU9ibGlxdWVcIjogXCJDb3VyaWVyLU9ibGlxdWVcIixcbiAgIFwiQ291cmllci1Cb2xkT2JsaXF1ZVwiOiBcIkNvdXJpZXItQm9sZE9ibGlxdWVcIixcblxuICAgLy8gU3ltYm9sIGZvbnRzXG4gICBTeW1ib2w6IFwiU3ltYm9sXCIsXG4gICBaYXBmRGluZ2JhdHM6IFwiWmFwZkRpbmdiYXRzXCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZEZvbnQgPSBrZXlvZiB0eXBlb2YgU1RBTkRBUkRfRk9OVFM7XG5cbi8qKlxuICogRm9udCBmYW1pbGllcyBmb3IgY29udmVuaWVuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IEZPTlRfRkFNSUxJRVMgPSB7XG4gICB0aW1lczoge1xuICAgICAgcmVndWxhcjogXCJUaW1lcy1Sb21hblwiIGFzIFN0YW5kYXJkRm9udCxcbiAgICAgIGJvbGQ6IFwiVGltZXMtQm9sZFwiIGFzIFN0YW5kYXJkRm9udCxcbiAgICAgIGl0YWxpYzogXCJUaW1lcy1JdGFsaWNcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICAgICBib2xkSXRhbGljOiBcIlRpbWVzLUJvbGRJdGFsaWNcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICB9LFxuICAgaGVsdmV0aWNhOiB7XG4gICAgICByZWd1bGFyOiBcIkhlbHZldGljYVwiIGFzIFN0YW5kYXJkRm9udCxcbiAgICAgIGJvbGQ6IFwiSGVsdmV0aWNhLUJvbGRcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICAgICBvYmxpcXVlOiBcIkhlbHZldGljYS1PYmxpcXVlXCIgYXMgU3RhbmRhcmRGb250LFxuICAgICAgYm9sZE9ibGlxdWU6IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCIgYXMgU3RhbmRhcmRGb250LFxuICAgfSxcbiAgIGNvdXJpZXI6IHtcbiAgICAgIHJlZ3VsYXI6IFwiQ291cmllclwiIGFzIFN0YW5kYXJkRm9udCxcbiAgICAgIGJvbGQ6IFwiQ291cmllci1Cb2xkXCIgYXMgU3RhbmRhcmRGb250LFxuICAgICAgb2JsaXF1ZTogXCJDb3VyaWVyLU9ibGlxdWVcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICAgICBib2xkT2JsaXF1ZTogXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCIgYXMgU3RhbmRhcmRGb250LFxuICAgfSxcbiAgIHN5bWJvbDoge1xuICAgICAgcmVndWxhcjogXCJTeW1ib2xcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICB9LFxuICAgemFwZkRpbmdiYXRzOiB7XG4gICAgICByZWd1bGFyOiBcIlphcGZEaW5nYmF0c1wiIGFzIFN0YW5kYXJkRm9udCxcbiAgIH0sXG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgZm9udCBpcyBhIHN0YW5kYXJkIFBERiBmb250XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YW5kYXJkRm9udChmb250OiBzdHJpbmcpOiBmb250IGlzIFN0YW5kYXJkRm9udCB7XG4gICByZXR1cm4gZm9udCBpbiBTVEFOREFSRF9GT05UUztcbn1cblxuLyoqXG4gKiBHZXQgZm9udCBvYmplY3QgcmVmZXJlbmNlIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvbnRSZWZOYW1lKGZvbnQ6IFN0YW5kYXJkRm9udCk6IHN0cmluZyB7XG4gICByZXR1cm4gYEYke09iamVjdC5rZXlzKFNUQU5EQVJEX0ZPTlRTKS5pbmRleE9mKGZvbnQpICsgMX1gO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFBERlJlZiwgUERGRGljdGlvbmFyeSwgUGFnZVNpemUsIFRleHRPcHRpb25zLCBSZWN0T3B0aW9ucywgTGluZU9wdGlvbnMsIFBERkNvbG9yLCBQREZTdHJlYW0gfSBmcm9tIFwiLi4vdHlwZXMudHNcIjtcbmltcG9ydCB7XG4gICBjcmVhdGVEaWN0aW9uYXJ5LFxuICAgY3JlYXRlTmFtZSxcbiAgIGNyZWF0ZUFycmF5LFxuICAgY3JlYXRlUmVmLFxuICAgY3JlYXRlU3RyZWFtLFxufSBmcm9tIFwiLi4vY29yZS9vYmplY3RzLnRzXCI7XG5pbXBvcnQgeyBQYWdlU2l6ZVNjaGVtYSwgVGV4dE9wdGlvbnNTY2hlbWEsIFJlY3RPcHRpb25zU2NoZW1hLCBMaW5lT3B0aW9uc1NjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWFzLnRzXCI7XG5pbXBvcnQgeyBTVEFOREFSRF9GT05UUywgaXNTdGFuZGFyZEZvbnQsIGdldEZvbnRSZWZOYW1lLCB0eXBlIFN0YW5kYXJkRm9udCB9IGZyb20gXCIuL2ZvbnRzLnRzXCI7XG5cbmV4cG9ydCB0eXBlIFBERlBhZ2VPcHRpb25zID0ge1xuICAgc2l6ZT86IFBhZ2VTaXplO1xuICAgcGFyZW50PzogUERGUmVmO1xufTtcblxuLy8gU3RhbmRhcmQgcGFnZSBzaXplcyBpbiBwb2ludHMgKDEvNzIgaW5jaClcbmNvbnN0IFBBR0VfU0laRVMgPSB7XG4gICBBNDogeyB3aWR0aDogNTk1LCBoZWlnaHQ6IDg0MiB9LFxuICAgTGV0dGVyOiB7IHdpZHRoOiA2MTIsIGhlaWdodDogNzkyIH0sXG4gICBMZWdhbDogeyB3aWR0aDogNjEyLCBoZWlnaHQ6IDEwMDggfSxcbiAgIEEzOiB7IHdpZHRoOiA4NDIsIGhlaWdodDogMTE5MSB9LFxuICAgQTU6IHsgd2lkdGg6IDQyMCwgaGVpZ2h0OiA1OTUgfSxcbiAgIFRhYmxvaWQ6IHsgd2lkdGg6IDc5MiwgaGVpZ2h0OiAxMjI0IH0sXG59O1xuXG4vKipcbiAqIFBERiBQYWdlIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBQREZQYWdlIHtcbiAgIHJlZjogUERGUmVmO1xuICAgc2l6ZTogUGFnZVNpemU7XG4gICBwYXJlbnQ/OiBQREZSZWY7XG4gICBjb250ZW50U3RyZWFtOiBzdHJpbmdbXSA9IFtdO1xuICAgcHJpdmF0ZSByZXNvdXJjZXM6IFBERkRpY3Rpb25hcnk7XG5cbiAgIGNvbnN0cnVjdG9yKHJlZjogUERGUmVmLCBvcHRpb25zOiBQREZQYWdlT3B0aW9ucyA9IHt9KSB7XG4gICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgIHRoaXMuc2l6ZSA9IFBhZ2VTaXplU2NoZW1hLnBhcnNlKG9wdGlvbnMuc2l6ZSA/PyBcIkE0XCIpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcbiAgICAgIHRoaXMucmVzb3VyY2VzID0gY3JlYXRlRGljdGlvbmFyeSh7XG4gICAgICAgICBGb250OiBjcmVhdGVEaWN0aW9uYXJ5KCksXG4gICAgICB9KTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgcGFnZSBkaW1lbnNpb25zIGluIHBvaW50c1xuICAgICovXG4gICBnZXREaW1lbnNpb25zKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuc2l6ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgcmV0dXJuIFBBR0VfU0laRVNbdGhpcy5zaXplXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICB9XG5cbiAgIC8qKlxuICAgICogU2V0IGZpbGwgY29sb3JcbiAgICAqL1xuICAgcHJpdmF0ZSBzZXRGaWxsQ29sb3IoY29sb3I6IFBERkNvbG9yKTogdm9pZCB7XG4gICAgICBpZiAoY29sb3IudHlwZSA9PT0gXCJyZ2JcIikge1xuICAgICAgICAgdGhpcy5jb250ZW50U3RyZWFtLnB1c2goYCR7Y29sb3Iucn0gJHtjb2xvci5nfSAke2NvbG9yLmJ9IHJnYCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbG9yLnR5cGUgPT09IFwiY215a1wiKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcbiAgICAgICAgICAgIGAke2NvbG9yLmN9ICR7Y29sb3IubX0gJHtjb2xvci55fSAke2NvbG9yLmt9IGtgLFxuICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sb3IudHlwZSA9PT0gXCJncmF5XCIpIHtcbiAgICAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAke2NvbG9yLmdyYXl9IGdgKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqXG4gICAgKiBTZXQgc3Ryb2tlIGNvbG9yXG4gICAgKi9cbiAgIHByaXZhdGUgc2V0U3Ryb2tlQ29sb3IoY29sb3I6IFBERkNvbG9yKTogdm9pZCB7XG4gICAgICBpZiAoY29sb3IudHlwZSA9PT0gXCJyZ2JcIikge1xuICAgICAgICAgdGhpcy5jb250ZW50U3RyZWFtLnB1c2goYCR7Y29sb3Iucn0gJHtjb2xvci5nfSAke2NvbG9yLmJ9IFJHYCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbG9yLnR5cGUgPT09IFwiY215a1wiKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcbiAgICAgICAgICAgIGAke2NvbG9yLmN9ICR7Y29sb3IubX0gJHtjb2xvci55fSAke2NvbG9yLmt9IEtgLFxuICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sb3IudHlwZSA9PT0gXCJncmF5XCIpIHtcbiAgICAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAke2NvbG9yLmdyYXl9IEdgKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqXG4gICAgKiBEcmF3IHRleHQgb24gdGhlIHBhZ2VcbiAgICAqL1xuICAgZHJhd1RleHQodGV4dDogc3RyaW5nLCBvcHRpb25zOiBUZXh0T3B0aW9ucyk6IHZvaWQge1xuICAgICAgY29uc3QgdmFsaWRPcHRpb25zID0gVGV4dE9wdGlvbnNTY2hlbWEucGFyc2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCB7IHgsIHksIHNpemUgPSAxMiwgZm9udCA9IFwiSGVsdmV0aWNhXCIsIGNvbG9yLCBhbGlnbiA9IFwibGVmdFwiIH0gPSB2YWxpZE9wdGlvbnM7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGZvbnQgaW4gcmVzb3VyY2VzXG4gICAgICBjb25zdCBmb250TmFtZSA9IGZvbnQgfHwgXCJIZWx2ZXRpY2FcIjtcbiAgICAgIGlmICghaXNTdGFuZGFyZEZvbnQoZm9udE5hbWUpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRm9udCBcIiR7Zm9udE5hbWV9XCIgaXMgbm90IGEgc3RhbmRhcmQgUERGIGZvbnQuIFVzZSBvbmUgb2Y6ICR7T2JqZWN0LmtleXMoU1RBTkRBUkRfRk9OVFMpLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9udFJlZk5hbWUgPSBnZXRGb250UmVmTmFtZShmb250TmFtZSk7XG4gICAgICBjb25zdCBmb250RGljdCA9IHRoaXMucmVzb3VyY2VzLkZvbnQgYXMgUERGRGljdGlvbmFyeTtcbiAgICAgIGlmICghZm9udERpY3RbZm9udFJlZk5hbWVdKSB7XG4gICAgICAgICAvLyBDcmVhdGUgZm9udCBvYmplY3RcbiAgICAgICAgIGNvbnN0IGZvbnRPYmogPSBjcmVhdGVEaWN0aW9uYXJ5KHtcbiAgICAgICAgICAgIFR5cGU6IGNyZWF0ZU5hbWUoXCJGb250XCIpLFxuICAgICAgICAgICAgU3VidHlwZTogY3JlYXRlTmFtZShcIlR5cGUxXCIpLFxuICAgICAgICAgICAgQmFzZUZvbnQ6IGNyZWF0ZU5hbWUoZm9udE5hbWUpLFxuICAgICAgICAgfSk7XG4gICAgICAgICBmb250RGljdFtmb250UmVmTmFtZV0gPSBmb250T2JqO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGV4dCBwb3NpdGlvbiBiYXNlZCBvbiBhbGlnbm1lbnRcbiAgICAgIGxldCB4UG9zID0geDtcbiAgICAgIGlmIChhbGlnbiA9PT0gXCJjZW50ZXJcIikge1xuICAgICAgICAgLy8gQXBwcm94aW1hdGUgY2VudGVyaW5nIChwcm9wZXIgY2FsY3VsYXRpb24gbmVlZHMgZm9udCBtZXRyaWNzKVxuICAgICAgICAgeFBvcyA9IHggLSB0ZXh0Lmxlbmd0aCAqIHNpemUgKiAwLjM7XG4gICAgICB9IGVsc2UgaWYgKGFsaWduID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgIHhQb3MgPSB4IC0gdGV4dC5sZW5ndGggKiBzaXplICogMC42O1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgY29sb3IgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgdGhpcy5zZXRGaWxsQ29sb3IoY29sb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyBEcmF3IHRleHRcbiAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKFwiQlRcIik7IC8vIEJlZ2luIHRleHRcbiAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAvJHtmb250UmVmTmFtZX0gJHtzaXplfSBUZmApOyAvLyBTZXQgZm9udCBhbmQgc2l6ZVxuICAgICAgdGhpcy5jb250ZW50U3RyZWFtLnB1c2goYCR7eFBvc30gJHt5fSBUZGApOyAvLyBQb3NpdGlvblxuXG4gICAgICAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRleHRcbiAgICAgIGNvbnN0IGVzY2FwZWRUZXh0ID0gdGV4dFxuICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKVxuICAgICAgICAgLnJlcGxhY2UoL1xcKC9nLCBcIlxcXFwoXCIpXG4gICAgICAgICAucmVwbGFjZSgvXFwpL2csIFwiXFxcXClcIik7XG4gICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChgKCR7ZXNjYXBlZFRleHR9KSBUamApOyAvLyBTaG93IHRleHRcbiAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKFwiRVRcIik7IC8vIEVuZCB0ZXh0XG4gICB9XG5cbiAgIC8qKlxuICAgICogRHJhdyBhIHJlY3RhbmdsZVxuICAgICovXG4gICBkcmF3UmVjdGFuZ2xlKG9wdGlvbnM6IFJlY3RPcHRpb25zKTogdm9pZCB7XG4gICAgICBjb25zdCB2YWxpZE9wdGlvbnMgPSBSZWN0T3B0aW9uc1NjaGVtYS5wYXJzZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCwgc3Ryb2tlLCBsaW5lV2lkdGggPSAxIH0gPSB2YWxpZE9wdGlvbnM7XG5cbiAgICAgIC8vIFNldCBncmFwaGljcyBzdGF0ZVxuICAgICAgaWYgKGxpbmVXaWR0aCAmJiBzdHJva2UpIHtcbiAgICAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAke2xpbmVXaWR0aH0gd2ApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsbCkge1xuICAgICAgICAgdGhpcy5zZXRGaWxsQ29sb3IoZmlsbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJva2UpIHtcbiAgICAgICAgIHRoaXMuc2V0U3Ryb2tlQ29sb3Ioc3Ryb2tlKTtcbiAgICAgIH1cblxuICAgICAgLy8gRHJhdyByZWN0YW5nbGVcbiAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAke3h9ICR7eX0gJHt3aWR0aH0gJHtoZWlnaHR9IHJlYCk7XG5cbiAgICAgIC8vIEZpbGwsIHN0cm9rZSwgb3IgYm90aFxuICAgICAgaWYgKGZpbGwgJiYgc3Ryb2tlKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcIkJcIik7IC8vIEZpbGwgYW5kIHN0cm9rZVxuICAgICAgfSBlbHNlIGlmIChmaWxsKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcImZcIik7IC8vIEZpbGwgb25seVxuICAgICAgfSBlbHNlIGlmIChzdHJva2UpIHtcbiAgICAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKFwiU1wiKTsgLy8gU3Ryb2tlIG9ubHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcIlNcIik7IC8vIERlZmF1bHQgdG8gc3Ryb2tlXG4gICAgICB9XG4gICB9XG5cbiAgIC8qKlxuICAgICogRHJhdyBhIGxpbmVcbiAgICAqL1xuICAgZHJhd0xpbmUob3B0aW9uczogTGluZU9wdGlvbnMpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHZhbGlkT3B0aW9ucyA9IExpbmVPcHRpb25zU2NoZW1hLnBhcnNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgeyB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIGxpbmVXaWR0aCA9IDEgfSA9IHZhbGlkT3B0aW9ucztcblxuICAgICAgLy8gU2V0IGdyYXBoaWNzIHN0YXRlXG4gICAgICBpZiAobGluZVdpZHRoKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChgJHtsaW5lV2lkdGh9IHdgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgICB0aGlzLnNldFN0cm9rZUNvbG9yKGNvbG9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gRHJhdyBsaW5lXG4gICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChgJHt4MX0gJHt5MX0gbWApOyAvLyBNb3ZlIHRvIHN0YXJ0XG4gICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChgJHt4Mn0gJHt5Mn0gbGApOyAvLyBMaW5lIHRvIGVuZFxuICAgICAgdGhpcy5jb250ZW50U3RyZWFtLnB1c2goXCJTXCIpOyAvLyBTdHJva2VcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgY29udGVudCBzdHJlYW0gcmVmZXJlbmNlXG4gICAgKi9cbiAgIGdldENvbnRlbnRTdHJlYW1SZWYoKTogUERGUmVmIHtcbiAgICAgIC8vIENvbnRlbnQgc3RyZWFtIHJlZiBpcyBwYWdlIHJlZiArIDFcbiAgICAgIHJldHVybiBjcmVhdGVSZWYodGhpcy5yZWYub2JqZWN0TnVtYmVyICsgMSwgMCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2VuZXJhdGUgY29udGVudCBzdHJlYW0gYXMgUERGU3RyZWFtXG4gICAgKi9cbiAgIHRvQ29udGVudFN0cmVhbSgpOiBQREZTdHJlYW0ge1xuICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGVudFN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShjb250ZW50KTtcbiAgICAgIFxuICAgICAgY29uc3QgZGljdCA9IGNyZWF0ZURpY3Rpb25hcnkoe1xuICAgICAgICAgTGVuZ3RoOiBkYXRhLmxlbmd0aCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3JlYXRlU3RyZWFtKGRhdGEsIGRpY3QpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENvbnZlcnQgcGFnZSB0byBQREYgZGljdGlvbmFyeVxuICAgICovXG4gICB0b0RpY3Rpb25hcnkoKTogUERGRGljdGlvbmFyeSB7XG4gICAgICBjb25zdCBkaW1zID0gdGhpcy5nZXREaW1lbnNpb25zKCk7XG4gICAgICBjb25zdCBkaWN0ID0gY3JlYXRlRGljdGlvbmFyeSh7XG4gICAgICAgICBUeXBlOiBjcmVhdGVOYW1lKFwiUGFnZVwiKSxcbiAgICAgICAgIE1lZGlhQm94OiBjcmVhdGVBcnJheShbMCwgMCwgZGltcy53aWR0aCwgZGltcy5oZWlnaHRdKSxcbiAgICAgICAgIENvbnRlbnRzOiB0aGlzLmdldENvbnRlbnRTdHJlYW1SZWYoKSxcbiAgICAgICAgIFJlc291cmNlczogdGhpcy5yZXNvdXJjZXMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICBkaWN0LlBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGljdDtcbiAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBQREZWYWx1ZSwgUERGRGljdGlvbmFyeSwgUERGUmVmLCBQREZTdHJlYW0sIFBERkFycmF5LCBQREZOYW1lIH0gZnJvbSBcIi4uL3R5cGVzLnRzXCI7XG5cbi8qKlxuICogU2VyaWFsaXplIGEgUERGIHZhbHVlIHRvIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUodmFsdWU6IFBERlZhbHVlKTogc3RyaW5nIHtcbiAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgfVxuICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xuICAgfVxuICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICB9XG4gICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgICBjb25zdCBlc2NhcGVkID0gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1xcKC9nLCBcIlxcXFwoXCIpLnJlcGxhY2UoL1xcKS9nLCBcIlxcXFwpXCIpO1xuICAgICAgcmV0dXJuIGAoJHtlc2NhcGVkfSlgO1xuICAgfVxuICAgaWYgKGlzTmFtZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgLyR7dmFsdWUudmFsdWV9YDtcbiAgIH1cbiAgIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgJHt2YWx1ZS5vYmplY3ROdW1iZXJ9ICR7dmFsdWUuZ2VuZXJhdGlvbn0gUmA7XG4gICB9XG4gICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgWyR7dmFsdWUubWFwKHNlcmlhbGl6ZVZhbHVlKS5qb2luKFwiIFwiKX1dYDtcbiAgIH1cbiAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBEaWN0aW9uYXJ5XG4gICAgICBjb25zdCBkaWN0ID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgUERGVmFsdWU+O1xuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGRpY3QpXG4gICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiBgLyR7a2V5fSAke3NlcmlhbGl6ZVZhbHVlKHZhbCl9YClcbiAgICAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGA8PFxcbiR7ZW50cmllc31cXG4+PmA7XG4gICB9XG4gICByZXR1cm4gXCJcIjtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgYSBQREYgc3RyZWFtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVTdHJlYW0oc3RyZWFtOiBQREZTdHJlYW0pOiBVaW50OEFycmF5IHtcbiAgIGNvbnN0IGRpY3RTdHIgPSBzZXJpYWxpemVWYWx1ZShzdHJlYW0uZGljdGlvbmFyeSk7XG4gICBjb25zdCBoZWFkZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoYCR7ZGljdFN0cn1cXG5zdHJlYW1cXG5gKTtcbiAgIGNvbnN0IGZvb3RlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShcIlxcbmVuZHN0cmVhbVwiKTtcblxuICAgLy8gQ29tYmluZSBoZWFkZXIsIGRhdGEsIGZvb3RlclxuICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoaGVhZGVyLmxlbmd0aCArIHN0cmVhbS5kYXRhLmxlbmd0aCArIGZvb3Rlci5sZW5ndGgpO1xuICAgcmVzdWx0LnNldChoZWFkZXIsIDApO1xuICAgcmVzdWx0LnNldChzdHJlYW0uZGF0YSwgaGVhZGVyLmxlbmd0aCk7XG4gICByZXN1bHQuc2V0KGZvb3RlciwgaGVhZGVyLmxlbmd0aCArIHN0cmVhbS5kYXRhLmxlbmd0aCk7XG5cbiAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGFuIGluZGlyZWN0IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplT2JqZWN0KG9iamVjdE51bWJlcjogbnVtYmVyLCBnZW5lcmF0aW9uOiBudW1iZXIsIHZhbHVlOiBhbnkpOiBVaW50OEFycmF5IHtcbiAgIGNvbnN0IGhlYWRlciA9IGAke29iamVjdE51bWJlcn0gJHtnZW5lcmF0aW9ufSBvYmpcXG5gO1xuICAgbGV0IGJvZHk6IFVpbnQ4QXJyYXk7XG5cbiAgIGlmIChpc1N0cmVhbSh2YWx1ZSkpIHtcbiAgICAgIGJvZHkgPSBzZXJpYWxpemVTdHJlYW0odmFsdWUpO1xuICAgfSBlbHNlIHtcbiAgICAgIGJvZHkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc2VyaWFsaXplVmFsdWUodmFsdWUpKTtcbiAgIH1cblxuICAgY29uc3QgZm9vdGVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFwiXFxuZW5kb2JqXFxuXCIpO1xuXG4gICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShoZWFkZXIubGVuZ3RoICsgYm9keS5sZW5ndGggKyBmb290ZXIubGVuZ3RoKTtcbiAgIHJlc3VsdC5zZXQobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGhlYWRlciksIDApO1xuICAgcmVzdWx0LnNldChib2R5LCBoZWFkZXIubGVuZ3RoKTtcbiAgIHJlc3VsdC5zZXQoZm9vdGVyLCBoZWFkZXIubGVuZ3RoICsgYm9keS5sZW5ndGgpO1xuXG4gICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBUeXBlIGd1YXJkc1xuZnVuY3Rpb24gaXNOYW1lKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBQREZOYW1lIHtcbiAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUudHlwZSA9PT0gXCJuYW1lXCI7XG59XG5cbmZ1bmN0aW9uIGlzUmVmKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBQREZSZWYge1xuICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBcIm9iamVjdE51bWJlclwiIGluIHZhbHVlICYmIFwiZ2VuZXJhdGlvblwiIGluIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc1N0cmVhbSh2YWx1ZTogYW55KTogdmFsdWUgaXMgUERGU3RyZWFtIHtcbiAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgXCJkYXRhXCIgaW4gdmFsdWUgJiYgdmFsdWUuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG59XG4iLAogICAgImltcG9ydCB7XG4gICBjcmVhdGVBcnJheSxcbiAgIGNyZWF0ZURpY3Rpb25hcnksXG4gICBjcmVhdGVOYW1lLFxuICAgY3JlYXRlUmVmLFxufSBmcm9tIFwiLi4vY29yZS9vYmplY3RzLnRzXCI7XG5pbXBvcnQgeyBQREZNZXRhZGF0YVNjaGVtYSwgUERGVmVyc2lvblNjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWFzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFBERk1ldGFkYXRhLCBQREZSZWYsIFBERlZlcnNpb24gfSBmcm9tIFwiLi4vdHlwZXMudHNcIjtcbmltcG9ydCB7IFBERlBhZ2UgfSBmcm9tIFwiLi9wYWdlLnRzXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVWYWx1ZSwgc2VyaWFsaXplT2JqZWN0IH0gZnJvbSBcIi4vd3JpdGVyLnRzXCI7XG5cbmV4cG9ydCB0eXBlIFBERkRvY3VtZW50T3B0aW9ucyA9IHtcbiAgIHZlcnNpb24/OiBQREZWZXJzaW9uO1xuICAgbWV0YWRhdGE/OiBQREZNZXRhZGF0YTtcbn07XG5cbmV4cG9ydCB0eXBlIHsgUERGUGFnZU9wdGlvbnMgfSBmcm9tIFwiLi9wYWdlLnRzXCI7XG5cbi8qKlxuICogTWFpbiBQREYgRG9jdW1lbnQgY2xhc3MgZm9yIGdlbmVyYXRpb25cbiAqXG4gKiBAcHJvcGVydHkgdmVyc2lvbiAtIFBERiB2ZXJzaW9uICgxLjQsIDEuNSwgMS42LCBvciAxLjcpXG4gKiBAcHJvcGVydHkgbWV0YWRhdGEgLSBEb2N1bWVudCBtZXRhZGF0YSAodGl0bGUsIGF1dGhvciwgZXRjLilcbiAqIEBwcm9wZXJ0eSBjYXRhbG9nIC0gUmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudCBjYXRhbG9nXG4gKiBAcHJvcGVydHkgcGFnZXMgLSBSZWZlcmVuY2UgdG8gdGhlIHBhZ2VzIHRyZWUgcm9vdFxuICovXG5leHBvcnQgY2xhc3MgUERGRG9jdW1lbnQge1xuICAgdmVyc2lvbjogUERGVmVyc2lvbjtcbiAgIG1ldGFkYXRhOiBQREZNZXRhZGF0YTtcbiAgIHByaXZhdGUgb2JqZWN0czogTWFwPG51bWJlciwgUERGRGljdGlvbmFyeT4gPSBuZXcgTWFwKCk7XG4gICBwcml2YXRlIG5leHRPYmplY3ROdW1iZXIgPSAxO1xuXG4gICBjYXRhbG9nOiBQREZSZWY7XG4gICBwYWdlczogUERGUmVmO1xuICAgcHJpdmF0ZSBwYWdlc0FycmF5OiBQREZQYWdlW10gPSBbXTtcblxuICAgY29uc3RydWN0b3Iob3B0aW9uczogUERGRG9jdW1lbnRPcHRpb25zID0ge30pIHtcbiAgICAgIHRoaXMudmVyc2lvbiA9IFBERlZlcnNpb25TY2hlbWEucGFyc2Uob3B0aW9ucy52ZXJzaW9uID8/IFwiMS43XCIpO1xuICAgICAgdGhpcy5tZXRhZGF0YSA9IFBERk1ldGFkYXRhU2NoZW1hLnBhcnNlKG9wdGlvbnMubWV0YWRhdGEgPz8ge30pO1xuXG4gICAgICAvLyBDcmVhdGUgY2F0YWxvZ1xuICAgICAgdGhpcy5jYXRhbG9nID0gdGhpcy5hbGxvY2F0ZVJlZigpO1xuXG4gICAgICAvLyBDcmVhdGUgcGFnZXMgdHJlZVxuICAgICAgdGhpcy5wYWdlcyA9IHRoaXMuYWxsb2NhdGVSZWYoKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBjYXRhbG9nIGRpY3Rpb25hcnlcbiAgICAgIGNvbnN0IGNhdGFsb2dEaWN0ID0gY3JlYXRlRGljdGlvbmFyeSh7XG4gICAgICAgICBUeXBlOiBjcmVhdGVOYW1lKFwiQ2F0YWxvZ1wiKSxcbiAgICAgICAgIFBhZ2VzOiB0aGlzLnBhZ2VzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9iamVjdHMuc2V0KHRoaXMuY2F0YWxvZy5vYmplY3ROdW1iZXIsIGNhdGFsb2dEaWN0KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBwYWdlcyBkaWN0aW9uYXJ5XG4gICAgICBjb25zdCBwYWdlc0RpY3QgPSBjcmVhdGVEaWN0aW9uYXJ5KHtcbiAgICAgICAgIFR5cGU6IGNyZWF0ZU5hbWUoXCJQYWdlc1wiKSxcbiAgICAgICAgIEtpZHM6IGNyZWF0ZUFycmF5KFtdKSxcbiAgICAgICAgIENvdW50OiAwLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9iamVjdHMuc2V0KHRoaXMucGFnZXMub2JqZWN0TnVtYmVyLCBwYWdlc0RpY3QpO1xuXG4gICAgICAvLyBTdG9yZSBtZXRhZGF0YSBpZiBwcm92aWRlZCAod2lsbCBiZSBzZXJpYWxpemVkIGluIGZ1dHVyZSB0YXNrcylcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICBjb25zdCBpbmZvUmVmID0gdGhpcy5hbGxvY2F0ZVJlZigpO1xuICAgICAgICAgY29uc3QgaW5mb0RpY3QgPSBjcmVhdGVEaWN0aW9uYXJ5KHsgLi4udGhpcy5tZXRhZGF0YSB9KTtcbiAgICAgICAgIHRoaXMub2JqZWN0cy5zZXQoaW5mb1JlZi5vYmplY3ROdW1iZXIsIGluZm9EaWN0KTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqXG4gICAgKiBBbGxvY2F0ZSBhIG5ldyBvYmplY3QgcmVmZXJlbmNlXG4gICAgKi9cbiAgIHByaXZhdGUgYWxsb2NhdGVSZWYoKTogUERGUmVmIHtcbiAgICAgIHJldHVybiBjcmVhdGVSZWYodGhpcy5uZXh0T2JqZWN0TnVtYmVyKyssIDApO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEFkZCBhIHBhZ2UgdG8gdGhlIGRvY3VtZW50XG4gICAgKi9cbiAgIGFkZFBhZ2Uob3B0aW9ucz86IGltcG9ydChcIi4vcGFnZS50c1wiKS5QREZQYWdlT3B0aW9ucyk6IFBERlBhZ2Uge1xuICAgICAgY29uc3QgcGFnZVJlZiA9IHRoaXMuYWxsb2NhdGVSZWYoKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1SZWYgPSB0aGlzLmFsbG9jYXRlUmVmKCk7IC8vIEFsbG9jYXRlIGNvbnRlbnQgc3RyZWFtIHJlZlxuICAgICAgXG4gICAgICBjb25zdCBwYWdlID0gbmV3IFBERlBhZ2UocGFnZVJlZiwgeyAuLi5vcHRpb25zLCBwYXJlbnQ6IHRoaXMucGFnZXMgfSk7XG4gICAgICB0aGlzLnBhZ2VzQXJyYXkucHVzaChwYWdlKTtcblxuICAgICAgLy8gVXBkYXRlIHBhZ2VzIGRpY3Rpb25hcnlcbiAgICAgIGNvbnN0IHBhZ2VzRGljdCA9IHRoaXMub2JqZWN0cy5nZXQoXG4gICAgICAgICB0aGlzLnBhZ2VzLm9iamVjdE51bWJlcixcbiAgICAgICkgYXMgaW1wb3J0KFwiLi4vdHlwZXMudHNcIikuUERGRGljdGlvbmFyeTtcbiAgICAgIGNvbnN0IGtpZHMgPSBwYWdlc0RpY3QuS2lkcyBhcyBQREZSZWZbXTtcbiAgICAgIGtpZHMucHVzaChwYWdlUmVmKTtcbiAgICAgIHBhZ2VzRGljdC5Db3VudCA9IChwYWdlc0RpY3QuQ291bnQgYXMgbnVtYmVyKSArIDE7XG5cbiAgICAgIC8vIFN0b3JlIHBhZ2UgZGljdGlvbmFyeVxuICAgICAgdGhpcy5vYmplY3RzLnNldChwYWdlUmVmLm9iamVjdE51bWJlciwgcGFnZS50b0RpY3Rpb25hcnkoKSk7XG5cbiAgICAgIC8vIFN0b3JlIGNvbnRlbnQgc3RyZWFtXG4gICAgICB0aGlzLm9iamVjdHMuc2V0KGNvbnRlbnRTdHJlYW1SZWYub2JqZWN0TnVtYmVyLCBwYWdlLnRvQ29udGVudFN0cmVhbSgpKTtcblxuICAgICAgcmV0dXJuIHBhZ2U7XG4gICB9XG5cbiAgIC8qKlxuICAgICogU2F2ZSBQREYgdG8gYnl0ZXNcbiAgICAqL1xuICAgc2F2ZSgpOiBVaW50OEFycmF5IHtcbiAgICAgIC8vIFJlZnJlc2ggYWxsIG9iamVjdHMgKHBhZ2VzIG1pZ2h0IGhhdmUgY2hhbmdlZClcbiAgICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VzQXJyYXkpIHtcbiAgICAgICAgIHRoaXMub2JqZWN0cy5zZXQocGFnZS5yZWYub2JqZWN0TnVtYmVyLCBwYWdlLnRvRGljdGlvbmFyeSgpKTtcbiAgICAgICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1SZWYgPSBwYWdlLmdldENvbnRlbnRTdHJlYW1SZWYoKTtcbiAgICAgICAgIHRoaXMub2JqZWN0cy5zZXQoY29udGVudFN0cmVhbVJlZi5vYmplY3ROdW1iZXIsIHBhZ2UudG9Db250ZW50U3RyZWFtKCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJ0czogVWludDhBcnJheVtdID0gW107XG5cbiAgICAgIC8vIDEuIFBERiBIZWFkZXIgd2l0aCBiaW5hcnkgbWFya2VyXG4gICAgICBjb25zdCBoZWFkZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoYCVQREYtJHt0aGlzLnZlcnNpb259XFxuJVxceEUyXFx4RTNcXHhDRlxceEQzXFxuYCk7XG4gICAgICBwYXJ0cy5wdXNoKGhlYWRlcik7XG5cbiAgICAgIC8vIDIuIFdyaXRlIG9iamVjdHMgYW5kIHRyYWNrIGJ5dGUgb2Zmc2V0c1xuICAgICAgY29uc3Qgb2Zmc2V0czogbnVtYmVyW10gPSBbMF07IC8vIE9iamVjdCAwIGlzIGFsd2F5cyBhdCBvZmZzZXQgMFxuICAgICAgbGV0IGN1cnJlbnRPZmZzZXQgPSBoZWFkZXIubGVuZ3RoO1xuXG4gICAgICAvLyBTb3J0IG9iamVjdCBudW1iZXJzIHRvIHdyaXRlIGluIG9yZGVyXG4gICAgICBjb25zdCBvYmplY3ROdW1iZXJzID0gQXJyYXkuZnJvbSh0aGlzLm9iamVjdHMua2V5cygpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG5cbiAgICAgIGZvciAoY29uc3Qgb2JqTnVtIG9mIG9iamVjdE51bWJlcnMpIHtcbiAgICAgICAgIGNvbnN0IG9iaiA9IHRoaXMub2JqZWN0cy5nZXQob2JqTnVtKTtcbiAgICAgICAgIGNvbnN0IG9iakJ5dGVzID0gc2VyaWFsaXplT2JqZWN0KG9iak51bSwgMCwgb2JqKTtcbiAgICAgICAgIHBhcnRzLnB1c2gob2JqQnl0ZXMpO1xuICAgICAgICAgb2Zmc2V0c1tvYmpOdW1dID0gY3VycmVudE9mZnNldDtcbiAgICAgICAgIGN1cnJlbnRPZmZzZXQgKz0gb2JqQnl0ZXMubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBDcm9zcy1yZWZlcmVuY2UgdGFibGVcbiAgICAgIGNvbnN0IHhyZWZTdGFydCA9IGN1cnJlbnRPZmZzZXQ7XG4gICAgICBjb25zdCB4cmVmTGluZXMgPSBbYHhyZWZcXG4wICR7b2Zmc2V0cy5sZW5ndGh9XFxuYF07XG5cbiAgICAgIC8vIE9iamVjdCAwIGVudHJ5IChmcmVlKVxuICAgICAgeHJlZkxpbmVzLnB1c2goXCIwMDAwMDAwMDAwIDY1NTM1IGYgXFxuXCIpO1xuXG4gICAgICAvLyBJbi11c2Ugb2JqZWN0c1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICBjb25zdCBvZmZzZXQgPSBvZmZzZXRzW2ldIHx8IDA7XG4gICAgICAgICBjb25zdCBvZmZzZXRTdHIgPSBvZmZzZXQudG9TdHJpbmcoKS5wYWRTdGFydCgxMCwgXCIwXCIpO1xuICAgICAgICAgeHJlZkxpbmVzLnB1c2goYCR7b2Zmc2V0U3RyfSAwMDAwMCBuIFxcbmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB4cmVmID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHhyZWZMaW5lcy5qb2luKFwiXCIpKTtcbiAgICAgIHBhcnRzLnB1c2goeHJlZik7XG5cbiAgICAgIC8vIDQuIFRyYWlsZXJcbiAgICAgIGNvbnN0IHRyYWlsZXJEaWN0ID0gc2VyaWFsaXplVmFsdWUoXG4gICAgICAgICBjcmVhdGVEaWN0aW9uYXJ5KHtcbiAgICAgICAgICAgIFNpemU6IG9mZnNldHMubGVuZ3RoLFxuICAgICAgICAgICAgUm9vdDogdGhpcy5jYXRhbG9nLFxuICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFpbGVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFxuICAgICAgICAgYHRyYWlsZXJcXG4ke3RyYWlsZXJEaWN0fVxcbnN0YXJ0eHJlZlxcbiR7eHJlZlN0YXJ0fVxcbiUlRU9GXFxuYFxuICAgICAgKTtcbiAgICAgIHBhcnRzLnB1c2godHJhaWxlcik7XG5cbiAgICAgIC8vIDUuIENvbWJpbmUgYWxsIHBhcnRzXG4gICAgICBjb25zdCB0b3RhbExlbmd0aCA9IHBhcnRzLnJlZHVjZSgoc3VtLCBwYXJ0KSA9PiBzdW0gKyBwYXJ0Lmxlbmd0aCwgMCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICByZXN1bHQuc2V0KHBhcnQsIHBvc2l0aW9uKTtcbiAgICAgICAgIHBvc2l0aW9uICs9IHBhcnQubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgfVxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7O0FBQUE7QUFLTyxJQUFNLGVBQWUsRUFBRSxPQUFPO0FBQUEsRUFDbEMsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUztBQUFBLEVBQ3hDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVk7QUFDNUMsQ0FBQztBQUtNLElBQU0sZ0JBQWdCLEVBQUUsT0FBTztBQUFBLEVBQ25DLE1BQU0sRUFBRSxRQUFRLE1BQU07QUFBQSxFQUN0QixPQUFPLEVBQUUsT0FBTztBQUNuQixDQUFDO0FBS00sSUFBTSxpQkFBaUIsRUFBRSxNQUFNO0FBQUEsRUFDbkMsRUFBRSxLQUFLLENBQUMsTUFBTSxVQUFVLFNBQVMsTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUFBLEVBQ3ZELEVBQUUsT0FBTztBQUFBLElBQ04sT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsSUFDM0IsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsRUFDL0IsQ0FBQztBQUNKLENBQUM7QUFL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UUFBUSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQztBQUFBLElBRTFFLFdBQVcsVUFBVSxlQUFlO0FBQUEsTUFDakMsTUFBTSxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU07QUFBQSxNQUNuQyxNQUFNLFdBQVcsZ0JBQWdCLFFBQVEsR0FBRyxHQUFHO0FBQUEsTUFDL0MsTUFBTSxLQUFLLFFBQVE7QUFBQSxNQUNuQixRQUFRLFVBQVU7QUFBQSxNQUNsQixpQkFBaUIsU0FBUztBQUFBLElBQzdCO0FBQUEsSUFHQSxNQUFNLFlBQVk7QUFBQSxJQUNsQixNQUFNLFlBQVksQ0FBQztBQUFBLElBQVcsUUFBUTtBQUFBLENBQVU7QUFBQSxJQUdoRCxVQUFVLEtBQUs7QUFBQSxDQUF1QjtBQUFBLElBR3RDLFNBQVMsSUFBSSxFQUFHLElBQUksUUFBUSxRQUFRLEtBQUs7QUFBQSxNQUN0QyxNQUFNLFNBQVMsUUFBUSxNQUFNO0FBQUEsTUFDN0IsTUFBTSxZQUFZLE9BQU8sU0FBUyxFQUFFLFNBQVMsSUFBSSxHQUFHO0FBQUEsTUFDcEQsVUFBVSxLQUFLLEdBQUc7QUFBQSxDQUFzQjtBQUFBLElBQzNDO0FBQUEsSUFFQSxNQUFNLE9BQU8sSUFBSSxZQUFZLEVBQUUsT0FBTyxVQUFVLEtBQUssRUFBRSxDQUFDO0FBQUEsSUFDeEQsTUFBTSxLQUFLLElBQUk7QUFBQSxJQUdmLE1BQU0sY0FBYyxlQUNqQixpQkFBaUI7QUFBQSxNQUNkLE1BQU0sUUFBUTtBQUFBLE1BQ2QsTUFBTSxLQUFLO0FBQUEsSUFDZCxDQUFDLENBQ0o7QUFBQSxJQUNBLE1BQU0sVUFBVSxJQUFJLFlBQVksRUFBRSxPQUMvQjtBQUFBLEVBQVk7QUFBQTtBQUFBLEVBQTJCO0FBQUE7QUFBQSxDQUMxQztBQUFBLElBQ0EsTUFBTSxLQUFLLE9BQU87QUFBQSxJQUdsQixNQUFNLGNBQWMsTUFBTSxPQUFPLENBQUMsS0FBSyxTQUFTLE1BQU0sS0FBSyxRQUFRLENBQUM7QUFBQSxJQUNwRSxNQUFNLFNBQVMsSUFBSSxXQUFXLFdBQVc7QUFBQSxJQUN6QyxJQUFJLFdBQVc7QUFBQSxJQUNmLFdBQVcsUUFBUSxPQUFPO0FBQUEsTUFDdkIsT0FBTyxJQUFJLE1BQU0sUUFBUTtBQUFBLE1BQ3pCLFlBQVksS0FBSztBQUFBLElBQ3BCO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFFYjsiLAogICJkZWJ1Z0lkIjogIkQxRjlEOUYyM0VDMEIxQUQ2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
@@ -0,0 +1,48 @@
1
+ // src/core/objects.ts
2
+ function createName(value) {
3
+ return { type: "name", value };
4
+ }
5
+ function createRef(objectNumber, generation = 0) {
6
+ if (objectNumber < 1) {
7
+ throw new Error(`Object number must be positive, got ${objectNumber}`);
8
+ }
9
+ if (generation < 0 || generation > 65535) {
10
+ throw new Error(`Generation number must be between 0 and 65535, got ${generation}`);
11
+ }
12
+ return { objectNumber, generation };
13
+ }
14
+ function createDictionary(entries) {
15
+ if (entries) {
16
+ return { ...entries };
17
+ }
18
+ return {};
19
+ }
20
+ function createArray(values = []) {
21
+ return values;
22
+ }
23
+ function createStream(data, dictionary) {
24
+ return {
25
+ dictionary: dictionary ?? createDictionary(),
26
+ data
27
+ };
28
+ }
29
+ function isRef(value) {
30
+ return typeof value === "object" && value !== null && "objectNumber" in value && "generation" in value && typeof value.objectNumber === "number" && typeof value.generation === "number";
31
+ }
32
+ function isName(value) {
33
+ return typeof value === "object" && value !== null && "type" in value && value.type === "name" && "value" in value && typeof value.value === "string";
34
+ }
35
+ function isDictionary(value) {
36
+ return typeof value === "object" && value !== null && !Array.isArray(value) && !isRef(value) && !isName(value) && !isStream(value);
37
+ }
38
+ function isStream(value) {
39
+ return typeof value === "object" && value !== null && "dictionary" in value && "data" in value && typeof value.dictionary === "object" && value.dictionary !== null && value.data instanceof Uint8Array;
40
+ }
41
+ function isArray(value) {
42
+ return Array.isArray(value);
43
+ }
44
+
45
+ export { createName, createRef, createDictionary, createArray, createStream, isRef, isName, isDictionary, isStream, isArray };
46
+
47
+ //# debugId=8CD2E6AB52D9F7AE64756E2164756E21
48
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvcmUvb2JqZWN0cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7XG4gICBQREZBcnJheSxcbiAgIFBERkRpY3Rpb25hcnksXG4gICBQREZOYW1lLFxuICAgUERGUmVmLFxuICAgUERGU3RyZWFtLFxuICAgUERGVmFsdWUsXG59IGZyb20gXCIuLi90eXBlcy50c1wiO1xuXG4vKipcbiAqIENyZWF0ZSBhIFBERiBOYW1lIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmFtZSh2YWx1ZTogc3RyaW5nKTogUERGTmFtZSB7XG4gICByZXR1cm4geyB0eXBlOiBcIm5hbWVcIiwgdmFsdWUgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBQREYgUmVmZXJlbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWYob2JqZWN0TnVtYmVyOiBudW1iZXIsIGdlbmVyYXRpb24gPSAwKTogUERGUmVmIHtcbiAgIGlmIChvYmplY3ROdW1iZXIgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBudW1iZXIgbXVzdCBiZSBwb3NpdGl2ZSwgZ290ICR7b2JqZWN0TnVtYmVyfWApO1xuICAgfVxuICAgaWYgKGdlbmVyYXRpb24gPCAwIHx8IGdlbmVyYXRpb24gPiA2NTUzNSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgYEdlbmVyYXRpb24gbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2NTUzNSwgZ290ICR7Z2VuZXJhdGlvbn1gLFxuICAgICAgKTtcbiAgIH1cbiAgIHJldHVybiB7IG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbiB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIFBERiBEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWN0aW9uYXJ5KFxuICAgZW50cmllcz86IFJlY29yZDxzdHJpbmcsIFBERlZhbHVlPixcbik6IFBERkRpY3Rpb25hcnkge1xuICAgaWYgKGVudHJpZXMpIHtcbiAgICAgIHJldHVybiB7IC4uLmVudHJpZXMgfTtcbiAgIH1cbiAgIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBQREYgQXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFycmF5KHZhbHVlczogUERGVmFsdWVbXSA9IFtdKTogUERGQXJyYXkge1xuICAgcmV0dXJuIHZhbHVlcztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBQREYgU3RyZWFtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdHJlYW0oXG4gICBkYXRhOiBVaW50OEFycmF5LFxuICAgZGljdGlvbmFyeT86IFBERkRpY3Rpb25hcnksXG4pOiBQREZTdHJlYW0ge1xuICAgcmV0dXJuIHtcbiAgICAgIGRpY3Rpb25hcnk6IGRpY3Rpb25hcnkgPz8gY3JlYXRlRGljdGlvbmFyeSgpLFxuICAgICAgZGF0YSxcbiAgIH07XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgUERGIFJlZmVyZW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWYodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQREZSZWYge1xuICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIFwib2JqZWN0TnVtYmVyXCIgaW4gdmFsdWUgJiZcbiAgICAgIFwiZ2VuZXJhdGlvblwiIGluIHZhbHVlICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFBERlJlZikub2JqZWN0TnVtYmVyID09PSBcIm51bWJlclwiICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFBERlJlZikuZ2VuZXJhdGlvbiA9PT0gXCJudW1iZXJcIlxuICAgKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBQREYgTmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYW1lKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUERGTmFtZSB7XG4gICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgXCJ0eXBlXCIgaW4gdmFsdWUgJiZcbiAgICAgICh2YWx1ZSBhcyBQREZOYW1lKS50eXBlID09PSBcIm5hbWVcIiAmJlxuICAgICAgXCJ2YWx1ZVwiIGluIHZhbHVlICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFBERk5hbWUpLnZhbHVlID09PSBcInN0cmluZ1wiXG4gICApO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIFBERiBEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RpY3Rpb25hcnkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQREZEaWN0aW9uYXJ5IHtcbiAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICFpc1JlZih2YWx1ZSkgJiZcbiAgICAgICFpc05hbWUodmFsdWUpICYmXG4gICAgICAhaXNTdHJlYW0odmFsdWUpXG4gICApO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIFBERiBTdHJlYW1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyZWFtKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUERGU3RyZWFtIHtcbiAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICBcImRpY3Rpb25hcnlcIiBpbiB2YWx1ZSAmJlxuICAgICAgXCJkYXRhXCIgaW4gdmFsdWUgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgUERGU3RyZWFtKS5kaWN0aW9uYXJ5ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAodmFsdWUgYXMgUERGU3RyZWFtKS5kaWN0aW9uYXJ5ICE9PSBudWxsICYmXG4gICAgICAodmFsdWUgYXMgUERGU3RyZWFtKS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBQREYgQXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQREZBcnJheSB7XG4gICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBWU8sU0FBUyxVQUFVLENBQUMsT0FBd0I7QUFBQSxFQUNoRCxPQUFPLEVBQUUsTUFBTSxRQUFRLE1BQU07QUFBQTtBQU16QixTQUFTLFNBQVMsQ0FBQyxjQUFzQixhQUFhLEdBQVc7QUFBQSxFQUNyRSxJQUFJLGVBQWUsR0FBRztBQUFBLElBQ25CLE1BQU0sSUFBSSxNQUFNLHVDQUF1QyxjQUFjO0FBQUEsRUFDeEU7QUFBQSxFQUNBLElBQUksYUFBYSxLQUFLLGFBQWEsT0FBTztBQUFBLElBQ3ZDLE1BQU0sSUFBSSxNQUNQLHNEQUFzRCxZQUN6RDtBQUFBLEVBQ0g7QUFBQSxFQUNBLE9BQU8sRUFBRSxjQUFjLFdBQVc7QUFBQTtBQU05QixTQUFTLGdCQUFnQixDQUM3QixTQUNjO0FBQUEsRUFDZCxJQUFJLFNBQVM7QUFBQSxJQUNWLE9BQU8sS0FBSyxRQUFRO0FBQUEsRUFDdkI7QUFBQSxFQUNBLE9BQU8sQ0FBQztBQUFBO0FBTUosU0FBUyxXQUFXLENBQUMsU0FBcUIsQ0FBQyxHQUFhO0FBQUEsRUFDNUQsT0FBTztBQUFBO0FBTUgsU0FBUyxZQUFZLENBQ3pCLE1BQ0EsWUFDVTtBQUFBLEVBQ1YsT0FBTztBQUFBLElBQ0osWUFBWSxjQUFjLGlCQUFpQjtBQUFBLElBQzNDO0FBQUEsRUFDSDtBQUFBO0FBTUksU0FBUyxLQUFLLENBQUMsT0FBaUM7QUFBQSxFQUNwRCxPQUNHLE9BQU8sVUFBVSxZQUNqQixVQUFVLFFBQ1Ysa0JBQWtCLFNBQ2xCLGdCQUFnQixTQUNoQixPQUFRLE1BQWlCLGlCQUFpQixZQUMxQyxPQUFRLE1BQWlCLGVBQWU7QUFBQTtBQU92QyxTQUFTLE1BQU0sQ0FBQyxPQUFrQztBQUFBLEVBQ3RELE9BQ0csT0FBTyxVQUFVLFlBQ2pCLFVBQVUsUUFDVixVQUFVLFNBQ1QsTUFBa0IsU0FBUyxVQUM1QixXQUFXLFNBQ1gsT0FBUSxNQUFrQixVQUFVO0FBQUE7QUFPbkMsU0FBUyxZQUFZLENBQUMsT0FBd0M7QUFBQSxFQUNsRSxPQUNHLE9BQU8sVUFBVSxZQUNqQixVQUFVLFFBQ1YsQ0FBQyxNQUFNLFFBQVEsS0FBSyxLQUNwQixDQUFDLE1BQU0sS0FBSyxLQUNaLENBQUMsT0FBTyxLQUFLLEtBQ2IsQ0FBQyxTQUFTLEtBQUs7QUFBQTtBQU9kLFNBQVMsUUFBUSxDQUFDLE9BQW9DO0FBQUEsRUFDMUQsT0FDRyxPQUFPLFVBQVUsWUFDakIsVUFBVSxRQUNWLGdCQUFnQixTQUNoQixVQUFVLFNBQ1YsT0FBUSxNQUFvQixlQUFlLFlBQzFDLE1BQW9CLGVBQWUsUUFDbkMsTUFBb0IsZ0JBQWdCO0FBQUE7QUFPcEMsU0FBUyxPQUFPLENBQUMsT0FBbUM7QUFBQSxFQUN4RCxPQUFPLE1BQU0sUUFBUSxLQUFLO0FBQUE7IiwKICAiZGVidWdJZCI6ICI4Q0QyRTZBQjUyRDlGN0FFNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==