@gnwebsoft/ui 3.0.7 → 3.0.9

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.
Files changed (46) hide show
  1. package/dist/AsyncSelectPayload-B9-6l33R.d.cts +10 -0
  2. package/dist/AsyncSelectPayload-B9-6l33R.d.ts +10 -0
  3. package/dist/chunk-3OPVOWQK.js +140 -0
  4. package/dist/chunk-AEOF2TUF.cjs +2273 -0
  5. package/dist/chunk-ALHC7RLK.js +575 -0
  6. package/dist/chunk-BRRLB22L.js +72 -0
  7. package/dist/chunk-CHZU4PZB.js +2273 -0
  8. package/dist/chunk-EBRUE2WR.cjs +1 -1
  9. package/dist/chunk-HEHPKM4B.cjs +140 -0
  10. package/dist/chunk-K2EJ4YKO.cjs +72 -0
  11. package/dist/chunk-MVPLBJRK.cjs +1 -1
  12. package/dist/chunk-XY4U6A77.cjs +575 -0
  13. package/dist/components/index.cjs +1 -1
  14. package/dist/{enhanced-z-I7EHVS.d.cts → enhanced-CDTkKUlj.d.ts} +5 -5
  15. package/dist/{enhanced-z-I7EHVS.d.ts → enhanced-ZQoS03Cd.d.cts} +5 -5
  16. package/dist/events-BcHVCLBz.d.cts +77 -0
  17. package/dist/events-BcHVCLBz.d.ts +77 -0
  18. package/dist/hooks/index.cjs +3 -3
  19. package/dist/hooks/index.d.cts +3 -2
  20. package/dist/hooks/index.d.ts +3 -2
  21. package/dist/hooks/index.js +1 -1
  22. package/dist/index.cjs +67 -6
  23. package/dist/index.d.cts +5 -3
  24. package/dist/index.d.ts +5 -3
  25. package/dist/index.js +65 -4
  26. package/dist/types/index.cjs +31 -2
  27. package/dist/types/index.d.cts +589 -10
  28. package/dist/types/index.d.ts +589 -10
  29. package/dist/types/index.js +30 -1
  30. package/dist/utils/index.cjs +37 -3
  31. package/dist/utils/index.d.cts +330 -13
  32. package/dist/utils/index.d.ts +330 -13
  33. package/dist/utils/index.js +35 -1
  34. package/dist/wrappers/index.cjs +4 -4
  35. package/dist/wrappers/index.d.cts +41 -19
  36. package/dist/wrappers/index.d.ts +41 -19
  37. package/dist/wrappers/index.js +2 -2
  38. package/package.json +15 -14
  39. package/dist/chunk-4H3AFH7A.js +0 -505
  40. package/dist/chunk-55VNGODF.cjs +0 -2265
  41. package/dist/chunk-BWC3LJIB.js +0 -2265
  42. package/dist/chunk-DE62KYFK.js +0 -122
  43. package/dist/chunk-DEPJRTVT.js +0 -1
  44. package/dist/chunk-FD57PCAC.cjs +0 -1
  45. package/dist/chunk-R2YK4LTT.cjs +0 -122
  46. package/dist/chunk-ZC7FGYL2.cjs +0 -505
