@rotki/ui-library 2.6.4 → 2.8.0

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 (91) 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 +4343 -4260
  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/icons/icons_1.d.ts +1 -1
  70. package/dist/icons/icons_1.es.js +896 -896
  71. package/dist/icons/icons_2.d.ts +1 -1
  72. package/dist/icons/icons_2.es.js +1002 -1002
  73. package/dist/icons/icons_3.d.ts +1 -1
  74. package/dist/icons/icons_3.es.js +982 -982
  75. package/dist/icons/icons_4.d.ts +1 -0
  76. package/dist/icons/icons_4.es.js +358 -354
  77. package/dist/icons/index.d.ts +1 -1
  78. package/dist/icons/index.es.js +1219 -1218
  79. package/dist/{index-cTPqOSmm.js → index-D7l4d7N2.js} +4 -4
  80. package/dist/index.es.js +1221 -1220
  81. package/dist/style.css +1 -1
  82. package/dist/theme/index.es.js +30 -23
  83. package/dist/utils/form-text-detail.d.ts +1 -1
  84. package/dist/utils/index-DJ-ueLCs.js +158 -0
  85. package/dist/vendor-Hqbg5uCG.js +1931 -0
  86. package/dist/web-types.json +59 -39
  87. package/package.json +41 -48
  88. package/README.md +0 -276
  89. package/dist/composables/index-D7DVd8pO.js +0 -717
  90. package/dist/utils/index-D-sENcA8.js +0 -158
  91. package/dist/vendor-X3mXJl51.js +0 -1931
