@gnwebsoft/ui 3.0.4 → 3.0.6

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,2265 @@
1
+ import {
2
+ useEnhancedTransform,
3
+ useTransform
4
+ } from "./chunk-DE62KYFK.js";
5
+
6
+ // src/wrappers/AsyncMultiSelect2/AsyncMultiSelect2.tsx
7
+ import {
8
+ Autocomplete,
9
+ CircularProgress,
10
+ Grid,
11
+ TextField,
12
+ useTheme
13
+ } from "@mui/material";
14
+ import { debounce } from "lodash";
15
+ import { useCallback, useEffect, useReducer, useMemo } from "react";
16
+ import { useController } from "react-hook-form";
17
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
18
+ var initialState = {
19
+ options: [],
20
+ selectedOptions: [],
21
+ inputValue: "",
22
+ loading: false,
23
+ initialLoaded: false
24
+ };
25
+ function componentReducer(state, action) {
26
+ switch (action.type) {
27
+ case "SET_OPTIONS":
28
+ return { ...state, options: action.payload, loading: false };
29
+ case "SET_SELECTED_OPTIONS":
30
+ return { ...state, selectedOptions: action.payload };
31
+ case "SET_INPUT_VALUE":
32
+ return { ...state, inputValue: action.payload };
33
+ case "SET_LOADING":
34
+ return { ...state, loading: action.payload };
35
+ case "SET_INITIAL_LOADED":
36
+ return { ...state, initialLoaded: action.payload };
37
+ case "RESET_OPTIONS":
38
+ return { ...state, options: state.selectedOptions };
39
+ default:
40
+ return state;
41
+ }
42
+ }
43
+ var AsyncMultiSelect2Component = ({
44
+ name,
45
+ control,
46
+ placeholder,
47
+ initialValues,
48
+ label,
49
+ queryFn,
50
+ variant = "outlined",
51
+ sx,
52
+ disabled = false,
53
+ debounceMs = 400,
54
+ loadingText = "Loading...",
55
+ noOptionsText = "No options",
56
+ renderInput,
57
+ ...rest
58
+ }) => {
59
+ const [state, dispatch] = useReducer(componentReducer, initialState);
60
+ const theme = useTheme();
61
+ const {
62
+ field,
63
+ fieldState: { error }
64
+ } = useController({
65
+ name,
66
+ control
67
+ });
68
+ const debouncedFetch = useMemo(
69
+ () => debounce(async (payload) => {
70
+ try {
71
+ const results = await queryFn(payload);
72
+ const mergedOptions = [
73
+ ...state.selectedOptions,
74
+ ...results.filter(
75
+ (option) => !state.selectedOptions.some((selected) => selected.value === option.value)
76
+ )
77
+ ];
78
+ dispatch({ type: "SET_OPTIONS", payload: mergedOptions });
79
+ } catch (_error) {
80
+ dispatch({ type: "SET_LOADING", payload: false });
81
+ }
82
+ }, debounceMs),
83
+ [queryFn, state.selectedOptions, debounceMs]
84
+ );
85
+ useEffect(() => {
86
+ if (!initialValues?.length || state.initialLoaded) return;
87
+ dispatch({ type: "SET_LOADING", payload: true });
88
+ const payload = {
89
+ query: null,
90
+ initialValues
91
+ };
92
+ queryFn(payload).then((results) => {
93
+ if (results) {
94
+ dispatch({ type: "SET_SELECTED_OPTIONS", payload: results });
95
+ dispatch({ type: "SET_OPTIONS", payload: results });
96
+ dispatch({ type: "SET_INITIAL_LOADED", payload: true });
97
+ field.onChange(results.map((option) => option.value));
98
+ }
99
+ dispatch({ type: "SET_LOADING", payload: false });
100
+ }).catch((_error) => {
101
+ dispatch({ type: "SET_LOADING", payload: false });
102
+ });
103
+ }, [initialValues, state.initialLoaded, queryFn, field]);
104
+ useEffect(() => {
105
+ if (!state.initialLoaded) return;
106
+ if (state.inputValue === "") {
107
+ dispatch({ type: "RESET_OPTIONS" });
108
+ return;
109
+ }
110
+ dispatch({ type: "SET_LOADING", payload: true });
111
+ const payload = {
112
+ query: state.inputValue,
113
+ initialValues: null
114
+ };
115
+ debouncedFetch(payload);
116
+ }, [state.inputValue, state.initialLoaded, debouncedFetch]);
117
+ const handleChange = useCallback(
118
+ (event, newValue) => {
119
+ dispatch({ type: "SET_SELECTED_OPTIONS", payload: newValue });
120
+ field.onChange(newValue.map((option) => option.value));
121
+ },
122
+ [field]
123
+ );
124
+ const handleInputChange = useCallback(
125
+ (event, newInputValue) => {
126
+ dispatch({ type: "SET_INPUT_VALUE", payload: newInputValue });
127
+ },
128
+ []
129
+ );
130
+ const isOptionEqualToValue = useCallback(
131
+ (option, value) => option.value === value.value,
132
+ []
133
+ );
134
+ const getOptionLabel = useCallback((option) => option.label, []);
135
+ const defaultRenderInput = useCallback(
136
+ (params) => /* @__PURE__ */ jsx(
137
+ TextField,
138
+ {
139
+ ...params,
140
+ label,
141
+ placeholder,
142
+ variant,
143
+ error: !!error,
144
+ helperText: error?.message,
145
+ slotProps: {
146
+ input: {
147
+ ...params.InputProps,
148
+ endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
149
+ state.loading && /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }),
150
+ params.InputProps.endAdornment
151
+ ] })
152
+ }
153
+ },
154
+ sx: {
155
+ "& .MuiInputBase-input": {
156
+ cursor: disabled ? "not-allowed" : "default"
157
+ },
158
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
159
+ ...sx
160
+ }
161
+ }
162
+ ),
163
+ [label, placeholder, variant, error, state.loading, disabled, theme.palette.action.disabledBackground, sx]
164
+ );
165
+ return /* @__PURE__ */ jsx(
166
+ Autocomplete,
167
+ {
168
+ multiple: true,
169
+ options: state.options,
170
+ value: state.selectedOptions,
171
+ loading: state.loading,
172
+ disabled,
173
+ isOptionEqualToValue,
174
+ getOptionLabel,
175
+ filterSelectedOptions: true,
176
+ onChange: handleChange,
177
+ onInputChange: handleInputChange,
178
+ loadingText,
179
+ noOptionsText,
180
+ renderInput: renderInput || defaultRenderInput,
181
+ ...rest
182
+ }
183
+ );
184
+ };
185
+ var AsyncMultiSelect2 = ({
186
+ gridProps,
187
+ ...props
188
+ }) => {
189
+ if (gridProps) {
190
+ return /* @__PURE__ */ jsx(Grid, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx(AsyncMultiSelect2Component, { ...props }) });
191
+ }
192
+ return /* @__PURE__ */ jsx(AsyncMultiSelect2Component, { ...props });
193
+ };
194
+ AsyncMultiSelect2.displayName = "AsyncMultiSelect2";
195
+
196
+ // src/wrappers/CheckboxElement/CheckboxElement.tsx
197
+ import {
198
+ Checkbox,
199
+ FormControl,
200
+ FormControlLabel,
201
+ FormGroup,
202
+ FormHelperText,
203
+ Grid as Grid2,
204
+ useTheme as useTheme2
205
+ } from "@mui/material";
206
+ import {
207
+ useController as useController2
208
+ } from "react-hook-form";
209
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
210
+ var Component = function CheckboxElement(props) {
211
+ const {
212
+ name,
213
+ control,
214
+ label,
215
+ labelProps,
216
+ helperText,
217
+ parseError,
218
+ transform,
219
+ disabled,
220
+ sx,
221
+ onChange: customOnChange,
222
+ ...rest
223
+ } = props;
224
+ const theme = useTheme2();
225
+ const {
226
+ field,
227
+ fieldState: { error }
228
+ } = useController2({
229
+ name,
230
+ control,
231
+ disabled
232
+ });
233
+ const { value, onChange } = useTransform({
234
+ value: field.value,
235
+ onChange: field.onChange,
236
+ transform: {
237
+ input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
238
+ output: typeof transform?.output === "function" ? transform.output : (checked) => checked
239
+ }
240
+ });
241
+ const handleChange = (event, checked) => {
242
+ onChange(event, checked);
243
+ if (typeof customOnChange === "function") {
244
+ customOnChange(event, checked);
245
+ }
246
+ };
247
+ const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
248
+ return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
249
+ /* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
250
+ FormControlLabel,
251
+ {
252
+ label: label || "",
253
+ ...labelProps,
254
+ disabled,
255
+ control: /* @__PURE__ */ jsx2(
256
+ Checkbox,
257
+ {
258
+ ...rest,
259
+ color: rest.color || "primary",
260
+ sx: [
261
+ ...Array.isArray(sx) ? sx : [sx],
262
+ {
263
+ color: error ? theme.palette.error.main : disabled ? theme.palette.action.disabled : void 0,
264
+ "&.Mui-disabled": {
265
+ color: theme.palette.action.disabled
266
+ }
267
+ }
268
+ ],
269
+ checked: value,
270
+ disabled,
271
+ onChange: handleChange,
272
+ ref: field.ref
273
+ }
274
+ )
275
+ }
276
+ ) }),
277
+ (displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
278
+ ] });
279
+ };
280
+ var CheckboxElement2 = ({
281
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
282
+ ...props
283
+ }) => {
284
+ if (gridProps) {
285
+ return /* @__PURE__ */ jsx2(
286
+ Grid2,
287
+ {
288
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
289
+ children: /* @__PURE__ */ jsx2(Component, { ...props })
290
+ }
291
+ );
292
+ }
293
+ return /* @__PURE__ */ jsx2(Component, { ...props });
294
+ };
295
+ CheckboxElement2.displayName = "CheckboxElement";
296
+
297
+ // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
298
+ import {
299
+ Checkbox as Checkbox2,
300
+ FormControl as FormControl2,
301
+ FormControlLabel as FormControlLabel2,
302
+ FormGroup as FormGroup2,
303
+ FormHelperText as FormHelperText2,
304
+ Grid as Grid3
305
+ } from "@mui/material";
306
+ import { useEffect as useEffect2, useState } from "react";
307
+ import {
308
+ useController as useController3
309
+ } from "react-hook-form";
310
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
311
+ var Component2 = function CheckboxGroup(props) {
312
+ const { name, control, label, labelProps, inputRef, options, ...rest } = props;
313
+ const {
314
+ field,
315
+ fieldState: { error }
316
+ } = useController3({
317
+ name,
318
+ control,
319
+ disabled: rest.disabled
320
+ });
321
+ const [selectedValues, setSelectedValues] = useState(
322
+ options.filter((c) => field.value?.includes(c.Value)).map((c) => c.Value) || []
323
+ );
324
+ useEffect2(() => {
325
+ field.onChange(selectedValues ? [...selectedValues] : []);
326
+ }, [selectedValues]);
327
+ const handleChange = (event) => {
328
+ const value = parseInt(event.target.value, 10);
329
+ if (event.target.checked) {
330
+ setSelectedValues([...selectedValues, value]);
331
+ } else {
332
+ setSelectedValues(selectedValues.filter((item) => item !== value));
333
+ }
334
+ };
335
+ return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
336
+ /* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options.map((option) => /* @__PURE__ */ jsx3(
337
+ FormControlLabel2,
338
+ {
339
+ label: option.Label,
340
+ ...labelProps,
341
+ control: /* @__PURE__ */ jsx3(
342
+ Checkbox2,
343
+ {
344
+ ...rest,
345
+ color: rest.color || "primary",
346
+ sx: [
347
+ ...Array.isArray(rest.sx) ? rest.sx : [rest.sx],
348
+ {
349
+ color: error ? "error.main" : void 0
350
+ }
351
+ ],
352
+ value: option.Value,
353
+ checked: selectedValues.includes(option.Value),
354
+ onChange: handleChange
355
+ }
356
+ )
357
+ },
358
+ `${option.Value}`
359
+ )) }),
360
+ error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
361
+ ] });
362
+ };
363
+ var CheckboxGroup2 = ({
364
+ gridProps,
365
+ ...props
366
+ }) => {
367
+ if (gridProps) {
368
+ return /* @__PURE__ */ jsx3(Grid3, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx3(Component2, { ...props }) });
369
+ }
370
+ return /* @__PURE__ */ jsx3(Component2, { ...props });
371
+ };
372
+ CheckboxGroup2.displayName = "CheckboxGroup";
373
+
374
+ // src/wrappers/DatePickerElement/DatePickerElement.tsx
375
+ import { Grid as Grid4 } from "@mui/material";
376
+ import { forwardRef as forwardRef2 } from "react";
377
+
378
+ // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
379
+ import { useForkRef } from "@mui/material";
380
+ import { DatePicker } from "@mui/x-date-pickers";
381
+ import { forwardRef, useCallback as useCallback3, useMemo as useMemo5 } from "react";
382
+ import { useController as useController4 } from "react-hook-form";
383
+
384
+ // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
385
+ import { useLocalizationContext } from "@mui/x-date-pickers/internals";
386
+ import { useCallback as useCallback2, useMemo as useMemo2 } from "react";
387
+ function readDatePickerValueAsDate(adapter, value) {
388
+ if (value === null || value === void 0) {
389
+ return null;
390
+ }
391
+ if (typeof value === "string") {
392
+ if (value === "") {
393
+ return null;
394
+ }
395
+ const parsedDate = adapter.utils.date(value);
396
+ return parsedDate;
397
+ }
398
+ return value;
399
+ }
400
+ function useDatePickerValue(options) {
401
+ const { field, transform } = options;
402
+ const adapter = useLocalizationContext();
403
+ const value = useMemo2(() => {
404
+ if (typeof transform?.input === "function") {
405
+ return transform.input(field.value);
406
+ }
407
+ return readDatePickerValueAsDate(adapter, field.value);
408
+ }, [field.value, transform?.input, adapter]);
409
+ const onChange = useCallback2(
410
+ (newValue, context) => {
411
+ if (typeof transform?.output === "function") {
412
+ const transformedValue = transform.output(newValue, context);
413
+ field.onChange(transformedValue);
414
+ } else {
415
+ field.onChange(newValue);
416
+ }
417
+ },
418
+ [field.onChange, transform?.output]
419
+ );
420
+ return {
421
+ value,
422
+ onChange
423
+ };
424
+ }
425
+
426
+ // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
427
+ import { useMemo as useMemo3 } from "react";
428
+ var DEFAULT_ERROR_MESSAGES = {
429
+ invalidDate: "Please enter a valid date",
430
+ minDate: "Date must be after the minimum allowed date",
431
+ maxDate: "Date must be before the maximum allowed date",
432
+ disabledDate: "This date is not allowed",
433
+ required: "This field is required"
434
+ };
435
+ function useDatePickerValidation(options) {
436
+ const { fieldState, validation, parseError, value } = options;
437
+ const validationResult = useMemo3(() => {
438
+ const { error: fieldError, invalid } = fieldState;
439
+ let currentError = fieldError;
440
+ if (!fieldError && value && validation) {
441
+ const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
442
+ if (minDate && value < minDate) {
443
+ currentError = {
444
+ type: "minDate",
445
+ message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
446
+ };
447
+ } else if (maxDate && value > maxDate) {
448
+ currentError = {
449
+ type: "maxDate",
450
+ message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
451
+ };
452
+ } else if (shouldDisableDate && shouldDisableDate(value)) {
453
+ currentError = {
454
+ type: "disabledDate",
455
+ message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
456
+ };
457
+ }
458
+ }
459
+ const hasError = Boolean(currentError);
460
+ return {
461
+ hasError,
462
+ error: currentError,
463
+ invalid: invalid || hasError
464
+ };
465
+ }, [fieldState, validation, value]);
466
+ const errorMessage = useMemo3(() => {
467
+ if (!validationResult.error) {
468
+ return null;
469
+ }
470
+ if (parseError) {
471
+ return parseError(validationResult.error);
472
+ }
473
+ if (typeof validationResult.error === "string") {
474
+ return validationResult.error;
475
+ }
476
+ if ("message" in validationResult.error && validationResult.error.message) {
477
+ return validationResult.error.message;
478
+ }
479
+ if ("type" in validationResult.error) {
480
+ const errorType = validationResult.error.type;
481
+ switch (errorType) {
482
+ case "required":
483
+ return DEFAULT_ERROR_MESSAGES.required;
484
+ case "minDate":
485
+ return DEFAULT_ERROR_MESSAGES.minDate;
486
+ case "maxDate":
487
+ return DEFAULT_ERROR_MESSAGES.maxDate;
488
+ case "disabledDate":
489
+ return DEFAULT_ERROR_MESSAGES.disabledDate;
490
+ case "invalidDate":
491
+ default:
492
+ return DEFAULT_ERROR_MESSAGES.invalidDate;
493
+ }
494
+ }
495
+ return DEFAULT_ERROR_MESSAGES.invalidDate;
496
+ }, [validationResult.error, parseError]);
497
+ return {
498
+ ...validationResult,
499
+ errorMessage
500
+ };
501
+ }
502
+
503
+ // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
504
+ import { useTheme as useTheme3 } from "@mui/material";
505
+ import { useMemo as useMemo4 } from "react";
506
+ function useDatePickerStyles(options = {}) {
507
+ const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
508
+ const theme = useTheme3();
509
+ const computedSx = useMemo4(() => {
510
+ const baseStyles = {
511
+ // Input field styling
512
+ "& .MuiOutlinedInput-root": {
513
+ backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
514
+ // Transition for smooth state changes
515
+ transition: theme.transitions.create([
516
+ "background-color",
517
+ "border-color",
518
+ "color"
519
+ ], {
520
+ duration: theme.transitions.duration.short
521
+ }),
522
+ // Error state styling
523
+ ...hasError && {
524
+ borderColor: theme.palette.error.main,
525
+ "&:hover": {
526
+ borderColor: theme.palette.error.main
527
+ },
528
+ "&.Mui-focused": {
529
+ borderColor: theme.palette.error.main,
530
+ boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
531
+ // 25 is 15% opacity in hex
532
+ }
533
+ },
534
+ // Loading state styling
535
+ ...loading && {
536
+ opacity: 0.7,
537
+ pointerEvents: "none"
538
+ }
539
+ },
540
+ // Input element styling
541
+ "& .MuiInputBase-input": {
542
+ cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
543
+ // Read-only specific styling
544
+ ...textReadOnly && !disabled && {
545
+ cursor: "pointer",
546
+ userSelect: "none",
547
+ caretColor: "transparent"
548
+ // Hide text cursor in read-only mode
549
+ },
550
+ // Loading state
551
+ ...loading && {
552
+ cursor: "wait"
553
+ }
554
+ },
555
+ // Required field asterisk styling
556
+ "& .MuiInputLabel-asterisk": {
557
+ color: theme.palette.error.main,
558
+ fontSize: "1.2em"
559
+ },
560
+ // Label styling with better contrast
561
+ "& .MuiInputLabel-root": {
562
+ color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
563
+ // Ensure proper contrast for disabled state
564
+ ...disabled && {
565
+ color: theme.palette.text.disabled
566
+ }
567
+ },
568
+ // Helper text styling
569
+ "& .MuiFormHelperText-root": {
570
+ marginLeft: theme.spacing(1),
571
+ marginRight: theme.spacing(1),
572
+ // Error state
573
+ ...hasError && {
574
+ color: theme.palette.error.main
575
+ }
576
+ },
577
+ // Calendar icon styling
578
+ "& .MuiInputAdornment-root": {
579
+ color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
580
+ },
581
+ // Focus ring for accessibility
582
+ "& .MuiOutlinedInput-root.Mui-focused": {
583
+ outline: `2px solid ${theme.palette.primary.main}50`,
584
+ // 50 is 31% opacity
585
+ outlineOffset: "2px"
586
+ },
587
+ // Enhanced contrast for dark themes
588
+ ...theme.palette.mode === "dark" && {
589
+ "& .MuiOutlinedInput-root": {
590
+ borderWidth: 2
591
+ }
592
+ }
593
+ };
594
+ return customSx ? [baseStyles, customSx] : baseStyles;
595
+ }, [
596
+ theme,
597
+ disabled,
598
+ hasError,
599
+ loading,
600
+ textReadOnly,
601
+ customSx
602
+ ]);
603
+ const className = useMemo4(() => {
604
+ const classes = [];
605
+ if (disabled) classes.push("DatePickerElement--disabled");
606
+ if (hasError) classes.push("DatePickerElement--error");
607
+ if (loading) classes.push("DatePickerElement--loading");
608
+ if (textReadOnly) classes.push("DatePickerElement--readOnly");
609
+ return classes.length > 0 ? classes.join(" ") : void 0;
610
+ }, [disabled, hasError, loading, textReadOnly]);
611
+ return {
612
+ sx: computedSx,
613
+ className
614
+ };
615
+ }
616
+
617
+ // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
618
+ import { jsx as jsx4 } from "react/jsx-runtime";
619
+ var DatePickerElementCore = forwardRef((props, ref) => {
620
+ const {
621
+ name,
622
+ required = false,
623
+ rules,
624
+ control,
625
+ parseError,
626
+ transform,
627
+ validation,
628
+ label,
629
+ placeholder,
630
+ textReadOnly = false,
631
+ helperText,
632
+ inputProps = {},
633
+ slotProps = {},
634
+ datePickerProps = {},
635
+ variant = "outlined",
636
+ sx: customSx,
637
+ loading = false,
638
+ LoadingComponent,
639
+ ...restProps
640
+ } = props;
641
+ const {
642
+ disabled,
643
+ inputRef: externalInputRef,
644
+ onClose,
645
+ ...restDatePickerProps
646
+ } = datePickerProps;
647
+ const {
648
+ field,
649
+ fieldState
650
+ } = useController4({
651
+ name,
652
+ control,
653
+ rules,
654
+ defaultValue: null
655
+ // Let react-hook-form handle the default value typing
656
+ });
657
+ const { value, onChange: onValueChange } = useDatePickerValue({
658
+ field,
659
+ transform
660
+ });
661
+ const { hasError, errorMessage, invalid } = useDatePickerValidation({
662
+ fieldState,
663
+ validation,
664
+ parseError,
665
+ value
666
+ });
667
+ const { sx: computedSx, className } = useDatePickerStyles({
668
+ disabled,
669
+ hasError,
670
+ loading,
671
+ textReadOnly,
672
+ sx: customSx
673
+ });
674
+ const handleInputRef = useForkRef(field.ref, externalInputRef);
675
+ const handleChange = useCallback3(
676
+ (newValue, context) => {
677
+ onValueChange(newValue, context);
678
+ },
679
+ [onValueChange]
680
+ );
681
+ const handleClose = useCallback3(
682
+ (...args) => {
683
+ field.onBlur();
684
+ if (onClose) {
685
+ onClose(...args);
686
+ }
687
+ },
688
+ [field.onBlur, onClose]
689
+ );
690
+ const handleTextFieldBlur = useCallback3(
691
+ (event) => {
692
+ field.onBlur();
693
+ if (typeof inputProps.onBlur === "function") {
694
+ inputProps.onBlur(event);
695
+ }
696
+ },
697
+ [field.onBlur, inputProps.onBlur]
698
+ );
699
+ const memoizedSlotProps = useMemo5(() => ({
700
+ ...slotProps,
701
+ actionBar: {
702
+ actions: ["clear", "today", "cancel", "accept"],
703
+ ...slotProps.actionBar
704
+ },
705
+ textField: {
706
+ ...inputProps,
707
+ required,
708
+ placeholder,
709
+ fullWidth: true,
710
+ variant,
711
+ onBlur: handleTextFieldBlur,
712
+ error: hasError,
713
+ helperText: hasError ? errorMessage : helperText,
714
+ inputProps: {
715
+ readOnly: textReadOnly,
716
+ "aria-invalid": invalid,
717
+ "aria-describedby": hasError ? `${name}-error` : void 0,
718
+ ...inputProps.inputProps
719
+ },
720
+ // Add loading indicator if provided
721
+ ...loading && LoadingComponent && {
722
+ InputProps: {
723
+ endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
724
+ ...inputProps.InputProps
725
+ }
726
+ },
727
+ ...slotProps.textField
728
+ }
729
+ }), [
730
+ slotProps,
731
+ inputProps,
732
+ required,
733
+ placeholder,
734
+ variant,
735
+ handleTextFieldBlur,
736
+ hasError,
737
+ errorMessage,
738
+ helperText,
739
+ textReadOnly,
740
+ invalid,
741
+ name,
742
+ loading,
743
+ LoadingComponent
744
+ ]);
745
+ return /* @__PURE__ */ jsx4(
746
+ DatePicker,
747
+ {
748
+ ...restProps,
749
+ ...restDatePickerProps,
750
+ ref,
751
+ name,
752
+ value,
753
+ onChange: handleChange,
754
+ onClose: handleClose,
755
+ inputRef: handleInputRef,
756
+ label,
757
+ disabled,
758
+ sx: computedSx,
759
+ className,
760
+ slotProps: memoizedSlotProps,
761
+ "aria-invalid": invalid,
762
+ "aria-describedby": hasError ? `${name}-error` : void 0
763
+ }
764
+ );
765
+ });
766
+ DatePickerElementCore.displayName = "DatePickerElementCore";
767
+
768
+ // src/wrappers/DatePickerElement/DatePickerElement.tsx
769
+ import { jsx as jsx5 } from "react/jsx-runtime";
770
+ var DatePickerElement = forwardRef2((props, ref) => {
771
+ const {
772
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
773
+ ...coreProps
774
+ } = props;
775
+ if (gridProps === false) {
776
+ return /* @__PURE__ */ jsx5(
777
+ DatePickerElementCore,
778
+ {
779
+ ref,
780
+ ...coreProps
781
+ }
782
+ );
783
+ }
784
+ return /* @__PURE__ */ jsx5(
785
+ Grid4,
786
+ {
787
+ ref,
788
+ ...gridProps,
789
+ children: /* @__PURE__ */ jsx5(
790
+ DatePickerElementCore,
791
+ {
792
+ ...coreProps
793
+ }
794
+ )
795
+ }
796
+ );
797
+ });
798
+ DatePickerElement.displayName = "DatePickerElement";
799
+
800
+ // src/wrappers/DatePickerElement/utils.ts
801
+ function isValidDate(value) {
802
+ if (value === null || value === void 0) {
803
+ return false;
804
+ }
805
+ if (value instanceof Date) {
806
+ return !isNaN(value.getTime());
807
+ }
808
+ if (typeof value === "object" && value !== null) {
809
+ if ("isValid" in value && typeof value.isValid === "function") {
810
+ return value.isValid();
811
+ }
812
+ if ("isValid" in value && typeof value.isValid === "boolean") {
813
+ return value.isValid;
814
+ }
815
+ }
816
+ return false;
817
+ }
818
+ function isParsableDateString(value) {
819
+ if (typeof value !== "string" || value === "") {
820
+ return false;
821
+ }
822
+ const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
823
+ if (isoDateRegex.test(value)) {
824
+ return true;
825
+ }
826
+ const parsed = new Date(value);
827
+ return !isNaN(parsed.getTime());
828
+ }
829
+ function createDateInputTransform(adapter) {
830
+ return (value) => {
831
+ if (value === null || value === void 0) {
832
+ return null;
833
+ }
834
+ if (typeof value === "string") {
835
+ if (value === "") {
836
+ return null;
837
+ }
838
+ try {
839
+ const parsed = adapter.utils.date(value);
840
+ return isValidDate(parsed) ? parsed : null;
841
+ } catch {
842
+ return null;
843
+ }
844
+ }
845
+ if (isValidDate(value)) {
846
+ return value;
847
+ }
848
+ return null;
849
+ };
850
+ }
851
+ function createDateOutputTransform(format) {
852
+ return (value) => {
853
+ if (value === null || value === void 0) {
854
+ return null;
855
+ }
856
+ if (!isValidDate(value)) {
857
+ return null;
858
+ }
859
+ if (!format) {
860
+ return value;
861
+ }
862
+ try {
863
+ if (value instanceof Date) {
864
+ if (format === "iso") {
865
+ return value.toISOString();
866
+ }
867
+ if (format === "date-only") {
868
+ return value.toISOString().split("T")[0];
869
+ }
870
+ }
871
+ if (typeof value.format === "function") {
872
+ return value.format(format);
873
+ }
874
+ if (typeof value.format === "function") {
875
+ return value.format(format);
876
+ }
877
+ if (typeof value.toFormat === "function") {
878
+ return value.toFormat(format);
879
+ }
880
+ return value;
881
+ } catch {
882
+ return null;
883
+ }
884
+ };
885
+ }
886
+ function createDefaultDatePickerConfig() {
887
+ return {
888
+ // Default slot props for consistent behavior
889
+ slotProps: {
890
+ actionBar: {
891
+ actions: ["clear", "today", "cancel", "accept"]
892
+ },
893
+ textField: {
894
+ fullWidth: true,
895
+ variant: "outlined"
896
+ }
897
+ },
898
+ // Default grid props for layout consistency
899
+ gridProps: {
900
+ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
901
+ },
902
+ // Default validation configuration
903
+ validation: {
904
+ errorMessages: {
905
+ invalidDate: "Please enter a valid date",
906
+ minDate: "Date must be after the minimum allowed date",
907
+ maxDate: "Date must be before the maximum allowed date",
908
+ disabledDate: "This date is not allowed"
909
+ }
910
+ }
911
+ };
912
+ }
913
+ function extractErrorMessage(error) {
914
+ if (error === null || error === void 0) {
915
+ return "";
916
+ }
917
+ if (typeof error === "string") {
918
+ return error;
919
+ }
920
+ if (typeof error === "object" && error !== null) {
921
+ if ("message" in error && typeof error.message === "string") {
922
+ return error.message;
923
+ }
924
+ if ("type" in error && typeof error.type === "string") {
925
+ const errorType = error.type;
926
+ switch (errorType) {
927
+ case "invalidDate":
928
+ return "Please enter a valid date";
929
+ case "minDate":
930
+ return "Date is too early";
931
+ case "maxDate":
932
+ return "Date is too late";
933
+ case "disabledDate":
934
+ return "This date is not available";
935
+ default:
936
+ return "Invalid date selection";
937
+ }
938
+ }
939
+ }
940
+ return "Invalid input";
941
+ }
942
+ function createStableKey(config) {
943
+ try {
944
+ return JSON.stringify(config, (key, value) => {
945
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
946
+ const sorted = {};
947
+ Object.keys(value).sort().forEach((k) => {
948
+ sorted[k] = value[k];
949
+ });
950
+ return sorted;
951
+ }
952
+ return value;
953
+ });
954
+ } catch {
955
+ return Object.keys(config).sort().join("-");
956
+ }
957
+ }
958
+
959
+ // src/wrappers/PasswordElement/PasswordElement.tsx
960
+ import Visibility from "@mui/icons-material/Visibility";
961
+ import VisibilityOff from "@mui/icons-material/VisibilityOff";
962
+ import {
963
+ IconButton,
964
+ InputAdornment,
965
+ TextField as TextField2,
966
+ useForkRef as useForkRef2,
967
+ Grid as Grid5
968
+ } from "@mui/material";
969
+ import { useState as useState2 } from "react";
970
+ import {
971
+ useController as useController5
972
+ } from "react-hook-form";
973
+ import { jsx as jsx6 } from "react/jsx-runtime";
974
+ var Component3 = function PasswordEl(props) {
975
+ const {
976
+ type,
977
+ required,
978
+ iconColor,
979
+ renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
980
+ slotProps,
981
+ name,
982
+ control,
983
+ component: TextFieldComponent = TextField2,
984
+ inputRef,
985
+ onBlur,
986
+ ...rest
987
+ } = props;
988
+ const [password, setPassword] = useState2(true);
989
+ const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
990
+ IconButton,
991
+ {
992
+ onMouseDown: (e) => e.preventDefault(),
993
+ onClick: () => setPassword(!password),
994
+ tabIndex: -1,
995
+ color: iconColor ?? "default",
996
+ children: renderIcon(password)
997
+ }
998
+ ) });
999
+ const {
1000
+ field,
1001
+ fieldState: { error }
1002
+ } = useController5({
1003
+ name,
1004
+ control
1005
+ });
1006
+ const handleInputRef = useForkRef2(field.ref, inputRef);
1007
+ return /* @__PURE__ */ jsx6(
1008
+ TextField2,
1009
+ {
1010
+ ...rest,
1011
+ inputRef: handleInputRef,
1012
+ type: password ? "password" : "text",
1013
+ value: field.value,
1014
+ fullWidth: true,
1015
+ onChange: (event) => {
1016
+ field.onChange(event);
1017
+ if (typeof rest.onChange === "function") {
1018
+ rest.onChange(event);
1019
+ }
1020
+ },
1021
+ onBlur: (event) => {
1022
+ field.onBlur();
1023
+ if (typeof onBlur === "function") {
1024
+ onBlur(event);
1025
+ }
1026
+ },
1027
+ ...typeof slotProps === "undefined" ? {
1028
+ InputProps: {
1029
+ endAdornment
1030
+ }
1031
+ } : {
1032
+ slotProps: {
1033
+ ...slotProps,
1034
+ input: {
1035
+ endAdornment,
1036
+ ...slotProps?.input
1037
+ }
1038
+ }
1039
+ },
1040
+ error: !!error,
1041
+ helperText: error ? error.message : ""
1042
+ }
1043
+ );
1044
+ };
1045
+ var PasswordElement = ({
1046
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1047
+ ...props
1048
+ }) => {
1049
+ if (gridProps) {
1050
+ return /* @__PURE__ */ jsx6(
1051
+ Grid5,
1052
+ {
1053
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1054
+ children: /* @__PURE__ */ jsx6(Component3, { ...props })
1055
+ }
1056
+ );
1057
+ }
1058
+ return /* @__PURE__ */ jsx6(Component3, { ...props });
1059
+ };
1060
+ PasswordElement.displayName = "PasswordElement";
1061
+ var PasswordElement_default = PasswordElement;
1062
+
1063
+ // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1064
+ import {
1065
+ FormControl as FormControl3,
1066
+ FormControlLabel as FormControlLabel3,
1067
+ FormHelperText as FormHelperText3,
1068
+ FormLabel,
1069
+ Radio,
1070
+ RadioGroup,
1071
+ useTheme as useTheme4,
1072
+ Grid as Grid6
1073
+ } from "@mui/material";
1074
+ import {
1075
+ useController as useController6
1076
+ } from "react-hook-form";
1077
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
1078
+ var Component4 = function RadioButtonGroup(props) {
1079
+ const {
1080
+ options,
1081
+ label,
1082
+ name,
1083
+ labelKey = "label",
1084
+ valueKey = "id",
1085
+ disabledKey = "disabled",
1086
+ required,
1087
+ emptyOptionLabel,
1088
+ returnObject,
1089
+ row,
1090
+ control,
1091
+ type,
1092
+ labelProps,
1093
+ disabled,
1094
+ formLabelProps,
1095
+ radioProps,
1096
+ transform,
1097
+ ...rest
1098
+ } = props;
1099
+ const theme = useTheme4();
1100
+ const {
1101
+ field,
1102
+ fieldState: { error }
1103
+ } = useController6({
1104
+ name,
1105
+ disabled,
1106
+ control
1107
+ });
1108
+ const { value, onChange } = useTransform({
1109
+ value: field.value,
1110
+ onChange: field.onChange,
1111
+ transform: {
1112
+ input: typeof transform?.input === "function" ? transform.input : (value2) => {
1113
+ return value2 || "";
1114
+ },
1115
+ output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
1116
+ if (value2 && type === "number") {
1117
+ return Number(value2);
1118
+ }
1119
+ if (value2 && type === "boolean") {
1120
+ return Boolean(value2);
1121
+ }
1122
+ return value2;
1123
+ }
1124
+ }
1125
+ });
1126
+ const onRadioChange = (event, radioValue) => {
1127
+ const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
1128
+ onChange(event, returnValue);
1129
+ if (typeof rest.onChange === "function") {
1130
+ rest.onChange(returnValue);
1131
+ }
1132
+ };
1133
+ return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
1134
+ label && /* @__PURE__ */ jsx7(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
1135
+ /* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1136
+ emptyOptionLabel && /* @__PURE__ */ jsx7(
1137
+ FormControlLabel3,
1138
+ {
1139
+ ...labelProps,
1140
+ control: /* @__PURE__ */ jsx7(
1141
+ Radio,
1142
+ {
1143
+ ...radioProps,
1144
+ sx: {
1145
+ color: error ? theme.palette.error.main : void 0
1146
+ },
1147
+ checked: !value
1148
+ }
1149
+ ),
1150
+ label: emptyOptionLabel,
1151
+ value: ""
1152
+ }
1153
+ ),
1154
+ options.map((option) => {
1155
+ const optionKey = option[valueKey];
1156
+ const optionDisabled = option[disabledKey] || false;
1157
+ let val = returnObject ? value?.[valueKey] : value;
1158
+ if (type === "number" && val !== void 0) {
1159
+ val = Number(val);
1160
+ } else if (type === "boolean" && val !== void 0) {
1161
+ val = Boolean(val);
1162
+ }
1163
+ const isChecked = val === optionKey;
1164
+ return /* @__PURE__ */ jsx7(
1165
+ FormControlLabel3,
1166
+ {
1167
+ ...labelProps,
1168
+ control: /* @__PURE__ */ jsx7(
1169
+ Radio,
1170
+ {
1171
+ ...radioProps,
1172
+ sx: {
1173
+ color: error ? theme.palette.error.main : void 0
1174
+ },
1175
+ disabled: disabled || optionDisabled,
1176
+ checked: isChecked
1177
+ }
1178
+ ),
1179
+ value: optionKey,
1180
+ label: option[labelKey]
1181
+ },
1182
+ String(optionKey)
1183
+ );
1184
+ })
1185
+ ] }),
1186
+ error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
1187
+ ] });
1188
+ };
1189
+ var RadioButtonGroup2 = ({
1190
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1191
+ ...props
1192
+ }) => {
1193
+ if (gridProps) {
1194
+ return /* @__PURE__ */ jsx7(
1195
+ Grid6,
1196
+ {
1197
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1198
+ children: /* @__PURE__ */ jsx7(Component4, { ...props })
1199
+ }
1200
+ );
1201
+ }
1202
+ return /* @__PURE__ */ jsx7(Component4, { ...props });
1203
+ };
1204
+ RadioButtonGroup2.displayName = "RadioButtonGroup";
1205
+ var RadioButtonGroup_default = RadioButtonGroup2;
1206
+
1207
+ // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1208
+ import {
1209
+ Grid as Grid7,
1210
+ useTheme as useTheme5,
1211
+ TextField as TextField3,
1212
+ Autocomplete as Autocomplete2
1213
+ } from "@mui/material";
1214
+ import { useRef, useState as useState3, useEffect as useEffect3, useCallback as useCallback4 } from "react";
1215
+ import {
1216
+ useController as useController7
1217
+ } from "react-hook-form";
1218
+ import { jsx as jsx8 } from "react/jsx-runtime";
1219
+ var Component5 = function SelectCascadeElement(props) {
1220
+ const {
1221
+ labelKey = "Label",
1222
+ valueKey = "Value",
1223
+ name,
1224
+ onBlur,
1225
+ onChange,
1226
+ disabled,
1227
+ options,
1228
+ control,
1229
+ loading = false,
1230
+ placeholder,
1231
+ label,
1232
+ dependsOn,
1233
+ textFieldProps = {},
1234
+ variant,
1235
+ sx,
1236
+ isEdit = false,
1237
+ ...rest
1238
+ } = props;
1239
+ const { required } = textFieldProps;
1240
+ const getOptionKey = useCallback4(
1241
+ (option) => {
1242
+ if (typeof option === "string" || typeof option === "number") return option;
1243
+ const key = option ? option[valueKey] : void 0;
1244
+ return key !== void 0 && key !== null ? String(key) : "";
1245
+ },
1246
+ [valueKey]
1247
+ );
1248
+ const getOptionLabel = useCallback4(
1249
+ (option) => {
1250
+ if (typeof option === "string") return option;
1251
+ return option ? String(option[labelKey]) : "";
1252
+ },
1253
+ [labelKey]
1254
+ );
1255
+ const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1256
+ const {
1257
+ field,
1258
+ fieldState: { error }
1259
+ } = useController7({
1260
+ name,
1261
+ control
1262
+ });
1263
+ const theme = useTheme5();
1264
+ const { field: dependentField } = useController7({
1265
+ name: dependsOn,
1266
+ control
1267
+ });
1268
+ const parentValueRef = useRef(dependentField.value ?? null);
1269
+ const [hasAutoSelected, setHasAutoSelected] = useState3(false);
1270
+ useEffect3(() => {
1271
+ if (!!dependentField.value && parentValueRef?.current !== dependentField.value || dependentField.value === null) {
1272
+ field.onChange(null);
1273
+ setHasAutoSelected(false);
1274
+ }
1275
+ }, [dependentField.value]);
1276
+ useEffect3(() => {
1277
+ if (isEdit && !disabled && options.length === 1 && field.value == null && !hasAutoSelected) {
1278
+ field.onChange(getOptionKey(options[0]));
1279
+ setHasAutoSelected(true);
1280
+ } else {
1281
+ if (options.length === 1 && field.value == null && !hasAutoSelected) {
1282
+ field.onChange(getOptionKey(options[0]));
1283
+ setHasAutoSelected(true);
1284
+ }
1285
+ }
1286
+ }, [
1287
+ options,
1288
+ field.value,
1289
+ field.onChange,
1290
+ hasAutoSelected,
1291
+ isEdit,
1292
+ disabled,
1293
+ field,
1294
+ getOptionKey,
1295
+ dependentField.onChange
1296
+ ]);
1297
+ return /* @__PURE__ */ jsx8(
1298
+ Autocomplete2,
1299
+ {
1300
+ ...rest,
1301
+ value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
1302
+ size: "small",
1303
+ loading,
1304
+ options,
1305
+ getOptionKey,
1306
+ getOptionLabel,
1307
+ isOptionEqualToValue,
1308
+ ref: field.ref,
1309
+ disabled: dependentField.value == null || disabled,
1310
+ onChange: (event, newValue, reason) => {
1311
+ field.onChange(newValue ? getOptionKey(newValue) : null);
1312
+ if (onChange && typeof onChange === "function") {
1313
+ onChange(event, newValue, reason);
1314
+ }
1315
+ },
1316
+ onBlur: (event) => {
1317
+ field.onBlur();
1318
+ if (typeof onBlur === "function") {
1319
+ onBlur(event);
1320
+ }
1321
+ },
1322
+ fullWidth: true,
1323
+ renderInput: (params) => (
1324
+ // @ts-ignore
1325
+ /* @__PURE__ */ jsx8(
1326
+ TextField3,
1327
+ {
1328
+ ...params,
1329
+ fullWidth: true,
1330
+ error: !!error,
1331
+ required,
1332
+ helperText: error ? error.message : "",
1333
+ placeholder,
1334
+ label,
1335
+ variant: variant ? variant : "outlined",
1336
+ sx: {
1337
+ "& .MuiOutlinedInput-root": {
1338
+ bgcolor: disabled || dependentField.value == null ? theme.palette.action.disabledBackground : "transparent"
1339
+ },
1340
+ "& .MuiInputLabel-asterisk": { color: "red" },
1341
+ "& .MuiInputBase-input": {
1342
+ cursor: disabled || dependentField.value == null ? "not-allowed" : "default"
1343
+ },
1344
+ ...sx
1345
+ }
1346
+ }
1347
+ )
1348
+ )
1349
+ }
1350
+ );
1351
+ };
1352
+ var SelectCascadeElement2 = ({
1353
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1354
+ ...props
1355
+ }) => {
1356
+ if (gridProps) {
1357
+ return /* @__PURE__ */ jsx8(Grid7, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx8(Component5, { ...props }) });
1358
+ }
1359
+ return /* @__PURE__ */ jsx8(Component5, { ...props });
1360
+ };
1361
+ SelectCascadeElement2.displayName = "SelectCascadeElement";
1362
+ var SelectCascadeElement_default = SelectCascadeElement2;
1363
+
1364
+ // src/wrappers/SelectElement/SelectElement.tsx
1365
+ import { Grid as Grid8, useTheme as useTheme6, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
1366
+ import {
1367
+ useMemo as useMemo6,
1368
+ useEffect as useEffect4,
1369
+ useCallback as useCallback5
1370
+ } from "react";
1371
+ import {
1372
+ useController as useController8
1373
+ } from "react-hook-form";
1374
+ import { jsx as jsx9 } from "react/jsx-runtime";
1375
+ var Component6 = function SelectElement(props) {
1376
+ const {
1377
+ name,
1378
+ control,
1379
+ onChange,
1380
+ isEdit,
1381
+ options,
1382
+ label,
1383
+ sx,
1384
+ variant,
1385
+ disabled,
1386
+ labelKey = "Label",
1387
+ valueKey = "Value",
1388
+ placeholder,
1389
+ textFieldProps = {},
1390
+ ...rest
1391
+ } = props;
1392
+ const { required } = textFieldProps;
1393
+ const {
1394
+ field,
1395
+ fieldState: { error }
1396
+ } = useController8({
1397
+ name,
1398
+ control
1399
+ });
1400
+ const theme = useTheme6();
1401
+ const getOptionValue = useCallback5(
1402
+ (option) => {
1403
+ if (typeof option === "string") return option;
1404
+ return option ? option[valueKey] : null;
1405
+ },
1406
+ [valueKey]
1407
+ );
1408
+ const getOptionLabel = useCallback5(
1409
+ (option) => {
1410
+ if (typeof option === "string") return option;
1411
+ return option ? String(option[labelKey]) : "";
1412
+ },
1413
+ [labelKey]
1414
+ );
1415
+ const handleChange = (event, newValue, reason) => {
1416
+ const option = newValue;
1417
+ field.onChange(option ? getOptionValue(option) : null);
1418
+ onChange?.(event, newValue, reason);
1419
+ };
1420
+ useEffect4(() => {
1421
+ if (!isEdit && options.length === 1 && (field.value == null || field.value == void 0 || field.value === "")) {
1422
+ const defaultOption = options[0];
1423
+ const defaultValue = getOptionValue(defaultOption);
1424
+ field.onChange(defaultValue);
1425
+ }
1426
+ }, [isEdit, options]);
1427
+ const autocompleteValue = useMemo6(
1428
+ () => options.find((option) => getOptionValue(option) === field.value) ?? null,
1429
+ [field.value, options, getOptionValue]
1430
+ );
1431
+ return /* @__PURE__ */ jsx9(
1432
+ Autocomplete3,
1433
+ {
1434
+ ...rest,
1435
+ filterSelectedOptions: false,
1436
+ options,
1437
+ value: autocompleteValue,
1438
+ onChange: handleChange,
1439
+ disabled,
1440
+ getOptionLabel: (option) => getOptionLabel(option),
1441
+ ref: field.ref,
1442
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1443
+ renderInput: (params) => /* @__PURE__ */ jsx9(
1444
+ TextField4,
1445
+ {
1446
+ ...params,
1447
+ fullWidth: true,
1448
+ required,
1449
+ error: !!error,
1450
+ helperText: error ? error.message : "",
1451
+ label,
1452
+ placeholder,
1453
+ variant: variant ? variant : "outlined",
1454
+ sx: {
1455
+ "& .MuiOutlinedInput-root": {
1456
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
1457
+ },
1458
+ "& .MuiInputLabel-asterisk": { color: "red" },
1459
+ "& .MuiInputBase-input": {
1460
+ cursor: disabled ? "not-allowed" : "default"
1461
+ },
1462
+ ...sx
1463
+ }
1464
+ }
1465
+ )
1466
+ }
1467
+ );
1468
+ };
1469
+ var SelectElement2 = ({
1470
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1471
+ ...props
1472
+ }) => {
1473
+ if (gridProps) {
1474
+ return /* @__PURE__ */ jsx9(
1475
+ Grid8,
1476
+ {
1477
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1478
+ children: /* @__PURE__ */ jsx9(Component6, { ...props })
1479
+ }
1480
+ );
1481
+ }
1482
+ return /* @__PURE__ */ jsx9(Component6, { ...props });
1483
+ };
1484
+ SelectElement2.displayName = "SelectElement";
1485
+ var SelectElement_default = SelectElement2;
1486
+
1487
+ // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1488
+ import CheckBoxIcon from "@mui/icons-material/CheckBox";
1489
+ import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
1490
+ import { Grid as Grid9, Checkbox as Checkbox3, TextField as TextField5, Autocomplete as Autocomplete4, CircularProgress as CircularProgress2 } from "@mui/material";
1491
+ import { Fragment as Fragment2 } from "react";
1492
+ import { useController as useController9 } from "react-hook-form";
1493
+ import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1494
+ var Component7 = function SelectMultiElement(props) {
1495
+ const {
1496
+ name,
1497
+ control,
1498
+ onBlur,
1499
+ disabled,
1500
+ options,
1501
+ loading = false,
1502
+ placeholder,
1503
+ label,
1504
+ variant,
1505
+ sx,
1506
+ labelKey = "Label",
1507
+ valueKey = "Value",
1508
+ ...rest
1509
+ } = props;
1510
+ const {
1511
+ field,
1512
+ fieldState: { error }
1513
+ } = useController9({
1514
+ name,
1515
+ control
1516
+ });
1517
+ const getOptionValue = (option) => {
1518
+ if (typeof option === "string") return option;
1519
+ return option ? option[valueKey] : null;
1520
+ };
1521
+ const getOptionLabel = (option) => {
1522
+ if (typeof option === "string") return option;
1523
+ return option ? option[labelKey] : "";
1524
+ };
1525
+ const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1526
+ const handleChange = (_, selectedOptions, reason) => {
1527
+ if (reason === "clear") {
1528
+ field.onChange([]);
1529
+ } else if (reason === "selectOption" || reason === "removeOption") {
1530
+ const newValues = selectedOptions.map((option) => getOptionValue(option));
1531
+ field.onChange(newValues);
1532
+ }
1533
+ };
1534
+ const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
1535
+ const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
1536
+ return /* @__PURE__ */ jsx10(
1537
+ Autocomplete4,
1538
+ {
1539
+ multiple: true,
1540
+ value: selectedValue,
1541
+ loading,
1542
+ options,
1543
+ getOptionLabel,
1544
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1545
+ filterSelectedOptions: true,
1546
+ disableCloseOnSelect: true,
1547
+ ref: field.ref,
1548
+ disabled: disabled ?? field.disabled,
1549
+ onChange: handleChange,
1550
+ onBlur: (event) => {
1551
+ field.onBlur();
1552
+ if (typeof onBlur === "function") {
1553
+ onBlur(event);
1554
+ }
1555
+ },
1556
+ fullWidth: true,
1557
+ renderOption: (props1, option, { selected }) => {
1558
+ const { key, ...optionProps } = props1;
1559
+ return /* @__PURE__ */ jsxs5("li", { ...optionProps, children: [
1560
+ /* @__PURE__ */ jsx10(Checkbox3, { icon, checkedIcon, checked: selected }),
1561
+ getOptionLabel(option)
1562
+ ] }, key);
1563
+ },
1564
+ renderInput: (params) => /* @__PURE__ */ jsx10(
1565
+ TextField5,
1566
+ {
1567
+ ...params,
1568
+ label,
1569
+ error: !!error,
1570
+ helperText: error ? error.message : "",
1571
+ placeholder,
1572
+ slotProps: {
1573
+ input: {
1574
+ ...params.InputProps,
1575
+ endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
1576
+ loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
1577
+ params.InputProps.endAdornment
1578
+ ] })
1579
+ }
1580
+ },
1581
+ variant: variant ? variant : "outlined",
1582
+ sx: {
1583
+ ...sx
1584
+ }
1585
+ }
1586
+ ),
1587
+ ...rest
1588
+ }
1589
+ );
1590
+ };
1591
+ var SelectMultiElement2 = ({
1592
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1593
+ ...props
1594
+ }) => {
1595
+ if (gridProps) {
1596
+ return /* @__PURE__ */ jsx10(Grid9, { ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps }, children: /* @__PURE__ */ jsx10(Component7, { ...props }) });
1597
+ }
1598
+ return /* @__PURE__ */ jsx10(Component7, { ...props });
1599
+ };
1600
+ SelectMultiElement2.displayName = "SelectMultiElement";
1601
+ var SelectMultiElement_default = SelectMultiElement2;
1602
+
1603
+ // src/wrappers/TextFieldElement/TextFieldElement.tsx
1604
+ import {
1605
+ Grid as Grid10,
1606
+ TextField as TextField6,
1607
+ useForkRef as useForkRef3,
1608
+ useTheme as useTheme7
1609
+ } from "@mui/material";
1610
+ import {
1611
+ useController as useController10
1612
+ } from "react-hook-form";
1613
+ import { jsx as jsx11 } from "react/jsx-runtime";
1614
+ var Component8 = function TextFieldElement(props) {
1615
+ const {
1616
+ rules = {},
1617
+ parseError,
1618
+ name,
1619
+ control,
1620
+ component: TextFieldComponent = TextField6,
1621
+ gridProps,
1622
+ transform,
1623
+ label,
1624
+ placeholder,
1625
+ textFieldProps = {},
1626
+ variant,
1627
+ sx,
1628
+ ...rest
1629
+ } = props;
1630
+ const {
1631
+ type,
1632
+ required,
1633
+ helperText,
1634
+ inputRef,
1635
+ onBlur,
1636
+ disabled,
1637
+ ...restTextProps
1638
+ } = textFieldProps;
1639
+ const {
1640
+ field,
1641
+ fieldState: { error }
1642
+ } = useController10({
1643
+ name,
1644
+ control
1645
+ });
1646
+ const theme = useTheme7();
1647
+ const { value, onChange } = useTransform({
1648
+ value: field.value,
1649
+ onChange: field.onChange,
1650
+ transform: {
1651
+ input: typeof transform?.input === "function" ? transform.input : (value2) => {
1652
+ return value2 ?? "";
1653
+ },
1654
+ output: typeof transform?.output === "function" ? transform.output : (event) => {
1655
+ const value2 = event.target.value;
1656
+ if (type !== "number") {
1657
+ return value2;
1658
+ }
1659
+ if (value2 === "") {
1660
+ return null;
1661
+ }
1662
+ if (value2 == null) {
1663
+ return value2;
1664
+ }
1665
+ return Number(value2);
1666
+ }
1667
+ }
1668
+ });
1669
+ const handleInputRef = useForkRef3(field.ref, inputRef);
1670
+ return /* @__PURE__ */ jsx11(
1671
+ TextFieldComponent,
1672
+ {
1673
+ ...rest,
1674
+ ...restTextProps,
1675
+ name: field.name,
1676
+ value,
1677
+ onChange: (event) => {
1678
+ field.onChange(event);
1679
+ if (typeof onChange === "function") {
1680
+ onChange(event);
1681
+ }
1682
+ },
1683
+ onBlur: (event) => {
1684
+ field.onBlur();
1685
+ if (typeof onBlur === "function") {
1686
+ onBlur(event);
1687
+ }
1688
+ },
1689
+ disabled,
1690
+ label,
1691
+ placeholder,
1692
+ fullWidth: true,
1693
+ required,
1694
+ type,
1695
+ error: !!error,
1696
+ helperText: error ? error.message : helperText,
1697
+ inputRef: handleInputRef,
1698
+ variant: variant ? variant : "outlined",
1699
+ size: "small",
1700
+ sx: {
1701
+ "& .MuiInputLabel-asterisk": { color: "red" },
1702
+ "& .MuiInputBase-input": {
1703
+ cursor: disabled ? "not-allowed" : "default"
1704
+ },
1705
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
1706
+ ...sx
1707
+ }
1708
+ }
1709
+ );
1710
+ };
1711
+ var TextFieldElement2 = ({
1712
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1713
+ ...props
1714
+ }) => {
1715
+ if (gridProps) {
1716
+ return /* @__PURE__ */ jsx11(
1717
+ Grid10,
1718
+ {
1719
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1720
+ children: /* @__PURE__ */ jsx11(Component8, { ...props })
1721
+ }
1722
+ );
1723
+ }
1724
+ return /* @__PURE__ */ jsx11(Component8, { ...props });
1725
+ };
1726
+ TextFieldElement2.displayName = "TextFieldElement";
1727
+ var TextFieldElement_default = TextFieldElement2;
1728
+
1729
+ // src/wrappers/TextFieldElement/EnhancedTextFieldElement.tsx
1730
+ import {
1731
+ Grid as Grid11,
1732
+ TextField as TextField7,
1733
+ useForkRef as useForkRef4,
1734
+ useTheme as useTheme8
1735
+ } from "@mui/material";
1736
+ import {
1737
+ useController as useController11
1738
+ } from "react-hook-form";
1739
+ import { jsx as jsx12 } from "react/jsx-runtime";
1740
+ var Component9 = function EnhancedTextFieldElement(props) {
1741
+ const {
1742
+ rules = {},
1743
+ parseError,
1744
+ name,
1745
+ control,
1746
+ component: TextFieldComponent = TextField7,
1747
+ gridProps,
1748
+ transform,
1749
+ fieldType = "text",
1750
+ // Default to text type
1751
+ defaultValue,
1752
+ label,
1753
+ placeholder,
1754
+ textFieldProps = {},
1755
+ variant,
1756
+ sx,
1757
+ onChange: customOnChange,
1758
+ enableWarnings = process.env.NODE_ENV === "development",
1759
+ ...rest
1760
+ } = props;
1761
+ const {
1762
+ type,
1763
+ required,
1764
+ helperText,
1765
+ inputRef,
1766
+ onBlur,
1767
+ disabled,
1768
+ ...restTextProps
1769
+ } = textFieldProps;
1770
+ const {
1771
+ field,
1772
+ fieldState: { error }
1773
+ } = useController11({
1774
+ name,
1775
+ control,
1776
+ rules
1777
+ });
1778
+ const theme = useTheme8();
1779
+ const { value, onChange } = useEnhancedTransform({
1780
+ value: field.value,
1781
+ onChange: field.onChange,
1782
+ transform: transform ? {
1783
+ input: transform.input,
1784
+ output: transform.output
1785
+ } : void 0,
1786
+ fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1787
+ // Auto-detect number type
1788
+ defaultValue,
1789
+ enableWarnings
1790
+ });
1791
+ const handleInputRef = useForkRef4(field.ref, inputRef);
1792
+ return /* @__PURE__ */ jsx12(
1793
+ TextFieldComponent,
1794
+ {
1795
+ ...rest,
1796
+ ...restTextProps,
1797
+ name: field.name,
1798
+ value,
1799
+ onChange: (event) => {
1800
+ onChange(event);
1801
+ if (typeof customOnChange === "function") {
1802
+ customOnChange(event);
1803
+ }
1804
+ },
1805
+ onBlur: (event) => {
1806
+ field.onBlur();
1807
+ if (typeof onBlur === "function") {
1808
+ onBlur(event);
1809
+ }
1810
+ },
1811
+ disabled,
1812
+ label,
1813
+ placeholder,
1814
+ fullWidth: true,
1815
+ required,
1816
+ type,
1817
+ error: !!error,
1818
+ helperText: error ? parseError ? parseError(error) : error.message : helperText,
1819
+ inputRef: handleInputRef,
1820
+ variant: variant ? variant : "outlined",
1821
+ size: "small",
1822
+ sx: {
1823
+ "& .MuiInputLabel-asterisk": { color: "red" },
1824
+ "& .MuiInputBase-input": {
1825
+ cursor: disabled ? "not-allowed" : "default"
1826
+ },
1827
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
1828
+ ...sx
1829
+ }
1830
+ }
1831
+ );
1832
+ };
1833
+ var EnhancedTextFieldElement2 = ({
1834
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1835
+ ...props
1836
+ }) => {
1837
+ if (gridProps) {
1838
+ return /* @__PURE__ */ jsx12(
1839
+ Grid11,
1840
+ {
1841
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1842
+ children: /* @__PURE__ */ jsx12(Component9, { ...props })
1843
+ }
1844
+ );
1845
+ }
1846
+ return /* @__PURE__ */ jsx12(Component9, { ...props });
1847
+ };
1848
+ EnhancedTextFieldElement2.displayName = "EnhancedTextFieldElement";
1849
+
1850
+ // src/wrappers/TimePickerElement/TimePickerElement.tsx
1851
+ import { Grid as Grid12, useForkRef as useForkRef5, useTheme as useTheme9 } from "@mui/material";
1852
+ import { TimePicker } from "@mui/x-date-pickers";
1853
+ import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
1854
+ import { useCallback as useCallback6 } from "react";
1855
+ import { useController as useController12 } from "react-hook-form";
1856
+ import { jsx as jsx13 } from "react/jsx-runtime";
1857
+ function readValueAsDate(adapter, value) {
1858
+ if (typeof value === "string") {
1859
+ if (value === "") {
1860
+ return null;
1861
+ }
1862
+ return adapter.utils.date(value);
1863
+ }
1864
+ return value;
1865
+ }
1866
+ function useTransform2(options) {
1867
+ const value = typeof options.transform?.input === "function" ? options.transform.input(options.value) : options.value;
1868
+ const onChange = useCallback6(
1869
+ (...event) => {
1870
+ if (typeof options.transform?.output === "function") {
1871
+ options.onChange(options.transform.output(...event));
1872
+ } else {
1873
+ options.onChange(...event);
1874
+ }
1875
+ },
1876
+ [options]
1877
+ );
1878
+ return {
1879
+ value,
1880
+ onChange
1881
+ };
1882
+ }
1883
+ var Component10 = function TimePickerElement(props) {
1884
+ const {
1885
+ name,
1886
+ required,
1887
+ inputProps,
1888
+ control,
1889
+ textReadOnly,
1890
+ label,
1891
+ placeholder,
1892
+ slotProps,
1893
+ timePickerProps = {},
1894
+ transform,
1895
+ sx,
1896
+ ...rest
1897
+ } = props;
1898
+ const adapter = useLocalizationContext2();
1899
+ const theme = useTheme9();
1900
+ const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1901
+ const {
1902
+ field,
1903
+ fieldState: { error }
1904
+ } = useController12({
1905
+ name,
1906
+ control,
1907
+ defaultValue: null
1908
+ });
1909
+ const { value, onChange } = useTransform2({
1910
+ value: field.value,
1911
+ onChange: field.onChange,
1912
+ transform: {
1913
+ input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1914
+ output: (outputValue, context) => {
1915
+ if (outputValue === null) return null;
1916
+ return outputValue;
1917
+ }
1918
+ }
1919
+ });
1920
+ const handleInputRef = useForkRef5(field.ref, inputRef);
1921
+ return /* @__PURE__ */ jsx13(
1922
+ TimePicker,
1923
+ {
1924
+ ...rest,
1925
+ ...restTimePickerProps,
1926
+ ...field,
1927
+ value,
1928
+ label,
1929
+ disabled,
1930
+ ...timePickerProps,
1931
+ inputRef: handleInputRef,
1932
+ onClose: (...args) => {
1933
+ field.onBlur();
1934
+ if (onClose) {
1935
+ onClose(...args);
1936
+ }
1937
+ },
1938
+ onChange: (newValue, context) => {
1939
+ onChange(newValue, context);
1940
+ if (typeof timePickerProps.onChange === "function") {
1941
+ timePickerProps.onChange(newValue, context);
1942
+ }
1943
+ },
1944
+ sx: {
1945
+ "& .MuiOutlinedInput-root": {
1946
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent"
1947
+ },
1948
+ "& .MuiInputLabel-asterisk": { color: "red" },
1949
+ "& .MuiInputBase-input": {
1950
+ cursor: disabled ? "not-allowed" : "default"
1951
+ },
1952
+ ...sx
1953
+ },
1954
+ slotProps: {
1955
+ ...slotProps,
1956
+ actionBar: {
1957
+ actions: ["clear", "cancel", "accept"]
1958
+ },
1959
+ textField: {
1960
+ ...inputProps,
1961
+ required,
1962
+ placeholder,
1963
+ fullWidth: true,
1964
+ onBlur: (event) => {
1965
+ field.onBlur();
1966
+ if (typeof inputProps?.onBlur === "function") {
1967
+ inputProps.onBlur(event);
1968
+ }
1969
+ },
1970
+ error: !!error,
1971
+ helperText: error ? error.message : inputProps?.helperText || rest.helperText,
1972
+ inputProps: {
1973
+ readOnly: !!textReadOnly,
1974
+ ...inputProps?.inputProps
1975
+ }
1976
+ }
1977
+ }
1978
+ }
1979
+ );
1980
+ };
1981
+ var TimePickerElement2 = ({
1982
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
1983
+ ...props
1984
+ }) => {
1985
+ if (gridProps) {
1986
+ return /* @__PURE__ */ jsx13(
1987
+ Grid12,
1988
+ {
1989
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
1990
+ children: /* @__PURE__ */ jsx13(Component10, { ...props })
1991
+ }
1992
+ );
1993
+ }
1994
+ return /* @__PURE__ */ jsx13(Component10, { ...props });
1995
+ };
1996
+ TimePickerElement2.displayName = "TimePickerElement";
1997
+ var TimePickerElement_default = TimePickerElement2;
1998
+
1999
+ // src/wrappers/AsyncSelect/AsyncSelectElement.tsx
2000
+ import { Autocomplete as Autocomplete5, CircularProgress as CircularProgress3, Grid as Grid13, TextField as TextField8, useTheme as useTheme10 } from "@mui/material";
2001
+ import { debounce as debounce2 } from "@mui/material/utils";
2002
+ import * as React7 from "react";
2003
+ import {
2004
+ Fragment as Fragment3,
2005
+ useCallback as useCallback7,
2006
+ useEffect as useEffect6,
2007
+ useMemo as useMemo7,
2008
+ useRef as useRef2,
2009
+ useState as useState4
2010
+ } from "react";
2011
+ import { useController as useController13 } from "react-hook-form";
2012
+ import { jsx as jsx14, jsxs as jsxs6 } from "react/jsx-runtime";
2013
+ var Component11 = function AsyncSelectElement(props) {
2014
+ const {
2015
+ name,
2016
+ disabled,
2017
+ control,
2018
+ placeholder,
2019
+ initialValue,
2020
+ label,
2021
+ queryFn,
2022
+ variant,
2023
+ labelKey = "Label",
2024
+ valueKey = "Value",
2025
+ sx,
2026
+ ...rest
2027
+ } = props;
2028
+ const {
2029
+ field,
2030
+ fieldState: { error }
2031
+ } = useController13({
2032
+ name,
2033
+ control
2034
+ });
2035
+ const theme = useTheme10();
2036
+ const [loading, setLoading] = useState4(false);
2037
+ const [selectedOption, setSelectedOption] = useState4(null);
2038
+ const [inputValue, setInputValue] = useState4("");
2039
+ const inputValue2 = useMemo7(() => inputValue, [inputValue]);
2040
+ const setInputValue2 = useCallback7(
2041
+ (newValue) => setInputValue(newValue),
2042
+ []
2043
+ );
2044
+ const [options, setOptions] = useState4([]);
2045
+ const initialValueLoaded = useRef2(
2046
+ !initialValue ? true : !(initialValue != null)
2047
+ );
2048
+ const fieldValue = useRef2(field.value);
2049
+ const fetchData = useMemo7(
2050
+ () => debounce2(
2051
+ (payload, callback) => {
2052
+ queryFn(payload).then((c) => callback(c));
2053
+ },
2054
+ 400
2055
+ ),
2056
+ [queryFn]
2057
+ );
2058
+ const fillOptions = useCallback7((results) => {
2059
+ let newOptions = [];
2060
+ if (selectedOption) {
2061
+ newOptions = [selectedOption];
2062
+ }
2063
+ if (results) {
2064
+ newOptions = [...newOptions, ...results];
2065
+ }
2066
+ setOptions(newOptions);
2067
+ setLoading(false);
2068
+ }, [selectedOption]);
2069
+ useEffect6(() => {
2070
+ if (initialValueLoaded.current) return void 0;
2071
+ let active = true;
2072
+ const payload = {
2073
+ query: null,
2074
+ initialValue
2075
+ };
2076
+ setLoading(true);
2077
+ fetchData(payload, (results) => {
2078
+ if (active) {
2079
+ if (!!results && results.length > 0) {
2080
+ fillOptions(results?.filter((c) => c[valueKey] == initialValue));
2081
+ setSelectedOption(results[0]);
2082
+ field.onChange(results[0][valueKey]);
2083
+ fieldValue.current = results[0][valueKey];
2084
+ }
2085
+ initialValueLoaded.current = true;
2086
+ setLoading(false);
2087
+ }
2088
+ });
2089
+ return () => {
2090
+ active = false;
2091
+ };
2092
+ }, [initialValue, fetchData, field, fillOptions, valueKey]);
2093
+ React7.useEffect(() => {
2094
+ let active = true;
2095
+ if (inputValue2 === "" || initialValueLoaded.current === false) {
2096
+ setOptions(selectedOption ? [selectedOption] : []);
2097
+ setLoading(false);
2098
+ return void 0;
2099
+ }
2100
+ if (fieldValue.current) {
2101
+ if (field.value === fieldValue.current) {
2102
+ return void 0;
2103
+ }
2104
+ }
2105
+ setLoading(true);
2106
+ const payload = {
2107
+ query: inputValue2,
2108
+ initialValue: null
2109
+ };
2110
+ fetchData(payload, (results) => {
2111
+ if (active) {
2112
+ fillOptions(results);
2113
+ }
2114
+ });
2115
+ return () => {
2116
+ active = false;
2117
+ };
2118
+ }, [initialValue, inputValue2, fetchData, field.value, fillOptions, selectedOption]);
2119
+ const selectRef = useRef2(null);
2120
+ const handleChange = (_, newSelectedOption, reason) => {
2121
+ if (reason === "clear") {
2122
+ setSelectedOption(null);
2123
+ field.onChange(null);
2124
+ setLoading(false);
2125
+ } else if (reason === "selectOption" || reason === "removeOption") {
2126
+ if (newSelectedOption) {
2127
+ setSelectedOption(newSelectedOption);
2128
+ field.onChange(newSelectedOption[valueKey]);
2129
+ fieldValue.current = newSelectedOption[valueKey];
2130
+ setLoading(false);
2131
+ }
2132
+ }
2133
+ setOptions([]);
2134
+ setLoading(false);
2135
+ };
2136
+ useEffect6(() => {
2137
+ if (!field.value) {
2138
+ setInputValue("");
2139
+ setSelectedOption(null);
2140
+ setLoading(false);
2141
+ }
2142
+ }, [field.value]);
2143
+ const getOptionValue = (option) => {
2144
+ return option ? String(option[valueKey]) : "";
2145
+ };
2146
+ const getOptionLabel = (option) => {
2147
+ return option ? String(option[labelKey]) : "";
2148
+ };
2149
+ return /* @__PURE__ */ jsx14(
2150
+ Autocomplete5,
2151
+ {
2152
+ ...rest,
2153
+ ref: selectRef,
2154
+ fullWidth: true,
2155
+ loading,
2156
+ getOptionLabel,
2157
+ getOptionKey: getOptionValue,
2158
+ isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
2159
+ autoComplete: true,
2160
+ disabled,
2161
+ includeInputInList: true,
2162
+ options,
2163
+ filterOptions: (x) => x,
2164
+ value: selectedOption,
2165
+ filterSelectedOptions: true,
2166
+ onChange: handleChange,
2167
+ onInputChange: (_, newInputValue) => {
2168
+ setInputValue2(newInputValue);
2169
+ },
2170
+ noOptionsText: "Type Something...",
2171
+ renderInput: (params) => /* @__PURE__ */ jsx14(
2172
+ TextField8,
2173
+ {
2174
+ ...params,
2175
+ label,
2176
+ error: !!error,
2177
+ helperText: error ? error.message : "",
2178
+ placeholder,
2179
+ slotProps: {
2180
+ input: {
2181
+ ...params.InputProps,
2182
+ endAdornment: /* @__PURE__ */ jsxs6(Fragment3, { children: [
2183
+ loading ? /* @__PURE__ */ jsx14(CircularProgress3, { color: "inherit", size: 20 }) : null,
2184
+ params.InputProps.endAdornment
2185
+ ] })
2186
+ }
2187
+ },
2188
+ variant: variant ? variant : "outlined",
2189
+ sx: {
2190
+ "& .MuiInputBase-input": {
2191
+ cursor: disabled ? "not-allowed" : "default"
2192
+ },
2193
+ bgcolor: disabled ? theme.palette.action.disabledBackground : "transparent",
2194
+ ...sx
2195
+ }
2196
+ }
2197
+ ),
2198
+ renderOption: (renderProps, option) => {
2199
+ const { key, ...optionProps } = renderProps;
2200
+ return /* @__PURE__ */ jsx14("li", { ...optionProps, children: option[labelKey] }, key);
2201
+ }
2202
+ }
2203
+ );
2204
+ };
2205
+ var AsyncSelectElement2 = ({
2206
+ gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
2207
+ ...props
2208
+ }) => {
2209
+ if (gridProps) {
2210
+ return /* @__PURE__ */ jsx14(
2211
+ Grid13,
2212
+ {
2213
+ ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
2214
+ children: /* @__PURE__ */ jsx14(Component11, { ...props })
2215
+ }
2216
+ );
2217
+ }
2218
+ return /* @__PURE__ */ jsx14(Component11, { ...props });
2219
+ };
2220
+ AsyncSelectElement2.displayName = "AsyncSelectElement";
2221
+
2222
+ // src/wrappers/Field/index.ts
2223
+ var Field = {
2224
+ Text: TextFieldElement_default,
2225
+ Checkbox: CheckboxElement2,
2226
+ Date: DatePickerElement,
2227
+ RadioGroup: RadioButtonGroup_default,
2228
+ Password: PasswordElement_default,
2229
+ Time: TimePickerElement_default,
2230
+ Select: SelectElement_default,
2231
+ SelectMulti: SelectMultiElement_default,
2232
+ SelectCascade: SelectCascadeElement_default,
2233
+ AsyncSelect,
2234
+ AsyncMultiSelect: AsyncMultiSelect2,
2235
+ CheckboxGroup: CheckboxGroup2
2236
+ };
2237
+
2238
+ export {
2239
+ AsyncMultiSelect2,
2240
+ CheckboxElement2 as CheckboxElement,
2241
+ CheckboxGroup2 as CheckboxGroup,
2242
+ readDatePickerValueAsDate,
2243
+ useDatePickerValue,
2244
+ useDatePickerValidation,
2245
+ useDatePickerStyles,
2246
+ DatePickerElementCore,
2247
+ DatePickerElement,
2248
+ isValidDate,
2249
+ isParsableDateString,
2250
+ createDateInputTransform,
2251
+ createDateOutputTransform,
2252
+ createDefaultDatePickerConfig,
2253
+ extractErrorMessage,
2254
+ createStableKey,
2255
+ PasswordElement_default,
2256
+ RadioButtonGroup_default,
2257
+ SelectCascadeElement_default,
2258
+ SelectElement_default,
2259
+ SelectMultiElement_default,
2260
+ TextFieldElement_default,
2261
+ EnhancedTextFieldElement2 as EnhancedTextFieldElement,
2262
+ TimePickerElement_default,
2263
+ Field
2264
+ };
2265
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL0FzeW5jTXVsdGlTZWxlY3QyL0FzeW5jTXVsdGlTZWxlY3QyLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hFbGVtZW50L0NoZWNrYm94RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnRDb3JlLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclN0eWxlcy50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCAiLi4vc3JjL3dyYXBwZXJzL1Bhc3N3b3JkRWxlbWVudC9QYXNzd29yZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdEVsZW1lbnQvU2VsZWN0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdE11bHRpRWxlbWVudC9TZWxlY3RNdWx0aUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L0VuaGFuY2VkVGV4dEZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1RpbWVQaWNrZXJFbGVtZW50L1RpbWVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNTZWxlY3QvQXN5bmNTZWxlY3RFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRmllbGQvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIEF1dG9jb21wbGV0ZSxcbiAgQ2lyY3VsYXJQcm9ncmVzcyxcbiAgR3JpZCxcbiAgVGV4dEZpZWxkLFxuICB1c2VUaGVtZSxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZHVjZXIsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNNdWx0aVNlbGVjdDJQcm9wcywgQXN5bmNTZWxlY3QyUGF5bG9hZCwgT3B0aW9uMkl0ZW0gfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5pbnRlcmZhY2UgQ29tcG9uZW50U3RhdGUge1xuICBvcHRpb25zOiBPcHRpb24ySXRlbVtdO1xuICBzZWxlY3RlZE9wdGlvbnM6IE9wdGlvbjJJdGVtW107XG4gIGlucHV0VmFsdWU6IHN0cmluZztcbiAgbG9hZGluZzogYm9vbGVhbjtcbiAgaW5pdGlhbExvYWRlZDogYm9vbGVhbjtcbn1cblxudHlwZSBDb21wb25lbnRBY3Rpb24gPVxuICB8IHsgdHlwZTogXCJTRVRfT1BUSU9OU1wiOyBwYXlsb2FkOiBPcHRpb24ySXRlbVtdIH1cbiAgfCB7IHR5cGU6IFwiU0VUX1NFTEVDVEVEX09QVElPTlNcIjsgcGF5bG9hZDogT3B0aW9uMkl0ZW1bXSB9XG4gIHwgeyB0eXBlOiBcIlNFVF9JTlBVVF9WQUxVRVwiOyBwYXlsb2FkOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJTRVRfTE9BRElOR1wiOyBwYXlsb2FkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6IFwiU0VUX0lOSVRJQUxfTE9BREVEXCI7IHBheWxvYWQ6IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJSRVNFVF9PUFRJT05TXCIgfTtcblxuY29uc3QgaW5pdGlhbFN0YXRlOiBDb21wb25lbnRTdGF0ZSA9IHtcbiAgb3B0aW9uczogW10sXG4gIHNlbGVjdGVkT3B0aW9uczogW10sXG4gIGlucHV0VmFsdWU6IFwiXCIsXG4gIGxvYWRpbmc6IGZhbHNlLFxuICBpbml0aWFsTG9hZGVkOiBmYWxzZSxcbn07XG5cbmZ1bmN0aW9uIGNvbXBvbmVudFJlZHVjZXIoc3RhdGU6IENvbXBvbmVudFN0YXRlLCBhY3Rpb246IENvbXBvbmVudEFjdGlvbik6IENvbXBvbmVudFN0YXRlIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgXCJTRVRfT1BUSU9OU1wiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIG9wdGlvbnM6IGFjdGlvbi5wYXlsb2FkLCBsb2FkaW5nOiBmYWxzZSB9O1xuICAgIGNhc2UgXCJTRVRfU0VMRUNURURfT1BUSU9OU1wiOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHNlbGVjdGVkT3B0aW9uczogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlIFwiU0VUX0lOUFVUX1ZBTFVFXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgaW5wdXRWYWx1ZTogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlIFwiU0VUX0xPQURJTkdcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBsb2FkaW5nOiBhY3Rpb24ucGF5bG9hZCB9O1xuICAgIGNhc2UgXCJTRVRfSU5JVElBTF9MT0FERURcIjpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBpbml0aWFsTG9hZGVkOiBhY3Rpb24ucGF5bG9hZCB9O1xuICAgIGNhc2UgXCJSRVNFVF9PUFRJT05TXCI6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgb3B0aW9uczogc3RhdGUuc2VsZWN0ZWRPcHRpb25zIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5jb25zdCBBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+XG4+KHtcbiAgbmFtZSxcbiAgY29udHJvbCxcbiAgcGxhY2Vob2xkZXIsXG4gIGluaXRpYWxWYWx1ZXMsXG4gIGxhYmVsLFxuICBxdWVyeUZuLFxuICB2YXJpYW50ID0gXCJvdXRsaW5lZFwiLFxuICBzeCxcbiAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgZGVib3VuY2VNcyA9IDQwMCxcbiAgbG9hZGluZ1RleHQgPSBcIkxvYWRpbmcuLi5cIixcbiAgbm9PcHRpb25zVGV4dCA9IFwiTm8gb3B0aW9uc1wiLFxuICByZW5kZXJJbnB1dCxcbiAgLi4ucmVzdFxufTogQXN5bmNNdWx0aVNlbGVjdDJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICBjb25zdCBbc3RhdGUsIGRpc3BhdGNoXSA9IHVzZVJlZHVjZXIoY29tcG9uZW50UmVkdWNlciwgaW5pdGlhbFN0YXRlKTtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGRlYm91bmNlZEZldGNoID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoYXN5bmMgKHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnlGbihwYXlsb2FkKTtcblxuICAgICAgICAgIC8vIE1lcmdlIHNlbGVjdGVkIG9wdGlvbnMgd2l0aCBzZWFyY2ggcmVzdWx0cywgYXZvaWRpbmcgZHVwbGljYXRlc1xuICAgICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSBbXG4gICAgICAgICAgICAuLi5zdGF0ZS5zZWxlY3RlZE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5yZXN1bHRzLmZpbHRlcihcbiAgICAgICAgICAgICAgKG9wdGlvbikgPT4gIXN0YXRlLnNlbGVjdGVkT3B0aW9ucy5zb21lKChzZWxlY3RlZCkgPT4gc2VsZWN0ZWQudmFsdWUgPT09IG9wdGlvbi52YWx1ZSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfT1BUSU9OU1wiLCBwYXlsb2FkOiBtZXJnZWRPcHRpb25zIH0pO1xuICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGRlYm91bmNlTXMpLFxuICAgIFtxdWVyeUZuLCBzdGF0ZS5zZWxlY3RlZE9wdGlvbnMsIGRlYm91bmNlTXNdXG4gICk7XG5cbiAgLy8gTG9hZCBpbml0aWFsIHZhbHVlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaW5pdGlhbFZhbHVlcz8ubGVuZ3RoIHx8IHN0YXRlLmluaXRpYWxMb2FkZWQpIHJldHVybjtcblxuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfTE9BRElOR1wiLCBwYXlsb2FkOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNTZWxlY3QyUGF5bG9hZCA9IHtcbiAgICAgIHF1ZXJ5OiBudWxsLFxuICAgICAgaW5pdGlhbFZhbHVlcyxcbiAgICB9O1xuXG4gICAgcXVlcnlGbihwYXlsb2FkKS50aGVuKChyZXN1bHRzKSA9PiB7XG4gICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX1NFTEVDVEVEX09QVElPTlNcIiwgcGF5bG9hZDogcmVzdWx0cyB9KTtcbiAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9PUFRJT05TXCIsIHBheWxvYWQ6IHJlc3VsdHMgfSk7XG4gICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfSU5JVElBTF9MT0FERURcIiwgcGF5bG9hZDogdHJ1ZSB9KTtcbiAgICAgICAgZmllbGQub25DaGFuZ2UocmVzdWx0cy5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKSk7XG4gICAgICB9XG5cbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJTRVRfTE9BRElOR1wiLCBwYXlsb2FkOiBmYWxzZSB9KTtcbiAgICB9KS5jYXRjaCgoX2Vycm9yKSA9PiB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH0sIFtpbml0aWFsVmFsdWVzLCBzdGF0ZS5pbml0aWFsTG9hZGVkLCBxdWVyeUZuLCBmaWVsZF0pO1xuXG4gIC8vIEhhbmRsZSBzZWFyY2ggaW5wdXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc3RhdGUuaW5pdGlhbExvYWRlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YXRlLmlucHV0VmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJSRVNFVF9PUFRJT05TXCIgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0xPQURJTkdcIiwgcGF5bG9hZDogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogc3RhdGUuaW5wdXRWYWx1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZXM6IG51bGwsXG4gICAgfTtcblxuICAgIGRlYm91bmNlZEZldGNoKHBheWxvYWQpO1xuICB9LCBbc3RhdGUuaW5wdXRWYWx1ZSwgc3RhdGUuaW5pdGlhbExvYWRlZCwgZGVib3VuY2VkRmV0Y2hdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdWYWx1ZTogT3B0aW9uMkl0ZW1bXSkgPT4ge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIlNFVF9TRUxFQ1RFRF9PUFRJT05TXCIsIHBheWxvYWQ6IG5ld1ZhbHVlIH0pO1xuICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSkpO1xuICAgIH0sXG4gICAgW2ZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3SW5wdXRWYWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiU0VUX0lOUFVUX1ZBTFVFXCIsIHBheWxvYWQ6IG5ld0lucHV0VmFsdWUgfSk7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGlzT3B0aW9uRXF1YWxUb1ZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogT3B0aW9uMkl0ZW0sIHZhbHVlOiBPcHRpb24ySXRlbSkgPT4gb3B0aW9uLnZhbHVlID09PSB2YWx1ZS52YWx1ZSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soKG9wdGlvbjogT3B0aW9uMkl0ZW0pID0+IG9wdGlvbi5sYWJlbCwgW10pO1xuXG4gIGNvbnN0IGRlZmF1bHRSZW5kZXJJbnB1dCA9IHVzZUNhbGxiYWNrKFxuICAgIChwYXJhbXM6IFBhcmFtZXRlcnM8UmVxdWlyZWQ8QXN5bmNNdWx0aVNlbGVjdDJQcm9wcz5bXCJyZW5kZXJJbnB1dFwiXT5bMF0pID0+IChcbiAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnR9XG4gICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICBoZWxwZXJUZXh0PXtlcnJvcj8ubWVzc2FnZX1cbiAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAge3N0YXRlLmxvYWRpbmcgJiYgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+fVxuICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9fVxuICAgICAgICBzeD17e1xuICAgICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyBcIm5vdC1hbGxvd2VkXCIgOiBcImRlZmF1bHRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgLi4uc3gsXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgICksXG4gICAgW2xhYmVsLCBwbGFjZWhvbGRlciwgdmFyaWFudCwgZXJyb3IsIHN0YXRlLmxvYWRpbmcsIGRpc2FibGVkLCB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsIHN4XVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgbXVsdGlwbGVcbiAgICAgIG9wdGlvbnM9e3N0YXRlLm9wdGlvbnN9XG4gICAgICB2YWx1ZT17c3RhdGUuc2VsZWN0ZWRPcHRpb25zfVxuICAgICAgbG9hZGluZz17c3RhdGUubG9hZGluZ31cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXtpc09wdGlvbkVxdWFsVG9WYWx1ZX1cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgbG9hZGluZ1RleHQ9e2xvYWRpbmdUZXh0fVxuICAgICAgbm9PcHRpb25zVGV4dD17bm9PcHRpb25zVGV4dH1cbiAgICAgIHJlbmRlcklucHV0PXtyZW5kZXJJbnB1dCB8fCBkZWZhdWx0UmVuZGVySW5wdXR9XG4gICAgICB7Li4ucmVzdH1cbiAgICAvPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNNdWx0aVNlbGVjdDIgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPlxuPih7XG4gIGdyaWRQcm9wcyxcbiAgLi4ucHJvcHNcbn06IEFzeW5jTXVsdGlTZWxlY3QyUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fT5cbiAgICAgICAgPEFzeW5jTXVsdGlTZWxlY3QyQ29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuQXN5bmNNdWx0aVNlbGVjdDIuZGlzcGxheU5hbWUgPSBcIkFzeW5jTXVsdGlTZWxlY3QyXCI7XG5cbmV4cG9ydCB7IEFzeW5jTXVsdGlTZWxlY3QyIH07XG4iLCAiaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxuICB1c2VUaGVtZSxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZVxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihcbiAgcHJvcHM6IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBsYWJlbFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgZGlzYWJsZWQsXG4gICAgc3gsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkLFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIGJvb2xlYW4+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogKHZhbHVlKSA9PiAhIXZhbHVlLFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdHJhbnNmb3JtLm91dHB1dFxuICAgICAgICAgIDogKGNoZWNrZWQpID0+IGNoZWNrZWQgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4sIGNoZWNrZWQ6IGJvb2xlYW4pID0+IHtcbiAgICBvbkNoYW5nZShldmVudCwgY2hlY2tlZCk7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjdXN0b21PbkNoYW5nZShldmVudCwgY2hlY2tlZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRpc3BsYXlFcnJvcjogUmVhY3ROb2RlID0gZXJyb3JcbiAgICA/IHR5cGVvZiBwYXJzZUVycm9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gcGFyc2VFcnJvcihlcnJvcilcbiAgICAgIDogZXJyb3IubWVzc2FnZVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0gZGlzYWJsZWQ9e2Rpc2FibGVkfT5cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgIGxhYmVsPXtsYWJlbCB8fCBcIlwifVxuICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgY29sb3I9e3Jlc3QuY29sb3IgfHwgXCJwcmltYXJ5XCJ9XG4gICAgICAgICAgICAgIHN4PXtbXG4gICAgICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc3gpID8gc3ggOiBbc3hdKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW5cbiAgICAgICAgICAgICAgICAgICAgOiBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIFwiJi5NdWktZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF19XG4gICAgICAgICAgICAgIGNoZWNrZWQ9e3ZhbHVlfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIHsoZGlzcGxheUVycm9yIHx8IGhlbHBlclRleHQpICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7ZGlzcGxheUVycm9yIHx8IGhlbHBlclRleHR9XG4gICAgICAgIDwvRm9ybUhlbHBlclRleHQ+XG4gICAgICApfVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQ2hlY2tib3ggY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24gYW5kIGdyaWQgbGF5b3V0LlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBjaGVja2JveCBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIG9wdGlvbmFsIEdyaWQgd3JhcHBlciBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvbiB3aXRoIHVzZUNvbnRyb2xsZXJcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZyBzdXBwb3J0XG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHdpdGggdXNlVHJhbnNmb3JtIGhvb2sgZm9yIGJvb2xlYW4gdmFsdWVzXG4gKiAtIEN1c3RvbWl6YWJsZSBsYWJlbCBhbmQgcG9zaXRpb25pbmdcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlciB3aXRoIHJlc3BvbnNpdmUgZGVzaWduXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHkgd2l0aCBnZW5lcmljIGNvbnN0cmFpbnRzXG4gKiAtIERpc2FibGVkIHN0YXRlIHN1cHBvcnQgd2l0aCBwcm9wZXIgdGhlbWluZ1xuICogLSBIZWxwZXIgdGV4dCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIGNvbnRleHRcbiAqIC0gQ3VzdG9tIGVycm9yIHBhcnNpbmcgZm9yIGludGVybmF0aW9uYWxpemF0aW9uXG4gKiAtIFNpbXBsZSBib29sZWFuIHZhbHVlIGhhbmRsaW5nIHdpdGggb3B0aW9uYWwgY3VzdG9tIHRyYW5zZm9ybXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFjY2VwdFRlcm1zXCJcbiAqICAgbGFiZWw9XCJJIGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1wiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggdmFsaWRhdGlvbiBhbmQgaGVscGVyIHRleHQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cIm5ld3NsZXR0ZXJcIlxuICogICBsYWJlbD1cIlN1YnNjcmliZSB0byBuZXdzbGV0dGVyXCJcbiAqICAgaGVscGVyVGV4dD1cIllvdSBjYW4gdW5zdWJzY3JpYmUgYXQgYW55IHRpbWVcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ1BsZWFzZSBhY2NlcHQgdG8gY29udGludWUnIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBncmlkIGxheW91dCBhbmQgc3R5bGluZzpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiaXNQdWJsaWNcIlxuICogICBsYWJlbD1cIk1ha2UgdGhpcyBwdWJsaWNcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgbGFiZWxQcm9wcz17eyBzeDogeyBmb250V2VpZ2h0OiAnYm9sZCcgfSB9fVxuICogICBzeD17eyBjb2xvcjogJ3ByaW1hcnkubWFpbicgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiAoc3RyaW5nIHRvIGJvb2xlYW4pOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJzdGF0dXNcIlxuICogICBsYWJlbD1cIkFjdGl2ZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID09PSAnYWN0aXZlJyxcbiAqICAgICBvdXRwdXQ6IChjaGVja2VkKSA9PiBjaGVja2VkID8gJ2FjdGl2ZScgOiAnaW5hY3RpdmUnXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFNpbXBsZSBib29sZWFuIGZpZWxkOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc0VuYWJsZWRcIlxuICogICBsYWJlbD1cIkVuYWJsZSBmZWF0dXJlXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGVycm9yIHBhcnNpbmcgZm9yIGludGVybmF0aW9uYWxpemF0aW9uOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ0ZXJtc1wiXG4gKiAgIGxhYmVsPVwiQWNjZXB0IFRlcm1zXCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiB0KGB2YWxpZGF0aW9uLiR7ZXJyb3IudHlwZX1gLCB7IGZpZWxkOiAnVGVybXMnIH0pfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2hlY2tib3hFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lPiB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWU+IHsuLi5wcm9wc30gLz47XG59O1xuXG5DaGVja2JveEVsZW1lbnQuZGlzcGxheU5hbWUgPSBcIkNoZWNrYm94RWxlbWVudFwiO1xuXG5leHBvcnQgeyBDaGVja2JveEVsZW1lbnQgfTtcblxuZXhwb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gXCIuL3R5cGVzXCI7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBDaGVja2JveFByb3BzLFxuICBGb3JtQ29udHJvbExhYmVsUHJvcHMsXG4gIEdyaWRQcm9wc1xufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlc1xufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmV4cG9ydCB0eXBlIENoZWNrYm94R3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBudW1iZXJbXSA9IG51bWJlcltdXG4+ID0gT21pdDxDaGVja2JveFByb3BzLCBcIm5hbWVcIj4gJiB7XG4gIG5hbWU6IFROYW1lO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBsYWJlbD86IEZvcm1Db250cm9sTGFiZWxQcm9wc1tcImxhYmVsXCJdO1xuICBsYWJlbFByb3BzPzogT21pdDxGb3JtQ29udHJvbExhYmVsUHJvcHMsIFwibGFiZWxcIiB8IFwiY29udHJvbFwiPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBvcHRpb25zOiBBcnJheTx7IFZhbHVlOiBudW1iZXI7IExhYmVsOiBzdHJpbmcgfT47XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBDaGVja2JveEdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIG51bWJlcltdID0gbnVtYmVyW11cbj4ocHJvcHM6IENoZWNrYm94R3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHsgbmFtZSwgY29udHJvbCwgbGFiZWwsIGxhYmVsUHJvcHMsIGlucHV0UmVmLCBvcHRpb25zLCAuLi5yZXN0IH0gPVxuICAgIHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQ6IHJlc3QuZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGNvbnN0IFtzZWxlY3RlZFZhbHVlcywgc2V0U2VsZWN0ZWRWYWx1ZXNdID0gdXNlU3RhdGU8bnVtYmVyW10+KFxuICAgIG9wdGlvbnMuZmlsdGVyKChjKSA9PiBmaWVsZC52YWx1ZT8uaW5jbHVkZXMoYy5WYWx1ZSkpLm1hcCgoYykgPT4gYy5WYWx1ZSkgfHxcbiAgICBbXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZmllbGQub25DaGFuZ2Uoc2VsZWN0ZWRWYWx1ZXMgPyBbLi4uc2VsZWN0ZWRWYWx1ZXNdIDogW10pO1xuICB9LCBbc2VsZWN0ZWRWYWx1ZXNdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChldmVudC50YXJnZXQudmFsdWUsIDEwKTtcblxuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZXMoWy4uLnNlbGVjdGVkVmFsdWVzLCB2YWx1ZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTZWxlY3RlZFZhbHVlcyhzZWxlY3RlZFZhbHVlcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHZhbHVlKSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICB7b3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICBrZXk9e2Ake29wdGlvbi5WYWx1ZX1gfVxuICAgICAgICAgICAgbGFiZWw9e29wdGlvbi5MYWJlbH1cbiAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICAgIGNvbG9yPXtyZXN0LmNvbG9yIHx8IFwicHJpbWFyeVwifVxuICAgICAgICAgICAgICAgIHN4PXtbXG4gICAgICAgICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShyZXN0LnN4KSA/IHJlc3Quc3ggOiBbcmVzdC5zeF0pLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPyBcImVycm9yLm1haW5cIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uLlZhbHVlfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkVmFsdWVzLmluY2x1ZGVzKG9wdGlvbi5WYWx1ZSl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT57ZXJyb3IubWVzc2FnZX08L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuY29uc3QgQ2hlY2tib3hHcm91cCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBudW1iZXJbXSA9IG51bWJlcltdXG4+KHtcbiAgZ3JpZFByb3BzLFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hHcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZCB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5DaGVja2JveEdyb3VwLmRpc3BsYXlOYW1lID0gXCJDaGVja2JveEdyb3VwXCI7XG5cbmV4cG9ydCB7IENoZWNrYm94R3JvdXAgfTtcblxuIiwgImltcG9ydCB7IEdyaWQgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9IGZyb20gXCIuL0RhdGVQaWNrZXJFbGVtZW50Q29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBBIGZ1bGx5LWZlYXR1cmVkLCB0eXBlLXNhZmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IGZvciByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgY29tYmluZXMgdGhlIGNvcmUgZGF0ZSBwaWNrZXIgZnVuY3Rpb25hbGl0eSB3aXRoIG9wdGlvbmFsIEdyaWQgbGF5b3V0IHdyYXBwaW5nLFxuICogcHJvdmlkaW5nIGEgY29tcGxldGUgc29sdXRpb24gZm9yIGZvcm0tYmFzZWQgZGF0ZSBzZWxlY3Rpb24gd2l0aCBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydC5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIFx1RDgzQ1x1REZBRiAqKlR5cGUgU2FmZXR5Kio6IEZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIGZvcm0gZmllbGQgdHlwZXMgYW5kIGRhdGUgdmFsdWVzXG4gKiAtIFx1RDgzRFx1REQyNyAqKlJlYWN0IEhvb2sgRm9ybSBJbnRlZ3JhdGlvbioqOiBTZWFtbGVzcyBpbnRlZ3JhdGlvbiB3aXRoIHJlYWN0LWhvb2stZm9ybSB2YWxpZGF0aW9uXG4gKiAtIFx1RDgzQ1x1REZBOCAqKlRoZW1pbmcqKjogQXV0b21hdGljIGFkYXB0YXRpb24gdG8gTVVJIHRoZW1lIHdpdGggY3VzdG9taXphYmxlIHN0eWxlc1xuICogLSBcdTI2N0YgKipBY2Nlc3NpYmlsaXR5Kio6IFdDQUctY29tcGxpYW50IHdpdGggcHJvcGVyIEFSSUEgYXR0cmlidXRlcyBhbmQga2V5Ym9hcmQgbmF2aWdhdGlvblxuICogLSBcdUQ4M0RcdURFODAgKipQZXJmb3JtYW5jZSoqOiBPcHRpbWl6ZWQgd2l0aCBtZW1vaXphdGlvbiBhbmQgZWZmaWNpZW50IHJlLXJlbmRlcmluZ1xuICogLSBcdUQ4M0RcdURDRjEgKipSZXNwb25zaXZlKio6IEJ1aWx0LWluIEdyaWQgbGF5b3V0IHdpdGggY29uZmlndXJhYmxlIGJyZWFrcG9pbnRzXG4gKiAtIFx1RDgzRFx1REVFMVx1RkUwRiAqKlZhbGlkYXRpb24qKjogQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIFx1RDgzRFx1REQwNCAqKlRyYW5zZm9ybWF0aW9uKio6IEZsZXhpYmxlIHZhbHVlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gZm9ybSBhbmQgcGlja2VyIGZvcm1hdHNcbiAqIC0gXHVEODNEXHVEQ0RBICoqRGV2ZWxvcGVyIEV4cGVyaWVuY2UqKjogUmljaCBUeXBlU2NyaXB0IEludGVsbGlTZW5zZSBhbmQgY29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIEdyaWQgd3JhcHBlcjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlRm9ybSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG4gKiBpbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gJ0BnbndlYnNvZnQvdWkvd3JhcHBlcnMnO1xuICpcbiAqIGZ1bmN0aW9uIE15Rm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgYmlydGhEYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICBuYW1lPVwiYmlydGhEYXRlXCJcbiAqICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICAgICAgcmVxdWlyZWRcbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uIGFuZCB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBZHZhbmNlZEZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IHN0YXJ0RGF0ZTogRGF0ZSB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiUHJvamVjdCBTdGFydCBEYXRlXCJcbiAqICAgICAgIHRyYW5zZm9ybT17e1xuICogICAgICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgICAgICB9fVxuICogICAgICAgdmFsaWRhdGlvbj17e1xuICogICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgICAgICBtYXhEYXRlOiBhZGRZZWFycyhuZXcgRGF0ZSgpLCAyKSxcbiAqICAgICAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInLFxuICogICAgICAgICAgIG1heERhdGU6ICdTdGFydCBkYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMiB5ZWFycyBpbiB0aGUgZnV0dXJlJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgICAgICBzeD17e1xuICogICAgICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aG91dCBHcmlkIHdyYXBwZXIgZm9yIGN1c3RvbSBsYXlvdXRzOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBDdXN0b21MYXlvdXQoKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IGV2ZW50RGF0ZTogc3RyaW5nIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxCb3ggZGlzcGxheT1cImZsZXhcIiBnYXA9ezJ9PlxuICogICAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICAgIG5hbWU9XCJldmVudERhdGVcIlxuICogICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgICBsYWJlbD1cIkV2ZW50IERhdGVcIlxuICogICAgICAgICBncmlkUHJvcHM9e2ZhbHNlfSAvLyBEaXNhYmxlcyBHcmlkIHdyYXBwZXJcbiAqICAgICAgIC8+XG4gKiAgICAgICA8QnV0dG9uIHR5cGU9XCJzdWJtaXRcIj5TdWJtaXQ8L0J1dHRvbj5cbiAqICAgICA8L0JveD5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGxvYWRpbmcgc3RhdGUgYW5kIGN1c3RvbSBlcnJvciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gTG9hZGluZ0Zvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybSgpO1xuICogICBjb25zdCBbaXNWYWxpZGF0aW5nLCBzZXRJc1ZhbGlkYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJhcHBvaW50bWVudERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiQXBwb2ludG1lbnQgRGF0ZVwiXG4gKiAgICAgICBsb2FkaW5nPXtpc1ZhbGlkYXRpbmd9XG4gKiAgICAgICBMb2FkaW5nQ29tcG9uZW50PXsoKSA9PiA8Q2lyY3VsYXJQcm9ncmVzcyBzaXplPXsyMH0gLz59XG4gKiAgICAgICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHtcbiAqICAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3I/LnR5cGUgPT09ICdjdXN0b20nKSB7XG4gKiAgICAgICAgICAgcmV0dXJuICdUaGlzIGRhdGUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBhcHBvaW50bWVudCc7XG4gKiAgICAgICAgIH1cbiAqICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBkYXRlJztcbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZSAoaW5mZXJyZWQgZnJvbSBjb250cm9sKVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZSAoaW5mZXJyZWQgZnJvbSBuYW1lIHByb3ApXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGUgKGluZmVycmVkIGZyb20gdHJhbnNmb3JtIGZ1bmN0aW9ucylcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyB3aXRoIGZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2VcbiAqIEBwYXJhbSByZWYgLSBGb3J3YXJkIHJlZiBmb3IgdGhlIHJvb3QgZWxlbWVudCAoR3JpZCBvciBEYXRlUGlja2VyIGNvbnRhaW5lcilcbiAqIEByZXR1cm5zIFJlbmRlcmVkIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudCA9IGZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBEYXRlUGlja2VyRWxlbWVudFByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSwgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAgIC4uLmNvcmVQcm9wc1xuICB9ID0gcHJvcHM7XG5cbiAgLy8gSWYgZ3JpZFByb3BzIGlzIGV4cGxpY2l0bHkgZmFsc2UsIHJlbmRlciB3aXRob3V0IEdyaWQgd3JhcHBlclxuICBpZiAoZ3JpZFByb3BzID09PSBmYWxzZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICApO1xuICB9XG5cbiAgLy8gUmVuZGVyIHdpdGggR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dFxuICByZXR1cm4gKFxuICAgIDxHcmlkXG4gICAgICByZWY9e3JlZn1cbiAgICAgIHsuLi5ncmlkUHJvcHN9XG4gICAgPlxuICAgICAgPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59KTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgUmVhY3QgRGV2ZWxvcGVyIFRvb2xzXG5EYXRlUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiRGF0ZVBpY2tlckVsZW1lbnRcIjtcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlckVsZW1lbnQ7XG4iLCAiaW1wb3J0IHsgdXNlRm9ya1JlZiB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyBEYXRlUGlja2VyIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG4gIFBpY2tlclZhbGlkRGF0ZSxcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIEZpZWxkUGF0aCB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHtcbiAgdXNlRGF0ZVBpY2tlclZhbHVlLFxuICB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbixcbiAgdXNlRGF0ZVBpY2tlclN0eWxlcyxcbn0gZnJvbSBcIi4vaG9va3NcIjtcbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFRoZSBjb3JlIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRob3V0IEdyaWQgd3JhcHBlci5cbiAqXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQsIHBlcmZvcm1hbnQgZGF0ZSBwaWNrZXIgY29tcG9uZW50IHRoYXQgaW50ZWdyYXRlcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSB3aGlsZSBwcm92aWRpbmcgY29tcHJlaGVuc2l2ZSBUeXBlU2NyaXB0IHN1cHBvcnQgYW5kXG4gKiBhY2Nlc3NpYmlsaXR5IGZlYXR1cmVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBmb3JtIGZpZWxkIHR5cGVzXG4gKiAtIEF1dG9tYXRpYyB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiBiZXR3ZWVuIGZvcm0gYW5kIHBpY2tlciBmb3JtYXRzXG4gKiAtIENvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlc1xuICogLSBUaGVtZS1hd2FyZSBzdHlsaW5nIHdpdGggYWNjZXNzaWJpbGl0eSBzdXBwb3J0XG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXplZCB3aXRoIHByb3BlciBtZW1vaXphdGlvblxuICogLSBGb3J3YXJkIHJlZiBzdXBwb3J0IGZvciBhZHZhbmNlZCB1c2UgY2FzZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAqICAgbmFtZT1cImJpcnRoRGF0ZVwiXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgIHJlcXVpcmVkXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIlN0YXJ0IERhdGVcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfX1cbiAqICAgdmFsaWRhdGlvbj17e1xuICogICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcidcbiAqICAgICB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudENvcmUgPSBmb3J3YXJkUmVmPFxuICBIVE1MRGl2RWxlbWVudCxcbiAgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPig8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSwgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIHJlcXVpcmVkID0gZmFsc2UsXG4gICAgcnVsZXMsXG4gICAgY29udHJvbCxcbiAgICBwYXJzZUVycm9yLFxuICAgIHRyYW5zZm9ybSxcbiAgICB2YWxpZGF0aW9uLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRSZWFkT25seSA9IGZhbHNlLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRQcm9wcyA9IHt9LFxuICAgIHNsb3RQcm9wcyA9IHt9LFxuICAgIGRhdGVQaWNrZXJQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQgPSBcIm91dGxpbmVkXCIsXG4gICAgc3g6IGN1c3RvbVN4LFxuICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICBMb2FkaW5nQ29tcG9uZW50LFxuICAgIC4uLnJlc3RQcm9wc1xuICB9ID0gcHJvcHM7XG5cbiAgLy8gRXh0cmFjdCBEYXRlUGlja2VyLXNwZWNpZmljIHByb3BzXG4gIGNvbnN0IHtcbiAgICBkaXNhYmxlZCxcbiAgICBpbnB1dFJlZjogZXh0ZXJuYWxJbnB1dFJlZixcbiAgICBvbkNsb3NlLFxuICAgIC4uLnJlc3REYXRlUGlja2VyUHJvcHNcbiAgfSA9IGRhdGVQaWNrZXJQcm9wcztcblxuICAvLyBTZXQgdXAgZm9ybSBjb250cm9sbGVyXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlLFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIHJ1bGVzLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbCBhcyBhbnksIC8vIExldCByZWFjdC1ob29rLWZvcm0gaGFuZGxlIHRoZSBkZWZhdWx0IHZhbHVlIHR5cGluZ1xuICB9KTtcblxuICAvLyBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBob29rXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlOiBvblZhbHVlQ2hhbmdlIH0gPSB1c2VEYXRlUGlja2VyVmFsdWUoe1xuICAgIGZpZWxkLFxuICAgIHRyYW5zZm9ybSxcbiAgfSk7XG5cbiAgLy8gVmFsaWRhdGlvbiBob29rXG4gIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSwgaW52YWxpZCB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICAgIGZpZWxkU3RhdGUsXG4gICAgdmFsaWRhdGlvbixcbiAgICBwYXJzZUVycm9yLFxuICAgIHZhbHVlLFxuICB9KTtcblxuICAvLyBTdHlsaW5nIGhvb2tcbiAgY29uc3QgeyBzeDogY29tcHV0ZWRTeCwgY2xhc3NOYW1lIH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAgICBkaXNhYmxlZCxcbiAgICBoYXNFcnJvcixcbiAgICBsb2FkaW5nLFxuICAgIHRleHRSZWFkT25seSxcbiAgICBzeDogY3VzdG9tU3gsXG4gIH0pO1xuXG4gIC8vIE1lcmdlIGlucHV0IHJlZnNcbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgZXh0ZXJuYWxJbnB1dFJlZik7XG5cbiAgLy8gTWVtb2l6ZWQgY2hhbmdlIGhhbmRsZXIgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCwgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj4pID0+IHtcbiAgICAgIG9uVmFsdWVDaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgIH0sXG4gICAgW29uVmFsdWVDaGFuZ2VdXG4gICk7XG5cbiAgLy8gTWVtb2l6ZWQgY2xvc2UgaGFuZGxlclxuICBjb25zdCBoYW5kbGVDbG9zZSA9IHVzZUNhbGxiYWNrKFxuICAgICguLi5hcmdzOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPHR5cGVvZiBvbkNsb3NlPj4pID0+IHtcbiAgICAgIC8vIFRyaWdnZXIgZm9ybSBmaWVsZCBibHVyIGZvciB2YWxpZGF0aW9uXG4gICAgICBmaWVsZC5vbkJsdXIoKTtcblxuICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkNsb3NlIGlmIHByb3ZpZGVkXG4gICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICBvbkNsb3NlKC4uLmFyZ3MpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLm9uQmx1ciwgb25DbG9zZV1cbiAgKTtcblxuICAvLyBNZW1vaXplZCBibHVyIGhhbmRsZXIgZm9yIHRleHQgZmllbGRcbiAgY29uc3QgaGFuZGxlVGV4dEZpZWxkQmx1ciA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25CbHVyIGlmIHByb3ZpZGVkXG4gICAgICBpZiAodHlwZW9mIGlucHV0UHJvcHMub25CbHVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLm9uQmx1ciwgaW5wdXRQcm9wcy5vbkJsdXJdXG4gICk7XG5cbiAgLy8gTWVtb2l6ZWQgc2xvdCBwcm9wcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgY29uc3QgbWVtb2l6ZWRTbG90UHJvcHMgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgLi4uc2xvdFByb3BzLFxuICAgIGFjdGlvbkJhcjoge1xuICAgICAgYWN0aW9uczogW1wiY2xlYXJcIiwgXCJ0b2RheVwiLCBcImNhbmNlbFwiLCBcImFjY2VwdFwiXSBhcyBBcnJheTxcImFjY2VwdFwiIHwgXCJjYW5jZWxcIiB8IFwiY2xlYXJcIiB8IFwibmV4dFwiIHwgXCJuZXh0T3JBY2NlcHRcIiB8IFwidG9kYXlcIj4sXG4gICAgICAuLi5zbG90UHJvcHMuYWN0aW9uQmFyLFxuICAgIH0sXG4gICAgdGV4dEZpZWxkOiB7XG4gICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgcmVxdWlyZWQsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgIHZhcmlhbnQsXG4gICAgICBvbkJsdXI6IGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgICBlcnJvcjogaGFzRXJyb3IsXG4gICAgICBoZWxwZXJUZXh0OiBoYXNFcnJvciA/IGVycm9yTWVzc2FnZSA6IGhlbHBlclRleHQsXG4gICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgIHJlYWRPbmx5OiB0ZXh0UmVhZE9ubHksXG4gICAgICAgIFwiYXJpYS1pbnZhbGlkXCI6IGludmFsaWQsXG4gICAgICAgIFwiYXJpYS1kZXNjcmliZWRieVwiOiBoYXNFcnJvciA/IGAke25hbWV9LWVycm9yYCA6IHVuZGVmaW5lZCxcbiAgICAgICAgLi4uaW5wdXRQcm9wcy5pbnB1dFByb3BzLFxuICAgICAgfSxcbiAgICAgIC8vIEFkZCBsb2FkaW5nIGluZGljYXRvciBpZiBwcm92aWRlZFxuICAgICAgLi4uKGxvYWRpbmcgJiYgTG9hZGluZ0NvbXBvbmVudCAmJiB7XG4gICAgICAgIElucHV0UHJvcHM6IHtcbiAgICAgICAgICBlbmRBZG9ybm1lbnQ6IDxMb2FkaW5nQ29tcG9uZW50IC8+LFxuICAgICAgICAgIC4uLmlucHV0UHJvcHMuSW5wdXRQcm9wcyxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgLi4uc2xvdFByb3BzLnRleHRGaWVsZCxcbiAgICB9LFxuICB9KSwgW1xuICAgIHNsb3RQcm9wcyxcbiAgICBpbnB1dFByb3BzLFxuICAgIHJlcXVpcmVkLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHZhcmlhbnQsXG4gICAgaGFuZGxlVGV4dEZpZWxkQmx1cixcbiAgICBoYXNFcnJvcixcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgaGVscGVyVGV4dCxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgaW52YWxpZCxcbiAgICBuYW1lLFxuICAgIGxvYWRpbmcsXG4gICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGF0ZVBpY2tlclxuICAgICAgLy8gU3ByZWFkIHJlc3QgcHJvcHMgZmlyc3Qgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlblxuICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgIHsuLi5yZXN0RGF0ZVBpY2tlclByb3BzfVxuXG4gICAgICAvLyBDb3JlIHByb3BzXG4gICAgICByZWY9e3JlZn1cbiAgICAgIG5hbWU9e25hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2V9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG5cbiAgICAgIC8vIFVJIHByb3BzXG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBzeD17Y29tcHV0ZWRTeH1cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuXG4gICAgICAvLyBTbG90IHByb3BzXG4gICAgICBzbG90UHJvcHM9e21lbW9pemVkU2xvdFByb3BzfVxuXG4gICAgICAvLyBBY2Nlc3NpYmlsaXR5IHByb3BzXG4gICAgICBhcmlhLWludmFsaWQ9e2ludmFsaWR9XG4gICAgICBhcmlhLWRlc2NyaWJlZGJ5PXtoYXNFcnJvciA/IGAke25hbWV9LWVycm9yYCA6IHVuZGVmaW5lZH1cbiAgICAvPlxuICApO1xufSk7XG5cbi8vIFNldCBkaXNwbGF5IG5hbWUgZm9yIGRlYnVnZ2luZ1xuRGF0ZVBpY2tlckVsZW1lbnRDb3JlLmRpc3BsYXlOYW1lID0gXCJEYXRlUGlja2VyRWxlbWVudENvcmVcIjtcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXJFbGVtZW50Q29yZTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJSZXR1cm4sXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBEYXRlVHJhbnNmb3JtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogVHlwZS1zYWZlIGRhdGUgdmFsdWUgcmVhZGVyIHRoYXQgaGFuZGxlcyBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIGZyb20gdGhlIGRhdGUgYWRhcHRlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSBNVUkgZGF0ZSBwaWNrZXJzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoc3RyaW5nLCBkYXRlLCBvciBudWxsKVxuICogQHJldHVybnMgUHJvcGVybHkgdHlwZWQgZGF0ZSB2YWx1ZSBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGUgfCB1bmRlZmluZWRcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIGEgZGF0ZVxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgcmV0dXJuIHBhcnNlZERhdGUgYXMgVERhdGU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgY29udHJvbGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBmaWVsZDogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdO1xuICAvKiogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zICovXG4gIHRyYW5zZm9ybT86IERhdGVUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPiB7XG4gIC8qKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlciAqL1xuICB2YWx1ZTogVFZhbHVlIHwgbnVsbDtcbiAgLyoqIENoYW5nZSBoYW5kbGVyIGZvciBwaWNrZXIgdmFsdWUgdXBkYXRlcyAqL1xuICBvbkNoYW5nZTogKFxuICAgIHZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+XG4gICkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWx1ZSB0cmFuc2Zvcm1hdGlvbnMgd2l0aCB0eXBlIHNhZmV0eVxuICogXG4gKiBUaGlzIGhvb2sgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIGZvcm0gZmllbGQgdmFsdWVzIGFuZCBkYXRlIHBpY2tlciB2YWx1ZXMsXG4gKiBhcHBseWluZyBjdXN0b20gdHJhbnNmb3JtYXRpb25zIHdoaWxlIG1haW50YWluaW5nIHN0cmljdCBUeXBlU2NyaXB0IHR5cGluZy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFVzYWdlIHdpdGggRGF5LmpzIGRhdGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IGRheWpzKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB2YWx1ZSB0cmFuc2Zvcm1hdGlvblxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdHJhbnNmb3JtZWQgdmFsdWUgYW5kIGNoYW5nZSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlPiB7XG4gIGNvbnN0IHsgZmllbGQsIHRyYW5zZm9ybSB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICAvLyBUcmFuc2Zvcm0gdGhlIGZpZWxkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXJcbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKCgpOiBUVmFsdWUgfCBudWxsID0+IHtcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybS5pbnB1dChmaWVsZC52YWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IGhhbmRsZSBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gICAgcmV0dXJuIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGUoYWRhcHRlciwgZmllbGQudmFsdWUpIGFzIFRWYWx1ZSB8IG51bGw7XG4gIH0sIFtmaWVsZC52YWx1ZSwgdHJhbnNmb3JtPy5pbnB1dCwgYWRhcHRlcl0pO1xuXG4gIC8vIENyZWF0ZSBhIHN0YWJsZSBjaGFuZ2UgaGFuZGxlclxuICBjb25zdCBvbkNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCwgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdHJhbnNmb3JtLm91dHB1dChuZXdWYWx1ZSwgY29udGV4dCk7XG5cbiAgICAgICAgZmllbGQub25DaGFuZ2UodHJhbnNmb3JtZWRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRyYW5zZm9ybWF0aW9uOiBzdG9yZSB0aGUgZGF0ZSBhcy1pc1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZpZWxkLm9uQ2hhbmdlLCB0cmFuc2Zvcm0/Lm91dHB1dF1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsdWU7IiwgImltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRFcnJvcixcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbiAgVXNlQ29udHJvbGxlclJldHVybixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25PcHRpb25zPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ge1xuICAvKiogVGhlIGZpZWxkIHN0YXRlIGZyb20gcmVhY3QtaG9vay1mb3JtIGNvbnRyb2xsZXIgKi9cbiAgZmllbGRTdGF0ZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkU3RhdGVcIl07XG4gIC8qKiBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkYXRlIHBpY2tlciAqL1xuICB2YWxpZGF0aW9uPzogRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWc8VFZhbHVlPjtcbiAgLyoqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlciAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgRGF0ZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKiogVGhlIGN1cnJlbnQgZGF0ZSB2YWx1ZSBmb3IgdmFsaWRhdGlvbiAqL1xuICB2YWx1ZT86IFRWYWx1ZSB8IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbiBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICAvKiogV2hldGhlciB0aGUgZmllbGQgaGFzIGFueSB2YWxpZGF0aW9uIGVycm9ycyAqL1xuICBoYXNFcnJvcjogYm9vbGVhbjtcbiAgLyoqIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gZXJyb3IgKGZvcm0gb3IgZGF0ZS1zcGVjaWZpYykgKi9cbiAgZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkO1xuICAvKiogRm9ybWF0dGVkIGVycm9yIG1lc3NhZ2UgZm9yIGRpc3BsYXkgKi9cbiAgZXJyb3JNZXNzYWdlOiBSZWFjdE5vZGU7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlICovXG4gIGludmFsaWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBtZXNzYWdlcyBmb3IgY29tbW9uIGRhdGUgdmFsaWRhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gIHJlcXVpcmVkOiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgZGF0ZSBwaWNrZXIgdmFsaWRhdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgZXJyb3IgaGFuZGxpbmdcbiAqIFxuICogVGhpcyBob29rIGNlbnRyYWxpemVzIHZhbGlkYXRpb24gbG9naWMgZm9yIGRhdGUgcGlja2VycywgaGFuZGxpbmcgYm90aFxuICogcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb24gZXJyb3JzXG4gKiBmcm9tIE1VSSBkYXRlIHBpY2tlcnMuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGZvcm0gdmFsaWRhdGlvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlLCBpbnZhbGlkIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gKiAgIGZpZWxkU3RhdGUsXG4gKiAgIHZhbGlkYXRpb246IHtcbiAqICAgICBtaW5EYXRlOiBkYXlqcygpLnN1YnRyYWN0KDEsICd5ZWFyJyksXG4gKiAgICAgbWF4RGF0ZTogZGF5anMoKS5hZGQoMSwgJ3llYXInKSxcbiAqICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICBtaW5EYXRlOiAnRGF0ZSBtdXN0IGJlIHdpdGhpbiB0aGUgbGFzdCB5ZWFyJyxcbiAqICAgICAgIG1heERhdGU6ICdEYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMSB5ZWFyIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogVXNhZ2Ugd2l0aCBjdXN0b20gZXJyb3IgcGFyc2VyOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgcGFyc2VFcnJvcjogKGVycm9yKSA9PiB7XG4gKiAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAqICAgICAgIHJldHVybiBgRGF0ZSBFcnJvcjogJHtlcnJvcn1gO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnSW52YWxpZCBkYXRlJztcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gc3RhdGUgYW5kIGVycm9yIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKTogVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICBjb25zdCB7IGZpZWxkU3RhdGUsIHZhbGlkYXRpb24sIHBhcnNlRXJyb3IsIHZhbHVlIH0gPSBvcHRpb25zO1xuXG4gIC8vIE1lbW9pemUgdmFsaWRhdGlvbiByZXN1bHRzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBlcnJvcjogZmllbGRFcnJvciwgaW52YWxpZCB9ID0gZmllbGRTdGF0ZTtcbiAgICBcbiAgICAvLyBTdGFydCB3aXRoIGZvcm0gdmFsaWRhdGlvbiBlcnJvclxuICAgIGxldCBjdXJyZW50RXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkID0gZmllbGRFcnJvcjtcbiAgICBcbiAgICAvLyBDaGVjayBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb25zIGlmIG5vIGZvcm0gZXJyb3IgYW5kIHdlIGhhdmUgYSB2YWx1ZVxuICAgIGlmICghZmllbGRFcnJvciAmJiB2YWx1ZSAmJiB2YWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCB7IG1pbkRhdGUsIG1heERhdGUsIHNob3VsZERpc2FibGVEYXRlLCBlcnJvck1lc3NhZ2VzIH0gPSB2YWxpZGF0aW9uO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBtaW5pbXVtIGRhdGVcbiAgICAgIGlmIChtaW5EYXRlICYmIHZhbHVlIDwgbWluRGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21pbkRhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1pbkRhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgbWF4aW11bSBkYXRlXG4gICAgICBlbHNlIGlmIChtYXhEYXRlICYmIHZhbHVlID4gbWF4RGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21heERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1heERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZGlzYWJsZWQgZGF0ZVxuICAgICAgZWxzZSBpZiAoc2hvdWxkRGlzYWJsZURhdGUgJiYgc2hvdWxkRGlzYWJsZURhdGUodmFsdWUpKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnZGlzYWJsZWREYXRlJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzPy5kaXNhYmxlZERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBoYXNFcnJvciA9IEJvb2xlYW4oY3VycmVudEVycm9yKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaGFzRXJyb3IsXG4gICAgICBlcnJvcjogY3VycmVudEVycm9yLFxuICAgICAgaW52YWxpZDogaW52YWxpZCB8fCBoYXNFcnJvcixcbiAgICB9O1xuICB9LCBbZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgdmFsdWVdKTtcblxuICAvLyBNZW1vaXplIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZ1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSB1c2VNZW1vKCgpOiBSZWFjdE5vZGUgPT4ge1xuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlIGN1c3RvbSBlcnJvciBwYXJzZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAocGFyc2VFcnJvcikge1xuICAgICAgcmV0dXJuIHBhcnNlRXJyb3IodmFsaWRhdGlvblJlc3VsdC5lcnJvcik7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBlcnJvciBtZXNzYWdlIGhhbmRsaW5nXG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCdtZXNzYWdlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yICYmIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBlcnJvciBtZXNzYWdlcyBiYXNlZCBvbiBlcnJvciB0eXBlXG4gICAgaWYgKCd0eXBlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5yZXF1aXJlZDtcbiAgICAgICAgY2FzZSAnbWluRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWluRGF0ZTtcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWF4RGF0ZTtcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGU7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgfSwgW3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IsIHBhcnNlRXJyb3JdKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnZhbGlkYXRpb25SZXN1bHQsXG4gICAgZXJyb3JNZXNzYWdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjsiLCAiaW1wb3J0IHR5cGUgeyBTeFByb3BzLCBUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNPcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGEgdmFsaWRhdGlvbiBlcnJvciAqL1xuICBoYXNFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZSAqL1xuICBsb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRleHQgaW5wdXQgaXMgcmVhZC1vbmx5ICovXG4gIHRleHRSZWFkT25seT86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gc3R5bGVzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHMgKi9cbiAgc3g/OiBTeFByb3BzPFRoZW1lPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNSZXR1cm4ge1xuICAvKiogQ29tcHV0ZWQgc3R5bGVzIGZvciB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50ICovXG4gIHN4OiBTeFByb3BzPFRoZW1lPjtcbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIHN0eWxpbmcgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvb2sgZm9yIG1hbmFnaW5nIHRoZW1lLWF3YXJlIGRhdGUgcGlja2VyIHN0eWxlcyB3aXRoIGNvbnNpc3RlbnQgZGVzaWduIHN5c3RlbSBpbnRlZ3JhdGlvblxuICogXG4gKiBUaGlzIGhvb2sgcHJvdmlkZXMgb3B0aW1pemVkLCBtZW1vaXplZCBzdHlsZXMgZm9yIGRhdGUgcGlja2VyIGNvbXBvbmVudHMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gKiBhZGFwdCB0byB0aGUgY3VycmVudCBNVUkgdGhlbWUgYW5kIGNvbXBvbmVudCBzdGF0ZSAoZGlzYWJsZWQsIGVycm9yLCBsb2FkaW5nLCBldGMuKS5cbiAqIEl0IGVuc3VyZXMgY29uc2lzdGVudCBzdHlsaW5nIGFjcm9zcyBhbGwgZGF0ZSBwaWNrZXIgaW5zdGFuY2VzIHdoaWxlIGFsbG93aW5nIGN1c3RvbWl6YXRpb24uXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGRpc2FibGVkOiBpc0Rpc2FibGVkLFxuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgbG9hZGluZzogaXNMb2FkaW5nXG4gKiB9KTtcbiAqIFxuICogcmV0dXJuIDxEYXRlUGlja2VyIHN4PXtzeH0gLi4uIC8+O1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsZXM6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc3ggfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgc3g6IHtcbiAqICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgY29sb3I6ICdwcmltYXJ5Lm1haW4nXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFN0eWxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgQ29tcHV0ZWQgc3R5bGVzIGFuZCBjbGFzcyBuYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF0ZVBpY2tlclN0eWxlcyhcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMgPSB7fVxuKTogVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIGNvbnN0IHsgZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHksIHN4OiBjdXN0b21TeCB9ID0gb3B0aW9ucztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIC8vIE1lbW9pemUgY29tcHV0ZWQgc3R5bGVzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCBjb21wdXRlZFN4ID0gdXNlTWVtbygoKTogU3hQcm9wczxUaGVtZT4gPT4ge1xuICAgIGNvbnN0IGJhc2VTdHlsZXM6IFN4UHJvcHM8VGhlbWU+ID0ge1xuICAgICAgLy8gSW5wdXQgZmllbGQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kIFxuICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gVHJhbnNpdGlvbiBmb3Igc21vb3RoIHN0YXRlIGNoYW5nZXNcbiAgICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFtcbiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICAgICAgJ2JvcmRlci1jb2xvcicsXG4gICAgICAgICAgJ2NvbG9yJ1xuICAgICAgICBdLCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBFcnJvciBzdGF0ZSBzdHlsaW5nXG4gICAgICAgIC4uLihoYXNFcnJvciAmJiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi5NdWktZm9jdXNlZCc6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgICBib3hTaGFkb3c6IGAwIDAgMCAycHggJHt0aGVtZS5wYWxldHRlLmVycm9yLm1haW59MjVgLCAvLyAyNSBpcyAxNSUgb3BhY2l0eSBpbiBoZXhcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIG9wYWNpdHk6IDAuNyxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSW5wdXQgZWxlbWVudCBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgIGN1cnNvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyBcIm5vdC1hbGxvd2VkXCIgXG4gICAgICAgICAgOiB0ZXh0UmVhZE9ubHkgXG4gICAgICAgICAgICA/IFwicG9pbnRlclwiIFxuICAgICAgICAgICAgOiBcInRleHRcIixcbiAgICAgICAgXG4gICAgICAgIC8vIFJlYWQtb25seSBzcGVjaWZpYyBzdHlsaW5nXG4gICAgICAgIC4uLih0ZXh0UmVhZE9ubHkgJiYgIWRpc2FibGVkICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiLFxuICAgICAgICAgIGNhcmV0Q29sb3I6IFwidHJhbnNwYXJlbnRcIiwgLy8gSGlkZSB0ZXh0IGN1cnNvciBpbiByZWFkLW9ubHkgbW9kZVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlXG4gICAgICAgIC4uLihsb2FkaW5nICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwid2FpdFwiLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIFJlcXVpcmVkIGZpZWxkIGFzdGVyaXNrIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IFxuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICBmb250U2l6ZTogXCIxLjJlbVwiLFxuICAgICAgfSxcblxuICAgICAgLy8gTGFiZWwgc3R5bGluZyB3aXRoIGJldHRlciBjb250cmFzdFxuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogaGFzRXJyb3IgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgOiB0aGVtZS5wYWxldHRlLnRleHQuc2Vjb25kYXJ5LFxuICAgICAgICBcbiAgICAgICAgLy8gRW5zdXJlIHByb3BlciBjb250cmFzdCBmb3IgZGlzYWJsZWQgc3RhdGVcbiAgICAgICAgLi4uKGRpc2FibGVkICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LmRpc2FibGVkLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEhlbHBlciB0ZXh0IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpRm9ybUhlbHBlclRleHQtcm9vdFwiOiB7XG4gICAgICAgIG1hcmdpbkxlZnQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIG1hcmdpblJpZ2h0OiB0aGVtZS5zcGFjaW5nKDEpLFxuICAgICAgICBcbiAgICAgICAgLy8gRXJyb3Igc3RhdGVcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIENhbGVuZGFyIGljb24gc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dEFkb3JubWVudC1yb290XCI6IHtcbiAgICAgICAgY29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWQgXG4gICAgICAgICAgOiBoYXNFcnJvciBcbiAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIFxuICAgICAgICAgICAgOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5hY3RpdmUsXG4gICAgICB9LFxuXG4gICAgICAvLyBGb2N1cyByaW5nIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZm9jdXNlZFwiOiB7XG4gICAgICAgIG91dGxpbmU6IGAycHggc29saWQgJHt0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbn01MGAsIC8vIDUwIGlzIDMxJSBvcGFjaXR5XG4gICAgICAgIG91dGxpbmVPZmZzZXQ6IFwiMnB4XCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBFbmhhbmNlZCBjb250cmFzdCBmb3IgZGFyayB0aGVtZXNcbiAgICAgIC4uLih0aGVtZS5wYWxldHRlLm1vZGUgPT09ICdkYXJrJyAmJiB7XG4gICAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgICBib3JkZXJXaWR0aDogMixcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICAvLyBNZXJnZSB3aXRoIGN1c3RvbSBzdHlsZXNcbiAgICByZXR1cm4gY3VzdG9tU3ggPyBbYmFzZVN0eWxlcywgY3VzdG9tU3hdIGFzIFN4UHJvcHM8VGhlbWU+IDogYmFzZVN0eWxlcztcbiAgfSwgW1xuICAgIHRoZW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGhhc0Vycm9yLFxuICAgIGxvYWRpbmcsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGN1c3RvbVN4LFxuICBdKTtcblxuICAvLyBHZW5lcmF0ZSBhZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciBleHRlcm5hbCBzdHlsaW5nIGhvb2tzXG4gIGNvbnN0IGNsYXNzTmFtZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgaWYgKGRpc2FibGVkKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1kaXNhYmxlZCcpO1xuICAgIGlmIChoYXNFcnJvcikgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tZXJyb3InKTtcbiAgICBpZiAobG9hZGluZykgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tbG9hZGluZycpO1xuICAgIGlmICh0ZXh0UmVhZE9ubHkpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLXJlYWRPbmx5Jyk7XG4gICAgXG4gICAgcmV0dXJuIGNsYXNzZXMubGVuZ3RoID4gMCA/IGNsYXNzZXMuam9pbignICcpIDogdW5kZWZpbmVkO1xuICB9LCBbZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHldKTtcblxuICByZXR1cm4ge1xuICAgIHN4OiBjb21wdXRlZFN4LFxuICAgIGNsYXNzTmFtZSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlRGF0ZVBpY2tlclN0eWxlczsiLCAiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGgsIFBhdGhWYWx1ZSB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgZm9yIGNyZWF0aW5nIGJyYW5kZWQgZGF0ZSB0eXBlcyB0byBwcmV2ZW50IG1peGluZyBkaWZmZXJlbnQgZGF0ZSBmb3JtYXRzXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgYmFzZSBkYXRlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUQnJhbmQgLSBUaGUgYnJhbmQgc3RyaW5nIGZvciB0eXBlIHNhZmV0eVxuICovXG5leHBvcnQgdHlwZSBCcmFuZGVkRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSwgVEJyYW5kIGV4dGVuZHMgc3RyaW5nPiA9IFxuICBURGF0ZSAmIHsgcmVhZG9ubHkgX19icmFuZDogVEJyYW5kIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGRhdGUtbGlrZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGlja2VyVmFsaWREYXRlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgRGF0ZSBvYmplY3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBkYXRlLWxpa2Ugb2JqZWN0cyB3aXRoIGNvbW1vbiBkYXRlIGxpYnJhcnkgbWV0aG9kc1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIC8vIERheS5qcywgTW9tZW50LmpzLCBvciBzaW1pbGFyXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTHV4b24gRGF0ZVRpbWVcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBhcnNlYWJsZSBkYXRlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzYWJsZURhdGVTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBCYXNpYyBJU08gZGF0ZSBmb3JtYXQgY2hlY2tcbiAgY29uc3QgaXNvRGF0ZVJlZ2V4ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSg/OlRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHszfSk/KD86WnxbKy1dXFxkezJ9OlxcZHsyfSk/KT8kLztcblxuICBpZiAoaXNvRGF0ZVJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiBEYXRlIGNvbnN0cnVjdG9yIGNhbiBwYXJzZSBpdFxuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgcmV0dXJuICFpc05hTihwYXJzZWQuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlIHBpY2tlciB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSB1c2VkIGJ5IHRoZSBwaWNrZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGRhdGUgYWRhcHRlciBmcm9tIE1VSSBsb2NhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgQSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IHNhZmVseSBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0ZUlucHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+KSB7XG4gIHJldHVybiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik6IFREYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZShwYXJzZWQpID8gKHBhcnNlZCBhcyBURGF0ZSkgOiBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBURGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRlIHBpY2tlciB2YWx1ZXMgYmFjayB0byBmb3JtIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBmb3JtYXQgdG8gdXNlIGZvciBzdHJpbmcgY29udmVyc2lvbiAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGRhdGVzIHRvIGZvcm0gdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlT3V0cHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGZvcm1hdD86IHN0cmluZykge1xuICByZXR1cm4gKHZhbHVlOiBURGF0ZSB8IG51bGwpOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBmb3JtYXQgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGRhdGUgYXMtaXNcbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBkYXRlIGxpYnJhcnkgZm9ybWF0c1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaXNvJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkYXRlLW9ubHknKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGF5LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTW9tZW50LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTHV4b24gZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS50b0Zvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2s6IHJldHVybiBhcy1pc1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBjcmVhdGUgZGVmYXVsdCBkYXRlIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlXG4gKiBAcmV0dXJucyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0RGF0ZVBpY2tlckNvbmZpZzxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4oKSB7XG4gIHJldHVybiB7XG4gICAgLy8gRGVmYXVsdCBzbG90IHByb3BzIGZvciBjb25zaXN0ZW50IGJlaGF2aW9yXG4gICAgc2xvdFByb3BzOiB7XG4gICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgY29uc3QsXG4gICAgICB9LFxuICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgdmFyaWFudDogJ291dGxpbmVkJyBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IGdyaWQgcHJvcHMgZm9yIGxheW91dCBjb25zaXN0ZW5jeVxuICAgIGdyaWRQcm9wczoge1xuICAgICAgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IGFzIGNvbnN0LFxuICAgIH0sXG4gICAgXG4gICAgLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICB2YWxpZGF0aW9uOiB7XG4gICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gICAgICAgIGludmFsaWREYXRlOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGVcIixcbiAgICAgICAgbWluRGF0ZTogXCJEYXRlIG11c3QgYmUgYWZ0ZXIgdGhlIG1pbmltdW0gYWxsb3dlZCBkYXRlXCIsXG4gICAgICAgIG1heERhdGU6IFwiRGF0ZSBtdXN0IGJlIGJlZm9yZSB0aGUgbWF4aW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgZGlzYWJsZWREYXRlOiBcIlRoaXMgZGF0ZSBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9IGFzIGNvbnN0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gc2FmZWx5IGV4dHJhY3QgZXJyb3IgbWVzc2FnZSBmcm9tIHZhcmlvdXMgZXJyb3IgdHlwZXNcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciBvYmplY3QgKGNvdWxkIGJlIGZyb20gcmVhY3QtaG9vay1mb3JtIG9yIE1VSSBkYXRlIHBpY2tlcilcbiAqIEByZXR1cm5zIEEgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCkge1xuICAgIC8vIFJlYWN0IEhvb2sgRm9ybSBGaWVsZEVycm9yXG4gICAgaWYgKCdtZXNzYWdlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIE1VSSBEYXRlVmFsaWRhdGlvbkVycm9yXG4gICAgaWYgKCd0eXBlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IChlcnJvciBhcyBhbnkpLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUnO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGVhcmx5JztcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdEYXRlIGlzIHRvbyBsYXRlJztcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBpcyBub3QgYXZhaWxhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSBzZWxlY3Rpb24nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnSW52YWxpZCBpbnB1dCc7XG59XG5cbi8qKlxuICogUGVyZm9ybWFuY2UgdXRpbGl0eSB0byBjcmVhdGUgc3RhYmxlIHJlZmVyZW5jZXMgZm9yIGNvbXBsZXggcHJvcHNcbiAqIFRoaXMgaGVscHMgcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzIHdoZW4gdXNpbmcgY29tcGxleCBjb25maWd1cmF0aW9uIG9iamVjdHNcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBBIEpTT04gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IGluIHVzZU1lbW8vdXNlQ2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWJsZUtleTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGNvbmZpZzogVCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIC8vIFNvcnQgb2JqZWN0IGtleXMgZm9yIGNvbnNpc3RlbnQgc2VyaWFsaXphdGlvblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgc29ydGVkW2tdID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0c1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnNvcnQoKS5qb2luKCctJyk7XG4gIH1cbn0iLCAiaW1wb3J0IFZpc2liaWxpdHkgZnJvbSBcIkBtdWkvaWNvbnMtbWF0ZXJpYWwvVmlzaWJpbGl0eVwiO1xuaW1wb3J0IFZpc2liaWxpdHlPZmYgZnJvbSBcIkBtdWkvaWNvbnMtbWF0ZXJpYWwvVmlzaWJpbGl0eU9mZlwiO1xuaW1wb3J0IHR5cGUge1xuICBJY29uQnV0dG9uUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBHcmlkUHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEljb25CdXR0b24sXG4gIElucHV0QWRvcm5tZW50LFxuICBUZXh0RmllbGQsXG4gIHVzZUZvcmtSZWYsXG4gIEdyaWRcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgTW91c2VFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlc1xufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBQYXNzd29yZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBQYXNzd29yZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+ID0gT21pdDxUZXh0RmllbGRQcm9wcywgXCJuYW1lXCI+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJwYXNzd29yZFwiIHwgXCJ1c2VyLmN1cnJlbnRQYXNzd29yZFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgdmlzaWJpbGl0eSB0b2dnbGUgaWNvbiBidXR0b25cbiAgICogQGRlZmF1bHRWYWx1ZSBcImRlZmF1bHRcIlxuICAgKi9cbiAgaWNvbkNvbG9yPzogSWNvbkJ1dHRvblByb3BzW1wiY29sb3JcIl07XG4gIC8qKlxuICAgKiBDdXN0b20gcmVuZGVyIGZ1bmN0aW9uIGZvciB0aGUgdmlzaWJpbGl0eSB0b2dnbGUgaWNvblxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBXaGV0aGVyIHBhc3N3b3JkIGlzIGN1cnJlbnRseSBoaWRkZW5cbiAgICogQHJldHVybnMgUmVhY3ROb2RlIHRvIHJlbmRlciBhcyB0aGUgaWNvblxuICAgKiBAZGVmYXVsdFZhbHVlIERlZmF1bHQgdmlzaWJpbGl0eS92aXNpYmlsaXR5LW9mZiBpY29uc1xuICAgKi9cbiAgcmVuZGVySWNvbj86IChwYXNzd29yZDogYm9vbGVhbikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufTtcblxudHlwZSBQYXNzd29yZEVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPlxuPihcbiAgcHJvcHM6IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBQYXNzd29yZEVsPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4ocHJvcHM6IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgaWNvbkNvbG9yLFxuICAgIHJlbmRlckljb24gPSAocGFzc3dvcmQpID0+IChwYXNzd29yZCA/IDxWaXNpYmlsaXR5IC8+IDogPFZpc2liaWxpdHlPZmYgLz4pLFxuICAgIHNsb3RQcm9wcyxcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQgPSBUZXh0RmllbGQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25CbHVyLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gdXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgY29uc3QgZW5kQWRvcm5tZW50ID0gKFxuICAgIDxJbnB1dEFkb3JubWVudCBwb3NpdGlvbj17XCJlbmRcIn0+XG4gICAgICA8SWNvbkJ1dHRvblxuICAgICAgICBvbk1vdXNlRG93bj17KGU6IE1vdXNlRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiBlLnByZXZlbnREZWZhdWx0KCl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFBhc3N3b3JkKCFwYXNzd29yZCl9XG4gICAgICAgIHRhYkluZGV4PXstMX1cbiAgICAgICAgY29sb3I9e2ljb25Db2xvciA/PyBcImRlZmF1bHRcIn1cbiAgICAgID5cbiAgICAgICAge3JlbmRlckljb24ocGFzc3dvcmQpfVxuICAgICAgPC9JY29uQnV0dG9uPlxuICAgIDwvSW5wdXRBZG9ybm1lbnQ+XG4gICk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZFxuICAgICAgey4uLnJlc3R9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB0eXBlPXtwYXNzd29yZCA/IFwicGFzc3dvcmRcIiA6IFwidGV4dFwifVxuICAgICAgdmFsdWU9e2ZpZWxkLnZhbHVlfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIHRoaXMgd2lsbCBiZSBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYW55b25lIHVzaW5nIHRyYW5zZm9ybS5vdXRwdXRcbiAgICAgICAgLy8gYmVjYXVzZSBub3cgd2UgYXJlIHBhc3NpbmcgZXZlbnQgaW5zdGVhZCBvZiBldmVudC50YXJnZXQudmFsdWUgb3IgK2V2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICBmaWVsZC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdC5vbkNoYW5nZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmVzdC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9eyhldmVudCkgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICB7Li4uKHR5cGVvZiBzbG90UHJvcHMgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyB7XG4gICAgICAgICAgSW5wdXRQcm9wczoge1xuICAgICAgICAgICAgZW5kQWRvcm5tZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgc2xvdFByb3BzOiB7XG4gICAgICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgICAgIC4uLnNsb3RQcm9wcz8uaW5wdXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgVGV4dEZpZWxkUHJvcHNbXCJzbG90UHJvcHNcIl0sXG4gICAgICAgIH0pfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlwifVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgcGFzc3dvcmQgVGV4dEZpZWxkIHdpdGggc2hvdy9oaWRlIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHBhc3N3b3JkIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBhIGJ1aWx0LWluIHZpc2liaWxpdHkgdG9nZ2xlIGJ1dHRvbi4gVGhlIHBhc3N3b3JkXG4gKiBjYW4gYmUgc2hvd24gb3IgaGlkZGVuIGJ5IGNsaWNraW5nIHRoZSBleWUgaWNvbiBpbiB0aGUgaW5wdXQncyBlbmQgYWRvcm5tZW50LlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBQYXNzd29yZCB2aXNpYmlsaXR5IHRvZ2dsZVxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgdmlzaWJpbGl0eSBpY29uc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydFxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicGFzc3dvcmRcIlxuICogICBsYWJlbD1cIlBhc3N3b3JkXCJcbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyxcbiAqICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IDgsIG1lc3NhZ2U6ICdNaW5pbXVtIDggY2hhcmFjdGVycycgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBpY29uIGNvbG9yOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjb25maXJtUGFzc3dvcmRcIlxuICogICBsYWJlbD1cIkNvbmZpcm0gUGFzc3dvcmRcIlxuICogICBpY29uQ29sb3I9XCJwcmltYXJ5XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJSZS1lbnRlciB5b3VyIHBhc3N3b3JkXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJuZXdQYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiTmV3IFBhc3N3b3JkXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJlbmRlckljb249eyhoaWRkZW4pID0+IGhpZGRlbiA/IDxDdXN0b21IaWRlSWNvbiAvPiA6IDxDdXN0b21TaG93SWNvbiAvPn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgUGFzc3dvcmRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikgPT4ge1xuICBpZiAoZ3JpZFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxHcmlkXG4gICAgICAgIHsuLi57IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSwgLi4uZ3JpZFByb3BzIH19XG4gICAgICA+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuUGFzc3dvcmRFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJQYXNzd29yZEVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgUGFzc3dvcmRFbGVtZW50O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBGb3JtTGFiZWxQcm9wcyxcbiAgUmFkaW9Hcm91cFByb3BzLFxuICBSYWRpb1Byb3BzLFxuICBHcmlkUHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgRm9ybUxhYmVsLFxuICBSYWRpbyxcbiAgUmFkaW9Hcm91cCxcbiAgdXNlVGhlbWUsXG4gIEdyaWRcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlclxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gXCIuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm1cIjtcblxuLy8gVHlwZSBmb3IgcHJpbWl0aXZlIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIHJhZGlvIGJ1dHRvbiB2YWx1ZXNcbnR5cGUgUHJpbWl0aXZlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBDb25zdHJhaW50IHRvIGVuc3VyZSBvcHRpb24gb2JqZWN0cyBoYXZlIHRoZSByZXF1aXJlZCBrZXlzXG50eXBlIE9wdGlvbk9iamVjdDxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZ1xuPiA9IFJlY29yZDxUVmFsdWVLZXksIFByaW1pdGl2ZVZhbHVlPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PiAmXG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBrZXlvZiBUT3B0aW9uICYgc3RyaW5nID0gXCJpZFwiLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBrZXlvZiBUT3B0aW9uICYgc3RyaW5nID0gXCJsYWJlbFwiLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBrZXlvZiBUT3B0aW9uICYgc3RyaW5nID0gXCJkaXNhYmxlZFwiXG4+IHtcbiAgb3B0aW9uczogVE9wdGlvbltdO1xuICBoZWxwZXJUZXh0PzogUmVhY3ROb2RlO1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBsYWJlbEtleT86IFRMYWJlbEtleTtcbiAgdmFsdWVLZXk/OiBUVmFsdWVLZXk7XG4gIGRpc2FibGVkS2V5PzogVERpc2FibGVkS2V5O1xuICB0eXBlPzogXCJudW1iZXJcIiB8IFwic3RyaW5nXCIgfCBcImJvb2xlYW5cIjtcbiAgZW1wdHlPcHRpb25MYWJlbD86IHN0cmluZztcbiAgb25DaGFuZ2U/OiAodmFsdWU6IFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb24gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIHJldHVybk9iamVjdD86IGJvb2xlYW47XG4gIHJvdz86IGJvb2xlYW47XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGxhYmVsUHJvcHM/OiBPbWl0PEZvcm1Db250cm9sTGFiZWxQcm9wcywgXCJsYWJlbFwiIHwgXCJjb250cm9sXCIgfCBcInZhbHVlXCI+O1xuICBmb3JtTGFiZWxQcm9wcz86IE9taXQ8Rm9ybUxhYmVsUHJvcHMsIFwicmVxdWlyZWRcIiB8IFwiZXJyb3JcIj47XG4gIHJhZGlvUHJvcHM/OiBSYWRpb1Byb3BzO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHRyYW5zZm9ybT86IHtcbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUT3B0aW9uW1RWYWx1ZUtleV07XG4gICAgb3V0cHV0PzogKFxuICAgICAgdmFsdWU6IFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb24gfCB1bmRlZmluZWRcbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBSYWRpb0J1dHRvbkdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImlkXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImxhYmVsXCIsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImRpc2FibGVkXCJcbj4ocHJvcHM6IFJhZGlvQnV0dG9uR3JvdXBQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5Pikge1xuICBjb25zdCB7XG4gICAgb3B0aW9ucyxcbiAgICBsYWJlbCxcbiAgICBuYW1lLFxuICAgIGxhYmVsS2V5ID0gXCJsYWJlbFwiIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUtleSA9IFwiaWRcIiBhcyBUVmFsdWVLZXksXG4gICAgZGlzYWJsZWRLZXkgPSBcImRpc2FibGVkXCIgYXMgVERpc2FibGVkS2V5LFxuICAgIHJlcXVpcmVkLFxuICAgIGVtcHR5T3B0aW9uTGFiZWwsXG4gICAgcmV0dXJuT2JqZWN0LFxuICAgIHJvdyxcbiAgICBjb250cm9sLFxuICAgIHR5cGUsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBkaXNhYmxlZCxcbiAgICBmb3JtTGFiZWxQcm9wcyxcbiAgICByYWRpb1Byb3BzLFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb25cbiAgPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIHx8IChcIlwiIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG4gICAgICAgICAgfSxcbiAgICAgIG91dHB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybT8ub3V0cHV0XG4gICAgICAgICAgOiAoX2V2ZW50LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG9uUmFkaW9DaGFuZ2U6IFJhZGlvR3JvdXBQcm9wc1tcIm9uQ2hhbmdlXCJdID0gKGV2ZW50LCByYWRpb1ZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSByZXR1cm5PYmplY3RcbiAgICAgID8gKG9wdGlvbnMgYXMgVE9wdGlvbltdKS5maW5kKChvcHRpb24pID0+IG9wdGlvblt2YWx1ZUtleV0gPT09IHJhZGlvVmFsdWUpXG4gICAgICA6IHJhZGlvVmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuXG4gICAgb25DaGFuZ2UoZXZlbnQsIHJldHVyblZhbHVlKTtcbiAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmVzdC5vbkNoYW5nZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxGb3JtTGFiZWwgey4uLmZvcm1MYWJlbFByb3BzfSByZXF1aXJlZD17cmVxdWlyZWR9IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvRm9ybUxhYmVsPlxuICAgICAgKX1cbiAgICAgIDxSYWRpb0dyb3VwIG9uQ2hhbmdlPXtvblJhZGlvQ2hhbmdlfSBuYW1lPXtuYW1lfSByb3c9e3Jvd30gdmFsdWU9e3ZhbHVlfT5cbiAgICAgICAge2VtcHR5T3B0aW9uTGFiZWwgJiYgKFxuICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgICAgY29sb3I6IGVycm9yID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17IXZhbHVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFiZWw9e2VtcHR5T3B0aW9uTGFiZWx9XG4gICAgICAgICAgICB2YWx1ZT1cIlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb25bdmFsdWVLZXldO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbkRpc2FibGVkID0gb3B0aW9uW2Rpc2FibGVkS2V5XSB8fCBmYWxzZTtcbiAgICAgICAgICBsZXQgdmFsOiBUT3B0aW9uW1RWYWx1ZUtleV0gfCB1bmRlZmluZWQgPSByZXR1cm5PYmplY3RcbiAgICAgICAgICAgID8gKHZhbHVlIGFzIFRPcHRpb24pPy5bdmFsdWVLZXldXG4gICAgICAgICAgICA6IHZhbHVlIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlID09PSBcIm51bWJlclwiICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBOdW1iZXIodmFsKSBhcyBUT3B0aW9uW1RWYWx1ZUtleV07XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImJvb2xlYW5cIiAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gQm9vbGVhbih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NoZWNrZWQgPSB2YWwgPT09IG9wdGlvbktleTtcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBrZXk9e1N0cmluZyhvcHRpb25LZXkpfVxuICAgICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgb3B0aW9uRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0NoZWNrZWR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uS2V5fVxuICAgICAgICAgICAgICBsYWJlbD17b3B0aW9uW2xhYmVsS2V5XX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICB7ZXJyb3IgJiYgPEZvcm1IZWxwZXJUZXh0PntlcnJvci5tZXNzYWdlfTwvRm9ybUhlbHBlclRleHQ+fVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG5jb25zdCBSYWRpb0J1dHRvbkdyb3VwID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXksIFREaXNhYmxlZEtleT4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImlkXCIsXG4gIFRMYWJlbEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImxhYmVsXCIsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIGtleW9mIFRPcHRpb24gJiBzdHJpbmcgPSBcImRpc2FibGVkXCJcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogUmFkaW9CdXR0b25Hcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+KSA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVERpc2FibGVkS2V5PiB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24sIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBURGlzYWJsZWRLZXk+IHsuLi5wcm9wc30gLz47XG59O1xuXG5SYWRpb0J1dHRvbkdyb3VwLmRpc3BsYXlOYW1lID0gXCJSYWRpb0J1dHRvbkdyb3VwXCI7XG5cbmV4cG9ydCBkZWZhdWx0IFJhZGlvQnV0dG9uR3JvdXA7XG4iLCAiaW1wb3J0IHtcbiAgR3JpZCxcbiAgdXNlVGhlbWUsXG4gIFRleHRGaWVsZCxcbiAgdHlwZSBTeFByb3BzLFxuICBBdXRvY29tcGxldGUsXG4gIHR5cGUgR3JpZFByb3BzLFxuICB0eXBlIENoaXBUeXBlTWFwLFxuICB0eXBlIFRleHRGaWVsZFByb3BzLFxuICB0eXBlIFRleHRGaWVsZFZhcmlhbnRzLFxuICB0eXBlIEF1dG9jb21wbGV0ZVByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgSlNYIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIHR5cGUgQ29udHJvbCxcbiAgdXNlQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRWYWx1ZXMsXG4gIHR5cGUgVXNlQ29udHJvbGxlclByb3BzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5leHBvcnQgdHlwZSBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxUT3B0aW9uLCBNdWx0aXBsZSwgRGlzYWJsZUNsZWFyYWJsZSwgRnJlZVNvbG8sIENoaXBDb21wb25lbnQ+LFxuICAnbmFtZScgfCAncmVuZGVySW5wdXQnIHwgJ2lzT3B0aW9uRXF1YWxUb1ZhbHVlJyB8ICdnZXRPcHRpb25MYWJlbCcgfCAnZGlzYWJsZWQnXG4+ICYge1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPlsncnVsZXMnXTtcbiAgbmFtZTogVE5hbWU7XG4gIGRlcGVuZHNPbjogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgc3g/OiBTeFByb3BzO1xuICBpc0VkaXQ/OiBib29sZWFuO1xuICBsYWJlbEtleT86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlS2V5Pzoga2V5b2YgVE9wdGlvbjtcbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xufTtcblxudHlwZSBTZWxlY3RDYXNjYWRlRWxlbWVudENvbXBvbmVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KFxuICBwcm9wczogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPlxuKSA9PiBSZWFjdC5KU1guRWxlbWVudDtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0Q2FzY2FkZUVsZW1lbnQ8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8VE9wdGlvbiwgVEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIGxhYmVsS2V5ID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUtleSA9ICdWYWx1ZScsXG4gICAgbmFtZSxcbiAgICBvbkJsdXIsXG4gICAgb25DaGFuZ2UsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9ucyxcbiAgICBjb250cm9sLFxuICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBsYWJlbCxcbiAgICBkZXBlbmRzT24sXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIHN4LFxuICAgIGlzRWRpdCA9IGZhbHNlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHsgcmVxdWlyZWQgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IGdldE9wdGlvbktleSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb24gPT09ICdudW1iZXInKSByZXR1cm4gb3B0aW9uO1xuICAgICAgY29uc3Qga2V5ID0gb3B0aW9uID8gb3B0aW9uW3ZhbHVlS2V5IGFzIGtleW9mIFRPcHRpb25dIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5ICE9PSBudWxsID8gU3RyaW5nKGtleSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUtleV1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxLZXkgYXMga2V5b2YgVE9wdGlvbl0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxLZXldXG4gICk7XG5cbiAgY29uc3QgaXNPcHRpb25FcXVhbFRvVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uLCB2YWx1ZTogVE9wdGlvbikgPT5cbiAgICBnZXRPcHRpb25LZXkob3B0aW9uKSA9PT0gZ2V0T3B0aW9uS2V5KHZhbHVlKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgeyBmaWVsZDogZGVwZW5kZW50RmllbGQgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWU6IGRlcGVuZHNPbixcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBwYXJlbnRWYWx1ZVJlZiA9IHVzZVJlZjxUT3B0aW9uPihkZXBlbmRlbnRGaWVsZC52YWx1ZSA/PyBudWxsKTtcbiAgY29uc3QgW2hhc0F1dG9TZWxlY3RlZCwgc2V0SGFzQXV0b1NlbGVjdGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgICghIWRlcGVuZGVudEZpZWxkLnZhbHVlICYmIHBhcmVudFZhbHVlUmVmPy5jdXJyZW50ICE9PSBkZXBlbmRlbnRGaWVsZC52YWx1ZSkgfHxcbiAgICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlID09PSBudWxsXG4gICAgKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgIHNldEhhc0F1dG9TZWxlY3RlZChmYWxzZSk7XG4gICAgfVxuICB9LCBbZGVwZW5kZW50RmllbGQudmFsdWVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc0VkaXQgJiYgIWRpc2FibGVkICYmIG9wdGlvbnMubGVuZ3RoID09PSAxICYmIGZpZWxkLnZhbHVlID09IG51bGwgJiYgIWhhc0F1dG9TZWxlY3RlZCkge1xuICAgICAgZmllbGQub25DaGFuZ2UoZ2V0T3B0aW9uS2V5KG9wdGlvbnNbMF0pKTtcbiAgICAgIHNldEhhc0F1dG9TZWxlY3RlZCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmIGZpZWxkLnZhbHVlID09IG51bGwgJiYgIWhhc0F1dG9TZWxlY3RlZCkge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShnZXRPcHRpb25LZXkob3B0aW9uc1swXSkpO1xuICAgICAgICBzZXRIYXNBdXRvU2VsZWN0ZWQodHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbXG4gICAgb3B0aW9ucyxcbiAgICBmaWVsZC52YWx1ZSxcbiAgICBmaWVsZC5vbkNoYW5nZSxcbiAgICBoYXNBdXRvU2VsZWN0ZWQsXG4gICAgaXNFZGl0LFxuICAgIGRpc2FibGVkLFxuICAgIGZpZWxkLFxuICAgIGdldE9wdGlvbktleSxcbiAgICBkZXBlbmRlbnRGaWVsZC5vbkNoYW5nZSxcbiAgXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHZhbHVlPXtcbiAgICAgICAgb3B0aW9uc1xuICAgICAgICAgIC5tYXAoKG9wdGlvbikgPT4gKGdldE9wdGlvbktleShvcHRpb24pID09PSBmaWVsZC52YWx1ZSA/IG9wdGlvbiA6IG51bGwpKVxuICAgICAgICAgIC5maW5kKEJvb2xlYW4pIHx8IG51bGxcbiAgICAgIH1cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uS2V5fVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9e2lzT3B0aW9uRXF1YWxUb1ZhbHVlfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17ZGVwZW5kZW50RmllbGQudmFsdWUgPT0gbnVsbCB8fCBkaXNhYmxlZH1cbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pID0+IHtcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUgPyBnZXRPcHRpb25LZXkobmV3VmFsdWUpIDogbnVsbCk7XG4gICAgICAgIGlmIChvbkNoYW5nZSAmJiB0eXBlb2Ygb25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkNoYW5nZShldmVudCwgbmV3VmFsdWUsIHJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9eyhldmVudCkgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZW5kZXJJbnB1dD17KHBhcmFtcykgPT4gKFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QnOiB7XG4gICAgICAgICAgICAgIGJnY29sb3I6XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgfHwgZGVwZW5kZW50RmllbGQudmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlzayc6IHsgY29sb3I6ICdyZWQnIH0sXG4gICAgICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLWlucHV0Jzoge1xuICAgICAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkIHx8IGRlcGVuZGVudEZpZWxkLnZhbHVlID09IG51bGwgPyAnbm90LWFsbG93ZWQnIDogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2VsZWN0Q2FzY2FkZUVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuU2VsZWN0Q2FzY2FkZUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0Q2FzY2FkZUVsZW1lbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RDYXNjYWRlRWxlbWVudDtcbiIsICJpbXBvcnQgeyBHcmlkLCB1c2VUaGVtZSwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBTeFByb3BzLFxuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxuICBBdXRvY29tcGxldGVWYWx1ZSxcbiAgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uLFxuICBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZyxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIHVzZU1lbW8sXG4gIHR5cGUgSlNYLFxuICB1c2VFZmZlY3QsXG4gIHVzZUNhbGxiYWNrLFxuICB0eXBlIFN5bnRoZXRpY0V2ZW50LFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29udHJvbCxcbiAgdXNlQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRWYWx1ZXMsXG4gIHR5cGUgVXNlQ29udHJvbGxlclByb3BzLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBTZWxlY3RFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVE9wdGlvbiAtIFRoZSBvcHRpb24gb2JqZWN0IHR5cGVcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIE11bHRpcGxlIC0gV2hldGhlciBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIERpc2FibGVDbGVhcmFibGUgLSBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gaXMgZGlzYWJsZWRcbiAqIEB0ZW1wbGF0ZSBGcmVlU29sbyAtIFdoZXRoZXIgZnJlZSB0ZXh0IGlucHV0IGlzIGFsbG93ZWRcbiAqIEB0ZW1wbGF0ZSBDaGlwQ29tcG9uZW50IC0gVGhlIGNoaXAgY29tcG9uZW50IHR5cGUgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbXCJkZWZhdWx0Q29tcG9uZW50XCJdXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPixcbiAgfCBcIm5hbWVcIlxuICB8IFwicmVuZGVySW5wdXRcIlxuICB8IFwiaXNPcHRpb25FcXVhbFRvVmFsdWVcIlxuICB8IFwiZ2V0T3B0aW9uTGFiZWxcIlxuICB8IFwiZGlzYWJsZWRcIlxuPiAmIHtcbiAgLyoqXG4gICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmaWVsZFxuICAgKiBAZXhhbXBsZSB7IHJlcXVpcmVkOiAnUGxlYXNlIHNlbGVjdCBhbiBvcHRpb24nIH1cbiAgICovXG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wicnVsZXNcIl07XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImNhdGVnb3J5XCIgfCBcInVzZXIuZGVwYXJ0bWVudFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgc2VsZWN0IGlucHV0XG4gICAqIEBleGFtcGxlIFwiQ2hvb3NlIGFuIG9wdGlvbi4uLlwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiQ2F0ZWdvcnlcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnRcbiAgICovXG4gIHN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBlZGl0IG1vZGUgKGFmZmVjdHMgYXV0by1zZWxlY3Rpb24gYmVoYXZpb3IpXG4gICAqIFdoZW4gZmFsc2UgYW5kIG9ubHkgb25lIG9wdGlvbiBleGlzdHMsIHRoYXQgb3B0aW9uIGlzIGF1dG8tc2VsZWN0ZWRcbiAgICogQGRlZmF1bHRWYWx1ZSBmYWxzZVxuICAgKi9cbiAgaXNFZGl0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlbGVjdCBpcyBkaXNhYmxlZFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG5hbWUgaW4gb3B0aW9uIG9iamVjdHMgdG8gdXNlIGFzIGRpc3BsYXkgbGFiZWxcbiAgICogQGRlZmF1bHRWYWx1ZSBcIkxhYmVsXCJcbiAgICogQGV4YW1wbGUgXCJuYW1lXCIgfCBcInRpdGxlXCJcbiAgICovXG4gIGxhYmVsS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG5hbWUgaW4gb3B0aW9uIG9iamVjdHMgdG8gdXNlIGFzIHRoZSB2YWx1ZVxuICAgKiBAZGVmYXVsdFZhbHVlIFwiVmFsdWVcIlxuICAgKiBAZXhhbXBsZSBcImlkXCIgfCBcImNvZGVcIlxuICAgKi9cbiAgdmFsdWVLZXk/OiBrZXlvZiBUT3B0aW9uO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCBcIm5hbWVcIj47XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RFbGVtZW50PFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFtcImRlZmF1bHRDb21wb25lbnRcIl1cbj4oXG4gIHByb3BzOiBTZWxlY3RFbGVtZW50UHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQ2hhbmdlLFxuICAgIGlzRWRpdCxcbiAgICBvcHRpb25zLFxuICAgIGxhYmVsLFxuICAgIHN4LFxuICAgIHZhcmlhbnQsXG4gICAgZGlzYWJsZWQsXG4gICAgbGFiZWxLZXkgPSBcIkxhYmVsXCIsXG4gICAgdmFsdWVLZXkgPSBcIlZhbHVlXCIsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7IHJlcXVpcmVkIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvblt2YWx1ZUtleV0gOiBudWxsOyAvLyBSZXR1cm4gbnVsbCBmb3IgY29uc2lzdGVuY3lcbiAgICB9LFxuICAgIFt2YWx1ZUtleV1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz4pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSBcInN0cmluZ1wiKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEtleV0pIDogXCJcIjtcbiAgICB9LFxuICAgIFtsYWJlbEtleV1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgZXZlbnQ6IFN5bnRoZXRpY0V2ZW50LFxuICAgIG5ld1ZhbHVlOiBBdXRvY29tcGxldGVWYWx1ZTxUT3B0aW9uLCBNdWx0aXBsZSwgRGlzYWJsZUNsZWFyYWJsZSwgRnJlZVNvbG8+LFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IG5ld1ZhbHVlIGFzIFRPcHRpb24gfCBudWxsO1xuXG4gICAgZmllbGQub25DaGFuZ2Uob3B0aW9uID8gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA6IG51bGwpO1xuICAgIG9uQ2hhbmdlPy4oZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgIWlzRWRpdCAmJlxuICAgICAgb3B0aW9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgIChmaWVsZC52YWx1ZSA9PSBudWxsIHx8IGZpZWxkLnZhbHVlID09IHVuZGVmaW5lZCB8fCBmaWVsZC52YWx1ZSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb24gPSBvcHRpb25zWzBdO1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoZGVmYXVsdE9wdGlvbik7XG5cbiAgICAgIGZpZWxkLm9uQ2hhbmdlKGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICB9LCBbaXNFZGl0LCBvcHRpb25zXSk7XG5cbiAgY29uc3QgYXV0b2NvbXBsZXRlVmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBvcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZmllbGQudmFsdWUpID8/IG51bGwsXG4gICAgW2ZpZWxkLnZhbHVlLCBvcHRpb25zLCBnZXRPcHRpb25WYWx1ZV1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zPXtmYWxzZX1cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICB2YWx1ZT17XG4gICAgICAgIGF1dG9jb21wbGV0ZVZhbHVlIGFzIEF1dG9jb21wbGV0ZVZhbHVlPFxuICAgICAgICAgIFRPcHRpb24sXG4gICAgICAgICAgTXVsdGlwbGUsXG4gICAgICAgICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICAgICAgICBGcmVlU29sb1xuICAgICAgICA+XG4gICAgICB9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9eyhcbiAgICAgICAgb3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+XG4gICAgICApID0+IGdldE9wdGlvbkxhYmVsKG9wdGlvbil9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgICByZW5kZXJJbnB1dD17KHBhcmFtcykgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJcIn1cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogXCJvdXRsaW5lZFwifVxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgY29sb3I6IFwicmVkXCIgfSxcbiAgICAgICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/IFwibm90LWFsbG93ZWRcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQXV0b2NvbXBsZXRlIGNvbXBvbmVudCBmb3Igc2VsZWN0aW5nIGZyb20gcHJlZGVmaW5lZCBvcHRpb25zLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBzZWxlY3QvYXV0b2NvbXBsZXRlIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0sIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqIGZvciByZXNwb25zaXZlIGxheW91dHMuIEl0IHN1cHBvcnRzIGJvdGggc2luZ2xlIGFuZCBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZXMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9jb21wbGV0ZSB3aXRoIGZpbHRlcmluZ1xuICogLSBTaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBzdXBwb3J0XG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSBvcHRpb24gZGlzcGxheSAobGFiZWxLZXkvdmFsdWVLZXkpXG4gKiAtIEF1dG8tc2VsZWN0aW9uIHdoZW4gb25seSBvbmUgb3B0aW9uIGV4aXN0c1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImNhdGVnb3J5XCJcbiAqICAgbGFiZWw9XCJDYXRlZ29yeVwiXG4gKiAgIG9wdGlvbnM9e1tcbiAqICAgICB7IExhYmVsOiAnVGVjaG5vbG9neScsIFZhbHVlOiAndGVjaCcgfSxcbiAqICAgICB7IExhYmVsOiAnRmluYW5jZScsIFZhbHVlOiAnZmluYW5jZScgfVxuICogICBdfVxuICogICBydWxlcz17eyByZXF1aXJlZDogJ1BsZWFzZSBzZWxlY3QgYSBjYXRlZ29yeScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20ga2V5czpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJJZFwiXG4gKiAgIGxhYmVsPVwiQXNzaWduIHRvIFVzZXJcIlxuICogICBvcHRpb25zPXt1c2Vyc31cbiAqICAgbGFiZWxLZXk9XCJmdWxsTmFtZVwiXG4gKiAgIHZhbHVlS2V5PVwiaWRcIlxuICogICBwbGFjZWhvbGRlcj1cIkNob29zZSBhIHVzZXIuLi5cIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBNdWx0aXBsZSBzZWxlY3Rpb246XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ0YWdzXCJcbiAqICAgbGFiZWw9XCJUYWdzXCJcbiAqICAgb3B0aW9ucz17YXZhaWxhYmxlVGFnc31cbiAqICAgbXVsdGlwbGVcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogOCB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRPcHRpb24gLSBUaGUgb3B0aW9uIG9iamVjdCB0eXBlXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBNdWx0aXBsZSAtIFdoZXRoZXIgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBEaXNhYmxlQ2xlYXJhYmxlIC0gV2hldGhlciB0aGUgY2xlYXIgYnV0dG9uIGlzIGRpc2FibGVkXG4gKiBAdGVtcGxhdGUgRnJlZVNvbG8gLSBXaGV0aGVyIGZyZWUgdGV4dCBpbnB1dCBpcyBhbGxvd2VkXG4gKiBAdGVtcGxhdGUgQ2hpcENvbXBvbmVudCAtIFRoZSBjaGlwIGNvbXBvbmVudCB0eXBlIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3RFbGVtZW50ID0gPFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFtcImRlZmF1bHRDb21wb25lbnRcIl1cbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBNdWx0aXBsZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgRnJlZVNvbG8sXG4gIENoaXBDb21wb25lbnRcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICBpZiAoZ3JpZFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxHcmlkXG4gICAgICAgIHsuLi57IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSwgLi4uZ3JpZFByb3BzIH19XG4gICAgICA+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuU2VsZWN0RWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiU2VsZWN0RWxlbWVudFwiO1xuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RFbGVtZW50O1xuIiwgImltcG9ydCBDaGVja0JveEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveCc7XG5pbXBvcnQgQ2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3hPdXRsaW5lQmxhbmsnO1xuaW1wb3J0IHR5cGUge1xuICBTeFByb3BzLFxuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBDaGVja2JveCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUsIENpcmN1bGFyUHJvZ3Jlc3MgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgSlNYLCBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBQYXRoLCBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzLCBVc2VDb250cm9sbGVyUHJvcHMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuLy9AdHMtbm9jaGVja1xuXG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxudHlwZSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4sXG4gICduYW1lJyB8ICdyZW5kZXJJbnB1dCcgfCAnbXVsdGlwbGUnIHwgJ29uQ2hhbmdlJyB8ICd2YWx1ZSdcbj47XG5cbmV4cG9ydCB0eXBlIFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+ID0gQmFzZUF1dG9jb21wbGV0ZVByb3BzPFRPcHRpb24sIE11bHRpcGxlLCBEaXNhYmxlQ2xlYXJhYmxlLCBGcmVlU29sbywgQ2hpcENvbXBvbmVudD4gJiB7XG4gIHJ1bGVzPzogVXNlQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+WydydWxlcyddO1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgc3g/OiBTeFByb3BzO1xuICBsYWJlbEtleT86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlS2V5Pzoga2V5b2YgVE9wdGlvbjtcbn07XG5cbnR5cGUgU2VsZWN0TXVsdGlFbGVtZW50Q29tcG9uZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWUsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPihcbiAgcHJvcHM6IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RNdWx0aUVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPihwcm9wczogU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVE9wdGlvbj4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgb3B0aW9ucyxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgdmFyaWFudCxcbiAgICBzeCxcbiAgICBsYWJlbEtleSA9ICdMYWJlbCcsXG4gICAgdmFsdWVLZXkgPSAnVmFsdWUnLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVLZXldIDogbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW2xhYmVsS2V5XSA6ICcnO1xuICB9O1xuXG4gIGNvbnN0IHNlbGVjdGVkVmFsdWUgPVxuICAgIGZpZWxkLnZhbHVlICYmIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpXG4gICAgICA/IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IGZpZWxkLnZhbHVlLmluY2x1ZGVzKGdldE9wdGlvblZhbHVlKG9wdGlvbikpKVxuICAgICAgOiBbXTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogU3ludGhldGljRXZlbnQsXG4gICAgc2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10sXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgZmllbGQub25DaGFuZ2UoW10pO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSAnc2VsZWN0T3B0aW9uJyB8fCByZWFzb24gPT09ICdyZW1vdmVPcHRpb24nKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZXMgPSBzZWxlY3RlZE9wdGlvbnMubWFwKChvcHRpb24pID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikpO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXMpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBpY29uID0gPENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG4gIGNvbnN0IGNoZWNrZWRJY29uID0gPENoZWNrQm94SWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz47XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgdmFsdWU9e3NlbGVjdGVkVmFsdWV9XG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBkaXNhYmxlQ2xvc2VPblNlbGVjdFxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgPz8gZmllbGQuZGlzYWJsZWR9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25CbHVyPXsoZXZlbnQpID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVuZGVyT3B0aW9uPXsocHJvcHMxLCBvcHRpb24sIHsgc2VsZWN0ZWQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9IHByb3BzMTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIDxDaGVja2JveCBpY29uPXtpY29ufSBjaGVja2VkSWNvbj17Y2hlY2tlZEljb259IGNoZWNrZWQ9e3NlbGVjdGVkfSAvPlxuICAgICAgICAgICAge2dldE9wdGlvbkxhYmVsKG9wdGlvbiBhcyBUT3B0aW9uKX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAgIHJlbmRlcklucHV0PXsocGFyYW1zKSA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgIC4uLnN4LFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUT3B0aW9uPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWQgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+O1xufTtcblxuU2VsZWN0TXVsdGlFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdE11bHRpRWxlbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdE11bHRpRWxlbWVudDtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgU3hQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQge1xuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZUZvcmtSZWYsXG4gIHVzZVRoZW1lLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbiAgVXNlQ29udHJvbGxlclByb3BzXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXJcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXh0RmllbGRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPiB7XG4gIC8qKlxuICAgKiBWYWxpZGF0aW9uIHJ1bGVzIGZvciB0aGUgZmllbGRcbiAgICogQGV4YW1wbGUgeyByZXF1aXJlZDogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLCBtaW5MZW5ndGg6IHsgdmFsdWU6IDMsIG1lc3NhZ2U6ICdNaW5pbXVtIDMgY2hhcmFjdGVycycgfSB9XG4gICAqL1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPltcInJ1bGVzXCJdO1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqL1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgLyoqIFRyYW5zZm9ybSB2YWx1ZSBiZWZvcmUgZGlzcGxheWluZyBpbiBpbnB1dCAqL1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZTtcbiAgICAvKiogVHJhbnNmb3JtIGlucHV0IGV2ZW50IHRvIGZvcm0gdmFsdWUgKi9cbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbGFiZWwgdGV4dFxuICAgKiBAZXhhbXBsZSBcIkVtYWlsIEFkZHJlc3NcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgaW5wdXRcbiAgICogQGV4YW1wbGUgXCJFbnRlciB5b3VyIGVtYWlsXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCBcIm5hbWVcIj47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgZm9yIHRoZSBUZXh0RmllbGRcbiAgICovXG4gIHN4PzogU3hQcm9wcztcbn1cblxudHlwZSBUZXh0RmllbGRFbGVtZW50Q29tcG9uZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd25cbj4oXG4gIHByb3BzOiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKSA9PiBSZWFjdC5KU1guRWxlbWVudDtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gVGV4dEZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+KHByb3BzOiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgcnVsZXMgPSB7fSxcbiAgICBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICBncmlkUHJvcHMsXG4gICAgdHJhbnNmb3JtLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBzeCxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPz8gKFwiXCIgYXMgVFZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdHJhbnNmb3JtLm91dHB1dFxuICAgICAgICAgIDogKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4ge1xuICAgICAgICAvLyB0aGlzIHdpbGwgYmUgYSBicmVha2luZyBjaGFuZ2UgZm9yIGFueW9uZSB1c2luZyB0cmFuc2Zvcm0ub3V0cHV0XG4gICAgICAgIC8vIGJlY2F1c2Ugbm93IHdlIGFyZSBwYXNzaW5nIGV2ZW50IGluc3RlYWQgb2YgZXZlbnQudGFyZ2V0LnZhbHVlIG9yICtldmVudC50YXJnZXQudmFsdWVcbiAgICAgICAgZmllbGQub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9eyhldmVudCkgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6IGhlbHBlclRleHR9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6IFwib3V0bGluZWRcIn1cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBzeD17e1xuICAgICAgICBcIiYgLk11aUlucHV0TGFiZWwtYXN0ZXJpc2tcIjogeyBjb2xvcjogXCJyZWRcIiB9LFxuICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/IFwibm90LWFsbG93ZWRcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICB9LFxuICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIC4uLnN4LFxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZ3JpZCBsYXlvdXQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIFRleHRGaWVsZCB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnRcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIE51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZmlyc3ROYW1lXCJcbiAqICAgbGFiZWw9XCJGaXJzdCBOYW1lXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdGaXJzdCBuYW1lIGlzIHJlcXVpcmVkJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImVtYWlsXCJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXG4gKiAgIHR5cGU9XCJlbWFpbFwiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICogICAgIHBhdHRlcm46IHsgdmFsdWU6IC9cXFMrQFxcUytcXC5cXFMrLywgbWVzc2FnZTogJ0ludmFsaWQgZW1haWwnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTnVtYmVyIGlucHV0IHdpdGggdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIHRleHRGaWVsZFByb3BzPXt7IHR5cGU6ICdudW1iZXInIH19XG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlPy50b1N0cmluZygpIHx8ICcnLFxuICogICAgIG91dHB1dDogKGV2ZW50KSA9PiBwYXJzZUludChldmVudC50YXJnZXQudmFsdWUpIHx8IG51bGxcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gdW5rbm93blxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5UZXh0RmllbGRFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJUZXh0RmllbGRFbGVtZW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRGaWVsZEVsZW1lbnQ7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFN4UHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50c1xufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHtcbiAgR3JpZCxcbiAgVGV4dEZpZWxkLFxuICB1c2VGb3JrUmVmLFxuICB1c2VUaGVtZSxcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJQcm9wc1xufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5pbXBvcnQge1xuICB1c2VDb250cm9sbGVyXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgdXNlRW5oYW5jZWRUcmFuc2Zvcm0sIHR5cGUgRmllbGRUeXBlIH0gZnJvbSBcIi4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybS9lbmhhbmNlZFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbj4ge1xuICAvKipcbiAgICogVmFsaWRhdGlvbiBydWxlcyBmb3IgdGhlIGZpZWxkXG4gICAqIEBleGFtcGxlIHsgcmVxdWlyZWQ6ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJywgbWluTGVuZ3RoOiB7IHZhbHVlOiAzLCBtZXNzYWdlOiAnTWluaW11bSAzIGNoYXJhY3RlcnMnIH0gfVxuICAgKi9cbiAgcnVsZXM/OiBVc2VDb250cm9sbGVyUHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT5bXCJydWxlc1wiXTtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDdXN0b20gVGV4dEZpZWxkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBkZWZhdWx0IE1VSSBUZXh0RmllbGRcbiAgICovXG4gIGNvbXBvbmVudD86IHR5cGVvZiBUZXh0RmllbGQ7XG4gIC8qKlxuICAgKiBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIGlucHV0L291dHB1dFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZmllbGRUeXBlIGZvciBjb21tb24gcGF0dGVybnMgb3IgY3VzdG9tIHRyYW5zZm9ybXMgZm9yIGNvbXBsZXggY2FzZXNcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgLyoqXG4gICAqIEJ1aWx0LWluIGZpZWxkIHR5cGUgZm9yIGF1dG9tYXRpYyB0cmFuc2Zvcm1hdGlvblxuICAgKiBAZXhhbXBsZSAndGV4dCcgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICd0aW1lJyB8ICdzZWxlY3QnXG4gICAqL1xuICBmaWVsZFR5cGU/OiBGaWVsZFR5cGU7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlIHRvIGRpc3BsYXkgd2hlbiBmaWVsZCB2YWx1ZSBpcyBudWxsL3VuZGVmaW5lZFxuICAgKiBAZXhhbXBsZSBcIlwiXG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBUVmFsdWU7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbGFiZWwgdGV4dFxuICAgKiBAZXhhbXBsZSBcIkVtYWlsIEFkZHJlc3NcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgaW5wdXRcbiAgICogQGV4YW1wbGUgXCJFbnRlciB5b3VyIGVtYWlsXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCBcIm5hbWVcIj47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgZm9yIHRoZSBUZXh0RmllbGRcbiAgICovXG4gIHN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIEN1c3RvbSBvbkNoYW5nZSBoYW5kbGVyIGNhbGxlZCBhZnRlciB0cmFuc2Zvcm1hdGlvblxuICAgKi9cbiAgb25DaGFuZ2U/OiAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBkZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9uIGlzc3Vlc1xuICAgKiBAZGVmYXVsdFZhbHVlIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG59XG5cbnR5cGUgRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50Q29tcG9uZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuPihcbiAgcHJvcHM6IEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbikgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbj4ocHJvcHM6IEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHJ1bGVzID0ge30sXG4gICAgcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQgPSBUZXh0RmllbGQsXG4gICAgZ3JpZFByb3BzLFxuICAgIHRyYW5zZm9ybSxcbiAgICBmaWVsZFR5cGUgPSAndGV4dCcsIC8vIERlZmF1bHQgdG8gdGV4dCB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBzeCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgZW5hYmxlV2FybmluZ3MgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIHJ1bGVzLFxuICB9KTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gVXNlIHRoZSBlbmhhbmNlZCB0cmFuc2Zvcm0gaG9vayB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZUVuaGFuY2VkVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0gPyB7XG4gICAgICBpbnB1dDogdHJhbnNmb3JtLmlucHV0LFxuICAgICAgb3V0cHV0OiB0cmFuc2Zvcm0ub3V0cHV0LFxuICAgIH0gOiB1bmRlZmluZWQsXG4gICAgZmllbGRUeXBlOiAhdHJhbnNmb3JtID8gKHR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiBmaWVsZFR5cGUpIDogdW5kZWZpbmVkLCAvLyBBdXRvLWRldGVjdCBudW1iZXIgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBlbmFibGVXYXJuaW5ncyxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZENvbXBvbmVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiB7XG4gICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXsoZXZlbnQpID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICB0eXBlPXt0eXBlfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IGhlbHBlclRleHR9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6IFwib3V0bGluZWRcIn1cbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBzeD17e1xuICAgICAgICBcIiYgLk11aUlucHV0TGFiZWwtYXN0ZXJpc2tcIjogeyBjb2xvcjogXCJyZWRcIiB9LFxuICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/IFwibm90LWFsbG93ZWRcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICB9LFxuICAgICAgICBiZ2NvbG9yOiBkaXNhYmxlZFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIC4uLnN4LFxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBbiBlbmhhbmNlZCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBUZXh0RmllbGQgY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24sXG4gKiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLCBhbmQgYnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZy5cbiAqXG4gKiBUaGlzIGVuaGFuY2VkIHZlcnNpb24gcHJvdmlkZXMgYWxsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBvcmlnaW5hbCBUZXh0RmllbGRFbGVtZW50XG4gKiBwbHVzIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCBtZW1vaXplZCB0cmFuc2Zvcm1hdGlvbnNcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZyAobnVtYmVyLCB0ZXh0LCBldGMuKVxuICogLSBCZXR0ZXIgVHlwZVNjcmlwdCBpbmZlcmVuY2UgYW5kIHR5cGUgc2FmZXR5XG4gKiAtIERldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmdcbiAqIC0gU3RhYmxlIHJlZmVyZW5jZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gKiAtIEVuaGFuY2VkIGVycm9yIGhhbmRsaW5nIHdpdGggY3VzdG9tIHBhcnNlRXJyb3Igc3VwcG9ydFxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nXG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnQgKGJhY2t3YXJkIGNvbXBhdGlibGUpXG4gKiAtIEJ1aWx0LWluIGZpZWxkIHR5cGVzIGZvciBjb21tb24gcGF0dGVybnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBFbmhhbmNlZCBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIE9wdGltaXplZCBudW1iZXIgaW5wdXQgaGFuZGxpbmdcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYnVpbHQtaW4gbnVtYmVyIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiA8RW5oYW5jZWRUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIGZpZWxkVHlwZT1cIm51bWJlclwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnQWdlIGlzIHJlcXVpcmVkJywgbWluOiB7IHZhbHVlOiAwLCBtZXNzYWdlOiAnQWdlIG11c3QgYmUgcG9zaXRpdmUnIH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImVtYWlsXCJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgZW1haWwgYWRkcmVzc1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICogICAgIHBhdHRlcm46IHsgdmFsdWU6IC9cXFMrQFxcUytcXC5cXFMrLywgbWVzc2FnZTogJ0ludmFsaWQgZW1haWwnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRyYW5zZm9ybWF0aW9uIChiYWNrd2FyZCBjb21wYXRpYmxlKTpcbiAqIGBgYHRzeFxuICogPEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicHJpY2VcIlxuICogICBsYWJlbD1cIlByaWNlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPyBgJCR7dmFsdWV9YCA6ICcnLFxuICogICAgIG91dHB1dDogKGV2ZW50KSA9PiBwYXJzZUZsb2F0KGV2ZW50LnRhcmdldC52YWx1ZS5yZXBsYWNlKCckJywgJycpKSB8fCBudWxsXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGVycm9yIHBhcnNpbmc6XG4gKiBgYGB0c3hcbiAqIDxFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJuYW1lXCJcbiAqICAgbGFiZWw9XCJVc2VybmFtZVwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IChcbiAqICAgICA8c3BhbiBzdHlsZT17eyBjb2xvcjogJ3JlZCcgfX0+XG4gKiAgICAgICBcdTI2QTBcdUZFMEYge2Vycm9yLm1lc3NhZ2V9XG4gKiAgICAgPC9zcGFuPlxuICogICApfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuPih7XG4gIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gIC4uLnByb3BzXG59OiBFbmhhbmNlZFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIDxDb21wb25lbnQgey4uLnByb3BzfSAvPjtcbn07XG5cbkVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IEVuaGFuY2VkVGV4dEZpZWxkRWxlbWVudDtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHMsXG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgR3JpZCwgdXNlRm9ya1JlZiwgdXNlVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIFRpbWVQaWNrZXJQcm9wcyxcbiAgVGltZVBpY2tlclNsb3RQcm9wcyxcbiAgVGltZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdHlwZSBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxuICBVc2VDb250cm9sbGVyUHJvcHMsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgVXNlVHJhbnNmb3JtT3B0aW9ucywgVXNlVHJhbnNmb3JtUmV0dXJuIH0gZnJvbSBcIkAvaG9va3NcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKSBhcyBURGF0ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYW5zZm9ybTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duXG4+KFxuICBvcHRpb25zOiBVc2VUcmFuc2Zvcm1PcHRpb25zPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbik6IFVzZVRyYW5zZm9ybVJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+IHtcbiAgY29uc3QgdmFsdWUgPVxuICAgIHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBvcHRpb25zLnRyYW5zZm9ybS5pbnB1dChvcHRpb25zLnZhbHVlKVxuICAgICAgOiBvcHRpb25zLnZhbHVlO1xuXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKC4uLmV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9wdGlvbnMub25DaGFuZ2Uob3B0aW9ucy50cmFuc2Zvcm0ub3V0cHV0KC4uLmV2ZW50KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLm9uQ2hhbmdlKC4uLmV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvcHRpb25zXVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVBpY2tlckVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2Vcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBpc0RhdGU/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgVGltZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICBydWxlcz86IFVzZUNvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPltcInJ1bGVzXCJdO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBpbnB1dFByb3BzPzogVGV4dEZpZWxkUHJvcHM7XG4gIGhlbHBlclRleHQ/OiBUZXh0RmllbGRQcm9wc1tcImhlbHBlclRleHRcIl07XG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgc2xvdFByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyU2xvdFByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgIFwidGV4dEZpZWxkXCJcbiAgPjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZSB8IG51bGw7XG4gICAgb3V0cHV0PzogKFxuICAgICAgdmFsdWU6IFRWYWx1ZSB8IG51bGwsXG4gICAgICBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxUaW1lVmFsaWRhdGlvbkVycm9yPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHRpbWVQaWNrZXJQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclByb3BzPFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmU+LFxuICAgIFwidmFsdWVcIiB8IFwic2xvdFByb3BzXCJcbiAgPjtcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBzeD86IFN4UHJvcHM7XG59XG5cbnR5cGUgVGltZVBpY2tlckVsZW1lbnRDb21wb25lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlXG4+KFxuICBwcm9wczogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUaW1lUGlja2VyRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGVcbj4ocHJvcHM6IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICByZXF1aXJlZCxcbiAgICBpbnB1dFByb3BzLFxuICAgIGNvbnRyb2wsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHNsb3RQcm9wcyxcbiAgICB0aW1lUGlja2VyUHJvcHMgPSB7fSxcbiAgICB0cmFuc2Zvcm0sXG4gICAgc3gsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgeyBkaXNhYmxlZCwgaW5wdXRSZWYsIG9uQ2xvc2UsIC4uLnJlc3RUaW1lUGlja2VyUHJvcHMgfSA9XG4gICAgdGltZVBpY2tlclByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbiAgfSk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWUgfCBudWxsPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IChuZXdWYWx1ZSkgPT4gcmVhZFZhbHVlQXNEYXRlKGFkYXB0ZXIsIG5ld1ZhbHVlKSxcbiAgICAgIG91dHB1dDogKG91dHB1dFZhbHVlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIGlmIChvdXRwdXRWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFZhbHVlO1xuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGltZVBpY2tlclxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRpbWVQaWNrZXJQcm9wc31cbiAgICAgIHsuLi5maWVsZH1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIHsuLi50aW1lUGlja2VyUHJvcHN9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICBvbkNsb3NlPXsoLi4uYXJncykgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgICBvbkNsb3NlKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25DaGFuZ2U9eyhuZXdWYWx1ZSwgY29udGV4dCkgPT4ge1xuICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGltZVBpY2tlclByb3BzLm9uQ2hhbmdlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aW1lUGlja2VyUHJvcHMub25DaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgc3g9e3tcbiAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZFxuICAgICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IGNvbG9yOiBcInJlZFwiIH0sXG4gICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICBjdXJzb3I6IGRpc2FibGVkID8gXCJub3QtYWxsb3dlZFwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnN4LFxuICAgICAgfX1cbiAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICAgIGFjdGlvbnM6IFtcImNsZWFyXCIsIFwiY2FuY2VsXCIsIFwiYWNjZXB0XCJdLFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgICBvbkJsdXI6IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXRQcm9wcz8ub25CbHVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgaGVscGVyVGV4dDogZXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiBpbnB1dFByb3BzPy5oZWxwZXJUZXh0IHx8IHJlc3QuaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogISF0ZXh0UmVhZE9ubHksXG4gICAgICAgICAgICAuLi5pbnB1dFByb3BzPy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgVGltZVBpY2tlckVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlXG4+KHtcbiAgZ3JpZFByb3BzID0geyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfSxcbiAgLi4ucHJvcHNcbn06IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIGlmIChncmlkUHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEdyaWRcbiAgICAgICAgey4uLnsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9LCAuLi5ncmlkUHJvcHMgfX1cbiAgICAgID5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz47XG59O1xuXG5UaW1lUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiVGltZVBpY2tlckVsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgVGltZVBpY2tlckVsZW1lbnQ7XG4iLCAiaW1wb3J0IHsgQXV0b2NvbXBsZXRlLCBDaXJjdWxhclByb2dyZXNzLCBHcmlkLCBUZXh0RmllbGQsIHVzZVRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB0eXBlIHsgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWwvQXV0b2NvbXBsZXRlXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsL3V0aWxzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIEZyYWdtZW50LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIsIHR5cGUgRmllbGRQYXRoLCB0eXBlIEZpZWxkVmFsdWVzIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0UGF5bG9hZCB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzLCBPcHRpb25PYmplY3QgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBBc3luY1NlbGVjdEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gXCJWYWx1ZVwiLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBcIkxhYmVsXCIsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PlxuPihwcm9wczogQXN5bmNTZWxlY3RFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgaW5pdGlhbFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHF1ZXJ5Rm4sXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEtleSA9IFwiTGFiZWxcIiBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVLZXkgPSBcIlZhbHVlXCIgYXMgVFZhbHVlS2V5LFxuICAgIHN4LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtzZWxlY3RlZE9wdGlvbiwgc2V0U2VsZWN0ZWRPcHRpb25dID0gdXNlU3RhdGU8VE9wdGlvbiB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgaW5wdXRWYWx1ZTI6IHN0cmluZyA9IHVzZU1lbW8oKCkgPT4gaW5wdXRWYWx1ZSwgW2lucHV0VmFsdWVdKTtcbiAgY29uc3Qgc2V0SW5wdXRWYWx1ZTIgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3VmFsdWU6IHN0cmluZykgPT4gc2V0SW5wdXRWYWx1ZShuZXdWYWx1ZSksXG4gICAgW11cbiAgKTtcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8cmVhZG9ubHkgVE9wdGlvbltdPihbXSk7XG5cbiAgY29uc3QgaW5pdGlhbFZhbHVlTG9hZGVkID0gdXNlUmVmPGJvb2xlYW4+KFxuICAgICFpbml0aWFsVmFsdWUgPyB0cnVlIDogIShpbml0aWFsVmFsdWUgIT0gbnVsbClcbiAgKTtcblxuICBjb25zdCBmaWVsZFZhbHVlID0gdXNlUmVmPFRPcHRpb25bVFZhbHVlS2V5XSB8IG51bGw+KGZpZWxkLnZhbHVlKTtcblxuICBjb25zdCBmZXRjaERhdGEgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBkZWJvdW5jZShcbiAgICAgICAgKFxuICAgICAgICAgIHBheWxvYWQ6IEFzeW5jU2VsZWN0UGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHZvaWRcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgcXVlcnlGbihwYXlsb2FkKS50aGVuKChjKSA9PiBjYWxsYmFjayhjKSk7XG4gICAgICAgIH0sXG4gICAgICAgIDQwMFxuICAgICAgKSxcbiAgICBbcXVlcnlGbl1cbiAgKTtcblxuICBjb25zdCBmaWxsT3B0aW9ucyA9IHVzZUNhbGxiYWNrKChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgbGV0IG5ld09wdGlvbnM6IHJlYWRvbmx5IFRPcHRpb25bXSA9IFtdO1xuXG4gICAgaWYgKHNlbGVjdGVkT3B0aW9uKSB7XG4gICAgICBuZXdPcHRpb25zID0gW3NlbGVjdGVkT3B0aW9uXTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0cykge1xuICAgICAgbmV3T3B0aW9ucyA9IFsuLi5uZXdPcHRpb25zLCAuLi5yZXN1bHRzXTtcbiAgICB9XG5cbiAgICBzZXRPcHRpb25zKG5ld09wdGlvbnMpO1xuICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICB9LCBbc2VsZWN0ZWRPcHRpb25dKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGxldCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNTZWxlY3RQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IG51bGwsXG4gICAgICBpbml0aWFsVmFsdWUsXG4gICAgfTtcblxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICBmZXRjaERhdGEocGF5bG9hZCwgKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgaWYgKCEhcmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmaWxsT3B0aW9ucyhyZXN1bHRzPy5maWx0ZXIoKGMpID0+IGNbdmFsdWVLZXldID09IGluaXRpYWxWYWx1ZSkpO1xuICAgICAgICAgIHNldFNlbGVjdGVkT3B0aW9uKHJlc3VsdHNbMF0pO1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKHJlc3VsdHNbMF1bdmFsdWVLZXldKTtcbiAgICAgICAgICBmaWVsZFZhbHVlLmN1cnJlbnQgPSByZXN1bHRzWzBdW3ZhbHVlS2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRpYWxWYWx1ZUxvYWRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW2luaXRpYWxWYWx1ZSwgZmV0Y2hEYXRhLCBmaWVsZCwgZmlsbE9wdGlvbnMsIHZhbHVlS2V5XSk7XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIGlmIChpbnB1dFZhbHVlMiA9PT0gXCJcIiB8fCBpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHNldE9wdGlvbnMoc2VsZWN0ZWRPcHRpb24gPyBbc2VsZWN0ZWRPcHRpb25dIDogW10pO1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuY3VycmVudCkge1xuICAgICAgaWYgKGZpZWxkLnZhbHVlID09PSBmaWVsZFZhbHVlLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNTZWxlY3RQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IGlucHV0VmFsdWUyLFxuICAgICAgaW5pdGlhbFZhbHVlOiBudWxsLFxuICAgIH07XG5cbiAgICBmZXRjaERhdGEocGF5bG9hZCwgKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgZmlsbE9wdGlvbnMocmVzdWx0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW2luaXRpYWxWYWx1ZSwgaW5wdXRWYWx1ZTIsIGZldGNoRGF0YSwgZmllbGQudmFsdWUsIGZpbGxPcHRpb25zLCBzZWxlY3RlZE9wdGlvbl0pO1xuXG4gIGNvbnN0IHNlbGVjdFJlZiA9IHVzZVJlZihudWxsKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogUmVhY3QuU3ludGhldGljRXZlbnQsXG4gICAgbmV3U2VsZWN0ZWRPcHRpb246IFRPcHRpb24gfCBudWxsLFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGlmIChyZWFzb24gPT09IFwiY2xlYXJcIikge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSBcInNlbGVjdE9wdGlvblwiIHx8IHJlYXNvbiA9PT0gXCJyZW1vdmVPcHRpb25cIikge1xuICAgICAgaWYgKG5ld1NlbGVjdGVkT3B0aW9uKSB7XG4gICAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG5ld1NlbGVjdGVkT3B0aW9uKTtcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3U2VsZWN0ZWRPcHRpb25bdmFsdWVLZXldKTtcbiAgICAgICAgZmllbGRWYWx1ZS5jdXJyZW50ID0gbmV3U2VsZWN0ZWRPcHRpb25bdmFsdWVLZXldO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRPcHRpb25zKFtdKTtcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZmllbGQudmFsdWUpIHtcbiAgICAgIHNldElucHV0VmFsdWUoXCJcIik7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihudWxsKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2ZpZWxkLnZhbHVlXSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nIHwgbnVtYmVyID0+IHtcbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUtleV0pIDogXCJcIjtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsS2V5XSkgOiBcIlwiO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICByZWY9e3NlbGVjdFJlZn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uVmFsdWV9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgYXV0b0NvbXBsZXRlXG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBpbmNsdWRlSW5wdXRJbkxpc3RcbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICBmaWx0ZXJPcHRpb25zPXsoeCkgPT4geH1cbiAgICAgIHZhbHVlPXtzZWxlY3RlZE9wdGlvbn1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9eyhfLCBuZXdJbnB1dFZhbHVlKSA9PiB7XG4gICAgICAgIHNldElucHV0VmFsdWUyKG5ld0lucHV0VmFsdWUpO1xuICAgICAgfX1cbiAgICAgIG5vT3B0aW9uc1RleHQ9XCJUeXBlIFNvbWV0aGluZy4uLlwiXG4gICAgICByZW5kZXJJbnB1dD17KHBhcmFtcykgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJcIn1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiBcIm91dGxpbmVkXCJ9XG4gICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCA/IFwibm90LWFsbG93ZWRcIiA6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJnY29sb3I6IGRpc2FibGVkXG4gICAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgICAgLi4uc3gsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICByZW5kZXJPcHRpb249eyhyZW5kZXJQcm9wcywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCAuLi5vcHRpb25Qcm9wcyB9ID0gcmVuZGVyUHJvcHM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkga2V5PXtrZXl9IHsuLi5vcHRpb25Qcm9wc30+XG4gICAgICAgICAgICB7b3B0aW9uW2xhYmVsS2V5XX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNTZWxlY3RFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IFwiVmFsdWVcIixcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gXCJMYWJlbFwiLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT5cbj4oe1xuICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAuLi5wcm9wc1xufTogQXN5bmNTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBUT3B0aW9uXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPiB7Li4ucHJvcHN9IC8+XG4gICAgICA8L0dyaWQ+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPiB7Li4ucHJvcHN9IC8+O1xufTtcblxuQXN5bmNTZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJBc3luY1NlbGVjdEVsZW1lbnRcIjtcblxuZXhwb3J0IHsgQXN5bmNTZWxlY3RFbGVtZW50IH07XG4iLCAiaW1wb3J0IHsgQXN5bmNNdWx0aVNlbGVjdDIgfSBmcm9tIFwiLi4vQXN5bmNNdWx0aVNlbGVjdDJcIjtcbmltcG9ydCB7IEFzeW5jU2VsZWN0IH0gZnJvbSBcIi4uL0FzeW5jU2VsZWN0XCI7XG5pbXBvcnQgeyBDaGVja2JveEVsZW1lbnQgfSBmcm9tIFwiLi4vQ2hlY2tib3hFbGVtZW50XCI7XG5pbXBvcnQgeyBDaGVja2JveEdyb3VwIH0gZnJvbSBcIi4uL0NoZWNrYm94R3JvdXBcIjtcbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSBcIi4uL0RhdGVQaWNrZXJFbGVtZW50XCI7XG5pbXBvcnQgeyBQYXNzd29yZEVsZW1lbnQgfSBmcm9tIFwiLi4vUGFzc3dvcmRFbGVtZW50XCI7XG5pbXBvcnQgeyBSYWRpb0J1dHRvbkdyb3VwIH0gZnJvbSBcIi4uL1JhZGlvQnV0dG9uR3JvdXBcIjtcbmltcG9ydCB7IFNlbGVjdENhc2NhZGVFbGVtZW50IH0gZnJvbSBcIi4uL1NlbGVjdENhc2NhZGVFbGVtZW50XCI7XG5pbXBvcnQgeyBTZWxlY3RFbGVtZW50IH0gZnJvbSBcIi4uL1NlbGVjdEVsZW1lbnRcIjtcbmltcG9ydCB7IFNlbGVjdE11bHRpRWxlbWVudCB9IGZyb20gXCIuLi9TZWxlY3RNdWx0aUVsZW1lbnRcIjtcbmltcG9ydCB7IFRleHRGaWVsZEVsZW1lbnQgfSBmcm9tIFwiLi4vVGV4dEZpZWxkRWxlbWVudFwiO1xuaW1wb3J0IHsgVGltZVBpY2tlckVsZW1lbnQgfSBmcm9tIFwiLi4vVGltZVBpY2tlckVsZW1lbnRcIjtcblxuY29uc3QgRmllbGQgPSB7XG4gIFRleHQ6IFRleHRGaWVsZEVsZW1lbnQsXG4gIENoZWNrYm94OiBDaGVja2JveEVsZW1lbnQsXG4gIERhdGU6IERhdGVQaWNrZXJFbGVtZW50LFxuICBSYWRpb0dyb3VwOiBSYWRpb0J1dHRvbkdyb3VwLFxuICBQYXNzd29yZDogUGFzc3dvcmRFbGVtZW50LFxuICBUaW1lOiBUaW1lUGlja2VyRWxlbWVudCxcbiAgU2VsZWN0OiBTZWxlY3RFbGVtZW50LFxuICBTZWxlY3RNdWx0aTogU2VsZWN0TXVsdGlFbGVtZW50LFxuICBTZWxlY3RDYXNjYWRlOiBTZWxlY3RDYXNjYWRlRWxlbWVudCxcbiAgQXN5bmNTZWxlY3QsXG4gIEFzeW5jTXVsdGlTZWxlY3Q6IEFzeW5jTXVsdGlTZWxlY3QyLFxuICBDaGVja2JveEdyb3VwLFxufTtcblxuZXhwb3J0IHsgRmllbGQgfTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7OztBQUFBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxnQkFB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LFVBQVVDO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixZQUFZO0FBQUEsRUFDWixVQUFVO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixhQUFhO0FBQUEsRUFDYixlQUFlO0FBQUEsRUFDZjtBQUFBLEVBQ0Esa0JBQWtCO0FBQUEsRUFDbEIsZUFBQUM7QUFDRjsiLAogICJuYW1lcyI6IFsiR3JpZCIsICJ1c2VUaGVtZSIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgInVzZVRoZW1lIiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiQ2hlY2tib3hFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtR3JvdXAiLCAiRm9ybUhlbHBlclRleHQiLCAiR3JpZCIsICJ1c2VFZmZlY3QiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQ2hlY2tib3hHcm91cCIsICJHcmlkIiwgImZvcndhcmRSZWYiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlTWVtbyIsICJ1c2VUaGVtZSIsICJ1c2VNZW1vIiwgImpzeCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAianN4IiwgImZvcndhcmRSZWYiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJHcmlkIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJwYXNzd29yZCIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgInVzZVRoZW1lIiwgIkdyaWQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlVGhlbWUiLCAidXNlQ29udHJvbGxlciIsICJ2YWx1ZSIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIlJhZGlvQnV0dG9uR3JvdXAiLCAiR3JpZCIsICJHcmlkIiwgInVzZVRoZW1lIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlU3RhdGUiLCAidXNlRWZmZWN0IiwgInVzZUNhbGxiYWNrIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RDYXNjYWRlRWxlbWVudCIsICJHcmlkIiwgInVzZVRoZW1lIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlTWVtbyIsICJ1c2VFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiR3JpZCIsICJDaGVja2JveCIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAiRnJhZ21lbnQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlVGhlbWUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZVRoZW1lIiwgInZhbHVlIiwgInVzZUZvcmtSZWYiLCAiVGV4dEZpZWxkRWxlbWVudCIsICJHcmlkIiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlVGhlbWUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZVRoZW1lIiwgInVzZUZvcmtSZWYiLCAiRW5oYW5jZWRUZXh0RmllbGRFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJ1c2VGb3JrUmVmIiwgInVzZVRoZW1lIiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAidXNlVHJhbnNmb3JtIiwgIkNvbXBvbmVudCIsICJUaW1lUGlja2VyRWxlbWVudCIsICJBdXRvY29tcGxldGUiLCAiQ2lyY3VsYXJQcm9ncmVzcyIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VUaGVtZSIsICJkZWJvdW5jZSIsICJSZWFjdCIsICJGcmFnbWVudCIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VSZWYiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQXN5bmNTZWxlY3RFbGVtZW50IiwgIkNoZWNrYm94RWxlbWVudCIsICJDaGVja2JveEdyb3VwIl0KfQo=