@@ -0,0 +1,575 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/utils/api.ts
2
+ var makeRequest = async (url, options) => {
3
+ const response = await fetch(url, options);
4
+ if (response.ok) {
5
+ const apiData = await response.json();
6
+ return {
7
+ apiData,
8
+ status: response.status
9
+ };
10
+ } else if (response.status === 404) {
11
+ const apiData = await response.json();
12
+ const data = {
13
+ status: response.status,
14
+ title: apiData.title
15
+ };
16
+ return data;
17
+ }
18
+ const apiResponse = await response.json();
19
+ return apiResponse;
20
+ };
21
+ var api = class {
22
+ static async filter(url, postModel) {
23
+ const alteredOptions = {
24
+ headers: {
25
+ "Content-Type": "application/json",
26
+ Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
27
+ },
28
+ body: JSON.stringify({ ...postModel, ...postModel.filterModel }),
29
+ method: "POST"
30
+ };
31
+ const apiResponse = await makeRequest(url, alteredOptions);
32
+ return apiResponse;
33
+ }
34
+ static async post(url, body = {}) {
35
+ const alteredOptions = {
36
+ headers: {
37
+ "Content-Type": "application/json",
38
+ Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
39
+ },
40
+ body: JSON.stringify(body),
41
+ method: "POST"
42
+ };
43
+ const apiResponse = await makeRequest(url, alteredOptions);
44
+ return apiResponse;
45
+ }
46
+ static async get(url) {
47
+ const alteredOptions = {
48
+ headers: {
49
+ "Content-Type": "application/json",
50
+ Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
51
+ },
52
+ method: "GET"
53
+ };
54
+ const data = await makeRequest(url, alteredOptions);
55
+ return data;
56
+ }
57
+ static async delete(url) {
58
+ const alteredOptions = {
59
+ headers: {
60
+ "Content-Type": "application/json",
61
+ Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
62
+ },
63
+ method: "DELETE"
64
+ };
65
+ const data = await makeRequest(url, alteredOptions);
66
+ return data;
67
+ }
68
+ static async put(url, body = {}) {
69
+ const alteredOptions = {
70
+ headers: {
71
+ "Content-Type": "application/json",
72
+ Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
73
+ },
74
+ body: JSON.stringify(body),
75
+ method: "PUT"
76
+ };
77
+ const apiResponse = await makeRequest(url, alteredOptions);
78
+ return apiResponse;
79
+ }
80
+ static async fetch(url, options = {}) {
81
+ const alteredOptions = {
82
+ headers: {
83
+ "Content-Type": "application/json",
84
+ Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
85
+ },
86
+ ...options
87
+ };
88
+ const result = await fetch(url, alteredOptions);
89
+ return result;
90
+ }
91
+ static async tempFetch(url, options = { method: "GET" }) {
92
+ const alteredOptions = {
93
+ headers: {
94
+ "Content-Type": "application/json"
95
+ },
96
+ ...options
97
+ };
98
+ const apiResponse = await makeRequest(url, alteredOptions);
99
+ return apiResponse;
100
+ }
101
+ static async upload(url, formData) {
102
+ const alteredOptions = {
103
+ headers: {
104
+ Authorization: `Bearer ${localStorage.getItem("serviceToken")}`
105
+ },
106
+ body: formData,
107
+ method: "POST"
108
+ };
109
+ const apiResponse = await makeRequest(url, alteredOptions);
110
+ return apiResponse;
111
+ }
112
+ };
113
+
114
+ // src/utils/api2.ts
115
+ var makeRequest2 = async (url, options) => {
116
+ const response = await fetch(url, options);
117
+ if (response.ok) {
118
+ const apiData = await response.json();
119
+ return {
120
+ apiData,
121
+ status: response.status
122
+ };
123
+ } else if (response.status === 404) {
124
+ const apiData = await response.json();
125
+ const data = {
126
+ status: response.status,
127
+ title: apiData.title
128
+ };
129
+ return data;
130
+ }
131
+ const apiResponse = await response.json();
132
+ return apiResponse;
133
+ };
134
+ var api2 = class {
135
+ static async filter(url, postModel) {
136
+ const alteredOptions = {
137
+ headers: {
138
+ "Content-Type": "application/json",
139
+ Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
140
+ },
141
+ body: JSON.stringify({ ...postModel, ...postModel.filterModel }),
142
+ method: "POST"
143
+ };
144
+ const apiResponse = await makeRequest2(url, alteredOptions);
145
+ return apiResponse;
146
+ }
147
+ static async post(url, body = {}) {
148
+ const alteredOptions = {
149
+ headers: {
150
+ "Content-Type": "application/json",
151
+ Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
152
+ },
153
+ body: JSON.stringify(body),
154
+ method: "POST"
155
+ };
156
+ const apiResponse = await makeRequest2(url, alteredOptions);
157
+ return apiResponse;
158
+ }
159
+ static async get(url) {
160
+ const alteredOptions = {
161
+ headers: {
162
+ "Content-Type": "application/json",
163
+ Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
164
+ },
165
+ method: "GET"
166
+ };
167
+ const data = await makeRequest2(url, alteredOptions);
168
+ return data;
169
+ }
170
+ static async delete(url) {
171
+ const alteredOptions = {
172
+ headers: {
173
+ "Content-Type": "application/json",
174
+ Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
175
+ },
176
+ method: "DELETE"
177
+ };
178
+ const data = await makeRequest2(url, alteredOptions);
179
+ return data;
180
+ }
181
+ static async put(url, body = {}) {
182
+ const alteredOptions = {
183
+ headers: {
184
+ "Content-Type": "application/json",
185
+ Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
186
+ },
187
+ body: JSON.stringify(body),
188
+ method: "PUT"
189
+ };
190
+ const apiResponse = await makeRequest2(url, alteredOptions);
191
+ return apiResponse;
192
+ }
193
+ static async fetch(url, options = {}) {
194
+ const alteredOptions = {
195
+ headers: {
196
+ "Content-Type": "application/json",
197
+ Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
198
+ },
199
+ ...options
200
+ };
201
+ const result = await fetch(url, alteredOptions);
202
+ return result;
203
+ }
204
+ static async tempFetch(url, options = { method: "GET" }) {
205
+ const alteredOptions = {
206
+ headers: {
207
+ "Content-Type": "application/json"
208
+ },
209
+ ...options
210
+ };
211
+ const apiResponse = await makeRequest2(url, alteredOptions);
212
+ return apiResponse;
213
+ }
214
+ static async upload(url, formData) {
215
+ const alteredOptions = {
216
+ headers: {
217
+ Authorization: `Bearer ${sessionStorage.getItem("serviceToken")}`
218
+ },
219
+ body: formData,
220
+ method: "POST"
221
+ };
222
+ const apiResponse = await makeRequest2(url, alteredOptions);
223
+ return apiResponse;
224
+ }
225
+ };
226
+
227
+ // src/utils/flattenObjectKeys.ts
228
+ var isNested = (obj) => typeof obj === "object" && obj !== null && !Array.isArray(obj);
229
+ var isArray = (obj) => Array.isArray(obj);
230
+ var flattenObjectKeys = (obj, prefix = "") => {
231
+ if (!isNested(obj)) {
232
+ return {
233
+ [prefix]: obj
234
+ };
235
+ }
236
+ return Object.keys(obj).reduce((acc, key) => {
237
+ const currentPrefix = prefix.length ? `${prefix}.` : "";
238
+ if (isNested(obj[key]) && Object.keys(obj[key]).length) {
239
+ if (isArray(obj[key]) && obj[key].length) {
240
+ obj[key].forEach((item, index) => {
241
+ Object.assign(
242
+ acc,
243
+ flattenObjectKeys(item, `${currentPrefix + key}.${index}`)
244
+ );
245
+ });
246
+ } else {
247
+ Object.assign(acc, flattenObjectKeys(obj[key], currentPrefix + key));
248
+ }
249
+ acc[currentPrefix + key] = obj[key];
250
+ } else {
251
+ acc[currentPrefix + key] = obj[key];
252
+ }
253
+ return acc;
254
+ }, {});
255
+ };
256
+
257
+ // src/utils/getTimezone.ts
258
+ function getTimezone(adapter, value) {
259
+ return value == null || !adapter.utils.isValid(value) ? null : adapter.utils.getTimezone(value);
260
+ }
261
+
262
+ // src/utils/handleServerErrors.ts
263
+ var handleServerErrors = function handleServerErrors2(args) {
264
+ const { errors, setError } = args;
265
+ for (const key in errors) {
266
+ const isKeyInVariables = Object.keys(flattenObjectKeys(errors)).includes(
267
+ key
268
+ );
269
+ if (!isKeyInVariables) {
270
+ continue;
271
+ }
272
+ const fieldError = errors[key];
273
+ let errorMessage = "";
274
+ if (Array.isArray(fieldError)) {
275
+ errorMessage = fieldError.join(" ");
276
+ }
277
+ if (typeof fieldError === "string") {
278
+ errorMessage = fieldError;
279
+ }
280
+ if (typeof fieldError === "boolean" && fieldError) {
281
+ errorMessage = "Field is not valid.";
282
+ }
283
+ setError(key, {
284
+ message: errorMessage
285
+ });
286
+ }
287
+ };
288
+
289
+ // src/utils/propertyExists.ts
290
+ function propertyExists(obj, prop) {
291
+ return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, prop);
292
+ }
293
+
294
+ // src/utils/readValueAsDate.ts
295
+ function readValueAsDate(adapter, value) {
296
+ if (typeof value === "string") {
297
+ if (value === "") {
298
+ return null;
299
+ }
300
+ return adapter.utils.date(value);
301
+ }
302
+ return value;
303
+ }
304
+
305
+ // src/utils/removeLeadingTrailingSlashes.ts
306
+ var removeLeadingTrailingSlashes = (route) => {
307
+ return route.replace(/^\/|\/$/g, "");
308
+ };
309
+
310
+ // src/utils/schemaTools.ts
311
+ var _dayjs = require('dayjs'); var _dayjs2 = _interopRequireDefault(_dayjs);
312
+ var _zod = require('zod');
313
+ var schemaTools = {
314
+ // Date validations
315
+ date: ({ message } = {}) => _zod.z.coerce.string().transform((c) => c === "null" || c === "undefined" ? null : c).refine((c) => !!c, { message: message || "Date is required" }).refine((c) => c ? _dayjs2.default.call(void 0, c).isValid() : true, {
316
+ message: message || "Invalid date"
317
+ }),
318
+ nullableDate: ({ message } = {}) => _zod.z.coerce.string().transform((c) => c === "null" ? null : c).transform((c) => c === "undefined" ? null : c).refine((c) => !c && c !== null ? _dayjs2.default.call(void 0, c).isValid() : true, {
319
+ message: message || "Invalid date"
320
+ }),
321
+ dateRange: ({ message } = {}) => _zod.z.object({
322
+ start: _zod.z.coerce.date(),
323
+ end: _zod.z.coerce.date()
324
+ }).refine((data) => data.start <= data.end, {
325
+ message: message || "Start date must be before or equal to end date"
326
+ }),
327
+ // String validations
328
+ requiredString: ({ message, min, max } = {}) => _zod.z.string().trim().min(min || 1, message || `String must be at least ${min || 1} characters`).max(max || 255, message || `String must be at most ${max || 255} characters`),
329
+ email: ({ message } = {}) => _zod.z.string().email(message || "Invalid email address").max(254, "Email must be at most 254 characters"),
330
+ url: ({ message } = {}) => _zod.z.string().url(message || "Invalid URL format"),
331
+ phone: ({ message } = {}) => _zod.z.string().regex(/^[\+]?[1-9][\d]{0,15}$/, message || "Invalid phone number format"),
332
+ alphanumeric: ({ message } = {}) => _zod.z.string().regex(/^[a-zA-Z0-9]+$/, message || "Only letters and numbers are allowed"),
333
+ slug: ({ message } = {}) => _zod.z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, message || "Invalid slug format"),
334
+ // Number validations
335
+ positiveNumber: ({ message, min, max } = {}) => _zod.z.number().positive(message || "Number must be positive").min(min || 0.01, `Number must be at least ${min || 0.01}`).max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
336
+ nonNegativeNumber: ({ message, max } = {}) => _zod.z.number().min(0, message || "Number must be non-negative").max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
337
+ integer: ({ message, min, max } = {}) => _zod.z.number().int(message || "Must be an integer").min(min || Number.MIN_SAFE_INTEGER, `Number must be at least ${min || Number.MIN_SAFE_INTEGER}`).max(max || Number.MAX_SAFE_INTEGER, `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`),
338
+ percentage: ({ message } = {}) => _zod.z.number().min(0, message || "Percentage must be between 0 and 100").max(100, message || "Percentage must be between 0 and 100"),
339
+ // Array validations
340
+ nonEmptyArray: (schema, { message } = {}) => _zod.z.array(schema).min(1, message || "At least one item is required"),
341
+ uniqueArray: (schema, { message } = {}) => _zod.z.array(schema).refine((items) => new Set(items).size === items.length, {
342
+ message: message || "All items must be unique"
343
+ }),
344
+ // Boolean validations
345
+ requiredBoolean: ({ message } = {}) => _zod.z.boolean({
346
+ message: message || "This field is required"
347
+ }),
348
+ // Object validations
349
+ nonEmptyObject: (schema, { message } = {}) => schema.refine((obj) => Object.keys(obj).length > 0, {
350
+ message: message || "Object cannot be empty"
351
+ }),
352
+ // File validations
353
+ fileSize: ({ maxSize, message }) => _zod.z.instanceof(File).refine((file) => file.size <= maxSize, {
354
+ message: message || `File size must be less than ${Math.round(maxSize / 1024 / 1024)}MB`
355
+ }),
356
+ fileType: ({ allowedTypes, message }) => _zod.z.instanceof(File).refine((file) => allowedTypes.includes(file.type), {
357
+ message: message || `File type must be one of: ${allowedTypes.join(", ")}`
358
+ }),
359
+ // Custom validators
360
+ conditional: (condition, trueSchema, falseSchema) => _zod.z.union([trueSchema, falseSchema]).superRefine((data, ctx) => {
361
+ const shouldUseTrue = condition(data);
362
+ const schema = shouldUseTrue ? trueSchema : falseSchema;
363
+ const result = schema.safeParse(data);
364
+ if (!result.success) {
365
+ ctx.addIssue({
366
+ code: _zod.z.ZodIssueCode.custom,
367
+ message: result.error.message
368
+ });
369
+ }
370
+ }),
371
+ transform: {
372
+ toLowerCase: _zod.z.string().transform((val) => val.toLowerCase()),
373
+ toUpperCase: _zod.z.string().transform((val) => val.toUpperCase()),
374
+ trim: _zod.z.string().transform((val) => val.trim()),
375
+ toNumber: _zod.z.string().transform((val) => Number(val)),
376
+ toBoolean: _zod.z.string().transform((val) => val === "true"),
377
+ parseJson: (schema) => _zod.z.string().transform((val, ctx) => {
378
+ try {
379
+ const parsed = JSON.parse(val);
380
+ const result = schema.safeParse(parsed);
381
+ if (result.success) return result.data;
382
+ ctx.addIssue({
383
+ code: _zod.z.ZodIssueCode.custom,
384
+ message: result.error.message
385
+ });
386
+ return _zod.z.NEVER;
387
+ } catch (e) {
388
+ ctx.addIssue({
389
+ code: _zod.z.ZodIssueCode.custom,
390
+ message: "Invalid JSON"
391
+ });
392
+ return _zod.z.NEVER;
393
+ }
394
+ })
395
+ }
396
+ };
397
+
398
+ // src/utils/watch/core.ts
399
+ var _reacthookform = require('react-hook-form');
400
+ var useWatchForm = (control) => _reacthookform.useWatch.call(void 0, { control });
401
+ var useWatchField = (control, name) => _reacthookform.useWatch.call(void 0, { control, name });
402
+ var useWatchFields = (control, names) => _reacthookform.useWatch.call(void 0, { control, name: names });
403
+
404
+ // src/utils/watch/utilities.ts
405
+ var _react = require('react');
406
+
407
+ var useWatchTransform = (control, name, transform) => {
408
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
409
+ return _react.useMemo.call(void 0, () => transform(value), [value, transform]);
410
+ };
411
+ var useWatchDefault = (control, name, defaultValue) => {
412
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
413
+ return _nullishCoalesce(value, () => ( defaultValue));
414
+ };
415
+ var useWatchBoolean = (control, name, defaultValue = false) => {
416
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
417
+ return Boolean(_nullishCoalesce(value, () => ( defaultValue)));
418
+ };
419
+ var useWatchBatch = (control, fields) => {
420
+ const values = _reacthookform.useWatch.call(void 0, { control, name: fields });
421
+ return _react.useMemo.call(void 0, () => {
422
+ const result = {};
423
+ fields.forEach((field, index) => {
424
+ result[field] = values[index];
425
+ });
426
+ return result;
427
+ }, [values, fields]);
428
+ };
429
+ var useWatchConditional = (control, name, shouldWatch, fallback) => {
430
+ const activeValue = _reacthookform.useWatch.call(void 0, {
431
+ control,
432
+ name,
433
+ disabled: !shouldWatch
434
+ });
435
+ return shouldWatch ? activeValue : fallback;
436
+ };
437
+ var useWatchDebounced = (control, name, delay = 300) => {
438
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
439
+ const [debouncedValue, setDebouncedValue] = _react.useState.call(void 0, value);
440
+ _react.useEffect.call(void 0, () => {
441
+ const timer = setTimeout(() => {
442
+ setDebouncedValue(value);
443
+ }, delay);
444
+ return () => clearTimeout(timer);
445
+ }, [value, delay]);
446
+ return debouncedValue;
447
+ };
448
+ var useWatchSelector = (control, name, selector, deps = []) => {
449
+ const value = _reacthookform.useWatch.call(void 0, { control, name });
450
+ return _react.useMemo.call(void 0,
451
+ () => selector(value),
452
+ [value, selector, ...deps]
453
+ // eslint-disable-line react-hooks/exhaustive-deps
454
+ );
455
+ };
456
+
457
+ // src/utils/watch/index.ts
458
+ var typedWatch = {
459
+ // === CORE FUNCTIONS ===
460
+ /** Watch entire form */
461
+ form: useWatchForm,
462
+ /** Watch single field */
463
+ field: useWatchField,
464
+ /** Watch multiple fields */
465
+ fields: useWatchFields,
466
+ // === UTILITY FUNCTIONS ===
467
+ /** Watch with transformation */
468
+ transform: useWatchTransform,
469
+ /** Watch with default value */
470
+ withDefault: useWatchDefault,
471
+ /** Watch as boolean */
472
+ boolean: useWatchBoolean,
473
+ /** Watch multiple with custom keys */
474
+ batch: useWatchBatch,
475
+ /** Watch conditionally */
476
+ conditional: useWatchConditional,
477
+ /** Watch with debouncing */
478
+ debounced: useWatchDebounced,
479
+ /** Watch with selector */
480
+ selector: useWatchSelector
481
+ };
482
+
483
+ // src/utils/typeGuards.ts
484
+ function isRecord(value) {
485
+ return typeof value === "object" && value !== null && !Array.isArray(value);
486
+ }
487
+ function hasProperty(obj, key) {
488
+ return isRecord(obj) && key in obj;
489
+ }
490
+ function isNonEmptyString(value) {
491
+ return typeof value === "string" && value.length > 0;
492
+ }
493
+ function isArray2(value) {
494
+ return Array.isArray(value);
495
+ }
496
+ function isNonEmptyArray(value) {
497
+ return Array.isArray(value) && value.length > 0;
498
+ }
499
+ function isFunction(value) {
500
+ return typeof value === "function";
501
+ }
502
+ function isString(value) {
503
+ return typeof value === "string";
504
+ }
505
+ function isNumber(value) {
506
+ return typeof value === "number" && !isNaN(value);
507
+ }
508
+ function isBoolean(value) {
509
+ return typeof value === "boolean";
510
+ }
511
+ function isNull(value) {
512
+ return value === null;
513
+ }
514
+ function isUndefined(value) {
515
+ return value === void 0;
516
+ }
517
+ function isNullish(value) {
518
+ return value === null || value === void 0;
519
+ }
520
+ function isDefined(value) {
521
+ return value !== null && value !== void 0;
522
+ }
523
+ function isDate(value) {
524
+ return value instanceof Date && !isNaN(value.getTime());
525
+ }
526
+ function isPromise(value) {
527
+ return value instanceof Promise || isRecord(value) && typeof value.then === "function";
528
+ }
529
+ function isError(error) {
530
+ return error instanceof Error;
531
+ }
532
+ function matches(value, validator) {
533
+ return validator(value);
534
+ }
535
+
536
+
537
+
538
+
539
+
540
+
541
+
542
+
543
+
544
+
545
+
546
+
547
+
548
+
549
+
550
+
551
+
552
+
553
+
554
+
555
+
556
+
557
+
558
+
559
+
560
+
561
+
562
+
563
+
564
+
565
+
566
+
567
+
568
+
569
+
570
+
571
+
572
+
573
+
574
+ exports.api = api; exports.api2 = api2; exports.flattenObjectKeys = flattenObjectKeys; exports.getTimezone = getTimezone; exports.handleServerErrors = handleServerErrors; exports.propertyExists = propertyExists; exports.readValueAsDate = readValueAsDate; exports.removeLeadingTrailingSlashes = removeLeadingTrailingSlashes; exports.schemaTools = schemaTools; exports.useWatchForm = useWatchForm; exports.useWatchField = useWatchField; exports.useWatchFields = useWatchFields; exports.useWatchTransform = useWatchTransform; exports.useWatchDefault = useWatchDefault; exports.useWatchBoolean = useWatchBoolean; exports.useWatchBatch = useWatchBatch; exports.useWatchConditional = useWatchConditional; exports.useWatchDebounced = useWatchDebounced; exports.useWatchSelector = useWatchSelector; exports.typedWatch = typedWatch; exports.isRecord = isRecord; exports.hasProperty = hasProperty; exports.isNonEmptyString = isNonEmptyString; exports.isArray = isArray2; exports.isNonEmptyArray = isNonEmptyArray; exports.isFunction = isFunction; exports.isString = isString; exports.isNumber = isNumber; exports.isBoolean = isBoolean; exports.isNull = isNull; exports.isUndefined = isUndefined; exports.isNullish = isNullish; exports.isDefined = isDefined; exports.isDate = isDate; exports.isPromise = isPromise; exports.isError = isError; exports.matches = matches;
575
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9idWlsZHMvbGlicy9HTldlYlNvZnQuVUkvcGFja2FnZXMvdWkvZGlzdC9jaHVuay1YWTRVNkE3Ny5janMiLCIuLi9zcmMvdXRpbHMvYXBpLnRzIiwiLi4vc3JjL3V0aWxzL2FwaTIudHMiLCIuLi9zcmMvdXRpbHMvZmxhdHRlbk9iamVjdEtleXMudHMiLCIuLi9zcmMvdXRpbHMvZ2V0VGltZXpvbmUudHMiLCIuLi9zcmMvdXRpbHMvaGFuZGxlU2VydmVyRXJyb3JzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb3BlcnR5RXhpc3RzLnRzIiwiLi4vc3JjL3V0aWxzL3JlYWRWYWx1ZUFzRGF0ZS50cyIsIi4uL3NyYy91dGlscy9yZW1vdmVMZWFkaW5nVHJhaWxpbmdTbGFzaGVzLnRzIiwiLi4vc3JjL3V0aWxzL3NjaGVtYVRvb2xzLnRzIiwiLi4vc3JjL3V0aWxzL3dhdGNoL2NvcmUudHMiLCIuLi9zcmMvdXRpbHMvd2F0Y2gvdXRpbGl0aWVzLnRzIiwiLi4vc3JjL3V0aWxzL3dhdGNoL2luZGV4LnRzIiwiLi4vc3JjL3V0aWxzL3R5cGVHdWFyZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNLQSxJQUFNLFlBQUEsRUFBYyxNQUFBLENBQ2xCLEdBQUEsRUFDQSxPQUFBLEVBQUEsR0FDNEI7QUFDNUIsRUFBQSxNQUFNLFNBQUEsRUFBVyxNQUFNLEtBQUEsQ0FBTSxHQUFBLEVBQUssT0FBTyxDQUFBO0FBRXpDLEVBQUEsR0FBQSxDQUFJLFFBQUEsQ0FBUyxFQUFBLEVBQUk7QUFDZixJQUFBLE1BQU0sUUFBQSxFQUFhLE1BQU0sUUFBQSxDQUFTLElBQUEsQ0FBSyxDQUFBO0FBRXZDLElBQUEsT0FBTztBQUFBLE1BQ0wsT0FBQTtBQUFBLE1BQ0EsTUFBQSxFQUFRLFFBQUEsQ0FBUztBQUFBLElBQ25CLENBQUE7QUFBQSxFQUNGLEVBQUEsS0FBQSxHQUFBLENBQVcsUUFBQSxDQUFTLE9BQUEsSUFBVyxHQUFBLEVBQUs7QUFDbEMsSUFBQSxNQUFNLFFB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cyIsInNvdXJjZXNDb250ZW50IjpbbnVsbCwiaW1wb3J0IHR5cGUgeyBBcGlSZXNwb25zZSB9IGZyb20gXCIuLi90eXBlcy9BcGlSZXNwb25zZVwiO1xuaW1wb3J0IHR5cGUgeyBMaXN0UmVzcG9uc2UsIFBvc3RNb2RlbCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucywgSnNvbk9iamVjdCB9IGZyb20gXCIuLi90eXBlcy9hcGlcIjtcblxuXG5jb25zdCBtYWtlUmVxdWVzdCA9IGFzeW5jIDxUPihcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zXG4pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcblxuICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBhcGlEYXRhOiBUID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaURhdGEsXG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgY29uc3QgYXBpRGF0YTogQXBpUmVzcG9uc2U8VD4gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBjb25zdCBkYXRhOiBBcGlSZXNwb25zZTxUPiA9IHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgdGl0bGU6IGFwaURhdGEudGl0bGUsXG4gICAgfTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY29uc3QgYXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlPFQ+ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gIHJldHVybiBhcGlSZXNwb25zZTtcbn07O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBhcGkge1xuICBzdGF0aWMgYXN5bmMgZmlsdGVyPFQsIFRGaWx0ZXI+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIHBvc3RNb2RlbDogUG9zdE1vZGVsPFRGaWx0ZXI+XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8TGlzdFJlc3BvbnNlPFQ+Pj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcblxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyAuLi5wb3N0TW9kZWwsIC4uLnBvc3RNb2RlbC5maWx0ZXJNb2RlbCB9KSxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8TGlzdFJlc3BvbnNlPFQ+Pih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBwb3N0PFQ+KHVybDogc3RyaW5nLCBib2R5OiBKc29uT2JqZWN0ID0ge30pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIH07XG5cbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldDxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZTxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHB1dDxUPih1cmw6IHN0cmluZywgYm9keTogSnNvbk9iamVjdCA9IHt9KTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgIH07XG5cbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGZldGNoKHVybDogc3RyaW5nLCBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoKHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB0ZW1wRmV0Y2g8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogXCJHRVRcIiB9XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHVwbG9hZDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBmb3JtRGF0YTogRm9ybURhdGFcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIH07XG5cbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL0FwaVJlc3BvbnNlXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZXNwb25zZSwgUG9zdE1vZGVsIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zLCBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL3R5cGVzL2FwaVwiO1xuXG5cbmNvbnN0IG1ha2VSZXF1ZXN0ID0gYXN5bmMgPFQ+KFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnNcbik6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+ID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpO1xuXG4gIGlmIChyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IGFwaURhdGE6IFQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXBpRGF0YSxcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIH07XG4gIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICBjb25zdCBhcGlEYXRhOiBBcGlSZXNwb25zZTxUPiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGNvbnN0IGRhdGE6IEFwaVJlc3BvbnNlPFQ+ID0ge1xuICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICB0aXRsZTogYXBpRGF0YS50aXRsZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdCBhcGlSZXNwb25zZTogQXBpUmVzcG9uc2U8VD4gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgcmV0dXJuIGFwaVJlc3BvbnNlO1xufTs7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGFwaTIge1xuICBzdGF0aWMgYXN5bmMgZmlsdGVyPFQsIFRGaWx0ZXI+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIHBvc3RNb2RlbDogUG9zdE1vZGVsPFRGaWx0ZXI+XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8TGlzdFJlc3BvbnNlPFQ+Pj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwic2VydmljZVRva2VuXCIpfWAsXG4gICAgICB9LFxuXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IC4uLnBvc3RNb2RlbCwgLi4ucG9zdE1vZGVsLmZpbHRlck1vZGVsIH0pLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxMaXN0UmVzcG9uc2U8VD4+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHk6IEpzb25PYmplY3QgPSB7fSk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXQ8VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZTxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogXCJERUxFVEVcIixcbiAgICB9O1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcHV0PFQ+KHVybDogc3RyaW5nLCBib2R5OiBKc29uT2JqZWN0ID0ge30pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgYWx0ZXJlZE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgIG1ldGhvZDogXCJQVVRcIixcbiAgICB9O1xuXG4gICAgY29uc3QgYXBpUmVzcG9uc2UgPSBhd2FpdCBtYWtlUmVxdWVzdDxUPih1cmwsIGFsdGVyZWRPcHRpb25zKTtcblxuICAgIHJldHVybiBhcGlSZXNwb25zZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBmZXRjaCh1cmw6IHN0cmluZywgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcInNlcnZpY2VUb2tlblwiKX1gLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoKHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyB0ZW1wRmV0Y2g8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogXCJHRVRcIiB9XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBhbHRlcmVkT3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgICBjb25zdCBhcGlSZXNwb25zZSA9IGF3YWl0IG1ha2VSZXF1ZXN0PFQ+KHVybCwgYWx0ZXJlZE9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGFwaVJlc3BvbnNlO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHVwbG9hZDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBmb3JtRGF0YTogRm9ybURhdGFcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IGFsdGVyZWRPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Nlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJzZXJ2aWNlVG9rZW5cIil9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgfTtcblxuICAgIGNvbnN0IGFwaVJlc3BvbnNlID0gYXdhaXQgbWFrZVJlcXVlc3Q8VD4odXJsLCBhbHRlcmVkT3B0aW9ucyk7XG5cbiAgICByZXR1cm4gYXBpUmVzcG9uc2U7XG4gIH1cbn1cbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBuZXN0ZWQgb2JqZWN0IChub3QgbnVsbCBhbmQgbm90IGFuIGFycmF5KS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5lc3RlZCBvYmplY3RcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaXNOZXN0ZWQgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IFxuICB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIG9iaiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5XG4gKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IGlzQXJyYXkgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIHVua25vd25bXSA9PiBBcnJheS5pc0FycmF5KG9iaik7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgYW4gb2JqZWN0IGludG8gYSBmbGF0IHN0cnVjdHVyZSB3aXRoIGRvdC1ub3RhdGlvbiBrZXlzLlxuICpcbiAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiB0YWtlcyBhIG5lc3RlZCBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBmbGF0IG9iamVjdFxuICogd2hlcmUgbmVzdGVkIHByb3BlcnRpZXMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGRvdCBub3RhdGlvbi4gSXQgaGFuZGxlcyBib3RoXG4gKiBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzLCBwcmVzZXJ2aW5nIGFsbCBsZXZlbHMgb2YgdGhlIG9yaWdpbmFsIHN0cnVjdHVyZVxuICogYXMgc2VwYXJhdGUga2V5cyBpbiB0aGUgcmVzdWx0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyBvYmplY3QgZmxhdHRlbmluZzpcbiAqIGBgYHRzeFxuICogY29uc3QgbmVzdGVkID0ge1xuICogICB1c2VyOiB7XG4gKiAgICAgbmFtZTogJ0pvaG4nLFxuICogICAgIGFkZHJlc3M6IHtcbiAqICAgICAgIGNpdHk6ICdOZXcgWW9yaycsXG4gKiAgICAgICB6aXA6ICcxMDAwMSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH07XG4gKlxuICogY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbk9iamVjdEtleXMobmVzdGVkKTtcbiAqIC8vIFJlc3VsdDpcbiAqIC8vIHtcbiAqIC8vICAgJ3VzZXInOiB7IG5hbWU6ICdKb2huJywgYWRkcmVzczogeyBjaXR5OiAnTmV3IFlvcmsnLCB6aXA6ICcxMDAwMScgfSB9LFxuICogLy8gICAndXNlci5uYW1lJzogJ0pvaG4nLFxuICogLy8gICAndXNlci5hZGRyZXNzJzogeyBjaXR5OiAnTmV3IFlvcmsnLCB6aXA6ICcxMDAwMScgfSxcbiAqIC8vICAgJ3VzZXIuYWRkcmVzcy5jaXR5JzogJ05ldyBZb3JrJyxcbiAqIC8vICAgJ3VzZXIuYWRkcmVzcy56aXAnOiAnMTAwMDEnXG4gKiAvLyB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQXJyYXkgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHdpdGhBcnJheXMgPSB7XG4gKiAgIGl0ZW1zOiBbXG4gKiAgICAgeyBpZDogMSwgbmFtZTogJ0l0ZW0gMScgfSxcbiAqICAgICB7IGlkOiAyLCBuYW1lOiAnSXRlbSAyJyB9XG4gKiAgIF1cbiAqIH07XG4gKlxuICogY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbk9iamVjdEtleXMod2l0aEFycmF5cyk7XG4gKiAvLyBSZXN1bHQgaW5jbHVkZXM6XG4gKiAvLyB7XG4gKiAvLyAgICdpdGVtcyc6IFsuLi5dLFxuICogLy8gICAnaXRlbXMuMCc6IHsgaWQ6IDEsIG5hbWU6ICdJdGVtIDEnIH0sXG4gKiAvLyAgICdpdGVtcy4wLmlkJzogMSxcbiAqIC8vICAgJ2l0ZW1zLjAubmFtZSc6ICdJdGVtIDEnLFxuICogLy8gICAnaXRlbXMuMSc6IHsgaWQ6IDIsIG5hbWU6ICdJdGVtIDInIH0sXG4gKiAvLyAgICdpdGVtcy4xLmlkJzogMixcbiAqIC8vICAgJ2l0ZW1zLjEubmFtZSc6ICdJdGVtIDInXG4gKiAvLyB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBmbGF0dGVuXG4gKiBAcGFyYW0gcHJlZml4IC0gSW50ZXJuYWwgcGFyYW1ldGVyIGZvciBidWlsZGluZyBrZXkgcGF0aHMgKHVzZWQgaW4gcmVjdXJzaW9uKVxuICogQHJldHVybnMgQSBmbGF0IG9iamVjdCB3aXRoIGRvdC1ub3RhdGlvbiBrZXlzIHJlcHJlc2VudGluZyB0aGUgb3JpZ2luYWwgc3RydWN0dXJlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZmxhdHRlbk9iamVjdEtleXMgPSAob2JqOiB1bmtub3duLCBwcmVmaXggPSBcIlwiKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBpZiAoIWlzTmVzdGVkKG9iaikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW3ByZWZpeF06IG9iaixcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRQcmVmaXggPSBwcmVmaXgubGVuZ3RoID8gYCR7cHJlZml4fS5gIDogXCJcIjtcblxuICAgIGlmIChpc05lc3RlZChvYmpba2V5XSkgJiYgT2JqZWN0LmtleXMob2JqW2tleV0pLmxlbmd0aCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tleV0pICYmIG9ialtrZXldLmxlbmd0aCkge1xuICAgICAgICBvYmpba2V5XS5mb3JFYWNoKChpdGVtLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIGFjYyxcbiAgICAgICAgICAgIGZsYXR0ZW5PYmplY3RLZXlzKGl0ZW0sIGAke2N1cnJlbnRQcmVmaXggKyBrZXl9LiR7aW5kZXh9YClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWNjLCBmbGF0dGVuT2JqZWN0S2V5cyhvYmpba2V5XSwgY3VycmVudFByZWZpeCArIGtleSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVuIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0LCBpdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIGtleSBhcyB3ZWxsXG4gICAgICBhY2NbY3VycmVudFByZWZpeCArIGtleV0gPSBvYmpba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2N1cnJlbnRQcmVmaXggKyBrZXldID0gb2JqW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xufTtcbiIsImltcG9ydCB0eXBlIHsgUGlja2VyVmFsaWREYXRlIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB0eXBlIHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFsc1wiO1xuaW1wb3J0IHR5cGUgeyBEYXlqcyB9IGZyb20gXCJkYXlqc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmU8VERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGU+KFxuICBhZGFwdGVyOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VMb2NhbGl6YXRpb25Db250ZXh0PixcbiAgdmFsdWU6IFREYXRlXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIWFkYXB0ZXIudXRpbHMuaXNWYWxpZCh2YWx1ZSBhcyB1bmtub3duIGFzIERheWpzKVxuICAgID8gbnVsbFxuICAgIDogYWRhcHRlci51dGlscy5nZXRUaW1lem9uZSh2YWx1ZSBhcyB1bmtub3duIGFzIERheWpzKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIFBhdGgsIFVzZUZvcm1TZXRFcnJvciB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgZmxhdHRlbk9iamVjdEtleXMgfSBmcm9tIFwiLi9mbGF0dGVuT2JqZWN0S2V5c1wiO1xuXG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tIFwiQC90eXBlc1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGhhbmRsZVNlcnZlckVycm9ycyBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmludGVyZmFjZSBIYW5kbGVTZXJ2ZXJFcnJvcnNUeXBlPFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXM+IHtcbiAgLyoqXG4gICAqIFNlcnZlciB2YWxpZGF0aW9uIGVycm9ycyBvYmplY3QgY29udGFpbmluZyBmaWVsZC1zcGVjaWZpYyBlcnJvciBtZXNzYWdlc1xuICAgKiBAZXhhbXBsZSB7IGVtYWlsOiAnRW1haWwgaXMgYWxyZWFkeSB0YWtlbicsIHBhc3N3b3JkOiBbJ1RvbyBzaG9ydCcsICdNdXN0IGNvbnRhaW4gbnVtYmVycyddIH1cbiAgICovXG4gIGVycm9ycz86IFZhbGlkYXRpb25FcnJvcnM7XG4gIC8qKlxuICAgKiBUaGUgc2V0RXJyb3IgZnVuY3Rpb24gZnJvbSByZWFjdC1ob29rLWZvcm0gZm9yIHNldHRpbmcgZmllbGQgZXJyb3JzXG4gICAqL1xuICBzZXRFcnJvcjogVXNlRm9ybVNldEVycm9yPFRGaWVsZFZhbHVlcz47XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHNlcnZlciB2YWxpZGF0aW9uIGVycm9ycyBhbmQgYXBwbGllcyB0aGVtIHRvIHJlYWN0LWhvb2stZm9ybSBmaWVsZHMuXG4gKlxuICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIHRha2VzIHZhbGlkYXRpb24gZXJyb3JzIGZyb20gYSBzZXJ2ZXIgcmVzcG9uc2UgYW5kIGF1dG9tYXRpY2FsbHlcbiAqIGFwcGxpZXMgdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyBmb3JtIGZpZWxkcyB1c2luZyByZWFjdC1ob29rLWZvcm0ncyBzZXRFcnJvciBmdW5jdGlvbi5cbiAqIEl0IHN1cHBvcnRzIHZhcmlvdXMgZXJyb3IgZm9ybWF0cyBpbmNsdWRpbmcgc3RyaW5ncywgYXJyYXlzIG9mIHN0cmluZ3MsIGFuZCBib29sZWFuIGZsYWdzLlxuICpcbiAqIFRoZSBmdW5jdGlvbiB1c2VzIG9iamVjdCBmbGF0dGVuaW5nIHRvIGhhbmRsZSBuZXN0ZWQgZXJyb3Igc3RydWN0dXJlcyBhbmQgZW5zdXJlc1xuICogdGhhdCBvbmx5IHZhbGlkIGZpZWxkIHBhdGhzIGFyZSBwcm9jZXNzZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc2VydmVyIHJlc3BvbnNlOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHNldEVycm9yIH0gPSB1c2VGb3JtKCk7XG4gKlxuICogdHJ5IHtcbiAqICAgYXdhaXQgc3VibWl0Rm9ybShkYXRhKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGhhbmRsZVNlcnZlckVycm9ycyh7XG4gKiAgICAgZXJyb3JzOiBlcnJvci5yZXNwb25zZS5kYXRhLmVycm9ycyxcbiAqICAgICBzZXRFcnJvclxuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGRpZmZlcmVudCBlcnJvciBmb3JtYXRzOlxuICogYGBgdHN4XG4gKiBjb25zdCBzZXJ2ZXJFcnJvcnMgPSB7XG4gKiAgIGVtYWlsOiAnRW1haWwgaXMgYWxyZWFkeSB0YWtlbicsXG4gKiAgIHBhc3N3b3JkOiBbJ1RvbyBzaG9ydCcsICdNdXN0IGNvbnRhaW4gbnVtYmVycyddLFxuICogICB0ZXJtczogdHJ1ZSAvLyBCb29sZWFuIGZsYWcgaW5kaWNhdGluZyBpbnZhbGlkXG4gKiB9O1xuICpcbiAqIGhhbmRsZVNlcnZlckVycm9ycyh7IGVycm9yczogc2VydmVyRXJyb3JzLCBzZXRFcnJvciB9KTtcbiAqIC8vIFJlc3VsdHMgaW46XG4gKiAvLyAtIGVtYWlsIGZpZWxkIHNob3dzOiBcIkVtYWlsIGlzIGFscmVhZHkgdGFrZW5cIlxuICogLy8gLSBwYXNzd29yZCBmaWVsZCBzaG93czogXCJUb28gc2hvcnQgTXVzdCBjb250YWluIG51bWJlcnNcIlxuICogLy8gLSB0ZXJtcyBmaWVsZCBzaG93czogXCJGaWVsZCBpcyBub3QgdmFsaWQuXCJcbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICpcbiAqIEBwYXJhbSBhcmdzIC0gQ29uZmlndXJhdGlvbiBvYmplY3QgY29udGFpbmluZyBlcnJvcnMgYW5kIHNldEVycm9yIGZ1bmN0aW9uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaGFuZGxlU2VydmVyRXJyb3JzID0gZnVuY3Rpb24gaGFuZGxlU2VydmVyRXJyb3JzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzXG4+KGFyZ3M6IEhhbmRsZVNlcnZlckVycm9yc1R5cGU8VEZpZWxkVmFsdWVzPikge1xuICBjb25zdCB7IGVycm9ycywgc2V0RXJyb3IgfSA9IGFyZ3M7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gZXJyb3JzKSB7XG4gICAgY29uc3QgaXNLZXlJblZhcmlhYmxlcyA9IE9iamVjdC5rZXlzKGZsYXR0ZW5PYmplY3RLZXlzKGVycm9ycykpLmluY2x1ZGVzKFxuICAgICAga2V5XG4gICAgKTtcblxuICAgIGlmICghaXNLZXlJblZhcmlhYmxlcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRFcnJvciA9IGVycm9yc1trZXldO1xuXG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IFwiXCI7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZEVycm9yKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gZmllbGRFcnJvci5qb2luKFwiIFwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpZWxkRXJyb3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IGZpZWxkRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWVsZEVycm9yID09PSBcImJvb2xlYW5cIiAmJiBmaWVsZEVycm9yKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBcIkZpZWxkIGlzIG5vdCB2YWxpZC5cIjtcbiAgICB9XG5cbiAgICBzZXRFcnJvcihrZXkgYXMgUGF0aDxURmllbGRWYWx1ZXM+LCB7XG4gICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgfSk7XG4gIH1cbn07XG4iLCIvKipcbiAqIFR5cGUtc2FmZSBwcm9wZXJ0eSBleGlzdGVuY2UgY2hlY2tlciB0aGF0IGFjdHMgYXMgYSB0eXBlIGd1YXJkLlxuICpcbiAqIENoZWNrcyBpZiBhIGdpdmVuIHByb3BlcnR5IGV4aXN0cyBvbiBhbiBvYmplY3QgYW5kIG5hcnJvd3MgdGhlIFR5cGVTY3JpcHQgdHlwZVxuICogdG8gaW5jbHVkZSB0aGF0IHByb3BlcnR5LiBUaGlzIGlzIHVzZWZ1bCBmb3Igc2FmZWx5IGFjY2Vzc2luZyBwcm9wZXJ0aWVzIG9uXG4gKiBvYmplY3RzIG9mIHVua25vd24gc3RydWN0dXJlIHdoaWxlIG1haW50YWluaW5nIHR5cGUgc2FmZXR5LlxuICpcbiAqIEB0ZW1wbGF0ZSBYIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyBjaGVja2VkXG4gKiBAdGVtcGxhdGUgWSAtIFRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eSBrZXkgKGV4dGVuZHMgUHJvcGVydHlLZXkpXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIHByb3AgLSBUaGUgcHJvcGVydHkga2V5IHRvIGNoZWNrIGZvciBleGlzdGVuY2VcbiAqXG4gKiBAcmV0dXJucyBBIHR5cGUgcHJlZGljYXRlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSBvYmplY3QuXG4gKiAgICAgICAgICBJZiB0cnVlLCB0aGUgb2JqZWN0IHR5cGUgaXMgbmFycm93ZWQgdG8gaW5jbHVkZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkYXRhOiB1bmtub3duID0geyBuYW1lOiBcIkpvaG5cIiwgYWdlOiAzMCB9O1xuICpcbiAqIGlmIChwcm9wZXJ0eUV4aXN0cyhkYXRhLCBcIm5hbWVcIikpIHtcbiAqICAgLy8gVHlwZVNjcmlwdCBub3cga25vd3MgZGF0YSBoYXMgYSAnbmFtZScgcHJvcGVydHlcbiAqICAgY29uc29sZS5sb2coZGF0YS5uYW1lKTsgLy8gVHlwZS1zYWZlIGFjY2Vzc1xuICogfVxuICpcbiAqIC8vIENoZWNrIGZvciBuZXN0ZWQgcHJvcGVydHkgZXhpc3RlbmNlXG4gKiBpZiAocHJvcGVydHlFeGlzdHMob2JqLCBcInVzZXJcIikgJiYgcHJvcGVydHlFeGlzdHMob2JqLnVzZXIsIFwiaWRcIikpIHtcbiAqICAgY29uc29sZS5sb2cob2JqLnVzZXIuaWQpOyAvLyBTYWZlIG5lc3RlZCBhY2Nlc3NcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAyLjE4LjQ1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eUV4aXN0czxYLCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICAgIG9iajogWCxcbiAgICBwcm9wOiBZXG4pOiBvYmogaXMgWCAmIFJlY29yZDxZLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBvYmogIT09IG51bGwgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcClcbiAgICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVmFsdWVBc0RhdGU8VERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGU+KFxuICBhZGFwdGVyOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VMb2NhbGl6YXRpb25Db250ZXh0PixcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwgfCBURGF0ZVxuKTogVERhdGUgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkYXB0ZXIudXRpbHMuZGF0ZSh2YWx1ZSkgYXMgVERhdGU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG4iLCJleHBvcnQgY29uc3QgcmVtb3ZlTGVhZGluZ1RyYWlsaW5nU2xhc2hlcyA9IChyb3V0ZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiByb3V0ZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIik7XG59O1xuIiwiaW1wb3J0IGRheWpzIGZyb20gXCJkYXlqc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IHNjaGVtYVRvb2xzID0ge1xuICAvLyBEYXRlIHZhbGlkYXRpb25zXG4gIGRhdGU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZVxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJhbnNmb3JtKChjKSA9PiAoYyA9PT0gXCJudWxsXCIgfHwgYyA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBjKSlcbiAgICAgIC5yZWZpbmUoKGMpID0+ICEhYywgeyBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiRGF0ZSBpcyByZXF1aXJlZFwiIH0pXG4gICAgICAucmVmaW5lKChjKSA9PiAoYyA/IGRheWpzKGMpLmlzVmFsaWQoKSA6IHRydWUpLCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgXCJJbnZhbGlkIGRhdGVcIixcbiAgICAgIH0pLFxuXG4gIG51bGxhYmxlRGF0ZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlXG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmFuc2Zvcm0oKGMpID0+IChjID09PSBcIm51bGxcIiA/IG51bGwgOiBjKSlcbiAgICAgIC50cmFuc2Zvcm0oKGMpID0+IChjID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IGMpKVxuICAgICAgLnJlZmluZSgoYykgPT4gKCFjICYmIGMgIT09IG51bGwgPyBkYXlqcyhjKS5pc1ZhbGlkKCkgOiB0cnVlKSwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiSW52YWxpZCBkYXRlXCIsXG4gICAgICB9KSxcblxuICBkYXRlUmFuZ2U6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6Lm9iamVjdCh7XG4gICAgICBzdGFydDogei5jb2VyY2UuZGF0ZSgpLFxuICAgICAgZW5kOiB6LmNvZXJjZS5kYXRlKCksXG4gICAgfSkucmVmaW5lKChkYXRhKSA9PiBkYXRhLnN0YXJ0IDw9IGRhdGEuZW5kLCB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiU3RhcnQgZGF0ZSBtdXN0IGJlIGJlZm9yZSBvciBlcXVhbCB0byBlbmQgZGF0ZVwiLFxuICAgIH0pLFxuXG4gIC8vIFN0cmluZyB2YWxpZGF0aW9uc1xuICByZXF1aXJlZFN0cmluZzogKHsgbWVzc2FnZSwgbWluLCBtYXggfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtaW4/OiBudW1iZXI7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKVxuICAgICAgLnRyaW0oKVxuICAgICAgLm1pbihtaW4gfHwgMSwgbWVzc2FnZSB8fCBgU3RyaW5nIG11c3QgYmUgYXQgbGVhc3QgJHttaW4gfHwgMX0gY2hhcmFjdGVyc2ApXG4gICAgICAubWF4KG1heCB8fCAyNTUsIG1lc3NhZ2UgfHwgYFN0cmluZyBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgMjU1fSBjaGFyYWN0ZXJzYCksXG5cbiAgZW1haWw6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpXG4gICAgICAuZW1haWwobWVzc2FnZSB8fCBcIkludmFsaWQgZW1haWwgYWRkcmVzc1wiKVxuICAgICAgLm1heCgyNTQsIFwiRW1haWwgbXVzdCBiZSBhdCBtb3N0IDI1NCBjaGFyYWN0ZXJzXCIpLFxuXG4gIHVybDogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKClcbiAgICAgIC51cmwobWVzc2FnZSB8fCBcIkludmFsaWQgVVJMIGZvcm1hdFwiKSxcblxuICBwaG9uZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKClcbiAgICAgIC5yZWdleCgvXltcXCtdP1sxLTldW1xcZF17MCwxNX0kLywgbWVzc2FnZSB8fCBcIkludmFsaWQgcGhvbmUgbnVtYmVyIGZvcm1hdFwiKSxcblxuICBhbHBoYW51bWVyaWM6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpXG4gICAgICAucmVnZXgoL15bYS16QS1aMC05XSskLywgbWVzc2FnZSB8fCBcIk9ubHkgbGV0dGVycyBhbmQgbnVtYmVycyBhcmUgYWxsb3dlZFwiKSxcblxuICBzbHVnOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KC9eW2EtejAtOV0rKD86LVthLXowLTldKykqJC8sIG1lc3NhZ2UgfHwgXCJJbnZhbGlkIHNsdWcgZm9ybWF0XCIpLFxuXG4gIC8vIE51bWJlciB2YWxpZGF0aW9uc1xuICBwb3NpdGl2ZU51bWJlcjogKHsgbWVzc2FnZSwgbWluLCBtYXggfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtaW4/OiBudW1iZXI7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgei5udW1iZXIoKVxuICAgICAgLnBvc2l0aXZlKG1lc3NhZ2UgfHwgXCJOdW1iZXIgbXVzdCBiZSBwb3NpdGl2ZVwiKVxuICAgICAgLm1pbihtaW4gfHwgMC4wMSwgYE51bWJlciBtdXN0IGJlIGF0IGxlYXN0ICR7bWluIHx8IDAuMDF9YClcbiAgICAgIC5tYXgobWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBgTnVtYmVyIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gKSxcblxuICBub25OZWdhdGl2ZU51bWJlcjogKHsgbWVzc2FnZSwgbWF4IH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWF4PzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6Lm51bWJlcigpXG4gICAgICAubWluKDAsIG1lc3NhZ2UgfHwgXCJOdW1iZXIgbXVzdCBiZSBub24tbmVnYXRpdmVcIilcbiAgICAgIC5tYXgobWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBgTnVtYmVyIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gKSxcblxuICBpbnRlZ2VyOiAoeyBtZXNzYWdlLCBtaW4sIG1heCB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6Lm51bWJlcigpXG4gICAgICAuaW50KG1lc3NhZ2UgfHwgXCJNdXN0IGJlIGFuIGludGVnZXJcIilcbiAgICAgIC5taW4obWluIHx8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLCBgTnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgJHttaW4gfHwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJ9YClcbiAgICAgIC5tYXgobWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBgTnVtYmVyIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gKSxcblxuICBwZXJjZW50YWdlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5udW1iZXIoKVxuICAgICAgLm1pbigwLCBtZXNzYWdlIHx8IFwiUGVyY2VudGFnZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwXCIpXG4gICAgICAubWF4KDEwMCwgbWVzc2FnZSB8fCBcIlBlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMFwiKSxcblxuICAvLyBBcnJheSB2YWxpZGF0aW9uc1xuICBub25FbXB0eUFycmF5OiA8VD4oc2NoZW1hOiB6LlpvZFNjaGVtYTxUPiwgeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5hcnJheShzY2hlbWEpXG4gICAgICAubWluKDEsIG1lc3NhZ2UgfHwgXCJBdCBsZWFzdCBvbmUgaXRlbSBpcyByZXF1aXJlZFwiKSxcblxuICB1bmlxdWVBcnJheTogPFQ+KHNjaGVtYTogei5ab2RTY2hlbWE8VD4sIHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouYXJyYXkoc2NoZW1hKVxuICAgICAgLnJlZmluZSgoaXRlbXMpID0+IG5ldyBTZXQoaXRlbXMpLnNpemUgPT09IGl0ZW1zLmxlbmd0aCwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiQWxsIGl0ZW1zIG11c3QgYmUgdW5pcXVlXCIsXG4gICAgICB9KSxcblxuICAvLyBCb29sZWFuIHZhbGlkYXRpb25zXG4gIHJlcXVpcmVkQm9vbGVhbjogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouYm9vbGVhbih7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxuICAgIH0pLFxuXG4gIC8vIE9iamVjdCB2YWxpZGF0aW9uc1xuICBub25FbXB0eU9iamVjdDogPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oc2NoZW1hOiB6LlpvZFNjaGVtYTxUPiwgeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgc2NoZW1hLnJlZmluZSgob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA+IDAsIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgXCJPYmplY3QgY2Fubm90IGJlIGVtcHR5XCIsXG4gICAgfSksXG5cbiAgLy8gRmlsZSB2YWxpZGF0aW9uc1xuICBmaWxlU2l6ZTogKHsgbWF4U2l6ZSwgbWVzc2FnZSB9OiB7IG1heFNpemU6IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9KSA9PlxuICAgIHouaW5zdGFuY2VvZihGaWxlKVxuICAgICAgLnJlZmluZSgoZmlsZSkgPT4gZmlsZS5zaXplIDw9IG1heFNpemUsIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCBgRmlsZSBzaXplIG11c3QgYmUgbGVzcyB0aGFuICR7TWF0aC5yb3VuZChtYXhTaXplIC8gMTAyNCAvIDEwMjQpfU1CYCxcbiAgICAgIH0pLFxuXG4gIGZpbGVUeXBlOiAoeyBhbGxvd2VkVHlwZXMsIG1lc3NhZ2UgfTogeyBhbGxvd2VkVHlwZXM6IHN0cmluZ1tdOyBtZXNzYWdlPzogc3RyaW5nIH0pID0+XG4gICAgei5pbnN0YW5jZW9mKEZpbGUpXG4gICAgICAucmVmaW5lKChmaWxlKSA9PiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IGBGaWxlIHR5cGUgbXVzdCBiZSBvbmUgb2Y6ICR7YWxsb3dlZFR5cGVzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgfSksXG5cbiAgLy8gQ3VzdG9tIHZhbGlkYXRvcnNcbiAgY29uZGl0aW9uYWw6IDxULCBVPihcbiAgICBjb25kaXRpb246IChkYXRhOiBUKSA9PiBib29sZWFuLFxuICAgIHRydWVTY2hlbWE6IHouWm9kU2NoZW1hPFU+LFxuICAgIGZhbHNlU2NoZW1hOiB6LlpvZFNjaGVtYTxVPlxuICApID0+XG4gICAgei51bmlvbihbdHJ1ZVNjaGVtYSwgZmFsc2VTY2hlbWFdKVxuICAgICAgLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICAgICAgY29uc3Qgc2hvdWxkVXNlVHJ1ZSA9IGNvbmRpdGlvbihkYXRhIGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHNob3VsZFVzZVRydWUgPyB0cnVlU2NoZW1hIDogZmFsc2VTY2hlbWE7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5zYWZlUGFyc2UoZGF0YSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICAgIGNvZGU6IHouWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdC5lcnJvci5tZXNzYWdlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSxcblxuICB0cmFuc2Zvcm06IHtcbiAgICB0b0xvd2VyQ2FzZTogei5zdHJpbmcoKS50cmFuc2Zvcm0oKHZhbCkgPT4gdmFsLnRvTG93ZXJDYXNlKCkpLFxuICAgIHRvVXBwZXJDYXNlOiB6LnN0cmluZygpLnRyYW5zZm9ybSgodmFsKSA9PiB2YWwudG9VcHBlckNhc2UoKSksXG4gICAgdHJpbTogei5zdHJpbmcoKS50cmFuc2Zvcm0oKHZhbCkgPT4gdmFsLnRyaW0oKSksXG4gICAgdG9OdW1iZXI6IHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwpID0+IE51bWJlcih2YWwpKSxcbiAgICB0b0Jvb2xlYW46IHouc3RyaW5nKCkudHJhbnNmb3JtKCh2YWwpID0+IHZhbCA9PT0gXCJ0cnVlXCIpLFxuICAgIHBhcnNlSnNvbjogPFQ+KHNjaGVtYTogei5ab2RTY2hlbWE8VD4pID0+IFxuICAgICAgei5zdHJpbmcoKS50cmFuc2Zvcm0oKHZhbCwgY3R4KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWwpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5zYWZlUGFyc2UocGFyc2VkKTtcblxuICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgICAgICAgIFxuICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICBjb2RlOiB6LlpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQuZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgICAgY29kZTogei5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICAgICAgbWVzc2FnZTogXCJJbnZhbGlkIEpTT05cIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgfSxcbn07XG4iLCJpbXBvcnQgdHlwZSB7XG4gIFBhdGgsXG4gIENvbnRyb2wsXG4gIFBhdGhWYWx1ZSxcbiAgRmllbGRWYWx1ZXMsXG4gIERlZXBQYXJ0aWFsU2tpcEFycmF5S2V5LFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQgeyB1c2VXYXRjaCB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBDb3JlIHdhdGNoIGZ1bmN0aW9ucyBmb3IgUmVhY3QgSG9vayBGb3JtXG4gKiBUaGVzZSBhcmUgdGhlIHByaW1hcnkgYnVpbGRpbmcgYmxvY2tzIGZvciBmb3JtIHdhdGNoaW5nXG4gKi9cblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgdG8gZW5zdXJlIGFycmF5IGVsZW1lbnRzIGFyZSBhbGwgUGF0aDxUPlxuICovXG5leHBvcnQgdHlwZSBQYXRoQXJyYXk8VCBleHRlbmRzIEZpZWxkVmFsdWVzPiA9IFJlYWRvbmx5QXJyYXk8UGF0aDxUPj47XG5cbi8qKlxuICogSG9vayB0byB3YXRjaCBlbnRpcmUgZm9ybSAtIHJldHVybnMgYWxsIGZvcm0gdmFsdWVzXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaEZvcm0gPSA8VEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXM+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz5cbik6IERlZXBQYXJ0aWFsU2tpcEFycmF5S2V5PFRGaWVsZFZhbHVlcz4gPT4gdXNlV2F0Y2goeyBjb250cm9sIH0pO1xuXG4vKipcbiAqIEhvb2sgdG8gd2F0Y2ggc2luZ2xlIGZpZWxkIGJ5IHBhdGggLSBzdXBwb3J0cyBhbnkgbmVzdGVkIHBhdGhcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVdhdGNoRmllbGQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZVxuKTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+ID0+IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZSB9KTtcblxuLyoqXG4gKiBIb29rIHRvIHdhdGNoIG11bHRpcGxlIGZpZWxkcyBieSBwYXRocyAtIHJldHVybnMgYXJyYXkgb2YgdmFsdWVzXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaEZpZWxkcyA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8UGF0aDxURmllbGRWYWx1ZXM+PlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lczogVE5hbWVzXG4pOiBBcnJheTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZXNbbnVtYmVyXT4+ID0+IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZTogbmFtZXMgfSkgYXMgQXJyYXk8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWVzW251bWJlcl0+PjtcbiIsImltcG9ydCB7IHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGF0aCxcbiAgQ29udHJvbCxcbiAgUGF0aFZhbHVlLFxuICBGaWVsZFZhbHVlcyxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHsgdXNlV2F0Y2ggfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbi8qKlxuICogVXRpbGl0eSB3YXRjaCBmdW5jdGlvbnMgZm9yIFJlYWN0IEhvb2sgRm9ybVxuICogRW5oYW5jZWQgZnVuY3Rpb25hbGl0eSBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzXG4gKi9cblxuLyoqXG4gKiBXYXRjaCBmaWVsZCB3aXRoIHRyYW5zZm9ybWF0aW9uL3NlbGVjdG9yXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaFRyYW5zZm9ybSA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3V0cHV0XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWU6IFROYW1lLFxuICB0cmFuc2Zvcm06ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUT3V0cHV0XG4pOiBUT3V0cHV0ID0+IHtcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XG5cbiAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gdHJhbnNmb3JtKHZhbHVlKSwgW3ZhbHVlLCB0cmFuc2Zvcm1dKTtcbn07XG5cbi8qKlxuICogV2F0Y2ggZmllbGQgd2l0aCBkZWZhdWx0IGZhbGxiYWNrIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaERlZmF1bHQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZSxcbiAgZGVmYXVsdFZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbik6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XG4gIGNvbnN0IHZhbHVlID0gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xuXG4gIHJldHVybiB2YWx1ZSA/PyBkZWZhdWx0VmFsdWU7XG59O1xuXG4vKipcbiAqIFdhdGNoIGZpZWxkIGFzIGJvb2xlYW4gd2l0aCBndWFyYW50ZWVkIGJvb2xlYW4gcmV0dXJuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaEJvb2xlYW4gPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZSxcbiAgZGVmYXVsdFZhbHVlID0gZmFsc2Vcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB2YWx1ZSA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZSB9KTtcblxuICByZXR1cm4gQm9vbGVhbih2YWx1ZSA/PyBkZWZhdWx0VmFsdWUpO1xufTtcblxuLyoqXG4gKiBXYXRjaCBtdWx0aXBsZSBmaWVsZHMgYW5kIHJldHVybiBhbiBvYmplY3Qgd2l0aCBmaWVsZCBwYXRocyBhcyBrZXlzXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaEJhdGNoID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVEZpZWxkcyBleHRlbmRzIFJlYWRvbmx5QXJyYXk8UGF0aDxURmllbGRWYWx1ZXM+PlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBmaWVsZHM6IFRGaWVsZHNcbik6IHsgW0sgaW4gVEZpZWxkc1tudW1iZXJdXTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgSz4gfSA9PiB7XG4gIGNvbnN0IHZhbHVlcyA9IHVzZVdhdGNoKHsgY29udHJvbCwgbmFtZTogZmllbGRzIH0pO1xuXG4gIHJldHVybiB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyB7IFtLIGluIFRGaWVsZHNbbnVtYmVyXV06IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIEs+IH07XG5cbiAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICByZXN1bHRbZmllbGQgYXMgVEZpZWxkc1tudW1iZXJdXSA9IHZhbHVlc1tpbmRleF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbdmFsdWVzLCBmaWVsZHNdKTtcbn07XG5cbi8qKlxuICogV2F0Y2ggZmllbGQgY29uZGl0aW9uYWxseSBiYXNlZCBvbiBib29sZWFuIGZsYWdcbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVdhdGNoQ29uZGl0aW9uYWwgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgY29udHJvbDogQ29udHJvbDxURmllbGRWYWx1ZXM+LFxuICBuYW1lOiBUTmFtZSxcbiAgc2hvdWxkV2F0Y2g6IGJvb2xlYW4sXG4gIGZhbGxiYWNrPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4pOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBhY3RpdmVWYWx1ZSA9IHVzZVdhdGNoKHtcbiAgICBjb250cm9sLFxuICAgIG5hbWUsXG4gICAgZGlzYWJsZWQ6ICFzaG91bGRXYXRjaFxuICB9KTtcblxuICByZXR1cm4gc2hvdWxkV2F0Y2ggPyBhY3RpdmVWYWx1ZSA6IGZhbGxiYWNrO1xufTtcblxuLyoqXG4gKiBXYXRjaCBmaWVsZCB3aXRoIGRlYm91bmNlZCB1cGRhdGVzXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaERlYm91bmNlZCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgUGF0aDxURmllbGRWYWx1ZXM+XG4+KFxuICBjb250cm9sOiBDb250cm9sPFRGaWVsZFZhbHVlcz4sXG4gIG5hbWU6IFROYW1lLFxuICBkZWxheSA9IDMwMFxuKTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+ID0+IHtcbiAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7IGNvbnRyb2wsIG5hbWUgfSk7XG4gIGNvbnN0IFtkZWJvdW5jZWRWYWx1ZSwgc2V0RGVib3VuY2VkVmFsdWVdID0gdXNlU3RhdGU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+Pih2YWx1ZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc2V0RGVib3VuY2VkVmFsdWUodmFsdWUpO1xuICAgIH0sIGRlbGF5KTtcblxuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9LCBbdmFsdWUsIGRlbGF5XSk7XG5cbiAgcmV0dXJuIGRlYm91bmNlZFZhbHVlO1xufTtcblxuLyoqXG4gKiBXYXRjaCBmaWVsZCB3aXRoIG1lbW9pemVkIHNlbGVjdG9yIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VXYXRjaFNlbGVjdG9yID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPdXRwdXRcbj4oXG4gIGNvbnRyb2w6IENvbnRyb2w8VEZpZWxkVmFsdWVzPixcbiAgbmFtZTogVE5hbWUsXG4gIHNlbGVjdG9yOiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVE91dHB1dCxcbiAgZGVwczogUmVhY3QuRGVwZW5kZW5jeUxpc3QgPSBbXVxuKTogVE91dHB1dCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gdXNlV2F0Y2goeyBjb250cm9sLCBuYW1lIH0pO1xuXG4gIHJldHVybiB1c2VNZW1vKFxuICAgICgpID0+IHNlbGVjdG9yKHZhbHVlKSxcbiAgICBbdmFsdWUsIHNlbGVjdG9yLCAuLi5kZXBzXSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICApO1xufTtcbiIsIi8qKlxuICogRW5oYW5jZWQgVHlwZVNjcmlwdCB1dGlsaXRpZXMgZm9yIFJlYWN0IEhvb2sgRm9ybSdzIHVzZVdhdGNoXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHNldCBvZiB0eXBlLXNhZmUgd2F0Y2ggZnVuY3Rpb25zXG4gKiB3aXRoIGJldHRlciBlcmdvbm9taWNzIGFuZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHVzZVdhdGNoRmllbGQsIHVzZVdhdGNoQm9vbGVhbiwgdHlwZWRXYXRjaCB9IGZyb20gJ3NyYy91dGlscy93YXRjaCc7XG4gKlxuICogLy8gRGlyZWN0IHVzYWdlIChpbnNpZGUgUmVhY3QgY29tcG9uZW50cylcbiAqIGNvbnN0IGVtYWlsID0gdXNlV2F0Y2hGaWVsZChjb250cm9sLCAndXNlci5lbWFpbCcpO1xuICogY29uc3QgaXNBZG1pbiA9IHVzZVdhdGNoQm9vbGVhbihjb250cm9sLCAndXNlci5pc0FkbWluJyk7XG4gKlxuICogLy8gT2JqZWN0LWJhc2VkIHVzYWdlIChpbnNpZGUgUmVhY3QgY29tcG9uZW50cylcbiAqIGNvbnN0IGVtYWlsID0gdHlwZWRXYXRjaC5maWVsZChjb250cm9sLCAndXNlci5lbWFpbCcpO1xuICogY29uc3QgaXNBZG1pbiA9IHR5cGVkV2F0Y2guYm9vbGVhbihjb250cm9sLCAndXNlci5pc0FkbWluJyk7XG4gKiBgYGBcbiAqL1xuXG4vLyBDb3JlIGZ1bmN0aW9uc1xuZXhwb3J0IHsgdXNlV2F0Y2hGb3JtLCB1c2VXYXRjaEZpZWxkLCB1c2VXYXRjaEZpZWxkcyB9IGZyb20gJy4vY29yZSc7XG5cbi8vIFV0aWxpdHkgZnVuY3Rpb25zXG5leHBvcnQge1xuICB1c2VXYXRjaEJhdGNoLFxuICB1c2VXYXRjaERlZmF1bHQsXG4gIHVzZVdhdGNoQm9vbGVhbixcbiAgdXNlV2F0Y2hTZWxlY3RvcixcbiAgdXNlV2F0Y2hUcmFuc2Zvcm0sXG4gIHVzZVdhdGNoRGVib3VuY2VkLFxuICB1c2VXYXRjaENvbmRpdGlvbmFsLFxufSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbmV4cG9ydCB0eXBlIHsgUGF0aEFycmF5IH0gZnJvbSAnLi9jb3JlJztcblxuLy8gSW1wb3J0IGFsbCBmdW5jdGlvbnMgZm9yIGRlZmF1bHQgZXhwb3J0XG5pbXBvcnQgeyB1c2VXYXRjaEZvcm0sIHVzZVdhdGNoRmllbGQsIHVzZVdhdGNoRmllbGRzIH0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB7XG4gIHVzZVdhdGNoQmF0Y2gsXG4gIHVzZVdhdGNoRGVmYXVsdCxcbiAgdXNlV2F0Y2hCb29sZWFuLFxuICB1c2VXYXRjaFNlbGVjdG9yLFxuICB1c2VXYXRjaFRyYW5zZm9ybSxcbiAgdXNlV2F0Y2hEZWJvdW5jZWQsXG4gIHVzZVdhdGNoQ29uZGl0aW9uYWwsXG59IGZyb20gJy4vdXRpbGl0aWVzJztcblxuLyoqXG4gKiBPcmdhbml6ZWQgdXRpbGl0aWVzIGJ5IHVzZSBjYXNlXG4gKiBQcm92aWRlcyBhIGNvbnZlbmllbnQgb2JqZWN0LWJhc2VkIEFQSSBmb3IgYWxsIHdhdGNoIGZ1bmN0aW9uc1xuICovXG5leHBvcnQgY29uc3QgdHlwZWRXYXRjaCA9IHtcbiAgLy8gPT09IENPUkUgRlVOQ1RJT05TID09PVxuICAvKiogV2F0Y2ggZW50aXJlIGZvcm0gKi9cbiAgZm9ybTogdXNlV2F0Y2hGb3JtLFxuICAvKiogV2F0Y2ggc2luZ2xlIGZpZWxkICovXG4gIGZpZWxkOiB1c2VXYXRjaEZpZWxkLFxuICAvKiogV2F0Y2ggbXVsdGlwbGUgZmllbGRzICovXG4gIGZpZWxkczogdXNlV2F0Y2hGaWVsZHMsXG5cbiAgLy8gPT09IFVUSUxJVFkgRlVOQ1RJT05TID09PVxuICAvKiogV2F0Y2ggd2l0aCB0cmFuc2Zvcm1hdGlvbiAqL1xuICB0cmFuc2Zvcm06IHVzZVdhdGNoVHJhbnNmb3JtLFxuICAvKiogV2F0Y2ggd2l0aCBkZWZhdWx0IHZhbHVlICovXG4gIHdpdGhEZWZhdWx0OiB1c2VXYXRjaERlZmF1bHQsXG4gIC8qKiBXYXRjaCBhcyBib29sZWFuICovXG4gIGJvb2xlYW46IHVzZVdhdGNoQm9vbGVhbixcbiAgLyoqIFdhdGNoIG11bHRpcGxlIHdpdGggY3VzdG9tIGtleXMgKi9cbiAgYmF0Y2g6IHVzZVdhdGNoQmF0Y2gsXG4gIC8qKiBXYXRjaCBjb25kaXRpb25hbGx5ICovXG4gIGNvbmRpdGlvbmFsOiB1c2VXYXRjaENvbmRpdGlvbmFsLFxuICAvKiogV2F0Y2ggd2l0aCBkZWJvdW5jaW5nICovXG4gIGRlYm91bmNlZDogdXNlV2F0Y2hEZWJvdW5jZWQsXG4gIC8qKiBXYXRjaCB3aXRoIHNlbGVjdG9yICovXG4gIHNlbGVjdG9yOiB1c2VXYXRjaFNlbGVjdG9yLFxufSBhcyBjb25zdDtcbiIsIi8qKlxuICogVHlwZSBndWFyZCB1dGlsaXRpZXMgZm9yIHJ1bnRpbWUgdHlwZSBjaGVja2luZ1xuICogXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdCAoZXhjbHVkaW5nIGFycmF5cylcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzUmVjb3JkKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICogICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaGFzIGEgc3BlY2lmaWMgcHJvcGVydHlcbiAqIFxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGxvb2sgZm9yXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGhhc1Byb3BlcnR5KG9iaiwgJ25hbWUnKSkge1xuICogICAvLyBvYmogaXMgUmVjb3JkPCduYW1lJywgdW5rbm93bj5cbiAqICAgY29uc29sZS5sb2cob2JqLm5hbWUpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Byb3BlcnR5PEsgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIG9iajogdW5rbm93bixcbiAga2V5OiBLXG4pOiBvYmogaXMgUmVjb3JkPEssIHVua25vd24+IHtcbiAgcmV0dXJuIGlzUmVjb3JkKG9iaikgJiYga2V5IGluIG9iajtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBub24tZW1wdHkgc3RyaW5nXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBub24tZW1wdHkgc3RyaW5nXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNOb25FbXB0eVN0cmluZyh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgc3RyaW5nIHdpdGggbGVuZ3RoID4gMFxuICogICBjb25zb2xlLmxvZyh2YWx1ZS50b1VwcGVyQ2FzZSgpKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vbkVtcHR5U3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBhcnJheVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgdW5rbm93bltdXG4gKiAgIHZhbHVlLmZvckVhY2goaXRlbSA9PiBjb25zb2xlLmxvZyhpdGVtKSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheTxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9uLWVtcHR5IGFycmF5XG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBub24tZW1wdHkgYXJyYXlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc05vbkVtcHR5QXJyYXkoaXRlbXMpKSB7XG4gKiAgIC8vIGl0ZW1zIGlzIFtULCAuLi5UW11dIC0gZ3VhcmFudGVlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50XG4gKiAgIGNvbnN0IGZpcnN0ID0gaXRlbXNbMF07ICAvLyBTYWZlIGFjY2Vzc1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uRW1wdHlBcnJheTxUPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFtULCAuLi5UW11dIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHtcbiAqICAgLy8gY2FsbGJhY2sgaXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93blxuICogICBjYWxsYmFjaygpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyAoLi4uYXJnczogcmVhZG9ubHkgdW5rbm93bltdKSA9PiB1bmtub3duIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmdcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyAoaW5jbHVkaW5nIGVtcHR5IHN0cmluZylcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgc3RyaW5nXG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlLmxlbmd0aCk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBudW1iZXIgKGV4Y2x1ZGluZyBOYU4pXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBudW1iZXJcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc051bWJlcih2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgbnVtYmVyIChub3QgTmFOKVxuICogICBjb25zdCBkb3VibGVkID0gdmFsdWUgKiAyO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBib29sZWFuXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBib29sZWFuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNCb29sZWFuKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBib29sZWFuXG4gKiAgIGNvbnNvbGUubG9nKCF2YWx1ZSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgbnVsbFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIG51bGxcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc051bGwodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIG51bGxcbiAqICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bGwodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBudWxsaXNoXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNOdWxsaXNoKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBudWxsIHwgdW5kZWZpbmVkXG4gKiAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gKiB9XG4gKiBcbiAqIGlmICghaXNOdWxsaXNoKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBOb25OdWxsYWJsZTx0eXBlb2YgdmFsdWU+XG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bGxpc2godmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGRlZmluZWQgKG5vdCBudWxsIG9yIHVuZGVmaW5lZClcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpbHRlcmVkID0gaXRlbXMuZmlsdGVyKGlzRGVmaW5lZCk7XG4gKiAvLyBmaWx0ZXJlZCBoYXMgdHlwZTogTm9uTnVsbGFibGU8VD5bXVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmaW5lZDxUPih2YWx1ZTogVCk6IHZhbHVlIGlzIE5vbk51bGxhYmxlPFQ+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgRGF0ZSBvYmplY3RcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIERhdGVcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIERhdGVcbiAqICAgY29uc29sZS5sb2codmFsdWUudG9JU09TdHJpbmcoKSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0ZSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLmdldFRpbWUoKSk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgUHJvbWlzZVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgUHJvbWlzZVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgUHJvbWlzZTx1bmtub3duPlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWx1ZTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcm9taXNlPHVua25vd24+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAoaXNSZWNvcmQodmFsdWUpICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS50aGVuID09PSAnZnVuY3Rpb24nKVxuICApO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gZXJyb3IgaXMgYW4gRXJyb3IgaW5zdGFuY2VcbiAqIFxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlcnJvciBpcyBhbiBFcnJvciBpbnN0YW5jZVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgLy8gLi4uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogICBpZiAoaXNFcnJvcihlcnJvcikpIHtcbiAqICAgICAvLyBlcnJvciBpcyBFcnJvclxuICogICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgRXJyb3Ige1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgbWF0Y2hlcyBhIHNwZWNpZmljIHR5cGUgdXNpbmcgYSB2YWxpZGF0b3IgZnVuY3Rpb25cbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcGFyYW0gdmFsaWRhdG9yIC0gRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdmFsdWUgbWF0Y2hlcyB0aGUgdHlwZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgdHlwZVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW50ZXJmYWNlIFVzZXIge1xuICogICBpZDogc3RyaW5nO1xuICogICBuYW1lOiBzdHJpbmc7XG4gKiB9XG4gKiBcbiAqIGNvbnN0IGlzVXNlciA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFVzZXIgPT5cbiAqICAgaXNSZWNvcmQodmFsdWUpICYmXG4gKiAgIGhhc1Byb3BlcnR5KHZhbHVlLCAnaWQnKSAmJlxuICogICBoYXNQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnKSAmJlxuICogICBpc1N0cmluZyh2YWx1ZS5pZCkgJiZcbiAqICAgaXNTdHJpbmcodmFsdWUubmFtZSk7XG4gKiBcbiAqIGlmIChpc1VzZXIoZGF0YSkpIHtcbiAqICAgLy8gZGF0YSBpcyBVc2VyXG4gKiAgIGNvbnNvbGUubG9nKGRhdGEubmFtZSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlczxUPihcbiAgdmFsdWU6IHVua25vd24sXG4gIHZhbGlkYXRvcjogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBUXG4pOiB2YWx1ZSBpcyBUIHtcbiAgcmV0dXJuIHZhbGlkYXRvcih2YWx1ZSk7XG59XG4iXX0=