@gnwebsoft/ui 4.0.25 → 4.0.26

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.
@@ -1,2399 +0,0 @@
1
- import {
2
- useEnhancedTransform,
3
- useTransform
4
- } from "./chunk-PW777IOX.js";
5
- import {
6
- readValueAsDate
7
- } from "./chunk-FYU2OIMD.js";
8
-
9
- // src/wrappers/types/common.ts
10
- function isValidOption(value) {
11
- return typeof value === "object" && value !== null && "Label" in value && "Value" in value && typeof value.Label === "string" && (typeof value.Value === "string" || typeof value.Value === "number" || typeof value.Value === "boolean");
12
- }
13
- function normalizeOptions(options, labelField = "Label", valueField = "Value") {
14
- return options.map((option) => ({
15
- Label: String(option[labelField] ?? ""),
16
- Value: option[valueField],
17
- disabled: Boolean(option.disabled)
18
- }));
19
- }
20
-
21
- // src/wrappers/AsyncMultiSelect/AsyncMultiSelect.tsx
22
- import {
23
- Autocomplete,
24
- CircularProgress,
25
- debounce,
26
- Grid,
27
- TextField,
28
- useTheme
29
- } from "@mui/material";
30
- import match from "autosuggest-highlight/match";
31
- import parse from "autosuggest-highlight/parse";
32
- import {
33
- useState,
34
- useRef,
35
- useMemo,
36
- useEffect,
37
- useCallback,
38
- Fragment
39
- } from "react";
40
- import { useController } from "react-hook-form";
41
- import { jsx, jsxs } from "react/jsx-runtime";
42
- var Component = function AsyncSelectMultiElement(props) {
43
- const {
44
- name,
45
- disabled,
46
- control,
47
- placeholder,
48
- label,
49
- queryFn,
50
- variant,
51
- labelField = "Label",
52
- valueField = "Value",
53
- ...rest
54
- } = props;
55
- const {
56
- field,
57
- fieldState: { error }
58
- } = useController({
59
- name,
60
- control
61
- });
62
- const theme = useTheme();
63
- const [selectedOptions, setSelectedOptions] = useState([]);
64
- const [inputValue, setInputValue] = useState("");
65
- const [options, setOptions] = useState([]);
66
- const [loading, setLoading] = useState(false);
67
- const loadedValuesRef = useRef([]);
68
- const isInitialPopulationActive = useRef(false);
69
- const lastFetchedSearchTermRef = useRef(null);
70
- const initialLoadCompleteRef = useRef(false);
71
- const selectedOptionsRef = useRef([]);
72
- const getOptionValue = useCallback(
73
- (option) => option ? String(option[valueField]) : "",
74
- [valueField]
75
- );
76
- const getOptionLabel = useCallback(
77
- (option) => option ? String(option[labelField]) : "",
78
- [labelField]
79
- );
80
- const fetchData = useMemo(
81
- () => debounce(
82
- (payload, callback) => {
83
- queryFn(payload).then((c) => {
84
- if (Array.isArray(c)) {
85
- callback(c);
86
- } else if (c && Array.isArray(c.data)) {
87
- callback(
88
- c.data
89
- );
90
- } else if (c && Array.isArray(c.Data)) {
91
- callback(
92
- c.Data
93
- );
94
- } else {
95
- callback([]);
96
- }
97
- });
98
- },
99
- 400
100
- ),
101
- [queryFn]
102
- );
103
- useEffect(() => {
104
- selectedOptionsRef.current = selectedOptions;
105
- }, [selectedOptions]);
106
- useEffect(() => {
107
- const formValues = Array.isArray(field.value) ? field.value : [];
108
- if (initialLoadCompleteRef.current && JSON.stringify(formValues) === JSON.stringify(loadedValuesRef.current)) {
109
- return;
110
- }
111
- if (formValues.length === 0) {
112
- setSelectedOptions([]);
113
- setOptions([]);
114
- loadedValuesRef.current = [];
115
- lastFetchedSearchTermRef.current = null;
116
- initialLoadCompleteRef.current = true;
117
- return;
118
- }
119
- let active = true;
120
- setLoading(true);
121
- isInitialPopulationActive.current = true;
122
- loadedValuesRef.current = formValues;
123
- initialLoadCompleteRef.current = true;
124
- fetchData({ Query: null, SelectedValue: formValues }, (results) => {
125
- if (active) {
126
- const fetchedOptions = results || [];
127
- setSelectedOptions([...fetchedOptions]);
128
- setOptions(fetchedOptions);
129
- }
130
- setLoading(false);
131
- isInitialPopulationActive.current = false;
132
- });
133
- return () => {
134
- active = false;
135
- };
136
- }, [field.value, fetchData]);
137
- useEffect(() => {
138
- if (isInitialPopulationActive.current || !initialLoadCompleteRef.current) {
139
- return;
140
- }
141
- if (!inputValue) {
142
- if (selectedOptionsRef.current.length === 0) {
143
- setOptions([]);
144
- } else {
145
- setOptions(selectedOptionsRef.current);
146
- }
147
- lastFetchedSearchTermRef.current = null;
148
- return;
149
- }
150
- if (inputValue === lastFetchedSearchTermRef.current) {
151
- return;
152
- }
153
- let active = true;
154
- setLoading(true);
155
- fetchData({ Query: inputValue, SelectedValue: null }, (searchResults) => {
156
- if (active) {
157
- const results = searchResults || [];
158
- const currentSelected = selectedOptionsRef.current;
159
- const selectedOptionIds = new Set(
160
- currentSelected.map((opt) => getOptionValue(opt))
161
- );
162
- const combined = [...currentSelected];
163
- results.forEach((result) => {
164
- if (!selectedOptionIds.has(getOptionValue(result))) {
165
- combined.push(result);
166
- }
167
- });
168
- setOptions(combined);
169
- lastFetchedSearchTermRef.current = inputValue;
170
- }
171
- setLoading(false);
172
- });
173
- return () => {
174
- active = false;
175
- };
176
- }, [inputValue, fetchData, getOptionValue]);
177
- const handleChange = (_, newSelectedOptions) => {
178
- setSelectedOptions(newSelectedOptions);
179
- const newValues = newSelectedOptions.map((c) => c[valueField]);
180
- field.onChange(newValues.length === 0 ? null : newValues);
181
- loadedValuesRef.current = newValues;
182
- setOptions(newSelectedOptions);
183
- setInputValue("");
184
- lastFetchedSearchTermRef.current = null;
185
- };
186
- const isDisabled = useMemo(() => {
187
- return disabled ?? false;
188
- }, [disabled]);
189
- return /* @__PURE__ */ jsx(
190
- Autocomplete,
191
- {
192
- multiple: true,
193
- loading,
194
- getOptionLabel,
195
- isOptionEqualToValue: (option, val) => getOptionValue(option) === getOptionValue(val),
196
- options,
197
- value: selectedOptions,
198
- disabled,
199
- filterSelectedOptions: true,
200
- filterOptions: (x) => x,
201
- noOptionsText: "Type Something...",
202
- onChange: handleChange,
203
- sx: {
204
- "&.Mui-disabled": {
205
- cursor: "not-allowed !important"
206
- },
207
- "& .MuiInputBase-root.Mui-disabled": {
208
- backgroundColor: theme.palette.action.disabledBackground,
209
- cursor: "not-allowed !important"
210
- },
211
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
212
- cursor: "not-allowed !important"
213
- },
214
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
215
- borderColor: error ? "red" : void 0
216
- },
217
- "& .MuiFilledInput-root.Mui-disabled": {
218
- borderColor: error ? "red" : void 0
219
- }
220
- },
221
- onInputChange: (_, newInputValue) => setInputValue(newInputValue),
222
- renderInput: (params) => /* @__PURE__ */ jsx(
223
- TextField,
224
- {
225
- ...params,
226
- label,
227
- error: !!error,
228
- helperText: error ? error.message : "",
229
- placeholder,
230
- InputProps: {
231
- ...params.InputProps,
232
- endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
233
- loading ? /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }) : null,
234
- params.InputProps.endAdornment
235
- ] })
236
- },
237
- variant: variant ? variant : "outlined"
238
- }
239
- ),
240
- renderOption: (props2, option, state) => {
241
- const { key, ...optionProps } = props2;
242
- const optionLabel = getOptionLabel(option);
243
- const matches = match(optionLabel, state.inputValue, {
244
- insideWords: true
245
- });
246
- const parts = parse(optionLabel, matches);
247
- return /* @__PURE__ */ jsx("li", { ...optionProps, children: /* @__PURE__ */ jsx("div", { children: parts.map((part, index) => /* @__PURE__ */ jsx(
248
- "span",
249
- {
250
- style: {
251
- fontWeight: part.highlight ? 700 : 400
252
- },
253
- children: part.text
254
- },
255
- index
256
- )) }) }, key);
257
- },
258
- ...rest
259
- }
260
- );
261
- };
262
- var AsyncSelectMultiElement2 = ({
263
- gridProps,
264
- ...props
265
- }) => {
266
- if (gridProps) {
267
- return /* @__PURE__ */ jsx(
268
- Grid,
269
- {
270
- ...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
271
- children: /* @__PURE__ */ jsx(
272
- Component,
273
- {
274
- ...props
275
- }
276
- )
277
- }
278
- );
279
- }
280
- return /* @__PURE__ */ jsx(Component, { ...props });
281
- };
282
- AsyncSelectMultiElement2.displayName = "AsyncSelectMulti";
283
-
284
- // src/wrappers/CheckboxElement/CheckboxElement.tsx
285
- import {
286
- Checkbox,
287
- FormControl,
288
- FormControlLabel,
289
- FormGroup,
290
- FormHelperText,
291
- Grid as Grid2
292
- } from "@mui/material";
293
- import { useController as useController2 } from "react-hook-form";
294
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
295
- var Component2 = function CheckboxElement(props) {
296
- const {
297
- name,
298
- control,
299
- label,
300
- labelProps,
301
- helperText,
302
- parseError,
303
- transform,
304
- disabled,
305
- onChange: customOnChange,
306
- ...rest
307
- } = props;
308
- const {
309
- field,
310
- fieldState: { error }
311
- } = useController2({
312
- name,
313
- control,
314
- disabled
315
- });
316
- if (field.value == null || field.value == void 0) {
317
- field.onChange(false);
318
- }
319
- const customOutputTransform = transform?.output;
320
- const { value, onChange } = useTransform({
321
- value: field.value,
322
- onChange: field.onChange,
323
- transform: {
324
- input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
325
- output: typeof customOutputTransform === "function" ? (eventOrValue, _value) => {
326
- const event = eventOrValue;
327
- const checked = _value;
328
- return customOutputTransform(event, checked);
329
- } : (eventOrValue, _value) => {
330
- const checked = _value;
331
- return checked;
332
- }
333
- }
334
- });
335
- const handleChange = (event, checked) => {
336
- onChange(event, checked);
337
- if (typeof customOnChange === "function") {
338
- customOnChange(event, checked);
339
- }
340
- };
341
- const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
342
- return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
343
- /* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
344
- FormControlLabel,
345
- {
346
- label: label || "",
347
- ...labelProps,
348
- disabled,
349
- control: /* @__PURE__ */ jsx2(
350
- Checkbox,
351
- {
352
- ...rest,
353
- color: rest.color || "primary",
354
- checked: value,
355
- disabled,
356
- onChange: handleChange,
357
- ref: field.ref
358
- }
359
- )
360
- }
361
- ) }),
362
- (displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
363
- ] });
364
- };
365
- var CheckboxElement2 = ({
366
- gridProps = {},
367
- ...props
368
- }) => {
369
- return /* @__PURE__ */ jsx2(Grid2, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx2(Component2, { ...props }) });
370
- };
371
-
372
- // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
373
- import {
374
- Checkbox as Checkbox2,
375
- FormControl as FormControl2,
376
- FormControlLabel as FormControlLabel2,
377
- FormGroup as FormGroup2,
378
- FormHelperText as FormHelperText2,
379
- FormLabel,
380
- Grid as Grid3
381
- } from "@mui/material";
382
- import { useCallback as useCallback2 } from "react";
383
- import { useController as useController3 } from "react-hook-form";
384
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
385
- var Component3 = function CheckboxGroup(props) {
386
- const {
387
- name,
388
- control,
389
- label,
390
- required,
391
- formLabelProps,
392
- labelProps,
393
- labelKey = "Label",
394
- valueKey = "Value",
395
- options,
396
- ...rest
397
- } = props;
398
- const {
399
- field,
400
- fieldState: { error }
401
- } = useController3({
402
- name,
403
- control,
404
- disabled: rest.disabled
405
- });
406
- const selectedValuesAsString = (Array.isArray(field.value) ? field.value : []).map(String);
407
- const handleChange = useCallback2(
408
- (event) => {
409
- const changedValueString = event.target.value;
410
- const isChecked = event.target.checked;
411
- const newSelectedValuesString = isChecked ? [...selectedValuesAsString, changedValueString] : selectedValuesAsString.filter((v) => v !== changedValueString);
412
- const optionsAreNumeric = options.length > 0 && typeof options[0][valueKey] === "number";
413
- if (optionsAreNumeric) {
414
- const newValuesAsNumbers = newSelectedValuesString.map((v) => parseInt(v, 10)).filter((v) => !isNaN(v));
415
- field.onChange(newValuesAsNumbers);
416
- } else {
417
- field.onChange(newSelectedValuesString);
418
- }
419
- },
420
- [field, options, valueKey, selectedValuesAsString]
421
- );
422
- return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
423
- label && /* @__PURE__ */ jsx3(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
424
- /* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options && options.map((option) => /* @__PURE__ */ jsx3(
425
- FormControlLabel2,
426
- {
427
- label: option[labelKey],
428
- ...labelProps,
429
- control: /* @__PURE__ */ jsx3(
430
- Checkbox2,
431
- {
432
- ...rest,
433
- color: rest.color || "primary",
434
- value: option[valueKey],
435
- checked: selectedValuesAsString.includes(
436
- String(option[valueKey])
437
- ),
438
- onChange: handleChange
439
- }
440
- )
441
- },
442
- `${option[valueKey]}`
443
- )) }),
444
- error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
445
- ] });
446
- };
447
- var CheckboxGroupElement = ({
448
- gridProps = {},
449
- ...props
450
- }) => {
451
- return /* @__PURE__ */ jsx3(Grid3, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx3(Component3, { ...props }) });
452
- };
453
- CheckboxGroupElement.displayName = "CheckboxGroup";
454
-
455
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
456
- import { Grid as Grid4 } from "@mui/material";
457
- import { forwardRef as forwardRef2 } from "react";
458
-
459
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
460
- import { useForkRef } from "@mui/material";
461
- import { DatePicker } from "@mui/x-date-pickers";
462
- import { forwardRef, useCallback as useCallback4, useMemo as useMemo5 } from "react";
463
- import { useController as useController4 } from "react-hook-form";
464
-
465
- // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
466
- import { useLocalizationContext } from "@mui/x-date-pickers/internals";
467
- import { useCallback as useCallback3, useMemo as useMemo2 } from "react";
468
- function readDatePickerValueAsDate(adapter, value) {
469
- if (value === null || value === void 0) {
470
- return null;
471
- }
472
- if (typeof value === "string") {
473
- if (value === "") {
474
- return null;
475
- }
476
- const parsedDate = adapter.utils.date(value);
477
- return parsedDate;
478
- }
479
- return value;
480
- }
481
- function useDatePickerValue(options) {
482
- const { field, transform } = options;
483
- const adapter = useLocalizationContext();
484
- const value = useMemo2(() => {
485
- if (typeof transform?.input === "function") {
486
- return transform.input(field.value);
487
- }
488
- return readDatePickerValueAsDate(adapter, field.value);
489
- }, [field.value, transform?.input, adapter]);
490
- const onChange = useCallback3(
491
- (newValue, context) => {
492
- if (typeof transform?.output === "function") {
493
- const transformedValue = transform.output(newValue, context);
494
- field.onChange(transformedValue);
495
- } else {
496
- field.onChange(newValue);
497
- }
498
- },
499
- // eslint-disable-next-line react-hooks/exhaustive-deps
500
- [field.onChange, transform?.output]
501
- );
502
- return {
503
- value,
504
- onChange
505
- };
506
- }
507
-
508
- // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
509
- import { useMemo as useMemo3 } from "react";
510
- var DEFAULT_ERROR_MESSAGES = {
511
- invalidDate: "Please enter a valid date",
512
- minDate: "Date must be after the minimum allowed date",
513
- maxDate: "Date must be before the maximum allowed date",
514
- disabledDate: "This date is not allowed",
515
- required: "This field is required"
516
- };
517
- function useDatePickerValidation(options) {
518
- const { fieldState, validation, parseError, value } = options;
519
- const validationResult = useMemo3(() => {
520
- const { error: fieldError, invalid } = fieldState;
521
- let currentError = fieldError;
522
- if (!fieldError && value && validation) {
523
- const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
524
- if (minDate && value < minDate) {
525
- currentError = {
526
- type: "minDate",
527
- message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
528
- };
529
- } else if (maxDate && value > maxDate) {
530
- currentError = {
531
- type: "maxDate",
532
- message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
533
- };
534
- } else if (shouldDisableDate && shouldDisableDate(value)) {
535
- currentError = {
536
- type: "disabledDate",
537
- message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
538
- };
539
- }
540
- }
541
- const hasError = Boolean(currentError);
542
- return {
543
- hasError,
544
- error: currentError,
545
- invalid: invalid || hasError
546
- };
547
- }, [fieldState, validation, value]);
548
- const errorMessage = useMemo3(() => {
549
- if (!validationResult.error) {
550
- return null;
551
- }
552
- if (parseError) {
553
- return parseError(validationResult.error);
554
- }
555
- if (typeof validationResult.error === "string") {
556
- return validationResult.error;
557
- }
558
- if ("message" in validationResult.error && validationResult.error.message) {
559
- return validationResult.error.message;
560
- }
561
- if ("type" in validationResult.error) {
562
- const errorType = validationResult.error.type;
563
- switch (errorType) {
564
- case "required":
565
- return DEFAULT_ERROR_MESSAGES.required;
566
- case "minDate":
567
- return DEFAULT_ERROR_MESSAGES.minDate;
568
- case "maxDate":
569
- return DEFAULT_ERROR_MESSAGES.maxDate;
570
- case "disabledDate":
571
- return DEFAULT_ERROR_MESSAGES.disabledDate;
572
- case "invalidDate":
573
- default:
574
- return DEFAULT_ERROR_MESSAGES.invalidDate;
575
- }
576
- }
577
- return DEFAULT_ERROR_MESSAGES.invalidDate;
578
- }, [validationResult.error, parseError]);
579
- return {
580
- ...validationResult,
581
- errorMessage
582
- };
583
- }
584
-
585
- // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
586
- import { useTheme as useTheme2 } from "@mui/material";
587
- import { useMemo as useMemo4 } from "react";
588
- function useDatePickerStyles(options = {}) {
589
- const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
590
- const theme = useTheme2();
591
- const computedSx = useMemo4(() => {
592
- const baseStyles = {
593
- // Input field styling
594
- "& .MuiOutlinedInput-root": {
595
- backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
596
- // Transition for smooth state changes
597
- transition: theme.transitions.create([
598
- "background-color",
599
- "border-color",
600
- "color"
601
- ], {
602
- duration: theme.transitions.duration.short
603
- }),
604
- // Error state styling
605
- ...hasError && {
606
- borderColor: theme.palette.error.main,
607
- "&:hover": {
608
- borderColor: theme.palette.error.main
609
- },
610
- "&.Mui-focused": {
611
- borderColor: theme.palette.error.main,
612
- boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
613
- // 25 is 15% opacity in hex
614
- }
615
- },
616
- // Loading state styling
617
- ...loading && {
618
- opacity: 0.7,
619
- pointerEvents: "none"
620
- }
621
- },
622
- // Input element styling
623
- "& .MuiInputBase-input": {
624
- cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
625
- // Read-only specific styling
626
- ...textReadOnly && !disabled && {
627
- cursor: "pointer",
628
- userSelect: "none",
629
- caretColor: "transparent"
630
- // Hide text cursor in read-only mode
631
- },
632
- // Loading state
633
- ...loading && {
634
- cursor: "wait"
635
- }
636
- },
637
- // Required field asterisk styling
638
- "& .MuiInputLabel-asterisk": {
639
- color: theme.palette.error.main,
640
- fontSize: "1.2em"
641
- },
642
- // Label styling with better contrast
643
- "& .MuiInputLabel-root": {
644
- color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
645
- // Ensure proper contrast for disabled state
646
- ...disabled && {
647
- color: theme.palette.text.disabled
648
- }
649
- },
650
- // Helper text styling
651
- "& .MuiFormHelperText-root": {
652
- marginLeft: theme.spacing(1),
653
- marginRight: theme.spacing(1),
654
- // Error state
655
- ...hasError && {
656
- color: theme.palette.error.main
657
- }
658
- },
659
- // Calendar icon styling
660
- "& .MuiInputAdornment-root": {
661
- color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
662
- },
663
- // Focus ring for accessibility
664
- "& .MuiOutlinedInput-root.Mui-focused": {
665
- outline: `2px solid ${theme.palette.primary.main}50`,
666
- // 50 is 31% opacity
667
- outlineOffset: "2px"
668
- },
669
- // Enhanced contrast for dark themes
670
- ...theme.palette.mode === "dark" && {
671
- "& .MuiOutlinedInput-root": {
672
- borderWidth: 2
673
- }
674
- }
675
- };
676
- return customSx ? [baseStyles, customSx] : baseStyles;
677
- }, [
678
- theme,
679
- disabled,
680
- hasError,
681
- loading,
682
- textReadOnly,
683
- customSx
684
- ]);
685
- const className = useMemo4(() => {
686
- const classes = [];
687
- if (disabled) classes.push("DatePickerElement--disabled");
688
- if (hasError) classes.push("DatePickerElement--error");
689
- if (loading) classes.push("DatePickerElement--loading");
690
- if (textReadOnly) classes.push("DatePickerElement--readOnly");
691
- return classes.length > 0 ? classes.join(" ") : void 0;
692
- }, [disabled, hasError, loading, textReadOnly]);
693
- return {
694
- sx: computedSx,
695
- className
696
- };
697
- }
698
-
699
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
700
- import { jsx as jsx4 } from "react/jsx-runtime";
701
- var DatePickerElementCore = forwardRef(
702
- (props, ref) => {
703
- const {
704
- name,
705
- required = false,
706
- control,
707
- parseError,
708
- transform,
709
- validation,
710
- label,
711
- placeholder,
712
- textReadOnly = false,
713
- helperText,
714
- inputProps = {},
715
- slotProps = {},
716
- datePickerProps = {},
717
- variant = "outlined",
718
- loading = false,
719
- LoadingComponent,
720
- ...restProps
721
- } = props;
722
- const {
723
- disabled,
724
- inputRef: externalInputRef,
725
- onClose,
726
- ...restDatePickerProps
727
- } = datePickerProps;
728
- const { field, fieldState } = useController4({
729
- name,
730
- control,
731
- defaultValue: null
732
- // Let react-hook-form handle the default value typing
733
- });
734
- const { value, onChange: onValueChange } = useDatePickerValue({
735
- field,
736
- transform
737
- });
738
- const { hasError, errorMessage, invalid } = useDatePickerValidation({
739
- fieldState,
740
- validation,
741
- parseError,
742
- value
743
- });
744
- const { className } = useDatePickerStyles({
745
- disabled,
746
- hasError,
747
- loading,
748
- textReadOnly
749
- });
750
- const handleInputRef = useForkRef(field.ref, externalInputRef);
751
- const handleChange = useCallback4(
752
- (newValue, context) => {
753
- onValueChange(newValue, context);
754
- },
755
- [onValueChange]
756
- );
757
- const handleClose = useCallback4(
758
- (...args) => {
759
- field.onBlur();
760
- if (onClose) {
761
- onClose(...args);
762
- }
763
- },
764
- // eslint-disable-next-line react-hooks/exhaustive-deps
765
- [field.onBlur, onClose]
766
- );
767
- const handleTextFieldBlur = useCallback4(
768
- (event) => {
769
- field.onBlur();
770
- if (typeof inputProps.onBlur === "function") {
771
- inputProps.onBlur(event);
772
- }
773
- },
774
- // eslint-disable-next-line react-hooks/exhaustive-deps
775
- [field.onBlur, inputProps.onBlur]
776
- );
777
- const memoizedSlotProps = useMemo5(
778
- () => ({
779
- ...slotProps,
780
- actionBar: {
781
- actions: ["clear", "today", "cancel", "accept"],
782
- ...slotProps.actionBar
783
- },
784
- textField: {
785
- ...inputProps,
786
- required,
787
- placeholder,
788
- fullWidth: true,
789
- variant,
790
- onBlur: handleTextFieldBlur,
791
- error: hasError,
792
- helperText: hasError ? errorMessage : helperText,
793
- inputProps: {
794
- readOnly: textReadOnly,
795
- "aria-invalid": invalid,
796
- "aria-describedby": hasError ? `${name}-error` : void 0,
797
- ...inputProps.inputProps
798
- },
799
- // Add loading indicator if provided
800
- ...loading && LoadingComponent && {
801
- InputProps: {
802
- endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
803
- ...inputProps.InputProps
804
- }
805
- },
806
- ...slotProps.textField
807
- }
808
- }),
809
- [
810
- slotProps,
811
- inputProps,
812
- required,
813
- placeholder,
814
- variant,
815
- handleTextFieldBlur,
816
- hasError,
817
- errorMessage,
818
- helperText,
819
- textReadOnly,
820
- invalid,
821
- name,
822
- loading,
823
- LoadingComponent
824
- ]
825
- );
826
- return /* @__PURE__ */ jsx4(
827
- DatePicker,
828
- {
829
- ...restProps,
830
- ...restDatePickerProps,
831
- ref,
832
- name,
833
- value,
834
- onChange: handleChange,
835
- onClose: handleClose,
836
- inputRef: handleInputRef,
837
- label,
838
- disabled,
839
- className,
840
- slotProps: memoizedSlotProps,
841
- "aria-invalid": invalid,
842
- "aria-describedby": hasError ? `${name}-error` : void 0
843
- }
844
- );
845
- }
846
- );
847
- DatePickerElementCore.displayName = "DatePickerElementCore";
848
-
849
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
850
- import { jsx as jsx5 } from "react/jsx-runtime";
851
- var DatePickerElement = forwardRef2((props, ref) => {
852
- const {
853
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
854
- ...coreProps
855
- } = props;
856
- if (gridProps === false) {
857
- return /* @__PURE__ */ jsx5(
858
- DatePickerElementCore,
859
- {
860
- ref,
861
- ...coreProps
862
- }
863
- );
864
- }
865
- return /* @__PURE__ */ jsx5(
866
- Grid4,
867
- {
868
- ref,
869
- ...gridProps,
870
- children: /* @__PURE__ */ jsx5(
871
- DatePickerElementCore,
872
- {
873
- ...coreProps
874
- }
875
- )
876
- }
877
- );
878
- });
879
- DatePickerElement.displayName = "DatePickerElement";
880
-
881
- // src/wrappers/DatePickerElement/utils.ts
882
- function isValidDate(value) {
883
- if (value === null || value === void 0) {
884
- return false;
885
- }
886
- if (value instanceof Date) {
887
- return !isNaN(value.getTime());
888
- }
889
- if (typeof value === "object" && value !== null) {
890
- if ("isValid" in value && typeof value.isValid === "function") {
891
- return value.isValid();
892
- }
893
- if ("isValid" in value && typeof value.isValid === "boolean") {
894
- return value.isValid;
895
- }
896
- }
897
- return false;
898
- }
899
- function isParsableDateString(value) {
900
- if (typeof value !== "string" || value === "") {
901
- return false;
902
- }
903
- const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
904
- if (isoDateRegex.test(value)) {
905
- return true;
906
- }
907
- const parsed = new Date(value);
908
- return !isNaN(parsed.getTime());
909
- }
910
- function createDateInputTransform(adapter) {
911
- return (value) => {
912
- if (value === null || value === void 0) {
913
- return null;
914
- }
915
- if (typeof value === "string") {
916
- if (value === "") {
917
- return null;
918
- }
919
- try {
920
- const parsed = adapter.utils.date(value);
921
- return isValidDate(parsed) ? parsed : null;
922
- } catch {
923
- return null;
924
- }
925
- }
926
- if (isValidDate(value)) {
927
- return value;
928
- }
929
- return null;
930
- };
931
- }
932
- function createDateOutputTransform(format) {
933
- return (value) => {
934
- if (value === null || value === void 0) {
935
- return null;
936
- }
937
- if (!isValidDate(value)) {
938
- return null;
939
- }
940
- if (!format) {
941
- return value;
942
- }
943
- try {
944
- if (value instanceof Date) {
945
- if (format === "iso") {
946
- return value.toISOString();
947
- }
948
- if (format === "date-only") {
949
- return value.toISOString().split("T")[0];
950
- }
951
- }
952
- if (typeof value.format === "function") {
953
- return value.format(format);
954
- }
955
- if (typeof value.format === "function") {
956
- return value.format(format);
957
- }
958
- if (typeof value.toFormat === "function") {
959
- return value.toFormat(format);
960
- }
961
- return value;
962
- } catch {
963
- return null;
964
- }
965
- };
966
- }
967
- function createDefaultDatePickerConfig() {
968
- return {
969
- // Default slot props for consistent behavior
970
- slotProps: {
971
- actionBar: {
972
- actions: ["clear", "today", "cancel", "accept"]
973
- },
974
- textField: {
975
- fullWidth: true,
976
- variant: "outlined"
977
- }
978
- },
979
- // Default grid props for layout consistency
980
- gridProps: {
981
- size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
982
- },
983
- // Default validation configuration
984
- validation: {
985
- errorMessages: {
986
- invalidDate: "Please enter a valid date",
987
- minDate: "Date must be after the minimum allowed date",
988
- maxDate: "Date must be before the maximum allowed date",
989
- disabledDate: "This date is not allowed"
990
- }
991
- }
992
- };
993
- }
994
- function extractErrorMessage(error) {
995
- if (error === null || error === void 0) {
996
- return "";
997
- }
998
- if (typeof error === "string") {
999
- return error;
1000
- }
1001
- if (typeof error === "object" && error !== null) {
1002
- if ("message" in error && typeof error.message === "string") {
1003
- return error.message;
1004
- }
1005
- if ("type" in error && typeof error.type === "string") {
1006
- const errorType = error.type;
1007
- switch (errorType) {
1008
- case "invalidDate":
1009
- return "Please enter a valid date";
1010
- case "minDate":
1011
- return "Date is too early";
1012
- case "maxDate":
1013
- return "Date is too late";
1014
- case "disabledDate":
1015
- return "This date is not available";
1016
- default:
1017
- return "Invalid date selection";
1018
- }
1019
- }
1020
- }
1021
- return "Invalid input";
1022
- }
1023
- function createStableKey(config) {
1024
- try {
1025
- return JSON.stringify(config, (key, value) => {
1026
- if (typeof value === "object" && value !== null && !Array.isArray(value)) {
1027
- const sorted = {};
1028
- Object.keys(value).sort().forEach((k) => {
1029
- sorted[k] = value[k];
1030
- });
1031
- return sorted;
1032
- }
1033
- return value;
1034
- });
1035
- } catch {
1036
- return Object.keys(config).sort().join("-");
1037
- }
1038
- }
1039
-
1040
- // src/wrappers/PasswordElement/PasswordElement.tsx
1041
- import Visibility from "@mui/icons-material/Visibility";
1042
- import VisibilityOff from "@mui/icons-material/VisibilityOff";
1043
- import {
1044
- IconButton,
1045
- InputAdornment,
1046
- TextField as TextField2,
1047
- useForkRef as useForkRef2,
1048
- Grid as Grid5
1049
- } from "@mui/material";
1050
- import { useState as useState2 } from "react";
1051
- import { useController as useController5 } from "react-hook-form";
1052
- import { jsx as jsx6 } from "react/jsx-runtime";
1053
- var Component4 = function PasswordEl(props) {
1054
- const {
1055
- iconColor,
1056
- renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
1057
- slotProps,
1058
- name,
1059
- control,
1060
- inputRef,
1061
- onBlur,
1062
- ...rest
1063
- } = props;
1064
- const [password, setPassword] = useState2(true);
1065
- const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
1066
- IconButton,
1067
- {
1068
- onMouseDown: (e) => e.preventDefault(),
1069
- onClick: () => setPassword(!password),
1070
- tabIndex: -1,
1071
- color: iconColor ?? "default",
1072
- children: renderIcon(password)
1073
- }
1074
- ) });
1075
- const {
1076
- field,
1077
- fieldState: { error }
1078
- } = useController5({
1079
- name,
1080
- control
1081
- });
1082
- const handleInputRef = useForkRef2(field.ref, inputRef);
1083
- return /* @__PURE__ */ jsx6(
1084
- TextField2,
1085
- {
1086
- ...rest,
1087
- inputRef: handleInputRef,
1088
- type: password ? "password" : "text",
1089
- value: field.value ?? "",
1090
- fullWidth: true,
1091
- variant: rest.variant ?? "outlined",
1092
- onChange: (event) => {
1093
- field.onChange(event);
1094
- if (typeof rest.onChange === "function") {
1095
- rest.onChange(event);
1096
- }
1097
- },
1098
- onBlur: (event) => {
1099
- field.onBlur();
1100
- if (typeof onBlur === "function") {
1101
- onBlur(event);
1102
- }
1103
- },
1104
- ...typeof slotProps === "undefined" ? {
1105
- InputProps: {
1106
- endAdornment
1107
- }
1108
- } : {
1109
- slotProps: {
1110
- ...slotProps,
1111
- input: {
1112
- endAdornment,
1113
- ...slotProps?.input
1114
- }
1115
- }
1116
- },
1117
- error: !!error,
1118
- helperText: error ? error.message : ""
1119
- }
1120
- );
1121
- };
1122
- var PasswordElement = ({
1123
- gridProps = {},
1124
- ...props
1125
- }) => {
1126
- return /* @__PURE__ */ jsx6(Grid5, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx6(Component4, { ...props }) });
1127
- };
1128
-
1129
- // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1130
- import {
1131
- FormControl as FormControl3,
1132
- FormControlLabel as FormControlLabel3,
1133
- FormHelperText as FormHelperText3,
1134
- FormLabel as FormLabel2,
1135
- Radio,
1136
- RadioGroup,
1137
- Grid as Grid6
1138
- } from "@mui/material";
1139
- import { useController as useController6 } from "react-hook-form";
1140
- import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
1141
- var Component5 = function RadioButtonGroup(props) {
1142
- const {
1143
- options,
1144
- label,
1145
- name,
1146
- labelKey = "label",
1147
- valueKey = "id",
1148
- disabledKey = "disabled",
1149
- required,
1150
- emptyOptionLabel,
1151
- returnObject,
1152
- row = true,
1153
- control,
1154
- type,
1155
- labelProps,
1156
- disabled,
1157
- formLabelProps,
1158
- radioProps,
1159
- transform,
1160
- ...rest
1161
- } = props;
1162
- const {
1163
- field,
1164
- fieldState: { error }
1165
- } = useController6({
1166
- name,
1167
- disabled,
1168
- control
1169
- });
1170
- const { value, onChange } = useTransform({
1171
- value: field.value,
1172
- onChange: field.onChange,
1173
- transform: {
1174
- input: typeof transform?.input === "function" ? transform.input : (value2) => {
1175
- return value2 || "";
1176
- },
1177
- output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
1178
- if (value2 && type === "number") {
1179
- return Number(value2);
1180
- }
1181
- if (value2 && type === "boolean") {
1182
- return Boolean(value2);
1183
- }
1184
- return value2;
1185
- }
1186
- }
1187
- });
1188
- const onRadioChange = (event, radioValue) => {
1189
- const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
1190
- onChange(event, returnValue);
1191
- if (typeof rest.onChange === "function") {
1192
- rest.onChange(returnValue);
1193
- }
1194
- };
1195
- return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
1196
- label && /* @__PURE__ */ jsx7(FormLabel2, { ...formLabelProps, required, error: !!error, children: label }),
1197
- /* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1198
- emptyOptionLabel && /* @__PURE__ */ jsx7(
1199
- FormControlLabel3,
1200
- {
1201
- ...labelProps,
1202
- control: /* @__PURE__ */ jsx7(
1203
- Radio,
1204
- {
1205
- ...radioProps,
1206
- checked: !value
1207
- }
1208
- ),
1209
- label: emptyOptionLabel,
1210
- value: ""
1211
- }
1212
- ),
1213
- options.map((option) => {
1214
- const optionKey = option[valueKey];
1215
- const optionDisabled = option[disabledKey] || false;
1216
- let val = returnObject ? value?.[valueKey] : value;
1217
- if (type === "number" && val !== void 0) {
1218
- val = Number(val);
1219
- } else if (type === "boolean" && val !== void 0) {
1220
- val = Boolean(val);
1221
- }
1222
- const isChecked = val === optionKey;
1223
- return /* @__PURE__ */ jsx7(
1224
- FormControlLabel3,
1225
- {
1226
- ...labelProps,
1227
- control: /* @__PURE__ */ jsx7(
1228
- Radio,
1229
- {
1230
- ...radioProps,
1231
- disabled: disabled || optionDisabled,
1232
- checked: isChecked
1233
- }
1234
- ),
1235
- value: optionKey,
1236
- label: option[labelKey]
1237
- },
1238
- String(optionKey)
1239
- );
1240
- })
1241
- ] }),
1242
- error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
1243
- ] });
1244
- };
1245
- var RadioButtonGroup2 = ({
1246
- gridProps = {},
1247
- ...props
1248
- }) => {
1249
- return /* @__PURE__ */ jsx7(Grid6, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx7(
1250
- Component5,
1251
- {
1252
- ...props
1253
- }
1254
- ) });
1255
- };
1256
- RadioButtonGroup2.displayName = "RadioButtonGroup";
1257
-
1258
- // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1259
- import { Grid as Grid7, TextField as TextField3, Autocomplete as Autocomplete2 } from "@mui/material";
1260
- import { useTheme as useTheme3 } from "@mui/material/styles";
1261
- import { useRef as useRef2, useEffect as useEffect2, useCallback as useCallback5, useMemo as useMemo6 } from "react";
1262
- import { useController as useController7 } from "react-hook-form";
1263
- import { jsx as jsx8 } from "react/jsx-runtime";
1264
- var Component6 = function SelectCascadeElement(props) {
1265
- const theme = useTheme3();
1266
- const {
1267
- labelField = "Label",
1268
- valueField = "Value",
1269
- name,
1270
- onBlur,
1271
- onChange,
1272
- disabled,
1273
- options: optionsInput,
1274
- control,
1275
- loading = false,
1276
- placeholder,
1277
- label,
1278
- dependsOn,
1279
- textFieldProps = {},
1280
- variant,
1281
- isNullable = false,
1282
- ...rest
1283
- } = props;
1284
- const { required, ...restTextProps } = textFieldProps;
1285
- const options = useMemo6(() => optionsInput || [], [optionsInput]);
1286
- const getOptionKey = useCallback5(
1287
- (option) => {
1288
- if (typeof option === "string" || typeof option === "number")
1289
- return option;
1290
- const key = option ? option[valueField] : void 0;
1291
- return key !== void 0 && key !== null ? String(key) : "";
1292
- },
1293
- [valueField]
1294
- );
1295
- const getOptionLabel = useCallback5(
1296
- (option) => {
1297
- if (typeof option === "string") return option;
1298
- return option ? String(option[labelField]) : "";
1299
- },
1300
- [labelField]
1301
- );
1302
- const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1303
- const {
1304
- field,
1305
- fieldState: { error }
1306
- } = useController7({
1307
- name,
1308
- control
1309
- });
1310
- const { field: dependentField } = useController7({
1311
- name: dependsOn,
1312
- control
1313
- });
1314
- const parentValueRef = useRef2(dependentField.value);
1315
- useEffect2(() => {
1316
- if (parentValueRef.current !== dependentField.value) {
1317
- field.onChange(null);
1318
- parentValueRef.current = dependentField.value;
1319
- }
1320
- }, [dependentField.value, field]);
1321
- useEffect2(() => {
1322
- const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1323
- if (options.length === 1 && !hasValue) {
1324
- if (disabled) return;
1325
- field.onChange(getOptionKey(options[0]));
1326
- }
1327
- }, [options, disabled, getOptionKey, field.onChange, dependentField.value]);
1328
- const isDisabled = useMemo6(() => {
1329
- if (disabled) return true;
1330
- if (dependentField.value === null || dependentField.value === void 0 || dependentField.value === "")
1331
- return true;
1332
- if (options.length === 1 && !isNullable) {
1333
- return true;
1334
- }
1335
- return false;
1336
- }, [disabled, dependentField.value, options.length, isNullable]);
1337
- return /* @__PURE__ */ jsx8(
1338
- Autocomplete2,
1339
- {
1340
- ...rest,
1341
- value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
1342
- loading,
1343
- options,
1344
- getOptionKey,
1345
- getOptionLabel,
1346
- isOptionEqualToValue,
1347
- ref: field.ref,
1348
- disabled: isDisabled,
1349
- sx: {
1350
- "&.Mui-disabled": {
1351
- cursor: "not-allowed !important"
1352
- },
1353
- "& .MuiInputBase-root.Mui-disabled": {
1354
- backgroundColor: theme.palette.action.disabledBackground,
1355
- cursor: "not-allowed !important"
1356
- },
1357
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1358
- cursor: "not-allowed !important"
1359
- },
1360
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1361
- borderColor: error ? "red" : void 0
1362
- },
1363
- "& .MuiFilledInput-root.Mui-disabled": {
1364
- borderColor: error ? "red" : void 0
1365
- }
1366
- },
1367
- onChange: (event, newValue, reason) => {
1368
- field.onChange(newValue ? getOptionKey(newValue) : null);
1369
- if (onChange && typeof onChange === "function") {
1370
- onChange(event, newValue, reason);
1371
- }
1372
- },
1373
- onBlur: (event) => {
1374
- field.onBlur();
1375
- if (typeof onBlur === "function") {
1376
- onBlur(event);
1377
- }
1378
- },
1379
- fullWidth: true,
1380
- renderInput: (params) => /* @__PURE__ */ jsx8(
1381
- TextField3,
1382
- {
1383
- ...params,
1384
- ...restTextProps,
1385
- fullWidth: true,
1386
- error: !!error,
1387
- required,
1388
- helperText: error ? error.message : "",
1389
- placeholder,
1390
- label,
1391
- variant: variant ? variant : "outlined"
1392
- }
1393
- )
1394
- }
1395
- );
1396
- };
1397
- var SelectCascadeElement2 = ({
1398
- gridProps = {},
1399
- ...props
1400
- }) => {
1401
- return /* @__PURE__ */ jsx8(Grid7, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx8(Component6, { ...props }) });
1402
- };
1403
- SelectCascadeElement2.displayName = "SelectCascadeElement";
1404
-
1405
- // src/wrappers/SelectElement/SelectElement.tsx
1406
- import { Grid as Grid8, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
1407
- import { useTheme as useTheme4 } from "@mui/material/styles";
1408
- import { useMemo as useMemo7, useEffect as useEffect3, useCallback as useCallback6 } from "react";
1409
- import { useController as useController8 } from "react-hook-form";
1410
- import { jsx as jsx9 } from "react/jsx-runtime";
1411
- var Component7 = function SelectElement(props) {
1412
- const theme = useTheme4();
1413
- const {
1414
- name,
1415
- control,
1416
- onChange,
1417
- options: optionsInput,
1418
- label,
1419
- variant,
1420
- disabled,
1421
- labelField = "Label",
1422
- valueField = "Value",
1423
- placeholder,
1424
- textFieldProps = {},
1425
- isNullable = false,
1426
- ...rest
1427
- } = props;
1428
- const { required, ...restTextProps } = textFieldProps;
1429
- const options = useMemo7(() => optionsInput || [], [optionsInput]);
1430
- const {
1431
- field,
1432
- fieldState: { error }
1433
- } = useController8({
1434
- name,
1435
- control
1436
- });
1437
- const getOptionValue = useCallback6(
1438
- (option) => {
1439
- if (typeof option === "string") return option;
1440
- return option ? option[valueField] : null;
1441
- },
1442
- [valueField]
1443
- );
1444
- const getOptionLabel = useCallback6(
1445
- (option) => {
1446
- if (typeof option === "string") return option;
1447
- return option ? String(option[labelField]) : "";
1448
- },
1449
- [labelField]
1450
- );
1451
- useEffect3(() => {
1452
- const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
1453
- if (options.length === 1 && !hasValue) {
1454
- if (disabled) return;
1455
- field.onChange(getOptionValue(options[0]));
1456
- }
1457
- }, [options, disabled, getOptionValue, field.onChange]);
1458
- const isDisabled = useMemo7(() => {
1459
- if (disabled) return true;
1460
- if (options.length === 0) return true;
1461
- if (options.length === 1 && !isNullable) return true;
1462
- return false;
1463
- }, [disabled, options.length, isNullable]);
1464
- const autocompleteValue = useMemo7(
1465
- () => options.find((option) => getOptionValue(option) === field.value) ?? null,
1466
- [field.value, options, getOptionValue]
1467
- );
1468
- return /* @__PURE__ */ jsx9(
1469
- Autocomplete3,
1470
- {
1471
- ...rest,
1472
- filterSelectedOptions: false,
1473
- options,
1474
- value: autocompleteValue,
1475
- onChange: (event, newValue, reason) => {
1476
- const option = newValue;
1477
- field.onChange(option ? getOptionValue(option) : null);
1478
- onChange?.(event, newValue, reason);
1479
- },
1480
- disabled: isDisabled,
1481
- sx: {
1482
- "&.Mui-disabled": {
1483
- cursor: "not-allowed !important"
1484
- },
1485
- "& .MuiInputBase-root.Mui-disabled": {
1486
- backgroundColor: theme.palette.action.disabledBackground,
1487
- cursor: "not-allowed !important"
1488
- },
1489
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1490
- cursor: "not-allowed !important"
1491
- },
1492
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1493
- borderColor: error ? "red" : void 0
1494
- },
1495
- "& .MuiFilledInput-root.Mui-disabled": {
1496
- borderColor: error ? "red" : void 0
1497
- }
1498
- },
1499
- getOptionLabel: (option) => getOptionLabel(option),
1500
- ref: field.ref,
1501
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1502
- renderInput: (params) => /* @__PURE__ */ jsx9(
1503
- TextField4,
1504
- {
1505
- ...params,
1506
- ...restTextProps,
1507
- fullWidth: true,
1508
- required,
1509
- error: !!error,
1510
- helperText: error ? error.message : "",
1511
- label,
1512
- placeholder,
1513
- variant: variant ? variant : "outlined"
1514
- }
1515
- )
1516
- }
1517
- );
1518
- };
1519
- var SelectElement2 = ({
1520
- gridProps = {},
1521
- ...props
1522
- }) => {
1523
- return /* @__PURE__ */ jsx9(Grid8, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx9(Component7, { ...props }) });
1524
- };
1525
- SelectElement2.displayName = "SelectElement";
1526
-
1527
- // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1528
- import CheckBoxIcon from "@mui/icons-material/CheckBox";
1529
- import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
1530
- import {
1531
- Grid as Grid9,
1532
- Checkbox as Checkbox3,
1533
- TextField as TextField5,
1534
- Autocomplete as Autocomplete4,
1535
- CircularProgress as CircularProgress2,
1536
- useTheme as useTheme5
1537
- } from "@mui/material";
1538
- import { Fragment as Fragment2, useEffect as useEffect4, useMemo as useMemo8 } from "react";
1539
- import { useController as useController9 } from "react-hook-form";
1540
- import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1541
- var Component8 = function SelectMultiElement(props) {
1542
- const {
1543
- name,
1544
- control,
1545
- onBlur,
1546
- disabled,
1547
- options: optionsInput,
1548
- loading = false,
1549
- placeholder,
1550
- label,
1551
- isNullable,
1552
- variant,
1553
- labelField = "Label",
1554
- valueField = "Value",
1555
- ...rest
1556
- } = props;
1557
- const theme = useTheme5();
1558
- const options = useMemo8(() => optionsInput || [], [optionsInput]);
1559
- const {
1560
- field,
1561
- fieldState: { error }
1562
- } = useController9({
1563
- name,
1564
- control
1565
- });
1566
- const getOptionValue = (option) => {
1567
- if (typeof option === "string") return option;
1568
- return option ? option[valueField] : null;
1569
- };
1570
- const getOptionLabel = (option) => {
1571
- if (typeof option === "string") return option;
1572
- return option ? String(option[labelField]) : "";
1573
- };
1574
- const isDisabled = useMemo8(() => {
1575
- if (disabled) return true;
1576
- if (options.length === 0) return true;
1577
- if (options.length === 1 && !isNullable) return true;
1578
- return false;
1579
- }, [disabled, options.length, isNullable]);
1580
- const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1581
- useEffect4(() => {
1582
- const hasValue = Array.isArray(field.value) && field.value.length > 0;
1583
- if (options.length === 1 && !hasValue && !isNullable) {
1584
- field.onChange([getOptionValue(options[0])]);
1585
- }
1586
- }, [options, getOptionValue, field.onChange, isNullable]);
1587
- const handleChange = (_, selectedOptions, reason) => {
1588
- if (reason === "clear") {
1589
- field.onChange(null);
1590
- } else if (reason === "selectOption" || reason === "removeOption") {
1591
- const newValues = selectedOptions.map((option) => getOptionValue(option));
1592
- field.onChange(newValues.length === 0 ? null : newValues);
1593
- }
1594
- };
1595
- const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
1596
- const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
1597
- return /* @__PURE__ */ jsx10(
1598
- Autocomplete4,
1599
- {
1600
- multiple: true,
1601
- value: selectedValue,
1602
- loading,
1603
- options,
1604
- getOptionLabel,
1605
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1606
- filterSelectedOptions: true,
1607
- disableCloseOnSelect: true,
1608
- ref: field.ref,
1609
- disabled: isDisabled,
1610
- onChange: handleChange,
1611
- onBlur: (event) => {
1612
- field.onBlur();
1613
- if (typeof onBlur === "function") {
1614
- onBlur(event);
1615
- }
1616
- },
1617
- sx: {
1618
- "&.Mui-disabled": {
1619
- cursor: "not-allowed !important"
1620
- },
1621
- "& .MuiInputBase-root.Mui-disabled": {
1622
- backgroundColor: theme.palette.action.disabledBackground,
1623
- cursor: "not-allowed !important"
1624
- },
1625
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
1626
- cursor: "not-allowed !important"
1627
- },
1628
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
1629
- borderColor: error ? "red" : void 0
1630
- },
1631
- "& .MuiFilledInput-root.Mui-disabled": {
1632
- borderColor: error ? "red" : void 0
1633
- }
1634
- },
1635
- fullWidth: true,
1636
- renderOption: (props1, option, { selected }) => {
1637
- return /* @__PURE__ */ jsxs5("li", { ...props1, children: [
1638
- /* @__PURE__ */ jsx10(
1639
- Checkbox3,
1640
- {
1641
- icon,
1642
- checkedIcon,
1643
- checked: selected
1644
- }
1645
- ),
1646
- getOptionLabel(option)
1647
- ] });
1648
- },
1649
- renderInput: (params) => /* @__PURE__ */ jsx10(
1650
- TextField5,
1651
- {
1652
- ...params,
1653
- label,
1654
- error: !!error,
1655
- helperText: error ? error.message : "",
1656
- placeholder,
1657
- InputProps: {
1658
- ...params.InputProps,
1659
- endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
1660
- loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
1661
- params.InputProps.endAdornment
1662
- ] })
1663
- },
1664
- variant: variant ? variant : "outlined"
1665
- }
1666
- ),
1667
- ...rest
1668
- }
1669
- );
1670
- };
1671
- var SelectMultiElement2 = ({
1672
- gridProps = {},
1673
- ...props
1674
- }) => {
1675
- return /* @__PURE__ */ jsx10(Grid9, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx10(Component8, { ...props }) });
1676
- };
1677
- SelectMultiElement2.displayName = "SelectMultiElement";
1678
-
1679
- // src/wrappers/TextFieldElement/TextFieldElement.tsx
1680
- import { Grid as Grid10, TextField as TextField6, useForkRef as useForkRef3 } from "@mui/material";
1681
- import { useController as useController10 } from "react-hook-form";
1682
- import { jsx as jsx11 } from "react/jsx-runtime";
1683
- var Component9 = function TextFieldElement(props) {
1684
- const {
1685
- parseError,
1686
- name,
1687
- control,
1688
- component: TextFieldComponent = TextField6,
1689
- transform,
1690
- fieldType = "text",
1691
- // Default to text type
1692
- defaultValue,
1693
- label,
1694
- placeholder,
1695
- textFieldProps = {},
1696
- variant,
1697
- onChange: customOnChange,
1698
- enableWarnings = process.env.NODE_ENV === "development",
1699
- ...rest
1700
- } = props;
1701
- const {
1702
- type,
1703
- required,
1704
- helperText,
1705
- inputRef,
1706
- onInput,
1707
- onBlur,
1708
- disabled,
1709
- ...restTextProps
1710
- } = textFieldProps;
1711
- const {
1712
- field,
1713
- fieldState: { error }
1714
- } = useController10({
1715
- name,
1716
- control
1717
- });
1718
- const { value, onChange } = useEnhancedTransform(
1719
- {
1720
- value: field.value,
1721
- onChange: field.onChange,
1722
- transform: transform ? {
1723
- input: transform.input,
1724
- output: transform.output
1725
- } : void 0,
1726
- fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1727
- // Auto-detect number type
1728
- defaultValue,
1729
- enableWarnings
1730
- }
1731
- );
1732
- const handleInputRef = useForkRef3(field.ref, inputRef);
1733
- return /* @__PURE__ */ jsx11(
1734
- TextFieldComponent,
1735
- {
1736
- ...rest,
1737
- ...restTextProps,
1738
- name: field.name,
1739
- value,
1740
- onChange: (event) => {
1741
- const input = event.target.value;
1742
- if (input === "") {
1743
- field.onChange(null);
1744
- } else {
1745
- onChange(event);
1746
- }
1747
- if (typeof customOnChange === "function") {
1748
- customOnChange(event);
1749
- }
1750
- return;
1751
- },
1752
- onBlur: (event) => {
1753
- field.onBlur();
1754
- if (typeof onBlur === "function") {
1755
- onBlur(event);
1756
- }
1757
- },
1758
- onInput: (event) => {
1759
- if (typeof onInput === "function") {
1760
- onInput(event);
1761
- }
1762
- },
1763
- disabled,
1764
- label,
1765
- placeholder,
1766
- fullWidth: true,
1767
- required,
1768
- type,
1769
- error: !!error,
1770
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
1771
- inputRef: handleInputRef,
1772
- variant: variant ? variant : "outlined"
1773
- }
1774
- );
1775
- };
1776
- var TextFieldElement2 = ({
1777
- gridProps = {},
1778
- ...props
1779
- }) => {
1780
- return /* @__PURE__ */ jsx11(Grid10, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx11(Component9, { ...props }) });
1781
- };
1782
-
1783
- // src/wrappers/TimePickerElement/TimePickerElement.tsx
1784
- import { Grid as Grid11, useForkRef as useForkRef4 } from "@mui/material";
1785
- import { TimePicker } from "@mui/x-date-pickers";
1786
- import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
1787
- import dayjs from "dayjs";
1788
- import { useController as useController11 } from "react-hook-form";
1789
- import { jsx as jsx12 } from "react/jsx-runtime";
1790
- var Component10 = function TimePickerElement(props) {
1791
- const {
1792
- name,
1793
- required,
1794
- inputProps,
1795
- control,
1796
- textReadOnly,
1797
- label,
1798
- placeholder,
1799
- slotProps,
1800
- timePickerProps = {},
1801
- transform,
1802
- ...rest
1803
- } = props;
1804
- const adapter = useLocalizationContext2();
1805
- const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1806
- const {
1807
- field,
1808
- fieldState: { error }
1809
- } = useController11({
1810
- name,
1811
- control,
1812
- defaultValue: null
1813
- });
1814
- const { value, onChange } = useTransform({
1815
- value: field.value,
1816
- onChange: field.onChange,
1817
- transform: {
1818
- input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1819
- output: (data) => {
1820
- if (data === null || !dayjs.isDayjs(data)) {
1821
- return null;
1822
- }
1823
- return data;
1824
- }
1825
- }
1826
- });
1827
- const handleInputRef = useForkRef4(field.ref, inputRef);
1828
- return /* @__PURE__ */ jsx12(
1829
- TimePicker,
1830
- {
1831
- ...rest,
1832
- ...restTimePickerProps,
1833
- ...field,
1834
- value,
1835
- label,
1836
- disabled,
1837
- ...timePickerProps,
1838
- inputRef: handleInputRef,
1839
- onClose: (...args) => {
1840
- field.onBlur();
1841
- if (onClose) {
1842
- onClose(...args);
1843
- }
1844
- },
1845
- onChange: (newValue, context) => {
1846
- onChange(newValue);
1847
- timePickerProps.onChange?.(newValue, context);
1848
- },
1849
- slotProps: {
1850
- ...slotProps,
1851
- actionBar: {
1852
- actions: ["clear", "cancel", "accept"]
1853
- },
1854
- textField: {
1855
- ...inputProps,
1856
- required,
1857
- placeholder,
1858
- fullWidth: true,
1859
- onBlur: (event) => {
1860
- field.onBlur();
1861
- if (typeof inputProps?.onBlur === "function") {
1862
- inputProps.onBlur(event);
1863
- }
1864
- },
1865
- error: !!error,
1866
- helperText: error ? error.message : inputProps?.helperText || rest.helperText,
1867
- inputProps: {
1868
- readOnly: !!textReadOnly,
1869
- ...inputProps?.inputProps
1870
- }
1871
- }
1872
- }
1873
- }
1874
- );
1875
- };
1876
- var TimePickerElement2 = ({
1877
- gridProps = {},
1878
- ...props
1879
- }) => {
1880
- return /* @__PURE__ */ jsx12(Grid11, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx12(Component10, { ...props }) });
1881
- };
1882
- TimePickerElement2.displayName = "TimePickerElement";
1883
-
1884
- // src/wrappers/AsyncSelect/index.tsx
1885
- import {
1886
- Autocomplete as Autocomplete5,
1887
- CircularProgress as CircularProgress3,
1888
- Grid as Grid12,
1889
- TextField as TextField7,
1890
- useTheme as useTheme6
1891
- } from "@mui/material";
1892
- import { debounce as debounce2 } from "@mui/material/utils";
1893
- import {
1894
- Fragment as Fragment3,
1895
- useCallback as useCallback7,
1896
- useEffect as useEffect5,
1897
- useMemo as useMemo9,
1898
- useRef as useRef3,
1899
- useState as useState3
1900
- } from "react";
1901
- import {
1902
- useController as useController12
1903
- } from "react-hook-form";
1904
- import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
1905
- var Component11 = function AsyncSelectElement(props) {
1906
- const {
1907
- name,
1908
- disabled,
1909
- control,
1910
- placeholder,
1911
- // initialValue,
1912
- // isNullable,
1913
- label,
1914
- queryFn,
1915
- variant,
1916
- labelField = "Label",
1917
- valueField = "Value",
1918
- ...rest
1919
- } = props;
1920
- const {
1921
- field,
1922
- fieldState: { error }
1923
- } = useController12({
1924
- name,
1925
- control
1926
- });
1927
- const theme = useTheme6();
1928
- const [loading, setLoading] = useState3(false);
1929
- const [selectedOption, setSelectedOption] = useState3(null);
1930
- const [inputValue, setInputValue] = useState3("");
1931
- const [options, setOptions] = useState3([]);
1932
- const [open, setOpen] = useState3(false);
1933
- const loadedValueRef = useRef3(
1934
- void 0
1935
- );
1936
- const fetchData = useMemo9(
1937
- () => debounce2(
1938
- (payload, callback) => {
1939
- queryFn(payload).then((c) => callback(c));
1940
- },
1941
- 400
1942
- ),
1943
- [queryFn]
1944
- );
1945
- const getOptionValue = useCallback7(
1946
- (option) => {
1947
- return option ? String(option[valueField]) : "";
1948
- },
1949
- [valueField]
1950
- );
1951
- const getOptionLabel = useCallback7(
1952
- (option) => {
1953
- return option ? String(option[labelField]) : "";
1954
- },
1955
- [labelField]
1956
- );
1957
- useEffect5(() => {
1958
- const currentValue = field.value;
1959
- if (currentValue && loadedValueRef.current !== currentValue) {
1960
- if (selectedOption && getOptionValue(selectedOption) === currentValue) {
1961
- loadedValueRef.current = currentValue;
1962
- return;
1963
- }
1964
- const active = true;
1965
- setLoading(true);
1966
- loadedValueRef.current = currentValue;
1967
- fetchData({ Query: null, SelectedValue: currentValue }, (results) => {
1968
- if (!active) return;
1969
- setLoading(false);
1970
- const matchedOption = results?.find(
1971
- (option) => String(getOptionValue(option)) === String(currentValue)
1972
- );
1973
- if (matchedOption) {
1974
- setOptions([matchedOption]);
1975
- setSelectedOption(matchedOption);
1976
- setInputValue(getOptionLabel(matchedOption));
1977
- }
1978
- });
1979
- return;
1980
- }
1981
- if (inputValue !== (selectedOption ? getOptionLabel(selectedOption) : "")) {
1982
- if (inputValue === "") {
1983
- setOptions([]);
1984
- setLoading(false);
1985
- return;
1986
- }
1987
- const active = true;
1988
- setLoading(true);
1989
- fetchData({ Query: inputValue, SelectedValue: null }, (results) => {
1990
- if (!active) return;
1991
- setLoading(false);
1992
- setOptions(results || []);
1993
- });
1994
- return;
1995
- }
1996
- if (!currentValue && selectedOption) {
1997
- setSelectedOption(null);
1998
- setInputValue("");
1999
- setOptions([]);
2000
- loadedValueRef.current = void 0;
2001
- }
2002
- }, [
2003
- field.value,
2004
- inputValue,
2005
- fetchData,
2006
- getOptionLabel,
2007
- getOptionValue,
2008
- selectedOption,
2009
- labelField,
2010
- valueField
2011
- ]);
2012
- const isDisabled = useMemo9(() => {
2013
- return disabled ?? false;
2014
- }, [disabled]);
2015
- const handleChange = useCallback7(
2016
- (_, newSelectedOption) => {
2017
- setSelectedOption(newSelectedOption);
2018
- const newValue = newSelectedOption ? getOptionValue(newSelectedOption) : null;
2019
- field.onChange(newValue);
2020
- loadedValueRef.current = newValue;
2021
- if (newSelectedOption) {
2022
- setInputValue(getOptionLabel(newSelectedOption));
2023
- } else {
2024
- setInputValue("");
2025
- setOptions([]);
2026
- }
2027
- },
2028
- [field, getOptionValue, getOptionLabel]
2029
- );
2030
- const handleInputChange = useCallback7(
2031
- (_, newInputValue) => {
2032
- setInputValue(newInputValue);
2033
- },
2034
- []
2035
- );
2036
- const handleBlur = useCallback7(() => {
2037
- if (selectedOption) {
2038
- setInputValue(getOptionLabel(selectedOption));
2039
- } else {
2040
- setInputValue("");
2041
- }
2042
- }, [selectedOption, getOptionLabel]);
2043
- const handleOpen = useCallback7(() => {
2044
- setOpen(true);
2045
- }, []);
2046
- const handleClose = useCallback7(() => {
2047
- setOpen(false);
2048
- }, []);
2049
- return /* @__PURE__ */ jsx13(
2050
- Autocomplete5,
2051
- {
2052
- ...rest,
2053
- fullWidth: true,
2054
- open,
2055
- onOpen: handleOpen,
2056
- onClose: handleClose,
2057
- onBlur: handleBlur,
2058
- loading,
2059
- getOptionLabel,
2060
- getOptionKey: getOptionValue,
2061
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
2062
- autoComplete: true,
2063
- disabled: isDisabled,
2064
- includeInputInList: true,
2065
- options,
2066
- value: selectedOption,
2067
- filterSelectedOptions: true,
2068
- filterOptions: (x) => x,
2069
- onChange: handleChange,
2070
- onInputChange: handleInputChange,
2071
- sx: {
2072
- "&.Mui-disabled": {
2073
- cursor: "not-allowed !important"
2074
- },
2075
- "& .MuiInputBase-root.Mui-disabled": {
2076
- backgroundColor: theme.palette.action.disabledBackground,
2077
- cursor: "not-allowed !important"
2078
- },
2079
- "&.Mui-disabled .MuiAutocomplete-popupIndicator": {
2080
- cursor: "not-allowed !important"
2081
- },
2082
- "& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
2083
- borderColor: error ? "red" : void 0
2084
- },
2085
- "& .MuiFilledInput-root.Mui-disabled": {
2086
- borderColor: error ? "red" : void 0
2087
- }
2088
- },
2089
- noOptionsText: "Type Something...",
2090
- renderInput: (params) => /* @__PURE__ */ jsx13(
2091
- TextField7,
2092
- {
2093
- ...params,
2094
- label,
2095
- error: !!error,
2096
- helperText: error ? error.message : "",
2097
- placeholder,
2098
- slotProps: {
2099
- input: {
2100
- ...params.InputProps,
2101
- endAdornment: /* @__PURE__ */ jsxs6(Fragment3, { children: [
2102
- loading ? /* @__PURE__ */ jsx13(CircularProgress3, { color: "inherit", size: 20 }) : null,
2103
- params.InputProps.endAdornment
2104
- ] })
2105
- }
2106
- },
2107
- variant: variant ? variant : "outlined"
2108
- }
2109
- ),
2110
- renderOption: (renderProps, option) => {
2111
- const { key, ...optionProps } = renderProps;
2112
- return /* @__PURE__ */ jsx13("li", { ...optionProps, children: option[labelField] }, key);
2113
- }
2114
- }
2115
- );
2116
- };
2117
- var AsyncSelectElement2 = ({
2118
- gridProps = {},
2119
- ...props
2120
- }) => {
2121
- return /* @__PURE__ */ jsx13(Grid12, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx13(
2122
- Component11,
2123
- {
2124
- ...props
2125
- }
2126
- ) });
2127
- };
2128
- AsyncSelectElement2.displayName = "AsyncSelectElement";
2129
-
2130
- // src/wrappers/NumberFieldElement/NumberFieldElement.tsx
2131
- import { Grid as Grid13, TextField as TextField8, useForkRef as useForkRef5 } from "@mui/material";
2132
- import { useController as useController13 } from "react-hook-form";
2133
- import { jsx as jsx14 } from "react/jsx-runtime";
2134
- var Component12 = function NumberFieldElement(props) {
2135
- const {
2136
- parseError,
2137
- name,
2138
- control,
2139
- component: TextFieldComponent = TextField8,
2140
- transform,
2141
- fieldType = "text",
2142
- // Default to text type
2143
- defaultValue,
2144
- label,
2145
- placeholder,
2146
- textFieldProps = {},
2147
- variant,
2148
- onChange: customOnChange,
2149
- enableWarnings = process.env.NODE_ENV === "development",
2150
- maxLength,
2151
- ...rest
2152
- } = props;
2153
- const {
2154
- type = "number",
2155
- required,
2156
- helperText,
2157
- inputRef,
2158
- onInput,
2159
- onBlur,
2160
- disabled,
2161
- ...restTextProps
2162
- } = textFieldProps;
2163
- const {
2164
- field,
2165
- fieldState: { error }
2166
- } = useController13({
2167
- name,
2168
- control
2169
- });
2170
- const { value, onChange } = useEnhancedTransform(
2171
- {
2172
- value: field.value,
2173
- onChange: field.onChange,
2174
- transform: transform ? {
2175
- input: transform.input,
2176
- output: transform.output
2177
- } : void 0,
2178
- fieldType: !transform ? type === "number" ? maxLength && maxLength > 5 ? "text" : "number" : fieldType : void 0,
2179
- // Auto-detect number type
2180
- defaultValue,
2181
- enableWarnings
2182
- }
2183
- );
2184
- const handleInputRef = useForkRef5(field.ref, inputRef);
2185
- return /* @__PURE__ */ jsx14(
2186
- TextFieldComponent,
2187
- {
2188
- ...rest,
2189
- ...restTextProps,
2190
- name: field.name,
2191
- value,
2192
- onChange: (event) => {
2193
- const input = event.target.value;
2194
- if (input === "") {
2195
- field.onChange(null);
2196
- }
2197
- onChange(event);
2198
- if (typeof customOnChange === "function") {
2199
- customOnChange(event);
2200
- }
2201
- },
2202
- onBlur: (event) => {
2203
- field.onBlur();
2204
- if (typeof onBlur === "function") {
2205
- onBlur(event);
2206
- }
2207
- },
2208
- onInput: (event) => {
2209
- if (type === "number" && maxLength && event.target.value.length > maxLength) {
2210
- event.target.value = event.target.value.slice(0, maxLength);
2211
- }
2212
- if (typeof onInput === "function") {
2213
- onInput(event);
2214
- }
2215
- },
2216
- onWheel: (e) => {
2217
- e.target.blur();
2218
- },
2219
- onKeyDown: (e) => {
2220
- if (["e", "E", "ArrowDown", "ArrowUp"].includes(e.key)) {
2221
- e.preventDefault();
2222
- }
2223
- },
2224
- disabled,
2225
- label,
2226
- placeholder,
2227
- fullWidth: true,
2228
- required,
2229
- type,
2230
- error: !!error,
2231
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
2232
- inputRef: handleInputRef,
2233
- slotProps: { htmlInput: { maxLength } },
2234
- variant: variant ? variant : "outlined"
2235
- }
2236
- );
2237
- };
2238
- var NumberFieldElement2 = ({
2239
- gridProps = {},
2240
- ...props
2241
- }) => {
2242
- return /* @__PURE__ */ jsx14(Grid13, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx14(Component12, { ...props }) });
2243
- };
2244
-
2245
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
2246
- import { Box, Grid as Grid14, inputBaseClasses } from "@mui/material";
2247
- import {
2248
- MuiOtpInput
2249
- } from "mui-one-time-password-input";
2250
- import { Controller } from "react-hook-form";
2251
-
2252
- // src/wrappers/OTPInputElement/HelperText.tsx
2253
- import FormHelperText4 from "@mui/material/FormHelperText";
2254
- import { jsx as jsx15 } from "react/jsx-runtime";
2255
- function HelperText({
2256
- sx,
2257
- helperText,
2258
- errorMessage,
2259
- disableGutters,
2260
- ...other
2261
- }) {
2262
- if (errorMessage || helperText) {
2263
- return /* @__PURE__ */ jsx15(
2264
- FormHelperText4,
2265
- {
2266
- error: !!errorMessage,
2267
- sx: [
2268
- {
2269
- mx: disableGutters ? 0 : 1.75
2270
- },
2271
- ...Array.isArray(sx) ? sx : [sx]
2272
- ],
2273
- ...other,
2274
- children: errorMessage || helperText
2275
- }
2276
- );
2277
- }
2278
- return null;
2279
- }
2280
-
2281
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
2282
- import { jsx as jsx16, jsxs as jsxs7 } from "react/jsx-runtime";
2283
- var Component13 = function OTPInputElement(props) {
2284
- const {
2285
- // parseError,
2286
- name,
2287
- control,
2288
- slotProps,
2289
- helperText,
2290
- maxSize = 56,
2291
- placeholder = "-",
2292
- ...rest
2293
- } = props;
2294
- return /* @__PURE__ */ jsx16(
2295
- Controller,
2296
- {
2297
- name,
2298
- control,
2299
- render: ({ field, fieldState: { error } }) => /* @__PURE__ */ jsxs7(
2300
- Box,
2301
- {
2302
- ...slotProps?.wrapper,
2303
- sx: [
2304
- {
2305
- display: "flex",
2306
- justifyContent: "center",
2307
- [`& .${inputBaseClasses.input}`]: {
2308
- p: 0,
2309
- height: "auto",
2310
- aspectRatio: "1/1",
2311
- maxWidth: maxSize
2312
- }
2313
- },
2314
- ...Array.isArray(slotProps?.wrapper?.sx) ? slotProps?.wrapper?.sx ?? [] : [slotProps?.wrapper?.sx]
2315
- ],
2316
- children: [
2317
- /* @__PURE__ */ jsx16(
2318
- MuiOtpInput,
2319
- {
2320
- ...field,
2321
- autoFocus: true,
2322
- gap: 1.5,
2323
- length: 4,
2324
- TextFieldsProps: {
2325
- placeholder,
2326
- error: !!error,
2327
- ...slotProps?.textfield
2328
- },
2329
- ...rest
2330
- }
2331
- ),
2332
- /* @__PURE__ */ jsx16(
2333
- HelperText,
2334
- {
2335
- ...slotProps?.helperText,
2336
- errorMessage: error?.message,
2337
- helperText
2338
- }
2339
- )
2340
- ]
2341
- }
2342
- )
2343
- }
2344
- );
2345
- };
2346
- var OTPInputElement2 = ({
2347
- gridProps = {},
2348
- ...props
2349
- }) => {
2350
- return /* @__PURE__ */ jsx16(Grid14, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx16(Component13, { ...props }) });
2351
- };
2352
-
2353
- // src/wrappers/Field/index.ts
2354
- var Field = {
2355
- Text: TextFieldElement2,
2356
- Number: NumberFieldElement2,
2357
- Checkbox: CheckboxElement2,
2358
- Date: DatePickerElement,
2359
- RadioGroup: RadioButtonGroup2,
2360
- Password: PasswordElement,
2361
- Time: TimePickerElement2,
2362
- Select: SelectElement2,
2363
- SelectMulti: SelectMultiElement2,
2364
- SelectCascade: SelectCascadeElement2,
2365
- AsyncSelect: AsyncSelectElement2,
2366
- AsyncMultiSelect: AsyncSelectMultiElement2,
2367
- CheckboxGroup: CheckboxGroupElement,
2368
- OTPInput: OTPInputElement2
2369
- };
2370
-
2371
- export {
2372
- isValidOption,
2373
- normalizeOptions,
2374
- AsyncSelectMultiElement2 as AsyncSelectMultiElement,
2375
- CheckboxElement2 as CheckboxElement,
2376
- CheckboxGroupElement,
2377
- readDatePickerValueAsDate,
2378
- useDatePickerValue,
2379
- useDatePickerValidation,
2380
- useDatePickerStyles,
2381
- DatePickerElementCore,
2382
- DatePickerElement,
2383
- isValidDate,
2384
- isParsableDateString,
2385
- createDateInputTransform,
2386
- createDateOutputTransform,
2387
- createDefaultDatePickerConfig,
2388
- extractErrorMessage,
2389
- createStableKey,
2390
- PasswordElement,
2391
- RadioButtonGroup2 as RadioButtonGroup,
2392
- SelectCascadeElement2 as SelectCascadeElement,
2393
- SelectElement2 as SelectElement,
2394
- SelectMultiElement2 as SelectMultiElement,
2395
- TextFieldElement2 as TextFieldElement,
2396
- TimePickerElement2 as TimePickerElement,
2397
- Field
2398
- };
2399
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL3R5cGVzL2NvbW1vbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdC9Bc3luY011bHRpU2VsZWN0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hFbGVtZW50L0NoZWNrYm94RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnRDb3JlLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclN0eWxlcy50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCAiLi4vc3JjL3dyYXBwZXJzL1Bhc3N3b3JkRWxlbWVudC9QYXNzd29yZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdEVsZW1lbnQvU2VsZWN0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdE11bHRpRWxlbWVudC9TZWxlY3RNdWx0aUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UaW1lUGlja2VyRWxlbWVudC9UaW1lUGlja2VyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0FzeW5jU2VsZWN0L2luZGV4LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvTnVtYmVyRmllbGRFbGVtZW50L051bWJlckZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL09UUElucHV0RWxlbWVudC9PVFBJbnB1dEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9PVFBJbnB1dEVsZW1lbnQvSGVscGVyVGV4dC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0ZpZWxkL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvbW1vbiB0eXBlIGRlZmluaXRpb25zIGZvciB3cmFwcGVyIGNvbXBvbmVudHNcbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIEJhc2Ugb3B0aW9uIHR5cGUgZm9yIHNlbGVjdC1iYXNlZCBjb21wb25lbnRzXG4gKlxuICogQHRlbXBsYXRlIFYgLSBUaGUgdmFsdWUgdHlwZSAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbilcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZU9wdGlvbjxWID0gc3RyaW5nIHwgbnVtYmVyPiB7XG4gIC8qKlxuICAgKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3B0aW9uXG4gICAqL1xuICBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIG9wdGlvblxuICAgKi9cbiAgVmFsdWU6IFY7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZsZXhpYmxlIG9wdGlvbiB0eXBlIHRoYXQgZXh0ZW5kcyBiYXNlIG9wdGlvbiB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG9iamVjdFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRmxleGlibGVPcHRpb248XG4gIFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuPiA9IFQgJiBCYXNlT3B0aW9uO1xuXG4vKipcbiAqIE9wdGlvbiB0eXBlIHdpdGggY3VzdG9taXphYmxlIGtleSBuYW1lc1xuICogVXNlZnVsIGZvciBjb21wb25lbnRzIHRoYXQgYWNjZXB0IGN1c3RvbSBsYWJlbEZpZWxkL3ZhbHVlRmllbGQgcHJvcHNcbiAqXG4gKiBAdGVtcGxhdGUgVFZhbHVlS2V5IC0gVGhlIHByb3BlcnR5IG5hbWUgZm9yIHZhbHVlXG4gKiBAdGVtcGxhdGUgVExhYmVsS2V5IC0gVGhlIHByb3BlcnR5IG5hbWUgZm9yIGxhYmVsXG4gKiBAdGVtcGxhdGUgVERpc2FibGVkS2V5IC0gVGhlIHByb3BlcnR5IG5hbWUgZm9yIGRpc2FibGVkIGZsYWdcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEN1c3RvbUtleU9wdGlvbjxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PiAmXG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIExlZ2FjeSBvcHRpb24gdHlwZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGVcbiAqIFVzZXMgVmFsdWUvTGFiZWwgbmFtaW5nIGNvbnZlbnRpb25cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQmFzZU9wdGlvbiBvciBGbGV4aWJsZU9wdGlvbiBpbnN0ZWFkXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVnYWN5T3B0aW9uIHtcbiAgLyoqXG4gICAqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb24gKGNhcGl0YWxpemVkIGtleSBuYW1lKVxuICAgKi9cbiAgTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gKGNhcGl0YWxpemVkIGtleSBuYW1lKVxuICAgKi9cbiAgVmFsdWU6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBEaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaXMgYSB2YWxpZCBvcHRpb25cbiAqXG4gKiBAcGFyYW0gVmFsdWUgLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBvcHRpb24gb2JqZWN0XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE9wdGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEJhc2VPcHRpb24ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICdMYWJlbCcgaW4gdmFsdWUgJiZcbiAgICAnVmFsdWUnIGluIHZhbHVlICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5MYWJlbCA9PT0gJ3N0cmluZycgJiZcbiAgICAodHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuVmFsdWUgPT09ICdudW1iZXInIHx8XG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLlZhbHVlID09PSAnYm9vbGVhbicpXG4gICk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIG5vcm1hbGl6ZSBvcHRpb25zIHRvIEJhc2VPcHRpb24gZm9ybWF0XG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGFycmF5IHRvIG5vcm1hbGl6ZVxuICogQHBhcmFtIGxhYmVsRmllbGQgLSBDdXN0b20gbGFiZWwgZmllbGQgbmFtZSBpbiBvcHRpb24gb2JqZWN0c1xuICogQHBhcmFtIHZhbHVlRmllbGQgLSBDdXN0b20gdmFsdWUgZmllbGQgbmFtZSBpbiBvcHRpb24gb2JqZWN0c1xuICogQHJldHVybnMgTm9ybWFsaXplZCBvcHRpb25zIGFycmF5XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplT3B0aW9uczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvcHRpb25zOiBUW10sXG4gIGxhYmVsRmllbGQgPSAnTGFiZWwnLFxuICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJ1xuKTogQmFzZU9wdGlvbltdIHtcbiAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoe1xuICAgIExhYmVsOiBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGRdID8/ICcnKSxcbiAgICBWYWx1ZTogb3B0aW9uW3ZhbHVlRmllbGRdIGFzIHN0cmluZyB8IG51bWJlcixcbiAgICBkaXNhYmxlZDogQm9vbGVhbihvcHRpb24uZGlzYWJsZWQpLFxuICB9KSk7XG59XG4iLCAiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBkZWJvdW5jZSxcbiAgR3JpZCxcbiAgVGV4dEZpZWxkLFxuICB1c2VUaGVtZSxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgbWF0Y2ggZnJvbSAnYXV0b3N1Z2dlc3QtaGlnaGxpZ2h0L21hdGNoJztcbmltcG9ydCBwYXJzZSBmcm9tICdhdXRvc3VnZ2VzdC1oaWdobGlnaHQvcGFyc2UnO1xuaW1wb3J0IFJlYWN0LCB7XG4gIHVzZVN0YXRlLFxuICB1c2VSZWYsXG4gIHVzZU1lbW8sXG4gIHVzZUVmZmVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIEZyYWdtZW50LFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEhUTUxBdHRyaWJ1dGVzLCBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY011bHRpU2VsZWN0RWxlbWVudFByb3BzLCBPcHRpb25PYmplY3QgfSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY011bHRpU2VsZWN0UGF5bG9hZCB9IGZyb20gJ0AvdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBBc3luY1NlbGVjdE11bHRpRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KFxuICBwcm9wczogQXN5bmNNdWx0aVNlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBUT3B0aW9uXG4gID5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIHF1ZXJ5Rm4sXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScgYXMgVFZhbHVlS2V5LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9ucywgc2V0U2VsZWN0ZWRPcHRpb25zXSA9IHVzZVN0YXRlPFRPcHRpb25bXT4oW10pO1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPHJlYWRvbmx5IFRPcHRpb25bXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3QgbG9hZGVkVmFsdWVzUmVmID0gdXNlUmVmPFRPcHRpb25bXT4oW10pO1xuICBjb25zdCBpc0luaXRpYWxQb3B1bGF0aW9uQWN0aXZlID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBpbml0aWFsTG9hZENvbXBsZXRlUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgLy8gU3RvcmUgc2VsZWN0ZWQgb3B0aW9ucyBpbiBhIHJlZiBzbyBFZmZlY3QgMiBjYW4gYWNjZXNzIHdpdGhvdXQgZGVwZW5kZW5jeVxuICBjb25zdCBzZWxlY3RlZE9wdGlvbnNSZWYgPSB1c2VSZWY8VE9wdGlvbltdPihbXSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKSA9PiAob3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUZpZWxkXSkgOiAnJyksXG4gICAgW3ZhbHVlRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKSA9PiAob3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSkgOiAnJyksXG4gICAgW2xhYmVsRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoXG4gICAgICAgIChcbiAgICAgICAgICBwYXlsb2FkOiBBc3luY011bHRpU2VsZWN0UGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHZvaWRcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgcXVlcnlGbihwYXlsb2FkKS50aGVuKGMgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soYyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBjICYmXG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoKGMgYXMgeyBkYXRhOiByZWFkb25seSBUT3B0aW9uW10gfSkuZGF0YSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICAgICAgICAoYyBhcyB7IGRhdGE6IHJlYWRvbmx5IFRPcHRpb25bXSB9KS5kYXRhIGFzIHJlYWRvbmx5IFRPcHRpb25bXVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgYyAmJlxuICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KChjIGFzIHsgRGF0YTogcmVhZG9ubHkgVE9wdGlvbltdIH0pLkRhdGEpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgKGMgYXMgeyBEYXRhOiByZWFkb25seSBUT3B0aW9uW10gfSkuRGF0YSBhcyByZWFkb25seSBUT3B0aW9uW11cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgNDAwXG4gICAgICApLFxuICAgIFtxdWVyeUZuXVxuICApO1xuXG4gIC8vIFN5bmMgcmVmIHdoZW5ldmVyIHNlbGVjdGVkT3B0aW9ucyBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2VsZWN0ZWRPcHRpb25zUmVmLmN1cnJlbnQgPSBzZWxlY3RlZE9wdGlvbnM7XG4gIH0sIFtzZWxlY3RlZE9wdGlvbnNdKTtcblxuICAvLyBFZmZlY3QgMTogU3luYyB3aXRoIGV4dGVybmFsIGZpZWxkLnZhbHVlIGNoYW5nZXMgZnJvbSByZWFjdC1ob29rLWZvcm0gKElOSVRJQUwgTE9BRCBPTkxZKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKSA/IGZpZWxkLnZhbHVlIDogW107XG5cbiAgICAvLyBDaGVjayBpZiBpbml0aWFsIGxvYWQgaXMgY29tcGxldGUgYW5kIGN1cnJlbnQgZm9ybSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGxvYWRlZCBvbmVzLlxuICAgIC8vIElmIHNvLCBubyBuZWVkIHRvIHJlZmV0Y2ggZm9yIGluaXRpYWwgcG9wdWxhdGlvbi5cbiAgICBpZiAoXG4gICAgICBpbml0aWFsTG9hZENvbXBsZXRlUmVmLmN1cnJlbnQgJiZcbiAgICAgIEpTT04uc3RyaW5naWZ5KGZvcm1WYWx1ZXMpID09PSBKU09OLnN0cmluZ2lmeShsb2FkZWRWYWx1ZXNSZWYuY3VycmVudClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZm9ybSB2YWx1ZXMsIHJlc2V0IGFuZCBtYXJrIGluaXRpYWwgbG9hZCBhcyBjb21wbGV0ZS5cbiAgICBpZiAoZm9ybVZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNldFNlbGVjdGVkT3B0aW9ucyhbXSk7XG4gICAgICBzZXRPcHRpb25zKFtdKTtcbiAgICAgIGxvYWRlZFZhbHVlc1JlZi5jdXJyZW50ID0gW107XG4gICAgICBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBpbml0aWFsTG9hZENvbXBsZXRlUmVmLmN1cnJlbnQgPSB0cnVlOyAvLyBNYXJrIGFzIGNvbXBsZXRlIGFzIHRoZXJlJ3Mgbm90aGluZyB0byBmZXRjaFxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSBwcm9jZWVkIGlmIGZvcm1WYWx1ZXMgYXJlIHByZXNlbnQgYW5kIHdlIGhhdmVuJ3QgY29tcGxldGVkIHRoZSBpbml0aWFsIGxvYWQgZm9yIHRoZXNlIHNwZWNpZmljIHZhbHVlc1xuICAgIGxldCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICBpc0luaXRpYWxQb3B1bGF0aW9uQWN0aXZlLmN1cnJlbnQgPSB0cnVlO1xuICAgIC8vIFNldCBsb2FkZWRWYWx1ZXNSZWYgaW1tZWRpYXRlbHkgdG8gcHJldmVudCByZS10cmlnZ2VyaW5nIHdpdGggdGhlIHNhbWUgdmFsdWVzXG4gICAgbG9hZGVkVmFsdWVzUmVmLmN1cnJlbnQgPSBmb3JtVmFsdWVzO1xuICAgIC8vIE1hcmsgaW5pdGlhbCBsb2FkIGFzIGNvbXBsZXRlIHByb2FjdGl2ZWx5IGJlZm9yZSBmZXRjaGluZyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzXG4gICAgaW5pdGlhbExvYWRDb21wbGV0ZVJlZi5jdXJyZW50ID0gdHJ1ZTtcblxuICAgIGZldGNoRGF0YSh7IFF1ZXJ5OiBudWxsLCBTZWxlY3RlZFZhbHVlOiBmb3JtVmFsdWVzIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBjb25zdCBmZXRjaGVkT3B0aW9ucyA9IHJlc3VsdHMgfHwgW107XG5cbiAgICAgICAgc2V0U2VsZWN0ZWRPcHRpb25zKFsuLi5mZXRjaGVkT3B0aW9uc10pO1xuICAgICAgICBzZXRPcHRpb25zKGZldGNoZWRPcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICBpc0luaXRpYWxQb3B1bGF0aW9uQWN0aXZlLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbZmllbGQudmFsdWUsIGZldGNoRGF0YV0pO1xuXG4gIC8vIEVmZmVjdCAyOiBIYW5kbGUgdXNlciBzZWFyY2ggaW5wdXRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBEb24ndCBzZWFyY2ggZHVyaW5nIGluaXRpYWwgcG9wdWxhdGlvblxuICAgIGlmIChpc0luaXRpYWxQb3B1bGF0aW9uQWN0aXZlLmN1cnJlbnQgfHwgIWluaXRpYWxMb2FkQ29tcGxldGVSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGlucHV0IGlzIGVtcHR5LCBqdXN0IHNob3cgdGhlIHNlbGVjdGVkIG9wdGlvbnNcbiAgICBpZiAoIWlucHV0VmFsdWUpIHtcbiAgICAgIC8vIElmIG5vIG9wdGlvbnMgYXJlIHNlbGVjdGVkLCBjbGVhciB0aGUgb3B0aW9ucyB0byBkaXNwbGF5IFwibm9PcHRpb25zVGV4dFwiXG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb25zUmVmLmN1cnJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHNldE9wdGlvbnMoW10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBzaG93IHRoZSBzZWxlY3RlZCBvcHRpb25zXG4gICAgICAgIHNldE9wdGlvbnMoc2VsZWN0ZWRPcHRpb25zUmVmLmN1cnJlbnQpO1xuICAgICAgfVxuXG4gICAgICBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCA9IG51bGw7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGZldGNoIGlmIHRoZSBpbnB1dCB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIGlmIChpbnB1dFZhbHVlID09PSBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgIGZldGNoRGF0YSh7IFF1ZXJ5OiBpbnB1dFZhbHVlLCBTZWxlY3RlZFZhbHVlOiBudWxsIH0sIHNlYXJjaFJlc3VsdHMgPT4ge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gc2VhcmNoUmVzdWx0cyB8fCBbXTtcbiAgICAgICAgLy8gVXNlIHJlZiB0byBnZXQgY3VycmVudCBzZWxlY3RlZCBvcHRpb25zIHdpdGhvdXQgYWRkaW5nIHRvIGRlcGVuZGVuY2llc1xuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWQgPSBzZWxlY3RlZE9wdGlvbnNSZWYuY3VycmVudDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25JZHMgPSBuZXcgU2V0KFxuICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZC5tYXAob3B0ID0+IGdldE9wdGlvblZhbHVlKG9wdCkpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gWy4uLmN1cnJlbnRTZWxlY3RlZF07XG5cbiAgICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKCFzZWxlY3RlZE9wdGlvbklkcy5oYXMoZ2V0T3B0aW9uVmFsdWUocmVzdWx0KSkpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzZXRPcHRpb25zKGNvbWJpbmVkKTtcbiAgICAgICAgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQgPSBpbnB1dFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuICAgIC8vIENSSVRJQ0FMOiBSZW1vdmVkIHNlbGVjdGVkT3B0aW9ucyBmcm9tIGRlcGVuZGVuY2llcyAtIHVzZSByZWYgaW5zdGVhZFxuICB9LCBbaW5wdXRWYWx1ZSwgZmV0Y2hEYXRhLCBnZXRPcHRpb25WYWx1ZV0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChfOiBTeW50aGV0aWNFdmVudCwgbmV3U2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10pID0+IHtcbiAgICBzZXRTZWxlY3RlZE9wdGlvbnMobmV3U2VsZWN0ZWRPcHRpb25zKTtcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXdTZWxlY3RlZE9wdGlvbnMubWFwKGMgPT4gY1t2YWx1ZUZpZWxkXSk7XG5cbiAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXMubGVuZ3RoID09PSAwID8gbnVsbCA6IG5ld1ZhbHVlcyk7XG4gICAgbG9hZGVkVmFsdWVzUmVmLmN1cnJlbnQgPSBuZXdWYWx1ZXMgYXMgdW5rbm93biBhcyBUT3B0aW9uW107XG4gICAgc2V0T3B0aW9ucyhuZXdTZWxlY3RlZE9wdGlvbnMpO1xuICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIC8vIENsZWFyIGxhc3Qgc2VhcmNoIHRlcm0gd2hlbiBzZWxlY3Rpb24gY2hhbmdlc1xuICAgIGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgfTtcblxuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGRpc2FibGVkID8/IGZhbHNlO1xuICB9LCBbZGlzYWJsZWRdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIG11bHRpcGxlXG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbCkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsKVxuICAgICAgfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtzZWxlY3RlZE9wdGlvbnN9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIGZpbHRlck9wdGlvbnM9e3ggPT4geH1cbiAgICAgIG5vT3B0aW9uc1RleHQ9XCJUeXBlIFNvbWV0aGluZy4uLlwiXG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBvbklucHV0Q2hhbmdlPXsoXywgbmV3SW5wdXRWYWx1ZSkgPT4gc2V0SW5wdXRWYWx1ZShuZXdJbnB1dFZhbHVlKX1cbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIElucHV0UHJvcHM9e3tcbiAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICApLFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHJlbmRlck9wdGlvbj17KHByb3BzLCBvcHRpb24sIHN0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCAuLi5vcHRpb25Qcm9wcyB9ID1cbiAgICAgICAgICBwcm9wcyBhcyBIVE1MQXR0cmlidXRlczxIVE1MTElFbGVtZW50PiAmIHsga2V5OiBzdHJpbmcgfTtcbiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSBnZXRPcHRpb25MYWJlbChvcHRpb24pO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gbWF0Y2gob3B0aW9uTGFiZWwsIHN0YXRlLmlucHV0VmFsdWUsIHtcbiAgICAgICAgICBpbnNpZGVXb3JkczogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2Uob3B0aW9uTGFiZWwsIG1hdGNoZXMpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIGtleT17a2V5fSB7Li4ub3B0aW9uUHJvcHN9PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAge3BhcnRzLm1hcCgocGFydCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHBhcnQuaGlnaGxpZ2h0ID8gNzAwIDogNDAwLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7cGFydC50ZXh0fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAgIHsuLi5yZXN0fVxuICAgIC8+XG4gICk7XG59O1xuXG5jb25zdCBBc3luY1NlbGVjdE11bHRpRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KHtcbiAgZ3JpZFByb3BzLFxuICAuLi5wcm9wc1xufTogQXN5bmNNdWx0aVNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFRPcHRpb25cbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICBpZiAoZ3JpZFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxHcmlkXG4gICAgICAgIHsuLi57IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSwgLi4uZ3JpZFByb3BzIH19XG4gICAgICA+XG4gICAgICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+XG4gICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAvPlxuICAgICAgPC9HcmlkPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+IHsuLi5wcm9wc30gLz5cbiAgKTtcbn07XG5cbkFzeW5jU2VsZWN0TXVsdGlFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0FzeW5jU2VsZWN0TXVsdGknO1xuXG5leHBvcnQgeyBBc3luY1NlbGVjdE11bHRpRWxlbWVudCB9O1xuIiwgImltcG9ydCB7XG4gIENoZWNrYm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoLCBGaWVsZFZhbHVlcywgUGF0aFZhbHVlIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IENoZWNrYm94RWxlbWVudFByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBsYWJlbFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgcGFyc2VFcnJvcixcbiAgICB0cmFuc2Zvcm0sXG4gICAgZGlzYWJsZWQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGlmIChmaWVsZC52YWx1ZSA9PSBudWxsIHx8IGZpZWxkLnZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgIGZpZWxkLm9uQ2hhbmdlKGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGN1c3RvbU91dHB1dFRyYW5zZm9ybSA9IHRyYW5zZm9ybT8ub3V0cHV0O1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgYm9vbGVhbj4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogdmFsdWUgPT4gISF2YWx1ZSxcbiAgICAgIG91dHB1dDpcbiAgICAgICAgdHlwZW9mIGN1c3RvbU91dHB1dFRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gKGV2ZW50T3JWYWx1ZSwgX3ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEFkYXB0ZXI6IEV4dHJhY3QgZXZlbnQgYW5kIGNoZWNrZWQgZnJvbSB0aGUgY2hlY2tib3ggb25DaGFuZ2Ugc2lnbmF0dXJlXG4gICAgICAgICAgICAgIC8vIENoZWNrYm94RWxlbWVudCBwYXNzZXMgKGV2ZW50LCBjaGVja2VkKSwgYnV0IHVzZVRyYW5zZm9ybSBleHBlY3RzIChldmVudE9yVmFsdWUsIHZhbHVlKVxuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50T3JWYWx1ZSBhcyBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU91dHB1dFRyYW5zZm9ybShldmVudCwgY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiAoZXZlbnRPclZhbHVlLCBfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZXh0cmFjdCBjaGVja2VkIHN0YXRlIGZyb20gdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrZWQgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIGNoZWNrZWQ6IGJvb2xlYW5cbiAgKSA9PiB7XG4gICAgb25DaGFuZ2UoZXZlbnQsIGNoZWNrZWQpO1xuICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGlzcGxheUVycm9yOiBSZWFjdE5vZGUgPSBlcnJvclxuICAgID8gdHlwZW9mIHBhcnNlRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcGFyc2VFcnJvcihlcnJvcilcbiAgICAgIDogZXJyb3IubWVzc2FnZVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0gZGlzYWJsZWQ9e2Rpc2FibGVkfT5cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgIGxhYmVsPXtsYWJlbCB8fCAnJ31cbiAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICAgIGNvbG9yPXtyZXN0LmNvbG9yIHx8ICdwcmltYXJ5J31cbiAgICAgICAgICAgICAgY2hlY2tlZD17dmFsdWV9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgeyhkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dCkgJiYgKFxuICAgICAgICA8Rm9ybUhlbHBlclRleHQgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtkaXNwbGF5RXJyb3IgfHwgaGVscGVyVGV4dH1cbiAgICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBDaGVja2JveCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgZ3JpZCBsYXlvdXQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIGNoZWNrYm94IGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIHZhbHVlIHRyYW5zZm9ybWF0aW9uLCBhbmQgb3B0aW9uYWwgR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dHMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uIHdpdGggdXNlQ29udHJvbGxlclxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nIHN1cHBvcnRcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gd2l0aCB1c2VUcmFuc2Zvcm0gaG9vayBmb3IgYm9vbGVhbiB2YWx1ZXNcbiAqIC0gQ3VzdG9taXphYmxlIGxhYmVsIGFuZCBwb3NpdGlvbmluZ1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyIHdpdGggcmVzcG9uc2l2ZSBkZXNpZ25cbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eSB3aXRoIGdlbmVyaWMgY29uc3RyYWludHNcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydCB3aXRoIHByb3BlciB0aGVtaW5nXG4gKiAtIEhlbHBlciB0ZXh0IHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgY29udGV4dFxuICogLSBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb25cbiAqIC0gU2ltcGxlIGJvb2xlYW4gdmFsdWUgaGFuZGxpbmcgd2l0aCBvcHRpb25hbCBjdXN0b20gdHJhbnNmb3Jtc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWNjZXB0VGVybXNcIlxuICogICBsYWJlbD1cIkkgYWdyZWUgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWxpZGF0aW9uIGFuZCBoZWxwZXIgdGV4dDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwibmV3c2xldHRlclwiXG4gKiAgIGxhYmVsPVwiU3Vic2NyaWJlIHRvIG5ld3NsZXR0ZXJcIlxuICogICBoZWxwZXJUZXh0PVwiWW91IGNhbiB1bnN1YnNjcmliZSBhdCBhbnkgdGltZVwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIGFjY2VwdCB0byBjb250aW51ZScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0IGFuZCBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc1B1YmxpY1wiXG4gKiAgIGxhYmVsPVwiTWFrZSB0aGlzIHB1YmxpY1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBsYWJlbFByb3BzPXt7IHN4OiB7IGZvbnRXZWlnaHQ6ICdib2xkJyB9IH19XG4gKiAgIHN4PXt7IGNvbG9yOiAncHJpbWFyeS5tYWluJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbHVlIHRyYW5zZm9ybWF0aW9uIChzdHJpbmcgdG8gYm9vbGVhbik6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInN0YXR1c1wiXG4gKiAgIGxhYmVsPVwiQWN0aXZlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPT09ICdhY3RpdmUnLFxuICogICAgIG91dHB1dDogKGNoZWNrZWQpID0+IGNoZWNrZWQgPyAnYWN0aXZlJyA6ICdpbmFjdGl2ZSdcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogU2ltcGxlIGJvb2xlYW4gZmllbGQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzRW5hYmxlZFwiXG4gKiAgIGxhYmVsPVwiRW5hYmxlIGZlYXR1cmVcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZXJyb3IgcGFyc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb246XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRlcm1zXCJcbiAqICAgbGFiZWw9XCJBY2NlcHQgVGVybXNcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHQoYHZhbGlkYXRpb24uJHtlcnJvci50eXBlfWAsIHsgZmllbGQ6ICdUZXJtcycgfSl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDaGVja2JveEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lPiB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuZXhwb3J0IHsgQ2hlY2tib3hFbGVtZW50IH07XG5cbmV4cG9ydCB0eXBlIHsgQ2hlY2tib3hFbGVtZW50UHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIENoZWNrYm94UHJvcHMsXG4gIEZvcm1Db250cm9sTGFiZWxQcm9wcyxcbiAgRm9ybUxhYmVsUHJvcHMsXG4gIEdyaWRQcm9wcyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBDaGVja2JveCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEZvcm1MYWJlbCxcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBDaGVja2JveEdyb3VwIGNvbXBvbmVudFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSBhcnJheSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5cbi8vIFR5cGUgZm9yIHByaW1pdGl2ZSB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBhcyByYWRpbyBidXR0b24gdmFsdWVzXG50eXBlIFByaW1pdGl2ZVZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuLy8gQ29uc3RyYWludCB0byBlbnN1cmUgb3B0aW9uIG9iamVjdHMgaGF2ZSB0aGUgcmVxdWlyZWQga2V5c1xudHlwZSBPcHRpb25PYmplY3Q8XG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0gUmVjb3JkPFRWYWx1ZUtleSwgUHJpbWl0aXZlVmFsdWU+ICZcbiAgUmVjb3JkPFRMYWJlbEtleSwgc3RyaW5nPiAmXG4gIFBhcnRpYWw8UmVjb3JkPFREaXNhYmxlZEtleSwgYm9vbGVhbj4+O1xuXG5leHBvcnQgdHlwZSBDaGVja2JveEdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPiA9IE9taXQ8Q2hlY2tib3hQcm9wcywgJ25hbWUnPiAmIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcblxuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcblxuICAvKipcbiAgICogTGFiZWwgZm9yIHRoZSBjaGVja2JveCBncm91cFxuICAgKi9cbiAgbGFiZWw/OiBGb3JtQ29udHJvbExhYmVsUHJvcHNbJ2xhYmVsJ107XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIEZvcm1Db250cm9sTGFiZWxcbiAgICovXG4gIGxhYmVsUHJvcHM/OiBPbWl0PEZvcm1Db250cm9sTGFiZWxQcm9wcywgJ2xhYmVsJyB8ICdjb250cm9sJz47XG5cbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlclxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcblxuICBvcHRpb25zOiBUT3B0aW9uW107XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgZm9ybUxhYmVsUHJvcHM/OiBPbWl0PEZvcm1MYWJlbFByb3BzLCAncmVxdWlyZWQnIHwgJ2Vycm9yJz47XG5cbiAgbGFiZWxLZXk/OiBUTGFiZWxLZXk7XG4gIHZhbHVlS2V5PzogVFZhbHVlS2V5O1xuICBkaXNhYmxlZEtleT86IFREaXNhYmxlZEtleTtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIENoZWNrYm94R3JvdXA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPihcbiAgcHJvcHM6IENoZWNrYm94R3JvdXBQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVE9wdGlvbixcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICByZXF1aXJlZCxcbiAgICBmb3JtTGFiZWxQcm9wcyxcbiAgICBsYWJlbFByb3BzLFxuICAgIGxhYmVsS2V5ID0gJ0xhYmVsJyBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVLZXkgPSAnVmFsdWUnIGFzIFRWYWx1ZUtleSxcbiAgICBvcHRpb25zLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQ6IHJlc3QuZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHNlbGVjdGVkVmFsdWVzQXNTdHJpbmcgPSAoXG4gICAgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgPyBmaWVsZC52YWx1ZSA6IFtdXG4gICkubWFwKFN0cmluZyk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlZFZhbHVlU3RyaW5nID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG5cbiAgICAgIGNvbnN0IG5ld1NlbGVjdGVkVmFsdWVzU3RyaW5nID0gaXNDaGVja2VkXG4gICAgICAgID8gWy4uLnNlbGVjdGVkVmFsdWVzQXNTdHJpbmcsIGNoYW5nZWRWYWx1ZVN0cmluZ11cbiAgICAgICAgOiBzZWxlY3RlZFZhbHVlc0FzU3RyaW5nLmZpbHRlcih2ID0+IHYgIT09IGNoYW5nZWRWYWx1ZVN0cmluZyk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnNBcmVOdW1lcmljID1cbiAgICAgICAgb3B0aW9ucy5sZW5ndGggPiAwICYmIHR5cGVvZiBvcHRpb25zWzBdW3ZhbHVlS2V5XSA9PT0gJ251bWJlcic7XG5cbiAgICAgIGlmIChvcHRpb25zQXJlTnVtZXJpYykge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXNBc051bWJlcnMgPSBuZXdTZWxlY3RlZFZhbHVlc1N0cmluZ1xuICAgICAgICAgIC5tYXAodiA9PiBwYXJzZUludCh2LCAxMCkpXG4gICAgICAgICAgLmZpbHRlcih2ID0+ICFpc05hTih2KSk7XG5cbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWVzQXNOdW1iZXJzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1NlbGVjdGVkVmFsdWVzU3RyaW5nKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZCwgb3B0aW9ucywgdmFsdWVLZXksIHNlbGVjdGVkVmFsdWVzQXNTdHJpbmddXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAge2xhYmVsICYmIChcbiAgICAgICAgPEZvcm1MYWJlbCB7Li4uZm9ybUxhYmVsUHJvcHN9IHJlcXVpcmVkPXtyZXF1aXJlZH0gZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgPC9Gb3JtTGFiZWw+XG4gICAgICApfVxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIHtvcHRpb25zICYmXG4gICAgICAgICAgb3B0aW9ucy5tYXAob3B0aW9uID0+IChcbiAgICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICAgIGtleT17YCR7b3B0aW9uW3ZhbHVlS2V5XX1gfVxuICAgICAgICAgICAgICBsYWJlbD17b3B0aW9uW2xhYmVsS2V5XX1cbiAgICAgICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgey4uLnJlc3R9XG4gICAgICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCAncHJpbWFyeSd9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uW3ZhbHVlS2V5XX1cbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkVmFsdWVzQXNTdHJpbmcuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgIFN0cmluZyhvcHRpb25bdmFsdWVLZXldKVxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT57ZXJyb3IubWVzc2FnZX08L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIENoZWNrYm94R3JvdXAgY29tcG9uZW50IGZvciBtdWx0aXBsZSBjaGVja2JveCBzZWxlY3Rpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBncm91cCBvZiBjaGVja2JveGVzIHRoYXQgd29yayBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogbWFuYWdpbmcgYW4gYXJyYXkgb2Ygc2VsZWN0ZWQgdmFsdWVzIHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBNdWx0aXBsZSBjaGVja2JveCBzZWxlY3Rpb24gd2l0aCBhcnJheSB2YWx1ZSBtYW5hZ2VtZW50XG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0XG4gKiAtIE5hTiB2YWxpZGF0aW9uIGZvciBudW1lcmljIHZhbHVlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94R3JvdXBcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInNlbGVjdGVkQ2F0ZWdvcmllc1wiXG4gKiAgIG9wdGlvbnM9e1tcbiAqICAgICB7IFZhbHVlOiAxLCBMYWJlbDogJ0NhdGVnb3J5IDEnIH0sXG4gKiAgICAgeyBWYWx1ZTogMiwgTGFiZWw6ICdDYXRlZ29yeSAyJyB9LFxuICogICAgIHsgVmFsdWU6IDMsIExhYmVsOiAnQ2F0ZWdvcnkgMycgfSxcbiAqICAgXX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEdyb3VwXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwZXJtaXNzaW9uc1wiXG4gKiAgIG9wdGlvbnM9e3Blcm1pc3Npb25PcHRpb25zfVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgZGlzYWJsZWQ9eyFoYXNFZGl0UGVybWlzc2lvbn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdmFsdWUgYXJyYXkgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2hlY2tib3hHcm91cEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hHcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUT3B0aW9uLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVERpc2FibGVkS2V5XG4+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuQ2hlY2tib3hHcm91cEVsZW1lbnQuZGlzcGxheU5hbWUgPSAnQ2hlY2tib3hHcm91cCc7XG5cbmV4cG9ydCB7IENoZWNrYm94R3JvdXBFbGVtZW50IH07XG4iLCAiaW1wb3J0IHsgR3JpZCB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkVmFsdWVzLFxuICBGaWVsZFBhdGgsXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH0gZnJvbSBcIi4vRGF0ZVBpY2tlckVsZW1lbnRDb3JlXCI7XG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJFbGVtZW50UHJvcHMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEEgZnVsbHktZmVhdHVyZWQsIHR5cGUtc2FmZSBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgZm9yIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBjb21iaW5lcyB0aGUgY29yZSBkYXRlIHBpY2tlciBmdW5jdGlvbmFsaXR5IHdpdGggb3B0aW9uYWwgR3JpZCBsYXlvdXQgd3JhcHBpbmcsXG4gKiBwcm92aWRpbmcgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgZm9ybS1iYXNlZCBkYXRlIHNlbGVjdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBzdXBwb3J0LlxuICpcbiAqIEtleSBGZWF0dXJlczpcbiAqIC0gXHVEODNDXHVERkFGICoqVHlwZSBTYWZldHkqKjogRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSBmb3IgZm9ybSBmaWVsZCB0eXBlcyBhbmQgZGF0ZSB2YWx1ZXNcbiAqIC0gXHVEODNEXHVERDI3ICoqUmVhY3QgSG9vayBGb3JtIEludGVncmF0aW9uKio6IFNlYW1sZXNzIGludGVncmF0aW9uIHdpdGggcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb25cbiAqIC0gXHVEODNDXHVERkE4ICoqVGhlbWluZyoqOiBBdXRvbWF0aWMgYWRhcHRhdGlvbiB0byBNVUkgdGhlbWUgd2l0aCBjdXN0b21pemFibGUgc3R5bGVzXG4gKiAtIFx1MjY3RiAqKkFjY2Vzc2liaWxpdHkqKjogV0NBRy1jb21wbGlhbnQgd2l0aCBwcm9wZXIgQVJJQSBhdHRyaWJ1dGVzIGFuZCBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gKiAtIFx1RDgzRFx1REU4MCAqKlBlcmZvcm1hbmNlKio6IE9wdGltaXplZCB3aXRoIG1lbW9pemF0aW9uIGFuZCBlZmZpY2llbnQgcmUtcmVuZGVyaW5nXG4gKiAtIFx1RDgzRFx1RENGMSAqKlJlc3BvbnNpdmUqKjogQnVpbHQtaW4gR3JpZCBsYXlvdXQgd2l0aCBjb25maWd1cmFibGUgYnJlYWtwb2ludHNcbiAqIC0gXHVEODNEXHVERUUxXHVGRTBGICoqVmFsaWRhdGlvbioqOiBDb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZXNcbiAqIC0gXHVEODNEXHVERDA0ICoqVHJhbnNmb3JtYXRpb24qKjogRmxleGlibGUgdmFsdWUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiBmb3JtIGFuZCBwaWNrZXIgZm9ybWF0c1xuICogLSBcdUQ4M0RcdURDREEgKipEZXZlbG9wZXIgRXhwZXJpZW5jZSoqOiBSaWNoIFR5cGVTY3JpcHQgSW50ZWxsaVNlbnNlIGFuZCBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBhdXRvbWF0aWMgR3JpZCB3cmFwcGVyOlxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VGb3JtIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbiAqIGltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnQGdud2Vic29mdC91aS93cmFwcGVycyc7XG4gKlxuICogZnVuY3Rpb24gTXlGb3JtKCkge1xuICogICBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm08eyBiaXJ0aERhdGU6IHN0cmluZyB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiRGF0ZSBvZiBCaXJ0aFwiXG4gKiAgICAgICByZXF1aXJlZFxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gdHJhbnNmb3JtYXRpb24gYW5kIHZhbGlkYXRpb246XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFkdmFuY2VkRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgc3RhcnREYXRlOiBEYXRlIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cInN0YXJ0RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJQcm9qZWN0IFN0YXJ0IERhdGVcIlxuICogICAgICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgICAgIH19XG4gKiAgICAgICB2YWxpZGF0aW9uPXt7XG4gKiAgICAgICAgIG1pbkRhdGU6IG5ldyBEYXRlKCksXG4gKiAgICAgICAgIG1heERhdGU6IGFkZFllYXJzKG5ldyBEYXRlKCksIDIpLFxuICogICAgICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICAgICAgbWluRGF0ZTogJ1N0YXJ0IGRhdGUgbXVzdCBiZSB0b2RheSBvciBsYXRlcicsXG4gKiAgICAgICAgICAgbWF4RGF0ZTogJ1N0YXJ0IGRhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAyIHllYXJzIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgICAgIHN4PXt7XG4gKiAgICAgICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnXG4gKiAgICAgICAgIH1cbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRob3V0IEdyaWQgd3JhcHBlciBmb3IgY3VzdG9tIGxheW91dHM6XG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEN1c3RvbUxheW91dCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgZXZlbnREYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGdhcD17Mn0+XG4gKiAgICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgICAgbmFtZT1cImV2ZW50RGF0ZVwiXG4gKiAgICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICAgIGxhYmVsPVwiRXZlbnQgRGF0ZVwiXG4gKiAgICAgICAgIGdyaWRQcm9wcz17ZmFsc2V9IC8vIERpc2FibGVzIEdyaWQgd3JhcHBlclxuICogICAgICAgLz5cbiAqICAgICAgIDxCdXR0b24gdHlwZT1cInN1Ym1pdFwiPlN1Ym1pdDwvQnV0dG9uPlxuICogICAgIDwvQm94PlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggbG9hZGluZyBzdGF0ZSBhbmQgY3VzdG9tIGVycm9yIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBMb2FkaW5nRm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtKCk7XG4gKiAgIGNvbnN0IFtpc1ZhbGlkYXRpbmcsIHNldElzVmFsaWRhdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxEYXRlUGlja2VyRWxlbWVudFxuICogICAgICAgbmFtZT1cImFwcG9pbnRtZW50RGF0ZVwiXG4gKiAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgbGFiZWw9XCJBcHBvaW50bWVudCBEYXRlXCJcbiAqICAgICAgIGxvYWRpbmc9e2lzVmFsaWRhdGluZ31cbiAqICAgICAgIExvYWRpbmdDb21wb25lbnQ9eygpID0+IDxDaXJjdWxhclByb2dyZXNzIHNpemU9ezIwfSAvPn1cbiAqICAgICAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4ge1xuICogICAgICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvcj8udHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAqICAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIGFwcG9pbnRtZW50JztcbiAqICAgICAgICAgfVxuICogICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIGRhdGUnO1xuICogICAgICAgfX1cbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlIChpbmZlcnJlZCBmcm9tIGNvbnRyb2wpXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlIChpbmZlcnJlZCBmcm9tIG5hbWUgcHJvcClcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZSAoaW5mZXJyZWQgZnJvbSB0cmFuc2Zvcm0gZnVuY3Rpb25zKVxuICogQHRlbXBsYXRlIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgLSBXaGV0aGVyIGFjY2Vzc2libGUgZmllbGQgRE9NIHN0cnVjdHVyZSBpcyBlbmFibGVkXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIHdpdGggZnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZVxuICogQHBhcmFtIHJlZiAtIEZvcndhcmQgcmVmIGZvciB0aGUgcm9vdCBlbGVtZW50IChHcmlkIG9yIERhdGVQaWNrZXIgY29udGFpbmVyKVxuICogQHJldHVybnMgUmVuZGVyZWQgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKi9cbmNvbnN0IERhdGVQaWNrZXJFbGVtZW50ID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50UHJvcHM8YW55LCBhbnksIGFueSwgYW55PlxuPig8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlLCBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgcmVmOiBSZWFjdC5SZWY8SFRNTERpdkVsZW1lbnQ+XG4pID0+IHtcbiAgY29uc3Qge1xuICAgIGdyaWRQcm9wcyA9IHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH0sXG4gICAgLi4uY29yZVByb3BzXG4gIH0gPSBwcm9wcztcblxuICAvLyBJZiBncmlkUHJvcHMgaXMgZXhwbGljaXRseSBmYWxzZSwgcmVuZGVyIHdpdGhvdXQgR3JpZCB3cmFwcGVyXG4gIGlmIChncmlkUHJvcHMgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgICk7XG4gIH1cblxuICAvLyBSZW5kZXIgd2l0aCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0XG4gIHJldHVybiAoXG4gICAgPEdyaWRcbiAgICAgIHJlZj17cmVmfVxuICAgICAgey4uLmdyaWRQcm9wc31cbiAgICA+XG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHsuLi5jb3JlUHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn0pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBSZWFjdCBEZXZlbG9wZXIgVG9vbHNcbkRhdGVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gXCJEYXRlUGlja2VyRWxlbWVudFwiO1xuXG5leHBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudDtcbiIsICJpbXBvcnQgeyB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyIH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycyc7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0LFxuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IFJlYWN0LCB7IGZvcndhcmRSZWYsIHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGggfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQge1xuICB1c2VEYXRlUGlja2VyVmFsdWUsXG4gIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uLFxuICB1c2VEYXRlUGlja2VyU3R5bGVzLFxufSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgY29yZSBEYXRlUGlja2VyRWxlbWVudCBjb21wb25lbnQgd2l0aG91dCBHcmlkIHdyYXBwZXIuXG4gKlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0LCBwZXJmb3JtYW50IGRhdGUgcGlja2VyIGNvbXBvbmVudCB0aGF0IGludGVncmF0ZXMgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0gd2hpbGUgcHJvdmlkaW5nIGNvbXByZWhlbnNpdmUgVHlwZVNjcmlwdCBzdXBwb3J0IGFuZFxuICogYWNjZXNzaWJpbGl0eSBmZWF0dXJlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCBUeXBlU2NyaXB0IGluZmVyZW5jZSBmb3IgZm9ybSBmaWVsZCB0eXBlc1xuICogLSBBdXRvbWF0aWMgdmFsdWUgdHJhbnNmb3JtYXRpb24gYmV0d2VlbiBmb3JtIGFuZCBwaWNrZXIgZm9ybWF0c1xuICogLSBDb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gd2l0aCBjdXN0b20gZXJyb3IgbWVzc2FnZXNcbiAqIC0gVGhlbWUtYXdhcmUgc3R5bGluZyB3aXRoIGFjY2Vzc2liaWxpdHkgc3VwcG9ydFxuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6ZWQgd2l0aCBwcm9wZXIgbWVtb2l6YXRpb25cbiAqIC0gRm9yd2FyZCByZWYgc3VwcG9ydCBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gKiAgIG5hbWU9XCJiaXJ0aERhdGVcIlxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICByZXF1aXJlZFxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICogICBuYW1lPVwic3RhcnREYXRlXCJcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbGFiZWw9XCJTdGFydCBEYXRlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgIH19XG4gKiAgIHZhbGlkYXRpb249e3tcbiAqICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInXG4gKiAgICAgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKiBAdGVtcGxhdGUgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSAtIFdoZXRoZXIgYWNjZXNzaWJsZSBmaWVsZCBET00gc3RydWN0dXJlIGlzIGVuYWJsZWRcbiAqL1xuY29uc3QgRGF0ZVBpY2tlckVsZW1lbnRDb3JlID0gZm9yd2FyZFJlZjxcbiAgSFRNTERpdkVsZW1lbnQsXG4gIERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oXG4gIDxcbiAgICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICAgIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4gICAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbiAgPihcbiAgICBwcm9wczogRGF0ZVBpY2tlckVsZW1lbnRDb3JlUHJvcHM8XG4gICAgICBURmllbGRWYWx1ZXMsXG4gICAgICBUTmFtZSxcbiAgICAgIFRWYWx1ZSxcbiAgICAgIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmVcbiAgICA+LFxuICAgIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuICApID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgcmVxdWlyZWQgPSBmYWxzZSxcbiAgICAgIGNvbnRyb2wsXG4gICAgICBwYXJzZUVycm9yLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgdmFsaWRhdGlvbixcbiAgICAgIGxhYmVsLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICB0ZXh0UmVhZE9ubHkgPSBmYWxzZSxcbiAgICAgIGhlbHBlclRleHQsXG4gICAgICBpbnB1dFByb3BzID0ge30sXG4gICAgICBzbG90UHJvcHMgPSB7fSxcbiAgICAgIGRhdGVQaWNrZXJQcm9wcyA9IHt9LFxuICAgICAgdmFyaWFudCA9ICdvdXRsaW5lZCcsXG4gICAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgICBMb2FkaW5nQ29tcG9uZW50LFxuICAgICAgLi4ucmVzdFByb3BzXG4gICAgfSA9IHByb3BzO1xuXG4gICAgLy8gRXh0cmFjdCBEYXRlUGlja2VyLXNwZWNpZmljIHByb3BzXG4gICAgY29uc3Qge1xuICAgICAgZGlzYWJsZWQsXG4gICAgICBpbnB1dFJlZjogZXh0ZXJuYWxJbnB1dFJlZixcbiAgICAgIG9uQ2xvc2UsXG4gICAgICAuLi5yZXN0RGF0ZVBpY2tlclByb3BzXG4gICAgfSA9IGRhdGVQaWNrZXJQcm9wcztcblxuICAgIC8vIFNldCB1cCBmb3JtIGNvbnRyb2xsZXJcbiAgICBjb25zdCB7IGZpZWxkLCBmaWVsZFN0YXRlIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICAgIG5hbWUsXG4gICAgICBjb250cm9sLFxuICAgICAgZGVmYXVsdFZhbHVlOiBudWxsIGFzIGFueSwgLy8gTGV0IHJlYWN0LWhvb2stZm9ybSBoYW5kbGUgdGhlIGRlZmF1bHQgdmFsdWUgdHlwaW5nXG4gICAgfSk7XG5cbiAgICAvLyBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBob29rXG4gICAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2U6IG9uVmFsdWVDaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gICAgICBmaWVsZCxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRpb24gaG9va1xuICAgIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSwgaW52YWxpZCB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICAgICAgZmllbGRTdGF0ZSxcbiAgICAgIHZhbGlkYXRpb24sXG4gICAgICBwYXJzZUVycm9yLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG5cbiAgICAvLyBTdHlsaW5nIGhvb2tcbiAgICBjb25zdCB7IGNsYXNzTmFtZSB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGhhc0Vycm9yLFxuICAgICAgbG9hZGluZyxcbiAgICAgIHRleHRSZWFkT25seSxcbiAgICB9KTtcblxuICAgIC8vIE1lcmdlIGlucHV0IHJlZnNcbiAgICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBleHRlcm5hbElucHV0UmVmKTtcblxuICAgIC8vIE1lbW9pemVkIGNoYW5nZSBoYW5kbGVyIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKFxuICAgICAgICBuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCxcbiAgICAgICAgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj5cbiAgICAgICkgPT4ge1xuICAgICAgICBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICBbb25WYWx1ZUNoYW5nZV1cbiAgICApO1xuXG4gICAgLy8gTWVtb2l6ZWQgY2xvc2UgaGFuZGxlclxuICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soXG4gICAgICAoLi4uYXJnczogUGFyYW1ldGVyczxOb25OdWxsYWJsZTx0eXBlb2Ygb25DbG9zZT4+KSA9PiB7XG4gICAgICAgIC8vIFRyaWdnZXIgZm9ybSBmaWVsZCBibHVyIGZvciB2YWxpZGF0aW9uXG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuXG4gICAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25DbG9zZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICAgIG9uQ2xvc2UoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgICBbZmllbGQub25CbHVyLCBvbkNsb3NlXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBibHVyIGhhbmRsZXIgZm9yIHRleHQgZmllbGRcbiAgICBjb25zdCBoYW5kbGVUZXh0RmllbGRCbHVyID0gdXNlQ2FsbGJhY2soXG4gICAgICAoZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkJsdXIgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzLm9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlucHV0UHJvcHMub25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICAgIFtmaWVsZC5vbkJsdXIsIGlucHV0UHJvcHMub25CbHVyXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBzbG90IHByb3BzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IG1lbW9pemVkU2xvdFByb3BzID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgQXJyYXk8XG4gICAgICAgICAgICAnYWNjZXB0JyB8ICdjYW5jZWwnIHwgJ2NsZWFyJyB8ICduZXh0JyB8ICduZXh0T3JBY2NlcHQnIHwgJ3RvZGF5J1xuICAgICAgICAgID4sXG4gICAgICAgICAgLi4uc2xvdFByb3BzLmFjdGlvbkJhcixcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgdmFyaWFudCxcbiAgICAgICAgICBvbkJsdXI6IGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgICAgICAgZXJyb3I6IGhhc0Vycm9yLFxuICAgICAgICAgIGhlbHBlclRleHQ6IGhhc0Vycm9yID8gZXJyb3JNZXNzYWdlIDogaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogdGV4dFJlYWRPbmx5LFxuICAgICAgICAgICAgJ2FyaWEtaW52YWxpZCc6IGludmFsaWQsXG4gICAgICAgICAgICAnYXJpYS1kZXNjcmliZWRieSc6IGhhc0Vycm9yID8gYCR7bmFtZX0tZXJyb3JgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLi4uaW5wdXRQcm9wcy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gQWRkIGxvYWRpbmcgaW5kaWNhdG9yIGlmIHByb3ZpZGVkXG4gICAgICAgICAgLi4uKGxvYWRpbmcgJiZcbiAgICAgICAgICAgIExvYWRpbmdDb21wb25lbnQgJiYge1xuICAgICAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiA8TG9hZGluZ0NvbXBvbmVudCAvPixcbiAgICAgICAgICAgICAgICAuLi5pbnB1dFByb3BzLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5zbG90UHJvcHMudGV4dEZpZWxkLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBbXG4gICAgICAgIHNsb3RQcm9wcyxcbiAgICAgICAgaW5wdXRQcm9wcyxcbiAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBoYW5kbGVUZXh0RmllbGRCbHVyLFxuICAgICAgICBoYXNFcnJvcixcbiAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICBoZWxwZXJUZXh0LFxuICAgICAgICB0ZXh0UmVhZE9ubHksXG4gICAgICAgIGludmFsaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgICBdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8RGF0ZVBpY2tlclxuICAgICAgICAvLyBTcHJlYWQgcmVzdCBwcm9wcyBmaXJzdCBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuXG4gICAgICAgIHsuLi5yZXN0UHJvcHN9XG4gICAgICAgIHsuLi5yZXN0RGF0ZVBpY2tlclByb3BzfVxuICAgICAgICAvLyBDb3JlIHByb3BzXG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICAgICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICAgIC8vIFVJIHByb3BzXG4gICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZX1cbiAgICAgICAgLy8gU2xvdCBwcm9wc1xuICAgICAgICBzbG90UHJvcHM9e21lbW9pemVkU2xvdFByb3BzfVxuICAgICAgICAvLyBBY2Nlc3NpYmlsaXR5IHByb3BzXG4gICAgICAgIGFyaWEtaW52YWxpZD17aW52YWxpZH1cbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT17aGFzRXJyb3IgPyBgJHtuYW1lfS1lcnJvcmAgOiB1bmRlZmluZWR9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbik7XG5cbi8vIFNldCBkaXNwbGF5IG5hbWUgZm9yIGRlYnVnZ2luZ1xuRGF0ZVBpY2tlckVsZW1lbnRDb3JlLmRpc3BsYXlOYW1lID0gJ0RhdGVQaWNrZXJFbGVtZW50Q29yZSc7XG5cbmV4cG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlUGlja2VyRWxlbWVudENvcmU7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0LFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFsc1wiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbiAgUGF0aFZhbHVlLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVRyYW5zZm9ybSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIFR5cGUtc2FmZSBkYXRlIHZhbHVlIHJlYWRlciB0aGF0IGhhbmRsZXMgc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvblxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSBmcm9tIHRoZSBkYXRlIGFkYXB0ZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGxvY2FsaXphdGlvbiBjb250ZXh0IGZyb20gTVVJIGRhdGUgcGlja2Vyc1xuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgKHN0cmluZywgZGF0ZSwgb3IgbnVsbClcbiAqIEByZXR1cm5zIFByb3Blcmx5IHR5cGVkIGRhdGUgdmFsdWUgb3IgbnVsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZERhdGVQaWNrZXJWYWx1ZUFzRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZT4oXG4gIGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+LFxuICB2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IFREYXRlIHwgdW5kZWZpbmVkXG4pOiBURGF0ZSB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBhZGFwdGVyIHRvIHBhcnNlIHRoZSBzdHJpbmcgaW50byBhIGRhdGVcbiAgICBjb25zdCBwYXJzZWREYXRlID0gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKTtcblxuICAgIHJldHVybiBwYXJzZWREYXRlIGFzIFREYXRlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsdWUgaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVPcHRpb25zPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ge1xuICAvKiogVGhlIGZpZWxkIGNvbnRyb2xsZXIgZnJvbSByZWFjdC1ob29rLWZvcm0gKi9cbiAgZmllbGQ6IFVzZUNvbnRyb2xsZXJSZXR1cm48VEZpZWxkVmFsdWVzLCBUTmFtZT5bXCJmaWVsZFwiXTtcbiAgLyoqIE9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyAqL1xuICB0cmFuc2Zvcm0/OiBEYXRlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT47XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsdWUgaG9va1xuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbHVlUmV0dXJuPFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4ge1xuICAvKiogVGhlIHRyYW5zZm9ybWVkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXIgKi9cbiAgdmFsdWU6IFRWYWx1ZSB8IG51bGw7XG4gIC8qKiBDaGFuZ2UgaGFuZGxlciBmb3IgcGlja2VyIHZhbHVlIHVwZGF0ZXMgKi9cbiAgb25DaGFuZ2U6IChcbiAgICB2YWx1ZTogVFZhbHVlIHwgbnVsbCxcbiAgICBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPlxuICApID0+IHZvaWQ7XG59XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgZGF0ZSBwaWNrZXIgdmFsdWUgdHJhbnNmb3JtYXRpb25zIHdpdGggdHlwZSBzYWZldHlcbiAqIFxuICogVGhpcyBob29rIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gYmV0d2VlbiBmb3JtIGZpZWxkIHZhbHVlcyBhbmQgZGF0ZSBwaWNrZXIgdmFsdWVzLFxuICogYXBwbHlpbmcgY3VzdG9tIHRyYW5zZm9ybWF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBzdHJpY3QgVHlwZVNjcmlwdCB0eXBpbmcuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIHN0cmluZyB0byBkYXRlIGNvbnZlcnNpb246XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VEYXRlUGlja2VyVmFsdWUoe1xuICogICBmaWVsZCxcbiAqICAgdHJhbnNmb3JtOiB7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gbmV3IERhdGUoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIERheS5qcyBkYXRlczpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBkYXlqcyhkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgOiBudWxsXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdmFsdWUgdHJhbnNmb3JtYXRpb25cbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHRyYW5zZm9ybWVkIHZhbHVlIGFuZCBjaGFuZ2UgaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF0ZVBpY2tlclZhbHVlPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKTogVXNlRGF0ZVBpY2tlclZhbHVlUmV0dXJuPFRWYWx1ZT4ge1xuICBjb25zdCB7IGZpZWxkLCB0cmFuc2Zvcm0gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFkYXB0ZXIgPSB1c2VMb2NhbGl6YXRpb25Db250ZXh0KCk7XG5cbiAgLy8gVHJhbnNmb3JtIHRoZSBmaWVsZCB2YWx1ZSBmb3IgZGlzcGxheSBpbiB0aGUgcGlja2VyXG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbygoKTogVFZhbHVlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm0uaW5wdXQoZmllbGQudmFsdWUpO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZWZhdWx0IHRyYW5zZm9ybWF0aW9uOiBoYW5kbGUgc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvblxuICAgIHJldHVybiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlKGFkYXB0ZXIsIGZpZWxkLnZhbHVlKSBhcyBUVmFsdWUgfCBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2ZpZWxkLnZhbHVlLCB0cmFuc2Zvcm0/LmlucHV0LCBhZGFwdGVyXSk7XG5cbiAgLy8gQ3JlYXRlIGEgc3RhYmxlIGNoYW5nZSBoYW5kbGVyXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZhbHVlOiBUVmFsdWUgfCBudWxsLCBjb250ZXh0OiBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dDxEYXRlVmFsaWRhdGlvbkVycm9yPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0cmFuc2Zvcm0ub3V0cHV0KG5ld1ZhbHVlLCBjb250ZXh0KTtcblxuICAgICAgICBmaWVsZC5vbkNoYW5nZSh0cmFuc2Zvcm1lZFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IHN0b3JlIHRoZSBkYXRlIGFzLWlzXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgW2ZpZWxkLm9uQ2hhbmdlLCB0cmFuc2Zvcm0/Lm91dHB1dF1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsdWU7IiwgImltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmllbGRFcnJvcixcbiAgRmllbGRWYWx1ZXMsXG4gIEZpZWxkUGF0aCxcbiAgVXNlQ29udHJvbGxlclJldHVybixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25PcHRpb25zPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4ge1xuICAvKiogVGhlIGZpZWxkIHN0YXRlIGZyb20gcmVhY3QtaG9vay1mb3JtIGNvbnRyb2xsZXIgKi9cbiAgZmllbGRTdGF0ZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkU3RhdGVcIl07XG4gIC8qKiBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkYXRlIHBpY2tlciAqL1xuICB2YWxpZGF0aW9uPzogRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWc8VFZhbHVlPjtcbiAgLyoqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlciAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgRGF0ZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKiogVGhlIGN1cnJlbnQgZGF0ZSB2YWx1ZSBmb3IgdmFsaWRhdGlvbiAqL1xuICB2YWx1ZT86IFRWYWx1ZSB8IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbiBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICAvKiogV2hldGhlciB0aGUgZmllbGQgaGFzIGFueSB2YWxpZGF0aW9uIGVycm9ycyAqL1xuICBoYXNFcnJvcjogYm9vbGVhbjtcbiAgLyoqIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gZXJyb3IgKGZvcm0gb3IgZGF0ZS1zcGVjaWZpYykgKi9cbiAgZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkO1xuICAvKiogRm9ybWF0dGVkIGVycm9yIG1lc3NhZ2UgZm9yIGRpc3BsYXkgKi9cbiAgZXJyb3JNZXNzYWdlOiBSZWFjdE5vZGU7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlICovXG4gIGludmFsaWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmYXVsdCBlcnJvciBtZXNzYWdlcyBmb3IgY29tbW9uIGRhdGUgdmFsaWRhdGlvbiBzY2VuYXJpb3NcbiAqL1xuY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyA9IHtcbiAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gIHJlcXVpcmVkOiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgZGF0ZSBwaWNrZXIgdmFsaWRhdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgZXJyb3IgaGFuZGxpbmdcbiAqIFxuICogVGhpcyBob29rIGNlbnRyYWxpemVzIHZhbGlkYXRpb24gbG9naWMgZm9yIGRhdGUgcGlja2VycywgaGFuZGxpbmcgYm90aFxuICogcmVhY3QtaG9vay1mb3JtIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb24gZXJyb3JzXG4gKiBmcm9tIE1VSSBkYXRlIHBpY2tlcnMuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGZvcm0gdmFsaWRhdGlvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlLCBpbnZhbGlkIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gKiAgIGZpZWxkU3RhdGUsXG4gKiAgIHZhbGlkYXRpb246IHtcbiAqICAgICBtaW5EYXRlOiBkYXlqcygpLnN1YnRyYWN0KDEsICd5ZWFyJyksXG4gKiAgICAgbWF4RGF0ZTogZGF5anMoKS5hZGQoMSwgJ3llYXInKSxcbiAqICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICBtaW5EYXRlOiAnRGF0ZSBtdXN0IGJlIHdpdGhpbiB0aGUgbGFzdCB5ZWFyJyxcbiAqICAgICAgIG1heERhdGU6ICdEYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMSB5ZWFyIGluIHRoZSBmdXR1cmUnXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogVXNhZ2Ugd2l0aCBjdXN0b20gZXJyb3IgcGFyc2VyOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgcGFyc2VFcnJvcjogKGVycm9yKSA9PiB7XG4gKiAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAqICAgICAgIHJldHVybiBgRGF0ZSBFcnJvcjogJHtlcnJvcn1gO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnSW52YWxpZCBkYXRlJztcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gc3RhdGUgYW5kIGVycm9yIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPlxuKTogVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25SZXR1cm4ge1xuICBjb25zdCB7IGZpZWxkU3RhdGUsIHZhbGlkYXRpb24sIHBhcnNlRXJyb3IsIHZhbHVlIH0gPSBvcHRpb25zO1xuXG4gIC8vIE1lbW9pemUgdmFsaWRhdGlvbiByZXN1bHRzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBlcnJvcjogZmllbGRFcnJvciwgaW52YWxpZCB9ID0gZmllbGRTdGF0ZTtcbiAgICBcbiAgICAvLyBTdGFydCB3aXRoIGZvcm0gdmFsaWRhdGlvbiBlcnJvclxuICAgIGxldCBjdXJyZW50RXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yIHwgdW5kZWZpbmVkID0gZmllbGRFcnJvcjtcbiAgICBcbiAgICAvLyBDaGVjayBkYXRlLXNwZWNpZmljIHZhbGlkYXRpb25zIGlmIG5vIGZvcm0gZXJyb3IgYW5kIHdlIGhhdmUgYSB2YWx1ZVxuICAgIGlmICghZmllbGRFcnJvciAmJiB2YWx1ZSAmJiB2YWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCB7IG1pbkRhdGUsIG1heERhdGUsIHNob3VsZERpc2FibGVEYXRlLCBlcnJvck1lc3NhZ2VzIH0gPSB2YWxpZGF0aW9uO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBtaW5pbXVtIGRhdGVcbiAgICAgIGlmIChtaW5EYXRlICYmIHZhbHVlIDwgbWluRGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21pbkRhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1pbkRhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgbWF4aW11bSBkYXRlXG4gICAgICBlbHNlIGlmIChtYXhEYXRlICYmIHZhbHVlID4gbWF4RGF0ZSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ21heERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/Lm1heERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZGlzYWJsZWQgZGF0ZVxuICAgICAgZWxzZSBpZiAoc2hvdWxkRGlzYWJsZURhdGUgJiYgc2hvdWxkRGlzYWJsZURhdGUodmFsdWUpKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnZGlzYWJsZWREYXRlJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzPy5kaXNhYmxlZERhdGUgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjb25zdCBoYXNFcnJvciA9IEJvb2xlYW4oY3VycmVudEVycm9yKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgaGFzRXJyb3IsXG4gICAgICBlcnJvcjogY3VycmVudEVycm9yLFxuICAgICAgaW52YWxpZDogaW52YWxpZCB8fCBoYXNFcnJvcixcbiAgICB9O1xuICB9LCBbZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgdmFsdWVdKTtcblxuICAvLyBNZW1vaXplIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZ1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSB1c2VNZW1vKCgpOiBSZWFjdE5vZGUgPT4ge1xuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVXNlIGN1c3RvbSBlcnJvciBwYXJzZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAocGFyc2VFcnJvcikge1xuICAgICAgcmV0dXJuIHBhcnNlRXJyb3IodmFsaWRhdGlvblJlc3VsdC5lcnJvcik7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBlcnJvciBtZXNzYWdlIGhhbmRsaW5nXG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCdtZXNzYWdlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yICYmIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IubWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBlcnJvciBtZXNzYWdlcyBiYXNlZCBvbiBlcnJvciB0eXBlXG4gICAgaWYgKCd0eXBlJyBpbiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3JlcXVpcmVkJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5yZXF1aXJlZDtcbiAgICAgICAgY2FzZSAnbWluRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWluRGF0ZTtcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWF4RGF0ZTtcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5kaXNhYmxlZERhdGU7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5pbnZhbGlkRGF0ZTtcbiAgfSwgW3ZhbGlkYXRpb25SZXN1bHQuZXJyb3IsIHBhcnNlRXJyb3JdKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnZhbGlkYXRpb25SZXN1bHQsXG4gICAgZXJyb3JNZXNzYWdlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbjsiLCAiaW1wb3J0IHR5cGUgeyBTeFByb3BzLCBUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VUaGVtZSB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNPcHRpb25zIHtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGEgdmFsaWRhdGlvbiBlcnJvciAqL1xuICBoYXNFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZSAqL1xuICBsb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRleHQgaW5wdXQgaXMgcmVhZC1vbmx5ICovXG4gIHRleHRSZWFkT25seT86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gc3R5bGVzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHMgKi9cbiAgc3g/OiBTeFByb3BzPFRoZW1lPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJTdHlsZXMgaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJTdHlsZXNSZXR1cm4ge1xuICAvKiogQ29tcHV0ZWQgc3R5bGVzIGZvciB0aGUgZGF0ZSBwaWNrZXIgY29tcG9uZW50ICovXG4gIHN4OiBTeFByb3BzPFRoZW1lPjtcbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIHN0eWxpbmcgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvb2sgZm9yIG1hbmFnaW5nIHRoZW1lLWF3YXJlIGRhdGUgcGlja2VyIHN0eWxlcyB3aXRoIGNvbnNpc3RlbnQgZGVzaWduIHN5c3RlbSBpbnRlZ3JhdGlvblxuICogXG4gKiBUaGlzIGhvb2sgcHJvdmlkZXMgb3B0aW1pemVkLCBtZW1vaXplZCBzdHlsZXMgZm9yIGRhdGUgcGlja2VyIGNvbXBvbmVudHMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gKiBhZGFwdCB0byB0aGUgY3VycmVudCBNVUkgdGhlbWUgYW5kIGNvbXBvbmVudCBzdGF0ZSAoZGlzYWJsZWQsIGVycm9yLCBsb2FkaW5nLCBldGMuKS5cbiAqIEl0IGVuc3VyZXMgY29uc2lzdGVudCBzdHlsaW5nIGFjcm9zcyBhbGwgZGF0ZSBwaWNrZXIgaW5zdGFuY2VzIHdoaWxlIGFsbG93aW5nIGN1c3RvbWl6YXRpb24uXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGRpc2FibGVkOiBpc0Rpc2FibGVkLFxuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgbG9hZGluZzogaXNMb2FkaW5nXG4gKiB9KTtcbiAqIFxuICogcmV0dXJuIDxEYXRlUGlja2VyIHN4PXtzeH0gLi4uIC8+O1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsZXM6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc3ggfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICogICBoYXNFcnJvcjogISFlcnJvcixcbiAqICAgc3g6IHtcbiAqICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgY29sb3I6ICdwcmltYXJ5Lm1haW4nXG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFN0eWxlIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgQ29tcHV0ZWQgc3R5bGVzIGFuZCBjbGFzcyBuYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF0ZVBpY2tlclN0eWxlcyhcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMgPSB7fVxuKTogVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIGNvbnN0IHsgZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHksIHN4OiBjdXN0b21TeCB9ID0gb3B0aW9ucztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIC8vIE1lbW9pemUgY29tcHV0ZWQgc3R5bGVzIGZvciBwZXJmb3JtYW5jZVxuICBjb25zdCBjb21wdXRlZFN4ID0gdXNlTWVtbygoKTogU3hQcm9wczxUaGVtZT4gPT4ge1xuICAgIGNvbnN0IGJhc2VTdHlsZXM6IFN4UHJvcHM8VGhlbWU+ID0ge1xuICAgICAgLy8gSW5wdXQgZmllbGQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kIFxuICAgICAgICAgIDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gVHJhbnNpdGlvbiBmb3Igc21vb3RoIHN0YXRlIGNoYW5nZXNcbiAgICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFtcbiAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcicsXG4gICAgICAgICAgJ2JvcmRlci1jb2xvcicsXG4gICAgICAgICAgJ2NvbG9yJ1xuICAgICAgICBdLCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBFcnJvciBzdGF0ZSBzdHlsaW5nXG4gICAgICAgIC4uLihoYXNFcnJvciAmJiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnJi5NdWktZm9jdXNlZCc6IHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgICBib3hTaGFkb3c6IGAwIDAgMCAycHggJHt0aGVtZS5wYWxldHRlLmVycm9yLm1haW59MjVgLCAvLyAyNSBpcyAxNSUgb3BhY2l0eSBpbiBoZXhcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIG9wYWNpdHk6IDAuNyxcbiAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSW5wdXQgZWxlbWVudCBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QmFzZS1pbnB1dFwiOiB7XG4gICAgICAgIGN1cnNvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyBcIm5vdC1hbGxvd2VkXCIgXG4gICAgICAgICAgOiB0ZXh0UmVhZE9ubHkgXG4gICAgICAgICAgICA/IFwicG9pbnRlclwiIFxuICAgICAgICAgICAgOiBcInRleHRcIixcbiAgICAgICAgXG4gICAgICAgIC8vIFJlYWQtb25seSBzcGVjaWZpYyBzdHlsaW5nXG4gICAgICAgIC4uLih0ZXh0UmVhZE9ubHkgJiYgIWRpc2FibGVkICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiLFxuICAgICAgICAgIGNhcmV0Q29sb3I6IFwidHJhbnNwYXJlbnRcIiwgLy8gSGlkZSB0ZXh0IGN1cnNvciBpbiByZWFkLW9ubHkgbW9kZVxuICAgICAgICB9KSxcblxuICAgICAgICAvLyBMb2FkaW5nIHN0YXRlXG4gICAgICAgIC4uLihsb2FkaW5nICYmIHtcbiAgICAgICAgICBjdXJzb3I6IFwid2FpdFwiLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIFJlcXVpcmVkIGZpZWxkIGFzdGVyaXNrIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1hc3Rlcmlza1wiOiB7IFxuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICBmb250U2l6ZTogXCIxLjJlbVwiLFxuICAgICAgfSxcblxuICAgICAgLy8gTGFiZWwgc3R5bGluZyB3aXRoIGJldHRlciBjb250cmFzdFxuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogaGFzRXJyb3IgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgOiB0aGVtZS5wYWxldHRlLnRleHQuc2Vjb25kYXJ5LFxuICAgICAgICBcbiAgICAgICAgLy8gRW5zdXJlIHByb3BlciBjb250cmFzdCBmb3IgZGlzYWJsZWQgc3RhdGVcbiAgICAgICAgLi4uKGRpc2FibGVkICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LmRpc2FibGVkLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEhlbHBlciB0ZXh0IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpRm9ybUhlbHBlclRleHQtcm9vdFwiOiB7XG4gICAgICAgIG1hcmdpbkxlZnQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIG1hcmdpblJpZ2h0OiB0aGVtZS5zcGFjaW5nKDEpLFxuICAgICAgICBcbiAgICAgICAgLy8gRXJyb3Igc3RhdGVcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIENhbGVuZGFyIGljb24gc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dEFkb3JubWVudC1yb290XCI6IHtcbiAgICAgICAgY29sb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWQgXG4gICAgICAgICAgOiBoYXNFcnJvciBcbiAgICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIFxuICAgICAgICAgICAgOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5hY3RpdmUsXG4gICAgICB9LFxuXG4gICAgICAvLyBGb2N1cyByaW5nIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZm9jdXNlZFwiOiB7XG4gICAgICAgIG91dGxpbmU6IGAycHggc29saWQgJHt0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbn01MGAsIC8vIDUwIGlzIDMxJSBvcGFjaXR5XG4gICAgICAgIG91dGxpbmVPZmZzZXQ6IFwiMnB4XCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBFbmhhbmNlZCBjb250cmFzdCBmb3IgZGFyayB0aGVtZXNcbiAgICAgIC4uLih0aGVtZS5wYWxldHRlLm1vZGUgPT09ICdkYXJrJyAmJiB7XG4gICAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgICBib3JkZXJXaWR0aDogMixcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICAvLyBNZXJnZSB3aXRoIGN1c3RvbSBzdHlsZXNcbiAgICByZXR1cm4gY3VzdG9tU3ggPyBbYmFzZVN0eWxlcywgY3VzdG9tU3hdIGFzIFN4UHJvcHM8VGhlbWU+IDogYmFzZVN0eWxlcztcbiAgfSwgW1xuICAgIHRoZW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGhhc0Vycm9yLFxuICAgIGxvYWRpbmcsXG4gICAgdGV4dFJlYWRPbmx5LFxuICAgIGN1c3RvbVN4LFxuICBdKTtcblxuICAvLyBHZW5lcmF0ZSBhZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciBleHRlcm5hbCBzdHlsaW5nIGhvb2tzXG4gIGNvbnN0IGNsYXNzTmFtZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgaWYgKGRpc2FibGVkKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1kaXNhYmxlZCcpO1xuICAgIGlmIChoYXNFcnJvcikgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tZXJyb3InKTtcbiAgICBpZiAobG9hZGluZykgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tbG9hZGluZycpO1xuICAgIGlmICh0ZXh0UmVhZE9ubHkpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLXJlYWRPbmx5Jyk7XG4gICAgXG4gICAgcmV0dXJuIGNsYXNzZXMubGVuZ3RoID4gMCA/IGNsYXNzZXMuam9pbignICcpIDogdW5kZWZpbmVkO1xuICB9LCBbZGlzYWJsZWQsIGhhc0Vycm9yLCBsb2FkaW5nLCB0ZXh0UmVhZE9ubHldKTtcblxuICByZXR1cm4ge1xuICAgIHN4OiBjb21wdXRlZFN4LFxuICAgIGNsYXNzTmFtZSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlRGF0ZVBpY2tlclN0eWxlczsiLCAiaW1wb3J0IHR5cGUgeyBQaWNrZXJWYWxpZERhdGUgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vyc1wiO1xuaW1wb3J0IHR5cGUgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVmFsdWVzLCBGaWVsZFBhdGgsIFBhdGhWYWx1ZSB9IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuLyoqXG4gKiBVdGlsaXR5IHR5cGUgZm9yIGNyZWF0aW5nIGJyYW5kZWQgZGF0ZSB0eXBlcyB0byBwcmV2ZW50IG1peGluZyBkaWZmZXJlbnQgZGF0ZSBmb3JtYXRzXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgYmFzZSBkYXRlIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUQnJhbmQgLSBUaGUgYnJhbmQgc3RyaW5nIGZvciB0eXBlIHNhZmV0eVxuICovXG5leHBvcnQgdHlwZSBCcmFuZGVkRGF0ZTxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSwgVEJyYW5kIGV4dGVuZHMgc3RyaW5nPiA9IFxuICBURGF0ZSAmIHsgcmVhZG9ubHkgX19icmFuZDogVEJyYW5kIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGRhdGUtbGlrZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGlja2VyVmFsaWREYXRlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgRGF0ZSBvYmplY3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBkYXRlLWxpa2Ugb2JqZWN0cyB3aXRoIGNvbW1vbiBkYXRlIGxpYnJhcnkgbWV0aG9kc1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIC8vIERheS5qcywgTW9tZW50LmpzLCBvciBzaW1pbGFyXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkuaXNWYWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTHV4b24gRGF0ZVRpbWVcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEgZGF0ZVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHBhcnNlYWJsZSBkYXRlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJzYWJsZURhdGVTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBCYXNpYyBJU08gZGF0ZSBmb3JtYXQgY2hlY2tcbiAgY29uc3QgaXNvRGF0ZVJlZ2V4ID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSg/OlRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHszfSk/KD86WnxbKy1dXFxkezJ9OlxcZHsyfSk/KT8kLztcblxuICBpZiAoaXNvRGF0ZVJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBDaGVjayBpZiBEYXRlIGNvbnN0cnVjdG9yIGNhbiBwYXJzZSBpdFxuICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG5cbiAgcmV0dXJuICFpc05hTihwYXJzZWQuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlIHBpY2tlciB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSB1c2VkIGJ5IHRoZSBwaWNrZXJcbiAqIEBwYXJhbSBhZGFwdGVyIC0gVGhlIGRhdGUgYWRhcHRlciBmcm9tIE1VSSBsb2NhbGl6YXRpb24gY29udGV4dFxuICogQHJldHVybnMgQSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IHNhZmVseSBjb252ZXJ0cyBmb3JtIHZhbHVlcyB0byBkYXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0ZUlucHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGFkYXB0ZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZUxvY2FsaXphdGlvbkNvbnRleHQ+KSB7XG4gIHJldHVybiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPik6IFREYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0ZShwYXJzZWQpID8gKHBhcnNlZCBhcyBURGF0ZSkgOiBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBURGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZS1zYWZlIGRhdGUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBkYXRlIHBpY2tlciB2YWx1ZXMgYmFjayB0byBmb3JtIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGZvcm1hdCAtIFRoZSBmb3JtYXQgdG8gdXNlIGZvciBzdHJpbmcgY29udmVyc2lvbiAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGRhdGVzIHRvIGZvcm0gdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlT3V0cHV0VHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KGZvcm1hdD86IHN0cmluZykge1xuICByZXR1cm4gKHZhbHVlOiBURGF0ZSB8IG51bGwpOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBmb3JtYXQgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGRhdGUgYXMtaXNcbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBkYXRlIGxpYnJhcnkgZm9ybWF0c1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnaXNvJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkYXRlLW9ubHknKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGF5LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTW9tZW50LmpzIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS5mb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmZvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gTHV4b24gZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS50b0Zvcm1hdChmb3JtYXQpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2s6IHJldHVybiBhcy1pc1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBjcmVhdGUgZGVmYXVsdCBkYXRlIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlXG4gKiBAcmV0dXJucyBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0RGF0ZVBpY2tlckNvbmZpZzxURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZT4oKSB7XG4gIHJldHVybiB7XG4gICAgLy8gRGVmYXVsdCBzbG90IHByb3BzIGZvciBjb25zaXN0ZW50IGJlaGF2aW9yXG4gICAgc2xvdFByb3BzOiB7XG4gICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgY29uc3QsXG4gICAgICB9LFxuICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgIGZ1bGxXaWR0aDogdHJ1ZSxcbiAgICAgICAgdmFyaWFudDogJ291dGxpbmVkJyBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IGdyaWQgcHJvcHMgZm9yIGxheW91dCBjb25zaXN0ZW5jeVxuICAgIGdyaWRQcm9wczoge1xuICAgICAgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IGFzIGNvbnN0LFxuICAgIH0sXG4gICAgXG4gICAgLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICB2YWxpZGF0aW9uOiB7XG4gICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gICAgICAgIGludmFsaWREYXRlOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGVcIixcbiAgICAgICAgbWluRGF0ZTogXCJEYXRlIG11c3QgYmUgYWZ0ZXIgdGhlIG1pbmltdW0gYWxsb3dlZCBkYXRlXCIsXG4gICAgICAgIG1heERhdGU6IFwiRGF0ZSBtdXN0IGJlIGJlZm9yZSB0aGUgbWF4aW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgZGlzYWJsZWREYXRlOiBcIlRoaXMgZGF0ZSBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9IGFzIGNvbnN0O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gc2FmZWx5IGV4dHJhY3QgZXJyb3IgbWVzc2FnZSBmcm9tIHZhcmlvdXMgZXJyb3IgdHlwZXNcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciBvYmplY3QgKGNvdWxkIGJlIGZyb20gcmVhY3QtaG9vay1mb3JtIG9yIE1VSSBkYXRlIHBpY2tlcilcbiAqIEByZXR1cm5zIEEgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmIChlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCkge1xuICAgIC8vIFJlYWN0IEhvb2sgRm9ybSBGaWVsZEVycm9yXG4gICAgaWYgKCdtZXNzYWdlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIE1VSSBEYXRlVmFsaWRhdGlvbkVycm9yXG4gICAgaWYgKCd0eXBlJyBpbiBlcnJvciAmJiB0eXBlb2YgKGVycm9yIGFzIGFueSkudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IChlcnJvciBhcyBhbnkpLnR5cGU7XG5cbiAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludmFsaWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGUnO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGVhcmx5JztcbiAgICAgICAgY2FzZSAnbWF4RGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdEYXRlIGlzIHRvbyBsYXRlJztcbiAgICAgICAgY2FzZSAnZGlzYWJsZWREYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ1RoaXMgZGF0ZSBpcyBub3QgYXZhaWxhYmxlJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgZGF0ZSBzZWxlY3Rpb24nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnSW52YWxpZCBpbnB1dCc7XG59XG5cbi8qKlxuICogUGVyZm9ybWFuY2UgdXRpbGl0eSB0byBjcmVhdGUgc3RhYmxlIHJlZmVyZW5jZXMgZm9yIGNvbXBsZXggcHJvcHNcbiAqIFRoaXMgaGVscHMgcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzIHdoZW4gdXNpbmcgY29tcGxleCBjb25maWd1cmF0aW9uIG9iamVjdHNcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcmV0dXJucyBBIEpTT04gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBkZXBlbmRlbmN5IGluIHVzZU1lbW8vdXNlQ2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWJsZUtleTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGNvbmZpZzogVCk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIC8vIFNvcnQgb2JqZWN0IGtleXMgZm9yIGNvbnNpc3RlbnQgc2VyaWFsaXphdGlvblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgc29ydGVkW2tdID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0c1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnNvcnQoKS5qb2luKCctJyk7XG4gIH1cbn0iLCAiaW1wb3J0IFZpc2liaWxpdHkgZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5JztcbmltcG9ydCBWaXNpYmlsaXR5T2ZmIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvVmlzaWJpbGl0eU9mZic7XG5pbXBvcnQgdHlwZSB7IEljb25CdXR0b25Qcm9wcywgVGV4dEZpZWxkUHJvcHMsIEdyaWRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgSWNvbkJ1dHRvbixcbiAgSW5wdXRBZG9ybm1lbnQsXG4gIFRleHRGaWVsZCxcbiAgdXNlRm9ya1JlZixcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IE1vdXNlRXZlbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgUGFzc3dvcmRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFBhc3N3b3JkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+ID0gT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnIHwgJ3NpemUnPiAmIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwicGFzc3dvcmRcIiB8IFwidXNlci5jdXJyZW50UGFzc3dvcmRcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ29sb3Igb2YgdGhlIHZpc2liaWxpdHkgdG9nZ2xlIGljb24gYnV0dG9uXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJkZWZhdWx0XCJcbiAgICovXG4gIGljb25Db2xvcj86IEljb25CdXR0b25Qcm9wc1snY29sb3InXTtcbiAgLyoqXG4gICAqIEN1c3RvbSByZW5kZXIgZnVuY3Rpb24gZm9yIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFdoZXRoZXIgcGFzc3dvcmQgaXMgY3VycmVudGx5IGhpZGRlblxuICAgKiBAcmV0dXJucyBSZWFjdE5vZGUgdG8gcmVuZGVyIGFzIHRoZSBpY29uXG4gICAqIEBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2aXNpYmlsaXR5L3Zpc2liaWxpdHktb2ZmIGljb25zXG4gICAqL1xuICByZW5kZXJJY29uPzogKHBhc3N3b3JkOiBib29sZWFuKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG5cbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFBhc3N3b3JkRWw8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICBpY29uQ29sb3IsXG4gICAgcmVuZGVySWNvbiA9IHBhc3N3b3JkID0+IChwYXNzd29yZCA/IDxWaXNpYmlsaXR5IC8+IDogPFZpc2liaWxpdHlPZmYgLz4pLFxuICAgIHNsb3RQcm9wcyxcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgaW5wdXRSZWYsXG4gICAgb25CbHVyLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gdXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgY29uc3QgZW5kQWRvcm5tZW50ID0gKFxuICAgIDxJbnB1dEFkb3JubWVudCBwb3NpdGlvbj17J2VuZCd9PlxuICAgICAgPEljb25CdXR0b25cbiAgICAgICAgb25Nb3VzZURvd249eyhlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRQYXNzd29yZCghcGFzc3dvcmQpfVxuICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgIGNvbG9yPXtpY29uQ29sb3IgPz8gJ2RlZmF1bHQnfVxuICAgICAgPlxuICAgICAgICB7cmVuZGVySWNvbihwYXNzd29yZCl9XG4gICAgICA8L0ljb25CdXR0b24+XG4gICAgPC9JbnB1dEFkb3JubWVudD5cbiAgKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHR5cGU9e3Bhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICd0ZXh0J31cbiAgICAgIHZhbHVlPXtmaWVsZC52YWx1ZSA/PyAnJ31cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgdmFyaWFudD17cmVzdC52YXJpYW50ID8/ICdvdXRsaW5lZCd9XG4gICAgICBvbkNoYW5nZT17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdC5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlc3Qub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICB7Li4uKHR5cGVvZiBzbG90UHJvcHMgPT09ICd1bmRlZmluZWQnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgSW5wdXRQcm9wczoge1xuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBzbG90UHJvcHM6IHtcbiAgICAgICAgICAgICAgLi4uc2xvdFByb3BzLFxuICAgICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAgIGVuZEFkb3JubWVudCxcbiAgICAgICAgICAgICAgICAuLi5zbG90UHJvcHM/LmlucHV0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSBhcyBUZXh0RmllbGRQcm9wc1snc2xvdFByb3BzJ10sXG4gICAgICAgICAgfSl9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgcGFzc3dvcmQgVGV4dEZpZWxkIHdpdGggc2hvdy9oaWRlIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHBhc3N3b3JkIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBhIGJ1aWx0LWluIHZpc2liaWxpdHkgdG9nZ2xlIGJ1dHRvbi4gVGhlIHBhc3N3b3JkXG4gKiBjYW4gYmUgc2hvd24gb3IgaGlkZGVuIGJ5IGNsaWNraW5nIHRoZSBleWUgaWNvbiBpbiB0aGUgaW5wdXQncyBlbmQgYWRvcm5tZW50LlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBQYXNzd29yZCB2aXNpYmlsaXR5IHRvZ2dsZVxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBDdXN0b21pemFibGUgdmlzaWJpbGl0eSBpY29uc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydFxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicGFzc3dvcmRcIlxuICogICBsYWJlbD1cIlBhc3N3b3JkXCJcbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyxcbiAqICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IDgsIG1lc3NhZ2U6ICdNaW5pbXVtIDggY2hhcmFjdGVycycgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBpY29uIGNvbG9yOlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjb25maXJtUGFzc3dvcmRcIlxuICogICBsYWJlbD1cIkNvbmZpcm0gUGFzc3dvcmRcIlxuICogICBpY29uQ29sb3I9XCJwcmltYXJ5XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJSZS1lbnRlciB5b3VyIHBhc3N3b3JkXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8UGFzc3dvcmRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJuZXdQYXNzd29yZFwiXG4gKiAgIGxhYmVsPVwiTmV3IFBhc3N3b3JkXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJlbmRlckljb249eyhoaWRkZW4pID0+IGhpZGRlbiA/IDxDdXN0b21IaWRlSWNvbiAvPiA6IDxDdXN0b21TaG93SWNvbiAvPn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IFBhc3N3b3JkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcblxuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbmV4cG9ydCB7IFBhc3N3b3JkRWxlbWVudCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBGb3JtTGFiZWxQcm9wcyxcbiAgUmFkaW9Hcm91cFByb3BzLFxuICBSYWRpb1Byb3BzLFxuICBHcmlkUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBGb3JtTGFiZWwsXG4gIFJhZGlvLFxuICBSYWRpb0dyb3VwLFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgdXNlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXZlbnRzJztcblxuLy8gVHlwZSBmb3IgcHJpbWl0aXZlIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIHJhZGlvIGJ1dHRvbiB2YWx1ZXNcbnR5cGUgUHJpbWl0aXZlVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBDb25zdHJhaW50IHRvIGVuc3VyZSBvcHRpb24gb2JqZWN0cyBoYXZlIHRoZSByZXF1aXJlZCBrZXlzXG50eXBlIE9wdGlvbk9iamVjdDxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSBSZWNvcmQ8VFZhbHVlS2V5LCBQcmltaXRpdmVWYWx1ZT4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj4gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzICBzdHJpbmcgPSAnaWQnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+IHtcbiAgb3B0aW9uczogVE9wdGlvbltdO1xuICBoZWxwZXJUZXh0PzogUmVhY3ROb2RlO1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBsYWJlbEtleT86IFRMYWJlbEtleTtcbiAgdmFsdWVLZXk/OiBUVmFsdWVLZXk7XG4gIGRpc2FibGVkS2V5PzogVERpc2FibGVkS2V5O1xuICB0eXBlPzogJ251bWJlcicgfCAnc3RyaW5nJyB8ICdib29sZWFuJztcbiAgZW1wdHlPcHRpb25MYWJlbD86IHN0cmluZztcbiAgb25DaGFuZ2U/OiAodmFsdWU6IFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb24gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIHJldHVybk9iamVjdD86IGJvb2xlYW47XG4gIHJvdz86IGJvb2xlYW47XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGxhYmVsUHJvcHM/OiBPbWl0PEZvcm1Db250cm9sTGFiZWxQcm9wcywgJ2xhYmVsJyB8ICdjb250cm9sJyB8ICd2YWx1ZSc+O1xuICBmb3JtTGFiZWxQcm9wcz86IE9taXQ8Rm9ybUxhYmVsUHJvcHMsICdyZXF1aXJlZCcgfCAnZXJyb3InPjtcbiAgcmFkaW9Qcm9wcz86IFJhZGlvUHJvcHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBSYWRpb0J1dHRvbkdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2lkJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oXG4gIHByb3BzOiBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb24sXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBvcHRpb25zLFxuICAgIGxhYmVsLFxuICAgIG5hbWUsXG4gICAgbGFiZWxLZXkgPSAnbGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUtleSA9ICdpZCcgYXMgVFZhbHVlS2V5LFxuICAgIGRpc2FibGVkS2V5ID0gJ2Rpc2FibGVkJyBhcyBURGlzYWJsZWRLZXksXG4gICAgcmVxdWlyZWQsXG4gICAgZW1wdHlPcHRpb25MYWJlbCxcbiAgICByZXR1cm5PYmplY3QsXG4gICAgcm93ID0gdHJ1ZSxcbiAgICBjb250cm9sLFxuICAgIHR5cGUsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBkaXNhYmxlZCxcbiAgICBmb3JtTGFiZWxQcm9wcyxcbiAgICByYWRpb1Byb3BzLFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uW1RWYWx1ZUtleV0gfCBUT3B0aW9uXG4gID4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogdmFsdWUgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgfHwgKCcnIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG4gICAgICAgICAgICB9LFxuICAgICAgb3V0cHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybT8ub3V0cHV0XG4gICAgICAgICAgOiAoX2V2ZW50LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG9uUmFkaW9DaGFuZ2U6IFJhZGlvR3JvdXBQcm9wc1snb25DaGFuZ2UnXSA9IChldmVudCwgcmFkaW9WYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0gcmV0dXJuT2JqZWN0XG4gICAgICA/IChvcHRpb25zIGFzIFRPcHRpb25bXSkuZmluZChvcHRpb24gPT4gb3B0aW9uW3ZhbHVlS2V5XSA9PT0gcmFkaW9WYWx1ZSlcbiAgICAgIDogKHJhZGlvVmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcblxuICAgIG9uQ2hhbmdlKGV2ZW50LCByZXR1cm5WYWx1ZSk7XG4gICAgaWYgKHR5cGVvZiByZXN0Lm9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXN0Lm9uQ2hhbmdlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAge2xhYmVsICYmIChcbiAgICAgICAgPEZvcm1MYWJlbCB7Li4uZm9ybUxhYmVsUHJvcHN9IHJlcXVpcmVkPXtyZXF1aXJlZH0gZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgPC9Gb3JtTGFiZWw+XG4gICAgICApfVxuICAgICAgPFJhZGlvR3JvdXAgb25DaGFuZ2U9e29uUmFkaW9DaGFuZ2V9IG5hbWU9e25hbWV9IHJvdz17cm93fSB2YWx1ZT17dmFsdWV9PlxuICAgICAgICB7ZW1wdHlPcHRpb25MYWJlbCAmJiAoXG4gICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgIDxSYWRpb1xuICAgICAgICAgICAgICAgIHsuLi5yYWRpb1Byb3BzfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9eyF2YWx1ZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhYmVsPXtlbXB0eU9wdGlvbkxhYmVsfVxuICAgICAgICAgICAgdmFsdWU9XCJcIlxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHtvcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvblt2YWx1ZUtleV07XG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGlzYWJsZWQgPSBvcHRpb25bZGlzYWJsZWRLZXldIHx8IGZhbHNlO1xuICAgICAgICAgIGxldCB2YWw6IFRPcHRpb25bVFZhbHVlS2V5XSB8IHVuZGVmaW5lZCA9IHJldHVybk9iamVjdFxuICAgICAgICAgICAgPyAodmFsdWUgYXMgVE9wdGlvbik/Llt2YWx1ZUtleV1cbiAgICAgICAgICAgIDogKHZhbHVlIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG5cbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgdmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbCA9IE51bWJlcih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJyAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gQm9vbGVhbih2YWwpIGFzIFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc0NoZWNrZWQgPSB2YWwgPT09IG9wdGlvbktleTtcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBrZXk9e1N0cmluZyhvcHRpb25LZXkpfVxuICAgICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgICAgPFJhZGlvXG4gICAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCB8fCBvcHRpb25EaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2lzQ2hlY2tlZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlPXtvcHRpb25LZXl9XG4gICAgICAgICAgICAgIGxhYmVsPXtvcHRpb25bbGFiZWxLZXldfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9KX1cbiAgICAgIDwvUmFkaW9Hcm91cD5cbiAgICAgIHtlcnJvciAmJiA8Rm9ybUhlbHBlclRleHQ+e2Vycm9yLm1lc3NhZ2V9PC9Gb3JtSGVscGVyVGV4dD59XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbmNvbnN0IFJhZGlvQnV0dG9uR3JvdXAgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2lkJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdsYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzICBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogUmFkaW9CdXR0b25Hcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUT3B0aW9uLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVERpc2FibGVkS2V5XG4+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudDxcbiAgICAgICAgVEZpZWxkVmFsdWVzLFxuICAgICAgICBUTmFtZSxcbiAgICAgICAgVE9wdGlvbixcbiAgICAgICAgVFZhbHVlS2V5LFxuICAgICAgICBUTGFiZWxLZXksXG4gICAgICAgIFREaXNhYmxlZEtleVxuICAgICAgPlxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblJhZGlvQnV0dG9uR3JvdXAuZGlzcGxheU5hbWUgPSAnUmFkaW9CdXR0b25Hcm91cCc7XG5cbmV4cG9ydCB7IFJhZGlvQnV0dG9uR3JvdXAgfTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IHVzZVRoZW1lIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuaW1wb3J0IHsgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5leHBvcnQgdHlwZSBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICB8ICduYW1lJ1xuICB8ICdyZW5kZXJJbnB1dCdcbiAgfCAnaXNPcHRpb25FcXVhbFRvVmFsdWUnXG4gIHwgJ2dldE9wdGlvbkxhYmVsJ1xuICB8ICdkaXNhYmxlZCdcbj4gJiB7XG4gIG5hbWU6IFROYW1lO1xuICBkZXBlbmRzT246IFROYW1lO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGlzTnVsbGFibGU/OiBib29sZWFuO1xuICBsYWJlbEZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RDYXNjYWRlRWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG4gIGNvbnN0IHtcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICBuYW1lLFxuICAgIG9uQmx1cixcbiAgICBvbkNoYW5nZSxcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgY29udHJvbCxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgZGVwZW5kc09uLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBpc051bGxhYmxlID0gZmFsc2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCwgLi4ucmVzdFRleHRQcm9wcyB9ID0gdGV4dEZpZWxkUHJvcHM7XG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnNJbnB1dCB8fCBbXSwgW29wdGlvbnNJbnB1dF0pO1xuXG4gIGNvbnN0IGdldE9wdGlvbktleSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb24gPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgICAgY29uc3Qga2V5ID0gb3B0aW9uID8gb3B0aW9uW3ZhbHVlRmllbGQgYXMga2V5b2YgVE9wdGlvbl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXkgIT09IG51bGwgPyBTdHJpbmcoa2V5KSA6ICcnO1xuICAgIH0sXG4gICAgW3ZhbHVlRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGQgYXMga2V5b2YgVE9wdGlvbl0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxGaWVsZF1cbiAgKTtcblxuICBjb25zdCBpc09wdGlvbkVxdWFsVG9WYWx1ZSA9IChvcHRpb246IFRPcHRpb24sIHZhbHVlOiBUT3B0aW9uKSA9PlxuICAgIGdldE9wdGlvbktleShvcHRpb24pID09PSBnZXRPcHRpb25LZXkodmFsdWUpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgZmllbGQ6IGRlcGVuZGVudEZpZWxkIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lOiBkZXBlbmRzT24sXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgcGFyZW50VmFsdWVSZWYgPSB1c2VSZWYoZGVwZW5kZW50RmllbGQudmFsdWUpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHBhcmVudFZhbHVlUmVmLmN1cnJlbnQgIT09IGRlcGVuZGVudEZpZWxkLnZhbHVlKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgIHBhcmVudFZhbHVlUmVmLmN1cnJlbnQgPSBkZXBlbmRlbnRGaWVsZC52YWx1ZTtcbiAgICB9XG4gIH0sIFtkZXBlbmRlbnRGaWVsZC52YWx1ZSwgZmllbGRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhc1ZhbHVlID1cbiAgICAgIGZpZWxkLnZhbHVlICE9PSBudWxsICYmIGZpZWxkLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgZmllbGQudmFsdWUgIT09ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFoYXNWYWx1ZSkge1xuICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgICBmaWVsZC5vbkNoYW5nZShnZXRPcHRpb25LZXkob3B0aW9uc1swXSkpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtvcHRpb25zLCBkaXNhYmxlZCwgZ2V0T3B0aW9uS2V5LCBmaWVsZC5vbkNoYW5nZSwgZGVwZW5kZW50RmllbGQudmFsdWVdKTtcblxuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgZGVwZW5kZW50RmllbGQudmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgZGVwZW5kZW50RmllbGQudmFsdWUgPT09ICcnXG4gICAgKVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWlzTnVsbGFibGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW2Rpc2FibGVkLCBkZXBlbmRlbnRGaWVsZC52YWx1ZSwgb3B0aW9ucy5sZW5ndGgsIGlzTnVsbGFibGVdKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgdmFsdWU9e1xuICAgICAgICBvcHRpb25zXG4gICAgICAgICAgLm1hcChvcHRpb24gPT4gKGdldE9wdGlvbktleShvcHRpb24pID09PSBmaWVsZC52YWx1ZSA/IG9wdGlvbiA6IG51bGwpKVxuICAgICAgICAgIC5maW5kKEJvb2xlYW4pIHx8IG51bGxcbiAgICAgIH1cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25LZXl9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17aXNPcHRpb25FcXVhbFRvVmFsdWV9XG4gICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgIGRpc2FibGVkPXtpc0Rpc2FibGVkfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBvbkNoYW5nZT17KGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlID8gZ2V0T3B0aW9uS2V5KG5ld1ZhbHVlKSA6IG51bGwpO1xuICAgICAgICBpZiAob25DaGFuZ2UgJiYgdHlwZW9mIG9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25DaGFuZ2UoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2VsZWN0Q2FzY2FkZUVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdENhc2NhZGVFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWVcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNlbGVjdENhc2NhZGVFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdENhc2NhZGVFbGVtZW50JztcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIFRleHRGaWVsZFByb3BzLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZVZhbHVlLFxuICBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIEF1dG9jb21wbGV0ZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tICdAbXVpL21hdGVyaWFsL3N0eWxlcyc7XG5pbXBvcnQgeyB1c2VNZW1vLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5leHBvcnQgdHlwZSBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgJ25hbWUnXG4gIHwgJ3JlbmRlcklucHV0J1xuICB8ICdpc09wdGlvbkVxdWFsVG9WYWx1ZSdcbiAgfCAnZ2V0T3B0aW9uTGFiZWwnXG4gIHwgJ2Rpc2FibGVkJ1xuICB8ICdvcHRpb25zJ1xuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGlzTnVsbGFibGU/OiBib29sZWFuO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGxhYmVsRmllbGQ/OiBzdHJpbmc7XG4gIHZhbHVlRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIG9wdGlvbnM/OiByZWFkb25seSBUT3B0aW9uW10gfCBudWxsO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0RWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KFxuICBwcm9wczogU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pIHtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNJbnB1dCxcbiAgICBsYWJlbCxcbiAgICB2YXJpYW50LFxuICAgIGRpc2FibGVkLFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIGtleW9mIFRPcHRpb24sXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScgYXMga2V5b2YgVE9wdGlvbixcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIGlzTnVsbGFibGUgPSBmYWxzZSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7IHJlcXVpcmVkLCAuLi5yZXN0VGV4dFByb3BzIH0gPSB0ZXh0RmllbGRQcm9wcztcbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gb3B0aW9uc0lucHV0IHx8IFtdLCBbb3B0aW9uc0lucHV0XSk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSA6IG51bGw7XG4gICAgfSxcbiAgICBbdmFsdWVGaWVsZF1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz4pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVmFsdWUgPVxuICAgICAgZmllbGQudmFsdWUgIT09IG51bGwgJiYgZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWVsZC52YWx1ZSAhPT0gJyc7XG5cbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDEgJiYgIWhhc1ZhbHVlKSB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKGdldE9wdGlvblZhbHVlKG9wdGlvbnNbMF0pKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbb3B0aW9ucywgZGlzYWJsZWQsIGdldE9wdGlvblZhbHVlLCBmaWVsZC5vbkNoYW5nZV0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFpc051bGxhYmxlKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSwgW2Rpc2FibGVkLCBvcHRpb25zLmxlbmd0aCwgaXNOdWxsYWJsZV0pO1xuXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgb3B0aW9ucy5maW5kKG9wdGlvbiA9PiBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBmaWVsZC52YWx1ZSkgPz8gbnVsbCxcbiAgICBbZmllbGQudmFsdWUsIG9wdGlvbnMsIGdldE9wdGlvblZhbHVlXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnM9e2ZhbHNlfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtcbiAgICAgICAgYXV0b2NvbXBsZXRlVmFsdWUgYXMgQXV0b2NvbXBsZXRlVmFsdWU8XG4gICAgICAgICAgVE9wdGlvbixcbiAgICAgICAgICBNdWx0aXBsZSxcbiAgICAgICAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgICAgICAgIEZyZWVTb2xvXG4gICAgICAgID5cbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gbmV3VmFsdWUgYXMgVE9wdGlvbiB8IG51bGw7XG5cbiAgICAgICAgZmllbGQub25DaGFuZ2Uob3B0aW9uID8gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA6IG51bGwpO1xuICAgICAgICBvbkNoYW5nZT8uKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgIHN4PXt7XG4gICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkIC5NdWlBdXRvY29tcGxldGUtcG9wdXBJbmRpY2F0b3InOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWRpc2FibGVkIC5NdWlPdXRsaW5lZElucHV0LW5vdGNoZWRPdXRsaW5lJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpRmlsbGVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e29wdGlvbiA9PiBnZXRPcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBBdXRvY29tcGxldGUgY29tcG9uZW50IGZvciBzZWxlY3RpbmcgZnJvbSBwcmVkZWZpbmVkIG9wdGlvbnMuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmdWxseSBpbnRlZ3JhdGVkIHNlbGVjdC9hdXRvY29tcGxldGUgaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5XG4gKiB3aXRoIHJlYWN0LWhvb2stZm9ybSwgaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgYW5kIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICogZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy4gSXQgc3VwcG9ydHMgYm90aCBzaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBtb2Rlcy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b2NvbXBsZXRlIHdpdGggZmlsdGVyaW5nXG4gKiAtIFNpbmdsZSBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uIHN1cHBvcnRcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gQ3VzdG9taXphYmxlIG9wdGlvbiBkaXNwbGF5IChsYWJlbEtleS92YWx1ZUtleSlcbiAqIC0gQXV0by1zZWxlY3Rpb24gd2hlbiBvbmx5IG9uZSBvcHRpb24gZXhpc3RzXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiY2F0ZWdvcnlcIlxuICogICBsYWJlbD1cIkNhdGVnb3J5XCJcbiAqICAgb3B0aW9ucz17W1xuICogICAgIHsgTGFiZWw6ICdUZWNobm9sb2d5JywgVmFsdWU6ICd0ZWNoJyB9XG4gKiAgIF19XG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnUGxlYXNlIHNlbGVjdCBhIGNhdGVnb3J5JyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBrZXlzOlxuICogYGBgdHN4XG4gKiA8U2VsZWN0RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcklkXCJcbiAqICAgbGFiZWw9XCJBc3NpZ24gdG8gVXNlclwiXG4gKiAgIG9wdGlvbnM9e3VzZXJzfVxuICogICBsYWJlbEtleT1cImZ1bGxOYW1lXCJcbiAqICAgdmFsdWVLZXk9XCJpZFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgdXNlci4uLlwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIE11bHRpcGxlIHNlbGVjdGlvbjpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRhZ3NcIlxuICogICBsYWJlbD1cIlRhZ3NcIlxuICogICBvcHRpb25zPXthdmFpbGFibGVUYWdzfVxuICogICBtdWx0aXBsZVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA4IH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVE9wdGlvbiAtIFRoZSBvcHRpb24gb2JqZWN0IHR5cGVcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIE11bHRpcGxlIC0gV2hldGhlciBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIERpc2FibGVDbGVhcmFibGUgLSBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gaXMgZGlzYWJsZWRcbiAqIEB0ZW1wbGF0ZSBGcmVlU29sbyAtIFdoZXRoZXIgZnJlZSB0ZXh0IGlucHV0IGlzIGFsbG93ZWRcbiAqIEB0ZW1wbGF0ZSBDaGlwQ29tcG9uZW50IC0gVGhlIGNoaXAgY29tcG9uZW50IHR5cGUgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdEVsZW1lbnQgPSA8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0RWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBNdWx0aXBsZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgRnJlZVNvbG8sXG4gIENoaXBDb21wb25lbnRcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNlbGVjdEVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0RWxlbWVudCc7XG4iLCAiaW1wb3J0IENoZWNrQm94SWNvbiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL0NoZWNrQm94JztcbmltcG9ydCBDaGVja0JveE91dGxpbmVCbGFua0ljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveE91dGxpbmVCbGFuayc7XG5pbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgQ2hpcFR5cGVNYXAsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIEdyaWQsXG4gIENoZWNrYm94LFxuICBUZXh0RmllbGQsXG4gIEF1dG9jb21wbGV0ZSxcbiAgQ2lyY3VsYXJQcm9ncmVzcyxcbiAgdXNlVGhlbWUsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZyYWdtZW50LCB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbnR5cGUgQmFzZUF1dG9jb21wbGV0ZVByb3BzPFxuICBUT3B0aW9uLFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICAnbmFtZScgfCAncmVuZGVySW5wdXQnIHwgJ211bHRpcGxlJyB8ICdvbkNoYW5nZScgfCAndmFsdWUnXG4+O1xuXG5leHBvcnQgdHlwZSBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSB0cnVlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBCYXNlQXV0b2NvbXBsZXRlUHJvcHM8XG4gIFRPcHRpb24sXG4gIE11bHRpcGxlLFxuICBEaXNhYmxlQ2xlYXJhYmxlLFxuICBGcmVlU29sbyxcbiAgQ2hpcENvbXBvbmVudFxuPiAmIHtcbiAgbmFtZTogVE5hbWU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBpc051bGxhYmxlPzogYm9vbGVhbjtcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBsYWJlbEZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIG9wdGlvbnM/OiByZWFkb25seSBUT3B0aW9uW10gfCBudWxsO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0TXVsdGlFbGVtZW50PFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxUT3B0aW9uLCBURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIGxhYmVsLFxuICAgIGlzTnVsbGFibGUsXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnNJbnB1dCB8fCBbXSwgW29wdGlvbnNJbnB1dF0pO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gKG9wdGlvbjogVE9wdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bdmFsdWVGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSA6IG51bGw7XG4gIH07XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSAob3B0aW9uOiBUT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkIGFzIGtleW9mIFRPcHRpb25dKSA6ICcnO1xuICB9O1xuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaXNOdWxsYWJsZSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZCwgb3B0aW9ucy5sZW5ndGgsIGlzTnVsbGFibGVdKTtcblxuICBjb25zdCBzZWxlY3RlZFZhbHVlID1cbiAgICBmaWVsZC52YWx1ZSAmJiBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKVxuICAgICAgPyBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4gZmllbGQudmFsdWUuaW5jbHVkZXMoZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSkpXG4gICAgICA6IFtdO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVmFsdWUgPSBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKSAmJiBmaWVsZC52YWx1ZS5sZW5ndGggPiAwO1xuXG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFoYXNWYWx1ZSAmJiAhaXNOdWxsYWJsZSkge1xuICAgICAgZmllbGQub25DaGFuZ2UoW2dldE9wdGlvblZhbHVlKG9wdGlvbnNbMF0pXSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW29wdGlvbnMsIGdldE9wdGlvblZhbHVlLCBmaWVsZC5vbkNoYW5nZSwgaXNOdWxsYWJsZV0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChcbiAgICBfOiBTeW50aGV0aWNFdmVudCxcbiAgICBzZWxlY3RlZE9wdGlvbnM6IFRPcHRpb25bXSxcbiAgICByZWFzb246IEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvblxuICApID0+IHtcbiAgICBpZiAocmVhc29uID09PSAnY2xlYXInKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gJ3NlbGVjdE9wdGlvbicgfHwgcmVhc29uID09PSAncmVtb3ZlT3B0aW9uJykge1xuICAgICAgY29uc3QgbmV3VmFsdWVzID0gc2VsZWN0ZWRPcHRpb25zLm1hcChvcHRpb24gPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSk7XG5cbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlcy5sZW5ndGggPT09IDAgPyBudWxsIDogbmV3VmFsdWVzKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaWNvbiA9IDxDaGVja0JveE91dGxpbmVCbGFua0ljb24gZm9udFNpemU9XCJzbWFsbFwiIC8+O1xuICBjb25zdCBjaGVja2VkSWNvbiA9IDxDaGVja0JveEljb24gZm9udFNpemU9XCJzbWFsbFwiIC8+O1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgbXVsdGlwbGVcbiAgICAgIHZhbHVlPXtzZWxlY3RlZFZhbHVlfVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBkaXNhYmxlQ2xvc2VPblNlbGVjdFxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIHN4PXt7XG4gICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkIC5NdWlBdXRvY29tcGxldGUtcG9wdXBJbmRpY2F0b3InOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWRpc2FibGVkIC5NdWlPdXRsaW5lZElucHV0LW5vdGNoZWRPdXRsaW5lJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpRmlsbGVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZW5kZXJPcHRpb249eyhwcm9wczEsIG9wdGlvbiwgeyBzZWxlY3RlZCB9KSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIHsuLi5wcm9wczF9PlxuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIGljb249e2ljb259XG4gICAgICAgICAgICAgIGNoZWNrZWRJY29uPXtjaGVja2VkSWNvbn1cbiAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge2dldE9wdGlvbkxhYmVsKG9wdGlvbiBhcyBUT3B0aW9uKX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIElucHV0UHJvcHM9e3tcbiAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICApLFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHsuLi5yZXN0fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgU2VsZWN0TXVsdGlFbGVtZW50ID0gPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZVxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuU2VsZWN0TXVsdGlFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdE11bHRpRWxlbWVudCc7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIHVzZUZvcmtSZWYgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHsgdXNlRW5oYW5jZWRUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgVGV4dEZpZWxkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dEZpZWxkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqIEBkZXByZWNhdGVkIFVzZSBmaWVsZFR5cGUgZm9yIGNvbW1vbiBwYXR0ZXJucyBvciBjdXN0b20gdHJhbnNmb3JtcyBmb3IgY29tcGxleCBjYXNlc1xuICAgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKiBUcmFuc2Zvcm0gdmFsdWUgYmVmb3JlIGRpc3BsYXlpbmcgaW4gaW5wdXQgKi9cbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWU7XG4gICAgLyoqIFRyYW5zZm9ybSBpbnB1dCBldmVudCB0byBmb3JtIHZhbHVlICovXG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb25cbiAgICogQGV4YW1wbGUgJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAndGltZScgfCAnc2VsZWN0J1xuICAgKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZSB0byBkaXNwbGF5IHdoZW4gZmllbGQgdmFsdWUgaXMgbnVsbC91bmRlZmluZWRcbiAgICogQGV4YW1wbGUgXCJcIlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVFZhbHVlO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0XG4gICAqIEBleGFtcGxlIFwiRW50ZXIgeW91ciBlbWFpbFwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBmb3IgdGhlIFRleHRGaWVsZFxuICAgKi9cbiAgLyoqXG4gICAqIEN1c3RvbSBvbkNoYW5nZSBoYW5kbGVyIGNhbGxlZCBhZnRlciB0cmFuc2Zvcm1hdGlvblxuICAgKi9cbiAgb25DaGFuZ2U/OiAoXG4gICAgZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PlxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB0cmFuc2Zvcm1hdGlvbiBpc3N1ZXNcbiAgICogQGRlZmF1bHRWYWx1ZSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgKi9cbiAgZW5hYmxlV2FybmluZ3M/OiBib29sZWFuO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUZXh0RmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ocHJvcHM6IFRleHRGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICB0cmFuc2Zvcm0sXG4gICAgZmllbGRUeXBlID0gJ3RleHQnLCAvLyBEZWZhdWx0IHRvIHRleHQgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIGVuYWJsZVdhcm5pbmdzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgcmVxdWlyZWQsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFJlZixcbiAgICBvbklucHV0LFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICAvLyBVc2UgdGhlIGVuaGFuY2VkIHRyYW5zZm9ybSBob29rIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uc1xuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRW5oYW5jZWRUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPihcbiAgICB7XG4gICAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGlucHV0OiB0cmFuc2Zvcm0uaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHRyYW5zZm9ybS5vdXRwdXQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGZpZWxkVHlwZTogIXRyYW5zZm9ybVxuICAgICAgICA/IHR5cGUgPT09ICdudW1iZXInXG4gICAgICAgICAgPyAnbnVtYmVyJ1xuICAgICAgICAgIDogZmllbGRUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkLCAvLyBBdXRvLWRldGVjdCBudW1iZXIgdHlwZVxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZW5hYmxlV2FybmluZ3MsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSAnJykge1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjdXN0b21PbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbklucHV0PXsoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb25JbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uSW5wdXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICB0eXBlPXt0eXBlfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtcbiAgICAgICAgZXJyb3IgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSkgOiBoZWxwZXJUZXh0XG4gICAgICB9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBUZXh0RmllbGQgY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24sXG4gKiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLCBhbmQgYnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZ1xuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBzdXBwb3J0XG4gKiAtIEJ1aWx0LWluIGZpZWxkIHR5cGVzIGZvciBjb21tb24gcGF0dGVybnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIE9wdGltaXplZCBudW1iZXIgaW5wdXQgaGFuZGxpbmdcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIHdpdGggbWVtb2l6ZWQgdHJhbnNmb3JtYXRpb25zXG4gKiAtIERldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmdcbiAqIC0gU3RhYmxlIHJlZmVyZW5jZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYnVpbHQtaW4gbnVtYmVyIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWdlXCJcbiAqICAgbGFiZWw9XCJBZ2VcIlxuICogICBmaWVsZFR5cGU9XCJudW1iZXJcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0FnZSBpcyByZXF1aXJlZCcsIG1pbjogeyB2YWx1ZTogMCwgbWVzc2FnZTogJ0FnZSBtdXN0IGJlIHBvc2l0aXZlJyB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZW1haWxcIlxuICogICBsYWJlbD1cIkVtYWlsXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBlbWFpbCBhZGRyZXNzXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gKiAgICAgcGF0dGVybjogeyB2YWx1ZTogL1xcUytAXFxTK1xcLlxcUysvLCBtZXNzYWdlOiAnSW52YWxpZCBlbWFpbCcgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwcmljZVwiXG4gKiAgIGxhYmVsPVwiUHJpY2VcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA/IGAkJHt2YWx1ZX1gIDogJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlRmxvYXQoZXZlbnQudGFyZ2V0LnZhbHVlLnJlcGxhY2UoJyQnLCAnJykpIHx8IG51bGxcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZXJyb3IgcGFyc2luZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJuYW1lXCJcbiAqICAgbGFiZWw9XCJVc2VybmFtZVwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IChcbiAqICAgICA8c3BhbiBzdHlsZT17eyBjb2xvcjogJ3JlZCcgfX0+XG4gKiAgICAgICBcdTI2QTBcdUZFMEYge2Vycm9yLm1lc3NhZ2V9XG4gKiAgICAgPC9zcGFuPlxuICogICApfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgVGV4dEZpZWxkRWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIHVzZUZvcmtSZWYgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxuICBUaW1lUGlja2VyUHJvcHMsXG4gIFRpbWVQaWNrZXJTbG90UHJvcHMsXG4gIFRpbWVWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IHsgVGltZVBpY2tlciB9IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzJztcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50T3JWYWx1ZSB9IGZyb20gJy4uLy4uL3R5cGVzL2V2ZW50cyc7XG5pbXBvcnQgeyByZWFkVmFsdWVBc0RhdGUgfSBmcm9tICcuLi8uLi91dGlscy9yZWFkVmFsdWVBc0RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPiB7XG4gIG5hbWU6IFROYW1lO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGlzRGF0ZT86IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBUaW1lVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGlucHV0UHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICBoZWxwZXJUZXh0PzogVGV4dEZpZWxkUHJvcHNbJ2hlbHBlclRleHQnXTtcbiAgbGFiZWw/OiBSZWFjdE5vZGU7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICB0ZXh0UmVhZE9ubHk/OiBib29sZWFuO1xuICBzbG90UHJvcHM/OiBPbWl0PFxuICAgIFRpbWVQaWNrZXJTbG90UHJvcHM8VEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gICAgJ3RleHRGaWVsZCdcbiAgPjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZSB8IG51bGw7XG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgdGltZVBpY2tlclByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyUHJvcHM8VEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gICAgJ3ZhbHVlJyB8ICdzbG90UHJvcHMnXG4gID47XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gVGltZVBpY2tlckVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihwcm9wczogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIHJlcXVpcmVkLFxuICAgIGlucHV0UHJvcHMsXG4gICAgY29udHJvbCxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgc2xvdFByb3BzLFxuICAgIHRpbWVQaWNrZXJQcm9wcyA9IHt9LFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBhZGFwdGVyID0gdXNlTG9jYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gIGNvbnN0IHsgZGlzYWJsZWQsIGlucHV0UmVmLCBvbkNsb3NlLCAuLi5yZXN0VGltZVBpY2tlclByb3BzIH0gPVxuICAgIHRpbWVQaWNrZXJQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlIHwgbnVsbD4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogbmV3VmFsdWUgPT4gcmVhZFZhbHVlQXNEYXRlKGFkYXB0ZXIsIG5ld1ZhbHVlKSxcbiAgICAgIG91dHB1dDogZGF0YSA9PiB7XG4gICAgICAgIGlmIChkYXRhID09PSBudWxsIHx8ICFkYXlqcy5pc0RheWpzKGRhdGEpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGEgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGltZVBpY2tlclxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRpbWVQaWNrZXJQcm9wc31cbiAgICAgIHsuLi5maWVsZH1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIHsuLi50aW1lUGlja2VyUHJvcHN9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICBvbkNsb3NlPXsoLi4uYXJncykgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgICBvbkNsb3NlKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25DaGFuZ2U9eyhuZXdWYWx1ZSwgY29udGV4dCkgPT4ge1xuICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZSk7XG4gICAgICAgIHRpbWVQaWNrZXJQcm9wcy5vbkNoYW5nZT8uKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICAgIH19XG4gICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgLi4uc2xvdFByb3BzLFxuICAgICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ2NhbmNlbCcsICdhY2NlcHQnXSxcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgb25CbHVyOiAoXG4gICAgICAgICAgICBldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzPy5vbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgaGVscGVyVGV4dDogZXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiBpbnB1dFByb3BzPy5oZWxwZXJUZXh0IHx8IHJlc3QuaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogISF0ZXh0UmVhZE9ubHksXG4gICAgICAgICAgICAuLi5pbnB1dFByb3BzPy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgVGltZVBpY2tlckVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5UaW1lUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdUaW1lUGlja2VyRWxlbWVudCc7XG4iLCAiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG4gIHVzZVRoZW1lLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnQG11aS9tYXRlcmlhbC91dGlscyc7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgdXNlQ29udHJvbGxlcixcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNTZWxlY3RFbGVtZW50UHJvcHMsIE9wdGlvbk9iamVjdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0UGF5bG9hZCB9IGZyb20gJ0AvdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBBc3luY1NlbGVjdEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPihcbiAgcHJvcHM6IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFRPcHRpb25cbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgLy8gaW5pdGlhbFZhbHVlLFxuICAgIC8vIGlzTnVsbGFibGUsXG4gICAgbGFiZWwsXG4gICAgcXVlcnlGbixcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9uLCBzZXRTZWxlY3RlZE9wdGlvbl0gPSB1c2VTdGF0ZTxUT3B0aW9uIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW29wdGlvbnMsIHNldE9wdGlvbnNdID0gdXNlU3RhdGU8cmVhZG9ubHkgVE9wdGlvbltdPihbXSk7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAvLyBUcmFjayB3aGF0IHZhbHVlIHdlJ3ZlIGxvYWRlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBBUEkgY2FsbHNcbiAgY29uc3QgbG9hZGVkVmFsdWVSZWYgPSB1c2VSZWY8VE9wdGlvbltUVmFsdWVLZXldIHwgbnVsbCB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZGVib3VuY2UoXG4gICAgICAgIChcbiAgICAgICAgICBwYXlsb2FkOiBBc3luY1NlbGVjdFBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB2b2lkXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbihjID0+IGNhbGxiYWNrKGMpKTtcbiAgICAgICAgfSxcbiAgICAgICAgNDAwXG4gICAgICApLFxuICAgIFtxdWVyeUZuXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvblt2YWx1ZUZpZWxkXSkgOiAnJztcbiAgICB9LFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9uID8gU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIC8vIEVmZmVjdDogSGFuZGxlIHNlYXJjaCBxdWVyeSBpbnB1dFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGZpZWxkLnZhbHVlO1xuXG4gICAgLy8gQ29uZGl0aW9uIDE6IEEgdmFsdWUgaXMgc2V0IGZyb20gdGhlIGZvcm0sIGFuZCB3ZSBoYXZlbid0IGxvYWRlZCBpdCB5ZXQuXG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAmJiBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ICE9PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgIC8vIERvbid0IGZldGNoIGlmIHRoZSBzZWxlY3RlZCBvcHRpb24gaXMgYWxyZWFkeSBjb3JyZWN0XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgZ2V0T3B0aW9uVmFsdWUoc2VsZWN0ZWRPcHRpb24pID09PSBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICBsb2FkZWRWYWx1ZVJlZi5jdXJyZW50ID0gY3VycmVudFZhbHVlO1xuXG4gICAgICBmZXRjaERhdGEoeyBRdWVyeTogbnVsbCwgU2VsZWN0ZWRWYWx1ZTogY3VycmVudFZhbHVlIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZE9wdGlvbiA9IHJlc3VsdHM/LmZpbmQoXG4gICAgICAgICAgb3B0aW9uID0+IFN0cmluZyhnZXRPcHRpb25WYWx1ZShvcHRpb24pKSA9PT0gU3RyaW5nKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobWF0Y2hlZE9wdGlvbikge1xuICAgICAgICAgIHNldE9wdGlvbnMoW21hdGNoZWRPcHRpb25dKTtcbiAgICAgICAgICBzZXRTZWxlY3RlZE9wdGlvbihtYXRjaGVkT3B0aW9uKTtcbiAgICAgICAgICBzZXRJbnB1dFZhbHVlKGdldE9wdGlvbkxhYmVsKG1hdGNoZWRPcHRpb24pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjsgLy8gRW5kIG9mIGVmZmVjdFxuICAgIH1cblxuICAgIC8vIENvbmRpdGlvbiAyOiBUaGUgdXNlciBpcyB0eXBpbmcgYSBzZWFyY2ggcXVlcnksIG9yIHRoZSBpbnB1dCBpcyBjbGVhcmVkLlxuICAgIC8vIFRoaXMgcnVucyBpZiB0aGUgaW5wdXQgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzZWxlY3RlZCBvcHRpb24ncyBsYWJlbC5cbiAgICBpZiAoaW5wdXRWYWx1ZSAhPT0gKHNlbGVjdGVkT3B0aW9uID8gZ2V0T3B0aW9uTGFiZWwoc2VsZWN0ZWRPcHRpb24pIDogJycpKSB7XG4gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgZW1wdHksIGNsZWFyIG9wdGlvbnMgaW1tZWRpYXRlbHkgd2l0aG91dCBhbiBBUEkgY2FsbC5cbiAgICAgIGlmIChpbnB1dFZhbHVlID09PSAnJykge1xuICAgICAgICBzZXRPcHRpb25zKFtdKTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2UsIGZldGNoIG5ldyBvcHRpb25zIGJhc2VkIG9uIHRoZSBpbnB1dC5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICAgIGZldGNoRGF0YSh7IFF1ZXJ5OiBpbnB1dFZhbHVlLCBTZWxlY3RlZFZhbHVlOiBudWxsIH0sIHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgc2V0T3B0aW9ucyhyZXN1bHRzIHx8IFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47IC8vIEVuZCBvZiBlZmZlY3RcbiAgICB9XG5cbiAgICAvLyBDb25kaXRpb24gMzogVGhlIHZhbHVlIGhhcyBiZWVuIGNsZWFyZWQgZnJvbSB0aGUgZm9ybS5cbiAgICBpZiAoIWN1cnJlbnRWYWx1ZSAmJiBzZWxlY3RlZE9wdGlvbikge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obnVsbCk7XG4gICAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICAgIHNldE9wdGlvbnMoW10pO1xuICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIFtcbiAgICBmaWVsZC52YWx1ZSxcbiAgICBpbnB1dFZhbHVlLFxuICAgIGZldGNoRGF0YSxcbiAgICBnZXRPcHRpb25MYWJlbCxcbiAgICBnZXRPcHRpb25WYWx1ZSxcbiAgICBzZWxlY3RlZE9wdGlvbixcbiAgICBsYWJlbEZpZWxkLFxuICAgIHZhbHVlRmllbGQsXG4gIF0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPz8gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChfOiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3U2VsZWN0ZWRPcHRpb246IFRPcHRpb24gfCBudWxsKSA9PiB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbihuZXdTZWxlY3RlZE9wdGlvbik7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld1NlbGVjdGVkT3B0aW9uXG4gICAgICAgID8gZ2V0T3B0aW9uVmFsdWUobmV3U2VsZWN0ZWRPcHRpb24pXG4gICAgICAgIDogbnVsbDtcblxuICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IG5ld1ZhbHVlIGFzXG4gICAgICAgIHwgVE9wdGlvbltUVmFsdWVLZXldXG4gICAgICAgIHwgbnVsbFxuICAgICAgICB8IHVuZGVmaW5lZDsgLy8gVHJhY2sgY2hhbmdlXG5cbiAgICAgIC8vIFN5bmMgaW5wdXQgdmFsdWUgd2l0aCB0aGUgc2VsZWN0aW9uXG4gICAgICBpZiAobmV3U2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZShnZXRPcHRpb25MYWJlbChuZXdTZWxlY3RlZE9wdGlvbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgICAgIHNldE9wdGlvbnMoW10pOyAvLyBDbGVhciBvcHRpb25zIHdoZW4gc2VsZWN0aW9uIGlzIGNsZWFyZWRcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmaWVsZCwgZ2V0T3B0aW9uVmFsdWUsIGdldE9wdGlvbkxhYmVsXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKF86IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdJbnB1dFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldElucHV0VmFsdWUobmV3SW5wdXRWYWx1ZSk7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUJsdXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gV2hlbiBmb2N1cyBpcyBsb3N0LCBzeW5jIHRoZSBpbnB1dCB2YWx1ZSBiYWNrIHRvIHRoZSBzZWxlY3RlZCBvcHRpb24ncyBsYWJlbFxuICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgc2V0SW5wdXRWYWx1ZShnZXRPcHRpb25MYWJlbChzZWxlY3RlZE9wdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBub3RoaW5nIGlzIHNlbGVjdGVkLCBjbGVhciB0aGUgaW5wdXRcbiAgICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIH1cbiAgfSwgW3NlbGVjdGVkT3B0aW9uLCBnZXRPcHRpb25MYWJlbF0pO1xuXG4gIGNvbnN0IGhhbmRsZU9wZW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0T3Blbih0cnVlKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldE9wZW4oZmFsc2UpO1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgb3Blbj17b3Blbn1cbiAgICAgIG9uT3Blbj17aGFuZGxlT3Blbn1cbiAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICAgICAgb25CbHVyPXtoYW5kbGVCbHVyfVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGdldE9wdGlvbktleT17Z2V0T3B0aW9uVmFsdWV9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgYXV0b0NvbXBsZXRlXG4gICAgICBkaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgIGluY2x1ZGVJbnB1dEluTGlzdFxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtzZWxlY3RlZE9wdGlvbn1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgZmlsdGVyT3B0aW9ucz17eCA9PiB4fVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgc3g9e3tcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpSW5wdXRCYXNlLXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJi5NdWktZGlzYWJsZWQgLk11aUF1dG9jb21wbGV0ZS1wb3B1cEluZGljYXRvcic6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aU91dGxpbmVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQgLk11aU91dGxpbmVkSW5wdXQtbm90Y2hlZE91dGxpbmUnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlGaWxsZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH19XG4gICAgICBub09wdGlvbnNUZXh0PVwiVHlwZSBTb21ldGhpbmcuLi5cIlxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgICAgPEZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxDaXJjdWxhclByb2dyZXNzIGNvbG9yPVwiaW5oZXJpdFwiIHNpemU9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH19XG4gICAgICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHJlbmRlck9wdGlvbj17KHJlbmRlclByb3BzLCBvcHRpb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIC4uLm9wdGlvblByb3BzIH0gPSByZW5kZXJQcm9wcztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIHtvcHRpb25bbGFiZWxGaWVsZF19XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmNvbnN0IEFzeW5jU2VsZWN0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBBc3luY1NlbGVjdEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFRPcHRpb25cbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlS2V5LCBUTGFiZWxLZXksIFRPcHRpb24+XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuQXN5bmNTZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0FzeW5jU2VsZWN0RWxlbWVudCc7XG5cbmV4cG9ydCB7IEFzeW5jU2VsZWN0RWxlbWVudCB9O1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZUVuaGFuY2VkVHJhbnNmb3JtIH0gZnJvbSAnQC9ob29rcyc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkVHlwZSB9IGZyb20gJ0AvaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICdAL3R5cGVzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlckZpZWxkRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBUZXh0RmllbGQgY29tcG9uZW50IHRvIHVzZSBpbnN0ZWFkIG9mIGRlZmF1bHQgTVVJIFRleHRGaWVsZFxuICAgKi9cbiAgY29tcG9uZW50PzogdHlwZW9mIFRleHRGaWVsZDtcbiAgLyoqXG4gICAqIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBmb3IgaW5wdXQvb3V0cHV0XG4gICAqIEBkZXByZWNhdGVkIFVzZSBmaWVsZFR5cGUgZm9yIGNvbW1vbiBwYXR0ZXJucyBvciBjdXN0b20gdHJhbnNmb3JtcyBmb3IgY29tcGxleCBjYXNlc1xuICAgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKiBUcmFuc2Zvcm0gdmFsdWUgYmVmb3JlIGRpc3BsYXlpbmcgaW4gaW5wdXQgKi9cbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUVmFsdWU7XG4gICAgLyoqIFRyYW5zZm9ybSBpbnB1dCBldmVudCB0byBmb3JtIHZhbHVlICovXG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKlxuICAgKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb25cbiAgICogQGV4YW1wbGUgJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAndGltZScgfCAnc2VsZWN0J1xuICAgKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZSB0byBkaXNwbGF5IHdoZW4gZmllbGQgdmFsdWUgaXMgbnVsbC91bmRlZmluZWRcbiAgICogQGV4YW1wbGUgXCJcIlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVFZhbHVlO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHRcbiAgICogQGV4YW1wbGUgXCJFbWFpbCBBZGRyZXNzXCJcbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGlucHV0XG4gICAqIEBleGFtcGxlIFwiRW50ZXIgeW91ciBlbWFpbFwiXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSB1bmRlcmx5aW5nIFRleHRGaWVsZCBjb21wb25lbnRcbiAgICovXG4gIHRleHRGaWVsZFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIG9uQ2hhbmdlIGhhbmRsZXIgY2FsbGVkIGFmdGVyIHRyYW5zZm9ybWF0aW9uXG4gICAqL1xuICBvbkNoYW5nZT86IChcbiAgICBldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBkZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9uIGlzc3Vlc1xuICAgKiBAZGVmYXVsdFZhbHVlIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gTnVtYmVyRmllbGRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4ocHJvcHM6IE51bWJlckZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIHRyYW5zZm9ybSxcbiAgICBmaWVsZFR5cGUgPSAndGV4dCcsIC8vIERlZmF1bHQgdG8gdGV4dCB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgZW5hYmxlV2FybmluZ3MgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyxcbiAgICBtYXhMZW5ndGgsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUgPSAnbnVtYmVyJyxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uSW5wdXQsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIC8vIFVzZSB0aGUgZW5oYW5jZWQgdHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KFxuICAgIHtcbiAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXQ6IHRyYW5zZm9ybS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdHJhbnNmb3JtLm91dHB1dCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGRUeXBlOiAhdHJhbnNmb3JtXG4gICAgICAgID8gdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IG1heExlbmd0aCAmJiBtYXhMZW5ndGggPiA1XG4gICAgICAgICAgICA/ICd0ZXh0J1xuICAgICAgICAgICAgOiAnbnVtYmVyJ1xuICAgICAgICAgIDogZmllbGRUeXBlXG4gICAgICAgIDogdW5kZWZpbmVkLCAvLyBBdXRvLWRldGVjdCBudW1iZXIgdHlwZVxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZW5hYmxlV2FybmluZ3MsXG4gICAgfVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUZXh0RmllbGRDb21wb25lbnRcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgey4uLnJlc3RUZXh0UHJvcHN9XG4gICAgICBuYW1lPXtmaWVsZC5uYW1lfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQudmFsdWU7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSAnJykge1xuICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgb25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbklucHV0PXsoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgIG1heExlbmd0aCAmJlxuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlLnNsaWNlKDAsIG1heExlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9uSW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbklucHV0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uV2hlZWw9e2UgPT4ge1xuICAgICAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmJsdXIoKTtcbiAgICAgIH19XG4gICAgICBvbktleURvd249e2UgPT4ge1xuICAgICAgICBpZiAoWydlJywgJ0UnLCAnQXJyb3dEb3duJywgJ0Fycm93VXAnXS5pbmNsdWRlcyhlLmtleSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICBsYWJlbD17bGFiZWx9XG4gICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgIGhlbHBlclRleHQ9e1xuICAgICAgICBlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IGhlbHBlclRleHRcbiAgICAgIH1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHNsb3RQcm9wcz17eyBodG1sSW5wdXQ6IHsgbWF4TGVuZ3RoIH0gfX1cbiAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIFRleHRGaWVsZCBjb21wb25lbnQgd2l0aCBhdXRvbWF0aWMgdmFsaWRhdGlvbixcbiAqIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMsIGFuZCBidWlsdC1pbiBmaWVsZCB0eXBlIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheSB3aXRoIGN1c3RvbSBwYXJzaW5nXG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHN1cHBvcnRcbiAqIC0gQnVpbHQtaW4gZmllbGQgdHlwZXMgZm9yIGNvbW1vbiBwYXR0ZXJuc1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gT3B0aW1pemVkIG51bWJlciBpbnB1dCBoYW5kbGluZ1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdHlsaW5nXG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCBtZW1vaXplZCB0cmFuc2Zvcm1hdGlvbnNcbiAqIC0gRGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZ1xuICogLSBTdGFibGUgcmVmZXJlbmNlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBidWlsdC1pbiBudW1iZXIgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhZ2VcIlxuICogICBsYWJlbD1cIkFnZVwiXG4gKiAgIGZpZWxkVHlwZT1cIm51bWJlclwiXG4gKiAgIHJ1bGVzPXt7IHJlcXVpcmVkOiAnQWdlIGlzIHJlcXVpcmVkJywgbWluOiB7IHZhbHVlOiAwLCBtZXNzYWdlOiAnQWdlIG11c3QgYmUgcG9zaXRpdmUnIH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQWR2YW5jZWQgdXNhZ2Ugd2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJlbWFpbFwiXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGVtYWlsIGFkZHJlc3NcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgcnVsZXM9e3tcbiAqICAgICByZXF1aXJlZDogJ0VtYWlsIGlzIHJlcXVpcmVkJyxcbiAqICAgICBwYXR0ZXJuOiB7IHZhbHVlOiAvXFxTK0BcXFMrXFwuXFxTKy8sIG1lc3NhZ2U6ICdJbnZhbGlkIGVtYWlsJyB9XG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSB0cmFuc2Zvcm1hdGlvbjpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInByaWNlXCJcbiAqICAgbGFiZWw9XCJQcmljZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID8gYCQke3ZhbHVlfWAgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VGbG9hdChldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgnJCcsICcnKSkgfHwgbnVsbFxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBlcnJvciBwYXJzaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidXNlcm5hbWVcIlxuICogICBsYWJlbD1cIlVzZXJuYW1lXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gKFxuICogICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAncmVkJyB9fT5cbiAqICAgICAgIFx1MjZBMFx1RkUwRiB7ZXJyb3IubWVzc2FnZX1cbiAqICAgICA8L3NwYW4+XG4gKiAgICl9XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1iZXJGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogTnVtYmVyRmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPik6IFJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEJveFByb3BzLCBGb3JtSGVscGVyVGV4dFByb3BzLCBHcmlkUHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEJveCwgR3JpZCwgaW5wdXRCYXNlQ2xhc3NlcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgTXVpT3RwSW5wdXQsXG4gIHR5cGUgTXVpT3RwSW5wdXRQcm9wcyxcbn0gZnJvbSAnbXVpLW9uZS10aW1lLXBhc3N3b3JkLWlucHV0JztcbmltcG9ydCB0eXBlIHsgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgSGVscGVyVGV4dCB9IGZyb20gJy4vSGVscGVyVGV4dCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT1RQSW5wdXRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJmaXJzdE5hbWVcIiB8IFwidXNlci5lbWFpbFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlclxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZmllbGQgZXJyb3Igb2JqZWN0XG4gICAqIEByZXR1cm5zIEN1c3RvbSBlcnJvciBtZXNzYWdlIG9yIGNvbXBvbmVudFxuICAgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcblxuICBtYXhTaXplPzogbnVtYmVyO1xuXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuXG4gIGhlbHBlclRleHQ/OiBSZWFjdC5SZWFjdE5vZGU7XG5cbiAgc2xvdFByb3BzPzoge1xuICAgIHdyYXBwZXI/OiBCb3hQcm9wcztcbiAgICBoZWxwZXJUZXh0PzogRm9ybUhlbHBlclRleHRQcm9wcztcbiAgICB0ZXh0ZmllbGQ/OiBNdWlPdHBJbnB1dFByb3BzWydUZXh0RmllbGRzUHJvcHMnXTtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBPVFBJbnB1dEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IE9UUElucHV0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICAvLyBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBzbG90UHJvcHMsXG4gICAgaGVscGVyVGV4dCxcbiAgICBtYXhTaXplID0gNTYsXG4gICAgcGxhY2Vob2xkZXIgPSAnLScsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgLy8gY29uc3Qge1xuICAvLyAgIGZpZWxkLFxuICAvLyAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgLy8gfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAvLyAgIG5hbWUsXG4gIC8vICAgY29udHJvbCxcbiAgLy8gfSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29udHJvbGxlclxuICAgICAgbmFtZT17bmFtZX1cbiAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICByZW5kZXI9eyh7IGZpZWxkLCBmaWVsZFN0YXRlOiB7IGVycm9yIH0gfSkgPT4gKFxuICAgICAgICA8Qm94XG4gICAgICAgICAgey4uLnNsb3RQcm9wcz8ud3JhcHBlcn1cbiAgICAgICAgICBzeD17W1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgW2AmIC4ke2lucHV0QmFzZUNsYXNzZXMuaW5wdXR9YF06IHtcbiAgICAgICAgICAgICAgICBwOiAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIGFzcGVjdFJhdGlvOiAnMS8xJyxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogbWF4U2l6ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShzbG90UHJvcHM/LndyYXBwZXI/LnN4KVxuICAgICAgICAgICAgICA/IChzbG90UHJvcHM/LndyYXBwZXI/LnN4ID8/IFtdKVxuICAgICAgICAgICAgICA6IFtzbG90UHJvcHM/LndyYXBwZXI/LnN4XSksXG4gICAgICAgICAgXX1cbiAgICAgICAgPlxuICAgICAgICAgIDxNdWlPdHBJbnB1dFxuICAgICAgICAgICAgey4uLmZpZWxkfVxuICAgICAgICAgICAgYXV0b0ZvY3VzXG4gICAgICAgICAgICBnYXA9ezEuNX1cbiAgICAgICAgICAgIGxlbmd0aD17NH1cbiAgICAgICAgICAgIFRleHRGaWVsZHNQcm9wcz17e1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgICAgIC4uLnNsb3RQcm9wcz8udGV4dGZpZWxkLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICA8SGVscGVyVGV4dFxuICAgICAgICAgICAgey4uLnNsb3RQcm9wcz8uaGVscGVyVGV4dH1cbiAgICAgICAgICAgIGVycm9yTWVzc2FnZT17ZXJyb3I/Lm1lc3NhZ2V9XG4gICAgICAgICAgICBoZWxwZXJUZXh0PXtoZWxwZXJUZXh0fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IE9UUElucHV0RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogT1RQSW5wdXRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBGb3JtSGVscGVyVGV4dFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9Gb3JtSGVscGVyVGV4dCc7XG5pbXBvcnQgRm9ybUhlbHBlclRleHQgZnJvbSAnQG11aS9tYXRlcmlhbC9Gb3JtSGVscGVyVGV4dCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgSGVscGVyVGV4dFByb3BzID0gRm9ybUhlbHBlclRleHRQcm9wcyAmIHtcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBkaXNhYmxlR3V0dGVycz86IGJvb2xlYW47XG4gIGhlbHBlclRleHQ/OiBSZWFjdC5SZWFjdE5vZGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gSGVscGVyVGV4dCh7XG4gIHN4LFxuICBoZWxwZXJUZXh0LFxuICBlcnJvck1lc3NhZ2UsXG4gIGRpc2FibGVHdXR0ZXJzLFxuICAuLi5vdGhlclxufTogSGVscGVyVGV4dFByb3BzKSB7XG4gIGlmIChlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Rm9ybUhlbHBlclRleHRcbiAgICAgICAgZXJyb3I9eyEhZXJyb3JNZXNzYWdlfVxuICAgICAgICBzeD17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG14OiBkaXNhYmxlR3V0dGVycyA/IDAgOiAxLjc1LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc3gpID8gc3ggOiBbc3hdKSxcbiAgICAgICAgXX1cbiAgICAgICAgey4uLm90aGVyfVxuICAgICAgPlxuICAgICAgICB7ZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHR9XG4gICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyBBc3luY1NlbGVjdE11bHRpRWxlbWVudCB9IGZyb20gJy4uL0FzeW5jTXVsdGlTZWxlY3QvQXN5bmNNdWx0aVNlbGVjdCc7XG5pbXBvcnQgeyBBc3luY1NlbGVjdEVsZW1lbnQgfSBmcm9tICcuLi9Bc3luY1NlbGVjdCc7XG5pbXBvcnQgeyBDaGVja2JveEVsZW1lbnQgfSBmcm9tICcuLi9DaGVja2JveEVsZW1lbnQnO1xuaW1wb3J0IHsgQ2hlY2tib3hHcm91cEVsZW1lbnQgfSBmcm9tICcuLi9DaGVja2JveEdyb3VwJztcbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50IH0gZnJvbSAnLi4vRGF0ZVBpY2tlckVsZW1lbnQnO1xuaW1wb3J0IHsgTnVtYmVyRmllbGRFbGVtZW50IH0gZnJvbSAnLi4vTnVtYmVyRmllbGRFbGVtZW50JztcbmltcG9ydCB7IE9UUElucHV0RWxlbWVudCB9IGZyb20gJy4uL09UUElucHV0RWxlbWVudC9PVFBJbnB1dEVsZW1lbnQnO1xuaW1wb3J0IHsgUGFzc3dvcmRFbGVtZW50IH0gZnJvbSAnLi4vUGFzc3dvcmRFbGVtZW50JztcbmltcG9ydCB7IFJhZGlvQnV0dG9uR3JvdXAgfSBmcm9tICcuLi9SYWRpb0J1dHRvbkdyb3VwJztcbmltcG9ydCB7IFNlbGVjdENhc2NhZGVFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0Q2FzY2FkZUVsZW1lbnQnO1xuaW1wb3J0IHsgU2VsZWN0RWxlbWVudCB9IGZyb20gJy4uL1NlbGVjdEVsZW1lbnQnO1xuaW1wb3J0IHsgU2VsZWN0TXVsdGlFbGVtZW50IH0gZnJvbSAnLi4vU2VsZWN0TXVsdGlFbGVtZW50JztcbmltcG9ydCB7IFRleHRGaWVsZEVsZW1lbnQgfSBmcm9tICcuLi9UZXh0RmllbGRFbGVtZW50JztcbmltcG9ydCB7IFRpbWVQaWNrZXJFbGVtZW50IH0gZnJvbSAnLi4vVGltZVBpY2tlckVsZW1lbnQnO1xuXG5jb25zdCBGaWVsZCA9IHtcbiAgVGV4dDogVGV4dEZpZWxkRWxlbWVudCxcbiAgTnVtYmVyOiBOdW1iZXJGaWVsZEVsZW1lbnQsXG4gIENoZWNrYm94OiBDaGVja2JveEVsZW1lbnQsXG4gIERhdGU6IERhdGVQaWNrZXJFbGVtZW50LFxuICBSYWRpb0dyb3VwOiBSYWRpb0J1dHRvbkdyb3VwLFxuICBQYXNzd29yZDogUGFzc3dvcmRFbGVtZW50LFxuICBUaW1lOiBUaW1lUGlja2VyRWxlbWVudCxcbiAgU2VsZWN0OiBTZWxlY3RFbGVtZW50LFxuICBTZWxlY3RNdWx0aTogU2VsZWN0TXVsdGlFbGVtZW50LFxuICBTZWxlY3RDYXNjYWRlOiBTZWxlY3RDYXNjYWRlRWxlbWVudCxcbiAgQXN5bmNTZWxlY3Q6IEFzeW5jU2VsZWN0RWxlbWVudCxcbiAgQXN5bmNNdWx0aVNlbGVjdDogQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQsXG4gIENoZWNrYm94R3JvdXA6IENoZWNrYm94R3JvdXBFbGVtZW50LFxuICBPVFBJbnB1dDogT1RQSW5wdXRFbGVtZW50LFxufTtcblxuZXhwb3J0IHsgRmllbGQgfTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7OztBQTRGTyxTQUFTLGNBQWMsT0FBcUM7QUFDakUsU0FDRSxPQUFPLFVBQVUsWUFDakIsVUFBVSxRQUNWLFdBQVcsU0FDWCxXQUFXLFNBQ1gsT0FBUSxNQUFxQixVQUFVLGFBQ3RDLE9BQVEsTUFBcUIsVUFBVSxZQUN0QyxPQUFRLE1BQXFCLFVBQVUsWUFDdkMsT0FBUSxNQUFxQixVQUFVO0FBRTdDO0FBWU8sU0FBUyxpQkFDZCxTQUNBLGFBQWEsU0FDYixhQUFhLFNBQ0M7QUFDZCxTQUFPLFFBQVEsSUFBSSxhQUFXO0FBQUEsSUFDNUIsT0FBTyxPQUFPLE9BQU8sVUFBVSxLQUFLLEVBQUU7QUFBQSxJQUN0QyxPQUFPLE9BQU8sVUFBVTtBQUFBLElBQ3hCLFVBQVUsUUFBUSxPQUFPLFFBQVE7QUFBQSxFQUNuQyxFQUFFO0FBQ0o7OztBQzdIQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxPQUFPLFdBQVc7QUFDbEIsT0FBTyxXQUFXO0FBQ2xCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMscUJBQXFCO0FBdVJoQixTQUVJLEtBRko7QUFoUmQsSUFBTSxZQUFZLFNBQVMsd0JBVXpCLE9BT0E7QUFDQSxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsYUFBYTtBQUFBLElBQ2IsYUFBYTtBQUFBLElBQ2IsR0FBRztB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QUFHLFdBQ2xCLDBCQUFBSixNQUFDRSxhQUFBLEVBQVcsR0FBRyxPQUFPLEdBQ3hCO0FBRUo7OztBRXRIQSxJQUFNLFFBQVE7QUFBQSxFQUNaLE1BQU1HO0FBQUEsRUFDTixRQUFRQztBQUFBLEVBQ1IsVUFBVUM7QUFBQSxFQUNWLE1BQU07QUFBQSxFQUNOLFlBQVlDO0FBQUEsRUFDWixVQUFVO0FBQUEsRUFDVixNQUFNQztBQUFBLEVBQ04sUUFBUUM7QUFBQSxFQUNSLGFBQWFDO0FBQUEsRUFDYixlQUFlQztBQUFBLEVBQ2YsYUFBYUM7QUFBQSxFQUNiLGtCQUFrQkM7QUFBQSxFQUNsQixlQUFlO0FBQUEsRUFDZixVQUFVQztBQUNaOyIsCiAgIm5hbWVzIjogWyJwcm9wcyIsICJBc3luY1NlbGVjdE11bHRpRWxlbWVudCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiQ2hlY2tib3hFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtR3JvdXAiLCAiRm9ybUhlbHBlclRleHQiLCAiR3JpZCIsICJ1c2VDYWxsYmFjayIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJHcmlkIiwgImZvcndhcmRSZWYiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlTWVtbyIsICJ1c2VUaGVtZSIsICJ1c2VNZW1vIiwgImpzeCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAianN4IiwgImZvcndhcmRSZWYiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJHcmlkIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJwYXNzd29yZCIsICJGb3JtQ29udHJvbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkZvcm1MYWJlbCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUxhYmVsIiwgIkZvcm1Db250cm9sTGFiZWwiLCAiRm9ybUhlbHBlclRleHQiLCAiUmFkaW9CdXR0b25Hcm91cCIsICJHcmlkIiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgIkF1dG9jb21wbGV0ZSIsICJ1c2VUaGVtZSIsICJ1c2VSZWYiLCAidXNlRWZmZWN0IiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlNlbGVjdENhc2NhZGVFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgIkF1dG9jb21wbGV0ZSIsICJ1c2VUaGVtZSIsICJ1c2VNZW1vIiwgInVzZUVmZmVjdCIsICJ1c2VDYWxsYmFjayIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiU2VsZWN0RWxlbWVudCIsICJHcmlkIiwgIkNoZWNrYm94IiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAiQ2lyY3VsYXJQcm9ncmVzcyIsICJ1c2VUaGVtZSIsICJGcmFnbWVudCIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJTZWxlY3RNdWx0aUVsZW1lbnQiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAiVGV4dEZpZWxkIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlRm9ya1JlZiIsICJUZXh0RmllbGRFbGVtZW50IiwgIkdyaWQiLCAiR3JpZCIsICJ1c2VGb3JrUmVmIiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgInVzZUxvY2FsaXphdGlvbkNvbnRleHQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VGb3JrUmVmIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIkdyaWQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlVGhlbWUiLCAiZGVib3VuY2UiLCAiRnJhZ21lbnQiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlUmVmIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJUZXh0RmllbGQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VGb3JrUmVmIiwgIk51bWJlckZpZWxkRWxlbWVudCIsICJHcmlkIiwgIkdyaWQiLCAiRm9ybUhlbHBlclRleHQiLCAianN4IiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJPVFBJbnB1dEVsZW1lbnQiLCAiR3JpZCIsICJUZXh0RmllbGRFbGVtZW50IiwgIk51bWJlckZpZWxkRWxlbWVudCIsICJDaGVja2JveEVsZW1lbnQiLCAiUmFkaW9CdXR0b25Hcm91cCIsICJUaW1lUGlja2VyRWxlbWVudCIsICJTZWxlY3RFbGVtZW50IiwgIlNlbGVjdE11bHRpRWxlbWVudCIsICJTZWxlY3RDYXNjYWRlRWxlbWVudCIsICJBc3luY1NlbGVjdEVsZW1lbnQiLCAiQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQiLCAiT1RQSW5wdXRFbGVtZW50Il0KfQo=