@gnwebsoft/ui 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/chunk-246MYJX6.js +479 -0
  2. package/dist/chunk-CE4CSA36.cjs +2262 -0
  3. package/dist/chunk-DJSMLHFO.js +140 -0
  4. package/dist/chunk-GHW77WIM.cjs +72 -0
  5. package/dist/chunk-L3QQX3BK.js +1596 -0
  6. package/dist/chunk-MULSVYFT.js +72 -0
  7. package/dist/chunk-MVPLBJRK.cjs +1 -1
  8. package/dist/chunk-NC3JINIM.cjs +1596 -0
  9. package/dist/chunk-R45OPW5A.js +2262 -0
  10. package/dist/chunk-UEBN47RB.cjs +140 -0
  11. package/dist/chunk-YUVXLOSA.cjs +479 -0
  12. package/dist/core/index.cjs +121 -0
  13. package/dist/core/index.js +121 -0
  14. package/dist/hooks/index.cjs +3 -3
  15. package/dist/hooks/index.js +1 -1
  16. package/dist/index.cjs +81 -7
  17. package/dist/index.js +126 -52
  18. package/dist/types/index.cjs +3 -3
  19. package/dist/types/index.js +1 -1
  20. package/dist/utils/index.cjs +3 -25
  21. package/dist/utils/index.js +3 -25
  22. package/dist/wrappers/index.cjs +4 -4
  23. package/dist/wrappers/index.js +16 -16
  24. package/package.json +22 -17
  25. package/dist/AsyncSelectPayload-B9-6l33R.d.cts +0 -10
  26. package/dist/AsyncSelectPayload-B9-6l33R.d.ts +0 -10
  27. package/dist/chunk-3OPVOWQK.js +0 -140
  28. package/dist/chunk-AEOF2TUF.cjs +0 -2273
  29. package/dist/chunk-ALHC7RLK.js +0 -575
  30. package/dist/chunk-BRRLB22L.js +0 -72
  31. package/dist/chunk-CHZU4PZB.js +0 -2273
  32. package/dist/chunk-EBRUE2WR.cjs +0 -493
  33. package/dist/chunk-HEHPKM4B.cjs +0 -140
  34. package/dist/chunk-K2EJ4YKO.cjs +0 -72
  35. package/dist/chunk-U6SDYCWF.js +0 -493
  36. package/dist/chunk-XY4U6A77.cjs +0 -575
  37. package/dist/components/index.cjs +0 -25
  38. package/dist/components/index.d.cts +0 -752
  39. package/dist/components/index.d.ts +0 -752
  40. package/dist/components/index.js +0 -25
  41. package/dist/enhanced-CDTkKUlj.d.ts +0 -134
  42. package/dist/enhanced-ZQoS03Cd.d.cts +0 -134
  43. package/dist/events-BcHVCLBz.d.cts +0 -77
  44. package/dist/events-BcHVCLBz.d.ts +0 -77
  45. package/dist/hooks/index.d.cts +0 -96
  46. package/dist/hooks/index.d.ts +0 -96
  47. package/dist/index.d.cts +0 -16
  48. package/dist/index.d.ts +0 -16
  49. package/dist/types/index.d.cts +0 -820
  50. package/dist/types/index.d.ts +0 -820
  51. package/dist/utils/index.d.cts +0 -683
  52. package/dist/utils/index.d.ts +0 -683
  53. package/dist/wrappers/index.d.cts +0 -1753
  54. package/dist/wrappers/index.d.ts +0 -1753
