@rotki/ui-library 2.7.0 → 2.8.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 (81) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +3 -2
  2. package/dist/components/accordions/accordions/RuiAccordions.vue.d.ts +2 -1
  3. package/dist/components/alerts/RuiAlert.vue.d.ts +4 -3
  4. package/dist/components/buttons/button/RuiButton.vue.d.ts +7 -5
  5. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +6 -5
  6. package/dist/components/calendar/RuiCalendar.vue.d.ts +4 -2
  7. package/dist/components/calendar/RuiCalendarGrid.vue.d.ts +4 -2
  8. package/dist/components/calendar/RuiCalendarHeader.vue.d.ts +4 -2
  9. package/dist/components/calendar/RuiCalendarMenu.vue.d.ts +4 -2
  10. package/dist/components/cards/RuiCard.vue.d.ts +4 -3
  11. package/dist/components/cards/RuiCardHeader.vue.d.ts +3 -2
  12. package/dist/components/chips/RuiChip.vue.d.ts +4 -3
  13. package/dist/components/color-picker/RuiColorBoard.vue.d.ts +2 -1
  14. package/dist/components/color-picker/RuiColorDisplay.vue.d.ts +2 -1
  15. package/dist/components/color-picker/RuiColorHue.vue.d.ts +4 -3
  16. package/dist/components/color-picker/RuiColorInput.vue.d.ts +4 -3
  17. package/dist/components/color-picker/RuiColorPicker.vue.d.ts +2 -1
  18. package/dist/components/color-picker/utils.d.ts +1 -1
  19. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +10 -8
  20. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.d.ts +5 -3
  21. package/dist/components/divider/RuiDivider.vue.d.ts +2 -1
  22. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +29 -28
  23. package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +4 -3
  24. package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +7 -6
  25. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +7 -6
  26. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +8 -6
  27. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +747 -10
  28. package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +3 -2
  29. package/dist/components/forms/slider/RuiSlider.vue.d.ts +3 -2
  30. package/dist/components/forms/switch/RuiSwitch.vue.d.ts +3 -2
  31. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +8 -6
  32. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +10 -8
  33. package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +2 -1
  34. package/dist/components/icons/RuiIcon.vue.d.ts +2 -1
  35. package/dist/components/index.d.ts +2 -1
  36. package/dist/components/index.es.js +4335 -4252
  37. package/dist/components/loaders/RuiSkeletonBase.vue.d.ts +2 -1
  38. package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +2 -1
  39. package/dist/components/logos/RuiLogo.vue.d.ts +2 -1
  40. package/dist/components/overlays/badge/RuiBadge.vue.d.ts +5 -4
  41. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.d.ts +3 -2
  42. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +6 -5
  43. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +6 -3
  44. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +6 -5
  45. package/dist/components/overlays/notification/RuiNotification.vue.d.ts +4 -3
  46. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +4 -3
  47. package/dist/components/progress/RuiProgress.vue.d.ts +3 -2
  48. package/dist/components/steppers/RuiFooterStepper.vue.d.ts +2 -1
  49. package/dist/components/steppers/RuiStepper.vue.d.ts +4 -3
  50. package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +2 -1
  51. package/dist/components/steppers/RuiStepperIcon.vue.d.ts +2 -1
  52. package/dist/components/tables/RuiDataTable.vue.d.ts +13 -12
  53. package/dist/components/tables/RuiExpandButton.vue.d.ts +3 -2
  54. package/dist/components/tables/RuiTableHead.vue.d.ts +7 -6
  55. package/dist/components/tables/RuiTablePagination.vue.d.ts +3 -2
  56. package/dist/components/tabs/tab/RuiTab.vue.d.ts +5 -4
  57. package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +4 -3
  58. package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +7 -6
  59. package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +3 -2
  60. package/dist/components/time-picker/RuiTimePicker.vue.d.ts +4 -2
  61. package/dist/composables/defaults/table.d.ts +1 -2
  62. package/dist/composables/dropdown-menu.d.ts +3 -2
  63. package/dist/composables/index-CC7A7CEh.js +737 -0
  64. package/dist/composables/index.es.js +1 -1
  65. package/dist/composables/popper.d.ts +2 -2
  66. package/dist/composables/sticky-header.d.ts +1 -1
  67. package/dist/consts/time-accuracy-BnKA5GyT.js +1 -1
  68. package/dist/consts/typography.d.ts +38 -4
  69. package/dist/{index-cTPqOSmm.js → index-D7l4d7N2.js} +4 -4
  70. package/dist/index.es.js +4 -4
  71. package/dist/style.css +1 -1
  72. package/dist/theme/index.es.js +30 -23
  73. package/dist/utils/form-text-detail.d.ts +1 -1
  74. package/dist/utils/index-DJ-ueLCs.js +158 -0
  75. package/dist/vendor-Hqbg5uCG.js +1931 -0
  76. package/dist/web-types.json +59 -39
  77. package/package.json +41 -48
  78. package/README.md +0 -276
  79. package/dist/composables/index-D7DVd8pO.js +0 -717
  80. package/dist/utils/index-D-sENcA8.js +0 -158
  81. package/dist/vendor-X3mXJl51.js +0 -1931