@@ -1,717 +0,0 @@
1
- import { useWindowSize as ne, breakpointsTailwind as oe, useBreakpoints as re, createSharedComposable as ie, useColorMode as se, useResizeObserver as Q, isDefined as ce, unrefElement as Y, useVirtualList as le, useArrayMap as ae, watchOnce as ue, watchDebounced as fe, refDebounced as he, useEventListener as N, useMutationObserver as de } from "@vueuse/core";
2
- import { c as K, a as pe } from "../vendor-X3mXJl51.js";
3
- import { computed as E, inject as X, ref as O, watch as B, onMounted as Z, watchEffect as me, nextTick as z, onUnmounted as ge } from "vue";
4
- import { get as e, set as g } from "@vueuse/shared";
5
- import { LuChevronsUpDown as ye, LuArrowUp as ve, LuArrowDown as be, LuArrowLeft as we, LuArrowRight as Se, LuChevronUp as Ae, LuChevronDown as Ce, LuChevronLeft as xe, LuChevronRight as Ie, LuChevronsLeft as Oe, LuChevronsRight as Le, LuCircleAlert as Te, LuCheck as Ve, LuCircleX as Ee, LuCircleCheck as ke, LuCheckboxBlank as Pe, LuCheckboxFill as De, LuCheckboxIndeterminateFill as je, LuCheckboxBlankCircle as Me, LuCheckboxBlankCircleFill as Fe, LuRadioButtonFill as Re, LuClock as $e } from "../icons/icons_1.es.js";
6
- import { LuEllipsis as Be, LuInfo as He, LuEye as _e, LuEyeOff as ze } from "../icons/icons_2.es.js";
7
- import { LuTriangleAlert as qe, LuX as Ue } from "../icons/icons_4.es.js";
8
- import { c as We, b as Ne } from "../utils/index-D-sENcA8.js";
9
- import { d as ee, T as D } from "../types/index-CN6Ip1GL.js";
10
- function at() {
11
- const { width: r } = ne(), t = {
12
- xs: 0,
13
- ...oe
14
- }, s = re(t), c = Object.keys, f = c(t), C = f.map(
15
- (i, o) => [
16
- i,
17
- o < f.length - 1 ? s.between(i, f[o + 1]) : s[i]
18
- ]
19
- ), p = C.map(([i, o]) => [
20
- K(`is_${i}`),
21
- o
22
- ]), w = f.map((i) => [
23
- K(`is_${i}_and_up`),
24
- s.greaterOrEqual(i)
25
- ]), x = f.map((i) => [
26
- K(`is_${i}_and_down`),
27
- s.smaller(i)
28
- ]), l = E(() => C.find((i) => e(i[1]))?.[0] || "");
29
- return {
30
- ...Object.fromEntries(p),
31
- ...Object.fromEntries(w),
32
- ...Object.fromEntries(x),
33
- name: l,
34
- width: r
35
- };
36
- }
37
- const Ke = [
38
- ye,
39
- Be,
40
- qe,
41
- Ue,
42
- He,
43
- ve,
44
- be,
45
- we,
46
- Se,
47
- Ae,
48
- Ce,
49
- xe,
50
- Ie,
51
- Oe,
52
- Le,
53
- Te,
54
- _e,
55
- ze,
56
- Ve,
57
- Ee,
58
- ke,
59
- Pe,
60
- De,
61
- je,
62
- Me,
63
- Fe,
64
- Re,
65
- $e
66
- ], Xe = Symbol.for("rui:icons");
67
- function ut(r) {
68
- const t = r?.registeredIcons || [];
69
- return {
70
- registeredIcons: {
71
- ...Object.fromEntries(
72
- [
73
- ...Ke,
74
- ...t
75
- ].map(({ components: s, name: c }) => [c, s])
76
- )
77
- }
78
- };
79
- }
80
- function ft() {
81
- const r = X(Xe);
82
- return We(r, "Could not find icons injection"), r;
83
- }
84
- const U = O({ ...ee }), ht = ie(() => {
85
- const { state: r, store: t } = se(), s = E(() => e(t) === D.auto), c = E(() => e(r) === D.light), f = E(() => e(r) === D.dark), C = E(() => e(c) ? e(U).light : e(U).dark), p = (i) => {
86
- g(t, i || D.auto);
87
- }, w = () => {
88
- e(s) ? p(D.light) : e(c) ? p(D.dark) : e(f) && p(D.auto);
89
- }, x = (i) => {
90
- g(U, i);
91
- };
92
- return {
93
- config: U,
94
- init: (i) => {
95
- p(i.mode ?? D.auto), x(i.config ?? { ...ee }), typeof window < "u" && B([c, C], ([o, u]) => {
96
- const h = /* @__PURE__ */ new Map();
97
- Object.entries(u).forEach(([m, v]) => {
98
- h.set(`--rui-${m}-darker`, v.darker), h.set(`--rui-${m}-lighter`, v.lighter), h.set(`--rui-${m}-main`, v.DEFAULT);
99
- });
100
- const n = o ? D.light : D.dark;
101
- h.set("--rui-text-disabled", `var(--rui-${n}-text-disabled)`), h.set("--rui-text-primary", `var(--rui-${n}-text-primary)`), h.set("--rui-text-secondary", `var(--rui-${n}-text-secondary)`);
102
- const y = document.documentElement.style;
103
- h.forEach((m, v) => {
104
- y.setProperty(v, m);
105
- });
106
- }, { immediate: !0 });
107
- },
108
- isAutoControlled: s,
109
- isDark: f,
110
- isLight: c,
111
- setThemeConfig: x,
112
- state: r,
113
- store: t,
114
- switchThemeScheme: p,
115
- theme: C,
116
- toggleThemeMode: w
117
- };
118
- });
119
- function G() {
120
- const r = O(), t = () => {
121
- e(r) && (clearTimeout(e(r)), g(r, void 0));
122
- };
123
- return { clear: t, create: (f, C) => {
124
- t(), g(r, setTimeout(f, C));
125
- }, isActive: () => !!e(r) };
126
- }
127
- const j = {
128
- adaptive: !0,
129
- gpuAcceleration: !0,
130
- locked: !1,
131
- offsetDistance: 8,
132
- offsetSkid: 0,
133
- overflowPadding: 8,
134
- placement: "bottom",
135
- resize: !0,
136
- scroll: !0,
137
- strategy: "absolute"
138
- };
139
- function dt(r, t = O(!1), s = O(0), c = O(0), f) {
140
- const C = O(null), p = O(null), w = O(null), x = O(!1), l = O(!1), i = O(!1), o = G(), u = G(), h = () => {
141
- g(l, !1);
142
- }, n = async () => {
143
- await e(w)?.update();
144
- }, y = (S = !1) => {
145
- e(t) || (u.clear(), g(i, !1), o.isActive() || (g(l, !0), o.create(() => {
146
- g(x, !0);
147
- }, S ? 0 : e(s))));
148
- }, m = (S = !1) => {
149
- e(t) || (o.clear(), u.isActive() || u.create(() => {
150
- e(x) || h(), g(x, !1);
151
- }, S ? 0 : e(c)));
152
- }, v = () => {
153
- g(i, !0);
154
- }, a = E(() => {
155
- const {
156
- adaptive: S = j.adaptive,
157
- gpuAcceleration: I = j.gpuAcceleration,
158
- locked: T = j.locked,
159
- offsetDistance: F = j.offsetDistance,
160
- offsetSkid: R = j.offsetSkid,
161
- overflowPadding: q = j.overflowPadding,
162
- resize: H = j.resize,
163
- scroll: _ = j.scroll
164
- } = e(r);
165
- return [{
166
- enabled: !1,
167
- name: "hide"
168
- }, {
169
- enabled: !T,
170
- name: "flip"
171
- }, {
172
- name: "preventOverflow",
173
- options: {
174
- padding: q
175
- }
176
- }, {
177
- name: "offset",
178
- options: {
179
- offset: [R, F]
180
- }
181
- }, {
182
- name: "computeStyles",
183
- options: {
184
- adaptive: S,
185
- gpuAcceleration: I
186
- }
187
- }, {
188
- name: "eventListeners",
189
- options: {
190
- resize: H,
191
- scroll: _
192
- }
193
- }, {
194
- name: "arrow",
195
- options: {
196
- padding: 4
197
- }
198
- }];
199
- }), b = E(() => {
200
- const {
201
- placement: S = j.placement,
202
- strategy: I = j.strategy
203
- } = e(r);
204
- return {
205
- modifiers: e(a),
206
- placement: S,
207
- strategy: I
208
- };
209
- });
210
- function L() {
211
- if (!e(p) || !e(C) && !e(f))
212
- return null;
213
- const S = Y(p), I = e(f) || Y(C);
214
- return !(S instanceof HTMLElement) || !I ? null : { popperEl: S, referenceEl: I };
215
- }
216
- function V(S) {
217
- const I = L();
218
- if (!I)
219
- return;
220
- const { popperEl: T, referenceEl: F } = I, R = pe(F, T, e(b));
221
- g(w, R), S(R.destroy);
222
- }
223
- return Q([C, p], async () => {
224
- ce(w) && await e(w).update();
225
- }), Z(() => {
226
- me((S) => {
227
- V(S);
228
- });
229
- }), {
230
- instance: w,
231
- leavePending: i,
232
- onClose: m,
233
- onLeavePending: v,
234
- onOpen: y,
235
- onPopperLeave: h,
236
- open: x,
237
- popper: p,
238
- popperEnter: l,
239
- reference: C,
240
- updatePopper: n
241
- };
242
- }
243
- function Je({
244
- keyAttr: r,
245
- textAttr: t
246
- }) {
247
- function s(f) {
248
- return t ? typeof t == "function" ? t(f) : f[t]?.toString() : f?.toString();
249
- }
250
- function c(f) {
251
- return r ? f[r] : f;
252
- }
253
- return {
254
- getIdentifier: c,
255
- getText: s
256
- };
257
- }
258
- function pt({
259
- appendWidth: r,
260
- autoFocus: t,
261
- autoSelectFirst: s,
262
- dense: c,
263
- hideSelected: f,
264
- itemHeight: C = 48,
265
- keyAttr: p,
266
- menuRef: w,
267
- options: x,
268
- overscan: l = 5,
269
- prependWidth: i,
270
- setValue: o,
271
- textAttr: u,
272
- value: h
273
- }) {
274
- const n = E(() => {
275
- const d = e(x);
276
- return f ? d.filter((A) => !H(A)) : d;
277
- }), { getIdentifier: y, getText: m } = Je({
278
- keyAttr: p,
279
- textAttr: u
280
- }), { containerProps: v, list: a, scrollTo: b, wrapperProps: L } = le(
281
- n,
282
- {
283
- itemHeight: C,
284
- overscan: l
285
- }
286
- ), V = ae(a, ({ data: d, index: A }) => ({ _index: A, item: d })), S = O(!1), I = E(() => {
287
- const d = e(h);
288
- return !p || !d ? d : Array.isArray(d) ? d.map((A) => A[p]) : d[p];
289
- }), T = O(e(s) ? 0 : -1), F = E(() => {
290
- const d = { max: 0, min: 0 }, A = 30, P = 1.5, k = e(c) ? 12 : 13;
291
- e(n).forEach((W) => {
292
- const M = m(W)?.toString()?.length ?? 0;
293
- d.min === 0 && d.max === 0 ? (d.min = M, d.max = M) : M < d.min ? d.min = M : M > d.max && (d.max = M);
294
- });
295
- const $ = d.max - d.min;
296
- function J(W) {
297
- const M = (i ? i + 0.5 : 0) + (r ? r + 0.5 : 0);
298
- return `${Math.min(W * k / 16 + P + M, A)}rem`;
299
- }
300
- return $ <= 5 ? J(d.max) : J(d.min + $ / 2);
301
- });
302
- function R(d = !1) {
303
- g(S, d);
304
- }
305
- function q(d) {
306
- const A = e(h), P = Array.isArray(A) ? A : A ? [A] : [];
307
- return P.length === 0 ? -1 : P.findIndex((k) => p ? k[p] === d[p] : k === d);
308
- }
309
- function H(d) {
310
- return q(d) !== -1;
311
- }
312
- async function _(d = !1) {
313
- const A = e(T);
314
- A > -1 && await z(() => {
315
- if (e(w)?.parentElement) {
316
- const k = e(w).getElementsByClassName("highlighted")[0];
317
- if (k)
318
- k.scrollIntoView?.({ behavior: d ? "smooth" : "auto", block: "nearest" }), e(t) && "focus" in k && typeof k.focus == "function" && k?.focus();
319
- else if (b(A), e(t)) {
320
- const $ = e(w).getElementsByClassName("highlighted")[0];
321
- $ && "focus" in $ && typeof $.focus == "function" && $.focus();
322
- }
323
- }
324
- });
325
- }
326
- async function te(d) {
327
- await z(() => {
328
- if (d) {
329
- const A = e(h);
330
- if (Array.isArray(A) && A.length > 0 || A) {
331
- const P = e(n).findIndex(H);
332
- P > -1 && g(T, P);
333
- }
334
- ue(a, async () => {
335
- await _();
336
- });
337
- }
338
- });
339
- }
340
- return B(S, te), B(T, async (d, A) => {
341
- d !== A && await _(!0);
342
- }), B(n, async () => {
343
- e(T) !== -1 ? e(s) ? (g(T, 0), await _()) : (g(T, -1), b(0)) : b(0);
344
- }), {
345
- applyHighlighted: () => {
346
- if (!o || !e(S))
347
- return;
348
- const d = e(T);
349
- if (d === -1)
350
- return;
351
- const A = e(n).find((P, k) => d === k);
352
- A && o(A);
353
- },
354
- containerProps: v,
355
- getIdentifier: y,
356
- getText: m,
357
- highlightedIndex: T,
358
- isActiveItem: H,
359
- isOpen: S,
360
- itemIndexInValue: q,
361
- menuWidth: F,
362
- moveHighlight: (d) => {
363
- if (!e(S)) {
364
- R(!0);
365
- return;
366
- }
367
- let A = e(T);
368
- A += d ? -1 : 1;
369
- const k = e(n).length;
370
- A >= k ? g(T, 0) : A < 0 ? g(T, k - 1) : g(T, A);
371
- },
372
- optionsWithSelectedHidden: n,
373
- renderedData: V,
374
- toggle: R,
375
- valueKey: I,
376
- wrapperProps: L
377
- };
378
- }
379
- function mt(r, t) {
380
- const s = E(
381
- () => e(t.activatorFocusedWithin) || e(t.menuWrapperFocusedWithin)
382
- ), c = E(() => {
383
- const w = e(s), x = e(r.disabled), l = e(r.shouldApplyValueAsSearch), i = e(t.internalSearch);
384
- return (!w || x) && !l ? "w-0 h-0" : i ? "flex-1 min-w-[4rem]" : "flex-1 min-w-0";
385
- });
386
- async function f() {
387
- await z(() => {
388
- g(t.searchInputFocused, !0);
389
- });
390
- }
391
- async function C() {
392
- await z(() => {
393
- e(t.activatorFocused) || g(t.searchInputFocused, !0);
394
- });
395
- }
396
- function p() {
397
- g(t.focusedValueIndex, -1), e(r.shouldApplyValueAsSearch) && e(t.textInput)?.select(), e(t.isOpen) || g(t.justOpened, !0);
398
- }
399
- return fe(s, (w) => {
400
- if (!w) {
401
- g(t.isOpen, !1);
402
- const x = e(r.customValue), l = e(t.filteredOptions), i = e(t.internalSearch);
403
- x && l.length === 0 && i && t.setSearchAsValue(), e(r.shouldApplyValueAsSearch) || t.updateInternalSearch();
404
- }
405
- }, {
406
- debounce: 200,
407
- maxWait: 400
408
- }), {
409
- anyFocused: s,
410
- inputClass: c,
411
- onActivatorFocused: C,
412
- onInputFocused: p,
413
- setInputFocus: f
414
- };
415
- }
416
- function gt(r, t) {
417
- const s = O(-1), c = O(/* @__PURE__ */ new Map());
418
- function f(l) {
419
- g(s, l);
420
- }
421
- function C(l, i) {
422
- const o = e(r.multiple), u = e(t.internalSearch);
423
- if (!o || u.length > 0)
424
- return;
425
- l.preventDefault();
426
- const h = e(t.value).length;
427
- let n = e(s);
428
- if (n === -1) {
429
- g(s, i ? 0 : h - 1);
430
- return;
431
- }
432
- n += i ? 1 : -1, n < 0 || n >= h ? (g(s, -1), g(t.searchInputFocused, !0)) : g(s, n);
433
- }
434
- function p(l) {
435
- const i = e(t.filteredOptions), o = e(t.highlightedIndex), u = e(t.isOpen), h = e(r.customValue), n = e(r.multiple), y = e(t.value), m = e(t.internalSearch);
436
- if (h && m && u) {
437
- let v = !1;
438
- if (o > -1 && o < i.length) {
439
- const a = i[o];
440
- typeof a == "string" ? v = a === m : a && typeof a == "object" && (v = (a.label || a.value || "") === m);
441
- }
442
- if (!v) {
443
- t.setSearchAsValue(), n || g(t.isOpen, !1), l.preventDefault();
444
- return;
445
- }
446
- }
447
- if (i.length > 0 && o > -1 && u)
448
- t.applyHighlighted(), l.preventDefault();
449
- else if (i.length === 0 && h && m)
450
- t.setSearchAsValue(), n || g(t.isOpen, !1), l.preventDefault();
451
- else if (!u && y.length === 0)
452
- g(t.isOpen, !0), l.preventDefault();
453
- else {
454
- const a = e(t.activator)?.closest("form");
455
- a && a.dispatchEvent(new Event("submit"));
456
- }
457
- }
458
- function w(l) {
459
- const i = e(t.isOpen), o = e(t.filteredOptions), u = e(t.highlightedIndex), h = e(r.multiple);
460
- i && o.length > 0 && u > -1 && !h && (t.applyHighlighted(), l.preventDefault());
461
- }
462
- function x() {
463
- const l = e(t.internalSearch), o = e(t.value).length, u = e(r.multiple);
464
- !l && o > 0 && (u ? g(s, o - 1) : t.clear());
465
- }
466
- return B(t.value, () => {
467
- f(-1), e(c).clear();
468
- }), B(s, async (l) => {
469
- const i = e(r.multiple);
470
- l === -1 || !i || await z(() => {
471
- const o = e(c);
472
- let u = o.get(l);
473
- if (!u) {
474
- const n = e(t.activator)?.querySelector(`[data-index="${l}"]`);
475
- n && (u = n, o.set(l, n));
476
- }
477
- u && "focus" in u && typeof u.focus == "function" && u.focus();
478
- });
479
- }), {
480
- focusedValueIndex: s,
481
- moveSelectedValueHighlight: C,
482
- onEnter: p,
483
- onInputDeletePressed: x,
484
- onTab: w,
485
- setValueFocus: f
486
- };
487
- }
488
- function yt(r, t, s) {
489
- const c = O(""), f = he(c, 50), C = O(!1), p = /* @__PURE__ */ new Map(), w = (o) => {
490
- if (p.has(o))
491
- return p.get(o);
492
- const u = Ne(o);
493
- return p.set(o, u), u;
494
- }, x = E(() => {
495
- const o = e(f), u = e(r);
496
- if (e(s.noFilter) || !o || e(C))
497
- return u;
498
- const n = e(s.keyAttr), y = e(s.textAttr), m = e(s.filter), v = w(o), a = m || ((I) => {
499
- if (!I)
500
- return !1;
501
- const T = [n ? w(I[n]) : I.toString()];
502
- return y && typeof I == "object" && T.push(w(I[y])), T.some((F) => w(F).includes(v));
503
- }), b = u.filter((I) => a(I, o)), L = e(s.customValue), V = e(s.hideCustomValue);
504
- return !L || V || !o || b.some((I) => I ? (y ? I[y] : I.toString()) === o : !1) ? b : [l(o, {
505
- keyAttr: n,
506
- returnObject: e(s.returnObject),
507
- textAttr: y
508
- }), ...b];
509
- });
510
- function l(o, u) {
511
- const { keyAttr: h, returnObject: n, textAttr: y } = u;
512
- return !h || n ? o : {
513
- [h]: o,
514
- ...y ? { [y]: o } : {}
515
- };
516
- }
517
- function i(o = "") {
518
- g(t, o), g(c, o);
519
- }
520
- return B(t, (o) => {
521
- g(c, o);
522
- }, { immediate: !0 }), ge(() => {
523
- p.clear();
524
- }), {
525
- debouncedInternalSearch: f,
526
- filteredOptions: x,
527
- internalSearch: c,
528
- justOpened: C,
529
- textValueToProperValue: (o, u = !1) => l(o, {
530
- keyAttr: e(s.keyAttr),
531
- returnObject: u || e(s.returnObject),
532
- textAttr: e(s.textAttr)
533
- }),
534
- updateInternalSearch: i
535
- };
536
- }
537
- function vt(r, t, s, c) {
538
- const f = E(() => Array.isArray(e(r))), C = E(() => {
539
- const n = /* @__PURE__ */ new Map(), y = e(t);
540
- for (const m of y)
541
- n.set(c.getIdentifier(m), m);
542
- return n;
543
- });
544
- function p(n) {
545
- return n ? Array.isArray(n) ? n : [n] : [];
546
- }
547
- function w(n, y, m, v) {
548
- const a = [];
549
- a.length = n.length;
550
- let b = 0;
551
- for (const L of n) {
552
- const V = c.getIdentifier(L), S = y.get(V);
553
- S ? a[b++] = S : m && (a[b++] = c.textValueToProperValue(L, v));
554
- }
555
- return a.length = b, a;
556
- }
557
- function x(n, y, m, v) {
558
- const a = [];
559
- a.length = n.length;
560
- let b = 0;
561
- for (const L of n) {
562
- const V = y.get(L);
563
- V ? a[b++] = V : m && (a[b++] = c.textValueToProperValue(L, v));
564
- }
565
- return a.length = b, a;
566
- }
567
- function l(n, y, m, v, a) {
568
- const b = Array.isArray(n), L = p(n), V = w(L, y, v, m);
569
- if (b || V.length === 0)
570
- return a && c.updateInternalSearch(), V;
571
- const S = V[0];
572
- return a && c.updateInternalSearch(c.getText(S)), [S];
573
- }
574
- function i(n, y, m, v, a) {
575
- const b = p(n), L = x(b, y, v, m);
576
- return a && (L.length > 0 ? c.updateInternalSearch(c.getText(L[0])) : c.updateInternalSearch()), L;
577
- }
578
- function o(n) {
579
- g(r, n);
580
- }
581
- function u(n) {
582
- const y = e(s.keyAttr), m = e(s.returnObject), v = y && !m ? n.map((a) => a[y]) : n;
583
- return e(f) ? o(v) : v.length === 0 ? o(void 0) : o(v[0]);
584
- }
585
- const h = E({
586
- get: () => {
587
- const n = e(r), y = e(s.keyAttr), m = e(s.returnObject) ?? !1, v = e(s.customValue) ?? !1, a = e(C), b = e(c.shouldApplyValueAsSearch) && !e(c.isOpen);
588
- return y && m ? l(
589
- n,
590
- a,
591
- m,
592
- v,
593
- b
594
- ) : i(
595
- n,
596
- a,
597
- m,
598
- v,
599
- b
600
- );
601
- },
602
- set: (n) => {
603
- u(n);
604
- }
605
- });
606
- return {
607
- setSelected: u,
608
- value: h
609
- };
610
- }
611
- const Ye = Symbol("rui:i18n");
612
- function bt() {
613
- const r = X(Ye, void 0), t = (c, f) => {
614
- if (r?.te(c))
615
- return r?.t(c, f);
616
- };
617
- return { t: (c, f, C) => typeof f == "string" ? t(c) ?? f ?? c : t(c, f) ?? C ?? c };
618
- }
619
- const Ge = Symbol.for("rui:table");
620
- function wt(r) {
621
- return {
622
- globalItemsPerPage: !1,
623
- itemsPerPage: O(10),
624
- limits: [10, 25, 50, 100],
625
- stickyOffset: O(0),
626
- ...r
627
- };
628
- }
629
- function St() {
630
- const r = X(Ge);
631
- if (!r)
632
- throw new Error("Could not find rui table options injection");
633
- return r;
634
- }
635
- function At(r = O(!1), t) {
636
- const s = O(null), c = O(null), f = O(!1), C = -0.5, p = {
637
- head: ":scope > thead[data-id=head-main]",
638
- headClone: ":scope > thead[data-id=head-clone]",
639
- row: ":scope > tbody > tr:not([hidden])",
640
- th: ":scope > th"
641
- }, w = () => {
642
- const l = e(s);
643
- if (!e(r) || !l)
644
- return;
645
- const i = l.querySelector(
646
- `${p.headClone} > tr`
647
- ), o = l.querySelector(`${p.head} > tr`) ?? null, u = () => {
648
- const h = o?.querySelectorAll(
649
- p.th
650
- );
651
- i?.querySelectorAll(p.th)?.forEach((y, m) => {
652
- Q(y, (v) => {
653
- const a = v[0].target.getBoundingClientRect(), b = h?.item(m);
654
- b && (b.style.width = `${a.width}px`);
655
- });
656
- });
657
- };
658
- de(i, (h) => {
659
- for (const n of h)
660
- (n.type === "childList" || n.type === "attributes") && u();
661
- }, {
662
- attributes: !0,
663
- childList: !0,
664
- subtree: !0
665
- }), u();
666
- }, x = () => {
667
- const l = e(s);
668
- if (!e(r) || !l)
669
- return;
670
- const i = l.getBoundingClientRect(), o = l.querySelector(
671
- p.headClone
672
- ), u = o?.getBoundingClientRect(), h = l.querySelector(p.head) ?? null, n = h?.getBoundingClientRect();
673
- if (!i || !u || !h || !o || !n)
674
- return;
675
- const {
676
- height: y,
677
- left: m,
678
- width: v
679
- } = u, { bottom: a, top: b } = i, L = e(t) ?? 0;
680
- h.style.width = `${v}px`;
681
- const V = l.querySelectorAll(p.row), S = V.item(V.length - 1)?.getBoundingClientRect();
682
- if (b <= L && a > L && V.length > 1) {
683
- g(f, !0), h.style.left = `${m + C}px`;
684
- const I = S?.height ?? 0;
685
- a <= I + y + L ? h.style.top = `${a - I - y}px` : h.style.top = `${L}px`;
686
- } else
687
- g(f, !1), h.style.left = `${C}px`, h.style.top = "0";
688
- };
689
- return Z(() => {
690
- x(), N(c, "scroll", x), N(document.body, "scroll", x), N(window, "resize", x), w();
691
- }), {
692
- stick: f,
693
- table: s,
694
- tableScroller: c
695
- };
696
- }
697
- export {
698
- Xe as I,
699
- Ye as R,
700
- Ge as T,
701
- dt as a,
702
- ht as b,
703
- Je as c,
704
- yt as d,
705
- vt as e,
706
- pt as f,
707
- gt as g,
708
- mt as h,
709
- bt as i,
710
- St as j,
711
- At as k,
712
- wt as l,
713
- ut as m,
714
- at as n,
715
- ft as u
716
- };
717
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtRDdEVmQ4cE8uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9icmVha3BvaW50LnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL2ljb25zLnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL3RoZW1lLnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL3RpbWVvdXQtbWFuYWdlci50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9wb3BwZXIudHMiLCIuLi8uLi9zcmMvY29tcG9zYWJsZXMvZHJvcGRvd24tbWVudS50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9mb3Jtcy9hdXRvLWNvbXBsZXRlL2ZvY3VzLnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL2Zvcm1zL2F1dG8tY29tcGxldGUva2V5Ym9hcmQtbmF2aWdhdGlvbi50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9mb3Jtcy9hdXRvLWNvbXBsZXRlL3NlYXJjaC50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9mb3Jtcy9hdXRvLWNvbXBsZXRlL3ZhbHVlLnRzIiwiLi4vLi4vc3JjL2NvbXBvc2FibGVzL3VzZS1ydWktaTE4bi50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9kZWZhdWx0cy90YWJsZS50cyIsIi4uLy4uL3NyYy9jb21wb3NhYmxlcy9zdGlja3ktaGVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGJyZWFrcG9pbnRzVGFpbHdpbmQgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuaW1wb3J0IHsgY2FtZWxDYXNlIH0gZnJvbSAnc2N1bGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlQnJlYWtwb2ludCgpIHtcbiAgY29uc3QgeyB3aWR0aCB9ID0gdXNlV2luZG93U2l6ZSgpO1xuXG4gIGNvbnN0IGJyZWFrcG9pbnRMaXN0ID0ge1xuICAgIHhzOiAwLFxuICAgIC4uLmJyZWFrcG9pbnRzVGFpbHdpbmQsXG4gIH0gYXMgY29uc3Q7XG5cbiAgdHlwZSBCcmVha3BvaW50ID0ga2V5b2YgdHlwZW9mIGJyZWFrcG9pbnRMaXN0O1xuXG4gIGNvbnN0IGJyZWFrcG9pbnRzID0gdXNlQnJlYWtwb2ludHMoYnJlYWtwb2ludExpc3QpO1xuXG4gIGNvbnN0IGdldEtleXMgPSBPYmplY3Qua2V5cyBhcyA8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKSA9PiBBcnJheTxrZXlvZiBUPjtcblxuICBjb25zdCBsaXN0ID0gZ2V0S2V5cyhicmVha3BvaW50TGlzdCk7XG5cbiAgY29uc3QgcmF3U2l6ZXM6IFtCcmVha3BvaW50LCBSZWY8Ym9vbGVhbj5dW10gPSBsaXN0Lm1hcChcbiAgICAoYnJlYWtwb2ludCwgaW5kZXgpID0+IFtcbiAgICAgIGJyZWFrcG9pbnQsXG4gICAgICBpbmRleCA8IGxpc3QubGVuZ3RoIC0gMVxuICAgICAgICA/IGJyZWFrcG9pbnRzLmJldHdlZW4oYnJlYWtwb2ludCwgbGlzdFtpbmRleCArIDFdKVxuICAgICAgICA6IGJyZWFrcG9pbnRzW2JyZWFrcG9pbnRdLFxuICAgIF0sXG4gICk7XG5cbiAgY29uc3Qgc2l6ZXMgPSByYXdTaXplcy5tYXAoKFticmVha3BvaW50LCB2YWx1ZV0pID0+IFtcbiAgICBjYW1lbENhc2UoYGlzXyR7YnJlYWtwb2ludH1gKSxcbiAgICB2YWx1ZSxcbiAgXSk7XG5cbiAgY29uc3Qgc2l6ZXNVcCA9IGxpc3QubWFwKGJyZWFrcG9pbnQgPT4gW1xuICAgIGNhbWVsQ2FzZShgaXNfJHticmVha3BvaW50fV9hbmRfdXBgKSxcbiAgICBicmVha3BvaW50cy5ncmVhdGVyT3JFcXVhbChicmVha3BvaW50KSxcbiAgXSk7XG5cbiAgY29uc3Qgc2l6ZXNEb3duID0gbGlzdC5tYXAoYnJlYWtwb2ludCA9PiBbXG4gICAgY2FtZWxDYXNlKGBpc18ke2JyZWFrcG9pbnR9X2FuZF9kb3duYCksXG4gICAgYnJlYWtwb2ludHMuc21hbGxlcihicmVha3BvaW50KSxcbiAgXSk7XG5cbiAgY29uc3QgbmFtZSA9IGNvbXB1dGVkKCgpID0+IHJhd1NpemVzLmZpbmQoaXRlbSA9PiBnZXQoaXRlbVsxXSkpPy5bMF0gfHwgJycpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHNpemVzKSxcbiAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoc2l6ZXNVcCksXG4gICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHNpemVzRG93biksXG4gICAgbmFtZSxcbiAgICB3aWR0aCxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgSW5qZWN0aW9uS2V5IH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVkSWNvbiB9IGZyb20gJ0AvdHlwZXMvaWNvbnMnO1xuaW1wb3J0IHtcbiAgTHVBcnJvd0Rvd24sXG4gIEx1QXJyb3dMZWZ0LFxuICBMdUFycm93UmlnaHQsXG4gIEx1QXJyb3dVcCxcbiAgTHVDaGVjayxcbiAgTHVDaGVja2JveEJsYW5rLFxuICBMdUNoZWNrYm94QmxhbmtDaXJjbGUsXG4gIEx1Q2hlY2tib3hCbGFua0NpcmNsZUZpbGwsXG4gIEx1Q2hlY2tib3hGaWxsLFxuICBMdUNoZWNrYm94SW5kZXRlcm1pbmF0ZUZpbGwsXG4gIEx1Q2hldnJvbkRvd24sXG4gIEx1Q2hldnJvbkxlZnQsXG4gIEx1Q2hldnJvblJpZ2h0LFxuICBMdUNoZXZyb25zTGVmdCxcbiAgTHVDaGV2cm9uc1JpZ2h0LFxuICBMdUNoZXZyb25zVXBEb3duLFxuICBMdUNoZXZyb25VcCxcbiAgTHVDaXJjbGVBbGVydCxcbiAgTHVDaXJjbGVDaGVjayxcbiAgTHVDaXJjbGVYLFxuICBMdUNsb2NrLFxuICBMdUVsbGlwc2lzLFxuICBMdUV5ZSxcbiAgTHVFeWVPZmYsXG4gIEx1SW5mbyxcbiAgTHVSYWRpb0J1dHRvbkZpbGwsXG4gIEx1VHJpYW5nbGVBbGVydCxcbiAgTHVYLFxufSBmcm9tICdAL2ljb25zJztcblxuY29uc3QgcmVxdWlyZWRJY29uczogR2VuZXJhdGVkSWNvbltdID0gW1xuICBMdUNoZXZyb25zVXBEb3duLFxuICBMdUVsbGlwc2lzLFxuICBMdVRyaWFuZ2xlQWxlcnQsXG4gIEx1WCxcbiAgTHVJbmZvLFxuICBMdUFycm93VXAsXG4gIEx1QXJyb3dEb3duLFxuICBMdUFycm93TGVmdCxcbiAgTHVBcnJvd1JpZ2h0LFxuICBMdUNoZXZyb25VcCxcbiAgTHVDaGV2cm9uRG93bixcbiAgTHVDaGV2cm9uTGVmdCxcbiAgTHVDaGV2cm9uUmlnaHQsXG4gIEx1Q2hldnJvbnNMZWZ0LFxuICBMdUNoZXZyb25zUmlnaHQsXG4gIEx1Q2lyY2xlQWxlcnQsXG4gIEx1RXllLFxuICBMdUV5ZU9mZixcbiAgTHVDaGVjayxcbiAgTHVDaXJjbGVYLFxuICBMdUNpcmNsZUNoZWNrLFxuICBMdUNoZWNrYm94QmxhbmssXG4gIEx1Q2hlY2tib3hGaWxsLFxuICBMdUNoZWNrYm94SW5kZXRlcm1pbmF0ZUZpbGwsXG4gIEx1Q2hlY2tib3hCbGFua0NpcmNsZSxcbiAgTHVDaGVja2JveEJsYW5rQ2lyY2xlRmlsbCxcbiAgTHVSYWRpb0J1dHRvbkZpbGwsXG4gIEx1Q2xvY2ssXG5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIEljb25zT3B0aW9ucyB7XG4gIHJlZ2lzdGVyZWRJY29uczogR2VuZXJhdGVkSWNvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUljb25zUmV0dXJuIHtcbiAgcmVnaXN0ZXJlZEljb25zOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBbc3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XVtdPj47XG59XG5cbmV4cG9ydCBjb25zdCBJY29uc1N5bWJvbDogSW5qZWN0aW9uS2V5PFVzZUljb25zUmV0dXJuPiA9IFN5bWJvbC5mb3IoJ3J1aTppY29ucycpO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSWNvbkRlZmF1bHRzKG9wdGlvbnM/OiBQYXJ0aWFsPEljb25zT3B0aW9ucz4pOiBVc2VJY29uc1JldHVybiB7XG4gIGNvbnN0IGljb25zVG9BZGQgPSBvcHRpb25zPy5yZWdpc3RlcmVkSWNvbnMgfHwgW107XG4gIHJldHVybiB7XG4gICAgcmVnaXN0ZXJlZEljb25zOiB7XG4gICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5yZXF1aXJlZEljb25zLFxuICAgICAgICAgIC4uLmljb25zVG9BZGQsXG4gICAgICAgIF0ubWFwKCh7IGNvbXBvbmVudHMsIG5hbWUgfSkgPT4gW25hbWUsIGNvbXBvbmVudHNdKSxcbiAgICAgICksXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUljb25zKCk6IFVzZUljb25zUmV0dXJuIHtcbiAgY29uc3QgaWNvbnMgPSBpbmplY3QoSWNvbnNTeW1ib2wpO1xuICBhc3NlcnQoaWNvbnMsICdDb3VsZCBub3QgZmluZCBpY29ucyBpbmplY3Rpb24nKTtcbiAgcmV0dXJuIGljb25zO1xufVxuIiwiaW1wb3J0IHsgdXNlQ29sb3JNb2RlIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJztcbmltcG9ydCB7IGNvbXB1dGVkLCB0eXBlIENvbXB1dGVkUmVmLCB0eXBlIFJlZiwgcmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7XG4gIHR5cGUgQ29sb3JJbnRlbnNpdHksXG4gIGRlZmF1bHRUaGVtZSxcbiAgdHlwZSBJbml0VGhlbWVPcHRpb25zLFxuICB0eXBlIFRoZW1lQ29uZmlnLFxuICB0eXBlIFRoZW1lQ29udGVudCxcbiAgdHlwZSBUaGVtZURhdGEsXG4gIFRoZW1lTW9kZSxcbn0gZnJvbSAnQC90eXBlcy90aGVtZSc7XG5cbmNvbnN0IGNvbmZpZzogUmVmPFRoZW1lQ29uZmlnPiA9IHJlZih7IC4uLmRlZmF1bHRUaGVtZSB9KTtcblxuLyoqXG4gKiBUaGVtZSBtYW5hZ2VyXG4gKiBAcmV0dXJucyB7VGhlbWVDb250ZW50fVxuICovXG5leHBvcnQgY29uc3QgdXNlUm90a2lUaGVtZSA9IGNyZWF0ZVNoYXJlZENvbXBvc2FibGU8KCkgPT4gVGhlbWVDb250ZW50PigoKSA9PiB7XG4gIGNvbnN0IHsgc3RhdGUsIHN0b3JlIH0gPSB1c2VDb2xvck1vZGU8VGhlbWVNb2RlPigpO1xuXG4gIC8qKlxuICAgKiB3aGV0aGVyIHRoZSBjdXJyZW50IHRoZW1lIGlzIGNvbnRyb2xsZWQgYnkgc3lzdGVtIG9yIHVzZXJcbiAgICogQHR5cGUge0NvbXB1dGVkUmVmPGJvb2xlYW4+fVxuICAgKi9cbiAgY29uc3QgaXNBdXRvQ29udHJvbGxlZDogQ29tcHV0ZWRSZWY8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiBnZXQoc3RvcmUpID09PSBUaGVtZU1vZGUuYXV0byk7XG5cbiAgLyoqXG4gICAqIHRydXRoeSBmb3IgbGlnaHQgdGhlbWVcbiAgICogQHR5cGUge0NvbXB1dGVkUmVmPGJvb2xlYW4+fVxuICAgKi9cbiAgY29uc3QgaXNMaWdodDogQ29tcHV0ZWRSZWY8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiBnZXQoc3RhdGUpID09PSBUaGVtZU1vZGUubGlnaHQpO1xuXG4gIC8qKlxuICAgKiB0cnV0aHkgZm9yIGRhcmsgdGhlbWVcbiAgICogQHR5cGUge0NvbXB1dGVkUmVmPGJvb2xlYW4+fVxuICAgKi9cbiAgY29uc3QgaXNEYXJrOiBDb21wdXRlZFJlZjxib29sZWFuPiA9IGNvbXB1dGVkKCgpID0+IGdldChzdGF0ZSkgPT09IFRoZW1lTW9kZS5kYXJrKTtcblxuICAvKipcbiAgICogY3VycmVudCB0aGVtZSBiYXNlZCBvbiBsaWdodCBvciBkYXJrIG1vZGVcbiAgICogQHR5cGUge0NvbXB1dGVkUmVmPFRoZW1lRGF0YT59XG4gICAqL1xuICBjb25zdCB0aGVtZTogQ29tcHV0ZWRSZWY8VGhlbWVEYXRhPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoZ2V0KGlzTGlnaHQpKVxuICAgICAgcmV0dXJuIGdldChjb25maWcpLmxpZ2h0O1xuXG4gICAgcmV0dXJuIGdldChjb25maWcpLmRhcms7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBzd2l0Y2ggdGhlbWUgdGhyb3VnaCBkYXJrL2xpZ2h0L2F1dG8gbW9kZXNcbiAgICogQHBhcmFtIHtUaGVtZU1vZGV9IG1vZGVcbiAgICovXG4gIGNvbnN0IHN3aXRjaFRoZW1lU2NoZW1lID0gKG1vZGU6IFRoZW1lTW9kZSkgPT4ge1xuICAgIHNldChzdG9yZSwgbW9kZSB8fCBUaGVtZU1vZGUuYXV0byk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHRvZ2dsZSBiZXR3ZWVuIGF1dG98bGlnaHR8ZGFya1xuICAgKi9cbiAgY29uc3QgdG9nZ2xlVGhlbWVNb2RlID0gKCkgPT4ge1xuICAgIGlmIChnZXQoaXNBdXRvQ29udHJvbGxlZCkpXG4gICAgICBzd2l0Y2hUaGVtZVNjaGVtZShUaGVtZU1vZGUubGlnaHQpO1xuICAgIGVsc2UgaWYgKGdldChpc0xpZ2h0KSlcbiAgICAgIHN3aXRjaFRoZW1lU2NoZW1lKFRoZW1lTW9kZS5kYXJrKTtcbiAgICBlbHNlIGlmIChnZXQoaXNEYXJrKSlcbiAgICAgIHN3aXRjaFRoZW1lU2NoZW1lKFRoZW1lTW9kZS5hdXRvKTtcbiAgfTtcblxuICAvKipcbiAgICogc2V0cyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRoZW1lXG4gICAqIEBwYXJhbSB7VGhlbWVDb25maWd9IG5ld0NvbmZpZ1xuICAgKi9cbiAgY29uc3Qgc2V0VGhlbWVDb25maWcgPSAobmV3Q29uZmlnOiBUaGVtZUNvbmZpZykgPT4ge1xuICAgIHNldChjb25maWcsIG5ld0NvbmZpZyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHRoZW1lIGluaXRpYWxpemVyLCBtdXN0IGJlIGNhbGxlZCBvbmNlIGZyb20gdGhlIGFwcCdzIGVudHJ5XG4gICAqIEBwYXJhbSB7SW5pdFRoZW1lT3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3QgaW5pdCA9IChvcHRpb25zOiBJbml0VGhlbWVPcHRpb25zKSA9PiB7XG4gICAgc3dpdGNoVGhlbWVTY2hlbWUob3B0aW9ucy5tb2RlID8/IFRoZW1lTW9kZS5hdXRvKTtcbiAgICBzZXRUaGVtZUNvbmZpZyhvcHRpb25zLmNvbmZpZyA/PyB7IC4uLmRlZmF1bHRUaGVtZSB9KTtcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2F0Y2goW2lzTGlnaHQsIHRoZW1lXSwgKFtpc0xpZ2h0LCB0aGVtZV0pID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVWYXJpYWJsZXMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBjb250ZXh0IHZhcmlhYmxlc1xuICAgICAgICBPYmplY3QuZW50cmllcyh0aGVtZSkuZm9yRWFjaCgoW2NvbnRleHQsIGNvbnRleHRPYmplY3RdOiBbc3RyaW5nLCBDb2xvckludGVuc2l0eV0pID0+IHtcbiAgICAgICAgICBzdHlsZVZhcmlhYmxlcy5zZXQoYC0tcnVpLSR7Y29udGV4dH0tZGFya2VyYCwgY29udGV4dE9iamVjdC5kYXJrZXIpO1xuICAgICAgICAgIHN0eWxlVmFyaWFibGVzLnNldChgLS1ydWktJHtjb250ZXh0fS1saWdodGVyYCwgY29udGV4dE9iamVjdC5saWdodGVyKTtcbiAgICAgICAgICBzdHlsZVZhcmlhYmxlcy5zZXQoYC0tcnVpLSR7Y29udGV4dH0tbWFpbmAsIGNvbnRleHRPYmplY3QuREVGQVVMVCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgdGhlbWUgbW9kZVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGlzTGlnaHQgPyBUaGVtZU1vZGUubGlnaHQgOiBUaGVtZU1vZGUuZGFyaztcblxuICAgICAgICAvLyBBZGQgdGV4dCBjb2xvciB2YXJpYWJsZXNcbiAgICAgICAgc3R5bGVWYXJpYWJsZXMuc2V0KCctLXJ1aS10ZXh0LWRpc2FibGVkJywgYHZhcigtLXJ1aS0ke3N0YXRlfS10ZXh0LWRpc2FibGVkKWApO1xuICAgICAgICBzdHlsZVZhcmlhYmxlcy5zZXQoJy0tcnVpLXRleHQtcHJpbWFyeScsIGB2YXIoLS1ydWktJHtzdGF0ZX0tdGV4dC1wcmltYXJ5KWApO1xuICAgICAgICBzdHlsZVZhcmlhYmxlcy5zZXQoJy0tcnVpLXRleHQtc2Vjb25kYXJ5JywgYHZhcigtLXJ1aS0ke3N0YXRlfS10ZXh0LXNlY29uZGFyeSlgKTtcblxuICAgICAgICAvLyBBcHBseSBhbGwgc3R5bGUgdmFyaWFibGVzIGluIG9uZSBvcGVyYXRpb25cbiAgICAgICAgY29uc3Qgcm9vdFN0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuICAgICAgICBzdHlsZVZhcmlhYmxlcy5mb3JFYWNoKCh2YWx1ZSwgdmFyaWFibGVOYW1lKSA9PiB7XG4gICAgICAgICAgcm9vdFN0eWxlLnNldFByb3BlcnR5KHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGNvbmZpZyxcbiAgICBpbml0LFxuICAgIGlzQXV0b0NvbnRyb2xsZWQsXG4gICAgaXNEYXJrLFxuICAgIGlzTGlnaHQsXG4gICAgc2V0VGhlbWVDb25maWcsXG4gICAgc3RhdGUsXG4gICAgc3RvcmUsXG4gICAgc3dpdGNoVGhlbWVTY2hlbWUsXG4gICAgdGhlbWUsXG4gICAgdG9nZ2xlVGhlbWVNb2RlLFxuICB9O1xufSk7XG4iLCJpbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ0B2dWV1c2Uvc2hhcmVkJztcbmltcG9ydCB7IHJlZiB9IGZyb20gJ3Z1ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lb3V0TWFuYWdlcigpIHtcbiAgY29uc3QgdGltZW91dCA9IHJlZjxOb2RlSlMuVGltZW91dD4oKTtcblxuICBjb25zdCBjbGVhciA9ICgpID0+IHtcbiAgICBpZiAoZ2V0KHRpbWVvdXQpKSB7XG4gICAgICBjbGVhclRpbWVvdXQoZ2V0KHRpbWVvdXQpKTtcbiAgICAgIHNldCh0aW1lb3V0LCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjcmVhdGUgPSAoY2FsbGJhY2s6ICgpID0+IHZvaWQsIGRlbGF5OiBudW1iZXIpID0+IHtcbiAgICBjbGVhcigpO1xuICAgIHNldCh0aW1lb3V0LCBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheSkpO1xuICB9O1xuXG4gIGNvbnN0IGlzQWN0aXZlID0gKCkgPT4gISFnZXQodGltZW91dCk7XG5cbiAgcmV0dXJuIHsgY2xlYXIsIGNyZWF0ZSwgaXNBY3RpdmUgfTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZVBvcHBlciwgdHlwZSBJbnN0YW5jZSwgdHlwZSBQbGFjZW1lbnQsIHR5cGUgUG9zaXRpb25pbmdTdHJhdGVneSwgdHlwZSBWaXJ0dWFsRWxlbWVudCB9IGZyb20gJ0Bwb3BwZXJqcy9jb3JlJztcbmltcG9ydCB7IHR5cGUgTWF5YmVFbGVtZW50LCB1bnJlZkVsZW1lbnQgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuaW1wb3J0IHsgb25Nb3VudGVkLCB0eXBlIFJlZiwgcmVmLCB3YXRjaEVmZmVjdCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyB1c2VUaW1lb3V0TWFuYWdlciB9IGZyb20gJy4vdGltZW91dC1tYW5hZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBQb3BwZXJPcHRpb25zIHtcbiAgbG9ja2VkPzogYm9vbGVhbjtcbiAgb3ZlcmZsb3dQYWRkaW5nPzogbnVtYmVyO1xuICBvZmZzZXREaXN0YW5jZT86IG51bWJlcjtcbiAgb2Zmc2V0U2tpZD86IG51bWJlcjtcbiAgcGxhY2VtZW50PzogUGxhY2VtZW50O1xuICBzdHJhdGVneT86IFBvc2l0aW9uaW5nU3RyYXRlZ3k7XG4gIGdwdUFjY2VsZXJhdGlvbj86IGJvb2xlYW47XG4gIGFkYXB0aXZlPzogYm9vbGVhbjtcbiAgc2Nyb2xsPzogYm9vbGVhbjtcbiAgcmVzaXplPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUE9QUEVSX09QVElPTlM6IFBvcHBlck9wdGlvbnMgPSB7XG4gIGFkYXB0aXZlOiB0cnVlLFxuICBncHVBY2NlbGVyYXRpb246IHRydWUsXG4gIGxvY2tlZDogZmFsc2UsXG4gIG9mZnNldERpc3RhbmNlOiA4LFxuICBvZmZzZXRTa2lkOiAwLFxuICBvdmVyZmxvd1BhZGRpbmc6IDgsXG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gIHJlc2l6ZTogdHJ1ZSxcbiAgc2Nyb2xsOiB0cnVlLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbn07XG5cbmludGVyZmFjZSBVc2VQb3BwZXJSZXR1cm4ge1xuICBpbnN0YW5jZTogUmVmPEluc3RhbmNlIHwgbnVsbD47XG4gIGxlYXZlUGVuZGluZzogUmVmPGJvb2xlYW4+O1xuICBvbkNsb3NlOiAoaW1tZWRpYXRlPzogYm9vbGVhbikgPT4gdm9pZDtcbiAgb25MZWF2ZVBlbmRpbmc6ICgpID0+IHZvaWQ7XG4gIG9uT3BlbjogKGltbWVkaWF0ZT86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIG9uUG9wcGVyTGVhdmU6ICgpID0+IHZvaWQ7XG4gIG9wZW46IFJlZjxib29sZWFuLCBib29sZWFuPjtcbiAgcG9wcGVyOiBSZWY8TWF5YmVFbGVtZW50PjtcbiAgcG9wcGVyRW50ZXI6IFJlZjxib29sZWFuPjtcbiAgcmVmZXJlbmNlOiBSZWY8TWF5YmVFbGVtZW50PjtcbiAgdXBkYXRlUG9wcGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUG9wcGVyKFxuICBvcHRpb25zOiBSZWY8UG9wcGVyT3B0aW9ucz4sXG4gIGRpc2FibGVkOiBSZWY8Ym9vbGVhbj4gPSByZWYoZmFsc2UpLFxuICBvcGVuRGVsYXk6IFJlZjxudW1iZXI+ID0gcmVmKDApLFxuICBjbG9zZURlbGF5OiBSZWY8bnVtYmVyPiA9IHJlZigwKSxcbiAgdmlydHVhbFJlZmVyZW5jZT86IFJlZjxFbGVtZW50IHwgVmlydHVhbEVsZW1lbnQ+LFxuKTogVXNlUG9wcGVyUmV0dXJuIHtcbiAgY29uc3QgcmVmZXJlbmNlID0gcmVmPE1heWJlRWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBwb3BwZXIgPSByZWY8TWF5YmVFbGVtZW50IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGluc3RhbmNlID0gcmVmPEluc3RhbmNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IG9wZW4gPSByZWY8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBwb3BwZXJFbnRlciA9IHJlZjxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IGxlYXZlUGVuZGluZyA9IHJlZjxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3Qgb3BlblRpbWVvdXRNYW5hZ2VyID0gdXNlVGltZW91dE1hbmFnZXIoKTtcbiAgY29uc3QgY2xvc2VUaW1lb3V0TWFuYWdlciA9IHVzZVRpbWVvdXRNYW5hZ2VyKCk7XG5cbiAgY29uc3Qgb25Qb3BwZXJMZWF2ZSA9ICgpID0+IHtcbiAgICBzZXQocG9wcGVyRW50ZXIsIGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVQb3BwZXIgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgZ2V0KGluc3RhbmNlKT8udXBkYXRlKCk7XG4gIH07XG5cbiAgY29uc3Qgb25PcGVuID0gKGltbWVkaWF0ZSA9IGZhbHNlKSA9PiB7XG4gICAgaWYgKGdldChkaXNhYmxlZCkpXG4gICAgICByZXR1cm47XG5cbiAgICBjbG9zZVRpbWVvdXRNYW5hZ2VyLmNsZWFyKCk7XG5cbiAgICBzZXQobGVhdmVQZW5kaW5nLCBmYWxzZSk7XG4gICAgaWYgKCFvcGVuVGltZW91dE1hbmFnZXIuaXNBY3RpdmUoKSkge1xuICAgICAgc2V0KHBvcHBlckVudGVyLCB0cnVlKTtcblxuICAgICAgb3BlblRpbWVvdXRNYW5hZ2VyLmNyZWF0ZSgoKSA9PiB7XG4gICAgICAgIHNldChvcGVuLCB0cnVlKTtcbiAgICAgIH0sIGltbWVkaWF0ZSA/IDAgOiBnZXQob3BlbkRlbGF5KSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG9uQ2xvc2UgPSAoaW1tZWRpYXRlID0gZmFsc2UpID0+IHtcbiAgICBpZiAoZ2V0KGRpc2FibGVkKSlcbiAgICAgIHJldHVybjtcblxuICAgIG9wZW5UaW1lb3V0TWFuYWdlci5jbGVhcigpO1xuXG4gICAgaWYgKCFjbG9zZVRpbWVvdXRNYW5hZ2VyLmlzQWN0aXZlKCkpIHtcbiAgICAgIGNsb3NlVGltZW91dE1hbmFnZXIuY3JlYXRlKCgpID0+IHtcbiAgICAgICAgaWYgKCFnZXQob3BlbikpXG4gICAgICAgICAgb25Qb3BwZXJMZWF2ZSgpO1xuXG4gICAgICAgIHNldChvcGVuLCBmYWxzZSk7XG4gICAgICB9LCBpbW1lZGlhdGUgPyAwIDogZ2V0KGNsb3NlRGVsYXkpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb25MZWF2ZVBlbmRpbmcgPSAoKSA9PiB7XG4gICAgc2V0KGxlYXZlUGVuZGluZywgdHJ1ZSk7XG4gIH07XG5cbiAgY29uc3QgbW9kaWZpZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGFkYXB0aXZlID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5hZGFwdGl2ZSxcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IERFRkFVTFRfUE9QUEVSX09QVElPTlMuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgbG9ja2VkID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5sb2NrZWQsXG4gICAgICBvZmZzZXREaXN0YW5jZSA9IERFRkFVTFRfUE9QUEVSX09QVElPTlMub2Zmc2V0RGlzdGFuY2UsXG4gICAgICBvZmZzZXRTa2lkID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5vZmZzZXRTa2lkLFxuICAgICAgb3ZlcmZsb3dQYWRkaW5nID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5vdmVyZmxvd1BhZGRpbmcsXG4gICAgICByZXNpemUgPSBERUZBVUxUX1BPUFBFUl9PUFRJT05TLnJlc2l6ZSxcbiAgICAgIHNjcm9sbCA9IERFRkFVTFRfUE9QUEVSX09QVElPTlMuc2Nyb2xsLFxuICAgIH0gPSBnZXQob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gW3tcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgbmFtZTogJ2hpZGUnLFxuICAgIH0sIHtcbiAgICAgIGVuYWJsZWQ6ICFsb2NrZWQsXG4gICAgICBuYW1lOiAnZmxpcCcsXG4gICAgfSwge1xuICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHBhZGRpbmc6IG92ZXJmbG93UGFkZGluZyxcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIG9mZnNldDogW29mZnNldFNraWQsIG9mZnNldERpc3RhbmNlXSxcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBhZGFwdGl2ZSxcbiAgICAgICAgZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgfSxcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICByZXNpemUsXG4gICAgICAgIHNjcm9sbCxcbiAgICAgIH0sXG4gICAgfSwge1xuICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgcGFkZGluZzogNCxcbiAgICAgIH0sXG4gICAgfV07XG4gIH0pO1xuXG4gIGNvbnN0IHBvcHBlckNvbmZpZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBwbGFjZW1lbnQgPSBERUZBVUxUX1BPUFBFUl9PUFRJT05TLnBsYWNlbWVudCxcbiAgICAgIHN0cmF0ZWd5ID0gREVGQVVMVF9QT1BQRVJfT1BUSU9OUy5zdHJhdGVneSxcbiAgICB9ID0gZ2V0KG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGlmaWVyczogZ2V0KG1vZGlmaWVycyksXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICB9O1xuICB9KTtcblxuICBmdW5jdGlvbiBnZXRWYWxpZEVsZW1lbnRzKCk6IHsgcG9wcGVyRWw6IEhUTUxFbGVtZW50OyByZWZlcmVuY2VFbDogRWxlbWVudCB8IFZpcnR1YWxFbGVtZW50IH0gfCBudWxsIHtcbiAgICBpZiAoIWdldChwb3BwZXIpIHx8ICghZ2V0KHJlZmVyZW5jZSkgJiYgIWdldCh2aXJ0dWFsUmVmZXJlbmNlKSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcHBlckVsID0gdW5yZWZFbGVtZW50KHBvcHBlcik7XG4gICAgY29uc3QgcmVmZXJlbmNlRWwgPSBnZXQodmlydHVhbFJlZmVyZW5jZSkgfHwgdW5yZWZFbGVtZW50KHJlZmVyZW5jZSk7XG5cbiAgICBpZiAoIShwb3BwZXJFbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB8fCAhcmVmZXJlbmNlRWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7IHBvcHBlckVsLCByZWZlcmVuY2VFbCB9O1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZVBvcHBlcihvbkludmFsaWRhdGU6IChjbGVhbnVwRm46ICgpID0+IHZvaWQpID0+IHZvaWQpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldFZhbGlkRWxlbWVudHMoKTtcbiAgICBpZiAoIWVsZW1lbnRzKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBwb3BwZXJFbCwgcmVmZXJlbmNlRWwgfSA9IGVsZW1lbnRzO1xuXG4gICAgY29uc3QgdmFsdWUgPSBjcmVhdGVQb3BwZXIocmVmZXJlbmNlRWwsIHBvcHBlckVsLCBnZXQocG9wcGVyQ29uZmlnKSk7XG5cbiAgICBzZXQoaW5zdGFuY2UsIHZhbHVlKTtcbiAgICBvbkludmFsaWRhdGUodmFsdWUuZGVzdHJveSk7XG4gIH1cblxuICB1c2VSZXNpemVPYnNlcnZlcihbcmVmZXJlbmNlLCBwb3BwZXJdLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzRGVmaW5lZChpbnN0YW5jZSkpXG4gICAgICBhd2FpdCBnZXQoaW5zdGFuY2UpLnVwZGF0ZSgpO1xuICB9KTtcblxuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHdhdGNoRWZmZWN0KChvbkludmFsaWRhdGUpID0+IHtcbiAgICAgIGluaXRpYWxpemVQb3BwZXIob25JbnZhbGlkYXRlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZSxcbiAgICBsZWF2ZVBlbmRpbmcsXG4gICAgb25DbG9zZSxcbiAgICBvbkxlYXZlUGVuZGluZyxcbiAgICBvbk9wZW4sXG4gICAgb25Qb3BwZXJMZWF2ZSxcbiAgICBvcGVuLFxuICAgIHBvcHBlcixcbiAgICBwb3BwZXJFbnRlcixcbiAgICByZWZlcmVuY2UsXG4gICAgdXBkYXRlUG9wcGVyLFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuXG5leHBvcnQgdHlwZSBLZXlPZlR5cGU8VCwgVj4gPSBWIGV4dGVuZHMgb2JqZWN0XG4gID8ga2V5b2YgVFxuICA6IGtleW9mIHtcbiAgICBbUCBpbiBrZXlvZiBUIGFzIFRbUF0gZXh0ZW5kcyBWXG4gICAgICA/IFBcbiAgICAgIDogViBleHRlbmRzIFRbUF1cbiAgICAgICAgPyBQXG4gICAgICAgIDogbmV2ZXJdOiBhbnlcbiAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBEcm9wZG93bkl0ZW1BdHRyPFRWYWx1ZSwgVEl0ZW0+IHtcbiAga2V5QXR0cj86IEtleU9mVHlwZTxUSXRlbSwgVFZhbHVlIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBVIDogVFZhbHVlPjtcbiAgdGV4dEF0dHI/OiBrZXlvZiBUSXRlbSB8ICgoaXRlbTogVEl0ZW0pID0+IHN0cmluZyk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25PcHRpb25zPFRWYWx1ZSwgVEl0ZW0+IHtcbiAgb3B0aW9uczogUmVmPFRJdGVtW10+O1xuICBkZW5zZT86IFJlZjxib29sZWFuPjtcbiAgdmFsdWU6IFJlZjxUSXRlbSB8IFRJdGVtW10gfCB1bmRlZmluZWQ+O1xuICBtZW51UmVmOiBSZWY8SFRNTEVsZW1lbnQ+O1xuICBrZXlBdHRyPzogS2V5T2ZUeXBlPFRJdGVtLCBUVmFsdWUgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFUgOiBUVmFsdWU+O1xuICB0ZXh0QXR0cj86IGtleW9mIFRJdGVtIHwgKChpdGVtOiBUSXRlbSkgPT4gc3RyaW5nKTtcbiAgYXBwZW5kV2lkdGg/OiBudW1iZXI7XG4gIHByZXBlbmRXaWR0aD86IG51bWJlcjtcbiAgaXRlbUhlaWdodD86IG51bWJlcjtcbiAgb3ZlcnNjYW4/OiBudW1iZXI7XG4gIGF1dG9TZWxlY3RGaXJzdD86IGJvb2xlYW47XG4gIGF1dG9Gb2N1cz86IGJvb2xlYW47XG4gIHNldFZhbHVlPzogKHZhbDogVEl0ZW0pID0+IHZvaWQ7XG4gIGhpZGVTZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VEcm9wZG93bk9wdGlvblByb3BlcnR5PFRWYWx1ZSwgVEl0ZW0+KHtcbiAga2V5QXR0cixcbiAgdGV4dEF0dHIsXG59OiBEcm9wZG93bkl0ZW1BdHRyPFRWYWx1ZSwgVEl0ZW0+KSB7XG4gIGZ1bmN0aW9uIGdldFRleHQoaXRlbTogVEl0ZW0pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0ZXh0QXR0cikge1xuICAgICAgaWYgKHR5cGVvZiB0ZXh0QXR0ciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIHRleHRBdHRyKGl0ZW0pO1xuXG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBpdGVtW3RleHRBdHRyXT8udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbT8udG9TdHJpbmcoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldElkZW50aWZpZXIoaXRlbTogVEl0ZW0pOiBUSXRlbSB8IFRJdGVtW0tleU9mVHlwZTxUSXRlbSwgVFZhbHVlIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBVIDogVFZhbHVlPl0ge1xuICAgIGlmIChrZXlBdHRyKVxuICAgICAgcmV0dXJuIGl0ZW1ba2V5QXR0cl07XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0SWRlbnRpZmllcixcbiAgICBnZXRUZXh0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRHJvcGRvd25NZW51PFRWYWx1ZSwgVEl0ZW0+KHtcbiAgYXBwZW5kV2lkdGgsXG4gIGF1dG9Gb2N1cyxcbiAgYXV0b1NlbGVjdEZpcnN0LFxuICBkZW5zZSxcbiAgaGlkZVNlbGVjdGVkLFxuICBpdGVtSGVpZ2h0ID0gNDgsXG4gIGtleUF0dHIsXG4gIG1lbnVSZWYsXG4gIG9wdGlvbnM6IGFsbE9wdGlvbnMsXG4gIG92ZXJzY2FuID0gNSxcbiAgcHJlcGVuZFdpZHRoLFxuICBzZXRWYWx1ZSxcbiAgdGV4dEF0dHIsXG4gIHZhbHVlLFxufTogRHJvcGRvd25PcHRpb25zPFRWYWx1ZSwgVEl0ZW0+KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGdldChhbGxPcHRpb25zKTtcbiAgICBpZiAoIWhpZGVTZWxlY3RlZClcbiAgICAgIHJldHVybiBvcHRpb25zO1xuXG4gICAgcmV0dXJuIG9wdGlvbnMuZmlsdGVyKGl0ZW0gPT4gIWlzQWN0aXZlSXRlbShpdGVtKSk7XG4gIH0pO1xuXG4gIGNvbnN0IHsgZ2V0SWRlbnRpZmllciwgZ2V0VGV4dCB9ID0gdXNlRHJvcGRvd25PcHRpb25Qcm9wZXJ0eSh7XG4gICAga2V5QXR0cixcbiAgICB0ZXh0QXR0cixcbiAgfSk7XG5cbiAgY29uc3QgeyBjb250YWluZXJQcm9wcywgbGlzdCwgc2Nyb2xsVG8sIHdyYXBwZXJQcm9wcyB9ID0gdXNlVmlydHVhbExpc3Q8VEl0ZW0+KFxuICAgIG9wdGlvbnMsXG4gICAge1xuICAgICAgaXRlbUhlaWdodCxcbiAgICAgIG92ZXJzY2FuLFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgcmVuZGVyZWREYXRhID0gdXNlQXJyYXlNYXAobGlzdCwgKHsgZGF0YSwgaW5kZXg6IF9pbmRleCB9KSA9PiAoeyBfaW5kZXgsIGl0ZW06IGRhdGEgfSkpO1xuXG4gIGNvbnN0IGlzT3BlbiA9IHJlZihmYWxzZSk7XG5cbiAgY29uc3QgdmFsdWVLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBnZXQodmFsdWUpO1xuICAgIGlmICgha2V5QXR0ciB8fCAhc2VsZWN0ZWQpXG4gICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpID8gc2VsZWN0ZWQubWFwKGl0ZW0gPT4gaXRlbVtrZXlBdHRyXSkgOiBzZWxlY3RlZFtrZXlBdHRyXTtcbiAgfSk7XG5cbiAgY29uc3QgaGlnaGxpZ2h0ZWRJbmRleDogUmVmPG51bWJlcj4gPSByZWYoZ2V0KGF1dG9TZWxlY3RGaXJzdCkgPyAwIDogLTEpO1xuXG4gIGNvbnN0IG1lbnVXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB3aWR0aHMgPSB7IG1heDogMCwgbWluOiAwIH07XG4gICAgY29uc3QgbWF4V2lkdGggPSAzMDtcbiAgICBjb25zdCBwYWRkaW5nWCA9IDEuNTtcbiAgICBjb25zdCBmb250TXVsdGlwbGllciA9IGdldChkZW5zZSkgPyAxMiA6IDEzO1xuXG4gICAgZ2V0KG9wdGlvbnMpLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgbGVuZ3RoID0gZ2V0VGV4dChvcHRpb24pPy50b1N0cmluZygpPy5sZW5ndGggPz8gMDtcbiAgICAgIGlmICh3aWR0aHMubWluID09PSAwICYmIHdpZHRocy5tYXggPT09IDApIHtcbiAgICAgICAgd2lkdGhzLm1pbiA9IGxlbmd0aDtcbiAgICAgICAgd2lkdGhzLm1heCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA8IHdpZHRocy5taW4pIHtcbiAgICAgICAgd2lkdGhzLm1pbiA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA+IHdpZHRocy5tYXgpIHtcbiAgICAgICAgd2lkdGhzLm1heCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSB3aWR0aHMubWF4IC0gd2lkdGhzLm1pbjtcblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVWYWx1ZSh3aWR0aDogbnVtYmVyKSB7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsV2lkdGhzID0gKHByZXBlbmRXaWR0aCA/IHByZXBlbmRXaWR0aCArIDAuNSA6IDApICsgKGFwcGVuZFdpZHRoID8gYXBwZW5kV2lkdGggKyAwLjUgOiAwKTtcbiAgICAgIHJldHVybiBgJHtNYXRoLm1pbigod2lkdGggKiBmb250TXVsdGlwbGllcikgLyAxNiArIHBhZGRpbmdYICsgYWRkaXRpb25hbFdpZHRocywgbWF4V2lkdGgpfXJlbWA7XG4gICAgfVxuXG4gICAgaWYgKGRpZmZlcmVuY2UgPD0gNSlcbiAgICAgIHJldHVybiBjb21wdXRlVmFsdWUod2lkdGhzLm1heCk7XG5cbiAgICByZXR1cm4gY29tcHV0ZVZhbHVlKHdpZHRocy5taW4gKyBkaWZmZXJlbmNlIC8gMik7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHRvZ2dsZShzdGF0ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgc2V0KGlzT3Blbiwgc3RhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXRlbUluZGV4SW5WYWx1ZShpdGVtOiBUSXRlbSk6IG51bWJlciB7XG4gICAgY29uc3QgdmFsID0gZ2V0KHZhbHVlKTtcbiAgICBjb25zdCBzZWxlY3RlZDogVEl0ZW1bXSA9IEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6ICh2YWwgPyBbdmFsXSA6IFtdKTtcblxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gLTE7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWQuZmluZEluZGV4KChzZWxlY3RlZEl0ZW0pID0+IHtcbiAgICAgIGlmIChrZXlBdHRyKVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtW2tleUF0dHJdID09PSBpdGVtW2tleUF0dHJdO1xuICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQWN0aXZlSXRlbShpdGVtOiBUSXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtSW5kZXhJblZhbHVlKGl0ZW0pICE9PSAtMTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFkanVzdFNjcm9sbEJ5SGlnaGxpZ2h0ZWRJbmRleChzbW9vdGg6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGluZGV4ID0gZ2V0KGhpZ2hsaWdodGVkSW5kZXgpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBhd2FpdCBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldChtZW51UmVmKT8ucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodGVkRWxlbSA9IGdldChtZW51UmVmKS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdoaWdobGlnaHRlZCcpWzBdO1xuXG4gICAgICAgICAgaWYgKGhpZ2hsaWdodGVkRWxlbSkge1xuICAgICAgICAgICAgaGlnaGxpZ2h0ZWRFbGVtLnNjcm9sbEludG9WaWV3Py4oeyBiZWhhdmlvcjogc21vb3RoID8gJ3Ntb290aCcgOiAnYXV0bycsIGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgICAgICBpZiAoZ2V0KGF1dG9Gb2N1cykgJiYgJ2ZvY3VzJyBpbiBoaWdobGlnaHRlZEVsZW0gJiYgdHlwZW9mIGhpZ2hsaWdodGVkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWRFbGVtPy5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNjcm9sbFRvKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChnZXQoYXV0b0ZvY3VzKSkge1xuICAgICAgICAgICAgICBjb25zdCBlbGVtID0gZ2V0KG1lbnVSZWYpLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2hpZ2hsaWdodGVkJylbMF07XG4gICAgICAgICAgICAgIGlmIChlbGVtICYmICdmb2N1cycgaW4gZWxlbSAmJiB0eXBlb2YgZWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVPcGVuKG9wZW46IGJvb2xlYW4pIHtcbiAgICBhd2FpdCBuZXh0VGljaygoKSA9PiB7XG4gICAgICBpZiAob3Blbikge1xuICAgICAgICBjb25zdCB2YWwgPSBnZXQodmFsdWUpO1xuXG4gICAgICAgIC8vIHNldCBoaWdobGlnaHRlZCBpbmRleCB0byBhY3RpdmUgaXRlbVxuICAgICAgICBpZiAoKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID4gMCkgfHwgISF2YWwpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGdldChvcHRpb25zKS5maW5kSW5kZXgoaXNBY3RpdmVJdGVtKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSlcbiAgICAgICAgICAgIHNldChoaWdobGlnaHRlZEluZGV4LCBpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICB3YXRjaE9uY2UobGlzdCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IGFkanVzdFNjcm9sbEJ5SGlnaGxpZ2h0ZWRJbmRleCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHdhdGNoKGlzT3BlbiwgdXBkYXRlT3Blbik7XG5cbiAgd2F0Y2goaGlnaGxpZ2h0ZWRJbmRleCwgYXN5bmMgKGN1cnIsIHByZXYpID0+IHtcbiAgICBpZiAoY3VyciAhPT0gcHJldilcbiAgICAgIGF3YWl0IGFkanVzdFNjcm9sbEJ5SGlnaGxpZ2h0ZWRJbmRleCh0cnVlKTtcbiAgfSk7XG5cbiAgd2F0Y2gob3B0aW9ucywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChnZXQoaGlnaGxpZ2h0ZWRJbmRleCkgIT09IC0xKSB7XG4gICAgICBpZiAoZ2V0KGF1dG9TZWxlY3RGaXJzdCkpIHtcbiAgICAgICAgc2V0KGhpZ2hsaWdodGVkSW5kZXgsIDApO1xuICAgICAgICBhd2FpdCBhZGp1c3RTY3JvbGxCeUhpZ2hsaWdodGVkSW5kZXgoKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZXQoaGlnaGxpZ2h0ZWRJbmRleCwgLTEpO1xuICAgICAgICBzY3JvbGxUbygwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzY3JvbGxUbygwKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG1vdmVIaWdobGlnaHQgPSAodXA6IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoIWdldChpc09wZW4pKSB7XG4gICAgICB0b2dnbGUodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBvc2l0aW9uID0gZ2V0KGhpZ2hsaWdodGVkSW5kZXgpO1xuICAgIGNvbnN0IG1vdmUgPSB1cCA/IC0xIDogMTtcblxuICAgIHBvc2l0aW9uICs9IG1vdmU7XG5cbiAgICBjb25zdCB0b3RhbCA9IGdldChvcHRpb25zKS5sZW5ndGg7XG5cbiAgICBpZiAocG9zaXRpb24gPj0gdG90YWwpXG4gICAgICBzZXQoaGlnaGxpZ2h0ZWRJbmRleCwgMCk7XG4gICAgZWxzZSBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgc2V0KGhpZ2hsaWdodGVkSW5kZXgsIHRvdGFsIC0gMSk7XG4gICAgZWxzZVxuICAgICAgc2V0KGhpZ2hsaWdodGVkSW5kZXgsIHBvc2l0aW9uKTtcbiAgfTtcblxuICBjb25zdCBhcHBseUhpZ2hsaWdodGVkID0gKCkgPT4ge1xuICAgIGlmICghc2V0VmFsdWUgfHwgIWdldChpc09wZW4pKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgaGlnaGxpZ2h0ZWRJbmRleFZhbCA9IGdldChoaWdobGlnaHRlZEluZGV4KTtcbiAgICBpZiAoaGlnaGxpZ2h0ZWRJbmRleFZhbCA9PT0gLTEpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCBlbnRyeSA9IGdldChvcHRpb25zKS5maW5kKChfZGF0YSwgaW5kZXgpID0+IGhpZ2hsaWdodGVkSW5kZXhWYWwgPT09IGluZGV4KTtcbiAgICBpZiAoZW50cnkpXG4gICAgICBzZXRWYWx1ZShlbnRyeSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseUhpZ2hsaWdodGVkLFxuICAgIGNvbnRhaW5lclByb3BzLFxuICAgIGdldElkZW50aWZpZXIsXG4gICAgZ2V0VGV4dCxcbiAgICBoaWdobGlnaHRlZEluZGV4LFxuICAgIGlzQWN0aXZlSXRlbSxcbiAgICBpc09wZW4sXG4gICAgaXRlbUluZGV4SW5WYWx1ZSxcbiAgICBtZW51V2lkdGgsXG4gICAgbW92ZUhpZ2hsaWdodCxcbiAgICBvcHRpb25zV2l0aFNlbGVjdGVkSGlkZGVuOiBvcHRpb25zLFxuICAgIHJlbmRlcmVkRGF0YSxcbiAgICB0b2dnbGUsXG4gICAgdmFsdWVLZXksXG4gICAgd3JhcHBlclByb3BzLFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBDb21wdXRlZFJlZiwgTWF5YmVSZWYsIFJlZiB9IGZyb20gJ3Z1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQXV0b0NvbXBsZXRlRm9jdXNPcHRpb25zIHtcbiAgY3VzdG9tVmFsdWU6IE1heWJlUmVmPGJvb2xlYW4+O1xuICBzaG91bGRBcHBseVZhbHVlQXNTZWFyY2g6IE1heWJlUmVmPGJvb2xlYW4+O1xuICBkaXNhYmxlZDogTWF5YmVSZWY8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQXV0b0NvbXBsZXRlRm9jdXNEZXBzPFRJdGVtPiB7XG4gIGFjdGl2YXRvckZvY3VzZWQ6IFJlZjxib29sZWFuPjtcbiAgYWN0aXZhdG9yRm9jdXNlZFdpdGhpbjogUmVmPGJvb2xlYW4+O1xuICBmb2N1c2VkVmFsdWVJbmRleDogUmVmPG51bWJlcj47XG4gIGZpbHRlcmVkT3B0aW9uczogUmVmPFRJdGVtW10+O1xuICBpbnRlcm5hbFNlYXJjaDogUmVmPHN0cmluZz47XG4gIGlzT3BlbjogUmVmPGJvb2xlYW4+O1xuICBqdXN0T3BlbmVkOiBSZWY8Ym9vbGVhbj47XG4gIG1lbnVXcmFwcGVyRm9jdXNlZFdpdGhpbjogUmVmPGJvb2xlYW4+O1xuICBzZWFyY2hJbnB1dEZvY3VzZWQ6IFJlZjxib29sZWFuPjtcbiAgdGV4dElucHV0OiBSZWY8SFRNTElucHV0RWxlbWVudCB8IHVuZGVmaW5lZD47XG4gIHNldFNlYXJjaEFzVmFsdWU6ICgpID0+IHZvaWQ7XG4gIHVwZGF0ZUludGVybmFsU2VhcmNoOiAodmFsdWU/OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQXV0b0NvbXBsZXRlRm9jdXNSZXR1cm4ge1xuICBhbnlGb2N1c2VkOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgaW5wdXRDbGFzczogQ29tcHV0ZWRSZWY8c3RyaW5nPjtcbiAgb25BY3RpdmF0b3JGb2N1c2VkOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBvbklucHV0Rm9jdXNlZDogKCkgPT4gdm9pZDtcbiAgc2V0SW5wdXRGb2N1czogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUF1dG9Db21wbGV0ZUZvY3VzPFRJdGVtPihcbiAgb3B0aW9uczogVXNlQXV0b0NvbXBsZXRlRm9jdXNPcHRpb25zLFxuICBkZXBzOiBVc2VBdXRvQ29tcGxldGVGb2N1c0RlcHM8VEl0ZW0+LFxuKTogVXNlQXV0b0NvbXBsZXRlRm9jdXNSZXR1cm4ge1xuICBjb25zdCBhbnlGb2N1c2VkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT5cbiAgICBnZXQoZGVwcy5hY3RpdmF0b3JGb2N1c2VkV2l0aGluKSB8fCBnZXQoZGVwcy5tZW51V3JhcHBlckZvY3VzZWRXaXRoaW4pLFxuICApO1xuXG4gIGNvbnN0IGlucHV0Q2xhc3MgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICBjb25zdCBpc0ZvY3VzZWQgPSBnZXQoYW55Rm9jdXNlZCk7XG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IGdldChvcHRpb25zLmRpc2FibGVkKTtcbiAgICBjb25zdCBzaG91bGRBcHBseSA9IGdldChvcHRpb25zLnNob3VsZEFwcGx5VmFsdWVBc1NlYXJjaCk7XG4gICAgY29uc3QgaGFzU2VhcmNoID0gZ2V0KGRlcHMuaW50ZXJuYWxTZWFyY2gpO1xuXG4gICAgaWYgKCghaXNGb2N1c2VkIHx8IGlzRGlzYWJsZWQpICYmICFzaG91bGRBcHBseSlcbiAgICAgIHJldHVybiAndy0wIGgtMCc7XG4gICAgaWYgKGhhc1NlYXJjaClcbiAgICAgIHJldHVybiAnZmxleC0xIG1pbi13LVs0cmVtXSc7XG4gICAgcmV0dXJuICdmbGV4LTEgbWluLXctMCc7XG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHNldElucHV0Rm9jdXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgc2V0KGRlcHMuc2VhcmNoSW5wdXRGb2N1c2VkLCB0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9uQWN0aXZhdG9yRm9jdXNlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXh0VGljaygoKSA9PiB7XG4gICAgICBpZiAoIWdldChkZXBzLmFjdGl2YXRvckZvY3VzZWQpKSB7XG4gICAgICAgIHNldChkZXBzLnNlYXJjaElucHV0Rm9jdXNlZCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbklucHV0Rm9jdXNlZCgpOiB2b2lkIHtcbiAgICBzZXQoZGVwcy5mb2N1c2VkVmFsdWVJbmRleCwgLTEpO1xuXG4gICAgY29uc3Qgc2hvdWxkQXBwbHkgPSBnZXQob3B0aW9ucy5zaG91bGRBcHBseVZhbHVlQXNTZWFyY2gpO1xuICAgIGlmIChzaG91bGRBcHBseSkge1xuICAgICAgY29uc3QgdGV4dElucHV0ID0gZ2V0KGRlcHMudGV4dElucHV0KTtcbiAgICAgIHRleHRJbnB1dD8uc2VsZWN0KCk7XG4gICAgfVxuXG4gICAgaWYgKCFnZXQoZGVwcy5pc09wZW4pKSB7XG4gICAgICBzZXQoZGVwcy5qdXN0T3BlbmVkLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvLyBDbG9zZSBtZW51IGlmIHRoZSBhY3RpdmF0b3IgaXMgbm90IGZvY3VzZWQgYW55bW9yZVxuICAvLyBVc2luZyBkZWJvdW5jZWQgdG8gYXZvaWQgdGhlIG1lbnUgY2xvc2luZyBtb21lbnRhcmlseSB3aGlsZSBmb2N1cyBzd2l0Y2hlcy5cbiAgd2F0Y2hEZWJvdW5jZWQoYW55Rm9jdXNlZCwgKGZvY3VzZWQpID0+IHtcbiAgICBpZiAoIWZvY3VzZWQpIHtcbiAgICAgIHNldChkZXBzLmlzT3BlbiwgZmFsc2UpO1xuXG4gICAgICBjb25zdCBjdXN0b21WYWx1ZSA9IGdldChvcHRpb25zLmN1c3RvbVZhbHVlKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9IGdldChkZXBzLmZpbHRlcmVkT3B0aW9ucyk7XG4gICAgICBjb25zdCBpbnRlcm5hbFNlYXJjaCA9IGdldChkZXBzLmludGVybmFsU2VhcmNoKTtcblxuICAgICAgaWYgKGN1c3RvbVZhbHVlICYmIGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPT09IDAgJiYgaW50ZXJuYWxTZWFyY2gpIHtcbiAgICAgICAgZGVwcy5zZXRTZWFyY2hBc1ZhbHVlKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNob3VsZEFwcGx5ID0gZ2V0KG9wdGlvbnMuc2hvdWxkQXBwbHlWYWx1ZUFzU2VhcmNoKTtcbiAgICAgIGlmICghc2hvdWxkQXBwbHkpIHtcbiAgICAgICAgZGVwcy51cGRhdGVJbnRlcm5hbFNlYXJjaCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGRlYm91bmNlOiAyMDAsXG4gICAgbWF4V2FpdDogNDAwLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGFueUZvY3VzZWQsXG4gICAgaW5wdXRDbGFzcyxcbiAgICBvbkFjdGl2YXRvckZvY3VzZWQsXG4gICAgb25JbnB1dEZvY3VzZWQsXG4gICAgc2V0SW5wdXRGb2N1cyxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmVSZWYsIFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ0B2dWV1c2Uvc2hhcmVkJztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VBdXRvQ29tcGxldGVLZXlib2FyZE5hdmlnYXRpb25PcHRpb25zIHtcbiAgbXVsdGlwbGU6IE1heWJlUmVmPGJvb2xlYW4+O1xuICBjdXN0b21WYWx1ZTogTWF5YmVSZWY8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQXV0b0NvbXBsZXRlS2V5Ym9hcmROYXZpZ2F0aW9uRGVwczxUSXRlbT4ge1xuICBpbnRlcm5hbFNlYXJjaDogUmVmPHN0cmluZz47XG4gIHZhbHVlOiBSZWY8VEl0ZW1bXT47XG4gIGZpbHRlcmVkT3B0aW9uczogUmVmPFRJdGVtW10+O1xuICBvcHRpb25zOiBSZWY8VEl0ZW1bXT47XG4gIGlzT3BlbjogUmVmPGJvb2xlYW4+O1xuICBoaWdobGlnaHRlZEluZGV4OiBSZWY8bnVtYmVyPjtcbiAgc2VhcmNoSW5wdXRGb2N1c2VkOiBSZWY8Ym9vbGVhbj47XG4gIGFwcGx5SGlnaGxpZ2h0ZWQ6ICgpID0+IHZvaWQ7XG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xuICBzZXRTZWFyY2hBc1ZhbHVlOiAoKSA9PiB2b2lkO1xuICBhY3RpdmF0b3I6IFJlZjxIVE1MRWxlbWVudCB8IHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQXV0b0NvbXBsZXRlS2V5Ym9hcmROYXZpZ2F0aW9uUmV0dXJuIHtcbiAgZm9jdXNlZFZhbHVlSW5kZXg6IFJlZjxudW1iZXI+O1xuICBtb3ZlU2VsZWN0ZWRWYWx1ZUhpZ2hsaWdodDogKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBuZXh0OiBib29sZWFuKSA9PiB2b2lkO1xuICBvbkVudGVyOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQ7XG4gIG9uVGFiOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQ7XG4gIG9uSW5wdXREZWxldGVQcmVzc2VkOiAoKSA9PiB2b2lkO1xuICBzZXRWYWx1ZUZvY3VzOiAoaW5kZXg6IG51bWJlcikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUF1dG9Db21wbGV0ZUtleWJvYXJkTmF2aWdhdGlvbjxUSXRlbT4oXG4gIG9wdGlvbnM6IFVzZUF1dG9Db21wbGV0ZUtleWJvYXJkTmF2aWdhdGlvbk9wdGlvbnMsXG4gIGRlcHM6IFVzZUF1dG9Db21wbGV0ZUtleWJvYXJkTmF2aWdhdGlvbkRlcHM8VEl0ZW0+LFxuKTogVXNlQXV0b0NvbXBsZXRlS2V5Ym9hcmROYXZpZ2F0aW9uUmV0dXJuIHtcbiAgY29uc3QgZm9jdXNlZFZhbHVlSW5kZXggPSByZWY8bnVtYmVyPigtMSk7XG4gIGNvbnN0IGNoaXBFbGVtZW50c0NhY2hlID0gcmVmPE1hcDxudW1iZXIsIEhUTUxFbGVtZW50Pj4obmV3IE1hcCgpKTtcblxuICBmdW5jdGlvbiBzZXRWYWx1ZUZvY3VzKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBzZXQoZm9jdXNlZFZhbHVlSW5kZXgsIGluZGV4KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVTZWxlY3RlZFZhbHVlSGlnaGxpZ2h0KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBuZXh0OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbXVsdGlwbGUgPSBnZXQob3B0aW9ucy5tdWx0aXBsZSk7XG4gICAgY29uc3QgaW50ZXJuYWxTZWFyY2hWYWx1ZSA9IGdldChkZXBzLmludGVybmFsU2VhcmNoKTtcblxuICAgIGlmICghbXVsdGlwbGUgfHwgaW50ZXJuYWxTZWFyY2hWYWx1ZS5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuO1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB0b3RhbCA9IGdldChkZXBzLnZhbHVlKS5sZW5ndGg7XG5cbiAgICBsZXQgY3VycmVudCA9IGdldChmb2N1c2VkVmFsdWVJbmRleCk7XG5cbiAgICBpZiAoY3VycmVudCA9PT0gLTEpIHtcbiAgICAgIHNldChmb2N1c2VkVmFsdWVJbmRleCwgbmV4dCA/IDAgOiB0b3RhbCAtIDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1vdmUgPSBuZXh0ID8gMSA6IC0xO1xuICAgIGN1cnJlbnQgKz0gbW92ZTtcblxuICAgIGlmIChjdXJyZW50IDwgMCB8fCBjdXJyZW50ID49IHRvdGFsKSB7XG4gICAgICBzZXQoZm9jdXNlZFZhbHVlSW5kZXgsIC0xKTtcbiAgICAgIHNldChkZXBzLnNlYXJjaElucHV0Rm9jdXNlZCwgdHJ1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc2V0KGZvY3VzZWRWYWx1ZUluZGV4LCBjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkVudGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gZ2V0KGRlcHMuZmlsdGVyZWRPcHRpb25zKTtcbiAgICBjb25zdCBoaWdobGlnaHRlZEluZGV4ID0gZ2V0KGRlcHMuaGlnaGxpZ2h0ZWRJbmRleCk7XG4gICAgY29uc3QgaXNPcGVuID0gZ2V0KGRlcHMuaXNPcGVuKTtcbiAgICBjb25zdCBjdXN0b21WYWx1ZSA9IGdldChvcHRpb25zLmN1c3RvbVZhbHVlKTtcbiAgICBjb25zdCBtdWx0aXBsZSA9IGdldChvcHRpb25zLm11bHRpcGxlKTtcbiAgICBjb25zdCB2YWx1ZSA9IGdldChkZXBzLnZhbHVlKTtcbiAgICBjb25zdCBpbnRlcm5hbFNlYXJjaCA9IGdldChkZXBzLmludGVybmFsU2VhcmNoKTtcblxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCB1c2UgY3VzdG9tIHZhbHVlXG4gICAgaWYgKGN1c3RvbVZhbHVlICYmIGludGVybmFsU2VhcmNoICYmIGlzT3Blbikge1xuICAgICAgLy8gQ2hlY2sgaWYgYW55IG9wdGlvbiBleGFjdGx5IG1hdGNoZXMgdGhlIHNlYXJjaCB0ZXJtXG4gICAgICBsZXQgaGFzRXhhY3RNYXRjaCA9IGZhbHNlO1xuXG4gICAgICBpZiAoaGlnaGxpZ2h0ZWRJbmRleCA+IC0xICYmIGhpZ2hsaWdodGVkSW5kZXggPCBmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGhpZ2hsaWdodGVkT3B0aW9uID0gZmlsdGVyZWRPcHRpb25zW2hpZ2hsaWdodGVkSW5kZXhdO1xuICAgICAgICBpZiAodHlwZW9mIGhpZ2hsaWdodGVkT3B0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGhhc0V4YWN0TWF0Y2ggPSBoaWdobGlnaHRlZE9wdGlvbiA9PT0gaW50ZXJuYWxTZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGlnaGxpZ2h0ZWRPcHRpb24gJiYgdHlwZW9mIGhpZ2hsaWdodGVkT3B0aW9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGNvbnN0IGxhYmVsID0gKGhpZ2hsaWdodGVkT3B0aW9uIGFzIGFueSkubGFiZWwgfHwgKGhpZ2hsaWdodGVkT3B0aW9uIGFzIGFueSkudmFsdWUgfHwgJyc7XG4gICAgICAgICAgaGFzRXhhY3RNYXRjaCA9IGxhYmVsID09PSBpbnRlcm5hbFNlYXJjaDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBleGFjdCBtYXRjaCB3aXRoIGhpZ2hsaWdodGVkIG9wdGlvbiwgdXNlIGN1c3RvbSB2YWx1ZVxuICAgICAgaWYgKCFoYXNFeGFjdE1hdGNoKSB7XG4gICAgICAgIGRlcHMuc2V0U2VhcmNoQXNWYWx1ZSgpO1xuICAgICAgICBpZiAoIW11bHRpcGxlKVxuICAgICAgICAgIHNldChkZXBzLmlzT3BlbiwgZmFsc2UpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwICYmIGhpZ2hsaWdodGVkSW5kZXggPiAtMSAmJiBpc09wZW4pIHtcbiAgICAgIGRlcHMuYXBwbHlIaWdobGlnaHRlZCgpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA9PT0gMCAmJiBjdXN0b21WYWx1ZSAmJiBpbnRlcm5hbFNlYXJjaCkge1xuICAgICAgZGVwcy5zZXRTZWFyY2hBc1ZhbHVlKCk7XG4gICAgICBpZiAoIW11bHRpcGxlKVxuICAgICAgICBzZXQoZGVwcy5pc09wZW4sIGZhbHNlKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpc09wZW4gJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBzZXQoZGVwcy5pc09wZW4sIHRydWUpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXQoZGVwcy5hY3RpdmF0b3IpO1xuICAgICAgY29uc3QgZm9ybSA9IGFjdGl2YXRvcj8uY2xvc2VzdCgnZm9ybScpO1xuICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgZm9ybS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnc3VibWl0JykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVGFiKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaXNPcGVuID0gZ2V0KGRlcHMuaXNPcGVuKTtcbiAgICBjb25zdCBmaWx0ZXJlZE9wdGlvbnMgPSBnZXQoZGVwcy5maWx0ZXJlZE9wdGlvbnMpO1xuICAgIGNvbnN0IGhpZ2hsaWdodGVkSW5kZXggPSBnZXQoZGVwcy5oaWdobGlnaHRlZEluZGV4KTtcbiAgICBjb25zdCBtdWx0aXBsZSA9IGdldChvcHRpb25zLm11bHRpcGxlKTtcblxuICAgIGlmIChpc09wZW4gJiYgZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDAgJiYgaGlnaGxpZ2h0ZWRJbmRleCA+IC0xICYmICFtdWx0aXBsZSkge1xuICAgICAgZGVwcy5hcHBseUhpZ2hsaWdodGVkKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uSW5wdXREZWxldGVQcmVzc2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IGludGVybmFsU2VhcmNoID0gZ2V0KGRlcHMuaW50ZXJuYWxTZWFyY2gpO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0KGRlcHMudmFsdWUpO1xuICAgIGNvbnN0IHRvdGFsID0gdmFsdWUubGVuZ3RoO1xuICAgIGNvbnN0IG11bHRpcGxlID0gZ2V0KG9wdGlvbnMubXVsdGlwbGUpO1xuXG4gICAgaWYgKCFpbnRlcm5hbFNlYXJjaCAmJiB0b3RhbCA+IDApIHtcbiAgICAgIGlmIChtdWx0aXBsZSlcbiAgICAgICAgc2V0KGZvY3VzZWRWYWx1ZUluZGV4LCB0b3RhbCAtIDEpO1xuICAgICAgZWxzZVxuICAgICAgICBkZXBzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2F0Y2ggdmFsdWUgY2hhbmdlcyB0byByZXNldCBmb2N1c2VkIGluZGV4IGFuZCBjbGVhciBjYWNoZVxuICB3YXRjaChkZXBzLnZhbHVlLCAoKSA9PiB7XG4gICAgc2V0VmFsdWVGb2N1cygtMSk7XG4gICAgZ2V0KGNoaXBFbGVtZW50c0NhY2hlKS5jbGVhcigpO1xuICB9KTtcblxuICAvLyBXYXRjaCBmb2N1c2VkIHZhbHVlIGluZGV4IHRvIGhhbmRsZSBjaGlwIGZvY3VzXG4gIHdhdGNoKGZvY3VzZWRWYWx1ZUluZGV4LCBhc3luYyAoaW5kZXgpID0+IHtcbiAgICBjb25zdCBtdWx0aXBsZSA9IGdldChvcHRpb25zLm11bHRpcGxlKTtcbiAgICBpZiAoaW5kZXggPT09IC0xIHx8ICFtdWx0aXBsZSlcbiAgICAgIHJldHVybjtcblxuICAgIGF3YWl0IG5leHRUaWNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gZ2V0KGNoaXBFbGVtZW50c0NhY2hlKTtcbiAgICAgIGxldCBhY3RpdmVDaGlwID0gY2FjaGUuZ2V0KGluZGV4KTtcblxuICAgICAgaWYgKCFhY3RpdmVDaGlwKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2YXRvciA9IGdldChkZXBzLmFjdGl2YXRvcik7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhY3RpdmF0b3I/LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWluZGV4PVwiJHtpbmRleH1cIl1gKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgYWN0aXZlQ2hpcCA9IGVsZW1lbnQ7XG4gICAgICAgICAgY2FjaGUuc2V0KGluZGV4LCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlQ2hpcCAmJiAnZm9jdXMnIGluIGFjdGl2ZUNoaXAgJiYgdHlwZW9mIGFjdGl2ZUNoaXAuZm9jdXMgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGFjdGl2ZUNoaXAuZm9jdXMoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBmb2N1c2VkVmFsdWVJbmRleCxcbiAgICBtb3ZlU2VsZWN0ZWRWYWx1ZUhpZ2hsaWdodCxcbiAgICBvbkVudGVyLFxuICAgIG9uSW5wdXREZWxldGVQcmVzc2VkLFxuICAgIG9uVGFiLFxuICAgIHNldFZhbHVlRm9jdXMsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IE1heWJlUmVmLCBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgZ2V0LCBzZXQgfSBmcm9tICdAdnVldXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBnZXRUZXh0VG9rZW4gfSBmcm9tICdAL3V0aWxzL2hlbHBlcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUF1dG9Db21wbGV0ZVNlYXJjaE9wdGlvbnM8VEl0ZW0+IHtcbiAga2V5QXR0cj86IE1heWJlUmVmPGtleW9mIFRJdGVtIHwgdW5kZWZpbmVkPjtcbiAgdGV4dEF0dHI/OiBNYXliZVJlZjxrZXlvZiBUSXRlbSB8IHVuZGVmaW5lZD47XG4gIG5vRmlsdGVyPzogTWF5YmVSZWY8Ym9vbGVhbj47XG4gIGZpbHRlcj86IE1heWJlUmVmPCgoaXRlbTogVEl0ZW0sIHF1ZXJ5VGV4dDogc3RyaW5nKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZD47XG4gIGN1c3RvbVZhbHVlPzogTWF5YmVSZWY8Ym9vbGVhbj47XG4gIGhpZGVDdXN0b21WYWx1ZT86IE1heWJlUmVmPGJvb2xlYW4+O1xuICByZXR1cm5PYmplY3Q/OiBNYXliZVJlZjxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VBdXRvQ29tcGxldGVTZWFyY2hSZXR1cm48VEl0ZW0+IHtcbiAgaW50ZXJuYWxTZWFyY2g6IFJlZjxzdHJpbmc+O1xuICBkZWJvdW5jZWRJbnRlcm5hbFNlYXJjaDogUmVhZG9ubHk8UmVmPHN0cmluZz4+O1xuICBmaWx0ZXJlZE9wdGlvbnM6IFJlYWRvbmx5PFJlZjxUSXRlbVtdPj47XG4gIGp1c3RPcGVuZWQ6IFJlZjxib29sZWFuPjtcbiAgdXBkYXRlSW50ZXJuYWxTZWFyY2g6ICh2YWx1ZT86IHN0cmluZykgPT4gdm9pZDtcbiAgdGV4dFZhbHVlVG9Qcm9wZXJWYWx1ZTogKHZhbDogYW55LCByZXR1cm5PYmplY3Q/OiBib29sZWFuKSA9PiBUSXRlbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUF1dG9Db21wbGV0ZVNlYXJjaDxUSXRlbT4oXG4gIG9wdGlvbnM6IE1heWJlUmVmPFRJdGVtW10+LFxuICBzZWFyY2hNb2RlbDogUmVmPHN0cmluZz4sXG4gIG9wdHM6IFVzZUF1dG9Db21wbGV0ZVNlYXJjaE9wdGlvbnM8VEl0ZW0+LFxuKTogVXNlQXV0b0NvbXBsZXRlU2VhcmNoUmV0dXJuPFRJdGVtPiB7XG4gIGNvbnN0IGludGVybmFsU2VhcmNoID0gcmVmPHN0cmluZz4oJycpO1xuICBjb25zdCBkZWJvdW5jZWRJbnRlcm5hbFNlYXJjaCA9IHJlZkRlYm91bmNlZChpbnRlcm5hbFNlYXJjaCwgNTApO1xuICBjb25zdCBqdXN0T3BlbmVkID0gcmVmPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyBNZW1vaXplIHRva2VuIGNvbXB1dGF0aW9uIHRvIGF2b2lkIHJlcGVhdGVkIHN0cmluZyBwcm9jZXNzaW5nXG4gIGNvbnN0IHRva2VuQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBnZXRDYWNoZWRUZXh0VG9rZW4gPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBpZiAodG9rZW5DYWNoZS5oYXModGV4dCkpIHtcbiAgICAgIHJldHVybiB0b2tlbkNhY2hlLmdldCh0ZXh0KSE7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZ2V0VGV4dFRva2VuKHRleHQpO1xuICAgIHRva2VuQ2FjaGUuc2V0KHRleHQsIHRva2VuKTtcbiAgICByZXR1cm4gdG9rZW47XG4gIH07XG5cbiAgY29uc3QgZmlsdGVyZWRPcHRpb25zID0gY29tcHV0ZWQ8VEl0ZW1bXT4oKCkgPT4ge1xuICAgIGNvbnN0IHNlYXJjaCA9IGdldChkZWJvdW5jZWRJbnRlcm5hbFNlYXJjaCk7XG4gICAgY29uc3Qgb3B0aW9uc1ZhbHVlID0gZ2V0KG9wdGlvbnMpO1xuXG4gICAgY29uc3Qgbm9GaWx0ZXIgPSBnZXQob3B0cy5ub0ZpbHRlcik7XG4gICAgaWYgKG5vRmlsdGVyIHx8ICFzZWFyY2ggfHwgZ2V0KGp1c3RPcGVuZWQpKVxuICAgICAgcmV0dXJuIG9wdGlvbnNWYWx1ZTtcblxuICAgIGNvbnN0IGtleUF0dHIgPSBnZXQob3B0cy5rZXlBdHRyKTtcbiAgICBjb25zdCB0ZXh0QXR0ciA9IGdldChvcHRzLnRleHRBdHRyKTtcbiAgICBjb25zdCBmaWx0ZXIgPSBnZXQob3B0cy5maWx0ZXIpO1xuXG4gICAgLy8gQ2FjaGUgdGhlIHNlYXJjaCB0b2tlbiBvbmNlXG4gICAgY29uc3Qgc2VhcmNoVG9rZW4gPSBnZXRDYWNoZWRUZXh0VG9rZW4oc2VhcmNoKTtcblxuICAgIGNvbnN0IHVzZWRGaWx0ZXIgPSBmaWx0ZXIgfHwgKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3Qga2V5d29yZHM6IHN0cmluZ1tdID0gW2tleUF0dHIgPyBnZXRDYWNoZWRUZXh0VG9rZW4oKGl0ZW0gYXMgYW55KVtrZXlBdHRyXSkgOiBpdGVtLnRvU3RyaW5nKCldO1xuXG4gICAgICBpZiAodGV4dEF0dHIgJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKVxuICAgICAgICBrZXl3b3Jkcy5wdXNoKGdldENhY2hlZFRleHRUb2tlbigoaXRlbSBhcyBhbnkpW3RleHRBdHRyXSkpO1xuXG4gICAgICByZXR1cm4ga2V5d29yZHMuc29tZShrZXl3b3JkID0+IGdldENhY2hlZFRleHRUb2tlbihrZXl3b3JkKS5pbmNsdWRlcyhzZWFyY2hUb2tlbikpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZmlsdGVyZWQgPSBvcHRpb25zVmFsdWUuZmlsdGVyKGl0ZW0gPT4gdXNlZEZpbHRlcihpdGVtLCBzZWFyY2gpKTtcblxuICAgIGNvbnN0IGN1c3RvbVZhbHVlID0gZ2V0KG9wdHMuY3VzdG9tVmFsdWUpO1xuICAgIGNvbnN0IGhpZGVDdXN0b21WYWx1ZSA9IGdldChvcHRzLmhpZGVDdXN0b21WYWx1ZSk7XG4gICAgaWYgKCFjdXN0b21WYWx1ZSB8fCBoaWRlQ3VzdG9tVmFsdWUgfHwgIXNlYXJjaCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgIH1cblxuICAgIC8vIFVzZSBhIG1vcmUgZWZmaWNpZW50IGNoZWNrIGZvciBjdXN0b20gdmFsdWUgaW5jbHVzaW9uXG4gICAgY29uc3QgaXNDdXN0b21WYWx1ZUluY2x1ZGVkID0gZmlsdGVyZWQuc29tZSgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsID0gdGV4dEF0dHIgPyAoaXRlbSBhcyBhbnkpW3RleHRBdHRyXSA6IGl0ZW0udG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiB2YWwgPT09IHNlYXJjaDtcbiAgICB9KTtcblxuICAgIGlmIChpc0N1c3RvbVZhbHVlSW5jbHVkZWQpIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gW3RleHRWYWx1ZVRvUHJvcGVyVmFsdWUoc2VhcmNoLCB7XG4gICAgICBrZXlBdHRyLFxuICAgICAgcmV0dXJuT2JqZWN0OiBnZXQob3B0cy5yZXR1cm5PYmplY3QpLFxuICAgICAgdGV4dEF0dHIsXG4gICAgfSksIC4uLmZpbHRlcmVkXTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gdGV4dFZhbHVlVG9Qcm9wZXJWYWx1ZSh2YWw6IGFueSwgb3B0aW9uczogeyBrZXlBdHRyPzoga2V5b2YgVEl0ZW07IHRleHRBdHRyPzoga2V5b2YgVEl0ZW07IHJldHVybk9iamVjdD86IGJvb2xlYW4gfSk6IFRJdGVtIHtcbiAgICBjb25zdCB7IGtleUF0dHIsIHJldHVybk9iamVjdCwgdGV4dEF0dHIgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFrZXlBdHRyIHx8IHJldHVybk9iamVjdClcbiAgICAgIHJldHVybiB2YWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgW2tleUF0dHJdOiB2YWwsXG4gICAgICAuLi4oXG4gICAgICAgIHRleHRBdHRyXG4gICAgICAgICAgPyB7IFt0ZXh0QXR0cl06IHZhbCB9XG4gICAgICAgICAgOiB7fVxuICAgICAgKSxcbiAgICB9IGFzIFRJdGVtO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlSW50ZXJuYWxTZWFyY2godmFsdWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgc2V0KHNlYXJjaE1vZGVsLCB2YWx1ZSk7XG4gICAgc2V0KGludGVybmFsU2VhcmNoLCB2YWx1ZSk7XG4gIH1cblxuICB3YXRjaChzZWFyY2hNb2RlbCwgKHNlYXJjaCkgPT4ge1xuICAgIHNldChpbnRlcm5hbFNlYXJjaCwgc2VhcmNoKTtcbiAgfSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cbiAgLy8gQ2xlYXIgdG9rZW4gY2FjaGUgd2hlbiBjb21wb25lbnQgdW5tb3VudHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgb25Vbm1vdW50ZWQoKCkgPT4ge1xuICAgIHRva2VuQ2FjaGUuY2xlYXIoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBkZWJvdW5jZWRJbnRlcm5hbFNlYXJjaCxcbiAgICBmaWx0ZXJlZE9wdGlvbnMsXG4gICAgaW50ZXJuYWxTZWFyY2gsXG4gICAganVzdE9wZW5lZCxcbiAgICB0ZXh0VmFsdWVUb1Byb3BlclZhbHVlOiAodmFsOiBhbnksIHJldHVybk9iamVjdE92ZXJyaWRlOiBib29sZWFuID0gZmFsc2UpID0+IHRleHRWYWx1ZVRvUHJvcGVyVmFsdWUodmFsLCB7XG4gICAgICBrZXlBdHRyOiBnZXQob3B0cy5rZXlBdHRyKSxcbiAgICAgIHJldHVybk9iamVjdDogcmV0dXJuT2JqZWN0T3ZlcnJpZGUgfHwgZ2V0KG9wdHMucmV0dXJuT2JqZWN0KSxcbiAgICAgIHRleHRBdHRyOiBnZXQob3B0cy50ZXh0QXR0ciksXG4gICAgfSksXG4gICAgdXBkYXRlSW50ZXJuYWxTZWFyY2gsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBNYXliZVJlZiwgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGdldCwgc2V0IH0gZnJvbSAnQHZ1ZXVzZS9zaGFyZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUF1dG9Db21wbGV0ZVZhbHVlT3B0aW9uczxUSXRlbT4ge1xuICBrZXlBdHRyPzogTWF5YmVSZWY8a2V5b2YgVEl0ZW0gfCB1bmRlZmluZWQ+O1xuICByZXR1cm5PYmplY3Q/OiBNYXliZVJlZjxib29sZWFuPjtcbiAgY3VzdG9tVmFsdWU/OiBNYXliZVJlZjxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VBdXRvQ29tcGxldGVWYWx1ZVJldHVybjxUSXRlbT4ge1xuICB2YWx1ZTogQ29tcHV0ZWRSZWY8VEl0ZW1bXT47XG4gIHNldFNlbGVjdGVkOiAoc2VsZWN0ZWQ6IFRJdGVtW10pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQXV0b0NvbXBsZXRlVmFsdWVEZXBzPFRJdGVtPiB7XG4gIGdldElkZW50aWZpZXI6IChpdGVtOiBUSXRlbSkgPT4gYW55O1xuICBnZXRUZXh0OiAoaXRlbTogVEl0ZW0pID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdGV4dFZhbHVlVG9Qcm9wZXJWYWx1ZTogKHZhbDogYW55LCByZXR1cm5PYmplY3Q/OiBib29sZWFuKSA9PiBUSXRlbTtcbiAgc2hvdWxkQXBwbHlWYWx1ZUFzU2VhcmNoOiBNYXliZVJlZjxib29sZWFuPjtcbiAgaXNPcGVuOiBNYXliZVJlZjxib29sZWFuPjtcbiAgdXBkYXRlSW50ZXJuYWxTZWFyY2g6ICh2YWx1ZT86IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUF1dG9Db21wbGV0ZVZhbHVlPFRWYWx1ZSwgVEl0ZW0+KFxuICBtb2RlbFZhbHVlOiBSZWY8VFZhbHVlIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogTWF5YmVSZWY8VEl0ZW1bXT4sXG4gIG9wdHM6IFVzZUF1dG9Db21wbGV0ZVZhbHVlT3B0aW9uczxUSXRlbT4sXG4gIGRlcHM6IFVzZUF1dG9Db21wbGV0ZVZhbHVlRGVwczxUSXRlbT4sXG4pOiBVc2VBdXRvQ29tcGxldGVWYWx1ZVJldHVybjxUSXRlbT4ge1xuICBjb25zdCBtdWx0aXBsZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IEFycmF5LmlzQXJyYXkoZ2V0KG1vZGVsVmFsdWUpKSk7XG5cbiAgLy8gQ3JlYXRlIG1hcHMgZm9yIE8oMSkgbG9va3VwIHBlcmZvcm1hbmNlXG4gIGNvbnN0IG9wdGlvbnNNYXAgPSBjb21wdXRlZDxNYXA8YW55LCBUSXRlbT4+KCgpID0+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPGFueSwgVEl0ZW0+KCk7XG4gICAgY29uc3Qgb3B0aW9uc0RhdGEgPSBnZXQob3B0aW9ucyk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIG9wdGlvbnNEYXRhKSB7XG4gICAgICBtYXAuc2V0KGRlcHMuZ2V0SWRlbnRpZmllcihpdGVtKSwgaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNvbnZlcnRNb2RlbFZhbHVlVG9BcnJheShtb2RlbFZhbHVlRGF0YTogVFZhbHVlIHwgdW5kZWZpbmVkKTogYW55W10ge1xuICAgIGlmICghbW9kZWxWYWx1ZURhdGEpXG4gICAgICByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZURhdGEpID8gbW9kZWxWYWx1ZURhdGEgOiBbbW9kZWxWYWx1ZURhdGFdO1xuICB9XG5cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzQnlPcHRpb25zKFxuICAgIHZhbHVlQXJyYXk6IGFueVtdLFxuICAgIG9wdGlvbnNNYXBEYXRhOiBNYXA8YW55LCBUSXRlbT4sXG4gICAgY3VzdG9tVmFsdWU6IGJvb2xlYW4sXG4gICAgcmV0dXJuT2JqZWN0OiBib29sZWFuLFxuICApOiBUSXRlbVtdIHtcbiAgICBjb25zdCBmaWx0ZXJlZDogVEl0ZW1bXSA9IFtdO1xuICAgIGZpbHRlcmVkLmxlbmd0aCA9IHZhbHVlQXJyYXkubGVuZ3RoOyAvLyBQcmUtYWxsb2NhdGUgYXJyYXkgc2l6ZVxuICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZUFycmF5KSB7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gZGVwcy5nZXRJZGVudGlmaWVyKHZhbCk7XG4gICAgICBjb25zdCBpbk9wdGlvbnMgPSBvcHRpb25zTWFwRGF0YS5nZXQoaWRlbnRpZmllcik7XG5cbiAgICAgIGlmIChpbk9wdGlvbnMpIHtcbiAgICAgICAgZmlsdGVyZWRbaW5kZXgrK10gPSBpbk9wdGlvbnM7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChjdXN0b21WYWx1ZSkge1xuICAgICAgICBmaWx0ZXJlZFtpbmRleCsrXSA9IGRlcHMudGV4dFZhbHVlVG9Qcm9wZXJWYWx1ZSh2YWwsIHJldHVybk9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmlsdGVyZWQubGVuZ3RoID0gaW5kZXg7IC8vIFRyaW0gdG8gYWN0dWFsIHNpemVcbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXNCeUlkZW50aWZpZXIoXG4gICAgdmFsdWVBcnJheTogYW55W10sXG4gICAgb3B0aW9uc01hcERhdGE6IE1hcDxhbnksIFRJdGVtPixcbiAgICBjdXN0b21WYWx1ZTogYm9vbGVhbixcbiAgICByZXR1cm5PYmplY3Q6IGJvb2xlYW4sXG4gICk6IFRJdGVtW10ge1xuICAgIGNvbnN0IGZpbHRlcmVkOiBUSXRlbVtdID0gW107XG4gICAgZmlsdGVyZWQubGVuZ3RoID0gdmFsdWVBcnJheS5sZW5ndGg7IC8vIFByZS1hbGxvY2F0ZSBhcnJheSBzaXplXG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlQXJyYXkpIHtcbiAgICAgIGNvbnN0IGluT3B0aW9ucyA9IG9wdGlvbnNNYXBEYXRhLmdldCh2YWwpO1xuXG4gICAgICBpZiAoaW5PcHRpb25zKSB7XG4gICAgICAgIGZpbHRlcmVkW2luZGV4KytdID0gaW5PcHRpb25zO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoY3VzdG9tVmFsdWUpIHtcbiAgICAgICAgZmlsdGVyZWRbaW5kZXgrK10gPSBkZXBzLnRleHRWYWx1ZVRvUHJvcGVyVmFsdWUodmFsLCByZXR1cm5PYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpbHRlcmVkLmxlbmd0aCA9IGluZGV4OyAvLyBUcmltIHRvIGFjdHVhbCBzaXplXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc1JldHVybk9iamVjdFZhbHVlKFxuICAgIG1vZGVsVmFsdWVEYXRhOiBUVmFsdWUgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uc01hcERhdGE6IE1hcDxhbnksIFRJdGVtPixcbiAgICByZXR1cm5PYmplY3Q6IGJvb2xlYW4sXG4gICAgY3VzdG9tVmFsdWU6IGJvb2xlYW4sXG4gICAgc2hvdWxkVXBkYXRlSW50ZXJuYWxTZWFyY2g6IGJvb2xlYW4sXG4gICk6IFRJdGVtW10ge1xuICAgIGNvbnN0IG11bHRpcGxlVmFsdWUgPSBBcnJheS5pc0FycmF5KG1vZGVsVmFsdWVEYXRhKTtcbiAgICBjb25zdCB2YWx1ZUFycmF5ID0gY29udmVydE1vZGVsVmFsdWVUb0FycmF5KG1vZGVsVmFsdWVEYXRhKTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGZpbHRlclZhbHVlc0J5T3B0aW9ucyh2YWx1ZUFycmF5LCBvcHRpb25zTWFwRGF0YSwgY3VzdG9tVmFsdWUsIHJldHVybk9iamVjdCk7XG5cbiAgICBpZiAobXVsdGlwbGVWYWx1ZSB8fCBmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVJbnRlcm5hbFNlYXJjaClcbiAgICAgICAgZGVwcy51cGRhdGVJbnRlcm5hbFNlYXJjaCgpO1xuICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbCA9IGZpbHRlcmVkWzBdO1xuICAgIGlmIChzaG91bGRVcGRhdGVJbnRlcm5hbFNlYXJjaClcbiAgICAgIGRlcHMudXBkYXRlSW50ZXJuYWxTZWFyY2goZGVwcy5nZXRUZXh0KHZhbCkpO1xuICAgIHJldHVybiBbdmFsXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NTdGFuZGFyZFZhbHVlKFxuICAgIG1vZGVsVmFsdWVEYXRhOiBUVmFsdWUgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uc01hcERhdGE6IE1hcDxhbnksIFRJdGVtPixcbiAgICByZXR1cm5PYmplY3Q6IGJvb2xlYW4sXG4gICAgY3VzdG9tVmFsdWU6IGJvb2xlYW4sXG4gICAgc2hvdWxkVXBkYXRlSW50ZXJuYWxTZWFyY2g6IGJvb2xlYW4sXG4gICk6IFRJdGVtW10ge1xuICAgIGNvbnN0IHZhbHVlQXJyYXkgPSBjb252ZXJ0TW9kZWxWYWx1ZVRvQXJyYXkobW9kZWxWYWx1ZURhdGEpO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gZmlsdGVyVmFsdWVzQnlJZGVudGlmaWVyKHZhbHVlQXJyYXksIG9wdGlvbnNNYXBEYXRhLCBjdXN0b21WYWx1ZSwgcmV0dXJuT2JqZWN0KTtcblxuICAgIGlmIChzaG91bGRVcGRhdGVJbnRlcm5hbFNlYXJjaCkge1xuICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGVwcy51cGRhdGVJbnRlcm5hbFNlYXJjaChkZXBzLmdldFRleHQoZmlsdGVyZWRbMF0pKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBkZXBzLnVwZGF0ZUludGVybmFsU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gb25VcGRhdGVNb2RlbFZhbHVlKHZhbHVlOiBUVmFsdWUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBzZXQobW9kZWxWYWx1ZSwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VsZWN0ZWQoc2VsZWN0ZWQ6IFRJdGVtW10pOiB2b2lkIHtcbiAgICBjb25zdCBrZXlBdHRyID0gZ2V0KG9wdHMua2V5QXR0cik7XG4gICAgY29uc3QgcmV0dXJuT2JqZWN0ID0gZ2V0KG9wdHMucmV0dXJuT2JqZWN0KTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBrZXlBdHRyICYmICFyZXR1cm5PYmplY3QgPyBzZWxlY3RlZC5tYXAoaXRlbSA9PiBpdGVtW2tleUF0dHJdKSA6IHNlbGVjdGVkO1xuXG4gICAgaWYgKGdldChtdWx0aXBsZSkpXG4gICAgICByZXR1cm4gb25VcGRhdGVNb2RlbFZhbHVlKHNlbGVjdGlvbiBhcyBUVmFsdWUpO1xuXG4gICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gb25VcGRhdGVNb2RlbFZhbHVlKHVuZGVmaW5lZCk7XG5cbiAgICByZXR1cm4gb25VcGRhdGVNb2RlbFZhbHVlKHNlbGVjdGlvblswXSBhcyBUVmFsdWUpO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSBjb21wdXRlZDxUSXRlbVtdPih7XG4gICAgZ2V0OiAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbFZhbHVlRGF0YSA9IGdldChtb2RlbFZhbHVlKTtcbiAgICAgIGNvbnN0IGtleUF0dHIgPSBnZXQob3B0cy5rZXlBdHRyKTtcbiAgICAgIGNvbnN0IHJldHVybk9iamVjdCA9IGdldChvcHRzLnJldHVybk9iamVjdCkgPz8gZmFsc2U7XG4gICAgICBjb25zdCBjdXN0b21WYWx1ZSA9IGdldChvcHRzLmN1c3RvbVZhbHVlKSA/PyBmYWxzZTtcbiAgICAgIGNvbnN0IG9wdGlvbnNNYXBEYXRhID0gZ2V0KG9wdGlvbnNNYXApO1xuICAgICAgY29uc3Qgc2hvdWxkVXBkYXRlSW50ZXJuYWxTZWFyY2ggPSBnZXQoZGVwcy5zaG91bGRBcHBseVZhbHVlQXNTZWFyY2gpICYmICFnZXQoZGVwcy5pc09wZW4pO1xuXG4gICAgICBpZiAoa2V5QXR0ciAmJiByZXR1cm5PYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm5PYmplY3RWYWx1ZShcbiAgICAgICAgICBtb2RlbFZhbHVlRGF0YSxcbiAgICAgICAgICBvcHRpb25zTWFwRGF0YSxcbiAgICAgICAgICByZXR1cm5PYmplY3QsXG4gICAgICAgICAgY3VzdG9tVmFsdWUsXG4gICAgICAgICAgc2hvdWxkVXBkYXRlSW50ZXJuYWxTZWFyY2gsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9jZXNzU3RhbmRhcmRWYWx1ZShcbiAgICAgICAgbW9kZWxWYWx1ZURhdGEsXG4gICAgICAgIG9wdGlvbnNNYXBEYXRhLFxuICAgICAgICByZXR1cm5PYmplY3QsXG4gICAgICAgIGN1c3RvbVZhbHVlLFxuICAgICAgICBzaG91bGRVcGRhdGVJbnRlcm5hbFNlYXJjaCxcbiAgICAgICk7XG4gICAgfSxcbiAgICBzZXQ6IChzZWxlY3RlZDogVEl0ZW1bXSk6IHZvaWQgPT4ge1xuICAgICAgc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc2V0U2VsZWN0ZWQsXG4gICAgdmFsdWUsXG4gIH07XG59XG4iLCJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2dWUnO1xuXG5leHBvcnQgY29uc3QgUlVJX0kxOE5fSU5KRUNUSU9OX0tFWSA9IFN5bWJvbCgncnVpOmkxOG4nKTtcblxuaW50ZXJmYWNlIEkxOG5Qcm92aWRlciB7XG4gIHQ6IHtcbiAgICAoa2V5OiBzdHJpbmcsIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmc7XG4gICAgKGtleTogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4sIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVpSTE4blByb3ZpZGVyIHtcbiAgdDogKGtleTogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBzdHJpbmc7XG4gIHRlOiAoa2V5OiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSdWlJOG4oKTogSTE4blByb3ZpZGVyIHtcbiAgY29uc3QgaTE4blByb3ZpZGVyID0gaW5qZWN0PFJ1aUkxOG5Qcm92aWRlciB8IHVuZGVmaW5lZD4oUlVJX0kxOE5fSU5KRUNUSU9OX0tFWSwgdW5kZWZpbmVkKTtcblxuICBjb25zdCB0cmFuc2xhdGUgPSAoa2V5OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmIChpMThuUHJvdmlkZXI/LnRlKGtleSkpIHtcbiAgICAgIHJldHVybiBpMThuUHJvdmlkZXI/LnQoa2V5LCBwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIGNvbnN0IHQgPSAoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgcGFyYW1zT3JGYWxsYmFjaz86IFJlY29yZDxzdHJpbmcsIGFueT4gfCBzdHJpbmcsXG4gICAgZmFsbGJhY2s/OiBzdHJpbmcsXG4gICk6IHN0cmluZyA9PiB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXNPckZhbGxiYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZShrZXkpID8/IHBhcmFtc09yRmFsbGJhY2sgPz8ga2V5O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB0cmFuc2xhdGUoa2V5LCBwYXJhbXNPckZhbGxiYWNrKSA/PyBmYWxsYmFjayA/PyBrZXk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7IHQgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmVSZWYgfSBmcm9tICdAdnVldXNlL3NoYXJlZCc7XG5pbXBvcnQgdHlwZSB7IEluamVjdGlvbktleSwgUmVmIH0gZnJvbSAndnVlJztcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZU9wdGlvbnMge1xuICBpdGVtc1BlclBhZ2U6IFJlZjxudW1iZXI+O1xuICBnbG9iYWxJdGVtc1BlclBhZ2U6IE1heWJlUmVmPGJvb2xlYW4+O1xuICBsaW1pdHM6IE1heWJlUmVmPG51bWJlcltdPjtcbiAgc3RpY2t5T2Zmc2V0OiBNYXliZVJlZjxudW1iZXI+O1xufVxuXG5leHBvcnQgY29uc3QgVGFibGVTeW1ib2w6IEluamVjdGlvbktleTxUYWJsZU9wdGlvbnM+ID0gU3ltYm9sLmZvcigncnVpOnRhYmxlJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYWJsZURlZmF1bHRzKG9wdGlvbnM/OiBQYXJ0aWFsPFRhYmxlT3B0aW9ucz4pOiBUYWJsZU9wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIGdsb2JhbEl0ZW1zUGVyUGFnZTogZmFsc2UsXG4gICAgaXRlbXNQZXJQYWdlOiByZWYoMTApLFxuICAgIGxpbWl0czogWzEwLCAyNSwgNTAsIDEwMF0sXG4gICAgc3RpY2t5T2Zmc2V0OiByZWYoMCksXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRhYmxlKCkge1xuICBjb25zdCBvcHRpb25zID0gaW5qZWN0KFRhYmxlU3ltYm9sKTtcblxuICBpZiAoIW9wdGlvbnMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBydWkgdGFibGUgb3B0aW9ucyBpbmplY3Rpb24nKTtcblxuICByZXR1cm4gb3B0aW9ucztcbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmVSZWYgfSBmcm9tICdAdnVldXNlL3NoYXJlZCc7XG5cbi8qKlxuICogU2V0dXAgc3RpY2t5IHRhYmxlIGhlYWRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU3RpY2t5VGFibGVIZWFkZXIoc3RpY2t5OiBNYXliZVJlZjxib29sZWFuPiA9IHJlZihmYWxzZSksIG9mZnNldFRvcD86IE1heWJlUmVmPG51bWJlcj4pIHtcbiAgY29uc3QgdGFibGU6IFJlZjxIVE1MVGFibGVFbGVtZW50IHwgbnVsbD4gPSByZWYobnVsbCk7XG4gIGNvbnN0IHRhYmxlU2Nyb2xsZXI6IFJlZjxIVE1MRWxlbWVudCB8IG51bGw+ID0gcmVmKG51bGwpO1xuICBjb25zdCBzdGljazogUmVmPGJvb2xlYW4+ID0gcmVmKGZhbHNlKTtcbiAgY29uc3QgYm9yZGVyUHJlY2lzaW9uID0gLTAuNTtcbiAgY29uc3Qgc2VsZWN0b3JzID0ge1xuICAgIGhlYWQ6ICc6c2NvcGUgPiB0aGVhZFtkYXRhLWlkPWhlYWQtbWFpbl0nLFxuICAgIGhlYWRDbG9uZTogJzpzY29wZSA+IHRoZWFkW2RhdGEtaWQ9aGVhZC1jbG9uZV0nLFxuICAgIHJvdzogJzpzY29wZSA+IHRib2R5ID4gdHI6bm90KFtoaWRkZW5dKScsXG4gICAgdGg6ICc6c2NvcGUgPiB0aCcsXG4gIH07XG5cbiAgY29uc3Qgd2F0Y2hDZWxsV2lkdGggPSAoKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IGdldCh0YWJsZSk7XG5cbiAgICBpZiAoIWdldChzdGlja3kpIHx8ICFyb290KVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgdGhlYWRDbG9uZTogSFRNTEhlYWRFbGVtZW50IHwgbnVsbCA9IHJvb3QucXVlcnlTZWxlY3RvcihcbiAgICAgIGAke3NlbGVjdG9ycy5oZWFkQ2xvbmV9ID4gdHJgLFxuICAgICk7XG5cbiAgICBjb25zdCBoZWFkOiBIVE1MSGVhZEVsZW1lbnQgfCBudWxsXG4gICAgICA9IHJvb3QucXVlcnlTZWxlY3RvcihgJHtzZWxlY3RvcnMuaGVhZH0gPiB0cmApID8/IG51bGw7XG5cbiAgICBjb25zdCBvYnNlcnZlQ2hpbGRUaCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbnM6IE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkID0gaGVhZD8ucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgc2VsZWN0b3JzLnRoLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgY2xvbmVkQ29sdW1uczogTm9kZUxpc3RPZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWRcbiAgICAgICAgPSB0aGVhZENsb25lPy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9ycy50aCk7XG5cbiAgICAgIGNsb25lZENvbHVtbnM/LmZvckVhY2goKHRoOiBIVE1MRWxlbWVudCwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgIHVzZVJlc2l6ZU9ic2VydmVyKHRoLCAoZW50cmllcykgPT4ge1xuICAgICAgICAgIGNvbnN0IGNlbGxSZWN0ID0gZW50cmllc1swXS50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1ucz8uaXRlbShpKTtcbiAgICAgICAgICBpZiAoY29sdW1uKVxuICAgICAgICAgICAgY29sdW1uLnN0eWxlLndpZHRoID0gYCR7Y2VsbFJlY3Qud2lkdGh9cHhgO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB1c2VNdXRhdGlvbk9ic2VydmVyKHRoZWFkQ2xvbmUsIChtdXRhdGlvbnNMaXN0KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uc0xpc3QpIHtcbiAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnIHx8IG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJylcbiAgICAgICAgICBvYnNlcnZlQ2hpbGRUaCgpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbCBzZXR1cCB0byBvYnNlcnZlIHRoZSBleGlzdGluZyB0aCBlbGVtZW50c1xuICAgIG9ic2VydmVDaGlsZFRoKCk7XG4gIH07XG5cbiAgY29uc3QgdG9nZ2xlU3RpY2t5Q2xhc3MgPSAoKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IGdldCh0YWJsZSk7XG5cbiAgICBpZiAoIWdldChzdGlja3kpIHx8ICFyb290KVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IHJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdGhlYWRDbG9uZTogSFRNTEhlYWRFbGVtZW50IHwgbnVsbCA9IHJvb3QucXVlcnlTZWxlY3RvcihcbiAgICAgIHNlbGVjdG9ycy5oZWFkQ2xvbmUsXG4gICAgKTtcblxuICAgIGNvbnN0IGNsb25lZFJlY3Q6IERPTVJlY3QgfCB1bmRlZmluZWQgPSB0aGVhZENsb25lPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IGhlYWQ6IEhUTUxIZWFkRWxlbWVudCB8IG51bGxcbiAgICAgID0gcm9vdC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9ycy5oZWFkKSA/PyBudWxsO1xuXG4gICAgY29uc3QgaGVhZFJlY3Q6IERPTVJlY3QgfCB1bmRlZmluZWQgPSBoZWFkPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmICghcmVjdCB8fCAhY2xvbmVkUmVjdCB8fCAhaGVhZCB8fCAhdGhlYWRDbG9uZSB8fCAhaGVhZFJlY3QpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCB7XG4gICAgICBoZWlnaHQ6IHRoZWFkSGVpZ2h0LFxuICAgICAgbGVmdDogdGhlYWRMZWZ0LFxuICAgICAgd2lkdGg6IHRoZWFkV2lkdGgsXG4gICAgfSA9IGNsb25lZFJlY3Q7XG5cbiAgICBjb25zdCB7IGJvdHRvbTogdGFibGVCb3R0b20sIHRvcDogdGFibGVUb3AgfSA9IHJlY3Q7XG4gICAgY29uc3QgdG9wID0gZ2V0KG9mZnNldFRvcCkgPz8gMDtcblxuICAgIGhlYWQuc3R5bGUud2lkdGggPSBgJHt0aGVhZFdpZHRofXB4YDtcblxuICAgIGNvbnN0IHJvd3MgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzLnJvdyk7XG5cbiAgICBjb25zdCBsYXN0Um93UmVjdDogRE9NUmVjdCB8IHVuZGVmaW5lZCA9IHJvd3NcbiAgICAgIC5pdGVtKHJvd3MubGVuZ3RoIC0gMSlcbiAgICAgID8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBpZiAodGFibGVUb3AgPD0gdG9wICYmIHRhYmxlQm90dG9tID4gdG9wICYmIHJvd3MubGVuZ3RoID4gMSkge1xuICAgICAgc2V0KHN0aWNrLCB0cnVlKTtcbiAgICAgIGhlYWQuc3R5bGUubGVmdCA9IGAke3RoZWFkTGVmdCArIGJvcmRlclByZWNpc2lvbn1weGA7XG5cbiAgICAgIGNvbnN0IGxhc3RSb3dIZWlnaHQgPSBsYXN0Um93UmVjdD8uaGVpZ2h0ID8/IDA7XG4gICAgICBpZiAodGFibGVCb3R0b20gPD0gbGFzdFJvd0hlaWdodCArIHRoZWFkSGVpZ2h0ICsgdG9wKVxuICAgICAgICBoZWFkLnN0eWxlLnRvcCA9IGAke3RhYmxlQm90dG9tIC0gbGFzdFJvd0hlaWdodCAtIHRoZWFkSGVpZ2h0fXB4YDtcbiAgICAgIGVsc2VcbiAgICAgICAgaGVhZC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHNldChzdGljaywgZmFsc2UpO1xuICAgICAgaGVhZC5zdHlsZS5sZWZ0ID0gYCR7Ym9yZGVyUHJlY2lzaW9ufXB4YDtcbiAgICAgIGhlYWQuc3R5bGUudG9wID0gJzAnO1xuICAgIH1cbiAgfTtcblxuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHRvZ2dsZVN0aWNreUNsYXNzKCk7XG4gICAgdXNlRXZlbnRMaXN0ZW5lcih0YWJsZVNjcm9sbGVyLCAnc2Nyb2xsJywgdG9nZ2xlU3RpY2t5Q2xhc3MpO1xuICAgIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQuYm9keSwgJ3Njcm9sbCcsIHRvZ2dsZVN0aWNreUNsYXNzKTtcbiAgICB1c2VFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIHRvZ2dsZVN0aWNreUNsYXNzKTtcbiAgICB3YXRjaENlbGxXaWR0aCgpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHN0aWNrLFxuICAgIHRhYmxlLFxuICAgIHRhYmxlU2Nyb2xsZXIsXG4gIH07XG59XG4iXSwibmFtZXMiOlsidXNlQnJlYWtwb2ludCIsIndpZHRoIiwidXNlV2luZG93U2l6ZSIsImJyZWFrcG9pbnRMaXN0IiwiYnJlYWtwb2ludHNUYWlsd2luZCIsImJyZWFrcG9pbnRzIiwidXNlQnJlYWtwb2ludHMiLCJnZXRLZXlzIiwibGlzdCIsInJhd1NpemVzIiwiYnJlYWtwb2ludCIsImluZGV4Iiwic2l6ZXMiLCJ2YWx1ZSIsImNhbWVsQ2FzZSIsInNpemVzVXAiLCJzaXplc0Rvd24iLCJuYW1lIiwiY29tcHV0ZWQiLCJpdGVtIiwiZ2V0IiwicmVxdWlyZWRJY29ucyIsIkx1Q2hldnJvbnNVcERvd24iLCJMdUVsbGlwc2lzIiwiTHVUcmlhbmdsZUFsZXJ0IiwiTHVYIiwiTHVJbmZvIiwiTHVBcnJvd1VwIiwiTHVBcnJvd0Rvd24iLCJMdUFycm93TGVmdCIsIkx1QXJyb3dSaWdodCIsIkx1Q2hldnJvblVwIiwiTHVDaGV2cm9uRG93biIsIkx1Q2hldnJvbkxlZnQiLCJMdUNoZXZyb25SaWdodCIsIkx1Q2hldnJvbnNMZWZ0IiwiTHVDaGV2cm9uc1JpZ2h0IiwiTHVDaXJjbGVBbGVydCIsIkx1RXllIiwiTHVFeWVPZmYiLCJMdUNoZWNrIiwiTHVDaXJjbGVYIiwiTHVDaXJjbGVDaGVjayIsIkx1Q2hlY2tib3hCbGFuayIsIkx1Q2hlY2tib3hGaWxsIiwiTHVDaGVja2JveEluZGV0ZXJtaW5hdGVGaWxsIiwiTHVDaGVja2JveEJsYW5rQ2lyY2xlIiwiTHVDaGVja2JveEJsYW5rQ2lyY2xlRmlsbCIsIkx1UmFkaW9CdXR0b25GaWxsIiwiTHVDbG9jayIsIkljb25zU3ltYm9sIiwiY3JlYXRlSWNvbkRlZmF1bHRzIiwib3B0aW9ucyIsImljb25zVG9BZGQiLCJjb21wb25lbnRzIiwidXNlSWNvbnMiLCJpY29ucyIsImluamVjdCIsImFzc2VydCIsImNvbmZpZyIsInJlZiIsImRlZmF1bHRUaGVtZSIsInVzZVJvdGtpVGhlbWUiLCJjcmVhdGVTaGFyZWRDb21wb3NhYmxlIiwic3RhdGUiLCJzdG9yZSIsInVzZUNvbG9yTW9kZSIsImlzQXV0b0NvbnRyb2xsZWQiLCJUaGVtZU1vZGUiLCJpc0xpZ2h0IiwiaXNEYXJrIiwidGhlbWUiLCJzd2l0Y2hUaGVtZVNjaGVtZSIsIm1vZGUiLCJzZXQiLCJ0b2dnbGVUaGVtZU1vZGUiLCJzZXRUaGVtZUNvbmZpZyIsIm5ld0NvbmZpZyIsIndhdGNoIiwic3R5bGVWYXJpYWJsZXMiLCJjb250ZXh0IiwiY29udGV4dE9iamVjdCIsInJvb3RTdHlsZSIsInZhcmlhYmxlTmFtZSIsInVzZVRpbWVvdXRNYW5hZ2VyIiwidGltZW91dCIsImNsZWFyIiwiY2FsbGJhY2siLCJkZWxheSIsIkRFRkFVTFRfUE9QUEVSX09QVElPTlMiLCJ1c2VQb3BwZXIiLCJkaXNhYmxlZCIsIm9wZW5EZWxheSIsImNsb3NlRGVsYXkiLCJ2aXJ0dWFsUmVmZXJlbmNlIiwicmVmZXJlbmNlIiwicG9wcGVyIiwiaW5zdGFuY2UiLCJvcGVuIiwicG9wcGVyRW50ZXIiLCJsZWF2ZVBlbmRpbmciLCJvcGVuVGltZW91dE1hbmFnZXIiLCJjbG9zZVRpbWVvdXRNYW5hZ2VyIiwib25Qb3BwZXJMZWF2ZSIsInVwZGF0ZVBvcHBlciIsIm9uT3BlbiIsImltbWVkaWF0ZSIsIm9uQ2xvc2UiLCJvbkxlYXZlUGVuZGluZyIsIm1vZGlmaWVycyIsImFkYXB0aXZlIiwiZ3B1QWNjZWxlcmF0aW9uIiwibG9ja2VkIiwib2Zmc2V0RGlzdGFuY2UiLCJvZmZzZXRTa2lkIiwib3ZlcmZsb3dQYWRkaW5nIiwicmVzaXplIiwic2Nyb2xsIiwicG9wcGVyQ29uZmlnIiwicGxhY2VtZW50Iiwic3RyYXRlZ3kiLCJnZXRWYWxpZEVsZW1lbnRzIiwicG9wcGVyRWwiLCJ1bnJlZkVsZW1lbnQiLCJyZWZlcmVuY2VFbCIsImluaXRpYWxpemVQb3BwZXIiLCJvbkludmFsaWRhdGUiLCJlbGVtZW50cyIsImNyZWF0ZVBvcHBlciIsInVzZVJlc2l6ZU9ic2VydmVyIiwiaXNEZWZpbmVkIiwib25Nb3VudGVkIiwid2F0Y2hFZmZlY3QiLCJ1c2VEcm9wZG93bk9wdGlvblByb3BlcnR5Iiwia2V5QXR0ciIsInRleHRBdHRyIiwiZ2V0VGV4dCIsImdldElkZW50aWZpZXIiLCJ1c2VEcm9wZG93bk1lbnUiLCJhcHBlbmRXaWR0aCIsImF1dG9Gb2N1cyIsImF1dG9TZWxlY3RGaXJzdCIsImRlbnNlIiwiaGlkZVNlbGVjdGVkIiwiaXRlbUhlaWdodCIsIm1lbnVSZWYiLCJhbGxPcHRpb25zIiwib3ZlcnNjYW4iLCJwcmVwZW5kV2lkdGgiLCJzZXRWYWx1ZSIsImlzQWN0aXZlSXRlbSIsImNvbnRhaW5lclByb3BzIiwic2Nyb2xsVG8iLCJ3cmFwcGVyUHJvcHMiLCJ1c2VWaXJ0dWFsTGlzdCIsInJlbmRlcmVkRGF0YSIsInVzZUFycmF5TWFwIiwiZGF0YSIsIl9pbmRleCIsImlzT3BlbiIsInZhbHVlS2V5Iiwic2VsZWN0ZWQiLCJoaWdobGlnaHRlZEluZGV4IiwibWVudVdpZHRoIiwid2lkdGhzIiwibWF4V2lkdGgiLCJwYWRkaW5nWCIsImZvbnRNdWx0aXBsaWVyIiwib3B0aW9uIiwibGVuZ3RoIiwiZGlmZmVyZW5jZSIsImNvbXB1dGVWYWx1ZSIsImFkZGl0aW9uYWxXaWR0aHMiLCJ0b2dnbGUiLCJpdGVtSW5kZXhJblZhbHVlIiwidmFsIiwic2VsZWN0ZWRJdGVtIiwiYWRqdXN0U2Nyb2xsQnlIaWdobGlnaHRlZEluZGV4Iiwic21vb3RoIiwibmV4dFRpY2siLCJoaWdobGlnaHRlZEVsZW0iLCJlbGVtIiwidXBkYXRlT3BlbiIsIndhdGNoT25jZSIsImN1cnIiLCJwcmV2IiwiaGlnaGxpZ2h0ZWRJbmRleFZhbCIsImVudHJ5IiwiX2RhdGEiLCJ1cCIsInBvc2l0aW9uIiwidG90YWwiLCJ1c2VBdXRvQ29tcGxldGVGb2N1cyIsImRlcHMiLCJhbnlGb2N1c2VkIiwiaW5wdXRDbGFzcyIsImlzRm9jdXNlZCIsImlzRGlzYWJsZWQiLCJzaG91bGRBcHBseSIsImhhc1NlYXJjaCIsInNldElucHV0Rm9jdXMiLCJvbkFjdGl2YXRvckZvY3VzZWQiLCJvbklucHV0Rm9jdXNlZCIsIndhdGNoRGVib3VuY2VkIiwiZm9jdXNlZCIsImN1c3RvbVZhbHVlIiwiZmlsdGVyZWRPcHRpb25zIiwiaW50ZXJuYWxTZWFyY2giLCJ1c2VBdXRvQ29tcGxldGVLZXlib2FyZE5hdmlnYXRpb24iLCJmb2N1c2VkVmFsdWVJbmRleCIsImNoaXBFbGVtZW50c0NhY2hlIiwic2V0VmFsdWVGb2N1cyIsIm1vdmVTZWxlY3RlZFZhbHVlSGlnaGxpZ2h0IiwiZXZlbnQiLCJuZXh0IiwibXVsdGlwbGUiLCJpbnRlcm5hbFNlYXJjaFZhbHVlIiwiY3VycmVudCIsIm9uRW50ZXIiLCJoYXNFeGFjdE1hdGNoIiwiaGlnaGxpZ2h0ZWRPcHRpb24iLCJmb3JtIiwib25UYWIiLCJvbklucHV0RGVsZXRlUHJlc3NlZCIsImNhY2hlIiwiYWN0aXZlQ2hpcCIsImVsZW1lbnQiLCJ1c2VBdXRvQ29tcGxldGVTZWFyY2giLCJzZWFyY2hNb2RlbCIsIm9wdHMiLCJkZWJvdW5jZWRJbnRlcm5hbFNlYXJjaCIsInJlZkRlYm91bmNlZCIsImp1c3RPcGVuZWQiLCJ0b2tlbkNhY2hlIiwiZ2V0Q2FjaGVkVGV4dFRva2VuIiwidGV4dCIsInRva2VuIiwiZ2V0VGV4dFRva2VuIiwic2VhcmNoIiwib3B0aW9uc1ZhbHVlIiwiZmlsdGVyIiwic2VhcmNoVG9rZW4iLCJ1c2VkRmlsdGVyIiwia2V5d29yZHMiLCJrZXl3b3JkIiwiZmlsdGVyZWQiLCJoaWRlQ3VzdG9tVmFsdWUiLCJ0ZXh0VmFsdWVUb1Byb3BlclZhbHVlIiwicmV0dXJuT2JqZWN0IiwidXBkYXRlSW50ZXJuYWxTZWFyY2giLCJvblVubW91bnRlZCIsInJldHVybk9iamVjdE92ZXJyaWRlIiwidXNlQXV0b0NvbXBsZXRlVmFsdWUiLCJtb2RlbFZhbHVlIiwib3B0aW9uc01hcCIsIm1hcCIsIm9wdGlvbnNEYXRhIiwiY29udmVydE1vZGVsVmFsdWVUb0FycmF5IiwibW9kZWxWYWx1ZURhdGEiLCJmaWx0ZXJWYWx1ZXNCeU9wdGlvbnMiLCJ2YWx1ZUFycmF5Iiwib3B0aW9uc01hcERhdGEiLCJpZGVudGlmaWVyIiwiaW5PcHRpb25zIiwiZmlsdGVyVmFsdWVzQnlJZGVudGlmaWVyIiwicHJvY2Vzc1JldHVybk9iamVjdFZhbHVlIiwic2hvdWxkVXBkYXRlSW50ZXJuYWxTZWFyY2giLCJtdWx0aXBsZVZhbHVlIiwicHJvY2Vzc1N0YW5kYXJkVmFsdWUiLCJvblVwZGF0ZU1vZGVsVmFsdWUiLCJzZXRTZWxlY3RlZCIsInNlbGVjdGlvbiIsIlJVSV9JMThOX0lOSkVDVElPTl9LRVkiLCJ1c2VSdWlJOG4iLCJpMThuUHJvdmlkZXIiLCJ0cmFuc2xhdGUiLCJrZXkiLCJwYXJhbXMiLCJwYXJhbXNPckZhbGxiYWNrIiwiZmFsbGJhY2siLCJUYWJsZVN5bWJvbCIsImNyZWF0ZVRhYmxlRGVmYXVsdHMiLCJ1c2VUYWJsZSIsInVzZVN0aWNreVRhYmxlSGVhZGVyIiwic3RpY2t5Iiwib2Zmc2V0VG9wIiwidGFibGUiLCJ0YWJsZVNjcm9sbGVyIiwic3RpY2siLCJib3JkZXJQcmVjaXNpb24iLCJzZWxlY3RvcnMiLCJ3YXRjaENlbGxXaWR0aCIsInJvb3QiLCJ0aGVhZENsb25lIiwiaGVhZCIsIm9ic2VydmVDaGlsZFRoIiwiY29sdW1ucyIsInRoIiwiaSIsImVudHJpZXMiLCJjZWxsUmVjdCIsImNvbHVtbiIsInVzZU11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnNMaXN0IiwibXV0YXRpb24iLCJ0b2dnbGVTdGlja3lDbGFzcyIsInJlY3QiLCJjbG9uZWRSZWN0IiwiaGVhZFJlY3QiLCJ0aGVhZEhlaWdodCIsInRoZWFkTGVmdCIsInRoZWFkV2lkdGgiLCJ0YWJsZUJvdHRvbSIsInRhYmxlVG9wIiwidG9wIiwicm93cyIsImxhc3RSb3dSZWN0IiwibGFzdFJvd0hlaWdodCIsInVzZUV2ZW50TGlzdGVuZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUlPLFNBQVNBLEtBQWdCO0FBQzlCLFFBQU0sRUFBRSxPQUFBQyxFQUFBLElBQVVDLEdBQUEsR0FFWkMsSUFBaUI7QUFBQSxJQUNyQixJQUFJO0FBQUEsSUFDSixHQUFHQztBQUFBLEVBQUEsR0FLQ0MsSUFBY0MsR0FBZUgsQ0FBYyxHQUUzQ0ksSUFBVSxPQUFPLE1BRWpCQyxJQUFPRCxFQUFRSixDQUFjLEdBRTdC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