@@ -1,493 +0,0 @@
1
- // src/components/ClearButton/ClearButton.tsx
2
- import { Button } from "@mui/material";
3
- import { jsx } from "react/jsx-runtime";
4
- var ClearButton = ({
5
- isSubmitting,
6
- handleClear,
7
- sx,
8
- storeKey
9
- }) => {
10
- const onClick = () => {
11
- handleClear();
12
- if (storeKey != null) {
13
- localStorage.removeItem(storeKey);
14
- }
15
- };
16
- return /* @__PURE__ */ jsx(
17
- Button,
18
- {
19
- variant: "outlined",
20
- onClick,
21
- disabled: isSubmitting,
22
- sx,
23
- children: "Clear"
24
- }
25
- );
26
- };
27
- var ClearButton_default = ClearButton;
28
-
29
- // src/components/FilterButton/FilterButton.tsx
30
- import FilterAltIcon from "@mui/icons-material/FilterAlt";
31
- import { LoadingButton } from "@mui/lab";
32
- import { Badge } from "@mui/material";
33
- import { jsx as jsx2 } from "react/jsx-runtime";
34
- var FilterButton = ({
35
- isSubmitting,
36
- show,
37
- title,
38
- icon,
39
- sx,
40
- iconSx
41
- }) => {
42
- return /* @__PURE__ */ jsx2(
43
- LoadingButton,
44
- {
45
- type: "submit",
46
- variant: "contained",
47
- loading: isSubmitting,
48
- disabled: !show,
49
- disableRipple: true,
50
- color: "primary",
51
- sx: {
52
- display: "flex",
53
- alignItems: "center",
54
- ...sx
55
- },
56
- startIcon: /* @__PURE__ */ jsx2(Badge, { color: "error", variant: "standard", children: icon ? icon : /* @__PURE__ */ jsx2(FilterAltIcon, { width: "20", height: "20", sx: iconSx }) }),
57
- children: title?.trim() === "" || !title ? "Filter" : title
58
- }
59
- );
60
- };
61
- var FilterButton_default = FilterButton;
62
-
63
- // src/components/FilterWrapper/FilterWrapper.tsx
64
- import ManageSearchIcon from "@mui/icons-material/ManageSearch";
65
- import {
66
- Box,
67
- Card,
68
- CardContent,
69
- CardHeader,
70
- Divider,
71
- Grid,
72
- Typography,
73
- useTheme as useTheme2
74
- } from "@mui/material";
75
- import { Fragment, jsx as jsx3, jsxs } from "react/jsx-runtime";
76
- var FilterWrapper = ({
77
- children,
78
- title,
79
- filterCount,
80
- cardSx,
81
- textSx,
82
- icon,
83
- iconSx,
84
- showCount
85
- }) => {
86
- const theme = useTheme2();
87
- return /* @__PURE__ */ jsxs(
88
- Card,
89
- {
90
- sx: {
91
- position: "relative",
92
- borderRadius: "0px",
93
- mb: 2,
94
- ...cardSx
95
- },
96
- children: [
97
- /* @__PURE__ */ jsx3(
98
- CardHeader,
99
- {
100
- sx: {
101
- display: "flex",
102
- flexWrap: "wrap",
103
- p: "1rem",
104
- ".MuiCardHeader-action": {
105
- margin: 0,
106
- alignSelf: "center"
107
- },
108
- alignItems: "center"
109
- },
110
- title: /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
111
- icon ? icon : /* @__PURE__ */ jsx3(
112
- ManageSearchIcon,
113
- {
114
- sx: {
115
- height: "2.5rem",
116
- color: theme.palette.primary.main,
117
- ...iconSx
118
- }
119
- }
120
- ),
121
- /* @__PURE__ */ jsxs(
122
- Typography,
123
- {
124
- variant: "h5",
125
- sx: {
126
- fontWeight: "bold",
127
- color: theme.palette.primary.main,
128
- ...textSx
129
- },
130
- children: [
131
- title ? title : "Filter",
132
- " ",
133
- showCount ? `(${filterCount ? filterCount : 0})` : /* @__PURE__ */ jsx3(Fragment, {})
134
- ]
135
- }
136
- )
137
- ] })
138
- }
139
- ),
140
- /* @__PURE__ */ jsx3(Divider, {}),
141
- /* @__PURE__ */ jsx3(CardContent, { sx: { py: 2 }, children: /* @__PURE__ */ jsx3(Grid, { container: true, spacing: 2, children }) })
142
- ]
143
- }
144
- );
145
- };
146
- var FilterWrapper_default = FilterWrapper;
147
-
148
- // src/components/FormWrapper/FormWrapper.tsx
149
- import {
150
- Box as Box2,
151
- Card as Card2,
152
- CardContent as CardContent2,
153
- CardHeader as CardHeader2,
154
- Divider as Divider2,
155
- Grid as Grid2,
156
- Typography as Typography2
157
- } from "@mui/material";
158
- import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
159
- var FormWrapper = ({
160
- children,
161
- title,
162
- editMode,
163
- cardSx,
164
- textSx,
165
- icon,
166
- actionButton
167
- }) => {
168
- return /* @__PURE__ */ jsxs2(
169
- Card2,
170
- {
171
- sx: {
172
- position: "relative",
173
- borderRadius: "0px",
174
- ...cardSx
175
- },
176
- children: [
177
- /* @__PURE__ */ jsx4(
178
- CardHeader2,
179
- {
180
- sx: {
181
- display: "flex",
182
- flexWrap: "wrap",
183
- p: "1rem",
184
- ".MuiCardHeader-action": {
185
- margin: 0,
186
- alignSelf: "center"
187
- }
188
- },
189
- title: /* @__PURE__ */ jsxs2(
190
- Box2,
191
- {
192
- sx: {
193
- display: "flex",
194
- alignItems: "center",
195
- justifyContent: "space-between"
196
- },
197
- children: [
198
- /* @__PURE__ */ jsxs2(Box2, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
199
- icon ?? icon,
200
- /* @__PURE__ */ jsx4(Typography2, { color: "primary", sx: textSx, children: title })
201
- ] }),
202
- actionButton
203
- ]
204
- }
205
- )
206
- }
207
- ),
208
- /* @__PURE__ */ jsx4(Divider2, { sx: { mt: 0 } }),
209
- /* @__PURE__ */ jsx4(CardContent2, { children: /* @__PURE__ */ jsx4(Grid2, { container: true, spacing: 2, children }) })
210
- ]
211
- }
212
- );
213
- };
214
- var FormWrapper_default = FormWrapper;
215
-
216
- // src/components/LabelText/LabelText.tsx
217
- import { Grid as Grid3, Tooltip, Typography as Typography3 } from "@mui/material";
218
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
219
- var LabelText = ({
220
- label,
221
- value,
222
- gridSize,
223
- containerSize,
224
- labelSx,
225
- valueSx
226
- }) => {
227
- const defaultGridSize = {
228
- labelSize: { xs: 6, sm: 6, md: 6 },
229
- valueSize: { xs: 12, sm: 6, md: 6 }
230
- };
231
- const defaultContainerSize = { xs: 12, sm: 6, md: 6 };
232
- const size = gridSize || defaultGridSize;
233
- const container = containerSize || defaultContainerSize;
234
- return /* @__PURE__ */ jsxs3(
235
- Grid3,
236
- {
237
- size: container,
238
- sx: {
239
- display: "flex",
240
- flexDirection: { xs: "column", sm: "row", md: "row" },
241
- "&:hover": { bgcolor: "#efefef", overflow: "hidden" }
242
- },
243
- children: [
244
- /* @__PURE__ */ jsxs3(
245
- Grid3,
246
- {
247
- size: size.labelSize,
248
- sx: {
249
- padding: "5px",
250
- fontSize: "14px",
251
- textAlign: { xs: "left", sm: "right", md: "right" },
252
- ...labelSx
253
- },
254
- children: [
255
- label,
256
- " :"
257
- ]
258
- }
259
- ),
260
- /* @__PURE__ */ jsx5(
261
- Grid3,
262
- {
263
- size: size.valueSize,
264
- sx: { padding: "5px", display: "flex", flexWrap: "wrap" },
265
- children: /* @__PURE__ */ jsx5(Tooltip, { title: value, arrow: true, children: /* @__PURE__ */ jsx5(
266
- Typography3,
267
- {
268
- sx: {
269
- fontSize: "14px",
270
- wordBreak: "break-word",
271
- overflow: "hidden",
272
- display: "-webkit-box",
273
- textOverflow: "ellipsis",
274
- WebkitLineClamp: 2,
275
- WebkitBoxOrient: "vertical",
276
- ...valueSx,
277
- color: "#078dee"
278
- },
279
- children: value ? value : "-"
280
- }
281
- ) })
282
- }
283
- )
284
- ]
285
- }
286
- );
287
- };
288
- var LabelText_default = LabelText;
289
-
290
- // src/components/ListWrapper/ListWrapper.tsx
291
- import ManageSearchIcon2 from "@mui/icons-material/ManageSearch";
292
- import {
293
- Box as Box3,
294
- Card as Card3,
295
- CardContent as CardContent3,
296
- CardHeader as CardHeader3,
297
- Divider as Divider3,
298
- Grid as Grid4,
299
- Typography as Typography4,
300
- useTheme as useTheme3
301
- } from "@mui/material";
302
- import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
303
- var ListWrapper = ({
304
- children,
305
- title,
306
- count,
307
- show = true,
308
- actionButton,
309
- cardSx,
310
- textSx,
311
- icon,
312
- iconSx,
313
- showCount = true
314
- }) => {
315
- const theme = useTheme3();
316
- if (!show) return /* @__PURE__ */ jsx6(Fragment2, {});
317
- return /* @__PURE__ */ jsxs4(
318
- Card3,
319
- {
320
- sx: {
321
- position: "relative",
322
- borderRadius: "0px",
323
- ...cardSx
324
- },
325
- children: [
326
- /* @__PURE__ */ jsx6(
327
- CardHeader3,
328
- {
329
- sx: {
330
- display: "flex",
331
- flexWrap: "wrap",
332
- p: "1rem",
333
- ".MuiCardHeader-action": {
334
- margin: 0,
335
- alignSelf: "center"
336
- },
337
- alignItems: "center"
338
- },
339
- title: /* @__PURE__ */ jsxs4(
340
- Box3,
341
- {
342
- sx: {
343
- display: "flex",
344
- alignItems: "center",
345
- justifyContent: "space-between"
346
- },
347
- children: [
348
- /* @__PURE__ */ jsxs4(Box3, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
349
- icon ? icon : /* @__PURE__ */ jsx6(
350
- ManageSearchIcon2,
351
- {
352
- sx: {
353
- height: "2.5rem",
354
- color: theme.palette.primary.main,
355
- ...iconSx
356
- }
357
- }
358
- ),
359
- /* @__PURE__ */ jsxs4(
360
- Typography4,
361
- {
362
- variant: "h5",
363
- sx: {
364
- fontWeight: "bold",
365
- color: theme.palette.primary.main,
366
- ...textSx
367
- },
368
- children: [
369
- title ? title : "List",
370
- showCount ? `(${count ? count : 0})` : /* @__PURE__ */ jsx6(Fragment2, {})
371
- ]
372
- }
373
- )
374
- ] }),
375
- actionButton
376
- ]
377
- }
378
- )
379
- }
380
- ),
381
- /* @__PURE__ */ jsx6(Divider3, {}),
382
- /* @__PURE__ */ jsx6(CardContent3, { sx: { pt: 0 }, children: /* @__PURE__ */ jsx6(Grid4, { container: true, spacing: 2, children }) })
383
- ]
384
- }
385
- );
386
- };
387
- var ListWrapper_default = ListWrapper;
388
-
389
- // src/components/SimpleToolbar/SimpleToolbar.tsx
390
- import { Box as Box4 } from "@mui/material";
391
- import {
392
- GridToolbarContainer,
393
- GridToolbarColumnsButton,
394
- GridToolbarExport,
395
- GridToolbarFilterButton,
396
- GridToolbarQuickFilter
397
- } from "@mui/x-data-grid";
398
- import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
399
- var SimpleToolbar = () => /* @__PURE__ */ jsxs5(GridToolbarContainer, { children: [
400
- /* @__PURE__ */ jsx7(
401
- Box4,
402
- {
403
- sx: {
404
- "& .MuiInputBase-root": {
405
- borderRadius: "8px",
406
- padding: "6px 10px"
407
- },
408
- "& input": {
409
- fontSize: "14px",
410
- color: "#333"
411
- },
412
- borderRadius: "8px"
413
- },
414
- children: /* @__PURE__ */ jsx7(GridToolbarQuickFilter, {})
415
- }
416
- ),
417
- /* @__PURE__ */ jsx7(Box4, { sx: { flexGrow: 1 } }),
418
- /* @__PURE__ */ jsx7(GridToolbarColumnsButton, {}),
419
- /* @__PURE__ */ jsx7(GridToolbarFilterButton, {}),
420
- /* @__PURE__ */ jsx7(GridToolbarExport, {})
421
- ] });
422
- var SimpleToolbar_default = SimpleToolbar;
423
-
424
- // src/components/SimpleButton/SimpleButton.tsx
425
- import { Button as Button2, CircularProgress } from "@mui/material";
426
- import { forwardRef, memo } from "react";
427
- import { Fragment as Fragment3, jsx as jsx8 } from "react/jsx-runtime";
428
- var SimpleButton = memo(forwardRef(
429
- ({
430
- show = true,
431
- loading = false,
432
- loadingText,
433
- children,
434
- ...rest
435
- }, ref) => {
436
- if (!show) return null;
437
- return /* @__PURE__ */ jsx8(Fragment3, { children: /* @__PURE__ */ jsx8(
438
- Button2,
439
- {
440
- ref,
441
- disabled: loading || rest.disabled,
442
- startIcon: loading ? /* @__PURE__ */ jsx8(CircularProgress, { size: 16 }) : rest.startIcon,
443
- ...rest,
444
- children: loading && loadingText ? loadingText : children
445
- }
446
- ) });
447
- }
448
- ));
449
- SimpleButton.displayName = "SimpleButton";
450
- var SimpleButton_default = SimpleButton;
451
-
452
- // src/components/AuthorizedView/AuthorizedView.tsx
453
- import { Fragment as Fragment4, jsx as jsx9 } from "react/jsx-runtime";
454
- var AuthorizedView = ({ children, show }) => {
455
- if (!show) return /* @__PURE__ */ jsx9(Fragment4, {});
456
- return /* @__PURE__ */ jsx9(Fragment4, { children });
457
- };
458
- var AuthorizedView_default = AuthorizedView;
459
-
460
- // src/components/CancelButton/CancelButton.tsx
461
- import { Button as Button3 } from "@mui/material";
462
- import { jsx as jsx10 } from "react/jsx-runtime";
463
- var CancelButton = ({
464
- isSubmitting,
465
- handleCancel,
466
- sx
467
- }) => {
468
- return /* @__PURE__ */ jsx10(
469
- Button3,
470
- {
471
- variant: "outlined",
472
- onClick: handleCancel,
473
- disabled: isSubmitting,
474
- sx,
475
- children: "Cancel"
476
- }
477
- );
478
- };
479
- var CancelButton_default = CancelButton;
480
-
481
- export {
482
- ClearButton_default,
483
- FilterButton_default,
484
- FilterWrapper_default,
485
- FormWrapper_default,
486
- LabelText_default,
487
- ListWrapper_default,
488
- SimpleToolbar_default,
489
- SimpleButton_default,
490
- AuthorizedView_default,
491
- CancelButton_default
492
- };
493
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvbXBvbmVudHMvQ2xlYXJCdXR0b24vQ2xlYXJCdXR0b24udHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0ZpbHRlckJ1dHRvbi9GaWx0ZXJCdXR0b24udHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0ZpbHRlcldyYXBwZXIvRmlsdGVyV3JhcHBlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvRm9ybVdyYXBwZXIvRm9ybVdyYXBwZXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0xhYmVsVGV4dC9MYWJlbFRleHQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0xpc3RXcmFwcGVyL0xpc3RXcmFwcGVyLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9TaW1wbGVUb29sYmFyL1NpbXBsZVRvb2xiYXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL1NpbXBsZUJ1dHRvbi9TaW1wbGVCdXR0b24udHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0F1dGhvcml6ZWRWaWV3L0F1dGhvcml6ZWRWaWV3LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9DYW5jZWxCdXR0b24vQ2FuY2VsQnV0dG9uLnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBTeFByb3BzIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBDbGVhckJ1dHRvbiBjb21wb25lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG5pbnRlcmZhY2UgQ2xlYXJCdXR0b25Qcm9wcyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgYSBmb3JtIG9yIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgc3VibWl0dGVkLlxuICAgKiBXaGVuIHRydWUsIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgdG8gcHJldmVudCBtdWx0aXBsZSBjbGVhciBhY3Rpb25zLlxuICAgKi9cbiAgaXNTdWJtaXR0aW5nOiBib29sZWFuO1xuICAvKipcbiAgICogQ2FsbGJhY2sgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiB0aGUgY2xlYXIgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqIFNob3VsZCBoYW5kbGUgdGhlIGNsZWFyaW5nIGxvZ2ljIChlLmcuLCBmb3JtIHJlc2V0LCBkYXRhIGNsZWFyaW5nKS5cbiAgICovXG4gIGhhbmRsZUNsZWFyOiAoKSA9PiB2b2lkO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IG10OiAyLCBjb2xvcjogJ3dhcm5pbmcubWFpbicgfVxuICAgKi9cbiAgc3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogT3B0aW9uYWwgbG9jYWxTdG9yYWdlIGtleSB0byByZW1vdmUgd2hlbiBjbGVhcmluZy5cbiAgICogSWYgcHJvdmlkZWQsIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsU3RvcmFnZSBpdGVtIHdpbGwgYmUgcmVtb3ZlZCBvbiBjbGljay5cbiAgICogQGV4YW1wbGUgXCJ1c2VyLXByZWZlcmVuY2VzXCIgb3IgXCJmb3JtLWRhdGFcIlxuICAgKi9cbiAgc3RvcmVLZXk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhbmRhcmRpemVkIGNsZWFyIGJ1dHRvbiBjb21wb25lbnQgd2l0aCBsb2NhbFN0b3JhZ2UgaW50ZWdyYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGNsZWFyIGJ1dHRvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZXNcbiAqIGJvdGggY2FsbGJhY2sgZXhlY3V0aW9uIGFuZCBvcHRpb25hbCBsb2NhbFN0b3JhZ2UgY2xlYW51cC4gSXQgYXV0b21hdGljYWxseVxuICogZGlzYWJsZXMgZHVyaW5nIGZvcm0gc3VibWlzc2lvbnMgYW5kIGNhbiBjbGVhciBzdG9yZWQgZGF0YSB3aGVuIG5lZWRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxDbGVhckJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2lzTG9hZGluZ31cbiAqICAgaGFuZGxlQ2xlYXI9eygpID0+IGZvcm0ucmVzZXQoKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBsb2NhbFN0b3JhZ2UgY2xlYW51cDpcbiAqIGBgYHRzeFxuICogPENsZWFyQnV0dG9uXG4gKiAgIGlzU3VibWl0dGluZz17Zm9ybS5mb3JtU3RhdGUuaXNTdWJtaXR0aW5nfVxuICogICBoYW5kbGVDbGVhcj17KCkgPT4gc2V0RmlsdGVycyh7fSl9XG4gKiAgIHN0b3JlS2V5PVwidXNlci1maWx0ZXJzXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHMgZm9yIGNsZWFyIGJ1dHRvbiBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBNVUkgQnV0dG9uIGNvbXBvbmVudCBjb25maWd1cmVkIGFzIGEgY2xlYXIgYnV0dG9uXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDbGVhckJ1dHRvbiA9ICh7XG4gIGlzU3VibWl0dGluZyxcbiAgaGFuZGxlQ2xlYXIsXG4gIHN4LFxuICBzdG9yZUtleSxcbn06IENsZWFyQnV0dG9uUHJvcHMpID0+IHtcbiAgY29uc3Qgb25DbGljayA9ICgpID0+IHtcbiAgICBoYW5kbGVDbGVhcigpO1xuICAgIGlmIChzdG9yZUtleSAhPSBudWxsKSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEJ1dHRvblxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICBkaXNhYmxlZD17aXNTdWJtaXR0aW5nfVxuICAgICAgc3g9e3N4fVxuICAgID5cbiAgICAgIENsZWFyXG4gICAgPC9CdXR0b24+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDbGVhckJ1dHRvbjtcbiIsICJpbXBvcnQgRmlsdGVyQWx0SWNvbiBmcm9tIFwiQG11aS9pY29ucy1tYXRlcmlhbC9GaWx0ZXJBbHRcIjtcbmltcG9ydCB7IExvYWRpbmdCdXR0b24gfSBmcm9tIFwiQG11aS9sYWJcIjtcbmltcG9ydCB0eXBlIHsgU3hQcm9wcyB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyBCYWRnZSwgdXNlVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRmlsdGVyQnV0dG9uIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmludGVyZmFjZSBGaWx0ZXJCdXR0b25Qcm9wcyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgYSBmaWx0ZXIgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG4gICAqIFdoZW4gdHJ1ZSwgc2hvd3MgbG9hZGluZyBzcGlubmVyIGFuZCBkaXNhYmxlcyB0aGUgYnV0dG9uLlxuICAgKi9cbiAgaXNTdWJtaXR0aW5nOiBib29sZWFuO1xuICAvKipcbiAgICogQ29udHJvbHMgYnV0dG9uIHZpc2liaWxpdHkgYW5kIGVuYWJsZWQgc3RhdGUuXG4gICAqIFdoZW4gZmFsc2UsIHRoZSBidXR0b24gaXMgZGlzYWJsZWQuXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgc2hvdz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDdXN0b20gdGV4dCB0byBkaXNwbGF5IG9uIHRoZSBidXR0b24uXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJGaWx0ZXJcIlxuICAgKiBAZXhhbXBsZSBcIkFwcGx5IEZpbHRlcnNcIiBvciBcIlNlYXJjaFwiXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEN1c3RvbSBpY29uIHRvIGRpc3BsYXkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmaWx0ZXIgaWNvbi5cbiAgICogQGV4YW1wbGUgPFNlYXJjaEljb24gLz5cbiAgICovXG4gIGljb24/OiBSZWFjdC5SZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIGJ1dHRvbiBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IG10OiAyLCBtaW5XaWR0aDogMTIwIH1cbiAgICovXG4gIHN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gaWNvbiBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGNvbG9yOiAncHJpbWFyeS5tYWluJywgZm9udFNpemU6IDE4IH1cbiAgICovXG4gIGljb25TeD86IFN4UHJvcHM7XG59XG5cbi8qKlxuICogRmlsdGVyIGJ1dHRvbiBjb21wb25lbnQgd2l0aCBsb2FkaW5nIHN0YXRlcyBhbmQgY3VzdG9taXphYmxlIGFwcGVhcmFuY2UuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBzdGFuZGFyZGl6ZWQgZmlsdGVyL3N1Ym1pdCBidXR0b24gd2l0aCBpbnRlZ3JhdGVkIGxvYWRpbmdcbiAqIHN0YXRlcywgaWNvbiBzdXBwb3J0LCBhbmQgYmFkZ2Ugc3R5bGluZy4gSXQncyBkZXNpZ25lZCBmb3IgdXNlIGluIGZpbHRlciBmb3Jtc1xuICogYW5kIHNlYXJjaCBpbnRlcmZhY2VzIHdoZXJlIHVzZXJzIG5lZWQgdG8gYXBwbHkgZmlsdGVyaW5nIGNyaXRlcmlhLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPEZpbHRlckJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2lzTG9hZGluZ31cbiAqICAgc2hvdz17aGFzRmlsdGVyc31cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRpdGxlIGFuZCBpY29uOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyQnV0dG9uXG4gKiAgIGlzU3VibWl0dGluZz17Zm9ybS5mb3JtU3RhdGUuaXNTdWJtaXR0aW5nfVxuICogICB0aXRsZT1cIkFwcGx5IFNlYXJjaFwiXG4gKiAgIGljb249ezxTZWFyY2hJY29uIC8+fVxuICogICBzaG93PXt0cnVlfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyQnV0dG9uXG4gKiAgIGlzU3VibWl0dGluZz17aXNQcm9jZXNzaW5nfVxuICogICB0aXRsZT1cIkZpbHRlciBSZXN1bHRzXCJcbiAqICAgc3g9e3sgbWluV2lkdGg6IDE1MCwgbXQ6IDIgfX1cbiAqICAgaWNvblN4PXt7IGZvbnRTaXplOiAyMCB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBmb3IgZmlsdGVyIGJ1dHRvbiBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBNVUkgTG9hZGluZ0J1dHRvbiBjb21wb25lbnQgY29uZmlndXJlZCBhcyBhIGZpbHRlciBidXR0b25cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IEZpbHRlckJ1dHRvbiA9ICh7XG4gIGlzU3VibWl0dGluZyxcbiAgc2hvdyxcbiAgdGl0bGUsXG4gIGljb24sXG4gIHN4LFxuICBpY29uU3gsXG59OiBGaWx0ZXJCdXR0b25Qcm9wcykgPT4ge1xuICByZXR1cm4gKFxuICAgIDxMb2FkaW5nQnV0dG9uXG4gICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxuICAgICAgbG9hZGluZz17aXNTdWJtaXR0aW5nfVxuICAgICAgZGlzYWJsZWQ9eyFzaG93fVxuICAgICAgZGlzYWJsZVJpcHBsZVxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIHN4PXt7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAuLi5zeCxcbiAgICAgIH19XG4gICAgICBzdGFydEljb249e1xuICAgICAgICA8QmFkZ2UgY29sb3I9XCJlcnJvclwiIHZhcmlhbnQ9XCJzdGFuZGFyZFwiPlxuICAgICAgICAgIHtpY29uID8gaWNvbiA6IDxGaWx0ZXJBbHRJY29uIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHN4PXtpY29uU3h9IC8+fVxuICAgICAgICA8L0JhZGdlPlxuICAgICAgfVxuICAgID5cbiAgICAgIHt0aXRsZT8udHJpbSgpID09PSBcIlwiIHx8ICF0aXRsZSA/IFwiRmlsdGVyXCIgOiB0aXRsZX1cbiAgICA8L0xvYWRpbmdCdXR0b24+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGaWx0ZXJCdXR0b247XG4iLCAiaW1wb3J0IE1hbmFnZVNlYXJjaEljb24gZnJvbSBcIkBtdWkvaWNvbnMtbWF0ZXJpYWwvTWFuYWdlU2VhcmNoXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEJveCxcbiAgQ2FyZCxcbiAgQ2FyZENvbnRlbnQsXG4gIENhcmRIZWFkZXIsXG4gIERpdmlkZXIsXG4gIEdyaWQsXG4gIFR5cG9ncmFwaHksXG4gIHVzZVRoZW1lLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wc1dpdGhDaGlsZHJlbiwgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBGaWx0ZXJXcmFwcGVyIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnR5cGUgRmlsdGVyV3JhcHBlclByb3BzID0gUHJvcHNXaXRoQ2hpbGRyZW48e1xuICAvKipcbiAgICogVGl0bGUgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGNhcmQgaGVhZGVyLlxuICAgKiBAZGVmYXVsdFZhbHVlIFwiRmlsdGVyXCJcbiAgICogQGV4YW1wbGUgXCJTZWFyY2ggQ3JpdGVyaWFcIiBvciBcIkFkdmFuY2VkIEZpbHRlcnNcIlxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgYWN0aXZlIGZpbHRlcnMgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLlxuICAgKiBPbmx5IHNob3duIHdoZW4gc2hvd0NvdW50IGlzIHRydWUuXG4gICAqIEBleGFtcGxlIDMgZm9yIFwiRmlsdGVyICgzKVwiXG4gICAqL1xuICBmaWx0ZXJDb3VudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gY2FyZCBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IG10OiAyLCBib3hTaGFkb3c6IDIgfVxuICAgKi9cbiAgY2FyZFN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gdGl0bGUgdGV4dCBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGZvbnRTaXplOiAxOCwgZm9udFdlaWdodDogJ2JvbGQnIH1cbiAgICovXG4gIHRleHRTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBDdXN0b20gaWNvbiB0byBkaXNwbGF5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgc2VhcmNoIGljb24uXG4gICAqIEBleGFtcGxlIDxGaWx0ZXJMaXN0SWNvbiAvPlxuICAgKi9cbiAgaWNvbj86IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gaWNvbiBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGNvbG9yOiAnc2Vjb25kYXJ5Lm1haW4nLCBmb250U2l6ZTogMjQgfVxuICAgKi9cbiAgaWNvblN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZmlsdGVyIGNvdW50IGluIHRoZSBoZWFkZXIuXG4gICAqIEBkZWZhdWx0VmFsdWUgZmFsc2VcbiAgICovXG4gIHNob3dDb3VudD86IGJvb2xlYW47XG59PjtcblxuLyoqXG4gKiBDYXJkLWJhc2VkIHdyYXBwZXIgY29tcG9uZW50IGZvciBvcmdhbml6aW5nIGZpbHRlciBjb250cm9scyBhbmQgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgbGF5b3V0IGZvciBmaWx0ZXIgaW50ZXJmYWNlcyB3aXRoIGEgaGVhZGVyLFxuICogb3B0aW9uYWwgZmlsdGVyIGNvdW50IGRpc3BsYXksIGFuZCBhIGdyaWQtYmFzZWQgY29udGVudCBhcmVhLiBJdCdzIGRlc2lnbmVkIHRvXG4gKiBjb250YWluIGZvcm0gY29udHJvbHMgYW5kIGZpbHRlciBlbGVtZW50cyBpbiBhIHZpc3VhbGx5IG9yZ2FuaXplZCBtYW5uZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyV3JhcHBlcj5cbiAqICAgPEdyaWQgaXRlbSB4cz17MTJ9IG1kPXs2fT5cbiAqICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiU2VhcmNoXCIgLz5cbiAqICAgPC9HcmlkPlxuICogICA8R3JpZCBpdGVtIHhzPXsxMn0gbWQ9ezZ9PlxuICogICAgIDxTZWxlY3QgbGFiZWw9XCJDYXRlZ29yeVwiIC8+XG4gKiAgIDwvR3JpZD5cbiAqIDwvRmlsdGVyV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSB0aXRsZSBhbmQgY291bnQ6XG4gKiBgYGB0c3hcbiAqIDxGaWx0ZXJXcmFwcGVyXG4gKiAgIHRpdGxlPVwiQWR2YW5jZWQgU2VhcmNoXCJcbiAqICAgZmlsdGVyQ291bnQ9e2FjdGl2ZUZpbHRlcnMubGVuZ3RofVxuICogICBzaG93Q291bnQ9e3RydWV9XG4gKiA+XG4gKiAgIHtmaWx0ZXJDb250cm9sc31cbiAqIDwvRmlsdGVyV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyV3JhcHBlclxuICogICB0aXRsZT1cIlByb2R1Y3QgRmlsdGVyc1wiXG4gKiAgIGljb249ezxGaWx0ZXJMaXN0SWNvbiAvPn1cbiAqICAgY2FyZFN4PXt7IG10OiAzLCBib3JkZXJSYWRpdXM6IDIgfX1cbiAqICAgdGV4dFN4PXt7IGNvbG9yOiAnc2Vjb25kYXJ5Lm1haW4nIH19XG4gKiA+XG4gKiAgIHtjaGlsZHJlbn1cbiAqIDwvRmlsdGVyV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBpbmNsdWRpbmcgY2hpbGRyZW4gYW5kIHN0eWxpbmcgb3B0aW9uc1xuICogQHJldHVybnMgTVVJIENhcmQgY29tcG9uZW50IHdpdGggc3RydWN0dXJlZCBmaWx0ZXIgbGF5b3V0XG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBGaWx0ZXJXcmFwcGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIHRpdGxlLFxuICBmaWx0ZXJDb3VudCxcbiAgY2FyZFN4LFxuICB0ZXh0U3gsXG4gIGljb24sXG4gIGljb25TeCxcbiAgc2hvd0NvdW50LFxufTogRmlsdGVyV3JhcHBlclByb3BzKSA9PiB7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICByZXR1cm4gKFxuICAgIDxDYXJkXG4gICAgICBzeD17e1xuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMHB4XCIsXG4gICAgICAgIG1iOiAyLFxuICAgICAgICAuLi5jYXJkU3gsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxDYXJkSGVhZGVyXG4gICAgICAgIHN4PXt7XG4gICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgZmxleFdyYXA6IFwid3JhcFwiLFxuICAgICAgICAgIHA6IFwiMXJlbVwiLFxuICAgICAgICAgIFwiLk11aUNhcmRIZWFkZXItYWN0aW9uXCI6IHtcbiAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAgIGFsaWduU2VsZjogXCJjZW50ZXJcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgIH19XG4gICAgICAgIHRpdGxlPXtcbiAgICAgICAgICA8Qm94IHN4PXt7IGRpc3BsYXk6IFwiZmxleFwiLCBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLCBnYXA6IDAuNSB9fT5cbiAgICAgICAgICAgIHtpY29uID8gKFxuICAgICAgICAgICAgICBpY29uXG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8TWFuYWdlU2VhcmNoSWNvblxuICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IFwiMi41cmVtXCIsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICAgICAgICAgICAgICAuLi5pY29uU3gsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8VHlwb2dyYXBoeVxuICAgICAgICAgICAgICB2YXJpYW50PVwiaDVcIlxuICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgICAgICAgICAgICAuLi50ZXh0U3gsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0aXRsZSA/IHRpdGxlIDogXCJGaWx0ZXJcIn17XCIgXCJ9XG4gICAgICAgICAgICAgIHtzaG93Q291bnQgPyBgKCR7ZmlsdGVyQ291bnQgPyBmaWx0ZXJDb3VudCA6IDB9KWAgOiA8PjwvPn1cbiAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgfVxuICAgICAgPjwvQ2FyZEhlYWRlcj5cbiAgICAgIDxEaXZpZGVyIC8+XG4gICAgICA8Q2FyZENvbnRlbnQgc3g9e3sgcHk6IDIgfX0+XG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBzcGFjaW5nPXsyfT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgPC9DYXJkPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsdGVyV3JhcHBlcjtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEJveCxcbiAgQ2FyZCxcbiAgQ2FyZENvbnRlbnQsXG4gIENhcmRIZWFkZXIsXG4gIERpdmlkZXIsXG4gIEdyaWQsXG4gIFR5cG9ncmFwaHksXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BzV2l0aENoaWxkcmVuLCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEZvcm1XcmFwcGVyIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnR5cGUgRm9ybVdyYXBwZXIgPSBQcm9wc1dpdGhDaGlsZHJlbjx7XG4gIC8qKlxuICAgKiBUaXRsZSB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgZm9ybSBoZWFkZXIuXG4gICAqIEBleGFtcGxlIFwiQ3JlYXRlIFVzZXJcIiBvciBcIkVkaXQgUHJvZmlsZVwiXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBmb3JtIGlzIGluIGVkaXQgbW9kZSAoY3VycmVudGx5IHVudXNlZCBpbiBpbXBsZW1lbnRhdGlvbikuXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgcHJvcCBpcyBkZWZpbmVkIGJ1dCBub3QgdXNlZCBpbiB0aGUgY29tcG9uZW50IGxvZ2ljXG4gICAqL1xuICBlZGl0TW9kZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDdXN0b20gaWNvbiB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIgbmV4dCB0byB0aGUgdGl0bGUuXG4gICAqIEBleGFtcGxlIDxQZXJzb25JY29uIC8+IG9yIDxFZGl0SWNvbiAvPlxuICAgKi9cbiAgaWNvbj86IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gY2FyZCBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IG10OiAyLCBtYXhXaWR0aDogNjAwIH1cbiAgICovXG4gIGNhcmRTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIHRpdGxlIHRleHQgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBmb250U2l6ZTogMjAsIGZvbnRXZWlnaHQ6ICdib2xkJyB9XG4gICAqL1xuICB0ZXh0U3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogQWN0aW9uIGJ1dHRvbiBvciBlbGVtZW50IHRvIGRpc3BsYXkgaW4gdGhlIGhlYWRlciAoZS5nLiwgc2F2ZSwgY2xvc2UpLlxuICAgKiBAZXhhbXBsZSA8QnV0dG9uPlNhdmU8L0J1dHRvbj4gb3IgPEljb25CdXR0b24+PENsb3NlSWNvbiAvPjwvSWNvbkJ1dHRvbj5cbiAgICovXG4gIGFjdGlvbkJ1dHRvbj86IFJlYWN0Tm9kZTtcbn0+O1xuXG4vKipcbiAqIENhcmQtYmFzZWQgd3JhcHBlciBjb21wb25lbnQgZm9yIG9yZ2FuaXppbmcgZm9ybSBlbGVtZW50cyB3aXRoIGhlYWRlciBhbmQgYWN0aW9ucy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHN0cnVjdHVyZWQgbGF5b3V0IGZvciBmb3JtcyB3aXRoIGEgdGl0bGUgaGVhZGVyLFxuICogb3B0aW9uYWwgaWNvbiwgYWN0aW9uIGJ1dHRvbnMsIGFuZCBhIGdyaWQtYmFzZWQgY29udGVudCBhcmVhLiBJdCBjcmVhdGVzXG4gKiBhIGNvbnNpc3RlbnQgdmlzdWFsIHN0cnVjdHVyZSBmb3IgZm9ybSBpbnRlcmZhY2VzIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyBmb3JtIHdyYXBwZXI6XG4gKiBgYGB0c3hcbiAqIDxGb3JtV3JhcHBlciB0aXRsZT1cIlVzZXIgSW5mb3JtYXRpb25cIj5cbiAqICAgPEdyaWQgaXRlbSB4cz17MTJ9IG1kPXs2fT5cbiAqICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiRmlyc3QgTmFtZVwiIC8+XG4gKiAgIDwvR3JpZD5cbiAqICAgPEdyaWQgaXRlbSB4cz17MTJ9IG1kPXs2fT5cbiAqICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiTGFzdCBOYW1lXCIgLz5cbiAqICAgPC9HcmlkPlxuICogPC9Gb3JtV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGljb24gYW5kIGFjdGlvbiBidXR0b246XG4gKiBgYGB0c3hcbiAqIDxGb3JtV3JhcHBlclxuICogICB0aXRsZT1cIkVkaXQgUHJvZmlsZVwiXG4gKiAgIGljb249ezxQZXJzb25JY29uIC8+fVxuICogICBhY3Rpb25CdXR0b249e1xuICogICAgIDxCdXR0b24gdmFyaWFudD1cImNvbnRhaW5lZFwiIHR5cGU9XCJzdWJtaXRcIj5cbiAqICAgICAgIFNhdmUgQ2hhbmdlc1xuICogICAgIDwvQnV0dG9uPlxuICogICB9XG4gKiA+XG4gKiAgIHtmb3JtRmllbGRzfVxuICogPC9Gb3JtV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBpbmNsdWRpbmcgY2hpbGRyZW4gYW5kIGxheW91dCBvcHRpb25zXG4gKiBAcmV0dXJucyBNVUkgQ2FyZCBjb21wb25lbnQgd2l0aCBzdHJ1Y3R1cmVkIGZvcm0gbGF5b3V0XG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBGb3JtV3JhcHBlciA9ICh7XG4gIGNoaWxkcmVuLFxuICB0aXRsZSxcbiAgZWRpdE1vZGUsXG4gIGNhcmRTeCxcbiAgdGV4dFN4LFxuICBpY29uLFxuICBhY3Rpb25CdXR0b24sXG59OiBGb3JtV3JhcHBlcikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxDYXJkXG4gICAgICBzeD17e1xuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMHB4XCIsXG4gICAgICAgIC4uLmNhcmRTeCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPENhcmRIZWFkZXJcbiAgICAgICAgc3g9e3tcbiAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICBmbGV4V3JhcDogXCJ3cmFwXCIsXG4gICAgICAgICAgcDogXCIxcmVtXCIsXG4gICAgICAgICAgXCIuTXVpQ2FyZEhlYWRlci1hY3Rpb25cIjoge1xuICAgICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgICAgYWxpZ25TZWxmOiBcImNlbnRlclwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH19XG4gICAgICAgIHRpdGxlPXtcbiAgICAgICAgICA8Qm94XG4gICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwic3BhY2UtYmV0d2VlblwiLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Qm94IHN4PXt7IGRpc3BsYXk6IFwiZmxleFwiLCBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLCBnYXA6IDAuNSB9fT5cbiAgICAgICAgICAgICAge2ljb24gPz8gaWNvbn1cbiAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgY29sb3I9XCJwcmltYXJ5XCIgc3g9e3RleHRTeH0+XG4gICAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgIHthY3Rpb25CdXR0b259XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgIH1cbiAgICAgID48L0NhcmRIZWFkZXI+XG4gICAgICA8RGl2aWRlciBzeD17eyBtdDogMCB9fSAvPlxuICAgICAgPENhcmRDb250ZW50PlxuICAgICAgICA8R3JpZCBjb250YWluZXIgc3BhY2luZz17Mn0+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L0dyaWQ+XG4gICAgICA8L0NhcmRDb250ZW50PlxuICAgIDwvQ2FyZD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1XcmFwcGVyO1xuIiwgImltcG9ydCB0eXBlIHsgU3hQcm9wcyB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyBHcmlkLCBUb29sdGlwLCBUeXBvZ3JhcGh5IH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIExhYmVsVGV4dCBjb21wb25lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG5pbnRlcmZhY2UgTGFiZWxUZXh0UHJvcHMge1xuICAvKipcbiAgICogTGFiZWwgdGV4dCB0byBkaXNwbGF5IG9uIHRoZSBsZWZ0IHNpZGUuXG4gICAqIEBleGFtcGxlIFwiTmFtZVwiIG9yIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKipcbiAgICogVmFsdWUgY29udGVudCB0byBkaXNwbGF5IG9uIHRoZSByaWdodCBzaWRlLlxuICAgKiBDYW4gYmUgdGV4dCwgbnVtYmVycywgb3IgUmVhY3QgZWxlbWVudHMuXG4gICAqIEBleGFtcGxlIFwiSm9obiBEb2VcIiBvciA8TGluaz5WaWV3IERldGFpbHM8L0xpbms+XG4gICAqL1xuICB2YWx1ZTogUmVhY3QuUmVhY3ROb2RlO1xuICAvKipcbiAgICogQ3VzdG9tIGdyaWQgc2l6aW5nIGZvciBsYWJlbCBhbmQgdmFsdWUgc2VjdGlvbnMuXG4gICAqIEBkZWZhdWx0VmFsdWUgeyBsYWJlbFNpemU6IHsgeHM6IDYsIHNtOiA2LCBtZDogNiB9LCB2YWx1ZVNpemU6IHsgeHM6IDEyLCBzbTogNiwgbWQ6IDYgfSB9XG4gICAqL1xuICBncmlkU2l6ZT86IHtcbiAgICAvKiogR3JpZCBzaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBsYWJlbCBzZWN0aW9uICovXG4gICAgbGFiZWxTaXplOiB7IHhzOiBudW1iZXI7IHNtOiBudW1iZXI7IG1kOiBudW1iZXIgfTtcbiAgICAvKiogR3JpZCBzaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2YWx1ZSBzZWN0aW9uICovXG4gICAgdmFsdWVTaXplOiB7IHhzOiBudW1iZXI7IHNtOiBudW1iZXI7IG1kOiBudW1iZXIgfTtcbiAgfTtcbiAgLyoqXG4gICAqIEdyaWQgc2l6ZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZW50aXJlIGNvbnRhaW5lci5cbiAgICogQGRlZmF1bHRWYWx1ZSB7IHhzOiAxMiwgc206IDYsIG1kOiA2IH1cbiAgICovXG4gIGNvbnRhaW5lclNpemU/OiB7IHhzOiBudW1iZXI7IHNtOiBudW1iZXI7IG1kOiBudW1iZXIgfTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gbGFiZWwgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBmb250V2VpZ2h0OiAnYm9sZCcsIGNvbG9yOiAncHJpbWFyeS5tYWluJyB9XG4gICAqL1xuICBsYWJlbFN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gdmFsdWUgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBjb2xvcjogJ3RleHQuc2Vjb25kYXJ5JywgZm9udFN0eWxlOiAnaXRhbGljJyB9XG4gICAqL1xuICB2YWx1ZVN4PzogU3hQcm9wcztcbn1cblxuLyoqXG4gKiBSZXNwb25zaXZlIGxhYmVsLXZhbHVlIGRpc3BsYXkgY29tcG9uZW50IHdpdGggaG92ZXIgZWZmZWN0cyBhbmQgdGV4dCB0cnVuY2F0aW9uLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IGNyZWF0ZXMgYSBjb25zaXN0ZW50IGxhYmVsLXZhbHVlIHBhaXIgbGF5b3V0IHRoYXQgYWRhcHRzIHRvIGRpZmZlcmVudFxuICogc2NyZWVuIHNpemVzLiBJdCBpbmNsdWRlcyBob3ZlciBlZmZlY3RzLCB0ZXh0IHRydW5jYXRpb24gd2l0aCB0b29sdGlwcywgYW5kXG4gKiBjdXN0b21pemFibGUgZ3JpZCBzaXppbmcgZm9yIGZsZXhpYmxlIGxheW91dHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8TGFiZWxUZXh0XG4gKiAgIGxhYmVsPVwiRnVsbCBOYW1lXCJcbiAqICAgdmFsdWU9XCJKb2huIERvZVwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggUmVhY3QgZWxlbWVudCB2YWx1ZTpcbiAqIGBgYHRzeFxuICogPExhYmVsVGV4dFxuICogICBsYWJlbD1cIlByb2ZpbGVcIlxuICogICB2YWx1ZT17PExpbmsgaHJlZj1cIi9wcm9maWxlXCI+VmlldyBQcm9maWxlPC9MaW5rPn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgc2l6aW5nOlxuICogYGBgdHN4XG4gKiA8TGFiZWxUZXh0XG4gKiAgIGxhYmVsPVwiRGVzY3JpcHRpb25cIlxuICogICB2YWx1ZT17bG9uZ0Rlc2NyaXB0aW9ufVxuICogICBncmlkU2l6ZT17e1xuICogICAgIGxhYmVsU2l6ZTogeyB4czogMTIsIHNtOiAzLCBtZDogMiB9LFxuICogICAgIHZhbHVlU2l6ZTogeyB4czogMTIsIHNtOiA5LCBtZDogMTAgfVxuICogICB9fVxuICogICBjb250YWluZXJTaXplPXt7IHhzOiAxMiwgc206IDEyLCBtZDogMTIgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHMgZm9yIGxhYmVsLXZhbHVlIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEdyaWQtYmFzZWQgbGF5b3V0IHdpdGggbGFiZWwgYW5kIHZhbHVlIHNlY3Rpb25zXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBMYWJlbFRleHQgPSAoe1xuICBsYWJlbCxcbiAgdmFsdWUsXG4gIGdyaWRTaXplLFxuICBjb250YWluZXJTaXplLFxuICBsYWJlbFN4LFxuICB2YWx1ZVN4LFxufTogTGFiZWxUZXh0UHJvcHMpID0+IHtcbiAgY29uc3QgZGVmYXVsdEdyaWRTaXplID0ge1xuICAgIGxhYmVsU2l6ZTogeyB4czogNiwgc206IDYsIG1kOiA2IH0sXG4gICAgdmFsdWVTaXplOiB7IHhzOiAxMiwgc206IDYsIG1kOiA2IH0sXG4gIH07XG4gIGNvbnN0IGRlZmF1bHRDb250YWluZXJTaXplID0geyB4czogMTIsIHNtOiA2LCBtZDogNiB9O1xuICBjb25zdCBzaXplID0gZ3JpZFNpemUgfHwgZGVmYXVsdEdyaWRTaXplO1xuICBjb25zdCBjb250YWluZXIgPSBjb250YWluZXJTaXplIHx8IGRlZmF1bHRDb250YWluZXJTaXplO1xuXG4gIHJldHVybiAoXG4gICAgPEdyaWRcbiAgICAgIHNpemU9e2NvbnRhaW5lcn1cbiAgICAgIHN4PXt7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiB7IHhzOiBcImNvbHVtblwiLCBzbTogXCJyb3dcIiwgbWQ6IFwicm93XCIgfSxcbiAgICAgICAgXCImOmhvdmVyXCI6IHsgYmdjb2xvcjogXCIjZWZlZmVmXCIsIG92ZXJmbG93OiBcImhpZGRlblwiIH0sXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxHcmlkXG4gICAgICAgIHNpemU9e3NpemUubGFiZWxTaXplfVxuICAgICAgICBzeD17e1xuICAgICAgICAgIHBhZGRpbmc6IFwiNXB4XCIsXG4gICAgICAgICAgZm9udFNpemU6IFwiMTRweFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogeyB4czogXCJsZWZ0XCIsIHNtOiBcInJpZ2h0XCIsIG1kOiBcInJpZ2h0XCIgfSxcbiAgICAgICAgICAuLi5sYWJlbFN4LFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7bGFiZWx9IDpcbiAgICAgIDwvR3JpZD5cbiAgICAgIDxHcmlkXG4gICAgICAgIHNpemU9e3NpemUudmFsdWVTaXplfVxuICAgICAgICBzeD17eyBwYWRkaW5nOiBcIjVweFwiLCBkaXNwbGF5OiBcImZsZXhcIiwgZmxleFdyYXA6IFwid3JhcFwiIH19XG4gICAgICA+XG4gICAgICAgIDxUb29sdGlwIHRpdGxlPXt2YWx1ZX0gYXJyb3c+XG4gICAgICAgICAgPFR5cG9ncmFwaHlcbiAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgIGZvbnRTaXplOiBcIjE0cHhcIixcbiAgICAgICAgICAgICAgd29yZEJyZWFrOiBcImJyZWFrLXdvcmRcIixcbiAgICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgICAgICAgIGRpc3BsYXk6IFwiLXdlYmtpdC1ib3hcIixcbiAgICAgICAgICAgICAgdGV4dE92ZXJmbG93OiBcImVsbGlwc2lzXCIsXG4gICAgICAgICAgICAgIFdlYmtpdExpbmVDbGFtcDogMixcbiAgICAgICAgICAgICAgV2Via2l0Qm94T3JpZW50OiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICAgIC4uLnZhbHVlU3gsXG4gICAgICAgICAgICAgIGNvbG9yOiBcIiMwNzhkZWVcIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3ZhbHVlID8gdmFsdWUgOiBcIi1cIn1cbiAgICAgICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICAgIDwvVG9vbHRpcD5cbiAgICAgIDwvR3JpZD5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBMYWJlbFRleHQ7XG4iLCAiaW1wb3J0IE1hbmFnZVNlYXJjaEljb24gZnJvbSBcIkBtdWkvaWNvbnMtbWF0ZXJpYWwvTWFuYWdlU2VhcmNoXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEJveCxcbiAgQ2FyZCxcbiAgQ2FyZENvbnRlbnQsXG4gIENhcmRIZWFkZXIsXG4gIERpdmlkZXIsXG4gIEdyaWQsXG4gIFR5cG9ncmFwaHksXG4gIHVzZVRoZW1lLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wc1dpdGhDaGlsZHJlbiwgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBMaXN0V3JhcHBlciBjb21wb25lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG50eXBlIExpc3RXcmFwcGVyUHJvcHMgPSBQcm9wc1dpdGhDaGlsZHJlbjx7XG4gIC8qKlxuICAgKiBUaXRsZSB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgY2FyZCBoZWFkZXIuXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJMaXN0XCJcbiAgICogQGV4YW1wbGUgXCJVc2VyIExpc3RcIiBvciBcIlByb2R1Y3QgQ2F0YWxvZ1wiXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE51bWJlciBvZiBpdGVtcyB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIgY291bnQuXG4gICAqIE9ubHkgc2hvd24gd2hlbiBzaG93Q291bnQgaXMgdHJ1ZS5cbiAgICogQGV4YW1wbGUgMjUgZm9yIFwiTGlzdCAoMjUpXCJcbiAgICovXG4gIGNvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0aGUgZW50aXJlIGNvbXBvbmVudCBpcyByZW5kZXJlZC5cbiAgICogV2hlbiBmYWxzZSwgcmV0dXJucyBhbiBlbXB0eSBmcmFnbWVudC5cbiAgICogQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICBzaG93PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFjdGlvbiBidXR0b24gb3IgZWxlbWVudCB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIgKGUuZy4sIGFkZCwgZXhwb3J0KS5cbiAgICogQGV4YW1wbGUgPEJ1dHRvbj5BZGQgTmV3PC9CdXR0b24+IG9yIDxJY29uQnV0dG9uPjxNb3JlVmVydEljb24gLz48L0ljb25CdXR0b24+XG4gICAqL1xuICBhY3Rpb25CdXR0b24/OiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIGNhcmQgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBtdDogMiwgYm94U2hhZG93OiAzIH1cbiAgICovXG4gIGNhcmRTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIHRpdGxlIHRleHQgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBmb250U2l6ZTogMTgsIGNvbG9yOiAnc2Vjb25kYXJ5Lm1haW4nIH1cbiAgICovXG4gIHRleHRTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBDdXN0b20gaWNvbiB0byBkaXNwbGF5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgc2VhcmNoIGljb24uXG4gICAqIEBleGFtcGxlIDxMaXN0SWNvbiAvPiBvciA8VGFibGVSb3dzSWNvbiAvPlxuICAgKi9cbiAgaWNvbj86IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgY291bnQgaW4gdGhlIGhlYWRlci5cbiAgICogQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICBzaG93Q291bnQ/OiBib29sZWFuO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSBpY29uIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgY29sb3I6ICdwcmltYXJ5Lm1haW4nLCBmb250U2l6ZTogMjggfVxuICAgKi9cbiAgaWNvblN4PzogU3hQcm9wcztcbn0+O1xuXG4vKipcbiAqIENhcmQtYmFzZWQgd3JhcHBlciBjb21wb25lbnQgZm9yIG9yZ2FuaXppbmcgbGlzdCBjb250ZW50IHdpdGggaGVhZGVyIGFuZCBhY3Rpb25zLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgc3RydWN0dXJlZCBsYXlvdXQgZm9yIGRpc3BsYXlpbmcgbGlzdHMgb2YgZGF0YSB3aXRoXG4gKiBhIHRpdGxlIGhlYWRlciwgb3B0aW9uYWwgaXRlbSBjb3VudCwgYWN0aW9uIGJ1dHRvbnMsIGFuZCBhIGdyaWQtYmFzZWQgY29udGVudCBhcmVhLlxuICogSXQgaW5jbHVkZXMgY29uZGl0aW9uYWwgcmVuZGVyaW5nIGFuZCBjb25zaXN0ZW50IHN0eWxpbmcgYWNyb3NzIGxpc3QgaW50ZXJmYWNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgbGlzdCB3cmFwcGVyOlxuICogYGBgdHN4XG4gKiA8TGlzdFdyYXBwZXIgdGl0bGU9XCJVc2Vyc1wiIGNvdW50PXt1c2Vycy5sZW5ndGh9PlxuICogICA8R3JpZCBpdGVtIHhzPXsxMn0+XG4gKiAgICAgPERhdGFHcmlkIHJvd3M9e3VzZXJzfSBjb2x1bW5zPXtjb2x1bW5zfSAvPlxuICogICA8L0dyaWQ+XG4gKiA8L0xpc3RXcmFwcGVyPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggYWN0aW9uIGJ1dHRvbiBhbmQgY3VzdG9tIGljb246XG4gKiBgYGB0c3hcbiAqIDxMaXN0V3JhcHBlclxuICogICB0aXRsZT1cIlByb2R1Y3RzXCJcbiAqICAgY291bnQ9e3Byb2R1Y3RzLmxlbmd0aH1cbiAqICAgaWNvbj17PEludmVudG9yeUljb24gLz59XG4gKiAgIGFjdGlvbkJ1dHRvbj17XG4gKiAgICAgPEJ1dHRvbiB2YXJpYW50PVwiY29udGFpbmVkXCIgb25DbGljaz17YWRkUHJvZHVjdH0+XG4gKiAgICAgICBBZGQgUHJvZHVjdFxuICogICAgIDwvQnV0dG9uPlxuICogICB9XG4gKiA+XG4gKiAgIHtwcm9kdWN0TGlzdH1cbiAqIDwvTGlzdFdyYXBwZXI+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ29uZGl0aW9uYWwgcmVuZGVyaW5nOlxuICogYGBgdHN4XG4gKiA8TGlzdFdyYXBwZXJcbiAqICAgdGl0bGU9XCJTZWFyY2ggUmVzdWx0c1wiXG4gKiAgIGNvdW50PXtzZWFyY2hSZXN1bHRzLmxlbmd0aH1cbiAqICAgc2hvdz17aGFzU2VhcmNoZWR9XG4gKiAgIHNob3dDb3VudD17c2VhcmNoUmVzdWx0cy5sZW5ndGggPiAwfVxuICogPlxuICogICB7c2VhcmNoUmVzdWx0SXRlbXN9XG4gKiA8L0xpc3RXcmFwcGVyPlxuICogYGBgXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIGluY2x1ZGluZyBjaGlsZHJlbiBhbmQgbGF5b3V0IG9wdGlvbnNcbiAqIEByZXR1cm5zIE1VSSBDYXJkIGNvbXBvbmVudCB3aXRoIHN0cnVjdHVyZWQgbGlzdCBsYXlvdXQsIG9yIGVtcHR5IGZyYWdtZW50IGlmIHNob3cgaXMgZmFsc2VcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IExpc3RXcmFwcGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIHRpdGxlLFxuICBjb3VudCxcbiAgc2hvdyA9IHRydWUsXG4gIGFjdGlvbkJ1dHRvbixcbiAgY2FyZFN4LFxuICB0ZXh0U3gsXG4gIGljb24sXG4gIGljb25TeCxcbiAgc2hvd0NvdW50ID0gdHJ1ZSxcbn06IExpc3RXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGlmICghc2hvdykgcmV0dXJuIDw+PC8+O1xuXG4gIHJldHVybiAoXG4gICAgPENhcmRcbiAgICAgIHN4PXt7XG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIwcHhcIixcbiAgICAgICAgLi4uY2FyZFN4LFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8Q2FyZEhlYWRlclxuICAgICAgICBzeD17e1xuICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgIGZsZXhXcmFwOiBcIndyYXBcIixcbiAgICAgICAgICBwOiBcIjFyZW1cIixcbiAgICAgICAgICBcIi5NdWlDYXJkSGVhZGVyLWFjdGlvblwiOiB7XG4gICAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgICBhbGlnblNlbGY6IFwiY2VudGVyXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICB9fVxuICAgICAgICB0aXRsZT17XG4gICAgICAgICAgPEJveFxuICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcInNwYWNlLWJldHdlZW5cIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEJveCBzeD17eyBkaXNwbGF5OiBcImZsZXhcIiwgYWxpZ25JdGVtczogXCJjZW50ZXJcIiwgZ2FwOiAwLjUgfX0+XG4gICAgICAgICAgICAgIHtpY29uID8gKFxuICAgICAgICAgICAgICAgIGljb25cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8TWFuYWdlU2VhcmNoSWNvblxuICAgICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcIjIuNXJlbVwiLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICAgICAgICAgICAgICAgIC4uLmljb25TeCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPFR5cG9ncmFwaHlcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiaDVcIlxuICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiBcImJvbGRcIixcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgICAgICAgICAgICAgIC4uLnRleHRTeCxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3RpdGxlID8gdGl0bGUgOiBcIkxpc3RcIn1cbiAgICAgICAgICAgICAgICB7c2hvd0NvdW50ID8gYCgke2NvdW50ID8gY291bnQgOiAwfSlgIDogPD48Lz59XG4gICAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAge2FjdGlvbkJ1dHRvbn1cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgfVxuICAgICAgPjwvQ2FyZEhlYWRlcj5cbiAgICAgIDxEaXZpZGVyIC8+XG4gICAgICA8Q2FyZENvbnRlbnQgc3g9e3sgcHQ6IDAgfX0+XG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBzcGFjaW5nPXsyfT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgPC9DYXJkPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTGlzdFdyYXBwZXI7XG4iLCAiaW1wb3J0IHsgQm94IH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEdyaWRUb29sYmFyQ29udGFpbmVyLFxuICBHcmlkVG9vbGJhckNvbHVtbnNCdXR0b24sXG4gIEdyaWRUb29sYmFyRXhwb3J0LFxuICBHcmlkVG9vbGJhckZpbHRlckJ1dHRvbixcbiAgR3JpZFRvb2xiYXJRdWlja0ZpbHRlcixcbn0gZnJvbSBcIkBtdWkveC1kYXRhLWdyaWRcIjtcblxuLyoqXG4gKiBQcmUtY29uZmlndXJlZCB0b29sYmFyIGNvbXBvbmVudCBmb3IgTVVJIERhdGFHcmlkIHdpdGggZXNzZW50aWFsIHRvb2xzLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgcmVhZHktdG8tdXNlIHRvb2xiYXIgZm9yIE1VSSBEYXRhR3JpZCBjb21wb25lbnRzXG4gKiB0aGF0IGluY2x1ZGVzIHF1aWNrIGZpbHRlcmluZywgY29sdW1uIG1hbmFnZW1lbnQsIGFkdmFuY2VkIGZpbHRlcmluZywgYW5kXG4gKiBkYXRhIGV4cG9ydCBjYXBhYmlsaXRpZXMuIFRoZSBxdWljayBmaWx0ZXIgaW5wdXQgaXMgc3R5bGVkIHdpdGggY3VzdG9tXG4gKiBib3JkZXIgcmFkaXVzIGFuZCBwYWRkaW5nIGZvciBhIHBvbGlzaGVkIGFwcGVhcmFuY2UuXG4gKlxuICogRmVhdHVyZXMgaW5jbHVkZWQ6XG4gKiAtIFF1aWNrIGZpbHRlciBzZWFyY2ggaW5wdXQgKGxlZnQtYWxpZ25lZClcbiAqIC0gQ29sdW1uIHZpc2liaWxpdHkgdG9nZ2xlIGJ1dHRvblxuICogLSBBZHZhbmNlZCBmaWx0ZXIgYnV0dG9uXG4gKiAtIERhdGEgZXhwb3J0IGJ1dHRvbiAoQ1NWLCBFeGNlbCwgZXRjLilcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBEYXRhR3JpZDpcbiAqIGBgYHRzeFxuICogPERhdGFHcmlkXG4gKiAgIHJvd3M9e2RhdGF9XG4gKiAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gKiAgIHNsb3RzPXt7XG4gKiAgICAgdG9vbGJhcjogU2ltcGxlVG9vbGJhclxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBJbiBhIGN1c3RvbSBncmlkIHNldHVwOlxuICogYGBgdHN4XG4gKiA8Qm94PlxuICogICA8U2ltcGxlVG9vbGJhciAvPlxuICogICA8RGF0YUdyaWRcbiAqICAgICByb3dzPXtmaWx0ZXJlZERhdGF9XG4gKiAgICAgY29sdW1ucz17dmlzaWJsZUNvbHVtbnN9XG4gKiAgICAgaGlkZUZvb3RlclxuICogICAvPlxuICogPC9Cb3g+XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyBHcmlkVG9vbGJhckNvbnRhaW5lciB3aXRoIHByZS1jb25maWd1cmVkIHRvb2xiYXIgZWxlbWVudHNcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IFNpbXBsZVRvb2xiYXIgPSAoKSA9PiAoXG4gIDxHcmlkVG9vbGJhckNvbnRhaW5lcj5cbiAgICA8Qm94XG4gICAgICBzeD17e1xuICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1yb290XCI6IHtcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgICAgICAgcGFkZGluZzogXCI2cHggMTBweFwiLFxuICAgICAgICB9LFxuICAgICAgICBcIiYgaW5wdXRcIjoge1xuICAgICAgICAgIGZvbnRTaXplOiBcIjE0cHhcIixcbiAgICAgICAgICBjb2xvcjogXCIjMzMzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPEdyaWRUb29sYmFyUXVpY2tGaWx0ZXIgLz5cbiAgICA8L0JveD5cbiAgICA8Qm94IHN4PXt7IGZsZXhHcm93OiAxIH19IC8+XG4gICAgPEdyaWRUb29sYmFyQ29sdW1uc0J1dHRvbiAvPlxuICAgIDxHcmlkVG9vbGJhckZpbHRlckJ1dHRvbiAvPlxuICAgIDxHcmlkVG9vbGJhckV4cG9ydCAvPlxuICA8L0dyaWRUb29sYmFyQ29udGFpbmVyPlxuKTtcblxuZXhwb3J0IGRlZmF1bHQgU2ltcGxlVG9vbGJhcjtcbiIsICJpbXBvcnQgdHlwZSB7IEJ1dHRvblByb3BzIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IEJ1dHRvbiwgQ2lyY3VsYXJQcm9ncmVzcyB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgbWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgU2ltcGxlQnV0dG9uIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlQnV0dG9uUHJvcHMgZXh0ZW5kcyBCdXR0b25Qcm9wcyB7XG4gIC8qKlxuICAgKiBDb250cm9scyBidXR0b24gdmlzaWJpbGl0eS4gV2hlbiBmYWxzZSwgdGhlIGNvbXBvbmVudCByZXR1cm5zIG51bGwuXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgc2hvdz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMb2FkaW5nIHN0YXRlIHdpdGggc3Bpbm5lci4gV2hlbiB0cnVlLCBzaG93cyBhIGxvYWRpbmcgc3Bpbm5lciBhbmQgZGlzYWJsZXMgdGhlIGJ1dHRvbi5cbiAgICogQGRlZmF1bHRWYWx1ZSBmYWxzZVxuICAgKi9cbiAgbG9hZGluZz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUZXN0IGlkZW50aWZpZXIgZm9yIHRlc3RpbmcgZnJhbWV3b3Jrcy5cbiAgICogQGV4YW1wbGUgXCJzdWJtaXQtYnV0dG9uXCJcbiAgICovXG4gICdkYXRhLXRlc3RpZCc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXN0b20gdGV4dCB0byBkaXNwbGF5IHdoZW4gbG9hZGluZyBpcyB0cnVlLiBJZiBub3QgcHJvdmlkZWQsIG9yaWdpbmFsIGNoaWxkcmVuIGFyZSBzaG93bi5cbiAgICogQGV4YW1wbGUgXCJTYXZpbmcuLi5cIlxuICAgKi9cbiAgbG9hZGluZ1RleHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5oYW5jZWQgTVVJIEJ1dHRvbiBjb21wb25lbnQgd2l0aCBsb2FkaW5nIHN0YXRlcyBhbmQgY29uZGl0aW9uYWwgcmVuZGVyaW5nLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IGV4dGVuZHMgdGhlIHN0YW5kYXJkIE1VSSBCdXR0b24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBMb2FkaW5nIHN0YXRlIHdpdGggc3Bpbm5lclxuICogLSBDb25kaXRpb25hbCByZW5kZXJpbmcgYmFzZWQgb24gc2hvdyBwcm9wXG4gKiAtIEF1dG9tYXRpYyBkaXNhYmxpbmcgZHVyaW5nIGxvYWRpbmdcbiAqIC0gQ3VzdG9tIGxvYWRpbmcgdGV4dCBzdXBwb3J0XG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8U2ltcGxlQnV0dG9uIHZhcmlhbnQ9XCJjb250YWluZWRcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAqICAgQ2xpY2sgTWVcbiAqIDwvU2ltcGxlQnV0dG9uPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggbG9hZGluZyBzdGF0ZTpcbiAqIGBgYHRzeFxuICogPFNpbXBsZUJ1dHRvblxuICogICBsb2FkaW5nPXtpc1N1Ym1pdHRpbmd9XG4gKiAgIGxvYWRpbmdUZXh0PVwiU2F2aW5nLi4uXCJcbiAqICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXG4gKiA+XG4gKiAgIFNhdmUgQ2hhbmdlc1xuICogPC9TaW1wbGVCdXR0b24+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ29uZGl0aW9uYWwgcmVuZGVyaW5nOlxuICogYGBgdHN4XG4gKiA8U2ltcGxlQnV0dG9uXG4gKiAgIHNob3c9e2hhc1Blcm1pc3Npb259XG4gKiAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gKiA+XG4gKiAgIEFkbWluIEFjdGlvblxuICogPC9TaW1wbGVCdXR0b24+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHMgZXh0ZW5kaW5nIE1VSSBCdXR0b25Qcm9wc1xuICogQHBhcmFtIHJlZiAtIEZvcndhcmRlZCByZWYgdG8gdGhlIHVuZGVybHlpbmcgYnV0dG9uIGVsZW1lbnRcbiAqIEByZXR1cm5zIEpTWCBlbGVtZW50IG9yIG51bGwgaWYgc2hvdyBpcyBmYWxzZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgU2ltcGxlQnV0dG9uID0gbWVtbyhmb3J3YXJkUmVmPEhUTUxCdXR0b25FbGVtZW50LCBTaW1wbGVCdXR0b25Qcm9wcz4oXG4gICh7XG4gICAgc2hvdyA9IHRydWUsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIGxvYWRpbmdUZXh0LFxuICAgIGNoaWxkcmVuLFxuICAgIC4uLnJlc3RcbiAgfSwgcmVmKSA9PiB7XG4gICAgaWYgKCFzaG93KSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmcgfHwgcmVzdC5kaXNhYmxlZH1cbiAgICAgICAgICBzdGFydEljb249e2xvYWRpbmcgPyA8Q2lyY3VsYXJQcm9ncmVzcyBzaXplPXsxNn0gLz4gOiByZXN0LnN0YXJ0SWNvbn1cbiAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgPlxuICAgICAgICAgIHtsb2FkaW5nICYmIGxvYWRpbmdUZXh0ID8gbG9hZGluZ1RleHQgOiBjaGlsZHJlbn1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8Lz5cbiAgICApO1xuICB9XG4pKTtcblxuU2ltcGxlQnV0dG9uLmRpc3BsYXlOYW1lID0gXCJTaW1wbGVCdXR0b25cIjtcblxuZXhwb3J0IGRlZmF1bHQgU2ltcGxlQnV0dG9uO1xuIiwgImltcG9ydCB0eXBlIHsgUHJvcHNXaXRoQ2hpbGRyZW4gfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEF1dGhvcml6ZWRWaWV3IGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnR5cGUgQXV0aG9yaXplZFZpZXdQcm9wcyA9IFByb3BzV2l0aENoaWxkcmVuICYge1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0aGUgY2hpbGRyZW4gc2hvdWxkIGJlIHJlbmRlcmVkLiBXaGVuIGZhbHNlLCBub3RoaW5nIGlzIHJlbmRlcmVkLlxuICAgKiBAZXhhbXBsZSB0cnVlIC0gU2hvdyBjb250ZW50LCBmYWxzZSAtIEhpZGUgY29udGVudFxuICAgKi9cbiAgc2hvdzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQ29uZGl0aW9uYWwgcmVuZGVyaW5nIGNvbXBvbmVudCB0aGF0IHNob3dzIG9yIGhpZGVzIGNvbnRlbnQgYmFzZWQgb24gYXV0aG9yaXphdGlvbiBzdGF0ZS5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHNpbXBsZSB3YXkgdG8gY29uZGl0aW9uYWxseSByZW5kZXIgY2hpbGQgY29tcG9uZW50c1xuICogYmFzZWQgb24gYSBib29sZWFuIGZsYWcsIHR5cGljYWxseSB1c2VkIGZvciBhdXRob3JpemF0aW9uIG9yIHBlcm1pc3Npb24tYmFzZWQgcmVuZGVyaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPEF1dGhvcml6ZWRWaWV3IHNob3c9e2hhc1Blcm1pc3Npb259PlxuICogICA8QWRtaW5QYW5lbCAvPlxuICogPC9BdXRob3JpemVkVmlldz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHVzZXIgcm9sZXM6XG4gKiBgYGB0c3hcbiAqIDxBdXRob3JpemVkVmlldyBzaG93PXt1c2VyLnJvbGUgPT09ICdhZG1pbid9PlxuICogICA8RGVsZXRlQnV0dG9uIC8+XG4gKiA8L0F1dGhvcml6ZWRWaWV3PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIGluY2x1ZGluZyBjaGlsZHJlbiBhbmQgc2hvdyBmbGFnXG4gKiBAcmV0dXJucyBKU1ggY2hpbGRyZW4gaWYgc2hvdyBpcyB0cnVlLCBlbXB0eSBmcmFnbWVudCBpZiBmYWxzZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQXV0aG9yaXplZFZpZXcgPSAoeyBjaGlsZHJlbiwgc2hvdyB9OiBBdXRob3JpemVkVmlld1Byb3BzKSA9PiB7XG4gIGlmICghc2hvdykgcmV0dXJuIDw+PC8+O1xuXG4gIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBdXRob3JpemVkVmlldztcbiIsICJpbXBvcnQgdHlwZSB7IFN4UHJvcHMgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIENhbmNlbEJ1dHRvbiBjb21wb25lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG5pbnRlcmZhY2UgQ2FuY2VsQnV0dG9uUHJvcHMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGEgZm9ybSBvciBvcGVyYXRpb24gaXMgY3VycmVudGx5IGJlaW5nIHN1Ym1pdHRlZC5cbiAgICogV2hlbiB0cnVlLCB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIHRvIHByZXZlbnQgbXVsdGlwbGUgY2FuY2VsIGFjdGlvbnMuXG4gICAqL1xuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWxsYmFjayBmdW5jdGlvbiBleGVjdXRlZCB3aGVuIHRoZSBjYW5jZWwgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqIFNob3VsZCBoYW5kbGUgdGhlIGNhbmNlbGxhdGlvbiBsb2dpYyAoZS5nLiwgZm9ybSByZXNldCwgbmF2aWdhdGlvbiwgZXRjLikuXG4gICAqL1xuICBoYW5kbGVDYW5jZWw6ICgpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgbXQ6IDIsIGJnY29sb3I6ICdlcnJvci5tYWluJyB9XG4gICAqL1xuICBzeD86IFN4UHJvcHM7XG59XG5cbi8qKlxuICogU3RhbmRhcmRpemVkIGNhbmNlbCBidXR0b24gY29tcG9uZW50IHdpdGggc3VibWlzc2lvbiBzdGF0ZSBoYW5kbGluZy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgY2FuY2VsIGJ1dHRvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGhhbmRsZXMgZGlzYWJsZWQgc3RhdGVzIGR1cmluZyBmb3JtIHN1Ym1pc3Npb25zLiBJdCdzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gZm9ybXNcbiAqIGFuZCBkaWFsb2dzIHdoZXJlIHVzZXJzIG5lZWQgdG8gY2FuY2VsIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIGluIGEgZm9ybTpcbiAqIGBgYHRzeFxuICogPENhbmNlbEJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2lzTG9hZGluZ31cbiAqICAgaGFuZGxlQ2FuY2VsPXsoKSA9PiBuYXZpZ2F0ZSgnL3ByZXZpb3VzLXBhZ2UnKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gc3R5bGluZzpcbiAqIGBgYHRzeFxuICogPENhbmNlbEJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2Zvcm0uZm9ybVN0YXRlLmlzU3VibWl0dGluZ31cbiAqICAgaGFuZGxlQ2FuY2VsPXtmb3JtLnJlc2V0fVxuICogICBzeD17eyBtdDogMiwgY29sb3I6ICdlcnJvci5tYWluJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBmb3IgY2FuY2VsIGJ1dHRvbiBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBNVUkgQnV0dG9uIGNvbXBvbmVudCBjb25maWd1cmVkIGFzIGEgY2FuY2VsIGJ1dHRvblxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2FuY2VsQnV0dG9uID0gKHtcbiAgaXNTdWJtaXR0aW5nLFxuICBoYW5kbGVDYW5jZWwsXG4gIHN4LFxufTogQ2FuY2VsQnV0dG9uUHJvcHMpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8QnV0dG9uXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgb25DbGljaz17aGFuZGxlQ2FuY2VsfVxuICAgICAgZGlzYWJsZWQ9e2lzU3VibWl0dGluZ31cbiAgICAgIHN4PXtzeH1cbiAgICA+XG4gICAgICBDYW5jZWxcbiAgICA8L0J1dHRvbj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENhbmNlbEJ1dHRvbjtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFDQSxTQUFTLGNBQWM7QUE0RW5CO0FBZEosSUFBTSxjQUFjLENBQUM7QUFBQSxFQUNuQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLE1BQXdCO0FBQ3RCLFFBQU0sVUFBVSxNQUFNO0FBQ3BCLGdCQUFZO0FBQ1osUUFBSSxZQUFZLE1BQU07QUFDcEIsbUJBQWEsV0FBVyxRQUFRO0FBQUEsSUFDbEM7QUFBQSxFQUNGO0FBRUEsU0FDRTtBQUFBLElBQUM7QUFBQTtBQUFBLE1BQ0MsU0FBUTtBQUFBLE1BQ1I7QUFBQSxNQUNBLFVBQVU7QUFBQSxNQUNWO0FBQUEsTUFDRDtBQUFBO0FBQUEsRUFFRDtBQUVKO0FBRUEsSUFBTyxzQkFBUTs7O0FDeEZmLE9BQU8sbUJBQW1CO0FBQzFCLFNBQVMscUJBQXFCO0FBRTlCLFNBQVMsYUFBdUI7QUE0R1AsZ0JBQUFBLFlBQUE7QUF2QnpCLElBQU0sZUFBZSxDQUFDO0FBQUEsRUFDcEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLE1BQXlCO0FBQ3ZCLFNBQ0UsZ0JBQUFBO0FBQUEsSUFBQztBQUFBO0FBQUEsTUFDQyxNQUFLO0FBQUEsTUFDTCxTQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsTUFDVCxVQUFVLENBQUM7QUFBQSxNQUNYLGVBQWE7QUFBQSxNQUNiLE9BQU07QUFBQSxNQUNOLElBQUk7QUFBQSxRQUNGLFNBQVM7QUFBQSxRQUNULFlBQVk7QUFBQSxRQUNaLEdBQUc7QUFBQSxNQUNMO0FBQUEsTUFDQSxXQUNFLGdCQUFBQSxLQUFDLFNBQU0sT0FBTSxTQUFRLFNBQVEsWUFDMUIsaUJBQU8sT0FBTyxnQkFBQUEsS0FBQyxpQkFBYyxPQUFNLE1BQUssUUFBTyxNQUFLLElBQUksUUFBUSxHQUNuRTtBQUFBLE1BR0QsaUJBQU8sS0FBSyxNQUFNLE1BQU0sQ0FBQyxRQUFRLFdBQVc7QUFBQTtBQUFBLEVBQy9DO0FBRUo7QUFFQSxJQUFPLHVCQUFROzs7QUN4SGYsT0FBTyxzQkFBc0I7QUFJN0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxZQUFBQztBQUFBLE9BQ0s7QUF1SU8sU0FpQm9ELFVBakJwRCxPQUFBQyxNQVFGLFlBUkU7QUFyQ2QsSUFBTSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLE1BQTBCO0FBQ3hCLFFBQU0sUUFBUUQsVUFBUztBQUV2QixTQUNFO0FBQUEsSUFBQztBQUFBO0FBQUEsTUFDQyxJQUFJO0FBQUEsUUFDRixVQUFVO0FBQUEsUUFDVixjQUFjO0FBQUEsUUFDZCxJQUFJO0FBQUEsUUFDSixHQUFHO0FBQUEsTUFDTDtBQUFBLE1BRUE7QUFBQSx3QkFBQUM7QUFBQSxVQUFDO0FBQUE7QUFBQSxZQUNDLElBQUk7QUFBQSxjQUNGLFNBQVM7QUFBQSxjQUNULFVBQVU7QUFBQSxjQUNWLEdBQUc7QUFBQSxjQUNILHlCQUF5QjtBQUFBLGdCQUN2QixRQUFRO0FBQUEsZ0JBQ1IsV0FBVztBQUFBLGNBQ2I7QUFBQSxjQUNBLFlBQVk7QUFBQSxZQUNkO0FBQUEsWUFDQSxPQUNFLHFCQUFDLE9BQUksSUFBSSxFQUFFLFNBQVMsUUFBUSxZQUFZLFVBQVUsS0FBSyxJQUFJLEdBQ3hEO0FBQUEscUJBQ0MsT0FFQSxnQkFBQUE7QUFBQSxnQkFBQztBQUFBO0FBQUEsa0JBQ0MsSUFBSTtBQUFBLG9CQUNGLFFBQVE7QUFBQSxvQkFDUixPQUFPLE1BQU0sUUFBUSxRQUFRO0FBQUEsb0JBQzdCLEdBQUc7QUFBQSxrQkFDTDtBQUFBO0FBQUEsY0FDRjtBQUFBLGNBRUY7QUFBQSxnQkFBQztBQUFBO0FBQUEsa0JBQ0MsU0FBUTtBQUFBLGtCQUNSLElBQUk7QUFBQSxvQkFDRixZQUFZO0FBQUEsb0JBQ1osT0FBTyxNQUFNLFFBQVEsUUFBUTtBQUFBLG9CQUM3QixHQUFHO0FBQUEsa0JBQ0w7QUFBQSxrQkFFQztBQUFBLDRCQUFRLFFBQVE7QUFBQSxvQkFBVTtBQUFBLG9CQUMxQixZQUFZLElBQUksY0FBYyxjQUFjLENBQUMsTUFBTSxnQkFBQUEsS0FBQSxZQUFFO0FBQUE7QUFBQTtBQUFBLGNBQ3hEO0FBQUEsZUFDRjtBQUFBO0FBQUEsUUFFSDtBQUFBLFFBQ0QsZ0JBQUFBLEtBQUMsV0FBUTtBQUFBLFFBQ1QsZ0JBQUFBLEtBQUMsZUFBWSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQ3ZCLDBCQUFBQSxLQUFDLFFBQUssV0FBUyxNQUFDLFNBQVMsR0FDdEIsVUFDSCxHQUNGO0FBQUE7QUFBQTtBQUFBLEVBQ0Y7QUFFSjtBQUVBLElBQU8sd0JBQVE7OztBQ2pMZjtBQUFBLEVBQ0UsT0FBQUM7QUFBQSxFQUNBLFFBQUFDO0FBQUEsRUFDQSxlQUFBQztBQUFBLEVBQ0EsY0FBQUM7QUFBQSxFQUNBLFdBQUFDO0FBQUEsRUFDQSxRQUFBQztBQUFBLEVBQ0EsY0FBQUM7QUFBQSxPQUNLO0FBcUhLLFNBRUUsT0FBQUMsTUFGRixRQUFBQyxhQUFBO0FBbkNaLElBQU0sY0FBYyxDQUFDO0FBQUEsRUFDbkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixNQUFtQjtBQUNqQixTQUNFLGdCQUFBQTtBQUFBLElBQUNQO0FBQUEsSUFBQTtBQUFBLE1BQ0MsSUFBSTtBQUFBLFFBQ0YsVUFBVTtBQUFBLFFBQ1YsY0FBYztBQUFBLFFBQ2QsR0FBRztBQUFBLE1BQ0w7QUFBQSxNQUVBO0FBQUEsd0JBQUFNO0FBQUEsVUFBQ0o7QUFBQSxVQUFBO0FBQUEsWUFDQyxJQUFJO0FBQUEsY0FDRixTQUFTO0FBQUEsY0FDVCxVQUFVO0FBQUEsY0FDVixHQUFHO0FBQUEsY0FDSCx5QkFBeUI7QUFBQSxnQkFDdkIsUUFBUTtBQUFBLGdCQUNSLFdBQVc7QUFBQSxjQUNiO0FBQUEsWUFDRjtBQUFBLFlBQ0EsT0FDRSxnQkFBQUs7QUFBQSxjQUFDUjtBQUFBLGNBQUE7QUFBQSxnQkFDQyxJQUFJO0FBQUEsa0JBQ0YsU0FBUztBQUFBLGtCQUNULFlBQVk7QUFBQSxrQkFDWixnQkFBZ0I7QUFBQSxnQkFDbEI7QUFBQSxnQkFFQTtBQUFBLGtDQUFBUSxNQUFDUixNQUFBLEVBQUksSUFBSSxFQUFFLFNBQVMsUUFBUSxZQUFZLFVBQVUsS0FBSyxJQUFJLEdBQ3hEO0FBQUEsNEJBQVE7QUFBQSxvQkFDVCxnQkFBQU8sS0FBQ0QsYUFBQSxFQUFXLE9BQU0sV0FBVSxJQUFJLFFBQzdCLGlCQUNIO0FBQUEscUJBQ0Y7QUFBQSxrQkFDQztBQUFBO0FBQUE7QUFBQSxZQUNIO0FBQUE7QUFBQSxRQUVIO0FBQUEsUUFDRCxnQkFBQUMsS0FBQ0gsVUFBQSxFQUFRLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRztBQUFBLFFBQ3hCLGdCQUFBRyxLQUFDTCxjQUFBLEVBQ0MsMEJBQUFLLEtBQUNGLE9BQUEsRUFBSyxXQUFTLE1BQUMsU0FBUyxHQUN0QixVQUNILEdBQ0Y7QUFBQTtBQUFBO0FBQUEsRUFDRjtBQUVKO0FBRUEsSUFBTyxzQkFBUTs7O0FDbkpmLFNBQVMsUUFBQUksT0FBTSxTQUFTLGNBQUFDLG1CQUFrQjtBQW1IcEMsU0FnQkksT0FBQUMsTUFoQkosUUFBQUMsYUFBQTtBQXpCTixJQUFNLFlBQVksQ0FBQztBQUFBLEVBQ2pCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixNQUFzQjtBQUNwQixRQUFNLGtCQUFrQjtBQUFBLElBQ3RCLFdBQVcsRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRTtBQUFBLElBQ2pDLFdBQVcsRUFBRSxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksRUFBRTtBQUFBLEVBQ3BDO0FBQ0EsUUFBTSx1QkFBdUIsRUFBRSxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksRUFBRTtBQUNwRCxRQUFNLE9BQU8sWUFBWTtBQUN6QixRQUFNLFlBQVksaUJBQWlCO0FBRW5DLFNBQ0UsZ0JBQUFBO0FBQUEsSUFBQ0g7QUFBQSxJQUFBO0FBQUEsTUFDQyxNQUFNO0FBQUEsTUFDTixJQUFJO0FBQUEsUUFDRixTQUFTO0FBQUEsUUFDVCxlQUFlLEVBQUUsSUFBSSxVQUFVLElBQUksT0FBTyxJQUFJLE1BQU07QUFBQSxRQUNwRCxXQUFXLEVBQUUsU0FBUyxXQUFXLFVBQVUsU0FBUztBQUFBLE1BQ3REO0FBQUEsTUFFQTtBQUFBLHdCQUFBRztBQUFBLFVBQUNIO0FBQUEsVUFBQTtBQUFBLFlBQ0MsTUFBTSxLQUFLO0FBQUEsWUFDWCxJQUFJO0FBQUEsY0FDRixTQUFTO0FBQUEsY0FDVCxVQUFVO0FBQUEsY0FDVixXQUFXLEVBQUUsSUFBSSxRQUFRLElBQUksU0FBUyxJQUFJLFFBQVE7QUFBQSxjQUNsRCxHQUFHO0FBQUEsWUFDTDtBQUFBLFlBRUM7QUFBQTtBQUFBLGNBQU07QUFBQTtBQUFBO0FBQUEsUUFDVDtBQUFBLFFBQ0EsZ0JBQUFFO0FBQUEsVUFBQ0Y7QUFBQSxVQUFBO0FBQUEsWUFDQyxNQUFNLEtBQUs7QUFBQSxZQUNYLElBQUksRUFBRSxTQUFTLE9BQU8sU0FBUyxRQUFRLFVBQVUsT0FBTztBQUFBLFlBRXhELDBCQUFBRSxLQUFDLFdBQVEsT0FBTyxPQUFPLE9BQUssTUFDMUIsMEJBQUFBO0FBQUEsY0FBQ0Q7QUFBQSxjQUFBO0FBQUEsZ0JBQ0MsSUFBSTtBQUFBLGtCQUNGLFVBQVU7QUFBQSxrQkFDVixXQUFXO0FBQUEsa0JBQ1gsVUFBVTtBQUFBLGtCQUNWLFNBQVM7QUFBQSxrQkFDVCxjQUFjO0FBQUEsa0JBQ2QsaUJBQWlCO0FBQUEsa0JBQ2pCLGlCQUFpQjtBQUFBLGtCQUNqQixHQUFHO0FBQUEsa0JBQ0gsT0FBTztBQUFBLGdCQUNUO0FBQUEsZ0JBRUMsa0JBQVEsUUFBUTtBQUFBO0FBQUEsWUFDbkIsR0FDRjtBQUFBO0FBQUEsUUFDRjtBQUFBO0FBQUE7QUFBQSxFQUNGO0FBRUo7QUFFQSxJQUFPLG9CQUFROzs7QUN6SmYsT0FBT0csdUJBQXNCO0FBSTdCO0FBQUEsRUFDRSxPQUFBQztBQUFBLEVBQ0EsUUFBQUM7QUFBQSxFQUNBLGVBQUFDO0FBQUEsRUFDQSxjQUFBQztBQUFBLEVBQ0EsV0FBQUM7QUFBQSxFQUNBLFFBQUFDO0FBQUEsRUFDQSxjQUFBQztBQUFBLEVBQ0EsWUFBQUM7QUFBQSxPQUNLO0FBNkhhLHFCQUFBQyxXQUFBLE9BQUFDLE1BeUNOLFFBQUFDLGFBekNNO0FBZHBCLElBQU0sY0FBYyxDQUFDO0FBQUEsRUFDbkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsT0FBTztBQUFBLEVBQ1A7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxZQUFZO0FBQ2QsTUFBd0I7QUFDdEIsUUFBTSxRQUFRSCxVQUFTO0FBRXZCLE1BQUksQ0FBQyxLQUFNLFFBQU8sZ0JBQUFFLEtBQUFELFdBQUEsRUFBRTtBQUVwQixTQUNFLGdCQUFBRTtBQUFBLElBQUNUO0FBQUEsSUFBQTtBQUFBLE1BQ0MsSUFBSTtBQUFBLFFBQ0YsVUFBVTtBQUFBLFFBQ1YsY0FBYztBQUFBLFFBQ2QsR0FBRztBQUFBLE1BQ0w7QUFBQSxNQUVBO0FBQUEsd0JBQUFRO0FBQUEsVUFBQ047QUFBQSxVQUFBO0FBQUEsWUFDQyxJQUFJO0FBQUEsY0FDRixTQUFTO0FBQUEsY0FDVCxVQUFVO0FBQUEsY0FDVixHQUFHO0FBQUEsY0FDSCx5QkFBeUI7QUFBQSxnQkFDdkIsUUFBUTtBQUFBLGdCQUNSLFdBQVc7QUFBQSxjQUNiO0FBQUEsY0FDQSxZQUFZO0FBQUEsWUFDZDtBQUFBLFlBQ0EsT0FDRSxnQkFBQU87QUFBQSxjQUFDVjtBQUFBLGNBQUE7QUFBQSxnQkFDQyxJQUFJO0FBQUEsa0JBQ0YsU0FBUztBQUFBLGtCQUNULFlBQVk7QUFBQSxrQkFDWixnQkFBZ0I7QUFBQSxnQkFDbEI7QUFBQSxnQkFFQTtBQUFBLGtDQUFBVSxNQUFDVixNQUFBLEVBQUksSUFBSSxFQUFFLFNBQVMsUUFBUSxZQUFZLFVBQVUsS0FBSyxJQUFJLEdBQ3hEO0FBQUEsMkJBQ0MsT0FFQSxnQkFBQVM7QUFBQSxzQkFBQ1Y7QUFBQSxzQkFBQTtBQUFBLHdCQUNDLElBQUk7QUFBQSwwQkFDRixRQUFRO0FBQUEsMEJBQ1IsT0FBTyxNQUFNLFFBQVEsUUFBUTtBQUFBLDBCQUM3QixHQUFHO0FBQUEsd0JBQ0w7QUFBQTtBQUFBLG9CQUNGO0FBQUEsb0JBRUYsZ0JBQUFXO0FBQUEsc0JBQUNKO0FBQUEsc0JBQUE7QUFBQSx3QkFDQyxTQUFRO0FBQUEsd0JBQ1IsSUFBSTtBQUFBLDBCQUNGLFlBQVk7QUFBQSwwQkFDWixPQUFPLE1BQU0sUUFBUSxRQUFRO0FBQUEsMEJBQzdCLEdBQUc7QUFBQSx3QkFDTDtBQUFBLHdCQUVDO0FBQUEsa0NBQVEsUUFBUTtBQUFBLDBCQUNoQixZQUFZLElBQUksUUFBUSxRQUFRLENBQUMsTUFBTSxnQkFBQUcsS0FBQUQsV0FBQSxFQUFFO0FBQUE7QUFBQTtBQUFBLG9CQUM1QztBQUFBLHFCQUNGO0FBQUEsa0JBQ0M7QUFBQTtBQUFBO0FBQUEsWUFDSDtBQUFBO0FBQUEsUUFFSDtBQUFBLFFBQ0QsZ0JBQUFDLEtBQUNMLFVBQUEsRUFBUTtBQUFBLFFBQ1QsZ0JBQUFLLEtBQUNQLGNBQUEsRUFBWSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQ3ZCLDBCQUFBTyxLQUFDSixPQUFBLEVBQUssV0FBUyxNQUFDLFNBQVMsR0FDdEIsVUFDSCxHQUNGO0FBQUE7QUFBQTtBQUFBLEVBQ0Y7QUFFSjtBQUVBLElBQU8sc0JBQVE7OztBQzdNZixTQUFTLE9BQUFNLFlBQVc7QUFDcEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUE4Q0wsU0FjSSxPQUFBQyxNQWRKLFFBQUFDLGFBQUE7QUFERixJQUFNLGdCQUFnQixNQUNwQixnQkFBQUEsTUFBQyx3QkFDQztBQUFBLGtCQUFBRDtBQUFBLElBQUNEO0FBQUEsSUFBQTtBQUFBLE1BQ0MsSUFBSTtBQUFBLFFBQ0Ysd0JBQXdCO0FBQUEsVUFDdEIsY0FBYztBQUFBLFVBQ2QsU0FBUztBQUFBLFFBQ1g7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxRQUNUO0FBQUEsUUFDQSxjQUFjO0FBQUEsTUFDaEI7QUFBQSxNQUVBLDBCQUFBQyxLQUFDLDBCQUF1QjtBQUFBO0FBQUEsRUFDMUI7QUFBQSxFQUNBLGdCQUFBQSxLQUFDRCxNQUFBLEVBQUksSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHO0FBQUEsRUFDMUIsZ0JBQUFDLEtBQUMsNEJBQXlCO0FBQUEsRUFDMUIsZ0JBQUFBLEtBQUMsMkJBQXdCO0FBQUEsRUFDekIsZ0JBQUFBLEtBQUMscUJBQWtCO0FBQUEsR0FDckI7QUFHRixJQUFPLHdCQUFROzs7QUMzRWYsU0FBUyxVQUFBRSxTQUFRLHdCQUF3QjtBQUN6QyxTQUFnQixZQUFZLFlBQVk7QUF1RmxDLHFCQUFBQyxXQUl5QixPQUFBQyxZQUp6QjtBQVhOLElBQU0sZUFBZSxLQUFLO0FBQUEsRUFDeEIsQ0FBQztBQUFBLElBQ0MsT0FBTztBQUFBLElBQ1AsVUFBVTtBQUFBLElBQ1Y7QUFBQSxJQUNBO0FBQUEsSUFDQSxHQUFHO0FBQUEsRUFDTCxHQUFHLFFBQVE7QUFDVCxRQUFJLENBQUMsS0FBTSxRQUFPO0FBRWxCLFdBQ0UsZ0JBQUFBLEtBQUFELFdBQUEsRUFDRSwwQkFBQUM7QUFBQSxNQUFDRjtBQUFBLE1BQUE7QUFBQSxRQUNDO0FBQUEsUUFDQSxVQUFVLFdBQVcsS0FBSztBQUFBLFFBQzFCLFdBQVcsVUFBVSxnQkFBQUUsS0FBQyxvQkFBaUIsTUFBTSxJQUFJLElBQUssS0FBSztBQUFBLFFBQzFELEdBQUc7QUFBQSxRQUVILHFCQUFXLGNBQWMsY0FBYztBQUFBO0FBQUEsSUFDMUMsR0FDRjtBQUFBLEVBRUo7QUFDRixDQUFDO0FBRUQsYUFBYSxjQUFjO0FBRTNCLElBQU8sdUJBQVE7OztBQzlESyxxQkFBQUMsV0FBQSxPQUFBQyxZQUFBO0FBRHBCLElBQU0saUJBQWlCLENBQUMsRUFBRSxVQUFVLEtBQUssTUFBMkI7QUFDbEUsTUFBSSxDQUFDLEtBQU0sUUFBTyxnQkFBQUEsS0FBQUQsV0FBQSxFQUFFO0FBRXBCLFNBQU8sZ0JBQUFDLEtBQUFELFdBQUEsRUFBRyxVQUFTO0FBQ3JCO0FBRUEsSUFBTyx5QkFBUTs7O0FDL0NmLFNBQVMsVUFBQUUsZUFBYztBQThEbkIsZ0JBQUFDLGFBQUE7QUFOSixJQUFNLGVBQWUsQ0FBQztBQUFBLEVBQ3BCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixNQUF5QjtBQUN2QixTQUNFLGdCQUFBQTtBQUFBLElBQUNEO0FBQUEsSUFBQTtBQUFBLE1BQ0MsU0FBUTtBQUFBLE1BQ1IsU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BQ1Y7QUFBQSxNQUNEO0FBQUE7QUFBQSxFQUVEO0FBRUo7QUFFQSxJQUFPLHVCQUFROyIsCiAgIm5hbWVzIjogWyJqc3giLCAidXNlVGhlbWUiLCAianN4IiwgIkJveCIsICJDYXJkIiwgIkNhcmRDb250ZW50IiwgIkNhcmRIZWFkZXIiLCAiRGl2aWRlciIsICJHcmlkIiwgIlR5cG9ncmFwaHkiLCAianN4IiwgImpzeHMiLCAiR3JpZCIsICJUeXBvZ3JhcGh5IiwgImpzeCIsICJqc3hzIiwgIk1hbmFnZVNlYXJjaEljb24iLCAiQm94IiwgIkNhcmQiLCAiQ2FyZENvbnRlbnQiLCAiQ2FyZEhlYWRlciIsICJEaXZpZGVyIiwgIkdyaWQiLCAiVHlwb2dyYXBoeSIsICJ1c2VUaGVtZSIsICJGcmFnbWVudCIsICJqc3giLCAianN4cyIsICJCb3giLCAianN4IiwgImpzeHMiLCAiQnV0dG9uIiwgIkZyYWdtZW50IiwgImpzeCIsICJGcmFnbWVudCIsICJqc3giLCAiQnV0dG9uIiwgImpzeCJdCn0K