@gnwebsoft/ui 4.0.49 → 4.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,2920 @@
1
+ import {
2
+ useEnhancedTransform,
3
+ useTransform
4
+ } from "./chunk-PW777IOX.js";
5
+ import {
6
+ readValueAsDate
7
+ } from "./chunk-N37HXJT5.js";
8
+
9
+ // src/wrappers/types/common.ts
10
+ function isValidOption(value) {
11
+ return typeof value === "object" && value !== null && "Label" in value && "Value" in value && typeof value.Label === "string" && (typeof value.Value === "string" || typeof value.Value === "number" || typeof value.Value === "boolean");
12
+ }
13
+ function normalizeOptions(options, labelField = "Label", valueField = "Value") {
14
+ return options.map((option) => ({
15
+ Label: String(option[labelField] ?? ""),
16
+ Value: option[valueField],
17
+ disabled: Boolean(option.disabled)
18
+ }));
19
+ }
20
+
21
+ // src/wrappers/AsyncMultiSelect/AsyncMultiSelect.tsx
22
+ import {
23
+ Autocomplete,
24
+ CircularProgress,
25
+ debounce,
26
+ Grid,
27
+ TextField,
28
+ useTheme
29
+ } from "@mui/material";
30
+ import match from "autosuggest-highlight/match";
31
+ import parse from "autosuggest-highlight/parse";
32
+ import {
33
+ useState,
34
+ useRef,
35
+ useMemo,
36
+ useEffect,
37
+ useCallback,
38
+ Fragment
39
+ } from "react";
40
+ import { useController } from "react-hook-form";
41
+ import { jsx, jsxs } from "react/jsx-runtime";
42
+ var Component = function AsyncSelectMultiElement(props) {
43
+ const {
44
+ name,
45
+ disabled,
46
+ control,
47
+ placeholder,
48
+ label,
49
+ queryFn,
50
+ variant,
51
+ labelField = "Label",
52
+ valueField = "Value",
53
+ ...rest
54
+ } = props;
55
+ const {
56
+ field,
57
+ fieldState: { error }
58
+ } = useController({
59
+ name,
60
+ control
61
+ });
62
+ const theme = useTheme();
63
+ const [selectedOptions, setSelectedOptions] = useState([]);
64
+ const [inputValue, setInputValue] = useState("");
65
+ const [options, setOptions] = useState([]);
66
+ const [loading, setLoading] = useState(false);
67
+ const loadedValuesRef = useRef([]);
68
+ const isInitialPopulationActive = useRef(false);
69
+ const lastFetchedSearchTermRef = useRef(null);
70
+ const initialLoadCompleteRef = useRef(false);
71
+ const selectedOptionsRef = useRef([]);
72
+ const getOptionValue = useCallback(
73
+ (option) => option ? String(option[valueField]) : "",
74
+ [valueField]
75
+ );
76
+ const getOptionLabel = useCallback(
77
+ (option) => option ? String(option[labelField]) : "",
78
+ [labelField]
79
+ );
80
+ const fetchData = useMemo(
81
+ () => debounce(
82
+ (payload, callback) => {
83
+ queryFn(payload).then((c) => {
84
+ if (Array.isArray(c)) {
85
+ callback(c);
86
+ } else if (c && Array.isArray(c.data)) {
87
+ callback(
88
+ c.data
89
+ );
90
+ } else if (c && Array.isArray(c.Data)) {
91
+ callback(
92
+ c.Data
93
+ );
94
+ } else {
95
+ callback([]);
96
+ }
97
+ });
98
+ },
99
+ 400
100
+ ),
101
+ [queryFn]
102
+ );
103
+ useEffect(() => {
104
+ selectedOptionsRef.current = selectedOptions;
105
+ }, [selectedOptions]);
106
+ useEffect(() => {
107
+ const formValues = Array.isArray(field.value) ? field.value : [];
108
+ if (initialLoadCompleteRef.current && JSON.stringify(formValues) === JSON.stringify(loadedValuesRef.current)) {
109
+ return;
110
+ }
111
+ if (formValues.length === 0) {
112
+ setSelectedOptions([]);
113
+ setOptions([]);
114
+ loadedValuesRef.current = [];
115
+ lastFetchedSearchTermRef.current = null;
116
+ initialLoadCompleteRef.current = true;
117
+ return;
118
+ }
119
+ let active = true;
120
+ setLoading(true);
121
+ isInitialPopulationActive.current = true;
122
+ loadedValuesRef.current = formValues;
123
+ initialLoadCompleteRef.current = true;
124
+ fetchData({ Query: null, SelectedValue: formValues }, (results) => {
125
+ if (active) {
126
+ const fetchedOptions = results || [];
127
+ setSelectedOptions([...fetchedOptions]);
128
+ setOptions(fetchedOptions);
129
+ }
130
+ setLoading(false);
131
+ isInitialPopulationActive.current = false;
132
+ });
133
+ return () => {
134
+ active = false;
135
+ };
136
+ }, [field.value, fetchData]);
137
+ useEffect(() => {
138
+ if (isInitialPopulationActive.current || !initialLoadCompleteRef.current) {
139
+ return;
140
+ }
141
+ if (!inputValue) {
142
+ if (selectedOptionsRef.current.length === 0) {
143
+ setOptions([]);
144
+ } else {
145
+ setOptions(selectedOptionsRef.current);
146
+ }
147
+ lastFetchedSearchTermRef.current = null;
148
+ return;
149
+ }
150
+ if (inputValue === lastFetchedSearchTermRef.current) {
151
+ return;
152
+ }
153
+ let active = true;
154
+ setLoading(true);
155
+ fetchData({ Query: inputValue, SelectedValue: null }, (searchResults) => {
156
+ if (active) {
157
+ const results = searchResults || [];
158
+ const currentSelected = selectedOptionsRef.current;
159
+ const selectedOptionIds = new Set(
160
+ currentSelected.map((opt) => getOptionValue(opt))
161
+ );
162
+ const combined = [...currentSelected];
163
+ results.forEach((result) => {
164
+ if (!selectedOptionIds.has(getOptionValue(result))) {
165
+ combined.push(result);
166
+ }
167
+ });
168
+ setOptions(combined);
169
+ lastFetchedSearchTermRef.current = inputValue;
170
+ }
171
+ setLoading(false);
172
+ });
173
+ return () => {
174
+ active = false;
175
+ };
176
+ }, [inputValue, fetchData, getOptionValue]);
177
+ const handleChange = (_, newSelectedOptions) => {
178
+ setSelectedOptions(newSelectedOptions);
179
+ const newValues = newSelectedOptions.map((c) => c[valueField]);
180
+ field.onChange(newValues.length === 0 ? null : newValues);
181
+ loadedValuesRef.current = newValues;
182
+ setOptions(newSelectedOptions);
183
+ setInputValue("");
184
+ lastFetchedSearchTermRef.current = null;
185
+ };
186
+ const isDisabled = useMemo(() => {
187
+ return disabled ?? false;
188
+ }, [disabled]);
189
+ return /* @__PURE__ */ jsx(
190
+ Autocomplete,
191
+ {
192
+ multiple: true,
193
+ loading,
194
+ getOptionLabel,
195
+ isOptionEqualToValue: (option, val) => getOptionValue(option) === getOptionValue(val),
196
+ options,
197
+ value: selectedOptions,
198
+ disabled,
199
+ filterSelectedOptions: true,
200
+ filterOptions: (x) => x,
201
+ noOptionsText: "Type Something...",
202
+ onChange: handleChange,
203
+ sx: {
204
+ "&.Mui-disabled": {
205
+ cursor: "not-allowed !important"
206
+ },
207
+ "& .MuiInputBase-root.Mui-disabled": {
208
+ backgroundColor: theme.palette.action.disabledBackground,
209
+ cursor: "not-allowed !important"
210
+ },
211
+ "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
212
+ cursor: "not-allowed !important"
213
+ },
214
+ "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
215
+ borderColor: error ? "red" : void 0
216
+ },
217
+ "& .MuiFilledInput-root.Mui-disabled": {
218
+ borderColor: error ? "red" : void 0
219
+ }
220
+ },
221
+ onInputChange: (_, newInputValue) => setInputValue(newInputValue),
222
+ renderInput: (params) => /* @__PURE__ */ jsx(
223
+ TextField,
224
+ {
225
+ ...params,
226
+ label,
227
+ error: !!error,
228
+ helperText: error ? error.message : "",
229
+ placeholder,
230
+ InputProps: {
231
+ ...params.InputProps,
232
+ endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
233
+ loading ? /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }) : null,
234
+ params.InputProps.endAdornment
235
+ ] })
236
+ },
237
+ variant: variant ? variant : "outlined"
238
+ }
239
+ ),
240
+ renderOption: (props2, option, state) => {
241
+ const { key, ...optionProps } = props2;
242
+ const optionLabel = getOptionLabel(option);
243
+ const matches = match(optionLabel, state.inputValue, {
244
+ insideWords: true
245
+ });
246
+ const parts = parse(optionLabel, matches);
247
+ return /* @__PURE__ */ jsx("li", { ...optionProps, children: /* @__PURE__ */ jsx("div", { children: parts.map((part, index) => /* @__PURE__ */ jsx(
248
+ "span",
249
+ {
250
+ style: {
251
+ fontWeight: part.highlight ? 700 : 400
252
+ },
253
+ children: part.text
254
+ },
255
+ index
256
+ )) }) }, key);
257
+ },
258
+ ...rest
259
+ }
260
+ );
261
+ };
262
+ var AsyncSelectMultiElement2 = ({
263
+ gridProps,
264
+ ...props
265
+ }) => {
266
+ if (gridProps) {
267
+ return /* @__PURE__ */ jsx(
268
+ Grid,
269
+ {
270
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
271
+ children: /* @__PURE__ */ jsx(
272
+ Component,
273
+ {
274
+ ...props
275
+ }
276
+ )
277
+ }
278
+ );
279
+ }
280
+ return /* @__PURE__ */ jsx(Component, { ...props });
281
+ };
282
+ AsyncSelectMultiElement2.displayName = "AsyncSelectMulti";
283
+
284
+ // src/wrappers/CheckboxElement/CheckboxElement.tsx
285
+ import {
286
+ Checkbox,
287
+ FormControl,
288
+ FormControlLabel,
289
+ FormGroup,
290
+ FormHelperText,
291
+ Grid as Grid2
292
+ } from "@mui/material";
293
+ import { useController as useController2 } from "react-hook-form";
294
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
295
+ var Component2 = function CheckboxElement(props) {
296
+ const {
297
+ name,
298
+ control,
299
+ label,
300
+ labelProps,
301
+ helperText,
302
+ parseError,
303
+ transform,
304
+ disabled,
305
+ onChange: customOnChange,
306
+ ...rest
307
+ } = props;
308
+ const {
309
+ field,
310
+ fieldState: { error }
311
+ } = useController2({
312
+ name,
313
+ control,
314
+ disabled
315
+ });
316
+ if (field.value == null || field.value == void 0) {
317
+ field.onChange(false);
318
+ }
319
+ const customOutputTransform = transform?.output;
320
+ const { value, onChange } = useTransform({
321
+ value: field.value,
322
+ onChange: field.onChange,
323
+ transform: {
324
+ input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
325
+ output: typeof customOutputTransform === "function" ? (eventOrValue, _value) => {
326
+ const event = eventOrValue;
327
+ const checked = _value;
328
+ return customOutputTransform(event, checked);
329
+ } : (eventOrValue, _value) => {
330
+ const checked = _value;
331
+ return checked;
332
+ }
333
+ }
334
+ });
335
+ const handleChange = (event, checked) => {
336
+ onChange(event, checked);
337
+ if (typeof customOnChange === "function") {
338
+ customOnChange(event, checked);
339
+ }
340
+ };
341
+ const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
342
+ return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
343
+ /* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
344
+ FormControlLabel,
345
+ {
346
+ label: label || "",
347
+ ...labelProps,
348
+ disabled,
349
+ control: /* @__PURE__ */ jsx2(
350
+ Checkbox,
351
+ {
352
+ ...rest,
353
+ color: rest.color || "primary",
354
+ checked: value,
355
+ disabled,
356
+ onChange: handleChange,
357
+ ref: field.ref
358
+ }
359
+ )
360
+ }
361
+ ) }),
362
+ (displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
363
+ ] });
364
+ };
365
+ var CheckboxElement2 = ({
366
+ gridProps = {},
367
+ ...props
368
+ }) => {
369
+ return /* @__PURE__ */ jsx2(Grid2, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx2(Component2, { ...props }) });
370
+ };
371
+
372
+ // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
373
+ import {
374
+ Checkbox as Checkbox2,
375
+ FormControl as FormControl2,
376
+ FormControlLabel as FormControlLabel2,
377
+ FormGroup as FormGroup2,
378
+ FormHelperText as FormHelperText2,
379
+ FormLabel,
380
+ Grid as Grid3
381
+ } from "@mui/material";
382
+ import { useCallback as useCallback2 } from "react";
383
+ import { useController as useController3 } from "react-hook-form";
384
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
385
+ var Component3 = function CheckboxGroup(props) {
386
+ const {
387
+ name,
388
+ control,
389
+ label,
390
+ required,
391
+ formLabelProps,
392
+ labelProps,
393
+ labelKey = "Label",
394
+ valueKey = "Value",
395
+ options,
396
+ ...rest
397
+ } = props;
398
+ const {
399
+ field,
400
+ fieldState: { error }
401
+ } = useController3({
402
+ name,
403
+ control,
404
+ disabled: rest.disabled
405
+ });
406
+ const selectedValuesAsString = (Array.isArray(field.value) ? field.value : []).map(String);
407
+ const handleChange = useCallback2(
408
+ (event) => {
409
+ const changedValueString = event.target.value;
410
+ const isChecked = event.target.checked;
411
+ const newSelectedValuesString = isChecked ? [...selectedValuesAsString, changedValueString] : selectedValuesAsString.filter((v) => v !== changedValueString);
412
+ const optionsAreNumeric = options.length > 0 && typeof options[0][valueKey] === "number";
413
+ if (optionsAreNumeric) {
414
+ const newValuesAsNumbers = newSelectedValuesString.map((v) => parseInt(v, 10)).filter((v) => !isNaN(v));
415
+ field.onChange(newValuesAsNumbers);
416
+ } else {
417
+ field.onChange(newSelectedValuesString);
418
+ }
419
+ },
420
+ [field, options, valueKey, selectedValuesAsString]
421
+ );
422
+ return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
423
+ label && /* @__PURE__ */ jsx3(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
424
+ /* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options && options.map((option) => /* @__PURE__ */ jsx3(
425
+ FormControlLabel2,
426
+ {
427
+ label: option[labelKey],
428
+ ...labelProps,
429
+ control: /* @__PURE__ */ jsx3(
430
+ Checkbox2,
431
+ {
432
+ ...rest,
433
+ color: rest.color || "primary",
434
+ value: option[valueKey],
435
+ checked: selectedValuesAsString.includes(
436
+ String(option[valueKey])
437
+ ),
438
+ onChange: handleChange
439
+ }
440
+ )
441
+ },
442
+ `${option[valueKey]}`
443
+ )) }),
444
+ error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
445
+ ] });
446
+ };
447
+ var CheckboxGroupElement = ({
448
+ gridProps = {},
449
+ ...props
450
+ }) => {
451
+ return /* @__PURE__ */ jsx3(Grid3, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx3(Component3, { ...props }) });
452
+ };
453
+ CheckboxGroupElement.displayName = "CheckboxGroup";
454
+
455
+ // src/wrappers/DatePickerElement/DatePickerElement.tsx
456
+ import { Grid as Grid4 } from "@mui/material";
457
+ import { forwardRef as forwardRef2 } from "react";
458
+
459
+ // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
460
+ import { useForkRef } from "@mui/material";
461
+ import { DatePicker } from "@mui/x-date-pickers";
462
+ import { forwardRef, useCallback as useCallback4, useMemo as useMemo5 } from "react";
463
+ import { useController as useController4 } from "react-hook-form";
464
+
465
+ // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
466
+ import { useLocalizationContext } from "@mui/x-date-pickers/internals";
467
+ import { useCallback as useCallback3, useMemo as useMemo2 } from "react";
468
+ function readDatePickerValueAsDate(adapter, value) {
469
+ if (value === null || value === void 0) {
470
+ return null;
471
+ }
472
+ if (typeof value === "string") {
473
+ if (value === "") {
474
+ return null;
475
+ }
476
+ const parsedDate = adapter.utils.date(value);
477
+ return parsedDate;
478
+ }
479
+ return value;
480
+ }
481
+ function useDatePickerValue(options) {
482
+ const { field, transform } = options;
483
+ const adapter = useLocalizationContext();
484
+ const value = useMemo2(() => {
485
+ if (typeof transform?.input === "function") {
486
+ return transform.input(field.value);
487
+ }
488
+ return readDatePickerValueAsDate(adapter, field.value);
489
+ }, [field.value, transform?.input, adapter]);
490
+ const onChange = useCallback3(
491
+ (newValue, context) => {
492
+ if (typeof transform?.output === "function") {
493
+ const transformedValue = transform.output(newValue, context);
494
+ field.onChange(transformedValue);
495
+ } else {
496
+ field.onChange(newValue);
497
+ }
498
+ },
499
+ // eslint-disable-next-line react-hooks/exhaustive-deps
500
+ [field.onChange, transform?.output]
501
+ );
502
+ return {
503
+ value,
504
+ onChange
505
+ };
506
+ }
507
+
508
+ // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
509
+ import { useMemo as useMemo3 } from "react";
510
+ var DEFAULT_ERROR_MESSAGES = {
511
+ invalidDate: "Please enter a valid date",
512
+ minDate: "Date must be after the minimum allowed date",
513
+ maxDate: "Date must be before the maximum allowed date",
514
+ disabledDate: "This date is not allowed",
515
+ required: "This field is required"
516
+ };
517
+ function useDatePickerValidation(options) {
518
+ const { fieldState, validation, parseError, value } = options;
519
+ const validationResult = useMemo3(() => {
520
+ const { error: fieldError, invalid } = fieldState;
521
+ let currentError = fieldError;
522
+ if (!fieldError && value && validation) {
523
+ const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
524
+ if (minDate && value < minDate) {
525
+ currentError = {
526
+ type: "minDate",
527
+ message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
528
+ };
529
+ } else if (maxDate && value > maxDate) {
530
+ currentError = {
531
+ type: "maxDate",
532
+ message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
533
+ };
534
+ } else if (shouldDisableDate && shouldDisableDate(value)) {
535
+ currentError = {
536
+ type: "disabledDate",
537
+ message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
538
+ };
539
+ }
540
+ }
541
+ const hasError = Boolean(currentError);
542
+ return {
543
+ hasError,
544
+ error: currentError,
545
+ invalid: invalid || hasError
546
+ };
547
+ }, [fieldState, validation, value]);
548
+ const errorMessage = useMemo3(() => {
549
+ if (!validationResult.error) {
550
+ return null;
551
+ }
552
+ if (parseError) {
553
+ return parseError(validationResult.error);
554
+ }
555
+ if (typeof validationResult.error === "string") {
556
+ return validationResult.error;
557
+ }
558
+ if ("message" in validationResult.error && validationResult.error.message) {
559
+ return validationResult.error.message;
560
+ }
561
+ if ("type" in validationResult.error) {
562
+ const errorType = validationResult.error.type;
563
+ switch (errorType) {
564
+ case "required":
565
+ return DEFAULT_ERROR_MESSAGES.required;
566
+ case "minDate":
567
+ return DEFAULT_ERROR_MESSAGES.minDate;
568
+ case "maxDate":
569
+ return DEFAULT_ERROR_MESSAGES.maxDate;
570
+ case "disabledDate":
571
+ return DEFAULT_ERROR_MESSAGES.disabledDate;
572
+ case "invalidDate":
573
+ default:
574
+ return DEFAULT_ERROR_MESSAGES.invalidDate;
575
+ }
576
+ }
577
+ return DEFAULT_ERROR_MESSAGES.invalidDate;
578
+ }, [validationResult.error, parseError]);
579
+ return {
580
+ ...validationResult,
581
+ errorMessage
582
+ };
583
+ }
584
+
585
+ // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
586
+ import { useTheme as useTheme2 } from "@mui/material";
587
+ import { useMemo as useMemo4 } from "react";
588
+ function useDatePickerStyles(options = {}) {
589
+ const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
590
+ const theme = useTheme2();
591
+ const computedSx = useMemo4(() => {
592
+ const baseStyles = {
593
+ // Input field styling
594
+ "& .MuiOutlinedInput-root": {
595
+ backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
596
+ // Transition for smooth state changes
597
+ transition: theme.transitions.create([
598
+ "background-color",
599
+ "border-color",
600
+ "color"
601
+ ], {
602
+ duration: theme.transitions.duration.short
603
+ }),
604
+ // Error state styling
605
+ ...hasError && {
606
+ borderColor: theme.palette.error.main,
607
+ "&:hover": {
608
+ borderColor: theme.palette.error.main
609
+ },
610
+ "&.Mui-focused": {
611
+ borderColor: theme.palette.error.main,
612
+ boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
613
+ // 25 is 15% opacity in hex
614
+ }
615
+ },
616
+ // Loading state styling
617
+ ...loading && {
618
+ opacity: 0.7,
619
+ pointerEvents: "none"
620
+ }
621
+ },
622
+ // Input element styling
623
+ "& .MuiInputBase-input": {
624
+ cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
625
+ // Read-only specific styling
626
+ ...textReadOnly && !disabled && {
627
+ cursor: "pointer",
628
+ userSelect: "none",
629
+ caretColor: "transparent"
630
+ // Hide text cursor in read-only mode
631
+ },
632
+ // Loading state
633
+ ...loading && {
634
+ cursor: "wait"
635
+ }
636
+ },
637
+ // Required field asterisk styling
638
+ "& .MuiInputLabel-asterisk": {
639
+ color: theme.palette.error.main,
640
+ fontSize: "1.2em"
641
+ },
642
+ // Label styling with better contrast
643
+ "& .MuiInputLabel-root": {
644
+ color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
645
+ // Ensure proper contrast for disabled state
646
+ ...disabled && {
647
+ color: theme.palette.text.disabled
648
+ }
649
+ },
650
+ // Helper text styling
651
+ "& .MuiFormHelperText-root": {
652
+ marginLeft: theme.spacing(1),
653
+ marginRight: theme.spacing(1),
654
+ // Error state
655
+ ...hasError && {
656
+ color: theme.palette.error.main
657
+ }
658
+ },
659
+ // Calendar icon styling
660
+ "& .MuiInputAdornment-root": {
661
+ color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
662
+ },
663
+ // Focus ring for accessibility
664
+ "& .MuiOutlinedInput-root.Mui-focused": {
665
+ outline: `2px solid ${theme.palette.primary.main}50`,
666
+ // 50 is 31% opacity
667
+ outlineOffset: "2px"
668
+ },
669
+ // Enhanced contrast for dark themes
670
+ ...theme.palette.mode === "dark" && {
671
+ "& .MuiOutlinedInput-root": {
672
+ borderWidth: 2
673
+ }
674
+ }
675
+ };
676
+ return customSx ? [baseStyles, customSx] : baseStyles;
677
+ }, [
678
+ theme,
679
+ disabled,
680
+ hasError,
681
+ loading,
682
+ textReadOnly,
683
+ customSx
684
+ ]);
685
+ const className = useMemo4(() => {
686
+ const classes = [];
687
+ if (disabled) classes.push("DatePickerElement--disabled");
688
+ if (hasError) classes.push("DatePickerElement--error");
689
+ if (loading) classes.push("DatePickerElement--loading");
690
+ if (textReadOnly) classes.push("DatePickerElement--readOnly");
691
+ return classes.length > 0 ? classes.join(" ") : void 0;
692
+ }, [disabled, hasError, loading, textReadOnly]);
693
+ return {
694
+ sx: computedSx,
695
+ className
696
+ };
697
+ }
698
+
699
+ // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
700
+ import { jsx as jsx4 } from "react/jsx-runtime";
701
+ var DatePickerElementCore = forwardRef(
702
+ (props, ref) => {
703
+ const {
704
+ name,
705
+ required = false,
706
+ control,
707
+ parseError,
708
+ transform,
709
+ validation,
710
+ label,
711
+ placeholder,
712
+ textReadOnly = false,
713
+ helperText,
714
+ inputProps = {},
715
+ slotProps = {},
716
+ datePickerProps = {},
717
+ variant = "outlined",
718
+ loading = false,
719
+ LoadingComponent,
720
+ ...restProps
721
+ } = props;
722
+ const {
723
+ disabled,
724
+ inputRef: externalInputRef,
725
+ onClose,
726
+ ...restDatePickerProps
727
+ } = datePickerProps;
728
+ const { field, fieldState } = useController4({
729
+ name,
730
+ control,
731
+ defaultValue: null
732
+ // Let react-hook-form handle the default value typing
733
+ });
734
+ const { value, onChange: onValueChange } = useDatePickerValue({
735
+ field,
736
+ transform
737
+ });
738
+ const { hasError, errorMessage, invalid } = useDatePickerValidation({
739
+ fieldState,
740
+ validation,
741
+ parseError,
742
+ value
743
+ });
744
+ const { className } = useDatePickerStyles({
745
+ disabled,
746
+ hasError,
747
+ loading,
748
+ textReadOnly
749
+ });
750
+ const handleInputRef = useForkRef(field.ref, externalInputRef);
751
+ const handleChange = useCallback4(
752
+ (newValue, context) => {
753
+ onValueChange(newValue, context);
754
+ },
755
+ [onValueChange]
756
+ );
757
+ const handleClose = useCallback4(
758
+ (...args) => {
759
+ field.onBlur();
760
+ if (onClose) {
761
+ onClose(...args);
762
+ }
763
+ },
764
+ // eslint-disable-next-line react-hooks/exhaustive-deps
765
+ [field.onBlur, onClose]
766
+ );
767
+ const handleTextFieldBlur = useCallback4(
768
+ (event) => {
769
+ field.onBlur();
770
+ if (typeof inputProps.onBlur === "function") {
771
+ inputProps.onBlur(event);
772
+ }
773
+ },
774
+ // eslint-disable-next-line react-hooks/exhaustive-deps
775
+ [field.onBlur, inputProps.onBlur]
776
+ );
777
+ const memoizedSlotProps = useMemo5(
778
+ () => ({
779
+ ...slotProps,
780
+ actionBar: {
781
+ actions: ["clear", "today", "cancel", "accept"],
782
+ ...slotProps.actionBar
783
+ },
784
+ textField: {
785
+ ...inputProps,
786
+ required,
787
+ placeholder,
788
+ fullWidth: true,
789
+ variant,
790
+ onBlur: handleTextFieldBlur,
791
+ error: hasError,
792
+ helperText: hasError ? errorMessage : helperText,
793
+ inputProps: {
794
+ readOnly: textReadOnly,
795
+ "aria-invalid": invalid,
796
+ "aria-describedby": hasError ? `${name}-error` : void 0,
797
+ ...inputProps.inputProps
798
+ },
799
+ // Add loading indicator if provided
800
+ ...loading && LoadingComponent && {
801
+ InputProps: {
802
+ endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
803
+ ...inputProps.InputProps
804
+ }
805
+ },
806
+ ...slotProps.textField
807
+ }
808
+ }),
809
+ [
810
+ slotProps,
811
+ inputProps,
812
+ required,
813
+ placeholder,
814
+ variant,
815
+ handleTextFieldBlur,
816
+ hasError,
817
+ errorMessage,
818
+ helperText,
819
+ textReadOnly,
820
+ invalid,
821
+ name,
822
+ loading,
823
+ LoadingComponent
824
+ ]
825
+ );
826
+ return /* @__PURE__ */ jsx4(
827
+ DatePicker,
828
+ {
829
+ ...restProps,
830
+ ...restDatePickerProps,
831
+ ref,
832
+ name,
833
+ value,
834
+ onChange: handleChange,
835
+ onClose: handleClose,
836
+ inputRef: handleInputRef,
837
+ label,
838
+ disabled,
839
+ className,
840
+ slotProps: memoizedSlotProps,
841
+ "aria-invalid": invalid,
842
+ "aria-describedby": hasError ? `${name}-error` : void 0
843
+ }
844
+ );
845
+ }
846
+ );
847
+ DatePickerElementCore.displayName = "DatePickerElementCore";
848
+
849
+ // src/wrappers/DatePickerElement/DatePickerElement.tsx
850
+ import { jsx as jsx5 } from "react/jsx-runtime";
851
+ var DatePickerElement = forwardRef2((props, ref) => {
852
+ const {
853
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
854
+ ...coreProps
855
+ } = props;
856
+ if (gridProps === false) {
857
+ return /* @__PURE__ */ jsx5(
858
+ DatePickerElementCore,
859
+ {
860
+ ref,
861
+ ...coreProps
862
+ }
863
+ );
864
+ }
865
+ return /* @__PURE__ */ jsx5(
866
+ Grid4,
867
+ {
868
+ ref,
869
+ ...gridProps,
870
+ children: /* @__PURE__ */ jsx5(
871
+ DatePickerElementCore,
872
+ {
873
+ ...coreProps
874
+ }
875
+ )
876
+ }
877
+ );
878
+ });
879
+ DatePickerElement.displayName = "DatePickerElement";
880
+
881
+ // src/wrappers/DatePickerElement/utils.ts
882
+ function isValidDate(value) {
883
+ if (value === null || value === void 0) {
884
+ return false;
885
+ }
886
+ if (value instanceof Date) {
887
+ return !isNaN(value.getTime());
888
+ }
889
+ if (typeof value === "object" && value !== null) {
890
+ if ("isValid" in value && typeof value.isValid === "function") {
891
+ return value.isValid();
892
+ }
893
+ if ("isValid" in value && typeof value.isValid === "boolean") {
894
+ return value.isValid;
895
+ }
896
+ }
897
+ return false;
898
+ }
899
+ function isParsableDateString(value) {
900
+ if (typeof value !== "string" || value === "") {
901
+ return false;
902
+ }
903
+ const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
904
+ if (isoDateRegex.test(value)) {
905
+ return true;
906
+ }
907
+ const parsed = new Date(value);
908
+ return !isNaN(parsed.getTime());
909
+ }
910
+ function createDateInputTransform(adapter) {
911
+ return (value) => {
912
+ if (value === null || value === void 0) {
913
+ return null;
914
+ }
915
+ if (typeof value === "string") {
916
+ if (value === "") {
917
+ return null;
918
+ }
919
+ try {
920
+ const parsed = adapter.utils.date(value);
921
+ return isValidDate(parsed) ? parsed : null;
922
+ } catch {
923
+ return null;
924
+ }
925
+ }
926
+ if (isValidDate(value)) {
927
+ return value;
928
+ }
929
+ return null;
930
+ };
931
+ }
932
+ function createDateOutputTransform(format) {
933
+ return (value) => {
934
+ if (value === null || value === void 0) {
935
+ return null;
936
+ }
937
+ if (!isValidDate(value)) {
938
+ return null;
939
+ }
940
+ if (!format) {
941
+ return value;
942
+ }
943
+ try {
944
+ if (value instanceof Date) {
945
+ if (format === "iso") {
946
+ return value.toISOString();
947
+ }
948
+ if (format === "date-only") {
949
+ return value.toISOString().split("T")[0];
950
+ }
951
+ }
952
+ if (typeof value.format === "function") {
953
+ return value.format(format);
954
+ }
955
+ if (typeof value.format === "function") {
956
+ return value.format(format);
957
+ }
958
+ if (typeof value.toFormat === "function") {
959
+ return value.toFormat(format);
960
+ }
961
+ return value;
962
+ } catch {
963
+ return null;
964
+ }
965
+ };
966
+ }
967
+ function createDefaultDatePickerConfig() {
968
+ return {
969
+ // Default slot props for consistent behavior
970
+ slotProps: {
971
+ actionBar: {
972
+ actions: ["clear", "today", "cancel", "accept"]
973
+ },
974
+ textField: {
975
+ fullWidth: true,
976
+ variant: "outlined"
977
+ }
978
+ },
979
+ // Default grid props for layout consistency
980
+ gridProps: {
981
+ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
982
+ },
983
+ // Default validation configuration
984
+ validation: {
985
+ errorMessages: {
986
+ invalidDate: "Please enter a valid date",
987
+ minDate: "Date must be after the minimum allowed date",
988
+ maxDate: "Date must be before the maximum allowed date",
989
+ disabledDate: "This date is not allowed"
990
+ }
991
+ }
992
+ };
993
+ }
994
+ function extractErrorMessage(error) {
995
+ if (error === null || error === void 0) {
996
+ return "";
997
+ }
998
+ if (typeof error === "string") {
999
+ return error;
1000
+ }
1001
+ if (typeof error === "object" && error !== null) {
1002
+ if ("message" in error && typeof error.message === "string") {
1003
+ return error.message;
1004
+ }
1005
+ if ("type" in error && typeof error.type === "string") {
1006
+ const errorType = error.type;
1007
+ switch (errorType) {
1008
+ case "invalidDate":
1009
+ return "Please enter a valid date";
1010
+ case "minDate":
1011
+ return "Date is too early";
1012
+ case "maxDate":
1013
+ return "Date is too late";
1014
+ case "disabledDate":
1015
+ return "This date is not available";
1016
+ default:
1017
+ return "Invalid date selection";
1018
+ }
1019
+ }
1020
+ }
1021
+ return "Invalid input";
1022
+ }
1023
+ function createStableKey(config) {
1024
+ try {
1025
+ return JSON.stringify(config, (key, value) => {
1026
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
1027
+ const sorted = {};
1028
+ Object.keys(value).sort().forEach((k) => {
1029
+ sorted[k] = value[k];
1030
+ });
1031
+ return sorted;
1032
+ }
1033
+ return value;
1034
+ });
1035
+ } catch {
1036
+ return Object.keys(config).sort().join("-");
1037
+ }
1038
+ }
1039
+
1040
+ // src/wrappers/PasswordElement/PasswordElement.tsx
1041
+ import Visibility from "@mui/icons-material/Visibility";
1042
+ import VisibilityOff from "@mui/icons-material/VisibilityOff";
1043
+ import {
1044
+ IconButton,
1045
+ InputAdornment,
1046
+ TextField as TextField2,
1047
+ useForkRef as useForkRef2,
1048
+ Grid as Grid5
1049
+ } from "@mui/material";
1050
+ import { useState as useState2 } from "react";
1051
+ import { useController as useController5 } from "react-hook-form";
1052
+ import { jsx as jsx6 } from "react/jsx-runtime";
1053
+ var Component4 = function PasswordEl(props) {
1054
+ const {
1055
+ iconColor,
1056
+ renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
1057
+ slotProps,
1058
+ name,
1059
+ control,
1060
+ inputRef,
1061
+ onBlur,
1062
+ ...rest
1063
+ } = props;
1064
+ const [password, setPassword] = useState2(true);
1065
+ const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
1066
+ IconButton,
1067
+ {
1068
+ onMouseDown: (e) => e.preventDefault(),
1069
+ onClick: () => setPassword(!password),
1070
+ tabIndex: -1,
1071
+ color: iconColor ?? "default",
1072
+ children: renderIcon(password)
1073
+ }
1074
+ ) });
1075
+ const {
1076
+ field,
1077
+ fieldState: { error }
1078
+ } = useController5({
1079
+ name,
1080
+ control
1081
+ });
1082
+ const handleInputRef = useForkRef2(field.ref, inputRef);
1083
+ return /* @__PURE__ */ jsx6(
1084
+ TextField2,
1085
+ {
1086
+ ...rest,
1087
+ inputRef: handleInputRef,
1088
+ type: password ? "password" : "text",
1089
+ value: field.value ?? "",
1090
+ fullWidth: true,
1091
+ variant: rest.variant ?? "outlined",
1092
+ onChange: (event) => {
1093
+ field.onChange(event);
1094
+ if (typeof rest.onChange === "function") {
1095
+ rest.onChange(event);
1096
+ }
1097
+ },
1098
+ onBlur: (event) => {
1099
+ field.onBlur();
1100
+ if (typeof onBlur === "function") {
1101
+ onBlur(event);
1102
+ }
1103
+ },
1104
+ ...typeof slotProps === "undefined" ? {
1105
+ InputProps: {
1106
+ endAdornment
1107
+ }
1108
+ } : {
1109
+ slotProps: {
1110
+ ...slotProps,
1111
+ input: {
1112
+ endAdornment,
1113
+ ...slotProps?.input
1114
+ }
1115
+ }
1116
+ },
1117
+ error: !!error,
1118
+ helperText: error ? error.message : ""
1119
+ }
1120
+ );
1121
+ };
1122
+ var PasswordElement = ({
1123
+ gridProps = {},
1124
+ ...props
1125
+ }) => {
1126
+ return /* @__PURE__ */ jsx6(Grid5, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx6(Component4, { ...props }) });
1127
+ };
1128
+
1129
+ // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1130
+ import {
1131
+ FormControl as FormControl3,
1132
+ FormControlLabel as FormControlLabel3,
1133
+ FormHelperText as FormHelperText3,
1134
+ FormLabel as FormLabel2,
1135
+ Radio,
1136
+ RadioGroup,
1137
+ Grid as Grid6
1138
+ } from "@mui/material";
1139
+ import { useController as useController6 } from "react-hook-form";
1140
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
1141
+ var Component5 = function RadioButtonGroup(props) {
1142
+ const {
1143
+ options,
1144
+ label,
1145
+ name,
1146
+ labelKey = "label",
1147
+ valueKey = "id",
1148
+ disabledKey = "disabled",
1149
+ required,
1150
+ emptyOptionLabel,
1151
+ returnObject,
1152
+ row = true,
1153
+ control,
1154
+ type,
1155
+ labelProps,
1156
+ disabled,
1157
+ formLabelProps,
1158
+ radioProps,
1159
+ transform,
1160
+ ...rest
1161
+ } = props;
1162
+ const {
1163
+ field,
1164
+ fieldState: { error }
1165
+ } = useController6({
1166
+ name,
1167
+ disabled,
1168
+ control
1169
+ });
1170
+ const { value, onChange } = useTransform({
1171
+ value: field.value,
1172
+ onChange: field.onChange,
1173
+ transform: {
1174
+ input: typeof transform?.input === "function" ? transform.input : (value2) => {
1175
+ return value2 || "";
1176
+ },
1177
+ output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
1178
+ if (value2 && type === "number") {
1179
+ return Number(value2);
1180
+ }
1181
+ if (value2 && type === "boolean") {
1182
+ return Boolean(value2);
1183
+ }
1184
+ return value2;
1185
+ }
1186
+ }
1187
+ });
1188
+ const onRadioChange = (event, radioValue) => {
1189
+ const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
1190
+ onChange(event, returnValue);
1191
+ if (typeof rest.onChange === "function") {
1192
+ rest.onChange(returnValue);
1193
+ }
1194
+ };
1195
+ return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
1196
+ label && /* @__PURE__ */ jsx7(FormLabel2, { ...formLabelProps, required, error: !!error, children: label }),
1197
+ /* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1198
+ emptyOptionLabel && /* @__PURE__ */ jsx7(
1199
+ FormControlLabel3,
1200
+ {
1201
+ ...labelProps,
1202
+ control: /* @__PURE__ */ jsx7(
1203
+ Radio,
1204
+ {
1205
+ ...radioProps,
1206
+ checked: !value
1207
+ }
1208
+ ),
1209
+ label: emptyOptionLabel,
1210
+ value: ""
1211
+ }
1212
+ ),
1213
+ options.map((option) => {
1214
+ const optionKey = option[valueKey];
1215
+ const optionDisabled = option[disabledKey] || false;
1216
+ let val = returnObject ? value?.[valueKey] : value;
1217
+ if (type === "number" && val !== void 0) {
1218
+ val = Number(val);
1219
+ } else if (type === "boolean" && val !== void 0) {
1220
+ val = Boolean(val);
1221
+ }
1222
+ const isChecked = val === optionKey;
1223
+ return /* @__PURE__ */ jsx7(
1224
+ FormControlLabel3,
1225
+ {
1226
+ ...labelProps,
1227
+ control: /* @__PURE__ */ jsx7(
1228
+ Radio,
1229
+ {
1230
+ ...radioProps,
1231
+ disabled: disabled || optionDisabled,
1232
+ checked: isChecked
1233
+ }
1234
+ ),
1235
+ value: optionKey,
1236
+ label: option[labelKey]
1237
+ },
1238
+ String(optionKey)
1239
+ );
1240
+ })
1241
+ ] }),
1242
+ error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
1243
+ ] });
1244
+ };
1245
+ var RadioButtonGroup2 = ({
1246
+ gridProps = {},
1247
+ ...props
1248
+ }) => {
1249
+ return /* @__PURE__ */ jsx7(Grid6, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx7(
1250
+ Component5,
1251
+ {
1252
+ ...props
1253
+ }
1254
+ ) });
1255
+ };
1256
+ RadioButtonGroup2.displayName = "RadioButtonGroup";
1257
+
1258
+ // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1259
+ import { Grid as Grid7, TextField as TextField3, Autocomplete as Autocomplete2 } from "@mui/material";
1260
+ import { useTheme as useTheme3 } from "@mui/material/styles";
1261
+ import { useRef as useRef2, useEffect as useEffect2, useCallback as useCallback5, useMemo as useMemo6 } from "react";
1262
+ import { useController as useController7 } from "react-hook-form";
1263
+ import { jsx as jsx8 } from "react/jsx-runtime";
1264
+ var Component6 = function SelectCascadeElement(props) {
1265
+ const theme = useTheme3();
1266
+ const {
1267
+ labelField = "Label",
1268
+ valueField = "Value",
1269
+ name,
1270
+ onBlur,
1271
+ onChange,
1272
+ disabled,
1273
+ options: optionsInput,
1274
+ control,
1275
+ loading = false,
1276
+ placeholder,
1277
+ label,
1278
+ dependsOn,
1279
+ textFieldProps = {},
1280
+ variant,
1281
+ isNullable = false,
1282
+ disableDefaultSelected = false,
1283
+ ...rest
1284
+ } = props;
1285
+ const { required, ...restTextProps } = textFieldProps;
1286
+ const options = useMemo6(() => optionsInput || [], [optionsInput]);
1287
+ const getOptionKey = useCallback5(
1288
+ (option) => {
1289
+ if (typeof option === "string" || typeof option === "number")
1290
+ return option;
1291
+ const key = option ? option[valueField] : void 0;
1292
+ return key !== void 0 && key !== null ? String(key) : "";
1293
+ },
1294
+ [valueField]
1295
+ );
1296
+ const getOptionLabel = useCallback5(
1297
+ (option) => {
1298
+ if (typeof option === "string") return option;
1299
+ return option ? String(option[labelField]) : "";
1300
+ },
1301
+ [labelField]
1302
+ );
1303
+ const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1304
+ const {
1305
+ field,
1306
+ fieldState: { error }
1307
+ } = useController7({
1308
+ name,
1309
+ control
1310
+ });
1311
+ const { field: dependentField } = useController7({
1312
+ name: dependsOn,
1313
+ control
1314
+ });
1315
+ const parentValueRef = useRef2(dependentField.value);
1316
+ useEffect2(() => {
1317
+ if (parentValueRef.current !== dependentField.value) {
1318
+ field.onChange(null);
1319
+ parentValueRef.current = dependentField.value;
1320
+ }
1321
+ }, [dependentField.value, field]);
1322
+ useEffect2(() => {
1323
+ if (disableDefaultSelected && options.length === 1 && field.value != null) {
1324
+ field.onChange(null);
1325
+ }
1326
+ }, [disableDefaultSelected, options.length]);
1327
+ useEffect2(() => {
1328
+ const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1329
+ if (options.length === 1 && !hasValue && !disableDefaultSelected) {
1330
+ if (disabled) return;
1331
+ field.onChange(getOptionKey(options[0]));
1332
+ }
1333
+ }, [
1334
+ options,
1335
+ disabled,
1336
+ getOptionKey,
1337
+ field.onChange,
1338
+ dependentField.value,
1339
+ disableDefaultSelected
1340
+ ]);
1341
+ const isDisabled = useMemo6(() => {
1342
+ if (disabled) return true;
1343
+ if (dependentField.value === null || dependentField.value === void 0 || dependentField.value === "")
1344
+ return true;
1345
+ if (options.length === 1 && !isNullable && !disableDefaultSelected) {
1346
+ return true;
1347
+ }
1348
+ return false;
1349
+ }, [
1350
+ disabled,
1351
+ dependentField.value,
1352
+ options.length,
1353
+ isNullable,
1354
+ disableDefaultSelected
1355
+ ]);
1356
+ return /* @__PURE__ */ jsx8(
1357
+ Autocomplete2,
1358
+ {
1359
+ ...rest,
1360
+ value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
1361
+ loading,
1362
+ options,
1363
+ getOptionKey,
1364
+ getOptionLabel,
1365
+ isOptionEqualToValue,
1366
+ ref: field.ref,
1367
+ disabled: isDisabled,
1368
+ sx: {
1369
+ "&.Mui-disabled": {
1370
+ cursor: "not-allowed !important"
1371
+ },
1372
+ "& .MuiInputBase-root.Mui-disabled": {
1373
+ backgroundColor: theme.palette.action.disabledBackground,
1374
+ cursor: "not-allowed !important"
1375
+ },
1376
+ "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1377
+ cursor: "not-allowed !important"
1378
+ },
1379
+ "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1380
+ borderColor: error ? "red" : void 0
1381
+ },
1382
+ "& .MuiFilledInput-root.Mui-disabled": {
1383
+ borderColor: error ? "red" : void 0
1384
+ }
1385
+ },
1386
+ onChange: (event, newValue, reason) => {
1387
+ field.onChange(newValue ? getOptionKey(newValue) : null);
1388
+ if (onChange && typeof onChange === "function") {
1389
+ onChange(event, newValue, reason);
1390
+ }
1391
+ },
1392
+ onBlur: (event) => {
1393
+ field.onBlur();
1394
+ if (typeof onBlur === "function") {
1395
+ onBlur(event);
1396
+ }
1397
+ },
1398
+ fullWidth: true,
1399
+ renderInput: (params) => /* @__PURE__ */ jsx8(
1400
+ TextField3,
1401
+ {
1402
+ ...params,
1403
+ ...restTextProps,
1404
+ fullWidth: true,
1405
+ error: !!error,
1406
+ required,
1407
+ helperText: error ? error.message : "",
1408
+ placeholder,
1409
+ label,
1410
+ variant: variant ? variant : "outlined"
1411
+ }
1412
+ )
1413
+ }
1414
+ );
1415
+ };
1416
+ var SelectCascadeElement2 = ({
1417
+ gridProps = {},
1418
+ ...props
1419
+ }) => {
1420
+ return /* @__PURE__ */ jsx8(Grid7, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx8(Component6, { ...props }) });
1421
+ };
1422
+ SelectCascadeElement2.displayName = "SelectCascadeElement";
1423
+
1424
+ // src/wrappers/SelectElement/SelectElement.tsx
1425
+ import { Grid as Grid8, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
1426
+ import { useTheme as useTheme4 } from "@mui/material/styles";
1427
+ import { useMemo as useMemo7, useEffect as useEffect3, useCallback as useCallback6 } from "react";
1428
+ import { useController as useController8 } from "react-hook-form";
1429
+ import { jsx as jsx9 } from "react/jsx-runtime";
1430
+ var Component7 = function SelectElement(props) {
1431
+ const theme = useTheme4();
1432
+ const {
1433
+ name,
1434
+ control,
1435
+ onChange,
1436
+ options: optionsInput,
1437
+ label,
1438
+ variant,
1439
+ disabled,
1440
+ labelField = "Label",
1441
+ valueField = "Value",
1442
+ placeholder,
1443
+ textFieldProps = {},
1444
+ isNullable = false,
1445
+ disableDefaultSelected = false,
1446
+ ...rest
1447
+ } = props;
1448
+ const { required, ...restTextProps } = textFieldProps;
1449
+ const options = useMemo7(() => optionsInput || [], [optionsInput]);
1450
+ const {
1451
+ field,
1452
+ fieldState: { error }
1453
+ } = useController8({
1454
+ name,
1455
+ control
1456
+ });
1457
+ const getOptionValue = useCallback6(
1458
+ (option) => {
1459
+ if (typeof option === "string") return option;
1460
+ return option ? option[valueField] : null;
1461
+ },
1462
+ [valueField]
1463
+ );
1464
+ const getOptionLabel = useCallback6(
1465
+ (option) => {
1466
+ if (typeof option === "string") return option;
1467
+ return option ? String(option[labelField]) : "";
1468
+ },
1469
+ [labelField]
1470
+ );
1471
+ useEffect3(() => {
1472
+ if (disableDefaultSelected && options.length === 1 && field.value != null) {
1473
+ field.onChange(null);
1474
+ }
1475
+ }, [disableDefaultSelected, options.length]);
1476
+ useEffect3(() => {
1477
+ const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1478
+ if (options.length === 1 && !hasValue && !disableDefaultSelected) {
1479
+ if (disabled) return;
1480
+ field.onChange(getOptionValue(options[0]));
1481
+ }
1482
+ }, [
1483
+ options,
1484
+ disabled,
1485
+ getOptionValue,
1486
+ field.onChange,
1487
+ disableDefaultSelected
1488
+ ]);
1489
+ const isDisabled = useMemo7(() => {
1490
+ if (disabled) return true;
1491
+ if (options.length === 0) return true;
1492
+ if (options.length === 1 && !isNullable && !disableDefaultSelected)
1493
+ return true;
1494
+ return false;
1495
+ }, [disabled, options.length, isNullable, disableDefaultSelected]);
1496
+ const autocompleteValue = useMemo7(
1497
+ () => options.find((option) => getOptionValue(option) === field.value) ?? null,
1498
+ [field.value, options, getOptionValue]
1499
+ );
1500
+ return /* @__PURE__ */ jsx9(
1501
+ Autocomplete3,
1502
+ {
1503
+ ...rest,
1504
+ filterSelectedOptions: false,
1505
+ options,
1506
+ value: autocompleteValue,
1507
+ onChange: (event, newValue, reason) => {
1508
+ const option = newValue;
1509
+ field.onChange(option ? getOptionValue(option) : null);
1510
+ onChange?.(event, newValue, reason);
1511
+ },
1512
+ disabled: isDisabled,
1513
+ sx: {
1514
+ "&.Mui-disabled": {
1515
+ cursor: "not-allowed !important"
1516
+ },
1517
+ "& .MuiInputBase-root.Mui-disabled": {
1518
+ backgroundColor: theme.palette.action.disabledBackground,
1519
+ cursor: "not-allowed !important"
1520
+ },
1521
+ "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1522
+ cursor: "not-allowed !important"
1523
+ },
1524
+ "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1525
+ borderColor: error ? "red" : void 0
1526
+ },
1527
+ "& .MuiFilledInput-root.Mui-disabled": {
1528
+ borderColor: error ? "red" : void 0
1529
+ }
1530
+ },
1531
+ getOptionLabel: (option) => getOptionLabel(option),
1532
+ ref: field.ref,
1533
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1534
+ renderInput: (params) => /* @__PURE__ */ jsx9(
1535
+ TextField4,
1536
+ {
1537
+ ...params,
1538
+ ...restTextProps,
1539
+ fullWidth: true,
1540
+ required,
1541
+ error: !!error,
1542
+ helperText: error ? error.message : "",
1543
+ label,
1544
+ placeholder,
1545
+ variant: variant ? variant : "outlined"
1546
+ }
1547
+ )
1548
+ }
1549
+ );
1550
+ };
1551
+ var SelectElement2 = ({
1552
+ gridProps = {},
1553
+ ...props
1554
+ }) => {
1555
+ return /* @__PURE__ */ jsx9(Grid8, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx9(Component7, { ...props }) });
1556
+ };
1557
+ SelectElement2.displayName = "SelectElement";
1558
+
1559
+ // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1560
+ import CheckBoxIcon from "@mui/icons-material/CheckBox";
1561
+ import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
1562
+ import {
1563
+ Grid as Grid9,
1564
+ Checkbox as Checkbox3,
1565
+ TextField as TextField5,
1566
+ Autocomplete as Autocomplete4,
1567
+ CircularProgress as CircularProgress2,
1568
+ useTheme as useTheme5
1569
+ } from "@mui/material";
1570
+ import { Fragment as Fragment2, useEffect as useEffect4, useMemo as useMemo8 } from "react";
1571
+ import { useController as useController9 } from "react-hook-form";
1572
+ import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1573
+ var Component8 = function SelectMultiElement(props) {
1574
+ const {
1575
+ name,
1576
+ control,
1577
+ onBlur,
1578
+ disabled,
1579
+ options: optionsInput,
1580
+ loading = false,
1581
+ placeholder,
1582
+ label,
1583
+ isNullable,
1584
+ disableDefaultSelected = true,
1585
+ variant,
1586
+ labelField = "Label",
1587
+ valueField = "Value",
1588
+ ...rest
1589
+ } = props;
1590
+ const theme = useTheme5();
1591
+ const options = useMemo8(() => optionsInput || [], [optionsInput]);
1592
+ const {
1593
+ field,
1594
+ fieldState: { error }
1595
+ } = useController9({
1596
+ name,
1597
+ control
1598
+ });
1599
+ const getOptionValue = (option) => {
1600
+ if (typeof option === "string") return option;
1601
+ return option ? option[valueField] : null;
1602
+ };
1603
+ const getOptionLabel = (option) => {
1604
+ if (typeof option === "string") return option;
1605
+ return option ? String(option[labelField]) : "";
1606
+ };
1607
+ const isDisabled = useMemo8(() => {
1608
+ if (disabled) return true;
1609
+ if (options.length === 0) return true;
1610
+ if (options.length === 1 && !isNullable && !disableDefaultSelected)
1611
+ return true;
1612
+ return false;
1613
+ }, [disabled, options.length, isNullable, disableDefaultSelected]);
1614
+ const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1615
+ useEffect4(() => {
1616
+ if (disableDefaultSelected && options.length === 1 && field.value != null) {
1617
+ field.onChange(null);
1618
+ }
1619
+ }, [disableDefaultSelected, options.length]);
1620
+ useEffect4(() => {
1621
+ const hasValue = Array.isArray(field.value) && field.value.length > 0;
1622
+ if (options.length === 1 && !hasValue && !isNullable && !disableDefaultSelected) {
1623
+ field.onChange([getOptionValue(options[0])]);
1624
+ }
1625
+ }, [
1626
+ options,
1627
+ getOptionValue,
1628
+ field.onChange,
1629
+ isNullable,
1630
+ disableDefaultSelected
1631
+ ]);
1632
+ const handleChange = (_, selectedOptions, reason) => {
1633
+ if (reason === "clear") {
1634
+ field.onChange(null);
1635
+ } else if (reason === "selectOption" || reason === "removeOption") {
1636
+ const newValues = selectedOptions.map((option) => getOptionValue(option));
1637
+ field.onChange(newValues.length === 0 ? null : newValues);
1638
+ }
1639
+ };
1640
+ const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
1641
+ const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
1642
+ return /* @__PURE__ */ jsx10(
1643
+ Autocomplete4,
1644
+ {
1645
+ multiple: true,
1646
+ value: selectedValue,
1647
+ loading,
1648
+ options,
1649
+ getOptionLabel,
1650
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1651
+ filterSelectedOptions: true,
1652
+ disableCloseOnSelect: true,
1653
+ ref: field.ref,
1654
+ disabled: isDisabled,
1655
+ onChange: handleChange,
1656
+ onBlur: (event) => {
1657
+ field.onBlur();
1658
+ if (typeof onBlur === "function") {
1659
+ onBlur(event);
1660
+ }
1661
+ },
1662
+ sx: {
1663
+ "&.Mui-disabled": {
1664
+ cursor: "not-allowed !important"
1665
+ },
1666
+ "& .MuiInputBase-root.Mui-disabled": {
1667
+ backgroundColor: theme.palette.action.disabledBackground,
1668
+ cursor: "not-allowed !important"
1669
+ },
1670
+ "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1671
+ cursor: "not-allowed !important"
1672
+ },
1673
+ "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1674
+ borderColor: error ? "red" : void 0
1675
+ },
1676
+ "& .MuiFilledInput-root.Mui-disabled": {
1677
+ borderColor: error ? "red" : void 0
1678
+ }
1679
+ },
1680
+ fullWidth: true,
1681
+ renderOption: (props1, option, { selected }) => {
1682
+ return /* @__PURE__ */ jsxs5("li", { ...props1, children: [
1683
+ /* @__PURE__ */ jsx10(
1684
+ Checkbox3,
1685
+ {
1686
+ icon,
1687
+ checkedIcon,
1688
+ checked: selected
1689
+ }
1690
+ ),
1691
+ getOptionLabel(option)
1692
+ ] });
1693
+ },
1694
+ renderInput: (params) => /* @__PURE__ */ jsx10(
1695
+ TextField5,
1696
+ {
1697
+ ...params,
1698
+ label,
1699
+ error: !!error,
1700
+ helperText: error ? error.message : "",
1701
+ placeholder,
1702
+ InputProps: {
1703
+ ...params.InputProps,
1704
+ endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
1705
+ loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
1706
+ params.InputProps.endAdornment
1707
+ ] })
1708
+ },
1709
+ variant: variant ? variant : "outlined"
1710
+ }
1711
+ ),
1712
+ ...rest
1713
+ }
1714
+ );
1715
+ };
1716
+ var SelectMultiElement2 = ({
1717
+ gridProps = {},
1718
+ ...props
1719
+ }) => {
1720
+ return /* @__PURE__ */ jsx10(Grid9, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx10(Component8, { ...props }) });
1721
+ };
1722
+ SelectMultiElement2.displayName = "SelectMultiElement";
1723
+
1724
+ // src/wrappers/TextFieldElement/TextFieldElement.tsx
1725
+ import { Grid as Grid10, TextField as TextField6, useForkRef as useForkRef3, useTheme as useTheme6 } from "@mui/material";
1726
+ import { useController as useController10 } from "react-hook-form";
1727
+ import { jsx as jsx11 } from "react/jsx-runtime";
1728
+ var Component9 = function TextFieldElement(props) {
1729
+ const {
1730
+ parseError,
1731
+ name,
1732
+ control,
1733
+ component: TextFieldComponent = TextField6,
1734
+ transform,
1735
+ fieldType = "text",
1736
+ // Default to text type
1737
+ defaultValue,
1738
+ label,
1739
+ placeholder,
1740
+ textFieldProps = {},
1741
+ variant,
1742
+ onChange: customOnChange,
1743
+ enableWarnings = process.env.NODE_ENV === "development",
1744
+ ...rest
1745
+ } = props;
1746
+ const {
1747
+ type,
1748
+ required,
1749
+ helperText,
1750
+ inputRef,
1751
+ onInput,
1752
+ onBlur,
1753
+ disabled,
1754
+ ...restTextProps
1755
+ } = textFieldProps;
1756
+ const {
1757
+ field,
1758
+ fieldState: { error }
1759
+ } = useController10({
1760
+ name,
1761
+ control
1762
+ });
1763
+ const theme = useTheme6();
1764
+ const { value, onChange } = useEnhancedTransform(
1765
+ {
1766
+ value: field.value,
1767
+ onChange: field.onChange,
1768
+ transform: transform ? {
1769
+ input: transform.input,
1770
+ output: transform.output
1771
+ } : void 0,
1772
+ fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1773
+ // Auto-detect number type
1774
+ defaultValue,
1775
+ enableWarnings
1776
+ }
1777
+ );
1778
+ const handleInputRef = useForkRef3(field.ref, inputRef);
1779
+ return /* @__PURE__ */ jsx11(
1780
+ TextFieldComponent,
1781
+ {
1782
+ ...rest,
1783
+ ...restTextProps,
1784
+ name: field.name,
1785
+ value,
1786
+ onChange: (event) => {
1787
+ const input = event.target.value;
1788
+ if (input === "") {
1789
+ field.onChange(null);
1790
+ } else {
1791
+ onChange(event);
1792
+ }
1793
+ if (typeof customOnChange === "function") {
1794
+ customOnChange(event);
1795
+ }
1796
+ return;
1797
+ },
1798
+ onBlur: (event) => {
1799
+ field.onBlur();
1800
+ if (typeof onBlur === "function") {
1801
+ onBlur(event);
1802
+ }
1803
+ },
1804
+ onInput: (event) => {
1805
+ if (typeof onInput === "function") {
1806
+ onInput(event);
1807
+ }
1808
+ },
1809
+ disabled,
1810
+ label,
1811
+ placeholder,
1812
+ fullWidth: true,
1813
+ required,
1814
+ type,
1815
+ error: !!error,
1816
+ helperText: error ? parseError ? parseError(error) : error.message : helperText,
1817
+ inputRef: handleInputRef,
1818
+ variant: variant ? variant : "outlined",
1819
+ sx: {
1820
+ "&.Mui-disabled": {
1821
+ cursor: "not-allowed !important"
1822
+ },
1823
+ "& .MuiInputBase-root.Mui-disabled": {
1824
+ backgroundColor: theme.palette.action.disabledBackground,
1825
+ cursor: "not-allowed !important"
1826
+ }
1827
+ }
1828
+ }
1829
+ );
1830
+ };
1831
+ var TextFieldElement2 = ({
1832
+ gridProps = {},
1833
+ ...props
1834
+ }) => {
1835
+ return /* @__PURE__ */ jsx11(Grid10, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx11(Component9, { ...props }) });
1836
+ };
1837
+
1838
+ // src/wrappers/TimePickerElement/TimePickerElement.tsx
1839
+ import { Grid as Grid11, useForkRef as useForkRef4 } from "@mui/material";
1840
+ import { TimePicker } from "@mui/x-date-pickers";
1841
+ import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
1842
+ import { renderTimeViewClock } from "@mui/x-date-pickers/timeViewRenderers";
1843
+ import dayjs from "dayjs";
1844
+ import { useState as useState3 } from "react";
1845
+ import { useController as useController11 } from "react-hook-form";
1846
+ import { jsx as jsx12 } from "react/jsx-runtime";
1847
+ var Component10 = function TimePickerElement(props) {
1848
+ const {
1849
+ name,
1850
+ required,
1851
+ inputProps,
1852
+ control,
1853
+ label,
1854
+ placeholder,
1855
+ slotProps,
1856
+ timePickerProps = {},
1857
+ transform,
1858
+ ...rest
1859
+ } = props;
1860
+ const adapter = useLocalizationContext2();
1861
+ const [open, setOpen] = useState3(false);
1862
+ const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1863
+ const {
1864
+ field,
1865
+ fieldState: { error }
1866
+ } = useController11({
1867
+ name,
1868
+ control,
1869
+ defaultValue: null
1870
+ });
1871
+ const { value, onChange } = useTransform({
1872
+ value: field.value,
1873
+ onChange: field.onChange,
1874
+ transform: {
1875
+ input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1876
+ output: (data) => {
1877
+ if (!dayjs.isDayjs(data)) {
1878
+ return null;
1879
+ }
1880
+ return data;
1881
+ }
1882
+ }
1883
+ });
1884
+ const handleInputRef = useForkRef4(field.ref, inputRef);
1885
+ return /* @__PURE__ */ jsx12(
1886
+ TimePicker,
1887
+ {
1888
+ ...rest,
1889
+ ...restTimePickerProps,
1890
+ value,
1891
+ label,
1892
+ disabled,
1893
+ open,
1894
+ inputRef: handleInputRef,
1895
+ viewRenderers: {
1896
+ hours: renderTimeViewClock,
1897
+ minutes: renderTimeViewClock,
1898
+ seconds: renderTimeViewClock
1899
+ },
1900
+ onOpen: () => setOpen(true),
1901
+ onClose: (...args) => {
1902
+ setOpen(false);
1903
+ field.onBlur();
1904
+ onClose?.(...args);
1905
+ },
1906
+ onChange: (newValue, context) => {
1907
+ onChange(newValue);
1908
+ timePickerProps.onChange?.(newValue, context);
1909
+ },
1910
+ slotProps: {
1911
+ ...slotProps,
1912
+ actionBar: {
1913
+ actions: ["clear", "cancel", "accept"]
1914
+ },
1915
+ textField: {
1916
+ ...inputProps,
1917
+ required,
1918
+ placeholder,
1919
+ fullWidth: true,
1920
+ readOnly: true,
1921
+ sx: {
1922
+ cursor: disabled ? "not-allowed" : "pointer"
1923
+ },
1924
+ onClick: () => {
1925
+ if (!disabled) {
1926
+ setOpen(true);
1927
+ }
1928
+ },
1929
+ onBlur: (event) => {
1930
+ field.onBlur();
1931
+ inputProps?.onBlur?.(event);
1932
+ },
1933
+ error: !!error,
1934
+ helperText: error ? error.message : inputProps?.helperText || rest.helperText,
1935
+ inputProps: {
1936
+ readOnly: true,
1937
+ inputMode: "none",
1938
+ ...inputProps?.inputProps
1939
+ }
1940
+ }
1941
+ }
1942
+ }
1943
+ );
1944
+ };
1945
+ var TimePickerElement2 = ({
1946
+ gridProps = {},
1947
+ ...props
1948
+ }) => {
1949
+ return /* @__PURE__ */ jsx12(Grid11, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx12(Component10, { ...props }) });
1950
+ };
1951
+ TimePickerElement2.displayName = "TimePickerElement";
1952
+
1953
+ // src/wrappers/SliderElement/SliderElement.tsx
1954
+ import {
1955
+ Box,
1956
+ FormControl as FormControl4,
1957
+ FormHelperText as FormHelperText4,
1958
+ FormLabel as FormLabel3,
1959
+ Grid as Grid12,
1960
+ Slider
1961
+ } from "@mui/material";
1962
+ import { useController as useController12 } from "react-hook-form";
1963
+ import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
1964
+ var Component11 = function SliderElementCore(props) {
1965
+ const {
1966
+ name,
1967
+ control,
1968
+ label,
1969
+ helperText,
1970
+ parseError,
1971
+ min = 0,
1972
+ max = 100,
1973
+ step = 1,
1974
+ marks = false,
1975
+ required = false,
1976
+ disabled = false,
1977
+ sliderProps = {}
1978
+ } = props;
1979
+ const {
1980
+ field,
1981
+ fieldState: { error }
1982
+ } = useController12({
1983
+ name,
1984
+ control
1985
+ });
1986
+ const errorMessage = error ? parseError ? parseError(error) : error.message : null;
1987
+ return /* @__PURE__ */ jsxs6(
1988
+ FormControl4,
1989
+ {
1990
+ fullWidth: true,
1991
+ margin: "normal",
1992
+ error: !!error,
1993
+ required,
1994
+ disabled,
1995
+ children: [
1996
+ label && /* @__PURE__ */ jsx13(FormLabel3, { sx: { mb: 2 }, children: label }),
1997
+ /* @__PURE__ */ jsx13(Box, { sx: { px: 2 }, children: /* @__PURE__ */ jsx13(
1998
+ Slider,
1999
+ {
2000
+ ...sliderProps,
2001
+ ref: field.ref,
2002
+ name: field.name,
2003
+ value: typeof field.value === "number" ? field.value : min,
2004
+ onChange: (_, newValue) => field.onChange(newValue),
2005
+ onBlur: field.onBlur,
2006
+ min,
2007
+ max,
2008
+ step,
2009
+ marks,
2010
+ valueLabelDisplay: "auto",
2011
+ disabled
2012
+ }
2013
+ ) }),
2014
+ (errorMessage || helperText) && /* @__PURE__ */ jsx13(FormHelperText4, { children: errorMessage || helperText })
2015
+ ]
2016
+ }
2017
+ );
2018
+ };
2019
+ var SliderElement = ({
2020
+ gridProps = {},
2021
+ ...props
2022
+ }) => {
2023
+ return /* @__PURE__ */ jsx13(Grid12, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx13(Component11, { ...props }) });
2024
+ };
2025
+ SliderElement.displayName = "SliderElement";
2026
+
2027
+ // src/wrappers/FileUploadElement/FileUploadElement.tsx
2028
+ import {
2029
+ Box as Box2,
2030
+ Button,
2031
+ Chip,
2032
+ FormControl as FormControl5,
2033
+ FormHelperText as FormHelperText5,
2034
+ FormLabel as FormLabel4,
2035
+ Grid as Grid13,
2036
+ Stack
2037
+ } from "@mui/material";
2038
+ import CloudUploadIcon from "@mui/icons-material/CloudUpload";
2039
+ import { useCallback as useCallback7, useRef as useRef3 } from "react";
2040
+ import { useController as useController13, useFormContext } from "react-hook-form";
2041
+ import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
2042
+ var Component12 = function FileUploadElementCore(props) {
2043
+ const {
2044
+ name,
2045
+ control,
2046
+ label,
2047
+ helperText,
2048
+ parseError,
2049
+ maxFiles = 5,
2050
+ maxSizeMB = 10,
2051
+ allowedExtensions = [".jpg", ".jpeg", ".png", ".pdf", ".doc", ".docx", ".xls", ".xlsx"],
2052
+ required = false,
2053
+ disabled = false,
2054
+ buttonText = "Choose Files"
2055
+ } = props;
2056
+ const { setError, clearErrors } = useFormContext();
2057
+ const fileInputRef = useRef3(null);
2058
+ const {
2059
+ field,
2060
+ fieldState: { error }
2061
+ } = useController13({
2062
+ name,
2063
+ control
2064
+ });
2065
+ const files = Array.isArray(field.value) ? field.value : [];
2066
+ const validateFiles = useCallback7(
2067
+ (fileList) => {
2068
+ if (!fileList || fileList.length === 0) {
2069
+ return [];
2070
+ }
2071
+ if (fileList.length > maxFiles) {
2072
+ return `Maximum ${maxFiles} files allowed`;
2073
+ }
2074
+ const maxSizeBytes = maxSizeMB * 1024 * 1024;
2075
+ const validFiles = [];
2076
+ for (let i = 0; i < fileList.length; i++) {
2077
+ const file = fileList[i];
2078
+ if (file.size > maxSizeBytes) {
2079
+ return `File "${file.name}" exceeds ${maxSizeMB}MB size limit`;
2080
+ }
2081
+ const extension = "." + file.name.split(".").pop()?.toLowerCase();
2082
+ if (!allowedExtensions.includes(extension)) {
2083
+ return `File "${file.name}" has invalid extension. Allowed: ${allowedExtensions.join(", ")}`;
2084
+ }
2085
+ validFiles.push(file);
2086
+ }
2087
+ return validFiles;
2088
+ },
2089
+ [maxFiles, maxSizeMB, allowedExtensions]
2090
+ );
2091
+ const handleFileChange = useCallback7(
2092
+ (event) => {
2093
+ const result = validateFiles(event.target.files);
2094
+ if (typeof result === "string") {
2095
+ setError(name, { type: "validation", message: result });
2096
+ if (fileInputRef.current) {
2097
+ fileInputRef.current.value = "";
2098
+ }
2099
+ return;
2100
+ }
2101
+ clearErrors(name);
2102
+ field.onChange(result);
2103
+ },
2104
+ [validateFiles, setError, clearErrors, name, field]
2105
+ );
2106
+ const handleRemoveFile = useCallback7(
2107
+ (index) => {
2108
+ const newFiles = files.filter((_, i) => i !== index);
2109
+ field.onChange(newFiles);
2110
+ if (fileInputRef.current) {
2111
+ fileInputRef.current.value = "";
2112
+ }
2113
+ },
2114
+ [files, field]
2115
+ );
2116
+ const errorMessage = error ? parseError ? parseError(error) : error.message : null;
2117
+ return /* @__PURE__ */ jsxs7(
2118
+ FormControl5,
2119
+ {
2120
+ fullWidth: true,
2121
+ margin: "normal",
2122
+ error: !!error,
2123
+ required,
2124
+ disabled,
2125
+ children: [
2126
+ label && /* @__PURE__ */ jsx14(FormLabel4, { sx: { mb: 1 }, children: label }),
2127
+ /* @__PURE__ */ jsxs7(Box2, { children: [
2128
+ /* @__PURE__ */ jsxs7(
2129
+ Button,
2130
+ {
2131
+ variant: "outlined",
2132
+ component: "label",
2133
+ startIcon: /* @__PURE__ */ jsx14(CloudUploadIcon, {}),
2134
+ disabled: disabled || files.length >= maxFiles,
2135
+ children: [
2136
+ buttonText,
2137
+ /* @__PURE__ */ jsx14(
2138
+ "input",
2139
+ {
2140
+ ref: fileInputRef,
2141
+ type: "file",
2142
+ multiple: true,
2143
+ accept: allowedExtensions.join(","),
2144
+ hidden: true,
2145
+ onChange: handleFileChange
2146
+ }
2147
+ )
2148
+ ]
2149
+ }
2150
+ ),
2151
+ files.length > 0 && /* @__PURE__ */ jsx14(Stack, { direction: "row", spacing: 1, flexWrap: "wrap", sx: { mt: 2 }, children: files.map((file, index) => /* @__PURE__ */ jsx14(
2152
+ Chip,
2153
+ {
2154
+ label: `${file.name} (${(file.size / 1024).toFixed(1)} KB)`,
2155
+ onDelete: disabled ? void 0 : () => handleRemoveFile(index),
2156
+ sx: { mb: 1 }
2157
+ },
2158
+ `${file.name}-${index}`
2159
+ )) })
2160
+ ] }),
2161
+ (errorMessage || helperText) && /* @__PURE__ */ jsx14(FormHelperText5, { children: errorMessage || helperText })
2162
+ ]
2163
+ }
2164
+ );
2165
+ };
2166
+ var FileUploadElement = ({
2167
+ gridProps = {},
2168
+ ...props
2169
+ }) => {
2170
+ return /* @__PURE__ */ jsx14(Grid13, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx14(Component12, { ...props }) });
2171
+ };
2172
+ FileUploadElement.displayName = "FileUploadElement";
2173
+
2174
+ // src/wrappers/PhoneNumberElement/PhoneNumberElement.tsx
2175
+ import { Grid as Grid14 } from "@mui/material";
2176
+ import { useController as useController14 } from "react-hook-form";
2177
+ import { MuiTelInput } from "mui-tel-input";
2178
+ import { jsx as jsx15 } from "react/jsx-runtime";
2179
+ var TelInput = MuiTelInput;
2180
+ var Component13 = function PhoneNumberEl(props) {
2181
+ const {
2182
+ name,
2183
+ control,
2184
+ label,
2185
+ placeholder,
2186
+ defaultCountry = "US",
2187
+ preferredCountries,
2188
+ onlyCountries,
2189
+ excludeCountries,
2190
+ disabled = false,
2191
+ required = false,
2192
+ parseError,
2193
+ textFieldProps
2194
+ } = props;
2195
+ const {
2196
+ field,
2197
+ fieldState: { error }
2198
+ } = useController14({ name, control });
2199
+ const errorMessage = error ? parseError ? parseError(error) : error.message : textFieldProps?.helperText;
2200
+ return /* @__PURE__ */ jsx15(
2201
+ TelInput,
2202
+ {
2203
+ value: field.value ?? "",
2204
+ onChange: (val) => field.onChange(val),
2205
+ onBlur: () => field.onBlur(),
2206
+ inputRef: field.ref,
2207
+ label,
2208
+ placeholder,
2209
+ defaultCountry,
2210
+ preferredCountries,
2211
+ onlyCountries,
2212
+ excludedCountries: excludeCountries,
2213
+ forceCallingCode: true,
2214
+ focusOnSelectFlag: true,
2215
+ fullWidth: true,
2216
+ required,
2217
+ disabled,
2218
+ error: !!error,
2219
+ helperText: errorMessage,
2220
+ size: textFieldProps?.size
2221
+ }
2222
+ );
2223
+ };
2224
+ var PhoneNumberElement = ({
2225
+ gridProps = {},
2226
+ ...props
2227
+ }) => {
2228
+ return /* @__PURE__ */ jsx15(Grid14, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx15(Component13, { ...props }) });
2229
+ };
2230
+
2231
+ // src/wrappers/EditableTableElement/EditableTableElement.tsx
2232
+ import DeleteOutline from "@mui/icons-material/DeleteOutline";
2233
+ import Button2 from "@mui/material/Button";
2234
+ import Grid16 from "@mui/material/Grid";
2235
+ import IconButton2 from "@mui/material/IconButton";
2236
+ import Paper from "@mui/material/Paper";
2237
+ import Table from "@mui/material/Table";
2238
+ import TableBody from "@mui/material/TableBody";
2239
+ import TableCell from "@mui/material/TableCell";
2240
+ import TableContainer from "@mui/material/TableContainer";
2241
+ import TableHead from "@mui/material/TableHead";
2242
+ import TableRow from "@mui/material/TableRow";
2243
+ import Typography from "@mui/material/Typography";
2244
+ import dayjs2 from "dayjs";
2245
+ import { forwardRef as forwardRef3, useImperativeHandle } from "react";
2246
+ import { useFieldArray } from "react-hook-form";
2247
+
2248
+ // src/wrappers/NumberFieldElement/NumberFieldElement.tsx
2249
+ import { Grid as Grid15, TextField as TextField7, useForkRef as useForkRef5, useTheme as useTheme7 } from "@mui/material";
2250
+ import { useController as useController15 } from "react-hook-form";
2251
+ import { jsx as jsx16 } from "react/jsx-runtime";
2252
+ var Component14 = function NumberFieldElement(props) {
2253
+ const {
2254
+ parseError,
2255
+ name,
2256
+ control,
2257
+ component: TextFieldComponent = TextField7,
2258
+ transform,
2259
+ fieldType = "text",
2260
+ // Default to text type
2261
+ defaultValue,
2262
+ label,
2263
+ placeholder,
2264
+ textFieldProps = {},
2265
+ variant,
2266
+ onChange: customOnChange,
2267
+ enableWarnings = process.env.NODE_ENV === "development",
2268
+ maxLength,
2269
+ ...rest
2270
+ } = props;
2271
+ const {
2272
+ type = "number",
2273
+ required,
2274
+ helperText,
2275
+ inputRef,
2276
+ onInput,
2277
+ onBlur,
2278
+ disabled,
2279
+ ...restTextProps
2280
+ } = textFieldProps;
2281
+ const {
2282
+ field,
2283
+ fieldState: { error }
2284
+ } = useController15({
2285
+ name,
2286
+ control
2287
+ });
2288
+ const theme = useTheme7();
2289
+ const { value, onChange } = useEnhancedTransform(
2290
+ {
2291
+ value: field.value,
2292
+ onChange: field.onChange,
2293
+ transform: transform ? {
2294
+ input: transform.input,
2295
+ output: transform.output
2296
+ } : void 0,
2297
+ fieldType: !transform ? type === "number" ? maxLength && maxLength > 5 ? "text" : "number" : fieldType : void 0,
2298
+ // Auto-detect number type
2299
+ defaultValue,
2300
+ enableWarnings
2301
+ }
2302
+ );
2303
+ const handleInputRef = useForkRef5(field.ref, inputRef);
2304
+ return /* @__PURE__ */ jsx16(
2305
+ TextFieldComponent,
2306
+ {
2307
+ ...rest,
2308
+ ...restTextProps,
2309
+ name: field.name,
2310
+ value,
2311
+ onChange: (event) => {
2312
+ const input = event.target.value;
2313
+ if (input === "") {
2314
+ field.onChange(null);
2315
+ }
2316
+ onChange(event);
2317
+ if (typeof customOnChange === "function") {
2318
+ customOnChange(event);
2319
+ }
2320
+ },
2321
+ onBlur: (event) => {
2322
+ field.onBlur();
2323
+ if (typeof onBlur === "function") {
2324
+ onBlur(event);
2325
+ }
2326
+ },
2327
+ onInput: (event) => {
2328
+ if (type === "number" && maxLength && event.target.value.length > maxLength) {
2329
+ event.target.value = event.target.value.slice(0, maxLength);
2330
+ }
2331
+ if (typeof onInput === "function") {
2332
+ onInput(event);
2333
+ }
2334
+ },
2335
+ onWheel: (e) => {
2336
+ e.target.blur();
2337
+ },
2338
+ onKeyDown: (e) => {
2339
+ if (["e", "E", "ArrowDown", "ArrowUp"].includes(e.key)) {
2340
+ e.preventDefault();
2341
+ }
2342
+ },
2343
+ disabled,
2344
+ label,
2345
+ placeholder,
2346
+ fullWidth: true,
2347
+ required,
2348
+ type,
2349
+ error: !!error,
2350
+ helperText: error ? parseError ? parseError(error) : error.message : helperText,
2351
+ inputRef: handleInputRef,
2352
+ slotProps: { htmlInput: { maxLength } },
2353
+ variant: variant ? variant : "outlined",
2354
+ sx: {
2355
+ "&.Mui-disabled": {
2356
+ cursor: "not-allowed !important"
2357
+ },
2358
+ "& .MuiInputBase-root.Mui-disabled": {
2359
+ backgroundColor: theme.palette.action.disabledBackground,
2360
+ cursor: "not-allowed !important"
2361
+ }
2362
+ }
2363
+ }
2364
+ );
2365
+ };
2366
+ var NumberFieldElement2 = ({
2367
+ gridProps = {},
2368
+ ...props
2369
+ }) => {
2370
+ return /* @__PURE__ */ jsx16(Grid15, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx16(Component14, { ...props }) });
2371
+ };
2372
+
2373
+ // src/wrappers/EditableTableElement/EditableTableElement.tsx
2374
+ import { jsx as jsx17, jsxs as jsxs8 } from "react/jsx-runtime";
2375
+ function renderCell(col, fieldName, control, cellDisabled) {
2376
+ const label = col.label + (col.required ? " *" : "");
2377
+ switch (col.type) {
2378
+ case "checkbox":
2379
+ return /* @__PURE__ */ jsx17(
2380
+ CheckboxElement2,
2381
+ {
2382
+ control,
2383
+ name: fieldName,
2384
+ label: "",
2385
+ disabled: cellDisabled
2386
+ }
2387
+ );
2388
+ case "select":
2389
+ return /* @__PURE__ */ jsx17(
2390
+ SelectElement2,
2391
+ {
2392
+ control,
2393
+ name: fieldName,
2394
+ label,
2395
+ options: col.options,
2396
+ disabled: cellDisabled
2397
+ }
2398
+ );
2399
+ case "date":
2400
+ return /* @__PURE__ */ jsx17(
2401
+ DatePickerElement,
2402
+ {
2403
+ control,
2404
+ name: fieldName,
2405
+ label,
2406
+ gridProps: false,
2407
+ datePickerProps: {
2408
+ disabled: cellDisabled,
2409
+ minDate: col.minDate ? dayjs2(col.minDate) : void 0,
2410
+ maxDate: col.maxDate ? dayjs2(col.maxDate) : void 0
2411
+ }
2412
+ }
2413
+ );
2414
+ case "number":
2415
+ return /* @__PURE__ */ jsx17(
2416
+ NumberFieldElement2,
2417
+ {
2418
+ control,
2419
+ name: fieldName,
2420
+ label,
2421
+ textFieldProps: { disabled: cellDisabled }
2422
+ }
2423
+ );
2424
+ case "text":
2425
+ default:
2426
+ return /* @__PURE__ */ jsx17(
2427
+ TextFieldElement2,
2428
+ {
2429
+ control,
2430
+ name: fieldName,
2431
+ label,
2432
+ textFieldProps: { disabled: cellDisabled }
2433
+ }
2434
+ );
2435
+ }
2436
+ }
2437
+ var EditableTableElementInner = ({
2438
+ name,
2439
+ control,
2440
+ columns,
2441
+ defaultRowValue,
2442
+ title,
2443
+ addButtonLabel = "Add",
2444
+ emptyMessage = "No items added.",
2445
+ gridProps = {},
2446
+ showRowNumbers = true,
2447
+ disabled = false,
2448
+ deleteIcon
2449
+ }, ref) => {
2450
+ const { fields, append, remove, update, replace, move, swap, insert } = useFieldArray({ control, name });
2451
+ useImperativeHandle(ref, () => ({
2452
+ append,
2453
+ remove,
2454
+ update,
2455
+ replace,
2456
+ move,
2457
+ swap,
2458
+ insert,
2459
+ fields
2460
+ }));
2461
+ const handleAdd = () => {
2462
+ const row = defaultRowValue ?? Object.fromEntries(columns.map((col) => [col.field, null]));
2463
+ append(row);
2464
+ };
2465
+ const colSpan = columns.length + (showRowNumbers ? 1 : 0) + 1;
2466
+ const baseControl = control;
2467
+ return /* @__PURE__ */ jsxs8(Grid16, { size: 12, ...gridProps, children: [
2468
+ /* @__PURE__ */ jsxs8(Grid16, { container: true, justifyContent: "space-between", alignItems: "center", marginBottom: 1, children: [
2469
+ title && /* @__PURE__ */ jsx17(Typography, { variant: "subtitle1", children: title }),
2470
+ /* @__PURE__ */ jsx17(
2471
+ Button2,
2472
+ {
2473
+ variant: "outlined",
2474
+ size: "small",
2475
+ onClick: handleAdd,
2476
+ disabled,
2477
+ children: addButtonLabel
2478
+ }
2479
+ )
2480
+ ] }),
2481
+ /* @__PURE__ */ jsx17(TableContainer, { component: Paper, variant: "outlined", children: /* @__PURE__ */ jsxs8(Table, { size: "small", stickyHeader: true, children: [
2482
+ /* @__PURE__ */ jsx17(TableHead, { children: /* @__PURE__ */ jsxs8(TableRow, { children: [
2483
+ showRowNumbers && /* @__PURE__ */ jsx17(TableCell, { children: "#" }),
2484
+ columns.map((col) => /* @__PURE__ */ jsx17(TableCell, { width: col.width, children: col.label }, col.field)),
2485
+ /* @__PURE__ */ jsx17(TableCell, {})
2486
+ ] }) }),
2487
+ /* @__PURE__ */ jsxs8(TableBody, { children: [
2488
+ fields.map((field, index) => /* @__PURE__ */ jsxs8(TableRow, { children: [
2489
+ showRowNumbers && /* @__PURE__ */ jsx17(TableCell, { children: index + 1 }),
2490
+ columns.map((col) => {
2491
+ const fieldName = `${name}.${index}.${col.field}`;
2492
+ const cellDisabled = disabled || col.disabled;
2493
+ return /* @__PURE__ */ jsx17(TableCell, { width: col.width, children: renderCell(col, fieldName, baseControl, cellDisabled) }, col.field);
2494
+ }),
2495
+ /* @__PURE__ */ jsx17(TableCell, { children: /* @__PURE__ */ jsx17(
2496
+ IconButton2,
2497
+ {
2498
+ color: "error",
2499
+ onClick: () => remove(index),
2500
+ disabled,
2501
+ children: deleteIcon ?? /* @__PURE__ */ jsx17(DeleteOutline, {})
2502
+ }
2503
+ ) })
2504
+ ] }, field.id)),
2505
+ fields.length === 0 && /* @__PURE__ */ jsx17(TableRow, { children: /* @__PURE__ */ jsx17(TableCell, { colSpan, align: "center", children: /* @__PURE__ */ jsx17(Typography, { variant: "body2", color: "text.secondary", children: emptyMessage }) }) })
2506
+ ] })
2507
+ ] }) })
2508
+ ] });
2509
+ };
2510
+ var EditableTableElement = forwardRef3(EditableTableElementInner);
2511
+
2512
+ // src/wrappers/AsyncSelect/index.tsx
2513
+ import {
2514
+ Autocomplete as Autocomplete5,
2515
+ CircularProgress as CircularProgress3,
2516
+ Grid as Grid17,
2517
+ TextField as TextField8,
2518
+ useTheme as useTheme8
2519
+ } from "@mui/material";
2520
+ import { debounce as debounce2 } from "@mui/material/utils";
2521
+ import {
2522
+ Fragment as Fragment3,
2523
+ useCallback as useCallback8,
2524
+ useEffect as useEffect5,
2525
+ useMemo as useMemo9,
2526
+ useRef as useRef4,
2527
+ useState as useState4
2528
+ } from "react";
2529
+ import {
2530
+ useController as useController16
2531
+ } from "react-hook-form";
2532
+ import { jsx as jsx18, jsxs as jsxs9 } from "react/jsx-runtime";
2533
+ var Component15 = function AsyncSelectElement(props) {
2534
+ const {
2535
+ name,
2536
+ disabled,
2537
+ control,
2538
+ placeholder,
2539
+ // initialValue,
2540
+ // isNullable,
2541
+ label,
2542
+ queryFn,
2543
+ variant,
2544
+ labelField = "Label",
2545
+ valueField = "Value",
2546
+ ...rest
2547
+ } = props;
2548
+ const {
2549
+ field,
2550
+ fieldState: { error }
2551
+ } = useController16({
2552
+ name,
2553
+ control
2554
+ });
2555
+ const theme = useTheme8();
2556
+ const [loading, setLoading] = useState4(false);
2557
+ const [selectedOption, setSelectedOption] = useState4(null);
2558
+ const [inputValue, setInputValue] = useState4("");
2559
+ const [options, setOptions] = useState4([]);
2560
+ const [open, setOpen] = useState4(false);
2561
+ const loadedValueRef = useRef4(
2562
+ void 0
2563
+ );
2564
+ const fetchData = useMemo9(
2565
+ () => debounce2(
2566
+ (payload, callback) => {
2567
+ queryFn(payload).then((c) => callback(c));
2568
+ },
2569
+ 400
2570
+ ),
2571
+ [queryFn]
2572
+ );
2573
+ const getOptionValue = useCallback8(
2574
+ (option) => {
2575
+ return option ? String(option[valueField]) : "";
2576
+ },
2577
+ [valueField]
2578
+ );
2579
+ const getOptionLabel = useCallback8(
2580
+ (option) => {
2581
+ return option ? String(option[labelField]) : "";
2582
+ },
2583
+ [labelField]
2584
+ );
2585
+ useEffect5(() => {
2586
+ const currentValue = field.value;
2587
+ if (currentValue && loadedValueRef.current !== currentValue) {
2588
+ if (selectedOption && getOptionValue(selectedOption) === currentValue) {
2589
+ loadedValueRef.current = currentValue;
2590
+ return;
2591
+ }
2592
+ const active = true;
2593
+ setLoading(true);
2594
+ loadedValueRef.current = currentValue;
2595
+ fetchData({ Query: null, SelectedValue: currentValue }, (results) => {
2596
+ if (!active) return;
2597
+ setLoading(false);
2598
+ const matchedOption = results?.find(
2599
+ (option) => String(getOptionValue(option)) === String(currentValue)
2600
+ );
2601
+ if (matchedOption) {
2602
+ setOptions([matchedOption]);
2603
+ setSelectedOption(matchedOption);
2604
+ setInputValue(getOptionLabel(matchedOption));
2605
+ }
2606
+ });
2607
+ return;
2608
+ }
2609
+ if (inputValue !== (selectedOption ? getOptionLabel(selectedOption) : "")) {
2610
+ if (inputValue === "") {
2611
+ setOptions([]);
2612
+ setLoading(false);
2613
+ return;
2614
+ }
2615
+ const active = true;
2616
+ setLoading(true);
2617
+ fetchData({ Query: inputValue, SelectedValue: null }, (results) => {
2618
+ if (!active) return;
2619
+ setLoading(false);
2620
+ setOptions(results || []);
2621
+ });
2622
+ return;
2623
+ }
2624
+ if (!currentValue && selectedOption) {
2625
+ setSelectedOption(null);
2626
+ setInputValue("");
2627
+ setOptions([]);
2628
+ loadedValueRef.current = void 0;
2629
+ }
2630
+ }, [
2631
+ field.value,
2632
+ inputValue,
2633
+ fetchData,
2634
+ getOptionLabel,
2635
+ getOptionValue,
2636
+ selectedOption,
2637
+ labelField,
2638
+ valueField
2639
+ ]);
2640
+ const isDisabled = useMemo9(() => {
2641
+ return disabled ?? false;
2642
+ }, [disabled]);
2643
+ const handleChange = useCallback8(
2644
+ (_, newSelectedOption) => {
2645
+ setSelectedOption(newSelectedOption);
2646
+ const newValue = newSelectedOption ? getOptionValue(newSelectedOption) : null;
2647
+ field.onChange(newValue);
2648
+ loadedValueRef.current = newValue;
2649
+ if (newSelectedOption) {
2650
+ setInputValue(getOptionLabel(newSelectedOption));
2651
+ } else {
2652
+ setInputValue("");
2653
+ setOptions([]);
2654
+ }
2655
+ },
2656
+ [field, getOptionValue, getOptionLabel]
2657
+ );
2658
+ const handleInputChange = useCallback8(
2659
+ (_, newInputValue) => {
2660
+ setInputValue(newInputValue);
2661
+ },
2662
+ []
2663
+ );
2664
+ const handleBlur = useCallback8(() => {
2665
+ if (selectedOption) {
2666
+ setInputValue(getOptionLabel(selectedOption));
2667
+ } else {
2668
+ setInputValue("");
2669
+ }
2670
+ }, [selectedOption, getOptionLabel]);
2671
+ const handleOpen = useCallback8(() => {
2672
+ setOpen(true);
2673
+ }, []);
2674
+ const handleClose = useCallback8(() => {
2675
+ setOpen(false);
2676
+ }, []);
2677
+ return /* @__PURE__ */ jsx18(
2678
+ Autocomplete5,
2679
+ {
2680
+ ...rest,
2681
+ fullWidth: true,
2682
+ open,
2683
+ onOpen: handleOpen,
2684
+ onClose: handleClose,
2685
+ onBlur: handleBlur,
2686
+ loading,
2687
+ getOptionLabel,
2688
+ getOptionKey: getOptionValue,
2689
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
2690
+ autoComplete: true,
2691
+ disabled: isDisabled,
2692
+ includeInputInList: true,
2693
+ options,
2694
+ value: selectedOption,
2695
+ filterSelectedOptions: true,
2696
+ filterOptions: (x) => x,
2697
+ onChange: handleChange,
2698
+ onInputChange: handleInputChange,
2699
+ sx: {
2700
+ "&.Mui-disabled": {
2701
+ cursor: "not-allowed !important"
2702
+ },
2703
+ "& .MuiInputBase-root.Mui-disabled": {
2704
+ backgroundColor: theme.palette.action.disabledBackground,
2705
+ cursor: "not-allowed !important"
2706
+ },
2707
+ "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
2708
+ cursor: "not-allowed !important"
2709
+ },
2710
+ "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
2711
+ borderColor: error ? "red" : void 0
2712
+ },
2713
+ "& .MuiFilledInput-root.Mui-disabled": {
2714
+ borderColor: error ? "red" : void 0
2715
+ }
2716
+ },
2717
+ noOptionsText: "Type Something...",
2718
+ renderInput: (params) => /* @__PURE__ */ jsx18(
2719
+ TextField8,
2720
+ {
2721
+ ...params,
2722
+ label,
2723
+ error: !!error,
2724
+ helperText: error ? error.message : "",
2725
+ placeholder,
2726
+ slotProps: {
2727
+ input: {
2728
+ ...params.InputProps,
2729
+ endAdornment: /* @__PURE__ */ jsxs9(Fragment3, { children: [
2730
+ loading ? /* @__PURE__ */ jsx18(CircularProgress3, { color: "inherit", size: 20 }) : null,
2731
+ params.InputProps.endAdornment
2732
+ ] })
2733
+ }
2734
+ },
2735
+ variant: variant ? variant : "outlined"
2736
+ }
2737
+ ),
2738
+ renderOption: (renderProps, option) => {
2739
+ const { key, ...optionProps } = renderProps;
2740
+ return /* @__PURE__ */ jsx18("li", { ...optionProps, children: option[labelField] }, key);
2741
+ }
2742
+ }
2743
+ );
2744
+ };
2745
+ var AsyncSelectElement2 = ({
2746
+ gridProps = {},
2747
+ ...props
2748
+ }) => {
2749
+ return /* @__PURE__ */ jsx18(Grid17, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx18(
2750
+ Component15,
2751
+ {
2752
+ ...props
2753
+ }
2754
+ ) });
2755
+ };
2756
+ AsyncSelectElement2.displayName = "AsyncSelectElement";
2757
+
2758
+ // src/wrappers/OTPInputElement/OTPInputElement.tsx
2759
+ import { Box as Box3, Grid as Grid18, inputBaseClasses } from "@mui/material";
2760
+ import {
2761
+ MuiOtpInput
2762
+ } from "mui-one-time-password-input";
2763
+ import { Controller } from "react-hook-form";
2764
+
2765
+ // src/wrappers/OTPInputElement/HelperText.tsx
2766
+ import FormHelperText6 from "@mui/material/FormHelperText";
2767
+ import { jsx as jsx19 } from "react/jsx-runtime";
2768
+ function HelperText({
2769
+ sx,
2770
+ helperText,
2771
+ errorMessage,
2772
+ disableGutters,
2773
+ ...other
2774
+ }) {
2775
+ if (errorMessage || helperText) {
2776
+ return /* @__PURE__ */ jsx19(
2777
+ FormHelperText6,
2778
+ {
2779
+ error: !!errorMessage,
2780
+ sx: [
2781
+ {
2782
+ mx: disableGutters ? 0 : 1.75
2783
+ },
2784
+ ...Array.isArray(sx) ? sx : [sx]
2785
+ ],
2786
+ ...other,
2787
+ children: errorMessage || helperText
2788
+ }
2789
+ );
2790
+ }
2791
+ return null;
2792
+ }
2793
+
2794
+ // src/wrappers/OTPInputElement/OTPInputElement.tsx
2795
+ import { jsx as jsx20, jsxs as jsxs10 } from "react/jsx-runtime";
2796
+ var Component16 = function OTPInputElement(props) {
2797
+ const {
2798
+ // parseError,
2799
+ name,
2800
+ control,
2801
+ slotProps,
2802
+ helperText,
2803
+ maxSize = 56,
2804
+ placeholder = "-",
2805
+ ...rest
2806
+ } = props;
2807
+ return /* @__PURE__ */ jsx20(
2808
+ Controller,
2809
+ {
2810
+ name,
2811
+ control,
2812
+ render: ({ field, fieldState: { error } }) => /* @__PURE__ */ jsxs10(
2813
+ Box3,
2814
+ {
2815
+ ...slotProps?.wrapper,
2816
+ sx: [
2817
+ {
2818
+ display: "flex",
2819
+ justifyContent: "center",
2820
+ [`& .${inputBaseClasses.input}`]: {
2821
+ p: 0,
2822
+ height: "auto",
2823
+ aspectRatio: "1/1",
2824
+ maxWidth: maxSize
2825
+ }
2826
+ },
2827
+ ...Array.isArray(slotProps?.wrapper?.sx) ? slotProps?.wrapper?.sx ?? [] : [slotProps?.wrapper?.sx]
2828
+ ],
2829
+ children: [
2830
+ /* @__PURE__ */ jsx20(
2831
+ MuiOtpInput,
2832
+ {
2833
+ ...field,
2834
+ autoFocus: true,
2835
+ gap: 1.5,
2836
+ length: 4,
2837
+ TextFieldsProps: {
2838
+ placeholder,
2839
+ error: !!error,
2840
+ ...slotProps?.textfield
2841
+ },
2842
+ ...rest
2843
+ }
2844
+ ),
2845
+ /* @__PURE__ */ jsx20(
2846
+ HelperText,
2847
+ {
2848
+ ...slotProps?.helperText,
2849
+ errorMessage: error?.message,
2850
+ helperText
2851
+ }
2852
+ )
2853
+ ]
2854
+ }
2855
+ )
2856
+ }
2857
+ );
2858
+ };
2859
+ var OTPInputElement2 = ({
2860
+ gridProps = {},
2861
+ ...props
2862
+ }) => {
2863
+ return /* @__PURE__ */ jsx20(Grid18, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx20(Component16, { ...props }) });
2864
+ };
2865
+
2866
+ // src/wrappers/Field/index.ts
2867
+ var Field = {
2868
+ Text: TextFieldElement2,
2869
+ Number: NumberFieldElement2,
2870
+ Checkbox: CheckboxElement2,
2871
+ Date: DatePickerElement,
2872
+ RadioGroup: RadioButtonGroup2,
2873
+ Password: PasswordElement,
2874
+ Phone: PhoneNumberElement,
2875
+ Time: TimePickerElement2,
2876
+ Select: SelectElement2,
2877
+ SelectMulti: SelectMultiElement2,
2878
+ SelectCascade: SelectCascadeElement2,
2879
+ AsyncSelect: AsyncSelectElement2,
2880
+ AsyncMultiSelect: AsyncSelectMultiElement2,
2881
+ CheckboxGroup: CheckboxGroupElement,
2882
+ OTPInput: OTPInputElement2,
2883
+ Slider: SliderElement,
2884
+ FileUpload: FileUploadElement,
2885
+ EditableTable: EditableTableElement
2886
+ };
2887
+
2888
+ export {
2889
+ isValidOption,
2890
+ normalizeOptions,
2891
+ AsyncSelectMultiElement2 as AsyncSelectMultiElement,
2892
+ CheckboxElement2 as CheckboxElement,
2893
+ CheckboxGroupElement,
2894
+ readDatePickerValueAsDate,
2895
+ useDatePickerValue,
2896
+ useDatePickerValidation,
2897
+ useDatePickerStyles,
2898
+ DatePickerElementCore,
2899
+ DatePickerElement,
2900
+ isValidDate,
2901
+ isParsableDateString,
2902
+ createDateInputTransform,
2903
+ createDateOutputTransform,
2904
+ createDefaultDatePickerConfig,
2905
+ extractErrorMessage,
2906
+ createStableKey,
2907
+ PasswordElement,
2908
+ RadioButtonGroup2 as RadioButtonGroup,
2909
+ SelectCascadeElement2 as SelectCascadeElement,
2910
+ SelectElement2 as SelectElement,
2911
+ SelectMultiElement2 as SelectMultiElement,
2912
+ TextFieldElement2 as TextFieldElement,
2913
+ TimePickerElement2 as TimePickerElement,
2914
+ SliderElement,
2915
+ FileUploadElement,
2916
+ PhoneNumberElement,
2917
+ EditableTableElement,
2918
+ Field
2919
+ };
2920
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL3R5cGVzL2NvbW1vbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdC9Bc3luY011bHRpU2VsZWN0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hFbGVtZW50L0NoZWNrYm94RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnRDb3JlLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclN0eWxlcy50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCAiLi4vc3JjL3dyYXBwZXJzL1Bhc3N3b3JkRWxlbWVudC9QYXNzd29yZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdEVsZW1lbnQvU2VsZWN0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdE11bHRpRWxlbWVudC9TZWxlY3RNdWx0aUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UaW1lUGlja2VyRWxlbWVudC9UaW1lUGlja2VyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NsaWRlckVsZW1lbnQvU2xpZGVyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0ZpbGVVcGxvYWRFbGVtZW50L0ZpbGVVcGxvYWRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvUGhvbmVOdW1iZXJFbGVtZW50L1Bob25lTnVtYmVyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0VkaXRhYmxlVGFibGVFbGVtZW50L0VkaXRhYmxlVGFibGVFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvTnVtYmVyRmllbGRFbGVtZW50L051bWJlckZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0FzeW5jU2VsZWN0L2luZGV4LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvT1RQSW5wdXRFbGVtZW50L09UUElucHV0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL09UUElucHV0RWxlbWVudC9IZWxwZXJUZXh0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRmllbGQvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29tbW9uIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHdyYXBwZXIgY29tcG9uZW50c1xuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogQmFzZSBvcHRpb24gdHlwZSBmb3Igc2VsZWN0LWJhc2VkIGNvbXBvbmVudHNcbiAqXG4gKiBAdGVtcGxhdGUgViAtIFRoZSB2YWx1ZSB0eXBlIChzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlT3B0aW9uPFYgPSBzdHJpbmcgfCBudW1iZXI+IHtcbiAgLyoqXG4gICAqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb25cbiAgICovXG4gIExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uXG4gICAqL1xuICBWYWx1ZTogVjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmxleGlibGUgb3B0aW9uIHR5cGUgdGhhdCBleHRlbmRzIGJhc2Ugb3B0aW9uIHdpdGggYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gKlxuICogQHRlbXBsYXRlIFQgLSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgb2JqZWN0XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGbGV4aWJsZU9wdGlvbjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4+ID0gVCAmIEJhc2VPcHRpb247XG5cbi8qKlxuICogT3B0aW9uIHR5cGUgd2l0aCBjdXN0b21pemFibGUga2V5IG5hbWVzXG4gKiBVc2VmdWwgZm9yIGNvbXBvbmVudHMgdGhhdCBhY2NlcHQgY3VzdG9tIGxhYmVsRmllbGQvdmFsdWVGaWVsZCBwcm9wc1xuICpcbiAqIEB0ZW1wbGF0ZSBUVmFsdWVLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgdmFsdWVcbiAqIEB0ZW1wbGF0ZSBUTGFiZWxLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgbGFiZWxcbiAqIEB0ZW1wbGF0ZSBURGlzYWJsZWRLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgZGlzYWJsZWQgZmxhZ1xuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgQ3VzdG9tS2V5T3B0aW9uPFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ICZcbiAgUmVjb3JkPFRMYWJlbEtleSwgc3RyaW5nPiAmXG4gIFBhcnRpYWw8UmVjb3JkPFREaXNhYmxlZEtleSwgYm9vbGVhbj4+ICZcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogTGVnYWN5IG9wdGlvbiB0eXBlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICogVXNlcyBWYWx1ZS9MYWJlbCBuYW1pbmcgY29udmVudGlvblxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBCYXNlT3B0aW9uIG9yIEZsZXhpYmxlT3B0aW9uIGluc3RlYWRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lPcHRpb24ge1xuICAvKipcbiAgICogRGlzcGxheSBsYWJlbCBmb3IgdGhlIG9wdGlvbiAoY2FwaXRhbGl6ZWQga2V5IG5hbWUpXG4gICAqL1xuICBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIG9wdGlvbiAoY2FwaXRhbGl6ZWQga2V5IG5hbWUpXG4gICAqL1xuICBWYWx1ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIERpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIG9wdGlvblxuICpcbiAqIEBwYXJhbSBWYWx1ZSAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT3B0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQmFzZU9wdGlvbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgJ0xhYmVsJyBpbiB2YWx1ZSAmJlxuICAgICdWYWx1ZScgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLkxhYmVsID09PSAnc3RyaW5nJyAmJlxuICAgICh0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLlZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5WYWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuVmFsdWUgPT09ICdib29sZWFuJylcbiAgKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gbm9ybWFsaXplIG9wdGlvbnMgdG8gQmFzZU9wdGlvbiBmb3JtYXRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgYXJyYXkgdG8gbm9ybWFsaXplXG4gKiBAcGFyYW0gbGFiZWxGaWVsZCAtIEN1c3RvbSBsYWJlbCBmaWVsZCBuYW1lIGluIG9wdGlvbiBvYmplY3RzXG4gKiBAcGFyYW0gdmFsdWVGaWVsZCAtIEN1c3RvbSB2YWx1ZSBmaWVsZCBuYW1lIGluIG9wdGlvbiBvYmplY3RzXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIG9wdGlvbnMgYXJyYXlcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcHRpb25zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIG9wdGlvbnM6IFRbXSxcbiAgbGFiZWxGaWVsZCA9ICdMYWJlbCcsXG4gIHZhbHVlRmllbGQgPSAnVmFsdWUnXG4pOiBCYXNlT3B0aW9uW10ge1xuICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgTGFiZWw6IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZF0gPz8gJycpLFxuICAgIFZhbHVlOiBvcHRpb25bdmFsdWVGaWVsZF0gYXMgc3RyaW5nIHwgbnVtYmVyLFxuICAgIGRpc2FibGVkOiBCb29sZWFuKG9wdGlvbi5kaXNhYmxlZCksXG4gIH0pKTtcbn1cbiIsICJpbXBvcnQge1xuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG4gIGRlYm91bmNlLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZVRoZW1lLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCBtYXRjaCBmcm9tICdhdXRvc3VnZ2VzdC1oaWdobGlnaHQvbWF0Y2gnO1xuaW1wb3J0IHBhcnNlIGZyb20gJ2F1dG9zdWdnZXN0LWhpZ2hsaWdodC9wYXJzZSc7XG5pbXBvcnQgUmVhY3QsIHtcbiAgdXNlU3RhdGUsXG4gIHVzZVJlZixcbiAgdXNlTWVtbyxcbiAgdXNlRWZmZWN0LFxuICB1c2VDYWxsYmFjayxcbiAgRnJhZ21lbnQsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgSFRNTEF0dHJpYnV0ZXMsIFN5bnRoZXRpY0V2ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jTXVsdGlTZWxlY3RFbGVtZW50UHJvcHMsIE9wdGlvbk9iamVjdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jTXVsdGlTZWxlY3RQYXlsb2FkIH0gZnJvbSAnQC90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oXG4gIHByb3BzOiBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFRPcHRpb25cbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgcXVlcnlGbixcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCBbc2VsZWN0ZWRPcHRpb25zLCBzZXRTZWxlY3RlZE9wdGlvbnNdID0gdXNlU3RhdGU8VE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8cmVhZG9ubHkgVE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdCBsb2FkZWRWYWx1ZXNSZWYgPSB1c2VSZWY8VE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IGlzSW5pdGlhbFBvcHVsYXRpb25BY3RpdmUgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGluaXRpYWxMb2FkQ29tcGxldGVSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICAvLyBTdG9yZSBzZWxlY3RlZCBvcHRpb25zIGluIGEgcmVmIHNvIEVmZmVjdCAyIGNhbiBhY2Nlc3Mgd2l0aG91dCBkZXBlbmRlbmN5XG4gIGNvbnN0IHNlbGVjdGVkT3B0aW9uc1JlZiA9IHVzZVJlZjxUT3B0aW9uW10+KFtdKTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pID0+IChvcHRpb24gPyBTdHJpbmcob3B0aW9uW3ZhbHVlRmllbGRdKSA6ICcnKSxcbiAgICBbdmFsdWVGaWVsZF1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pID0+IChvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGRdKSA6ICcnKSxcbiAgICBbbGFiZWxGaWVsZF1cbiAgKTtcblxuICBjb25zdCBmZXRjaERhdGEgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBkZWJvdW5jZShcbiAgICAgICAgKFxuICAgICAgICAgIHBheWxvYWQ6IEFzeW5jTXVsdGlTZWxlY3RQYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4gdm9pZFxuICAgICAgICApID0+IHtcbiAgICAgICAgICBxdWVyeUZuKHBheWxvYWQpLnRoZW4oYyA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkge1xuICAgICAgICAgICAgICBjYWxsYmFjayhjKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGMgJiZcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSgoYyBhcyB7IGRhdGE6IHJlYWRvbmx5IFRPcHRpb25bXSB9KS5kYXRhKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgIChjIGFzIHsgZGF0YTogcmVhZG9ubHkgVE9wdGlvbltdIH0pLmRhdGEgYXMgcmVhZG9ubHkgVE9wdGlvbltdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBjICYmXG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoKGMgYXMgeyBEYXRhOiByZWFkb25seSBUT3B0aW9uW10gfSkuRGF0YSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICAgICAgICAoYyBhcyB7IERhdGE6IHJlYWRvbmx5IFRPcHRpb25bXSB9KS5EYXRhIGFzIHJlYWRvbmx5IFRPcHRpb25bXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICA0MDBcbiAgICAgICksXG4gICAgW3F1ZXJ5Rm5dXG4gICk7XG5cbiAgLy8gU3luYyByZWYgd2hlbmV2ZXIgc2VsZWN0ZWRPcHRpb25zIGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZWxlY3RlZE9wdGlvbnNSZWYuY3VycmVudCA9IHNlbGVjdGVkT3B0aW9ucztcbiAgfSwgW3NlbGVjdGVkT3B0aW9uc10pO1xuXG4gIC8vIEVmZmVjdCAxOiBTeW5jIHdpdGggZXh0ZXJuYWwgZmllbGQudmFsdWUgY2hhbmdlcyBmcm9tIHJlYWN0LWhvb2stZm9ybSAoSU5JVElBTCBMT0FEIE9OTFkpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZm9ybVZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpID8gZmllbGQudmFsdWUgOiBbXTtcblxuICAgIC8vIENoZWNrIGlmIGluaXRpYWwgbG9hZCBpcyBjb21wbGV0ZSBhbmQgY3VycmVudCBmb3JtIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgbG9hZGVkIG9uZXMuXG4gICAgLy8gSWYgc28sIG5vIG5lZWQgdG8gcmVmZXRjaCBmb3IgaW5pdGlhbCBwb3B1bGF0aW9uLlxuICAgIGlmIChcbiAgICAgIGluaXRpYWxMb2FkQ29tcGxldGVSZWYuY3VycmVudCAmJlxuICAgICAgSlNPTi5zdHJpbmdpZnkoZm9ybVZhbHVlcykgPT09IEpTT04uc3RyaW5naWZ5KGxvYWRlZFZhbHVlc1JlZi5jdXJyZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBmb3JtIHZhbHVlcywgcmVzZXQgYW5kIG1hcmsgaW5pdGlhbCBsb2FkIGFzIGNvbXBsZXRlLlxuICAgIGlmIChmb3JtVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb25zKFtdKTtcbiAgICAgIHNldE9wdGlvbnMoW10pO1xuICAgICAgbG9hZGVkVmFsdWVzUmVmLmN1cnJlbnQgPSBbXTtcbiAgICAgIGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIGluaXRpYWxMb2FkQ29tcGxldGVSZWYuY3VycmVudCA9IHRydWU7IC8vIE1hcmsgYXMgY29tcGxldGUgYXMgdGhlcmUncyBub3RoaW5nIHRvIGZldGNoXG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHByb2NlZWQgaWYgZm9ybVZhbHVlcyBhcmUgcHJlc2VudCBhbmQgd2UgaGF2ZW4ndCBjb21wbGV0ZWQgdGhlIGluaXRpYWwgbG9hZCBmb3IgdGhlc2Ugc3BlY2lmaWMgdmFsdWVzXG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgIGlzSW5pdGlhbFBvcHVsYXRpb25BY3RpdmUuY3VycmVudCA9IHRydWU7XG4gICAgLy8gU2V0IGxvYWRlZFZhbHVlc1JlZiBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHJlLXRyaWdnZXJpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZXNcbiAgICBsb2FkZWRWYWx1ZXNSZWYuY3VycmVudCA9IGZvcm1WYWx1ZXM7XG4gICAgLy8gTWFyayBpbml0aWFsIGxvYWQgYXMgY29tcGxldGUgcHJvYWN0aXZlbHkgYmVmb3JlIGZldGNoaW5nIHRvIHByZXZlbnQgbXVsdGlwbGUgY2FsbHNcbiAgICBpbml0aWFsTG9hZENvbXBsZXRlUmVmLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgZmV0Y2hEYXRhKHsgUXVlcnk6IG51bGwsIFNlbGVjdGVkVmFsdWU6IGZvcm1WYWx1ZXMgfSwgcmVzdWx0cyA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IGZldGNoZWRPcHRpb25zID0gcmVzdWx0cyB8fCBbXTtcblxuICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbnMoWy4uLmZldGNoZWRPcHRpb25zXSk7XG4gICAgICAgIHNldE9wdGlvbnMoZmV0Y2hlZE9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIGlzSW5pdGlhbFBvcHVsYXRpb25BY3RpdmUuY3VycmVudCA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtmaWVsZC52YWx1ZSwgZmV0Y2hEYXRhXSk7XG5cbiAgLy8gRWZmZWN0IDI6IEhhbmRsZSB1c2VyIHNlYXJjaCBpbnB1dFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIERvbid0IHNlYXJjaCBkdXJpbmcgaW5pdGlhbCBwb3B1bGF0aW9uXG4gICAgaWYgKGlzSW5pdGlhbFBvcHVsYXRpb25BY3RpdmUuY3VycmVudCB8fCAhaW5pdGlhbExvYWRDb21wbGV0ZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgaW5wdXQgaXMgZW1wdHksIGp1c3Qgc2hvdyB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuICAgIGlmICghaW5wdXRWYWx1ZSkge1xuICAgICAgLy8gSWYgbm8gb3B0aW9ucyBhcmUgc2VsZWN0ZWQsIGNsZWFyIHRoZSBvcHRpb25zIHRvIGRpc3BsYXkgXCJub09wdGlvbnNUZXh0XCJcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbnNSZWYuY3VycmVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2V0T3B0aW9ucyhbXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UsIHNob3cgdGhlIHNlbGVjdGVkIG9wdGlvbnNcbiAgICAgICAgc2V0T3B0aW9ucyhzZWxlY3RlZE9wdGlvbnNSZWYuY3VycmVudCk7XG4gICAgICB9XG5cbiAgICAgIGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50ID0gbnVsbDtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgZmV0Y2ggaWYgdGhlIGlucHV0IHZhbHVlIGhhcyBjaGFuZ2VkXG4gICAgaWYgKGlucHV0VmFsdWUgPT09IGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgZmV0Y2hEYXRhKHsgUXVlcnk6IGlucHV0VmFsdWUsIFNlbGVjdGVkVmFsdWU6IG51bGwgfSwgc2VhcmNoUmVzdWx0cyA9PiB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBzZWFyY2hSZXN1bHRzIHx8IFtdO1xuICAgICAgICAvLyBVc2UgcmVmIHRvIGdldCBjdXJyZW50IHNlbGVjdGVkIG9wdGlvbnMgd2l0aG91dCBhZGRpbmcgdG8gZGVwZW5kZW5jaWVzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IHNlbGVjdGVkT3B0aW9uc1JlZi5jdXJyZW50O1xuICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgY3VycmVudFNlbGVjdGVkLm1hcChvcHQgPT4gZ2V0T3B0aW9uVmFsdWUob3B0KSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBbLi4uY3VycmVudFNlbGVjdGVkXTtcblxuICAgICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIXNlbGVjdGVkT3B0aW9uSWRzLmhhcyhnZXRPcHRpb25WYWx1ZShyZXN1bHQpKSkge1xuICAgICAgICAgICAgY29tYmluZWQucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNldE9wdGlvbnMoY29tYmluZWQpO1xuICAgICAgICBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCA9IGlucHV0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gICAgLy8gQ1JJVElDQUw6IFJlbW92ZWQgc2VsZWN0ZWRPcHRpb25zIGZyb20gZGVwZW5kZW5jaWVzIC0gdXNlIHJlZiBpbnN0ZWFkXG4gIH0sIFtpbnB1dFZhbHVlLCBmZXRjaERhdGEsIGdldE9wdGlvblZhbHVlXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKF86IFN5bnRoZXRpY0V2ZW50LCBuZXdTZWxlY3RlZE9wdGlvbnM6IFRPcHRpb25bXSkgPT4ge1xuICAgIHNldFNlbGVjdGVkT3B0aW9ucyhuZXdTZWxlY3RlZE9wdGlvbnMpO1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ld1NlbGVjdGVkT3B0aW9ucy5tYXAoYyA9PiBjW3ZhbHVlRmllbGRdKTtcblxuICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlcy5sZW5ndGggPT09IDAgPyBudWxsIDogbmV3VmFsdWVzKTtcbiAgICBsb2FkZWRWYWx1ZXNSZWYuY3VycmVudCA9IG5ld1ZhbHVlcyBhcyB1bmtub3duIGFzIFRPcHRpb25bXTtcbiAgICBzZXRPcHRpb25zKG5ld1NlbGVjdGVkT3B0aW9ucyk7XG4gICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgLy8gQ2xlYXIgbGFzdCBzZWFyY2ggdGVybSB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQgPSBudWxsO1xuICB9O1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPz8gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZF0pO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgbXVsdGlwbGVcbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWwpXG4gICAgICB9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgdmFsdWU9e3NlbGVjdGVkT3B0aW9uc31cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgZmlsdGVyT3B0aW9ucz17eCA9PiB4fVxuICAgICAgbm9PcHRpb25zVGV4dD1cIlR5cGUgU29tZXRoaW5nLi4uXCJcbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBzeD17e1xuICAgICAgICAnJi5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlJbnB1dEJhc2Utcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmLk11aS1kaXNhYmxlZCAuTXVpQXV0b2NvbXBsZXRlLXBvcHVwSW5kaWNhdG9yJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCAuTXVpT3V0bGluZWRJbnB1dC1ub3RjaGVkT3V0bGluZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUZpbGxlZElucHV0LXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9eyhfLCBuZXdJbnB1dFZhbHVlKSA9PiBzZXRJbnB1dFZhbHVlKG5ld0lucHV0VmFsdWUpfVxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgSW5wdXRQcm9wcz17e1xuICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfX1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgcmVuZGVyT3B0aW9uPXsocHJvcHMsIG9wdGlvbiwgc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPVxuICAgICAgICAgIHByb3BzIGFzIEhUTUxBdHRyaWJ1dGVzPEhUTUxMSUVsZW1lbnQ+ICYgeyBrZXk6IHN0cmluZyB9O1xuICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IGdldE9wdGlvbkxhYmVsKG9wdGlvbik7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBtYXRjaChvcHRpb25MYWJlbCwgc3RhdGUuaW5wdXRWYWx1ZSwge1xuICAgICAgICAgIGluc2lkZVdvcmRzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZShvcHRpb25MYWJlbCwgbWF0Y2hlcyk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkga2V5PXtrZXl9IHsuLi5vcHRpb25Qcm9wc30+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICB7cGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogcGFydC5oaWdobGlnaHQgPyA3MDAgOiA0MDAsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0LnRleHR9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oe1xuICBncmlkUHJvcHMsXG4gIC4uLnByb3BzXG59OiBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVE9wdGlvblxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj5cbiAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgIC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj4gey4uLnByb3BzfSAvPlxuICApO1xufTtcblxuQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnQXN5bmNTZWxlY3RNdWx0aSc7XG5cbmV4cG9ydCB7IEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50IH07XG4iLCAiaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzLCBQYXRoVmFsdWUgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgQ2hlY2tib3hFbGVtZW50UHJvcHMgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ2hlY2tib3hFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBDaGVja2JveEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGxhYmVsLFxuICAgIGxhYmVsUHJvcHMsXG4gICAgaGVscGVyVGV4dCxcbiAgICBwYXJzZUVycm9yLFxuICAgIHRyYW5zZm9ybSxcbiAgICBkaXNhYmxlZCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkaXNhYmxlZCxcbiAgfSk7XG5cbiAgaWYgKGZpZWxkLnZhbHVlID09IG51bGwgfHwgZmllbGQudmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgZmllbGQub25DaGFuZ2UoZmFsc2UpO1xuICB9XG5cbiAgY29uc3QgY3VzdG9tT3V0cHV0VHJhbnNmb3JtID0gdHJhbnNmb3JtPy5vdXRwdXQ7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBib29sZWFuPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiB2YWx1ZSA9PiAhIXZhbHVlLFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgY3VzdG9tT3V0cHV0VHJhbnNmb3JtID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyAoZXZlbnRPclZhbHVlLCBfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgLy8gQWRhcHRlcjogRXh0cmFjdCBldmVudCBhbmQgY2hlY2tlZCBmcm9tIHRoZSBjaGVja2JveCBvbkNoYW5nZSBzaWduYXR1cmVcbiAgICAgICAgICAgICAgLy8gQ2hlY2tib3hFbGVtZW50IHBhc3NlcyAoZXZlbnQsIGNoZWNrZWQpLCBidXQgdXNlVHJhbnNmb3JtIGV4cGVjdHMgKGV2ZW50T3JWYWx1ZSwgdmFsdWUpXG4gICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRPclZhbHVlIGFzIFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gX3ZhbHVlIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblxuICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tT3V0cHV0VHJhbnNmb3JtKGV2ZW50LCBjaGVja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IChldmVudE9yVmFsdWUsIF92YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAvLyBEZWZhdWx0OiBleHRyYWN0IGNoZWNrZWQgc3RhdGUgZnJvbSB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gX3ZhbHVlIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblxuICAgICAgICAgICAgICByZXR1cm4gY2hlY2tlZCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChcbiAgICBldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4sXG4gICAgY2hlY2tlZDogYm9vbGVhblxuICApID0+IHtcbiAgICBvbkNoYW5nZShldmVudCwgY2hlY2tlZCk7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQsIGNoZWNrZWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBkaXNwbGF5RXJyb3I6IFJlYWN0Tm9kZSA9IGVycm9yXG4gICAgPyB0eXBlb2YgcGFyc2VFcnJvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBwYXJzZUVycm9yKGVycm9yKVxuICAgICAgOiBlcnJvci5tZXNzYWdlXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfSBkaXNhYmxlZD17ZGlzYWJsZWR9PlxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgbGFiZWw9e2xhYmVsIHx8ICcnfVxuICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgY29sb3I9e3Jlc3QuY29sb3IgfHwgJ3ByaW1hcnknfVxuICAgICAgICAgICAgICBjaGVja2VkPXt2YWx1ZX1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICB7KGRpc3BsYXlFcnJvciB8fCBoZWxwZXJUZXh0KSAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICAgICAge2Rpc3BsYXlFcnJvciB8fCBoZWxwZXJUZXh0fVxuICAgICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIENoZWNrYm94IGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBncmlkIGxheW91dC5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgY2hlY2tib3ggaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgdmFsdWUgdHJhbnNmb3JtYXRpb24sIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24gd2l0aCB1c2VDb250cm9sbGVyXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmcgc3VwcG9ydFxuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiB3aXRoIHVzZVRyYW5zZm9ybSBob29rIGZvciBib29sZWFuIHZhbHVlc1xuICogLSBDdXN0b21pemFibGUgbGFiZWwgYW5kIHBvc2l0aW9uaW5nXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXIgd2l0aCByZXNwb25zaXZlIGRlc2lnblxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5IHdpdGggZ2VuZXJpYyBjb25zdHJhaW50c1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0IHdpdGggcHJvcGVyIHRoZW1pbmdcbiAqIC0gSGVscGVyIHRleHQgc3VwcG9ydCBmb3IgYWRkaXRpb25hbCBjb250ZXh0XG4gKiAtIEN1c3RvbSBlcnJvciBwYXJzaW5nIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvblxuICogLSBTaW1wbGUgYm9vbGVhbiB2YWx1ZSBoYW5kbGluZyB3aXRoIG9wdGlvbmFsIGN1c3RvbSB0cmFuc2Zvcm1zXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhY2NlcHRUZXJtc1wiXG4gKiAgIGxhYmVsPVwiSSBhZ3JlZSB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnNcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbGlkYXRpb24gYW5kIGhlbHBlciB0ZXh0OlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJuZXdzbGV0dGVyXCJcbiAqICAgbGFiZWw9XCJTdWJzY3JpYmUgdG8gbmV3c2xldHRlclwiXG4gKiAgIGhlbHBlclRleHQ9XCJZb3UgY2FuIHVuc3Vic2NyaWJlIGF0IGFueSB0aW1lXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdQbGVhc2UgYWNjZXB0IHRvIGNvbnRpbnVlJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBsYXlvdXQgYW5kIHN0eWxpbmc6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzUHVibGljXCJcbiAqICAgbGFiZWw9XCJNYWtlIHRoaXMgcHVibGljXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIGxhYmVsUHJvcHM9e3sgc3g6IHsgZm9udFdlaWdodDogJ2JvbGQnIH0gfX1cbiAqICAgc3g9e3sgY29sb3I6ICdwcmltYXJ5Lm1haW4nIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggdmFsdWUgdHJhbnNmb3JtYXRpb24gKHN0cmluZyB0byBib29sZWFuKTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwic3RhdHVzXCJcbiAqICAgbGFiZWw9XCJBY3RpdmVcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA9PT0gJ2FjdGl2ZScsXG4gKiAgICAgb3V0cHV0OiAoY2hlY2tlZCkgPT4gY2hlY2tlZCA/ICdhY3RpdmUnIDogJ2luYWN0aXZlJ1xuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBTaW1wbGUgYm9vbGVhbiBmaWVsZDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiaXNFbmFibGVkXCJcbiAqICAgbGFiZWw9XCJFbmFibGUgZmVhdHVyZVwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBlcnJvciBwYXJzaW5nIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbjpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidGVybXNcIlxuICogICBsYWJlbD1cIkFjY2VwdCBUZXJtc1wiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gdChgdmFsaWRhdGlvbi4ke2Vycm9yLnR5cGV9YCwgeyBmaWVsZDogJ1Rlcm1zJyB9KX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IENoZWNrYm94RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWU+IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5leHBvcnQgeyBDaGVja2JveEVsZW1lbnQgfTtcblxuZXhwb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgQ2hlY2tib3hQcm9wcyxcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBGb3JtTGFiZWxQcm9wcyxcbiAgR3JpZFByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIENoZWNrYm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgRm9ybUxhYmVsLFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIENoZWNrYm94R3JvdXAgY29tcG9uZW50XG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHZhbHVlIGFycmF5IHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cblxuLy8gVHlwZSBmb3IgcHJpbWl0aXZlIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIHJhZGlvIGJ1dHRvbiB2YWx1ZXNcbnR5cGUgUHJpbWl0aXZlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBDb25zdHJhaW50IHRvIGVuc3VyZSBvcHRpb24gb2JqZWN0cyBoYXZlIHRoZSByZXF1aXJlZCBrZXlzXG50eXBlIE9wdGlvbk9iamVjdDxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBQcmltaXRpdmVWYWx1ZT4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj47XG5cbmV4cG9ydCB0eXBlIENoZWNrYm94R3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+ID0gT21pdDxDaGVja2JveFByb3BzLCAnbmFtZSc+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICovXG4gIG5hbWU6IFROYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuXG4gIC8qKlxuICAgKiBMYWJlbCBmb3IgdGhlIGNoZWNrYm94IGdyb3VwXG4gICAqL1xuICBsYWJlbD86IEZvcm1Db250cm9sTGFiZWxQcm9wc1snbGFiZWwnXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgRm9ybUNvbnRyb2xMYWJlbFxuICAgKi9cbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCAnbGFiZWwnIHwgJ2NvbnRyb2wnPjtcblxuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyXG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuXG4gIG9wdGlvbnM6IFRPcHRpb25bXTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBmb3JtTGFiZWxQcm9wcz86IE9taXQ8Rm9ybUxhYmVsUHJvcHMsICdyZXF1aXJlZCcgfCAnZXJyb3InPjtcblxuICBsYWJlbEtleT86IFRMYWJlbEtleTtcbiAgdmFsdWVLZXk/OiBUVmFsdWVLZXk7XG4gIGRpc2FibGVkS2V5PzogVERpc2FibGVkS2V5O1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ2hlY2tib3hHcm91cDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+KFxuICBwcm9wczogQ2hlY2tib3hHcm91cFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uLFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGxhYmVsLFxuICAgIHJlcXVpcmVkLFxuICAgIGZvcm1MYWJlbFByb3BzLFxuICAgIGxhYmVsUHJvcHMsXG4gICAgbGFiZWxLZXkgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUtleSA9ICdWYWx1ZScgYXMgVFZhbHVlS2V5LFxuICAgIG9wdGlvbnMsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkaXNhYmxlZDogcmVzdC5kaXNhYmxlZCxcbiAgfSk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXNBc1N0cmluZyA9IChcbiAgICBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKSA/IGZpZWxkLnZhbHVlIDogW11cbiAgKS5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VkVmFsdWVTdHJpbmcgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcblxuICAgICAgY29uc3QgbmV3U2VsZWN0ZWRWYWx1ZXNTdHJpbmcgPSBpc0NoZWNrZWRcbiAgICAgICAgPyBbLi4uc2VsZWN0ZWRWYWx1ZXNBc1N0cmluZywgY2hhbmdlZFZhbHVlU3RyaW5nXVxuICAgICAgICA6IHNlbGVjdGVkVmFsdWVzQXNTdHJpbmcuZmlsdGVyKHYgPT4gdiAhPT0gY2hhbmdlZFZhbHVlU3RyaW5nKTtcblxuICAgICAgY29uc3Qgb3B0aW9uc0FyZU51bWVyaWMgPVxuICAgICAgICBvcHRpb25zLmxlbmd0aCA+IDAgJiYgdHlwZW9mIG9wdGlvbnNbMF1bdmFsdWVLZXldID09PSAnbnVtYmVyJztcblxuICAgICAgaWYgKG9wdGlvbnNBcmVOdW1lcmljKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlc0FzTnVtYmVycyA9IG5ld1NlbGVjdGVkVmFsdWVzU3RyaW5nXG4gICAgICAgICAgLm1hcCh2ID0+IHBhcnNlSW50KHYsIDEwKSlcbiAgICAgICAgICAuZmlsdGVyKHYgPT4gIWlzTmFOKHYpKTtcblxuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXNBc051bWJlcnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3U2VsZWN0ZWRWYWx1ZXNTdHJpbmcpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLCBvcHRpb25zLCB2YWx1ZUtleSwgc2VsZWN0ZWRWYWx1ZXNBc1N0cmluZ11cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICB7bGFiZWwgJiYgKFxuICAgICAgICA8Rm9ybUxhYmVsIHsuLi5mb3JtTGFiZWxQcm9wc30gcmVxdWlyZWQ9e3JlcXVpcmVkfSBlcnJvcj17ISFlcnJvcn0+XG4gICAgICAgICAge2xhYmVsfVxuICAgICAgICA8L0Zvcm1MYWJlbD5cbiAgICAgICl9XG4gICAgICA8Rm9ybUdyb3VwIHJvdz5cbiAgICAgICAge29wdGlvbnMgJiZcbiAgICAgICAgICBvcHRpb25zLm1hcChvcHRpb24gPT4gKFxuICAgICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICAgICAga2V5PXtgJHtvcHRpb25bdmFsdWVLZXldfWB9XG4gICAgICAgICAgICAgIGxhYmVsPXtvcHRpb25bbGFiZWxLZXldfVxuICAgICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgICAgIGNvbG9yPXtyZXN0LmNvbG9yIHx8ICdwcmltYXJ5J31cbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtvcHRpb25bdmFsdWVLZXldfVxuICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRWYWx1ZXNBc1N0cmluZy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgU3RyaW5nKG9wdGlvblt2YWx1ZUtleV0pXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3I9eyEhZXJyb3J9PntlcnJvci5tZXNzYWdlfTwvRm9ybUhlbHBlclRleHQ+XG4gICAgICApfVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQ2hlY2tib3hHcm91cCBjb21wb25lbnQgZm9yIG11bHRpcGxlIGNoZWNrYm94IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGdyb3VwIG9mIGNoZWNrYm94ZXMgdGhhdCB3b3JrIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBtYW5hZ2luZyBhbiBhcnJheSBvZiBzZWxlY3RlZCB2YWx1ZXMgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIE11bHRpcGxlIGNoZWNrYm94IHNlbGVjdGlvbiB3aXRoIGFycmF5IHZhbHVlIG1hbmFnZW1lbnRcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN1cHBvcnRcbiAqIC0gTmFOIHZhbGlkYXRpb24gZm9yIG51bWVyaWMgdmFsdWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hHcm91cFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwic2VsZWN0ZWRDYXRlZ29yaWVzXCJcbiAqICAgb3B0aW9ucz17W1xuICogICAgIHsgVmFsdWU6IDEsIExhYmVsOiAnQ2F0ZWdvcnkgMScgfSxcbiAqICAgICB7IFZhbHVlOiAyLCBMYWJlbDogJ0NhdGVnb3J5IDInIH0sXG4gKiAgICAgeyBWYWx1ZTogMywgTGFiZWw6ICdDYXRlZ29yeSAzJyB9LFxuICogICBdfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94R3JvdXBcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInBlcm1pc3Npb25zXCJcbiAqICAgb3B0aW9ucz17cGVybWlzc2lvbk9wdGlvbnN9XG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBkaXNhYmxlZD17IWhhc0VkaXRQZXJtaXNzaW9ufVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSBhcnJheSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDaGVja2JveEdyb3VwRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBDaGVja2JveEdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRPcHRpb24sXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBURGlzYWJsZWRLZXlcbj4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5DaGVja2JveEdyb3VwRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdDaGVja2JveEdyb3VwJztcblxuZXhwb3J0IHsgQ2hlY2tib3hHcm91cEVsZW1lbnQgfTtcbiIsICJpbXBvcnQgeyBHcmlkIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudENvcmUgfSBmcm9tIFwiLi9EYXRlUGlja2VyRWxlbWVudENvcmVcIjtcbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlckVsZW1lbnRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQSBmdWxseS1mZWF0dXJlZCwgdHlwZS1zYWZlIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCBmb3IgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IGNvbWJpbmVzIHRoZSBjb3JlIGRhdGUgcGlja2VyIGZ1bmN0aW9uYWxpdHkgd2l0aCBvcHRpb25hbCBHcmlkIGxheW91dCB3cmFwcGluZyxcbiAqIHByb3ZpZGluZyBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciBmb3JtLWJhc2VkIGRhdGUgc2VsZWN0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBUeXBlU2NyaXB0IHN1cHBvcnQuXG4gKlxuICogS2V5IEZlYXR1cmVzOlxuICogLSBcdUQ4M0NcdURGQUYgKipUeXBlIFNhZmV0eSoqOiBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzIGFuZCBkYXRlIHZhbHVlc1xuICogLSBcdUQ4M0RcdUREMjcgKipSZWFjdCBIb29rIEZvcm0gSW50ZWdyYXRpb24qKjogU2VhbWxlc3MgaW50ZWdyYXRpb24gd2l0aCByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvblxuICogLSBcdUQ4M0NcdURGQTggKipUaGVtaW5nKio6IEF1dG9tYXRpYyBhZGFwdGF0aW9uIHRvIE1VSSB0aGVtZSB3aXRoIGN1c3RvbWl6YWJsZSBzdHlsZXNcbiAqIC0gXHUyNjdGICoqQWNjZXNzaWJpbGl0eSoqOiBXQ0FHLWNvbXBsaWFudCB3aXRoIHByb3BlciBBUklBIGF0dHJpYnV0ZXMgYW5kIGtleWJvYXJkIG5hdmlnYXRpb25cbiAqIC0gXHVEODNEXHVERTgwICoqUGVyZm9ybWFuY2UqKjogT3B0aW1pemVkIHdpdGggbWVtb2l6YXRpb24gYW5kIGVmZmljaWVudCByZS1yZW5kZXJpbmdcbiAqIC0gXHVEODNEXHVEQ0YxICoqUmVzcG9uc2l2ZSoqOiBCdWlsdC1pbiBHcmlkIGxheW91dCB3aXRoIGNvbmZpZ3VyYWJsZSBicmVha3BvaW50c1xuICogLSBcdUQ4M0RcdURFRTFcdUZFMEYgKipWYWxpZGF0aW9uKio6IENvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlc1xuICogLSBcdUQ4M0RcdUREMDQgKipUcmFuc2Zvcm1hdGlvbioqOiBGbGV4aWJsZSB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIFx1RDgzRFx1RENEQSAqKkRldmVsb3BlciBFeHBlcmllbmNlKio6IFJpY2ggVHlwZVNjcmlwdCBJbnRlbGxpU2Vuc2UgYW5kIGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGF1dG9tYXRpYyBHcmlkIHdyYXBwZXI6XG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZUZvcm0gfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuICogaW1wb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfSBmcm9tICdAZ253ZWJzb2Z0L3VpL3dyYXBwZXJzJztcbiAqXG4gKiBmdW5jdGlvbiBNeUZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IGJpcnRoRGF0ZTogc3RyaW5nIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cImJpcnRoRGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJEYXRlIG9mIEJpcnRoXCJcbiAqICAgICAgIHJlcXVpcmVkXG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbiBhbmQgdmFsaWRhdGlvbjpcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQWR2YW5jZWRGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBzdGFydERhdGU6IERhdGUgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICBuYW1lPVwic3RhcnREYXRlXCJcbiAqICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICBsYWJlbD1cIlByb2plY3QgU3RhcnQgRGF0ZVwiXG4gKiAgICAgICB0cmFuc2Zvcm09e3tcbiAqICAgICAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS50b0lTT1N0cmluZygpIDogbnVsbFxuICogICAgICAgfX1cbiAqICAgICAgIHZhbGlkYXRpb249e3tcbiAqICAgICAgICAgbWluRGF0ZTogbmV3IERhdGUoKSxcbiAqICAgICAgICAgbWF4RGF0ZTogYWRkWWVhcnMobmV3IERhdGUoKSwgMiksXG4gKiAgICAgICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgICAgICBtaW5EYXRlOiAnU3RhcnQgZGF0ZSBtdXN0IGJlIHRvZGF5IG9yIGxhdGVyJyxcbiAqICAgICAgICAgICBtYXhEYXRlOiAnU3RhcnQgZGF0ZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDIgeWVhcnMgaW4gdGhlIGZ1dHVyZSdcbiAqICAgICAgICAgfVxuICogICAgICAgfX1cbiAqICAgICAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICAgICAgc3g9e3tcbiAqICAgICAgICAgJyYgLk11aUlucHV0TGFiZWwtcm9vdCc6IHtcbiAqICAgICAgICAgICBmb250V2VpZ2h0OiAnYm9sZCdcbiAqICAgICAgICAgfVxuICogICAgICAgfX1cbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGhvdXQgR3JpZCB3cmFwcGVyIGZvciBjdXN0b20gbGF5b3V0czpcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQ3VzdG9tTGF5b3V0KCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBldmVudERhdGU6IHN0cmluZyB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Qm94IGRpc3BsYXk9XCJmbGV4XCIgZ2FwPXsyfT5cbiAqICAgICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgICBuYW1lPVwiZXZlbnREYXRlXCJcbiAqICAgICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgICAgbGFiZWw9XCJFdmVudCBEYXRlXCJcbiAqICAgICAgICAgZ3JpZFByb3BzPXtmYWxzZX0gLy8gRGlzYWJsZXMgR3JpZCB3cmFwcGVyXG4gKiAgICAgICAvPlxuICogICAgICAgPEJ1dHRvbiB0eXBlPVwic3VibWl0XCI+U3VibWl0PC9CdXR0b24+XG4gKiAgICAgPC9Cb3g+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBsb2FkaW5nIHN0YXRlIGFuZCBjdXN0b20gZXJyb3IgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIExvYWRpbmdGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3QgW2lzVmFsaWRhdGluZywgc2V0SXNWYWxpZGF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICBuYW1lPVwiYXBwb2ludG1lbnREYXRlXCJcbiAqICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICBsYWJlbD1cIkFwcG9pbnRtZW50IERhdGVcIlxuICogICAgICAgbG9hZGluZz17aXNWYWxpZGF0aW5nfVxuICogICAgICAgTG9hZGluZ0NvbXBvbmVudD17KCkgPT4gPENpcmN1bGFyUHJvZ3Jlc3Mgc2l6ZT17MjB9IC8+fVxuICogICAgICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiB7XG4gKiAgICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yPy50eXBlID09PSAnY3VzdG9tJykge1xuICogICAgICAgICAgIHJldHVybiAnVGhpcyBkYXRlIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgYXBwb2ludG1lbnQnO1xuICogICAgICAgICB9XG4gKiAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdQbGVhc2Ugc2VsZWN0IGEgdmFsaWQgZGF0ZSc7XG4gKiAgICAgICB9fVxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGUgKGluZmVycmVkIGZyb20gY29udHJvbClcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGUgKGluZmVycmVkIGZyb20gbmFtZSBwcm9wKVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlIChpbmZlcnJlZCBmcm9tIHRyYW5zZm9ybSBmdW5jdGlvbnMpXG4gKiBAdGVtcGxhdGUgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSAtIFdoZXRoZXIgYWNjZXNzaWJsZSBmaWVsZCBET00gc3RydWN0dXJlIGlzIGVuYWJsZWRcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHMgd2l0aCBmdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlXG4gKiBAcGFyYW0gcmVmIC0gRm9yd2FyZCByZWYgZm9yIHRoZSByb290IGVsZW1lbnQgKEdyaWQgb3IgRGF0ZVBpY2tlciBjb250YWluZXIpXG4gKiBAcmV0dXJucyBSZW5kZXJlZCBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqL1xuY29uc3QgRGF0ZVBpY2tlckVsZW1lbnQgPSBmb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgRGF0ZVBpY2tlckVsZW1lbnRQcm9wczxhbnksIGFueSwgYW55LCBhbnk+XG4+KDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBwcm9wczogRGF0ZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUsIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICByZWY6IFJlYWN0LlJlZjxIVE1MRGl2RWxlbWVudD5cbikgPT4ge1xuICBjb25zdCB7XG4gICAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgICAuLi5jb3JlUHJvcHNcbiAgfSA9IHByb3BzO1xuXG4gIC8vIElmIGdyaWRQcm9wcyBpcyBleHBsaWNpdGx5IGZhbHNlLCByZW5kZXIgd2l0aG91dCBHcmlkIHdyYXBwZXJcbiAgaWYgKGdyaWRQcm9wcyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgey4uLmNvcmVQcm9wc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlbmRlciB3aXRoIEdyaWQgd3JhcHBlciBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRcbiAgcmV0dXJuIChcbiAgICA8R3JpZFxuICAgICAgcmVmPXtyZWZ9XG4gICAgICB7Li4uZ3JpZFByb3BzfVxuICAgID5cbiAgICAgIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAgICAgICAgey4uLmNvcmVQcm9wc31cbiAgICAgIC8+XG4gICAgPC9HcmlkPlxuICApO1xufSk7XG5cbi8vIFNldCBkaXNwbGF5IG5hbWUgZm9yIFJlYWN0IERldmVsb3BlciBUb29sc1xuRGF0ZVBpY2tlckVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIkRhdGVQaWNrZXJFbGVtZW50XCI7XG5cbmV4cG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXJFbGVtZW50O1xuIiwgImltcG9ydCB7IHVzZUZvcmtSZWYgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IERhdGVQaWNrZXIgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB0eXBlIHtcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG4gIFBpY2tlclZhbGlkRGF0ZSxcbn0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIEZpZWxkUGF0aCB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7XG4gIHVzZURhdGVQaWNrZXJWYWx1ZSxcbiAgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24sXG4gIHVzZURhdGVQaWNrZXJTdHlsZXMsXG59IGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFRoZSBjb3JlIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRob3V0IEdyaWQgd3JhcHBlci5cbiAqXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQsIHBlcmZvcm1hbnQgZGF0ZSBwaWNrZXIgY29tcG9uZW50IHRoYXQgaW50ZWdyYXRlcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSB3aGlsZSBwcm92aWRpbmcgY29tcHJlaGVuc2l2ZSBUeXBlU2NyaXB0IHN1cHBvcnQgYW5kXG4gKiBhY2Nlc3NpYmlsaXR5IGZlYXR1cmVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzXG4gKiAtIEF1dG9tYXRpYyB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIENvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlc1xuICogLSBUaGVtZS1hd2FyZSBzdHlsaW5nIHdpdGggYWNjZXNzaWJpbGl0eSBzdXBwb3J0XG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXplZCB3aXRoIHByb3BlciBtZW1vaXphdGlvblxuICogLSBGb3J3YXJkIHJlZiBzdXBwb3J0IGZvciBhZHZhbmNlZCB1c2UgY2FzZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAqICAgbmFtZT1cImJpcnRoRGF0ZVwiXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgIHJlcXVpcmVkXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIlN0YXJ0IERhdGVcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfX1cbiAqICAgdmFsaWRhdGlvbj17e1xuICogICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcidcbiAqICAgICB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudENvcmUgPSBmb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPihcbiAgPFxuICAgIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gICAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICAgIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICA+KFxuICAgIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wczxcbiAgICAgIFRGaWVsZFZhbHVlcyxcbiAgICAgIFROYW1lLFxuICAgICAgVFZhbHVlLFxuICAgICAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZVxuICAgID4sXG4gICAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4gICkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICByZXF1aXJlZCA9IGZhbHNlLFxuICAgICAgY29udHJvbCxcbiAgICAgIHBhcnNlRXJyb3IsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICB2YWxpZGF0aW9uLFxuICAgICAgbGFiZWwsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHRleHRSZWFkT25seSA9IGZhbHNlLFxuICAgICAgaGVscGVyVGV4dCxcbiAgICAgIGlucHV0UHJvcHMgPSB7fSxcbiAgICAgIHNsb3RQcm9wcyA9IHt9LFxuICAgICAgZGF0ZVBpY2tlclByb3BzID0ge30sXG4gICAgICB2YXJpYW50ID0gJ291dGxpbmVkJyxcbiAgICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgICAuLi5yZXN0UHJvcHNcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvLyBFeHRyYWN0IERhdGVQaWNrZXItc3BlY2lmaWMgcHJvcHNcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlucHV0UmVmOiBleHRlcm5hbElucHV0UmVmLFxuICAgICAgb25DbG9zZSxcbiAgICAgIC4uLnJlc3REYXRlUGlja2VyUHJvcHNcbiAgICB9ID0gZGF0ZVBpY2tlclByb3BzO1xuXG4gICAgLy8gU2V0IHVwIGZvcm0gY29udHJvbGxlclxuICAgIGNvbnN0IHsgZmllbGQsIGZpZWxkU3RhdGUgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgICAgbmFtZSxcbiAgICAgIGNvbnRyb2wsXG4gICAgICBkZWZhdWx0VmFsdWU6IG51bGwgYXMgYW55LCAvLyBMZXQgcmVhY3QtaG9vay1mb3JtIGhhbmRsZSB0aGUgZGVmYXVsdCB2YWx1ZSB0eXBpbmdcbiAgICB9KTtcblxuICAgIC8vIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGhvb2tcbiAgICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZTogb25WYWx1ZUNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAgICAgIGZpZWxkLFxuICAgICAgdHJhbnNmb3JtLFxuICAgIH0pO1xuXG4gICAgLy8gVmFsaWRhdGlvbiBob29rXG4gICAgY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlLCBpbnZhbGlkIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gICAgICBmaWVsZFN0YXRlLFxuICAgICAgdmFsaWRhdGlvbixcbiAgICAgIHBhcnNlRXJyb3IsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcblxuICAgIC8vIFN0eWxpbmcgaG9va1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lIH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAgICAgIGRpc2FibGVkLFxuICAgICAgaGFzRXJyb3IsXG4gICAgICBsb2FkaW5nLFxuICAgICAgdGV4dFJlYWRPbmx5LFxuICAgIH0pO1xuXG4gICAgLy8gTWVyZ2UgaW5wdXQgcmVmc1xuICAgIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGV4dGVybmFsSW5wdXRSZWYpO1xuXG4gICAgLy8gTWVtb2l6ZWQgY2hhbmdlIGhhbmRsZXIgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgICAoXG4gICAgICAgIG5ld1ZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgICAgICBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPlxuICAgICAgKSA9PiB7XG4gICAgICAgIG9uVmFsdWVDaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIFtvblZhbHVlQ2hhbmdlXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBjbG9zZSBoYW5kbGVyXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSB1c2VDYWxsYmFjayhcbiAgICAgICguLi5hcmdzOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPHR5cGVvZiBvbkNsb3NlPj4pID0+IHtcbiAgICAgICAgLy8gVHJpZ2dlciBmb3JtIGZpZWxkIGJsdXIgZm9yIHZhbGlkYXRpb25cbiAgICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkNsb3NlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgICAgb25DbG9zZSguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICAgIFtmaWVsZC5vbkJsdXIsIG9uQ2xvc2VdXG4gICAgKTtcblxuICAgIC8vIE1lbW9pemVkIGJsdXIgaGFuZGxlciBmb3IgdGV4dCBmaWVsZFxuICAgIGNvbnN0IGhhbmRsZVRleHRGaWVsZEJsdXIgPSB1c2VDYWxsYmFjayhcbiAgICAgIChldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcblxuICAgICAgICAvLyBDYWxsIGV4dGVybmFsIG9uQmx1ciBpZiBwcm92aWRlZFxuICAgICAgICBpZiAodHlwZW9mIGlucHV0UHJvcHMub25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgICAgW2ZpZWxkLm9uQmx1ciwgaW5wdXRQcm9wcy5vbkJsdXJdXG4gICAgKTtcblxuICAgIC8vIE1lbW9pemVkIHNsb3QgcHJvcHMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gICAgY29uc3QgbWVtb2l6ZWRTbG90UHJvcHMgPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgLi4uc2xvdFByb3BzLFxuICAgICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ3RvZGF5JywgJ2NhbmNlbCcsICdhY2NlcHQnXSBhcyBBcnJheTxcbiAgICAgICAgICAgICdhY2NlcHQnIHwgJ2NhbmNlbCcgfCAnY2xlYXInIHwgJ25leHQnIHwgJ25leHRPckFjY2VwdCcgfCAndG9kYXknXG4gICAgICAgICAgPixcbiAgICAgICAgICAuLi5zbG90UHJvcHMuYWN0aW9uQmFyLFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgICB2YXJpYW50LFxuICAgICAgICAgIG9uQmx1cjogaGFuZGxlVGV4dEZpZWxkQmx1cixcbiAgICAgICAgICBlcnJvcjogaGFzRXJyb3IsXG4gICAgICAgICAgaGVscGVyVGV4dDogaGFzRXJyb3IgPyBlcnJvck1lc3NhZ2UgOiBoZWxwZXJUZXh0LFxuICAgICAgICAgIGlucHV0UHJvcHM6IHtcbiAgICAgICAgICAgIHJlYWRPbmx5OiB0ZXh0UmVhZE9ubHksXG4gICAgICAgICAgICAnYXJpYS1pbnZhbGlkJzogaW52YWxpZCxcbiAgICAgICAgICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogaGFzRXJyb3IgPyBgJHtuYW1lfS1lcnJvcmAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAuLi5pbnB1dFByb3BzLmlucHV0UHJvcHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3IgaWYgcHJvdmlkZWRcbiAgICAgICAgICAuLi4obG9hZGluZyAmJlxuICAgICAgICAgICAgTG9hZGluZ0NvbXBvbmVudCAmJiB7XG4gICAgICAgICAgICAgIElucHV0UHJvcHM6IHtcbiAgICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IDxMb2FkaW5nQ29tcG9uZW50IC8+LFxuICAgICAgICAgICAgICAgIC4uLmlucHV0UHJvcHMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIC4uLnNsb3RQcm9wcy50ZXh0RmllbGQsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIFtcbiAgICAgICAgc2xvdFByb3BzLFxuICAgICAgICBpbnB1dFByb3BzLFxuICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgIHZhcmlhbnQsXG4gICAgICAgIGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgICAgIGhhc0Vycm9yLFxuICAgICAgICBlcnJvck1lc3NhZ2UsXG4gICAgICAgIGhlbHBlclRleHQsXG4gICAgICAgIHRleHRSZWFkT25seSxcbiAgICAgICAgaW52YWxpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgICAgIF1cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgIC8vIFNwcmVhZCByZXN0IHByb3BzIGZpcnN0IHNvIHRoZXkgY2FuIGJlIG92ZXJyaWRkZW5cbiAgICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgICAgey4uLnJlc3REYXRlUGlja2VyUHJvcHN9XG4gICAgICAgIC8vIENvcmUgcHJvcHNcbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIG5hbWU9e25hbWV9XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XG4gICAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgICAgLy8gVUkgcHJvcHNcbiAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAvLyBTbG90IHByb3BzXG4gICAgICAgIHNsb3RQcm9wcz17bWVtb2l6ZWRTbG90UHJvcHN9XG4gICAgICAgIC8vIEFjY2Vzc2liaWxpdHkgcHJvcHNcbiAgICAgICAgYXJpYS1pbnZhbGlkPXtpbnZhbGlkfVxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PXtoYXNFcnJvciA/IGAke25hbWV9LWVycm9yYCA6IHVuZGVmaW5lZH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuKTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgZGVidWdnaW5nXG5EYXRlUGlja2VyRWxlbWVudENvcmUuZGlzcGxheU5hbWUgPSAnRGF0ZVBpY2tlckVsZW1lbnRDb3JlJztcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXJFbGVtZW50Q29yZTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJSZXR1cm4sXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBEYXRlVHJhbnNmb3JtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogVHlwZS1zYWZlIGRhdGUgdmFsdWUgcmVhZGVyIHRoYXQgaGFuZGxlcyBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIGZyb20gdGhlIGRhdGUgYWRhcHRlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSBNVUkgZGF0ZSBwaWNrZXJzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoc3RyaW5nLCBkYXRlLCBvciBudWxsKVxuICogQHJldHVybnMgUHJvcGVybHkgdHlwZWQgZGF0ZSB2YWx1ZSBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGUgfCB1bmRlZmluZWRcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIGEgZGF0ZVxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgcmV0dXJuIHBhcnNlZERhdGUgYXMgVERhdGU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgY29udHJvbGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBmaWVsZDogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdO1xuICAvKiogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zICovXG4gIHRyYW5zZm9ybT86IERhdGVUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPiB7XG4gIC8qKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlciAqL1xuICB2YWx1ZTogVFZhbHVlIHwgbnVsbDtcbiAgLyoqIENoYW5nZSBoYW5kbGVyIGZvciBwaWNrZXIgdmFsdWUgdXBkYXRlcyAqL1xuICBvbkNoYW5nZTogKFxuICAgIHZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+XG4gICkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWx1ZSB0cmFuc2Zvcm1hdGlvbnMgd2l0aCB0eXBlIHNhZmV0eVxuICogXG4gKiBUaGlzIGhvb2sgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIGZvcm0gZmllbGQgdmFsdWVzIGFuZCBkYXRlIHBpY2tlciB2YWx1ZXMsXG4gKiBhcHBseWluZyBjdXN0b20gdHJhbnNmb3JtYXRpb25zIHdoaWxlIG1haW50YWluaW5nIHN0cmljdCBUeXBlU2NyaXB0IHR5cGluZy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFVzYWdlIHdpdGggRGF5LmpzIGRhdGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IGRheWpzKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB2YWx1ZSB0cmFuc2Zvcm1hdGlvblxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdHJhbnNmb3JtZWQgdmFsdWUgYW5kIGNoYW5nZSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlPiB7XG4gIGNvbnN0IHsgZmllbGQsIHRyYW5zZm9ybSB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICAvLyBUcmFuc2Zvcm0gdGhlIGZpZWxkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXJcbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKCgpOiBUVmFsdWUgfCBudWxsID0+IHtcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybS5pbnB1dChmaWVsZC52YWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IGhhbmRsZSBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gICAgcmV0dXJuIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGUoYWRhcHRlciwgZmllbGQudmFsdWUpIGFzIFRWYWx1ZSB8IG51bGw7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZmllbGQudmFsdWUsIHRyYW5zZm9ybT8uaW5wdXQsIGFkYXB0ZXJdKTtcblxuICAvLyBDcmVhdGUgYSBzdGFibGUgY2hhbmdlIGhhbmRsZXJcbiAgY29uc3Qgb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3VmFsdWU6IFRWYWx1ZSB8IG51bGwsIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybS5vdXRwdXQobmV3VmFsdWUsIGNvbnRleHQpO1xuXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRyYW5zZm9ybWVkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0cmFuc2Zvcm1hdGlvbjogc3RvcmUgdGhlIGRhdGUgYXMtaXNcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbZmllbGQub25DaGFuZ2UsIHRyYW5zZm9ybT8ub3V0cHV0XVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWx1ZTsiLCAiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24gaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgc3RhdGUgZnJvbSByZWFjdC1ob29rLWZvcm0gY29udHJvbGxlciAqL1xuICBmaWVsZFN0YXRlOiBVc2VDb250cm9sbGVyUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wiZmllbGRTdGF0ZVwiXTtcbiAgLyoqIFZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGRhdGUgcGlja2VyICovXG4gIHZhbGlkYXRpb24/OiBEYXRlUGlja2VyVmFsaWRhdGlvbkNvbmZpZzxUVmFsdWU+O1xuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBUaGUgY3VycmVudCBkYXRlIHZhbHVlIGZvciB2YWxpZGF0aW9uICovXG4gIHZhbHVlPzogVFZhbHVlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBoYXMgYW55IHZhbGlkYXRpb24gZXJyb3JzICovXG4gIGhhc0Vycm9yOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBlcnJvciAoZm9ybSBvciBkYXRlLXNwZWNpZmljKSAqL1xuICBlcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U6IFJlYWN0Tm9kZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGluIGFuIGludmFsaWQgc3RhdGUgKi9cbiAgaW52YWxpZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGVycm9yIG1lc3NhZ2VzIGZvciBjb21tb24gZGF0ZSB2YWxpZGF0aW9uIHNjZW5hcmlvc1xuICovXG5jb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTID0ge1xuICBpbnZhbGlkRGF0ZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIsXG4gIG1pbkRhdGU6IFwiRGF0ZSBtdXN0IGJlIGFmdGVyIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBtYXhEYXRlOiBcIkRhdGUgbXVzdCBiZSBiZWZvcmUgdGhlIG1heGltdW0gYWxsb3dlZCBkYXRlXCIsXG4gIGRpc2FibGVkRGF0ZTogXCJUaGlzIGRhdGUgaXMgbm90IGFsbG93ZWRcIixcbiAgcmVxdWlyZWQ6IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWxpZGF0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBlcnJvciBoYW5kbGluZ1xuICogXG4gKiBUaGlzIGhvb2sgY2VudHJhbGl6ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgZGF0ZSBwaWNrZXJzLCBoYW5kbGluZyBib3RoXG4gKiByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbiBlcnJvcnNcbiAqIGZyb20gTVVJIGRhdGUgcGlja2Vycy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggZm9ybSB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgdmFsaWRhdGlvbjoge1xuICogICAgIG1pbkRhdGU6IGRheWpzKCkuc3VidHJhY3QoMSwgJ3llYXInKSxcbiAqICAgICBtYXhEYXRlOiBkYXlqcygpLmFkZCgxLCAneWVhcicpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdEYXRlIG11c3QgYmUgd2l0aGluIHRoZSBsYXN0IHllYXInLFxuICogICAgICAgbWF4RGF0ZTogJ0RhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAxIHllYXIgaW4gdGhlIGZ1dHVyZSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIGN1c3RvbSBlcnJvciBwYXJzZXI6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICogICBmaWVsZFN0YXRlLFxuICogICBwYXJzZUVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICogICAgICAgcmV0dXJuIGBEYXRlIEVycm9yOiAke2Vycm9yfWA7XG4gKiAgICAgfVxuICogICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdJbnZhbGlkIGRhdGUnO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHBhcmFtIG9wdGlvbnMgLSBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVmFsaWRhdGlvbiBzdGF0ZSBhbmQgZXJyb3IgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIGNvbnN0IHsgZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgcGFyc2VFcnJvciwgdmFsdWUgfSA9IG9wdGlvbnM7XG5cbiAgLy8gTWVtb2l6ZSB2YWxpZGF0aW9uIHJlc3VsdHMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IGVycm9yOiBmaWVsZEVycm9yLCBpbnZhbGlkIH0gPSBmaWVsZFN0YXRlO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggZm9ybSB2YWxpZGF0aW9uIGVycm9yXG4gICAgbGV0IGN1cnJlbnRFcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQgPSBmaWVsZEVycm9yO1xuICAgIFxuICAgIC8vIENoZWNrIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbnMgaWYgbm8gZm9ybSBlcnJvciBhbmQgd2UgaGF2ZSBhIHZhbHVlXG4gICAgaWYgKCFmaWVsZEVycm9yICYmIHZhbHVlICYmIHZhbGlkYXRpb24pIHtcbiAgICAgIGNvbnN0IHsgbWluRGF0ZSwgbWF4RGF0ZSwgc2hvdWxkRGlzYWJsZURhdGUsIGVycm9yTWVzc2FnZXMgfSA9IHZhbGlkYXRpb247XG4gICAgICBcbiAgICAgIC8vIENoZWNrIG1pbmltdW0gZGF0ZVxuICAgICAgaWYgKG1pbkRhdGUgJiYgdmFsdWUgPCBtaW5EYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWluRGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWluRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1pbkRhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBtYXhpbXVtIGRhdGVcbiAgICAgIGVsc2UgaWYgKG1heERhdGUgJiYgdmFsdWUgPiBtYXhEYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWF4RGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWF4RGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1heERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBkaXNhYmxlZCBkYXRlXG4gICAgICBlbHNlIGlmIChzaG91bGREaXNhYmxlRGF0ZSAmJiBzaG91bGREaXNhYmxlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgY3VycmVudEVycm9yID0ge1xuICAgICAgICAgIHR5cGU6ICdkaXNhYmxlZERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/LmRpc2FibGVkRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIERhdGVWYWxpZGF0aW9uRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhhc0Vycm9yID0gQm9vbGVhbihjdXJyZW50RXJyb3IpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcixcbiAgICAgIGVycm9yOiBjdXJyZW50RXJyb3IsXG4gICAgICBpbnZhbGlkOiBpbnZhbGlkIHx8IGhhc0Vycm9yLFxuICAgIH07XG4gIH0sIFtmaWVsZFN0YXRlLCB2YWxpZGF0aW9uLCB2YWx1ZV0pO1xuXG4gIC8vIE1lbW9pemUgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHVzZU1lbW8oKCk6IFJlYWN0Tm9kZSA9PiB7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgY3VzdG9tIGVycm9yIHBhcnNlciBpZiBwcm92aWRlZFxuICAgIGlmIChwYXJzZUVycm9yKSB7XG4gICAgICByZXR1cm4gcGFyc2VFcnJvcih2YWxpZGF0aW9uUmVzdWx0LmVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoJ21lc3NhZ2UnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgJiYgdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGVycm9yIG1lc3NhZ2VzIGJhc2VkIG9uIGVycm9yIHR5cGVcbiAgICBpZiAoJ3R5cGUnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3IudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLnJlcXVpcmVkO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZTtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICB9LCBbdmFsaWRhdGlvblJlc3VsdC5lcnJvciwgcGFyc2VFcnJvcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4udmFsaWRhdGlvblJlc3VsdCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uOyIsICJpbXBvcnQgdHlwZSB7IFN4UHJvcHMsIFRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZVRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMge1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgYSB2YWxpZGF0aW9uIGVycm9yICovXG4gIGhhc0Vycm9yPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBsb2FkaW5nIHN0YXRlICovXG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdGV4dCBpbnB1dCBpcyByZWFkLW9ubHkgKi9cbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIEN1c3RvbSBzdHlsZXMgdG8gbWVyZ2Ugd2l0aCBkZWZhdWx0cyAqL1xuICBzeD86IFN4UHJvcHM8VGhlbWU+O1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIC8qKiBDb21wdXRlZCBzdHlsZXMgZm9yIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnQgKi9cbiAgc3g6IFN4UHJvcHM8VGhlbWU+O1xuICAvKiogQWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3Igc3R5bGluZyAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgdGhlbWUtYXdhcmUgZGF0ZSBwaWNrZXIgc3R5bGVzIHdpdGggY29uc2lzdGVudCBkZXNpZ24gc3lzdGVtIGludGVncmF0aW9uXG4gKiBcbiAqIFRoaXMgaG9vayBwcm92aWRlcyBvcHRpbWl6ZWQsIG1lbW9pemVkIHN0eWxlcyBmb3IgZGF0ZSBwaWNrZXIgY29tcG9uZW50cyB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGFkYXB0IHRvIHRoZSBjdXJyZW50IE1VSSB0aGVtZSBhbmQgY29tcG9uZW50IHN0YXRlIChkaXNhYmxlZCwgZXJyb3IsIGxvYWRpbmcsIGV0Yy4pLlxuICogSXQgZW5zdXJlcyBjb25zaXN0ZW50IHN0eWxpbmcgYWNyb3NzIGFsbCBkYXRlIHBpY2tlciBpbnN0YW5jZXMgd2hpbGUgYWxsb3dpbmcgY3VzdG9taXphdGlvbi5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHN4IH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAqICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBsb2FkaW5nOiBpc0xvYWRpbmdcbiAqIH0pO1xuICogXG4gKiByZXR1cm4gPERhdGVQaWNrZXIgc3g9e3N4fSAuLi4gLz47XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHN0eWxlczpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBzeDoge1xuICogICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICBjb2xvcjogJ3ByaW1hcnkubWFpbidcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3R5bGUgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBDb21wdXRlZCBzdHlsZXMgYW5kIGNsYXNzIG5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyU3R5bGVzKFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyU3R5bGVzT3B0aW9ucyA9IHt9XG4pOiBVc2VEYXRlUGlja2VyU3R5bGVzUmV0dXJuIHtcbiAgY29uc3QgeyBkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seSwgc3g6IGN1c3RvbVN4IH0gPSBvcHRpb25zO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gTWVtb2l6ZSBjb21wdXRlZCBzdHlsZXMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IGNvbXB1dGVkU3ggPSB1c2VNZW1vKCgpOiBTeFByb3BzPFRoZW1lPiA9PiB7XG4gICAgY29uc3QgYmFzZVN0eWxlczogU3hQcm9wczxUaGVtZT4gPSB7XG4gICAgICAvLyBJbnB1dCBmaWVsZCBzdHlsaW5nXG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQgXG4gICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIFxuICAgICAgICAvLyBUcmFuc2l0aW9uIGZvciBzbW9vdGggc3RhdGUgY2hhbmdlc1xuICAgICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoW1xuICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgICAgICAnYm9yZGVyLWNvbG9yJyxcbiAgICAgICAgICAnY29sb3InXG4gICAgICAgIF0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuZHVyYXRpb24uc2hvcnQsXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIEVycm9yIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLk11aS1mb2N1c2VkJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAgIGJveFNoYWRvdzogYDAgMCAwIDJweCAke3RoZW1lLnBhbGV0dGUuZXJyb3IubWFpbn0yNWAsIC8vIDI1IGlzIDE1JSBvcGFjaXR5IGluIGhleFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGUgc3R5bGluZ1xuICAgICAgICAuLi4obG9hZGluZyAmJiB7XG4gICAgICAgICAgb3BhY2l0eTogMC43LFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnB1dCBlbGVtZW50IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IFwibm90LWFsbG93ZWRcIiBcbiAgICAgICAgICA6IHRleHRSZWFkT25seSBcbiAgICAgICAgICAgID8gXCJwb2ludGVyXCIgXG4gICAgICAgICAgICA6IFwidGV4dFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gUmVhZC1vbmx5IHNwZWNpZmljIHN0eWxpbmdcbiAgICAgICAgLi4uKHRleHRSZWFkT25seSAmJiAhZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgdXNlclNlbGVjdDogXCJub25lXCIsXG4gICAgICAgICAgY2FyZXRDb2xvcjogXCJ0cmFuc3BhcmVudFwiLCAvLyBIaWRlIHRleHQgY3Vyc29yIGluIHJlYWQtb25seSBtb2RlXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGVcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJ3YWl0XCIsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gUmVxdWlyZWQgZmllbGQgYXN0ZXJpc2sgc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgXG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIGZvbnRTaXplOiBcIjEuMmVtXCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBMYWJlbCBzdHlsaW5nIHdpdGggYmV0dGVyIGNvbnRyYXN0XG4gICAgICBcIiYgLk11aUlucHV0TGFiZWwtcm9vdFwiOiB7XG4gICAgICAgIGNvbG9yOiBoYXNFcnJvciBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiBcbiAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUudGV4dC5zZWNvbmRhcnksXG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgcHJvcGVyIGNvbnRyYXN0IGZvciBkaXNhYmxlZCBzdGF0ZVxuICAgICAgICAuLi4oZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQuZGlzYWJsZWQsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSGVscGVyIHRleHQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlGb3JtSGVscGVyVGV4dC1yb290XCI6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogdGhlbWUuc3BhY2luZygxKSxcbiAgICAgICAgbWFyZ2luUmlnaHQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIFxuICAgICAgICAvLyBFcnJvciBzdGF0ZVxuICAgICAgICAuLi4oaGFzRXJyb3IgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gQ2FsZW5kYXIgaWNvbiBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QWRvcm5tZW50LXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZCBcbiAgICAgICAgICA6IGhhc0Vycm9yIFxuICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmFjdGl2ZSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZvY3VzIHJpbmcgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1mb2N1c2VkXCI6IHtcbiAgICAgICAgb3V0bGluZTogYDJweCBzb2xpZCAke3RoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWlufTUwYCwgLy8gNTAgaXMgMzElIG9wYWNpdHlcbiAgICAgICAgb3V0bGluZU9mZnNldDogXCIycHhcIixcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuaGFuY2VkIGNvbnRyYXN0IGZvciBkYXJrIHRoZW1lc1xuICAgICAgLi4uKHRoZW1lLnBhbGV0dGUubW9kZSA9PT0gJ2RhcmsnICYmIHtcbiAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIC8vIE1lcmdlIHdpdGggY3VzdG9tIHN0eWxlc1xuICAgIHJldHVybiBjdXN0b21TeCA/IFtiYXNlU3R5bGVzLCBjdXN0b21TeF0gYXMgU3hQcm9wczxUaGVtZT4gOiBiYXNlU3R5bGVzO1xuICB9LCBbXG4gICAgdGhlbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgaGFzRXJyb3IsXG4gICAgbG9hZGluZyxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgY3VzdG9tU3gsXG4gIF0pO1xuXG4gIC8vIEdlbmVyYXRlIGFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIGV4dGVybmFsIHN0eWxpbmcgaG9va3NcbiAgY29uc3QgY2xhc3NOYW1lID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICBpZiAoZGlzYWJsZWQpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWRpc2FibGVkJyk7XG4gICAgaWYgKGhhc0Vycm9yKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1lcnJvcicpO1xuICAgIGlmIChsb2FkaW5nKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1sb2FkaW5nJyk7XG4gICAgaWYgKHRleHRSZWFkT25seSkgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tcmVhZE9ubHknKTtcbiAgICBcbiAgICByZXR1cm4gY2xhc3Nlcy5sZW5ndGggPiAwID8gY2xhc3Nlcy5qb2luKCcgJykgOiB1bmRlZmluZWQ7XG4gIH0sIFtkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seV0pO1xuXG4gIHJldHVybiB7XG4gICAgc3g6IGNvbXB1dGVkU3gsXG4gICAgY2xhc3NOYW1lLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyU3R5bGVzOyIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIEZpZWxkUGF0aCwgUGF0aFZhbHVlIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSBmb3IgY3JlYXRpbmcgYnJhbmRlZCBkYXRlIHR5cGVzIHRvIHByZXZlbnQgbWl4aW5nIGRpZmZlcmVudCBkYXRlIGZvcm1hdHNcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBiYXNlIGRhdGUgdHlwZVxuICogQHRlbXBsYXRlIFRCcmFuZCAtIFRoZSBicmFuZCBzdHJpbmcgZm9yIHR5cGUgc2FmZXR5XG4gKi9cbmV4cG9ydCB0eXBlIEJyYW5kZWREYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlLCBUQnJhbmQgZXh0ZW5kcyBzdHJpbmc+ID0gXG4gIFREYXRlICYgeyByZWFkb25seSBfX2JyYW5kOiBUQnJhbmQgfTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZS1saWtlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQaWNrZXJWYWxpZERhdGUge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBEYXRlIG9iamVjdFxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGRhdGUtbGlrZSBvYmplY3RzIHdpdGggY29tbW9uIGRhdGUgbGlicmFyeSBtZXRob2RzXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgLy8gRGF5LmpzLCBNb21lbnQuanMsIG9yIHNpbWlsYXJcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuaXNWYWxpZCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMdXhvbiBEYXRlVGltZVxuICAgIGlmICgnaXNWYWxpZCcgaW4gdmFsdWUgJiYgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgYSBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGFyc2VhYmxlIGRhdGUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnNhYmxlRGF0ZVN0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEJhc2ljIElTTyBkYXRlIGZvcm1hdCBjaGVja1xuICBjb25zdCBpc29EYXRlUmVnZXggPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9KD86VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezN9KT8oPzpafFsrLV1cXGR7Mn06XFxkezJ9KT8pPyQvO1xuXG4gIGlmIChpc29EYXRlUmVnZXgudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIERhdGUgY29uc3RydWN0b3IgY2FuIHBhcnNlIGl0XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHZhbHVlKTtcblxuICByZXR1cm4gIWlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGUgcGlja2VyIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgZGF0ZSBhZGFwdGVyIGZyb20gTVVJIGxvY2FsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlSW5wdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4pIHtcbiAgcmV0dXJuICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogVERhdGUgfCBudWxsID0+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGFkYXB0ZXIudXRpbHMuZGF0ZSh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVmFsaWREYXRlKHBhcnNlZCkgPyAocGFyc2VkIGFzIFREYXRlKSA6IG51bGw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFREYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGRhdGUgcGlja2VyIHZhbHVlcyBiYWNrIHRvIGZvcm0gdmFsdWVzXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGUgdXNlZCBieSB0aGUgcGlja2VyXG4gKiBAcGFyYW0gZm9ybWF0IC0gVGhlIGZvcm1hdCB0byB1c2UgZm9yIHN0cmluZyBjb252ZXJzaW9uIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEEgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBzYWZlbHkgY29udmVydHMgZGF0ZXMgdG8gZm9ybSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGVPdXRwdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oZm9ybWF0Pzogc3RyaW5nKSB7XG4gIHJldHVybiAodmFsdWU6IFREYXRlIHwgbnVsbCk6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIC8vIElmIG5vIGZvcm1hdCBzcGVjaWZpZWQsIHJldHVybiB0aGUgZGF0ZSBhcy1pc1xuICAgIGlmICghZm9ybWF0KSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGRhdGUgbGlicmFyeSBmb3JtYXRzXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdpc28nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RhdGUtb25seScpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEYXkuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBNb21lbnQuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBMdXhvbiBmb3JtYXRcbiAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSkudG9Gb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjazogcmV0dXJuIGFzLWlzXG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBkZWZhdWx0IGRhdGUgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGVcbiAqIEByZXR1cm5zIERlZmF1bHQgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRlUGlja2VyQ29uZmlnPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPigpIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBEZWZhdWx0IHNsb3QgcHJvcHMgZm9yIGNvbnNpc3RlbnQgYmVoYXZpb3JcbiAgICBzbG90UHJvcHM6IHtcbiAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ3RvZGF5JywgJ2NhbmNlbCcsICdhY2NlcHQnXSBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICB2YXJpYW50OiAnb3V0bGluZWQnIGFzIGNvbnN0LFxuICAgICAgfSxcbiAgICB9LFxuICAgIFxuICAgIC8vIERlZmF1bHQgZ3JpZCBwcm9wcyBmb3IgbGF5b3V0IGNvbnNpc3RlbmN5XG4gICAgZ3JpZFByb3BzOiB7XG4gICAgICBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gYXMgY29uc3QsXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IHZhbGlkYXRpb24gY29uZmlndXJhdGlvblxuICAgIHZhbGlkYXRpb246IHtcbiAgICAgIGVycm9yTWVzc2FnZXM6IHtcbiAgICAgICAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICAgICAgICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICAgICAgICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0gYXMgY29uc3Q7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBzYWZlbHkgZXh0cmFjdCBlcnJvciBtZXNzYWdlIGZyb20gdmFyaW91cyBlcnJvciB0eXBlc1xuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCAoY291bGQgYmUgZnJvbSByZWFjdC1ob29rLWZvcm0gb3IgTVVJIGRhdGUgcGlja2VyKVxuICogQHJldHVybnMgQSB1c2VyLWZyaWVuZGx5IGVycm9yIG1lc3NhZ2Ugc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsKSB7XG4gICAgLy8gUmVhY3QgSG9vayBGb3JtIEZpZWxkRXJyb3JcbiAgICBpZiAoJ21lc3NhZ2UnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIChlcnJvciBhcyBhbnkpLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gTVVJIERhdGVWYWxpZGF0aW9uRXJyb3JcbiAgICBpZiAoJ3R5cGUnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gKGVycm9yIGFzIGFueSkudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSc7XG4gICAgICAgIGNhc2UgJ21pbkRhdGUnOlxuICAgICAgICAgIHJldHVybiAnRGF0ZSBpcyB0b28gZWFybHknO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGxhdGUnO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnVGhpcyBkYXRlIGlzIG5vdCBhdmFpbGFibGUnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnSW52YWxpZCBkYXRlIHNlbGVjdGlvbic7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICdJbnZhbGlkIGlucHV0Jztcbn1cblxuLyoqXG4gKiBQZXJmb3JtYW5jZSB1dGlsaXR5IHRvIGNyZWF0ZSBzdGFibGUgcmVmZXJlbmNlcyBmb3IgY29tcGxleCBwcm9wc1xuICogVGhpcyBoZWxwcyBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMgd2hlbiB1c2luZyBjb21wbGV4IGNvbmZpZ3VyYXRpb24gb2JqZWN0c1xuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgSlNPTiBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kgaW4gdXNlTWVtby91c2VDYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhYmxlS2V5PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oY29uZmlnOiBUKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZmlnLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgLy8gU29ydCBvYmplY3Qga2V5cyBmb3IgY29uc2lzdGVudCBzZXJpYWxpemF0aW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICBzb3J0ZWRba10gPSAodmFsdWUgYXMgYW55KVtrXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNvcnRlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykuc29ydCgpLmpvaW4oJy0nKTtcbiAgfVxufSIsICJpbXBvcnQgVmlzaWJpbGl0eSBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL1Zpc2liaWxpdHknO1xuaW1wb3J0IFZpc2liaWxpdHlPZmYgZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5T2ZmJztcbmltcG9ydCB0eXBlIHsgSWNvbkJ1dHRvblByb3BzLCBUZXh0RmllbGRQcm9wcywgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBJY29uQnV0dG9uLFxuICBJbnB1dEFkb3JubWVudCxcbiAgVGV4dEZpZWxkLFxuICB1c2VGb3JrUmVmLFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgTW91c2VFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBQYXNzd29yZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgUGFzc3dvcmRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4gPSBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZScgfCAnc2l6ZSc+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJwYXNzd29yZFwiIHwgXCJ1c2VyLmN1cnJlbnRQYXNzd29yZFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgdmlzaWJpbGl0eSB0b2dnbGUgaWNvbiBidXR0b25cbiAgICogQGRlZmF1bHRWYWx1ZSBcImRlZmF1bHRcIlxuICAgKi9cbiAgaWNvbkNvbG9yPzogSWNvbkJ1dHRvblByb3BzWydjb2xvciddO1xuICAvKipcbiAgICogQ3VzdG9tIHJlbmRlciBmdW5jdGlvbiBmb3IgdGhlIHZpc2liaWxpdHkgdG9nZ2xlIGljb25cbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gV2hldGhlciBwYXNzd29yZCBpcyBjdXJyZW50bHkgaGlkZGVuXG4gICAqIEByZXR1cm5zIFJlYWN0Tm9kZSB0byByZW5kZXIgYXMgdGhlIGljb25cbiAgICogQGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZpc2liaWxpdHkvdmlzaWJpbGl0eS1vZmYgaWNvbnNcbiAgICovXG4gIHJlbmRlckljb24/OiAocGFzc3dvcmQ6IGJvb2xlYW4pID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcblxufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gUGFzc3dvcmRFbDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIGljb25Db2xvcixcbiAgICByZW5kZXJJY29uID0gcGFzc3dvcmQgPT4gKHBhc3N3b3JkID8gPFZpc2liaWxpdHkgLz4gOiA8VmlzaWJpbGl0eU9mZiAvPiksXG4gICAgc2xvdFByb3BzLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBpbnB1dFJlZixcbiAgICBvbkJsdXIsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgW3Bhc3N3b3JkLCBzZXRQYXNzd29yZF0gPSB1c2VTdGF0ZTxib29sZWFuPih0cnVlKTtcblxuICBjb25zdCBlbmRBZG9ybm1lbnQgPSAoXG4gICAgPElucHV0QWRvcm5tZW50IHBvc2l0aW9uPXsnZW5kJ30+XG4gICAgICA8SWNvbkJ1dHRvblxuICAgICAgICBvbk1vdXNlRG93bj17KGU6IE1vdXNlRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiBlLnByZXZlbnREZWZhdWx0KCl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFBhc3N3b3JkKCFwYXNzd29yZCl9XG4gICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgY29sb3I9e2ljb25Db2xvciA/PyAnZGVmYXVsdCd9XG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJJY29uKHBhc3N3b3JkKX1cbiAgICAgIDwvSWNvbkJ1dHRvbj5cbiAgICA8L0lucHV0QWRvcm5tZW50PlxuICApO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdHlwZT17cGFzc3dvcmQgPyAncGFzc3dvcmQnIDogJ3RleHQnfVxuICAgICAgdmFsdWU9e2ZpZWxkLnZhbHVlID8/ICcnfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICB2YXJpYW50PXtyZXN0LnZhcmlhbnQgPz8gJ291dGxpbmVkJ31cbiAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN0Lm9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmVzdC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIHsuLi4odHlwZW9mIHNsb3RQcm9wcyA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHNsb3RQcm9wczoge1xuICAgICAgICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50LFxuICAgICAgICAgICAgICAgIC4uLnNsb3RQcm9wcz8uaW5wdXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9IGFzIFRleHRGaWVsZFByb3BzWydzbG90UHJvcHMnXSxcbiAgICAgICAgICB9KX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBwYXNzd29yZCBUZXh0RmllbGQgd2l0aCBzaG93L2hpZGUgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgcGFzc3dvcmQgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIGEgYnVpbHQtaW4gdmlzaWJpbGl0eSB0b2dnbGUgYnV0dG9uLiBUaGUgcGFzc3dvcmRcbiAqIGNhbiBiZSBzaG93biBvciBoaWRkZW4gYnkgY2xpY2tpbmcgdGhlIGV5ZSBpY29uIGluIHRoZSBpbnB1dCdzIGVuZCBhZG9ybm1lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIFBhc3N3b3JkIHZpc2liaWxpdHkgdG9nZ2xlXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSB2aXNpYmlsaXR5IGljb25zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0XG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiUGFzc3dvcmRcIlxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnLFxuICogICAgIG1pbkxlbmd0aDogeyB2YWx1ZTogOCwgbWVzc2FnZTogJ01pbmltdW0gOCBjaGFyYWN0ZXJzJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGljb24gY29sb3I6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiQ29uZmlybSBQYXNzd29yZFwiXG4gKiAgIGljb25Db2xvcj1cInByaW1hcnlcIlxuICogICBwbGFjZWhvbGRlcj1cIlJlLWVudGVyIHlvdXIgcGFzc3dvcmRcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cIm5ld1Bhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJOZXcgUGFzc3dvcmRcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcmVuZGVySWNvbj17KGhpZGRlbikgPT4gaGlkZGVuID8gPEN1c3RvbUhpZGVJY29uIC8+IDogPEN1c3RvbVNob3dJY29uIC8+fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgUGFzc3dvcmRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBQYXNzd29yZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuXG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuZXhwb3J0IHsgUGFzc3dvcmRFbGVtZW50IH07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBGb3JtQ29udHJvbExhYmVsUHJvcHMsXG4gIEZvcm1MYWJlbFByb3BzLFxuICBSYWRpb0dyb3VwUHJvcHMsXG4gIFJhZGlvUHJvcHMsXG4gIEdyaWRQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEZvcm1MYWJlbCxcbiAgUmFkaW8sXG4gIFJhZGlvR3JvdXAsXG4gIEdyaWQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0nO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuXG4vLyBUeXBlIGZvciBwcmltaXRpdmUgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcmFkaW8gYnV0dG9uIHZhbHVlc1xudHlwZSBQcmltaXRpdmVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIENvbnN0cmFpbnQgdG8gZW5zdXJlIG9wdGlvbiBvYmplY3RzIGhhdmUgdGhlIHJlcXVpcmVkIGtleXNcbnR5cGUgT3B0aW9uT2JqZWN0PFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIFByaW1pdGl2ZVZhbHVlPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PiA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFkaW9CdXR0b25Hcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdpZCcsXG4gIFRMYWJlbEtleSBleHRlbmRzICBzdHJpbmcgPSAnbGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4ge1xuICBvcHRpb25zOiBUT3B0aW9uW107XG4gIGhlbHBlclRleHQ/OiBSZWFjdE5vZGU7XG4gIG5hbWU6IFROYW1lO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGxhYmVsS2V5PzogVExhYmVsS2V5O1xuICB2YWx1ZUtleT86IFRWYWx1ZUtleTtcbiAgZGlzYWJsZWRLZXk/OiBURGlzYWJsZWRLZXk7XG4gIHR5cGU/OiAnbnVtYmVyJyB8ICdzdHJpbmcnIHwgJ2Jvb2xlYW4nO1xuICBlbXB0eU9wdGlvbkxhYmVsPzogc3RyaW5nO1xuICBvbkNoYW5nZT86ICh2YWx1ZTogVE9wdGlvbltUVmFsdWVLZXldIHwgVE9wdGlvbiB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgcmV0dXJuT2JqZWN0PzogYm9vbGVhbjtcbiAgcm93PzogYm9vbGVhbjtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgbGFiZWxQcm9wcz86IE9taXQ8Rm9ybUNvbnRyb2xMYWJlbFByb3BzLCAnbGFiZWwnIHwgJ2NvbnRyb2wnIHwgJ3ZhbHVlJz47XG4gIGZvcm1MYWJlbFByb3BzPzogT21pdDxGb3JtTGFiZWxQcm9wcywgJ3JlcXVpcmVkJyB8ICdlcnJvcic+O1xuICByYWRpb1Byb3BzPzogUmFkaW9Qcm9wcztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVE9wdGlvbltUVmFsdWVLZXldO1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFJhZGlvQnV0dG9uR3JvdXA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnaWQnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnbGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPihcbiAgcHJvcHM6IFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVE9wdGlvbixcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG9wdGlvbnMsXG4gICAgbGFiZWwsXG4gICAgbmFtZSxcbiAgICBsYWJlbEtleSA9ICdsYWJlbCcgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlS2V5ID0gJ2lkJyBhcyBUVmFsdWVLZXksXG4gICAgZGlzYWJsZWRLZXkgPSAnZGlzYWJsZWQnIGFzIFREaXNhYmxlZEtleSxcbiAgICByZXF1aXJlZCxcbiAgICBlbXB0eU9wdGlvbkxhYmVsLFxuICAgIHJldHVybk9iamVjdCxcbiAgICByb3cgPSB0cnVlLFxuICAgIGNvbnRyb2wsXG4gICAgdHlwZSxcbiAgICBsYWJlbFByb3BzLFxuICAgIGRpc2FibGVkLFxuICAgIGZvcm1MYWJlbFByb3BzLFxuICAgIHJhZGlvUHJvcHMsXG4gICAgdHJhbnNmb3JtLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb25cbiAgPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiB2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSB8fCAoJycgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcbiAgICAgICAgICAgIH0sXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtPy5vdXRwdXRcbiAgICAgICAgICA6IChfZXZlbnQsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3Qgb25SYWRpb0NoYW5nZTogUmFkaW9Hcm91cFByb3BzWydvbkNoYW5nZSddID0gKGV2ZW50LCByYWRpb1ZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSByZXR1cm5PYmplY3RcbiAgICAgID8gKG9wdGlvbnMgYXMgVE9wdGlvbltdKS5maW5kKG9wdGlvbiA9PiBvcHRpb25bdmFsdWVLZXldID09PSByYWRpb1ZhbHVlKVxuICAgICAgOiAocmFkaW9WYWx1ZSBhcyBUT3B0aW9uW1RWYWx1ZUtleV0pO1xuXG4gICAgb25DaGFuZ2UoZXZlbnQsIHJldHVyblZhbHVlKTtcbiAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlc3Qub25DaGFuZ2UocmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICB7bGFiZWwgJiYgKFxuICAgICAgICA8Rm9ybUxhYmVsIHsuLi5mb3JtTGFiZWxQcm9wc30gcmVxdWlyZWQ9e3JlcXVpcmVkfSBlcnJvcj17ISFlcnJvcn0+XG4gICAgICAgICAge2xhYmVsfVxuICAgICAgICA8L0Zvcm1MYWJlbD5cbiAgICAgICl9XG4gICAgICA8UmFkaW9Hcm91cCBvbkNoYW5nZT17b25SYWRpb0NoYW5nZX0gbmFtZT17bmFtZX0gcm93PXtyb3d9IHZhbHVlPXt2YWx1ZX0+XG4gICAgICAgIHtlbXB0eU9wdGlvbkxhYmVsICYmIChcbiAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgey4uLnJhZGlvUHJvcHN9XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17IXZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFiZWw9e2VtcHR5T3B0aW9uTGFiZWx9XG4gICAgICAgICAgICB2YWx1ZT1cIlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge29wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uW3ZhbHVlS2V5XTtcbiAgICAgICAgICBjb25zdCBvcHRpb25EaXNhYmxlZCA9IG9wdGlvbltkaXNhYmxlZEtleV0gfHwgZmFsc2U7XG4gICAgICAgICAgbGV0IHZhbDogVE9wdGlvbltUVmFsdWVLZXldIHwgdW5kZWZpbmVkID0gcmV0dXJuT2JqZWN0XG4gICAgICAgICAgICA/ICh2YWx1ZSBhcyBUT3B0aW9uKT8uW3ZhbHVlS2V5XVxuICAgICAgICAgICAgOiAodmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcblxuICAgICAgICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gTnVtYmVyKHZhbCkgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBCb29sZWFuKHZhbCkgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IHZhbCA9PT0gb3B0aW9uS2V5O1xuXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICAgIGtleT17U3RyaW5nKG9wdGlvbktleSl9XG4gICAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICAgIHsuLi5yYWRpb1Byb3BzfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8IG9wdGlvbkRpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNDaGVja2VkfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWU9e29wdGlvbktleX1cbiAgICAgICAgICAgICAgbGFiZWw9e29wdGlvbltsYWJlbEtleV19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICk7XG4gICAgICAgIH0pfVxuICAgICAgPC9SYWRpb0dyb3VwPlxuICAgICAge2Vycm9yICYmIDxGb3JtSGVscGVyVGV4dD57ZXJyb3IubWVzc2FnZX08L0Zvcm1IZWxwZXJUZXh0Pn1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuY29uc3QgUmFkaW9CdXR0b25Hcm91cCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzICBzdHJpbmcgPSAnaWQnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRPcHRpb24sXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBURGlzYWJsZWRLZXlcbj4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50PFxuICAgICAgICBURmllbGRWYWx1ZXMsXG4gICAgICAgIFROYW1lLFxuICAgICAgICBUT3B0aW9uLFxuICAgICAgICBUVmFsdWVLZXksXG4gICAgICAgIFRMYWJlbEtleSxcbiAgICAgICAgVERpc2FibGVkS2V5XG4gICAgICA+XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuUmFkaW9CdXR0b25Hcm91cC5kaXNwbGF5TmFtZSA9ICdSYWRpb0J1dHRvbkdyb3VwJztcblxuZXhwb3J0IHsgUmFkaW9CdXR0b25Hcm91cCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmV4cG9ydCB0eXBlIFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgJ25hbWUnXG4gIHwgJ3JlbmRlcklucHV0J1xuICB8ICdpc09wdGlvbkVxdWFsVG9WYWx1ZSdcbiAgfCAnZ2V0T3B0aW9uTGFiZWwnXG4gIHwgJ2Rpc2FibGVkJ1xuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGRlcGVuZHNPbjogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgaXNOdWxsYWJsZT86IGJvb2xlYW47XG4gIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQ/OiBib29sZWFuO1xuICBsYWJlbEZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RDYXNjYWRlRWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG4gIGNvbnN0IHtcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICBuYW1lLFxuICAgIG9uQmx1cixcbiAgICBvbkNoYW5nZSxcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgY29udHJvbCxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgZGVwZW5kc09uLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBpc051bGxhYmxlID0gZmFsc2UsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCA9IGZhbHNlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQsIC4uLnJlc3RUZXh0UHJvcHMgfSA9IHRleHRGaWVsZFByb3BzO1xuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcblxuICBjb25zdCBnZXRPcHRpb25LZXkgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3B0aW9uID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICAgIGNvbnN0IGtleSA9IG9wdGlvbiA/IG9wdGlvblt2YWx1ZUZpZWxkIGFzIGtleW9mIFRPcHRpb25dIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5ICE9PSBudWxsID8gU3RyaW5nKGtleSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkIGFzIGtleW9mIFRPcHRpb25dKSA6ICcnO1xuICAgIH0sXG4gICAgW2xhYmVsRmllbGRdXG4gICk7XG5cbiAgY29uc3QgaXNPcHRpb25FcXVhbFRvVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uLCB2YWx1ZTogVE9wdGlvbikgPT5cbiAgICBnZXRPcHRpb25LZXkob3B0aW9uKSA9PT0gZ2V0T3B0aW9uS2V5KHZhbHVlKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB7IGZpZWxkOiBkZXBlbmRlbnRGaWVsZCB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZTogZGVwZW5kc09uLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmVudFZhbHVlUmVmID0gdXNlUmVmKGRlcGVuZGVudEZpZWxkLnZhbHVlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwYXJlbnRWYWx1ZVJlZi5jdXJyZW50ICE9PSBkZXBlbmRlbnRGaWVsZC52YWx1ZSkge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICBwYXJlbnRWYWx1ZVJlZi5jdXJyZW50ID0gZGVwZW5kZW50RmllbGQudmFsdWU7XG4gICAgfVxuICB9LCBbZGVwZW5kZW50RmllbGQudmFsdWUsIGZpZWxkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZURlZmF1bHRTZWxlY3RlZCAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBmaWVsZC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLCBvcHRpb25zLmxlbmd0aF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVmFsdWUgPVxuICAgICAgZmllbGQudmFsdWUgIT09IG51bGwgJiYgZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWVsZC52YWx1ZSAhPT0gJyc7XG5cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWhhc1ZhbHVlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvbktleShvcHRpb25zWzBdKSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW1xuICAgIG9wdGlvbnMsXG4gICAgZGlzYWJsZWQsXG4gICAgZ2V0T3B0aW9uS2V5LFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQsXG4gIF0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybiB0cnVlO1xuICAgIGlmIChcbiAgICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlID09PSBudWxsIHx8XG4gICAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PT0gJydcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaXNOdWxsYWJsZSAmJiAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbXG4gICAgZGlzYWJsZWQsXG4gICAgZGVwZW5kZW50RmllbGQudmFsdWUsXG4gICAgb3B0aW9ucy5sZW5ndGgsXG4gICAgaXNOdWxsYWJsZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLFxuICBdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgdmFsdWU9e1xuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLm1hcChvcHRpb24gPT4gKGdldE9wdGlvbktleShvcHRpb24pID09PSBmaWVsZC52YWx1ZSA/IG9wdGlvbiA6IG51bGwpKVxuICAgICAgICAgIC5maW5kKEJvb2xlYW4pIHx8IG51bGxcbiAgICAgIH1cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25LZXl9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17aXNPcHRpb25FcXVhbFRvVmFsdWV9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBvbkNoYW5nZT17KGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlID8gZ2V0T3B0aW9uS2V5KG5ld1ZhbHVlKSA6IG51bGwpO1xuICAgICAgICBpZiAob25DaGFuZ2UgJiYgdHlwZW9mIG9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25DaGFuZ2UoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2VsZWN0Q2FzY2FkZUVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWVcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNlbGVjdENhc2NhZGVFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdENhc2NhZGVFbGVtZW50JztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIFRleHRGaWVsZFByb3BzLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZVZhbHVlLFxuICBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgeyB1c2VNZW1vLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5leHBvcnQgdHlwZSBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgJ25hbWUnXG4gIHwgJ3JlbmRlcklucHV0J1xuICB8ICdpc09wdGlvbkVxdWFsVG9WYWx1ZSdcbiAgfCAnZ2V0T3B0aW9uTGFiZWwnXG4gIHwgJ2Rpc2FibGVkJ1xuICB8ICdvcHRpb25zJ1xuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGlzTnVsbGFibGU/OiBib29sZWFuO1xuICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBsYWJlbEZpZWxkPzogc3RyaW5nO1xuICB2YWx1ZUZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICBvcHRpb25zPzogcmVhZG9ubHkgVE9wdGlvbltdIHwgbnVsbDtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdEVsZW1lbnQ8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPihcbiAgcHJvcHM6IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPlxuKSB7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkNoYW5nZSxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgbGFiZWwsXG4gICAgdmFyaWFudCxcbiAgICBkaXNhYmxlZCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyBhcyBrZXlvZiBUT3B0aW9uLFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnIGFzIGtleW9mIFRPcHRpb24sXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICBpc051bGxhYmxlID0gZmFsc2UsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCA9IGZhbHNlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQsIC4uLnJlc3RUZXh0UHJvcHMgfSA9IHRleHRGaWVsZFByb3BzO1xuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz4pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvblt2YWx1ZUZpZWxkIGFzIGtleW9mIFRPcHRpb25dIDogbnVsbDtcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkIGFzIGtleW9mIFRPcHRpb25dKSA6ICcnO1xuICAgIH0sXG4gICAgW2xhYmVsRmllbGRdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZURlZmF1bHRTZWxlY3RlZCAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBmaWVsZC52YWx1ZSAhPSBudWxsKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLCBvcHRpb25zLmxlbmd0aF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVmFsdWUgPVxuICAgICAgZmllbGQudmFsdWUgIT09IG51bGwgJiYgZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWVsZC52YWx1ZSAhPT0gJyc7XG5cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWhhc1ZhbHVlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvblZhbHVlKG9wdGlvbnNbMF0pKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXG4gICAgb3B0aW9ucyxcbiAgICBkaXNhYmxlZCxcbiAgICBnZXRPcHRpb25WYWx1ZSxcbiAgICBmaWVsZC5vbkNoYW5nZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLFxuICBdKTtcblxuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaXNOdWxsYWJsZSAmJiAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZClcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbZGlzYWJsZWQsIG9wdGlvbnMubGVuZ3RoLCBpc051bGxhYmxlLCBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkXSk7XG5cbiAgY29uc3QgYXV0b2NvbXBsZXRlVmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBvcHRpb25zLmZpbmQob3B0aW9uID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGZpZWxkLnZhbHVlKSA/PyBudWxsLFxuICAgIFtmaWVsZC52YWx1ZSwgb3B0aW9ucywgZ2V0T3B0aW9uVmFsdWVdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9ucz17ZmFsc2V9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgdmFsdWU9e1xuICAgICAgICBhdXRvY29tcGxldGVWYWx1ZSBhcyBBdXRvY29tcGxldGVWYWx1ZTxcbiAgICAgICAgICBUT3B0aW9uLFxuICAgICAgICAgIE11bHRpcGxlLFxuICAgICAgICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgICAgICAgRnJlZVNvbG9cbiAgICAgICAgPlxuICAgICAgfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCwgbmV3VmFsdWUsIHJlYXNvbikgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBuZXdWYWx1ZSBhcyBUT3B0aW9uIHwgbnVsbDtcblxuICAgICAgICBmaWVsZC5vbkNoYW5nZShvcHRpb24gPyBnZXRPcHRpb25WYWx1ZShvcHRpb24pIDogbnVsbCk7XG4gICAgICAgIG9uQ2hhbmdlPy4oZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pO1xuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBnZXRPcHRpb25MYWJlbD17b3B0aW9uID0+IGdldE9wdGlvbkxhYmVsKG9wdGlvbil9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICAgICAgZnVsbFdpZHRoXG4gICAgICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIEF1dG9jb21wbGV0ZSBjb21wb25lbnQgZm9yIHNlbGVjdGluZyBmcm9tIHByZWRlZmluZWQgb3B0aW9ucy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgc2VsZWN0L2F1dG9jb21wbGV0ZSBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHlcbiAqIHdpdGggcmVhY3QtaG9vay1mb3JtLCBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKiBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRzLiBJdCBzdXBwb3J0cyBib3RoIHNpbmdsZSBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uIG1vZGVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvY29tcGxldGUgd2l0aCBmaWx0ZXJpbmdcbiAqIC0gU2luZ2xlIGFuZCBtdWx0aXBsZSBzZWxlY3Rpb24gc3VwcG9ydFxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgb3B0aW9uIGRpc3BsYXkgKGxhYmVsS2V5L3ZhbHVlS2V5KVxuICogLSBBdXRvLXNlbGVjdGlvbiB3aGVuIG9ubHkgb25lIG9wdGlvbiBleGlzdHNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjYXRlZ29yeVwiXG4gKiAgIGxhYmVsPVwiQ2F0ZWdvcnlcIlxuICogICBvcHRpb25zPXtbXG4gKiAgICAgeyBMYWJlbDogJ1RlY2hub2xvZ3knLCBWYWx1ZTogJ3RlY2gnIH1cbiAqICAgXX1cbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdQbGVhc2Ugc2VsZWN0IGEgY2F0ZWdvcnknIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGtleXM6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VySWRcIlxuICogICBsYWJlbD1cIkFzc2lnbiB0byBVc2VyXCJcbiAqICAgb3B0aW9ucz17dXNlcnN9XG4gKiAgIGxhYmVsS2V5PVwiZnVsbE5hbWVcIlxuICogICB2YWx1ZUtleT1cImlkXCJcbiAqICAgcGxhY2Vob2xkZXI9XCJDaG9vc2UgYSB1c2VyLi4uXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTXVsdGlwbGUgc2VsZWN0aW9uOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidGFnc1wiXG4gKiAgIGxhYmVsPVwiVGFnc1wiXG4gKiAgIG9wdGlvbnM9e2F2YWlsYWJsZVRhZ3N9XG4gKiAgIG11bHRpcGxlXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDggfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBUT3B0aW9uIC0gVGhlIG9wdGlvbiBvYmplY3QgdHlwZVxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgTXVsdGlwbGUgLSBXaGV0aGVyIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgRGlzYWJsZUNsZWFyYWJsZSAtIFdoZXRoZXIgdGhlIGNsZWFyIGJ1dHRvbiBpcyBkaXNhYmxlZFxuICogQHRlbXBsYXRlIEZyZWVTb2xvIC0gV2hldGhlciBmcmVlIHRleHQgaW5wdXQgaXMgYWxsb3dlZFxuICogQHRlbXBsYXRlIENoaXBDb21wb25lbnQgLSBUaGUgY2hpcCBjb21wb25lbnQgdHlwZSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgU2VsZWN0RWxlbWVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIE11bHRpcGxlLFxuICBEaXNhYmxlQ2xlYXJhYmxlLFxuICBGcmVlU29sbyxcbiAgQ2hpcENvbXBvbmVudFxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuU2VsZWN0RWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RFbGVtZW50JztcbiIsICJpbXBvcnQgQ2hlY2tCb3hJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3gnO1xuaW1wb3J0IENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0NoZWNrQm94T3V0bGluZUJsYW5rJztcbmltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb24sXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgR3JpZCxcbiAgQ2hlY2tib3gsXG4gIFRleHRGaWVsZCxcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICB1c2VUaGVtZSxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFN5bnRoZXRpY0V2ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRnJhZ21lbnQsIHVzZUVmZmVjdCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxudHlwZSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnbXVsdGlwbGUnIHwgJ29uQ2hhbmdlJyB8ICd2YWx1ZSdcbj47XG5cbmV4cG9ydCB0eXBlIFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWUsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IEJhc2VBdXRvY29tcGxldGVQcm9wczxcbiAgVE9wdGlvbixcbiAgTXVsdGlwbGUsXG4gIERpc2FibGVDbGVhcmFibGUsXG4gIEZyZWVTb2xvLFxuICBDaGlwQ29tcG9uZW50XG4+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGlzTnVsbGFibGU/OiBib29sZWFuO1xuICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkPzogYm9vbGVhbjtcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBsYWJlbEZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIG9wdGlvbnM/OiByZWFkb25seSBUT3B0aW9uW10gfCBudWxsO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0TXVsdGlFbGVtZW50PFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGlzTnVsbGFibGUsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCA9IHRydWUsXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnNJbnB1dCB8fCBbXSwgW29wdGlvbnNJbnB1dF0pO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSA6IG51bGw7XG4gIH07XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkIGFzIGtleW9mIFRPcHRpb25dKSA6ICcnO1xuICB9O1xuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaXNOdWxsYWJsZSAmJiAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZClcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LCBbZGlzYWJsZWQsIG9wdGlvbnMubGVuZ3RoLCBpc051bGxhYmxlLCBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkXSk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9XG4gICAgZmllbGQudmFsdWUgJiYgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSlcbiAgICAgID8gb3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IGZpZWxkLnZhbHVlLmluY2x1ZGVzKGdldE9wdGlvblZhbHVlKG9wdGlvbikpKVxuICAgICAgOiBbXTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlRGVmYXVsdFNlbGVjdGVkICYmIG9wdGlvbnMubGVuZ3RoID09PSAxICYmIGZpZWxkLnZhbHVlICE9IG51bGwpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgIH1cbiAgfSwgW2Rpc2FibGVEZWZhdWx0U2VsZWN0ZWQsIG9wdGlvbnMubGVuZ3RoXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYXNWYWx1ZSA9IEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpICYmIGZpZWxkLnZhbHVlLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoXG4gICAgICBvcHRpb25zLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgIWhhc1ZhbHVlICYmXG4gICAgICAhaXNOdWxsYWJsZSAmJlxuICAgICAgIWRpc2FibGVEZWZhdWx0U2VsZWN0ZWRcbiAgICApIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKFtnZXRPcHRpb25WYWx1ZShvcHRpb25zWzBdKV0pO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtcbiAgICBvcHRpb25zLFxuICAgIGdldE9wdGlvblZhbHVlLFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGlzTnVsbGFibGUsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCxcbiAgXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIF86IFN5bnRoZXRpY0V2ZW50LFxuICAgIHNlbGVjdGVkT3B0aW9uczogVE9wdGlvbltdLFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGlmIChyZWFzb24gPT09ICdjbGVhcicpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSAnc2VsZWN0T3B0aW9uJyB8fCByZWFzb24gPT09ICdyZW1vdmVPcHRpb24nKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZXMgPSBzZWxlY3RlZE9wdGlvbnMubWFwKG9wdGlvbiA9PiBnZXRPcHRpb25WYWx1ZShvcHRpb24pKTtcblxuICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWVzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBuZXdWYWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBpY29uID0gPENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG4gIGNvbnN0IGNoZWNrZWRJY29uID0gPENoZWNrQm94SWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgdmFsdWU9e3NlbGVjdGVkVmFsdWV9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIGRpc2FibGVDbG9zZU9uU2VsZWN0XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlck9wdGlvbj17KHByb3BzMSwgb3B0aW9uLCB7IHNlbGVjdGVkIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkgey4uLnByb3BzMX0+XG4gICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgaWNvbj17aWNvbn1cbiAgICAgICAgICAgICAgY2hlY2tlZEljb249e2NoZWNrZWRJY29ufVxuICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7Z2V0T3B0aW9uTGFiZWwob3B0aW9uIGFzIFRPcHRpb24pfVxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgSW5wdXRQcm9wcz17e1xuICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfX1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5TZWxlY3RNdWx0aUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0TXVsdGlFbGVtZW50JztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIFRleHRGaWVsZCwgdXNlRm9ya1JlZiwgdXNlVGhlbWUgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHsgdXNlRW5oYW5jZWRUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgVGV4dEZpZWxkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dEZpZWxkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqIEBkZXByZWNhdGVkIFVzZSBmaWVsZFR5cGUgZm9yIGNvbW1vbiBwYXR0ZXJucyBvciBjdXN0b20gdHJhbnNmb3JtcyBmb3IgY29tcGxleCBjYXNlc1xuICAgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKiBUcmFuc2Zvcm0gdmFsdWUgYmVmb3JlIGRpc3BsYXlpbmcgaW4gaW5wdXQgKi9cbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWU7XG4gICAgLyoqIFRyYW5zZm9ybSBpbnB1dCBldmVudCB0byBmb3JtIHZhbHVlICovXG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb25cbiAgICogQGV4YW1wbGUgJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAndGltZScgfCAnc2VsZWN0J1xuICAgKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZSB0byBkaXNwbGF5IHdoZW4gZmllbGQgdmFsdWUgaXMgbnVsbC91bmRlZmluZWRcbiAgICogQGV4YW1wbGUgXCJcIlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVFZhbHVlO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0XG4gICAqIEBleGFtcGxlIFwiRW50ZXIgeW91ciBlbWFpbFwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBmb3IgdGhlIFRleHRGaWVsZFxuICAgKi9cbiAgLyoqXG4gICAqIEN1c3RvbSBvbkNoYW5nZSBoYW5kbGVyIGNhbGxlZCBhZnRlciB0cmFuc2Zvcm1hdGlvblxuICAgKi9cbiAgb25DaGFuZ2U/OiAoXG4gICAgZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PlxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB0cmFuc2Zvcm1hdGlvbiBpc3N1ZXNcbiAgICogQGRlZmF1bHRWYWx1ZSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgKi9cbiAgZW5hYmxlV2FybmluZ3M/OiBib29sZWFuO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUZXh0RmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ocHJvcHM6IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICB0cmFuc2Zvcm0sXG4gICAgZmllbGRUeXBlID0gJ3RleHQnLCAvLyBEZWZhdWx0IHRvIHRleHQgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIGVuYWJsZVdhcm5pbmdzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFJlZixcbiAgICBvbklucHV0LFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gVXNlIHRoZSBlbmhhbmNlZCB0cmFuc2Zvcm0gaG9vayB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZUVuaGFuY2VkVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oXG4gICAge1xuICAgICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbnB1dDogdHJhbnNmb3JtLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB0cmFuc2Zvcm0ub3V0cHV0LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBmaWVsZFR5cGU6ICF0cmFuc2Zvcm1cbiAgICAgICAgPyB0eXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gJ251bWJlcidcbiAgICAgICAgICA6IGZpZWxkVHlwZVxuICAgICAgICA6IHVuZGVmaW5lZCwgLy8gQXV0by1kZXRlY3QgbnVtYmVyIHR5cGVcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGVuYWJsZVdhcm5pbmdzLFxuICAgIH1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkQ29tcG9uZW50XG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgbmFtZT17ZmllbGQubmFtZX1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gJycpIHtcbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25JbnB1dD17KGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9uSW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbklucHV0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17XG4gICAgICAgIGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogaGVscGVyVGV4dFxuICAgICAgfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbixcbiAqIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGFuZCBidWlsdC1pbiBmaWVsZCB0eXBlIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nXG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnRcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZXMgZm9yIGNvbW1vbiBwYXR0ZXJuc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gT3B0aW1pemVkIG51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCBtZW1vaXplZCB0cmFuc2Zvcm1hdGlvbnNcbiAqIC0gRGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZ1xuICogLSBTdGFibGUgcmVmZXJlbmNlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBidWlsdC1pbiBudW1iZXIgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIGZpZWxkVHlwZT1cIm51bWJlclwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnQWdlIGlzIHJlcXVpcmVkJywgbWluOiB7IHZhbHVlOiAwLCBtZXNzYWdlOiAnQWdlIG11c3QgYmUgcG9zaXRpdmUnIH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3NcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ0VtYWlsIGlzIHJlcXVpcmVkJyxcbiAqICAgICBwYXR0ZXJuOiB7IHZhbHVlOiAvXFxTK0BcXFMrXFwuXFxTKy8sIG1lc3NhZ2U6ICdJbnZhbGlkIGVtYWlsJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInByaWNlXCJcbiAqICAgbGFiZWw9XCJQcmljZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID8gYCQke3ZhbHVlfWAgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VGbG9hdChldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgnJCcsICcnKSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBlcnJvciBwYXJzaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcm5hbWVcIlxuICogICBsYWJlbD1cIlVzZXJuYW1lXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gKFxuICogICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAncmVkJyB9fT5cbiAqICAgICAgIFx1MjZBMFx1RkUwRiB7ZXJyb3IubWVzc2FnZX1cbiAqICAgICA8L3NwYW4+XG4gKiAgICl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBUZXh0RmllbGRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgdXNlRm9ya1JlZiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIFRpbWVQaWNrZXJQcm9wcyxcbiAgVGltZVBpY2tlclNsb3RQcm9wcyxcbiAgVGltZVZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgcmVuZGVyVGltZVZpZXdDbG9jayB9IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMvdGltZVZpZXdSZW5kZXJlcnMnO1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkUGF0aCxcbiAgUGF0aFZhbHVlLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICdAL2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnQC90eXBlcyc7XG5pbXBvcnQgeyByZWFkVmFsdWVBc0RhdGUgfSBmcm9tICdAL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lUGlja2VyRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgVGltZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBpbnB1dFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgaGVscGVyVGV4dD86IFRleHRGaWVsZFByb3BzWydoZWxwZXJUZXh0J107XG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgc2xvdFByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyU2xvdFByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgICd0ZXh0RmllbGQnXG4gID47XG4gIHRyYW5zZm9ybT86IHtcbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWUgfCBudWxsO1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHRpbWVQaWNrZXJQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgICd2YWx1ZScgfCAnc2xvdFByb3BzJ1xuICA+O1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFRpbWVQaWNrZXJFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ocHJvcHM6IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICByZXF1aXJlZCxcbiAgICBpbnB1dFByb3BzLFxuICAgIGNvbnRyb2wsXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgc2xvdFByb3BzLFxuICAgIHRpbWVQaWNrZXJQcm9wcyA9IHt9LFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBhZGFwdGVyID0gdXNlTG9jYWxpemF0aW9uQ29udGV4dCgpO1xuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3QgeyBkaXNhYmxlZCwgaW5wdXRSZWYsIG9uQ2xvc2UsIC4uLnJlc3RUaW1lUGlja2VyUHJvcHMgfSA9XG4gICAgdGltZVBpY2tlclByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbiAgfSk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUgfCBudWxsPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiBuZXdWYWx1ZSA9PiByZWFkVmFsdWVBc0RhdGUoYWRhcHRlciwgbmV3VmFsdWUpLFxuICAgICAgb3V0cHV0OiBkYXRhID0+IHtcbiAgICAgICAgaWYgKCFkYXlqcy5pc0RheWpzKGRhdGEpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGEgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGltZVBpY2tlclxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRpbWVQaWNrZXJQcm9wc31cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIG9wZW49e29wZW59XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB2aWV3UmVuZGVyZXJzPXt7XG4gICAgICAgIGhvdXJzOiByZW5kZXJUaW1lVmlld0Nsb2NrLFxuICAgICAgICBtaW51dGVzOiByZW5kZXJUaW1lVmlld0Nsb2NrLFxuICAgICAgICBzZWNvbmRzOiByZW5kZXJUaW1lVmlld0Nsb2NrLFxuICAgICAgfX1cbiAgICAgIG9uT3Blbj17KCkgPT4gc2V0T3Blbih0cnVlKX1cbiAgICAgIG9uQ2xvc2U9eyguLi5hcmdzKSA9PiB7XG4gICAgICAgIHNldE9wZW4oZmFsc2UpO1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgb25DbG9zZT8uKC4uLmFyZ3MpO1xuICAgICAgfX1cbiAgICAgIG9uQ2hhbmdlPXsobmV3VmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICAgICAgb25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgICB0aW1lUGlja2VyUHJvcHMub25DaGFuZ2U/LihuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICB9fVxuICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgYWN0aW9uczogWydjbGVhcicsICdjYW5jZWwnLCAnYWNjZXB0J10sXG4gICAgICAgIH0sXG4gICAgICAgIHRleHRGaWVsZDoge1xuICAgICAgICAgIC4uLmlucHV0UHJvcHMsXG4gICAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgIHN4OiB7XG4gICAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgc2V0T3Blbih0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQmx1cjogKFxuICAgICAgICAgICAgZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgICAgIGlucHV0UHJvcHM/Lm9uQmx1cj8uKGV2ZW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAhIWVycm9yLFxuICAgICAgICAgIGhlbHBlclRleHQ6IGVycm9yXG4gICAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIDogaW5wdXRQcm9wcz8uaGVscGVyVGV4dCB8fCByZXN0LmhlbHBlclRleHQsXG4gICAgICAgICAgaW5wdXRQcm9wczoge1xuICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICBpbnB1dE1vZGU6ICdub25lJyxcbiAgICAgICAgICAgIC4uLmlucHV0UHJvcHM/LmlucHV0UHJvcHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBUaW1lUGlja2VyRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBUaW1lUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5UaW1lUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdUaW1lUGlja2VyRWxlbWVudCc7XG4iLCAiaW1wb3J0IHtcclxuICBCb3gsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUhlbHBlclRleHQsXHJcbiAgRm9ybUxhYmVsLFxyXG4gIEdyaWQsXHJcbiAgU2xpZGVyLFxyXG4gIHR5cGUgR3JpZFByb3BzLFxyXG4gIHR5cGUgU2xpZGVyUHJvcHMsXHJcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XHJcbmltcG9ydCB0eXBlIHsgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRFcnJvciwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XHJcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xyXG5cclxuLyoqXHJcbiAqIFByb3BzIGZvciB0aGUgU2xpZGVyRWxlbWVudCBjb21wb25lbnQuXHJcbiAqXHJcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxyXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNsaWRlckVsZW1lbnRQcm9wczxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPiB7XHJcbiAgLyoqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtICovXHJcbiAgbmFtZTogVE5hbWU7XHJcbiAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm0gKi9cclxuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xyXG4gIC8qKiBUaGUgaW5wdXQgbGFiZWwgdGV4dCAqL1xyXG4gIGxhYmVsPzogUmVhY3ROb2RlO1xyXG4gIC8qKiBIZWxwZXIgdGV4dCB0byBkaXNwbGF5IGJlbG93IHRoZSBzbGlkZXIgKi9cclxuICBoZWxwZXJUZXh0PzogUmVhY3ROb2RlO1xyXG4gIC8qKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXIgKi9cclxuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XHJcbiAgLyoqIE1pbmltdW0gdmFsdWUgKi9cclxuICBtaW4/OiBudW1iZXI7XHJcbiAgLyoqIE1heGltdW0gdmFsdWUgKi9cclxuICBtYXg/OiBudW1iZXI7XHJcbiAgLyoqIFN0ZXAgaW5jcmVtZW50ICovXHJcbiAgc3RlcD86IG51bWJlcjtcclxuICAvKiogU2hvdyBtYXJrcyBvbiB0aGUgc2xpZGVyICovXHJcbiAgbWFya3M/OiBib29sZWFuIHwgeyB2YWx1ZTogbnVtYmVyOyBsYWJlbD86IHN0cmluZyB9W107XHJcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVpcmVkICovXHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZCAqL1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICAvKiogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyICovXHJcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xyXG4gIC8qKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgU2xpZGVyIGNvbXBvbmVudCAqL1xyXG4gIHNsaWRlclByb3BzPzogT21pdDxTbGlkZXJQcm9wcywgJ3ZhbHVlJyB8ICdvbkNoYW5nZScgfCAnbWluJyB8ICdtYXgnIHwgJ3N0ZXAnIHwgJ21hcmtzJyB8ICdkaXNhYmxlZCc+O1xyXG59XHJcblxyXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTbGlkZXJFbGVtZW50Q29yZTxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPihwcm9wczogT21pdDxTbGlkZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4sICdncmlkUHJvcHMnPikge1xyXG4gIGNvbnN0IHtcclxuICAgIG5hbWUsXHJcbiAgICBjb250cm9sLFxyXG4gICAgbGFiZWwsXHJcbiAgICBoZWxwZXJUZXh0LFxyXG4gICAgcGFyc2VFcnJvcixcclxuICAgIG1pbiA9IDAsXHJcbiAgICBtYXggPSAxMDAsXHJcbiAgICBzdGVwID0gMSxcclxuICAgIG1hcmtzID0gZmFsc2UsXHJcbiAgICByZXF1aXJlZCA9IGZhbHNlLFxyXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcclxuICAgIHNsaWRlclByb3BzID0ge30sXHJcbiAgfSA9IHByb3BzO1xyXG5cclxuICBjb25zdCB7XHJcbiAgICBmaWVsZCxcclxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcclxuICB9ID0gdXNlQ29udHJvbGxlcih7XHJcbiAgICBuYW1lLFxyXG4gICAgY29udHJvbCxcclxuICB9KTtcclxuXHJcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSkgOiBudWxsO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPEZvcm1Db250cm9sXHJcbiAgICAgIGZ1bGxXaWR0aFxyXG4gICAgICBtYXJnaW49XCJub3JtYWxcIlxyXG4gICAgICBlcnJvcj17ISFlcnJvcn1cclxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxyXG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XHJcbiAgICA+XHJcbiAgICAgIHtsYWJlbCAmJiA8Rm9ybUxhYmVsIHN4PXt7IG1iOiAyIH19PntsYWJlbH08L0Zvcm1MYWJlbD59XHJcbiAgICAgIDxCb3ggc3g9e3sgcHg6IDIgfX0+XHJcbiAgICAgICAgPFNsaWRlclxyXG4gICAgICAgICAgey4uLnNsaWRlclByb3BzfVxyXG4gICAgICAgICAgcmVmPXtmaWVsZC5yZWZ9XHJcbiAgICAgICAgICBuYW1lPXtmaWVsZC5uYW1lfVxyXG4gICAgICAgICAgdmFsdWU9e3R5cGVvZiBmaWVsZC52YWx1ZSA9PT0gJ251bWJlcicgPyBmaWVsZC52YWx1ZSA6IG1pbn1cclxuICAgICAgICAgIG9uQ2hhbmdlPXsoXywgbmV3VmFsdWUpID0+IGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlKX1cclxuICAgICAgICAgIG9uQmx1cj17ZmllbGQub25CbHVyfVxyXG4gICAgICAgICAgbWluPXttaW59XHJcbiAgICAgICAgICBtYXg9e21heH1cclxuICAgICAgICAgIHN0ZXA9e3N0ZXB9XHJcbiAgICAgICAgICBtYXJrcz17bWFya3N9XHJcbiAgICAgICAgICB2YWx1ZUxhYmVsRGlzcGxheT1cImF1dG9cIlxyXG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvQm94PlxyXG4gICAgICB7KGVycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0KSAmJiAoXHJcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0PntlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dH08L0Zvcm1IZWxwZXJUZXh0PlxyXG4gICAgICApfVxyXG4gICAgPC9Gb3JtQ29udHJvbD5cclxuICApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgU2xpZGVyIGNvbXBvbmVudC5cclxuICpcclxuICogRmVhdHVyZXM6XHJcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cclxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxyXG4gKiAtIEN1c3RvbWl6YWJsZSBtaW4vbWF4L3N0ZXAgdmFsdWVzXHJcbiAqIC0gT3B0aW9uYWwgbWFya3MgZGlzcGxheVxyXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHRzeFxyXG4gKiA8U2xpZGVyRWxlbWVudFxyXG4gKiAgIG5hbWU9XCJyYXRpbmdcIlxyXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XHJcbiAqICAgbGFiZWw9XCJSYXRpbmdcIlxyXG4gKiAgIG1pbj17MH1cclxuICogICBtYXg9ezEwfVxyXG4gKiAgIHN0ZXA9ezF9XHJcbiAqICAgbWFya3NcclxuICogLz5cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU2xpZGVyRWxlbWVudCA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPih7XHJcbiAgZ3JpZFByb3BzID0ge30sXHJcbiAgLi4ucHJvcHNcclxufTogU2xpZGVyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3RFbGVtZW50ID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxyXG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cclxuICAgIDwvR3JpZD5cclxuICApO1xyXG59O1xyXG5cclxuU2xpZGVyRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTbGlkZXJFbGVtZW50JztcclxuIiwgImltcG9ydCB7XHJcbiAgQm94LFxyXG4gIEJ1dHRvbixcclxuICBDaGlwLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1IZWxwZXJUZXh0LFxyXG4gIEZvcm1MYWJlbCxcclxuICBHcmlkLFxyXG4gIFN0YWNrLFxyXG4gIHR5cGUgR3JpZFByb3BzLFxyXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgQ2xvdWRVcGxvYWRJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2xvdWRVcGxvYWQnO1xyXG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZEVycm9yLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuaW1wb3J0IHsgdXNlQ29udHJvbGxlciwgdXNlRm9ybUNvbnRleHQgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xyXG5cclxuLyoqXHJcbiAqIFByb3BzIGZvciB0aGUgRmlsZVVwbG9hZEVsZW1lbnQgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcclxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBGaWxlVXBsb2FkRWxlbWVudFByb3BzPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+IHtcclxuICAvKiogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm0gKi9cclxuICBuYW1lOiBUTmFtZTtcclxuICAvKiogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xyXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XHJcbiAgLyoqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0ICovXHJcbiAgbGFiZWw/OiBSZWFjdE5vZGU7XHJcbiAgLyoqIEhlbHBlciB0ZXh0IHRvIGRpc3BsYXkgYmVsb3cgdGhlIHVwbG9hZCAqL1xyXG4gIGhlbHBlclRleHQ/OiBSZWFjdE5vZGU7XHJcbiAgLyoqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlciAqL1xyXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcclxuICAvKiogTWF4aW11bSBudW1iZXIgb2YgZmlsZXMgYWxsb3dlZCAqL1xyXG4gIG1heEZpbGVzPzogbnVtYmVyO1xyXG4gIC8qKiBNYXhpbXVtIGZpbGUgc2l6ZSBpbiBNQiAqL1xyXG4gIG1heFNpemVNQj86IG51bWJlcjtcclxuICAvKiogQWxsb3dlZCBmaWxlIGV4dGVuc2lvbnMgKGUuZy4sIFsnLmpwZycsICcucG5nJywgJy5wZGYnXSkgKi9cclxuICBhbGxvd2VkRXh0ZW5zaW9ucz86IHN0cmluZ1tdO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZXF1aXJlZCAqL1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciB0aGUgZmllbGQgaXMgZGlzYWJsZWQgKi9cclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgLyoqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciAqL1xyXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcclxuICAvKiogQnV0dG9uIHRleHQgKi9cclxuICBidXR0b25UZXh0Pzogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBGaWxlVXBsb2FkRWxlbWVudENvcmU8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4ocHJvcHM6IE9taXQ8RmlsZVVwbG9hZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPiwgJ2dyaWRQcm9wcyc+KSB7XHJcbiAgY29uc3Qge1xyXG4gICAgbmFtZSxcclxuICAgIGNvbnRyb2wsXHJcbiAgICBsYWJlbCxcclxuICAgIGhlbHBlclRleHQsXHJcbiAgICBwYXJzZUVycm9yLFxyXG4gICAgbWF4RmlsZXMgPSA1LFxyXG4gICAgbWF4U2l6ZU1CID0gMTAsXHJcbiAgICBhbGxvd2VkRXh0ZW5zaW9ucyA9IFsnLmpwZycsICcuanBlZycsICcucG5nJywgJy5wZGYnLCAnLmRvYycsICcuZG9jeCcsICcueGxzJywgJy54bHN4J10sXHJcbiAgICByZXF1aXJlZCA9IGZhbHNlLFxyXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcclxuICAgIGJ1dHRvblRleHQgPSAnQ2hvb3NlIEZpbGVzJyxcclxuICB9ID0gcHJvcHM7XHJcblxyXG4gIGNvbnN0IHsgc2V0RXJyb3IsIGNsZWFyRXJyb3JzIH0gPSB1c2VGb3JtQ29udGV4dCgpO1xyXG4gIGNvbnN0IGZpbGVJbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKTtcclxuXHJcbiAgY29uc3Qge1xyXG4gICAgZmllbGQsXHJcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXHJcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xyXG4gICAgbmFtZSxcclxuICAgIGNvbnRyb2wsXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IGZpbGVzOiBGaWxlW10gPSBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKSA/IGZpZWxkLnZhbHVlIDogW107XHJcblxyXG4gIGNvbnN0IHZhbGlkYXRlRmlsZXMgPSB1c2VDYWxsYmFjayhcclxuICAgIChmaWxlTGlzdDogRmlsZUxpc3QgfCBudWxsKTogRmlsZVtdIHwgc3RyaW5nID0+IHtcclxuICAgICAgaWYgKCFmaWxlTGlzdCB8fCBmaWxlTGlzdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmaWxlTGlzdC5sZW5ndGggPiBtYXhGaWxlcykge1xyXG4gICAgICAgIHJldHVybiBgTWF4aW11bSAke21heEZpbGVzfSBmaWxlcyBhbGxvd2VkYDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbWF4U2l6ZUJ5dGVzID0gbWF4U2l6ZU1CICogMTAyNCAqIDEwMjQ7XHJcbiAgICAgIGNvbnN0IHZhbGlkRmlsZXM6IEZpbGVbXSA9IFtdO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGZpbGUgPSBmaWxlTGlzdFtpXTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IG1heFNpemVCeXRlcykge1xyXG4gICAgICAgICAgcmV0dXJuIGBGaWxlIFwiJHtmaWxlLm5hbWV9XCIgZXhjZWVkcyAke21heFNpemVNQn1NQiBzaXplIGxpbWl0YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9ICcuJyArIGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghYWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZXh0ZW5zaW9uKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGBGaWxlIFwiJHtmaWxlLm5hbWV9XCIgaGFzIGludmFsaWQgZXh0ZW5zaW9uLiBBbGxvd2VkOiAke2FsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJyl9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhbGlkRmlsZXMucHVzaChmaWxlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHZhbGlkRmlsZXM7XHJcbiAgICB9LFxyXG4gICAgW21heEZpbGVzLCBtYXhTaXplTUIsIGFsbG93ZWRFeHRlbnNpb25zXVxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUZpbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcclxuICAgIChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVGaWxlcyhldmVudC50YXJnZXQuZmlsZXMpO1xyXG5cclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgc2V0RXJyb3IobmFtZSwgeyB0eXBlOiAndmFsaWRhdGlvbicsIG1lc3NhZ2U6IHJlc3VsdCB9KTtcclxuICAgICAgICBpZiAoZmlsZUlucHV0UmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY2xlYXJFcnJvcnMobmFtZSk7XHJcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKHJlc3VsdCk7XHJcbiAgICB9LFxyXG4gICAgW3ZhbGlkYXRlRmlsZXMsIHNldEVycm9yLCBjbGVhckVycm9ycywgbmFtZSwgZmllbGRdXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlUmVtb3ZlRmlsZSA9IHVzZUNhbGxiYWNrKFxyXG4gICAgKGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgbmV3RmlsZXMgPSBmaWxlcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICAgICAgZmllbGQub25DaGFuZ2UobmV3RmlsZXMpO1xyXG5cclxuICAgICAgaWYgKGZpbGVJbnB1dFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSAnJztcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIFtmaWxlcywgZmllbGRdXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSkgOiBudWxsO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPEZvcm1Db250cm9sXHJcbiAgICAgIGZ1bGxXaWR0aFxyXG4gICAgICBtYXJnaW49XCJub3JtYWxcIlxyXG4gICAgICBlcnJvcj17ISFlcnJvcn1cclxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxyXG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XHJcbiAgICA+XHJcbiAgICAgIHtsYWJlbCAmJiA8Rm9ybUxhYmVsIHN4PXt7IG1iOiAxIH19PntsYWJlbH08L0Zvcm1MYWJlbD59XHJcbiAgICAgIDxCb3g+XHJcbiAgICAgICAgPEJ1dHRvblxyXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcclxuICAgICAgICAgIGNvbXBvbmVudD1cImxhYmVsXCJcclxuICAgICAgICAgIHN0YXJ0SWNvbj17PENsb3VkVXBsb2FkSWNvbiAvPn1cclxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCB8fCBmaWxlcy5sZW5ndGggPj0gbWF4RmlsZXN9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge2J1dHRvblRleHR9XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgcmVmPXtmaWxlSW5wdXRSZWZ9XHJcbiAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgICAgICAgbXVsdGlwbGVcclxuICAgICAgICAgICAgYWNjZXB0PXthbGxvd2VkRXh0ZW5zaW9ucy5qb2luKCcsJyl9XHJcbiAgICAgICAgICAgIGhpZGRlblxyXG4gICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlRmlsZUNoYW5nZX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9CdXR0b24+XHJcbiAgICAgICAge2ZpbGVzLmxlbmd0aCA+IDAgJiYgKFxyXG4gICAgICAgICAgPFN0YWNrIGRpcmVjdGlvbj1cInJvd1wiIHNwYWNpbmc9ezF9IGZsZXhXcmFwPVwid3JhcFwiIHN4PXt7IG10OiAyIH19PlxyXG4gICAgICAgICAgICB7ZmlsZXMubWFwKChmaWxlOiBGaWxlLCBpbmRleDogbnVtYmVyKSA9PiAoXHJcbiAgICAgICAgICAgICAgPENoaXBcclxuICAgICAgICAgICAgICAgIGtleT17YCR7ZmlsZS5uYW1lfS0ke2luZGV4fWB9XHJcbiAgICAgICAgICAgICAgICBsYWJlbD17YCR7ZmlsZS5uYW1lfSAoJHsoZmlsZS5zaXplIC8gMTAyNCkudG9GaXhlZCgxKX0gS0IpYH1cclxuICAgICAgICAgICAgICAgIG9uRGVsZXRlPXtkaXNhYmxlZCA/IHVuZGVmaW5lZCA6ICgpID0+IGhhbmRsZVJlbW92ZUZpbGUoaW5kZXgpfVxyXG4gICAgICAgICAgICAgICAgc3g9e3sgbWI6IDEgfX1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICApKX1cclxuICAgICAgICAgIDwvU3RhY2s+XHJcbiAgICAgICAgKX1cclxuICAgICAgPC9Cb3g+XHJcbiAgICAgIHsoZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHQpICYmIChcclxuICAgICAgICA8Rm9ybUhlbHBlclRleHQ+e2Vycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0fTwvRm9ybUhlbHBlclRleHQ+XHJcbiAgICAgICl9XHJcbiAgICA8L0Zvcm1Db250cm9sPlxyXG4gICk7XHJcbn07XHJcblxyXG4vKipcclxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBGaWxlIFVwbG9hZCBjb21wb25lbnQuXHJcbiAqXHJcbiAqIEZlYXR1cmVzOlxyXG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXHJcbiAqIC0gTXVsdGlwbGUgZmlsZSBzdXBwb3J0XHJcbiAqIC0gRmlsZSBzaXplIHZhbGlkYXRpb25cclxuICogLSBGaWxlIHR5cGUgdmFsaWRhdGlvblxyXG4gKiAtIFZpc3VhbCBmaWxlIGxpc3Qgd2l0aCByZW1vdmUgY2FwYWJpbGl0eVxyXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHRzeFxyXG4gKiA8RmlsZVVwbG9hZEVsZW1lbnRcclxuICogICBuYW1lPVwiZG9jdW1lbnRzXCJcclxuICogICBjb250cm9sPXtjb250cm9sfVxyXG4gKiAgIGxhYmVsPVwiVXBsb2FkIERvY3VtZW50c1wiXHJcbiAqICAgbWF4RmlsZXM9ezN9XHJcbiAqICAgbWF4U2l6ZU1CPXs1fVxyXG4gKiAgIGFsbG93ZWRFeHRlbnNpb25zPXtbJy5wZGYnLCAnLmRvYycsICcuZG9jeCddfVxyXG4gKiAvPlxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBjb25zdCBGaWxlVXBsb2FkRWxlbWVudCA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPih7XHJcbiAgZ3JpZFByb3BzID0ge30sXHJcbiAgLi4ucHJvcHNcclxufTogRmlsZVVwbG9hZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPik6IFJlYWN0RWxlbWVudCA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cclxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XHJcbiAgICA8L0dyaWQ+XHJcbiAgKTtcclxufTtcclxuXHJcbkZpbGVVcGxvYWRFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0ZpbGVVcGxvYWRFbGVtZW50JztcclxuIiwgImltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdHlwZSB7IFRleHRGaWVsZFByb3BzLCBHcmlkUHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcclxuaW1wb3J0IHsgR3JpZCB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkRXJyb3IsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xyXG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuaW1wb3J0IHsgTXVpVGVsSW5wdXQgfSBmcm9tICdtdWktdGVsLWlucHV0JztcclxuaW1wb3J0IHR5cGUgeyBNdWlUZWxJbnB1dENvdW50cnksIE11aVRlbElucHV0UHJvcHMgfSBmcm9tICdtdWktdGVsLWlucHV0JztcclxuXHJcbi8vIENhc3QgcmVxdWlyZWQ6IE11aVRlbElucHV0UHJvcHMgaXMgYSBkaXNjcmltaW5hdGVkIHVuaW9uIHRoYXQgY29uZmxpY3RzIHdpdGggSlNYIGluZmVyZW5jZVxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG5jb25zdCBUZWxJbnB1dCA9IE11aVRlbElucHV0IGFzIFJlYWN0LkNvbXBvbmVudFR5cGU8YW55PjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXJFbGVtZW50UHJvcHM8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4ge1xyXG4gIG5hbWU6IFROYW1lO1xyXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgLyoqIERlZmF1bHQgY291bnRyeSBJU08gMzE2Ni0xIGFscGhhLTIgY29kZSAoZS5nLiAnVVMnLCAnSU4nKS4gQGRlZmF1bHRWYWx1ZSAnVVMnICovXHJcbiAgZGVmYXVsdENvdW50cnk/OiBzdHJpbmc7XHJcbiAgcHJlZmVycmVkQ291bnRyaWVzPzogc3RyaW5nW107XHJcbiAgb25seUNvdW50cmllcz86IHN0cmluZ1tdO1xyXG4gIGV4Y2x1ZGVDb3VudHJpZXM/OiBzdHJpbmdbXTtcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcclxuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XHJcbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZScgfCAndHlwZSc+O1xyXG59XHJcblxyXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBQaG9uZU51bWJlckVsPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+KHByb3BzOiBQaG9uZU51bWJlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xyXG4gIGNvbnN0IHtcclxuICAgIG5hbWUsXHJcbiAgICBjb250cm9sLFxyXG4gICAgbGFiZWwsXHJcbiAgICBwbGFjZWhvbGRlcixcclxuICAgIGRlZmF1bHRDb3VudHJ5ID0gJ1VTJyxcclxuICAgIHByZWZlcnJlZENvdW50cmllcyxcclxuICAgIG9ubHlDb3VudHJpZXMsXHJcbiAgICBleGNsdWRlQ291bnRyaWVzLFxyXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcclxuICAgIHJlcXVpcmVkID0gZmFsc2UsXHJcbiAgICBwYXJzZUVycm9yLFxyXG4gICAgdGV4dEZpZWxkUHJvcHMsXHJcbiAgfSA9IHByb3BzO1xyXG5cclxuICBjb25zdCB7XHJcbiAgICBmaWVsZCxcclxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcclxuICB9ID0gdXNlQ29udHJvbGxlcih7IG5hbWUsIGNvbnRyb2wgfSk7XHJcblxyXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yXHJcbiAgICA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKVxyXG4gICAgOiB0ZXh0RmllbGRQcm9wcz8uaGVscGVyVGV4dDtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxUZWxJbnB1dFxyXG4gICAgICB2YWx1ZT17KGZpZWxkLnZhbHVlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gJyd9XHJcbiAgICAgIG9uQ2hhbmdlPXsodmFsOiBzdHJpbmcpID0+IGZpZWxkLm9uQ2hhbmdlKHZhbCl9XHJcbiAgICAgIG9uQmx1cj17KCkgPT4gZmllbGQub25CbHVyKCl9XHJcbiAgICAgIGlucHV0UmVmPXtmaWVsZC5yZWYgYXMgUmVhY3QuUmVmPEhUTUxJbnB1dEVsZW1lbnQ+fVxyXG4gICAgICBsYWJlbD17bGFiZWx9XHJcbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cclxuICAgICAgZGVmYXVsdENvdW50cnk9e2RlZmF1bHRDb3VudHJ5IGFzIE11aVRlbElucHV0Q291bnRyeX1cclxuICAgICAgcHJlZmVycmVkQ291bnRyaWVzPXtwcmVmZXJyZWRDb3VudHJpZXMgYXMgTXVpVGVsSW5wdXRDb3VudHJ5W10gfCB1bmRlZmluZWR9XHJcbiAgICAgIG9ubHlDb3VudHJpZXM9e29ubHlDb3VudHJpZXMgYXMgTXVpVGVsSW5wdXRDb3VudHJ5W10gfCB1bmRlZmluZWR9XHJcbiAgICAgIGV4Y2x1ZGVkQ291bnRyaWVzPXtleGNsdWRlQ291bnRyaWVzIGFzIE11aVRlbElucHV0Q291bnRyeVtdIHwgdW5kZWZpbmVkfVxyXG4gICAgICBmb3JjZUNhbGxpbmdDb2RlXHJcbiAgICAgIGZvY3VzT25TZWxlY3RGbGFnXHJcbiAgICAgIGZ1bGxXaWR0aFxyXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XHJcbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgZXJyb3I9eyEhZXJyb3J9XHJcbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yTWVzc2FnZX1cclxuICAgICAgc2l6ZT17dGV4dEZpZWxkUHJvcHM/LnNpemV9XHJcbiAgICAvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgUGhvbmVOdW1iZXJFbGVtZW50ID0gPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+KHtcclxuICBncmlkUHJvcHMgPSB7fSxcclxuICAuLi5wcm9wc1xyXG59OiBQaG9uZU51bWJlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xyXG4gIHJldHVybiAoXHJcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XHJcbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxyXG4gICAgPC9HcmlkPlxyXG4gICk7XHJcbn07XHJcbiIsICJpbXBvcnQgRGVsZXRlT3V0bGluZSBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0RlbGV0ZU91dGxpbmUnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdAbXVpL21hdGVyaWFsL0J1dHRvbic7XG5pbXBvcnQgdHlwZSB7IEdyaWRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvR3JpZCc7XG5pbXBvcnQgR3JpZCBmcm9tICdAbXVpL21hdGVyaWFsL0dyaWQnO1xuaW1wb3J0IEljb25CdXR0b24gZnJvbSAnQG11aS9tYXRlcmlhbC9JY29uQnV0dG9uJztcbmltcG9ydCBQYXBlciBmcm9tICdAbXVpL21hdGVyaWFsL1BhcGVyJztcbmltcG9ydCBUYWJsZSBmcm9tICdAbXVpL21hdGVyaWFsL1RhYmxlJztcbmltcG9ydCBUYWJsZUJvZHkgZnJvbSAnQG11aS9tYXRlcmlhbC9UYWJsZUJvZHknO1xuaW1wb3J0IFRhYmxlQ2VsbCBmcm9tICdAbXVpL21hdGVyaWFsL1RhYmxlQ2VsbCc7XG5pbXBvcnQgVGFibGVDb250YWluZXIgZnJvbSAnQG11aS9tYXRlcmlhbC9UYWJsZUNvbnRhaW5lcic7XG5pbXBvcnQgVGFibGVIZWFkIGZyb20gJ0BtdWkvbWF0ZXJpYWwvVGFibGVIZWFkJztcbmltcG9ydCBUYWJsZVJvdyBmcm9tICdAbXVpL21hdGVyaWFsL1RhYmxlUm93JztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJ0BtdWkvbWF0ZXJpYWwvVHlwb2dyYXBoeSc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUsIFJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZvcndhcmRSZWYsIHVzZUltcGVyYXRpdmVIYW5kbGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkQXJyYXlQYXRoLFxuICBGaWVsZEFycmF5V2l0aElkLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBVc2VGaWVsZEFycmF5QXBwZW5kLFxuICBVc2VGaWVsZEFycmF5SW5zZXJ0LFxuICBVc2VGaWVsZEFycmF5TW92ZSxcbiAgVXNlRmllbGRBcnJheVJlbW92ZSxcbiAgVXNlRmllbGRBcnJheVJlcGxhY2UsXG4gIFVzZUZpZWxkQXJyYXlTd2FwLFxuICBVc2VGaWVsZEFycmF5VXBkYXRlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlRmllbGRBcnJheSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IENoZWNrYm94RWxlbWVudCB9IGZyb20gJy4uL0NoZWNrYm94RWxlbWVudCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gJy4uL0RhdGVQaWNrZXJFbGVtZW50JztcbmltcG9ydCB7IE51bWJlckZpZWxkRWxlbWVudCB9IGZyb20gJy4uL051bWJlckZpZWxkRWxlbWVudCc7XG5pbXBvcnQgeyBTZWxlY3RFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0RWxlbWVudCc7XG5pbXBvcnQgeyBUZXh0RmllbGRFbGVtZW50IH0gZnJvbSAnLi4vVGV4dEZpZWxkRWxlbWVudCc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb2x1bW4gVHlwZXMgKERpc2NyaW1pbmF0ZWQgVW5pb24pIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5pbnRlcmZhY2UgQmFzZUNvbHVtbiB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgd2lkdGg/OiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFRleHRDb2x1bW4gZXh0ZW5kcyBCYXNlQ29sdW1uIHtcbiAgdHlwZTogJ3RleHQnO1xufVxuXG5pbnRlcmZhY2UgTnVtYmVyQ29sdW1uIGV4dGVuZHMgQmFzZUNvbHVtbiB7XG4gIHR5cGU6ICdudW1iZXInO1xufVxuXG5pbnRlcmZhY2UgQ2hlY2tib3hDb2x1bW4gZXh0ZW5kcyBCYXNlQ29sdW1uIHtcbiAgdHlwZTogJ2NoZWNrYm94Jztcbn1cblxuaW50ZXJmYWNlIFNlbGVjdENvbHVtbiBleHRlbmRzIEJhc2VDb2x1bW4ge1xuICB0eXBlOiAnc2VsZWN0JztcbiAgb3B0aW9uczogQXJyYXk8eyBWYWx1ZTogc3RyaW5nIHwgbnVtYmVyOyBMYWJlbDogc3RyaW5nIH0+O1xufVxuXG5pbnRlcmZhY2UgRGF0ZUNvbHVtbiBleHRlbmRzIEJhc2VDb2x1bW4ge1xuICB0eXBlOiAnZGF0ZSc7XG4gIG1pbkRhdGU/OiBEYXRlO1xuICBtYXhEYXRlPzogRGF0ZTtcbn1cblxudHlwZSBFZGl0YWJsZVRhYmxlQ29sdW1uID1cbiAgfCBUZXh0Q29sdW1uXG4gIHwgTnVtYmVyQ29sdW1uXG4gIHwgQ2hlY2tib3hDb2x1bW5cbiAgfCBTZWxlY3RDb2x1bW5cbiAgfCBEYXRlQ29sdW1uO1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgSW1wZXJhdGl2ZSBIYW5kbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmludGVyZmFjZSBFZGl0YWJsZVRhYmxlSGFuZGxlPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkQXJyYXlQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZEFycmF5UGF0aDxURmllbGRWYWx1ZXM+LFxuPiB7XG4gIGFwcGVuZDogVXNlRmllbGRBcnJheUFwcGVuZDxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgcmVtb3ZlOiBVc2VGaWVsZEFycmF5UmVtb3ZlO1xuICB1cGRhdGU6IFVzZUZpZWxkQXJyYXlVcGRhdGU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIHJlcGxhY2U6IFVzZUZpZWxkQXJyYXlSZXBsYWNlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICBtb3ZlOiBVc2VGaWVsZEFycmF5TW92ZTtcbiAgc3dhcDogVXNlRmllbGRBcnJheVN3YXA7XG4gIGluc2VydDogVXNlRmllbGRBcnJheUluc2VydDxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgZmllbGRzOiBBcnJheTxGaWVsZEFycmF5V2l0aElkPFRGaWVsZFZhbHVlcywgVE5hbWU+Pjtcbn1cblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENvbXBvbmVudCBQcm9wcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuaW50ZXJmYWNlIEVkaXRhYmxlVGFibGVFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRBcnJheVBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkQXJyYXlQYXRoPFRGaWVsZFZhbHVlcz4sXG4+IHtcbiAgbmFtZTogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGNvbHVtbnM6IEVkaXRhYmxlVGFibGVDb2x1bW5bXTtcbiAgZGVmYXVsdFJvd1ZhbHVlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRpdGxlPzogc3RyaW5nO1xuICBhZGRCdXR0b25MYWJlbD86IHN0cmluZztcbiAgZW1wdHlNZXNzYWdlPzogc3RyaW5nO1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHNob3dSb3dOdW1iZXJzPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBkZWxldGVJY29uPzogUmVhY3ROb2RlO1xufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2VsbCBSZW5kZXJlciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZnVuY3Rpb24gcmVuZGVyQ2VsbChcbiAgY29sOiBFZGl0YWJsZVRhYmxlQ29sdW1uLFxuICBmaWVsZE5hbWU6IEZpZWxkUGF0aDxGaWVsZFZhbHVlcz4sXG4gIGNvbnRyb2w6IENvbnRyb2w8RmllbGRWYWx1ZXM+IHwgdW5kZWZpbmVkLFxuICBjZWxsRGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgbGFiZWwgPSBjb2wubGFiZWwgKyAoY29sLnJlcXVpcmVkID8gJyAqJyA6ICcnKTtcblxuICBzd2l0Y2ggKGNvbC50eXBlKSB7XG4gICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPENoZWNrYm94RWxlbWVudFxuICAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICAgICAgbmFtZT17ZmllbGROYW1lfVxuICAgICAgICAgIGxhYmVsPVwiXCJcbiAgICAgICAgICBkaXNhYmxlZD17Y2VsbERpc2FibGVkfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U2VsZWN0RWxlbWVudFxuICAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICAgICAgbmFtZT17ZmllbGROYW1lfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBvcHRpb25zPXtjb2wub3B0aW9uc31cbiAgICAgICAgICBkaXNhYmxlZD17Y2VsbERpc2FibGVkfVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gICAgICAgICAgY29udHJvbD17Y29udHJvbH1cbiAgICAgICAgICBuYW1lPXtmaWVsZE5hbWV9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGdyaWRQcm9wcz17ZmFsc2V9XG4gICAgICAgICAgZGF0ZVBpY2tlclByb3BzPXt7XG4gICAgICAgICAgICBkaXNhYmxlZDogY2VsbERpc2FibGVkLFxuICAgICAgICAgICAgbWluRGF0ZTogY29sLm1pbkRhdGUgPyBkYXlqcyhjb2wubWluRGF0ZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBtYXhEYXRlOiBjb2wubWF4RGF0ZSA/IGRheWpzKGNvbC5tYXhEYXRlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8TnVtYmVyRmllbGRFbGVtZW50XG4gICAgICAgICAgY29udHJvbD17Y29udHJvbH1cbiAgICAgICAgICBuYW1lPXtmaWVsZE5hbWV9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIHRleHRGaWVsZFByb3BzPXt7IGRpc2FibGVkOiBjZWxsRGlzYWJsZWQgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICBjYXNlICd0ZXh0JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFRleHRGaWVsZEVsZW1lbnRcbiAgICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICAgICAgICAgIG5hbWU9e2ZpZWxkTmFtZX1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgdGV4dEZpZWxkUHJvcHM9e3sgZGlzYWJsZWQ6IGNlbGxEaXNhYmxlZCB9fVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTWFpbiBDb21wb25lbnQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IEVkaXRhYmxlVGFibGVFbGVtZW50SW5uZXIgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRBcnJheVBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkQXJyYXlQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KFxuICB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbHVtbnMsXG4gICAgZGVmYXVsdFJvd1ZhbHVlLFxuICAgIHRpdGxlLFxuICAgIGFkZEJ1dHRvbkxhYmVsID0gJ0FkZCcsXG4gICAgZW1wdHlNZXNzYWdlID0gJ05vIGl0ZW1zIGFkZGVkLicsXG4gICAgZ3JpZFByb3BzID0ge30sXG4gICAgc2hvd1Jvd051bWJlcnMgPSB0cnVlLFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgZGVsZXRlSWNvbixcbiAgfTogRWRpdGFibGVUYWJsZUVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPixcbiAgcmVmOiBSZWY8RWRpdGFibGVUYWJsZUhhbmRsZTxURmllbGRWYWx1ZXMsIFROYW1lPj5cbikgPT4ge1xuICBjb25zdCB7IGZpZWxkcywgYXBwZW5kLCByZW1vdmUsIHVwZGF0ZSwgcmVwbGFjZSwgbW92ZSwgc3dhcCwgaW5zZXJ0IH0gPVxuICAgIHVzZUZpZWxkQXJyYXkoeyBjb250cm9sLCBuYW1lIH0pO1xuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgIGFwcGVuZCxcbiAgICByZW1vdmUsXG4gICAgdXBkYXRlLFxuICAgIHJlcGxhY2UsXG4gICAgbW92ZSxcbiAgICBzd2FwLFxuICAgIGluc2VydCxcbiAgICBmaWVsZHMsXG4gIH0pKTtcblxuICBjb25zdCBoYW5kbGVBZGQgPSAoKSA9PiB7XG4gICAgY29uc3Qgcm93ID1cbiAgICAgIGRlZmF1bHRSb3dWYWx1ZSA/P1xuICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKGNvbHVtbnMubWFwKGNvbCA9PiBbY29sLmZpZWxkLCBudWxsXSkpO1xuXG4gICAgYXBwZW5kKHJvdyBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBhcHBlbmQ+WzBdKTtcbiAgfTtcblxuICBjb25zdCBjb2xTcGFuID0gY29sdW1ucy5sZW5ndGggKyAoc2hvd1Jvd051bWJlcnMgPyAxIDogMCkgKyAxO1xuXG4gIC8vIENhc3QgY29udHJvbCB0byBiYXNlIHR5cGUgZm9yIGNlbGwgcmVuZGVyaW5nIChzYWZlOiBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcylcbiAgY29uc3QgYmFzZUNvbnRyb2wgPSBjb250cm9sIGFzIENvbnRyb2w8RmllbGRWYWx1ZXM+IHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPEdyaWQgY29udGFpbmVyIGp1c3RpZnlDb250ZW50PVwic3BhY2UtYmV0d2VlblwiIGFsaWduSXRlbXM9XCJjZW50ZXJcIiBtYXJnaW5Cb3R0b209ezF9PlxuICAgICAgICB7dGl0bGUgJiYgPFR5cG9ncmFwaHkgdmFyaWFudD1cInN1YnRpdGxlMVwiPnt0aXRsZX08L1R5cG9ncmFwaHk+fVxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUFkZH1cbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgID5cbiAgICAgICAgICB7YWRkQnV0dG9uTGFiZWx9XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9HcmlkPlxuICAgICAgPFRhYmxlQ29udGFpbmVyIGNvbXBvbmVudD17UGFwZXJ9IHZhcmlhbnQ9XCJvdXRsaW5lZFwiPlxuICAgICAgICA8VGFibGUgc2l6ZT1cInNtYWxsXCIgc3RpY2t5SGVhZGVyPlxuICAgICAgICAgIDxUYWJsZUhlYWQ+XG4gICAgICAgICAgICA8VGFibGVSb3c+XG4gICAgICAgICAgICAgIHtzaG93Um93TnVtYmVycyAmJiA8VGFibGVDZWxsPiM8L1RhYmxlQ2VsbD59XG4gICAgICAgICAgICAgIHtjb2x1bW5zLm1hcChjb2wgPT4gKFxuICAgICAgICAgICAgICAgIDxUYWJsZUNlbGwga2V5PXtjb2wuZmllbGR9IHdpZHRoPXtjb2wud2lkdGh9PlxuICAgICAgICAgICAgICAgICAge2NvbC5sYWJlbH1cbiAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDxUYWJsZUNlbGwgLz5cbiAgICAgICAgICAgIDwvVGFibGVSb3c+XG4gICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgPFRhYmxlQm9keT5cbiAgICAgICAgICAgIHtmaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgPFRhYmxlUm93IGtleT17ZmllbGQuaWR9PlxuICAgICAgICAgICAgICAgIHtzaG93Um93TnVtYmVycyAmJiA8VGFibGVDZWxsPntpbmRleCArIDF9PC9UYWJsZUNlbGw+fVxuICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gYCR7bmFtZX0uJHtpbmRleH0uJHtjb2wuZmllbGR9YCBhcyBGaWVsZFBhdGg8RmllbGRWYWx1ZXM+O1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBjZWxsRGlzYWJsZWQgPSBkaXNhYmxlZCB8fCBjb2wuZGlzYWJsZWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxUYWJsZUNlbGwga2V5PXtjb2wuZmllbGR9IHdpZHRoPXtjb2wud2lkdGh9PlxuICAgICAgICAgICAgICAgICAgICAgIHtyZW5kZXJDZWxsKGNvbCwgZmllbGROYW1lLCBiYXNlQ29udHJvbCwgY2VsbERpc2FibGVkKX1cbiAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUNlbGw+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIDxUYWJsZUNlbGw+XG4gICAgICAgICAgICAgICAgICA8SWNvbkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcmVtb3ZlKGluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7ZGVsZXRlSWNvbiA/PyA8RGVsZXRlT3V0bGluZSAvPn1cbiAgICAgICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgICAge2ZpZWxkcy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgICAgICA8VGFibGVSb3c+XG4gICAgICAgICAgICAgICAgPFRhYmxlQ2VsbCBjb2xTcGFuPXtjb2xTcGFufSBhbGlnbj1cImNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgdmFyaWFudD1cImJvZHkyXCIgY29sb3I9XCJ0ZXh0LnNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgICAgICB7ZW1wdHlNZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgPC9UeXBvZ3JhcGh5PlxuICAgICAgICAgICAgICAgIDwvVGFibGVDZWxsPlxuICAgICAgICAgICAgICA8L1RhYmxlUm93PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1RhYmxlQm9keT5cbiAgICAgICAgPC9UYWJsZT5cbiAgICAgIDwvVGFibGVDb250YWluZXI+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuY29uc3QgRWRpdGFibGVUYWJsZUVsZW1lbnQgPSBmb3J3YXJkUmVmKEVkaXRhYmxlVGFibGVFbGVtZW50SW5uZXIpIGFzIDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZEFycmF5UGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRBcnJheVBhdGg8VEZpZWxkVmFsdWVzPixcbj4oXG4gIHByb3BzOiBFZGl0YWJsZVRhYmxlRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+ICYge1xuICAgIHJlZj86IFJlZjxFZGl0YWJsZVRhYmxlSGFuZGxlPFRGaWVsZFZhbHVlcywgVE5hbWU+PjtcbiAgfVxuKSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBFZGl0YWJsZVRhYmxlRWxlbWVudElubmVyPjtcblxuZXhwb3J0IHsgRWRpdGFibGVUYWJsZUVsZW1lbnQgfTtcblxuZXhwb3J0IHR5cGUge1xuICBFZGl0YWJsZVRhYmxlQ29sdW1uLFxuICBFZGl0YWJsZVRhYmxlRWxlbWVudFByb3BzLFxuICBFZGl0YWJsZVRhYmxlSGFuZGxlLFxuICBUZXh0Q29sdW1uLFxuICBOdW1iZXJDb2x1bW4sXG4gIENoZWNrYm94Q29sdW1uLFxuICBTZWxlY3RDb2x1bW4sXG4gIERhdGVDb2x1bW4sXG4gIEJhc2VDb2x1bW4sXG59O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCB1c2VGb3JrUmVmLCB1c2VUaGVtZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCwgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VFbmhhbmNlZFRyYW5zZm9ybSB9IGZyb20gJ0AvaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tICdAL2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnQC90eXBlcyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDdXN0b20gVGV4dEZpZWxkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBkZWZhdWx0IE1VSSBUZXh0RmllbGRcbiAgICovXG4gIGNvbXBvbmVudD86IHR5cGVvZiBUZXh0RmllbGQ7XG4gIC8qKlxuICAgKiBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIGlucHV0L291dHB1dFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZmllbGRUeXBlIGZvciBjb21tb24gcGF0dGVybnMgb3IgY3VzdG9tIHRyYW5zZm9ybXMgZm9yIGNvbXBsZXggY2FzZXNcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICAvKipcbiAgICogQnVpbHQtaW4gZmllbGQgdHlwZSBmb3IgYXV0b21hdGljIHRyYW5zZm9ybWF0aW9uXG4gICAqIEBleGFtcGxlICd0ZXh0JyB8ICdudW1iZXInIHwgJ2RhdGUnIHwgJ3RpbWUnIHwgJ3NlbGVjdCdcbiAgICovXG4gIGZpZWxkVHlwZT86IEZpZWxkVHlwZTtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWUgdG8gZGlzcGxheSB3aGVuIGZpZWxkIHZhbHVlIGlzIG51bGwvdW5kZWZpbmVkXG4gICAqIEBleGFtcGxlIFwiXCJcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFRWYWx1ZTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBvbkNoYW5nZSBoYW5kbGVyIGNhbGxlZCBhZnRlciB0cmFuc2Zvcm1hdGlvblxuICAgKi9cbiAgb25DaGFuZ2U/OiAoXG4gICAgZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PlxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB0cmFuc2Zvcm1hdGlvbiBpc3N1ZXNcbiAgICogQGRlZmF1bHRWYWx1ZSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgKi9cbiAgZW5hYmxlV2FybmluZ3M/OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIE51bWJlckZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+KHByb3BzOiBOdW1iZXJGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICB0cmFuc2Zvcm0sXG4gICAgZmllbGRUeXBlID0gJ3RleHQnLCAvLyBEZWZhdWx0IHRvIHRleHQgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIGVuYWJsZVdhcm5pbmdzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgbWF4TGVuZ3RoLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICB0eXBlID0gJ251bWJlcicsXG4gICAgcmVxdWlyZWQsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFJlZixcbiAgICBvbklucHV0LFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gVXNlIHRoZSBlbmhhbmNlZCB0cmFuc2Zvcm0gaG9vayB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZUVuaGFuY2VkVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oXG4gICAge1xuICAgICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbnB1dDogdHJhbnNmb3JtLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB0cmFuc2Zvcm0ub3V0cHV0LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBmaWVsZFR5cGU6ICF0cmFuc2Zvcm1cbiAgICAgICAgPyB0eXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gbWF4TGVuZ3RoICYmIG1heExlbmd0aCA+IDVcbiAgICAgICAgICAgID8gJ3RleHQnXG4gICAgICAgICAgICA6ICdudW1iZXInXG4gICAgICAgICAgOiBmaWVsZFR5cGVcbiAgICAgICAgOiB1bmRlZmluZWQsIC8vIEF1dG8tZGV0ZWN0IG51bWJlciB0eXBlXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBlbmFibGVXYXJuaW5ncyxcbiAgICB9XG4gICk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZENvbXBvbmVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17ZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09ICcnKSB7XG4gICAgICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjdXN0b21PbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uSW5wdXQ9eyhldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGUgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgbWF4TGVuZ3RoICYmXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlLmxlbmd0aCA+IG1heExlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBldmVudC50YXJnZXQudmFsdWUuc2xpY2UoMCwgbWF4TGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb25JbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uSW5wdXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25XaGVlbD17ZSA9PiB7XG4gICAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuYmx1cigpO1xuICAgICAgfX1cbiAgICAgIG9uS2V5RG93bj17ZSA9PiB7XG4gICAgICAgIGlmIChbJ2UnLCAnRScsICdBcnJvd0Rvd24nLCAnQXJyb3dVcCddLmluY2x1ZGVzKGUua2V5KSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17XG4gICAgICAgIGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogaGVscGVyVGV4dFxuICAgICAgfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgc2xvdFByb3BzPXt7IGh0bWxJbnB1dDogeyBtYXhMZW5ndGggfSB9fVxuICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbixcbiAqIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGFuZCBidWlsdC1pbiBmaWVsZCB0eXBlIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nXG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnRcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZXMgZm9yIGNvbW1vbiBwYXR0ZXJuc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gT3B0aW1pemVkIG51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCBtZW1vaXplZCB0cmFuc2Zvcm1hdGlvbnNcbiAqIC0gRGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZ1xuICogLSBTdGFibGUgcmVmZXJlbmNlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBidWlsdC1pbiBudW1iZXIgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIGZpZWxkVHlwZT1cIm51bWJlclwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnQWdlIGlzIHJlcXVpcmVkJywgbWluOiB7IHZhbHVlOiAwLCBtZXNzYWdlOiAnQWdlIG11c3QgYmUgcG9zaXRpdmUnIH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3NcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ0VtYWlsIGlzIHJlcXVpcmVkJyxcbiAqICAgICBwYXR0ZXJuOiB7IHZhbHVlOiAvXFxTK0BcXFMrXFwuXFxTKy8sIG1lc3NhZ2U6ICdJbnZhbGlkIGVtYWlsJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInByaWNlXCJcbiAqICAgbGFiZWw9XCJQcmljZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID8gYCQke3ZhbHVlfWAgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VGbG9hdChldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgnJCcsICcnKSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBlcnJvciBwYXJzaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcm5hbWVcIlxuICogICBsYWJlbD1cIlVzZXJuYW1lXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gKFxuICogICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAncmVkJyB9fT5cbiAqICAgICAgIFx1MjZBMFx1RkUwRiB7ZXJyb3IubWVzc2FnZX1cbiAqICAgICA8L3NwYW4+XG4gKiAgICl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1iZXJGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogTnVtYmVyRmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcbiIsICJpbXBvcnQge1xuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlVGhlbWUsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdAbXVpL21hdGVyaWFsL3V0aWxzJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIEZyYWdtZW50LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdEVsZW1lbnRQcm9wcywgT3B0aW9uT2JqZWN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNTZWxlY3RQYXlsb2FkIH0gZnJvbSAnQC90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEFzeW5jU2VsZWN0RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KFxuICBwcm9wczogQXN5bmNTZWxlY3RFbGVtZW50UHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVE9wdGlvblxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgY29udHJvbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICAvLyBpbml0aWFsVmFsdWUsXG4gICAgLy8gaXNOdWxsYWJsZSxcbiAgICBsYWJlbCxcbiAgICBxdWVyeUZuLFxuICAgIHZhcmlhbnQsXG4gICAgbGFiZWxGaWVsZCA9ICdMYWJlbCcgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnIGFzIFRWYWx1ZUtleSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbc2VsZWN0ZWRPcHRpb24sIHNldFNlbGVjdGVkT3B0aW9uXSA9IHVzZVN0YXRlPFRPcHRpb24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxyZWFkb25seSBUT3B0aW9uW10+KFtdKTtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIC8vIFRyYWNrIHdoYXQgdmFsdWUgd2UndmUgbG9hZGVkIHRvIHByZXZlbnQgZHVwbGljYXRlIEFQSSBjYWxsc1xuICBjb25zdCBsb2FkZWRWYWx1ZVJlZiA9IHVzZVJlZjxUT3B0aW9uW1RWYWx1ZUtleV0gfCBudWxsIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcblxuICBjb25zdCBmZXRjaERhdGEgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBkZWJvdW5jZShcbiAgICAgICAgKFxuICAgICAgICAgIHBheWxvYWQ6IEFzeW5jU2VsZWN0UGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHZvaWRcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgcXVlcnlGbihwYXlsb2FkKS50aGVuKGMgPT4gY2FsbGJhY2soYykpO1xuICAgICAgICB9LFxuICAgICAgICA0MDBcbiAgICAgICksXG4gICAgW3F1ZXJ5Rm5dXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcbiAgICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW3ZhbHVlRmllbGRdKSA6ICcnO1xuICAgIH0sXG4gICAgW3ZhbHVlRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGRdKSA6ICcnO1xuICAgIH0sXG4gICAgW2xhYmVsRmllbGRdXG4gICk7XG5cbiAgLy8gRWZmZWN0OiBIYW5kbGUgc2VhcmNoIHF1ZXJ5IGlucHV0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gZmllbGQudmFsdWU7XG5cbiAgICAvLyBDb25kaXRpb24gMTogQSB2YWx1ZSBpcyBzZXQgZnJvbSB0aGUgZm9ybSwgYW5kIHdlIGhhdmVuJ3QgbG9hZGVkIGl0IHlldC5cbiAgICBpZiAoY3VycmVudFZhbHVlICYmIGxvYWRlZFZhbHVlUmVmLmN1cnJlbnQgIT09IGN1cnJlbnRWYWx1ZSkge1xuICAgICAgLy8gRG9uJ3QgZmV0Y2ggaWYgdGhlIHNlbGVjdGVkIG9wdGlvbiBpcyBhbHJlYWR5IGNvcnJlY3RcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbiAmJiBnZXRPcHRpb25WYWx1ZShzZWxlY3RlZE9wdGlvbikgPT09IGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ID0gY3VycmVudFZhbHVlO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgIGxvYWRlZFZhbHVlUmVmLmN1cnJlbnQgPSBjdXJyZW50VmFsdWU7XG5cbiAgICAgIGZldGNoRGF0YSh7IFF1ZXJ5OiBudWxsLCBTZWxlY3RlZFZhbHVlOiBjdXJyZW50VmFsdWUgfSwgcmVzdWx0cyA9PiB7XG4gICAgICAgIGlmICghYWN0aXZlKSByZXR1cm47XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICBjb25zdCBtYXRjaGVkT3B0aW9uID0gcmVzdWx0cz8uZmluZChcbiAgICAgICAgICBvcHRpb24gPT4gU3RyaW5nKGdldE9wdGlvblZhbHVlKG9wdGlvbikpID09PSBTdHJpbmcoY3VycmVudFZhbHVlKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChtYXRjaGVkT3B0aW9uKSB7XG4gICAgICAgICAgc2V0T3B0aW9ucyhbbWF0Y2hlZE9wdGlvbl0pO1xuICAgICAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG1hdGNoZWRPcHRpb24pO1xuICAgICAgICAgIHNldElucHV0VmFsdWUoZ2V0T3B0aW9uTGFiZWwobWF0Y2hlZE9wdGlvbikpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuOyAvLyBFbmQgb2YgZWZmZWN0XG4gICAgfVxuXG4gICAgLy8gQ29uZGl0aW9uIDI6IFRoZSB1c2VyIGlzIHR5cGluZyBhIHNlYXJjaCBxdWVyeSwgb3IgdGhlIGlucHV0IGlzIGNsZWFyZWQuXG4gICAgLy8gVGhpcyBydW5zIGlmIHRoZSBpbnB1dCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNlbGVjdGVkIG9wdGlvbidzIGxhYmVsLlxuICAgIGlmIChpbnB1dFZhbHVlICE9PSAoc2VsZWN0ZWRPcHRpb24gPyBnZXRPcHRpb25MYWJlbChzZWxlY3RlZE9wdGlvbikgOiAnJykpIHtcbiAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBlbXB0eSwgY2xlYXIgb3B0aW9ucyBpbW1lZGlhdGVseSB3aXRob3V0IGFuIEFQSSBjYWxsLlxuICAgICAgaWYgKGlucHV0VmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHNldE9wdGlvbnMoW10pO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyd2lzZSwgZmV0Y2ggbmV3IG9wdGlvbnMgYmFzZWQgb24gdGhlIGlucHV0LlxuICAgICAgY29uc3QgYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgICAgZmV0Y2hEYXRhKHsgUXVlcnk6IGlucHV0VmFsdWUsIFNlbGVjdGVkVmFsdWU6IG51bGwgfSwgcmVzdWx0cyA9PiB7XG4gICAgICAgIGlmICghYWN0aXZlKSByZXR1cm47XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICBzZXRPcHRpb25zKHJlc3VsdHMgfHwgW10pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjsgLy8gRW5kIG9mIGVmZmVjdFxuICAgIH1cblxuICAgIC8vIENvbmRpdGlvbiAzOiBUaGUgdmFsdWUgaGFzIGJlZW4gY2xlYXJlZCBmcm9tIHRoZSBmb3JtLlxuICAgIGlmICghY3VycmVudFZhbHVlICYmIHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihudWxsKTtcbiAgICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgICAgc2V0T3B0aW9ucyhbXSk7XG4gICAgICBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSwgW1xuICAgIGZpZWxkLnZhbHVlLFxuICAgIGlucHV0VmFsdWUsXG4gICAgZmV0Y2hEYXRhLFxuICAgIGdldE9wdGlvbkxhYmVsLFxuICAgIGdldE9wdGlvblZhbHVlLFxuICAgIHNlbGVjdGVkT3B0aW9uLFxuICAgIGxhYmVsRmllbGQsXG4gICAgdmFsdWVGaWVsZCxcbiAgXSk7XG5cbiAgY29uc3QgaXNEaXNhYmxlZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBkaXNhYmxlZCA/PyBmYWxzZTtcbiAgfSwgW2Rpc2FibGVkXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKF86IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdTZWxlY3RlZE9wdGlvbjogVE9wdGlvbiB8IG51bGwpID0+IHtcbiAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG5ld1NlbGVjdGVkT3B0aW9uKTtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3U2VsZWN0ZWRPcHRpb25cbiAgICAgICAgPyBnZXRPcHRpb25WYWx1ZShuZXdTZWxlY3RlZE9wdGlvbilcbiAgICAgICAgOiBudWxsO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSk7XG4gICAgICBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ID0gbmV3VmFsdWUgYXNcbiAgICAgICAgfCBUT3B0aW9uW1RWYWx1ZUtleV1cbiAgICAgICAgfCBudWxsXG4gICAgICAgIHwgdW5kZWZpbmVkOyAvLyBUcmFjayBjaGFuZ2VcblxuICAgICAgLy8gU3luYyBpbnB1dCB2YWx1ZSB3aXRoIHRoZSBzZWxlY3Rpb25cbiAgICAgIGlmIChuZXdTZWxlY3RlZE9wdGlvbikge1xuICAgICAgICBzZXRJbnB1dFZhbHVlKGdldE9wdGlvbkxhYmVsKG5ld1NlbGVjdGVkT3B0aW9uKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICAgICAgc2V0T3B0aW9ucyhbXSk7IC8vIENsZWFyIG9wdGlvbnMgd2hlbiBzZWxlY3Rpb24gaXMgY2xlYXJlZFxuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLCBnZXRPcHRpb25WYWx1ZSwgZ2V0T3B0aW9uTGFiZWxdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoXzogUmVhY3QuU3ludGhldGljRXZlbnQsIG5ld0lucHV0VmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgc2V0SW5wdXRWYWx1ZShuZXdJbnB1dFZhbHVlKTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlQmx1ciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAvLyBXaGVuIGZvY3VzIGlzIGxvc3QsIHN5bmMgdGhlIGlucHV0IHZhbHVlIGJhY2sgdG8gdGhlIHNlbGVjdGVkIG9wdGlvbidzIGxhYmVsXG4gICAgaWYgKHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICBzZXRJbnB1dFZhbHVlKGdldE9wdGlvbkxhYmVsKHNlbGVjdGVkT3B0aW9uKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIGNsZWFyIHRoZSBpbnB1dFxuICAgICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgfVxuICB9LCBbc2VsZWN0ZWRPcHRpb24sIGdldE9wdGlvbkxhYmVsXSk7XG5cbiAgY29uc3QgaGFuZGxlT3BlbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRPcGVuKHRydWUpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2xvc2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0T3BlbihmYWxzZSk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgZnVsbFdpZHRoXG4gICAgICBvcGVuPXtvcGVufVxuICAgICAgb25PcGVuPXtoYW5kbGVPcGVufVxuICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XG4gICAgICBvbkJsdXI9e2hhbmRsZUJsdXJ9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25WYWx1ZX1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgICBhdXRvQ29tcGxldGVcbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgaW5jbHVkZUlucHV0SW5MaXN0XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgdmFsdWU9e3NlbGVjdGVkT3B0aW9ufVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBmaWx0ZXJPcHRpb25zPXt4ID0+IHh9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25JbnB1dENoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICBzeD17e1xuICAgICAgICAnJi5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlJbnB1dEJhc2Utcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmLk11aS1kaXNhYmxlZCAuTXVpQXV0b2NvbXBsZXRlLXBvcHVwSW5kaWNhdG9yJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCAuTXVpT3V0bGluZWRJbnB1dC1ub3RjaGVkT3V0bGluZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUZpbGxlZElucHV0LXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAgIG5vT3B0aW9uc1RleHQ9XCJUeXBlIFNvbWV0aGluZy4uLlwiXG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgICA8RnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgcmVuZGVyT3B0aW9uPXsocmVuZGVyUHJvcHMsIG9wdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9IHJlbmRlclByb3BzO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIGtleT17a2V5fSB7Li4ub3B0aW9uUHJvcHN9PlxuICAgICAgICAgICAge29wdGlvbltsYWJlbEZpZWxkXX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNTZWxlY3RFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVE9wdGlvblxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj5cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5Bc3luY1NlbGVjdEVsZW1lbnQuZGlzcGxheU5hbWUgPSAnQXN5bmNTZWxlY3RFbGVtZW50JztcblxuZXhwb3J0IHsgQXN5bmNTZWxlY3RFbGVtZW50IH07XG4iLCAiaW1wb3J0IHR5cGUgeyBCb3hQcm9wcywgRm9ybUhlbHBlclRleHRQcm9wcywgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBCb3gsIEdyaWQsIGlucHV0QmFzZUNsYXNzZXMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIE11aU90cElucHV0LFxuICB0eXBlIE11aU90cElucHV0UHJvcHMsXG59IGZyb20gJ211aS1vbmUtdGltZS1wYXNzd29yZC1pbnB1dCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IEhlbHBlclRleHQgfSBmcm9tICcuL0hlbHBlclRleHQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9UUElucHV0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG5cbiAgbWF4U2l6ZT86IG51bWJlcjtcblxuICBwbGFjZWhvbGRlcj86IHN0cmluZztcblxuICBoZWxwZXJUZXh0PzogUmVhY3QuUmVhY3ROb2RlO1xuXG4gIHNsb3RQcm9wcz86IHtcbiAgICB3cmFwcGVyPzogQm94UHJvcHM7XG4gICAgaGVscGVyVGV4dD86IEZvcm1IZWxwZXJUZXh0UHJvcHM7XG4gICAgdGV4dGZpZWxkPzogTXVpT3RwSW5wdXRQcm9wc1snVGV4dEZpZWxkc1Byb3BzJ107XG4gIH07XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gT1RQSW5wdXRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBPVFBJbnB1dEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgLy8gcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgc2xvdFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgbWF4U2l6ZSA9IDU2LFxuICAgIHBsYWNlaG9sZGVyID0gJy0nLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIC8vIGNvbnN0IHtcbiAgLy8gICBmaWVsZCxcbiAgLy8gICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIC8vIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgLy8gICBuYW1lLFxuICAvLyAgIGNvbnRyb2wsXG4gIC8vIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbnRyb2xsZXJcbiAgICAgIG5hbWU9e25hbWV9XG4gICAgICBjb250cm9sPXtjb250cm9sfVxuICAgICAgcmVuZGVyPXsoeyBmaWVsZCwgZmllbGRTdGF0ZTogeyBlcnJvciB9IH0pID0+IChcbiAgICAgICAgPEJveFxuICAgICAgICAgIHsuLi5zbG90UHJvcHM/LndyYXBwZXJ9XG4gICAgICAgICAgc3g9e1tcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIFtgJiAuJHtpbnB1dEJhc2VDbGFzc2VzLmlucHV0fWBdOiB7XG4gICAgICAgICAgICAgICAgcDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBhc3BlY3RSYXRpbzogJzEvMScsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IG1heFNpemUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc2xvdFByb3BzPy53cmFwcGVyPy5zeClcbiAgICAgICAgICAgICAgPyAoc2xvdFByb3BzPy53cmFwcGVyPy5zeCA/PyBbXSlcbiAgICAgICAgICAgICAgOiBbc2xvdFByb3BzPy53cmFwcGVyPy5zeF0pLFxuICAgICAgICAgIF19XG4gICAgICAgID5cbiAgICAgICAgICA8TXVpT3RwSW5wdXRcbiAgICAgICAgICAgIHsuLi5maWVsZH1cbiAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgZ2FwPXsxLjV9XG4gICAgICAgICAgICBsZW5ndGg9ezR9XG4gICAgICAgICAgICBUZXh0RmllbGRzUHJvcHM9e3tcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgIGVycm9yOiAhIWVycm9yLFxuICAgICAgICAgICAgICAuLi5zbG90UHJvcHM/LnRleHRmaWVsZCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPEhlbHBlclRleHRcbiAgICAgICAgICAgIHsuLi5zbG90UHJvcHM/LmhlbHBlclRleHR9XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U9e2Vycm9yPy5tZXNzYWdlfVxuICAgICAgICAgICAgaGVscGVyVGV4dD17aGVscGVyVGV4dH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0JveD5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBPVFBJbnB1dEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IE9UUElucHV0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgRm9ybUhlbHBlclRleHRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUhlbHBlclRleHQnO1xuaW1wb3J0IEZvcm1IZWxwZXJUZXh0IGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUhlbHBlclRleHQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEhlbHBlclRleHRQcm9wcyA9IEZvcm1IZWxwZXJUZXh0UHJvcHMgJiB7XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgZGlzYWJsZUd1dHRlcnM/OiBib29sZWFuO1xuICBoZWxwZXJUZXh0PzogUmVhY3QuUmVhY3ROb2RlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIEhlbHBlclRleHQoe1xuICBzeCxcbiAgaGVscGVyVGV4dCxcbiAgZXJyb3JNZXNzYWdlLFxuICBkaXNhYmxlR3V0dGVycyxcbiAgLi4ub3RoZXJcbn06IEhlbHBlclRleHRQcm9wcykge1xuICBpZiAoZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEZvcm1IZWxwZXJUZXh0XG4gICAgICAgIGVycm9yPXshIWVycm9yTWVzc2FnZX1cbiAgICAgICAgc3g9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBteDogZGlzYWJsZUd1dHRlcnMgPyAwIDogMS43NSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KHN4KSA/IHN4IDogW3N4XSksXG4gICAgICAgIF19XG4gICAgICAgIHsuLi5vdGhlcn1cbiAgICAgID5cbiAgICAgICAge2Vycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0fVxuICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiaW1wb3J0IHsgQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQgfSBmcm9tICcuLi9Bc3luY011bHRpU2VsZWN0L0FzeW5jTXVsdGlTZWxlY3QnO1xuaW1wb3J0IHsgQXN5bmNTZWxlY3RFbGVtZW50IH0gZnJvbSAnLi4vQXN5bmNTZWxlY3QnO1xuaW1wb3J0IHsgQ2hlY2tib3hFbGVtZW50IH0gZnJvbSAnLi4vQ2hlY2tib3hFbGVtZW50JztcbmltcG9ydCB7IENoZWNrYm94R3JvdXBFbGVtZW50IH0gZnJvbSAnLi4vQ2hlY2tib3hHcm91cCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gJy4uL0RhdGVQaWNrZXJFbGVtZW50JztcbmltcG9ydCB7IEVkaXRhYmxlVGFibGVFbGVtZW50IH0gZnJvbSAnLi4vRWRpdGFibGVUYWJsZUVsZW1lbnQnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZEVsZW1lbnQgfSBmcm9tICcuLi9GaWxlVXBsb2FkRWxlbWVudCc7XG5pbXBvcnQgeyBOdW1iZXJGaWVsZEVsZW1lbnQgfSBmcm9tICcuLi9OdW1iZXJGaWVsZEVsZW1lbnQnO1xuaW1wb3J0IHsgT1RQSW5wdXRFbGVtZW50IH0gZnJvbSAnLi4vT1RQSW5wdXRFbGVtZW50L09UUElucHV0RWxlbWVudCc7XG5pbXBvcnQgeyBQYXNzd29yZEVsZW1lbnQgfSBmcm9tICcuLi9QYXNzd29yZEVsZW1lbnQnO1xuaW1wb3J0IHsgUGhvbmVOdW1iZXJFbGVtZW50IH0gZnJvbSAnLi4vUGhvbmVOdW1iZXJFbGVtZW50JztcbmltcG9ydCB7IFJhZGlvQnV0dG9uR3JvdXAgfSBmcm9tICcuLi9SYWRpb0J1dHRvbkdyb3VwJztcbmltcG9ydCB7IFNlbGVjdENhc2NhZGVFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0Q2FzY2FkZUVsZW1lbnQnO1xuaW1wb3J0IHsgU2VsZWN0RWxlbWVudCB9IGZyb20gJy4uL1NlbGVjdEVsZW1lbnQnO1xuaW1wb3J0IHsgU2VsZWN0TXVsdGlFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0TXVsdGlFbGVtZW50JztcbmltcG9ydCB7IFNsaWRlckVsZW1lbnQgfSBmcm9tICcuLi9TbGlkZXJFbGVtZW50JztcbmltcG9ydCB7IFRleHRGaWVsZEVsZW1lbnQgfSBmcm9tICcuLi9UZXh0RmllbGRFbGVtZW50JztcbmltcG9ydCB7IFRpbWVQaWNrZXJFbGVtZW50IH0gZnJvbSAnLi4vVGltZVBpY2tlckVsZW1lbnQnO1xuXG5jb25zdCBGaWVsZCA9IHtcbiAgVGV4dDogVGV4dEZpZWxkRWxlbWVudCxcbiAgTnVtYmVyOiBOdW1iZXJGaWVsZEVsZW1lbnQsXG4gIENoZWNrYm94OiBDaGVja2JveEVsZW1lbnQsXG4gIERhdGU6IERhdGVQaWNrZXJFbGVtZW50LFxuICBSYWRpb0dyb3VwOiBSYWRpb0J1dHRvbkdyb3VwLFxuICBQYXNzd29yZDogUGFzc3dvcmRFbGVtZW50LFxuICBQaG9uZTogUGhvbmVOdW1iZXJFbGVtZW50LFxuICBUaW1lOiBUaW1lUGlja2VyRWxlbWVudCxcbiAgU2VsZWN0OiBTZWxlY3RFbGVtZW50LFxuICBTZWxlY3RNdWx0aTogU2VsZWN0TXVsdGlFbGVtZW50LFxuICBTZWxlY3RDYXNjYWRlOiBTZWxlY3RDYXNjYWRlRWxlbWVudCxcbiAgQXN5bmNTZWxlY3Q6IEFzeW5jU2VsZWN0RWxlbWVudCxcbiAgQXN5bmNNdWx0aVNlbGVjdDogQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQsXG4gIENoZWNrYm94R3JvdXA6IENoZWNrYm94R3JvdXBFbGVtZW50LFxuICBPVFBJbnB1dDogT1RQSW5wdXRFbGVtZW50LFxuICBTbGlkZXI6IFNsaWRlckVsZW1lbnQsXG4gIEZpbGVVcGxvYWQ6IEZpbGVVcGxvYWRFbGVtZW50LFxuICBFZGl0YWJsZVRhYmxlOiBFZGl0YWJsZVRhYmxlRWxlbWVudCxcbn07XG5cbmV4cG9ydCB7IEZpZWxkIH07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7QUE0Rk8sU0FBUyxjQUFjLE9BQXFDO0FBQ2pFLFNBQ0UsT0FBTyxVQUFVLFlBQ2pCLFVBQVUsUUFDVixXQUFXLFNBQ1gsV0FBVyxTQUNYLE9BQVEsTUFBcUIsVUFBVSxhQUN0QyxPQUFRLE1BQXFCLFVBQVUsWUFDdEMsT0FBUSxNQUFxQixVQUFVLFlBQ3ZDLE9BQVEsTUFBcUIsVUFBVTtBQUU3QztBQVlPLFNBQVMsaUJBQ2QsU0FDQSxhQUFhLFNBQ2IsYUFBYSxTQUNDO0FBQ2QsU0FBTyxRQUFRLElBQUksYUFBVztBQUFBLElBQzVCLE9BQU8sT0FBTyxPQUFPLFVBQVUs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O0FBQUEsa0JBQ2Y7QUFBQSxrQkFDQSxPQUFPLENBQUMsQ0FBQztBQUFBLGtCQUNULEdBQUcsV0FBVztBQUFBLGdCQUNoQjtBQUFBLGdCQUNDLEdBQUc7QUFBQTtBQUFBLFlBQ047QUFBQSxZQUVBLGdCQUFBQTtBQUFBLGNBQUM7QUFBQTtBQUFBLGdCQUNFLEdBQUcsV0FBVztBQUFBLGdCQUNmLGNBQWMsT0FBTztBQUFBLGdCQUNyQjtBQUFBO0FBQUEsWUFDRjtBQUFBO0FBQUE7QUFBQSxNQUNGO0FBQUE7QUFBQSxFQUVKO0FBRUo7QUFFTyxJQUFNSSxtQkFBa0IsQ0FHN0I7QUFBQSxFQUNBLFlBQVksQ0FBQztBQUFBLEVBQ2IsR0FBRztBQUNMLE1BQStEO0FBQzdELFNBQ0UsZ0JBQUFKLE1BQUNLLFFBQUEsRUFBSyxNQUFNLElBQUssR0FBRyxXQUNsQiwwQkFBQUwsTUFBQ0UsYUFBQSxFQUFXLEdBQUcsT0FBTyxHQUN4QjtBQUVKOzs7QUVsSEEsSUFBTSxRQUFRO0FBQUEsRUFDWixNQUFNSTtBQUFBLEVBQ04sUUFBUUM7QUFBQSxFQUNSLFVBQVVDO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixZQUFZQztBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsT0FBTztBQUFBLEVBQ1AsTUFBTUM7QUFBQSxFQUNOLFFBQVFDO0FBQUEsRUFDUixhQUFhQztBQUFBLEVBQ2IsZUFBZUM7QUFBQSxFQUNmLGFBQWFDO0FBQUEsRUFDYixrQkFBa0JDO0FBQUEsRUFDbEIsZUFBZTtBQUFBLEVBQ2YsVUFBVUM7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLFlBQVk7QUFBQSxFQUNaLGVBQWU7QUFDakI7IiwKICAibmFtZXMiOiBbInByb3BzIiwgIkFzeW5jU2VsZWN0TXVsdGlFbGVtZW50IiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlQ29udHJvbGxlciIsICJ2YWx1ZSIsICJDaGVja2JveEVsZW1lbnQiLCAiR3JpZCIsICJDaGVja2JveCIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1Hcm91cCIsICJGb3JtSGVscGVyVGV4dCIsICJHcmlkIiwgInVzZUNhbGxiYWNrIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIkdyaWQiLCAiZm9yd2FyZFJlZiIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VNZW1vIiwgInVzZVRoZW1lIiwgInVzZU1lbW8iLCAianN4IiwgInVzZUNvbnRyb2xsZXIiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJqc3giLCAiZm9yd2FyZFJlZiIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgIkdyaWQiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgInBhc3N3b3JkIiwgIkZvcm1Db250cm9sIiwgIkZvcm1Db250cm9sTGFiZWwiLCAiRm9ybUhlbHBlclRleHQiLCAiRm9ybUxhYmVsIiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlQ29udHJvbGxlciIsICJ2YWx1ZSIsICJGb3JtQ29udHJvbCIsICJGb3JtTGFiZWwiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtSGVscGVyVGV4dCIsICJSYWRpb0J1dHRvbkdyb3VwIiwgIkdyaWQiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgInVzZVRoZW1lIiwgInVzZVJlZiIsICJ1c2VFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiU2VsZWN0Q2FzY2FkZUVsZW1lbnQiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgInVzZVRoZW1lIiwgInVzZU1lbW8iLCAidXNlRWZmZWN0IiwgInVzZUNhbGxiYWNrIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiVGV4dEZpZWxkIiwgIkF1dG9jb21wbGV0ZSIsICJDaXJjdWxhclByb2dyZXNzIiwgInVzZVRoZW1lIiwgIkZyYWdtZW50IiwgInVzZUVmZmVjdCIsICJ1c2VNZW1vIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIlNlbGVjdE11bHRpRWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgInVzZVRoZW1lIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJUZXh0RmllbGQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VUaGVtZSIsICJ1c2VGb3JrUmVmIiwgIlRleHRGaWVsZEVsZW1lbnQiLCAiR3JpZCIsICJHcmlkIiwgInVzZUZvcmtSZWYiLCAidXNlTG9jYWxpemF0aW9uQ29udGV4dCIsICJ1c2VTdGF0ZSIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAidXNlTG9jYWxpemF0aW9uQ29udGV4dCIsICJ1c2VTdGF0ZSIsICJ1c2VDb250cm9sbGVyIiwgInVzZUZvcmtSZWYiLCAiVGltZVBpY2tlckVsZW1lbnQiLCAiR3JpZCIsICJGb3JtQ29udHJvbCIsICJGb3JtSGVscGVyVGV4dCIsICJGb3JtTGFiZWwiLCAiR3JpZCIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJCb3giLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUhlbHBlclRleHQiLCAiRm9ybUxhYmVsIiwgIkdyaWQiLCAidXNlQ2FsbGJhY2siLCAidXNlUmVmIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIkJ1dHRvbiIsICJHcmlkIiwgIkljb25CdXR0b24iLCAiZGF5anMiLCAiZm9yd2FyZFJlZiIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgInVzZVRoZW1lIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJUZXh0RmllbGQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VUaGVtZSIsICJ1c2VGb3JrUmVmIiwgIk51bWJlckZpZWxkRWxlbWVudCIsICJHcmlkIiwgImpzeCIsICJqc3hzIiwgIkNoZWNrYm94RWxlbWVudCIsICJTZWxlY3RFbGVtZW50IiwgImRheWpzIiwgIk51bWJlckZpZWxkRWxlbWVudCIsICJUZXh0RmllbGRFbGVtZW50IiwgIkdyaWQiLCAiQnV0dG9uIiwgIkljb25CdXR0b24iLCAiZm9yd2FyZFJlZiIsICJBdXRvY29tcGxldGUiLCAiQ2lyY3VsYXJQcm9ncmVzcyIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VUaGVtZSIsICJkZWJvdW5jZSIsICJGcmFnbWVudCIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VSZWYiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQXN5bmNTZWxlY3RFbGVtZW50IiwgIkJveCIsICJHcmlkIiwgIkZvcm1IZWxwZXJUZXh0IiwgImpzeCIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQm94IiwgIk9UUElucHV0RWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZEVsZW1lbnQiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkNoZWNrYm94RWxlbWVudCIsICJSYWRpb0J1dHRvbkdyb3VwIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIlNlbGVjdENhc2NhZGVFbGVtZW50IiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJBc3luY1NlbGVjdE11bHRpRWxlbWVudCIsICJPVFBJbnB1dEVsZW1lbnQiXQp9Cg==