@@ -0,0 +1,737 @@
1
+ import { useWindowSize as ie, breakpointsTailwind as se, useBreakpoints as ce, createSharedComposable as ae, useColorMode as Q, useResizeObserver as te, isDefined as le, unrefElement as Z, useVirtualList as ue, useArrayMap as fe, watchOnce as he, watchDebounced as de, refDebounced as pe, useEventListener as X, useMutationObserver as me } from "@vueuse/core";
2
+ import { c as J, a as ge } from "../vendor-Hqbg5uCG.js";
3
+ import { a as H, c as ye } from "../utils/index-DJ-ueLCs.js";
4
+ import { computed as E, inject as Y, ref as L, watch as R, onMounted as ne, watchEffect as ve, nextTick as z, onUnmounted as be } from "vue";
5
+ import { get as e, set as p } from "@vueuse/shared";
6
+ import { LuChevronsUpDown as we, LuArrowUp as Se, LuArrowDown as Ae, LuArrowLeft as Ce, LuArrowRight as xe, LuChevronUp as Ie, LuChevronDown as Oe, LuChevronLeft as Le, LuChevronRight as Te, LuChevronsLeft as Ve, LuChevronsRight as Ee, LuCircleAlert as ke, LuCheck as Pe, LuCircleX as De, LuCircleCheck as je, LuCheckboxBlank as Me, LuCheckboxFill as Fe, LuCheckboxIndeterminateFill as Re, LuCheckboxBlankCircle as $e, LuCheckboxBlankCircleFill as Be, LuRadioButtonFill as _e, LuClock as He } from "../icons/icons_1.es.js";
7
+ import { LuEllipsis as ze, LuInfo as qe, LuEye as Ue, LuEyeOff as We } from "../icons/icons_2.es.js";
8
+ import { LuTriangleAlert as Ne, LuX as Ke } from "../icons/icons_4.es.js";
9
+ import { d as oe, T as D } from "../types/index-CN6Ip1GL.js";
10
+ function ut() {
11
+ const { width: r } = ie(), t = {
12
+ xs: 0,
13
+ ...se
14
+ }, i = ce(t), a = Object.keys, h = a(t), C = h.map(
15
+ (c, n) => {
16
+ if (n < h.length - 1) {
17
+ const u = h[n + 1];
18
+ return H(u), [c, i.between(c, u)];
19
+ }
20
+ return [c, i[c]];
21
+ }
22
+ ), b = C.map(([c, n]) => [
23
+ J(`is_${c}`),
24
+ n
25
+ ]), m = h.map((c) => [
26
+ J(`is_${c}_and_up`),
27
+ i.greaterOrEqual(c)
28
+ ]), x = h.map((c) => [
29
+ J(`is_${c}_and_down`),
30
+ i.smaller(c)
31
+ ]), l = E(() => C.find((c) => e(c[1]))?.[0] || "");
32
+ return {
33
+ ...Object.fromEntries(b),
34
+ ...Object.fromEntries(m),
35
+ ...Object.fromEntries(x),
36
+ name: l,
37
+ width: r
38
+ };
39
+ }
40
+ const Xe = [
41
+ we,
42
+ ze,
43
+ Ne,
44
+ Ke,
45
+ qe,
46
+ Se,
47
+ Ae,
48
+ Ce,
49
+ xe,
50
+ Ie,
51
+ Oe,
52
+ Le,
53
+ Te,
54
+ Ve,
55
+ Ee,
56
+ ke,
57
+ Ue,
58
+ We,
59
+ Pe,
60
+ De,
61
+ je,
62
+ Me,
63
+ Fe,
64
+ Re,
65
+ $e,
66
+ Be,
67
+ _e,
68
+ He
69
+ ], Je = Symbol.for("rui:icons");
70
+ function ft(r) {
71
+ const t = r?.registeredIcons || [];
72
+ return {
73
+ registeredIcons: {
74
+ ...Object.fromEntries(
75
+ [
76
+ ...Xe,
77
+ ...t
78
+ ].map(({ components: i, name: a }) => [a, i])
79
+ )
80
+ }
81
+ };
82
+ }
83
+ function ht() {
84
+ const r = Y(Je);
85
+ return H(r, "Could not find icons injection"), r;
86
+ }
87
+ const W = L({ ...oe }), dt = ae(() => {
88
+ const { state: r, store: t } = Q(), { state: i } = Q({
89
+ attribute: "data-theme"
90
+ });
91
+ R(r, (n) => {
92
+ p(i, n);
93
+ });
94
+ const a = E(() => e(t) === D.auto), h = E(() => e(r) === D.light), C = E(() => e(r) === D.dark), b = E(() => e(h) ? e(W).light : e(W).dark), m = (n) => {
95
+ p(t, n || D.auto);
96
+ }, x = () => {
97
+ e(a) ? m(D.light) : e(h) ? m(D.dark) : e(C) && m(D.auto);
98
+ }, l = (n) => {
99
+ p(W, n);
100
+ };
101
+ return {
102
+ config: W,
103
+ init: (n) => {
104
+ m(n.mode ?? D.auto), l(n.config ?? { ...oe }), typeof window < "u" && R([h, b], ([u, y]) => {
105
+ const o = /* @__PURE__ */ new Map();
106
+ Object.entries(y).forEach(([g, s]) => {
107
+ o.set(`--rui-${g}-darker`, s.darker), o.set(`--rui-${g}-lighter`, s.lighter), o.set(`--rui-${g}-main`, s.DEFAULT);
108
+ });
109
+ const f = u ? D.light : D.dark;
110
+ o.set("--rui-text-disabled", `var(--rui-${f}-text-disabled)`), o.set("--rui-text-primary", `var(--rui-${f}-text-primary)`), o.set("--rui-text-secondary", `var(--rui-${f}-text-secondary)`);
111
+ const v = document.documentElement.style;
112
+ o.forEach((g, s) => {
113
+ v.setProperty(s, g);
114
+ });
115
+ }, { immediate: !0 });
116
+ },
117
+ isAutoControlled: a,
118
+ isDark: C,
119
+ isLight: h,
120
+ setThemeConfig: l,
121
+ state: r,
122
+ store: t,
123
+ switchThemeScheme: m,
124
+ theme: b,
125
+ toggleThemeMode: x
126
+ };
127
+ });
128
+ function ee() {
129
+ const r = L(), t = () => {
130
+ e(r) && (clearTimeout(e(r)), p(r, void 0));
131
+ };
132
+ return { clear: t, create: (h, C) => {
133
+ t(), p(r, setTimeout(h, C));
134
+ }, isActive: () => !!e(r) };
135
+ }
136
+ const j = {
137
+ adaptive: !0,
138
+ gpuAcceleration: !0,
139
+ locked: !1,
140
+ offsetDistance: 8,
141
+ offsetSkid: 0,
142
+ overflowPadding: 8,
143
+ placement: "bottom",
144
+ resize: !0,
145
+ scroll: !0,
146
+ strategy: "absolute"
147
+ };
148
+ function pt(r, t = L(!1), i = L(0), a = L(0), h) {
149
+ const C = L(void 0), b = L(void 0), m = L(void 0), x = L(!1), l = L(!1), c = L(!1), n = ee(), u = ee(), y = () => {
150
+ p(l, !1);
151
+ }, o = async () => {
152
+ await e(m)?.update();
153
+ }, f = (O = !1) => {
154
+ e(t) || (u.clear(), p(c, !1), n.isActive() || (p(l, !0), n.create(() => {
155
+ p(x, !0);
156
+ }, O ? 0 : e(i))));
157
+ }, v = (O = !1) => {
158
+ e(t) || (n.clear(), u.isActive() || u.create(() => {
159
+ e(x) || y(), p(x, !1);
160
+ }, O ? 0 : e(a)));
161
+ }, g = () => {
162
+ p(c, !0);
163
+ }, s = E(() => {
164
+ const {
165
+ adaptive: O = j.adaptive,
166
+ gpuAcceleration: w = j.gpuAcceleration,
167
+ locked: M = j.locked,
168
+ offsetDistance: V = j.offsetDistance,
169
+ offsetSkid: B = j.offsetSkid,
170
+ overflowPadding: q = j.overflowPadding,
171
+ resize: U = j.resize,
172
+ scroll: _ = j.scroll
173
+ } = e(r);
174
+ return [{
175
+ enabled: !1,
176
+ name: "hide"
177
+ }, {
178
+ enabled: !M,
179
+ name: "flip"
180
+ }, {
181
+ name: "preventOverflow",
182
+ options: {
183
+ padding: q
184
+ }
185
+ }, {
186
+ name: "offset",
187
+ options: {
188
+ offset: [B, V]
189
+ }
190
+ }, {
191
+ name: "computeStyles",
192
+ options: {
193
+ adaptive: O,
194
+ gpuAcceleration: w
195
+ }
196
+ }, {
197
+ name: "eventListeners",
198
+ options: {
199
+ resize: U,
200
+ scroll: _
201
+ }
202
+ }, {
203
+ name: "arrow",
204
+ options: {
205
+ padding: 4
206
+ }
207
+ }];
208
+ }), A = E(() => {
209
+ const {
210
+ placement: O = j.placement,
211
+ strategy: w = j.strategy
212
+ } = e(r);
213
+ return {
214
+ modifiers: e(s),
215
+ placement: O,
216
+ strategy: w
217
+ };
218
+ });
219
+ function I() {
220
+ if (!e(b) || !e(C) && !e(h))
221
+ return null;
222
+ const O = Z(b), w = e(h) || Z(C);
223
+ return !(O instanceof HTMLElement) || !w ? null : { popperEl: O, referenceEl: w };
224
+ }
225
+ function T(O) {
226
+ const w = I();
227
+ if (!w)
228
+ return;
229
+ const { popperEl: M, referenceEl: V } = w, B = ge(V, M, e(A));
230
+ p(m, B), O(B.destroy);
231
+ }
232
+ return te([C, b], async () => {
233
+ le(m) && await e(m).update();
234
+ }), ne(() => {
235
+ ve((O) => {
236
+ T(O);
237
+ });
238
+ }), {
239
+ instance: m,
240
+ leavePending: c,
241
+ onClose: v,
242
+ onLeavePending: g,
243
+ onOpen: f,
244
+ onPopperLeave: y,
245
+ open: x,
246
+ popper: b,
247
+ popperEnter: l,
248
+ reference: C,
249
+ updatePopper: o
250
+ };
251
+ }
252
+ function Ye({
253
+ keyAttr: r,
254
+ textAttr: t
255
+ }) {
256
+ function i(h) {
257
+ return t ? typeof t == "function" ? t(h) : h[t]?.toString() : h?.toString();
258
+ }
259
+ function a(h) {
260
+ return r ? h[r] : h;
261
+ }
262
+ return {
263
+ getIdentifier: a,
264
+ getText: i
265
+ };
266
+ }
267
+ function mt({
268
+ appendWidth: r,
269
+ autoFocus: t,
270
+ autoSelectFirst: i,
271
+ dense: a,
272
+ disabled: h = L(!1),
273
+ hideSelected: C,
274
+ itemHeight: b = 48,
275
+ keyAttr: m,
276
+ menuRef: x,
277
+ options: l,
278
+ overscan: c = 5,
279
+ prependWidth: n,
280
+ setValue: u,
281
+ textAttr: y,
282
+ value: o
283
+ }) {
284
+ const f = E(() => {
285
+ const d = e(l);
286
+ return C ? d.filter((S) => !_(S)) : d;
287
+ }), { getIdentifier: v, getText: g } = Ye({
288
+ keyAttr: m,
289
+ textAttr: y
290
+ }), { containerProps: s, list: A, scrollTo: I, wrapperProps: T } = ue(
291
+ f,
292
+ {
293
+ itemHeight: b,
294
+ overscan: c
295
+ }
296
+ ), O = fe(A, ({ data: d, index: S }) => ({ _index: S, item: d })), w = L(!1), M = E(() => {
297
+ const d = e(o);
298
+ return !m || !d ? d : Array.isArray(d) ? d.map((S) => S[m]) : d[m];
299
+ }), V = L(e(i) ? 0 : -1), B = E(() => {
300
+ const d = { max: 0, min: 0 }, S = 30, P = 1.5, k = e(a) ? 12 : 13;
301
+ e(f).forEach((K) => {
302
+ const F = g(K)?.toString()?.length ?? 0;
303
+ d.min === 0 && d.max === 0 ? (d.min = F, d.max = F) : F < d.min ? d.min = F : F > d.max && (d.max = F);
304
+ });
305
+ const $ = d.max - d.min;
306
+ function G(K) {
307
+ const F = (n ? n + 0.5 : 0) + (r ? r + 0.5 : 0);
308
+ return `${Math.min(K * k / 16 + P + F, S)}rem`;
309
+ }
310
+ return $ <= 5 ? G(d.max) : G(d.min + $ / 2);
311
+ });
312
+ function q(d = !1) {
313
+ p(w, d);
314
+ }
315
+ function U(d) {
316
+ const S = e(o), P = Array.isArray(S) ? S : S ? [S] : [];
317
+ return P.length === 0 ? -1 : P.findIndex((k) => m ? k[m] === d[m] : k === d);
318
+ }
319
+ function _(d) {
320
+ return U(d) !== -1;
321
+ }
322
+ async function N(d = !1) {
323
+ const S = e(V);
324
+ S > -1 && await z(() => {
325
+ if (e(x)?.parentElement) {
326
+ const k = e(x).getElementsByClassName("highlighted")[0];
327
+ if (k)
328
+ k.scrollIntoView?.({ behavior: d ? "smooth" : "auto", block: "nearest" }), e(t) && "focus" in k && typeof k.focus == "function" && k?.focus();
329
+ else if (I(S), e(t)) {
330
+ const $ = e(x).getElementsByClassName("highlighted")[0];
331
+ $ && "focus" in $ && typeof $.focus == "function" && $.focus();
332
+ }
333
+ }
334
+ });
335
+ }
336
+ async function re(d) {
337
+ await z(() => {
338
+ if (d) {
339
+ const S = e(o);
340
+ if (Array.isArray(S) && S.length > 0 || S) {
341
+ const P = e(f).findIndex(_);
342
+ P > -1 && p(V, P);
343
+ }
344
+ he(A, async () => {
345
+ await N();
346
+ });
347
+ }
348
+ });
349
+ }
350
+ return R([w, h], async ([d, S]) => {
351
+ await re(d);
352
+ }), R(V, async (d, S) => {
353
+ d !== S && await N(!0);
354
+ }), R(f, async () => {
355
+ e(V) !== -1 ? e(i) ? (p(V, 0), await N()) : (p(V, -1), I(0)) : I(0);
356
+ }), {
357
+ applyHighlighted: () => {
358
+ if (!u || !e(w))
359
+ return;
360
+ const d = e(V);
361
+ if (d === -1)
362
+ return;
363
+ const S = e(f).find((P, k) => d === k);
364
+ S && u(S);
365
+ },
366
+ containerProps: s,
367
+ getIdentifier: v,
368
+ getText: g,
369
+ highlightedIndex: V,
370
+ isActiveItem: _,
371
+ isOpen: w,
372
+ itemIndexInValue: U,
373
+ menuWidth: B,
374
+ moveHighlight: (d) => {
375
+ if (!e(w)) {
376
+ q(!0);
377
+ return;
378
+ }
379
+ let S = e(V);
380
+ S += d ? -1 : 1;
381
+ const k = e(f).length;
382
+ S >= k ? p(V, 0) : S < 0 ? p(V, k - 1) : p(V, S);
383
+ },
384
+ optionsWithSelectedHidden: f,
385
+ renderedData: O,
386
+ toggle: q,
387
+ valueKey: M,
388
+ wrapperProps: T
389
+ };
390
+ }
391
+ function gt(r, t) {
392
+ const i = E(
393
+ () => e(t.activatorFocusedWithin) || e(t.menuWrapperFocusedWithin)
394
+ ), a = E(() => {
395
+ const m = e(i), x = e(r.disabled), l = e(r.shouldApplyValueAsSearch), c = e(t.internalSearch);
396
+ return (!m || x) && !l ? "w-0 h-0" : c ? "flex-1 min-w-[4rem]" : "flex-1 min-w-0";
397
+ });
398
+ async function h() {
399
+ await z(() => {
400
+ p(t.searchInputFocused, !0);
401
+ });
402
+ }
403
+ async function C() {
404
+ await z(() => {
405
+ e(t.activatorFocused) || p(t.searchInputFocused, !0);
406
+ });
407
+ }
408
+ function b() {
409
+ p(t.focusedValueIndex, -1), e(r.shouldApplyValueAsSearch) && e(t.textInput)?.select(), e(t.isOpen) || p(t.justOpened, !0);
410
+ }
411
+ return de(i, (m) => {
412
+ if (!m) {
413
+ p(t.isOpen, !1);
414
+ const x = e(r.customValue), l = e(t.filteredOptions), c = e(t.internalSearch);
415
+ x && l.length === 0 && c && t.setSearchAsValue(), e(r.shouldApplyValueAsSearch) || t.updateInternalSearch();
416
+ }
417
+ }, {
418
+ debounce: 200,
419
+ maxWait: 400
420
+ }), {
421
+ anyFocused: i,
422
+ inputClass: a,
423
+ onActivatorFocused: C,
424
+ onInputFocused: b,
425
+ setInputFocus: h
426
+ };
427
+ }
428
+ function yt(r, t) {
429
+ const i = L(-1), a = L(/* @__PURE__ */ new Map());
430
+ function h(l) {
431
+ p(i, l);
432
+ }
433
+ function C(l, c) {
434
+ const n = e(r.multiple), u = e(t.internalSearch);
435
+ if (!n || u.length > 0)
436
+ return;
437
+ l.preventDefault();
438
+ const y = e(t.value).length;
439
+ let o = e(i);
440
+ if (o === -1) {
441
+ p(i, c ? 0 : y - 1);
442
+ return;
443
+ }
444
+ o += c ? 1 : -1, o < 0 || o >= y ? (p(i, -1), p(t.searchInputFocused, !0)) : p(i, o);
445
+ }
446
+ function b(l) {
447
+ const c = e(t.filteredOptions), n = e(t.highlightedIndex), u = e(t.isOpen), y = e(r.customValue), o = e(r.multiple), f = e(t.value), v = e(t.internalSearch);
448
+ if (y && v && u) {
449
+ let g = !1;
450
+ if (n > -1 && n < c.length) {
451
+ const s = c[n];
452
+ typeof s == "string" ? g = s === v : s && typeof s == "object" && (g = (s.label || s.value || "") === v);
453
+ }
454
+ if (!g) {
455
+ t.setSearchAsValue(), o || p(t.isOpen, !1), l.preventDefault();
456
+ return;
457
+ }
458
+ }
459
+ if (c.length > 0 && n > -1 && u)
460
+ t.applyHighlighted(), l.preventDefault();
461
+ else if (c.length === 0 && y && v)
462
+ t.setSearchAsValue(), o || p(t.isOpen, !1), l.preventDefault();
463
+ else if (!u && f.length === 0)
464
+ p(t.isOpen, !0), l.preventDefault();
465
+ else {
466
+ const s = e(t.activator)?.closest("form");
467
+ s && s.dispatchEvent(new Event("submit"));
468
+ }
469
+ }
470
+ function m(l) {
471
+ const c = e(t.isOpen), n = e(t.filteredOptions), u = e(t.highlightedIndex), y = e(r.multiple);
472
+ c && n.length > 0 && u > -1 && !y && (t.applyHighlighted(), l.preventDefault());
473
+ }
474
+ function x() {
475
+ const l = e(t.internalSearch), n = e(t.value).length, u = e(r.multiple);
476
+ !l && n > 0 && (u ? p(i, n - 1) : t.clear());
477
+ }
478
+ return R(t.value, () => {
479
+ h(-1), e(a).clear();
480
+ }), R(i, async (l) => {
481
+ const c = e(r.multiple);
482
+ l === -1 || !c || await z(() => {
483
+ const n = e(a);
484
+ let u = n.get(l);
485
+ if (!u) {
486
+ const o = e(t.activator)?.querySelector(`[data-index="${l}"]`);
487
+ o && (u = o, n.set(l, o));
488
+ }
489
+ u && "focus" in u && typeof u.focus == "function" && u.focus();
490
+ });
491
+ }), {
492
+ focusedValueIndex: i,
493
+ moveSelectedValueHighlight: C,
494
+ onEnter: b,
495
+ onInputDeletePressed: x,
496
+ onTab: m,
497
+ setValueFocus: h
498
+ };
499
+ }
500
+ function vt(r, t, i) {
501
+ const a = L(""), h = pe(a, 50), C = L(!1), b = /* @__PURE__ */ new Map(), m = (n) => {
502
+ if (b.has(n))
503
+ return b.get(n);
504
+ const u = ye(n);
505
+ return b.set(n, u), u;
506
+ }, x = E(() => {
507
+ const n = e(h), u = e(r);
508
+ if (e(i.noFilter) || !n || e(C))
509
+ return u;
510
+ const o = e(i.keyAttr), f = e(i.textAttr), v = e(i.filter), g = m(n), s = v || ((w) => {
511
+ if (!w)
512
+ return !1;
513
+ const M = [o ? m(w[o]) : w.toString()];
514
+ return f && typeof w == "object" && M.push(m(w[f])), M.some((V) => m(V).includes(g));
515
+ }), A = u.filter((w) => s(w, n)), I = e(i.customValue), T = e(i.hideCustomValue);
516
+ return !I || T || !n || A.some((w) => w ? (f ? w[f] : w.toString()) === n : !1) ? A : [l(n, {
517
+ keyAttr: o,
518
+ returnObject: e(i.returnObject),
519
+ textAttr: f
520
+ }), ...A];
521
+ });
522
+ function l(n, u) {
523
+ const { keyAttr: y, returnObject: o, textAttr: f } = u;
524
+ return !y || o ? n : {
525
+ [y]: n,
526
+ ...f ? { [f]: n } : {}
527
+ };
528
+ }
529
+ function c(n = "") {
530
+ p(t, n), p(a, n);
531
+ }
532
+ return R(t, (n) => {
533
+ p(a, n);
534
+ }, { immediate: !0 }), be(() => {
535
+ b.clear();
536
+ }), {
537
+ debouncedInternalSearch: h,
538
+ filteredOptions: x,
539
+ internalSearch: a,
540
+ justOpened: C,
541
+ textValueToProperValue: (n, u = !1) => l(n, {
542
+ keyAttr: e(i.keyAttr),
543
+ returnObject: u || e(i.returnObject),
544
+ textAttr: e(i.textAttr)
545
+ }),
546
+ updateInternalSearch: c
547
+ };
548
+ }
549
+ function bt(r, t, i, a) {
550
+ const h = E(() => Array.isArray(e(r))), C = E(() => {
551
+ const o = /* @__PURE__ */ new Map(), f = e(t);
552
+ for (const v of f)
553
+ o.set(a.getIdentifier(v), v);
554
+ return o;
555
+ });
556
+ function b(o) {
557
+ return o ? Array.isArray(o) ? o : [o] : [];
558
+ }
559
+ function m(o, f, v, g) {
560
+ const s = [];
561
+ s.length = o.length;
562
+ let A = 0;
563
+ for (const I of o) {
564
+ const T = a.getIdentifier(I), O = f.get(T);
565
+ O ? s[A++] = O : v && (s[A++] = a.textValueToProperValue(I, g));
566
+ }
567
+ return s.length = A, s;
568
+ }
569
+ function x(o, f, v, g) {
570
+ const s = [];
571
+ s.length = o.length;
572
+ let A = 0;
573
+ for (const I of o) {
574
+ const T = f.get(I);
575
+ T ? s[A++] = T : v && (s[A++] = a.textValueToProperValue(I, g));
576
+ }
577
+ return s.length = A, s;
578
+ }
579
+ function l(o, f, v, g, s) {
580
+ const A = Array.isArray(o), I = b(o), T = m(I, f, g, v);
581
+ if (A || T.length === 0)
582
+ return s && a.updateInternalSearch(), T;
583
+ const O = T[0];
584
+ return H(O), s && a.updateInternalSearch(a.getText(O)), [O];
585
+ }
586
+ function c(o, f, v, g, s) {
587
+ const A = b(o), I = x(A, f, g, v);
588
+ if (s)
589
+ if (I.length > 0) {
590
+ const T = I[0];
591
+ H(T), a.updateInternalSearch(a.getText(T));
592
+ } else
593
+ a.updateInternalSearch();
594
+ return I;
595
+ }
596
+ function n(o) {
597
+ p(r, o);
598
+ }
599
+ function u(o) {
600
+ const f = e(i.keyAttr), v = e(i.returnObject), g = f && !v ? o.map((s) => s[f]) : o;
601
+ return e(h) ? n(g) : g.length === 0 ? n(void 0) : n(g[0]);
602
+ }
603
+ const y = E({
604
+ get: () => {
605
+ const o = e(r), f = e(i.keyAttr), v = e(i.returnObject) ?? !1, g = e(i.customValue) ?? !1, s = e(C), A = e(a.shouldApplyValueAsSearch) && !e(a.isOpen);
606
+ return f && v ? l(
607
+ o,
608
+ s,
609
+ v,
610
+ g,
611
+ A
612
+ ) : c(
613
+ o,
614
+ s,
615
+ v,
616
+ g,
617
+ A
618
+ );
619
+ },
620
+ set: (o) => {
621
+ u(o);
622
+ }
623
+ });
624
+ return {
625
+ setSelected: u,
626
+ value: y
627
+ };
628
+ }
629
+ const Ge = Symbol("rui:i18n");
630
+ function wt() {
631
+ const r = Y(Ge, void 0), t = (a, h) => {
632
+ if (r?.te(a))
633
+ return r?.t(a, h);
634
+ };
635
+ return { t: (a, h, C) => typeof h == "string" ? t(a) ?? h ?? a : t(a, h) ?? C ?? a };
636
+ }
637
+ const Qe = Symbol.for("rui:table");
638
+ function St(r) {
639
+ return {
640
+ globalItemsPerPage: !1,
641
+ itemsPerPage: L(10),
642
+ limits: [10, 25, 50, 100],
643
+ stickyOffset: L(0),
644
+ ...r
645
+ };
646
+ }
647
+ function At() {
648
+ const r = Y(Qe);
649
+ if (!r)
650
+ throw new Error("Could not find rui table options injection");
651
+ return r;
652
+ }
653
+ function Ct(r = L(!1), t) {
654
+ const i = L(null), a = L(null), h = L(!1), C = -0.5, b = {
655
+ head: ":scope > thead[data-id=head-main]",
656
+ headClone: ":scope > thead[data-id=head-clone]",
657
+ row: ":scope > tbody > tr:not([hidden])",
658
+ th: ":scope > th"
659
+ }, m = () => {
660
+ const l = e(i);
661
+ if (!e(r) || !l)
662
+ return;
663
+ const c = l.querySelector(
664
+ `${b.headClone} > tr`
665
+ ), n = l.querySelector(`${b.head} > tr`) ?? null, u = () => {
666
+ const y = n?.querySelectorAll(
667
+ b.th
668
+ );
669
+ c?.querySelectorAll(b.th)?.forEach((f, v) => {
670
+ te(f, (g) => {
671
+ const s = g[0];
672
+ H(s);
673
+ const A = s.target.getBoundingClientRect(), I = y?.item(v);
674
+ I && (I.style.width = `${A.width}px`);
675
+ });
676
+ });
677
+ };
678
+ me(c, (y) => {
679
+ for (const o of y)
680
+ (o.type === "childList" || o.type === "attributes") && u();
681
+ }, {
682
+ attributes: !0,
683
+ childList: !0,
684
+ subtree: !0
685
+ }), u();
686
+ }, x = () => {
687
+ const l = e(i);
688
+ if (!e(r) || !l)
689
+ return;
690
+ const c = l.getBoundingClientRect(), n = l.querySelector(
691
+ b.headClone
692
+ ), u = n?.getBoundingClientRect(), y = l.querySelector(b.head) ?? null, o = y?.getBoundingClientRect();
693
+ if (!c || !u || !y || !n || !o)
694
+ return;
695
+ const {
696
+ height: f,
697
+ left: v,
698
+ width: g
699
+ } = u, { bottom: s, top: A } = c, I = e(t) ?? 0;
700
+ y.style.width = `${g}px`;
701
+ const T = l.querySelectorAll(b.row), O = T.item(T.length - 1)?.getBoundingClientRect();
702
+ if (A <= I && s > I && T.length > 1) {
703
+ p(h, !0), y.style.left = `${v + C}px`;
704
+ const w = O?.height ?? 0;
705
+ s <= w + f + I ? y.style.top = `${s - w - f}px` : y.style.top = `${I}px`;
706
+ } else
707
+ p(h, !1), y.style.left = `${C}px`, y.style.top = "0";
708
+ };
709
+ return ne(() => {
710
+ x(), X(a, "scroll", x), X(document.body, "scroll", x), X(window, "resize", x), m();
711
+ }), {
712
+ stick: h,
713
+ table: i,
714
+ tableScroller: a
715
+ };
716
+ }
717
+ export {
718
+ Je as I,
719
+ Ge as R,
720
+ Qe as T,
721
+ pt as a,
722
+ dt as b,
723
+ Ye as c,
724
+ vt as d,
725
+ bt as e,
726
+ mt as f,
727
+ yt as g,
728
+ gt as h,
729
+ wt as i,
730
+ At as j,
731
+ Ct as k,
732
+ St as l,
733
+ ft as m,
734
+ ut as n,
735
+ ht as u
736
+ };
737
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtQ0M3QTdDRWguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9icmVha3BvaW50LnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL2ljb25zLnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL3RoZW1lLnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL3RpbWVvdXQtbWFuYWdlci50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9wb3BwZXIudHMiLCIuLi8uLi9zcmMvY29tcG9zYWJsZXMvZHJvcGRvd24tbWVudS50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9mb3Jtcy9hdXRvLWNvbXBsZXRlL2ZvY3VzLnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL2Zvcm1zL2F1dG8tY29tcGxldGUva2V5Ym9hcmQtbmF2aWdhdGlvbi50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9mb3Jtcy9hdXRvLWNvbXBsZXRlL3NlYXJjaC50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9mb3Jtcy9hdXRvLWNvbXBsZXRlL3ZhbHVlLnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL3VzZS1ydWktaTE4bi50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9kZWZhdWx0cy90YWJsZS50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9zdGlja3ktaGVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGJyZWFrcG9pbnRzVGFpbHdpbmQgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuaW1wb3J0IHsgY2FtZWxDYXNlIH0gZnJvbSAnc2N1bGUnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnQC91dGlscy9hc3NlcnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlQnJlYWtwb2ludCgpIHtcbiAgY29uc3QgeyB3aWR0aCB9ID0gdXNlV2luZG93U2l6ZSgpO1xuXG4gIGNvbnN0IGJyZWFrcG9pbnRMaXN0ID0ge1xuICAgIHhzOiAwLFxuICAgIC4uLmJyZWFrcG9pbnRzVGFpbHdpbmQsXG4gIH0gYXMgY29uc3Q7XG5cbiAgdHlwZSBCcmVha3BvaW50ID0ga2V5b2YgdHlwZW9mIGJyZWFrcG9pbnRMaXN0O1xuXG4gIGNvbnN0IGJyZWFrcG9pbnRzID0gdXNlQnJlYWtwb2ludHMoYnJlYWtwb2ludExpc3QpO1xuXG4gIGNvbnN0IGdldEtleXMgPSBPYmplY3Qua2V5cyBhcyA8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKSA9PiBBcnJheTxrZXlvZiBUPjtcblxuICBjb25zdCBsaXN0ID0gZ2V0S2V5cyhicmVha3BvaW50TGlzdCk7XG5cbiAgY29uc3QgcmF3U2l6ZXM6IFtCcmVha3BvaW50LCBSZWY8Ym9vbGVhbj5dW10gPSBsaXN0Lm1hcChcbiAgICAoYnJlYWtwb2ludCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA8IGxpc3QubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zdCBuZXh0QnJlYWtwb2ludCA9IGxpc3RbaW5kZXggKyAxXTtcbiAgICAgICAgYXNzZXJ0KG5leHRCcmVha3BvaW50KTtcbiAgICAgICAgcmV0dXJuIFticmVha3BvaW50LCBicmVha3BvaW50cy5iZXR3ZWVuKGJyZWFrcG9pbnQsIG5leHRCcmVha3BvaW50KV07XG4gICAgICB9XG4gICAgICByZXR1cm4gW2JyZWFrcG9pbnQsIGJyZWFrcG9pbnRzW2JyZWFrcG9pbnRdXTtcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IHNpemVzID0gcmF3U2l6ZXMubWFwKChbYnJlYWtwb2ludCwgdmFsdWVdKSA9PiBbXG4gICAgY2FtZWxDYXNlKGBpc18ke2JyZWFrcG9pbnR9YCksXG4gICAgdmFsdWUsXG4gIF0pO1xuXG4gIGNvbnN0IHNpemVzVXAgPSBsaXN0Lm1hcChicmVha3BvaW50ID0+IFtcbiAgICBjYW1lbENhc2UoYGlzXyR7YnJlYWtwb2ludH1fYW5kX3VwYCksXG4gICAgYnJlYWtwb2ludHMuZ3JlYXRlck9yRXF1YWwoYnJlYWtwb2ludCksXG4gIF0pO1xuXG4gIGNvbnN0IHNpemVzRG93biA9IGxpc3QubWFwKGJyZWFrcG9pbnQgPT4gW1xuICAgIGNhbWVsQ2FzZShgaXNfJHticmVha3BvaW50fV9hbmRfZG93bmApLFxuICAgIGJyZWFrcG9pbnRzLnNtYWxsZXIoYnJlYWtwb2ludCksXG4gIF0pO1xuXG4gIGNvbnN0IG5hbWUgPSBjb21wdXRlZCgoKSA9PiByYXdTaXplcy5maW5kKGl0ZW0gPT4gZ2V0KGl0ZW1bMV0pKT8uWzBdIHx8ICcnKTtcblxuICByZXR1cm4ge1xuICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhzaXplcyksXG4gICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHNpemVzVXApLFxuICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhzaXplc0Rvd24pLFxuICAgIG5hbWUsXG4gICAgd2lkdGgsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IEluamVjdGlvbktleSB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7IEdlbmVyYXRlZEljb24gfSBmcm9tICdAL3R5cGVzL2ljb25zJztcbmltcG9ydCB7XG4gIEx1QXJyb3dEb3duLFxuICBMdUFycm93TGVmdCxcbiAgTHVBcnJvd1JpZ2h0LFxuICBMdUFycm93VXAsXG4gIEx1Q2hlY2ssXG4gIEx1Q2hlY2tib3hCbGFuayxcbiAgTHVDaGVja2JveEJsYW5rQ2lyY2xlLFxuICBMdUNoZWNrYm94QmxhbmtDaXJjbGVGaWxsLFxuICBMdUNoZWNrYm94RmlsbCxcbiAgTHVDaGVja2JveEluZGV0ZXJtaW5hdGVGaWxsLFxuICBMdUNoZXZyb25Eb3duLFxuICBMdUNoZXZyb25MZWZ0LFxuICBMdUNoZXZyb25SaWdodCxcbiAgTHVDaGV2cm9uc0xlZnQsXG4gIEx1Q2hldnJvbnNSaWdodCxcbiAgTHVDaGV2cm9uc1VwRG93bixcbiAgTHVDaGV2cm9uVXAsXG4gIEx1Q2lyY2xlQWxlcnQsXG4gIEx1Q2lyY2xlQ2hlY2ssXG4gIEx1Q2lyY2xlWCxcbiAgTHVDbG9jayxcbiAgTHVFbGxpcHNpcyxcbiAgTHVFeWUsXG4gIEx1RXllT2ZmLFxuICBMdUluZm8sXG4gIEx1UmFkaW9CdXR0b25GaWxsLFxuICBMdVRyaWFuZ2xlQWxlcnQsXG4gIEx1WCxcbn0gZnJvbSAnQC9pY29ucyc7XG5cbmNvbnN0IHJlcXVpcmVkSWNvbnM6IEdlbmVyYXRlZEljb25bXSA9IFtcbiAgTHVDaGV2cm9uc1VwRG93bixcbiAgTHVFbGxpcHNpcyxcbiAgTHVUcmlhbmdsZUFsZXJ0LFxuICBMdVgsXG4gIEx1SW5mbyxcbiAgTHVBcnJvd1VwLFxuICBMdUFycm93RG93bixcbiAgTHVBcnJvd0xlZnQsXG4gIEx1QXJyb3dSaWdodCxcbiAgTHVDaGV2cm9uVXAsXG4gIEx1Q2hldnJvbkRvd24sXG4gIEx1Q2hldnJvbkxlZnQsXG4gIEx1Q2hldnJvblJpZ2h0LFxuICBMdUNoZXZyb25zTGVmdCxcbiAgTHVDaGV2cm9uc1JpZ2h0LFxuICBMdUNpcmNsZUFsZXJ0LFxuICBMdUV5ZSxcbiAgTHVFeWVPZmYsXG4gIEx1Q2hlY2ssXG4gIEx1Q2lyY2xlWCxcbiAgTHVDaXJjbGVDaGVjayxcbiAgTHVDaGVja2JveEJsYW5rLFxuICBMdUNoZWNrYm94RmlsbCxcbiAgTHVDaGVja2JveEluZGV0ZXJtaW5hdGVGaWxsLFxuICBMdUNoZWNrYm94QmxhbmtDaXJjbGUsXG4gIEx1Q2hlY2tib3hCbGFua0NpcmNsZUZpbGwsXG4gIEx1UmFkaW9CdXR0b25GaWxsLFxuICBMdUNsb2NrLFxuXTtcblxuZXhwb3J0IGludGVyZmFjZSBJY29uc09wdGlvbnMge1xuICByZWdpc3RlcmVkSWNvbnM6IEdlbmVyYXRlZEljb25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VJY29uc1JldHVybiB7XG4gIHJlZ2lzdGVyZWRJY29uczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgW3N0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPl1bXT4+O1xufVxuXG5leHBvcnQgY29uc3QgSWNvbnNTeW1ib2w6IEluamVjdGlvbktleTxVc2VJY29uc1JldHVybj4gPSBTeW1ib2wuZm9yKCdydWk6aWNvbnMnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUljb25EZWZhdWx0cyhvcHRpb25zPzogUGFydGlhbDxJY29uc09wdGlvbnM+KTogVXNlSWNvbnNSZXR1cm4ge1xuICBjb25zdCBpY29uc1RvQWRkID0gb3B0aW9ucz8ucmVnaXN0ZXJlZEljb25zIHx8IFtdO1xuICByZXR1cm4ge1xuICAgIHJlZ2lzdGVyZWRJY29uczoge1xuICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBbXG4gICAgICAgICAgLi4ucmVxdWlyZWRJY29ucyxcbiAgICAgICAgICAuLi5pY29uc1RvQWRkLFxuICAgICAgICBdLm1hcCgoeyBjb21wb25lbnRzLCBuYW1lIH0pID0+IFtuYW1lLCBjb21wb25lbnRzXSksXG4gICAgICApLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VJY29ucygpOiBVc2VJY29uc1JldHVybiB7XG4gIGNvbnN0IGljb25zID0gaW5qZWN0KEljb25zU3ltYm9sKTtcbiAgYXNzZXJ0KGljb25zLCAnQ291bGQgbm90IGZpbmQgaWNvbnMgaW5qZWN0aW9uJyk7XG4gIHJldHVybiBpY29ucztcbn1cbiIsImltcG9ydCB7IHVzZUNvbG9yTW9kZSB9IGZyb20gJ0B2dWV1c2UvY29yZSc7XG5pbXBvcnQgeyBjb21wdXRlZCwgdHlwZSBDb21wdXRlZFJlZiwgdHlwZSBSZWYsIHJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQge1xuICB0eXBlIENvbG9ySW50ZW5zaXR5LFxuICBkZWZhdWx0VGhlbWUsXG4gIHR5cGUgSW5pdFRoZW1lT3B0aW9ucyxcbiAgdHlwZSBUaGVtZUNvbmZpZyxcbiAgdHlwZSBUaGVtZUNvbnRlbnQsXG4gIHR5cGUgVGhlbWVEYXRhLFxuICBUaGVtZU1vZGUsXG59IGZyb20gJ0AvdHlwZXMvdGhlbWUnO1xuXG5jb25zdCBjb25maWc6IFJlZjxUaGVtZUNvbmZpZz4gPSByZWYoeyAuLi5kZWZhdWx0VGhlbWUgfSk7XG5cbi8qKlxuICogVGhlbWUgbWFuYWdlclxuICogQHJldHVybnMge1RoZW1lQ29udGVudH1cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVJvdGtpVGhlbWUgPSBjcmVhdGVTaGFyZWRDb21wb3NhYmxlPCgpID0+IFRoZW1lQ29udGVudD4oKCkgPT4ge1xuICBjb25zdCB7IHN0YXRlLCBzdG9yZSB9ID0gdXNlQ29sb3JNb2RlPFRoZW1lTW9kZT4oKTtcblxuICBjb25zdCB7IHN0YXRlOiBhdHRyaWJ1dGVTdGF0ZSB9ID0gdXNlQ29sb3JNb2RlPFRoZW1lTW9kZT4oe1xuICAgIGF0dHJpYnV0ZTogJ2RhdGEtdGhlbWUnLFxuICB9KTtcblxuICAvLyBLZWVwIGF0dHJpYnV0ZVN0YXRlIGluIHN5bmMgd2l0aCBzdGF0ZVxuICB3YXRjaChzdGF0ZSwgKG5ld1N0YXRlKSA9PiB7XG4gICAgc2V0KGF0dHJpYnV0ZVN0YXRlLCBuZXdTdGF0ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiB3aGV0aGVyIHRoZSBjdXJyZW50IHRoZW1lIGlzIGNvbnRyb2xsZWQgYnkgc3lzdGVtIG9yIHVzZXJcbiAgICogQHR5cGUge0NvbXB1dGVkUmVmPGJvb2xlYW4+fVxuICAgKi9cbiAgY29uc3QgaXNBdXRvQ29udHJvbGxlZDogQ29tcHV0ZWRSZWY8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiBnZXQoc3RvcmUpID09PSBUaGVtZU1vZGUuYXV0byk7XG5cbiAgLyoqXG4gICAqIHRydXRoeSBmb3IgbGlnaHQgdGhlbWVcbiAgICogQHR5cGUge0NvbXB1dGVkUmVmPGJvb2xlYW4+fVxuICAgKi9cbiAgY29uc3QgaXNMaWdodDogQ29tcHV0ZWRSZWY8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiBnZXQoc3RhdGUpID09PSBUaGVtZU1vZGUubGlnaHQpO1xuXG4gIC8qKlxuICAgKiB0cnV0aHkgZm9yIGRhcmsgdGhlbWVcbiAgICogQHR5cGUge0NvbXB1dGVkUmVmPGJvb2xlYW4+fVxuICAgKi9cbiAgY29uc3QgaXNEYXJrOiBDb21wdXRlZFJlZjxib29sZWFuPiA9IGNvbXB1dGVkKCgpID0+IGdldChzdGF0ZSkgPT09IFRoZW1lTW9kZS5kYXJrKTtcblxuICAvKipcbiAgICogY3VycmVudCB0aGVtZSBiYXNlZCBvbiBsaWdodCBvciBkYXJrIG1vZGVcbiAgICogQHR5cGUge0NvbXB1dGVkUmVmPFRoZW1lRGF0YT59XG4gICAqL1xuICBjb25zdCB0aGVtZTogQ29tcHV0ZWRSZWY8VGhlbWVEYXRhPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoZ2V0KGlzTGlnaHQpKVxuICAgICAgcmV0dXJuIGdldChjb25maWcpLmxpZ2h0O1xuXG4gICAgcmV0dXJuIGdldChjb25maWcpLmRhcms7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBzd2l0Y2ggdGhlbWUgdGhyb3VnaCBkYXJrL2xpZ2h0L2F1dG8gbW9kZXNcbiAgICogQHBhcmFtIHtUaGVtZU1vZGV9IG1vZGVcbiAgICovXG4gIGNvbnN0IHN3aXRjaFRoZW1lU2NoZW1lID0gKG1vZGU6IFRoZW1lTW9kZSkgPT4ge1xuICAgIHNldChzdG9yZSwgbW9kZSB8fCBUaGVtZU1vZGUuYXV0byk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHRvZ2dsZSBiZXR3ZWVuIGF1dG98bGlnaHR8ZGFya1xuICAgKi9cbiAgY29uc3QgdG9nZ2xlVGhlbWVNb2RlID0gKCkgPT4ge1xuICAgIGlmIChnZXQoaXNBdXRvQ29udHJvbGxlZCkpXG4gICAgICBzd2l0Y2hUaGVtZVNjaGVtZShUaGVtZU1vZGUubGlnaHQpO1xuICAgIGVsc2UgaWYgKGdldChpc0xpZ2h0KSlcbiAgICAgIHN3aXRjaFRoZW1lU2NoZW1lKFRoZW1lTW9kZS5kYXJrKTtcbiAgICBlbHNlIGlmIChnZXQoaXNEYXJrKSlcbiAgICAgIHN3aXRjaFRoZW1lU2NoZW1lKFRoZW1lTW9kZS5hdXRvKTtcbiAgfTtcblxuICAvKipcbiAgICogc2V0cyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRoZW1lXG4gICAqIEBwYXJhbSB7VGhlbWVDb25maWd9IG5ld0NvbmZpZ1xuICAgKi9cbiAgY29uc3Qgc2V0VGhlbWVDb25maWcgPSAobmV3Q29uZmlnOiBUaGVtZUNvbmZpZykgPT4ge1xuICAgIHNldChjb25maWcsIG5ld0NvbmZpZyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHRoZW1lIGluaXRpYWxpemVyLCBtdXN0IGJlIGNhbGxlZCBvbmNlIGZyb20gdGhlIGFwcCdzIGVudHJ5XG4gICAqIEBwYXJhbSB7SW5pdFRoZW1lT3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3QgaW5pdCA9IChvcHRpb25zOiBJbml0VGhlbWVPcHRpb25zKSA9PiB7XG4gICAgc3dpdGNoVGhlbWVTY2hlbWUob3B0aW9ucy5tb2RlID8/IFRoZW1lTW9kZS5hdXRvKTtcbiAgICBzZXRUaGVtZUNvbmZpZyhvcHRpb25zLmNvbmZpZyA/PyB7IC4uLmRlZmF1bHRUaGVtZSB9KTtcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2F0Y2goW2lzTGlnaHQsIHRoZW1lXSwgKFtpc0xpZ2h0LCB0aGVtZV0pID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVWYXJpYWJsZXMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBjb250ZXh0IHZhcmlhYmxlc1xuICAgICAgICBPYmplY3QuZW50cmllcyh0aGVtZSkuZm9yRWFjaCgoW2NvbnRleHQsIGNvbnRleHRPYmplY3RdOiBbc3RyaW5nLCBDb2xvckludGVuc2l0eV0pID0+IHtcbiAgICAgICAgICBzdHlsZVZhcmlhYmxlcy5zZXQoYC0tcnVpLSR7Y29udGV4dH0tZGFya2VyYCwgY29udGV4dE9iamVjdC5kYXJrZXIpO1xuICAgICAgICAgIHN0eWxlVmFyaWFibGVzLnNldChgLS1ydWktJHtjb250ZXh0fS1saWdodGVyYCwgY29udGV4dE9iamVjdC5saWdodGVyKTtcbiAgICAgICAgICBzdHlsZVZhcmlhYmxlcy5zZXQoYC0tcnVpLSR7Y29udGV4dH0tbWFpbmAsIGNvbnRleHRPYmplY3QuREVGQVVMVCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgdGhlbWUgbW9kZVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGlzTGlnaHQgPyBUaGVtZU1vZGUubGlnaHQgOiBUaGVtZU1vZGUuZGFyaztcblxuICAgICAgICAvLyBBZGQgdGV4dCBjb2xvciB2YXJpYWJsZXNcbiAgICAgICAgc3R5bGVWYXJpYWJsZXMuc2V0KCctLXJ1aS10ZXh0LWRpc2FibGVkJywgYHZhcigtLXJ1aS0ke3N0YXRlfS10ZXh0LWRpc2FibGVkKWApO1xuICAgICAgICBzdHlsZVZhcmlhYmxlcy5zZXQoJy0tcnVpLXRleHQtcHJpbWFyeScsIGB2YXIoLS1ydWktJHtzdGF0ZX0tdGV4dC1wcmltYXJ5KWApO1xuICAgICAgICBzdHlsZVZhcmlhYmxlcy5zZXQoJy0tcnVpLXRleHQtc2Vjb25kYXJ5JywgYHZhcigtLXJ1aS0ke3N0YXRlfS10ZXh0LXNlY29uZGFyeSlgKTtcblxuICAgICAgICAvLyBBcHBseSBhbGwgc3R5bGUgdmFyaWFibGVzIGluIG9uZSBvcGVyYXRpb25cbiAgICAgICAgY29uc3Qgcm9vdFN0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuICAgICAgICBzdHlsZVZhcmlhYmxlcy5mb3JFYWNoKCh2YWx1ZSwgdmFyaWFibGVOYW1lKSA9PiB7XG4gICAgICAgICAgcm9vdFN0eWxlLnNldFByb3BlcnR5KHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGNvbmZpZyxcbiAgICBpbml0LFxuICAgIGlzQXV0b0NvbnRyb2xsZWQsXG4gICAgaXNEYXJrLFxuICAgIGlzTGlnaHQsXG4gICAgc2V0VGhlbWVDb25maWcsXG4gICAgc3RhdGUsXG4gICAgc3RvcmUsXG4gICAgc3dpdGNoVGhlbWVTY2hlbWUsXG4gICAgdGhlbWUsXG4gICAgdG9nZ2xlVGhlbWVNb2RlLFxuICB9O1xufSk7XG4iLCJpbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ0B2dWV1c2Uvc2hhcmVkJztcbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lb3V0TWFuYWdlcigpIHtcbiAgY29uc3QgdGltZW91dCA9IHJlZjxOb2RlSlMuVGltZW91dD4oKTtcblxuICBjb25zdCBjbGVhciA9ICgpID0+IHtcbiAgICBpZiAoZ2V0KHRpbWVvdXQpKSB7XG4gICAgICBjbGVhclRpbWVvdXQoZ2V0KHRpbWVvdXQpKTtcbiAgICAgIHNldCh0aW1lb3V0LCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjcmVhdGUgPSAoY2FsbGJhY2s6ICgpID0+IHZvaWQsIGRlbGF5OiBudW1iZXIpID0+IHtcbiAgICBjbGVhcigpO1xuICAgIHNldCh0aW1lb3V0LCBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheSkpO1xuICB9O1xuXG4gIGNvbnN0IGlzQWN0aXZlID0gKCkgPT4gISFnZXQodGltZW91dCk7XG5cbiAgcmV0dXJuIHsgY2xlYXIsIGNyZWF0ZSwgaXNBY3RpdmUgfTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVBvcHBlciwgdHlwZSBJbnN0YW5jZSwgdHlwZSBQbGFjZW1lbnQsIHR5cGUgUG9zaXRpb25pbmdTdHJhdGVneSwgdHlwZSBWaXJ0dWFsRWxlbWVudCB9IGZyb20gJ0Bwb3BwZXJqcy9jb3JlJztcbmltcG9ydCB7IHR5cGUgTWF5YmVFbGVtZW50LCB1bnJlZkVsZW1lbnQgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuaW1wb3J0IHsgb25Nb3VudGVkLCB0eXBlIFJlZiwgcmVmLCB3YXRjaEVmZmVjdCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyB1c2VUaW1lb3V0TWFuYWdlciB9IGZyb20gJy4vdGltZW91dC1tYW5hZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBQb3BwZXJPcHRpb25zIHtcbiAgbG9ja2VkPzogYm9vbGVhbjtcbiAgb3ZlcmZsb3dQYWRkaW5nPzogbnVtYmVyO1xuICBvZmZzZXREaXN0YW5jZT86IG51bWJlcjtcbiAgb2Zmc2V0U2tpZD86IG51bWJlcjtcbiAgcGxhY2VtZW50PzogUGxhY2VtZW50O1xuICBzdHJhdGVneT86IFBvc2l0aW9uaW5nU3RyYXRlZ3k7XG4gIGdwdUFjY2VsZXJhdGlvbj86IGJvb2xlYW47XG4gIGFkYXB0aXZlPzogYm9vbGVhbjtcbiAgc2Nyb2xsPzogYm9vbGVhbjtcbiAgcmVzaXplPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUE9QUEVSX09QVElPTlM6IFBvcHBlck9wdGlvbnMgPSB7XG4gIGFkYXB0aXZlOiB0cnVlLFxuICBncHVBY2NlbGVyYXRpb246IHRydWUsXG4gIGxvY2tlZDogZmFsc2UsXG4gIG9mZnNldERpc3RhbmNlOiA4LFxuICBvZmZzZXRTa2lkOiAwLFxuICBvdmVyZmxvd1BhZGRpbmc6IDgsXG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gIHJlc2l6ZTogdHJ1ZSxcbiAgc2Nyb2xsOiB0cnVlLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbn07XG5cbmludGVyZmFjZSBVc2VQb3BwZXJSZXR1cm4ge1xuICBpbnN0YW5jZTogUmVmPEluc3RhbmNlIHwgdW5kZWZpbmVkPjtcbiAgbGVhdmVQZW5kaW5nOiBSZWY8Ym9vbGVhbj47XG4gIG9uQ2xvc2U6IChpbW1lZGlhdGU/OiBib29sZWFuKSA9PiB2b2lkO1xuICBvbkxlYXZlUGVuZGluZzogKCkgPT4gdm9pZDtcbiAgb25PcGVuOiAoaW1tZWRpYXRlPzogYm9vbGVhbikgPT4gdm9pZDtcbiAgb25Qb3BwZXJMZWF2ZTogKCkgPT4gdm9pZDtcbiAgb3BlbjogUmVmPGJvb2xlYW4sIGJvb2xlYW4+O1xuICBwb3BwZXI6IFJlZjxNYXliZUVsZW1lbnQ+O1xuICBwb3BwZXJFbnRlcjogUmVmPGJvb2xlYW4+O1xuICByZWZlcmVuY2U6IFJlZjxIVE1MRWxlbWVudCB8IHVuZGVmaW5lZD47XG4gIHVwZGF0ZVBvcHBlcjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVBvcHBlcihcbiAgb3B0aW9uczogUmVmPFBvcHBlck9wdGlvbnM+LFxuICBkaXNhYmxlZDogUmVmPGJvb2xlYW4+ID0gcmVmKGZhbHNlKSxcbiAgb3BlbkRlbGF5OiBSZWY8bnVtYmVyPiA9IHJlZigwKSxcbiAgY2xvc2VEZWxheTogUmVmPG51bWJlcj4gPSByZWYoMCksXG4gIHZpcnR1YWxSZWZlcmVuY2U/OiBSZWY8RWxlbWVudCB8IFZpcnR1YWxFbGVtZW50Pixcbik6IFVzZVBvcHBlclJldHVybiB7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IHJlZjxIVE1MRWxlbWVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgY29uc3QgcG9wcGVyID0gcmVmPE1heWJlRWxlbWVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgY29uc3QgaW5zdGFuY2UgPSByZWY8SW5zdGFuY2UgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IG9wZW4gPSByZWY8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBwb3BwZXJFbnRlciA9IHJlZjxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGxlYXZlUGVuZGluZyA9IHJlZjxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3Qgb3BlblRpbWVvdXRNYW5hZ2VyID0gdXNlVGltZW91dE1hbmFnZXIoKTtcbiAgY29uc3QgY2xvc2VUaW1lb3V0TWFuYWdlciA9IHVzZVRpbWVvdXRNYW5hZ2VyKCk7XG5cbiAgY29uc3Qgb25Qb3BwZXJMZWF2ZSA9ICgpID0+IHtcbiAgICBzZXQocG9wcGVyRW50ZXIsIGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVQb3BwZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgZ2V0KGluc3RhbmNlKT8udXBkYXRlKCk7XG4gIH07XG5cbiAgY29uc3Qgb25PcGVuID0gKGltbWVkaWF0ZSA9IGZhbHNlKSA9PiB7XG4gICAgaWYgKGdldChkaXNhYmxlZCkpXG4gICAgICByZXR1cm47XG5cbiAgICBjbG9zZVRpbWVvdXRNYW5hZ2VyLmNsZWFyKCk7XG5cbiAgICBzZXQobGVhdmVQZW5kaW5nLCBmYWxzZSk7XG4gICAgaWYgKCFvcGVuVGltZW91dE1hbmFnZXIuaXNBY3RpdmUoKSkge1xuICAgICAgc2V0KHBvcHBlckVudGVyLCB0cnVlKTtcblxuICAgICAgb3BlblRpbWVvdXRNYW5hZ2VyLmNyZWF0ZSgoKSA9PiB7XG4gICAgICAgIHNldChvcGVuLCB0cnVlKTtcbiAgICAgIH0sIGltbWVkaWF0ZSA/IDAgOiBnZXQob3BlbkRlbGF5KSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG9uQ2xvc2UgPSAoaW1tZWRpYXRlID0gZmFsc2UpID0+IHtcbiAgICBpZiAoZ2V0KGRpc2FibGVkKSlcbiAgICAgIHJldHVybjtcblxuICAgIG9wZW5UaW1lb3V0TWFuYWdlci5jbGVhcigpO1xuXG4gICAgaWYgKCFjbG9zZVRpbWVvdXRNYW5hZ2VyLmlzQWN0aXZlKCkpIHtcbiAgICAgIGNsb3NlVGltZW91dE1hbmFnZXIuY3JlYXRlKCgpID0+IHtcbiAgICAgICAgaWYgKCFnZXQob3BlbikpXG4gICAgICAgICAgb25Qb3BwZXJMZWF2ZSgpO1xuXG4gICAgICAgIHNldChvcGVuLCBmYWxzZSk7XG4gICAgICB9LCBpbW1lZGlhdGUgPyAwIDogZ2V0KGNsb3NlRGVsYXkpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb25MZWF2ZVBlbmRpbmcgPSAoKSA9PiB7XG4gICAgc2V0KGxlYXZlUGVuZGluZywgdHJ1ZSk7XG4gIH07XG5cbiAgY29uc3QgbW9kaWZpZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGFkYXB0aXZlID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5hZGFwdGl2ZSxcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IERFRkFVTFRfUE9QUEVSX09QVElPTlMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgbG9ja2VkID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5sb2NrZWQsXG4gICAgICBvZmZzZXREaXN0YW5jZSA9IERFRkFVTFRfUE9QUEVSX09QVElPTlMub2Zmc2V0RGlzdGFuY2UsXG4gICAgICBvZmZzZXRTa2lkID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5vZmZzZXRTa2lkLFxuICAgICAgb3ZlcmZsb3dQYWRkaW5nID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5vdmVyZmxvd1BhZGRpbmcsXG4gICAgICByZXNpemUgPSBERUZBVUxUX1BPUFBFUl9PUFRJT05TLnJlc2l6ZSxcbiAgICAgIHNjcm9sbCA9IERFRkFVTFRfUE9QUEVSX09QVElPTlMuc2Nyb2xsLFxuICAgIH0gPSBnZXQob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gW3tcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgbmFtZTogJ2hpZGUnLFxuICAgIH0sIHtcbiAgICAgIGVuYWJsZWQ6ICFsb2NrZWQsXG4gICAgICBuYW1lOiAnZmxpcCcsXG4gICAgfSwge1xuICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHBhZGRpbmc6IG92ZXJmbG93UGFkZGluZyxcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIG9mZnNldDogW29mZnNldFNraWQsIG9mZnNldERpc3RhbmNlXSxcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBhZGFwdGl2ZSxcbiAgICAgICAgZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgfSxcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICByZXNpemUsXG4gICAgICAgIHNjcm9sbCxcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgcGFkZGluZzogNCxcbiAgICAgIH0sXG4gICAgfV07XG4gIH0pO1xuXG4gIGNvbnN0IHBvcHBlckNvbmZpZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBwbGFjZW1lbnQgPSBERUZBVUxUX1BPUFBFUl9PUFRJT05TLnBsYWNlbWVudCxcbiAgICAgIHN0cmF0ZWd5ID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5zdHJhdGVneSxcbiAgICB9ID0gZ2V0KG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGlmaWVyczogZ2V0KG1vZGlmaWVycyksXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICB9O1xuICB9KTtcblxuICBmdW5jdGlvbiBnZXRWYWxpZEVsZW1lbnRzKCk6IHsgcG9wcGVyRWw6IEhUTUxFbGVtZW50OyByZWZlcmVuY2VFbDogRWxlbWVudCB8IFZpcnR1YWxFbGVtZW50IH0gfCBudWxsIHtcbiAgICBpZiAoIWdldChwb3BwZXIpIHx8ICghZ2V0KHJlZmVyZW5jZSkgJiYgIWdldCh2aXJ0dWFsUmVmZXJlbmNlKSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcHBlckVsID0gdW5yZWZFbGVtZW50KHBvcHBlcik7XG4gICAgY29uc3QgcmVmZXJlbmNlRWwgPSBnZXQodmlydHVhbFJlZmVyZW5jZSkgfHwgdW5yZWZFbGVtZW50KHJlZmVyZW5jZSk7XG5cbiAgICBpZiAoIShwb3BwZXJFbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB8fCAhcmVmZXJlbmNlRWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7IHBvcHBlckVsLCByZWZlcmVuY2VFbCB9O1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZVBvcHBlcihvbkludmFsaWRhdGU6IChjbGVhbnVwRm46ICgpID0+IHZvaWQpID0+IHZvaWQpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldFZhbGlkRWxlbWVudHMoKTtcbiAgICBpZiAoIWVsZW1lbnRzKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBwb3BwZXJFbCwgcmVmZXJlbmNlRWwgfSA9IGVsZW1lbnRzO1xuXG4gICAgY29uc3QgdmFsdWUgPSBjcmVhdGVQb3BwZXIocmVmZXJlbmNlRWwsIHBvcHBlckVsLCBnZXQocG9wcGVyQ29uZmlnKSk7XG5cbiAgICBzZXQoaW5zdGFuY2UsIHZhbHVlKTtcbiAgICBvbkludmFsaWRhdGUodmFsdWUuZGVzdHJveSk7XG4gIH1cblxuICB1c2VSZXNpemVPYnNlcnZlcihbcmVmZXJlbmNlLCBwb3BwZXJdLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzRGVmaW5lZChpbnN0YW5jZSkpXG4gICAgICBhd2FpdCBnZXQoaW5zdGFuY2UpLnVwZGF0ZSgpO1xuICB9KTtcblxuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHdhdGNoRWZmZWN0KChvbkludmFsaWRhdGUpID0+IHtcbiAgICAgIGluaXRpYWxpemVQb3BwZXIob25JbnZhbGlkYXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZSxcbiAgICBsZWF2ZVBlbmRpbmcsXG4gICAgb25DbG9zZSxcbiAgICBvbkxlYXZlUGVuZGluZyxcbiAgICBvbk9wZW4sXG4gICAgb25Qb3BwZXJMZWF2ZSxcbiAgICBvcGVuLFxuICAgIHBvcHBlcixcbiAgICBwb3BwZXJFbnRlcixcbiAgICByZWZlcmVuY2UsXG4gICAgdXBkYXRlUG9wcGVyLFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuXG5leHBvcnQgdHlwZSBLZXlPZlR5cGU8VCwgVj4gPSBUIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN5bWJvbCB8IG51bGwgfCB1bmRlZmluZWRcbiAgPyBuZXZlclxuICA6IFYgZXh0ZW5kcyBvYmplY3RcbiAgICA/IGtleW9mIFRcbiAgICA6IGtleW9mIHtcbiAgICAgIFtQIGluIGtleW9mIFQgYXMgVFtQXSBleHRlbmRzIFZcbiAgICAgICAgPyBQXG4gICAgICAgIDogViBleHRlbmRzIFRbUF1cbiAgICAgICAgICA/IFBcbiAgICAgICAgICA6IG5ldmVyXTogYW55XG4gICAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBEcm9wZG93bkl0ZW1BdHRyPFRWYWx1ZSwgVEl0ZW0+IHtcbiAga2V5QXR0cj86IEtleU9mVHlwZTxUSXRlbSwgVFZhbHVlIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBVIDogVFZhbHVlPjtcbiAgdGV4dEF0dHI/OiBrZXlvZiBUSXRlbSB8ICgoaXRlbTogVEl0ZW0pID0+IHN0cmluZyk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25PcHRpb25zPFRWYWx1ZSwgVEl0ZW0+IHtcbiAgb3B0aW9uczogUmVmPFRJdGVtW10+O1xuICBkZW5zZT86IFJlZjxib29sZWFuPjtcbiAgZGlzYWJsZWQ/OiBSZWY8Ym9vbGVhbj47XG4gIHZhbHVlOiBSZWY8VEl0ZW0gfCBUSXRlbVtdIHwgdW5kZWZpbmVkPjtcbiAgbWVudVJlZjogUmVmPEhUTUxFbGVtZW50PjtcbiAga2V5QXR0cj86IEtleU9mVHlwZTxUSXRlbSwgVFZhbHVlIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBVIDogVFZhbHVlPjtcbiAgdGV4dEF0dHI/OiBrZXlvZiBUSXRlbSB8ICgoaXRlbTogVEl0ZW0pID0+IHN0cmluZyk7XG4gIGFwcGVuZFdpZHRoPzogbnVtYmVyO1xuICBwcmVwZW5kV2lkdGg/OiBudW1iZXI7XG4gIGl0ZW1IZWlnaHQ/OiBudW1iZXI7XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBhdXRvU2VsZWN0Rmlyc3Q/OiBib29sZWFuO1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICBzZXRWYWx1ZT86ICh2YWw6IFRJdGVtKSA9PiB2b2lkO1xuICBoaWRlU2VsZWN0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRHJvcGRvd25PcHRpb25Qcm9wZXJ0eTxUVmFsdWUsIFRJdGVtPih7XG4gIGtleUF0dHIsXG4gIHRleHRBdHRyLFxufTogRHJvcGRvd25JdGVtQXR0cjxUVmFsdWUsIFRJdGVtPikge1xuICBmdW5jdGlvbiBnZXRUZXh0KGl0ZW06IFRJdGVtKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGV4dEF0dHIpIHtcbiAgICAgIGlmICh0eXBlb2YgdGV4dEF0dHIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB0ZXh0QXR0cihpdGVtKTtcblxuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gaXRlbVt0ZXh0QXR0cl0/LnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW0/LnRvU3RyaW5nKCk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJZGVudGlmaWVyKGl0ZW06IFRJdGVtKTogVEl0ZW0gfCBUSXRlbVtLZXlPZlR5cGU8VEl0ZW0sIFRWYWx1ZSBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gVSA6IFRWYWx1ZT5dIHtcbiAgICBpZiAoa2V5QXR0cilcbiAgICAgIHJldHVybiBpdGVtW2tleUF0dHJdO1xuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldElkZW50aWZpZXIsXG4gICAgZ2V0VGV4dCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZURyb3Bkb3duTWVudTxUVmFsdWUsIFRJdGVtPih7XG4gIGFwcGVuZFdpZHRoLFxuICBhdXRvRm9jdXMsXG4gIGF1dG9TZWxlY3RGaXJzdCxcbiAgZGVuc2UsXG4gIGRpc2FibGVkID0gcmVmKGZhbHNlKSxcbiAgaGlkZVNlbGVjdGVkLFxuICBpdGVtSGVpZ2h0ID0gNDgsXG4gIGtleUF0dHIsXG4gIG1lbnVSZWYsXG4gIG9wdGlvbnM6IGFsbE9wdGlvbnMsXG4gIG92ZXJzY2FuID0gNSxcbiAgcHJlcGVuZFdpZHRoLFxuICBzZXRWYWx1ZSxcbiAgdGV4dEF0dHIsXG4gIHZhbHVlLFxufTogRHJvcGRvd25PcHRpb25zPFRWYWx1ZSwgVEl0ZW0+KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGdldChhbGxPcHRpb25zKTtcbiAgICBpZiAoIWhpZGVTZWxlY3RlZClcbiAgICAgIHJldHVybiBvcHRpb25zO1xuXG4gICAgcmV0dXJuIG9wdGlvbnMuZmlsdGVyKGl0ZW0gPT4gIWlzQWN0aXZlSXRlbShpdGVtKSk7XG4gIH0pO1xuXG4gIGNvbnN0IHsgZ2V0SWRlbnRpZmllciwgZ2V0VGV4dCB9ID0gdXNlRHJvcGRvd25PcHRpb25Qcm9wZXJ0eSh7XG4gICAga2V5QXR0cixcbiAgICB0ZXh0QXR0cixcbiAgfSk7XG5cbiAgY29uc3QgeyBjb250YWluZXJQcm9wcywgbGlzdCwgc2Nyb2xsVG8sIHdyYXBwZXJQcm9wcyB9ID0gdXNlVmlydHVhbExpc3Q8VEl0ZW0+KFxuICAgIG9wdGlvbnMsXG4gICAge1xuICAgICAgaXRlbUhlaWdodCxcbiAgICAgIG92ZXJzY2FuLFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgcmVuZGVyZWREYXRhID0gdXNlQXJyYXlNYXAobGlzdCwgKHsgZGF0YSwgaW5kZXg6IF9pbmRleCB9KSA9PiAoeyBfaW5kZXgsIGl0ZW06IGRhdGEgfSkpO1xuXG4gIGNvbnN0IGlzT3BlbiA9IHJlZihmYWxzZSk7XG5cbiAgY29uc3QgdmFsdWVLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBnZXQodmFsdWUpO1xuICAgIGlmICgha2V5QXR0ciB8fCAhc2VsZWN0ZWQpXG4gICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpID8gc2VsZWN0ZWQubWFwKGl0ZW0gPT4gaXRlbVtrZXlBdHRyXSkgOiBzZWxlY3RlZFtrZXlBdHRyXTtcbiAgfSk7XG5cbiAgY29uc3QgaGlnaGxpZ2h0ZWRJbmRleDogUmVmPG51bWJlcj4gPSByZWYoZ2V0KGF1dG9TZWxlY3RGaXJzdCkgPyAwIDogLTEpO1xuXG4gIGNvbnN0IG1lbnVXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB3aWR0aHMgPSB7IG1heDogMCwgbWluOiAwIH07XG4gICAgY29uc3QgbWF4V2lkdGggPSAzMDtcbiAgICBjb25zdCBwYWRkaW5nWCA9IDEuNTtcbiAgICBjb25zdCBmb250TXVsdGlwbGllciA9IGdldChkZW5zZSkgPyAxMiA6IDEzO1xuXG4gICAgZ2V0KG9wdGlvbnMpLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgbGVuZ3RoID0gZ2V0VGV4dChvcHRpb24pPy50b1N0cmluZygpPy5sZW5ndGggPz8gMDtcbiAgICAgIGlmICh3aWR0aHMubWluID09PSAwICYmIHdpZHRocy5tYXggPT09IDApIHtcbiAgICAgICAgd2lkdGhzLm1pbiA9IGxlbmd0aDtcbiAgICAgICAgd2lkdGhzLm1heCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA8IHdpZHRocy5taW4pIHtcbiAgICAgICAgd2lkdGhzLm1pbiA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA+IHdpZHRocy5tYXgpIHtcbiAgICAgICAgd2lkdGhzLm1heCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB3aWR0aHMubWF4IC0gd2lkdGhzLm1pbjtcblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVWYWx1ZSh3aWR0aDogbnVtYmVyKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsV2lkdGhzID0gKHByZXBlbmRXaWR0aCA/IHByZXBlbmRXaWR0aCArIDAuNSA6IDApICsgKGFwcGVuZFdpZHRoID8gYXBwZW5kV2lkdGggKyAwLjUgOiAwKTtcbiAgICAgIHJldHVybiBgJHtNYXRoLm1pbigod2lkdGggKiBmb250TXVsdGlwbGllcikgLyAxNiArIHBhZGRpbmdYICsgYWRkaXRpb25hbFdpZHRocywgbWF4V2lkdGgpfXJlbWA7XG4gICAgfVxuXG4gICAgaWYgKGRpZmZlcmVuY2UgPD0gNSlcbiAgICAgIHJldHVybiBjb21wdXRlVmFsdWUod2lkdGhzLm1heCk7XG5cbiAgICByZXR1cm4gY29tcHV0ZVZhbHVlKHdpZHRocy5taW4gKyBkaWZmZXJlbmNlIC8gMik7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHRvZ2dsZShzdGF0ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc2V0KGlzT3Blbiwgc3RhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXRlbUluZGV4SW5WYWx1ZShpdGVtOiBUSXRlbSk6IG51bWJlciB7XG4gICAgY29uc3QgdmFsID0gZ2V0KHZhbHVlKTtcbiAgICBjb25zdCBzZWxlY3RlZDogVEl0ZW1bXSA9IEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6ICh2YWwgPyBbdmFsXSA6IFtdKTtcblxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gLTE7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWQuZmluZEluZGV4KChzZWxlY3RlZEl0ZW0pID0+IHtcbiAgICAgIGlmIChrZXlBdHRyKVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtW2tleUF0dHJdID09PSBpdGVtW2tleUF0dHJdO1xuICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQWN0aXZlSXRlbShpdGVtOiBUSXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtSW5kZXhJblZhbHVlKGl0ZW0pICE9PSAtMTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFkanVzdFNjcm9sbEJ5SGlnaGxpZ2h0ZWRJbmRleChzbW9vdGg6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGluZGV4ID0gZ2V0KGhpZ2hsaWdodGVkSW5kZXgpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBhd2FpdCBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldChtZW51UmVmKT8ucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodGVkRWxlbSA9IGdldChtZW51UmVmKS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoaWdobGlnaHRlZCcpWzBdO1xuXG4gICAgICAgICAgaWYgKGhpZ2hsaWdodGVkRWxlbSkge1xuICAgICAgICAgICAgaGlnaGxpZ2h0ZWRFbGVtLnNjcm9sbEludG9WaWV3Py4oeyBiZWhhdmlvcjogc21vb3RoID8gJ3Ntb290aCcgOiAnYXV0bycsIGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgICAgICBpZiAoZ2V0KGF1dG9Gb2N1cykgJiYgJ2ZvY3VzJyBpbiBoaWdobGlnaHRlZEVsZW0gJiYgdHlwZW9mIGhpZ2hsaWdodGVkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWRFbGVtPy5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNjcm9sbFRvKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChnZXQoYXV0b0ZvY3VzKSkge1xuICAgICAgICAgICAgICBjb25zdCBlbGVtID0gZ2V0KG1lbnVSZWYpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hpZ2hsaWdodGVkJylbMF07XG4gICAgICAgICAgICAgIGlmIChlbGVtICYmICdmb2N1cycgaW4gZWxlbSAmJiB0eXBlb2YgZWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVPcGVuKG9wZW46IGJvb2xlYW4pIHtcbiAgICBhd2FpdCBuZXh0VGljaygoKSA9PiB7XG4gICAgICBpZiAob3Blbikge1xuICAgICAgICBjb25zdCB2YWwgPSBnZXQodmFsdWUpO1xuXG4gICAgICAgIC8vIHNldCBoaWdobGlnaHRlZCBpbmRleCB0byBhY3RpdmUgaXRlbVxuICAgICAgICBpZiAoKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID4gMCkgfHwgISF2YWwpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGdldChvcHRpb25zKS5maW5kSW5kZXgoaXNBY3RpdmVJdGVtKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgIHNldChoaWdobGlnaHRlZEluZGV4LCBpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICB3YXRjaE9uY2UobGlzdCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGFkanVzdFNjcm9sbEJ5SGlnaGxpZ2h0ZWRJbmRleCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHdhdGNoKFtpc09wZW4sIGRpc2FibGVkXSwgYXN5bmMgKFtvcGVuLCBfXSkgPT4ge1xuICAgIGF3YWl0IHVwZGF0ZU9wZW4ob3Blbik7XG4gIH0pO1xuXG4gIHdhdGNoKGhpZ2hsaWdodGVkSW5kZXgsIGFzeW5jIChjdXJyLCBwcmV2KSA9PiB7XG4gICAgaWYgKGN1cnIgIT09IHByZXYpXG4gICAgICBhd2FpdCBhZGp1c3RTY3JvbGxCeUhpZ2hsaWdodGVkSW5kZXgodHJ1ZSk7XG4gIH0pO1xuXG4gIHdhdGNoKG9wdGlvbnMsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoZ2V0KGhpZ2hsaWdodGVkSW5kZXgpICE9PSAtMSkge1xuICAgICAgaWYgKGdldChhdXRvU2VsZWN0Rmlyc3QpKSB7XG4gICAgICAgIHNldChoaWdobGlnaHRlZEluZGV4LCAwKTtcbiAgICAgICAgYXdhaXQgYWRqdXN0U2Nyb2xsQnlIaWdobGlnaHRlZEluZGV4KCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc2V0KGhpZ2hsaWdodGVkSW5kZXgsIC0xKTtcbiAgICAgICAgc2Nyb2xsVG8oMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc2Nyb2xsVG8oMCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBtb3ZlSGlnaGxpZ2h0ID0gKHVwOiBib29sZWFuKSA9PiB7XG4gICAgaWYgKCFnZXQoaXNPcGVuKSkge1xuICAgICAgdG9nZ2xlKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwb3NpdGlvbiA9IGdldChoaWdobGlnaHRlZEluZGV4KTtcbiAgICBjb25zdCBtb3ZlID0gdXAgPyAtMSA6IDE7XG5cbiAgICBwb3NpdGlvbiArPSBtb3ZlO1xuXG4gICAgY29uc3QgdG90YWwgPSBnZXQob3B0aW9ucykubGVuZ3RoO1xuXG4gICAgaWYgKHBvc2l0aW9uID49IHRvdGFsKVxuICAgICAgc2V0KGhpZ2hsaWdodGVkSW5kZXgsIDApO1xuICAgIGVsc2UgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHNldChoaWdobGlnaHRlZEluZGV4LCB0b3RhbCAtIDEpO1xuICAgIGVsc2VcbiAgICAgIHNldChoaWdobGlnaHRlZEluZGV4LCBwb3NpdGlvbik7XG4gIH07XG5cbiAgY29uc3QgYXBwbHlIaWdobGlnaHRlZCA9ICgpID0+IHtcbiAgICBpZiAoIXNldFZhbHVlIHx8ICFnZXQoaXNPcGVuKSlcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IGhpZ2hsaWdodGVkSW5kZXhWYWwgPSBnZXQoaGlnaGxpZ2h0ZWRJbmRleCk7XG4gICAgaWYgKGhpZ2hsaWdodGVkSW5kZXhWYWwgPT09IC0xKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgZW50cnkgPSBnZXQob3B0aW9ucykuZmluZCgoX2RhdGEsIGluZGV4KSA9PiBoaWdobGlnaHRlZEluZGV4VmFsID09PSBpbmRleCk7XG4gICAgaWYgKGVudHJ5KVxuICAgICAgc2V0VmFsdWUoZW50cnkpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYXBwbHlIaWdobGlnaHRlZCxcbiAgICBjb250YWluZXJQcm9wcyxcbiAgICBnZXRJZGVudGlmaWVyLFxuICAgIGdldFRleHQsXG4gICAgaGlnaGxpZ2h0ZWRJbmRleCxcbiAgICBpc0FjdGl2ZUl0ZW0sXG4gICAgaXNPcGVuLFxuICAgIGl0ZW1JbmRleEluVmFsdWUsXG4gICAgbWVudVdpZHRoLFxuICAgIG1vdmVIaWdobGlnaHQsXG4gICAgb3B0aW9uc1dpdGhTZWxlY3RlZEhpZGRlbjogb3B0aW9ucyxcbiAgICByZW5kZXJlZERhdGEsXG4gICAgdG9nZ2xlLFxuICAgIHZhbHVlS2V5LFxuICAgIHdyYXBwZXJQcm9wcyxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgQ29tcHV0ZWRSZWYsIE1heWJlUmVmLCBSZWYgfSBmcm9tICd2dWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUF1dG9Db21wbGV0ZUZvY3VzT3B0aW9ucyB7XG4gIGN1c3RvbVZhbHVlOiBNYXliZVJlZjxib29sZWFuPjtcbiAgc2hvdWxkQXBwbHlWYWx1ZUFzU2VhcmNoOiBNYXliZVJlZjxib29sZWFuPjtcbiAgZGlzYWJsZWQ6IE1heWJlUmVmPGJvb2xlYW4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUF1dG9Db21wbGV0ZUZvY3VzRGVwczxUSXRlbT4ge1xuICBhY3RpdmF0b3JGb2N1c2VkOiBSZWY8Ym9vbGVhbj47XG4gIGFjdGl2YXRvckZvY3VzZWRXaXRoaW46IFJlZjxib29sZWFuPjtcbiAgZm9jdXNlZFZhbHVlSW5kZXg6IFJlZjxudW1iZXI+O1xuICBmaWx0ZXJlZE9wdGlvbnM6IFJlZjxUSXRlbVtdPjtcbiAgaW50ZXJuYWxTZWFyY2g6IFJlZjxzdHJpbmc+O1xuICBpc09wZW46IFJlZjxib29sZWFuPjtcbiAganVzdE9wZW5lZDogUmVmPGJvb2xlYW4+O1xuICBtZW51V3JhcHBlckZvY3VzZWRXaXRoaW46IFJlZjxib29sZWFuPjtcbiAgc2VhcmNoSW5wdXRGb2N1c2VkOiBSZWY8Ym9vbGVhbj47XG4gIHRleHRJbnB1dDogUmVmPEhUTUxJbnB1dEVsZW1lbnQgfCB1bmRlZmluZWQ+O1xuICBzZXRTZWFyY2hBc1ZhbHVlOiAoKSA9PiB2b2lkO1xuICB1cGRhdGVJbnRlcm5hbFNlYXJjaDogKHZhbHVlPzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUF1dG9Db21wbGV0ZUZvY3VzUmV0dXJuIHtcbiAgYW55Rm9jdXNlZDogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gIGlucHV0Q2xhc3M6IENvbXB1dGVkUmVmPHN0cmluZz47XG4gIG9uQWN0aXZhdG9yRm9jdXNlZDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgb25JbnB1dEZvY3VzZWQ6ICgpID0+IHZvaWQ7XG4gIHNldElucHV0Rm9jdXM6ICgpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRvQ29tcGxldGVGb2N1czxUSXRlbT4oXG4gIG9wdGlvbnM6IFVzZUF1dG9Db21wbGV0ZUZvY3VzT3B0aW9ucyxcbiAgZGVwczogVXNlQXV0b0NvbXBsZXRlRm9jdXNEZXBzPFRJdGVtPixcbik6IFVzZUF1dG9Db21wbGV0ZUZvY3VzUmV0dXJuIHtcbiAgY29uc3QgYW55Rm9jdXNlZCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+XG4gICAgZ2V0KGRlcHMuYWN0aXZhdG9yRm9jdXNlZFdpdGhpbikgfHwgZ2V0KGRlcHMubWVudVdyYXBwZXJGb2N1c2VkV2l0aGluKSxcbiAgKTtcblxuICBjb25zdCBpbnB1dENsYXNzID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgY29uc3QgaXNGb2N1c2VkID0gZ2V0KGFueUZvY3VzZWQpO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBnZXQob3B0aW9ucy5kaXNhYmxlZCk7XG4gICAgY29uc3Qgc2hvdWxkQXBwbHkgPSBnZXQob3B0aW9ucy5zaG91bGRBcHBseVZhbHVlQXNTZWFyY2gpO1xuICAgIGNvbnN0IGhhc1NlYXJjaCA9IGdldChkZXBzLmludGVybmFsU2VhcmNoKTtcblxuICAgIGlmICgoIWlzRm9jdXNlZCB8fCBpc0Rpc2FibGVkKSAmJiAhc2hvdWxkQXBwbHkpXG4gICAgICByZXR1cm4gJ3ctMCBoLTAnO1xuICAgIGlmIChoYXNTZWFyY2gpXG4gICAgICByZXR1cm4gJ2ZsZXgtMSBtaW4tdy1bNHJlbV0nO1xuICAgIHJldHVybiAnZmxleC0xIG1pbi13LTAnO1xuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBzZXRJbnB1dEZvY3VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5leHRUaWNrKCgpID0+IHtcbiAgICAgIHNldChkZXBzLnNlYXJjaElucHV0Rm9jdXNlZCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBvbkFjdGl2YXRvckZvY3VzZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKCFnZXQoZGVwcy5hY3RpdmF0b3JGb2N1c2VkKSkge1xuICAgICAgICBzZXQoZGVwcy5zZWFyY2hJbnB1dEZvY3VzZWQsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25JbnB1dEZvY3VzZWQoKTogdm9pZCB7XG4gICAgc2V0KGRlcHMuZm9jdXNlZFZhbHVlSW5kZXgsIC0xKTtcblxuICAgIGNvbnN0IHNob3VsZEFwcGx5ID0gZ2V0KG9wdGlvbnMuc2hvdWxkQXBwbHlWYWx1ZUFzU2VhcmNoKTtcbiAgICBpZiAoc2hvdWxkQXBwbHkpIHtcbiAgICAgIGNvbnN0IHRleHRJbnB1dCA9IGdldChkZXBzLnRleHRJbnB1dCk7XG4gICAgICB0ZXh0SW5wdXQ/LnNlbGVjdCgpO1xuICAgIH1cblxuICAgIGlmICghZ2V0KGRlcHMuaXNPcGVuKSkge1xuICAgICAgc2V0KGRlcHMuanVzdE9wZW5lZCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2xvc2UgbWVudSBpZiB0aGUgYWN0aXZhdG9yIGlzIG5vdCBmb2N1c2VkIGFueW1vcmVcbiAgLy8gVXNpbmcgZGVib3VuY2VkIHRvIGF2b2lkIHRoZSBtZW51IGNsb3NpbmcgbW9tZW50YXJpbHkgd2hpbGUgZm9jdXMgc3dpdGNoZXMuXG4gIHdhdGNoRGVib3VuY2VkKGFueUZvY3VzZWQsIChmb2N1c2VkKSA9PiB7XG4gICAgaWYgKCFmb2N1c2VkKSB7XG4gICAgICBzZXQoZGVwcy5pc09wZW4sIGZhbHNlKTtcblxuICAgICAgY29uc3QgY3VzdG9tVmFsdWUgPSBnZXQob3B0aW9ucy5jdXN0b21WYWx1ZSk7XG4gICAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSBnZXQoZGVwcy5maWx0ZXJlZE9wdGlvbnMpO1xuICAgICAgY29uc3QgaW50ZXJuYWxTZWFyY2ggPSBnZXQoZGVwcy5pbnRlcm5hbFNlYXJjaCk7XG5cbiAgICAgIGlmIChjdXN0b21WYWx1ZSAmJiBmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09PSAwICYmIGludGVybmFsU2VhcmNoKSB7XG4gICAgICAgIGRlcHMuc2V0U2VhcmNoQXNWYWx1ZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaG91bGRBcHBseSA9IGdldChvcHRpb25zLnNob3VsZEFwcGx5VmFsdWVBc1NlYXJjaCk7XG4gICAgICBpZiAoIXNob3VsZEFwcGx5KSB7XG4gICAgICAgIGRlcHMudXBkYXRlSW50ZXJuYWxTZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBkZWJvdW5jZTogMjAwLFxuICAgIG1heFdhaXQ6IDQwMCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBhbnlGb2N1c2VkLFxuICAgIGlucHV0Q2xhc3MsXG4gICAgb25BY3RpdmF0b3JGb2N1c2VkLFxuICAgIG9uSW5wdXRGb2N1c2VkLFxuICAgIHNldElucHV0Rm9jdXMsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlUmVmLCBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgZ2V0LCBzZXQgfSBmcm9tICdAdnVldXNlL3NoYXJlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQXV0b0NvbXBsZXRlS2V5Ym9hcmROYXZpZ2F0aW9uT3B0aW9ucyB7XG4gIG11bHRpcGxlOiBNYXliZVJlZjxib29sZWFuPjtcbiAgY3VzdG9tVmFsdWU6IE1heWJlUmVmPGJvb2xlYW4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUF1dG9Db21wbGV0ZUtleWJvYXJkTmF2aWdhdGlvbkRlcHM8VEl0ZW0+IHtcbiAgaW50ZXJuYWxTZWFyY2g6IFJlZjxzdHJpbmc+O1xuICB2YWx1ZTogUmVmPFRJdGVtW10+O1xuICBmaWx0ZXJlZE9wdGlvbnM6IFJlZjxUSXRlbVtdPjtcbiAgb3B0aW9uczogUmVmPFRJdGVtW10+O1xuICBpc09wZW46IFJlZjxib29sZWFuPjtcbiAgaGlnaGxpZ2h0ZWRJbmRleDogUmVmPG51bWJlcj47XG4gIHNlYXJjaElucHV0Rm9jdXNlZDogUmVmPGJvb2xlYW4+O1xuICBhcHBseUhpZ2hsaWdodGVkOiAoKSA9PiB2b2lkO1xuICBjbGVhcjogKCkgPT4gdm9pZDtcbiAgc2V0U2VhcmNoQXNWYWx1ZTogKCkgPT4gdm9pZDtcbiAgYWN0aXZhdG9yOiBSZWY8SFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUF1dG9Db21wbGV0ZUtleWJvYXJkTmF2aWdhdGlvblJldHVybiB7XG4gIGZvY3VzZWRWYWx1ZUluZGV4OiBSZWY8bnVtYmVyPjtcbiAgbW92ZVNlbGVjdGVkVmFsdWVIaWdobGlnaHQ6IChldmVudDogS2V5Ym9hcmRFdmVudCwgbmV4dDogYm9vbGVhbikgPT4gdm9pZDtcbiAgb25FbnRlcjogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICBvblRhYjogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICBvbklucHV0RGVsZXRlUHJlc3NlZDogKCkgPT4gdm9pZDtcbiAgc2V0VmFsdWVGb2N1czogKGluZGV4OiBudW1iZXIpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRvQ29tcGxldGVLZXlib2FyZE5hdmlnYXRpb248VEl0ZW0+KFxuICBvcHRpb25zOiBVc2VBdXRvQ29tcGxldGVLZXlib2FyZE5hdmlnYXRpb25PcHRpb25zLFxuICBkZXBzOiBVc2VBdXRvQ29tcGxldGVLZXlib2FyZE5hdmlnYXRpb25EZXBzPFRJdGVtPixcbik6IFVzZUF1dG9Db21wbGV0ZUtleWJvYXJkTmF2aWdhdGlvblJldHVybiB7XG4gIGNvbnN0IGZvY3VzZWRWYWx1ZUluZGV4ID0gcmVmPG51bWJlcj4oLTEpO1xuICBjb25zdCBjaGlwRWxlbWVudHNDYWNoZSA9IHJlZjxNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4+KG5ldyBNYXAoKSk7XG5cbiAgZnVuY3Rpb24gc2V0VmFsdWVGb2N1cyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgc2V0KGZvY3VzZWRWYWx1ZUluZGV4LCBpbmRleCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlU2VsZWN0ZWRWYWx1ZUhpZ2hsaWdodChldmVudDogS2V5Ym9hcmRFdmVudCwgbmV4dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG11bHRpcGxlID0gZ2V0KG9wdGlvbnMubXVsdGlwbGUpO1xuICAgIGNvbnN0IGludGVybmFsU2VhcmNoVmFsdWUgPSBnZXQoZGVwcy5pbnRlcm5hbFNlYXJjaCk7XG5cbiAgICBpZiAoIW11bHRpcGxlIHx8IGludGVybmFsU2VhcmNoVmFsdWUubGVuZ3RoID4gMClcbiAgICAgIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdG90YWwgPSBnZXQoZGVwcy52YWx1ZSkubGVuZ3RoO1xuXG4gICAgbGV0IGN1cnJlbnQgPSBnZXQoZm9jdXNlZFZhbHVlSW5kZXgpO1xuXG4gICAgaWYgKGN1cnJlbnQgPT09IC0xKSB7XG4gICAgICBzZXQoZm9jdXNlZFZhbHVlSW5kZXgsIG5leHQgPyAwIDogdG90YWwgLSAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtb3ZlID0gbmV4dCA/IDEgOiAtMTtcbiAgICBjdXJyZW50ICs9IG1vdmU7XG5cbiAgICBpZiAoY3VycmVudCA8IDAgfHwgY3VycmVudCA+PSB0b3RhbCkge1xuICAgICAgc2V0KGZvY3VzZWRWYWx1ZUluZGV4LCAtMSk7XG4gICAgICBzZXQoZGVwcy5zZWFyY2hJbnB1dEZvY3VzZWQsIHRydWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHNldChmb2N1c2VkVmFsdWVJbmRleCwgY3VycmVudCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25FbnRlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9IGdldChkZXBzLmZpbHRlcmVkT3B0aW9ucyk7XG4gICAgY29uc3QgaGlnaGxpZ2h0ZWRJbmRleCA9IGdldChkZXBzLmhpZ2hsaWdodGVkSW5kZXgpO1xuICAgIGNvbnN0IGlzT3BlbiA9IGdldChkZXBzLmlzT3Blbik7XG4gICAgY29uc3QgY3VzdG9tVmFsdWUgPSBnZXQob3B0aW9ucy5jdXN0b21WYWx1ZSk7XG4gICAgY29uc3QgbXVsdGlwbGUgPSBnZXQob3B0aW9ucy5tdWx0aXBsZSk7XG4gICAgY29uc3QgdmFsdWUgPSBnZXQoZGVwcy52YWx1ZSk7XG4gICAgY29uc3QgaW50ZXJuYWxTZWFyY2ggPSBnZXQoZGVwcy5pbnRlcm5hbFNlYXJjaCk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgdXNlIGN1c3RvbSB2YWx1ZVxuICAgIGlmIChjdXN0b21WYWx1ZSAmJiBpbnRlcm5hbFNlYXJjaCAmJiBpc09wZW4pIHtcbiAgICAgIC8vIENoZWNrIGlmIGFueSBvcHRpb24gZXhhY3RseSBtYXRjaGVzIHRoZSBzZWFyY2ggdGVybVxuICAgICAgbGV0IGhhc0V4YWN0TWF0Y2ggPSBmYWxzZTtcblxuICAgICAgaWYgKGhpZ2hsaWdodGVkSW5kZXggPiAtMSAmJiBoaWdobGlnaHRlZEluZGV4IDwgZmlsdGVyZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBoaWdobGlnaHRlZE9wdGlvbiA9IGZpbHRlcmVkT3B0aW9uc1toaWdobGlnaHRlZEluZGV4XTtcbiAgICAgICAgaWYgKHR5cGVvZiBoaWdobGlnaHRlZE9wdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBoYXNFeGFjdE1hdGNoID0gaGlnaGxpZ2h0ZWRPcHRpb24gPT09IGludGVybmFsU2VhcmNoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhpZ2hsaWdodGVkT3B0aW9uICYmIHR5cGVvZiBoaWdobGlnaHRlZE9wdGlvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IChoaWdobGlnaHRlZE9wdGlvbiBhcyBhbnkpLmxhYmVsIHx8IChoaWdobGlnaHRlZE9wdGlvbiBhcyBhbnkpLnZhbHVlIHx8ICcnO1xuICAgICAgICAgIGhhc0V4YWN0TWF0Y2ggPSBsYWJlbCA9PT0gaW50ZXJuYWxTZWFyY2g7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gZXhhY3QgbWF0Y2ggd2l0aCBoaWdobGlnaHRlZCBvcHRpb24sIHVzZSBjdXN0b20gdmFsdWVcbiAgICAgIGlmICghaGFzRXhhY3RNYXRjaCkge1xuICAgICAgICBkZXBzLnNldFNlYXJjaEFzVmFsdWUoKTtcbiAgICAgICAgaWYgKCFtdWx0aXBsZSlcbiAgICAgICAgICBzZXQoZGVwcy5pc09wZW4sIGZhbHNlKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID4gMCAmJiBoaWdobGlnaHRlZEluZGV4ID4gLTEgJiYgaXNPcGVuKSB7XG4gICAgICBkZXBzLmFwcGx5SGlnaGxpZ2h0ZWQoKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPT09IDAgJiYgY3VzdG9tVmFsdWUgJiYgaW50ZXJuYWxTZWFyY2gpIHtcbiAgICAgIGRlcHMuc2V0U2VhcmNoQXNWYWx1ZSgpO1xuICAgICAgaWYgKCFtdWx0aXBsZSlcbiAgICAgICAgc2V0KGRlcHMuaXNPcGVuLCBmYWxzZSk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNPcGVuICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0KGRlcHMuaXNPcGVuLCB0cnVlKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgYWN0aXZhdG9yID0gZ2V0KGRlcHMuYWN0aXZhdG9yKTtcbiAgICAgIGNvbnN0IGZvcm0gPSBhY3RpdmF0b3I/LmNsb3Nlc3QoJ2Zvcm0nKTtcbiAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgIGZvcm0uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3N1Ym1pdCcpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvblRhYihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlzT3BlbiA9IGdldChkZXBzLmlzT3Blbik7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gZ2V0KGRlcHMuZmlsdGVyZWRPcHRpb25zKTtcbiAgICBjb25zdCBoaWdobGlnaHRlZEluZGV4ID0gZ2V0KGRlcHMuaGlnaGxpZ2h0ZWRJbmRleCk7XG4gICAgY29uc3QgbXVsdGlwbGUgPSBnZXQob3B0aW9ucy5tdWx0aXBsZSk7XG5cbiAgICBpZiAoaXNPcGVuICYmIGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwICYmIGhpZ2hsaWdodGVkSW5kZXggPiAtMSAmJiAhbXVsdGlwbGUpIHtcbiAgICAgIGRlcHMuYXBwbHlIaWdobGlnaHRlZCgpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbklucHV0RGVsZXRlUHJlc3NlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnRlcm5hbFNlYXJjaCA9IGdldChkZXBzLmludGVybmFsU2VhcmNoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGdldChkZXBzLnZhbHVlKTtcbiAgICBjb25zdCB0b3RhbCA9IHZhbHVlLmxlbmd0aDtcbiAgICBjb25zdCBtdWx0aXBsZSA9IGdldChvcHRpb25zLm11bHRpcGxlKTtcblxuICAgIGlmICghaW50ZXJuYWxTZWFyY2ggJiYgdG90YWwgPiAwKSB7XG4gICAgICBpZiAobXVsdGlwbGUpXG4gICAgICAgIHNldChmb2N1c2VkVmFsdWVJbmRleCwgdG90YWwgLSAxKTtcbiAgICAgIGVsc2VcbiAgICAgICAgZGVwcy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdhdGNoIHZhbHVlIGNoYW5nZXMgdG8gcmVzZXQgZm9jdXNlZCBpbmRleCBhbmQgY2xlYXIgY2FjaGVcbiAgd2F0Y2goZGVwcy52YWx1ZSwgKCkgPT4ge1xuICAgIHNldFZhbHVlRm9jdXMoLTEpO1xuICAgIGdldChjaGlwRWxlbWVudHNDYWNoZSkuY2xlYXIoKTtcbiAgfSk7XG5cbiAgLy8gV2F0Y2ggZm9jdXNlZCB2YWx1ZSBpbmRleCB0byBoYW5kbGUgY2hpcCBmb2N1c1xuICB3YXRjaChmb2N1c2VkVmFsdWVJbmRleCwgYXN5bmMgKGluZGV4KSA9PiB7XG4gICAgY29uc3QgbXVsdGlwbGUgPSBnZXQob3B0aW9ucy5tdWx0aXBsZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSB8fCAhbXVsdGlwbGUpXG4gICAgICByZXR1cm47XG5cbiAgICBhd2FpdCBuZXh0VGljaygoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGdldChjaGlwRWxlbWVudHNDYWNoZSk7XG4gICAgICBsZXQgYWN0aXZlQ2hpcCA9IGNhY2hlLmdldChpbmRleCk7XG5cbiAgICAgIGlmICghYWN0aXZlQ2hpcCkge1xuICAgICAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXQoZGVwcy5hY3RpdmF0b3IpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gYWN0aXZhdG9yPy5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pbmRleD1cIiR7aW5kZXh9XCJdYCkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGFjdGl2ZUNoaXAgPSBlbGVtZW50O1xuICAgICAgICAgIGNhY2hlLnNldChpbmRleCwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZUNoaXAgJiYgJ2ZvY3VzJyBpbiBhY3RpdmVDaGlwICYmIHR5cGVvZiBhY3RpdmVDaGlwLmZvY3VzID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBhY3RpdmVDaGlwLmZvY3VzKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZm9jdXNlZFZhbHVlSW5kZXgsXG4gICAgbW92ZVNlbGVjdGVkVmFsdWVIaWdobGlnaHQsXG4gICAgb25FbnRlcixcbiAgICBvbklucHV0RGVsZXRlUHJlc3NlZCxcbiAgICBvblRhYixcbiAgICBzZXRWYWx1ZUZvY3VzLFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBNYXliZVJlZiwgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGdldCwgc2V0IH0gZnJvbSAnQHZ1ZXVzZS9zaGFyZWQnO1xuaW1wb3J0IHsgZ2V0VGV4dFRva2VuIH0gZnJvbSAnQC91dGlscy9oZWxwZXJzJztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VBdXRvQ29tcGxldGVTZWFyY2hPcHRpb25zPFRJdGVtPiB7XG4gIGtleUF0dHI/OiBNYXliZVJlZjxrZXlvZiBUSXRlbSB8IHVuZGVmaW5lZD47XG4gIHRleHRBdHRyPzogTWF5YmVSZWY8a2V5b2YgVEl0ZW0gfCB1bmRlZmluZWQ+O1xuICBub0ZpbHRlcj86IE1heWJlUmVmPGJvb2xlYW4+O1xuICBmaWx0ZXI/OiBNYXliZVJlZjwoKGl0ZW06IFRJdGVtLCBxdWVyeVRleHQ6IHN0cmluZykgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQ+O1xuICBjdXN0b21WYWx1ZT86IE1heWJlUmVmPGJvb2xlYW4+O1xuICBoaWRlQ3VzdG9tVmFsdWU/OiBNYXliZVJlZjxib29sZWFuPjtcbiAgcmV0dXJuT2JqZWN0PzogTWF5YmVSZWY8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQXV0b0NvbXBsZXRlU2VhcmNoUmV0dXJuPFRJdGVtPiB7XG4gIGludGVybmFsU2VhcmNoOiBSZWY8c3RyaW5nPjtcbiAgZGVib3VuY2VkSW50ZXJuYWxTZWFyY2g6IFJlYWRvbmx5PFJlZjxzdHJpbmc+PjtcbiAgZmlsdGVyZWRPcHRpb25zOiBSZWFkb25seTxSZWY8VEl0ZW1bXT4+O1xuICBqdXN0T3BlbmVkOiBSZWY8Ym9vbGVhbj47XG4gIHVwZGF0ZUludGVybmFsU2VhcmNoOiAodmFsdWU/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHRleHRWYWx1ZVRvUHJvcGVyVmFsdWU6ICh2YWw6IGFueSwgcmV0dXJuT2JqZWN0PzogYm9vbGVhbikgPT4gVEl0ZW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRvQ29tcGxldGVTZWFyY2g8VEl0ZW0+KFxuICBvcHRpb25zOiBNYXliZVJlZjxUSXRlbVtdPixcbiAgc2VhcmNoTW9kZWw6IFJlZjxzdHJpbmc+LFxuICBvcHRzOiBVc2VBdXRvQ29tcGxldGVTZWFyY2hPcHRpb25zPFRJdGVtPixcbik6IFVzZUF1dG9Db21wbGV0ZVNlYXJjaFJldHVybjxUSXRlbT4ge1xuICBjb25zdCBpbnRlcm5hbFNlYXJjaCA9IHJlZjxzdHJpbmc+KCcnKTtcbiAgY29uc3QgZGVib3VuY2VkSW50ZXJuYWxTZWFyY2ggPSByZWZEZWJvdW5jZWQoaW50ZXJuYWxTZWFyY2gsIDUwKTtcbiAgY29uc3QganVzdE9wZW5lZCA9IHJlZjxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gTWVtb2l6ZSB0b2tlbiBjb21wdXRhdGlvbiB0byBhdm9pZCByZXBlYXRlZCBzdHJpbmcgcHJvY2Vzc2luZ1xuICBjb25zdCB0b2tlbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgZ2V0Q2FjaGVkVGV4dFRva2VuID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKHRva2VuQ2FjaGUuaGFzKHRleHQpKSB7XG4gICAgICByZXR1cm4gdG9rZW5DYWNoZS5nZXQodGV4dCkhO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IGdldFRleHRUb2tlbih0ZXh0KTtcbiAgICB0b2tlbkNhY2hlLnNldCh0ZXh0LCB0b2tlbik7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9O1xuXG4gIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9IGNvbXB1dGVkPFRJdGVtW10+KCgpID0+IHtcbiAgICBjb25zdCBzZWFyY2ggPSBnZXQoZGVib3VuY2VkSW50ZXJuYWxTZWFyY2gpO1xuICAgIGNvbnN0IG9wdGlvbnNWYWx1ZSA9IGdldChvcHRpb25zKTtcblxuICAgIGNvbnN0IG5vRmlsdGVyID0gZ2V0KG9wdHMubm9GaWx0ZXIpO1xuICAgIGlmIChub0ZpbHRlciB8fCAhc2VhcmNoIHx8IGdldChqdXN0T3BlbmVkKSlcbiAgICAgIHJldHVybiBvcHRpb25zVmFsdWU7XG5cbiAgICBjb25zdCBrZXlBdHRyID0gZ2V0KG9wdHMua2V5QXR0cik7XG4gICAgY29uc3QgdGV4dEF0dHIgPSBnZXQob3B0cy50ZXh0QXR0cik7XG4gICAgY29uc3QgZmlsdGVyID0gZ2V0KG9wdHMuZmlsdGVyKTtcblxuICAgIC8vIENhY2hlIHRoZSBzZWFyY2ggdG9rZW4gb25jZVxuICAgIGNvbnN0IHNlYXJjaFRva2VuID0gZ2V0Q2FjaGVkVGV4dFRva2VuKHNlYXJjaCk7XG5cbiAgICBjb25zdCB1c2VkRmlsdGVyID0gZmlsdGVyIHx8ICgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGtleXdvcmRzOiBzdHJpbmdbXSA9IFtrZXlBdHRyID8gZ2V0Q2FjaGVkVGV4dFRva2VuKChpdGVtIGFzIGFueSlba2V5QXR0cl0pIDogaXRlbS50b1N0cmluZygpXTtcblxuICAgICAgaWYgKHRleHRBdHRyICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JylcbiAgICAgICAga2V5d29yZHMucHVzaChnZXRDYWNoZWRUZXh0VG9rZW4oKGl0ZW0gYXMgYW55KVt0ZXh0QXR0cl0pKTtcblxuICAgICAgcmV0dXJuIGtleXdvcmRzLnNvbWUoa2V5d29yZCA9PiBnZXRDYWNoZWRUZXh0VG9rZW4oa2V5d29yZCkuaW5jbHVkZXMoc2VhcmNoVG9rZW4pKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbHRlcmVkID0gb3B0aW9uc1ZhbHVlLmZpbHRlcihpdGVtID0+IHVzZWRGaWx0ZXIoaXRlbSwgc2VhcmNoKSk7XG5cbiAgICBjb25zdCBjdXN0b21WYWx1ZSA9IGdldChvcHRzLmN1c3RvbVZhbHVlKTtcbiAgICBjb25zdCBoaWRlQ3VzdG9tVmFsdWUgPSBnZXQob3B0cy5oaWRlQ3VzdG9tVmFsdWUpO1xuICAgIGlmICghY3VzdG9tVmFsdWUgfHwgaGlkZUN1c3RvbVZhbHVlIHx8ICFzZWFyY2gpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICB9XG5cbiAgICAvLyBVc2UgYSBtb3JlIGVmZmljaWVudCBjaGVjayBmb3IgY3VzdG9tIHZhbHVlIGluY2x1c2lvblxuICAgIGNvbnN0IGlzQ3VzdG9tVmFsdWVJbmNsdWRlZCA9IGZpbHRlcmVkLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgIGlmICghaXRlbSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbCA9IHRleHRBdHRyID8gKGl0ZW0gYXMgYW55KVt0ZXh0QXR0cl0gOiBpdGVtLnRvU3RyaW5nKCk7XG4gICAgICByZXR1cm4gdmFsID09PSBzZWFyY2g7XG4gICAgfSk7XG5cbiAgICBpZiAoaXNDdXN0b21WYWx1ZUluY2x1ZGVkKSB7XG4gICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt0ZXh0VmFsdWVUb1Byb3BlclZhbHVlKHNlYXJjaCwge1xuICAgICAga2V5QXR0cixcbiAgICAgIHJldHVybk9iamVjdDogZ2V0KG9wdHMucmV0dXJuT2JqZWN0KSxcbiAgICAgIHRleHRBdHRyLFxuICAgIH0pLCAuLi5maWx0ZXJlZF07XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHRleHRWYWx1ZVRvUHJvcGVyVmFsdWUodmFsOiBhbnksIG9wdGlvbnM6IHsga2V5QXR0cj86IGtleW9mIFRJdGVtOyB0ZXh0QXR0cj86IGtleW9mIFRJdGVtOyByZXR1cm5PYmplY3Q/OiBib29sZWFuIH0pOiBUSXRlbSB7XG4gICAgY29uc3QgeyBrZXlBdHRyLCByZXR1cm5PYmplY3QsIHRleHRBdHRyIH0gPSBvcHRpb25zO1xuICAgIGlmICgha2V5QXR0ciB8fCByZXR1cm5PYmplY3QpXG4gICAgICByZXR1cm4gdmFsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIFtrZXlBdHRyXTogdmFsLFxuICAgICAgLi4uKFxuICAgICAgICB0ZXh0QXR0clxuICAgICAgICAgID8geyBbdGV4dEF0dHJdOiB2YWwgfVxuICAgICAgICAgIDoge31cbiAgICAgICksXG4gICAgfSBhcyBUSXRlbTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUludGVybmFsU2VhcmNoKHZhbHVlOiBzdHJpbmcgPSAnJyk6IHZvaWQge1xuICAgIHNldChzZWFyY2hNb2RlbCwgdmFsdWUpO1xuICAgIHNldChpbnRlcm5hbFNlYXJjaCwgdmFsdWUpO1xuICB9XG5cbiAgd2F0Y2goc2VhcmNoTW9kZWwsIChzZWFyY2gpID0+IHtcbiAgICBzZXQoaW50ZXJuYWxTZWFyY2gsIHNlYXJjaCk7XG4gIH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXG4gIC8vIENsZWFyIHRva2VuIGNhY2hlIHdoZW4gY29tcG9uZW50IHVubW91bnRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICB0b2tlbkNhY2hlLmNsZWFyKCk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZGVib3VuY2VkSW50ZXJuYWxTZWFyY2gsXG4gICAgZmlsdGVyZWRPcHRpb25zLFxuICAgIGludGVybmFsU2VhcmNoLFxuICAgIGp1c3RPcGVuZWQsXG4gICAgdGV4dFZhbHVlVG9Qcm9wZXJWYWx1ZTogKHZhbDogYW55LCByZXR1cm5PYmplY3RPdmVycmlkZTogYm9vbGVhbiA9IGZhbHNlKSA9PiB0ZXh0VmFsdWVUb1Byb3BlclZhbHVlKHZhbCwge1xuICAgICAga2V5QXR0cjogZ2V0KG9wdHMua2V5QXR0ciksXG4gICAgICByZXR1cm5PYmplY3Q6IHJldHVybk9iamVjdE92ZXJyaWRlIHx8IGdldChvcHRzLnJldHVybk9iamVjdCksXG4gICAgICB0ZXh0QXR0cjogZ2V0KG9wdHMudGV4dEF0dHIpLFxuICAgIH0pLFxuICAgIHVwZGF0ZUludGVybmFsU2VhcmNoLFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBDb21wdXRlZFJlZiwgTWF5YmVSZWYsIFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ0B2dWV1c2Uvc2hhcmVkJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJ0AvdXRpbHMvYXNzZXJ0JztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VBdXRvQ29tcGxldGVWYWx1ZU9wdGlvbnM8VEl0ZW0+IHtcbiAga2V5QXR0cj86IE1heWJlUmVmPGtleW9mIFRJdGVtIHwgdW5kZWZpbmVkPjtcbiAgcmV0dXJuT2JqZWN0PzogTWF5YmVSZWY8Ym9vbGVhbj47XG4gIGN1c3RvbVZhbHVlPzogTWF5YmVSZWY8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQXV0b0NvbXBsZXRlVmFsdWVSZXR1cm48VEl0ZW0+IHtcbiAgdmFsdWU6IENvbXB1dGVkUmVmPFRJdGVtW10+O1xuICBzZXRTZWxlY3RlZDogKHNlbGVjdGVkOiBUSXRlbVtdKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUF1dG9Db21wbGV0ZVZhbHVlRGVwczxUSXRlbT4ge1xuICBnZXRJZGVudGlmaWVyOiAoaXRlbTogVEl0ZW0pID0+IGFueTtcbiAgZ2V0VGV4dDogKGl0ZW06IFRJdGVtKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRleHRWYWx1ZVRvUHJvcGVyVmFsdWU6ICh2YWw6IGFueSwgcmV0dXJuT2JqZWN0PzogYm9vbGVhbikgPT4gVEl0ZW07XG4gIHNob3VsZEFwcGx5VmFsdWVBc1NlYXJjaDogTWF5YmVSZWY8Ym9vbGVhbj47XG4gIGlzT3BlbjogTWF5YmVSZWY8Ym9vbGVhbj47XG4gIHVwZGF0ZUludGVybmFsU2VhcmNoOiAodmFsdWU/OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRvQ29tcGxldGVWYWx1ZTxUVmFsdWUsIFRJdGVtPihcbiAgbW9kZWxWYWx1ZTogUmVmPFRWYWx1ZSB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IE1heWJlUmVmPFRJdGVtW10+LFxuICBvcHRzOiBVc2VBdXRvQ29tcGxldGVWYWx1ZU9wdGlvbnM8VEl0ZW0+LFxuICBkZXBzOiBVc2VBdXRvQ29tcGxldGVWYWx1ZURlcHM8VEl0ZW0+LFxuKTogVXNlQXV0b0NvbXBsZXRlVmFsdWVSZXR1cm48VEl0ZW0+IHtcbiAgY29uc3QgbXVsdGlwbGUgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiBBcnJheS5pc0FycmF5KGdldChtb2RlbFZhbHVlKSkpO1xuXG4gIC8vIENyZWF0ZSBtYXBzIGZvciBPKDEpIGxvb2t1cCBwZXJmb3JtYW5jZVxuICBjb25zdCBvcHRpb25zTWFwID0gY29tcHV0ZWQ8TWFwPGFueSwgVEl0ZW0+PigoKSA9PiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxhbnksIFRJdGVtPigpO1xuICAgIGNvbnN0IG9wdGlvbnNEYXRhID0gZ2V0KG9wdGlvbnMpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBvcHRpb25zRGF0YSkge1xuICAgICAgbWFwLnNldChkZXBzLmdldElkZW50aWZpZXIoaXRlbSksIGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9KTtcblxuICBmdW5jdGlvbiBjb252ZXJ0TW9kZWxWYWx1ZVRvQXJyYXkobW9kZWxWYWx1ZURhdGE6IFRWYWx1ZSB8IHVuZGVmaW5lZCk6IGFueVtdIHtcbiAgICBpZiAoIW1vZGVsVmFsdWVEYXRhKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG1vZGVsVmFsdWVEYXRhKSA/IG1vZGVsVmFsdWVEYXRhIDogW21vZGVsVmFsdWVEYXRhXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlc0J5T3B0aW9ucyhcbiAgICB2YWx1ZUFycmF5OiBhbnlbXSxcbiAgICBvcHRpb25zTWFwRGF0YTogTWFwPGFueSwgVEl0ZW0+LFxuICAgIGN1c3RvbVZhbHVlOiBib29sZWFuLFxuICAgIHJldHVybk9iamVjdDogYm9vbGVhbixcbiAgKTogVEl0ZW1bXSB7XG4gICAgY29uc3QgZmlsdGVyZWQ6IFRJdGVtW10gPSBbXTtcbiAgICBmaWx0ZXJlZC5sZW5ndGggPSB2YWx1ZUFycmF5Lmxlbmd0aDsgLy8gUHJlLWFsbG9jYXRlIGFycmF5IHNpemVcbiAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVBcnJheSkge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGRlcHMuZ2V0SWRlbnRpZmllcih2YWwpO1xuICAgICAgY29uc3QgaW5PcHRpb25zID0gb3B0aW9uc01hcERhdGEuZ2V0KGlkZW50aWZpZXIpO1xuXG4gICAgICBpZiAoaW5PcHRpb25zKSB7XG4gICAgICAgIGZpbHRlcmVkW2luZGV4KytdID0gaW5PcHRpb25zO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoY3VzdG9tVmFsdWUpIHtcbiAgICAgICAgZmlsdGVyZWRbaW5kZXgrK10gPSBkZXBzLnRleHRWYWx1ZVRvUHJvcGVyVmFsdWUodmFsLCByZXR1cm5PYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpbHRlcmVkLmxlbmd0aCA9IGluZGV4OyAvLyBUcmltIHRvIGFjdHVhbCBzaXplXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzQnlJZGVudGlmaWVyKFxuICAgIHZhbHVlQXJyYXk6IGFueVtdLFxuICAgIG9wdGlvbnNNYXBEYXRhOiBNYXA8YW55LCBUSXRlbT4sXG4gICAgY3VzdG9tVmFsdWU6IGJvb2xlYW4sXG4gICAgcmV0dXJuT2JqZWN0OiBib29sZWFuLFxuICApOiBUSXRlbVtdIHtcbiAgICBjb25zdCBmaWx0ZXJlZDogVEl0ZW1bXSA9IFtdO1xuICAgIGZpbHRlcmVkLmxlbmd0aCA9IHZhbHVlQXJyYXkubGVuZ3RoOyAvLyBQcmUtYWxsb2NhdGUgYXJyYXkgc2l6ZVxuICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZUFycmF5KSB7XG4gICAgICBjb25zdCBpbk9wdGlvbnMgPSBvcHRpb25zTWFwRGF0YS5nZXQodmFsKTtcblxuICAgICAgaWYgKGluT3B0aW9ucykge1xuICAgICAgICBmaWx0ZXJlZFtpbmRleCsrXSA9IGluT3B0aW9ucztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGN1c3RvbVZhbHVlKSB7XG4gICAgICAgIGZpbHRlcmVkW2luZGV4KytdID0gZGVwcy50ZXh0VmFsdWVUb1Byb3BlclZhbHVlKHZhbCwgcmV0dXJuT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWx0ZXJlZC5sZW5ndGggPSBpbmRleDsgLy8gVHJpbSB0byBhY3R1YWwgc2l6ZVxuICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NSZXR1cm5PYmplY3RWYWx1ZShcbiAgICBtb2RlbFZhbHVlRGF0YTogVFZhbHVlIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnNNYXBEYXRhOiBNYXA8YW55LCBUSXRlbT4sXG4gICAgcmV0dXJuT2JqZWN0OiBib29sZWFuLFxuICAgIGN1c3RvbVZhbHVlOiBib29sZWFuLFxuICAgIHNob3VsZFVwZGF0ZUludGVybmFsU2VhcmNoOiBib29sZWFuLFxuICApOiBUSXRlbVtdIHtcbiAgICBjb25zdCBtdWx0aXBsZVZhbHVlID0gQXJyYXkuaXNBcnJheShtb2RlbFZhbHVlRGF0YSk7XG4gICAgY29uc3QgdmFsdWVBcnJheSA9IGNvbnZlcnRNb2RlbFZhbHVlVG9BcnJheShtb2RlbFZhbHVlRGF0YSk7XG4gICAgY29uc3QgZmlsdGVyZWQgPSBmaWx0ZXJWYWx1ZXNCeU9wdGlvbnModmFsdWVBcnJheSwgb3B0aW9uc01hcERhdGEsIGN1c3RvbVZhbHVlLCByZXR1cm5PYmplY3QpO1xuXG4gICAgaWYgKG11bHRpcGxlVmFsdWUgfHwgZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlSW50ZXJuYWxTZWFyY2gpXG4gICAgICAgIGRlcHMudXBkYXRlSW50ZXJuYWxTZWFyY2goKTtcbiAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICB9XG5cbiAgICBjb25zdCB2YWwgPSBmaWx0ZXJlZFswXTtcbiAgICBhc3NlcnQodmFsKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlSW50ZXJuYWxTZWFyY2gpXG4gICAgICBkZXBzLnVwZGF0ZUludGVybmFsU2VhcmNoKGRlcHMuZ2V0VGV4dCh2YWwpKTtcbiAgICByZXR1cm4gW3ZhbF07XG4gIH1cblxuICBmdW5jdGlvbiBwcm9jZXNzU3RhbmRhcmRWYWx1ZShcbiAgICBtb2RlbFZhbHVlRGF0YTogVFZhbHVlIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnNNYXBEYXRhOiBNYXA8YW55LCBUSXRlbT4sXG4gICAgcmV0dXJuT2JqZWN0OiBib29sZWFuLFxuICAgIGN1c3RvbVZhbHVlOiBib29sZWFuLFxuICAgIHNob3VsZFVwZGF0ZUludGVybmFsU2VhcmNoOiBib29sZWFuLFxuICApOiBUSXRlbVtdIHtcbiAgICBjb25zdCB2YWx1ZUFycmF5ID0gY29udmVydE1vZGVsVmFsdWVUb0FycmF5KG1vZGVsVmFsdWVEYXRhKTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGZpbHRlclZhbHVlc0J5SWRlbnRpZmllcih2YWx1ZUFycmF5LCBvcHRpb25zTWFwRGF0YSwgY3VzdG9tVmFsdWUsIHJldHVybk9iamVjdCk7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlSW50ZXJuYWxTZWFyY2gpIHtcbiAgICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGZpbHRlcmVkWzBdO1xuICAgICAgICBhc3NlcnQoZmlyc3RJdGVtKTtcbiAgICAgICAgZGVwcy51cGRhdGVJbnRlcm5hbFNlYXJjaChkZXBzLmdldFRleHQoZmlyc3RJdGVtKSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZGVwcy51cGRhdGVJbnRlcm5hbFNlYXJjaCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVXBkYXRlTW9kZWxWYWx1ZSh2YWx1ZTogVFZhbHVlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgc2V0KG1vZGVsVmFsdWUsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFNlbGVjdGVkKHNlbGVjdGVkOiBUSXRlbVtdKTogdm9pZCB7XG4gICAgY29uc3Qga2V5QXR0ciA9IGdldChvcHRzLmtleUF0dHIpO1xuICAgIGNvbnN0IHJldHVybk9iamVjdCA9IGdldChvcHRzLnJldHVybk9iamVjdCk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0ga2V5QXR0ciAmJiAhcmV0dXJuT2JqZWN0ID8gc2VsZWN0ZWQubWFwKGl0ZW0gPT4gaXRlbVtrZXlBdHRyXSkgOiBzZWxlY3RlZDtcblxuICAgIGlmIChnZXQobXVsdGlwbGUpKVxuICAgICAgcmV0dXJuIG9uVXBkYXRlTW9kZWxWYWx1ZShzZWxlY3Rpb24gYXMgVFZhbHVlKTtcblxuICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIG9uVXBkYXRlTW9kZWxWYWx1ZSh1bmRlZmluZWQpO1xuXG4gICAgcmV0dXJuIG9uVXBkYXRlTW9kZWxWYWx1ZShzZWxlY3Rpb25bMF0gYXMgVFZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gY29tcHV0ZWQ8VEl0ZW1bXT4oe1xuICAgIGdldDogKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxWYWx1ZURhdGEgPSBnZXQobW9kZWxWYWx1ZSk7XG4gICAgICBjb25zdCBrZXlBdHRyID0gZ2V0KG9wdHMua2V5QXR0cik7XG4gICAgICBjb25zdCByZXR1cm5PYmplY3QgPSBnZXQob3B0cy5yZXR1cm5PYmplY3QpID8/IGZhbHNlO1xuICAgICAgY29uc3QgY3VzdG9tVmFsdWUgPSBnZXQob3B0cy5jdXN0b21WYWx1ZSkgPz8gZmFsc2U7XG4gICAgICBjb25zdCBvcHRpb25zTWFwRGF0YSA9IGdldChvcHRpb25zTWFwKTtcbiAgICAgIGNvbnN0IHNob3VsZFVwZGF0ZUludGVybmFsU2VhcmNoID0gZ2V0KGRlcHMuc2hvdWxkQXBwbHlWYWx1ZUFzU2VhcmNoKSAmJiAhZ2V0KGRlcHMuaXNPcGVuKTtcblxuICAgICAgaWYgKGtleUF0dHIgJiYgcmV0dXJuT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuT2JqZWN0VmFsdWUoXG4gICAgICAgICAgbW9kZWxWYWx1ZURhdGEsXG4gICAgICAgICAgb3B0aW9uc01hcERhdGEsXG4gICAgICAgICAgcmV0dXJuT2JqZWN0LFxuICAgICAgICAgIGN1c3RvbVZhbHVlLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUludGVybmFsU2VhcmNoLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvY2Vzc1N0YW5kYXJkVmFsdWUoXG4gICAgICAgIG1vZGVsVmFsdWVEYXRhLFxuICAgICAgICBvcHRpb25zTWFwRGF0YSxcbiAgICAgICAgcmV0dXJuT2JqZWN0LFxuICAgICAgICBjdXN0b21WYWx1ZSxcbiAgICAgICAgc2hvdWxkVXBkYXRlSW50ZXJuYWxTZWFyY2gsXG4gICAgICApO1xuICAgIH0sXG4gICAgc2V0OiAoc2VsZWN0ZWQ6IFRJdGVtW10pOiB2b2lkID0+IHtcbiAgICAgIHNldFNlbGVjdGVkKHNlbGVjdGVkKTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHNldFNlbGVjdGVkLFxuICAgIHZhbHVlLFxuICB9O1xufVxuIiwiaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAndnVlJztcblxuZXhwb3J0IGNvbnN0IFJVSV9JMThOX0lOSkVDVElPTl9LRVkgPSBTeW1ib2woJ3J1aTppMThuJyk7XG5cbmludGVyZmFjZSBJMThuUHJvdmlkZXIge1xuICB0OiB7XG4gICAgKGtleTogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nO1xuICAgIChrZXk6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1aUkxOG5Qcm92aWRlciB7XG4gIHQ6IChrZXk6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gc3RyaW5nO1xuICB0ZTogKGtleTogc3RyaW5nKSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUnVpSThuKCk6IEkxOG5Qcm92aWRlciB7XG4gIGNvbnN0IGkxOG5Qcm92aWRlciA9IGluamVjdDxSdWlJMThuUHJvdmlkZXIgfCB1bmRlZmluZWQ+KFJVSV9JMThOX0lOSkVDVElPTl9LRVksIHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdHJhbnNsYXRlID0gKGtleTogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoaTE4blByb3ZpZGVyPy50ZShrZXkpKSB7XG4gICAgICByZXR1cm4gaTE4blByb3ZpZGVyPy50KGtleSwgcGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICBjb25zdCB0ID0gKFxuICAgIGtleTogc3RyaW5nLFxuICAgIHBhcmFtc09yRmFsbGJhY2s/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgc3RyaW5nLFxuICAgIGZhbGxiYWNrPzogc3RyaW5nLFxuICApOiBzdHJpbmcgPT4ge1xuICAgIGlmICh0eXBlb2YgcGFyYW1zT3JGYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGUoa2V5KSA/PyBwYXJhbXNPckZhbGxiYWNrID8/IGtleTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdHJhbnNsYXRlKGtleSwgcGFyYW1zT3JGYWxsYmFjaykgPz8gZmFsbGJhY2sgPz8ga2V5O1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4geyB0IH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IEluamVjdGlvbktleSwgTWF5YmVSZWYsIFJlZiB9IGZyb20gJ3Z1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVPcHRpb25zIHtcbiAgaXRlbXNQZXJQYWdlOiBSZWY8bnVtYmVyPjtcbiAgZ2xvYmFsSXRlbXNQZXJQYWdlOiBNYXliZVJlZjxib29sZWFuPjtcbiAgbGltaXRzOiBNYXliZVJlZjxudW1iZXJbXT47XG4gIHN0aWNreU9mZnNldDogTWF5YmVSZWY8bnVtYmVyPjtcbn1cblxuZXhwb3J0IGNvbnN0IFRhYmxlU3ltYm9sOiBJbmplY3Rpb25LZXk8VGFibGVPcHRpb25zPiA9IFN5bWJvbC5mb3IoJ3J1aTp0YWJsZScpO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFibGVEZWZhdWx0cyhvcHRpb25zPzogUGFydGlhbDxUYWJsZU9wdGlvbnM+KTogVGFibGVPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBnbG9iYWxJdGVtc1BlclBhZ2U6IGZhbHNlLFxuICAgIGl0ZW1zUGVyUGFnZTogcmVmKDEwKSxcbiAgICBsaW1pdHM6IFsxMCwgMjUsIDUwLCAxMDBdLFxuICAgIHN0aWNreU9mZnNldDogcmVmKDApLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUYWJsZSgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGluamVjdChUYWJsZVN5bWJvbCk7XG5cbiAgaWYgKCFvcHRpb25zKVxuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcnVpIHRhYmxlIG9wdGlvbnMgaW5qZWN0aW9uJyk7XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJ0AvdXRpbHMvYXNzZXJ0JztcblxuLyoqXG4gKiBTZXR1cCBzdGlja3kgdGFibGUgaGVhZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdGlja3lUYWJsZUhlYWRlcihzdGlja3k6IE1heWJlUmVmPGJvb2xlYW4+ID0gcmVmKGZhbHNlKSwgb2Zmc2V0VG9wPzogTWF5YmVSZWY8bnVtYmVyPikge1xuICBjb25zdCB0YWJsZTogUmVmPEhUTUxUYWJsZUVsZW1lbnQgfCBudWxsPiA9IHJlZihudWxsKTtcbiAgY29uc3QgdGFibGVTY3JvbGxlcjogUmVmPEhUTUxFbGVtZW50IHwgbnVsbD4gPSByZWYobnVsbCk7XG4gIGNvbnN0IHN0aWNrOiBSZWY8Ym9vbGVhbj4gPSByZWYoZmFsc2UpO1xuICBjb25zdCBib3JkZXJQcmVjaXNpb24gPSAtMC41O1xuICBjb25zdCBzZWxlY3RvcnMgPSB7XG4gICAgaGVhZDogJzpzY29wZSA+IHRoZWFkW2RhdGEtaWQ9aGVhZC1tYWluXScsXG4gICAgaGVhZENsb25lOiAnOnNjb3BlID4gdGhlYWRbZGF0YS1pZD1oZWFkLWNsb25lXScsXG4gICAgcm93OiAnOnNjb3BlID4gdGJvZHkgPiB0cjpub3QoW2hpZGRlbl0pJyxcbiAgICB0aDogJzpzY29wZSA+IHRoJyxcbiAgfTtcblxuICBjb25zdCB3YXRjaENlbGxXaWR0aCA9ICgpID0+IHtcbiAgICBjb25zdCByb290ID0gZ2V0KHRhYmxlKTtcblxuICAgIGlmICghZ2V0KHN0aWNreSkgfHwgIXJvb3QpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCB0aGVhZENsb25lOiBIVE1MSGVhZEVsZW1lbnQgfCBudWxsID0gcm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgYCR7c2VsZWN0b3JzLmhlYWRDbG9uZX0gPiB0cmAsXG4gICAgKTtcblxuICAgIGNvbnN0IGhlYWQ6IEhUTUxIZWFkRWxlbWVudCB8IG51bGxcbiAgICAgID0gcm9vdC5xdWVyeVNlbGVjdG9yKGAke3NlbGVjdG9ycy5oZWFkfSA+IHRyYCkgPz8gbnVsbDtcblxuICAgIGNvbnN0IG9ic2VydmVDaGlsZFRoID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uczogTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQgPSBoZWFkPy5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICBzZWxlY3RvcnMudGgsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBjbG9uZWRDb2x1bW5zOiBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PiB8IHVuZGVmaW5lZFxuICAgICAgICA9IHRoZWFkQ2xvbmU/LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzLnRoKTtcblxuICAgICAgY2xvbmVkQ29sdW1ucz8uZm9yRWFjaCgodGg6IEhUTUxFbGVtZW50LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgdXNlUmVzaXplT2JzZXJ2ZXIodGgsIChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzWzBdO1xuICAgICAgICAgIGFzc2VydChlbnRyeSk7XG4gICAgICAgICAgY29uc3QgY2VsbFJlY3QgPSBlbnRyeS50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1ucz8uaXRlbShpKTtcbiAgICAgICAgICBpZiAoY29sdW1uKVxuICAgICAgICAgICAgY29sdW1uLnN0eWxlLndpZHRoID0gYCR7Y2VsbFJlY3Qud2lkdGh9cHhgO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB1c2VNdXRhdGlvbk9ic2VydmVyKHRoZWFkQ2xvbmUsIChtdXRhdGlvbnNMaXN0KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uc0xpc3QpIHtcbiAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnIHx8IG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJylcbiAgICAgICAgICBvYnNlcnZlQ2hpbGRUaCgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbCBzZXR1cCB0byBvYnNlcnZlIHRoZSBleGlzdGluZyB0aCBlbGVtZW50c1xuICAgIG9ic2VydmVDaGlsZFRoKCk7XG4gIH07XG5cbiAgY29uc3QgdG9nZ2xlU3RpY2t5Q2xhc3MgPSAoKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IGdldCh0YWJsZSk7XG5cbiAgICBpZiAoIWdldChzdGlja3kpIHx8ICFyb290KVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGhlYWRDbG9uZTogSFRNTEhlYWRFbGVtZW50IHwgbnVsbCA9IHJvb3QucXVlcnlTZWxlY3RvcihcbiAgICAgIHNlbGVjdG9ycy5oZWFkQ2xvbmUsXG4gICAgKTtcblxuICAgIGNvbnN0IGNsb25lZFJlY3Q6IERPTVJlY3QgfCB1bmRlZmluZWQgPSB0aGVhZENsb25lPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IGhlYWQ6IEhUTUxIZWFkRWxlbWVudCB8IG51bGxcbiAgICAgID0gcm9vdC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9ycy5oZWFkKSA/PyBudWxsO1xuXG4gICAgY29uc3QgaGVhZFJlY3Q6IERPTVJlY3QgfCB1bmRlZmluZWQgPSBoZWFkPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmICghcmVjdCB8fCAhY2xvbmVkUmVjdCB8fCAhaGVhZCB8fCAhdGhlYWRDbG9uZSB8fCAhaGVhZFJlY3QpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCB7XG4gICAgICBoZWlnaHQ6IHRoZWFkSGVpZ2h0LFxuICAgICAgbGVmdDogdGhlYWRMZWZ0LFxuICAgICAgd2lkdGg6IHRoZWFkV2lkdGgsXG4gICAgfSA9IGNsb25lZFJlY3Q7XG5cbiAgICBjb25zdCB7IGJvdHRvbTogdGFibGVCb3R0b20sIHRvcDogdGFibGVUb3AgfSA9IHJlY3Q7XG4gICAgY29uc3QgdG9wID0gZ2V0KG9mZnNldFRvcCkgPz8gMDtcblxuICAgIGhlYWQuc3R5bGUud2lkdGggPSBgJHt0aGVhZFdpZHRofXB4YDtcblxuICAgIGNvbnN0IHJvd3MgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzLnJvdyk7XG5cbiAgICBjb25zdCBsYXN0Um93UmVjdDogRE9NUmVjdCB8IHVuZGVmaW5lZCA9IHJvd3NcbiAgICAgIC5pdGVtKHJvd3MubGVuZ3RoIC0gMSlcbiAgICAgID8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBpZiAodGFibGVUb3AgPD0gdG9wICYmIHRhYmxlQm90dG9tID4gdG9wICYmIHJvd3MubGVuZ3RoID4gMSkge1xuICAgICAgc2V0KHN0aWNrLCB0cnVlKTtcbiAgICAgIGhlYWQuc3R5bGUubGVmdCA9IGAke3RoZWFkTGVmdCArIGJvcmRlclByZWNpc2lvbn1weGA7XG5cbiAgICAgIGNvbnN0IGxhc3RSb3dIZWlnaHQgPSBsYXN0Um93UmVjdD8uaGVpZ2h0ID8/IDA7XG4gICAgICBpZiAodGFibGVCb3R0b20gPD0gbGFzdFJvd0hlaWdodCArIHRoZWFkSGVpZ2h0ICsgdG9wKVxuICAgICAgICBoZWFkLnN0eWxlLnRvcCA9IGAke3RhYmxlQm90dG9tIC0gbGFzdFJvd0hlaWdodCAtIHRoZWFkSGVpZ2h0fXB4YDtcbiAgICAgIGVsc2VcbiAgICAgICAgaGVhZC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHNldChzdGljaywgZmFsc2UpO1xuICAgICAgaGVhZC5zdHlsZS5sZWZ0ID0gYCR7Ym9yZGVyUHJlY2lzaW9ufXB4YDtcbiAgICAgIGhlYWQuc3R5bGUudG9wID0gJzAnO1xuICAgIH1cbiAgfTtcblxuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHRvZ2dsZVN0aWNreUNsYXNzKCk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YWJsZVNjcm9sbGVyLCAnc2Nyb2xsJywgdG9nZ2xlU3RpY2t5Q2xhc3MpO1xuICAgIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQuYm9keSwgJ3Njcm9sbCcsIHRvZ2dsZVN0aWNreUNsYXNzKTtcbiAgICB1c2VFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIHRvZ2dsZVN0aWNreUNsYXNzKTtcbiAgICB3YXRjaENlbGxXaWR0aCgpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHN0aWNrLFxuICAgIHRhYmxlLFxuICAgIHRhYmxlU2Nyb2xsZXIsXG4gIH07XG59XG4iXSwibmFtZXMiOlsidXNlQnJlYWtwb2ludCIsIndpZHRoIiwidXNlV2luZG93U2l6ZSIsImJyZWFrcG9pbnRMaXN0IiwiYnJlYWtwb2ludHNUYWlsd2luZCIsImJyZWFrcG9pbnRzIiwidXNlQnJlYWtwb2ludHMiLCJnZXRLZXlzIiwibGlzdCIsInJhd1NpemVzIiwiYnJlYWtwb2ludCIsImluZGV4IiwibmV4dEJyZWFrcG9pbnQiLCJhc3NlcnQiLCJzaXplcyIsInZhbHVlIiwiY2FtZWxDYXNlIiwic2l6ZXNVcCIsInNpemVzRG93biIsIm5hbWUiLCJjb21wdXRlZCIsIml0ZW0iLCJnZXQiLCJyZXF1aXJlZEljb25zIiwiTHVDaGV2cm9uc1VwRG93biIsIkx1RWxsaXBzaXMiLCJMdVRyaWFuZ2xlQWxlcnQiLCJMdVgiLCJMdUluZm8iLCJMdUFycm93VXAiLCJMdUFycm93RG93biIsIkx1QXJyb3dMZWZ0IiwiTHVBcnJvd1JpZ2h0IiwiTHVDaGV2cm9uVXAiLCJMdUNoZXZyb25Eb3duIiwiTHVDaGV2cm9uTGVmdCIsIkx1Q2hldnJvblJpZ2h0IiwiTHVDaGV2cm9uc0xlZnQiLCJMdUNoZXZyb25zUmlnaHQiLCJMdUNpcmNsZUFsZXJ0IiwiTHVFeWUiLCJMdUV5ZU9mZiIsIkx1Q2hlY2siLCJMdUNpcmNsZVgiLCJMdUNpcmNsZUNoZWNrIiwiTHVDaGVja2JveEJsYW5rIiwiTHVDaGVja2JveEZpbGwiLCJMdUNoZWNrYm94SW5kZXRlcm1pbmF0ZUZpbGwiLCJMdUNoZWNrYm94QmxhbmtDaXJjbGUiLCJMdUNoZWNrYm94QmxhbmtDaXJjbGVGaWxsIiwiTHVSYWRpb0J1dHRvbkZpbGwiLCJMdUNsb2NrIiwiSWNvbnNTeW1ib2wiLCJjcmVhdGVJY29uRGVmYXVsdHMiLCJvcHRpb25zIiwiaWNvbnNUb0FkZCIsImNvbXBvbmVudHMiLCJ1c2VJY29ucyIsImljb25zIiwiaW5qZWN0IiwiY29uZmlnIiwicmVmIiwiZGVmYXVsdFRoZW1lIiwidXNlUm90a2lUaGVtZSIsImNyZWF0ZVNoYXJlZENvbXBvc2FibGUiLCJzdGF0ZSIsInN0b3JlIiwidXNlQ29sb3JNb2RlIiwiYXR0cmlidXRlU3RhdGUiLCJ3YXRjaCIsIm5ld1N0YXRlIiwic2V0IiwiaXNBdXRvQ29udHJvbGxlZCIsIlRoZW1lTW9kZSIsImlzTGlnaHQiLCJpc0RhcmsiLCJ0aGVtZSIsInN3aXRjaFRoZW1lU2NoZW1lIiwibW9kZSIsInRvZ2dsZVRoZW1lTW9kZSIsInNldFRoZW1lQ29uZmlnIiwibmV3Q29uZmlnIiwic3R5bGVWYXJpYWJsZXMiLCJjb250ZXh0IiwiY29udGV4dE9iamVjdCIsInJvb3RTdHlsZSIsInZhcmlhYmxlTmFtZSIsInVzZVRpbWVvdXRNYW5hZ2VyIiwidGltZW91dCIsImNsZWFyIiwiY2FsbGJhY2siLCJkZWxheSIsIkRFRkFVTFRfUE9QUEVSX09QVElPTlMiLCJ1c2VQb3BwZXIiLCJkaXNhYmxlZCIsIm9wZW5EZWxheSIsImNsb3NlRGVsYXkiLCJ2aXJ0dWFsUmVmZXJlbmNlIiwicmVmZXJlbmNlIiwicG9wcGVyIiwiaW5zdGFuY2UiLCJvcGVuIiwicG9wcGVyRW50ZXIiLCJsZWF2ZVBlbmRpbmciLCJvcGVuVGltZW91dE1hbmFnZXIiLCJjbG9zZVRpbWVvdXRNYW5hZ2VyIiwib25Qb3BwZXJMZWF2ZSIsInVwZGF0ZVBvcHBlciIsIm9uT3BlbiIsImltbWVkaWF0ZSIsIm9uQ2xvc2UiLCJvbkxlYXZlUGVuZGluZyIsIm1vZGlmaWVycyIsImFkYXB0aXZlIiwiZ3B1QWNjZWxlcmF0aW9uIiwibG9ja2VkIiwib2Zmc2V0RGlzdGFuY2UiLCJvZmZzZXRTa2lkIiwib3ZlcmZsb3dQYWRkaW5nIiwicmVzaXplIiwic2Nyb2xsIiwicG9wcGVyQ29uZmlnIiwicGxhY2VtZW50Iiwic3RyYXRlZ3kiLCJnZXRWYWxpZEVsZW1lbnRzIiwicG9wcGVyRWwiLCJ1bnJlZkVsZW1lbnQiLCJyZWZlcmVuY2VFbCIsImluaXRpYWxpemVQb3BwZXIiLCJvbkludmFsaWRhdGUiLCJlbGVtZW50cyIsImNyZWF0ZVBvcHBlciIsInVzZVJlc2l6ZU9ic2VydmVyIiwiaXNEZWZpbmVkIiwib25Nb3VudGVkIiwid2F0Y2hFZmZlY3QiLCJ1c2VEcm9wZG93bk9wdGlvblByb3BlcnR5Iiwia2V5QXR0ciIsInRleHRBdHRyIiwiZ2V0VGV4dCIsImdldElkZW50aWZpZXIiLCJ1c2VEcm9wZG93bk1lbnUiLCJhcHBlbmRXaWR0aCIsImF1dG9Gb2N1cyIsImF1dG9TZWxlY3RGaXJzdCIsImRlbnNlIiwiaGlkZVNlbGVjdGVkIiwiaXRlbUhlaWdodCIsIm1lbnVSZWYiLCJhbGxPcHRpb25zIiwib3ZlcnNjYW4iLCJwcmVwZW5kV2lkdGgiLCJzZXRWYWx1ZSIsImlzQWN0aXZlSXRlbSIsImNvbnRhaW5lclByb3BzIiwic2Nyb2xsVG8iLCJ3cmFwcGVyUHJvcHMiLCJ1c2VWaXJ0dWFsTGlzdCIsInJlbmRlcmVkRGF0YSIsInVzZUFycmF5TWFwIiwiZGF0YSIsIl9pbmRleCIsImlzT3BlbiIsInZhbHVlS2V5Iiwic2VsZWN0ZWQiLCJoaWdobGlnaHRlZEluZGV4IiwibWVudVdpZHRoIiwid2lkdGhzIiwibWF4V2lkdGgiLCJwYWRkaW5nWCIsImZvbnRNdWx0aXBsaWVyIiwib3B0aW9uIiwibGVuZ3RoIiwiZGlmZmVyZW5jZSIsImNvbXB1dGVWYWx1ZSIsImFkZGl0aW9uYWxXaWR0aHMiLCJ0b2dnbGUiLCJpdGVtSW5kZXhJblZhbHVlIiwidmFsIiwic2VsZWN0ZWRJdGVtIiwiYWRqdXN0U2Nyb2xsQnlIaWdobGlnaHRlZEluZGV4Iiwic21vb3RoIiwibmV4dFRpY2siLCJoaWdobGlnaHRlZEVsZW0iLCJlbGVtIiwidXBkYXRlT3BlbiIsIndhdGNoT25jZSIsIl8iLCJjdXJyIiwicHJldiIsImhpZ2hsaWdodGVkSW5kZXhWYWwiLCJlbnRyeSIsIl9kYXRhIiwidXAiLCJwb3NpdGlvbiIsInRvdGFsIiwidXNlQXV0b0NvbXBsZXRlRm9jdXMiLCJkZXBzIiwiYW55Rm9jdXNlZCIsImlucHV0Q2xhc3MiLCJpc0ZvY3VzZWQiLCJpc0Rpc2FibGVkIiwic2hvdWxkQXBwbHkiLCJoYXNTZWFyY2giLCJzZXRJbnB1dEZvY3VzIiwib25BY3RpdmF0b3JGb2N1c2VkIiwib25JbnB1dEZvY3VzZWQiLCJ3YXRjaERlYm91bmNlZCIsImZvY3VzZWQiLCJjdXN0b21WYWx1ZSIsImZpbHRlcmVkT3B0aW9ucyIsImludGVybmFsU2VhcmNoIiwidXNlQXV0b0NvbXBsZXRlS2V5Ym9hcmROYXZpZ2F0aW9uIiwiZm9jdXNlZFZhbHVlSW5kZXgiLCJjaGlwRWxlbWVudHNDYWNoZSIsInNldFZhbHVlRm9jdXMiLCJtb3ZlU2VsZWN0ZWRWYWx1ZUhpZ2hsaWdodCIsImV2ZW50IiwibmV4dCIsIm11bHRpcGxlIiwiaW50ZXJuYWxTZWFyY2hWYWx1ZSIsImN1cnJlbnQiLCJvbkVudGVyIiwiaGFzRXhhY3RNYXRjaCIsImhpZ2hsaWdodGVkT3B0aW9uIiwiZm9ybSIsIm9uVGFiIiwib25JbnB1dERlbGV0ZVByZXNzZWQiLCJjYWNoZSIsImFjdGl2ZUNoaXAiLCJlbGVtZW50IiwidXNlQXV0b0NvbXBsZXRlU2VhcmNoIiwic2VhcmNoTW9kZWwiLCJvcHRzIiwiZGVib3VuY2VkSW50ZXJuYWxTZWFyY2giLCJyZWZEZWJvdW5jZWQiLCJqdXN0T3BlbmVkIiwidG9rZW5DYWNoZSIsImdldENhY2hlZFRleHRUb2tlbiIsInRleHQiLCJ0b2tlbiIsImdldFRleHRUb2tlbiIsInNlYXJjaCIsIm9wdGlvbnNWYWx1ZSIsImZpbHRlciIsInNlYXJjaFRva2VuIiwidXNlZEZpbHRlciIsImtleXdvcmRzIiwia2V5d29yZCIsImZpbHRlcmVkIiwiaGlkZUN1c3RvbVZhbHVlIiwidGV4dFZhbHVlVG9Qcm9wZXJWYWx1ZSIsInJldHVybk9iamVjdCIsInVwZGF0ZUludGVybmFsU2VhcmNoIiwib25Vbm1vdW50ZWQiLCJyZXR1cm5PYmplY3RPdmVycmlkZSIsInVzZUF1dG9Db21wbGV0ZVZhbHVlIiwibW9kZWxWYWx1ZSIsIm9wdGlvbnNNYXAiLCJtYXAiLCJvcHRpb25zRGF0YSIsImNvbnZlcnRNb2RlbFZhbHVlVG9BcnJheSIsIm1vZGVsVmFsdWVEYXRhIiwiZmlsdGVyVmFsdWVzQnlPcHRpb25zIiwidmFsdWVBcnJheSIsIm9wdGlvbnNNYXBEYXRhIiwiaWRlbnRpZmllciIsImluT3B0aW9ucyIsImZpbHRlclZhbHVlc0J5SWRlbnRpZmllciIsInByb2Nlc3NSZXR1cm5PYmplY3RWYWx1ZSIsInNob3VsZFVwZGF0ZUludGVybmFsU2VhcmNoIiwibXVsdGlwbGVWYWx1ZSIsInByb2Nlc3NTdGFuZGFyZFZhbHVlIiwiZmlyc3RJdGVtIiwib25VcGRhdGVNb2RlbFZhbHVlIiwic2V0U2VsZWN0ZWQiLCJzZWxlY3Rpb24iLCJSVUlfSTE4Tl9JTkpFQ1RJT05fS0VZIiwidXNlUnVpSThuIiwiaTE4blByb3ZpZGVyIiwidHJhbnNsYXRlIiwia2V5IiwicGFyYW1zIiwicGFyYW1zT3JGYWxsYmFjayIsImZhbGxiYWNrIiwiVGFibGVTeW1ib2wiLCJjcmVhdGVUYWJsZURlZmF1bHRzIiwidXNlVGFibGUiLCJ1c2VTdGlja3lUYWJsZUhlYWRlciIsInN0aWNreSIsIm9mZnNldFRvcCIsInRhYmxlIiwidGFibGVTY3JvbGxlciIsInN0aWNrIiwiYm9yZGVyUHJlY2lzaW9uIiwic2VsZWN0b3JzIiwid2F0Y2hDZWxsV2lkdGgiLCJyb290IiwidGhlYWRDbG9uZSIsImhlYWQiLCJvYnNlcnZlQ2hpbGRUaCIsImNvbHVtbnMiLCJ0aCIsImkiLCJlbnRyaWVzIiwiY2VsbFJlY3QiLCJjb2x1bW4iLCJ1c2VNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zTGlzdCIsIm11dGF0aW9uIiwidG9nZ2xlU3RpY2t5Q2xhc3MiLCJyZWN0IiwiY2xvbmVkUmVjdCIsImhlYWRSZWN0IiwidGhlYWRIZWlnaHQiLCJ0aGVhZExlZnQiLCJ0aGVhZFdpZHRoIiwidGFibGVCb3R0b20iLCJ0YWJsZVRvcCIsInRvcCIsInJvd3MiLCJsYXN0Um93UmVjdCIsImxhc3RSb3dIZWlnaHQiLCJ1c2VFdmVudExpc3RlbmVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFLTyxTQUFTQSxLQUFnQjtBQUM5QixRQUFNLEVBQUUsT0FBQUMsRUFBQSxJQUFVQyxHQUFBLEdBRVpDLElBQWlCO0FBQUEsSUFDckIsSUFBSTtBQUFBLElBQ0osR0FBR0M7QUFBQSxFQUFBLEdBS0NDLElBQWNDLEdBQWVILENBQWMsR0FFM0NJLElBQVUsT0FBTyxNQUVqQkMsSUFBT0QsRUFBUUosQ0FBYyxHQUU3Qk0sSUFBeUNELEVBQUs7QUFBQSxJQUNsRCxDQUFD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