@gnwebsoft/ui 4.0.45 → 4.0.46
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.
- package/dist/chunk-73DUUDND.cjs +1 -1
- package/dist/chunk-FMN47XRJ.cjs +1 -1
- package/dist/chunk-QYHJIPSZ.cjs +1 -1
- package/dist/chunk-RHHSEHEI.cjs +1 -1
- package/dist/chunk-SOJFG2NX.js +3243 -0
- package/dist/{chunk-Z4L5OX4G.cjs → chunk-URX55R3O.cjs} +577 -17
- package/dist/core/index.cjs +1 -1
- package/dist/hooks/index.cjs +1 -1
- package/dist/index.cjs +11 -3
- package/dist/index.js +9 -1
- package/dist/types/index.cjs +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/wrappers/Field/index.d.ts +1 -0
- package/dist/wrappers/Field/index.d.ts.map +1 -1
- package/dist/wrappers/PhoneNumberElement/CountrySelector.d.ts +21 -0
- package/dist/wrappers/PhoneNumberElement/CountrySelector.d.ts.map +1 -0
- package/dist/wrappers/PhoneNumberElement/PhoneNumberElement.d.ts +60 -0
- package/dist/wrappers/PhoneNumberElement/PhoneNumberElement.d.ts.map +1 -0
- package/dist/wrappers/PhoneNumberElement/countries.d.ts +18 -0
- package/dist/wrappers/PhoneNumberElement/countries.d.ts.map +1 -0
- package/dist/wrappers/PhoneNumberElement/index.d.ts +3 -0
- package/dist/wrappers/PhoneNumberElement/index.d.ts.map +1 -0
- package/dist/wrappers/index.cjs +11 -3
- package/dist/wrappers/index.d.ts +1 -0
- package/dist/wrappers/index.d.ts.map +1 -1
- package/dist/wrappers/index.js +9 -1
- package/package.json +1 -1
- package/dist/chunk-YXC5EDHR.js +0 -2683
|
@@ -0,0 +1,3243 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useEnhancedTransform,
|
|
3
|
+
useTransform
|
|
4
|
+
} from "./chunk-PW777IOX.js";
|
|
5
|
+
import {
|
|
6
|
+
readValueAsDate
|
|
7
|
+
} from "./chunk-N37HXJT5.js";
|
|
8
|
+
|
|
9
|
+
// src/wrappers/types/common.ts
|
|
10
|
+
function isValidOption(value) {
|
|
11
|
+
return typeof value === "object" && value !== null && "Label" in value && "Value" in value && typeof value.Label === "string" && (typeof value.Value === "string" || typeof value.Value === "number" || typeof value.Value === "boolean");
|
|
12
|
+
}
|
|
13
|
+
function normalizeOptions(options, labelField = "Label", valueField = "Value") {
|
|
14
|
+
return options.map((option) => ({
|
|
15
|
+
Label: String(option[labelField] ?? ""),
|
|
16
|
+
Value: option[valueField],
|
|
17
|
+
disabled: Boolean(option.disabled)
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// src/wrappers/AsyncMultiSelect/AsyncMultiSelect.tsx
|
|
22
|
+
import {
|
|
23
|
+
Autocomplete,
|
|
24
|
+
CircularProgress,
|
|
25
|
+
debounce,
|
|
26
|
+
Grid,
|
|
27
|
+
TextField,
|
|
28
|
+
useTheme
|
|
29
|
+
} from "@mui/material";
|
|
30
|
+
import match from "autosuggest-highlight/match";
|
|
31
|
+
import parse from "autosuggest-highlight/parse";
|
|
32
|
+
import {
|
|
33
|
+
useState,
|
|
34
|
+
useRef,
|
|
35
|
+
useMemo,
|
|
36
|
+
useEffect,
|
|
37
|
+
useCallback,
|
|
38
|
+
Fragment
|
|
39
|
+
} from "react";
|
|
40
|
+
import { useController } from "react-hook-form";
|
|
41
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
42
|
+
var Component = function AsyncSelectMultiElement(props) {
|
|
43
|
+
const {
|
|
44
|
+
name,
|
|
45
|
+
disabled,
|
|
46
|
+
control,
|
|
47
|
+
placeholder,
|
|
48
|
+
label,
|
|
49
|
+
queryFn,
|
|
50
|
+
variant,
|
|
51
|
+
labelField = "Label",
|
|
52
|
+
valueField = "Value",
|
|
53
|
+
...rest
|
|
54
|
+
} = props;
|
|
55
|
+
const {
|
|
56
|
+
field,
|
|
57
|
+
fieldState: { error }
|
|
58
|
+
} = useController({
|
|
59
|
+
name,
|
|
60
|
+
control
|
|
61
|
+
});
|
|
62
|
+
const theme = useTheme();
|
|
63
|
+
const [selectedOptions, setSelectedOptions] = useState([]);
|
|
64
|
+
const [inputValue, setInputValue] = useState("");
|
|
65
|
+
const [options, setOptions] = useState([]);
|
|
66
|
+
const [loading, setLoading] = useState(false);
|
|
67
|
+
const loadedValuesRef = useRef([]);
|
|
68
|
+
const isInitialPopulationActive = useRef(false);
|
|
69
|
+
const lastFetchedSearchTermRef = useRef(null);
|
|
70
|
+
const initialLoadCompleteRef = useRef(false);
|
|
71
|
+
const selectedOptionsRef = useRef([]);
|
|
72
|
+
const getOptionValue = useCallback(
|
|
73
|
+
(option) => option ? String(option[valueField]) : "",
|
|
74
|
+
[valueField]
|
|
75
|
+
);
|
|
76
|
+
const getOptionLabel = useCallback(
|
|
77
|
+
(option) => option ? String(option[labelField]) : "",
|
|
78
|
+
[labelField]
|
|
79
|
+
);
|
|
80
|
+
const fetchData = useMemo(
|
|
81
|
+
() => debounce(
|
|
82
|
+
(payload, callback) => {
|
|
83
|
+
queryFn(payload).then((c) => {
|
|
84
|
+
if (Array.isArray(c)) {
|
|
85
|
+
callback(c);
|
|
86
|
+
} else if (c && Array.isArray(c.data)) {
|
|
87
|
+
callback(
|
|
88
|
+
c.data
|
|
89
|
+
);
|
|
90
|
+
} else if (c && Array.isArray(c.Data)) {
|
|
91
|
+
callback(
|
|
92
|
+
c.Data
|
|
93
|
+
);
|
|
94
|
+
} else {
|
|
95
|
+
callback([]);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
},
|
|
99
|
+
400
|
|
100
|
+
),
|
|
101
|
+
[queryFn]
|
|
102
|
+
);
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
selectedOptionsRef.current = selectedOptions;
|
|
105
|
+
}, [selectedOptions]);
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
const formValues = Array.isArray(field.value) ? field.value : [];
|
|
108
|
+
if (initialLoadCompleteRef.current && JSON.stringify(formValues) === JSON.stringify(loadedValuesRef.current)) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (formValues.length === 0) {
|
|
112
|
+
setSelectedOptions([]);
|
|
113
|
+
setOptions([]);
|
|
114
|
+
loadedValuesRef.current = [];
|
|
115
|
+
lastFetchedSearchTermRef.current = null;
|
|
116
|
+
initialLoadCompleteRef.current = true;
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
let active = true;
|
|
120
|
+
setLoading(true);
|
|
121
|
+
isInitialPopulationActive.current = true;
|
|
122
|
+
loadedValuesRef.current = formValues;
|
|
123
|
+
initialLoadCompleteRef.current = true;
|
|
124
|
+
fetchData({ Query: null, SelectedValue: formValues }, (results) => {
|
|
125
|
+
if (active) {
|
|
126
|
+
const fetchedOptions = results || [];
|
|
127
|
+
setSelectedOptions([...fetchedOptions]);
|
|
128
|
+
setOptions(fetchedOptions);
|
|
129
|
+
}
|
|
130
|
+
setLoading(false);
|
|
131
|
+
isInitialPopulationActive.current = false;
|
|
132
|
+
});
|
|
133
|
+
return () => {
|
|
134
|
+
active = false;
|
|
135
|
+
};
|
|
136
|
+
}, [field.value, fetchData]);
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
if (isInitialPopulationActive.current || !initialLoadCompleteRef.current) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (!inputValue) {
|
|
142
|
+
if (selectedOptionsRef.current.length === 0) {
|
|
143
|
+
setOptions([]);
|
|
144
|
+
} else {
|
|
145
|
+
setOptions(selectedOptionsRef.current);
|
|
146
|
+
}
|
|
147
|
+
lastFetchedSearchTermRef.current = null;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (inputValue === lastFetchedSearchTermRef.current) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
let active = true;
|
|
154
|
+
setLoading(true);
|
|
155
|
+
fetchData({ Query: inputValue, SelectedValue: null }, (searchResults) => {
|
|
156
|
+
if (active) {
|
|
157
|
+
const results = searchResults || [];
|
|
158
|
+
const currentSelected = selectedOptionsRef.current;
|
|
159
|
+
const selectedOptionIds = new Set(
|
|
160
|
+
currentSelected.map((opt) => getOptionValue(opt))
|
|
161
|
+
);
|
|
162
|
+
const combined = [...currentSelected];
|
|
163
|
+
results.forEach((result) => {
|
|
164
|
+
if (!selectedOptionIds.has(getOptionValue(result))) {
|
|
165
|
+
combined.push(result);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
setOptions(combined);
|
|
169
|
+
lastFetchedSearchTermRef.current = inputValue;
|
|
170
|
+
}
|
|
171
|
+
setLoading(false);
|
|
172
|
+
});
|
|
173
|
+
return () => {
|
|
174
|
+
active = false;
|
|
175
|
+
};
|
|
176
|
+
}, [inputValue, fetchData, getOptionValue]);
|
|
177
|
+
const handleChange = (_, newSelectedOptions) => {
|
|
178
|
+
setSelectedOptions(newSelectedOptions);
|
|
179
|
+
const newValues = newSelectedOptions.map((c) => c[valueField]);
|
|
180
|
+
field.onChange(newValues.length === 0 ? null : newValues);
|
|
181
|
+
loadedValuesRef.current = newValues;
|
|
182
|
+
setOptions(newSelectedOptions);
|
|
183
|
+
setInputValue("");
|
|
184
|
+
lastFetchedSearchTermRef.current = null;
|
|
185
|
+
};
|
|
186
|
+
const isDisabled = useMemo(() => {
|
|
187
|
+
return disabled ?? false;
|
|
188
|
+
}, [disabled]);
|
|
189
|
+
return /* @__PURE__ */ jsx(
|
|
190
|
+
Autocomplete,
|
|
191
|
+
{
|
|
192
|
+
multiple: true,
|
|
193
|
+
loading,
|
|
194
|
+
getOptionLabel,
|
|
195
|
+
isOptionEqualToValue: (option, val) => getOptionValue(option) === getOptionValue(val),
|
|
196
|
+
options,
|
|
197
|
+
value: selectedOptions,
|
|
198
|
+
disabled,
|
|
199
|
+
filterSelectedOptions: true,
|
|
200
|
+
filterOptions: (x) => x,
|
|
201
|
+
noOptionsText: "Type Something...",
|
|
202
|
+
onChange: handleChange,
|
|
203
|
+
sx: {
|
|
204
|
+
"&.Mui-disabled": {
|
|
205
|
+
cursor: "not-allowed !important"
|
|
206
|
+
},
|
|
207
|
+
"& .MuiInputBase-root.Mui-disabled": {
|
|
208
|
+
backgroundColor: theme.palette.action.disabledBackground,
|
|
209
|
+
cursor: "not-allowed !important"
|
|
210
|
+
},
|
|
211
|
+
"&.Mui-disabled .MuiAutocomplete-popupIndicator": {
|
|
212
|
+
cursor: "not-allowed !important"
|
|
213
|
+
},
|
|
214
|
+
"& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
|
|
215
|
+
borderColor: error ? "red" : void 0
|
|
216
|
+
},
|
|
217
|
+
"& .MuiFilledInput-root.Mui-disabled": {
|
|
218
|
+
borderColor: error ? "red" : void 0
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
onInputChange: (_, newInputValue) => setInputValue(newInputValue),
|
|
222
|
+
renderInput: (params) => /* @__PURE__ */ jsx(
|
|
223
|
+
TextField,
|
|
224
|
+
{
|
|
225
|
+
...params,
|
|
226
|
+
label,
|
|
227
|
+
error: !!error,
|
|
228
|
+
helperText: error ? error.message : "",
|
|
229
|
+
placeholder,
|
|
230
|
+
InputProps: {
|
|
231
|
+
...params.InputProps,
|
|
232
|
+
endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
233
|
+
loading ? /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }) : null,
|
|
234
|
+
params.InputProps.endAdornment
|
|
235
|
+
] })
|
|
236
|
+
},
|
|
237
|
+
variant: variant ? variant : "outlined"
|
|
238
|
+
}
|
|
239
|
+
),
|
|
240
|
+
renderOption: (props2, option, state) => {
|
|
241
|
+
const { key, ...optionProps } = props2;
|
|
242
|
+
const optionLabel = getOptionLabel(option);
|
|
243
|
+
const matches = match(optionLabel, state.inputValue, {
|
|
244
|
+
insideWords: true
|
|
245
|
+
});
|
|
246
|
+
const parts = parse(optionLabel, matches);
|
|
247
|
+
return /* @__PURE__ */ jsx("li", { ...optionProps, children: /* @__PURE__ */ jsx("div", { children: parts.map((part, index) => /* @__PURE__ */ jsx(
|
|
248
|
+
"span",
|
|
249
|
+
{
|
|
250
|
+
style: {
|
|
251
|
+
fontWeight: part.highlight ? 700 : 400
|
|
252
|
+
},
|
|
253
|
+
children: part.text
|
|
254
|
+
},
|
|
255
|
+
index
|
|
256
|
+
)) }) }, key);
|
|
257
|
+
},
|
|
258
|
+
...rest
|
|
259
|
+
}
|
|
260
|
+
);
|
|
261
|
+
};
|
|
262
|
+
var AsyncSelectMultiElement2 = ({
|
|
263
|
+
gridProps,
|
|
264
|
+
...props
|
|
265
|
+
}) => {
|
|
266
|
+
if (gridProps) {
|
|
267
|
+
return /* @__PURE__ */ jsx(
|
|
268
|
+
Grid,
|
|
269
|
+
{
|
|
270
|
+
...{ size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }, ...gridProps },
|
|
271
|
+
children: /* @__PURE__ */ jsx(
|
|
272
|
+
Component,
|
|
273
|
+
{
|
|
274
|
+
...props
|
|
275
|
+
}
|
|
276
|
+
)
|
|
277
|
+
}
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
return /* @__PURE__ */ jsx(Component, { ...props });
|
|
281
|
+
};
|
|
282
|
+
AsyncSelectMultiElement2.displayName = "AsyncSelectMulti";
|
|
283
|
+
|
|
284
|
+
// src/wrappers/CheckboxElement/CheckboxElement.tsx
|
|
285
|
+
import {
|
|
286
|
+
Checkbox,
|
|
287
|
+
FormControl,
|
|
288
|
+
FormControlLabel,
|
|
289
|
+
FormGroup,
|
|
290
|
+
FormHelperText,
|
|
291
|
+
Grid as Grid2
|
|
292
|
+
} from "@mui/material";
|
|
293
|
+
import { useController as useController2 } from "react-hook-form";
|
|
294
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
295
|
+
var Component2 = function CheckboxElement(props) {
|
|
296
|
+
const {
|
|
297
|
+
name,
|
|
298
|
+
control,
|
|
299
|
+
label,
|
|
300
|
+
labelProps,
|
|
301
|
+
helperText,
|
|
302
|
+
parseError,
|
|
303
|
+
transform,
|
|
304
|
+
disabled,
|
|
305
|
+
onChange: customOnChange,
|
|
306
|
+
...rest
|
|
307
|
+
} = props;
|
|
308
|
+
const {
|
|
309
|
+
field,
|
|
310
|
+
fieldState: { error }
|
|
311
|
+
} = useController2({
|
|
312
|
+
name,
|
|
313
|
+
control,
|
|
314
|
+
disabled
|
|
315
|
+
});
|
|
316
|
+
if (field.value == null || field.value == void 0) {
|
|
317
|
+
field.onChange(false);
|
|
318
|
+
}
|
|
319
|
+
const customOutputTransform = transform?.output;
|
|
320
|
+
const { value, onChange } = useTransform({
|
|
321
|
+
value: field.value,
|
|
322
|
+
onChange: field.onChange,
|
|
323
|
+
transform: {
|
|
324
|
+
input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
|
|
325
|
+
output: typeof customOutputTransform === "function" ? (eventOrValue, _value) => {
|
|
326
|
+
const event = eventOrValue;
|
|
327
|
+
const checked = _value;
|
|
328
|
+
return customOutputTransform(event, checked);
|
|
329
|
+
} : (eventOrValue, _value) => {
|
|
330
|
+
const checked = _value;
|
|
331
|
+
return checked;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
const handleChange = (event, checked) => {
|
|
336
|
+
onChange(event, checked);
|
|
337
|
+
if (typeof customOnChange === "function") {
|
|
338
|
+
customOnChange(event, checked);
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
|
|
342
|
+
return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
|
|
343
|
+
/* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
|
|
344
|
+
FormControlLabel,
|
|
345
|
+
{
|
|
346
|
+
label: label || "",
|
|
347
|
+
...labelProps,
|
|
348
|
+
disabled,
|
|
349
|
+
control: /* @__PURE__ */ jsx2(
|
|
350
|
+
Checkbox,
|
|
351
|
+
{
|
|
352
|
+
...rest,
|
|
353
|
+
color: rest.color || "primary",
|
|
354
|
+
checked: value,
|
|
355
|
+
disabled,
|
|
356
|
+
onChange: handleChange,
|
|
357
|
+
ref: field.ref
|
|
358
|
+
}
|
|
359
|
+
)
|
|
360
|
+
}
|
|
361
|
+
) }),
|
|
362
|
+
(displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
|
|
363
|
+
] });
|
|
364
|
+
};
|
|
365
|
+
var CheckboxElement2 = ({
|
|
366
|
+
gridProps = {},
|
|
367
|
+
...props
|
|
368
|
+
}) => {
|
|
369
|
+
return /* @__PURE__ */ jsx2(Grid2, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx2(Component2, { ...props }) });
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
// src/wrappers/CheckboxGroup/CheckboxGroup.tsx
|
|
373
|
+
import {
|
|
374
|
+
Checkbox as Checkbox2,
|
|
375
|
+
FormControl as FormControl2,
|
|
376
|
+
FormControlLabel as FormControlLabel2,
|
|
377
|
+
FormGroup as FormGroup2,
|
|
378
|
+
FormHelperText as FormHelperText2,
|
|
379
|
+
FormLabel,
|
|
380
|
+
Grid as Grid3
|
|
381
|
+
} from "@mui/material";
|
|
382
|
+
import { useCallback as useCallback2 } from "react";
|
|
383
|
+
import { useController as useController3 } from "react-hook-form";
|
|
384
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
385
|
+
var Component3 = function CheckboxGroup(props) {
|
|
386
|
+
const {
|
|
387
|
+
name,
|
|
388
|
+
control,
|
|
389
|
+
label,
|
|
390
|
+
required,
|
|
391
|
+
formLabelProps,
|
|
392
|
+
labelProps,
|
|
393
|
+
labelKey = "Label",
|
|
394
|
+
valueKey = "Value",
|
|
395
|
+
options,
|
|
396
|
+
...rest
|
|
397
|
+
} = props;
|
|
398
|
+
const {
|
|
399
|
+
field,
|
|
400
|
+
fieldState: { error }
|
|
401
|
+
} = useController3({
|
|
402
|
+
name,
|
|
403
|
+
control,
|
|
404
|
+
disabled: rest.disabled
|
|
405
|
+
});
|
|
406
|
+
const selectedValuesAsString = (Array.isArray(field.value) ? field.value : []).map(String);
|
|
407
|
+
const handleChange = useCallback2(
|
|
408
|
+
(event) => {
|
|
409
|
+
const changedValueString = event.target.value;
|
|
410
|
+
const isChecked = event.target.checked;
|
|
411
|
+
const newSelectedValuesString = isChecked ? [...selectedValuesAsString, changedValueString] : selectedValuesAsString.filter((v) => v !== changedValueString);
|
|
412
|
+
const optionsAreNumeric = options.length > 0 && typeof options[0][valueKey] === "number";
|
|
413
|
+
if (optionsAreNumeric) {
|
|
414
|
+
const newValuesAsNumbers = newSelectedValuesString.map((v) => parseInt(v, 10)).filter((v) => !isNaN(v));
|
|
415
|
+
field.onChange(newValuesAsNumbers);
|
|
416
|
+
} else {
|
|
417
|
+
field.onChange(newSelectedValuesString);
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
[field, options, valueKey, selectedValuesAsString]
|
|
421
|
+
);
|
|
422
|
+
return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
|
|
423
|
+
label && /* @__PURE__ */ jsx3(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
|
|
424
|
+
/* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options && options.map((option) => /* @__PURE__ */ jsx3(
|
|
425
|
+
FormControlLabel2,
|
|
426
|
+
{
|
|
427
|
+
label: option[labelKey],
|
|
428
|
+
...labelProps,
|
|
429
|
+
control: /* @__PURE__ */ jsx3(
|
|
430
|
+
Checkbox2,
|
|
431
|
+
{
|
|
432
|
+
...rest,
|
|
433
|
+
color: rest.color || "primary",
|
|
434
|
+
value: option[valueKey],
|
|
435
|
+
checked: selectedValuesAsString.includes(
|
|
436
|
+
String(option[valueKey])
|
|
437
|
+
),
|
|
438
|
+
onChange: handleChange
|
|
439
|
+
}
|
|
440
|
+
)
|
|
441
|
+
},
|
|
442
|
+
`${option[valueKey]}`
|
|
443
|
+
)) }),
|
|
444
|
+
error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
|
|
445
|
+
] });
|
|
446
|
+
};
|
|
447
|
+
var CheckboxGroupElement = ({
|
|
448
|
+
gridProps = {},
|
|
449
|
+
...props
|
|
450
|
+
}) => {
|
|
451
|
+
return /* @__PURE__ */ jsx3(Grid3, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx3(Component3, { ...props }) });
|
|
452
|
+
};
|
|
453
|
+
CheckboxGroupElement.displayName = "CheckboxGroup";
|
|
454
|
+
|
|
455
|
+
// src/wrappers/DatePickerElement/DatePickerElement.tsx
|
|
456
|
+
import { Grid as Grid4 } from "@mui/material";
|
|
457
|
+
import { forwardRef as forwardRef2 } from "react";
|
|
458
|
+
|
|
459
|
+
// src/wrappers/DatePickerElement/DatePickerElementCore.tsx
|
|
460
|
+
import { useForkRef } from "@mui/material";
|
|
461
|
+
import { DatePicker } from "@mui/x-date-pickers";
|
|
462
|
+
import { forwardRef, useCallback as useCallback4, useMemo as useMemo5 } from "react";
|
|
463
|
+
import { useController as useController4 } from "react-hook-form";
|
|
464
|
+
|
|
465
|
+
// src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
|
|
466
|
+
import { useLocalizationContext } from "@mui/x-date-pickers/internals";
|
|
467
|
+
import { useCallback as useCallback3, useMemo as useMemo2 } from "react";
|
|
468
|
+
function readDatePickerValueAsDate(adapter, value) {
|
|
469
|
+
if (value === null || value === void 0) {
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
if (typeof value === "string") {
|
|
473
|
+
if (value === "") {
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
const parsedDate = adapter.utils.date(value);
|
|
477
|
+
return parsedDate;
|
|
478
|
+
}
|
|
479
|
+
return value;
|
|
480
|
+
}
|
|
481
|
+
function useDatePickerValue(options) {
|
|
482
|
+
const { field, transform } = options;
|
|
483
|
+
const adapter = useLocalizationContext();
|
|
484
|
+
const value = useMemo2(() => {
|
|
485
|
+
if (typeof transform?.input === "function") {
|
|
486
|
+
return transform.input(field.value);
|
|
487
|
+
}
|
|
488
|
+
return readDatePickerValueAsDate(adapter, field.value);
|
|
489
|
+
}, [field.value, transform?.input, adapter]);
|
|
490
|
+
const onChange = useCallback3(
|
|
491
|
+
(newValue, context) => {
|
|
492
|
+
if (typeof transform?.output === "function") {
|
|
493
|
+
const transformedValue = transform.output(newValue, context);
|
|
494
|
+
field.onChange(transformedValue);
|
|
495
|
+
} else {
|
|
496
|
+
field.onChange(newValue);
|
|
497
|
+
}
|
|
498
|
+
},
|
|
499
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
500
|
+
[field.onChange, transform?.output]
|
|
501
|
+
);
|
|
502
|
+
return {
|
|
503
|
+
value,
|
|
504
|
+
onChange
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
|
|
509
|
+
import { useMemo as useMemo3 } from "react";
|
|
510
|
+
var DEFAULT_ERROR_MESSAGES = {
|
|
511
|
+
invalidDate: "Please enter a valid date",
|
|
512
|
+
minDate: "Date must be after the minimum allowed date",
|
|
513
|
+
maxDate: "Date must be before the maximum allowed date",
|
|
514
|
+
disabledDate: "This date is not allowed",
|
|
515
|
+
required: "This field is required"
|
|
516
|
+
};
|
|
517
|
+
function useDatePickerValidation(options) {
|
|
518
|
+
const { fieldState, validation, parseError, value } = options;
|
|
519
|
+
const validationResult = useMemo3(() => {
|
|
520
|
+
const { error: fieldError, invalid } = fieldState;
|
|
521
|
+
let currentError = fieldError;
|
|
522
|
+
if (!fieldError && value && validation) {
|
|
523
|
+
const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
|
|
524
|
+
if (minDate && value < minDate) {
|
|
525
|
+
currentError = {
|
|
526
|
+
type: "minDate",
|
|
527
|
+
message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
|
|
528
|
+
};
|
|
529
|
+
} else if (maxDate && value > maxDate) {
|
|
530
|
+
currentError = {
|
|
531
|
+
type: "maxDate",
|
|
532
|
+
message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
|
|
533
|
+
};
|
|
534
|
+
} else if (shouldDisableDate && shouldDisableDate(value)) {
|
|
535
|
+
currentError = {
|
|
536
|
+
type: "disabledDate",
|
|
537
|
+
message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
const hasError = Boolean(currentError);
|
|
542
|
+
return {
|
|
543
|
+
hasError,
|
|
544
|
+
error: currentError,
|
|
545
|
+
invalid: invalid || hasError
|
|
546
|
+
};
|
|
547
|
+
}, [fieldState, validation, value]);
|
|
548
|
+
const errorMessage = useMemo3(() => {
|
|
549
|
+
if (!validationResult.error) {
|
|
550
|
+
return null;
|
|
551
|
+
}
|
|
552
|
+
if (parseError) {
|
|
553
|
+
return parseError(validationResult.error);
|
|
554
|
+
}
|
|
555
|
+
if (typeof validationResult.error === "string") {
|
|
556
|
+
return validationResult.error;
|
|
557
|
+
}
|
|
558
|
+
if ("message" in validationResult.error && validationResult.error.message) {
|
|
559
|
+
return validationResult.error.message;
|
|
560
|
+
}
|
|
561
|
+
if ("type" in validationResult.error) {
|
|
562
|
+
const errorType = validationResult.error.type;
|
|
563
|
+
switch (errorType) {
|
|
564
|
+
case "required":
|
|
565
|
+
return DEFAULT_ERROR_MESSAGES.required;
|
|
566
|
+
case "minDate":
|
|
567
|
+
return DEFAULT_ERROR_MESSAGES.minDate;
|
|
568
|
+
case "maxDate":
|
|
569
|
+
return DEFAULT_ERROR_MESSAGES.maxDate;
|
|
570
|
+
case "disabledDate":
|
|
571
|
+
return DEFAULT_ERROR_MESSAGES.disabledDate;
|
|
572
|
+
case "invalidDate":
|
|
573
|
+
default:
|
|
574
|
+
return DEFAULT_ERROR_MESSAGES.invalidDate;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
return DEFAULT_ERROR_MESSAGES.invalidDate;
|
|
578
|
+
}, [validationResult.error, parseError]);
|
|
579
|
+
return {
|
|
580
|
+
...validationResult,
|
|
581
|
+
errorMessage
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
|
|
586
|
+
import { useTheme as useTheme2 } from "@mui/material";
|
|
587
|
+
import { useMemo as useMemo4 } from "react";
|
|
588
|
+
function useDatePickerStyles(options = {}) {
|
|
589
|
+
const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
|
|
590
|
+
const theme = useTheme2();
|
|
591
|
+
const computedSx = useMemo4(() => {
|
|
592
|
+
const baseStyles = {
|
|
593
|
+
// Input field styling
|
|
594
|
+
"& .MuiOutlinedInput-root": {
|
|
595
|
+
backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
|
|
596
|
+
// Transition for smooth state changes
|
|
597
|
+
transition: theme.transitions.create([
|
|
598
|
+
"background-color",
|
|
599
|
+
"border-color",
|
|
600
|
+
"color"
|
|
601
|
+
], {
|
|
602
|
+
duration: theme.transitions.duration.short
|
|
603
|
+
}),
|
|
604
|
+
// Error state styling
|
|
605
|
+
...hasError && {
|
|
606
|
+
borderColor: theme.palette.error.main,
|
|
607
|
+
"&:hover": {
|
|
608
|
+
borderColor: theme.palette.error.main
|
|
609
|
+
},
|
|
610
|
+
"&.Mui-focused": {
|
|
611
|
+
borderColor: theme.palette.error.main,
|
|
612
|
+
boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
|
|
613
|
+
// 25 is 15% opacity in hex
|
|
614
|
+
}
|
|
615
|
+
},
|
|
616
|
+
// Loading state styling
|
|
617
|
+
...loading && {
|
|
618
|
+
opacity: 0.7,
|
|
619
|
+
pointerEvents: "none"
|
|
620
|
+
}
|
|
621
|
+
},
|
|
622
|
+
// Input element styling
|
|
623
|
+
"& .MuiInputBase-input": {
|
|
624
|
+
cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
|
|
625
|
+
// Read-only specific styling
|
|
626
|
+
...textReadOnly && !disabled && {
|
|
627
|
+
cursor: "pointer",
|
|
628
|
+
userSelect: "none",
|
|
629
|
+
caretColor: "transparent"
|
|
630
|
+
// Hide text cursor in read-only mode
|
|
631
|
+
},
|
|
632
|
+
// Loading state
|
|
633
|
+
...loading && {
|
|
634
|
+
cursor: "wait"
|
|
635
|
+
}
|
|
636
|
+
},
|
|
637
|
+
// Required field asterisk styling
|
|
638
|
+
"& .MuiInputLabel-asterisk": {
|
|
639
|
+
color: theme.palette.error.main,
|
|
640
|
+
fontSize: "1.2em"
|
|
641
|
+
},
|
|
642
|
+
// Label styling with better contrast
|
|
643
|
+
"& .MuiInputLabel-root": {
|
|
644
|
+
color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
|
|
645
|
+
// Ensure proper contrast for disabled state
|
|
646
|
+
...disabled && {
|
|
647
|
+
color: theme.palette.text.disabled
|
|
648
|
+
}
|
|
649
|
+
},
|
|
650
|
+
// Helper text styling
|
|
651
|
+
"& .MuiFormHelperText-root": {
|
|
652
|
+
marginLeft: theme.spacing(1),
|
|
653
|
+
marginRight: theme.spacing(1),
|
|
654
|
+
// Error state
|
|
655
|
+
...hasError && {
|
|
656
|
+
color: theme.palette.error.main
|
|
657
|
+
}
|
|
658
|
+
},
|
|
659
|
+
// Calendar icon styling
|
|
660
|
+
"& .MuiInputAdornment-root": {
|
|
661
|
+
color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
|
|
662
|
+
},
|
|
663
|
+
// Focus ring for accessibility
|
|
664
|
+
"& .MuiOutlinedInput-root.Mui-focused": {
|
|
665
|
+
outline: `2px solid ${theme.palette.primary.main}50`,
|
|
666
|
+
// 50 is 31% opacity
|
|
667
|
+
outlineOffset: "2px"
|
|
668
|
+
},
|
|
669
|
+
// Enhanced contrast for dark themes
|
|
670
|
+
...theme.palette.mode === "dark" && {
|
|
671
|
+
"& .MuiOutlinedInput-root": {
|
|
672
|
+
borderWidth: 2
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
};
|
|
676
|
+
return customSx ? [baseStyles, customSx] : baseStyles;
|
|
677
|
+
}, [
|
|
678
|
+
theme,
|
|
679
|
+
disabled,
|
|
680
|
+
hasError,
|
|
681
|
+
loading,
|
|
682
|
+
textReadOnly,
|
|
683
|
+
customSx
|
|
684
|
+
]);
|
|
685
|
+
const className = useMemo4(() => {
|
|
686
|
+
const classes = [];
|
|
687
|
+
if (disabled) classes.push("DatePickerElement--disabled");
|
|
688
|
+
if (hasError) classes.push("DatePickerElement--error");
|
|
689
|
+
if (loading) classes.push("DatePickerElement--loading");
|
|
690
|
+
if (textReadOnly) classes.push("DatePickerElement--readOnly");
|
|
691
|
+
return classes.length > 0 ? classes.join(" ") : void 0;
|
|
692
|
+
}, [disabled, hasError, loading, textReadOnly]);
|
|
693
|
+
return {
|
|
694
|
+
sx: computedSx,
|
|
695
|
+
className
|
|
696
|
+
};
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// src/wrappers/DatePickerElement/DatePickerElementCore.tsx
|
|
700
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
701
|
+
var DatePickerElementCore = forwardRef(
|
|
702
|
+
(props, ref) => {
|
|
703
|
+
const {
|
|
704
|
+
name,
|
|
705
|
+
required = false,
|
|
706
|
+
control,
|
|
707
|
+
parseError,
|
|
708
|
+
transform,
|
|
709
|
+
validation,
|
|
710
|
+
label,
|
|
711
|
+
placeholder,
|
|
712
|
+
textReadOnly = false,
|
|
713
|
+
helperText,
|
|
714
|
+
inputProps = {},
|
|
715
|
+
slotProps = {},
|
|
716
|
+
datePickerProps = {},
|
|
717
|
+
variant = "outlined",
|
|
718
|
+
loading = false,
|
|
719
|
+
LoadingComponent,
|
|
720
|
+
...restProps
|
|
721
|
+
} = props;
|
|
722
|
+
const {
|
|
723
|
+
disabled,
|
|
724
|
+
inputRef: externalInputRef,
|
|
725
|
+
onClose,
|
|
726
|
+
...restDatePickerProps
|
|
727
|
+
} = datePickerProps;
|
|
728
|
+
const { field, fieldState } = useController4({
|
|
729
|
+
name,
|
|
730
|
+
control,
|
|
731
|
+
defaultValue: null
|
|
732
|
+
// Let react-hook-form handle the default value typing
|
|
733
|
+
});
|
|
734
|
+
const { value, onChange: onValueChange } = useDatePickerValue({
|
|
735
|
+
field,
|
|
736
|
+
transform
|
|
737
|
+
});
|
|
738
|
+
const { hasError, errorMessage, invalid } = useDatePickerValidation({
|
|
739
|
+
fieldState,
|
|
740
|
+
validation,
|
|
741
|
+
parseError,
|
|
742
|
+
value
|
|
743
|
+
});
|
|
744
|
+
const { className } = useDatePickerStyles({
|
|
745
|
+
disabled,
|
|
746
|
+
hasError,
|
|
747
|
+
loading,
|
|
748
|
+
textReadOnly
|
|
749
|
+
});
|
|
750
|
+
const handleInputRef = useForkRef(field.ref, externalInputRef);
|
|
751
|
+
const handleChange = useCallback4(
|
|
752
|
+
(newValue, context) => {
|
|
753
|
+
onValueChange(newValue, context);
|
|
754
|
+
},
|
|
755
|
+
[onValueChange]
|
|
756
|
+
);
|
|
757
|
+
const handleClose = useCallback4(
|
|
758
|
+
(...args) => {
|
|
759
|
+
field.onBlur();
|
|
760
|
+
if (onClose) {
|
|
761
|
+
onClose(...args);
|
|
762
|
+
}
|
|
763
|
+
},
|
|
764
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
765
|
+
[field.onBlur, onClose]
|
|
766
|
+
);
|
|
767
|
+
const handleTextFieldBlur = useCallback4(
|
|
768
|
+
(event) => {
|
|
769
|
+
field.onBlur();
|
|
770
|
+
if (typeof inputProps.onBlur === "function") {
|
|
771
|
+
inputProps.onBlur(event);
|
|
772
|
+
}
|
|
773
|
+
},
|
|
774
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
775
|
+
[field.onBlur, inputProps.onBlur]
|
|
776
|
+
);
|
|
777
|
+
const memoizedSlotProps = useMemo5(
|
|
778
|
+
() => ({
|
|
779
|
+
...slotProps,
|
|
780
|
+
actionBar: {
|
|
781
|
+
actions: ["clear", "today", "cancel", "accept"],
|
|
782
|
+
...slotProps.actionBar
|
|
783
|
+
},
|
|
784
|
+
textField: {
|
|
785
|
+
...inputProps,
|
|
786
|
+
required,
|
|
787
|
+
placeholder,
|
|
788
|
+
fullWidth: true,
|
|
789
|
+
variant,
|
|
790
|
+
onBlur: handleTextFieldBlur,
|
|
791
|
+
error: hasError,
|
|
792
|
+
helperText: hasError ? errorMessage : helperText,
|
|
793
|
+
inputProps: {
|
|
794
|
+
readOnly: textReadOnly,
|
|
795
|
+
"aria-invalid": invalid,
|
|
796
|
+
"aria-describedby": hasError ? `${name}-error` : void 0,
|
|
797
|
+
...inputProps.inputProps
|
|
798
|
+
},
|
|
799
|
+
// Add loading indicator if provided
|
|
800
|
+
...loading && LoadingComponent && {
|
|
801
|
+
InputProps: {
|
|
802
|
+
endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
|
|
803
|
+
...inputProps.InputProps
|
|
804
|
+
}
|
|
805
|
+
},
|
|
806
|
+
...slotProps.textField
|
|
807
|
+
}
|
|
808
|
+
}),
|
|
809
|
+
[
|
|
810
|
+
slotProps,
|
|
811
|
+
inputProps,
|
|
812
|
+
required,
|
|
813
|
+
placeholder,
|
|
814
|
+
variant,
|
|
815
|
+
handleTextFieldBlur,
|
|
816
|
+
hasError,
|
|
817
|
+
errorMessage,
|
|
818
|
+
helperText,
|
|
819
|
+
textReadOnly,
|
|
820
|
+
invalid,
|
|
821
|
+
name,
|
|
822
|
+
loading,
|
|
823
|
+
LoadingComponent
|
|
824
|
+
]
|
|
825
|
+
);
|
|
826
|
+
return /* @__PURE__ */ jsx4(
|
|
827
|
+
DatePicker,
|
|
828
|
+
{
|
|
829
|
+
...restProps,
|
|
830
|
+
...restDatePickerProps,
|
|
831
|
+
ref,
|
|
832
|
+
name,
|
|
833
|
+
value,
|
|
834
|
+
onChange: handleChange,
|
|
835
|
+
onClose: handleClose,
|
|
836
|
+
inputRef: handleInputRef,
|
|
837
|
+
label,
|
|
838
|
+
disabled,
|
|
839
|
+
className,
|
|
840
|
+
slotProps: memoizedSlotProps,
|
|
841
|
+
"aria-invalid": invalid,
|
|
842
|
+
"aria-describedby": hasError ? `${name}-error` : void 0
|
|
843
|
+
}
|
|
844
|
+
);
|
|
845
|
+
}
|
|
846
|
+
);
|
|
847
|
+
DatePickerElementCore.displayName = "DatePickerElementCore";
|
|
848
|
+
|
|
849
|
+
// src/wrappers/DatePickerElement/DatePickerElement.tsx
|
|
850
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
851
|
+
var DatePickerElement = forwardRef2((props, ref) => {
|
|
852
|
+
const {
|
|
853
|
+
gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
|
|
854
|
+
...coreProps
|
|
855
|
+
} = props;
|
|
856
|
+
if (gridProps === false) {
|
|
857
|
+
return /* @__PURE__ */ jsx5(
|
|
858
|
+
DatePickerElementCore,
|
|
859
|
+
{
|
|
860
|
+
ref,
|
|
861
|
+
...coreProps
|
|
862
|
+
}
|
|
863
|
+
);
|
|
864
|
+
}
|
|
865
|
+
return /* @__PURE__ */ jsx5(
|
|
866
|
+
Grid4,
|
|
867
|
+
{
|
|
868
|
+
ref,
|
|
869
|
+
...gridProps,
|
|
870
|
+
children: /* @__PURE__ */ jsx5(
|
|
871
|
+
DatePickerElementCore,
|
|
872
|
+
{
|
|
873
|
+
...coreProps
|
|
874
|
+
}
|
|
875
|
+
)
|
|
876
|
+
}
|
|
877
|
+
);
|
|
878
|
+
});
|
|
879
|
+
DatePickerElement.displayName = "DatePickerElement";
|
|
880
|
+
|
|
881
|
+
// src/wrappers/DatePickerElement/utils.ts
|
|
882
|
+
function isValidDate(value) {
|
|
883
|
+
if (value === null || value === void 0) {
|
|
884
|
+
return false;
|
|
885
|
+
}
|
|
886
|
+
if (value instanceof Date) {
|
|
887
|
+
return !isNaN(value.getTime());
|
|
888
|
+
}
|
|
889
|
+
if (typeof value === "object" && value !== null) {
|
|
890
|
+
if ("isValid" in value && typeof value.isValid === "function") {
|
|
891
|
+
return value.isValid();
|
|
892
|
+
}
|
|
893
|
+
if ("isValid" in value && typeof value.isValid === "boolean") {
|
|
894
|
+
return value.isValid;
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
return false;
|
|
898
|
+
}
|
|
899
|
+
function isParsableDateString(value) {
|
|
900
|
+
if (typeof value !== "string" || value === "") {
|
|
901
|
+
return false;
|
|
902
|
+
}
|
|
903
|
+
const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
|
|
904
|
+
if (isoDateRegex.test(value)) {
|
|
905
|
+
return true;
|
|
906
|
+
}
|
|
907
|
+
const parsed = new Date(value);
|
|
908
|
+
return !isNaN(parsed.getTime());
|
|
909
|
+
}
|
|
910
|
+
function createDateInputTransform(adapter) {
|
|
911
|
+
return (value) => {
|
|
912
|
+
if (value === null || value === void 0) {
|
|
913
|
+
return null;
|
|
914
|
+
}
|
|
915
|
+
if (typeof value === "string") {
|
|
916
|
+
if (value === "") {
|
|
917
|
+
return null;
|
|
918
|
+
}
|
|
919
|
+
try {
|
|
920
|
+
const parsed = adapter.utils.date(value);
|
|
921
|
+
return isValidDate(parsed) ? parsed : null;
|
|
922
|
+
} catch {
|
|
923
|
+
return null;
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
if (isValidDate(value)) {
|
|
927
|
+
return value;
|
|
928
|
+
}
|
|
929
|
+
return null;
|
|
930
|
+
};
|
|
931
|
+
}
|
|
932
|
+
function createDateOutputTransform(format) {
|
|
933
|
+
return (value) => {
|
|
934
|
+
if (value === null || value === void 0) {
|
|
935
|
+
return null;
|
|
936
|
+
}
|
|
937
|
+
if (!isValidDate(value)) {
|
|
938
|
+
return null;
|
|
939
|
+
}
|
|
940
|
+
if (!format) {
|
|
941
|
+
return value;
|
|
942
|
+
}
|
|
943
|
+
try {
|
|
944
|
+
if (value instanceof Date) {
|
|
945
|
+
if (format === "iso") {
|
|
946
|
+
return value.toISOString();
|
|
947
|
+
}
|
|
948
|
+
if (format === "date-only") {
|
|
949
|
+
return value.toISOString().split("T")[0];
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
if (typeof value.format === "function") {
|
|
953
|
+
return value.format(format);
|
|
954
|
+
}
|
|
955
|
+
if (typeof value.format === "function") {
|
|
956
|
+
return value.format(format);
|
|
957
|
+
}
|
|
958
|
+
if (typeof value.toFormat === "function") {
|
|
959
|
+
return value.toFormat(format);
|
|
960
|
+
}
|
|
961
|
+
return value;
|
|
962
|
+
} catch {
|
|
963
|
+
return null;
|
|
964
|
+
}
|
|
965
|
+
};
|
|
966
|
+
}
|
|
967
|
+
function createDefaultDatePickerConfig() {
|
|
968
|
+
return {
|
|
969
|
+
// Default slot props for consistent behavior
|
|
970
|
+
slotProps: {
|
|
971
|
+
actionBar: {
|
|
972
|
+
actions: ["clear", "today", "cancel", "accept"]
|
|
973
|
+
},
|
|
974
|
+
textField: {
|
|
975
|
+
fullWidth: true,
|
|
976
|
+
variant: "outlined"
|
|
977
|
+
}
|
|
978
|
+
},
|
|
979
|
+
// Default grid props for layout consistency
|
|
980
|
+
gridProps: {
|
|
981
|
+
size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
|
|
982
|
+
},
|
|
983
|
+
// Default validation configuration
|
|
984
|
+
validation: {
|
|
985
|
+
errorMessages: {
|
|
986
|
+
invalidDate: "Please enter a valid date",
|
|
987
|
+
minDate: "Date must be after the minimum allowed date",
|
|
988
|
+
maxDate: "Date must be before the maximum allowed date",
|
|
989
|
+
disabledDate: "This date is not allowed"
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
};
|
|
993
|
+
}
|
|
994
|
+
function extractErrorMessage(error) {
|
|
995
|
+
if (error === null || error === void 0) {
|
|
996
|
+
return "";
|
|
997
|
+
}
|
|
998
|
+
if (typeof error === "string") {
|
|
999
|
+
return error;
|
|
1000
|
+
}
|
|
1001
|
+
if (typeof error === "object" && error !== null) {
|
|
1002
|
+
if ("message" in error && typeof error.message === "string") {
|
|
1003
|
+
return error.message;
|
|
1004
|
+
}
|
|
1005
|
+
if ("type" in error && typeof error.type === "string") {
|
|
1006
|
+
const errorType = error.type;
|
|
1007
|
+
switch (errorType) {
|
|
1008
|
+
case "invalidDate":
|
|
1009
|
+
return "Please enter a valid date";
|
|
1010
|
+
case "minDate":
|
|
1011
|
+
return "Date is too early";
|
|
1012
|
+
case "maxDate":
|
|
1013
|
+
return "Date is too late";
|
|
1014
|
+
case "disabledDate":
|
|
1015
|
+
return "This date is not available";
|
|
1016
|
+
default:
|
|
1017
|
+
return "Invalid date selection";
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
return "Invalid input";
|
|
1022
|
+
}
|
|
1023
|
+
function createStableKey(config) {
|
|
1024
|
+
try {
|
|
1025
|
+
return JSON.stringify(config, (key, value) => {
|
|
1026
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
1027
|
+
const sorted = {};
|
|
1028
|
+
Object.keys(value).sort().forEach((k) => {
|
|
1029
|
+
sorted[k] = value[k];
|
|
1030
|
+
});
|
|
1031
|
+
return sorted;
|
|
1032
|
+
}
|
|
1033
|
+
return value;
|
|
1034
|
+
});
|
|
1035
|
+
} catch {
|
|
1036
|
+
return Object.keys(config).sort().join("-");
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
// src/wrappers/PasswordElement/PasswordElement.tsx
|
|
1041
|
+
import Visibility from "@mui/icons-material/Visibility";
|
|
1042
|
+
import VisibilityOff from "@mui/icons-material/VisibilityOff";
|
|
1043
|
+
import {
|
|
1044
|
+
IconButton,
|
|
1045
|
+
InputAdornment,
|
|
1046
|
+
TextField as TextField2,
|
|
1047
|
+
useForkRef as useForkRef2,
|
|
1048
|
+
Grid as Grid5
|
|
1049
|
+
} from "@mui/material";
|
|
1050
|
+
import { useState as useState2 } from "react";
|
|
1051
|
+
import { useController as useController5 } from "react-hook-form";
|
|
1052
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
1053
|
+
var Component4 = function PasswordEl(props) {
|
|
1054
|
+
const {
|
|
1055
|
+
iconColor,
|
|
1056
|
+
renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
|
|
1057
|
+
slotProps,
|
|
1058
|
+
name,
|
|
1059
|
+
control,
|
|
1060
|
+
inputRef,
|
|
1061
|
+
onBlur,
|
|
1062
|
+
...rest
|
|
1063
|
+
} = props;
|
|
1064
|
+
const [password, setPassword] = useState2(true);
|
|
1065
|
+
const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
|
|
1066
|
+
IconButton,
|
|
1067
|
+
{
|
|
1068
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
1069
|
+
onClick: () => setPassword(!password),
|
|
1070
|
+
tabIndex: -1,
|
|
1071
|
+
color: iconColor ?? "default",
|
|
1072
|
+
children: renderIcon(password)
|
|
1073
|
+
}
|
|
1074
|
+
) });
|
|
1075
|
+
const {
|
|
1076
|
+
field,
|
|
1077
|
+
fieldState: { error }
|
|
1078
|
+
} = useController5({
|
|
1079
|
+
name,
|
|
1080
|
+
control
|
|
1081
|
+
});
|
|
1082
|
+
const handleInputRef = useForkRef2(field.ref, inputRef);
|
|
1083
|
+
return /* @__PURE__ */ jsx6(
|
|
1084
|
+
TextField2,
|
|
1085
|
+
{
|
|
1086
|
+
...rest,
|
|
1087
|
+
inputRef: handleInputRef,
|
|
1088
|
+
type: password ? "password" : "text",
|
|
1089
|
+
value: field.value ?? "",
|
|
1090
|
+
fullWidth: true,
|
|
1091
|
+
variant: rest.variant ?? "outlined",
|
|
1092
|
+
onChange: (event) => {
|
|
1093
|
+
field.onChange(event);
|
|
1094
|
+
if (typeof rest.onChange === "function") {
|
|
1095
|
+
rest.onChange(event);
|
|
1096
|
+
}
|
|
1097
|
+
},
|
|
1098
|
+
onBlur: (event) => {
|
|
1099
|
+
field.onBlur();
|
|
1100
|
+
if (typeof onBlur === "function") {
|
|
1101
|
+
onBlur(event);
|
|
1102
|
+
}
|
|
1103
|
+
},
|
|
1104
|
+
...typeof slotProps === "undefined" ? {
|
|
1105
|
+
InputProps: {
|
|
1106
|
+
endAdornment
|
|
1107
|
+
}
|
|
1108
|
+
} : {
|
|
1109
|
+
slotProps: {
|
|
1110
|
+
...slotProps,
|
|
1111
|
+
input: {
|
|
1112
|
+
endAdornment,
|
|
1113
|
+
...slotProps?.input
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
},
|
|
1117
|
+
error: !!error,
|
|
1118
|
+
helperText: error ? error.message : ""
|
|
1119
|
+
}
|
|
1120
|
+
);
|
|
1121
|
+
};
|
|
1122
|
+
var PasswordElement = ({
|
|
1123
|
+
gridProps = {},
|
|
1124
|
+
...props
|
|
1125
|
+
}) => {
|
|
1126
|
+
return /* @__PURE__ */ jsx6(Grid5, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx6(Component4, { ...props }) });
|
|
1127
|
+
};
|
|
1128
|
+
|
|
1129
|
+
// src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
|
|
1130
|
+
import {
|
|
1131
|
+
FormControl as FormControl3,
|
|
1132
|
+
FormControlLabel as FormControlLabel3,
|
|
1133
|
+
FormHelperText as FormHelperText3,
|
|
1134
|
+
FormLabel as FormLabel2,
|
|
1135
|
+
Radio,
|
|
1136
|
+
RadioGroup,
|
|
1137
|
+
Grid as Grid6
|
|
1138
|
+
} from "@mui/material";
|
|
1139
|
+
import { useController as useController6 } from "react-hook-form";
|
|
1140
|
+
import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1141
|
+
var Component5 = function RadioButtonGroup(props) {
|
|
1142
|
+
const {
|
|
1143
|
+
options,
|
|
1144
|
+
label,
|
|
1145
|
+
name,
|
|
1146
|
+
labelKey = "label",
|
|
1147
|
+
valueKey = "id",
|
|
1148
|
+
disabledKey = "disabled",
|
|
1149
|
+
required,
|
|
1150
|
+
emptyOptionLabel,
|
|
1151
|
+
returnObject,
|
|
1152
|
+
row = true,
|
|
1153
|
+
control,
|
|
1154
|
+
type,
|
|
1155
|
+
labelProps,
|
|
1156
|
+
disabled,
|
|
1157
|
+
formLabelProps,
|
|
1158
|
+
radioProps,
|
|
1159
|
+
transform,
|
|
1160
|
+
...rest
|
|
1161
|
+
} = props;
|
|
1162
|
+
const {
|
|
1163
|
+
field,
|
|
1164
|
+
fieldState: { error }
|
|
1165
|
+
} = useController6({
|
|
1166
|
+
name,
|
|
1167
|
+
disabled,
|
|
1168
|
+
control
|
|
1169
|
+
});
|
|
1170
|
+
const { value, onChange } = useTransform({
|
|
1171
|
+
value: field.value,
|
|
1172
|
+
onChange: field.onChange,
|
|
1173
|
+
transform: {
|
|
1174
|
+
input: typeof transform?.input === "function" ? transform.input : (value2) => {
|
|
1175
|
+
return value2 || "";
|
|
1176
|
+
},
|
|
1177
|
+
output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
|
|
1178
|
+
if (value2 && type === "number") {
|
|
1179
|
+
return Number(value2);
|
|
1180
|
+
}
|
|
1181
|
+
if (value2 && type === "boolean") {
|
|
1182
|
+
return Boolean(value2);
|
|
1183
|
+
}
|
|
1184
|
+
return value2;
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
});
|
|
1188
|
+
const onRadioChange = (event, radioValue) => {
|
|
1189
|
+
const returnValue = returnObject ? options.find((option) => option[valueKey] === radioValue) : radioValue;
|
|
1190
|
+
onChange(event, returnValue);
|
|
1191
|
+
if (typeof rest.onChange === "function") {
|
|
1192
|
+
rest.onChange(returnValue);
|
|
1193
|
+
}
|
|
1194
|
+
};
|
|
1195
|
+
return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
|
|
1196
|
+
label && /* @__PURE__ */ jsx7(FormLabel2, { ...formLabelProps, required, error: !!error, children: label }),
|
|
1197
|
+
/* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
|
|
1198
|
+
emptyOptionLabel && /* @__PURE__ */ jsx7(
|
|
1199
|
+
FormControlLabel3,
|
|
1200
|
+
{
|
|
1201
|
+
...labelProps,
|
|
1202
|
+
control: /* @__PURE__ */ jsx7(
|
|
1203
|
+
Radio,
|
|
1204
|
+
{
|
|
1205
|
+
...radioProps,
|
|
1206
|
+
checked: !value
|
|
1207
|
+
}
|
|
1208
|
+
),
|
|
1209
|
+
label: emptyOptionLabel,
|
|
1210
|
+
value: ""
|
|
1211
|
+
}
|
|
1212
|
+
),
|
|
1213
|
+
options.map((option) => {
|
|
1214
|
+
const optionKey = option[valueKey];
|
|
1215
|
+
const optionDisabled = option[disabledKey] || false;
|
|
1216
|
+
let val = returnObject ? value?.[valueKey] : value;
|
|
1217
|
+
if (type === "number" && val !== void 0) {
|
|
1218
|
+
val = Number(val);
|
|
1219
|
+
} else if (type === "boolean" && val !== void 0) {
|
|
1220
|
+
val = Boolean(val);
|
|
1221
|
+
}
|
|
1222
|
+
const isChecked = val === optionKey;
|
|
1223
|
+
return /* @__PURE__ */ jsx7(
|
|
1224
|
+
FormControlLabel3,
|
|
1225
|
+
{
|
|
1226
|
+
...labelProps,
|
|
1227
|
+
control: /* @__PURE__ */ jsx7(
|
|
1228
|
+
Radio,
|
|
1229
|
+
{
|
|
1230
|
+
...radioProps,
|
|
1231
|
+
disabled: disabled || optionDisabled,
|
|
1232
|
+
checked: isChecked
|
|
1233
|
+
}
|
|
1234
|
+
),
|
|
1235
|
+
value: optionKey,
|
|
1236
|
+
label: option[labelKey]
|
|
1237
|
+
},
|
|
1238
|
+
String(optionKey)
|
|
1239
|
+
);
|
|
1240
|
+
})
|
|
1241
|
+
] }),
|
|
1242
|
+
error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
|
|
1243
|
+
] });
|
|
1244
|
+
};
|
|
1245
|
+
var RadioButtonGroup2 = ({
|
|
1246
|
+
gridProps = {},
|
|
1247
|
+
...props
|
|
1248
|
+
}) => {
|
|
1249
|
+
return /* @__PURE__ */ jsx7(Grid6, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx7(
|
|
1250
|
+
Component5,
|
|
1251
|
+
{
|
|
1252
|
+
...props
|
|
1253
|
+
}
|
|
1254
|
+
) });
|
|
1255
|
+
};
|
|
1256
|
+
RadioButtonGroup2.displayName = "RadioButtonGroup";
|
|
1257
|
+
|
|
1258
|
+
// src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
|
|
1259
|
+
import { Grid as Grid7, TextField as TextField3, Autocomplete as Autocomplete2 } from "@mui/material";
|
|
1260
|
+
import { useTheme as useTheme3 } from "@mui/material/styles";
|
|
1261
|
+
import { useRef as useRef2, useEffect as useEffect2, useCallback as useCallback5, useMemo as useMemo6 } from "react";
|
|
1262
|
+
import { useController as useController7 } from "react-hook-form";
|
|
1263
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
1264
|
+
var Component6 = function SelectCascadeElement(props) {
|
|
1265
|
+
const theme = useTheme3();
|
|
1266
|
+
const {
|
|
1267
|
+
labelField = "Label",
|
|
1268
|
+
valueField = "Value",
|
|
1269
|
+
name,
|
|
1270
|
+
onBlur,
|
|
1271
|
+
onChange,
|
|
1272
|
+
disabled,
|
|
1273
|
+
options: optionsInput,
|
|
1274
|
+
control,
|
|
1275
|
+
loading = false,
|
|
1276
|
+
placeholder,
|
|
1277
|
+
label,
|
|
1278
|
+
dependsOn,
|
|
1279
|
+
textFieldProps = {},
|
|
1280
|
+
variant,
|
|
1281
|
+
isNullable = false,
|
|
1282
|
+
disableDefaultSelected = false,
|
|
1283
|
+
...rest
|
|
1284
|
+
} = props;
|
|
1285
|
+
const { required, ...restTextProps } = textFieldProps;
|
|
1286
|
+
const options = useMemo6(() => optionsInput || [], [optionsInput]);
|
|
1287
|
+
const getOptionKey = useCallback5(
|
|
1288
|
+
(option) => {
|
|
1289
|
+
if (typeof option === "string" || typeof option === "number")
|
|
1290
|
+
return option;
|
|
1291
|
+
const key = option ? option[valueField] : void 0;
|
|
1292
|
+
return key !== void 0 && key !== null ? String(key) : "";
|
|
1293
|
+
},
|
|
1294
|
+
[valueField]
|
|
1295
|
+
);
|
|
1296
|
+
const getOptionLabel = useCallback5(
|
|
1297
|
+
(option) => {
|
|
1298
|
+
if (typeof option === "string") return option;
|
|
1299
|
+
return option ? String(option[labelField]) : "";
|
|
1300
|
+
},
|
|
1301
|
+
[labelField]
|
|
1302
|
+
);
|
|
1303
|
+
const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
|
|
1304
|
+
const {
|
|
1305
|
+
field,
|
|
1306
|
+
fieldState: { error }
|
|
1307
|
+
} = useController7({
|
|
1308
|
+
name,
|
|
1309
|
+
control
|
|
1310
|
+
});
|
|
1311
|
+
const { field: dependentField } = useController7({
|
|
1312
|
+
name: dependsOn,
|
|
1313
|
+
control
|
|
1314
|
+
});
|
|
1315
|
+
const parentValueRef = useRef2(dependentField.value);
|
|
1316
|
+
useEffect2(() => {
|
|
1317
|
+
if (parentValueRef.current !== dependentField.value) {
|
|
1318
|
+
field.onChange(null);
|
|
1319
|
+
parentValueRef.current = dependentField.value;
|
|
1320
|
+
}
|
|
1321
|
+
}, [dependentField.value, field]);
|
|
1322
|
+
useEffect2(() => {
|
|
1323
|
+
if (disableDefaultSelected && options.length === 1 && field.value != null) {
|
|
1324
|
+
field.onChange(null);
|
|
1325
|
+
}
|
|
1326
|
+
}, [disableDefaultSelected, options.length]);
|
|
1327
|
+
useEffect2(() => {
|
|
1328
|
+
const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
|
|
1329
|
+
if (options.length === 1 && !hasValue && !disableDefaultSelected) {
|
|
1330
|
+
if (disabled) return;
|
|
1331
|
+
field.onChange(getOptionKey(options[0]));
|
|
1332
|
+
}
|
|
1333
|
+
}, [
|
|
1334
|
+
options,
|
|
1335
|
+
disabled,
|
|
1336
|
+
getOptionKey,
|
|
1337
|
+
field.onChange,
|
|
1338
|
+
dependentField.value,
|
|
1339
|
+
disableDefaultSelected
|
|
1340
|
+
]);
|
|
1341
|
+
const isDisabled = useMemo6(() => {
|
|
1342
|
+
if (disabled) return true;
|
|
1343
|
+
if (dependentField.value === null || dependentField.value === void 0 || dependentField.value === "")
|
|
1344
|
+
return true;
|
|
1345
|
+
if (options.length === 1 && !isNullable && !disableDefaultSelected) {
|
|
1346
|
+
return true;
|
|
1347
|
+
}
|
|
1348
|
+
return false;
|
|
1349
|
+
}, [
|
|
1350
|
+
disabled,
|
|
1351
|
+
dependentField.value,
|
|
1352
|
+
options.length,
|
|
1353
|
+
isNullable,
|
|
1354
|
+
disableDefaultSelected
|
|
1355
|
+
]);
|
|
1356
|
+
return /* @__PURE__ */ jsx8(
|
|
1357
|
+
Autocomplete2,
|
|
1358
|
+
{
|
|
1359
|
+
...rest,
|
|
1360
|
+
value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
|
|
1361
|
+
loading,
|
|
1362
|
+
options,
|
|
1363
|
+
getOptionKey,
|
|
1364
|
+
getOptionLabel,
|
|
1365
|
+
isOptionEqualToValue,
|
|
1366
|
+
ref: field.ref,
|
|
1367
|
+
disabled: isDisabled,
|
|
1368
|
+
sx: {
|
|
1369
|
+
"&.Mui-disabled": {
|
|
1370
|
+
cursor: "not-allowed !important"
|
|
1371
|
+
},
|
|
1372
|
+
"& .MuiInputBase-root.Mui-disabled": {
|
|
1373
|
+
backgroundColor: theme.palette.action.disabledBackground,
|
|
1374
|
+
cursor: "not-allowed !important"
|
|
1375
|
+
},
|
|
1376
|
+
"&.Mui-disabled .MuiAutocomplete-popupIndicator": {
|
|
1377
|
+
cursor: "not-allowed !important"
|
|
1378
|
+
},
|
|
1379
|
+
"& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
|
|
1380
|
+
borderColor: error ? "red" : void 0
|
|
1381
|
+
},
|
|
1382
|
+
"& .MuiFilledInput-root.Mui-disabled": {
|
|
1383
|
+
borderColor: error ? "red" : void 0
|
|
1384
|
+
}
|
|
1385
|
+
},
|
|
1386
|
+
onChange: (event, newValue, reason) => {
|
|
1387
|
+
field.onChange(newValue ? getOptionKey(newValue) : null);
|
|
1388
|
+
if (onChange && typeof onChange === "function") {
|
|
1389
|
+
onChange(event, newValue, reason);
|
|
1390
|
+
}
|
|
1391
|
+
},
|
|
1392
|
+
onBlur: (event) => {
|
|
1393
|
+
field.onBlur();
|
|
1394
|
+
if (typeof onBlur === "function") {
|
|
1395
|
+
onBlur(event);
|
|
1396
|
+
}
|
|
1397
|
+
},
|
|
1398
|
+
fullWidth: true,
|
|
1399
|
+
renderInput: (params) => /* @__PURE__ */ jsx8(
|
|
1400
|
+
TextField3,
|
|
1401
|
+
{
|
|
1402
|
+
...params,
|
|
1403
|
+
...restTextProps,
|
|
1404
|
+
fullWidth: true,
|
|
1405
|
+
error: !!error,
|
|
1406
|
+
required,
|
|
1407
|
+
helperText: error ? error.message : "",
|
|
1408
|
+
placeholder,
|
|
1409
|
+
label,
|
|
1410
|
+
variant: variant ? variant : "outlined"
|
|
1411
|
+
}
|
|
1412
|
+
)
|
|
1413
|
+
}
|
|
1414
|
+
);
|
|
1415
|
+
};
|
|
1416
|
+
var SelectCascadeElement2 = ({
|
|
1417
|
+
gridProps = {},
|
|
1418
|
+
...props
|
|
1419
|
+
}) => {
|
|
1420
|
+
return /* @__PURE__ */ jsx8(Grid7, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx8(Component6, { ...props }) });
|
|
1421
|
+
};
|
|
1422
|
+
SelectCascadeElement2.displayName = "SelectCascadeElement";
|
|
1423
|
+
|
|
1424
|
+
// src/wrappers/SelectElement/SelectElement.tsx
|
|
1425
|
+
import { Grid as Grid8, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
|
|
1426
|
+
import { useTheme as useTheme4 } from "@mui/material/styles";
|
|
1427
|
+
import { useMemo as useMemo7, useEffect as useEffect3, useCallback as useCallback6 } from "react";
|
|
1428
|
+
import { useController as useController8 } from "react-hook-form";
|
|
1429
|
+
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
1430
|
+
var Component7 = function SelectElement(props) {
|
|
1431
|
+
const theme = useTheme4();
|
|
1432
|
+
const {
|
|
1433
|
+
name,
|
|
1434
|
+
control,
|
|
1435
|
+
onChange,
|
|
1436
|
+
options: optionsInput,
|
|
1437
|
+
label,
|
|
1438
|
+
variant,
|
|
1439
|
+
disabled,
|
|
1440
|
+
labelField = "Label",
|
|
1441
|
+
valueField = "Value",
|
|
1442
|
+
placeholder,
|
|
1443
|
+
textFieldProps = {},
|
|
1444
|
+
isNullable = false,
|
|
1445
|
+
disableDefaultSelected = false,
|
|
1446
|
+
...rest
|
|
1447
|
+
} = props;
|
|
1448
|
+
const { required, ...restTextProps } = textFieldProps;
|
|
1449
|
+
const options = useMemo7(() => optionsInput || [], [optionsInput]);
|
|
1450
|
+
const {
|
|
1451
|
+
field,
|
|
1452
|
+
fieldState: { error }
|
|
1453
|
+
} = useController8({
|
|
1454
|
+
name,
|
|
1455
|
+
control
|
|
1456
|
+
});
|
|
1457
|
+
const getOptionValue = useCallback6(
|
|
1458
|
+
(option) => {
|
|
1459
|
+
if (typeof option === "string") return option;
|
|
1460
|
+
return option ? option[valueField] : null;
|
|
1461
|
+
},
|
|
1462
|
+
[valueField]
|
|
1463
|
+
);
|
|
1464
|
+
const getOptionLabel = useCallback6(
|
|
1465
|
+
(option) => {
|
|
1466
|
+
if (typeof option === "string") return option;
|
|
1467
|
+
return option ? String(option[labelField]) : "";
|
|
1468
|
+
},
|
|
1469
|
+
[labelField]
|
|
1470
|
+
);
|
|
1471
|
+
useEffect3(() => {
|
|
1472
|
+
if (disableDefaultSelected && options.length === 1 && field.value != null) {
|
|
1473
|
+
field.onChange(null);
|
|
1474
|
+
}
|
|
1475
|
+
}, [disableDefaultSelected, options.length]);
|
|
1476
|
+
useEffect3(() => {
|
|
1477
|
+
const hasValue = field.value !== null && field.value !== void 0 && field.value !== "";
|
|
1478
|
+
if (options.length === 1 && !hasValue && !disableDefaultSelected) {
|
|
1479
|
+
if (disabled) return;
|
|
1480
|
+
field.onChange(getOptionValue(options[0]));
|
|
1481
|
+
}
|
|
1482
|
+
}, [
|
|
1483
|
+
options,
|
|
1484
|
+
disabled,
|
|
1485
|
+
getOptionValue,
|
|
1486
|
+
field.onChange,
|
|
1487
|
+
disableDefaultSelected
|
|
1488
|
+
]);
|
|
1489
|
+
const isDisabled = useMemo7(() => {
|
|
1490
|
+
if (disabled) return true;
|
|
1491
|
+
if (options.length === 0) return true;
|
|
1492
|
+
if (options.length === 1 && !isNullable && !disableDefaultSelected)
|
|
1493
|
+
return true;
|
|
1494
|
+
return false;
|
|
1495
|
+
}, [disabled, options.length, isNullable, disableDefaultSelected]);
|
|
1496
|
+
const autocompleteValue = useMemo7(
|
|
1497
|
+
() => options.find((option) => getOptionValue(option) === field.value) ?? null,
|
|
1498
|
+
[field.value, options, getOptionValue]
|
|
1499
|
+
);
|
|
1500
|
+
return /* @__PURE__ */ jsx9(
|
|
1501
|
+
Autocomplete3,
|
|
1502
|
+
{
|
|
1503
|
+
...rest,
|
|
1504
|
+
filterSelectedOptions: false,
|
|
1505
|
+
options,
|
|
1506
|
+
value: autocompleteValue,
|
|
1507
|
+
onChange: (event, newValue, reason) => {
|
|
1508
|
+
const option = newValue;
|
|
1509
|
+
field.onChange(option ? getOptionValue(option) : null);
|
|
1510
|
+
onChange?.(event, newValue, reason);
|
|
1511
|
+
},
|
|
1512
|
+
disabled: isDisabled,
|
|
1513
|
+
sx: {
|
|
1514
|
+
"&.Mui-disabled": {
|
|
1515
|
+
cursor: "not-allowed !important"
|
|
1516
|
+
},
|
|
1517
|
+
"& .MuiInputBase-root.Mui-disabled": {
|
|
1518
|
+
backgroundColor: theme.palette.action.disabledBackground,
|
|
1519
|
+
cursor: "not-allowed !important"
|
|
1520
|
+
},
|
|
1521
|
+
"&.Mui-disabled .MuiAutocomplete-popupIndicator": {
|
|
1522
|
+
cursor: "not-allowed !important"
|
|
1523
|
+
},
|
|
1524
|
+
"& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
|
|
1525
|
+
borderColor: error ? "red" : void 0
|
|
1526
|
+
},
|
|
1527
|
+
"& .MuiFilledInput-root.Mui-disabled": {
|
|
1528
|
+
borderColor: error ? "red" : void 0
|
|
1529
|
+
}
|
|
1530
|
+
},
|
|
1531
|
+
getOptionLabel: (option) => getOptionLabel(option),
|
|
1532
|
+
ref: field.ref,
|
|
1533
|
+
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
1534
|
+
renderInput: (params) => /* @__PURE__ */ jsx9(
|
|
1535
|
+
TextField4,
|
|
1536
|
+
{
|
|
1537
|
+
...params,
|
|
1538
|
+
...restTextProps,
|
|
1539
|
+
fullWidth: true,
|
|
1540
|
+
required,
|
|
1541
|
+
error: !!error,
|
|
1542
|
+
helperText: error ? error.message : "",
|
|
1543
|
+
label,
|
|
1544
|
+
placeholder,
|
|
1545
|
+
variant: variant ? variant : "outlined"
|
|
1546
|
+
}
|
|
1547
|
+
)
|
|
1548
|
+
}
|
|
1549
|
+
);
|
|
1550
|
+
};
|
|
1551
|
+
var SelectElement2 = ({
|
|
1552
|
+
gridProps = {},
|
|
1553
|
+
...props
|
|
1554
|
+
}) => {
|
|
1555
|
+
return /* @__PURE__ */ jsx9(Grid8, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx9(Component7, { ...props }) });
|
|
1556
|
+
};
|
|
1557
|
+
SelectElement2.displayName = "SelectElement";
|
|
1558
|
+
|
|
1559
|
+
// src/wrappers/SelectMultiElement/SelectMultiElement.tsx
|
|
1560
|
+
import CheckBoxIcon from "@mui/icons-material/CheckBox";
|
|
1561
|
+
import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
|
|
1562
|
+
import {
|
|
1563
|
+
Grid as Grid9,
|
|
1564
|
+
Checkbox as Checkbox3,
|
|
1565
|
+
TextField as TextField5,
|
|
1566
|
+
Autocomplete as Autocomplete4,
|
|
1567
|
+
CircularProgress as CircularProgress2,
|
|
1568
|
+
useTheme as useTheme5
|
|
1569
|
+
} from "@mui/material";
|
|
1570
|
+
import { Fragment as Fragment2, useEffect as useEffect4, useMemo as useMemo8 } from "react";
|
|
1571
|
+
import { useController as useController9 } from "react-hook-form";
|
|
1572
|
+
import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1573
|
+
var Component8 = function SelectMultiElement(props) {
|
|
1574
|
+
const {
|
|
1575
|
+
name,
|
|
1576
|
+
control,
|
|
1577
|
+
onBlur,
|
|
1578
|
+
disabled,
|
|
1579
|
+
options: optionsInput,
|
|
1580
|
+
loading = false,
|
|
1581
|
+
placeholder,
|
|
1582
|
+
label,
|
|
1583
|
+
isNullable,
|
|
1584
|
+
disableDefaultSelected = true,
|
|
1585
|
+
variant,
|
|
1586
|
+
labelField = "Label",
|
|
1587
|
+
valueField = "Value",
|
|
1588
|
+
...rest
|
|
1589
|
+
} = props;
|
|
1590
|
+
const theme = useTheme5();
|
|
1591
|
+
const options = useMemo8(() => optionsInput || [], [optionsInput]);
|
|
1592
|
+
const {
|
|
1593
|
+
field,
|
|
1594
|
+
fieldState: { error }
|
|
1595
|
+
} = useController9({
|
|
1596
|
+
name,
|
|
1597
|
+
control
|
|
1598
|
+
});
|
|
1599
|
+
const getOptionValue = (option) => {
|
|
1600
|
+
if (typeof option === "string") return option;
|
|
1601
|
+
return option ? option[valueField] : null;
|
|
1602
|
+
};
|
|
1603
|
+
const getOptionLabel = (option) => {
|
|
1604
|
+
if (typeof option === "string") return option;
|
|
1605
|
+
return option ? String(option[labelField]) : "";
|
|
1606
|
+
};
|
|
1607
|
+
const isDisabled = useMemo8(() => {
|
|
1608
|
+
if (disabled) return true;
|
|
1609
|
+
if (options.length === 0) return true;
|
|
1610
|
+
if (options.length === 1 && !isNullable && !disableDefaultSelected)
|
|
1611
|
+
return true;
|
|
1612
|
+
return false;
|
|
1613
|
+
}, [disabled, options.length, isNullable, disableDefaultSelected]);
|
|
1614
|
+
const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
|
|
1615
|
+
useEffect4(() => {
|
|
1616
|
+
if (disableDefaultSelected && options.length === 1 && field.value != null) {
|
|
1617
|
+
field.onChange(null);
|
|
1618
|
+
}
|
|
1619
|
+
}, [disableDefaultSelected, options.length]);
|
|
1620
|
+
useEffect4(() => {
|
|
1621
|
+
const hasValue = Array.isArray(field.value) && field.value.length > 0;
|
|
1622
|
+
if (options.length === 1 && !hasValue && !isNullable && !disableDefaultSelected) {
|
|
1623
|
+
field.onChange([getOptionValue(options[0])]);
|
|
1624
|
+
}
|
|
1625
|
+
}, [
|
|
1626
|
+
options,
|
|
1627
|
+
getOptionValue,
|
|
1628
|
+
field.onChange,
|
|
1629
|
+
isNullable,
|
|
1630
|
+
disableDefaultSelected
|
|
1631
|
+
]);
|
|
1632
|
+
const handleChange = (_, selectedOptions, reason) => {
|
|
1633
|
+
if (reason === "clear") {
|
|
1634
|
+
field.onChange(null);
|
|
1635
|
+
} else if (reason === "selectOption" || reason === "removeOption") {
|
|
1636
|
+
const newValues = selectedOptions.map((option) => getOptionValue(option));
|
|
1637
|
+
field.onChange(newValues.length === 0 ? null : newValues);
|
|
1638
|
+
}
|
|
1639
|
+
};
|
|
1640
|
+
const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
|
|
1641
|
+
const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
|
|
1642
|
+
return /* @__PURE__ */ jsx10(
|
|
1643
|
+
Autocomplete4,
|
|
1644
|
+
{
|
|
1645
|
+
multiple: true,
|
|
1646
|
+
value: selectedValue,
|
|
1647
|
+
loading,
|
|
1648
|
+
options,
|
|
1649
|
+
getOptionLabel,
|
|
1650
|
+
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
1651
|
+
filterSelectedOptions: true,
|
|
1652
|
+
disableCloseOnSelect: true,
|
|
1653
|
+
ref: field.ref,
|
|
1654
|
+
disabled: isDisabled,
|
|
1655
|
+
onChange: handleChange,
|
|
1656
|
+
onBlur: (event) => {
|
|
1657
|
+
field.onBlur();
|
|
1658
|
+
if (typeof onBlur === "function") {
|
|
1659
|
+
onBlur(event);
|
|
1660
|
+
}
|
|
1661
|
+
},
|
|
1662
|
+
sx: {
|
|
1663
|
+
"&.Mui-disabled": {
|
|
1664
|
+
cursor: "not-allowed !important"
|
|
1665
|
+
},
|
|
1666
|
+
"& .MuiInputBase-root.Mui-disabled": {
|
|
1667
|
+
backgroundColor: theme.palette.action.disabledBackground,
|
|
1668
|
+
cursor: "not-allowed !important"
|
|
1669
|
+
},
|
|
1670
|
+
"&.Mui-disabled .MuiAutocomplete-popupIndicator": {
|
|
1671
|
+
cursor: "not-allowed !important"
|
|
1672
|
+
},
|
|
1673
|
+
"& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
|
|
1674
|
+
borderColor: error ? "red" : void 0
|
|
1675
|
+
},
|
|
1676
|
+
"& .MuiFilledInput-root.Mui-disabled": {
|
|
1677
|
+
borderColor: error ? "red" : void 0
|
|
1678
|
+
}
|
|
1679
|
+
},
|
|
1680
|
+
fullWidth: true,
|
|
1681
|
+
renderOption: (props1, option, { selected }) => {
|
|
1682
|
+
return /* @__PURE__ */ jsxs5("li", { ...props1, children: [
|
|
1683
|
+
/* @__PURE__ */ jsx10(
|
|
1684
|
+
Checkbox3,
|
|
1685
|
+
{
|
|
1686
|
+
icon,
|
|
1687
|
+
checkedIcon,
|
|
1688
|
+
checked: selected
|
|
1689
|
+
}
|
|
1690
|
+
),
|
|
1691
|
+
getOptionLabel(option)
|
|
1692
|
+
] });
|
|
1693
|
+
},
|
|
1694
|
+
renderInput: (params) => /* @__PURE__ */ jsx10(
|
|
1695
|
+
TextField5,
|
|
1696
|
+
{
|
|
1697
|
+
...params,
|
|
1698
|
+
label,
|
|
1699
|
+
error: !!error,
|
|
1700
|
+
helperText: error ? error.message : "",
|
|
1701
|
+
placeholder,
|
|
1702
|
+
InputProps: {
|
|
1703
|
+
...params.InputProps,
|
|
1704
|
+
endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
|
|
1705
|
+
loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
|
|
1706
|
+
params.InputProps.endAdornment
|
|
1707
|
+
] })
|
|
1708
|
+
},
|
|
1709
|
+
variant: variant ? variant : "outlined"
|
|
1710
|
+
}
|
|
1711
|
+
),
|
|
1712
|
+
...rest
|
|
1713
|
+
}
|
|
1714
|
+
);
|
|
1715
|
+
};
|
|
1716
|
+
var SelectMultiElement2 = ({
|
|
1717
|
+
gridProps = {},
|
|
1718
|
+
...props
|
|
1719
|
+
}) => {
|
|
1720
|
+
return /* @__PURE__ */ jsx10(Grid9, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx10(Component8, { ...props }) });
|
|
1721
|
+
};
|
|
1722
|
+
SelectMultiElement2.displayName = "SelectMultiElement";
|
|
1723
|
+
|
|
1724
|
+
// src/wrappers/TextFieldElement/TextFieldElement.tsx
|
|
1725
|
+
import { Grid as Grid10, TextField as TextField6, useForkRef as useForkRef3 } from "@mui/material";
|
|
1726
|
+
import { useController as useController10 } from "react-hook-form";
|
|
1727
|
+
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
1728
|
+
var Component9 = function TextFieldElement(props) {
|
|
1729
|
+
const {
|
|
1730
|
+
parseError,
|
|
1731
|
+
name,
|
|
1732
|
+
control,
|
|
1733
|
+
component: TextFieldComponent = TextField6,
|
|
1734
|
+
transform,
|
|
1735
|
+
fieldType = "text",
|
|
1736
|
+
// Default to text type
|
|
1737
|
+
defaultValue,
|
|
1738
|
+
label,
|
|
1739
|
+
placeholder,
|
|
1740
|
+
textFieldProps = {},
|
|
1741
|
+
variant,
|
|
1742
|
+
onChange: customOnChange,
|
|
1743
|
+
enableWarnings = process.env.NODE_ENV === "development",
|
|
1744
|
+
...rest
|
|
1745
|
+
} = props;
|
|
1746
|
+
const {
|
|
1747
|
+
type,
|
|
1748
|
+
required,
|
|
1749
|
+
helperText,
|
|
1750
|
+
inputRef,
|
|
1751
|
+
onInput,
|
|
1752
|
+
onBlur,
|
|
1753
|
+
disabled,
|
|
1754
|
+
...restTextProps
|
|
1755
|
+
} = textFieldProps;
|
|
1756
|
+
const {
|
|
1757
|
+
field,
|
|
1758
|
+
fieldState: { error }
|
|
1759
|
+
} = useController10({
|
|
1760
|
+
name,
|
|
1761
|
+
control
|
|
1762
|
+
});
|
|
1763
|
+
const { value, onChange } = useEnhancedTransform(
|
|
1764
|
+
{
|
|
1765
|
+
value: field.value,
|
|
1766
|
+
onChange: field.onChange,
|
|
1767
|
+
transform: transform ? {
|
|
1768
|
+
input: transform.input,
|
|
1769
|
+
output: transform.output
|
|
1770
|
+
} : void 0,
|
|
1771
|
+
fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
|
|
1772
|
+
// Auto-detect number type
|
|
1773
|
+
defaultValue,
|
|
1774
|
+
enableWarnings
|
|
1775
|
+
}
|
|
1776
|
+
);
|
|
1777
|
+
const handleInputRef = useForkRef3(field.ref, inputRef);
|
|
1778
|
+
return /* @__PURE__ */ jsx11(
|
|
1779
|
+
TextFieldComponent,
|
|
1780
|
+
{
|
|
1781
|
+
...rest,
|
|
1782
|
+
...restTextProps,
|
|
1783
|
+
name: field.name,
|
|
1784
|
+
value,
|
|
1785
|
+
onChange: (event) => {
|
|
1786
|
+
const input = event.target.value;
|
|
1787
|
+
if (input === "") {
|
|
1788
|
+
field.onChange(null);
|
|
1789
|
+
} else {
|
|
1790
|
+
onChange(event);
|
|
1791
|
+
}
|
|
1792
|
+
if (typeof customOnChange === "function") {
|
|
1793
|
+
customOnChange(event);
|
|
1794
|
+
}
|
|
1795
|
+
return;
|
|
1796
|
+
},
|
|
1797
|
+
onBlur: (event) => {
|
|
1798
|
+
field.onBlur();
|
|
1799
|
+
if (typeof onBlur === "function") {
|
|
1800
|
+
onBlur(event);
|
|
1801
|
+
}
|
|
1802
|
+
},
|
|
1803
|
+
onInput: (event) => {
|
|
1804
|
+
if (typeof onInput === "function") {
|
|
1805
|
+
onInput(event);
|
|
1806
|
+
}
|
|
1807
|
+
},
|
|
1808
|
+
disabled,
|
|
1809
|
+
label,
|
|
1810
|
+
placeholder,
|
|
1811
|
+
fullWidth: true,
|
|
1812
|
+
required,
|
|
1813
|
+
type,
|
|
1814
|
+
error: !!error,
|
|
1815
|
+
helperText: error ? parseError ? parseError(error) : error.message : helperText,
|
|
1816
|
+
inputRef: handleInputRef,
|
|
1817
|
+
variant: variant ? variant : "outlined"
|
|
1818
|
+
}
|
|
1819
|
+
);
|
|
1820
|
+
};
|
|
1821
|
+
var TextFieldElement2 = ({
|
|
1822
|
+
gridProps = {},
|
|
1823
|
+
...props
|
|
1824
|
+
}) => {
|
|
1825
|
+
return /* @__PURE__ */ jsx11(Grid10, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx11(Component9, { ...props }) });
|
|
1826
|
+
};
|
|
1827
|
+
|
|
1828
|
+
// src/wrappers/TimePickerElement/TimePickerElement.tsx
|
|
1829
|
+
import { Grid as Grid11, useForkRef as useForkRef4 } from "@mui/material";
|
|
1830
|
+
import { TimePicker } from "@mui/x-date-pickers";
|
|
1831
|
+
import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
|
|
1832
|
+
import { renderTimeViewClock } from "@mui/x-date-pickers/timeViewRenderers";
|
|
1833
|
+
import dayjs from "dayjs";
|
|
1834
|
+
import { useState as useState3 } from "react";
|
|
1835
|
+
import { useController as useController11 } from "react-hook-form";
|
|
1836
|
+
import { jsx as jsx12 } from "react/jsx-runtime";
|
|
1837
|
+
var Component10 = function TimePickerElement(props) {
|
|
1838
|
+
const {
|
|
1839
|
+
name,
|
|
1840
|
+
required,
|
|
1841
|
+
inputProps,
|
|
1842
|
+
control,
|
|
1843
|
+
label,
|
|
1844
|
+
placeholder,
|
|
1845
|
+
slotProps,
|
|
1846
|
+
timePickerProps = {},
|
|
1847
|
+
transform,
|
|
1848
|
+
...rest
|
|
1849
|
+
} = props;
|
|
1850
|
+
const adapter = useLocalizationContext2();
|
|
1851
|
+
const [open, setOpen] = useState3(false);
|
|
1852
|
+
const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
|
|
1853
|
+
const {
|
|
1854
|
+
field,
|
|
1855
|
+
fieldState: { error }
|
|
1856
|
+
} = useController11({
|
|
1857
|
+
name,
|
|
1858
|
+
control,
|
|
1859
|
+
defaultValue: null
|
|
1860
|
+
});
|
|
1861
|
+
const { value, onChange } = useTransform({
|
|
1862
|
+
value: field.value,
|
|
1863
|
+
onChange: field.onChange,
|
|
1864
|
+
transform: {
|
|
1865
|
+
input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
|
|
1866
|
+
output: (data) => {
|
|
1867
|
+
if (!dayjs.isDayjs(data)) {
|
|
1868
|
+
return null;
|
|
1869
|
+
}
|
|
1870
|
+
return data;
|
|
1871
|
+
}
|
|
1872
|
+
}
|
|
1873
|
+
});
|
|
1874
|
+
const handleInputRef = useForkRef4(field.ref, inputRef);
|
|
1875
|
+
return /* @__PURE__ */ jsx12(
|
|
1876
|
+
TimePicker,
|
|
1877
|
+
{
|
|
1878
|
+
...rest,
|
|
1879
|
+
...restTimePickerProps,
|
|
1880
|
+
value,
|
|
1881
|
+
label,
|
|
1882
|
+
disabled,
|
|
1883
|
+
open,
|
|
1884
|
+
inputRef: handleInputRef,
|
|
1885
|
+
viewRenderers: {
|
|
1886
|
+
hours: renderTimeViewClock,
|
|
1887
|
+
minutes: renderTimeViewClock,
|
|
1888
|
+
seconds: renderTimeViewClock
|
|
1889
|
+
},
|
|
1890
|
+
onOpen: () => setOpen(true),
|
|
1891
|
+
onClose: (...args) => {
|
|
1892
|
+
setOpen(false);
|
|
1893
|
+
field.onBlur();
|
|
1894
|
+
onClose?.(...args);
|
|
1895
|
+
},
|
|
1896
|
+
onChange: (newValue, context) => {
|
|
1897
|
+
onChange(newValue);
|
|
1898
|
+
timePickerProps.onChange?.(newValue, context);
|
|
1899
|
+
},
|
|
1900
|
+
slotProps: {
|
|
1901
|
+
...slotProps,
|
|
1902
|
+
actionBar: {
|
|
1903
|
+
actions: ["clear", "cancel", "accept"]
|
|
1904
|
+
},
|
|
1905
|
+
textField: {
|
|
1906
|
+
...inputProps,
|
|
1907
|
+
required,
|
|
1908
|
+
placeholder,
|
|
1909
|
+
fullWidth: true,
|
|
1910
|
+
readOnly: true,
|
|
1911
|
+
sx: {
|
|
1912
|
+
cursor: disabled ? "not-allowed" : "pointer"
|
|
1913
|
+
},
|
|
1914
|
+
onClick: () => {
|
|
1915
|
+
if (!disabled) {
|
|
1916
|
+
setOpen(true);
|
|
1917
|
+
}
|
|
1918
|
+
},
|
|
1919
|
+
onBlur: (event) => {
|
|
1920
|
+
field.onBlur();
|
|
1921
|
+
inputProps?.onBlur?.(event);
|
|
1922
|
+
},
|
|
1923
|
+
error: !!error,
|
|
1924
|
+
helperText: error ? error.message : inputProps?.helperText || rest.helperText,
|
|
1925
|
+
inputProps: {
|
|
1926
|
+
readOnly: true,
|
|
1927
|
+
inputMode: "none",
|
|
1928
|
+
...inputProps?.inputProps
|
|
1929
|
+
}
|
|
1930
|
+
}
|
|
1931
|
+
}
|
|
1932
|
+
}
|
|
1933
|
+
);
|
|
1934
|
+
};
|
|
1935
|
+
var TimePickerElement2 = ({
|
|
1936
|
+
gridProps = {},
|
|
1937
|
+
...props
|
|
1938
|
+
}) => {
|
|
1939
|
+
return /* @__PURE__ */ jsx12(Grid11, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx12(Component10, { ...props }) });
|
|
1940
|
+
};
|
|
1941
|
+
TimePickerElement2.displayName = "TimePickerElement";
|
|
1942
|
+
|
|
1943
|
+
// src/wrappers/SliderElement/SliderElement.tsx
|
|
1944
|
+
import {
|
|
1945
|
+
Box,
|
|
1946
|
+
FormControl as FormControl4,
|
|
1947
|
+
FormHelperText as FormHelperText4,
|
|
1948
|
+
FormLabel as FormLabel3,
|
|
1949
|
+
Grid as Grid12,
|
|
1950
|
+
Slider
|
|
1951
|
+
} from "@mui/material";
|
|
1952
|
+
import { useController as useController12 } from "react-hook-form";
|
|
1953
|
+
import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1954
|
+
var Component11 = function SliderElementCore(props) {
|
|
1955
|
+
const {
|
|
1956
|
+
name,
|
|
1957
|
+
control,
|
|
1958
|
+
label,
|
|
1959
|
+
helperText,
|
|
1960
|
+
parseError,
|
|
1961
|
+
min = 0,
|
|
1962
|
+
max = 100,
|
|
1963
|
+
step = 1,
|
|
1964
|
+
marks = false,
|
|
1965
|
+
required = false,
|
|
1966
|
+
disabled = false,
|
|
1967
|
+
sliderProps = {}
|
|
1968
|
+
} = props;
|
|
1969
|
+
const {
|
|
1970
|
+
field,
|
|
1971
|
+
fieldState: { error }
|
|
1972
|
+
} = useController12({
|
|
1973
|
+
name,
|
|
1974
|
+
control
|
|
1975
|
+
});
|
|
1976
|
+
const errorMessage = error ? parseError ? parseError(error) : error.message : null;
|
|
1977
|
+
return /* @__PURE__ */ jsxs6(
|
|
1978
|
+
FormControl4,
|
|
1979
|
+
{
|
|
1980
|
+
fullWidth: true,
|
|
1981
|
+
margin: "normal",
|
|
1982
|
+
error: !!error,
|
|
1983
|
+
required,
|
|
1984
|
+
disabled,
|
|
1985
|
+
children: [
|
|
1986
|
+
label && /* @__PURE__ */ jsx13(FormLabel3, { sx: { mb: 2 }, children: label }),
|
|
1987
|
+
/* @__PURE__ */ jsx13(Box, { sx: { px: 2 }, children: /* @__PURE__ */ jsx13(
|
|
1988
|
+
Slider,
|
|
1989
|
+
{
|
|
1990
|
+
...sliderProps,
|
|
1991
|
+
ref: field.ref,
|
|
1992
|
+
name: field.name,
|
|
1993
|
+
value: typeof field.value === "number" ? field.value : min,
|
|
1994
|
+
onChange: (_, newValue) => field.onChange(newValue),
|
|
1995
|
+
onBlur: field.onBlur,
|
|
1996
|
+
min,
|
|
1997
|
+
max,
|
|
1998
|
+
step,
|
|
1999
|
+
marks,
|
|
2000
|
+
valueLabelDisplay: "auto",
|
|
2001
|
+
disabled
|
|
2002
|
+
}
|
|
2003
|
+
) }),
|
|
2004
|
+
(errorMessage || helperText) && /* @__PURE__ */ jsx13(FormHelperText4, { children: errorMessage || helperText })
|
|
2005
|
+
]
|
|
2006
|
+
}
|
|
2007
|
+
);
|
|
2008
|
+
};
|
|
2009
|
+
var SliderElement = ({
|
|
2010
|
+
gridProps = {},
|
|
2011
|
+
...props
|
|
2012
|
+
}) => {
|
|
2013
|
+
return /* @__PURE__ */ jsx13(Grid12, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx13(Component11, { ...props }) });
|
|
2014
|
+
};
|
|
2015
|
+
SliderElement.displayName = "SliderElement";
|
|
2016
|
+
|
|
2017
|
+
// src/wrappers/FileUploadElement/FileUploadElement.tsx
|
|
2018
|
+
import {
|
|
2019
|
+
Box as Box2,
|
|
2020
|
+
Button,
|
|
2021
|
+
Chip,
|
|
2022
|
+
FormControl as FormControl5,
|
|
2023
|
+
FormHelperText as FormHelperText5,
|
|
2024
|
+
FormLabel as FormLabel4,
|
|
2025
|
+
Grid as Grid13,
|
|
2026
|
+
Stack
|
|
2027
|
+
} from "@mui/material";
|
|
2028
|
+
import CloudUploadIcon from "@mui/icons-material/CloudUpload";
|
|
2029
|
+
import { useCallback as useCallback7, useRef as useRef3 } from "react";
|
|
2030
|
+
import { useController as useController13, useFormContext } from "react-hook-form";
|
|
2031
|
+
import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
2032
|
+
var Component12 = function FileUploadElementCore(props) {
|
|
2033
|
+
const {
|
|
2034
|
+
name,
|
|
2035
|
+
control,
|
|
2036
|
+
label,
|
|
2037
|
+
helperText,
|
|
2038
|
+
parseError,
|
|
2039
|
+
maxFiles = 5,
|
|
2040
|
+
maxSizeMB = 10,
|
|
2041
|
+
allowedExtensions = [".jpg", ".jpeg", ".png", ".pdf", ".doc", ".docx", ".xls", ".xlsx"],
|
|
2042
|
+
required = false,
|
|
2043
|
+
disabled = false,
|
|
2044
|
+
buttonText = "Choose Files"
|
|
2045
|
+
} = props;
|
|
2046
|
+
const { setError, clearErrors } = useFormContext();
|
|
2047
|
+
const fileInputRef = useRef3(null);
|
|
2048
|
+
const {
|
|
2049
|
+
field,
|
|
2050
|
+
fieldState: { error }
|
|
2051
|
+
} = useController13({
|
|
2052
|
+
name,
|
|
2053
|
+
control
|
|
2054
|
+
});
|
|
2055
|
+
const files = Array.isArray(field.value) ? field.value : [];
|
|
2056
|
+
const validateFiles = useCallback7(
|
|
2057
|
+
(fileList) => {
|
|
2058
|
+
if (!fileList || fileList.length === 0) {
|
|
2059
|
+
return [];
|
|
2060
|
+
}
|
|
2061
|
+
if (fileList.length > maxFiles) {
|
|
2062
|
+
return `Maximum ${maxFiles} files allowed`;
|
|
2063
|
+
}
|
|
2064
|
+
const maxSizeBytes = maxSizeMB * 1024 * 1024;
|
|
2065
|
+
const validFiles = [];
|
|
2066
|
+
for (let i = 0; i < fileList.length; i++) {
|
|
2067
|
+
const file = fileList[i];
|
|
2068
|
+
if (file.size > maxSizeBytes) {
|
|
2069
|
+
return `File "${file.name}" exceeds ${maxSizeMB}MB size limit`;
|
|
2070
|
+
}
|
|
2071
|
+
const extension = "." + file.name.split(".").pop()?.toLowerCase();
|
|
2072
|
+
if (!allowedExtensions.includes(extension)) {
|
|
2073
|
+
return `File "${file.name}" has invalid extension. Allowed: ${allowedExtensions.join(", ")}`;
|
|
2074
|
+
}
|
|
2075
|
+
validFiles.push(file);
|
|
2076
|
+
}
|
|
2077
|
+
return validFiles;
|
|
2078
|
+
},
|
|
2079
|
+
[maxFiles, maxSizeMB, allowedExtensions]
|
|
2080
|
+
);
|
|
2081
|
+
const handleFileChange = useCallback7(
|
|
2082
|
+
(event) => {
|
|
2083
|
+
const result = validateFiles(event.target.files);
|
|
2084
|
+
if (typeof result === "string") {
|
|
2085
|
+
setError(name, { type: "validation", message: result });
|
|
2086
|
+
if (fileInputRef.current) {
|
|
2087
|
+
fileInputRef.current.value = "";
|
|
2088
|
+
}
|
|
2089
|
+
return;
|
|
2090
|
+
}
|
|
2091
|
+
clearErrors(name);
|
|
2092
|
+
field.onChange(result);
|
|
2093
|
+
},
|
|
2094
|
+
[validateFiles, setError, clearErrors, name, field]
|
|
2095
|
+
);
|
|
2096
|
+
const handleRemoveFile = useCallback7(
|
|
2097
|
+
(index) => {
|
|
2098
|
+
const newFiles = files.filter((_, i) => i !== index);
|
|
2099
|
+
field.onChange(newFiles);
|
|
2100
|
+
if (fileInputRef.current) {
|
|
2101
|
+
fileInputRef.current.value = "";
|
|
2102
|
+
}
|
|
2103
|
+
},
|
|
2104
|
+
[files, field]
|
|
2105
|
+
);
|
|
2106
|
+
const errorMessage = error ? parseError ? parseError(error) : error.message : null;
|
|
2107
|
+
return /* @__PURE__ */ jsxs7(
|
|
2108
|
+
FormControl5,
|
|
2109
|
+
{
|
|
2110
|
+
fullWidth: true,
|
|
2111
|
+
margin: "normal",
|
|
2112
|
+
error: !!error,
|
|
2113
|
+
required,
|
|
2114
|
+
disabled,
|
|
2115
|
+
children: [
|
|
2116
|
+
label && /* @__PURE__ */ jsx14(FormLabel4, { sx: { mb: 1 }, children: label }),
|
|
2117
|
+
/* @__PURE__ */ jsxs7(Box2, { children: [
|
|
2118
|
+
/* @__PURE__ */ jsxs7(
|
|
2119
|
+
Button,
|
|
2120
|
+
{
|
|
2121
|
+
variant: "outlined",
|
|
2122
|
+
component: "label",
|
|
2123
|
+
startIcon: /* @__PURE__ */ jsx14(CloudUploadIcon, {}),
|
|
2124
|
+
disabled: disabled || files.length >= maxFiles,
|
|
2125
|
+
children: [
|
|
2126
|
+
buttonText,
|
|
2127
|
+
/* @__PURE__ */ jsx14(
|
|
2128
|
+
"input",
|
|
2129
|
+
{
|
|
2130
|
+
ref: fileInputRef,
|
|
2131
|
+
type: "file",
|
|
2132
|
+
multiple: true,
|
|
2133
|
+
accept: allowedExtensions.join(","),
|
|
2134
|
+
hidden: true,
|
|
2135
|
+
onChange: handleFileChange
|
|
2136
|
+
}
|
|
2137
|
+
)
|
|
2138
|
+
]
|
|
2139
|
+
}
|
|
2140
|
+
),
|
|
2141
|
+
files.length > 0 && /* @__PURE__ */ jsx14(Stack, { direction: "row", spacing: 1, flexWrap: "wrap", sx: { mt: 2 }, children: files.map((file, index) => /* @__PURE__ */ jsx14(
|
|
2142
|
+
Chip,
|
|
2143
|
+
{
|
|
2144
|
+
label: `${file.name} (${(file.size / 1024).toFixed(1)} KB)`,
|
|
2145
|
+
onDelete: disabled ? void 0 : () => handleRemoveFile(index),
|
|
2146
|
+
sx: { mb: 1 }
|
|
2147
|
+
},
|
|
2148
|
+
`${file.name}-${index}`
|
|
2149
|
+
)) })
|
|
2150
|
+
] }),
|
|
2151
|
+
(errorMessage || helperText) && /* @__PURE__ */ jsx14(FormHelperText5, { children: errorMessage || helperText })
|
|
2152
|
+
]
|
|
2153
|
+
}
|
|
2154
|
+
);
|
|
2155
|
+
};
|
|
2156
|
+
var FileUploadElement = ({
|
|
2157
|
+
gridProps = {},
|
|
2158
|
+
...props
|
|
2159
|
+
}) => {
|
|
2160
|
+
return /* @__PURE__ */ jsx14(Grid13, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx14(Component12, { ...props }) });
|
|
2161
|
+
};
|
|
2162
|
+
FileUploadElement.displayName = "FileUploadElement";
|
|
2163
|
+
|
|
2164
|
+
// src/wrappers/PhoneNumberElement/PhoneNumberElement.tsx
|
|
2165
|
+
import { useState as useState5, useEffect as useEffect5 } from "react";
|
|
2166
|
+
import { TextField as TextField8, InputAdornment as InputAdornment3, Grid as Grid14 } from "@mui/material";
|
|
2167
|
+
import { useController as useController14 } from "react-hook-form";
|
|
2168
|
+
|
|
2169
|
+
// src/wrappers/PhoneNumberElement/CountrySelector.tsx
|
|
2170
|
+
import { useState as useState4, useRef as useRef4, useMemo as useMemo9 } from "react";
|
|
2171
|
+
import {
|
|
2172
|
+
Button as Button2,
|
|
2173
|
+
Popover,
|
|
2174
|
+
TextField as TextField7,
|
|
2175
|
+
List,
|
|
2176
|
+
ListItemButton,
|
|
2177
|
+
ListItemText,
|
|
2178
|
+
Divider,
|
|
2179
|
+
Box as Box3,
|
|
2180
|
+
InputAdornment as InputAdornment2,
|
|
2181
|
+
Typography
|
|
2182
|
+
} from "@mui/material";
|
|
2183
|
+
import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown";
|
|
2184
|
+
import SearchIcon from "@mui/icons-material/Search";
|
|
2185
|
+
|
|
2186
|
+
// src/wrappers/PhoneNumberElement/countries.ts
|
|
2187
|
+
function getFlag(code) {
|
|
2188
|
+
return code.toUpperCase().split("").map((c) => String.fromCodePoint(c.charCodeAt(0) - 65 + 127462)).join("");
|
|
2189
|
+
}
|
|
2190
|
+
var RAW = [
|
|
2191
|
+
["AF", "+93", "Afghanistan"],
|
|
2192
|
+
["AL", "+355", "Albania"],
|
|
2193
|
+
["DZ", "+213", "Algeria"],
|
|
2194
|
+
["AD", "+376", "Andorra"],
|
|
2195
|
+
["AO", "+244", "Angola"],
|
|
2196
|
+
["AI", "+1264", "Anguilla"],
|
|
2197
|
+
["AG", "+1268", "Antigua and Barbuda"],
|
|
2198
|
+
["AR", "+54", "Argentina"],
|
|
2199
|
+
["AM", "+374", "Armenia"],
|
|
2200
|
+
["AW", "+297", "Aruba"],
|
|
2201
|
+
["AU", "+61", "Australia"],
|
|
2202
|
+
["AT", "+43", "Austria"],
|
|
2203
|
+
["AZ", "+994", "Azerbaijan"],
|
|
2204
|
+
["BS", "+1242", "Bahamas"],
|
|
2205
|
+
["BH", "+973", "Bahrain"],
|
|
2206
|
+
["BD", "+880", "Bangladesh"],
|
|
2207
|
+
["BB", "+1246", "Barbados"],
|
|
2208
|
+
["BY", "+375", "Belarus"],
|
|
2209
|
+
["BE", "+32", "Belgium"],
|
|
2210
|
+
["BZ", "+501", "Belize"],
|
|
2211
|
+
["BJ", "+229", "Benin"],
|
|
2212
|
+
["BM", "+1441", "Bermuda"],
|
|
2213
|
+
["BT", "+975", "Bhutan"],
|
|
2214
|
+
["BO", "+591", "Bolivia"],
|
|
2215
|
+
["BA", "+387", "Bosnia and Herzegovina"],
|
|
2216
|
+
["BW", "+267", "Botswana"],
|
|
2217
|
+
["BR", "+55", "Brazil"],
|
|
2218
|
+
["VG", "+1284", "British Virgin Islands"],
|
|
2219
|
+
["BN", "+673", "Brunei"],
|
|
2220
|
+
["BG", "+359", "Bulgaria"],
|
|
2221
|
+
["BF", "+226", "Burkina Faso"],
|
|
2222
|
+
["BI", "+257", "Burundi"],
|
|
2223
|
+
["CV", "+238", "Cabo Verde"],
|
|
2224
|
+
["KH", "+855", "Cambodia"],
|
|
2225
|
+
["CM", "+237", "Cameroon"],
|
|
2226
|
+
["CA", "+1", "Canada"],
|
|
2227
|
+
["KY", "+1345", "Cayman Islands"],
|
|
2228
|
+
["CF", "+236", "Central African Republic"],
|
|
2229
|
+
["TD", "+235", "Chad"],
|
|
2230
|
+
["CL", "+56", "Chile"],
|
|
2231
|
+
["CN", "+86", "China"],
|
|
2232
|
+
["CX", "+61", "Christmas Island"],
|
|
2233
|
+
["CC", "+61", "Cocos Islands"],
|
|
2234
|
+
["CO", "+57", "Colombia"],
|
|
2235
|
+
["KM", "+269", "Comoros"],
|
|
2236
|
+
["CG", "+242", "Congo (Republic)"],
|
|
2237
|
+
["CD", "+243", "Congo (Democratic Republic)"],
|
|
2238
|
+
["CK", "+682", "Cook Islands"],
|
|
2239
|
+
["CR", "+506", "Costa Rica"],
|
|
2240
|
+
["HR", "+385", "Croatia"],
|
|
2241
|
+
["CU", "+53", "Cuba"],
|
|
2242
|
+
["CW", "+599", "Cura\xE7ao"],
|
|
2243
|
+
["CY", "+357", "Cyprus"],
|
|
2244
|
+
["CZ", "+420", "Czech Republic"],
|
|
2245
|
+
["DK", "+45", "Denmark"],
|
|
2246
|
+
["DJ", "+253", "Djibouti"],
|
|
2247
|
+
["DM", "+1767", "Dominica"],
|
|
2248
|
+
["DO", "+1809", "Dominican Republic"],
|
|
2249
|
+
["EC", "+593", "Ecuador"],
|
|
2250
|
+
["EG", "+20", "Egypt"],
|
|
2251
|
+
["SV", "+503", "El Salvador"],
|
|
2252
|
+
["GQ", "+240", "Equatorial Guinea"],
|
|
2253
|
+
["ER", "+291", "Eritrea"],
|
|
2254
|
+
["EE", "+372", "Estonia"],
|
|
2255
|
+
["SZ", "+268", "Eswatini"],
|
|
2256
|
+
["ET", "+251", "Ethiopia"],
|
|
2257
|
+
["FK", "+500", "Falkland Islands"],
|
|
2258
|
+
["FO", "+298", "Faroe Islands"],
|
|
2259
|
+
["FJ", "+679", "Fiji"],
|
|
2260
|
+
["FI", "+358", "Finland"],
|
|
2261
|
+
["FR", "+33", "France"],
|
|
2262
|
+
["GF", "+594", "French Guiana"],
|
|
2263
|
+
["PF", "+689", "French Polynesia"],
|
|
2264
|
+
["GA", "+241", "Gabon"],
|
|
2265
|
+
["GM", "+220", "Gambia"],
|
|
2266
|
+
["GE", "+995", "Georgia"],
|
|
2267
|
+
["DE", "+49", "Germany"],
|
|
2268
|
+
["GH", "+233", "Ghana"],
|
|
2269
|
+
["GI", "+350", "Gibraltar"],
|
|
2270
|
+
["GR", "+30", "Greece"],
|
|
2271
|
+
["GL", "+299", "Greenland"],
|
|
2272
|
+
["GD", "+1473", "Grenada"],
|
|
2273
|
+
["GP", "+590", "Guadeloupe"],
|
|
2274
|
+
["GU", "+1671", "Guam"],
|
|
2275
|
+
["GT", "+502", "Guatemala"],
|
|
2276
|
+
["GG", "+44", "Guernsey"],
|
|
2277
|
+
["GN", "+224", "Guinea"],
|
|
2278
|
+
["GW", "+245", "Guinea-Bissau"],
|
|
2279
|
+
["GY", "+592", "Guyana"],
|
|
2280
|
+
["HT", "+509", "Haiti"],
|
|
2281
|
+
["HN", "+504", "Honduras"],
|
|
2282
|
+
["HK", "+852", "Hong Kong"],
|
|
2283
|
+
["HU", "+36", "Hungary"],
|
|
2284
|
+
["IS", "+354", "Iceland"],
|
|
2285
|
+
["IN", "+91", "India"],
|
|
2286
|
+
["ID", "+62", "Indonesia"],
|
|
2287
|
+
["IR", "+98", "Iran"],
|
|
2288
|
+
["IQ", "+964", "Iraq"],
|
|
2289
|
+
["IE", "+353", "Ireland"],
|
|
2290
|
+
["IM", "+44", "Isle of Man"],
|
|
2291
|
+
["IL", "+972", "Israel"],
|
|
2292
|
+
["IT", "+39", "Italy"],
|
|
2293
|
+
["JM", "+1876", "Jamaica"],
|
|
2294
|
+
["JP", "+81", "Japan"],
|
|
2295
|
+
["JE", "+44", "Jersey"],
|
|
2296
|
+
["JO", "+962", "Jordan"],
|
|
2297
|
+
["KZ", "+7", "Kazakhstan"],
|
|
2298
|
+
["KE", "+254", "Kenya"],
|
|
2299
|
+
["KI", "+686", "Kiribati"],
|
|
2300
|
+
["XK", "+383", "Kosovo"],
|
|
2301
|
+
["KW", "+965", "Kuwait"],
|
|
2302
|
+
["KG", "+996", "Kyrgyzstan"],
|
|
2303
|
+
["LA", "+856", "Laos"],
|
|
2304
|
+
["LV", "+371", "Latvia"],
|
|
2305
|
+
["LB", "+961", "Lebanon"],
|
|
2306
|
+
["LS", "+266", "Lesotho"],
|
|
2307
|
+
["LR", "+231", "Liberia"],
|
|
2308
|
+
["LY", "+218", "Libya"],
|
|
2309
|
+
["LI", "+423", "Liechtenstein"],
|
|
2310
|
+
["LT", "+370", "Lithuania"],
|
|
2311
|
+
["LU", "+352", "Luxembourg"],
|
|
2312
|
+
["MO", "+853", "Macao"],
|
|
2313
|
+
["MG", "+261", "Madagascar"],
|
|
2314
|
+
["MW", "+265", "Malawi"],
|
|
2315
|
+
["MY", "+60", "Malaysia"],
|
|
2316
|
+
["MV", "+960", "Maldives"],
|
|
2317
|
+
["ML", "+223", "Mali"],
|
|
2318
|
+
["MT", "+356", "Malta"],
|
|
2319
|
+
["MH", "+692", "Marshall Islands"],
|
|
2320
|
+
["MQ", "+596", "Martinique"],
|
|
2321
|
+
["MR", "+222", "Mauritania"],
|
|
2322
|
+
["MU", "+230", "Mauritius"],
|
|
2323
|
+
["YT", "+262", "Mayotte"],
|
|
2324
|
+
["MX", "+52", "Mexico"],
|
|
2325
|
+
["FM", "+691", "Micronesia"],
|
|
2326
|
+
["MD", "+373", "Moldova"],
|
|
2327
|
+
["MC", "+377", "Monaco"],
|
|
2328
|
+
["MN", "+976", "Mongolia"],
|
|
2329
|
+
["ME", "+382", "Montenegro"],
|
|
2330
|
+
["MS", "+1664", "Montserrat"],
|
|
2331
|
+
["MA", "+212", "Morocco"],
|
|
2332
|
+
["MZ", "+258", "Mozambique"],
|
|
2333
|
+
["MM", "+95", "Myanmar"],
|
|
2334
|
+
["NA", "+264", "Namibia"],
|
|
2335
|
+
["NR", "+674", "Nauru"],
|
|
2336
|
+
["NP", "+977", "Nepal"],
|
|
2337
|
+
["NL", "+31", "Netherlands"],
|
|
2338
|
+
["NC", "+687", "New Caledonia"],
|
|
2339
|
+
["NZ", "+64", "New Zealand"],
|
|
2340
|
+
["NI", "+505", "Nicaragua"],
|
|
2341
|
+
["NE", "+227", "Niger"],
|
|
2342
|
+
["NG", "+234", "Nigeria"],
|
|
2343
|
+
["NU", "+683", "Niue"],
|
|
2344
|
+
["NF", "+672", "Norfolk Island"],
|
|
2345
|
+
["KP", "+850", "North Korea"],
|
|
2346
|
+
["MK", "+389", "North Macedonia"],
|
|
2347
|
+
["MP", "+1670", "Northern Mariana Islands"],
|
|
2348
|
+
["NO", "+47", "Norway"],
|
|
2349
|
+
["OM", "+968", "Oman"],
|
|
2350
|
+
["PK", "+92", "Pakistan"],
|
|
2351
|
+
["PW", "+680", "Palau"],
|
|
2352
|
+
["PS", "+970", "Palestine"],
|
|
2353
|
+
["PA", "+507", "Panama"],
|
|
2354
|
+
["PG", "+675", "Papua New Guinea"],
|
|
2355
|
+
["PY", "+595", "Paraguay"],
|
|
2356
|
+
["PE", "+51", "Peru"],
|
|
2357
|
+
["PH", "+63", "Philippines"],
|
|
2358
|
+
["PL", "+48", "Poland"],
|
|
2359
|
+
["PT", "+351", "Portugal"],
|
|
2360
|
+
["PR", "+1787", "Puerto Rico"],
|
|
2361
|
+
["QA", "+974", "Qatar"],
|
|
2362
|
+
["RE", "+262", "R\xE9union"],
|
|
2363
|
+
["RO", "+40", "Romania"],
|
|
2364
|
+
["RU", "+7", "Russia"],
|
|
2365
|
+
["RW", "+250", "Rwanda"],
|
|
2366
|
+
["BL", "+590", "Saint Barth\xE9lemy"],
|
|
2367
|
+
["SH", "+290", "Saint Helena"],
|
|
2368
|
+
["KN", "+1869", "Saint Kitts and Nevis"],
|
|
2369
|
+
["LC", "+1758", "Saint Lucia"],
|
|
2370
|
+
["MF", "+590", "Saint Martin"],
|
|
2371
|
+
["PM", "+508", "Saint Pierre and Miquelon"],
|
|
2372
|
+
["VC", "+1784", "Saint Vincent and the Grenadines"],
|
|
2373
|
+
["WS", "+685", "Samoa"],
|
|
2374
|
+
["SM", "+378", "San Marino"],
|
|
2375
|
+
["ST", "+239", "Sao Tome and Principe"],
|
|
2376
|
+
["SA", "+966", "Saudi Arabia"],
|
|
2377
|
+
["SN", "+221", "Senegal"],
|
|
2378
|
+
["RS", "+381", "Serbia"],
|
|
2379
|
+
["SC", "+248", "Seychelles"],
|
|
2380
|
+
["SL", "+232", "Sierra Leone"],
|
|
2381
|
+
["SG", "+65", "Singapore"],
|
|
2382
|
+
["SX", "+1721", "Sint Maarten"],
|
|
2383
|
+
["SK", "+421", "Slovakia"],
|
|
2384
|
+
["SI", "+386", "Slovenia"],
|
|
2385
|
+
["SB", "+677", "Solomon Islands"],
|
|
2386
|
+
["SO", "+252", "Somalia"],
|
|
2387
|
+
["ZA", "+27", "South Africa"],
|
|
2388
|
+
["KR", "+82", "South Korea"],
|
|
2389
|
+
["SS", "+211", "South Sudan"],
|
|
2390
|
+
["ES", "+34", "Spain"],
|
|
2391
|
+
["LK", "+94", "Sri Lanka"],
|
|
2392
|
+
["SD", "+249", "Sudan"],
|
|
2393
|
+
["SR", "+597", "Suriname"],
|
|
2394
|
+
["SE", "+46", "Sweden"],
|
|
2395
|
+
["CH", "+41", "Switzerland"],
|
|
2396
|
+
["SY", "+963", "Syria"],
|
|
2397
|
+
["TW", "+886", "Taiwan"],
|
|
2398
|
+
["TJ", "+992", "Tajikistan"],
|
|
2399
|
+
["TZ", "+255", "Tanzania"],
|
|
2400
|
+
["TH", "+66", "Thailand"],
|
|
2401
|
+
["TL", "+670", "Timor-Leste"],
|
|
2402
|
+
["TG", "+228", "Togo"],
|
|
2403
|
+
["TK", "+690", "Tokelau"],
|
|
2404
|
+
["TO", "+676", "Tonga"],
|
|
2405
|
+
["TT", "+1868", "Trinidad and Tobago"],
|
|
2406
|
+
["TN", "+216", "Tunisia"],
|
|
2407
|
+
["TR", "+90", "Turkey"],
|
|
2408
|
+
["TM", "+993", "Turkmenistan"],
|
|
2409
|
+
["TC", "+1649", "Turks and Caicos Islands"],
|
|
2410
|
+
["TV", "+688", "Tuvalu"],
|
|
2411
|
+
["UG", "+256", "Uganda"],
|
|
2412
|
+
["UA", "+380", "Ukraine"],
|
|
2413
|
+
["AE", "+971", "United Arab Emirates"],
|
|
2414
|
+
["GB", "+44", "United Kingdom"],
|
|
2415
|
+
["US", "+1", "United States"],
|
|
2416
|
+
["VI", "+1340", "US Virgin Islands"],
|
|
2417
|
+
["UY", "+598", "Uruguay"],
|
|
2418
|
+
["UZ", "+998", "Uzbekistan"],
|
|
2419
|
+
["VU", "+678", "Vanuatu"],
|
|
2420
|
+
["VA", "+39", "Vatican City"],
|
|
2421
|
+
["VE", "+58", "Venezuela"],
|
|
2422
|
+
["VN", "+84", "Vietnam"],
|
|
2423
|
+
["WF", "+681", "Wallis and Futuna"],
|
|
2424
|
+
["YE", "+967", "Yemen"],
|
|
2425
|
+
["ZM", "+260", "Zambia"],
|
|
2426
|
+
["ZW", "+263", "Zimbabwe"]
|
|
2427
|
+
];
|
|
2428
|
+
var COUNTRIES = RAW.map(([code, dialCode, name]) => ({
|
|
2429
|
+
code,
|
|
2430
|
+
dialCode,
|
|
2431
|
+
name,
|
|
2432
|
+
flag: getFlag(code)
|
|
2433
|
+
}));
|
|
2434
|
+
function parseE164Country(value) {
|
|
2435
|
+
if (!value || !value.startsWith("+")) return void 0;
|
|
2436
|
+
const sorted = [...COUNTRIES].sort((a, b) => b.dialCode.length - a.dialCode.length);
|
|
2437
|
+
return sorted.find((c) => value.startsWith(c.dialCode));
|
|
2438
|
+
}
|
|
2439
|
+
function parseE164LocalNumber(value, dialCode) {
|
|
2440
|
+
if (!value || !value.startsWith(dialCode)) return "";
|
|
2441
|
+
return value.slice(dialCode.length);
|
|
2442
|
+
}
|
|
2443
|
+
|
|
2444
|
+
// src/wrappers/PhoneNumberElement/CountrySelector.tsx
|
|
2445
|
+
import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
2446
|
+
function CountrySelector({
|
|
2447
|
+
value,
|
|
2448
|
+
onChange,
|
|
2449
|
+
preferredCountries = [],
|
|
2450
|
+
onlyCountries,
|
|
2451
|
+
excludeCountries,
|
|
2452
|
+
disabled = false
|
|
2453
|
+
}) {
|
|
2454
|
+
const [anchorEl, setAnchorEl] = useState4(null);
|
|
2455
|
+
const [search, setSearch] = useState4("");
|
|
2456
|
+
const numberInputRef = useRef4(null);
|
|
2457
|
+
const open = Boolean(anchorEl);
|
|
2458
|
+
const handleOpen = (e) => {
|
|
2459
|
+
e.preventDefault();
|
|
2460
|
+
setAnchorEl(e.currentTarget);
|
|
2461
|
+
setSearch("");
|
|
2462
|
+
};
|
|
2463
|
+
const handleClose = () => {
|
|
2464
|
+
setAnchorEl(null);
|
|
2465
|
+
setSearch("");
|
|
2466
|
+
};
|
|
2467
|
+
const handleSelect = (country) => {
|
|
2468
|
+
onChange(country);
|
|
2469
|
+
handleClose();
|
|
2470
|
+
};
|
|
2471
|
+
const { preferred, rest } = useMemo9(() => {
|
|
2472
|
+
let list = COUNTRIES;
|
|
2473
|
+
if (onlyCountries && onlyCountries.length > 0) {
|
|
2474
|
+
const set = new Set(onlyCountries.map((c) => c.toUpperCase()));
|
|
2475
|
+
list = list.filter((c) => set.has(c.code));
|
|
2476
|
+
}
|
|
2477
|
+
if (excludeCountries && excludeCountries.length > 0) {
|
|
2478
|
+
const set = new Set(excludeCountries.map((c) => c.toUpperCase()));
|
|
2479
|
+
list = list.filter((c) => !set.has(c.code));
|
|
2480
|
+
}
|
|
2481
|
+
const searchLower = search.toLowerCase();
|
|
2482
|
+
if (searchLower) {
|
|
2483
|
+
list = list.filter(
|
|
2484
|
+
(c) => c.name.toLowerCase().includes(searchLower) || c.dialCode.includes(searchLower)
|
|
2485
|
+
);
|
|
2486
|
+
}
|
|
2487
|
+
const preferredSet = new Set(preferredCountries.map((c) => c.toUpperCase()));
|
|
2488
|
+
const preferredList = preferredCountries.map((code) => list.find((c) => c.code === code.toUpperCase())).filter((c) => c !== void 0);
|
|
2489
|
+
const restList = list.filter((c) => !preferredSet.has(c.code));
|
|
2490
|
+
return { preferred: preferredList, rest: restList };
|
|
2491
|
+
}, [search, onlyCountries, excludeCountries, preferredCountries]);
|
|
2492
|
+
const showDivider = preferred.length > 0 && rest.length > 0;
|
|
2493
|
+
return /* @__PURE__ */ jsxs8(Fragment3, { children: [
|
|
2494
|
+
/* @__PURE__ */ jsxs8(
|
|
2495
|
+
Button2,
|
|
2496
|
+
{
|
|
2497
|
+
variant: "text",
|
|
2498
|
+
size: "small",
|
|
2499
|
+
onClick: handleOpen,
|
|
2500
|
+
disabled,
|
|
2501
|
+
disableElevation: true,
|
|
2502
|
+
endIcon: /* @__PURE__ */ jsx15(ArrowDropDownIcon, {}),
|
|
2503
|
+
sx: {
|
|
2504
|
+
minWidth: 0,
|
|
2505
|
+
px: 1,
|
|
2506
|
+
py: 0,
|
|
2507
|
+
color: "text.primary",
|
|
2508
|
+
fontWeight: "normal",
|
|
2509
|
+
textTransform: "none",
|
|
2510
|
+
whiteSpace: "nowrap",
|
|
2511
|
+
"&:hover": { backgroundColor: "action.hover" }
|
|
2512
|
+
},
|
|
2513
|
+
children: [
|
|
2514
|
+
/* @__PURE__ */ jsx15(Typography, { component: "span", sx: { mr: 0.5 }, children: value.flag }),
|
|
2515
|
+
/* @__PURE__ */ jsx15(Typography, { component: "span", variant: "body2", children: value.dialCode })
|
|
2516
|
+
]
|
|
2517
|
+
}
|
|
2518
|
+
),
|
|
2519
|
+
/* @__PURE__ */ jsxs8(
|
|
2520
|
+
Popover,
|
|
2521
|
+
{
|
|
2522
|
+
open,
|
|
2523
|
+
anchorEl,
|
|
2524
|
+
onClose: handleClose,
|
|
2525
|
+
anchorOrigin: { vertical: "bottom", horizontal: "left" },
|
|
2526
|
+
transformOrigin: { vertical: "top", horizontal: "left" },
|
|
2527
|
+
slotProps: {
|
|
2528
|
+
paper: { sx: { width: 300, maxHeight: 400, display: "flex", flexDirection: "column" } }
|
|
2529
|
+
},
|
|
2530
|
+
children: [
|
|
2531
|
+
/* @__PURE__ */ jsx15(Box3, { sx: { p: 1, borderBottom: 1, borderColor: "divider" }, children: /* @__PURE__ */ jsx15(
|
|
2532
|
+
TextField7,
|
|
2533
|
+
{
|
|
2534
|
+
autoFocus: true,
|
|
2535
|
+
fullWidth: true,
|
|
2536
|
+
size: "small",
|
|
2537
|
+
placeholder: "Search country or code\u2026",
|
|
2538
|
+
value: search,
|
|
2539
|
+
onChange: (e) => setSearch(e.target.value),
|
|
2540
|
+
slotProps: {
|
|
2541
|
+
input: {
|
|
2542
|
+
startAdornment: /* @__PURE__ */ jsx15(InputAdornment2, { position: "start", children: /* @__PURE__ */ jsx15(SearchIcon, { fontSize: "small" }) })
|
|
2543
|
+
}
|
|
2544
|
+
}
|
|
2545
|
+
}
|
|
2546
|
+
) }),
|
|
2547
|
+
/* @__PURE__ */ jsxs8(List, { dense: true, disablePadding: true, sx: { overflowY: "auto", flex: 1 }, children: [
|
|
2548
|
+
preferred.map((country) => /* @__PURE__ */ jsx15(
|
|
2549
|
+
ListItemButton,
|
|
2550
|
+
{
|
|
2551
|
+
selected: country.code === value.code,
|
|
2552
|
+
onClick: () => handleSelect(country),
|
|
2553
|
+
children: /* @__PURE__ */ jsx15(
|
|
2554
|
+
ListItemText,
|
|
2555
|
+
{
|
|
2556
|
+
primary: /* @__PURE__ */ jsxs8(Box3, { sx: { display: "flex", gap: 1, alignItems: "center" }, children: [
|
|
2557
|
+
/* @__PURE__ */ jsx15("span", { children: country.flag }),
|
|
2558
|
+
/* @__PURE__ */ jsx15("span", { children: country.name }),
|
|
2559
|
+
/* @__PURE__ */ jsx15(
|
|
2560
|
+
Typography,
|
|
2561
|
+
{
|
|
2562
|
+
component: "span",
|
|
2563
|
+
variant: "caption",
|
|
2564
|
+
color: "text.secondary",
|
|
2565
|
+
sx: { ml: "auto" },
|
|
2566
|
+
children: country.dialCode
|
|
2567
|
+
}
|
|
2568
|
+
)
|
|
2569
|
+
] })
|
|
2570
|
+
}
|
|
2571
|
+
)
|
|
2572
|
+
},
|
|
2573
|
+
`preferred-${country.code}`
|
|
2574
|
+
)),
|
|
2575
|
+
showDivider && /* @__PURE__ */ jsx15(Divider, {}),
|
|
2576
|
+
rest.map((country) => /* @__PURE__ */ jsx15(
|
|
2577
|
+
ListItemButton,
|
|
2578
|
+
{
|
|
2579
|
+
selected: country.code === value.code,
|
|
2580
|
+
onClick: () => handleSelect(country),
|
|
2581
|
+
children: /* @__PURE__ */ jsx15(
|
|
2582
|
+
ListItemText,
|
|
2583
|
+
{
|
|
2584
|
+
primary: /* @__PURE__ */ jsxs8(Box3, { sx: { display: "flex", gap: 1, alignItems: "center" }, children: [
|
|
2585
|
+
/* @__PURE__ */ jsx15("span", { children: country.flag }),
|
|
2586
|
+
/* @__PURE__ */ jsx15("span", { children: country.name }),
|
|
2587
|
+
/* @__PURE__ */ jsx15(
|
|
2588
|
+
Typography,
|
|
2589
|
+
{
|
|
2590
|
+
component: "span",
|
|
2591
|
+
variant: "caption",
|
|
2592
|
+
color: "text.secondary",
|
|
2593
|
+
sx: { ml: "auto" },
|
|
2594
|
+
children: country.dialCode
|
|
2595
|
+
}
|
|
2596
|
+
)
|
|
2597
|
+
] })
|
|
2598
|
+
}
|
|
2599
|
+
)
|
|
2600
|
+
},
|
|
2601
|
+
country.code
|
|
2602
|
+
)),
|
|
2603
|
+
preferred.length === 0 && rest.length === 0 && /* @__PURE__ */ jsx15(ListItemButton, { disabled: true, children: /* @__PURE__ */ jsx15(ListItemText, { primary: "No countries found" }) })
|
|
2604
|
+
] })
|
|
2605
|
+
]
|
|
2606
|
+
}
|
|
2607
|
+
)
|
|
2608
|
+
] });
|
|
2609
|
+
}
|
|
2610
|
+
|
|
2611
|
+
// src/wrappers/PhoneNumberElement/PhoneNumberElement.tsx
|
|
2612
|
+
import { jsx as jsx16 } from "react/jsx-runtime";
|
|
2613
|
+
function findDefaultCountry(code) {
|
|
2614
|
+
const upper = code.toUpperCase();
|
|
2615
|
+
return COUNTRIES.find((c) => c.code === upper) ?? COUNTRIES.find((c) => c.code === "US");
|
|
2616
|
+
}
|
|
2617
|
+
var Component13 = function PhoneNumberEl(props) {
|
|
2618
|
+
const {
|
|
2619
|
+
name,
|
|
2620
|
+
control,
|
|
2621
|
+
label,
|
|
2622
|
+
placeholder,
|
|
2623
|
+
defaultCountry = "US",
|
|
2624
|
+
preferredCountries,
|
|
2625
|
+
onlyCountries,
|
|
2626
|
+
excludeCountries,
|
|
2627
|
+
disabled = false,
|
|
2628
|
+
required = false,
|
|
2629
|
+
parseError,
|
|
2630
|
+
textFieldProps
|
|
2631
|
+
} = props;
|
|
2632
|
+
const {
|
|
2633
|
+
field,
|
|
2634
|
+
fieldState: { error }
|
|
2635
|
+
} = useController14({ name, control });
|
|
2636
|
+
const [selectedCountry, setSelectedCountry] = useState5(
|
|
2637
|
+
() => findDefaultCountry(defaultCountry)
|
|
2638
|
+
);
|
|
2639
|
+
const [localNumber, setLocalNumber] = useState5("");
|
|
2640
|
+
useEffect5(() => {
|
|
2641
|
+
const externalValue = field.value;
|
|
2642
|
+
if (!externalValue || externalValue === "") {
|
|
2643
|
+
setSelectedCountry(findDefaultCountry(defaultCountry));
|
|
2644
|
+
setLocalNumber("");
|
|
2645
|
+
return;
|
|
2646
|
+
}
|
|
2647
|
+
if (typeof externalValue === "string" && externalValue.startsWith("+")) {
|
|
2648
|
+
const match2 = parseE164Country(externalValue);
|
|
2649
|
+
if (match2) {
|
|
2650
|
+
setSelectedCountry(match2);
|
|
2651
|
+
setLocalNumber(parseE164LocalNumber(externalValue, match2.dialCode));
|
|
2652
|
+
} else {
|
|
2653
|
+
setSelectedCountry(findDefaultCountry(defaultCountry));
|
|
2654
|
+
setLocalNumber(externalValue.replace(/^\+/, ""));
|
|
2655
|
+
}
|
|
2656
|
+
}
|
|
2657
|
+
}, [field.value]);
|
|
2658
|
+
const handleNumberChange = (e) => {
|
|
2659
|
+
const digits = e.target.value.replace(/\D/g, "");
|
|
2660
|
+
setLocalNumber(digits);
|
|
2661
|
+
if (digits === "") {
|
|
2662
|
+
field.onChange("");
|
|
2663
|
+
} else {
|
|
2664
|
+
field.onChange(selectedCountry.dialCode + digits);
|
|
2665
|
+
}
|
|
2666
|
+
};
|
|
2667
|
+
const handleCountryChange = (country) => {
|
|
2668
|
+
setSelectedCountry(country);
|
|
2669
|
+
if (localNumber === "") {
|
|
2670
|
+
field.onChange("");
|
|
2671
|
+
} else {
|
|
2672
|
+
field.onChange(country.dialCode + localNumber);
|
|
2673
|
+
}
|
|
2674
|
+
};
|
|
2675
|
+
const errorMessage = error ? parseError ? parseError(error) : error.message : textFieldProps?.helperText;
|
|
2676
|
+
return /* @__PURE__ */ jsx16(
|
|
2677
|
+
TextField8,
|
|
2678
|
+
{
|
|
2679
|
+
...textFieldProps,
|
|
2680
|
+
label,
|
|
2681
|
+
placeholder,
|
|
2682
|
+
type: "tel",
|
|
2683
|
+
value: localNumber,
|
|
2684
|
+
onChange: handleNumberChange,
|
|
2685
|
+
onBlur: field.onBlur,
|
|
2686
|
+
inputRef: field.ref,
|
|
2687
|
+
fullWidth: true,
|
|
2688
|
+
required,
|
|
2689
|
+
disabled,
|
|
2690
|
+
error: !!error,
|
|
2691
|
+
helperText: errorMessage,
|
|
2692
|
+
slotProps: {
|
|
2693
|
+
input: {
|
|
2694
|
+
startAdornment: /* @__PURE__ */ jsx16(InputAdornment3, { position: "start", children: /* @__PURE__ */ jsx16(
|
|
2695
|
+
CountrySelector,
|
|
2696
|
+
{
|
|
2697
|
+
value: selectedCountry,
|
|
2698
|
+
onChange: handleCountryChange,
|
|
2699
|
+
preferredCountries,
|
|
2700
|
+
onlyCountries,
|
|
2701
|
+
excludeCountries,
|
|
2702
|
+
disabled
|
|
2703
|
+
}
|
|
2704
|
+
) }),
|
|
2705
|
+
...textFieldProps?.slotProps?.input
|
|
2706
|
+
},
|
|
2707
|
+
...textFieldProps?.slotProps
|
|
2708
|
+
}
|
|
2709
|
+
}
|
|
2710
|
+
);
|
|
2711
|
+
};
|
|
2712
|
+
var PhoneNumberElement = ({
|
|
2713
|
+
gridProps = {},
|
|
2714
|
+
...props
|
|
2715
|
+
}) => {
|
|
2716
|
+
return /* @__PURE__ */ jsx16(Grid14, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx16(Component13, { ...props }) });
|
|
2717
|
+
};
|
|
2718
|
+
|
|
2719
|
+
// src/wrappers/AsyncSelect/index.tsx
|
|
2720
|
+
import {
|
|
2721
|
+
Autocomplete as Autocomplete5,
|
|
2722
|
+
CircularProgress as CircularProgress3,
|
|
2723
|
+
Grid as Grid15,
|
|
2724
|
+
TextField as TextField9,
|
|
2725
|
+
useTheme as useTheme6
|
|
2726
|
+
} from "@mui/material";
|
|
2727
|
+
import { debounce as debounce2 } from "@mui/material/utils";
|
|
2728
|
+
import {
|
|
2729
|
+
Fragment as Fragment4,
|
|
2730
|
+
useCallback as useCallback8,
|
|
2731
|
+
useEffect as useEffect6,
|
|
2732
|
+
useMemo as useMemo10,
|
|
2733
|
+
useRef as useRef5,
|
|
2734
|
+
useState as useState6
|
|
2735
|
+
} from "react";
|
|
2736
|
+
import {
|
|
2737
|
+
useController as useController15
|
|
2738
|
+
} from "react-hook-form";
|
|
2739
|
+
import { jsx as jsx17, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
2740
|
+
var Component14 = function AsyncSelectElement(props) {
|
|
2741
|
+
const {
|
|
2742
|
+
name,
|
|
2743
|
+
disabled,
|
|
2744
|
+
control,
|
|
2745
|
+
placeholder,
|
|
2746
|
+
// initialValue,
|
|
2747
|
+
// isNullable,
|
|
2748
|
+
label,
|
|
2749
|
+
queryFn,
|
|
2750
|
+
variant,
|
|
2751
|
+
labelField = "Label",
|
|
2752
|
+
valueField = "Value",
|
|
2753
|
+
...rest
|
|
2754
|
+
} = props;
|
|
2755
|
+
const {
|
|
2756
|
+
field,
|
|
2757
|
+
fieldState: { error }
|
|
2758
|
+
} = useController15({
|
|
2759
|
+
name,
|
|
2760
|
+
control
|
|
2761
|
+
});
|
|
2762
|
+
const theme = useTheme6();
|
|
2763
|
+
const [loading, setLoading] = useState6(false);
|
|
2764
|
+
const [selectedOption, setSelectedOption] = useState6(null);
|
|
2765
|
+
const [inputValue, setInputValue] = useState6("");
|
|
2766
|
+
const [options, setOptions] = useState6([]);
|
|
2767
|
+
const [open, setOpen] = useState6(false);
|
|
2768
|
+
const loadedValueRef = useRef5(
|
|
2769
|
+
void 0
|
|
2770
|
+
);
|
|
2771
|
+
const fetchData = useMemo10(
|
|
2772
|
+
() => debounce2(
|
|
2773
|
+
(payload, callback) => {
|
|
2774
|
+
queryFn(payload).then((c) => callback(c));
|
|
2775
|
+
},
|
|
2776
|
+
400
|
|
2777
|
+
),
|
|
2778
|
+
[queryFn]
|
|
2779
|
+
);
|
|
2780
|
+
const getOptionValue = useCallback8(
|
|
2781
|
+
(option) => {
|
|
2782
|
+
return option ? String(option[valueField]) : "";
|
|
2783
|
+
},
|
|
2784
|
+
[valueField]
|
|
2785
|
+
);
|
|
2786
|
+
const getOptionLabel = useCallback8(
|
|
2787
|
+
(option) => {
|
|
2788
|
+
return option ? String(option[labelField]) : "";
|
|
2789
|
+
},
|
|
2790
|
+
[labelField]
|
|
2791
|
+
);
|
|
2792
|
+
useEffect6(() => {
|
|
2793
|
+
const currentValue = field.value;
|
|
2794
|
+
if (currentValue && loadedValueRef.current !== currentValue) {
|
|
2795
|
+
if (selectedOption && getOptionValue(selectedOption) === currentValue) {
|
|
2796
|
+
loadedValueRef.current = currentValue;
|
|
2797
|
+
return;
|
|
2798
|
+
}
|
|
2799
|
+
const active = true;
|
|
2800
|
+
setLoading(true);
|
|
2801
|
+
loadedValueRef.current = currentValue;
|
|
2802
|
+
fetchData({ Query: null, SelectedValue: currentValue }, (results) => {
|
|
2803
|
+
if (!active) return;
|
|
2804
|
+
setLoading(false);
|
|
2805
|
+
const matchedOption = results?.find(
|
|
2806
|
+
(option) => String(getOptionValue(option)) === String(currentValue)
|
|
2807
|
+
);
|
|
2808
|
+
if (matchedOption) {
|
|
2809
|
+
setOptions([matchedOption]);
|
|
2810
|
+
setSelectedOption(matchedOption);
|
|
2811
|
+
setInputValue(getOptionLabel(matchedOption));
|
|
2812
|
+
}
|
|
2813
|
+
});
|
|
2814
|
+
return;
|
|
2815
|
+
}
|
|
2816
|
+
if (inputValue !== (selectedOption ? getOptionLabel(selectedOption) : "")) {
|
|
2817
|
+
if (inputValue === "") {
|
|
2818
|
+
setOptions([]);
|
|
2819
|
+
setLoading(false);
|
|
2820
|
+
return;
|
|
2821
|
+
}
|
|
2822
|
+
const active = true;
|
|
2823
|
+
setLoading(true);
|
|
2824
|
+
fetchData({ Query: inputValue, SelectedValue: null }, (results) => {
|
|
2825
|
+
if (!active) return;
|
|
2826
|
+
setLoading(false);
|
|
2827
|
+
setOptions(results || []);
|
|
2828
|
+
});
|
|
2829
|
+
return;
|
|
2830
|
+
}
|
|
2831
|
+
if (!currentValue && selectedOption) {
|
|
2832
|
+
setSelectedOption(null);
|
|
2833
|
+
setInputValue("");
|
|
2834
|
+
setOptions([]);
|
|
2835
|
+
loadedValueRef.current = void 0;
|
|
2836
|
+
}
|
|
2837
|
+
}, [
|
|
2838
|
+
field.value,
|
|
2839
|
+
inputValue,
|
|
2840
|
+
fetchData,
|
|
2841
|
+
getOptionLabel,
|
|
2842
|
+
getOptionValue,
|
|
2843
|
+
selectedOption,
|
|
2844
|
+
labelField,
|
|
2845
|
+
valueField
|
|
2846
|
+
]);
|
|
2847
|
+
const isDisabled = useMemo10(() => {
|
|
2848
|
+
return disabled ?? false;
|
|
2849
|
+
}, [disabled]);
|
|
2850
|
+
const handleChange = useCallback8(
|
|
2851
|
+
(_, newSelectedOption) => {
|
|
2852
|
+
setSelectedOption(newSelectedOption);
|
|
2853
|
+
const newValue = newSelectedOption ? getOptionValue(newSelectedOption) : null;
|
|
2854
|
+
field.onChange(newValue);
|
|
2855
|
+
loadedValueRef.current = newValue;
|
|
2856
|
+
if (newSelectedOption) {
|
|
2857
|
+
setInputValue(getOptionLabel(newSelectedOption));
|
|
2858
|
+
} else {
|
|
2859
|
+
setInputValue("");
|
|
2860
|
+
setOptions([]);
|
|
2861
|
+
}
|
|
2862
|
+
},
|
|
2863
|
+
[field, getOptionValue, getOptionLabel]
|
|
2864
|
+
);
|
|
2865
|
+
const handleInputChange = useCallback8(
|
|
2866
|
+
(_, newInputValue) => {
|
|
2867
|
+
setInputValue(newInputValue);
|
|
2868
|
+
},
|
|
2869
|
+
[]
|
|
2870
|
+
);
|
|
2871
|
+
const handleBlur = useCallback8(() => {
|
|
2872
|
+
if (selectedOption) {
|
|
2873
|
+
setInputValue(getOptionLabel(selectedOption));
|
|
2874
|
+
} else {
|
|
2875
|
+
setInputValue("");
|
|
2876
|
+
}
|
|
2877
|
+
}, [selectedOption, getOptionLabel]);
|
|
2878
|
+
const handleOpen = useCallback8(() => {
|
|
2879
|
+
setOpen(true);
|
|
2880
|
+
}, []);
|
|
2881
|
+
const handleClose = useCallback8(() => {
|
|
2882
|
+
setOpen(false);
|
|
2883
|
+
}, []);
|
|
2884
|
+
return /* @__PURE__ */ jsx17(
|
|
2885
|
+
Autocomplete5,
|
|
2886
|
+
{
|
|
2887
|
+
...rest,
|
|
2888
|
+
fullWidth: true,
|
|
2889
|
+
open,
|
|
2890
|
+
onOpen: handleOpen,
|
|
2891
|
+
onClose: handleClose,
|
|
2892
|
+
onBlur: handleBlur,
|
|
2893
|
+
loading,
|
|
2894
|
+
getOptionLabel,
|
|
2895
|
+
getOptionKey: getOptionValue,
|
|
2896
|
+
isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
|
|
2897
|
+
autoComplete: true,
|
|
2898
|
+
disabled: isDisabled,
|
|
2899
|
+
includeInputInList: true,
|
|
2900
|
+
options,
|
|
2901
|
+
value: selectedOption,
|
|
2902
|
+
filterSelectedOptions: true,
|
|
2903
|
+
filterOptions: (x) => x,
|
|
2904
|
+
onChange: handleChange,
|
|
2905
|
+
onInputChange: handleInputChange,
|
|
2906
|
+
sx: {
|
|
2907
|
+
"&.Mui-disabled": {
|
|
2908
|
+
cursor: "not-allowed !important"
|
|
2909
|
+
},
|
|
2910
|
+
"& .MuiInputBase-root.Mui-disabled": {
|
|
2911
|
+
backgroundColor: theme.palette.action.disabledBackground,
|
|
2912
|
+
cursor: "not-allowed !important"
|
|
2913
|
+
},
|
|
2914
|
+
"&.Mui-disabled .MuiAutocomplete-popupIndicator": {
|
|
2915
|
+
cursor: "not-allowed !important"
|
|
2916
|
+
},
|
|
2917
|
+
"& .MuiOutlinedInput-root.Mui-disabled .MuiOutlinedInput-notchedOutline": {
|
|
2918
|
+
borderColor: error ? "red" : void 0
|
|
2919
|
+
},
|
|
2920
|
+
"& .MuiFilledInput-root.Mui-disabled": {
|
|
2921
|
+
borderColor: error ? "red" : void 0
|
|
2922
|
+
}
|
|
2923
|
+
},
|
|
2924
|
+
noOptionsText: "Type Something...",
|
|
2925
|
+
renderInput: (params) => /* @__PURE__ */ jsx17(
|
|
2926
|
+
TextField9,
|
|
2927
|
+
{
|
|
2928
|
+
...params,
|
|
2929
|
+
label,
|
|
2930
|
+
error: !!error,
|
|
2931
|
+
helperText: error ? error.message : "",
|
|
2932
|
+
placeholder,
|
|
2933
|
+
slotProps: {
|
|
2934
|
+
input: {
|
|
2935
|
+
...params.InputProps,
|
|
2936
|
+
endAdornment: /* @__PURE__ */ jsxs9(Fragment4, { children: [
|
|
2937
|
+
loading ? /* @__PURE__ */ jsx17(CircularProgress3, { color: "inherit", size: 20 }) : null,
|
|
2938
|
+
params.InputProps.endAdornment
|
|
2939
|
+
] })
|
|
2940
|
+
}
|
|
2941
|
+
},
|
|
2942
|
+
variant: variant ? variant : "outlined"
|
|
2943
|
+
}
|
|
2944
|
+
),
|
|
2945
|
+
renderOption: (renderProps, option) => {
|
|
2946
|
+
const { key, ...optionProps } = renderProps;
|
|
2947
|
+
return /* @__PURE__ */ jsx17("li", { ...optionProps, children: option[labelField] }, key);
|
|
2948
|
+
}
|
|
2949
|
+
}
|
|
2950
|
+
);
|
|
2951
|
+
};
|
|
2952
|
+
var AsyncSelectElement2 = ({
|
|
2953
|
+
gridProps = {},
|
|
2954
|
+
...props
|
|
2955
|
+
}) => {
|
|
2956
|
+
return /* @__PURE__ */ jsx17(Grid15, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx17(
|
|
2957
|
+
Component14,
|
|
2958
|
+
{
|
|
2959
|
+
...props
|
|
2960
|
+
}
|
|
2961
|
+
) });
|
|
2962
|
+
};
|
|
2963
|
+
AsyncSelectElement2.displayName = "AsyncSelectElement";
|
|
2964
|
+
|
|
2965
|
+
// src/wrappers/NumberFieldElement/NumberFieldElement.tsx
|
|
2966
|
+
import { Grid as Grid16, TextField as TextField10, useForkRef as useForkRef5 } from "@mui/material";
|
|
2967
|
+
import { useController as useController16 } from "react-hook-form";
|
|
2968
|
+
import { jsx as jsx18 } from "react/jsx-runtime";
|
|
2969
|
+
var Component15 = function NumberFieldElement(props) {
|
|
2970
|
+
const {
|
|
2971
|
+
parseError,
|
|
2972
|
+
name,
|
|
2973
|
+
control,
|
|
2974
|
+
component: TextFieldComponent = TextField10,
|
|
2975
|
+
transform,
|
|
2976
|
+
fieldType = "text",
|
|
2977
|
+
// Default to text type
|
|
2978
|
+
defaultValue,
|
|
2979
|
+
label,
|
|
2980
|
+
placeholder,
|
|
2981
|
+
textFieldProps = {},
|
|
2982
|
+
variant,
|
|
2983
|
+
onChange: customOnChange,
|
|
2984
|
+
enableWarnings = process.env.NODE_ENV === "development",
|
|
2985
|
+
maxLength,
|
|
2986
|
+
...rest
|
|
2987
|
+
} = props;
|
|
2988
|
+
const {
|
|
2989
|
+
type = "number",
|
|
2990
|
+
required,
|
|
2991
|
+
helperText,
|
|
2992
|
+
inputRef,
|
|
2993
|
+
onInput,
|
|
2994
|
+
onBlur,
|
|
2995
|
+
disabled,
|
|
2996
|
+
...restTextProps
|
|
2997
|
+
} = textFieldProps;
|
|
2998
|
+
const {
|
|
2999
|
+
field,
|
|
3000
|
+
fieldState: { error }
|
|
3001
|
+
} = useController16({
|
|
3002
|
+
name,
|
|
3003
|
+
control
|
|
3004
|
+
});
|
|
3005
|
+
const { value, onChange } = useEnhancedTransform(
|
|
3006
|
+
{
|
|
3007
|
+
value: field.value,
|
|
3008
|
+
onChange: field.onChange,
|
|
3009
|
+
transform: transform ? {
|
|
3010
|
+
input: transform.input,
|
|
3011
|
+
output: transform.output
|
|
3012
|
+
} : void 0,
|
|
3013
|
+
fieldType: !transform ? type === "number" ? maxLength && maxLength > 5 ? "text" : "number" : fieldType : void 0,
|
|
3014
|
+
// Auto-detect number type
|
|
3015
|
+
defaultValue,
|
|
3016
|
+
enableWarnings
|
|
3017
|
+
}
|
|
3018
|
+
);
|
|
3019
|
+
const handleInputRef = useForkRef5(field.ref, inputRef);
|
|
3020
|
+
return /* @__PURE__ */ jsx18(
|
|
3021
|
+
TextFieldComponent,
|
|
3022
|
+
{
|
|
3023
|
+
...rest,
|
|
3024
|
+
...restTextProps,
|
|
3025
|
+
name: field.name,
|
|
3026
|
+
value,
|
|
3027
|
+
onChange: (event) => {
|
|
3028
|
+
const input = event.target.value;
|
|
3029
|
+
if (input === "") {
|
|
3030
|
+
field.onChange(null);
|
|
3031
|
+
}
|
|
3032
|
+
onChange(event);
|
|
3033
|
+
if (typeof customOnChange === "function") {
|
|
3034
|
+
customOnChange(event);
|
|
3035
|
+
}
|
|
3036
|
+
},
|
|
3037
|
+
onBlur: (event) => {
|
|
3038
|
+
field.onBlur();
|
|
3039
|
+
if (typeof onBlur === "function") {
|
|
3040
|
+
onBlur(event);
|
|
3041
|
+
}
|
|
3042
|
+
},
|
|
3043
|
+
onInput: (event) => {
|
|
3044
|
+
if (type === "number" && maxLength && event.target.value.length > maxLength) {
|
|
3045
|
+
event.target.value = event.target.value.slice(0, maxLength);
|
|
3046
|
+
}
|
|
3047
|
+
if (typeof onInput === "function") {
|
|
3048
|
+
onInput(event);
|
|
3049
|
+
}
|
|
3050
|
+
},
|
|
3051
|
+
onWheel: (e) => {
|
|
3052
|
+
e.target.blur();
|
|
3053
|
+
},
|
|
3054
|
+
onKeyDown: (e) => {
|
|
3055
|
+
if (["e", "E", "ArrowDown", "ArrowUp"].includes(e.key)) {
|
|
3056
|
+
e.preventDefault();
|
|
3057
|
+
}
|
|
3058
|
+
},
|
|
3059
|
+
disabled,
|
|
3060
|
+
label,
|
|
3061
|
+
placeholder,
|
|
3062
|
+
fullWidth: true,
|
|
3063
|
+
required,
|
|
3064
|
+
type,
|
|
3065
|
+
error: !!error,
|
|
3066
|
+
helperText: error ? parseError ? parseError(error) : error.message : helperText,
|
|
3067
|
+
inputRef: handleInputRef,
|
|
3068
|
+
slotProps: { htmlInput: { maxLength } },
|
|
3069
|
+
variant: variant ? variant : "outlined"
|
|
3070
|
+
}
|
|
3071
|
+
);
|
|
3072
|
+
};
|
|
3073
|
+
var NumberFieldElement2 = ({
|
|
3074
|
+
gridProps = {},
|
|
3075
|
+
...props
|
|
3076
|
+
}) => {
|
|
3077
|
+
return /* @__PURE__ */ jsx18(Grid16, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx18(Component15, { ...props }) });
|
|
3078
|
+
};
|
|
3079
|
+
|
|
3080
|
+
// src/wrappers/OTPInputElement/OTPInputElement.tsx
|
|
3081
|
+
import { Box as Box4, Grid as Grid17, inputBaseClasses } from "@mui/material";
|
|
3082
|
+
import {
|
|
3083
|
+
MuiOtpInput
|
|
3084
|
+
} from "mui-one-time-password-input";
|
|
3085
|
+
import { Controller } from "react-hook-form";
|
|
3086
|
+
|
|
3087
|
+
// src/wrappers/OTPInputElement/HelperText.tsx
|
|
3088
|
+
import FormHelperText6 from "@mui/material/FormHelperText";
|
|
3089
|
+
import { jsx as jsx19 } from "react/jsx-runtime";
|
|
3090
|
+
function HelperText({
|
|
3091
|
+
sx,
|
|
3092
|
+
helperText,
|
|
3093
|
+
errorMessage,
|
|
3094
|
+
disableGutters,
|
|
3095
|
+
...other
|
|
3096
|
+
}) {
|
|
3097
|
+
if (errorMessage || helperText) {
|
|
3098
|
+
return /* @__PURE__ */ jsx19(
|
|
3099
|
+
FormHelperText6,
|
|
3100
|
+
{
|
|
3101
|
+
error: !!errorMessage,
|
|
3102
|
+
sx: [
|
|
3103
|
+
{
|
|
3104
|
+
mx: disableGutters ? 0 : 1.75
|
|
3105
|
+
},
|
|
3106
|
+
...Array.isArray(sx) ? sx : [sx]
|
|
3107
|
+
],
|
|
3108
|
+
...other,
|
|
3109
|
+
children: errorMessage || helperText
|
|
3110
|
+
}
|
|
3111
|
+
);
|
|
3112
|
+
}
|
|
3113
|
+
return null;
|
|
3114
|
+
}
|
|
3115
|
+
|
|
3116
|
+
// src/wrappers/OTPInputElement/OTPInputElement.tsx
|
|
3117
|
+
import { jsx as jsx20, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
3118
|
+
var Component16 = function OTPInputElement(props) {
|
|
3119
|
+
const {
|
|
3120
|
+
// parseError,
|
|
3121
|
+
name,
|
|
3122
|
+
control,
|
|
3123
|
+
slotProps,
|
|
3124
|
+
helperText,
|
|
3125
|
+
maxSize = 56,
|
|
3126
|
+
placeholder = "-",
|
|
3127
|
+
...rest
|
|
3128
|
+
} = props;
|
|
3129
|
+
return /* @__PURE__ */ jsx20(
|
|
3130
|
+
Controller,
|
|
3131
|
+
{
|
|
3132
|
+
name,
|
|
3133
|
+
control,
|
|
3134
|
+
render: ({ field, fieldState: { error } }) => /* @__PURE__ */ jsxs10(
|
|
3135
|
+
Box4,
|
|
3136
|
+
{
|
|
3137
|
+
...slotProps?.wrapper,
|
|
3138
|
+
sx: [
|
|
3139
|
+
{
|
|
3140
|
+
display: "flex",
|
|
3141
|
+
justifyContent: "center",
|
|
3142
|
+
[`& .${inputBaseClasses.input}`]: {
|
|
3143
|
+
p: 0,
|
|
3144
|
+
height: "auto",
|
|
3145
|
+
aspectRatio: "1/1",
|
|
3146
|
+
maxWidth: maxSize
|
|
3147
|
+
}
|
|
3148
|
+
},
|
|
3149
|
+
...Array.isArray(slotProps?.wrapper?.sx) ? slotProps?.wrapper?.sx ?? [] : [slotProps?.wrapper?.sx]
|
|
3150
|
+
],
|
|
3151
|
+
children: [
|
|
3152
|
+
/* @__PURE__ */ jsx20(
|
|
3153
|
+
MuiOtpInput,
|
|
3154
|
+
{
|
|
3155
|
+
...field,
|
|
3156
|
+
autoFocus: true,
|
|
3157
|
+
gap: 1.5,
|
|
3158
|
+
length: 4,
|
|
3159
|
+
TextFieldsProps: {
|
|
3160
|
+
placeholder,
|
|
3161
|
+
error: !!error,
|
|
3162
|
+
...slotProps?.textfield
|
|
3163
|
+
},
|
|
3164
|
+
...rest
|
|
3165
|
+
}
|
|
3166
|
+
),
|
|
3167
|
+
/* @__PURE__ */ jsx20(
|
|
3168
|
+
HelperText,
|
|
3169
|
+
{
|
|
3170
|
+
...slotProps?.helperText,
|
|
3171
|
+
errorMessage: error?.message,
|
|
3172
|
+
helperText
|
|
3173
|
+
}
|
|
3174
|
+
)
|
|
3175
|
+
]
|
|
3176
|
+
}
|
|
3177
|
+
)
|
|
3178
|
+
}
|
|
3179
|
+
);
|
|
3180
|
+
};
|
|
3181
|
+
var OTPInputElement2 = ({
|
|
3182
|
+
gridProps = {},
|
|
3183
|
+
...props
|
|
3184
|
+
}) => {
|
|
3185
|
+
return /* @__PURE__ */ jsx20(Grid17, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx20(Component16, { ...props }) });
|
|
3186
|
+
};
|
|
3187
|
+
|
|
3188
|
+
// src/wrappers/Field/index.ts
|
|
3189
|
+
var Field = {
|
|
3190
|
+
Text: TextFieldElement2,
|
|
3191
|
+
Number: NumberFieldElement2,
|
|
3192
|
+
Checkbox: CheckboxElement2,
|
|
3193
|
+
Date: DatePickerElement,
|
|
3194
|
+
RadioGroup: RadioButtonGroup2,
|
|
3195
|
+
Password: PasswordElement,
|
|
3196
|
+
Phone: PhoneNumberElement,
|
|
3197
|
+
Time: TimePickerElement2,
|
|
3198
|
+
Select: SelectElement2,
|
|
3199
|
+
SelectMulti: SelectMultiElement2,
|
|
3200
|
+
SelectCascade: SelectCascadeElement2,
|
|
3201
|
+
AsyncSelect: AsyncSelectElement2,
|
|
3202
|
+
AsyncMultiSelect: AsyncSelectMultiElement2,
|
|
3203
|
+
CheckboxGroup: CheckboxGroupElement,
|
|
3204
|
+
OTPInput: OTPInputElement2,
|
|
3205
|
+
Slider: SliderElement,
|
|
3206
|
+
FileUpload: FileUploadElement
|
|
3207
|
+
};
|
|
3208
|
+
|
|
3209
|
+
export {
|
|
3210
|
+
isValidOption,
|
|
3211
|
+
normalizeOptions,
|
|
3212
|
+
AsyncSelectMultiElement2 as AsyncSelectMultiElement,
|
|
3213
|
+
CheckboxElement2 as CheckboxElement,
|
|
3214
|
+
CheckboxGroupElement,
|
|
3215
|
+
readDatePickerValueAsDate,
|
|
3216
|
+
useDatePickerValue,
|
|
3217
|
+
useDatePickerValidation,
|
|
3218
|
+
useDatePickerStyles,
|
|
3219
|
+
DatePickerElementCore,
|
|
3220
|
+
DatePickerElement,
|
|
3221
|
+
isValidDate,
|
|
3222
|
+
isParsableDateString,
|
|
3223
|
+
createDateInputTransform,
|
|
3224
|
+
createDateOutputTransform,
|
|
3225
|
+
createDefaultDatePickerConfig,
|
|
3226
|
+
extractErrorMessage,
|
|
3227
|
+
createStableKey,
|
|
3228
|
+
PasswordElement,
|
|
3229
|
+
RadioButtonGroup2 as RadioButtonGroup,
|
|
3230
|
+
SelectCascadeElement2 as SelectCascadeElement,
|
|
3231
|
+
SelectElement2 as SelectElement,
|
|
3232
|
+
SelectMultiElement2 as SelectMultiElement,
|
|
3233
|
+
TextFieldElement2 as TextFieldElement,
|
|
3234
|
+
TimePickerElement2 as TimePickerElement,
|
|
3235
|
+
SliderElement,
|
|
3236
|
+
FileUploadElement,
|
|
3237
|
+
COUNTRIES,
|
|
3238
|
+
parseE164Country,
|
|
3239
|
+
parseE164LocalNumber,
|
|
3240
|
+
PhoneNumberElement,
|
|
3241
|
+
Field
|
|
3242
|
+
};
|
|
3243
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL3R5cGVzL2NvbW1vbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdC9Bc3luY011bHRpU2VsZWN0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hFbGVtZW50L0NoZWNrYm94RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0NoZWNrYm94R3JvdXAvQ2hlY2tib3hHcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L0RhdGVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnRDb3JlLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclZhbHVlLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsaWRhdGlvbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvaG9va3MvdXNlRGF0ZVBpY2tlclN0eWxlcy50cyIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvdXRpbHMudHMiLCAiLi4vc3JjL3dyYXBwZXJzL1Bhc3N3b3JkRWxlbWVudC9QYXNzd29yZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXAudHN4IiwgIi4uL3NyYy93cmFwcGVycy9TZWxlY3RDYXNjYWRlRWxlbWVudC9TZWxlY3RDYXNjYWRlRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdEVsZW1lbnQvU2VsZWN0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdE11bHRpRWxlbWVudC9TZWxlY3RNdWx0aUVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UZXh0RmllbGRFbGVtZW50L1RleHRGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9UaW1lUGlja2VyRWxlbWVudC9UaW1lUGlja2VyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NsaWRlckVsZW1lbnQvU2xpZGVyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL0ZpbGVVcGxvYWRFbGVtZW50L0ZpbGVVcGxvYWRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvUGhvbmVOdW1iZXJFbGVtZW50L1Bob25lTnVtYmVyRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1Bob25lTnVtYmVyRWxlbWVudC9Db3VudHJ5U2VsZWN0b3IudHN4IiwgIi4uL3NyYy93cmFwcGVycy9QaG9uZU51bWJlckVsZW1lbnQvY291bnRyaWVzLnRzIiwgIi4uL3NyYy93cmFwcGVycy9Bc3luY1NlbGVjdC9pbmRleC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL051bWJlckZpZWxkRWxlbWVudC9OdW1iZXJGaWVsZEVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9PVFBJbnB1dEVsZW1lbnQvT1RQSW5wdXRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvT1RQSW5wdXRFbGVtZW50L0hlbHBlclRleHQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9GaWVsZC9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb21tb24gdHlwZSBkZWZpbml0aW9ucyBmb3Igd3JhcHBlciBjb21wb25lbnRzXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuLyoqXG4gKiBCYXNlIG9wdGlvbiB0eXBlIGZvciBzZWxlY3QtYmFzZWQgY29tcG9uZW50c1xuICpcbiAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHZhbHVlIHR5cGUgKHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VPcHRpb248ViA9IHN0cmluZyB8IG51bWJlcj4ge1xuICAvKipcbiAgICogRGlzcGxheSBsYWJlbCBmb3IgdGhlIG9wdGlvblxuICAgKi9cbiAgTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBvcHRpb25cbiAgICovXG4gIFZhbHVlOiBWO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGbGV4aWJsZSBvcHRpb24gdHlwZSB0aGF0IGV4dGVuZHMgYmFzZSBvcHRpb24gd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbiAqXG4gKiBAdGVtcGxhdGUgVCAtIEFkZGl0aW9uYWwgcHJvcGVydGllcyBvYmplY3RcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEZsZXhpYmxlT3B0aW9uPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbj4gPSBUICYgQmFzZU9wdGlvbjtcblxuLyoqXG4gKiBPcHRpb24gdHlwZSB3aXRoIGN1c3RvbWl6YWJsZSBrZXkgbmFtZXNcbiAqIFVzZWZ1bCBmb3IgY29tcG9uZW50cyB0aGF0IGFjY2VwdCBjdXN0b20gbGFiZWxGaWVsZC92YWx1ZUZpZWxkIHByb3BzXG4gKlxuICogQHRlbXBsYXRlIFRWYWx1ZUtleSAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciB2YWx1ZVxuICogQHRlbXBsYXRlIFRMYWJlbEtleSAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciBsYWJlbFxuICogQHRlbXBsYXRlIFREaXNhYmxlZEtleSAtIFRoZSBwcm9wZXJ0eSBuYW1lIGZvciBkaXNhYmxlZCBmbGFnXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBDdXN0b21LZXlPcHRpb248XG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0gUmVjb3JkPFRWYWx1ZUtleSwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gJlxuICBSZWNvcmQ8VExhYmVsS2V5LCBzdHJpbmc+ICZcbiAgUGFydGlhbDxSZWNvcmQ8VERpc2FibGVkS2V5LCBib29sZWFuPj4gJlxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiBMZWdhY3kgb3B0aW9uIHR5cGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlXG4gKiBVc2VzIFZhbHVlL0xhYmVsIG5hbWluZyBjb252ZW50aW9uXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIEJhc2VPcHRpb24gb3IgRmxleGlibGVPcHRpb24gaW5zdGVhZFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeU9wdGlvbiB7XG4gIC8qKlxuICAgKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3B0aW9uIChjYXBpdGFsaXplZCBrZXkgbmFtZSlcbiAgICovXG4gIExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uIChjYXBpdGFsaXplZCBrZXkgbmFtZSlcbiAgICovXG4gIFZhbHVlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZFxuICAgKi9cbiAgRGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgdmFsaWQgb3B0aW9uXG4gKlxuICogQHBhcmFtIFZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgb3B0aW9uIG9iamVjdFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRPcHRpb24odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBCYXNlT3B0aW9uIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAnTGFiZWwnIGluIHZhbHVlICYmXG4gICAgJ1ZhbHVlJyBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuTGFiZWwgPT09ICdzdHJpbmcnICYmXG4gICAgKHR5cGVvZiAodmFsdWUgYXMgQmFzZU9wdGlvbikuVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIEJhc2VPcHRpb24pLlZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyBCYXNlT3B0aW9uKS5WYWx1ZSA9PT0gJ2Jvb2xlYW4nKVxuICApO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBub3JtYWxpemUgb3B0aW9ucyB0byBCYXNlT3B0aW9uIGZvcm1hdFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBhcnJheSB0byBub3JtYWxpemVcbiAqIEBwYXJhbSBsYWJlbEZpZWxkIC0gQ3VzdG9tIGxhYmVsIGZpZWxkIG5hbWUgaW4gb3B0aW9uIG9iamVjdHNcbiAqIEBwYXJhbSB2YWx1ZUZpZWxkIC0gQ3VzdG9tIHZhbHVlIGZpZWxkIG5hbWUgaW4gb3B0aW9uIG9iamVjdHNcbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgb3B0aW9ucyBhcnJheVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9wdGlvbnM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgb3B0aW9uczogVFtdLFxuICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgdmFsdWVGaWVsZCA9ICdWYWx1ZSdcbik6IEJhc2VPcHRpb25bXSB7XG4gIHJldHVybiBvcHRpb25zLm1hcChvcHRpb24gPT4gKHtcbiAgICBMYWJlbDogU3RyaW5nKG9wdGlvbltsYWJlbEZpZWxkXSA/PyAnJyksXG4gICAgVmFsdWU6IG9wdGlvblt2YWx1ZUZpZWxkXSBhcyBzdHJpbmcgfCBudW1iZXIsXG4gICAgZGlzYWJsZWQ6IEJvb2xlYW4ob3B0aW9uLmRpc2FibGVkKSxcbiAgfSkpO1xufVxuIiwgImltcG9ydCB7XG4gIEF1dG9jb21wbGV0ZSxcbiAgQ2lyY3VsYXJQcm9ncmVzcyxcbiAgZGVib3VuY2UsXG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbiAgdXNlVGhlbWUsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IG1hdGNoIGZyb20gJ2F1dG9zdWdnZXN0LWhpZ2hsaWdodC9tYXRjaCc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnYXV0b3N1Z2dlc3QtaGlnaGxpZ2h0L3BhcnNlJztcbmltcG9ydCBSZWFjdCwge1xuICB1c2VTdGF0ZSxcbiAgdXNlUmVmLFxuICB1c2VNZW1vLFxuICB1c2VFZmZlY3QsXG4gIHVzZUNhbGxiYWNrLFxuICBGcmFnbWVudCxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBIVE1MQXR0cmlidXRlcywgU3ludGhldGljRXZlbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNNdWx0aVNlbGVjdEVsZW1lbnRQcm9wcywgT3B0aW9uT2JqZWN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNNdWx0aVNlbGVjdFBheWxvYWQgfSBmcm9tICdAL3R5cGVzJztcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPihcbiAgcHJvcHM6IEFzeW5jTXVsdGlTZWxlY3RFbGVtZW50UHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVE9wdGlvblxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgY29udHJvbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBsYWJlbCxcbiAgICBxdWVyeUZuLFxuICAgIHZhcmlhbnQsXG4gICAgbGFiZWxGaWVsZCA9ICdMYWJlbCcgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnIGFzIFRWYWx1ZUtleSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGNvbnN0IFtzZWxlY3RlZE9wdGlvbnMsIHNldFNlbGVjdGVkT3B0aW9uc10gPSB1c2VTdGF0ZTxUT3B0aW9uW10+KFtdKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxyZWFkb25seSBUT3B0aW9uW10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGNvbnN0IGxvYWRlZFZhbHVlc1JlZiA9IHVzZVJlZjxUT3B0aW9uW10+KFtdKTtcbiAgY29uc3QgaXNJbml0aWFsUG9wdWxhdGlvbkFjdGl2ZSA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgaW5pdGlhbExvYWRDb21wbGV0ZVJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIC8vIFN0b3JlIHNlbGVjdGVkIG9wdGlvbnMgaW4gYSByZWYgc28gRWZmZWN0IDIgY2FuIGFjY2VzcyB3aXRob3V0IGRlcGVuZGVuY3lcbiAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zUmVmID0gdXNlUmVmPFRPcHRpb25bXT4oW10pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4gKG9wdGlvbiA/IFN0cmluZyhvcHRpb25bdmFsdWVGaWVsZF0pIDogJycpLFxuICAgIFt2YWx1ZUZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbikgPT4gKG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZF0pIDogJycpLFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGZldGNoRGF0YSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRlYm91bmNlKFxuICAgICAgICAoXG4gICAgICAgICAgcGF5bG9hZDogQXN5bmNNdWx0aVNlbGVjdFBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB2b2lkXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Rm4ocGF5bG9hZCkudGhlbihjID0+IHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKGMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgYyAmJlxuICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KChjIGFzIHsgZGF0YTogcmVhZG9ubHkgVE9wdGlvbltdIH0pLmRhdGEpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgKGMgYXMgeyBkYXRhOiByZWFkb25seSBUT3B0aW9uW10gfSkuZGF0YSBhcyByZWFkb25seSBUT3B0aW9uW11cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGMgJiZcbiAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSgoYyBhcyB7IERhdGE6IHJlYWRvbmx5IFRPcHRpb25bXSB9KS5EYXRhKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgIChjIGFzIHsgRGF0YTogcmVhZG9ubHkgVE9wdGlvbltdIH0pLkRhdGEgYXMgcmVhZG9ubHkgVE9wdGlvbltdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjYWxsYmFjayhbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIDQwMFxuICAgICAgKSxcbiAgICBbcXVlcnlGbl1cbiAgKTtcblxuICAvLyBTeW5jIHJlZiB3aGVuZXZlciBzZWxlY3RlZE9wdGlvbnMgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNlbGVjdGVkT3B0aW9uc1JlZi5jdXJyZW50ID0gc2VsZWN0ZWRPcHRpb25zO1xuICB9LCBbc2VsZWN0ZWRPcHRpb25zXSk7XG5cbiAgLy8gRWZmZWN0IDE6IFN5bmMgd2l0aCBleHRlcm5hbCBmaWVsZC52YWx1ZSBjaGFuZ2VzIGZyb20gcmVhY3QtaG9vay1mb3JtIChJTklUSUFMIExPQUQgT05MWSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBmb3JtVmFsdWVzID0gQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgPyBmaWVsZC52YWx1ZSA6IFtdO1xuXG4gICAgLy8gQ2hlY2sgaWYgaW5pdGlhbCBsb2FkIGlzIGNvbXBsZXRlIGFuZCBjdXJyZW50IGZvcm0gdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBsb2FkZWQgb25lcy5cbiAgICAvLyBJZiBzbywgbm8gbmVlZCB0byByZWZldGNoIGZvciBpbml0aWFsIHBvcHVsYXRpb24uXG4gICAgaWYgKFxuICAgICAgaW5pdGlhbExvYWRDb21wbGV0ZVJlZi5jdXJyZW50ICYmXG4gICAgICBKU09OLnN0cmluZ2lmeShmb3JtVmFsdWVzKSA9PT0gSlNPTi5zdHJpbmdpZnkobG9hZGVkVmFsdWVzUmVmLmN1cnJlbnQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIGZvcm0gdmFsdWVzLCByZXNldCBhbmQgbWFyayBpbml0aWFsIGxvYWQgYXMgY29tcGxldGUuXG4gICAgaWYgKGZvcm1WYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZXRTZWxlY3RlZE9wdGlvbnMoW10pO1xuICAgICAgc2V0T3B0aW9ucyhbXSk7XG4gICAgICBsb2FkZWRWYWx1ZXNSZWYuY3VycmVudCA9IFtdO1xuICAgICAgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgaW5pdGlhbExvYWRDb21wbGV0ZVJlZi5jdXJyZW50ID0gdHJ1ZTsgLy8gTWFyayBhcyBjb21wbGV0ZSBhcyB0aGVyZSdzIG5vdGhpbmcgdG8gZmV0Y2hcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgcHJvY2VlZCBpZiBmb3JtVmFsdWVzIGFyZSBwcmVzZW50IGFuZCB3ZSBoYXZlbid0IGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBsb2FkIGZvciB0aGVzZSBzcGVjaWZpYyB2YWx1ZXNcbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgaXNJbml0aWFsUG9wdWxhdGlvbkFjdGl2ZS5jdXJyZW50ID0gdHJ1ZTtcbiAgICAvLyBTZXQgbG9hZGVkVmFsdWVzUmVmIGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgcmUtdHJpZ2dlcmluZyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuICAgIGxvYWRlZFZhbHVlc1JlZi5jdXJyZW50ID0gZm9ybVZhbHVlcztcbiAgICAvLyBNYXJrIGluaXRpYWwgbG9hZCBhcyBjb21wbGV0ZSBwcm9hY3RpdmVseSBiZWZvcmUgZmV0Y2hpbmcgdG8gcHJldmVudCBtdWx0aXBsZSBjYWxsc1xuICAgIGluaXRpYWxMb2FkQ29tcGxldGVSZWYuY3VycmVudCA9IHRydWU7XG5cbiAgICBmZXRjaERhdGEoeyBRdWVyeTogbnVsbCwgU2VsZWN0ZWRWYWx1ZTogZm9ybVZhbHVlcyB9LCByZXN1bHRzID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgY29uc3QgZmV0Y2hlZE9wdGlvbnMgPSByZXN1bHRzIHx8IFtdO1xuXG4gICAgICAgIHNldFNlbGVjdGVkT3B0aW9ucyhbLi4uZmV0Y2hlZE9wdGlvbnNdKTtcbiAgICAgICAgc2V0T3B0aW9ucyhmZXRjaGVkT3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgaXNJbml0aWFsUG9wdWxhdGlvbkFjdGl2ZS5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW2ZpZWxkLnZhbHVlLCBmZXRjaERhdGFdKTtcblxuICAvLyBFZmZlY3QgMjogSGFuZGxlIHVzZXIgc2VhcmNoIGlucHV0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gRG9uJ3Qgc2VhcmNoIGR1cmluZyBpbml0aWFsIHBvcHVsYXRpb25cbiAgICBpZiAoaXNJbml0aWFsUG9wdWxhdGlvbkFjdGl2ZS5jdXJyZW50IHx8ICFpbml0aWFsTG9hZENvbXBsZXRlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBpbnB1dCBpcyBlbXB0eSwganVzdCBzaG93IHRoZSBzZWxlY3RlZCBvcHRpb25zXG4gICAgaWYgKCFpbnB1dFZhbHVlKSB7XG4gICAgICAvLyBJZiBubyBvcHRpb25zIGFyZSBzZWxlY3RlZCwgY2xlYXIgdGhlIG9wdGlvbnMgdG8gZGlzcGxheSBcIm5vT3B0aW9uc1RleHRcIlxuICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uc1JlZi5jdXJyZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzZXRPcHRpb25zKFtdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2hvdyB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICBzZXRPcHRpb25zKHNlbGVjdGVkT3B0aW9uc1JlZi5jdXJyZW50KTtcbiAgICAgIH1cblxuICAgICAgbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT25seSBmZXRjaCBpZiB0aGUgaW5wdXQgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gbGFzdEZldGNoZWRTZWFyY2hUZXJtUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYWN0aXZlID0gdHJ1ZTtcblxuICAgIHNldExvYWRpbmcodHJ1ZSk7XG5cbiAgICBmZXRjaERhdGEoeyBRdWVyeTogaW5wdXRWYWx1ZSwgU2VsZWN0ZWRWYWx1ZTogbnVsbCB9LCBzZWFyY2hSZXN1bHRzID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHNlYXJjaFJlc3VsdHMgfHwgW107XG4gICAgICAgIC8vIFVzZSByZWYgdG8gZ2V0IGN1cnJlbnQgc2VsZWN0ZWQgb3B0aW9ucyB3aXRob3V0IGFkZGluZyB0byBkZXBlbmRlbmNpZXNcbiAgICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkID0gc2VsZWN0ZWRPcHRpb25zUmVmLmN1cnJlbnQ7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uSWRzID0gbmV3IFNldChcbiAgICAgICAgICBjdXJyZW50U2VsZWN0ZWQubWFwKG9wdCA9PiBnZXRPcHRpb25WYWx1ZShvcHQpKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb21iaW5lZCA9IFsuLi5jdXJyZW50U2VsZWN0ZWRdO1xuXG4gICAgICAgIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmICghc2VsZWN0ZWRPcHRpb25JZHMuaGFzKGdldE9wdGlvblZhbHVlKHJlc3VsdCkpKSB7XG4gICAgICAgICAgICBjb21iaW5lZC5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc2V0T3B0aW9ucyhjb21iaW5lZCk7XG4gICAgICAgIGxhc3RGZXRjaGVkU2VhcmNoVGVybVJlZi5jdXJyZW50ID0gaW5wdXRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgICAvLyBDUklUSUNBTDogUmVtb3ZlZCBzZWxlY3RlZE9wdGlvbnMgZnJvbSBkZXBlbmRlbmNpZXMgLSB1c2UgcmVmIGluc3RlYWRcbiAgfSwgW2lucHV0VmFsdWUsIGZldGNoRGF0YSwgZ2V0T3B0aW9uVmFsdWVdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXzogU3ludGhldGljRXZlbnQsIG5ld1NlbGVjdGVkT3B0aW9uczogVE9wdGlvbltdKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWRPcHRpb25zKG5ld1NlbGVjdGVkT3B0aW9ucyk7XG4gICAgY29uc3QgbmV3VmFsdWVzID0gbmV3U2VsZWN0ZWRPcHRpb25zLm1hcChjID0+IGNbdmFsdWVGaWVsZF0pO1xuXG4gICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWVzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBuZXdWYWx1ZXMpO1xuICAgIGxvYWRlZFZhbHVlc1JlZi5jdXJyZW50ID0gbmV3VmFsdWVzIGFzIHVua25vd24gYXMgVE9wdGlvbltdO1xuICAgIHNldE9wdGlvbnMobmV3U2VsZWN0ZWRPcHRpb25zKTtcbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICAvLyBDbGVhciBsYXN0IHNlYXJjaCB0ZXJtIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXNcbiAgICBsYXN0RmV0Y2hlZFNlYXJjaFRlcm1SZWYuY3VycmVudCA9IG51bGw7XG4gIH07XG5cbiAgY29uc3QgaXNEaXNhYmxlZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBkaXNhYmxlZCA/PyBmYWxzZTtcbiAgfSwgW2Rpc2FibGVkXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWwpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbClcbiAgICAgIH1cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICB2YWx1ZT17c2VsZWN0ZWRPcHRpb25zfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBmaWx0ZXJPcHRpb25zPXt4ID0+IHh9XG4gICAgICBub09wdGlvbnNUZXh0PVwiVHlwZSBTb21ldGhpbmcuLi5cIlxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIHN4PXt7XG4gICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkIC5NdWlBdXRvY29tcGxldGUtcG9wdXBJbmRpY2F0b3InOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWRpc2FibGVkIC5NdWlPdXRsaW5lZElucHV0LW5vdGNoZWRPdXRsaW5lJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpRmlsbGVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgICAgb25JbnB1dENoYW5nZT17KF8sIG5ld0lucHV0VmFsdWUpID0+IHNldElucHV0VmFsdWUobmV3SW5wdXRWYWx1ZSl9XG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBJbnB1dFByb3BzPXt7XG4gICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICA8RnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICByZW5kZXJPcHRpb249eyhwcm9wcywgb3B0aW9uLCBzdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9XG4gICAgICAgICAgcHJvcHMgYXMgSFRNTEF0dHJpYnV0ZXM8SFRNTExJRWxlbWVudD4gJiB7IGtleTogc3RyaW5nIH07XG4gICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gZ2V0T3B0aW9uTGFiZWwob3B0aW9uKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IG1hdGNoKG9wdGlvbkxhYmVsLCBzdGF0ZS5pbnB1dFZhbHVlLCB7XG4gICAgICAgICAgaW5zaWRlV29yZHM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhcnNlKG9wdGlvbkxhYmVsLCBtYXRjaGVzKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIHtwYXJ0cy5tYXAoKHBhcnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiBwYXJ0LmhpZ2hsaWdodCA/IDcwMCA6IDQwMCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3BhcnQudGV4dH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgICB7Li4ucmVzdH1cbiAgICAvPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPih7XG4gIGdyaWRQcm9wcyxcbiAgLi4ucHJvcHNcbn06IEFzeW5jTXVsdGlTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBUT3B0aW9uXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgaWYgKGdyaWRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICA8R3JpZFxuICAgICAgICB7Li4ueyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sIC4uLmdyaWRQcm9wcyB9fVxuICAgICAgPlxuICAgICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPlxuICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgLz5cbiAgICAgIDwvR3JpZD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPiB7Li4ucHJvcHN9IC8+XG4gICk7XG59O1xuXG5Bc3luY1NlbGVjdE11bHRpRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdBc3luY1NlbGVjdE11bHRpJztcblxuZXhwb3J0IHsgQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQgfTtcbiIsICJpbXBvcnQge1xuICBDaGVja2JveCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Db250cm9sTGFiZWwsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUhlbHBlclRleHQsXG4gIEdyaWQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMsIFBhdGhWYWx1ZSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgdXNlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtJztcblxuaW1wb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBDaGVja2JveEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgbGFiZWwsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBoZWxwZXJUZXh0LFxuICAgIHBhcnNlRXJyb3IsXG4gICAgdHJhbnNmb3JtLFxuICAgIGRpc2FibGVkLFxuICAgIG9uQ2hhbmdlOiBjdXN0b21PbkNoYW5nZSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkLFxuICB9KTtcblxuICBpZiAoZmllbGQudmFsdWUgPT0gbnVsbCB8fCBmaWVsZC52YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICBmaWVsZC5vbkNoYW5nZShmYWxzZSk7XG4gIH1cblxuICBjb25zdCBjdXN0b21PdXRwdXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm0/Lm91dHB1dDtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIGJvb2xlYW4+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IHZhbHVlID0+ICEhdmFsdWUsXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiBjdXN0b21PdXRwdXRUcmFuc2Zvcm0gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IChldmVudE9yVmFsdWUsIF92YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAvLyBBZGFwdGVyOiBFeHRyYWN0IGV2ZW50IGFuZCBjaGVja2VkIGZyb20gdGhlIGNoZWNrYm94IG9uQ2hhbmdlIHNpZ25hdHVyZVxuICAgICAgICAgICAgICAvLyBDaGVja2JveEVsZW1lbnQgcGFzc2VzIChldmVudCwgY2hlY2tlZCksIGJ1dCB1c2VUcmFuc2Zvcm0gZXhwZWN0cyAoZXZlbnRPclZhbHVlLCB2YWx1ZSlcbiAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudE9yVmFsdWUgYXMgUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD47XG4gICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBfdmFsdWUgYXMgdW5rbm93biBhcyBib29sZWFuO1xuXG4gICAgICAgICAgICAgIHJldHVybiBjdXN0b21PdXRwdXRUcmFuc2Zvcm0oZXZlbnQsIGNoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIDogKGV2ZW50T3JWYWx1ZSwgX3ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIERlZmF1bHQ6IGV4dHJhY3QgY2hlY2tlZCBzdGF0ZSBmcm9tIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBfdmFsdWUgYXMgdW5rbm93biBhcyBib29sZWFuO1xuXG4gICAgICAgICAgICAgIHJldHVybiBjaGVja2VkIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKFxuICAgIGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PixcbiAgICBjaGVja2VkOiBib29sZWFuXG4gICkgPT4ge1xuICAgIG9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjdXN0b21PbkNoYW5nZShldmVudCwgY2hlY2tlZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRpc3BsYXlFcnJvcjogUmVhY3ROb2RlID0gZXJyb3JcbiAgICA/IHR5cGVvZiBwYXJzZUVycm9yID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHBhcnNlRXJyb3IoZXJyb3IpXG4gICAgICA6IGVycm9yLm1lc3NhZ2VcbiAgICA6IG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9IGRpc2FibGVkPXtkaXNhYmxlZH0+XG4gICAgICA8Rm9ybUdyb3VwIHJvdz5cbiAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICBsYWJlbD17bGFiZWwgfHwgJyd9XG4gICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICBjb2xvcj17cmVzdC5jb2xvciB8fCAncHJpbWFyeSd9XG4gICAgICAgICAgICAgIGNoZWNrZWQ9e3ZhbHVlfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIHsoZGlzcGxheUVycm9yIHx8IGhlbHBlclRleHQpICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7ZGlzcGxheUVycm9yIHx8IGhlbHBlclRleHR9XG4gICAgICAgIDwvRm9ybUhlbHBlclRleHQ+XG4gICAgICApfVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQ2hlY2tib3ggY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24gYW5kIGdyaWQgbGF5b3V0LlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBjaGVja2JveCBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIG9wdGlvbmFsIEdyaWQgd3JhcHBlciBmb3IgcmVzcG9uc2l2ZSBsYXlvdXRzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvbiB3aXRoIHVzZUNvbnRyb2xsZXJcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZyBzdXBwb3J0XG4gKiAtIFZhbHVlIHRyYW5zZm9ybWF0aW9uIHdpdGggdXNlVHJhbnNmb3JtIGhvb2sgZm9yIGJvb2xlYW4gdmFsdWVzXG4gKiAtIEN1c3RvbWl6YWJsZSBsYWJlbCBhbmQgcG9zaXRpb25pbmdcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlciB3aXRoIHJlc3BvbnNpdmUgZGVzaWduXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHkgd2l0aCBnZW5lcmljIGNvbnN0cmFpbnRzXG4gKiAtIERpc2FibGVkIHN0YXRlIHN1cHBvcnQgd2l0aCBwcm9wZXIgdGhlbWluZ1xuICogLSBIZWxwZXIgdGV4dCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIGNvbnRleHRcbiAqIC0gQ3VzdG9tIGVycm9yIHBhcnNpbmcgZm9yIGludGVybmF0aW9uYWxpemF0aW9uXG4gKiAtIFNpbXBsZSBib29sZWFuIHZhbHVlIGhhbmRsaW5nIHdpdGggb3B0aW9uYWwgY3VzdG9tIHRyYW5zZm9ybXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFjY2VwdFRlcm1zXCJcbiAqICAgbGFiZWw9XCJJIGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1wiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggdmFsaWRhdGlvbiBhbmQgaGVscGVyIHRleHQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cIm5ld3NsZXR0ZXJcIlxuICogICBsYWJlbD1cIlN1YnNjcmliZSB0byBuZXdzbGV0dGVyXCJcbiAqICAgaGVscGVyVGV4dD1cIllvdSBjYW4gdW5zdWJzY3JpYmUgYXQgYW55IHRpbWVcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ1BsZWFzZSBhY2NlcHQgdG8gY29udGludWUnIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBncmlkIGxheW91dCBhbmQgc3R5bGluZzpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiaXNQdWJsaWNcIlxuICogICBsYWJlbD1cIk1ha2UgdGhpcyBwdWJsaWNcIlxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgbGFiZWxQcm9wcz17eyBzeDogeyBmb250V2VpZ2h0OiAnYm9sZCcgfSB9fVxuICogICBzeD17eyBjb2xvcjogJ3ByaW1hcnkubWFpbicgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCB2YWx1ZSB0cmFuc2Zvcm1hdGlvbiAoc3RyaW5nIHRvIGJvb2xlYW4pOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJzdGF0dXNcIlxuICogICBsYWJlbD1cIkFjdGl2ZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAodmFsdWUpID0+IHZhbHVlID09PSAnYWN0aXZlJyxcbiAqICAgICBvdXRwdXQ6IChjaGVja2VkKSA9PiBjaGVja2VkID8gJ2FjdGl2ZScgOiAnaW5hY3RpdmUnXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFNpbXBsZSBib29sZWFuIGZpZWxkOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJpc0VuYWJsZWRcIlxuICogICBsYWJlbD1cIkVuYWJsZSBmZWF0dXJlXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGVycm9yIHBhcnNpbmcgZm9yIGludGVybmF0aW9uYWxpemF0aW9uOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ0ZXJtc1wiXG4gKiAgIGxhYmVsPVwiQWNjZXB0IFRlcm1zXCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiB0KGB2YWxpZGF0aW9uLiR7ZXJyb3IudHlwZX1gLCB7IGZpZWxkOiAnVGVybXMnIH0pfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2hlY2tib3hFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBDaGVja2JveEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQ8VEZpZWxkVmFsdWVzLCBUTmFtZT4gey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbmV4cG9ydCB7IENoZWNrYm94RWxlbWVudCB9O1xuXG5leHBvcnQgdHlwZSB7IENoZWNrYm94RWxlbWVudFByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBDaGVja2JveFByb3BzLFxuICBGb3JtQ29udHJvbExhYmVsUHJvcHMsXG4gIEZvcm1MYWJlbFByb3BzLFxuICBHcmlkUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBGb3JtTGFiZWwsXG4gIEdyaWQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgQ2hlY2tib3hHcm91cCBjb21wb25lbnRcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdmFsdWUgYXJyYXkgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG4vLyBUeXBlIGZvciBwcmltaXRpdmUgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcmFkaW8gYnV0dG9uIHZhbHVlc1xudHlwZSBQcmltaXRpdmVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIENvbnN0cmFpbnQgdG8gZW5zdXJlIG9wdGlvbiBvYmplY3RzIGhhdmUgdGhlIHJlcXVpcmVkIGtleXNcbnR5cGUgT3B0aW9uT2JqZWN0PFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIFByaW1pdGl2ZVZhbHVlPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PjtcblxuZXhwb3J0IHR5cGUgQ2hlY2tib3hHcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4gPSBPbWl0PENoZWNrYm94UHJvcHMsICduYW1lJz4gJiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG5cbiAgLyoqXG4gICAqIExhYmVsIGZvciB0aGUgY2hlY2tib3ggZ3JvdXBcbiAgICovXG4gIGxhYmVsPzogRm9ybUNvbnRyb2xMYWJlbFByb3BzWydsYWJlbCddO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciBGb3JtQ29udHJvbExhYmVsXG4gICAqL1xuICBsYWJlbFByb3BzPzogT21pdDxGb3JtQ29udHJvbExhYmVsUHJvcHMsICdsYWJlbCcgfCAnY29udHJvbCc+O1xuXG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXJcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG5cbiAgb3B0aW9uczogVE9wdGlvbltdO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGZvcm1MYWJlbFByb3BzPzogT21pdDxGb3JtTGFiZWxQcm9wcywgJ3JlcXVpcmVkJyB8ICdlcnJvcic+O1xuXG4gIGxhYmVsS2V5PzogVExhYmVsS2V5O1xuICB2YWx1ZUtleT86IFRWYWx1ZUtleTtcbiAgZGlzYWJsZWRLZXk/OiBURGlzYWJsZWRLZXk7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBDaGVja2JveEdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oXG4gIHByb3BzOiBDaGVja2JveEdyb3VwUHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb24sXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgbGFiZWwsXG4gICAgcmVxdWlyZWQsXG4gICAgZm9ybUxhYmVsUHJvcHMsXG4gICAgbGFiZWxQcm9wcyxcbiAgICBsYWJlbEtleSA9ICdMYWJlbCcgYXMgVExhYmVsS2V5LFxuICAgIHZhbHVlS2V5ID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgb3B0aW9ucyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGRpc2FibGVkOiByZXN0LmRpc2FibGVkLFxuICB9KTtcblxuICBjb25zdCBzZWxlY3RlZFZhbHVlc0FzU3RyaW5nID0gKFxuICAgIEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpID8gZmllbGQudmFsdWUgOiBbXVxuICApLm1hcChTdHJpbmcpO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGNoYW5nZWRWYWx1ZVN0cmluZyA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuXG4gICAgICBjb25zdCBuZXdTZWxlY3RlZFZhbHVlc1N0cmluZyA9IGlzQ2hlY2tlZFxuICAgICAgICA/IFsuLi5zZWxlY3RlZFZhbHVlc0FzU3RyaW5nLCBjaGFuZ2VkVmFsdWVTdHJpbmddXG4gICAgICAgIDogc2VsZWN0ZWRWYWx1ZXNBc1N0cmluZy5maWx0ZXIodiA9PiB2ICE9PSBjaGFuZ2VkVmFsdWVTdHJpbmcpO1xuXG4gICAgICBjb25zdCBvcHRpb25zQXJlTnVtZXJpYyA9XG4gICAgICAgIG9wdGlvbnMubGVuZ3RoID4gMCAmJiB0eXBlb2Ygb3B0aW9uc1swXVt2YWx1ZUtleV0gPT09ICdudW1iZXInO1xuXG4gICAgICBpZiAob3B0aW9uc0FyZU51bWVyaWMpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzQXNOdW1iZXJzID0gbmV3U2VsZWN0ZWRWYWx1ZXNTdHJpbmdcbiAgICAgICAgICAubWFwKHYgPT4gcGFyc2VJbnQodiwgMTApKVxuICAgICAgICAgIC5maWx0ZXIodiA9PiAhaXNOYU4odikpO1xuXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlc0FzTnVtYmVycyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdTZWxlY3RlZFZhbHVlc1N0cmluZyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmllbGQsIG9wdGlvbnMsIHZhbHVlS2V5LCBzZWxlY3RlZFZhbHVlc0FzU3RyaW5nXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxGb3JtTGFiZWwgey4uLmZvcm1MYWJlbFByb3BzfSByZXF1aXJlZD17cmVxdWlyZWR9IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvRm9ybUxhYmVsPlxuICAgICAgKX1cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICB7b3B0aW9ucyAmJlxuICAgICAgICAgIG9wdGlvbnMubWFwKG9wdGlvbiA9PiAoXG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgICAgICBrZXk9e2Ake29wdGlvblt2YWx1ZUtleV19YH1cbiAgICAgICAgICAgICAgbGFiZWw9e29wdGlvbltsYWJlbEtleV19XG4gICAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICAgICAgY29sb3I9e3Jlc3QuY29sb3IgfHwgJ3ByaW1hcnknfVxuICAgICAgICAgICAgICAgICAgdmFsdWU9e29wdGlvblt2YWx1ZUtleV19XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZFZhbHVlc0FzU3RyaW5nLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICBTdHJpbmcob3B0aW9uW3ZhbHVlS2V5XSlcbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIHtlcnJvciAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dCBlcnJvcj17ISFlcnJvcn0+e2Vycm9yLm1lc3NhZ2V9PC9Gb3JtSGVscGVyVGV4dD5cbiAgICAgICl9XG4gICAgPC9Gb3JtQ29udHJvbD5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBDaGVja2JveEdyb3VwIGNvbXBvbmVudCBmb3IgbXVsdGlwbGUgY2hlY2tib3ggc2VsZWN0aW9uLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZ3JvdXAgb2YgY2hlY2tib3hlcyB0aGF0IHdvcmsgc2VhbWxlc3NseSB3aXRoIHJlYWN0LWhvb2stZm9ybSxcbiAqIG1hbmFnaW5nIGFuIGFycmF5IG9mIHNlbGVjdGVkIHZhbHVlcyB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBlcnJvciBoYW5kbGluZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gTXVsdGlwbGUgY2hlY2tib3ggc2VsZWN0aW9uIHdpdGggYXJyYXkgdmFsdWUgbWFuYWdlbWVudFxuICogLSBBdXRvbWF0aWMgZXJyb3IgZGlzcGxheVxuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3VwcG9ydFxuICogLSBOYU4gdmFsaWRhdGlvbiBmb3IgbnVtZXJpYyB2YWx1ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEdyb3VwXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJzZWxlY3RlZENhdGVnb3JpZXNcIlxuICogICBvcHRpb25zPXtbXG4gKiAgICAgeyBWYWx1ZTogMSwgTGFiZWw6ICdDYXRlZ29yeSAxJyB9LFxuICogICAgIHsgVmFsdWU6IDIsIExhYmVsOiAnQ2F0ZWdvcnkgMicgfSxcbiAqICAgICB7IFZhbHVlOiAzLCBMYWJlbDogJ0NhdGVnb3J5IDMnIH0sXG4gKiAgIF19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hHcm91cFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicGVybWlzc2lvbnNcIlxuICogICBvcHRpb25zPXtwZXJtaXNzaW9uT3B0aW9uc31cbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIGRpc2FibGVkPXshaGFzRWRpdFBlcm1pc3Npb259XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHZhbHVlIGFycmF5IHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IENoZWNrYm94R3JvdXBFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IENoZWNrYm94R3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVE9wdGlvbixcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFREaXNhYmxlZEtleVxuPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbkNoZWNrYm94R3JvdXBFbGVtZW50LmRpc3BsYXlOYW1lID0gJ0NoZWNrYm94R3JvdXAnO1xuXG5leHBvcnQgeyBDaGVja2JveEdyb3VwRWxlbWVudCB9O1xuIiwgImltcG9ydCB7IEdyaWQgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9IGZyb20gXCIuL0RhdGVQaWNrZXJFbGVtZW50Q29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBBIGZ1bGx5LWZlYXR1cmVkLCB0eXBlLXNhZmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IGZvciByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgY29tYmluZXMgdGhlIGNvcmUgZGF0ZSBwaWNrZXIgZnVuY3Rpb25hbGl0eSB3aXRoIG9wdGlvbmFsIEdyaWQgbGF5b3V0IHdyYXBwaW5nLFxuICogcHJvdmlkaW5nIGEgY29tcGxldGUgc29sdXRpb24gZm9yIGZvcm0tYmFzZWQgZGF0ZSBzZWxlY3Rpb24gd2l0aCBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydC5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIFx1RDgzQ1x1REZBRiAqKlR5cGUgU2FmZXR5Kio6IEZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIGZvcm0gZmllbGQgdHlwZXMgYW5kIGRhdGUgdmFsdWVzXG4gKiAtIFx1RDgzRFx1REQyNyAqKlJlYWN0IEhvb2sgRm9ybSBJbnRlZ3JhdGlvbioqOiBTZWFtbGVzcyBpbnRlZ3JhdGlvbiB3aXRoIHJlYWN0LWhvb2stZm9ybSB2YWxpZGF0aW9uXG4gKiAtIFx1RDgzQ1x1REZBOCAqKlRoZW1pbmcqKjogQXV0b21hdGljIGFkYXB0YXRpb24gdG8gTVVJIHRoZW1lIHdpdGggY3VzdG9taXphYmxlIHN0eWxlc1xuICogLSBcdTI2N0YgKipBY2Nlc3NpYmlsaXR5Kio6IFdDQUctY29tcGxpYW50IHdpdGggcHJvcGVyIEFSSUEgYXR0cmlidXRlcyBhbmQga2V5Ym9hcmQgbmF2aWdhdGlvblxuICogLSBcdUQ4M0RcdURFODAgKipQZXJmb3JtYW5jZSoqOiBPcHRpbWl6ZWQgd2l0aCBtZW1vaXphdGlvbiBhbmQgZWZmaWNpZW50IHJlLXJlbmRlcmluZ1xuICogLSBcdUQ4M0RcdURDRjEgKipSZXNwb25zaXZlKio6IEJ1aWx0LWluIEdyaWQgbGF5b3V0IHdpdGggY29uZmlndXJhYmxlIGJyZWFrcG9pbnRzXG4gKiAtIFx1RDgzRFx1REVFMVx1RkUwRiAqKlZhbGlkYXRpb24qKjogQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIFx1RDgzRFx1REQwNCAqKlRyYW5zZm9ybWF0aW9uKio6IEZsZXhpYmxlIHZhbHVlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gZm9ybSBhbmQgcGlja2VyIGZvcm1hdHNcbiAqIC0gXHVEODNEXHVEQ0RBICoqRGV2ZWxvcGVyIEV4cGVyaWVuY2UqKjogUmljaCBUeXBlU2NyaXB0IEludGVsbGlTZW5zZSBhbmQgY29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIEdyaWQgd3JhcHBlcjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlRm9ybSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG4gKiBpbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gJ0BnbndlYnNvZnQvdWkvd3JhcHBlcnMnO1xuICpcbiAqIGZ1bmN0aW9uIE15Rm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgYmlydGhEYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICBuYW1lPVwiYmlydGhEYXRlXCJcbiAqICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICAgICAgcmVxdWlyZWRcbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uIGFuZCB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBZHZhbmNlZEZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IHN0YXJ0RGF0ZTogRGF0ZSB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiUHJvamVjdCBTdGFydCBEYXRlXCJcbiAqICAgICAgIHRyYW5zZm9ybT17e1xuICogICAgICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgICAgICB9fVxuICogICAgICAgdmFsaWRhdGlvbj17e1xuICogICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgICAgICBtYXhEYXRlOiBhZGRZZWFycyhuZXcgRGF0ZSgpLCAyKSxcbiAqICAgICAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInLFxuICogICAgICAgICAgIG1heERhdGU6ICdTdGFydCBkYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMiB5ZWFycyBpbiB0aGUgZnV0dXJlJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgICAgICBzeD17e1xuICogICAgICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aG91dCBHcmlkIHdyYXBwZXIgZm9yIGN1c3RvbSBsYXlvdXRzOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBDdXN0b21MYXlvdXQoKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IGV2ZW50RGF0ZTogc3RyaW5nIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxCb3ggZGlzcGxheT1cImZsZXhcIiBnYXA9ezJ9PlxuICogICAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICAgIG5hbWU9XCJldmVudERhdGVcIlxuICogICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgICBsYWJlbD1cIkV2ZW50IERhdGVcIlxuICogICAgICAgICBncmlkUHJvcHM9e2ZhbHNlfSAvLyBEaXNhYmxlcyBHcmlkIHdyYXBwZXJcbiAqICAgICAgIC8+XG4gKiAgICAgICA8QnV0dG9uIHR5cGU9XCJzdWJtaXRcIj5TdWJtaXQ8L0J1dHRvbj5cbiAqICAgICA8L0JveD5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGxvYWRpbmcgc3RhdGUgYW5kIGN1c3RvbSBlcnJvciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gTG9hZGluZ0Zvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybSgpO1xuICogICBjb25zdCBbaXNWYWxpZGF0aW5nLCBzZXRJc1ZhbGlkYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJhcHBvaW50bWVudERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiQXBwb2ludG1lbnQgRGF0ZVwiXG4gKiAgICAgICBsb2FkaW5nPXtpc1ZhbGlkYXRpbmd9XG4gKiAgICAgICBMb2FkaW5nQ29tcG9uZW50PXsoKSA9PiA8Q2lyY3VsYXJQcm9ncmVzcyBzaXplPXsyMH0gLz59XG4gKiAgICAgICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHtcbiAqICAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3I/LnR5cGUgPT09ICdjdXN0b20nKSB7XG4gKiAgICAgICAgICAgcmV0dXJuICdUaGlzIGRhdGUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBhcHBvaW50bWVudCc7XG4gKiAgICAgICAgIH1cbiAqICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBkYXRlJztcbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZSAoaW5mZXJyZWQgZnJvbSBjb250cm9sKVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZSAoaW5mZXJyZWQgZnJvbSBuYW1lIHByb3ApXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGUgKGluZmVycmVkIGZyb20gdHJhbnNmb3JtIGZ1bmN0aW9ucylcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyB3aXRoIGZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2VcbiAqIEBwYXJhbSByZWYgLSBGb3J3YXJkIHJlZiBmb3IgdGhlIHJvb3QgZWxlbWVudCAoR3JpZCBvciBEYXRlUGlja2VyIGNvbnRhaW5lcilcbiAqIEByZXR1cm5zIFJlbmRlcmVkIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudCA9IGZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBEYXRlUGlja2VyRWxlbWVudFByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSwgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAgIC4uLmNvcmVQcm9wc1xuICB9ID0gcHJvcHM7XG5cbiAgLy8gSWYgZ3JpZFByb3BzIGlzIGV4cGxpY2l0bHkgZmFsc2UsIHJlbmRlciB3aXRob3V0IEdyaWQgd3JhcHBlclxuICBpZiAoZ3JpZFByb3BzID09PSBmYWxzZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICApO1xuICB9XG5cbiAgLy8gUmVuZGVyIHdpdGggR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dFxuICByZXR1cm4gKFxuICAgIDxHcmlkXG4gICAgICByZWY9e3JlZn1cbiAgICAgIHsuLi5ncmlkUHJvcHN9XG4gICAgPlxuICAgICAgPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59KTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgUmVhY3QgRGV2ZWxvcGVyIFRvb2xzXG5EYXRlUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiRGF0ZVBpY2tlckVsZW1lbnRcIjtcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlckVsZW1lbnQ7XG4iLCAiaW1wb3J0IHsgdXNlRm9ya1JlZiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlciB9IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IHR5cGUge1xuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxuICBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dCxcbiAgUGlja2VyVmFsaWREYXRlLFxufSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFZhbHVlcywgRmllbGRQYXRoIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHtcbiAgdXNlRGF0ZVBpY2tlclZhbHVlLFxuICB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbixcbiAgdXNlRGF0ZVBpY2tlclN0eWxlcyxcbn0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGNvcmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IHdpdGhvdXQgR3JpZCB3cmFwcGVyLlxuICpcbiAqIFRoaXMgaXMgYSBsaWdodHdlaWdodCwgcGVyZm9ybWFudCBkYXRlIHBpY2tlciBjb21wb25lbnQgdGhhdCBpbnRlZ3JhdGVzIHNlYW1sZXNzbHlcbiAqIHdpdGggcmVhY3QtaG9vay1mb3JtIHdoaWxlIHByb3ZpZGluZyBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydCBhbmRcbiAqIGFjY2Vzc2liaWxpdHkgZmVhdHVyZXMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIGZvcm0gZmllbGQgdHlwZXNcbiAqIC0gQXV0b21hdGljIHZhbHVlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gZm9ybSBhbmQgcGlja2VyIGZvcm1hdHNcbiAqIC0gQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIFRoZW1lLWF3YXJlIHN0eWxpbmcgd2l0aCBhY2Nlc3NpYmlsaXR5IHN1cHBvcnRcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemVkIHdpdGggcHJvcGVyIG1lbW9pemF0aW9uXG4gKiAtIEZvcndhcmQgcmVmIHN1cHBvcnQgZm9yIGFkdmFuY2VkIHVzZSBjYXNlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICogICBuYW1lPVwiYmlydGhEYXRlXCJcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbGFiZWw9XCJEYXRlIG9mIEJpcnRoXCJcbiAqICAgcmVxdWlyZWRcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAqICAgbmFtZT1cInN0YXJ0RGF0ZVwiXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIGxhYmVsPVwiU3RhcnQgRGF0ZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS50b0lTT1N0cmluZygpIDogbnVsbFxuICogICB9fVxuICogICB2YWxpZGF0aW9uPXt7XG4gKiAgICAgbWluRGF0ZTogbmV3IERhdGUoKSxcbiAqICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICBtaW5EYXRlOiAnU3RhcnQgZGF0ZSBtdXN0IGJlIHRvZGF5IG9yIGxhdGVyJ1xuICogICAgIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHRlbXBsYXRlIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgLSBXaGV0aGVyIGFjY2Vzc2libGUgZmllbGQgRE9NIHN0cnVjdHVyZSBpcyBlbmFibGVkXG4gKi9cbmNvbnN0IERhdGVQaWNrZXJFbGVtZW50Q29yZSA9IGZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wczxhbnksIGFueSwgYW55LCBhbnk+XG4+KFxuICA8XG4gICAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gICAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICAgIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4gID4oXG4gICAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzPFxuICAgICAgVEZpZWxkVmFsdWVzLFxuICAgICAgVE5hbWUsXG4gICAgICBUVmFsdWUsXG4gICAgICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlXG4gICAgPixcbiAgICByZWY6IFJlYWN0LlJlZjxIVE1MRGl2RWxlbWVudD5cbiAgKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHJlcXVpcmVkID0gZmFsc2UsXG4gICAgICBjb250cm9sLFxuICAgICAgcGFyc2VFcnJvcixcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIHZhbGlkYXRpb24sXG4gICAgICBsYWJlbCxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgdGV4dFJlYWRPbmx5ID0gZmFsc2UsXG4gICAgICBoZWxwZXJUZXh0LFxuICAgICAgaW5wdXRQcm9wcyA9IHt9LFxuICAgICAgc2xvdFByb3BzID0ge30sXG4gICAgICBkYXRlUGlja2VyUHJvcHMgPSB7fSxcbiAgICAgIHZhcmlhbnQgPSAnb3V0bGluZWQnLFxuICAgICAgbG9hZGluZyA9IGZhbHNlLFxuICAgICAgTG9hZGluZ0NvbXBvbmVudCxcbiAgICAgIC4uLnJlc3RQcm9wc1xuICAgIH0gPSBwcm9wcztcblxuICAgIC8vIEV4dHJhY3QgRGF0ZVBpY2tlci1zcGVjaWZpYyBwcm9wc1xuICAgIGNvbnN0IHtcbiAgICAgIGRpc2FibGVkLFxuICAgICAgaW5wdXRSZWY6IGV4dGVybmFsSW5wdXRSZWYsXG4gICAgICBvbkNsb3NlLFxuICAgICAgLi4ucmVzdERhdGVQaWNrZXJQcm9wc1xuICAgIH0gPSBkYXRlUGlja2VyUHJvcHM7XG5cbiAgICAvLyBTZXQgdXAgZm9ybSBjb250cm9sbGVyXG4gICAgY29uc3QgeyBmaWVsZCwgZmllbGRTdGF0ZSB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgICBuYW1lLFxuICAgICAgY29udHJvbCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogbnVsbCBhcyBhbnksIC8vIExldCByZWFjdC1ob29rLWZvcm0gaGFuZGxlIHRoZSBkZWZhdWx0IHZhbHVlIHR5cGluZ1xuICAgIH0pO1xuXG4gICAgLy8gVmFsdWUgdHJhbnNmb3JtYXRpb24gaG9va1xuICAgIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlOiBvblZhbHVlQ2hhbmdlIH0gPSB1c2VEYXRlUGlja2VyVmFsdWUoe1xuICAgICAgZmllbGQsXG4gICAgICB0cmFuc2Zvcm0sXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0aW9uIGhvb2tcbiAgICBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAgICAgIGZpZWxkU3RhdGUsXG4gICAgICB2YWxpZGF0aW9uLFxuICAgICAgcGFyc2VFcnJvcixcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuXG4gICAgLy8gU3R5bGluZyBob29rXG4gICAgY29uc3QgeyBjbGFzc05hbWUgfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICAgICAgZGlzYWJsZWQsXG4gICAgICBoYXNFcnJvcixcbiAgICAgIGxvYWRpbmcsXG4gICAgICB0ZXh0UmVhZE9ubHksXG4gICAgfSk7XG5cbiAgICAvLyBNZXJnZSBpbnB1dCByZWZzXG4gICAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgZXh0ZXJuYWxJbnB1dFJlZik7XG5cbiAgICAvLyBNZW1vaXplZCBjaGFuZ2UgaGFuZGxlciB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAgIChcbiAgICAgICAgbmV3VmFsdWU6IFRWYWx1ZSB8IG51bGwsXG4gICAgICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+XG4gICAgICApID0+IHtcbiAgICAgICAgb25WYWx1ZUNoYW5nZShuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgW29uVmFsdWVDaGFuZ2VdXG4gICAgKTtcblxuICAgIC8vIE1lbW9pemVkIGNsb3NlIGhhbmRsZXJcbiAgICBjb25zdCBoYW5kbGVDbG9zZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8dHlwZW9mIG9uQ2xvc2U+PikgPT4ge1xuICAgICAgICAvLyBUcmlnZ2VyIGZvcm0gZmllbGQgYmx1ciBmb3IgdmFsaWRhdGlvblxuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcblxuICAgICAgICAvLyBDYWxsIGV4dGVybmFsIG9uQ2xvc2UgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgICBvbkNsb3NlKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgICAgW2ZpZWxkLm9uQmx1ciwgb25DbG9zZV1cbiAgICApO1xuXG4gICAgLy8gTWVtb2l6ZWQgYmx1ciBoYW5kbGVyIGZvciB0ZXh0IGZpZWxkXG4gICAgY29uc3QgaGFuZGxlVGV4dEZpZWxkQmx1ciA9IHVzZUNhbGxiYWNrKFxuICAgICAgKGV2ZW50OiBSZWFjdC5Gb2N1c0V2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuXG4gICAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25CbHVyIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXRQcm9wcy5vbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpbnB1dFByb3BzLm9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgICBbZmllbGQub25CbHVyLCBpbnB1dFByb3BzLm9uQmx1cl1cbiAgICApO1xuXG4gICAgLy8gTWVtb2l6ZWQgc2xvdCBwcm9wcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgICBjb25zdCBtZW1vaXplZFNsb3RQcm9wcyA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoe1xuICAgICAgICAuLi5zbG90UHJvcHMsXG4gICAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICAgIGFjdGlvbnM6IFsnY2xlYXInLCAndG9kYXknLCAnY2FuY2VsJywgJ2FjY2VwdCddIGFzIEFycmF5PFxuICAgICAgICAgICAgJ2FjY2VwdCcgfCAnY2FuY2VsJyB8ICdjbGVhcicgfCAnbmV4dCcgfCAnbmV4dE9yQWNjZXB0JyB8ICd0b2RheSdcbiAgICAgICAgICA+LFxuICAgICAgICAgIC4uLnNsb3RQcm9wcy5hY3Rpb25CYXIsXG4gICAgICAgIH0sXG4gICAgICAgIHRleHRGaWVsZDoge1xuICAgICAgICAgIC4uLmlucHV0UHJvcHMsXG4gICAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICAgIHZhcmlhbnQsXG4gICAgICAgICAgb25CbHVyOiBoYW5kbGVUZXh0RmllbGRCbHVyLFxuICAgICAgICAgIGVycm9yOiBoYXNFcnJvcixcbiAgICAgICAgICBoZWxwZXJUZXh0OiBoYXNFcnJvciA/IGVycm9yTWVzc2FnZSA6IGhlbHBlclRleHQsXG4gICAgICAgICAgaW5wdXRQcm9wczoge1xuICAgICAgICAgICAgcmVhZE9ubHk6IHRleHRSZWFkT25seSxcbiAgICAgICAgICAgICdhcmlhLWludmFsaWQnOiBpbnZhbGlkLFxuICAgICAgICAgICAgJ2FyaWEtZGVzY3JpYmVkYnknOiBoYXNFcnJvciA/IGAke25hbWV9LWVycm9yYCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIC4uLmlucHV0UHJvcHMuaW5wdXRQcm9wcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIEFkZCBsb2FkaW5nIGluZGljYXRvciBpZiBwcm92aWRlZFxuICAgICAgICAgIC4uLihsb2FkaW5nICYmXG4gICAgICAgICAgICBMb2FkaW5nQ29tcG9uZW50ICYmIHtcbiAgICAgICAgICAgICAgSW5wdXRQcm9wczoge1xuICAgICAgICAgICAgICAgIGVuZEFkb3JubWVudDogPExvYWRpbmdDb21wb25lbnQgLz4sXG4gICAgICAgICAgICAgICAgLi4uaW5wdXRQcm9wcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgLi4uc2xvdFByb3BzLnRleHRGaWVsZCxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgW1xuICAgICAgICBzbG90UHJvcHMsXG4gICAgICAgIGlucHV0UHJvcHMsXG4gICAgICAgIHJlcXVpcmVkLFxuICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgdmFyaWFudCxcbiAgICAgICAgaGFuZGxlVGV4dEZpZWxkQmx1cixcbiAgICAgICAgaGFzRXJyb3IsXG4gICAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgICAgaGVscGVyVGV4dCxcbiAgICAgICAgdGV4dFJlYWRPbmx5LFxuICAgICAgICBpbnZhbGlkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBsb2FkaW5nLFxuICAgICAgICBMb2FkaW5nQ29tcG9uZW50LFxuICAgICAgXVxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgLy8gU3ByZWFkIHJlc3QgcHJvcHMgZmlyc3Qgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlblxuICAgICAgICB7Li4ucmVzdFByb3BzfVxuICAgICAgICB7Li4ucmVzdERhdGVQaWNrZXJQcm9wc31cbiAgICAgICAgLy8gQ29yZSBwcm9wc1xuICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgbmFtZT17bmFtZX1cbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZX1cbiAgICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgICAvLyBVSSBwcm9wc1xuICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgIC8vIFNsb3QgcHJvcHNcbiAgICAgICAgc2xvdFByb3BzPXttZW1vaXplZFNsb3RQcm9wc31cbiAgICAgICAgLy8gQWNjZXNzaWJpbGl0eSBwcm9wc1xuICAgICAgICBhcmlhLWludmFsaWQ9e2ludmFsaWR9XG4gICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e2hhc0Vycm9yID8gYCR7bmFtZX0tZXJyb3JgIDogdW5kZWZpbmVkfVxuICAgICAgLz5cbiAgICApO1xuICB9XG4pO1xuXG4vLyBTZXQgZGlzcGxheSBuYW1lIGZvciBkZWJ1Z2dpbmdcbkRhdGVQaWNrZXJFbGVtZW50Q29yZS5kaXNwbGF5TmFtZSA9ICdEYXRlUGlja2VyRWxlbWVudENvcmUnO1xuXG5leHBvcnQgeyBEYXRlUGlja2VyRWxlbWVudENvcmUgfTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlckVsZW1lbnRDb3JlO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgUGlja2VyVmFsaWREYXRlLFxuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxuICBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dCxcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkVmFsdWVzLFxuICBGaWVsZFBhdGgsXG4gIFBhdGhWYWx1ZSxcbiAgVXNlQ29udHJvbGxlclJldHVybixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IERhdGVUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBUeXBlLXNhZmUgZGF0ZSB2YWx1ZSByZWFkZXIgdGhhdCBoYW5kbGVzIHN0cmluZyB0byBkYXRlIGNvbnZlcnNpb25cbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGUgZnJvbSB0aGUgZGF0ZSBhZGFwdGVyXG4gKiBAcGFyYW0gYWRhcHRlciAtIFRoZSBsb2NhbGl6YXRpb24gY29udGV4dCBmcm9tIE1VSSBkYXRlIHBpY2tlcnNcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0IChzdHJpbmcsIGRhdGUsIG9yIG51bGwpXG4gKiBAcmV0dXJucyBQcm9wZXJseSB0eXBlZCBkYXRlIHZhbHVlIG9yIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGU8VERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGU+KFxuICBhZGFwdGVyOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VMb2NhbGl6YXRpb25Db250ZXh0PixcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwgfCBURGF0ZSB8IHVuZGVmaW5lZFxuKTogVERhdGUgfCBudWxsIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgYWRhcHRlciB0byBwYXJzZSB0aGUgc3RyaW5nIGludG8gYSBkYXRlXG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IGFkYXB0ZXIudXRpbHMuZGF0ZSh2YWx1ZSk7XG5cbiAgICByZXR1cm4gcGFyc2VkRGF0ZSBhcyBURGF0ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbHVlIGhvb2tcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+IHtcbiAgLyoqIFRoZSBmaWVsZCBjb250cm9sbGVyIGZyb20gcmVhY3QtaG9vay1mb3JtICovXG4gIGZpZWxkOiBVc2VDb250cm9sbGVyUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wiZmllbGRcIl07XG4gIC8qKiBPcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgKi9cbiAgdHJhbnNmb3JtPzogRGF0ZVRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+O1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbHVlIGhvb2tcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZVJldHVybjxUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGU+IHtcbiAgLyoqIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBmb3IgZGlzcGxheSBpbiB0aGUgcGlja2VyICovXG4gIHZhbHVlOiBUVmFsdWUgfCBudWxsO1xuICAvKiogQ2hhbmdlIGhhbmRsZXIgZm9yIHBpY2tlciB2YWx1ZSB1cGRhdGVzICovXG4gIG9uQ2hhbmdlOiAoXG4gICAgdmFsdWU6IFRWYWx1ZSB8IG51bGwsXG4gICAgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj5cbiAgKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEhvb2sgZm9yIG1hbmFnaW5nIGRhdGUgcGlja2VyIHZhbHVlIHRyYW5zZm9ybWF0aW9ucyB3aXRoIHR5cGUgc2FmZXR5XG4gKiBcbiAqIFRoaXMgaG9vayBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGJldHdlZW4gZm9ybSBmaWVsZCB2YWx1ZXMgYW5kIGRhdGUgcGlja2VyIHZhbHVlcyxcbiAqIGFwcGx5aW5nIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbnMgd2hpbGUgbWFpbnRhaW5pbmcgc3RyaWN0IFR5cGVTY3JpcHQgdHlwaW5nLlxuICogXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS50b0lTT1N0cmluZygpIDogbnVsbFxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogVXNhZ2Ugd2l0aCBEYXkuanMgZGF0ZXM6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VEYXRlUGlja2VyVmFsdWUoe1xuICogICBmaWVsZCxcbiAqICAgdHJhbnNmb3JtOiB7XG4gKiAgICAgaW5wdXQ6IChkYXRlU3RyaW5nKSA9PiBkYXRlU3RyaW5nID8gZGF5anMoZGF0ZVN0cmluZykgOiBudWxsLFxuICogICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpIDogbnVsbFxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHZhbHVlIHRyYW5zZm9ybWF0aW9uXG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCB0cmFuc2Zvcm1lZCB2YWx1ZSBhbmQgY2hhbmdlIGhhbmRsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJWYWx1ZTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyVmFsdWVPcHRpb25zPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbik6IFVzZURhdGVQaWNrZXJWYWx1ZVJldHVybjxUVmFsdWU+IHtcbiAgY29uc3QgeyBmaWVsZCwgdHJhbnNmb3JtIH0gPSBvcHRpb25zO1xuICBjb25zdCBhZGFwdGVyID0gdXNlTG9jYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gIC8vIFRyYW5zZm9ybSB0aGUgZmllbGQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlclxuICBjb25zdCB2YWx1ZSA9IHVzZU1lbW8oKCk6IFRWYWx1ZSB8IG51bGwgPT4ge1xuICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdHJhbnNmb3JtLmlucHV0KGZpZWxkLnZhbHVlKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRGVmYXVsdCB0cmFuc2Zvcm1hdGlvbjogaGFuZGxlIHN0cmluZyB0byBkYXRlIGNvbnZlcnNpb25cbiAgICByZXR1cm4gcmVhZERhdGVQaWNrZXJWYWx1ZUFzRGF0ZShhZGFwdGVyLCBmaWVsZC52YWx1ZSkgYXMgVFZhbHVlIHwgbnVsbDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtmaWVsZC52YWx1ZSwgdHJhbnNmb3JtPy5pbnB1dCwgYWRhcHRlcl0pO1xuXG4gIC8vIENyZWF0ZSBhIHN0YWJsZSBjaGFuZ2UgaGFuZGxlclxuICBjb25zdCBvbkNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCwgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtPy5vdXRwdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdHJhbnNmb3JtLm91dHB1dChuZXdWYWx1ZSwgY29udGV4dCk7XG5cbiAgICAgICAgZmllbGQub25DaGFuZ2UodHJhbnNmb3JtZWRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWZhdWx0IHRyYW5zZm9ybWF0aW9uOiBzdG9yZSB0aGUgZGF0ZSBhcy1pc1xuICAgICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pO1xuICAgICAgfVxuICAgIH0sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgIFtmaWVsZC5vbkNoYW5nZSwgdHJhbnNmb3JtPy5vdXRwdXRdXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlRGF0ZVBpY2tlclZhbHVlOyIsICJpbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxuICBGaWVsZFBhdGgsXG4gIFVzZUNvbnRyb2xsZXJSZXR1cm4sXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyVmFsaWRhdGlvbkNvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbiBob29rXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uT3B0aW9uczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+IHtcbiAgLyoqIFRoZSBmaWVsZCBzdGF0ZSBmcm9tIHJlYWN0LWhvb2stZm9ybSBjb250cm9sbGVyICovXG4gIGZpZWxkU3RhdGU6IFVzZUNvbnRyb2xsZXJSZXR1cm48VEZpZWxkVmFsdWVzLCBUTmFtZT5bXCJmaWVsZFN0YXRlXCJdO1xuICAvKiogVmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgZGF0ZSBwaWNrZXIgKi9cbiAgdmFsaWRhdGlvbj86IERhdGVQaWNrZXJWYWxpZGF0aW9uQ29uZmlnPFRWYWx1ZT47XG4gIC8qKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXIgKi9cbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqIFRoZSBjdXJyZW50IGRhdGUgdmFsdWUgZm9yIHZhbGlkYXRpb24gKi9cbiAgdmFsdWU/OiBUVmFsdWUgfCBudWxsO1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24gaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uUmV0dXJuIHtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGhhcyBhbnkgdmFsaWRhdGlvbiBlcnJvcnMgKi9cbiAgaGFzRXJyb3I6IGJvb2xlYW47XG4gIC8qKiBUaGUgY3VycmVudCB2YWxpZGF0aW9uIGVycm9yIChmb3JtIG9yIGRhdGUtc3BlY2lmaWMpICovXG4gIGVycm9yOiBGaWVsZEVycm9yIHwgRGF0ZVZhbGlkYXRpb25FcnJvciB8IHVuZGVmaW5lZDtcbiAgLyoqIEZvcm1hdHRlZCBlcnJvciBtZXNzYWdlIGZvciBkaXNwbGF5ICovXG4gIGVycm9yTWVzc2FnZTogUmVhY3ROb2RlO1xuICAvKiogV2hldGhlciB0aGUgZmllbGQgaXMgaW4gYW4gaW52YWxpZCBzdGF0ZSAqL1xuICBpbnZhbGlkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlZmF1bHQgZXJyb3IgbWVzc2FnZXMgZm9yIGNvbW1vbiBkYXRlIHZhbGlkYXRpb24gc2NlbmFyaW9zXG4gKi9cbmNvbnN0IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgPSB7XG4gIGludmFsaWREYXRlOiBcIlBsZWFzZSBlbnRlciBhIHZhbGlkIGRhdGVcIixcbiAgbWluRGF0ZTogXCJEYXRlIG11c3QgYmUgYWZ0ZXIgdGhlIG1pbmltdW0gYWxsb3dlZCBkYXRlXCIsXG4gIG1heERhdGU6IFwiRGF0ZSBtdXN0IGJlIGJlZm9yZSB0aGUgbWF4aW11bSBhbGxvd2VkIGRhdGVcIixcbiAgZGlzYWJsZWREYXRlOiBcIlRoaXMgZGF0ZSBpcyBub3QgYWxsb3dlZFwiLFxuICByZXF1aXJlZDogXCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEhvb2sgZm9yIG1hbmFnaW5nIGRhdGUgcGlja2VyIHZhbGlkYXRpb24gd2l0aCBjb21wcmVoZW5zaXZlIGVycm9yIGhhbmRsaW5nXG4gKiBcbiAqIFRoaXMgaG9vayBjZW50cmFsaXplcyB2YWxpZGF0aW9uIGxvZ2ljIGZvciBkYXRlIHBpY2tlcnMsIGhhbmRsaW5nIGJvdGhcbiAqIHJlYWN0LWhvb2stZm9ybSB2YWxpZGF0aW9uIGVycm9ycyBhbmQgZGF0ZS1zcGVjaWZpYyB2YWxpZGF0aW9uIGVycm9yc1xuICogZnJvbSBNVUkgZGF0ZSBwaWNrZXJzLlxuICogXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBmb3JtIHZhbGlkYXRpb246XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSwgaW52YWxpZCB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICogICBmaWVsZFN0YXRlLFxuICogICB2YWxpZGF0aW9uOiB7XG4gKiAgICAgbWluRGF0ZTogZGF5anMoKS5zdWJ0cmFjdCgxLCAneWVhcicpLFxuICogICAgIG1heERhdGU6IGRheWpzKCkuYWRkKDEsICd5ZWFyJyksXG4gKiAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgbWluRGF0ZTogJ0RhdGUgbXVzdCBiZSB3aXRoaW4gdGhlIGxhc3QgeWVhcicsXG4gKiAgICAgICBtYXhEYXRlOiAnRGF0ZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDEgeWVhciBpbiB0aGUgZnV0dXJlJ1xuICogICAgIH1cbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFVzYWdlIHdpdGggY3VzdG9tIGVycm9yIHBhcnNlcjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gKiAgIGZpZWxkU3RhdGUsXG4gKiAgIHBhcnNlRXJyb3I6IChlcnJvcikgPT4ge1xuICogICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gKiAgICAgICByZXR1cm4gYERhdGUgRXJyb3I6ICR7ZXJyb3J9YDtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ0ludmFsaWQgZGF0ZSc7XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBWYWxpZGF0aW9uIHN0YXRlIGFuZCBlcnJvciBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb248XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclZhbGlkYXRpb25PcHRpb25zPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbik6IFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uUmV0dXJuIHtcbiAgY29uc3QgeyBmaWVsZFN0YXRlLCB2YWxpZGF0aW9uLCBwYXJzZUVycm9yLCB2YWx1ZSB9ID0gb3B0aW9ucztcblxuICAvLyBNZW1vaXplIHZhbGlkYXRpb24gcmVzdWx0cyBmb3IgcGVyZm9ybWFuY2VcbiAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHsgZXJyb3I6IGZpZWxkRXJyb3IsIGludmFsaWQgfSA9IGZpZWxkU3RhdGU7XG4gICAgXG4gICAgLy8gU3RhcnQgd2l0aCBmb3JtIHZhbGlkYXRpb24gZXJyb3JcbiAgICBsZXQgY3VycmVudEVycm9yOiBGaWVsZEVycm9yIHwgRGF0ZVZhbGlkYXRpb25FcnJvciB8IHVuZGVmaW5lZCA9IGZpZWxkRXJyb3I7XG4gICAgXG4gICAgLy8gQ2hlY2sgZGF0ZS1zcGVjaWZpYyB2YWxpZGF0aW9ucyBpZiBubyBmb3JtIGVycm9yIGFuZCB3ZSBoYXZlIGEgdmFsdWVcbiAgICBpZiAoIWZpZWxkRXJyb3IgJiYgdmFsdWUgJiYgdmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgeyBtaW5EYXRlLCBtYXhEYXRlLCBzaG91bGREaXNhYmxlRGF0ZSwgZXJyb3JNZXNzYWdlcyB9ID0gdmFsaWRhdGlvbjtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgbWluaW11bSBkYXRlXG4gICAgICBpZiAobWluRGF0ZSAmJiB2YWx1ZSA8IG1pbkRhdGUpIHtcbiAgICAgICAgY3VycmVudEVycm9yID0ge1xuICAgICAgICAgIHR5cGU6ICdtaW5EYXRlJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzPy5taW5EYXRlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWluRGF0ZSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIERhdGVWYWxpZGF0aW9uRXJyb3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIG1heGltdW0gZGF0ZVxuICAgICAgZWxzZSBpZiAobWF4RGF0ZSAmJiB2YWx1ZSA+IG1heERhdGUpIHtcbiAgICAgICAgY3VycmVudEVycm9yID0ge1xuICAgICAgICAgIHR5cGU6ICdtYXhEYXRlJyxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2VzPy5tYXhEYXRlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMubWF4RGF0ZSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIERhdGVWYWxpZGF0aW9uRXJyb3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGRpc2FibGVkIGRhdGVcbiAgICAgIGVsc2UgaWYgKHNob3VsZERpc2FibGVEYXRlICYmIHNob3VsZERpc2FibGVEYXRlKHZhbHVlKSkge1xuICAgICAgICBjdXJyZW50RXJyb3IgPSB7XG4gICAgICAgICAgdHlwZTogJ2Rpc2FibGVkRGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8uZGlzYWJsZWREYXRlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGlzYWJsZWREYXRlLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgRGF0ZVZhbGlkYXRpb25FcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgY29uc3QgaGFzRXJyb3IgPSBCb29sZWFuKGN1cnJlbnRFcnJvcik7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc0Vycm9yLFxuICAgICAgZXJyb3I6IGN1cnJlbnRFcnJvcixcbiAgICAgIGludmFsaWQ6IGludmFsaWQgfHwgaGFzRXJyb3IsXG4gICAgfTtcbiAgfSwgW2ZpZWxkU3RhdGUsIHZhbGlkYXRpb24sIHZhbHVlXSk7XG5cbiAgLy8gTWVtb2l6ZSBlcnJvciBtZXNzYWdlIGZvcm1hdHRpbmdcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gdXNlTWVtbygoKTogUmVhY3ROb2RlID0+IHtcbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFVzZSBjdXN0b20gZXJyb3IgcGFyc2VyIGlmIHByb3ZpZGVkXG4gICAgaWYgKHBhcnNlRXJyb3IpIHtcbiAgICAgIHJldHVybiBwYXJzZUVycm9yKHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgZXJyb3IgbWVzc2FnZSBoYW5kbGluZ1xuICAgIGlmICh0eXBlb2YgdmFsaWRhdGlvblJlc3VsdC5lcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yO1xuICAgIH1cblxuICAgIGlmICgnbWVzc2FnZScgaW4gdmFsaWRhdGlvblJlc3VsdC5lcnJvciAmJiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yLm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZXJyb3IgbWVzc2FnZXMgYmFzZWQgb24gZXJyb3IgdHlwZVxuICAgIGlmICgndHlwZScgaW4gdmFsaWRhdGlvblJlc3VsdC5lcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gdmFsaWRhdGlvblJlc3VsdC5lcnJvci50eXBlO1xuXG4gICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICBjYXNlICdyZXF1aXJlZCc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMucmVxdWlyZWQ7XG4gICAgICAgIGNhc2UgJ21pbkRhdGUnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1pbkRhdGU7XG4gICAgICAgIGNhc2UgJ21heERhdGUnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1heERhdGU7XG4gICAgICAgIGNhc2UgJ2Rpc2FibGVkRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuZGlzYWJsZWREYXRlO1xuICAgICAgICBjYXNlICdpbnZhbGlkRGF0ZSc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuaW52YWxpZERhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuaW52YWxpZERhdGU7XG4gIH0sIFt2YWxpZGF0aW9uUmVzdWx0LmVycm9yLCBwYXJzZUVycm9yXSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi52YWxpZGF0aW9uUmVzdWx0LFxuICAgIGVycm9yTWVzc2FnZSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb247IiwgImltcG9ydCB0eXBlIHsgU3hQcm9wcywgVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgdXNlVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB1c2VEYXRlUGlja2VyU3R5bGVzIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyU3R5bGVzT3B0aW9ucyB7XG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGhhcyBhIHZhbGlkYXRpb24gZXJyb3IgKi9cbiAgaGFzRXJyb3I/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIGxvYWRpbmcgc3RhdGUgKi9cbiAgbG9hZGluZz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSB0ZXh0IGlucHV0IGlzIHJlYWQtb25seSAqL1xuICB0ZXh0UmVhZE9ubHk/OiBib29sZWFuO1xuICAvKiogQ3VzdG9tIHN0eWxlcyB0byBtZXJnZSB3aXRoIGRlZmF1bHRzICovXG4gIHN4PzogU3hQcm9wczxUaGVtZT47XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VEYXRlUGlja2VyU3R5bGVzIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyU3R5bGVzUmV0dXJuIHtcbiAgLyoqIENvbXB1dGVkIHN0eWxlcyBmb3IgdGhlIGRhdGUgcGlja2VyIGNvbXBvbmVudCAqL1xuICBzeDogU3hQcm9wczxUaGVtZT47XG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzIG5hbWVzIGZvciBzdHlsaW5nICovXG4gIGNsYXNzTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyB0aGVtZS1hd2FyZSBkYXRlIHBpY2tlciBzdHlsZXMgd2l0aCBjb25zaXN0ZW50IGRlc2lnbiBzeXN0ZW0gaW50ZWdyYXRpb25cbiAqIFxuICogVGhpcyBob29rIHByb3ZpZGVzIG9wdGltaXplZCwgbWVtb2l6ZWQgc3R5bGVzIGZvciBkYXRlIHBpY2tlciBjb21wb25lbnRzIHRoYXQgYXV0b21hdGljYWxseVxuICogYWRhcHQgdG8gdGhlIGN1cnJlbnQgTVVJIHRoZW1lIGFuZCBjb21wb25lbnQgc3RhdGUgKGRpc2FibGVkLCBlcnJvciwgbG9hZGluZywgZXRjLikuXG4gKiBJdCBlbnN1cmVzIGNvbnNpc3RlbnQgc3R5bGluZyBhY3Jvc3MgYWxsIGRhdGUgcGlja2VyIGluc3RhbmNlcyB3aGlsZSBhbGxvd2luZyBjdXN0b21pemF0aW9uLlxuICogXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc3ggfSA9IHVzZURhdGVQaWNrZXJTdHlsZXMoe1xuICogICBkaXNhYmxlZDogaXNEaXNhYmxlZCxcbiAqICAgaGFzRXJyb3I6ICEhZXJyb3IsXG4gKiAgIGxvYWRpbmc6IGlzTG9hZGluZ1xuICogfSk7XG4gKiBcbiAqIHJldHVybiA8RGF0ZVBpY2tlciBzeD17c3h9IC4uLiAvPjtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gc3R5bGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHN4IH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAqICAgaGFzRXJyb3I6ICEhZXJyb3IsXG4gKiAgIHN4OiB7XG4gKiAgICAgJyYgLk11aUlucHV0TGFiZWwtcm9vdCc6IHtcbiAqICAgICAgIGNvbG9yOiAncHJpbWFyeS5tYWluJ1xuICogICAgIH1cbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHBhcmFtIG9wdGlvbnMgLSBTdHlsZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIENvbXB1dGVkIHN0eWxlcyBhbmQgY2xhc3MgbmFtZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJTdHlsZXMoXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJTdHlsZXNPcHRpb25zID0ge31cbik6IFVzZURhdGVQaWNrZXJTdHlsZXNSZXR1cm4ge1xuICBjb25zdCB7IGRpc2FibGVkLCBoYXNFcnJvciwgbG9hZGluZywgdGV4dFJlYWRPbmx5LCBzeDogY3VzdG9tU3ggfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICAvLyBNZW1vaXplIGNvbXB1dGVkIHN0eWxlcyBmb3IgcGVyZm9ybWFuY2VcbiAgY29uc3QgY29tcHV0ZWRTeCA9IHVzZU1lbW8oKCk6IFN4UHJvcHM8VGhlbWU+ID0+IHtcbiAgICBjb25zdCBiYXNlU3R5bGVzOiBTeFByb3BzPFRoZW1lPiA9IHtcbiAgICAgIC8vIElucHV0IGZpZWxkIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290XCI6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCBcbiAgICAgICAgICA6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgXG4gICAgICAgIC8vIFRyYW5zaXRpb24gZm9yIHNtb290aCBzdGF0ZSBjaGFuZ2VzXG4gICAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZShbXG4gICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InLFxuICAgICAgICAgICdib3JkZXItY29sb3InLFxuICAgICAgICAgICdjb2xvcidcbiAgICAgICAgXSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydCxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gRXJyb3Igc3RhdGUgc3R5bGluZ1xuICAgICAgICAuLi4oaGFzRXJyb3IgJiYge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJyYuTXVpLWZvY3VzZWQnOiB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgICAgYm94U2hhZG93OiBgMCAwIDAgMnB4ICR7dGhlbWUucGFsZXR0ZS5lcnJvci5tYWlufTI1YCwgLy8gMjUgaXMgMTUlIG9wYWNpdHkgaW4gaGV4XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gTG9hZGluZyBzdGF0ZSBzdHlsaW5nXG4gICAgICAgIC4uLihsb2FkaW5nICYmIHtcbiAgICAgICAgICBvcGFjaXR5OiAwLjcsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIElucHV0IGVsZW1lbnQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dEJhc2UtaW5wdXRcIjoge1xuICAgICAgICBjdXJzb3I6IGRpc2FibGVkIFxuICAgICAgICAgID8gXCJub3QtYWxsb3dlZFwiIFxuICAgICAgICAgIDogdGV4dFJlYWRPbmx5IFxuICAgICAgICAgICAgPyBcInBvaW50ZXJcIiBcbiAgICAgICAgICAgIDogXCJ0ZXh0XCIsXG4gICAgICAgIFxuICAgICAgICAvLyBSZWFkLW9ubHkgc3BlY2lmaWMgc3R5bGluZ1xuICAgICAgICAuLi4odGV4dFJlYWRPbmx5ICYmICFkaXNhYmxlZCAmJiB7XG4gICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgICAgICB1c2VyU2VsZWN0OiBcIm5vbmVcIixcbiAgICAgICAgICBjYXJldENvbG9yOiBcInRyYW5zcGFyZW50XCIsIC8vIEhpZGUgdGV4dCBjdXJzb3IgaW4gcmVhZC1vbmx5IG1vZGVcbiAgICAgICAgfSksXG5cbiAgICAgICAgLy8gTG9hZGluZyBzdGF0ZVxuICAgICAgICAuLi4obG9hZGluZyAmJiB7XG4gICAgICAgICAgY3Vyc29yOiBcIndhaXRcIixcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBSZXF1aXJlZCBmaWVsZCBhc3RlcmlzayBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0TGFiZWwtYXN0ZXJpc2tcIjogeyBcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgZm9udFNpemU6IFwiMS4yZW1cIixcbiAgICAgIH0sXG5cbiAgICAgIC8vIExhYmVsIHN0eWxpbmcgd2l0aCBiZXR0ZXIgY29udHJhc3RcbiAgICAgIFwiJiAuTXVpSW5wdXRMYWJlbC1yb290XCI6IHtcbiAgICAgICAgY29sb3I6IGhhc0Vycm9yIFxuICAgICAgICAgID8gdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluIFxuICAgICAgICAgIDogdGhlbWUucGFsZXR0ZS50ZXh0LnNlY29uZGFyeSxcbiAgICAgICAgXG4gICAgICAgIC8vIEVuc3VyZSBwcm9wZXIgY29udHJhc3QgZm9yIGRpc2FibGVkIHN0YXRlXG4gICAgICAgIC4uLihkaXNhYmxlZCAmJiB7XG4gICAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUudGV4dC5kaXNhYmxlZCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBIZWxwZXIgdGV4dCBzdHlsaW5nXG4gICAgICBcIiYgLk11aUZvcm1IZWxwZXJUZXh0LXJvb3RcIjoge1xuICAgICAgICBtYXJnaW5MZWZ0OiB0aGVtZS5zcGFjaW5nKDEpLFxuICAgICAgICBtYXJnaW5SaWdodDogdGhlbWUuc3BhY2luZygxKSxcbiAgICAgICAgXG4gICAgICAgIC8vIEVycm9yIHN0YXRlXG4gICAgICAgIC4uLihoYXNFcnJvciAmJiB7XG4gICAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBDYWxlbmRhciBpY29uIHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRBZG9ybm1lbnQtcm9vdFwiOiB7XG4gICAgICAgIGNvbG9yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkIFxuICAgICAgICAgIDogaGFzRXJyb3IgXG4gICAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiBcbiAgICAgICAgICAgIDogdGhlbWUucGFsZXR0ZS5hY3Rpb24uYWN0aXZlLFxuICAgICAgfSxcblxuICAgICAgLy8gRm9jdXMgcmluZyBmb3IgYWNjZXNzaWJpbGl0eVxuICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWZvY3VzZWRcIjoge1xuICAgICAgICBvdXRsaW5lOiBgMnB4IHNvbGlkICR7dGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW59NTBgLCAvLyA1MCBpcyAzMSUgb3BhY2l0eVxuICAgICAgICBvdXRsaW5lT2Zmc2V0OiBcIjJweFwiLFxuICAgICAgfSxcblxuICAgICAgLy8gRW5oYW5jZWQgY29udHJhc3QgZm9yIGRhcmsgdGhlbWVzXG4gICAgICAuLi4odGhlbWUucGFsZXR0ZS5tb2RlID09PSAnZGFyaycgJiYge1xuICAgICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgLy8gTWVyZ2Ugd2l0aCBjdXN0b20gc3R5bGVzXG4gICAgcmV0dXJuIGN1c3RvbVN4ID8gW2Jhc2VTdHlsZXMsIGN1c3RvbVN4XSBhcyBTeFByb3BzPFRoZW1lPiA6IGJhc2VTdHlsZXM7XG4gIH0sIFtcbiAgICB0aGVtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBoYXNFcnJvcixcbiAgICBsb2FkaW5nLFxuICAgIHRleHRSZWFkT25seSxcbiAgICBjdXN0b21TeCxcbiAgXSk7XG5cbiAgLy8gR2VuZXJhdGUgYWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3IgZXh0ZXJuYWwgc3R5bGluZyBob29rc1xuICBjb25zdCBjbGFzc05hbWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIGlmIChkaXNhYmxlZCkgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tZGlzYWJsZWQnKTtcbiAgICBpZiAoaGFzRXJyb3IpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWVycm9yJyk7XG4gICAgaWYgKGxvYWRpbmcpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWxvYWRpbmcnKTtcbiAgICBpZiAodGV4dFJlYWRPbmx5KSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1yZWFkT25seScpO1xuICAgIFxuICAgIHJldHVybiBjbGFzc2VzLmxlbmd0aCA+IDAgPyBjbGFzc2VzLmpvaW4oJyAnKSA6IHVuZGVmaW5lZDtcbiAgfSwgW2Rpc2FibGVkLCBoYXNFcnJvciwgbG9hZGluZywgdGV4dFJlYWRPbmx5XSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzeDogY29tcHV0ZWRTeCxcbiAgICBjbGFzc05hbWUsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJTdHlsZXM7IiwgImltcG9ydCB0eXBlIHsgUGlja2VyVmFsaWREYXRlIH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnNcIjtcbmltcG9ydCB0eXBlIHsgdXNlTG9jYWxpemF0aW9uQ29udGV4dCB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFsc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFZhbHVlcywgRmllbGRQYXRoLCBQYXRoVmFsdWUgfSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIGZvciBjcmVhdGluZyBicmFuZGVkIGRhdGUgdHlwZXMgdG8gcHJldmVudCBtaXhpbmcgZGlmZmVyZW50IGRhdGUgZm9ybWF0c1xuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGJhc2UgZGF0ZSB0eXBlXG4gKiBAdGVtcGxhdGUgVEJyYW5kIC0gVGhlIGJyYW5kIHN0cmluZyBmb3IgdHlwZSBzYWZldHlcbiAqL1xuZXhwb3J0IHR5cGUgQnJhbmRlZERhdGU8VERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUsIFRCcmFuZCBleHRlbmRzIHN0cmluZz4gPSBcbiAgVERhdGUgJiB7IHJlYWRvbmx5IF9fYnJhbmQ6IFRCcmFuZCB9O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIGRhdGVcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSB2YWxpZCBkYXRlLWxpa2Ugb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFBpY2tlclZhbGlkRGF0ZSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIERhdGUgb2JqZWN0XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gIWlzTmFOKHZhbHVlLmdldFRpbWUoKSk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgZGF0ZS1saWtlIG9iamVjdHMgd2l0aCBjb21tb24gZGF0ZSBsaWJyYXJ5IG1ldGhvZHNcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAvLyBEYXkuanMsIE1vbWVudC5qcywgb3Igc2ltaWxhclxuICAgIGlmICgnaXNWYWxpZCcgaW4gdmFsdWUgJiYgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEx1eG9uIERhdGVUaW1lXG4gICAgaWYgKCdpc1ZhbGlkJyBpbiB2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkuaXNWYWxpZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuaXNWYWxpZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHBhcnNlZCBhcyBhIGRhdGVcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBwYXJzZWFibGUgZGF0ZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyc2FibGVEYXRlU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQmFzaWMgSVNPIGRhdGUgZm9ybWF0IGNoZWNrXG4gIGNvbnN0IGlzb0RhdGVSZWdleCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0oPzpUXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGR7M30pPyg/Olp8WystXVxcZHsyfTpcXGR7Mn0pPyk/JC87XG5cbiAgaWYgKGlzb0RhdGVSZWdleC50ZXN0KHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgRGF0ZSBjb25zdHJ1Y3RvciBjYW4gcGFyc2UgaXRcbiAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUodmFsdWUpO1xuXG4gIHJldHVybiAhaXNOYU4ocGFyc2VkLmdldFRpbWUoKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHR5cGUtc2FmZSBkYXRlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZm9ybSB2YWx1ZXMgdG8gZGF0ZSBwaWNrZXIgdmFsdWVzXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGUgdXNlZCBieSB0aGUgcGlja2VyXG4gKiBAcGFyYW0gYWRhcHRlciAtIFRoZSBkYXRlIGFkYXB0ZXIgZnJvbSBNVUkgbG9jYWxpemF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIEEgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBzYWZlbHkgY29udmVydHMgZm9ybSB2YWx1ZXMgdG8gZGF0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGVJbnB1dFRyYW5zZm9ybTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihhZGFwdGVyOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VMb2NhbGl6YXRpb25Db250ZXh0Pikge1xuICByZXR1cm4gKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pOiBURGF0ZSB8IG51bGwgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gYWRhcHRlci51dGlscy5kYXRlKHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gaXNWYWxpZERhdGUocGFyc2VkKSA/IChwYXJzZWQgYXMgVERhdGUpIDogbnVsbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNWYWxpZERhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgVERhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHR5cGUtc2FmZSBkYXRlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZGF0ZSBwaWNrZXIgdmFsdWVzIGJhY2sgdG8gZm9ybSB2YWx1ZXNcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZSB1c2VkIGJ5IHRoZSBwaWNrZXJcbiAqIEBwYXJhbSBmb3JtYXQgLSBUaGUgZm9ybWF0IHRvIHVzZSBmb3Igc3RyaW5nIGNvbnZlcnNpb24gKG9wdGlvbmFsKVxuICogQHJldHVybnMgQSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IHNhZmVseSBjb252ZXJ0cyBkYXRlcyB0byBmb3JtIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGF0ZU91dHB1dFRyYW5zZm9ybTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihmb3JtYXQ/OiBzdHJpbmcpIHtcbiAgcmV0dXJuICh2YWx1ZTogVERhdGUgfCBudWxsKTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+ID0+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIGlmICghaXNWYWxpZERhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gZm9ybWF0IHNwZWNpZmllZCwgcmV0dXJuIHRoZSBkYXRlIGFzLWlzXG4gICAgaWYgKCFmb3JtYXQpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgZGF0ZSBsaWJyYXJ5IGZvcm1hdHNcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2lzbycpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGF0ZS1vbmx5Jykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF0gYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERheS5qcyBmb3JtYXRcbiAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSkuZm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5mb3JtYXQoZm9ybWF0KSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICB9XG5cbiAgICAgIC8vIE1vbWVudC5qcyBmb3JtYXRcbiAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSkuZm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgYW55KS5mb3JtYXQoZm9ybWF0KSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICB9XG5cbiAgICAgIC8vIEx1eG9uIGZvcm1hdFxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUgYXMgYW55KS50b0Zvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkudG9Gb3JtYXQoZm9ybWF0KSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICB9XG5cbiAgICAgIC8vIEZhbGxiYWNrOiByZXR1cm4gYXMtaXNcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGRlZmF1bHQgZGF0ZSBwaWNrZXIgY29uZmlndXJhdGlvblxuICogQHRlbXBsYXRlIFREYXRlIC0gVGhlIGRhdGUgdHlwZVxuICogQHJldHVybnMgRGVmYXVsdCBjb25maWd1cmF0aW9uIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdERhdGVQaWNrZXJDb25maWc8VERhdGUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGU+KCkge1xuICByZXR1cm4ge1xuICAgIC8vIERlZmF1bHQgc2xvdCBwcm9wcyBmb3IgY29uc2lzdGVudCBiZWhhdmlvclxuICAgIHNsb3RQcm9wczoge1xuICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgIGFjdGlvbnM6IFsnY2xlYXInLCAndG9kYXknLCAnY2FuY2VsJywgJ2FjY2VwdCddIGFzIGNvbnN0LFxuICAgICAgfSxcbiAgICAgIHRleHRGaWVsZDoge1xuICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgIHZhcmlhbnQ6ICdvdXRsaW5lZCcgYXMgY29uc3QsXG4gICAgICB9LFxuICAgIH0sXG4gICAgXG4gICAgLy8gRGVmYXVsdCBncmlkIHByb3BzIGZvciBsYXlvdXQgY29uc2lzdGVuY3lcbiAgICBncmlkUHJvcHM6IHtcbiAgICAgIHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSBhcyBjb25zdCxcbiAgICB9LFxuICAgIFxuICAgIC8vIERlZmF1bHQgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uXG4gICAgdmFsaWRhdGlvbjoge1xuICAgICAgZXJyb3JNZXNzYWdlczoge1xuICAgICAgICBpbnZhbGlkRGF0ZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIsXG4gICAgICAgIG1pbkRhdGU6IFwiRGF0ZSBtdXN0IGJlIGFmdGVyIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICAgICAgICBtYXhEYXRlOiBcIkRhdGUgbXVzdCBiZSBiZWZvcmUgdGhlIG1heGltdW0gYWxsb3dlZCBkYXRlXCIsXG4gICAgICAgIGRpc2FibGVkRGF0ZTogXCJUaGlzIGRhdGUgaXMgbm90IGFsbG93ZWRcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgfSBhcyBjb25zdDtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IHRvIHNhZmVseSBleHRyYWN0IGVycm9yIG1lc3NhZ2UgZnJvbSB2YXJpb3VzIGVycm9yIHR5cGVzXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3Igb2JqZWN0IChjb3VsZCBiZSBmcm9tIHJlYWN0LWhvb2stZm9ybSBvciBNVUkgZGF0ZSBwaWNrZXIpXG4gKiBAcmV0dXJucyBBIHVzZXItZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RFcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwpIHtcbiAgICAvLyBSZWFjdCBIb29rIEZvcm0gRmllbGRFcnJvclxuICAgIGlmICgnbWVzc2FnZScgaW4gZXJyb3IgJiYgdHlwZW9mIChlcnJvciBhcyBhbnkpLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gKGVycm9yIGFzIGFueSkubWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBNVUkgRGF0ZVZhbGlkYXRpb25FcnJvclxuICAgIGlmICgndHlwZScgaW4gZXJyb3IgJiYgdHlwZW9mIChlcnJvciBhcyBhbnkpLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSAoZXJyb3IgYXMgYW55KS50eXBlO1xuXG4gICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICBjYXNlICdpbnZhbGlkRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlJztcbiAgICAgICAgY2FzZSAnbWluRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdEYXRlIGlzIHRvbyBlYXJseSc7XG4gICAgICAgIGNhc2UgJ21heERhdGUnOlxuICAgICAgICAgIHJldHVybiAnRGF0ZSBpcyB0b28gbGF0ZSc7XG4gICAgICAgIGNhc2UgJ2Rpc2FibGVkRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuICdUaGlzIGRhdGUgaXMgbm90IGF2YWlsYWJsZSc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICdJbnZhbGlkIGRhdGUgc2VsZWN0aW9uJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ0ludmFsaWQgaW5wdXQnO1xufVxuXG4vKipcbiAqIFBlcmZvcm1hbmNlIHV0aWxpdHkgdG8gY3JlYXRlIHN0YWJsZSByZWZlcmVuY2VzIGZvciBjb21wbGV4IHByb3BzXG4gKiBUaGlzIGhlbHBzIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVycyB3aGVuIHVzaW5nIGNvbXBsZXggY29uZmlndXJhdGlvbiBvYmplY3RzXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHBhcmFtIGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICogQHJldHVybnMgQSBKU09OIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZGVwZW5kZW5jeSBpbiB1c2VNZW1vL3VzZUNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGFibGVLZXk8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pihjb25maWc6IFQpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShjb25maWcsIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAvLyBTb3J0IG9iamVjdCBrZXlzIGZvciBjb25zaXN0ZW50IHNlcmlhbGl6YXRpb25cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBzb3J0ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgIHNvcnRlZFtrXSA9ICh2YWx1ZSBhcyBhbnkpW2tdO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc29ydGVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc2VyaWFsaXphYmxlIG9iamVjdHNcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5zb3J0KCkuam9pbignLScpO1xuICB9XG59IiwgImltcG9ydCBWaXNpYmlsaXR5IGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvVmlzaWJpbGl0eSc7XG5pbXBvcnQgVmlzaWJpbGl0eU9mZiBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL1Zpc2liaWxpdHlPZmYnO1xuaW1wb3J0IHR5cGUgeyBJY29uQnV0dG9uUHJvcHMsIFRleHRGaWVsZFByb3BzLCBHcmlkUHJvcHMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIEljb25CdXR0b24sXG4gIElucHV0QWRvcm5tZW50LFxuICBUZXh0RmllbGQsXG4gIHVzZUZvcmtSZWYsXG4gIEdyaWQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBNb3VzZUV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFBhc3N3b3JkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBQYXNzd29yZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPiA9IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJyB8ICdzaXplJz4gJiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcInBhc3N3b3JkXCIgfCBcInVzZXIuY3VycmVudFBhc3N3b3JkXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIENvbG9yIG9mIHRoZSB2aXNpYmlsaXR5IHRvZ2dsZSBpY29uIGJ1dHRvblxuICAgKiBAZGVmYXVsdFZhbHVlIFwiZGVmYXVsdFwiXG4gICAqL1xuICBpY29uQ29sb3I/OiBJY29uQnV0dG9uUHJvcHNbJ2NvbG9yJ107XG4gIC8qKlxuICAgKiBDdXN0b20gcmVuZGVyIGZ1bmN0aW9uIGZvciB0aGUgdmlzaWJpbGl0eSB0b2dnbGUgaWNvblxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBXaGV0aGVyIHBhc3N3b3JkIGlzIGN1cnJlbnRseSBoaWRkZW5cbiAgICogQHJldHVybnMgUmVhY3ROb2RlIHRvIHJlbmRlciBhcyB0aGUgaWNvblxuICAgKiBAZGVmYXVsdFZhbHVlIERlZmF1bHQgdmlzaWJpbGl0eS92aXNpYmlsaXR5LW9mZiBpY29uc1xuICAgKi9cbiAgcmVuZGVySWNvbj86IChwYXNzd29yZDogYm9vbGVhbikgPT4gUmVhY3ROb2RlO1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuXG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBQYXNzd29yZEVsPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBQYXNzd29yZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgaWNvbkNvbG9yLFxuICAgIHJlbmRlckljb24gPSBwYXNzd29yZCA9PiAocGFzc3dvcmQgPyA8VmlzaWJpbGl0eSAvPiA6IDxWaXNpYmlsaXR5T2ZmIC8+KSxcbiAgICBzbG90UHJvcHMsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGlucHV0UmVmLFxuICAgIG9uQmx1cixcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBbcGFzc3dvcmQsIHNldFBhc3N3b3JkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KHRydWUpO1xuXG4gIGNvbnN0IGVuZEFkb3JubWVudCA9IChcbiAgICA8SW5wdXRBZG9ybm1lbnQgcG9zaXRpb249eydlbmQnfT5cbiAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgIG9uTW91c2VEb3duPXsoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IGUucHJldmVudERlZmF1bHQoKX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0UGFzc3dvcmQoIXBhc3N3b3JkKX1cbiAgICAgICAgdGFiSW5kZXg9ey0xfVxuICAgICAgICBjb2xvcj17aWNvbkNvbG9yID8/ICdkZWZhdWx0J31cbiAgICAgID5cbiAgICAgICAge3JlbmRlckljb24ocGFzc3dvcmQpfVxuICAgICAgPC9JY29uQnV0dG9uPlxuICAgIDwvSW5wdXRBZG9ybm1lbnQ+XG4gICk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZFxuICAgICAgey4uLnJlc3R9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB0eXBlPXtwYXNzd29yZCA/ICdwYXNzd29yZCcgOiAndGV4dCd9XG4gICAgICB2YWx1ZT17ZmllbGQudmFsdWUgPz8gJyd9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHZhcmlhbnQ9e3Jlc3QudmFyaWFudCA/PyAnb3V0bGluZWQnfVxuICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXN0Lm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgey4uLih0eXBlb2Ygc2xvdFByb3BzID09PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIElucHV0UHJvcHM6IHtcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgc2xvdFByb3BzOiB7XG4gICAgICAgICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgICAgICAgLi4uc2xvdFByb3BzPy5pbnB1dCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0gYXMgVGV4dEZpZWxkUHJvcHNbJ3Nsb3RQcm9wcyddLFxuICAgICAgICAgIH0pfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIHBhc3N3b3JkIFRleHRGaWVsZCB3aXRoIHNob3cvaGlkZSBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBwYXNzd29yZCBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgYSBidWlsdC1pbiB2aXNpYmlsaXR5IHRvZ2dsZSBidXR0b24uIFRoZSBwYXNzd29yZFxuICogY2FuIGJlIHNob3duIG9yIGhpZGRlbiBieSBjbGlja2luZyB0aGUgZXllIGljb24gaW4gdGhlIGlucHV0J3MgZW5kIGFkb3JubWVudC5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gUGFzc3dvcmQgdmlzaWJpbGl0eSB0b2dnbGVcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gQ3VzdG9taXphYmxlIHZpc2liaWxpdHkgaWNvbnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN1cHBvcnRcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInBhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJQYXNzd29yZFwiXG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdQYXNzd29yZCBpcyByZXF1aXJlZCcsXG4gKiAgICAgbWluTGVuZ3RoOiB7IHZhbHVlOiA4LCBtZXNzYWdlOiAnTWluaW11bSA4IGNoYXJhY3RlcnMnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gaWNvbiBjb2xvcjpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiY29uZmlybVBhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJDb25maXJtIFBhc3N3b3JkXCJcbiAqICAgaWNvbkNvbG9yPVwicHJpbWFyeVwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiUmUtZW50ZXIgeW91ciBwYXNzd29yZFwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwibmV3UGFzc3dvcmRcIlxuICogICBsYWJlbD1cIk5ldyBQYXNzd29yZFwiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICByZW5kZXJJY29uPXsoaGlkZGVuKSA9PiBoaWRkZW4gPyA8Q3VzdG9tSGlkZUljb24gLz4gOiA8Q3VzdG9tU2hvd0ljb24gLz59XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBQYXNzd29yZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG5cbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5leHBvcnQgeyBQYXNzd29yZEVsZW1lbnQgfTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEZvcm1Db250cm9sTGFiZWxQcm9wcyxcbiAgRm9ybUxhYmVsUHJvcHMsXG4gIFJhZGlvR3JvdXBQcm9wcyxcbiAgUmFkaW9Qcm9wcyxcbiAgR3JpZFByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgRm9ybUxhYmVsLFxuICBSYWRpbyxcbiAgUmFkaW9Hcm91cCxcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50T3JWYWx1ZSB9IGZyb20gJy4uLy4uL3R5cGVzL2V2ZW50cyc7XG5cbi8vIFR5cGUgZm9yIHByaW1pdGl2ZSB2YWx1ZXMgdGhhdCBjYW4gYmUgdXNlZCBhcyByYWRpbyBidXR0b24gdmFsdWVzXG50eXBlIFByaW1pdGl2ZVZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuLy8gQ29uc3RyYWludCB0byBlbnN1cmUgb3B0aW9uIG9iamVjdHMgaGF2ZSB0aGUgcmVxdWlyZWQga2V5c1xudHlwZSBPcHRpb25PYmplY3Q8XG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0gUmVjb3JkPFRWYWx1ZUtleSwgUHJpbWl0aXZlVmFsdWU+ICZcbiAgUmVjb3JkPFRMYWJlbEtleSwgc3RyaW5nPiAmXG4gIFBhcnRpYWw8UmVjb3JkPFREaXNhYmxlZEtleSwgYm9vbGVhbj4+IDtcblxuZXhwb3J0IGludGVyZmFjZSBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5LFxuICAgIFREaXNhYmxlZEtleVxuICA+ID0gT3B0aW9uT2JqZWN0LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2lkJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdsYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzICBzdHJpbmcgPSAnZGlzYWJsZWQnLFxuPiB7XG4gIG9wdGlvbnM6IFRPcHRpb25bXTtcbiAgaGVscGVyVGV4dD86IFJlYWN0Tm9kZTtcbiAgbmFtZTogVE5hbWU7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xuICBsYWJlbD86IHN0cmluZztcbiAgbGFiZWxLZXk/OiBUTGFiZWxLZXk7XG4gIHZhbHVlS2V5PzogVFZhbHVlS2V5O1xuICBkaXNhYmxlZEtleT86IFREaXNhYmxlZEtleTtcbiAgdHlwZT86ICdudW1iZXInIHwgJ3N0cmluZycgfCAnYm9vbGVhbic7XG4gIGVtcHR5T3B0aW9uTGFiZWw/OiBzdHJpbmc7XG4gIG9uQ2hhbmdlPzogKHZhbHVlOiBUT3B0aW9uW1RWYWx1ZUtleV0gfCBUT3B0aW9uIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuICByZXR1cm5PYmplY3Q/OiBib29sZWFuO1xuICByb3c/OiBib29sZWFuO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBsYWJlbFByb3BzPzogT21pdDxGb3JtQ29udHJvbExhYmVsUHJvcHMsICdsYWJlbCcgfCAnY29udHJvbCcgfCAndmFsdWUnPjtcbiAgZm9ybUxhYmVsUHJvcHM/OiBPbWl0PEZvcm1MYWJlbFByb3BzLCAncmVxdWlyZWQnIHwgJ2Vycm9yJz47XG4gIHJhZGlvUHJvcHM/OiBSYWRpb1Byb3BzO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHRyYW5zZm9ybT86IHtcbiAgICBpbnB1dD86ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiBUT3B0aW9uW1RWYWx1ZUtleV07XG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gUmFkaW9CdXR0b25Hcm91cDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID4gPSBPcHRpb25PYmplY3QsXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdpZCcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdsYWJlbCcsXG4gIFREaXNhYmxlZEtleSBleHRlbmRzIHN0cmluZyA9ICdkaXNhYmxlZCcsXG4+KFxuICBwcm9wczogUmFkaW9CdXR0b25Hcm91cFByb3BzPFxuICAgIFRGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSxcbiAgICBUT3B0aW9uLFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVERpc2FibGVkS2V5XG4gID5cbikge1xuICBjb25zdCB7XG4gICAgb3B0aW9ucyxcbiAgICBsYWJlbCxcbiAgICBuYW1lLFxuICAgIGxhYmVsS2V5ID0gJ2xhYmVsJyBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVLZXkgPSAnaWQnIGFzIFRWYWx1ZUtleSxcbiAgICBkaXNhYmxlZEtleSA9ICdkaXNhYmxlZCcgYXMgVERpc2FibGVkS2V5LFxuICAgIHJlcXVpcmVkLFxuICAgIGVtcHR5T3B0aW9uTGFiZWwsXG4gICAgcmV0dXJuT2JqZWN0LFxuICAgIHJvdyA9IHRydWUsXG4gICAgY29udHJvbCxcbiAgICB0eXBlLFxuICAgIGxhYmVsUHJvcHMsXG4gICAgZGlzYWJsZWQsXG4gICAgZm9ybUxhYmVsUHJvcHMsXG4gICAgcmFkaW9Qcm9wcyxcbiAgICB0cmFuc2Zvcm0sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZVRyYW5zZm9ybTxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVE9wdGlvbltUVmFsdWVLZXldIHwgVE9wdGlvblxuICA+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIHx8ICgnJyBhcyBUT3B0aW9uW1RWYWx1ZUtleV0pO1xuICAgICAgICAgICAgfSxcbiAgICAgIG91dHB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8ub3V0cHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB0cmFuc2Zvcm0/Lm91dHB1dFxuICAgICAgICAgIDogKF9ldmVudCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHZhbHVlKSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBvblJhZGlvQ2hhbmdlOiBSYWRpb0dyb3VwUHJvcHNbJ29uQ2hhbmdlJ10gPSAoZXZlbnQsIHJhZGlvVmFsdWUpID0+IHtcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHJldHVybk9iamVjdFxuICAgICAgPyAob3B0aW9ucyBhcyBUT3B0aW9uW10pLmZpbmQob3B0aW9uID0+IG9wdGlvblt2YWx1ZUtleV0gPT09IHJhZGlvVmFsdWUpXG4gICAgICA6IChyYWRpb1ZhbHVlIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG5cbiAgICBvbkNoYW5nZShldmVudCwgcmV0dXJuVmFsdWUpO1xuICAgIGlmICh0eXBlb2YgcmVzdC5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVzdC5vbkNoYW5nZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxGb3JtTGFiZWwgey4uLmZvcm1MYWJlbFByb3BzfSByZXF1aXJlZD17cmVxdWlyZWR9IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvRm9ybUxhYmVsPlxuICAgICAgKX1cbiAgICAgIDxSYWRpb0dyb3VwIG9uQ2hhbmdlPXtvblJhZGlvQ2hhbmdlfSBuYW1lPXtuYW1lfSByb3c9e3Jvd30gdmFsdWU9e3ZhbHVlfT5cbiAgICAgICAge2VtcHR5T3B0aW9uTGFiZWwgJiYgKFxuICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICBjaGVja2VkPXshdmFsdWV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYWJlbD17ZW1wdHlPcHRpb25MYWJlbH1cbiAgICAgICAgICAgIHZhbHVlPVwiXCJcbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICB7b3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb25bdmFsdWVLZXldO1xuICAgICAgICAgIGNvbnN0IG9wdGlvbkRpc2FibGVkID0gb3B0aW9uW2Rpc2FibGVkS2V5XSB8fCBmYWxzZTtcbiAgICAgICAgICBsZXQgdmFsOiBUT3B0aW9uW1RWYWx1ZUtleV0gfCB1bmRlZmluZWQgPSByZXR1cm5PYmplY3RcbiAgICAgICAgICAgID8gKHZhbHVlIGFzIFRPcHRpb24pPy5bdmFsdWVLZXldXG4gICAgICAgICAgICA6ICh2YWx1ZSBhcyBUT3B0aW9uW1RWYWx1ZUtleV0pO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBOdW1iZXIodmFsKSBhcyBUT3B0aW9uW1RWYWx1ZUtleV07XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicgJiYgdmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbCA9IEJvb2xlYW4odmFsKSBhcyBUT3B0aW9uW1RWYWx1ZUtleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaXNDaGVja2VkID0gdmFsID09PSBvcHRpb25LZXk7XG5cbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEZvcm1Db250cm9sTGFiZWxcbiAgICAgICAgICAgICAga2V5PXtTdHJpbmcob3B0aW9uS2V5KX1cbiAgICAgICAgICAgICAgey4uLmxhYmVsUHJvcHN9XG4gICAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICAgIDxSYWRpb1xuICAgICAgICAgICAgICAgICAgey4uLnJhZGlvUHJvcHN9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgb3B0aW9uRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0NoZWNrZWR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uS2V5fVxuICAgICAgICAgICAgICBsYWJlbD17b3B0aW9uW2xhYmVsS2V5XX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICB7ZXJyb3IgJiYgPEZvcm1IZWxwZXJUZXh0PntlcnJvci5tZXNzYWdlfTwvRm9ybUhlbHBlclRleHQ+fVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG5jb25zdCBSYWRpb0J1dHRvbkdyb3VwID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdpZCcsXG4gIFRMYWJlbEtleSBleHRlbmRzICBzdHJpbmcgPSAnbGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVE9wdGlvbixcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFREaXNhYmxlZEtleVxuPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQ8XG4gICAgICAgIFRGaWVsZFZhbHVlcyxcbiAgICAgICAgVE5hbWUsXG4gICAgICAgIFRPcHRpb24sXG4gICAgICAgIFRWYWx1ZUtleSxcbiAgICAgICAgVExhYmVsS2V5LFxuICAgICAgICBURGlzYWJsZWRLZXlcbiAgICAgID5cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5SYWRpb0J1dHRvbkdyb3VwLmRpc3BsYXlOYW1lID0gJ1JhZGlvQnV0dG9uR3JvdXAnO1xuXG5leHBvcnQgeyBSYWRpb0J1dHRvbkdyb3VwIH07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIFRleHRGaWVsZCwgQXV0b2NvbXBsZXRlIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyB1c2VUaGVtZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCB7IHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuZXhwb3J0IHR5cGUgU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPixcbiAgfCAnbmFtZSdcbiAgfCAncmVuZGVySW5wdXQnXG4gIHwgJ2lzT3B0aW9uRXF1YWxUb1ZhbHVlJ1xuICB8ICdnZXRPcHRpb25MYWJlbCdcbiAgfCAnZGlzYWJsZWQnXG4+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgZGVwZW5kc09uOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBpc051bGxhYmxlPzogYm9vbGVhbjtcbiAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZD86IGJvb2xlYW47XG4gIGxhYmVsRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICB2YWx1ZUZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICBvcHRpb25zPzogcmVhZG9ubHkgVE9wdGlvbltdIHwgbnVsbDtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdENhc2NhZGVFbGVtZW50PFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFRPcHRpb24sIFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcbiAgY29uc3Qge1xuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnLFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnLFxuICAgIG5hbWUsXG4gICAgb25CbHVyLFxuICAgIG9uQ2hhbmdlLFxuICAgIGRpc2FibGVkLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNJbnB1dCxcbiAgICBjb250cm9sLFxuICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBsYWJlbCxcbiAgICBkZXBlbmRzT24sXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIGlzTnVsbGFibGUgPSBmYWxzZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkID0gZmFsc2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCwgLi4ucmVzdFRleHRQcm9wcyB9ID0gdGV4dEZpZWxkUHJvcHM7XG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnNJbnB1dCB8fCBbXSwgW29wdGlvbnNJbnB1dF0pO1xuXG4gIGNvbnN0IGdldE9wdGlvbktleSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb24gPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgICAgY29uc3Qga2V5ID0gb3B0aW9uID8gb3B0aW9uW3ZhbHVlRmllbGQgYXMga2V5b2YgVE9wdGlvbl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXkgIT09IG51bGwgPyBTdHJpbmcoa2V5KSA6ICcnO1xuICAgIH0sXG4gICAgW3ZhbHVlRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGQgYXMga2V5b2YgVE9wdGlvbl0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxGaWVsZF1cbiAgKTtcblxuICBjb25zdCBpc09wdGlvbkVxdWFsVG9WYWx1ZSA9IChvcHRpb246IFRPcHRpb24sIHZhbHVlOiBUT3B0aW9uKSA9PlxuICAgIGdldE9wdGlvbktleShvcHRpb24pID09PSBnZXRPcHRpb25LZXkodmFsdWUpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgZmllbGQ6IGRlcGVuZGVudEZpZWxkIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lOiBkZXBlbmRzT24sXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgcGFyZW50VmFsdWVSZWYgPSB1c2VSZWYoZGVwZW5kZW50RmllbGQudmFsdWUpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHBhcmVudFZhbHVlUmVmLmN1cnJlbnQgIT09IGRlcGVuZGVudEZpZWxkLnZhbHVlKSB7XG4gICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgIHBhcmVudFZhbHVlUmVmLmN1cnJlbnQgPSBkZXBlbmRlbnRGaWVsZC52YWx1ZTtcbiAgICB9XG4gIH0sIFtkZXBlbmRlbnRGaWVsZC52YWx1ZSwgZmllbGRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlRGVmYXVsdFNlbGVjdGVkICYmIG9wdGlvbnMubGVuZ3RoID09PSAxICYmIGZpZWxkLnZhbHVlICE9IG51bGwpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgIH1cbiAgfSwgW2Rpc2FibGVEZWZhdWx0U2VsZWN0ZWQsIG9wdGlvbnMubGVuZ3RoXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYXNWYWx1ZSA9XG4gICAgICBmaWVsZC52YWx1ZSAhPT0gbnVsbCAmJiBmaWVsZC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpZWxkLnZhbHVlICE9PSAnJztcblxuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaGFzVmFsdWUgJiYgIWRpc2FibGVEZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgZmllbGQub25DaGFuZ2UoZ2V0T3B0aW9uS2V5KG9wdGlvbnNbMF0pKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXG4gICAgb3B0aW9ucyxcbiAgICBkaXNhYmxlZCxcbiAgICBnZXRPcHRpb25LZXksXG4gICAgZmllbGQub25DaGFuZ2UsXG4gICAgZGVwZW5kZW50RmllbGQudmFsdWUsXG4gICAgZGlzYWJsZURlZmF1bHRTZWxlY3RlZCxcbiAgXSk7XG5cbiAgY29uc3QgaXNEaXNhYmxlZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW50RmllbGQudmFsdWUgPT09IG51bGwgfHxcbiAgICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGRlcGVuZGVudEZpZWxkLnZhbHVlID09PSAnJ1xuICAgIClcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFpc051bGxhYmxlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFtcbiAgICBkaXNhYmxlZCxcbiAgICBkZXBlbmRlbnRGaWVsZC52YWx1ZSxcbiAgICBvcHRpb25zLmxlbmd0aCxcbiAgICBpc051bGxhYmxlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQsXG4gIF0pO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICB2YWx1ZT17XG4gICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAubWFwKG9wdGlvbiA9PiAoZ2V0T3B0aW9uS2V5KG9wdGlvbikgPT09IGZpZWxkLnZhbHVlID8gb3B0aW9uIDogbnVsbCkpXG4gICAgICAgICAgLmZpbmQoQm9vbGVhbikgfHwgbnVsbFxuICAgICAgfVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICBnZXRPcHRpb25LZXk9e2dldE9wdGlvbktleX1cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXtpc09wdGlvbkVxdWFsVG9WYWx1ZX1cbiAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICBzeD17e1xuICAgICAgICAnJi5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlJbnB1dEJhc2Utcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmLk11aS1kaXNhYmxlZCAuTXVpQXV0b2NvbXBsZXRlLXBvcHVwSW5kaWNhdG9yJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCAuTXVpT3V0bGluZWRJbnB1dC1ub3RjaGVkT3V0bGluZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUZpbGxlZElucHV0LXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAgIG9uQ2hhbmdlPXsoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pID0+IHtcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUgPyBnZXRPcHRpb25LZXkobmV3VmFsdWUpIDogbnVsbCk7XG4gICAgICAgIGlmIChvbkNoYW5nZSAmJiB0eXBlb2Ygb25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkNoYW5nZShldmVudCwgbmV3VmFsdWUsIHJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RDYXNjYWRlRWxlbWVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZVxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuU2VsZWN0Q2FzY2FkZUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0Q2FzY2FkZUVsZW1lbnQnO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlVmFsdWUsXG4gIEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIFRleHRGaWVsZCwgQXV0b2NvbXBsZXRlIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyB1c2VUaGVtZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvc3R5bGVzJztcbmltcG9ydCB7IHVzZU1lbW8sIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmV4cG9ydCB0eXBlIFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPixcbiAgfCAnbmFtZSdcbiAgfCAncmVuZGVySW5wdXQnXG4gIHwgJ2lzT3B0aW9uRXF1YWxUb1ZhbHVlJ1xuICB8ICdnZXRPcHRpb25MYWJlbCdcbiAgfCAnZGlzYWJsZWQnXG4gIHwgJ29wdGlvbnMnXG4+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgaXNOdWxsYWJsZT86IGJvb2xlYW47XG4gIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQ/OiBib29sZWFuO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGxhYmVsRmllbGQ/OiBzdHJpbmc7XG4gIHZhbHVlRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIG9wdGlvbnM/OiByZWFkb25seSBUT3B0aW9uW10gfCBudWxsO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gU2VsZWN0RWxlbWVudDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KFxuICBwcm9wczogU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pIHtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNJbnB1dCxcbiAgICBsYWJlbCxcbiAgICB2YXJpYW50LFxuICAgIGRpc2FibGVkLFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIGtleW9mIFRPcHRpb24sXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScgYXMga2V5b2YgVE9wdGlvbixcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIGlzTnVsbGFibGUgPSBmYWxzZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkID0gZmFsc2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCwgLi4ucmVzdFRleHRQcm9wcyB9ID0gdGV4dEZpZWxkUHJvcHM7XG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnNJbnB1dCB8fCBbXSwgW29wdGlvbnNJbnB1dF0pO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3ZhbHVlRmllbGQgYXMga2V5b2YgVE9wdGlvbl0gOiBudWxsO1xuICAgIH0sXG4gICAgW3ZhbHVlRmllbGRdXG4gICk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uTGFiZWwgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBUT3B0aW9uIHwgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmc8RnJlZVNvbG8+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGQgYXMga2V5b2YgVE9wdGlvbl0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxGaWVsZF1cbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlRGVmYXVsdFNlbGVjdGVkICYmIG9wdGlvbnMubGVuZ3RoID09PSAxICYmIGZpZWxkLnZhbHVlICE9IG51bGwpIHtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG51bGwpO1xuICAgIH1cbiAgfSwgW2Rpc2FibGVEZWZhdWx0U2VsZWN0ZWQsIG9wdGlvbnMubGVuZ3RoXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYXNWYWx1ZSA9XG4gICAgICBmaWVsZC52YWx1ZSAhPT0gbnVsbCAmJiBmaWVsZC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpZWxkLnZhbHVlICE9PSAnJztcblxuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMSAmJiAhaGFzVmFsdWUgJiYgIWRpc2FibGVEZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgZmllbGQub25DaGFuZ2UoZ2V0T3B0aW9uVmFsdWUob3B0aW9uc1swXSkpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtcbiAgICBvcHRpb25zLFxuICAgIGRpc2FibGVkLFxuICAgIGdldE9wdGlvblZhbHVlLFxuICAgIGZpZWxkLm9uQ2hhbmdlLFxuICAgIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQsXG4gIF0pO1xuXG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFpc051bGxhYmxlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZCwgb3B0aW9ucy5sZW5ndGgsIGlzTnVsbGFibGUsIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWRdKTtcblxuICBjb25zdCBhdXRvY29tcGxldGVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG9wdGlvbnMuZmluZChvcHRpb24gPT4gZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZmllbGQudmFsdWUpID8/IG51bGwsXG4gICAgW2ZpZWxkLnZhbHVlLCBvcHRpb25zLCBnZXRPcHRpb25WYWx1ZV1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIHsuLi5yZXN0fVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zPXtmYWxzZX1cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICB2YWx1ZT17XG4gICAgICAgIGF1dG9jb21wbGV0ZVZhbHVlIGFzIEF1dG9jb21wbGV0ZVZhbHVlPFxuICAgICAgICAgIFRPcHRpb24sXG4gICAgICAgICAgTXVsdGlwbGUsXG4gICAgICAgICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICAgICAgICBGcmVlU29sb1xuICAgICAgICA+XG4gICAgICB9XG4gICAgICBvbkNoYW5nZT17KGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IG5ld1ZhbHVlIGFzIFRPcHRpb24gfCBudWxsO1xuXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG9wdGlvbiA/IGdldE9wdGlvblZhbHVlKG9wdGlvbikgOiBudWxsKTtcbiAgICAgICAgb25DaGFuZ2U/LihldmVudCwgbmV3VmFsdWUsIHJlYXNvbik7XG4gICAgICB9fVxuICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICBzeD17e1xuICAgICAgICAnJi5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlJbnB1dEJhc2Utcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmLk11aS1kaXNhYmxlZCAuTXVpQXV0b2NvbXBsZXRlLXBvcHVwSW5kaWNhdG9yJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCAuTXVpT3V0bGluZWRJbnB1dC1ub3RjaGVkT3V0bGluZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUZpbGxlZElucHV0LXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtvcHRpb24gPT4gZ2V0T3B0aW9uTGFiZWwob3B0aW9uKX1cbiAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQXV0b2NvbXBsZXRlIGNvbXBvbmVudCBmb3Igc2VsZWN0aW5nIGZyb20gcHJlZGVmaW5lZCBvcHRpb25zLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBzZWxlY3QvYXV0b2NvbXBsZXRlIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0sIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqIGZvciByZXNwb25zaXZlIGxheW91dHMuIEl0IHN1cHBvcnRzIGJvdGggc2luZ2xlIGFuZCBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZXMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9jb21wbGV0ZSB3aXRoIGZpbHRlcmluZ1xuICogLSBTaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBzdXBwb3J0XG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSBvcHRpb24gZGlzcGxheSAobGFiZWxLZXkvdmFsdWVLZXkpXG4gKiAtIEF1dG8tc2VsZWN0aW9uIHdoZW4gb25seSBvbmUgb3B0aW9uIGV4aXN0c1xuICogLSBHcmlkIGxheW91dCB3cmFwcGVyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImNhdGVnb3J5XCJcbiAqICAgbGFiZWw9XCJDYXRlZ29yeVwiXG4gKiAgIG9wdGlvbnM9e1tcbiAqICAgICB7IExhYmVsOiAnVGVjaG5vbG9neScsIFZhbHVlOiAndGVjaCcgfVxuICogICBdfVxuICogICBydWxlcz17eyByZXF1aXJlZDogJ1BsZWFzZSBzZWxlY3QgYSBjYXRlZ29yeScgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20ga2V5czpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJJZFwiXG4gKiAgIGxhYmVsPVwiQXNzaWduIHRvIFVzZXJcIlxuICogICBvcHRpb25zPXt1c2Vyc31cbiAqICAgbGFiZWxLZXk9XCJmdWxsTmFtZVwiXG4gKiAgIHZhbHVlS2V5PVwiaWRcIlxuICogICBwbGFjZWhvbGRlcj1cIkNob29zZSBhIHVzZXIuLi5cIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBNdWx0aXBsZSBzZWxlY3Rpb246XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ0YWdzXCJcbiAqICAgbGFiZWw9XCJUYWdzXCJcbiAqICAgb3B0aW9ucz17YXZhaWxhYmxlVGFnc31cbiAqICAgbXVsdGlwbGVcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogOCB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRPcHRpb24gLSBUaGUgb3B0aW9uIG9iamVjdCB0eXBlXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBNdWx0aXBsZSAtIFdoZXRoZXIgbXVsdGlwbGUgc2VsZWN0aW9uIGlzIGVuYWJsZWRcbiAqIEB0ZW1wbGF0ZSBEaXNhYmxlQ2xlYXJhYmxlIC0gV2hldGhlciB0aGUgY2xlYXIgYnV0dG9uIGlzIGRpc2FibGVkXG4gKiBAdGVtcGxhdGUgRnJlZVNvbG8gLSBXaGV0aGVyIGZyZWUgdGV4dCBpbnB1dCBpcyBhbGxvd2VkXG4gKiBAdGVtcGxhdGUgQ2hpcENvbXBvbmVudCAtIFRoZSBjaGlwIGNvbXBvbmVudCB0eXBlIGZvciBtdWx0aXBsZSBzZWxlY3Rpb25cbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3RFbGVtZW50ID0gPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgTXVsdGlwbGUsXG4gIERpc2FibGVDbGVhcmFibGUsXG4gIEZyZWVTb2xvLFxuICBDaGlwQ29tcG9uZW50XG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5TZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdEVsZW1lbnQnO1xuIiwgImltcG9ydCBDaGVja0JveEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveCc7XG5pbXBvcnQgQ2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3hPdXRsaW5lQmxhbmsnO1xuaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBHcmlkLFxuICBDaGVja2JveCxcbiAgVGV4dEZpZWxkLFxuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG4gIHVzZVRoZW1lLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgU3ludGhldGljRXZlbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGcmFnbWVudCwgdXNlRWZmZWN0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG50eXBlIEJhc2VBdXRvY29tcGxldGVQcm9wczxcbiAgVE9wdGlvbixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUsXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPixcbiAgJ25hbWUnIHwgJ3JlbmRlcklucHV0JyB8ICdtdWx0aXBsZScgfCAnb25DaGFuZ2UnIHwgJ3ZhbHVlJ1xuPjtcblxuZXhwb3J0IHR5cGUgU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+ID0gQmFzZUF1dG9jb21wbGV0ZVByb3BzPFxuICBUT3B0aW9uLFxuICBNdWx0aXBsZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgRnJlZVNvbG8sXG4gIENoaXBDb21wb25lbnRcbj4gJiB7XG4gIG5hbWU6IFROYW1lO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgaXNOdWxsYWJsZT86IGJvb2xlYW47XG4gIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQ/OiBib29sZWFuO1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIGxhYmVsRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICB2YWx1ZUZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RNdWx0aUVsZW1lbnQ8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFRPcHRpb24sIFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNJbnB1dCxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgaXNOdWxsYWJsZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkID0gdHJ1ZSxcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnLFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gb3B0aW9uc0lucHV0IHx8IFtdLCBbb3B0aW9uc0lucHV0XSk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uVmFsdWUgPSAob3B0aW9uOiBUT3B0aW9uKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvblt2YWx1ZUZpZWxkIGFzIGtleW9mIFRPcHRpb25dIDogbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgPT4ge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW2xhYmVsRmllbGQgYXMga2V5b2YgVE9wdGlvbl0pIDogJyc7XG4gIH07XG4gIGNvbnN0IGlzRGlzYWJsZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybiB0cnVlO1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmICFpc051bGxhYmxlICYmICFkaXNhYmxlRGVmYXVsdFNlbGVjdGVkKVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sIFtkaXNhYmxlZCwgb3B0aW9ucy5sZW5ndGgsIGlzTnVsbGFibGUsIGRpc2FibGVEZWZhdWx0U2VsZWN0ZWRdKTtcblxuICBjb25zdCBzZWxlY3RlZFZhbHVlID1cbiAgICBmaWVsZC52YWx1ZSAmJiBBcnJheS5pc0FycmF5KGZpZWxkLnZhbHVlKVxuICAgICAgPyBvcHRpb25zLmZpbHRlcihvcHRpb24gPT4gZmllbGQudmFsdWUuaW5jbHVkZXMoZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSkpXG4gICAgICA6IFtdO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVEZWZhdWx0U2VsZWN0ZWQgJiYgb3B0aW9ucy5sZW5ndGggPT09IDEgJiYgZmllbGQudmFsdWUgIT0gbnVsbCkge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgfVxuICB9LCBbZGlzYWJsZURlZmF1bHRTZWxlY3RlZCwgb3B0aW9ucy5sZW5ndGhdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhc1ZhbHVlID0gQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSkgJiYgZmllbGQudmFsdWUubGVuZ3RoID4gMDtcblxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAhaGFzVmFsdWUgJiZcbiAgICAgICFpc051bGxhYmxlICYmXG4gICAgICAhZGlzYWJsZURlZmF1bHRTZWxlY3RlZFxuICAgICkge1xuICAgICAgZmllbGQub25DaGFuZ2UoW2dldE9wdGlvblZhbHVlKG9wdGlvbnNbMF0pXSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW1xuICAgIG9wdGlvbnMsXG4gICAgZ2V0T3B0aW9uVmFsdWUsXG4gICAgZmllbGQub25DaGFuZ2UsXG4gICAgaXNOdWxsYWJsZSxcbiAgICBkaXNhYmxlRGVmYXVsdFNlbGVjdGVkLFxuICBdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogU3ludGhldGljRXZlbnQsXG4gICAgc2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10sXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgfSBlbHNlIGlmIChyZWFzb24gPT09ICdzZWxlY3RPcHRpb24nIHx8IHJlYXNvbiA9PT0gJ3JlbW92ZU9wdGlvbicpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHNlbGVjdGVkT3B0aW9ucy5tYXAob3B0aW9uID0+IGdldE9wdGlvblZhbHVlKG9wdGlvbikpO1xuXG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdWYWx1ZXMubGVuZ3RoID09PSAwID8gbnVsbCA6IG5ld1ZhbHVlcyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGljb24gPSA8Q2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZvbnRTaXplPVwic21hbGxcIiAvPjtcbiAgY29uc3QgY2hlY2tlZEljb24gPSA8Q2hlY2tCb3hJY29uIGZvbnRTaXplPVwic21hbGxcIiAvPjtcblxuICByZXR1cm4gKFxuICAgIDxBdXRvY29tcGxldGVcbiAgICAgIG11bHRpcGxlXG4gICAgICB2YWx1ZT17c2VsZWN0ZWRWYWx1ZX1cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgZGlzYWJsZUNsb3NlT25TZWxlY3RcbiAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBzeD17e1xuICAgICAgICAnJi5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlJbnB1dEJhc2Utcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQsXG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmLk11aS1kaXNhYmxlZCAuTXVpQXV0b2NvbXBsZXRlLXBvcHVwSW5kaWNhdG9yJzoge1xuICAgICAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkICFpbXBvcnRhbnQnLFxuICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1kaXNhYmxlZCAuTXVpT3V0bGluZWRJbnB1dC1ub3RjaGVkT3V0bGluZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUZpbGxlZElucHV0LXJvb3QuTXVpLWRpc2FibGVkJzoge1xuICAgICAgICAgIGJvcmRlckNvbG9yOiBlcnJvciA/ICdyZWQnIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVuZGVyT3B0aW9uPXsocHJvcHMxLCBvcHRpb24sIHsgc2VsZWN0ZWQgfSkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSB7Li4ucHJvcHMxfT5cbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICBpY29uPXtpY29ufVxuICAgICAgICAgICAgICBjaGVja2VkSWNvbj17Y2hlY2tlZEljb259XG4gICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtnZXRPcHRpb25MYWJlbChvcHRpb24gYXMgVE9wdGlvbil9XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBJbnB1dFByb3BzPXt7XG4gICAgICAgICAgICAuLi5wYXJhbXMuSW5wdXRQcm9wcyxcbiAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICA8RnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICB7Li4ucmVzdH1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFNlbGVjdE11bHRpRWxlbWVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWVcbj4pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblNlbGVjdE11bHRpRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdTZWxlY3RNdWx0aUVsZW1lbnQnO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50LCBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB0eXBlIHsgRmllbGRUeXBlIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtL2VuaGFuY2VkJztcbmltcG9ydCB7IHVzZUVuaGFuY2VkVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlVHJhbnNmb3JtL2VuaGFuY2VkJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXZlbnRzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRleHRGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDdXN0b20gVGV4dEZpZWxkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBkZWZhdWx0IE1VSSBUZXh0RmllbGRcbiAgICovXG4gIGNvbXBvbmVudD86IHR5cGVvZiBUZXh0RmllbGQ7XG4gIC8qKlxuICAgKiBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIGlucHV0L291dHB1dFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZmllbGRUeXBlIGZvciBjb21tb24gcGF0dGVybnMgb3IgY3VzdG9tIHRyYW5zZm9ybXMgZm9yIGNvbXBsZXggY2FzZXNcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICAvKipcbiAgICogQnVpbHQtaW4gZmllbGQgdHlwZSBmb3IgYXV0b21hdGljIHRyYW5zZm9ybWF0aW9uXG4gICAqIEBleGFtcGxlICd0ZXh0JyB8ICdudW1iZXInIHwgJ2RhdGUnIHwgJ3RpbWUnIHwgJ3NlbGVjdCdcbiAgICovXG4gIGZpZWxkVHlwZT86IEZpZWxkVHlwZTtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWUgdG8gZGlzcGxheSB3aGVuIGZpZWxkIHZhbHVlIGlzIG51bGwvdW5kZWZpbmVkXG4gICAqIEBleGFtcGxlIFwiXCJcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFRWYWx1ZTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgZm9yIHRoZSBUZXh0RmllbGRcbiAgICovXG4gIC8qKlxuICAgKiBDdXN0b20gb25DaGFuZ2UgaGFuZGxlciBjYWxsZWQgYWZ0ZXIgdHJhbnNmb3JtYXRpb25cbiAgICovXG4gIG9uQ2hhbmdlPzogKFxuICAgIGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogRW5hYmxlIGRldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmcgdHJhbnNmb3JtYXRpb24gaXNzdWVzXG4gICAqIEBkZWZhdWx0VmFsdWUgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCdcbiAgICovXG4gIGVuYWJsZVdhcm5pbmdzPzogYm9vbGVhbjtcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gVGV4dEZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+KHByb3BzOiBUZXh0RmllbGRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikge1xuICBjb25zdCB7XG4gICAgcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgY29tcG9uZW50OiBUZXh0RmllbGRDb21wb25lbnQgPSBUZXh0RmllbGQsXG4gICAgdHJhbnNmb3JtLFxuICAgIGZpZWxkVHlwZSA9ICd0ZXh0JywgLy8gRGVmYXVsdCB0byB0ZXh0IHR5cGVcbiAgICBkZWZhdWx0VmFsdWUsXG4gICAgbGFiZWwsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgdGV4dEZpZWxkUHJvcHMgPSB7fSxcbiAgICB2YXJpYW50LFxuICAgIG9uQ2hhbmdlOiBjdXN0b21PbkNoYW5nZSxcbiAgICBlbmFibGVXYXJuaW5ncyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHJlcXVpcmVkLFxuICAgIGhlbHBlclRleHQsXG4gICAgaW5wdXRSZWYsXG4gICAgb25JbnB1dCxcbiAgICBvbkJsdXIsXG4gICAgZGlzYWJsZWQsXG4gICAgLi4ucmVzdFRleHRQcm9wc1xuICB9ID0gdGV4dEZpZWxkUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgLy8gVXNlIHRoZSBlbmhhbmNlZCB0cmFuc2Zvcm0gaG9vayB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAgY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZUVuaGFuY2VkVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4oXG4gICAge1xuICAgICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbnB1dDogdHJhbnNmb3JtLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB0cmFuc2Zvcm0ub3V0cHV0LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBmaWVsZFR5cGU6ICF0cmFuc2Zvcm1cbiAgICAgICAgPyB0eXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gJ251bWJlcidcbiAgICAgICAgICA6IGZpZWxkVHlwZVxuICAgICAgICA6IHVuZGVmaW5lZCwgLy8gQXV0by1kZXRlY3QgbnVtYmVyIHR5cGVcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGVuYWJsZVdhcm5pbmdzLFxuICAgIH1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkQ29tcG9uZW50XG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgbmFtZT17ZmllbGQubmFtZX1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gJycpIHtcbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGN1c3RvbU9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY3VzdG9tT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25JbnB1dD17KGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9uSW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbklucHV0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17XG4gICAgICAgIGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogaGVscGVyVGV4dFxuICAgICAgfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uLFxuICogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucywgYW5kIGJ1aWx0LWluIGZpZWxkIHR5cGUgaGFuZGxpbmcuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmdcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gc3VwcG9ydFxuICogLSBCdWlsdC1pbiBmaWVsZCB0eXBlcyBmb3IgY29tbW9uIHBhdHRlcm5zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBPcHRpbWl6ZWQgbnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyB3aXRoIG1lbW9pemVkIHRyYW5zZm9ybWF0aW9uc1xuICogLSBEZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nXG4gKiAtIFN0YWJsZSByZWZlcmVuY2VzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGJ1aWx0LWluIG51bWJlciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFnZVwiXG4gKiAgIGxhYmVsPVwiQWdlXCJcbiAqICAgZmllbGRUeXBlPVwibnVtYmVyXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdBZ2UgaXMgcmVxdWlyZWQnLCBtaW46IHsgdmFsdWU6IDAsIG1lc3NhZ2U6ICdBZ2UgbXVzdCBiZSBwb3NpdGl2ZScgfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImVtYWlsXCJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgZW1haWwgYWRkcmVzc1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICogICAgIHBhdHRlcm46IHsgdmFsdWU6IC9cXFMrQFxcUytcXC5cXFMrLywgbWVzc2FnZTogJ0ludmFsaWQgZW1haWwnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicHJpY2VcIlxuICogICBsYWJlbD1cIlByaWNlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPyBgJCR7dmFsdWV9YCA6ICcnLFxuICogICAgIG91dHB1dDogKGV2ZW50KSA9PiBwYXJzZUZsb2F0KGV2ZW50LnRhcmdldC52YWx1ZS5yZXBsYWNlKCckJywgJycpKSB8fCBudWxsXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGVycm9yIHBhcnNpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VybmFtZVwiXG4gKiAgIGxhYmVsPVwiVXNlcm5hbWVcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiAoXG4gKiAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICdyZWQnIH19PlxuICogICAgICAgXHUyNkEwXHVGRTBGIHtlcnJvci5tZXNzYWdlfVxuICogICAgIDwvc3Bhbj5cbiAqICAgKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgVGltZVBpY2tlclByb3BzLFxuICBUaW1lUGlja2VyU2xvdFByb3BzLFxuICBUaW1lVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB7IFRpbWVQaWNrZXIgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFscyc7XG5pbXBvcnQgeyByZW5kZXJUaW1lVmlld0Nsb2NrIH0gZnJvbSAnQG11aS94LWRhdGUtcGlja2Vycy90aW1lVmlld1JlbmRlcmVycyc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gJ0AvaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICdAL3R5cGVzJztcbmltcG9ydCB7IHJlYWRWYWx1ZUFzRGF0ZSB9IGZyb20gJ0AvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPiB7XG4gIG5hbWU6IFROYW1lO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBUaW1lVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGlucHV0UHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICBoZWxwZXJUZXh0PzogVGV4dEZpZWxkUHJvcHNbJ2hlbHBlclRleHQnXTtcbiAgbGFiZWw/OiBSZWFjdE5vZGU7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICB0ZXh0UmVhZE9ubHk/OiBib29sZWFuO1xuICBzbG90UHJvcHM/OiBPbWl0PFxuICAgIFRpbWVQaWNrZXJTbG90UHJvcHM8VEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gICAgJ3RleHRGaWVsZCdcbiAgPjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZSB8IG51bGw7XG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgdGltZVBpY2tlclByb3BzPzogT21pdDxcbiAgICBUaW1lUGlja2VyUHJvcHM8VEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gICAgJ3ZhbHVlJyB8ICdzbG90UHJvcHMnXG4gID47XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gVGltZVBpY2tlckVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihwcm9wczogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIHJlcXVpcmVkLFxuICAgIGlucHV0UHJvcHMsXG4gICAgY29udHJvbCxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBzbG90UHJvcHMsXG4gICAgdGltZVBpY2tlclByb3BzID0ge30sXG4gICAgdHJhbnNmb3JtLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IGFkYXB0ZXIgPSB1c2VMb2NhbGl6YXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCB7IGRpc2FibGVkLCBpbnB1dFJlZiwgb25DbG9zZSwgLi4ucmVzdFRpbWVQaWNrZXJQcm9wcyB9ID1cbiAgICB0aW1lUGlja2VyUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSB8IG51bGw+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IG5ld1ZhbHVlID0+IHJlYWRWYWx1ZUFzRGF0ZShhZGFwdGVyLCBuZXdWYWx1ZSksXG4gICAgICBvdXRwdXQ6IGRhdGEgPT4ge1xuICAgICAgICBpZiAoIWRheWpzLmlzRGF5anMoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbCBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUaW1lUGlja2VyXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGltZVBpY2tlclByb3BzfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgb3Blbj17b3Blbn1cbiAgICAgIGlucHV0UmVmPXtoYW5kbGVJbnB1dFJlZn1cbiAgICAgIHZpZXdSZW5kZXJlcnM9e3tcbiAgICAgICAgaG91cnM6IHJlbmRlclRpbWVWaWV3Q2xvY2ssXG4gICAgICAgIG1pbnV0ZXM6IHJlbmRlclRpbWVWaWV3Q2xvY2ssXG4gICAgICAgIHNlY29uZHM6IHJlbmRlclRpbWVWaWV3Q2xvY2ssXG4gICAgICB9fVxuICAgICAgb25PcGVuPXsoKSA9PiBzZXRPcGVuKHRydWUpfVxuICAgICAgb25DbG9zZT17KC4uLmFyZ3MpID0+IHtcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBvbkNsb3NlPy4oLi4uYXJncyk7XG4gICAgICB9fVxuICAgICAgb25DaGFuZ2U9eyhuZXdWYWx1ZSwgY29udGV4dCkgPT4ge1xuICAgICAgICBvbkNoYW5nZShuZXdWYWx1ZSk7XG4gICAgICAgIHRpbWVQaWNrZXJQcm9wcy5vbkNoYW5nZT8uKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICAgIH19XG4gICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgLi4uc2xvdFByb3BzLFxuICAgICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ2NhbmNlbCcsICdhY2NlcHQnXSxcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgc3g6IHtcbiAgICAgICAgICAgIGN1cnNvcjogZGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgICAgICBzZXRPcGVuKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25CbHVyOiAoXG4gICAgICAgICAgICBldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICAgICAgaW5wdXRQcm9wcz8ub25CbHVyPy4oZXZlbnQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgaGVscGVyVGV4dDogZXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiBpbnB1dFByb3BzPy5oZWxwZXJUZXh0IHx8IHJlc3QuaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgIGlucHV0TW9kZTogJ25vbmUnLFxuICAgICAgICAgICAgLi4uaW5wdXRQcm9wcz8uaW5wdXRQcm9wcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFRpbWVQaWNrZXJFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFRpbWVQaWNrZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cblRpbWVQaWNrZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1RpbWVQaWNrZXJFbGVtZW50JztcbiIsICJpbXBvcnQge1xyXG4gIEJveCxcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtSGVscGVyVGV4dCxcclxuICBGb3JtTGFiZWwsXHJcbiAgR3JpZCxcclxuICBTbGlkZXIsXHJcbiAgdHlwZSBHcmlkUHJvcHMsXHJcbiAgdHlwZSBTbGlkZXJQcm9wcyxcclxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcclxuaW1wb3J0IHR5cGUgeyBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZEVycm9yLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcclxuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XHJcblxyXG4vKipcclxuICogUHJvcHMgZm9yIHRoZSBTbGlkZXJFbGVtZW50IGNvbXBvbmVudC5cclxuICpcclxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXHJcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2xpZGVyRWxlbWVudFByb3BzPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+IHtcclxuICAvKiogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm0gKi9cclxuICBuYW1lOiBUTmFtZTtcclxuICAvKiogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xyXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XHJcbiAgLyoqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0ICovXHJcbiAgbGFiZWw/OiBSZWFjdE5vZGU7XHJcbiAgLyoqIEhlbHBlciB0ZXh0IHRvIGRpc3BsYXkgYmVsb3cgdGhlIHNsaWRlciAqL1xyXG4gIGhlbHBlclRleHQ/OiBSZWFjdE5vZGU7XHJcbiAgLyoqIEN1c3RvbSBlcnJvciBtZXNzYWdlIHBhcnNlciAqL1xyXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcclxuICAvKiogTWluaW11bSB2YWx1ZSAqL1xyXG4gIG1pbj86IG51bWJlcjtcclxuICAvKiogTWF4aW11bSB2YWx1ZSAqL1xyXG4gIG1heD86IG51bWJlcjtcclxuICAvKiogU3RlcCBpbmNyZW1lbnQgKi9cclxuICBzdGVwPzogbnVtYmVyO1xyXG4gIC8qKiBTaG93IG1hcmtzIG9uIHRoZSBzbGlkZXIgKi9cclxuICBtYXJrcz86IGJvb2xlYW4gfCB7IHZhbHVlOiBudW1iZXI7IGxhYmVsPzogc3RyaW5nIH1bXTtcclxuICAvKiogV2hldGhlciB0aGUgZmllbGQgaXMgcmVxdWlyZWQgKi9cclxuICByZXF1aXJlZD86IGJvb2xlYW47XHJcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGRpc2FibGVkICovXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIC8qKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgKi9cclxuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XHJcbiAgLyoqIEFkZGl0aW9uYWwgcHJvcHMgZm9yIHRoZSBTbGlkZXIgY29tcG9uZW50ICovXHJcbiAgc2xpZGVyUHJvcHM/OiBPbWl0PFNsaWRlclByb3BzLCAndmFsdWUnIHwgJ29uQ2hhbmdlJyB8ICdtaW4nIHwgJ21heCcgfCAnc3RlcCcgfCAnbWFya3MnIHwgJ2Rpc2FibGVkJz47XHJcbn1cclxuXHJcbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNsaWRlckVsZW1lbnRDb3JlPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+KHByb3BzOiBPbWl0PFNsaWRlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPiwgJ2dyaWRQcm9wcyc+KSB7XHJcbiAgY29uc3Qge1xyXG4gICAgbmFtZSxcclxuICAgIGNvbnRyb2wsXHJcbiAgICBsYWJlbCxcclxuICAgIGhlbHBlclRleHQsXHJcbiAgICBwYXJzZUVycm9yLFxyXG4gICAgbWluID0gMCxcclxuICAgIG1heCA9IDEwMCxcclxuICAgIHN0ZXAgPSAxLFxyXG4gICAgbWFya3MgPSBmYWxzZSxcclxuICAgIHJlcXVpcmVkID0gZmFsc2UsXHJcbiAgICBkaXNhYmxlZCA9IGZhbHNlLFxyXG4gICAgc2xpZGVyUHJvcHMgPSB7fSxcclxuICB9ID0gcHJvcHM7XHJcblxyXG4gIGNvbnN0IHtcclxuICAgIGZpZWxkLFxyXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxyXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcclxuICAgIG5hbWUsXHJcbiAgICBjb250cm9sLFxyXG4gIH0pO1xyXG5cclxuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IG51bGw7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8Rm9ybUNvbnRyb2xcclxuICAgICAgZnVsbFdpZHRoXHJcbiAgICAgIG1hcmdpbj1cIm5vcm1hbFwiXHJcbiAgICAgIGVycm9yPXshIWVycm9yfVxyXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XHJcbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgID5cclxuICAgICAge2xhYmVsICYmIDxGb3JtTGFiZWwgc3g9e3sgbWI6IDIgfX0+e2xhYmVsfTwvRm9ybUxhYmVsPn1cclxuICAgICAgPEJveCBzeD17eyBweDogMiB9fT5cclxuICAgICAgICA8U2xpZGVyXHJcbiAgICAgICAgICB7Li4uc2xpZGVyUHJvcHN9XHJcbiAgICAgICAgICByZWY9e2ZpZWxkLnJlZn1cclxuICAgICAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XHJcbiAgICAgICAgICB2YWx1ZT17dHlwZW9mIGZpZWxkLnZhbHVlID09PSAnbnVtYmVyJyA/IGZpZWxkLnZhbHVlIDogbWlufVxyXG4gICAgICAgICAgb25DaGFuZ2U9eyhfLCBuZXdWYWx1ZSkgPT4gZmllbGQub25DaGFuZ2UobmV3VmFsdWUpfVxyXG4gICAgICAgICAgb25CbHVyPXtmaWVsZC5vbkJsdXJ9XHJcbiAgICAgICAgICBtaW49e21pbn1cclxuICAgICAgICAgIG1heD17bWF4fVxyXG4gICAgICAgICAgc3RlcD17c3RlcH1cclxuICAgICAgICAgIG1hcmtzPXttYXJrc31cclxuICAgICAgICAgIHZhbHVlTGFiZWxEaXNwbGF5PVwiYXV0b1wiXHJcbiAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XHJcbiAgICAgICAgLz5cclxuICAgICAgPC9Cb3g+XHJcbiAgICAgIHsoZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHQpICYmIChcclxuICAgICAgICA8Rm9ybUhlbHBlclRleHQ+e2Vycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0fTwvRm9ybUhlbHBlclRleHQ+XHJcbiAgICAgICl9XHJcbiAgICA8L0Zvcm1Db250cm9sPlxyXG4gICk7XHJcbn07XHJcblxyXG4vKipcclxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBTbGlkZXIgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBGZWF0dXJlczpcclxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxyXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XHJcbiAqIC0gQ3VzdG9taXphYmxlIG1pbi9tYXgvc3RlcCB2YWx1ZXNcclxuICogLSBPcHRpb25hbCBtYXJrcyBkaXNwbGF5XHJcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHN4XHJcbiAqIDxTbGlkZXJFbGVtZW50XHJcbiAqICAgbmFtZT1cInJhdGluZ1wiXHJcbiAqICAgY29udHJvbD17Y29udHJvbH1cclxuICogICBsYWJlbD1cIlJhdGluZ1wiXHJcbiAqICAgbWluPXswfVxyXG4gKiAgIG1heD17MTB9XHJcbiAqICAgc3RlcD17MX1cclxuICogICBtYXJrc1xyXG4gKiAvPlxyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBjb25zdCBTbGlkZXJFbGVtZW50ID0gPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+KHtcclxuICBncmlkUHJvcHMgPSB7fSxcclxuICAuLi5wcm9wc1xyXG59OiBTbGlkZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xyXG4gIHJldHVybiAoXHJcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XHJcbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxyXG4gICAgPC9HcmlkPlxyXG4gICk7XHJcbn07XHJcblxyXG5TbGlkZXJFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NsaWRlckVsZW1lbnQnO1xyXG4iLCAiaW1wb3J0IHtcclxuICBCb3gsXHJcbiAgQnV0dG9uLFxyXG4gIENoaXAsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUhlbHBlclRleHQsXHJcbiAgRm9ybUxhYmVsLFxyXG4gIEdyaWQsXHJcbiAgU3RhY2ssXHJcbiAgdHlwZSBHcmlkUHJvcHMsXHJcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XHJcbmltcG9ydCBDbG91ZFVwbG9hZEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DbG91ZFVwbG9hZCc7XHJcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkRXJyb3IsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xyXG5pbXBvcnQgeyB1c2VDb250cm9sbGVyLCB1c2VGb3JtQ29udGV4dCB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XHJcblxyXG4vKipcclxuICogUHJvcHMgZm9yIHRoZSBGaWxlVXBsb2FkRWxlbWVudCBjb21wb25lbnQuXHJcbiAqXHJcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxyXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVVcGxvYWRFbGVtZW50UHJvcHM8XHJcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcclxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXHJcbj4ge1xyXG4gIC8qKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybSAqL1xyXG4gIG5hbWU6IFROYW1lO1xyXG4gIC8qKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtICovXHJcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcclxuICAvKiogVGhlIGlucHV0IGxhYmVsIHRleHQgKi9cclxuICBsYWJlbD86IFJlYWN0Tm9kZTtcclxuICAvKiogSGVscGVyIHRleHQgdG8gZGlzcGxheSBiZWxvdyB0aGUgdXBsb2FkICovXHJcbiAgaGVscGVyVGV4dD86IFJlYWN0Tm9kZTtcclxuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXHJcbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xyXG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBmaWxlcyBhbGxvd2VkICovXHJcbiAgbWF4RmlsZXM/OiBudW1iZXI7XHJcbiAgLyoqIE1heGltdW0gZmlsZSBzaXplIGluIE1CICovXHJcbiAgbWF4U2l6ZU1CPzogbnVtYmVyO1xyXG4gIC8qKiBBbGxvd2VkIGZpbGUgZXh0ZW5zaW9ucyAoZS5nLiwgWycuanBnJywgJy5wbmcnLCAnLnBkZiddKSAqL1xyXG4gIGFsbG93ZWRFeHRlbnNpb25zPzogc3RyaW5nW107XHJcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVpcmVkICovXHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZCAqL1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICAvKiogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyICovXHJcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xyXG4gIC8qKiBCdXR0b24gdGV4dCAqL1xyXG4gIGJ1dHRvblRleHQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEZpbGVVcGxvYWRFbGVtZW50Q29yZTxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPihwcm9wczogT21pdDxGaWxlVXBsb2FkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+LCAnZ3JpZFByb3BzJz4pIHtcclxuICBjb25zdCB7XHJcbiAgICBuYW1lLFxyXG4gICAgY29udHJvbCxcclxuICAgIGxhYmVsLFxyXG4gICAgaGVscGVyVGV4dCxcclxuICAgIHBhcnNlRXJyb3IsXHJcbiAgICBtYXhGaWxlcyA9IDUsXHJcbiAgICBtYXhTaXplTUIgPSAxMCxcclxuICAgIGFsbG93ZWRFeHRlbnNpb25zID0gWycuanBnJywgJy5qcGVnJywgJy5wbmcnLCAnLnBkZicsICcuZG9jJywgJy5kb2N4JywgJy54bHMnLCAnLnhsc3gnXSxcclxuICAgIHJlcXVpcmVkID0gZmFsc2UsXHJcbiAgICBkaXNhYmxlZCA9IGZhbHNlLFxyXG4gICAgYnV0dG9uVGV4dCA9ICdDaG9vc2UgRmlsZXMnLFxyXG4gIH0gPSBwcm9wcztcclxuXHJcbiAgY29uc3QgeyBzZXRFcnJvciwgY2xlYXJFcnJvcnMgfSA9IHVzZUZvcm1Db250ZXh0KCk7XHJcbiAgY29uc3QgZmlsZUlucHV0UmVmID0gdXNlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KG51bGwpO1xyXG5cclxuICBjb25zdCB7XHJcbiAgICBmaWVsZCxcclxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcclxuICB9ID0gdXNlQ29udHJvbGxlcih7XHJcbiAgICBuYW1lLFxyXG4gICAgY29udHJvbCxcclxuICB9KTtcclxuXHJcbiAgY29uc3QgZmlsZXM6IEZpbGVbXSA9IEFycmF5LmlzQXJyYXkoZmllbGQudmFsdWUpID8gZmllbGQudmFsdWUgOiBbXTtcclxuXHJcbiAgY29uc3QgdmFsaWRhdGVGaWxlcyA9IHVzZUNhbGxiYWNrKFxyXG4gICAgKGZpbGVMaXN0OiBGaWxlTGlzdCB8IG51bGwpOiBGaWxlW10gfCBzdHJpbmcgPT4ge1xyXG4gICAgICBpZiAoIWZpbGVMaXN0IHx8IGZpbGVMaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGZpbGVMaXN0Lmxlbmd0aCA+IG1heEZpbGVzKSB7XHJcbiAgICAgICAgcmV0dXJuIGBNYXhpbXVtICR7bWF4RmlsZXN9IGZpbGVzIGFsbG93ZWRgO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtYXhTaXplQnl0ZXMgPSBtYXhTaXplTUIgKiAxMDI0ICogMTAyNDtcclxuICAgICAgY29uc3QgdmFsaWRGaWxlczogRmlsZVtdID0gW107XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZSA9IGZpbGVMaXN0W2ldO1xyXG5cclxuICAgICAgICBpZiAoZmlsZS5zaXplID4gbWF4U2l6ZUJ5dGVzKSB7XHJcbiAgICAgICAgICByZXR1cm4gYEZpbGUgXCIke2ZpbGUubmFtZX1cIiBleGNlZWRzICR7bWF4U2l6ZU1CfU1CIHNpemUgbGltaXRgO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFhbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhleHRlbnNpb24pKSB7XHJcbiAgICAgICAgICByZXR1cm4gYEZpbGUgXCIke2ZpbGUubmFtZX1cIiBoYXMgaW52YWxpZCBleHRlbnNpb24uIEFsbG93ZWQ6ICR7YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKX1gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFsaWRGaWxlcy5wdXNoKGZpbGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdmFsaWRGaWxlcztcclxuICAgIH0sXHJcbiAgICBbbWF4RmlsZXMsIG1heFNpemVNQiwgYWxsb3dlZEV4dGVuc2lvbnNdXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlRmlsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxyXG4gICAgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZUZpbGVzKGV2ZW50LnRhcmdldC5maWxlcyk7XHJcblxyXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBzZXRFcnJvcihuYW1lLCB7IHR5cGU6ICd2YWxpZGF0aW9uJywgbWVzc2FnZTogcmVzdWx0IH0pO1xyXG4gICAgICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjbGVhckVycm9ycyhuYW1lKTtcclxuICAgICAgZmllbGQub25DaGFuZ2UocmVzdWx0KTtcclxuICAgIH0sXHJcbiAgICBbdmFsaWRhdGVGaWxlcywgc2V0RXJyb3IsIGNsZWFyRXJyb3JzLCBuYW1lLCBmaWVsZF1cclxuICApO1xyXG5cclxuICBjb25zdCBoYW5kbGVSZW1vdmVGaWxlID0gdXNlQ2FsbGJhY2soXHJcbiAgICAoaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBjb25zdCBuZXdGaWxlcyA9IGZpbGVzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xyXG4gICAgICBmaWVsZC5vbkNoYW5nZShuZXdGaWxlcyk7XHJcblxyXG4gICAgICBpZiAoZmlsZUlucHV0UmVmLmN1cnJlbnQpIHtcclxuICAgICAgICBmaWxlSW5wdXRSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgW2ZpbGVzLCBmaWVsZF1cclxuICApO1xyXG5cclxuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKSA6IG51bGw7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8Rm9ybUNvbnRyb2xcclxuICAgICAgZnVsbFdpZHRoXHJcbiAgICAgIG1hcmdpbj1cIm5vcm1hbFwiXHJcbiAgICAgIGVycm9yPXshIWVycm9yfVxyXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XHJcbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgID5cclxuICAgICAge2xhYmVsICYmIDxGb3JtTGFiZWwgc3g9e3sgbWI6IDEgfX0+e2xhYmVsfTwvRm9ybUxhYmVsPn1cclxuICAgICAgPEJveD5cclxuICAgICAgICA8QnV0dG9uXHJcbiAgICAgICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxyXG4gICAgICAgICAgY29tcG9uZW50PVwibGFiZWxcIlxyXG4gICAgICAgICAgc3RhcnRJY29uPXs8Q2xvdWRVcGxvYWRJY29uIC8+fVxyXG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8IGZpbGVzLmxlbmd0aCA+PSBtYXhGaWxlc31cclxuICAgICAgICA+XHJcbiAgICAgICAgICB7YnV0dG9uVGV4dH1cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICByZWY9e2ZpbGVJbnB1dFJlZn1cclxuICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxyXG4gICAgICAgICAgICBtdWx0aXBsZVxyXG4gICAgICAgICAgICBhY2NlcHQ9e2FsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywnKX1cclxuICAgICAgICAgICAgaGlkZGVuXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVGaWxlQ2hhbmdlfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L0J1dHRvbj5cclxuICAgICAgICB7ZmlsZXMubGVuZ3RoID4gMCAmJiAoXHJcbiAgICAgICAgICA8U3RhY2sgZGlyZWN0aW9uPVwicm93XCIgc3BhY2luZz17MX0gZmxleFdyYXA9XCJ3cmFwXCIgc3g9e3sgbXQ6IDIgfX0+XHJcbiAgICAgICAgICAgIHtmaWxlcy5tYXAoKGZpbGU6IEZpbGUsIGluZGV4OiBudW1iZXIpID0+IChcclxuICAgICAgICAgICAgICA8Q2hpcFxyXG4gICAgICAgICAgICAgICAga2V5PXtgJHtmaWxlLm5hbWV9LSR7aW5kZXh9YH1cclxuICAgICAgICAgICAgICAgIGxhYmVsPXtgJHtmaWxlLm5hbWV9ICgkeyhmaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQilgfVxyXG4gICAgICAgICAgICAgICAgb25EZWxldGU9e2Rpc2FibGVkID8gdW5kZWZpbmVkIDogKCkgPT4gaGFuZGxlUmVtb3ZlRmlsZShpbmRleCl9XHJcbiAgICAgICAgICAgICAgICBzeD17eyBtYjogMSB9fVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICkpfVxyXG4gICAgICAgICAgPC9TdGFjaz5cclxuICAgICAgICApfVxyXG4gICAgICA8L0JveD5cclxuICAgICAgeyhlcnJvck1lc3NhZ2UgfHwgaGVscGVyVGV4dCkgJiYgKFxyXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dD57ZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHR9PC9Gb3JtSGVscGVyVGV4dD5cclxuICAgICAgKX1cclxuICAgIDwvRm9ybUNvbnRyb2w+XHJcbiAgKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIEZpbGUgVXBsb2FkIGNvbXBvbmVudC5cclxuICpcclxuICogRmVhdHVyZXM6XHJcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cclxuICogLSBNdWx0aXBsZSBmaWxlIHN1cHBvcnRcclxuICogLSBGaWxlIHNpemUgdmFsaWRhdGlvblxyXG4gKiAtIEZpbGUgdHlwZSB2YWxpZGF0aW9uXHJcbiAqIC0gVmlzdWFsIGZpbGUgbGlzdCB3aXRoIHJlbW92ZSBjYXBhYmlsaXR5XHJcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxyXG4gKiAtIFR5cGVTY3JpcHQgdHlwZSBzYWZldHlcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHN4XHJcbiAqIDxGaWxlVXBsb2FkRWxlbWVudFxyXG4gKiAgIG5hbWU9XCJkb2N1bWVudHNcIlxyXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XHJcbiAqICAgbGFiZWw9XCJVcGxvYWQgRG9jdW1lbnRzXCJcclxuICogICBtYXhGaWxlcz17M31cclxuICogICBtYXhTaXplTUI9ezV9XHJcbiAqICAgYWxsb3dlZEV4dGVuc2lvbnM9e1snLnBkZicsICcuZG9jJywgJy5kb2N4J119XHJcbiAqIC8+XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEZpbGVVcGxvYWRFbGVtZW50ID0gPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+KHtcclxuICBncmlkUHJvcHMgPSB7fSxcclxuICAuLi5wcm9wc1xyXG59OiBGaWxlVXBsb2FkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3RFbGVtZW50ID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxyXG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cclxuICAgIDwvR3JpZD5cclxuICApO1xyXG59O1xyXG5cclxuRmlsZVVwbG9hZEVsZW1lbnQuZGlzcGxheU5hbWUgPSAnRmlsZVVwbG9hZEVsZW1lbnQnO1xyXG4iLCAiaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB0eXBlIHsgVGV4dEZpZWxkUHJvcHMsIEdyaWRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgeyBUZXh0RmllbGQsIElucHV0QWRvcm5tZW50LCBHcmlkIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XHJcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRFcnJvciwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XHJcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xyXG5pbXBvcnQgeyBDb3VudHJ5U2VsZWN0b3IgfSBmcm9tICcuL0NvdW50cnlTZWxlY3Rvcic7XHJcbmltcG9ydCB7IENPVU5UUklFUywgcGFyc2VFMTY0Q291bnRyeSwgcGFyc2VFMTY0TG9jYWxOdW1iZXIgfSBmcm9tICcuL2NvdW50cmllcyc7XHJcbmltcG9ydCB0eXBlIHsgQ291bnRyeURhdGEgfSBmcm9tICcuL2NvdW50cmllcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBob25lTnVtYmVyRWxlbWVudFByb3BzPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+IHtcclxuICAvKiogRmllbGQgbmFtZSBpbiB0aGUgZm9ybSAqL1xyXG4gIG5hbWU6IFROYW1lO1xyXG4gIC8qKiBSSEYgY29udHJvbCBpbnN0YW5jZSAqL1xyXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XHJcbiAgLyoqIElucHV0IGxhYmVsICovXHJcbiAgbGFiZWw/OiBzdHJpbmc7XHJcbiAgLyoqIElucHV0IHBsYWNlaG9sZGVyICovXHJcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBjb3VudHJ5IElTTyAzMTY2LTEgYWxwaGEtMiBjb2RlIHNob3duIHdoZW4gdGhlIGZpZWxkIGlzIGVtcHR5LlxyXG4gICAqIEBkZWZhdWx0VmFsdWUgJ1VTJ1xyXG4gICAqL1xyXG4gIGRlZmF1bHRDb3VudHJ5Pzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIENvdW50cnkgY29kZXMgdG8gc2hvdyBmaXJzdCBpbiB0aGUgcGlja2VyIGxpc3QuXHJcbiAgICogQGV4YW1wbGUgWydVUycsICdHQicsICdDQSddXHJcbiAgICovXHJcbiAgcHJlZmVycmVkQ291bnRyaWVzPzogc3RyaW5nW107XHJcbiAgLyoqIFJlc3RyaWN0IHBpY2tlciB0byBvbmx5IHRoZXNlIGNvdW50cnkgY29kZXMuICovXHJcbiAgb25seUNvdW50cmllcz86IHN0cmluZ1tdO1xyXG4gIC8qKiBFeGNsdWRlIHRoZXNlIGNvdW50cnkgY29kZXMgZnJvbSB0aGUgcGlja2VyLiAqL1xyXG4gIGV4Y2x1ZGVDb3VudHJpZXM/OiBzdHJpbmdbXTtcclxuICAvKiogRGlzYWJsZSB0aGUgZmllbGQgKi9cclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgLyoqIFNob3cgcmVxdWlyZWQgYXN0ZXJpc2sgKi9cclxuICByZXF1aXJlZD86IGJvb2xlYW47XHJcbiAgLyoqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgb3V0ZXIgd3JhcHBlciAqL1xyXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcclxuICAvKiogQ3VzdG9tIGVycm9yIHJlbmRlcmVyICovXHJcbiAgcGFyc2VFcnJvcj86IChlcnJvcjogRmllbGRFcnJvcikgPT4gUmVhY3ROb2RlO1xyXG4gIC8qKiBBZGRpdGlvbmFsIHByb3BzIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBNVUkgVGV4dEZpZWxkICovXHJcbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZScgfCAndHlwZSc+O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kRGVmYXVsdENvdW50cnkoY29kZTogc3RyaW5nKTogQ291bnRyeURhdGEge1xyXG4gIGNvbnN0IHVwcGVyID0gY29kZS50b1VwcGVyQ2FzZSgpO1xyXG4gIHJldHVybiBDT1VOVFJJRVMuZmluZCgoYykgPT4gYy5jb2RlID09PSB1cHBlcikgPz8gQ09VTlRSSUVTLmZpbmQoKGMpID0+IGMuY29kZSA9PT0gJ1VTJykhO1xyXG59XHJcblxyXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBQaG9uZU51bWJlckVsPFxyXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXHJcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxyXG4+KHByb3BzOiBQaG9uZU51bWJlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xyXG4gIGNvbnN0IHtcclxuICAgIG5hbWUsXHJcbiAgICBjb250cm9sLFxyXG4gICAgbGFiZWwsXHJcbiAgICBwbGFjZWhvbGRlcixcclxuICAgIGRlZmF1bHRDb3VudHJ5ID0gJ1VTJyxcclxuICAgIHByZWZlcnJlZENvdW50cmllcyxcclxuICAgIG9ubHlDb3VudHJpZXMsXHJcbiAgICBleGNsdWRlQ291bnRyaWVzLFxyXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcclxuICAgIHJlcXVpcmVkID0gZmFsc2UsXHJcbiAgICBwYXJzZUVycm9yLFxyXG4gICAgdGV4dEZpZWxkUHJvcHMsXHJcbiAgfSA9IHByb3BzO1xyXG5cclxuICBjb25zdCB7XHJcbiAgICBmaWVsZCxcclxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcclxuICB9ID0gdXNlQ29udHJvbGxlcih7IG5hbWUsIGNvbnRyb2wgfSk7XHJcblxyXG4gIGNvbnN0IFtzZWxlY3RlZENvdW50cnksIHNldFNlbGVjdGVkQ291bnRyeV0gPSB1c2VTdGF0ZTxDb3VudHJ5RGF0YT4oKCkgPT5cclxuICAgIGZpbmREZWZhdWx0Q291bnRyeShkZWZhdWx0Q291bnRyeSlcclxuICApO1xyXG4gIGNvbnN0IFtsb2NhbE51bWJlciwgc2V0TG9jYWxOdW1iZXJdID0gdXNlU3RhdGU8c3RyaW5nPignJyk7XHJcblxyXG4gIC8vIFN5bmMgaW50ZXJuYWwgc3RhdGUgd2hlbiBSSEYgdmFsdWUgY2hhbmdlcyBleHRlcm5hbGx5IChlLmcuIGZvcm0ucmVzZXQoKSlcclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgZXh0ZXJuYWxWYWx1ZSA9IGZpZWxkLnZhbHVlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGw7XHJcbiAgICBpZiAoIWV4dGVybmFsVmFsdWUgfHwgZXh0ZXJuYWxWYWx1ZSA9PT0gJycpIHtcclxuICAgICAgLy8gRmllbGQgY2xlYXJlZCBcdTIwMTQgcmVzZXQgdG8gZGVmYXVsdCBjb3VudHJ5LCBlbXB0eSBsb2NhbCBudW1iZXJcclxuICAgICAgc2V0U2VsZWN0ZWRDb3VudHJ5KGZpbmREZWZhdWx0Q291bnRyeShkZWZhdWx0Q291bnRyeSkpO1xyXG4gICAgICBzZXRMb2NhbE51bWJlcignJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgZXh0ZXJuYWxWYWx1ZSA9PT0gJ3N0cmluZycgJiYgZXh0ZXJuYWxWYWx1ZS5zdGFydHNXaXRoKCcrJykpIHtcclxuICAgICAgY29uc3QgbWF0Y2ggPSBwYXJzZUUxNjRDb3VudHJ5KGV4dGVybmFsVmFsdWUpO1xyXG4gICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICBzZXRTZWxlY3RlZENvdW50cnkobWF0Y2gpO1xyXG4gICAgICAgIHNldExvY2FsTnVtYmVyKHBhcnNlRTE2NExvY2FsTnVtYmVyKGV4dGVybmFsVmFsdWUsIG1hdGNoLmRpYWxDb2RlKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gTm8gbWF0Y2ggXHUyMDE0IGtlZXAgZGVmYXVsdCBjb3VudHJ5LCBzdHJpcCBsZWFkaW5nICcrJ1xyXG4gICAgICAgIHNldFNlbGVjdGVkQ291bnRyeShmaW5kRGVmYXVsdENvdW50cnkoZGVmYXVsdENvdW50cnkpKTtcclxuICAgICAgICBzZXRMb2NhbE51bWJlcihleHRlcm5hbFZhbHVlLnJlcGxhY2UoL15cXCsvLCAnJykpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBJZiB2YWx1ZSBkb2Vzbid0IHN0YXJ0IHdpdGggJysnIGl0J3Mgbm90IEUuMTY0IFx1MjAxNCBsZWF2ZSBpbnRlcm5hbCBzdGF0ZSB1bmNoYW5nZWRcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgfSwgW2ZpZWxkLnZhbHVlXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZU51bWJlckNoYW5nZSA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xyXG4gICAgY29uc3QgZGlnaXRzID0gZS50YXJnZXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcclxuICAgIHNldExvY2FsTnVtYmVyKGRpZ2l0cyk7XHJcbiAgICBpZiAoZGlnaXRzID09PSAnJykge1xyXG4gICAgICBmaWVsZC5vbkNoYW5nZSgnJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWVsZC5vbkNoYW5nZShzZWxlY3RlZENvdW50cnkuZGlhbENvZGUgKyBkaWdpdHMpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNvdW50cnlDaGFuZ2UgPSAoY291bnRyeTogQ291bnRyeURhdGEpID0+IHtcclxuICAgIHNldFNlbGVjdGVkQ291bnRyeShjb3VudHJ5KTtcclxuICAgIC8vIFJlY29tcHV0ZSBSSEYgdmFsdWUgd2l0aCBuZXcgZGlhbCBjb2RlIGJ1dCBzYW1lIGxvY2FsIG51bWJlclxyXG4gICAgaWYgKGxvY2FsTnVtYmVyID09PSAnJykge1xyXG4gICAgICBmaWVsZC5vbkNoYW5nZSgnJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWVsZC5vbkNoYW5nZShjb3VudHJ5LmRpYWxDb2RlICsgbG9jYWxOdW1iZXIpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yXHJcbiAgICA/IChwYXJzZUVycm9yID8gcGFyc2VFcnJvcihlcnJvcikgOiBlcnJvci5tZXNzYWdlKVxyXG4gICAgOiB0ZXh0RmllbGRQcm9wcz8uaGVscGVyVGV4dDtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxUZXh0RmllbGRcclxuICAgICAgey4uLnRleHRGaWVsZFByb3BzfVxyXG4gICAgICBsYWJlbD17bGFiZWx9XHJcbiAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cclxuICAgICAgdHlwZT1cInRlbFwiXHJcbiAgICAgIHZhbHVlPXtsb2NhbE51bWJlcn1cclxuICAgICAgb25DaGFuZ2U9e2hhbmRsZU51bWJlckNoYW5nZX1cclxuICAgICAgb25CbHVyPXtmaWVsZC5vbkJsdXJ9XHJcbiAgICAgIGlucHV0UmVmPXtmaWVsZC5yZWZ9XHJcbiAgICAgIGZ1bGxXaWR0aFxyXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XHJcbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgZXJyb3I9eyEhZXJyb3J9XHJcbiAgICAgIGhlbHBlclRleHQ9e2Vycm9yTWVzc2FnZX1cclxuICAgICAgc2xvdFByb3BzPXt7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIHN0YXJ0QWRvcm5tZW50OiAoXHJcbiAgICAgICAgICAgIDxJbnB1dEFkb3JubWVudCBwb3NpdGlvbj1cInN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgPENvdW50cnlTZWxlY3RvclxyXG4gICAgICAgICAgICAgICAgdmFsdWU9e3NlbGVjdGVkQ291bnRyeX1cclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDb3VudHJ5Q2hhbmdlfVxyXG4gICAgICAgICAgICAgICAgcHJlZmVycmVkQ291bnRyaWVzPXtwcmVmZXJyZWRDb3VudHJpZXN9XHJcbiAgICAgICAgICAgICAgICBvbmx5Q291bnRyaWVzPXtvbmx5Q291bnRyaWVzfVxyXG4gICAgICAgICAgICAgICAgZXhjbHVkZUNvdW50cmllcz17ZXhjbHVkZUNvdW50cmllc31cclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0lucHV0QWRvcm5tZW50PlxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIC4uLnRleHRGaWVsZFByb3BzPy5zbG90UHJvcHM/LmlucHV0LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4udGV4dEZpZWxkUHJvcHM/LnNsb3RQcm9wcyxcclxuICAgICAgfX1cclxuICAgIC8+XHJcbiAgKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIHBob25lIG51bWJlciBmaWVsZCB3aXRoIGNvdW50cnkgY29kZSBzZWxlY3Rvci5cclxuICpcclxuICogU3RvcmVzIHRoZSB2YWx1ZSBhcyBhbiBFLjE2NCBzdHJpbmcgKGUuZy4gYCsxNTU1MTIzNDU2N2ApLlxyXG4gKiBXaGVuIHRoZSBsb2NhbCBudW1iZXIgaXMgZW1wdHkgdGhlIFJIRiB2YWx1ZSBpcyBgJydgLCBzbyBSZXF1aXJlZCB2YWxpZGF0aW9uIHdvcmtzIGNvcnJlY3RseS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHN4XHJcbiAqIDxQaG9uZU51bWJlckVsZW1lbnRcclxuICogICBuYW1lPVwicGhvbmVcIlxyXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XHJcbiAqICAgbGFiZWw9XCJQaG9uZSBOdW1iZXJcIlxyXG4gKiAgIGRlZmF1bHRDb3VudHJ5PVwiVVNcIlxyXG4gKiAgIHByZWZlcnJlZENvdW50cmllcz17WydVUycsICdHQicsICdDQSddfVxyXG4gKiAgIHJlcXVpcmVkXHJcbiAqIC8+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcclxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFBob25lTnVtYmVyRWxlbWVudCA9IDxcclxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxyXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcclxuPih7XHJcbiAgZ3JpZFByb3BzID0ge30sXHJcbiAgLi4ucHJvcHNcclxufTogUGhvbmVOdW1iZXJFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxyXG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cclxuICAgIDwvR3JpZD5cclxuICApO1xyXG59O1xyXG4iLCAiaW1wb3J0IHR5cGUgeyBNb3VzZUV2ZW50IH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge1xyXG4gIEJ1dHRvbixcclxuICBQb3BvdmVyLFxyXG4gIFRleHRGaWVsZCxcclxuICBMaXN0LFxyXG4gIExpc3RJdGVtQnV0dG9uLFxyXG4gIExpc3RJdGVtVGV4dCxcclxuICBEaXZpZGVyLFxyXG4gIEJveCxcclxuICBJbnB1dEFkb3JubWVudCxcclxuICBUeXBvZ3JhcGh5LFxyXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgQXJyb3dEcm9wRG93bkljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9BcnJvd0Ryb3BEb3duJztcclxuaW1wb3J0IFNlYXJjaEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9TZWFyY2gnO1xyXG5pbXBvcnQgdHlwZSB7IENvdW50cnlEYXRhIH0gZnJvbSAnLi9jb3VudHJpZXMnO1xyXG5pbXBvcnQgeyBDT1VOVFJJRVMgfSBmcm9tICcuL2NvdW50cmllcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvdW50cnlTZWxlY3RvclByb3BzIHtcclxuICAvKiogQ3VycmVudGx5IHNlbGVjdGVkIGNvdW50cnkgKi9cclxuICB2YWx1ZTogQ291bnRyeURhdGE7XHJcbiAgLyoqIENhbGxlZCB3aGVuIHVzZXIgcGlja3MgYSBjb3VudHJ5ICovXHJcbiAgb25DaGFuZ2U6IChjb3VudHJ5OiBDb3VudHJ5RGF0YSkgPT4gdm9pZDtcclxuICAvKiogSVNPIGNvZGVzIHRvIHNob3cgZmlyc3QgaW4gdGhlIGxpc3QgKGUuZy4gWydVUycsICdHQicsICdDQSddKSAqL1xyXG4gIHByZWZlcnJlZENvdW50cmllcz86IHN0cmluZ1tdO1xyXG4gIC8qKiBSZXN0cmljdCB0byBvbmx5IHRoZXNlIElTTyBjb2RlcyAqL1xyXG4gIG9ubHlDb3VudHJpZXM/OiBzdHJpbmdbXTtcclxuICAvKiogRXhjbHVkZSB0aGVzZSBJU08gY29kZXMgKi9cclxuICBleGNsdWRlQ291bnRyaWVzPzogc3RyaW5nW107XHJcbiAgLyoqIERpc2FibGUgdGhlIHNlbGVjdG9yICovXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQ291bnRyeSBjb2RlIHNlbGVjdG9yIHdpdGggc2VhcmNoYWJsZSBwb3BvdmVyLlxyXG4gKiBSZW5kZXJzIGFzIGEgY29tcGFjdCBidXR0b24gc2hvd2luZyBmbGFnICsgZGlhbCBjb2RlICsgZHJvcGRvd24gYXJyb3cuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gQ291bnRyeVNlbGVjdG9yKHtcclxuICB2YWx1ZSxcclxuICBvbkNoYW5nZSxcclxuICBwcmVmZXJyZWRDb3VudHJpZXMgPSBbXSxcclxuICBvbmx5Q291bnRyaWVzLFxyXG4gIGV4Y2x1ZGVDb3VudHJpZXMsXHJcbiAgZGlzYWJsZWQgPSBmYWxzZSxcclxufTogQ291bnRyeVNlbGVjdG9yUHJvcHMpIHtcclxuICBjb25zdCBbYW5jaG9yRWwsIHNldEFuY2hvckVsXSA9IHVzZVN0YXRlPEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbD4obnVsbCk7XHJcbiAgY29uc3QgW3NlYXJjaCwgc2V0U2VhcmNoXSA9IHVzZVN0YXRlKCcnKTtcclxuICBjb25zdCBudW1iZXJJbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKTtcclxuXHJcbiAgY29uc3Qgb3BlbiA9IEJvb2xlYW4oYW5jaG9yRWwpO1xyXG5cclxuICBjb25zdCBoYW5kbGVPcGVuID0gKGU6IE1vdXNlRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzZXRBbmNob3JFbChlLmN1cnJlbnRUYXJnZXQpO1xyXG4gICAgc2V0U2VhcmNoKCcnKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVDbG9zZSA9ICgpID0+IHtcclxuICAgIHNldEFuY2hvckVsKG51bGwpO1xyXG4gICAgc2V0U2VhcmNoKCcnKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVTZWxlY3QgPSAoY291bnRyeTogQ291bnRyeURhdGEpID0+IHtcclxuICAgIG9uQ2hhbmdlKGNvdW50cnkpO1xyXG4gICAgaGFuZGxlQ2xvc2UoKTtcclxuICB9O1xyXG5cclxuICAvLyBCdWlsZCBmaWx0ZXJlZCArIHNvcnRlZCBsaXN0XHJcbiAgY29uc3QgeyBwcmVmZXJyZWQsIHJlc3QgfSA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgbGV0IGxpc3QgPSBDT1VOVFJJRVM7XHJcblxyXG4gICAgaWYgKG9ubHlDb3VudHJpZXMgJiYgb25seUNvdW50cmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQob25seUNvdW50cmllcy5tYXAoKGMpID0+IGMudG9VcHBlckNhc2UoKSkpO1xyXG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKGMpID0+IHNldC5oYXMoYy5jb2RlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV4Y2x1ZGVDb3VudHJpZXMgJiYgZXhjbHVkZUNvdW50cmllcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoZXhjbHVkZUNvdW50cmllcy5tYXAoKGMpID0+IGMudG9VcHBlckNhc2UoKSkpO1xyXG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKGMpID0+ICFzZXQuaGFzKGMuY29kZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlYXJjaExvd2VyID0gc2VhcmNoLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoc2VhcmNoTG93ZXIpIHtcclxuICAgICAgbGlzdCA9IGxpc3QuZmlsdGVyKFxyXG4gICAgICAgIChjKSA9PlxyXG4gICAgICAgICAgYy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoTG93ZXIpIHx8XHJcbiAgICAgICAgICBjLmRpYWxDb2RlLmluY2x1ZGVzKHNlYXJjaExvd2VyKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZWZlcnJlZFNldCA9IG5ldyBTZXQocHJlZmVycmVkQ291bnRyaWVzLm1hcCgoYykgPT4gYy50b1VwcGVyQ2FzZSgpKSk7XHJcbiAgICBjb25zdCBwcmVmZXJyZWRMaXN0ID0gcHJlZmVycmVkQ291bnRyaWVzXHJcbiAgICAgIC5tYXAoKGNvZGUpID0+IGxpc3QuZmluZCgoYykgPT4gYy5jb2RlID09PSBjb2RlLnRvVXBwZXJDYXNlKCkpKVxyXG4gICAgICAuZmlsdGVyKChjKTogYyBpcyBDb3VudHJ5RGF0YSA9PiBjICE9PSB1bmRlZmluZWQpO1xyXG5cclxuICAgIGNvbnN0IHJlc3RMaXN0ID0gbGlzdC5maWx0ZXIoKGMpID0+ICFwcmVmZXJyZWRTZXQuaGFzKGMuY29kZSkpO1xyXG5cclxuICAgIHJldHVybiB7IHByZWZlcnJlZDogcHJlZmVycmVkTGlzdCwgcmVzdDogcmVzdExpc3QgfTtcclxuICB9LCBbc2VhcmNoLCBvbmx5Q291bnRyaWVzLCBleGNsdWRlQ291bnRyaWVzLCBwcmVmZXJyZWRDb3VudHJpZXNdKTtcclxuXHJcbiAgY29uc3Qgc2hvd0RpdmlkZXIgPSBwcmVmZXJyZWQubGVuZ3RoID4gMCAmJiByZXN0Lmxlbmd0aCA+IDA7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICA8QnV0dG9uXHJcbiAgICAgICAgdmFyaWFudD1cInRleHRcIlxyXG4gICAgICAgIHNpemU9XCJzbWFsbFwiXHJcbiAgICAgICAgb25DbGljaz17aGFuZGxlT3Blbn1cclxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XHJcbiAgICAgICAgZGlzYWJsZUVsZXZhdGlvblxyXG4gICAgICAgIGVuZEljb249ezxBcnJvd0Ryb3BEb3duSWNvbiAvPn1cclxuICAgICAgICBzeD17e1xyXG4gICAgICAgICAgbWluV2lkdGg6IDAsXHJcbiAgICAgICAgICBweDogMSxcclxuICAgICAgICAgIHB5OiAwLFxyXG4gICAgICAgICAgY29sb3I6ICd0ZXh0LnByaW1hcnknLFxyXG4gICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcsXHJcbiAgICAgICAgICB0ZXh0VHJhbnNmb3JtOiAnbm9uZScsXHJcbiAgICAgICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcclxuICAgICAgICAgICcmOmhvdmVyJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICdhY3Rpb24uaG92ZXInIH0sXHJcbiAgICAgICAgfX1cclxuICAgICAgPlxyXG4gICAgICAgIDxUeXBvZ3JhcGh5IGNvbXBvbmVudD1cInNwYW5cIiBzeD17eyBtcjogMC41IH19PlxyXG4gICAgICAgICAge3ZhbHVlLmZsYWd9XHJcbiAgICAgICAgPC9UeXBvZ3JhcGh5PlxyXG4gICAgICAgIDxUeXBvZ3JhcGh5IGNvbXBvbmVudD1cInNwYW5cIiB2YXJpYW50PVwiYm9keTJcIj5cclxuICAgICAgICAgIHt2YWx1ZS5kaWFsQ29kZX1cclxuICAgICAgICA8L1R5cG9ncmFwaHk+XHJcbiAgICAgIDwvQnV0dG9uPlxyXG5cclxuICAgICAgPFBvcG92ZXJcclxuICAgICAgICBvcGVuPXtvcGVufVxyXG4gICAgICAgIGFuY2hvckVsPXthbmNob3JFbH1cclxuICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZX1cclxuICAgICAgICBhbmNob3JPcmlnaW49e3sgdmVydGljYWw6ICdib3R0b20nLCBob3Jpem9udGFsOiAnbGVmdCcgfX1cclxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW49e3sgdmVydGljYWw6ICd0b3AnLCBob3Jpem9udGFsOiAnbGVmdCcgfX1cclxuICAgICAgICBzbG90UHJvcHM9e3tcclxuICAgICAgICAgIHBhcGVyOiB7IHN4OiB7IHdpZHRoOiAzMDAsIG1heEhlaWdodDogNDAwLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nIH0gfSxcclxuICAgICAgICB9fVxyXG4gICAgICA+XHJcbiAgICAgICAgPEJveCBzeD17eyBwOiAxLCBib3JkZXJCb3R0b206IDEsIGJvcmRlckNvbG9yOiAnZGl2aWRlcicgfX0+XHJcbiAgICAgICAgICA8VGV4dEZpZWxkXHJcbiAgICAgICAgICAgIGF1dG9Gb2N1c1xyXG4gICAgICAgICAgICBmdWxsV2lkdGhcclxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY291bnRyeSBvciBjb2RlXHUyMDI2XCJcclxuICAgICAgICAgICAgdmFsdWU9e3NlYXJjaH1cclxuICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRTZWFyY2goZS50YXJnZXQudmFsdWUpfVxyXG4gICAgICAgICAgICBzbG90UHJvcHM9e3tcclxuICAgICAgICAgICAgICBpbnB1dDoge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRBZG9ybm1lbnQ6IChcclxuICAgICAgICAgICAgICAgICAgPElucHV0QWRvcm5tZW50IHBvc2l0aW9uPVwic3RhcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8U2VhcmNoSWNvbiBmb250U2l6ZT1cInNtYWxsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9JbnB1dEFkb3JubWVudD5cclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9Cb3g+XHJcblxyXG4gICAgICAgIDxMaXN0IGRlbnNlIGRpc2FibGVQYWRkaW5nIHN4PXt7IG92ZXJmbG93WTogJ2F1dG8nLCBmbGV4OiAxIH19PlxyXG4gICAgICAgICAge3ByZWZlcnJlZC5tYXAoKGNvdW50cnkpID0+IChcclxuICAgICAgICAgICAgPExpc3RJdGVtQnV0dG9uXHJcbiAgICAgICAgICAgICAga2V5PXtgcHJlZmVycmVkLSR7Y291bnRyeS5jb2RlfWB9XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWQ9e2NvdW50cnkuY29kZSA9PT0gdmFsdWUuY29kZX1cclxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVTZWxlY3QoY291bnRyeSl9XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8TGlzdEl0ZW1UZXh0XHJcbiAgICAgICAgICAgICAgICBwcmltYXJ5PXtcclxuICAgICAgICAgICAgICAgICAgPEJveCBzeD17eyBkaXNwbGF5OiAnZmxleCcsIGdhcDogMSwgYWxpZ25JdGVtczogJ2NlbnRlcicgfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2NvdW50cnkuZmxhZ308L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2NvdW50cnkubmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPFR5cG9ncmFwaHlcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudD1cInNwYW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImNhcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJ0ZXh0LnNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzeD17eyBtbDogJ2F1dG8nIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAge2NvdW50cnkuZGlhbENvZGV9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9UeXBvZ3JhcGh5PlxyXG4gICAgICAgICAgICAgICAgICA8L0JveD5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0xpc3RJdGVtQnV0dG9uPlxyXG4gICAgICAgICAgKSl9XHJcblxyXG4gICAgICAgICAge3Nob3dEaXZpZGVyICYmIDxEaXZpZGVyIC8+fVxyXG5cclxuICAgICAgICAgIHtyZXN0Lm1hcCgoY291bnRyeSkgPT4gKFxyXG4gICAgICAgICAgICA8TGlzdEl0ZW1CdXR0b25cclxuICAgICAgICAgICAgICBrZXk9e2NvdW50cnkuY29kZX1cclxuICAgICAgICAgICAgICBzZWxlY3RlZD17Y291bnRyeS5jb2RlID09PSB2YWx1ZS5jb2RlfVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVNlbGVjdChjb3VudHJ5KX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxMaXN0SXRlbVRleHRcclxuICAgICAgICAgICAgICAgIHByaW1hcnk9e1xyXG4gICAgICAgICAgICAgICAgICA8Qm94IHN4PXt7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAxLCBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9fT5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57Y291bnRyeS5mbGFnfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57Y291bnRyeS5uYW1lfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8VHlwb2dyYXBoeVxyXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50PVwic3BhblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiY2FwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInRleHQuc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN4PXt7IG1sOiAnYXV0bycgfX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7Y291bnRyeS5kaWFsQ29kZX1cclxuICAgICAgICAgICAgICAgICAgICA8L1R5cG9ncmFwaHk+XHJcbiAgICAgICAgICAgICAgICAgIDwvQm94PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvTGlzdEl0ZW1CdXR0b24+XHJcbiAgICAgICAgICApKX1cclxuXHJcbiAgICAgICAgICB7cHJlZmVycmVkLmxlbmd0aCA9PT0gMCAmJiByZXN0Lmxlbmd0aCA9PT0gMCAmJiAoXHJcbiAgICAgICAgICAgIDxMaXN0SXRlbUJ1dHRvbiBkaXNhYmxlZD5cclxuICAgICAgICAgICAgICA8TGlzdEl0ZW1UZXh0IHByaW1hcnk9XCJObyBjb3VudHJpZXMgZm91bmRcIiAvPlxyXG4gICAgICAgICAgICA8L0xpc3RJdGVtQnV0dG9uPlxyXG4gICAgICAgICAgKX1cclxuICAgICAgICA8L0xpc3Q+XHJcbiAgICAgIDwvUG9wb3Zlcj5cclxuICAgIDwvPlxyXG4gICk7XHJcbn1cclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgQ291bnRyeURhdGEge1xyXG4gIGNvZGU6IHN0cmluZzsgICAgIC8vIElTTyAzMTY2LTEgYWxwaGEtMiwgZS5nLiAnVVMnXHJcbiAgZGlhbENvZGU6IHN0cmluZzsgLy8gRS4xNjQgcHJlZml4LCBlLmcuICcrMSdcclxuICBuYW1lOiBzdHJpbmc7ICAgICAvLyBEaXNwbGF5IG5hbWUsIGUuZy4gJ1VuaXRlZCBTdGF0ZXMnXHJcbiAgZmxhZzogc3RyaW5nOyAgICAgLy8gRmxhZyBlbW9qaSwgZS5nLiAnXHVEODNDXHVEREZBXHVEODNDXHVEREY4J1xyXG59XHJcblxyXG4vKiogR2VuZXJhdGVzIGEgVW5pY29kZSBmbGFnIGVtb2ppIGZyb20gYSAyLWxldHRlciBJU08gY291bnRyeSBjb2RlLiAqL1xyXG5mdW5jdGlvbiBnZXRGbGFnKGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGNvZGVcclxuICAgIC50b1VwcGVyQ2FzZSgpXHJcbiAgICAuc3BsaXQoJycpXHJcbiAgICAubWFwKChjKSA9PiBTdHJpbmcuZnJvbUNvZGVQb2ludChjLmNoYXJDb2RlQXQoMCkgLSA2NSArIDB4MWYxZTYpKVxyXG4gICAgLmpvaW4oJycpO1xyXG59XHJcblxyXG4vKipcclxuICogUmF3IGNvdW50cnkgZGF0YTogW0lTTyBjb2RlLCBkaWFsIGNvZGUsIGRpc3BsYXkgbmFtZV1cclxuICogU29ydGVkIGFscGhhYmV0aWNhbGx5IGJ5IG5hbWUgKH4yNDAgZW50cmllcykuXHJcbiAqL1xyXG5jb25zdCBSQVc6IEFycmF5PFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXT4gPSBbXHJcbiAgWydBRicsICcrOTMnLCAnQWZnaGFuaXN0YW4nXSxcclxuICBbJ0FMJywgJyszNTUnLCAnQWxiYW5pYSddLFxyXG4gIFsnRFonLCAnKzIxMycsICdBbGdlcmlhJ10sXHJcbiAgWydBRCcsICcrMzc2JywgJ0FuZG9ycmEnXSxcclxuICBbJ0FPJywgJysyNDQnLCAnQW5nb2xhJ10sXHJcbiAgWydBSScsICcrMTI2NCcsICdBbmd1aWxsYSddLFxyXG4gIFsnQUcnLCAnKzEyNjgnLCAnQW50aWd1YSBhbmQgQmFyYnVkYSddLFxyXG4gIFsnQVInLCAnKzU0JywgJ0FyZ2VudGluYSddLFxyXG4gIFsnQU0nLCAnKzM3NCcsICdBcm1lbmlhJ10sXHJcbiAgWydBVycsICcrMjk3JywgJ0FydWJhJ10sXHJcbiAgWydBVScsICcrNjEnLCAnQXVzdHJhbGlhJ10sXHJcbiAgWydBVCcsICcrNDMnLCAnQXVzdHJpYSddLFxyXG4gIFsnQVonLCAnKzk5NCcsICdBemVyYmFpamFuJ10sXHJcbiAgWydCUycsICcrMTI0MicsICdCYWhhbWFzJ10sXHJcbiAgWydCSCcsICcrOTczJywgJ0JhaHJhaW4nXSxcclxuICBbJ0JEJywgJys4ODAnLCAnQmFuZ2xhZGVzaCddLFxyXG4gIFsnQkInLCAnKzEyNDYnLCAnQmFyYmFkb3MnXSxcclxuICBbJ0JZJywgJyszNzUnLCAnQmVsYXJ1cyddLFxyXG4gIFsnQkUnLCAnKzMyJywgJ0JlbGdpdW0nXSxcclxuICBbJ0JaJywgJys1MDEnLCAnQmVsaXplJ10sXHJcbiAgWydCSicsICcrMjI5JywgJ0JlbmluJ10sXHJcbiAgWydCTScsICcrMTQ0MScsICdCZXJtdWRhJ10sXHJcbiAgWydCVCcsICcrOTc1JywgJ0JodXRhbiddLFxyXG4gIFsnQk8nLCAnKzU5MScsICdCb2xpdmlhJ10sXHJcbiAgWydCQScsICcrMzg3JywgJ0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEnXSxcclxuICBbJ0JXJywgJysyNjcnLCAnQm90c3dhbmEnXSxcclxuICBbJ0JSJywgJys1NScsICdCcmF6aWwnXSxcclxuICBbJ1ZHJywgJysxMjg0JywgJ0JyaXRpc2ggVmlyZ2luIElzbGFuZHMnXSxcclxuICBbJ0JOJywgJys2NzMnLCAnQnJ1bmVpJ10sXHJcbiAgWydCRycsICcrMzU5JywgJ0J1bGdhcmlhJ10sXHJcbiAgWydCRicsICcrMjI2JywgJ0J1cmtpbmEgRmFzbyddLFxyXG4gIFsnQkknLCAnKzI1NycsICdCdXJ1bmRpJ10sXHJcbiAgWydDVicsICcrMjM4JywgJ0NhYm8gVmVyZGUnXSxcclxuICBbJ0tIJywgJys4NTUnLCAnQ2FtYm9kaWEnXSxcclxuICBbJ0NNJywgJysyMzcnLCAnQ2FtZXJvb24nXSxcclxuICBbJ0NBJywgJysxJywgJ0NhbmFkYSddLFxyXG4gIFsnS1knLCAnKzEzNDUnLCAnQ2F5bWFuIElzbGFuZHMnXSxcclxuICBbJ0NGJywgJysyMzYnLCAnQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljJ10sXHJcbiAgWydURCcsICcrMjM1JywgJ0NoYWQnXSxcclxuICBbJ0NMJywgJys1NicsICdDaGlsZSddLFxyXG4gIFsnQ04nLCAnKzg2JywgJ0NoaW5hJ10sXHJcbiAgWydDWCcsICcrNjEnLCAnQ2hyaXN0bWFzIElzbGFuZCddLFxyXG4gIFsnQ0MnLCAnKzYxJywgJ0NvY29zIElzbGFuZHMnXSxcclxuICBbJ0NPJywgJys1NycsICdDb2xvbWJpYSddLFxyXG4gIFsnS00nLCAnKzI2OScsICdDb21vcm9zJ10sXHJcbiAgWydDRycsICcrMjQyJywgJ0NvbmdvIChSZXB1YmxpYyknXSxcclxuICBbJ0NEJywgJysyNDMnLCAnQ29uZ28gKERlbW9jcmF0aWMgUmVwdWJsaWMpJ10sXHJcbiAgWydDSycsICcrNjgyJywgJ0Nvb2sgSXNsYW5kcyddLFxyXG4gIFsnQ1InLCAnKzUwNicsICdDb3N0YSBSaWNhJ10sXHJcbiAgWydIUicsICcrMzg1JywgJ0Nyb2F0aWEnXSxcclxuICBbJ0NVJywgJys1MycsICdDdWJhJ10sXHJcbiAgWydDVycsICcrNTk5JywgJ0N1cmFcdTAwRTdhbyddLFxyXG4gIFsnQ1knLCAnKzM1NycsICdDeXBydXMnXSxcclxuICBbJ0NaJywgJys0MjAnLCAnQ3plY2ggUmVwdWJsaWMnXSxcclxuICBbJ0RLJywgJys0NScsICdEZW5tYXJrJ10sXHJcbiAgWydESicsICcrMjUzJywgJ0RqaWJvdXRpJ10sXHJcbiAgWydETScsICcrMTc2NycsICdEb21pbmljYSddLFxyXG4gIFsnRE8nLCAnKzE4MDknLCAnRG9taW5pY2FuIFJlcHVibGljJ10sXHJcbiAgWydFQycsICcrNTkzJywgJ0VjdWFkb3InXSxcclxuICBbJ0VHJywgJysyMCcsICdFZ3lwdCddLFxyXG4gIFsnU1YnLCAnKzUwMycsICdFbCBTYWx2YWRvciddLFxyXG4gIFsnR1EnLCAnKzI0MCcsICdFcXVhdG9yaWFsIEd1aW5lYSddLFxyXG4gIFsnRVInLCAnKzI5MScsICdFcml0cmVhJ10sXHJcbiAgWydFRScsICcrMzcyJywgJ0VzdG9uaWEnXSxcclxuICBbJ1NaJywgJysyNjgnLCAnRXN3YXRpbmknXSxcclxuICBbJ0VUJywgJysyNTEnLCAnRXRoaW9waWEnXSxcclxuICBbJ0ZLJywgJys1MDAnLCAnRmFsa2xhbmQgSXNsYW5kcyddLFxyXG4gIFsnRk8nLCAnKzI5OCcsICdGYXJvZSBJc2xhbmRzJ10sXHJcbiAgWydGSicsICcrNjc5JywgJ0ZpamknXSxcclxuICBbJ0ZJJywgJyszNTgnLCAnRmlubGFuZCddLFxyXG4gIFsnRlInLCAnKzMzJywgJ0ZyYW5jZSddLFxyXG4gIFsnR0YnLCAnKzU5NCcsICdGcmVuY2ggR3VpYW5hJ10sXHJcbiAgWydQRicsICcrNjg5JywgJ0ZyZW5jaCBQb2x5bmVzaWEnXSxcclxuICBbJ0dBJywgJysyNDEnLCAnR2Fib24nXSxcclxuICBbJ0dNJywgJysyMjAnLCAnR2FtYmlhJ10sXHJcbiAgWydHRScsICcrOTk1JywgJ0dlb3JnaWEnXSxcclxuICBbJ0RFJywgJys0OScsICdHZXJtYW55J10sXHJcbiAgWydHSCcsICcrMjMzJywgJ0doYW5hJ10sXHJcbiAgWydHSScsICcrMzUwJywgJ0dpYnJhbHRhciddLFxyXG4gIFsnR1InLCAnKzMwJywgJ0dyZWVjZSddLFxyXG4gIFsnR0wnLCAnKzI5OScsICdHcmVlbmxhbmQnXSxcclxuICBbJ0dEJywgJysxNDczJywgJ0dyZW5hZGEnXSxcclxuICBbJ0dQJywgJys1OTAnLCAnR3VhZGVsb3VwZSddLFxyXG4gIFsnR1UnLCAnKzE2NzEnLCAnR3VhbSddLFxyXG4gIFsnR1QnLCAnKzUwMicsICdHdWF0ZW1hbGEnXSxcclxuICBbJ0dHJywgJys0NCcsICdHdWVybnNleSddLFxyXG4gIFsnR04nLCAnKzIyNCcsICdHdWluZWEnXSxcclxuICBbJ0dXJywgJysyNDUnLCAnR3VpbmVhLUJpc3NhdSddLFxyXG4gIFsnR1knLCAnKzU5MicsICdHdXlhbmEnXSxcclxuICBbJ0hUJywgJys1MDknLCAnSGFpdGknXSxcclxuICBbJ0hOJywgJys1MDQnLCAnSG9uZHVyYXMnXSxcclxuICBbJ0hLJywgJys4NTInLCAnSG9uZyBLb25nJ10sXHJcbiAgWydIVScsICcrMzYnLCAnSHVuZ2FyeSddLFxyXG4gIFsnSVMnLCAnKzM1NCcsICdJY2VsYW5kJ10sXHJcbiAgWydJTicsICcrOTEnLCAnSW5kaWEnXSxcclxuICBbJ0lEJywgJys2MicsICdJbmRvbmVzaWEnXSxcclxuICBbJ0lSJywgJys5OCcsICdJcmFuJ10sXHJcbiAgWydJUScsICcrOTY0JywgJ0lyYXEnXSxcclxuICBbJ0lFJywgJyszNTMnLCAnSXJlbGFuZCddLFxyXG4gIFsnSU0nLCAnKzQ0JywgJ0lzbGUgb2YgTWFuJ10sXHJcbiAgWydJTCcsICcrOTcyJywgJ0lzcmFlbCddLFxyXG4gIFsnSVQnLCAnKzM5JywgJ0l0YWx5J10sXHJcbiAgWydKTScsICcrMTg3NicsICdKYW1haWNhJ10sXHJcbiAgWydKUCcsICcrODEnLCAnSmFwYW4nXSxcclxuICBbJ0pFJywgJys0NCcsICdKZXJzZXknXSxcclxuICBbJ0pPJywgJys5NjInLCAnSm9yZGFuJ10sXHJcbiAgWydLWicsICcrNycsICdLYXpha2hzdGFuJ10sXHJcbiAgWydLRScsICcrMjU0JywgJ0tlbnlhJ10sXHJcbiAgWydLSScsICcrNjg2JywgJ0tpcmliYXRpJ10sXHJcbiAgWydYSycsICcrMzgzJywgJ0tvc292byddLFxyXG4gIFsnS1cnLCAnKzk2NScsICdLdXdhaXQnXSxcclxuICBbJ0tHJywgJys5OTYnLCAnS3lyZ3l6c3RhbiddLFxyXG4gIFsnTEEnLCAnKzg1NicsICdMYW9zJ10sXHJcbiAgWydMVicsICcrMzcxJywgJ0xhdHZpYSddLFxyXG4gIFsnTEInLCAnKzk2MScsICdMZWJhbm9uJ10sXHJcbiAgWydMUycsICcrMjY2JywgJ0xlc290aG8nXSxcclxuICBbJ0xSJywgJysyMzEnLCAnTGliZXJpYSddLFxyXG4gIFsnTFknLCAnKzIxOCcsICdMaWJ5YSddLFxyXG4gIFsnTEknLCAnKzQyMycsICdMaWVjaHRlbnN0ZWluJ10sXHJcbiAgWydMVCcsICcrMzcwJywgJ0xpdGh1YW5pYSddLFxyXG4gIFsnTFUnLCAnKzM1MicsICdMdXhlbWJvdXJnJ10sXHJcbiAgWydNTycsICcrODUzJywgJ01hY2FvJ10sXHJcbiAgWydNRycsICcrMjYxJywgJ01hZGFnYXNjYXInXSxcclxuICBbJ01XJywgJysyNjUnLCAnTWFsYXdpJ10sXHJcbiAgWydNWScsICcrNjAnLCAnTWFsYXlzaWEnXSxcclxuICBbJ01WJywgJys5NjAnLCAnTWFsZGl2ZXMnXSxcclxuICBbJ01MJywgJysyMjMnLCAnTWFsaSddLFxyXG4gIFsnTVQnLCAnKzM1NicsICdNYWx0YSddLFxyXG4gIFsnTUgnLCAnKzY5MicsICdNYXJzaGFsbCBJc2xhbmRzJ10sXHJcbiAgWydNUScsICcrNTk2JywgJ01hcnRpbmlxdWUnXSxcclxuICBbJ01SJywgJysyMjInLCAnTWF1cml0YW5pYSddLFxyXG4gIFsnTVUnLCAnKzIzMCcsICdNYXVyaXRpdXMnXSxcclxuICBbJ1lUJywgJysyNjInLCAnTWF5b3R0ZSddLFxyXG4gIFsnTVgnLCAnKzUyJywgJ01leGljbyddLFxyXG4gIFsnRk0nLCAnKzY5MScsICdNaWNyb25lc2lhJ10sXHJcbiAgWydNRCcsICcrMzczJywgJ01vbGRvdmEnXSxcclxuICBbJ01DJywgJyszNzcnLCAnTW9uYWNvJ10sXHJcbiAgWydNTicsICcrOTc2JywgJ01vbmdvbGlhJ10sXHJcbiAgWydNRScsICcrMzgyJywgJ01vbnRlbmVncm8nXSxcclxuICBbJ01TJywgJysxNjY0JywgJ01vbnRzZXJyYXQnXSxcclxuICBbJ01BJywgJysyMTInLCAnTW9yb2NjbyddLFxyXG4gIFsnTVonLCAnKzI1OCcsICdNb3phbWJpcXVlJ10sXHJcbiAgWydNTScsICcrOTUnLCAnTXlhbm1hciddLFxyXG4gIFsnTkEnLCAnKzI2NCcsICdOYW1pYmlhJ10sXHJcbiAgWydOUicsICcrNjc0JywgJ05hdXJ1J10sXHJcbiAgWydOUCcsICcrOTc3JywgJ05lcGFsJ10sXHJcbiAgWydOTCcsICcrMzEnLCAnTmV0aGVybGFuZHMnXSxcclxuICBbJ05DJywgJys2ODcnLCAnTmV3IENhbGVkb25pYSddLFxyXG4gIFsnTlonLCAnKzY0JywgJ05ldyBaZWFsYW5kJ10sXHJcbiAgWydOSScsICcrNTA1JywgJ05pY2FyYWd1YSddLFxyXG4gIFsnTkUnLCAnKzIyNycsICdOaWdlciddLFxyXG4gIFsnTkcnLCAnKzIzNCcsICdOaWdlcmlhJ10sXHJcbiAgWydOVScsICcrNjgzJywgJ05pdWUnXSxcclxuICBbJ05GJywgJys2NzInLCAnTm9yZm9sayBJc2xhbmQnXSxcclxuICBbJ0tQJywgJys4NTAnLCAnTm9ydGggS29yZWEnXSxcclxuICBbJ01LJywgJyszODknLCAnTm9ydGggTWFjZWRvbmlhJ10sXHJcbiAgWydNUCcsICcrMTY3MCcsICdOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMnXSxcclxuICBbJ05PJywgJys0NycsICdOb3J3YXknXSxcclxuICBbJ09NJywgJys5NjgnLCAnT21hbiddLFxyXG4gIFsnUEsnLCAnKzkyJywgJ1Bha2lzdGFuJ10sXHJcbiAgWydQVycsICcrNjgwJywgJ1BhbGF1J10sXHJcbiAgWydQUycsICcrOTcwJywgJ1BhbGVzdGluZSddLFxyXG4gIFsnUEEnLCAnKzUwNycsICdQYW5hbWEnXSxcclxuICBbJ1BHJywgJys2NzUnLCAnUGFwdWEgTmV3IEd1aW5lYSddLFxyXG4gIFsnUFknLCAnKzU5NScsICdQYXJhZ3VheSddLFxyXG4gIFsnUEUnLCAnKzUxJywgJ1BlcnUnXSxcclxuICBbJ1BIJywgJys2MycsICdQaGlsaXBwaW5lcyddLFxyXG4gIFsnUEwnLCAnKzQ4JywgJ1BvbGFuZCddLFxyXG4gIFsnUFQnLCAnKzM1MScsICdQb3J0dWdhbCddLFxyXG4gIFsnUFInLCAnKzE3ODcnLCAnUHVlcnRvIFJpY28nXSxcclxuICBbJ1FBJywgJys5NzQnLCAnUWF0YXInXSxcclxuICBbJ1JFJywgJysyNjInLCAnUlx1MDBFOXVuaW9uJ10sXHJcbiAgWydSTycsICcrNDAnLCAnUm9tYW5pYSddLFxyXG4gIFsnUlUnLCAnKzcnLCAnUnVzc2lhJ10sXHJcbiAgWydSVycsICcrMjUwJywgJ1J3YW5kYSddLFxyXG4gIFsnQkwnLCAnKzU5MCcsICdTYWludCBCYXJ0aFx1MDBFOWxlbXknXSxcclxuICBbJ1NIJywgJysyOTAnLCAnU2FpbnQgSGVsZW5hJ10sXHJcbiAgWydLTicsICcrMTg2OScsICdTYWludCBLaXR0cyBhbmQgTmV2aXMnXSxcclxuICBbJ0xDJywgJysxNzU4JywgJ1NhaW50IEx1Y2lhJ10sXHJcbiAgWydNRicsICcrNTkwJywgJ1NhaW50IE1hcnRpbiddLFxyXG4gIFsnUE0nLCAnKzUwOCcsICdTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uJ10sXHJcbiAgWydWQycsICcrMTc4NCcsICdTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcyddLFxyXG4gIFsnV1MnLCAnKzY4NScsICdTYW1vYSddLFxyXG4gIFsnU00nLCAnKzM3OCcsICdTYW4gTWFyaW5vJ10sXHJcbiAgWydTVCcsICcrMjM5JywgJ1NhbyBUb21lIGFuZCBQcmluY2lwZSddLFxyXG4gIFsnU0EnLCAnKzk2NicsICdTYXVkaSBBcmFiaWEnXSxcclxuICBbJ1NOJywgJysyMjEnLCAnU2VuZWdhbCddLFxyXG4gIFsnUlMnLCAnKzM4MScsICdTZXJiaWEnXSxcclxuICBbJ1NDJywgJysyNDgnLCAnU2V5Y2hlbGxlcyddLFxyXG4gIFsnU0wnLCAnKzIzMicsICdTaWVycmEgTGVvbmUnXSxcclxuICBbJ1NHJywgJys2NScsICdTaW5nYXBvcmUnXSxcclxuICBbJ1NYJywgJysxNzIxJywgJ1NpbnQgTWFhcnRlbiddLFxyXG4gIFsnU0snLCAnKzQyMScsICdTbG92YWtpYSddLFxyXG4gIFsnU0knLCAnKzM4NicsICdTbG92ZW5pYSddLFxyXG4gIFsnU0InLCAnKzY3NycsICdTb2xvbW9uIElzbGFuZHMnXSxcclxuICBbJ1NPJywgJysyNTInLCAnU29tYWxpYSddLFxyXG4gIFsnWkEnLCAnKzI3JywgJ1NvdXRoIEFmcmljYSddLFxyXG4gIFsnS1InLCAnKzgyJywgJ1NvdXRoIEtvcmVhJ10sXHJcbiAgWydTUycsICcrMjExJywgJ1NvdXRoIFN1ZGFuJ10sXHJcbiAgWydFUycsICcrMzQnLCAnU3BhaW4nXSxcclxuICBbJ0xLJywgJys5NCcsICdTcmkgTGFua2EnXSxcclxuICBbJ1NEJywgJysyNDknLCAnU3VkYW4nXSxcclxuICBbJ1NSJywgJys1OTcnLCAnU3VyaW5hbWUnXSxcclxuICBbJ1NFJywgJys0NicsICdTd2VkZW4nXSxcclxuICBbJ0NIJywgJys0MScsICdTd2l0emVybGFuZCddLFxyXG4gIFsnU1knLCAnKzk2MycsICdTeXJpYSddLFxyXG4gIFsnVFcnLCAnKzg4NicsICdUYWl3YW4nXSxcclxuICBbJ1RKJywgJys5OTInLCAnVGFqaWtpc3RhbiddLFxyXG4gIFsnVFonLCAnKzI1NScsICdUYW56YW5pYSddLFxyXG4gIFsnVEgnLCAnKzY2JywgJ1RoYWlsYW5kJ10sXHJcbiAgWydUTCcsICcrNjcwJywgJ1RpbW9yLUxlc3RlJ10sXHJcbiAgWydURycsICcrMjI4JywgJ1RvZ28nXSxcclxuICBbJ1RLJywgJys2OTAnLCAnVG9rZWxhdSddLFxyXG4gIFsnVE8nLCAnKzY3NicsICdUb25nYSddLFxyXG4gIFsnVFQnLCAnKzE4NjgnLCAnVHJpbmlkYWQgYW5kIFRvYmFnbyddLFxyXG4gIFsnVE4nLCAnKzIxNicsICdUdW5pc2lhJ10sXHJcbiAgWydUUicsICcrOTAnLCAnVHVya2V5J10sXHJcbiAgWydUTScsICcrOTkzJywgJ1R1cmttZW5pc3RhbiddLFxyXG4gIFsnVEMnLCAnKzE2NDknLCAnVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzJ10sXHJcbiAgWydUVicsICcrNjg4JywgJ1R1dmFsdSddLFxyXG4gIFsnVUcnLCAnKzI1NicsICdVZ2FuZGEnXSxcclxuICBbJ1VBJywgJyszODAnLCAnVWtyYWluZSddLFxyXG4gIFsnQUUnLCAnKzk3MScsICdVbml0ZWQgQXJhYiBFbWlyYXRlcyddLFxyXG4gIFsnR0InLCAnKzQ0JywgJ1VuaXRlZCBLaW5nZG9tJ10sXHJcbiAgWydVUycsICcrMScsICdVbml0ZWQgU3RhdGVzJ10sXHJcbiAgWydWSScsICcrMTM0MCcsICdVUyBWaXJnaW4gSXNsYW5kcyddLFxyXG4gIFsnVVknLCAnKzU5OCcsICdVcnVndWF5J10sXHJcbiAgWydVWicsICcrOTk4JywgJ1V6YmVraXN0YW4nXSxcclxuICBbJ1ZVJywgJys2NzgnLCAnVmFudWF0dSddLFxyXG4gIFsnVkEnLCAnKzM5JywgJ1ZhdGljYW4gQ2l0eSddLFxyXG4gIFsnVkUnLCAnKzU4JywgJ1ZlbmV6dWVsYSddLFxyXG4gIFsnVk4nLCAnKzg0JywgJ1ZpZXRuYW0nXSxcclxuICBbJ1dGJywgJys2ODEnLCAnV2FsbGlzIGFuZCBGdXR1bmEnXSxcclxuICBbJ1lFJywgJys5NjcnLCAnWWVtZW4nXSxcclxuICBbJ1pNJywgJysyNjAnLCAnWmFtYmlhJ10sXHJcbiAgWydaVycsICcrMjYzJywgJ1ppbWJhYndlJ10sXHJcbl07XHJcblxyXG4vKiogQWxsIGNvdW50cmllcyB3aXRoIGNvbXB1dGVkIGZsYWcgZW1vamlzLCBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkgYnkgbmFtZS4gKi9cclxuZXhwb3J0IGNvbnN0IENPVU5UUklFUzogQ291bnRyeURhdGFbXSA9IFJBVy5tYXAoKFtjb2RlLCBkaWFsQ29kZSwgbmFtZV0pID0+ICh7XHJcbiAgY29kZSxcclxuICBkaWFsQ29kZSxcclxuICBuYW1lLFxyXG4gIGZsYWc6IGdldEZsYWcoY29kZSksXHJcbn0pKTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kIHRoZSBiZXN0IG1hdGNoaW5nIGNvdW50cnkgZm9yIGFuIEUuMTY0IHBob25lIG51bWJlciBzdHJpbmcuXHJcbiAqIFVzZXMgbG9uZ2VzdCBkaWFsIGNvZGUgcHJlZml4IG1hdGNoLiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBmb3VuZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUUxNjRDb3VudHJ5KHZhbHVlOiBzdHJpbmcpOiBDb3VudHJ5RGF0YSB8IHVuZGVmaW5lZCB7XHJcbiAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUuc3RhcnRzV2l0aCgnKycpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIC8vIFNvcnQgYnkgZGlhbENvZGUgbGVuZ3RoIGRlc2NlbmRpbmcgc28gbG9uZ2VzdCBtYXRjaCB3aW5zXHJcbiAgY29uc3Qgc29ydGVkID0gWy4uLkNPVU5UUklFU10uc29ydCgoYSwgYikgPT4gYi5kaWFsQ29kZS5sZW5ndGggLSBhLmRpYWxDb2RlLmxlbmd0aCk7XHJcbiAgcmV0dXJuIHNvcnRlZC5maW5kKChjKSA9PiB2YWx1ZS5zdGFydHNXaXRoKGMuZGlhbENvZGUpKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEV4dHJhY3QgdGhlIGxvY2FsIG51bWJlciBwYXJ0IGZyb20gYW4gRS4xNjQgc3RyaW5nIGdpdmVuIGEgZGlhbCBjb2RlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRTE2NExvY2FsTnVtYmVyKHZhbHVlOiBzdHJpbmcsIGRpYWxDb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGlmICghdmFsdWUgfHwgIXZhbHVlLnN0YXJ0c1dpdGgoZGlhbENvZGUpKSByZXR1cm4gJyc7XHJcbiAgcmV0dXJuIHZhbHVlLnNsaWNlKGRpYWxDb2RlLmxlbmd0aCk7XHJcbn1cclxuIiwgImltcG9ydCB7XG4gIEF1dG9jb21wbGV0ZSxcbiAgQ2lyY3VsYXJQcm9ncmVzcyxcbiAgR3JpZCxcbiAgVGV4dEZpZWxkLFxuICB1c2VUaGVtZSxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvdXRpbHMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgRnJhZ21lbnQsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXIsXG4gIHR5cGUgRmllbGRQYXRoLFxuICB0eXBlIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzLCBPcHRpb25PYmplY3QgfSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdFBheWxvYWQgfSBmcm9tICdAL3R5cGVzJztcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQXN5bmNTZWxlY3RFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oXG4gIHByb3BzOiBBc3luY1NlbGVjdEVsZW1lbnRQcm9wczxcbiAgICBURmllbGRWYWx1ZXMsXG4gICAgVE5hbWUsXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBUT3B0aW9uXG4gID5cbikge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBkaXNhYmxlZCxcbiAgICBjb250cm9sLFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIC8vIGluaXRpYWxWYWx1ZSxcbiAgICAvLyBpc051bGxhYmxlLFxuICAgIGxhYmVsLFxuICAgIHF1ZXJ5Rm4sXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyBhcyBUTGFiZWxLZXksXG4gICAgdmFsdWVGaWVsZCA9ICdWYWx1ZScgYXMgVFZhbHVlS2V5LFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtzZWxlY3RlZE9wdGlvbiwgc2V0U2VsZWN0ZWRPcHRpb25dID0gdXNlU3RhdGU8VE9wdGlvbiB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPHJlYWRvbmx5IFRPcHRpb25bXT4oW10pO1xuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgLy8gVHJhY2sgd2hhdCB2YWx1ZSB3ZSd2ZSBsb2FkZWQgdG8gcHJldmVudCBkdXBsaWNhdGUgQVBJIGNhbGxzXG4gIGNvbnN0IGxvYWRlZFZhbHVlUmVmID0gdXNlUmVmPFRPcHRpb25bVFZhbHVlS2V5XSB8IG51bGwgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuXG4gIGNvbnN0IGZldGNoRGF0YSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRlYm91bmNlKFxuICAgICAgICAoXG4gICAgICAgICAgcGF5bG9hZDogQXN5bmNTZWxlY3RQYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4gdm9pZFxuICAgICAgICApID0+IHtcbiAgICAgICAgICBxdWVyeUZuKHBheWxvYWQpLnRoZW4oYyA9PiBjYWxsYmFjayhjKSk7XG4gICAgICAgIH0sXG4gICAgICAgIDQwMFxuICAgICAgKSxcbiAgICBbcXVlcnlGbl1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bdmFsdWVGaWVsZF0pIDogJyc7XG4gICAgfSxcbiAgICBbdmFsdWVGaWVsZF1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZF0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxGaWVsZF1cbiAgKTtcblxuICAvLyBFZmZlY3Q6IEhhbmRsZSBzZWFyY2ggcXVlcnkgaW5wdXRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBmaWVsZC52YWx1ZTtcblxuICAgIC8vIENvbmRpdGlvbiAxOiBBIHZhbHVlIGlzIHNldCBmcm9tIHRoZSBmb3JtLCBhbmQgd2UgaGF2ZW4ndCBsb2FkZWQgaXQgeWV0LlxuICAgIGlmIChjdXJyZW50VmFsdWUgJiYgbG9hZGVkVmFsdWVSZWYuY3VycmVudCAhPT0gY3VycmVudFZhbHVlKSB7XG4gICAgICAvLyBEb24ndCBmZXRjaCBpZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGlzIGFscmVhZHkgY29ycmVjdFxuICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uICYmIGdldE9wdGlvblZhbHVlKHNlbGVjdGVkT3B0aW9uKSA9PT0gY3VycmVudFZhbHVlKSB7XG4gICAgICAgIGxvYWRlZFZhbHVlUmVmLmN1cnJlbnQgPSBjdXJyZW50VmFsdWU7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgbG9hZGVkVmFsdWVSZWYuY3VycmVudCA9IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgZmV0Y2hEYXRhKHsgUXVlcnk6IG51bGwsIFNlbGVjdGVkVmFsdWU6IGN1cnJlbnRWYWx1ZSB9LCByZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRPcHRpb24gPSByZXN1bHRzPy5maW5kKFxuICAgICAgICAgIG9wdGlvbiA9PiBTdHJpbmcoZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSkgPT09IFN0cmluZyhjdXJyZW50VmFsdWUpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKG1hdGNoZWRPcHRpb24pIHtcbiAgICAgICAgICBzZXRPcHRpb25zKFttYXRjaGVkT3B0aW9uXSk7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obWF0Y2hlZE9wdGlvbik7XG4gICAgICAgICAgc2V0SW5wdXRWYWx1ZShnZXRPcHRpb25MYWJlbChtYXRjaGVkT3B0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47IC8vIEVuZCBvZiBlZmZlY3RcbiAgICB9XG5cbiAgICAvLyBDb25kaXRpb24gMjogVGhlIHVzZXIgaXMgdHlwaW5nIGEgc2VhcmNoIHF1ZXJ5LCBvciB0aGUgaW5wdXQgaXMgY2xlYXJlZC5cbiAgICAvLyBUaGlzIHJ1bnMgaWYgdGhlIGlucHV0IHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc2VsZWN0ZWQgb3B0aW9uJ3MgbGFiZWwuXG4gICAgaWYgKGlucHV0VmFsdWUgIT09IChzZWxlY3RlZE9wdGlvbiA/IGdldE9wdGlvbkxhYmVsKHNlbGVjdGVkT3B0aW9uKSA6ICcnKSkge1xuICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGVtcHR5LCBjbGVhciBvcHRpb25zIGltbWVkaWF0ZWx5IHdpdGhvdXQgYW4gQVBJIGNhbGwuXG4gICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gJycpIHtcbiAgICAgICAgc2V0T3B0aW9ucyhbXSk7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXJ3aXNlLCBmZXRjaCBuZXcgb3B0aW9ucyBiYXNlZCBvbiB0aGUgaW5wdXQuXG4gICAgICBjb25zdCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgICBmZXRjaERhdGEoeyBRdWVyeTogaW5wdXRWYWx1ZSwgU2VsZWN0ZWRWYWx1ZTogbnVsbCB9LCByZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKCFhY3RpdmUpIHJldHVybjtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIHNldE9wdGlvbnMocmVzdWx0cyB8fCBbXSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuOyAvLyBFbmQgb2YgZWZmZWN0XG4gICAgfVxuXG4gICAgLy8gQ29uZGl0aW9uIDM6IFRoZSB2YWx1ZSBoYXMgYmVlbiBjbGVhcmVkIGZyb20gdGhlIGZvcm0uXG4gICAgaWYgKCFjdXJyZW50VmFsdWUgJiYgc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG51bGwpO1xuICAgICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgICBzZXRPcHRpb25zKFtdKTtcbiAgICAgIGxvYWRlZFZhbHVlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCBbXG4gICAgZmllbGQudmFsdWUsXG4gICAgaW5wdXRWYWx1ZSxcbiAgICBmZXRjaERhdGEsXG4gICAgZ2V0T3B0aW9uTGFiZWwsXG4gICAgZ2V0T3B0aW9uVmFsdWUsXG4gICAgc2VsZWN0ZWRPcHRpb24sXG4gICAgbGFiZWxGaWVsZCxcbiAgICB2YWx1ZUZpZWxkLFxuICBdKTtcblxuICBjb25zdCBpc0Rpc2FibGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGRpc2FibGVkID8/IGZhbHNlO1xuICB9LCBbZGlzYWJsZWRdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoXzogUmVhY3QuU3ludGhldGljRXZlbnQsIG5ld1NlbGVjdGVkT3B0aW9uOiBUT3B0aW9uIHwgbnVsbCkgPT4ge1xuICAgICAgc2V0U2VsZWN0ZWRPcHRpb24obmV3U2VsZWN0ZWRPcHRpb24pO1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBuZXdTZWxlY3RlZE9wdGlvblxuICAgICAgICA/IGdldE9wdGlvblZhbHVlKG5ld1NlbGVjdGVkT3B0aW9uKVxuICAgICAgICA6IG51bGw7XG5cbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlKTtcbiAgICAgIGxvYWRlZFZhbHVlUmVmLmN1cnJlbnQgPSBuZXdWYWx1ZSBhc1xuICAgICAgICB8IFRPcHRpb25bVFZhbHVlS2V5XVxuICAgICAgICB8IG51bGxcbiAgICAgICAgfCB1bmRlZmluZWQ7IC8vIFRyYWNrIGNoYW5nZVxuXG4gICAgICAvLyBTeW5jIGlucHV0IHZhbHVlIHdpdGggdGhlIHNlbGVjdGlvblxuICAgICAgaWYgKG5ld1NlbGVjdGVkT3B0aW9uKSB7XG4gICAgICAgIHNldElucHV0VmFsdWUoZ2V0T3B0aW9uTGFiZWwobmV3U2VsZWN0ZWRPcHRpb24pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgICAgICBzZXRPcHRpb25zKFtdKTsgLy8gQ2xlYXIgb3B0aW9ucyB3aGVuIHNlbGVjdGlvbiBpcyBjbGVhcmVkXG4gICAgICB9XG4gICAgfSxcbiAgICBbZmllbGQsIGdldE9wdGlvblZhbHVlLCBnZXRPcHRpb25MYWJlbF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChfOiBSZWFjdC5TeW50aGV0aWNFdmVudCwgbmV3SW5wdXRWYWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICBzZXRJbnB1dFZhbHVlKG5ld0lucHV0VmFsdWUpO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBoYW5kbGVCbHVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIC8vIFdoZW4gZm9jdXMgaXMgbG9zdCwgc3luYyB0aGUgaW5wdXQgdmFsdWUgYmFjayB0byB0aGUgc2VsZWN0ZWQgb3B0aW9uJ3MgbGFiZWxcbiAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgIHNldElucHV0VmFsdWUoZ2V0T3B0aW9uTGFiZWwoc2VsZWN0ZWRPcHRpb24pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgbm90aGluZyBpcyBzZWxlY3RlZCwgY2xlYXIgdGhlIGlucHV0XG4gICAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICB9XG4gIH0sIFtzZWxlY3RlZE9wdGlvbiwgZ2V0T3B0aW9uTGFiZWxdKTtcblxuICBjb25zdCBoYW5kbGVPcGVuID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldE9wZW4odHJ1ZSk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVDbG9zZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRPcGVuKGZhbHNlKTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIG9wZW49e29wZW59XG4gICAgICBvbk9wZW49e2hhbmRsZU9wZW59XG4gICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZX1cbiAgICAgIG9uQmx1cj17aGFuZGxlQmx1cn1cbiAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBnZXRPcHRpb25LZXk9e2dldE9wdGlvblZhbHVlfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9eyhvcHRpb24sIHZhbHVlKSA9PlxuICAgICAgICBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBnZXRPcHRpb25WYWx1ZSh2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGF1dG9Db21wbGV0ZVxuICAgICAgZGlzYWJsZWQ9e2lzRGlzYWJsZWR9XG4gICAgICBpbmNsdWRlSW5wdXRJbkxpc3RcbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICB2YWx1ZT17c2VsZWN0ZWRPcHRpb259XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnNcbiAgICAgIGZpbHRlck9wdGlvbnM9e3ggPT4geH1cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbklucHV0Q2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgIHN4PXt7XG4gICAgICAgICcmLk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYgLk11aUlucHV0QmFzZS1yb290Lk11aS1kaXNhYmxlZCc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkQmFja2dyb3VuZCxcbiAgICAgICAgICBjdXJzb3I6ICdub3QtYWxsb3dlZCAhaW1wb3J0YW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgJyYuTXVpLWRpc2FibGVkIC5NdWlBdXRvY29tcGxldGUtcG9wdXBJbmRpY2F0b3InOiB7XG4gICAgICAgICAgY3Vyc29yOiAnbm90LWFsbG93ZWQgIWltcG9ydGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgICcmIC5NdWlPdXRsaW5lZElucHV0LXJvb3QuTXVpLWRpc2FibGVkIC5NdWlPdXRsaW5lZElucHV0LW5vdGNoZWRPdXRsaW5lJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBib3JkZXJDb2xvcjogZXJyb3IgPyAncmVkJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICAnJiAuTXVpRmlsbGVkSW5wdXQtcm9vdC5NdWktZGlzYWJsZWQnOiB7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IGVycm9yID8gJ3JlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgICAgbm9PcHRpb25zVGV4dD1cIlR5cGUgU29tZXRoaW5nLi4uXCJcbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICAgICAgaGVscGVyVGV4dD17ZXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJyd9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgLi4ucGFyYW1zLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIGVuZEFkb3JubWVudDogKFxuICAgICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgICAgICAgICA8Q2lyY3VsYXJQcm9ncmVzcyBjb2xvcj1cImluaGVyaXRcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAge3BhcmFtcy5JbnB1dFByb3BzLmVuZEFkb3JubWVudH1cbiAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICByZW5kZXJPcHRpb249eyhyZW5kZXJQcm9wcywgb3B0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCAuLi5vcHRpb25Qcm9wcyB9ID0gcmVuZGVyUHJvcHM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8bGkga2V5PXtrZXl9IHsuLi5vcHRpb25Qcm9wc30+XG4gICAgICAgICAgICB7b3B0aW9uW2xhYmVsRmllbGRdfVxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5jb25zdCBBc3luY1NlbGVjdEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ1ZhbHVlJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ0xhYmVsJyxcbiAgVE9wdGlvbiBleHRlbmRzIE9wdGlvbk9iamVjdDxUVmFsdWVLZXksIFRMYWJlbEtleT4gPSBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleVxuICA+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQXN5bmNTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyxcbiAgVE5hbWUsXG4gIFRWYWx1ZUtleSxcbiAgVExhYmVsS2V5LFxuICBUT3B0aW9uXG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZUtleSwgVExhYmVsS2V5LCBUT3B0aW9uPlxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG5cbkFzeW5jU2VsZWN0RWxlbWVudC5kaXNwbGF5TmFtZSA9ICdBc3luY1NlbGVjdEVsZW1lbnQnO1xuXG5leHBvcnQgeyBBc3luY1NlbGVjdEVsZW1lbnQgfTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEdyaWRQcm9wcyxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIFRleHRGaWVsZFZhcmlhbnRzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIFRleHRGaWVsZCwgdXNlRm9ya1JlZiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VFdmVudCwgUmVhY3RFbGVtZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnRyb2wsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VFbmhhbmNlZFRyYW5zZm9ybSB9IGZyb20gJ0AvaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tICdAL2hvb2tzJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnQC90eXBlcyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBUZXh0RmllbGRFbGVtZW50IGNvbXBvbmVudC5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDdXN0b20gVGV4dEZpZWxkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBkZWZhdWx0IE1VSSBUZXh0RmllbGRcbiAgICovXG4gIGNvbXBvbmVudD86IHR5cGVvZiBUZXh0RmllbGQ7XG4gIC8qKlxuICAgKiBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIGlucHV0L291dHB1dFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZmllbGRUeXBlIGZvciBjb21tb24gcGF0dGVybnMgb3IgY3VzdG9tIHRyYW5zZm9ybXMgZm9yIGNvbXBsZXggY2FzZXNcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICAvKipcbiAgICogQnVpbHQtaW4gZmllbGQgdHlwZSBmb3IgYXV0b21hdGljIHRyYW5zZm9ybWF0aW9uXG4gICAqIEBleGFtcGxlICd0ZXh0JyB8ICdudW1iZXInIHwgJ2RhdGUnIHwgJ3RpbWUnIHwgJ3NlbGVjdCdcbiAgICovXG4gIGZpZWxkVHlwZT86IEZpZWxkVHlwZTtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWUgdG8gZGlzcGxheSB3aGVuIGZpZWxkIHZhbHVlIGlzIG51bGwvdW5kZWZpbmVkXG4gICAqIEBleGFtcGxlIFwiXCJcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFRWYWx1ZTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0XG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxuICAgKiBAZXhhbXBsZSBcIkVudGVyIHlvdXIgZW1haWxcIlxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXIgR3JpZCBjb21wb25lbnRcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgVGV4dEZpZWxkIHZhcmlhbnRcbiAgICogQGRlZmF1bHRWYWx1ZSBcIm91dGxpbmVkXCJcbiAgICovXG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgLyoqXG4gICAqIEN1c3RvbSBvbkNoYW5nZSBoYW5kbGVyIGNhbGxlZCBhZnRlciB0cmFuc2Zvcm1hdGlvblxuICAgKi9cbiAgb25DaGFuZ2U/OiAoXG4gICAgZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PlxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyB0cmFuc2Zvcm1hdGlvbiBpc3N1ZXNcbiAgICogQGRlZmF1bHRWYWx1ZSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J1xuICAgKi9cbiAgZW5hYmxlV2FybmluZ3M/OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIE51bWJlckZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+KHByb3BzOiBOdW1iZXJGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICB0cmFuc2Zvcm0sXG4gICAgZmllbGRUeXBlID0gJ3RleHQnLCAvLyBEZWZhdWx0IHRvIHRleHQgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIGVuYWJsZVdhcm5pbmdzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgbWF4TGVuZ3RoLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICB0eXBlID0gJ251bWJlcicsXG4gICAgcmVxdWlyZWQsXG4gICAgaGVscGVyVGV4dCxcbiAgICBpbnB1dFJlZixcbiAgICBvbklucHV0LFxuICAgIG9uQmx1cixcbiAgICBkaXNhYmxlZCxcbiAgICAuLi5yZXN0VGV4dFByb3BzXG4gIH0gPSB0ZXh0RmllbGRQcm9wcztcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICAvLyBVc2UgdGhlIGVuaGFuY2VkIHRyYW5zZm9ybSBob29rIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uc1xuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRW5oYW5jZWRUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPihcbiAgICB7XG4gICAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGlucHV0OiB0cmFuc2Zvcm0uaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHRyYW5zZm9ybS5vdXRwdXQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGZpZWxkVHlwZTogIXRyYW5zZm9ybVxuICAgICAgICA/IHR5cGUgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBtYXhMZW5ndGggJiYgbWF4TGVuZ3RoID4gNVxuICAgICAgICAgICAgPyAndGV4dCdcbiAgICAgICAgICAgIDogJ251bWJlcidcbiAgICAgICAgICA6IGZpZWxkVHlwZVxuICAgICAgICA6IHVuZGVmaW5lZCwgLy8gQXV0by1kZXRlY3QgbnVtYmVyIHR5cGVcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGVuYWJsZVdhcm5pbmdzLFxuICAgIH1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkQ29tcG9uZW50XG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgbmFtZT17ZmllbGQubmFtZX1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgIG9uQ2hhbmdlPXtldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gJycpIHtcbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25JbnB1dD17KGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICBtYXhMZW5ndGggJiZcbiAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUubGVuZ3RoID4gbWF4TGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZS5zbGljZSgwLCBtYXhMZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvbklucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25JbnB1dChldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbldoZWVsPXtlID0+IHtcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5ibHVyKCk7XG4gICAgICB9fVxuICAgICAgb25LZXlEb3duPXtlID0+IHtcbiAgICAgICAgaWYgKFsnZScsICdFJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ10uaW5jbHVkZXMoZS5rZXkpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICB0eXBlPXt0eXBlfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtcbiAgICAgICAgZXJyb3IgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSkgOiBoZWxwZXJUZXh0XG4gICAgICB9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICBzbG90UHJvcHM9e3sgaHRtbElucHV0OiB7IG1heExlbmd0aCB9IH19XG4gICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBUZXh0RmllbGQgY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24sXG4gKiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLCBhbmQgYnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZ1xuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBzdXBwb3J0XG4gKiAtIEJ1aWx0LWluIGZpZWxkIHR5cGVzIGZvciBjb21tb24gcGF0dGVybnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIE9wdGltaXplZCBudW1iZXIgaW5wdXQgaGFuZGxpbmdcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIHdpdGggbWVtb2l6ZWQgdHJhbnNmb3JtYXRpb25zXG4gKiAtIERldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmdcbiAqIC0gU3RhYmxlIHJlZmVyZW5jZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYnVpbHQtaW4gbnVtYmVyIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWdlXCJcbiAqICAgbGFiZWw9XCJBZ2VcIlxuICogICBmaWVsZFR5cGU9XCJudW1iZXJcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0FnZSBpcyByZXF1aXJlZCcsIG1pbjogeyB2YWx1ZTogMCwgbWVzc2FnZTogJ0FnZSBtdXN0IGJlIHBvc2l0aXZlJyB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZW1haWxcIlxuICogICBsYWJlbD1cIkVtYWlsXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBlbWFpbCBhZGRyZXNzXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gKiAgICAgcGF0dGVybjogeyB2YWx1ZTogL1xcUytAXFxTK1xcLlxcUysvLCBtZXNzYWdlOiAnSW52YWxpZCBlbWFpbCcgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwcmljZVwiXG4gKiAgIGxhYmVsPVwiUHJpY2VcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA/IGAkJHt2YWx1ZX1gIDogJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlRmxvYXQoZXZlbnQudGFyZ2V0LnZhbHVlLnJlcGxhY2UoJyQnLCAnJykpIHx8IG51bGxcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZXJyb3IgcGFyc2luZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJuYW1lXCJcbiAqICAgbGFiZWw9XCJVc2VybmFtZVwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IChcbiAqICAgICA8c3BhbiBzdHlsZT17eyBjb2xvcjogJ3JlZCcgfX0+XG4gKiAgICAgICBcdTI2QTBcdUZFMEYge2Vycm9yLm1lc3NhZ2V9XG4gKiAgICAgPC9zcGFuPlxuICogICApfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgTnVtYmVyRmllbGRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IE51bWJlckZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBCb3hQcm9wcywgRm9ybUhlbHBlclRleHRQcm9wcywgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBCb3gsIEdyaWQsIGlucHV0QmFzZUNsYXNzZXMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIE11aU90cElucHV0LFxuICB0eXBlIE11aU90cElucHV0UHJvcHMsXG59IGZyb20gJ211aS1vbmUtdGltZS1wYXNzd29yZC1pbnB1dCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IEhlbHBlclRleHQgfSBmcm9tICcuL0hlbHBlclRleHQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9UUElucHV0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG5cbiAgbWF4U2l6ZT86IG51bWJlcjtcblxuICBwbGFjZWhvbGRlcj86IHN0cmluZztcblxuICBoZWxwZXJUZXh0PzogUmVhY3QuUmVhY3ROb2RlO1xuXG4gIHNsb3RQcm9wcz86IHtcbiAgICB3cmFwcGVyPzogQm94UHJvcHM7XG4gICAgaGVscGVyVGV4dD86IEZvcm1IZWxwZXJUZXh0UHJvcHM7XG4gICAgdGV4dGZpZWxkPzogTXVpT3RwSW5wdXRQcm9wc1snVGV4dEZpZWxkc1Byb3BzJ107XG4gIH07XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gT1RQSW5wdXRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBPVFBJbnB1dEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgLy8gcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgc2xvdFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgbWF4U2l6ZSA9IDU2LFxuICAgIHBsYWNlaG9sZGVyID0gJy0nLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIC8vIGNvbnN0IHtcbiAgLy8gICBmaWVsZCxcbiAgLy8gICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIC8vIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgLy8gICBuYW1lLFxuICAvLyAgIGNvbnRyb2wsXG4gIC8vIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbnRyb2xsZXJcbiAgICAgIG5hbWU9e25hbWV9XG4gICAgICBjb250cm9sPXtjb250cm9sfVxuICAgICAgcmVuZGVyPXsoeyBmaWVsZCwgZmllbGRTdGF0ZTogeyBlcnJvciB9IH0pID0+IChcbiAgICAgICAgPEJveFxuICAgICAgICAgIHsuLi5zbG90UHJvcHM/LndyYXBwZXJ9XG4gICAgICAgICAgc3g9e1tcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIFtgJiAuJHtpbnB1dEJhc2VDbGFzc2VzLmlucHV0fWBdOiB7XG4gICAgICAgICAgICAgICAgcDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBhc3BlY3RSYXRpbzogJzEvMScsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IG1heFNpemUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc2xvdFByb3BzPy53cmFwcGVyPy5zeClcbiAgICAgICAgICAgICAgPyAoc2xvdFByb3BzPy53cmFwcGVyPy5zeCA/PyBbXSlcbiAgICAgICAgICAgICAgOiBbc2xvdFByb3BzPy53cmFwcGVyPy5zeF0pLFxuICAgICAgICAgIF19XG4gICAgICAgID5cbiAgICAgICAgICA8TXVpT3RwSW5wdXRcbiAgICAgICAgICAgIHsuLi5maWVsZH1cbiAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgZ2FwPXsxLjV9XG4gICAgICAgICAgICBsZW5ndGg9ezR9XG4gICAgICAgICAgICBUZXh0RmllbGRzUHJvcHM9e3tcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgIGVycm9yOiAhIWVycm9yLFxuICAgICAgICAgICAgICAuLi5zbG90UHJvcHM/LnRleHRmaWVsZCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPEhlbHBlclRleHRcbiAgICAgICAgICAgIHsuLi5zbG90UHJvcHM/LmhlbHBlclRleHR9XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U9e2Vycm9yPy5tZXNzYWdlfVxuICAgICAgICAgICAgaGVscGVyVGV4dD17aGVscGVyVGV4dH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0JveD5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBPVFBJbnB1dEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IE9UUElucHV0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgRm9ybUhlbHBlclRleHRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUhlbHBlclRleHQnO1xuaW1wb3J0IEZvcm1IZWxwZXJUZXh0IGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUhlbHBlclRleHQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEhlbHBlclRleHRQcm9wcyA9IEZvcm1IZWxwZXJUZXh0UHJvcHMgJiB7XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgZGlzYWJsZUd1dHRlcnM/OiBib29sZWFuO1xuICBoZWxwZXJUZXh0PzogUmVhY3QuUmVhY3ROb2RlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIEhlbHBlclRleHQoe1xuICBzeCxcbiAgaGVscGVyVGV4dCxcbiAgZXJyb3JNZXNzYWdlLFxuICBkaXNhYmxlR3V0dGVycyxcbiAgLi4ub3RoZXJcbn06IEhlbHBlclRleHRQcm9wcykge1xuICBpZiAoZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEZvcm1IZWxwZXJUZXh0XG4gICAgICAgIGVycm9yPXshIWVycm9yTWVzc2FnZX1cbiAgICAgICAgc3g9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBteDogZGlzYWJsZUd1dHRlcnMgPyAwIDogMS43NSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KHN4KSA/IHN4IDogW3N4XSksXG4gICAgICAgIF19XG4gICAgICAgIHsuLi5vdGhlcn1cbiAgICAgID5cbiAgICAgICAge2Vycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0fVxuICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiaW1wb3J0IHsgQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQgfSBmcm9tICcuLi9Bc3luY011bHRpU2VsZWN0L0FzeW5jTXVsdGlTZWxlY3QnO1xuaW1wb3J0IHsgQXN5bmNTZWxlY3RFbGVtZW50IH0gZnJvbSAnLi4vQXN5bmNTZWxlY3QnO1xuaW1wb3J0IHsgQ2hlY2tib3hFbGVtZW50IH0gZnJvbSAnLi4vQ2hlY2tib3hFbGVtZW50JztcbmltcG9ydCB7IENoZWNrYm94R3JvdXBFbGVtZW50IH0gZnJvbSAnLi4vQ2hlY2tib3hHcm91cCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gJy4uL0RhdGVQaWNrZXJFbGVtZW50JztcbmltcG9ydCB7IEZpbGVVcGxvYWRFbGVtZW50IH0gZnJvbSAnLi4vRmlsZVVwbG9hZEVsZW1lbnQnO1xuaW1wb3J0IHsgTnVtYmVyRmllbGRFbGVtZW50IH0gZnJvbSAnLi4vTnVtYmVyRmllbGRFbGVtZW50JztcbmltcG9ydCB7IE9UUElucHV0RWxlbWVudCB9IGZyb20gJy4uL09UUElucHV0RWxlbWVudC9PVFBJbnB1dEVsZW1lbnQnO1xuaW1wb3J0IHsgUGFzc3dvcmRFbGVtZW50IH0gZnJvbSAnLi4vUGFzc3dvcmRFbGVtZW50JztcbmltcG9ydCB7IFBob25lTnVtYmVyRWxlbWVudCB9IGZyb20gJy4uL1Bob25lTnVtYmVyRWxlbWVudCc7XG5pbXBvcnQgeyBSYWRpb0J1dHRvbkdyb3VwIH0gZnJvbSAnLi4vUmFkaW9CdXR0b25Hcm91cCc7XG5pbXBvcnQgeyBTZWxlY3RDYXNjYWRlRWxlbWVudCB9IGZyb20gJy4uL1NlbGVjdENhc2NhZGVFbGVtZW50JztcbmltcG9ydCB7IFNlbGVjdEVsZW1lbnQgfSBmcm9tICcuLi9TZWxlY3RFbGVtZW50JztcbmltcG9ydCB7IFNlbGVjdE11bHRpRWxlbWVudCB9IGZyb20gJy4uL1NlbGVjdE11bHRpRWxlbWVudCc7XG5pbXBvcnQgeyBTbGlkZXJFbGVtZW50IH0gZnJvbSAnLi4vU2xpZGVyRWxlbWVudCc7XG5pbXBvcnQgeyBUZXh0RmllbGRFbGVtZW50IH0gZnJvbSAnLi4vVGV4dEZpZWxkRWxlbWVudCc7XG5pbXBvcnQgeyBUaW1lUGlja2VyRWxlbWVudCB9IGZyb20gJy4uL1RpbWVQaWNrZXJFbGVtZW50JztcblxuY29uc3QgRmllbGQgPSB7XG4gIFRleHQ6IFRleHRGaWVsZEVsZW1lbnQsXG4gIE51bWJlcjogTnVtYmVyRmllbGRFbGVtZW50LFxuICBDaGVja2JveDogQ2hlY2tib3hFbGVtZW50LFxuICBEYXRlOiBEYXRlUGlja2VyRWxlbWVudCxcbiAgUmFkaW9Hcm91cDogUmFkaW9CdXR0b25Hcm91cCxcbiAgUGFzc3dvcmQ6IFBhc3N3b3JkRWxlbWVudCxcbiAgUGhvbmU6IFBob25lTnVtYmVyRWxlbWVudCxcbiAgVGltZTogVGltZVBpY2tlckVsZW1lbnQsXG4gIFNlbGVjdDogU2VsZWN0RWxlbWVudCxcbiAgU2VsZWN0TXVsdGk6IFNlbGVjdE11bHRpRWxlbWVudCxcbiAgU2VsZWN0Q2FzY2FkZTogU2VsZWN0Q2FzY2FkZUVsZW1lbnQsXG4gIEFzeW5jU2VsZWN0OiBBc3luY1NlbGVjdEVsZW1lbnQsXG4gIEFzeW5jTXVsdGlTZWxlY3Q6IEFzeW5jU2VsZWN0TXVsdGlFbGVtZW50LFxuICBDaGVja2JveEdyb3VwOiBDaGVja2JveEdyb3VwRWxlbWVudCxcbiAgT1RQSW5wdXQ6IE9UUElucHV0RWxlbWVudCxcbiAgU2xpZGVyOiBTbGlkZXJFbGVtZW50LFxuICBGaWxlVXBsb2Fk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QUNOLFFBQVFDO0FBQUEsRUFDUixhQUFhQztBQUFBLEVBQ2IsZUFBZUM7QUFBQSxFQUNmLGFBQWFDO0FBQUEsRUFDYixrQkFBa0JDO0FBQUEsRUFDbEIsZUFBZTtBQUFBLEVBQ2YsVUFBVUM7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLFlBQVk7QUFDZDsiLAogICJuYW1lcyI6IFsicHJvcHMiLCAiQXN5bmNTZWxlY3RNdWx0aUVsZW1lbnQiLCAiR3JpZCIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJ1c2VDb250cm9sbGVyIiwgInZhbHVlIiwgIkNoZWNrYm94RWxlbWVudCIsICJHcmlkIiwgIkNoZWNrYm94IiwgIkZvcm1Db250cm9sIiwgIkZvcm1Db250cm9sTGFiZWwiLCAiRm9ybUdyb3VwIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkdyaWQiLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiR3JpZCIsICJmb3J3YXJkUmVmIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZU1lbW8iLCAidXNlVGhlbWUiLCAidXNlTWVtbyIsICJqc3giLCAidXNlQ29udHJvbGxlciIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgImpzeCIsICJmb3J3YXJkUmVmIiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAiR3JpZCIsICJ1c2VTdGF0ZSIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAicGFzc3dvcmQiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtSGVscGVyVGV4dCIsICJGb3JtTGFiZWwiLCAiR3JpZCIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJ1c2VDb250cm9sbGVyIiwgInZhbHVlIiwgIkZvcm1Db250cm9sIiwgIkZvcm1MYWJlbCIsICJGb3JtQ29udHJvbExhYmVsIiwgIkZvcm1IZWxwZXJUZXh0IiwgIlJhZGlvQnV0dG9uR3JvdXAiLCAiR3JpZCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlVGhlbWUiLCAidXNlUmVmIiwgInVzZUVmZmVjdCIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RDYXNjYWRlRWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlVGhlbWUiLCAidXNlTWVtbyIsICJ1c2VFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiR3JpZCIsICJDaGVja2JveCIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAidXNlVGhlbWUiLCAiRnJhZ21lbnQiLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUZvcmtSZWYiLCAiVGV4dEZpZWxkRWxlbWVudCIsICJHcmlkIiwgIkdyaWQiLCAidXNlRm9ya1JlZiIsICJ1c2VMb2NhbGl6YXRpb25Db250ZXh0IiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJ1c2VMb2NhbGl6YXRpb25Db250ZXh0IiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlRm9ya1JlZiIsICJUaW1lUGlja2VyRWxlbWVudCIsICJHcmlkIiwgIkZvcm1Db250cm9sIiwgIkZvcm1IZWxwZXJUZXh0IiwgIkZvcm1MYWJlbCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIkJveCIsICJGb3JtQ29udHJvbCIsICJGb3JtSGVscGVyVGV4dCIsICJGb3JtTGFiZWwiLCAiR3JpZCIsICJ1c2VDYWxsYmFjayIsICJ1c2VSZWYiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAidXNlU3RhdGUiLCAidXNlRWZmZWN0IiwgIlRleHRGaWVsZCIsICJJbnB1dEFkb3JubWVudCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAidXNlU3RhdGUiLCAidXNlUmVmIiwgInVzZU1lbW8iLCAiQnV0dG9uIiwgIlRleHRGaWVsZCIsICJCb3giLCAiSW5wdXRBZG9ybm1lbnQiLCAiRnJhZ21lbnQiLCAianN4IiwgImpzeHMiLCAidXNlU3RhdGUiLCAidXNlUmVmIiwgInVzZU1lbW8iLCAiQnV0dG9uIiwgIkJveCIsICJUZXh0RmllbGQiLCAiSW5wdXRBZG9ybm1lbnQiLCAianN4IiwgIkNvbXBvbmVudCIsICJ1c2VDb250cm9sbGVyIiwgInVzZVN0YXRlIiwgInVzZUVmZmVjdCIsICJtYXRjaCIsICJUZXh0RmllbGQiLCAiSW5wdXRBZG9ybm1lbnQiLCAiR3JpZCIsICJBdXRvY29tcGxldGUiLCAiQ2lyY3VsYXJQcm9ncmVzcyIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VUaGVtZSIsICJkZWJvdW5jZSIsICJGcmFnbWVudCIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VSZWYiLCAidXNlU3RhdGUiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQXN5bmNTZWxlY3RFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkIiwgInVzZUZvcmtSZWYiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAiQ29tcG9uZW50IiwgIlRleHRGaWVsZCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUZvcmtSZWYiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkdyaWQiLCAiQm94IiwgIkdyaWQiLCAiRm9ybUhlbHBlclRleHQiLCAianN4IiwgImpzeCIsICJqc3hzIiwgIkNvbXBvbmVudCIsICJCb3giLCAiT1RQSW5wdXRFbGVtZW50IiwgIkdyaWQiLCAiVGV4dEZpZWxkRWxlbWVudCIsICJOdW1iZXJGaWVsZEVsZW1lbnQiLCAiQ2hlY2tib3hFbGVtZW50IiwgIlJhZGlvQnV0dG9uR3JvdXAiLCAiVGltZVBpY2tlckVsZW1lbnQiLCAiU2VsZWN0RWxlbWVudCIsICJTZWxlY3RNdWx0aUVsZW1lbnQiLCAiU2VsZWN0Q2FzY2FkZUVsZW1lbnQiLCAiQXN5bmNTZWxlY3RFbGVtZW50IiwgIkFzeW5jU2VsZWN0TXVsdGlFbGVtZW50IiwgIk9UUElucHV0RWxlbWVudCJdCn0K
|