@ethlete/core 4.13.0 → 4.15.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.
- package/CHANGELOG.md +16 -0
- package/esm2022/lib/utils/scrollable.utils.mjs +17 -6
- package/esm2022/lib/utils/signal.utils.mjs +68 -94
- package/fesm2022/ethlete-core.mjs +84 -99
- package/fesm2022/ethlete-core.mjs.map +1 -1
- package/lib/props/create-prop-handlers.d.ts +6 -6
- package/lib/props/props.directive.d.ts +6 -6
- package/lib/utils/scrollable.utils.d.ts +1 -0
- package/lib/utils/signal.utils.d.ts +25 -30
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { coerceElement } from '@angular/cdk/coercion';
|
|
2
|
-
import { DestroyRef, ElementRef, Injector, NgZone, QueryList, afterNextRender, computed, effect, inject, isDevMode, isSignal, runInInjectionContext, signal, untracked, } from '@angular/core';
|
|
2
|
+
import { DestroyRef, ElementRef, Injector, NgZone, QueryList, Renderer2, RendererStyleFlags2, afterNextRender, computed, effect, inject, isDevMode, isSignal, runInInjectionContext, signal, untracked, } from '@angular/core';
|
|
3
3
|
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { Observable, debounceTime, distinctUntilChanged, map, merge, of, pairwise, startWith, switchMap } from 'rxjs';
|
|
5
5
|
import { RouterStateService } from '../services';
|
|
@@ -58,51 +58,7 @@ const buildElementSignal = (el) => {
|
|
|
58
58
|
previousElement: previousElements?.[0] ?? null,
|
|
59
59
|
}))), { initialValue: { currentElement: null, previousElement: null, previousElements: [], currentElements: [] } });
|
|
60
60
|
};
|
|
61
|
-
export const buildSignalEffects = (config) => {
|
|
62
|
-
const injector = inject(Injector);
|
|
63
|
-
const { map, eachItemFn, cleanupFn } = config;
|
|
64
|
-
const effectRefMap = {};
|
|
65
|
-
const has = (token) => token in effectRefMap;
|
|
66
|
-
const push = (tokenString, signal) => {
|
|
67
|
-
if (has(tokenString))
|
|
68
|
-
return;
|
|
69
|
-
const tokenArray = tokenString.split(' ').filter((token) => !!token);
|
|
70
|
-
for (const token of tokenArray) {
|
|
71
|
-
runInInjectionContext(injector, () => {
|
|
72
|
-
const ref = effect(() => {
|
|
73
|
-
const value = signal();
|
|
74
|
-
eachItemFn({ key: token, value });
|
|
75
|
-
});
|
|
76
|
-
effectRefMap[token] = ref;
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
const pushMany = (map) => {
|
|
81
|
-
for (const [tokenString, signal] of Object.entries(map)) {
|
|
82
|
-
push(tokenString, signal);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
const remove = (...tokens) => {
|
|
86
|
-
for (const tokenString of tokens) {
|
|
87
|
-
effectRefMap[tokenString]?.destroy();
|
|
88
|
-
cleanupFn({ key: tokenString, value: map[tokenString]?.() });
|
|
89
|
-
delete effectRefMap[tokenString];
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
const removeMany = (tokens) => {
|
|
93
|
-
for (const token of tokens) {
|
|
94
|
-
remove(token);
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
pushMany(map);
|
|
98
|
-
return { remove, removeMany, has, push, pushMany };
|
|
99
|
-
};
|
|
100
|
-
export const signalIsRendered = () => {
|
|
101
|
-
const isRendered = signal(false);
|
|
102
|
-
afterNextRender(() => isRendered.set(true));
|
|
103
|
-
return isRendered.asReadonly();
|
|
104
|
-
};
|
|
105
|
-
export const signalClasses = (el, classMap) => {
|
|
61
|
+
export const buildSignalEffects = (el, config) => {
|
|
106
62
|
const elements = buildElementSignal(el);
|
|
107
63
|
const injector = inject(Injector);
|
|
108
64
|
effect(() => {
|
|
@@ -110,24 +66,22 @@ export const signalClasses = (el, classMap) => {
|
|
|
110
66
|
for (const previousEl of previousElements) {
|
|
111
67
|
if (currentElements.includes(previousEl))
|
|
112
68
|
continue;
|
|
113
|
-
const tokens = Object.keys(
|
|
69
|
+
const tokens = Object.keys(config.tokenMap)
|
|
114
70
|
.map((key) => key.split(' '))
|
|
115
71
|
.flat();
|
|
116
72
|
if (!tokens.length)
|
|
117
73
|
continue;
|
|
118
|
-
|
|
74
|
+
config.cleanupFn(previousEl, tokens);
|
|
119
75
|
}
|
|
120
76
|
for (const currentEl of currentElements) {
|
|
121
77
|
if (previousElements.includes(currentEl))
|
|
122
78
|
continue;
|
|
123
|
-
for (const [tokens, condition] of Object.entries(
|
|
79
|
+
for (const [tokens, condition] of Object.entries(config.tokenMap)) {
|
|
124
80
|
untracked(() => {
|
|
125
|
-
if (!condition())
|
|
126
|
-
return;
|
|
127
81
|
const tokenArray = tokens.split(' ');
|
|
128
82
|
if (!tokenArray.length)
|
|
129
83
|
return;
|
|
130
|
-
|
|
84
|
+
config.updateFn(currentEl, tokenArray, condition());
|
|
131
85
|
});
|
|
132
86
|
}
|
|
133
87
|
}
|
|
@@ -144,12 +98,7 @@ export const signalClasses = (el, classMap) => {
|
|
|
144
98
|
const tokenArray = tokens.split(' ');
|
|
145
99
|
if (!tokenArray.length)
|
|
146
100
|
continue;
|
|
147
|
-
|
|
148
|
-
el.classList.remove(...tokenArray);
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
el.classList.add(...tokenArray);
|
|
152
|
-
}
|
|
101
|
+
config.updateFn(el, tokenArray, signal());
|
|
153
102
|
}
|
|
154
103
|
});
|
|
155
104
|
});
|
|
@@ -166,7 +115,7 @@ export const signalClasses = (el, classMap) => {
|
|
|
166
115
|
const tokenArray = tokens.split(' ');
|
|
167
116
|
if (!tokenArray.length)
|
|
168
117
|
continue;
|
|
169
|
-
|
|
118
|
+
config.cleanupFn(el, tokenArray);
|
|
170
119
|
}
|
|
171
120
|
};
|
|
172
121
|
const removeMany = (tokens) => {
|
|
@@ -174,52 +123,73 @@ export const signalClasses = (el, classMap) => {
|
|
|
174
123
|
remove(token);
|
|
175
124
|
}
|
|
176
125
|
};
|
|
177
|
-
pushMany(
|
|
126
|
+
pushMany(config.tokenMap);
|
|
178
127
|
return { remove, removeMany, has, push, pushMany };
|
|
179
128
|
};
|
|
129
|
+
export const signalIsRendered = () => {
|
|
130
|
+
const isRendered = signal(false);
|
|
131
|
+
afterNextRender(() => isRendered.set(true));
|
|
132
|
+
return isRendered.asReadonly();
|
|
133
|
+
};
|
|
134
|
+
export const signalClasses = (el, classMap) => {
|
|
135
|
+
const renderer = inject(Renderer2);
|
|
136
|
+
return buildSignalEffects(el, {
|
|
137
|
+
tokenMap: classMap,
|
|
138
|
+
cleanupFn: (el, tokens) => tokens.forEach((token) => renderer.removeClass(el, token)),
|
|
139
|
+
updateFn: (el, tokens, condition) => {
|
|
140
|
+
if (!condition) {
|
|
141
|
+
tokens.forEach((token) => renderer.removeClass(el, token));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
tokens.forEach((token) => renderer.addClass(el, token));
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
};
|
|
180
149
|
export const signalHostClasses = (classMap) => signalClasses(inject(ElementRef), classMap);
|
|
181
150
|
const ALWAYS_TRUE_ATTRIBUTE_KEYS = ['disabled', 'readonly', 'required', 'checked', 'selected', 'hidden', 'inert'];
|
|
182
151
|
export const signalAttributes = (el, attributeMap) => {
|
|
183
|
-
const
|
|
184
|
-
return buildSignalEffects({
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if (
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
152
|
+
const renderer = inject(Renderer2);
|
|
153
|
+
return buildSignalEffects(el, {
|
|
154
|
+
tokenMap: attributeMap,
|
|
155
|
+
cleanupFn: (el, tokens) => tokens.forEach((token) => el.removeAttribute(token)),
|
|
156
|
+
updateFn: (el, tokens, condition) => {
|
|
157
|
+
for (const token of tokens) {
|
|
158
|
+
if (ALWAYS_TRUE_ATTRIBUTE_KEYS.includes(token)) {
|
|
159
|
+
if (condition) {
|
|
160
|
+
renderer.setAttribute(el, token, '');
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
renderer.removeAttribute(el, token);
|
|
164
|
+
}
|
|
165
|
+
continue;
|
|
194
166
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (value === null || value === undefined) {
|
|
198
|
-
elements().currentElement?.removeAttribute(key);
|
|
167
|
+
if (condition === null || condition === undefined) {
|
|
168
|
+
renderer.removeAttribute(el, token);
|
|
199
169
|
}
|
|
200
170
|
else {
|
|
201
|
-
|
|
171
|
+
renderer.setAttribute(el, token, `${condition}`);
|
|
202
172
|
}
|
|
203
173
|
}
|
|
204
174
|
},
|
|
205
|
-
cleanupFn: ({ key }) => elements().currentElement?.removeAttribute(key),
|
|
206
175
|
});
|
|
207
176
|
};
|
|
208
177
|
export const signalHostAttributes = (attributeMap) => signalAttributes(inject(ElementRef), attributeMap);
|
|
209
178
|
export const signalStyles = (el, styleMap) => {
|
|
210
|
-
const
|
|
211
|
-
return buildSignalEffects({
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
179
|
+
const renderer = inject(Renderer2);
|
|
180
|
+
return buildSignalEffects(el, {
|
|
181
|
+
tokenMap: styleMap,
|
|
182
|
+
cleanupFn: (el, tokens) => tokens.forEach((token) => renderer.removeStyle(el, token)),
|
|
183
|
+
updateFn: (el, tokens, condition) => {
|
|
184
|
+
for (const token of tokens) {
|
|
185
|
+
if (condition === null || condition === undefined) {
|
|
186
|
+
renderer.removeStyle(el, token);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
renderer.setStyle(el, token, `${condition}`, RendererStyleFlags2.DashCase);
|
|
190
|
+
}
|
|
220
191
|
}
|
|
221
192
|
},
|
|
222
|
-
cleanupFn: ({ key }) => elements().currentElement?.style.removeProperty(key),
|
|
223
193
|
});
|
|
224
194
|
};
|
|
225
195
|
export const signalHostStyles = (styleMap) => signalStyles(inject(ElementRef), styleMap);
|
|
@@ -317,8 +287,10 @@ export const signalElementScrollState = (el, options) => {
|
|
|
317
287
|
const scrollPosition = initialScrollPosition();
|
|
318
288
|
const element = elements().currentElement;
|
|
319
289
|
if (scrollPosition && element) {
|
|
320
|
-
|
|
321
|
-
|
|
290
|
+
if (scrollPosition.left !== undefined)
|
|
291
|
+
element.scrollLeft = scrollPosition.left;
|
|
292
|
+
if (scrollPosition.top !== undefined)
|
|
293
|
+
element.scrollTop = scrollPosition.top;
|
|
322
294
|
ref.destroy();
|
|
323
295
|
}
|
|
324
296
|
});
|
|
@@ -397,6 +369,7 @@ export const signalElementIntersection = (el, options) => {
|
|
|
397
369
|
}
|
|
398
370
|
if (els.currentElements.length && !!enabled) {
|
|
399
371
|
const rootEl = untracked(() => root().currentElement);
|
|
372
|
+
const rootBounds = rootEl?.getBoundingClientRect();
|
|
400
373
|
// check sync for intersections since the intersection observer async and we probably want to know the initial state
|
|
401
374
|
const entries = els.currentElements
|
|
402
375
|
.map((el) => {
|
|
@@ -415,12 +388,13 @@ export const signalElementIntersection = (el, options) => {
|
|
|
415
388
|
const blockIntersectionRatio = visibility.blockIntersection / 100;
|
|
416
389
|
const isIntersecting = inlineIntersectionRatio > 0 && blockIntersectionRatio > 0;
|
|
417
390
|
const intersectionRatio = Math.min(inlineIntersectionRatio, blockIntersectionRatio);
|
|
391
|
+
const elBounds = el.getBoundingClientRect();
|
|
418
392
|
const intersectionEntry = {
|
|
419
|
-
boundingClientRect:
|
|
393
|
+
boundingClientRect: elBounds,
|
|
420
394
|
intersectionRatio,
|
|
421
|
-
intersectionRect:
|
|
395
|
+
intersectionRect: elBounds,
|
|
422
396
|
isIntersecting,
|
|
423
|
-
rootBounds:
|
|
397
|
+
rootBounds: rootBounds ?? null,
|
|
424
398
|
target: el,
|
|
425
399
|
time: performance.now(),
|
|
426
400
|
};
|
|
@@ -583,4 +557,4 @@ export const createCanAnimateSignal = () => {
|
|
|
583
557
|
state: value,
|
|
584
558
|
};
|
|
585
559
|
};
|
|
586
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvc2lnbmFsLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsVUFBVSxFQUVWLFVBQVUsRUFDVixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFHVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFFBQVEsRUFDUixxQkFBcUIsRUFDckIsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXBFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQTRCdEQsU0FBUyxlQUFlLENBQUMsRUFBVztJQUNsQyxJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksZ0JBQWdCLElBQUksR0FBRyxJQUFJLGlCQUFpQixJQUFJLEdBQUcsQ0FBQztJQUN4RyxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxxQkFBcUIsR0FBRyxHQUFrQixFQUFFLENBQ2hELE1BQU0sQ0FBQztJQUNMLGNBQWMsRUFBRSxRQUFRLENBQUMsZUFBZTtJQUN4QyxlQUFlLEVBQUUsSUFBSTtJQUNyQixlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBQzNDLGdCQUFnQixFQUFFLEVBQUU7Q0FDckIsQ0FBQyxDQUFDO0FBRUwsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEVBQStDLEVBQWlCLEVBQUU7SUFDNUYsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxPQUFPLE1BQU0sQ0FBQyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsSUFBSSxTQUFTLEdBQXdDLElBQUksQ0FBQztJQUUxRCxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FDekIsU0FBUyxDQUFDLENBQUMsT0FBd0MsRUFBRSxFQUFFO1FBQ3JELElBQUksT0FBTyxZQUFZLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3pCLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFDbEIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzFELENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLElBQUksRUFBRSxZQUFZLFVBQVUsRUFBRSxDQUFDO1FBQzdCLFNBQVMsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztTQUFNLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDeEIsU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RixDQUFDO1NBQU0sSUFBSSxFQUFFLFlBQVksU0FBUyxFQUFFLENBQUM7UUFDbkMsU0FBUyxHQUFHLFFBQVEsQ0FDbEIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2IsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUNiLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRCxFQUNELEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUN2QixDQUFDO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFDTixTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQ2IsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDMUIsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUNmLFFBQVEsRUFBRSxFQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksRUFBRTtRQUN4QyxlQUFlLEVBQUUsZUFBZSxJQUFJLEVBQUU7UUFDdEMsY0FBYyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUk7UUFDNUMsZUFBZSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSTtLQUMvQyxDQUFDLENBQUMsQ0FDSixFQUNELEVBQUUsWUFBWSxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FDN0csQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQTRDLE1BSTdFLEVBQUUsRUFBRTtJQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFOUMsTUFBTSxZQUFZLEdBQThCLEVBQUUsQ0FBQztJQUVuRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQztJQUVyRCxNQUFNLElBQUksR0FBRyxDQUFDLFdBQW1CLEVBQUUsTUFBdUIsRUFBRSxFQUFFO1FBQzVELElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU87UUFFN0IsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyRSxLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQy9CLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7Z0JBQ25DLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUU7b0JBQ3RCLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO29CQUN2QixVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLENBQUMsQ0FBQyxDQUFDO2dCQUVILFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFvQyxFQUFFLEVBQUU7UUFDeEQsS0FBSyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBZ0IsRUFBRSxFQUFFO1FBQ3JDLEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxFQUFFLENBQUM7WUFDakMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBRXJDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTdELE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQWdCLEVBQUUsRUFBRTtRQUN0QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUNyRCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7SUFDbkMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFNUMsT0FBTyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDakMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQTRDLEVBQTRCLEVBQUUsUUFBVyxFQUFFLEVBQUU7SUFDcEgsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDVixNQUFNLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFFekQsS0FBSyxNQUFNLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFDLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7Z0JBQUUsU0FBUztZQUVuRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztpQkFDakMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUM1QixJQUFJLEVBQUUsQ0FBQztZQUVWLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtnQkFBRSxTQUFTO1lBRTdCLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELEtBQUssTUFBTSxTQUFTLElBQUksZUFBZSxFQUFFLENBQUM7WUFDeEMsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUFFLFNBQVM7WUFFbkQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDYixJQUFJLENBQUMsU0FBUyxFQUFFO3dCQUFFLE9BQU87b0JBRXpCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBRXJDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTt3QkFBRSxPQUFPO29CQUUvQixTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sR0FBOEIsRUFBRSxDQUFDO0lBRTlDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDO0lBRWxELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBYyxFQUFFLE1BQXVCLEVBQUUsRUFBRTtRQUN2RCxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPO1FBRXhCLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDbkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQzVCLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFFeEQsS0FBSyxNQUFNLEVBQUUsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDakMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO3dCQUFFLFNBQVM7b0JBRWpDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO3dCQUNkLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7b0JBQ3JDLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO29CQUNsQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFvQyxFQUFFLEVBQUU7UUFDeEQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFO1FBQ2hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUUzQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV2QixLQUFLLE1BQU0sRUFBRSxJQUFJLFFBQVEsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO2dCQUFFLFNBQVM7WUFFakMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFnQixFQUFFLEVBQUU7UUFDdEMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVuQixPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQ3JELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQTRDLFFBQVcsRUFBRSxFQUFFLENBQzFGLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFFOUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRWxILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQzlCLEVBQTRCLEVBQzVCLFlBQWUsRUFDZixFQUFFO0lBQ0YsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFeEMsT0FBTyxrQkFBa0IsQ0FBQztRQUN4QixHQUFHLEVBQUUsWUFBWTtRQUNqQixVQUFVLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQzdCLE1BQU0sV0FBVyxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFFL0IsSUFBSSwwQkFBMEIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixRQUFRLEVBQUUsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFFBQVEsRUFBRSxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xELENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDMUMsUUFBUSxFQUFFLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFFBQVEsRUFBRSxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUM1RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxTQUFTLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQztLQUN4RSxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUE0QyxZQUFlLEVBQUUsRUFBRSxDQUNqRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQTRDLEVBQTRCLEVBQUUsUUFBVyxFQUFFLEVBQUU7SUFDbkgsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFeEMsT0FBTyxrQkFBa0IsQ0FBQztRQUN4QixHQUFHLEVBQUUsUUFBUTtRQUNiLFVBQVUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDMUMsUUFBUSxFQUFFLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sV0FBVyxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUM7Z0JBRS9CLFFBQVEsRUFBRSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNqRSxDQUFDO1FBQ0gsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztLQUM3RSxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUE0QyxRQUFXLEVBQUUsRUFBRSxDQUN6RixZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBYzdDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsRUFBNEIsRUFBRSxFQUFFO0lBQ3RFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUV0QyxNQUFNLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxjQUFjLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxJQUFJO1FBQ2hFLGFBQWEsRUFBRSxJQUFJO1FBQ25CLGNBQWMsRUFBRSxJQUFJO1FBQ3BCLHlCQUF5QixFQUFFLElBQUk7S0FDaEMsQ0FBQyxDQUFDO0lBRUgsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQW9CLFlBQVksRUFBRSxDQUFDLENBQUM7SUFFMUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUN4QyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQUUsT0FBTztRQUUxQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1lBQy9FLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7WUFDdkQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUV6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUNaLHVCQUF1QixDQUFDLEdBQUcsQ0FBQztnQkFDMUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUN2QixhQUFhLEVBQUUsYUFBYTtvQkFDMUIsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTLEVBQUU7b0JBQzlFLENBQUMsQ0FBQyxJQUFJO2dCQUNSLGNBQWMsRUFBRSxjQUFjO29CQUM1QixDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLFNBQVMsRUFBRTtvQkFDaEYsQ0FBQyxDQUFDLElBQUk7Z0JBQ1IseUJBQXlCLEVBQUUseUJBQXlCO29CQUNsRCxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUseUJBQXlCLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxTQUFTLEVBQUU7b0JBQ3RHLENBQUMsQ0FBQyxJQUFJO2FBQ1QsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLENBQ0osR0FBRyxFQUFFO1FBQ0gsTUFBTSxHQUFHLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFFdkIsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFNUMsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hCLENBQUM7UUFFRCxJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3JFLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTVGLElBQUksZUFBZSxLQUFLLFFBQVEsSUFBSSxTQUFTLEVBQUUsSUFBSSwyQkFBMkIsRUFBRSxDQUFDO2dCQUMvRSxPQUFPLENBQUMsS0FBSyxDQUNYLFlBQVksR0FBRyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLDRKQUE0SixDQUNsTixDQUFDO1lBQ0osQ0FBQztZQUVELFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztJQUVGLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFFbEQsT0FBTyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM5QyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUU3RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEVBQTRCLEVBQUUsT0FBOEIsRUFBRSxFQUFFO0lBQ3JHLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUV0QyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBd0IsSUFBSSxDQUFDLENBQUM7SUFFbkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQzFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFBRSxPQUFPO1FBRTFCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLENBQ0osR0FBRyxFQUFFO1FBQ0gsTUFBTSxHQUFHLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFFdkIsc0JBQXNCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpDLElBQUksR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBRUQsSUFBSSxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztJQUVGLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFFbEQsT0FBTyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM3QyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLE9BQThCLEVBQUUsRUFBRSxDQUMzRSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFPdEQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxFQUE0QixFQUFFLE9BQXlDLEVBQUUsRUFBRTtJQUNsSCxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QyxNQUFNLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVELE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBRXRDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxFQUFFLHFCQUFxQixDQUFDO0lBRTdELElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUMxQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQUUsT0FBTztZQUUxQixNQUFNLGNBQWMsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO1lBQy9DLE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUUxQyxJQUFJLGNBQWMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxPQUFPLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ25CLE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQztRQUMxQyxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1FBRXZDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDM0IsU0FBUyxFQUFFLEtBQUs7WUFDaEIscUJBQXFCLEVBQUUsS0FBSztZQUM1QixtQkFBbUIsRUFBRSxLQUFLO1lBQzFCLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVyxJQUFJLElBQUk7WUFDekMsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLElBQUksSUFBSTtZQUMzQyxpQkFBaUIsRUFBRSxVQUFVO1NBQzlCLENBQUMsQ0FBQztRQUVILHNFQUFzRTtRQUN0RSxpRUFBaUU7UUFDakUsZ0JBQWdCLEVBQUUsQ0FBQztRQUVuQixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU8sYUFBYSxFQUFFLENBQUM7UUFFMUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDOUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBRTFDLE1BQU0scUJBQXFCLEdBQUcsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUNsRCxNQUFNLG1CQUFtQixHQUFHLFlBQVksR0FBRyxNQUFNLENBQUM7UUFFbEQsT0FBTztZQUNMLFNBQVMsRUFBRSxxQkFBcUIsSUFBSSxtQkFBbUI7WUFDdkQscUJBQXFCO1lBQ3JCLG1CQUFtQjtZQUNuQixXQUFXO1lBQ1gsWUFBWTtZQUNaLGlCQUFpQixFQUFFLFVBQVU7U0FDOUIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFPL0YsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxFQUE0QixFQUFFLE9BQTBDLEVBQUUsRUFBRTtJQUNwSCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3pGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRW5ELE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUE4QixFQUFFLENBQUMsQ0FBQztJQUUxRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQThCLElBQUksQ0FBQyxDQUFDO0lBRTNELE1BQU0sQ0FDSixHQUFHLEVBQUU7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxjQUFjLENBQUM7UUFFckMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxvQkFBb0IsQ0FDMUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNWLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQUUsT0FBTztZQUUxQixJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLHlCQUF5QixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXRFLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXJGLElBQUksa0JBQWtCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsYUFBYSxHQUFHO3dCQUNkLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLENBQUM7d0JBQzdDLEtBQUs7d0JBQ0wsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztxQkFDL0MsQ0FBQztnQkFDSixDQUFDO3FCQUFNLENBQUM7b0JBQ04sYUFBYSxHQUFHLENBQUMsR0FBRyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDLEVBQ0QsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQzdCLENBQUM7UUFFRixRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVCLENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUM1QixDQUFDO0lBRUYsTUFBTSxDQUNKLEdBQUcsRUFBRTtRQUNILE1BQU0sR0FBRyxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBRTVCLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVsQyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUV0RCxvSEFBb0g7WUFDcEgsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLGVBQWU7aUJBQ2hDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNWLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDO29CQUNsQyxTQUFTLEVBQUUsTUFBTTtvQkFDakIsT0FBTyxFQUFFLEVBQUU7aUJBQ1osQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRTt3QkFDckQsT0FBTyxFQUFFLEVBQUU7d0JBQ1gsU0FBUyxFQUFFLE1BQU07cUJBQ2xCLENBQUMsQ0FBQztvQkFFSCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUVELE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztnQkFDcEUsTUFBTSxzQkFBc0IsR0FBRyxVQUFVLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO2dCQUNsRSxNQUFNLGNBQWMsR0FBRyx1QkFBdUIsR0FBRyxDQUFDLElBQUksc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFFcEYsTUFBTSxpQkFBaUIsR0FBOEI7b0JBQ25ELGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRTtvQkFDOUMsaUJBQWlCO29CQUNqQixnQkFBZ0IsRUFBRSxFQUFFLENBQUMscUJBQXFCLEVBQUU7b0JBQzVDLGNBQWM7b0JBQ2QsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxJQUFJLElBQUk7b0JBQ2xFLE1BQU0sRUFBRSxFQUFFO29CQUNWLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFO2lCQUN4QixDQUFDO2dCQUVGLE9BQU8saUJBQWlCLENBQUM7WUFDM0IsQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBa0MsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUU3RCx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFdkMsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztJQUVGLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUVyRCxPQUFPLHlCQUF5QixDQUFDO0FBQ25DLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQUMsT0FBMEMsRUFBRSxFQUFFLENBQzFGLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUV6RCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEVBQTRCLEVBQUUsRUFBRTtJQUNwRSxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRWhILE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFN0IsTUFBTSxHQUFHLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFFdkIsc0VBQXNFO1FBQ3RFLDZEQUE2RDtRQUM3RCxnQkFBZ0IsRUFBRSxDQUFDO1FBRW5CLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRW5DLE1BQU0sUUFBUSxHQUFrQixFQUFFLENBQUM7UUFFbkMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3hFLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRW5ELElBQUksT0FBTyxZQUFZLFdBQVcsRUFBRSxDQUFDO2dCQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFJLE1BQWlCLEVBQUUsRUFBRTtJQUMxRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUNuQyxRQUFRLEVBQUUsRUFDVixHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDdEIsQ0FBQztJQUVGLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFJLElBQWUsRUFBRSxFQUFxQixFQUFFLEVBQUU7SUFDdEUsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNWLE1BQU0sT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO1FBRXZCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFjRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUNoQyxPQUFVLEVBQ1YsT0FBbUMsRUFDbkMsRUFBRTtJQUNGLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxZQUFZO1FBQ2xDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFlBQVksSUFBSSxHQUFHLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztJQUV6QixNQUFNLEdBQUcsR0FBNkMsT0FBTyxFQUFFLGFBQWE7UUFDMUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUNsQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVsRCxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckUsV0FBVyxFQUFFLElBQUk7S0FDbEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxDQUM1QyxPQUFVLEVBQ1YsT0FBbUMsRUFDbkMsRUFBRTtJQUNGLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2pFLFFBQVEsRUFBRSxFQUNWLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUN6QyxDQUFDO0lBRUYsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUMsQ0FBQyxDQUFDO0FBWUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUN6QyxPQUFVLEVBQ1YsT0FBNEMsRUFDNUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBZ0J4RixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFJLEVBQVcsRUFBRSxNQUF5QixFQUFFLEVBQUU7SUFDaEYsSUFBSSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDckIsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxPQUFPLEVBQUUsRUFBRSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBVSxHQUFlLEVBQUUsTUFBMkMsRUFBRSxFQUFFO0lBQ3pHLE1BQU0sV0FBVyxHQUFHLE1BQU0sRUFBRSxTQUFTLENBQUM7SUFFdEMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxPQUFPLEdBQTZCLENBQUM7QUFDdkMsQ0FBQyxDQUFDO0FBRUYsNkdBQTZHO0FBQzdHLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUM1QixNQUF1RSxFQUN2RSxFQUFFO0lBQ0YsT0FBTyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUU7UUFDL0IsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0RCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFbEcsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBeUIsRUFBRSxFQUFFO0lBQzdELE9BQU8sb0JBQW9CLENBQUMsR0FBRyxFQUFFO1FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFdEQsT0FBTyxRQUFRLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQXlCLEVBQUUsRUFBRTtJQUMzRCxPQUFPLG9CQUFvQixDQUFDLEdBQUcsRUFBRTtRQUMvQixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXRELE9BQU8sUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGLGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUM5QixNQUF1RSxFQUN2RSxFQUFFO0lBQ0YsT0FBTyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUU7UUFDL0IsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0RCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFNUYsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBeUIsRUFBRSxFQUFFO0lBQzVELE9BQU8sb0JBQW9CLENBQUMsR0FBRyxFQUFFO1FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFdEQsT0FBTyxRQUFRLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDbkcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQzlCLEdBQVcsRUFDWCxNQUF1RSxFQUN2RSxFQUFFO0lBQ0YsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBMEIsQ0FBQztJQUVoRixPQUFPLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4QyxDQUFDLENBQUM7QUFFRixvREFBb0Q7QUFDcEQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsR0FBVyxFQUNYLE1BQWlFLEVBQ2pFLEVBQUU7SUFDRixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBYyxDQUFDO0lBRTdELE9BQU8saUJBQWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGLG1EQUFtRDtBQUNuRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FDN0IsR0FBVyxFQUNYLE1BQXVFLEVBQ3ZFLEVBQUU7SUFDRixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUEwQixDQUFDO0lBRS9FLE9BQU8saUJBQWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsRUFBRTtJQUN6QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFNUIsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FDWCw4SUFBOEksQ0FDL0ksQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxLQUFLLEVBQUUsS0FBSztRQUNaLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDO0tBQ3ZFLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLEVBQUU7SUFDekMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLEtBQUssRUFBRSxLQUFLO0tBQ2IsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUVsZW1lbnQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgRGVzdHJveVJlZixcbiAgRWZmZWN0UmVmLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBRdWVyeUxpc3QsXG4gIFNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpc0Rldk1vZGUsXG4gIGlzU2lnbmFsLFxuICBydW5JbkluamVjdGlvbkNvbnRleHQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIG1lcmdlLCBvZiwgcGFpcndpc2UsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSb3V0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBuZXh0RnJhbWUgfSBmcm9tICcuL2FuaW1hdGlvbi51dGlscyc7XG5pbXBvcnQgeyBlcXVhbCB9IGZyb20gJy4vZXF1YWwudXRpbCc7XG5pbXBvcnQgeyBpc0VsZW1lbnRWaXNpYmxlIH0gZnJvbSAnLi9zY3JvbGxhYmxlLnV0aWxzJztcblxudHlwZSBTaWduYWxFbGVtZW50QmluZGluZ0NvbXBsZXhUeXBlID1cbiAgfCBIVE1MRWxlbWVudFxuICB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIHwgUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgSFRNTEVsZW1lbnQ+XG4gIHwgQXJyYXk8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudD5cbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkO1xuXG50eXBlIFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSA9XG4gIHwgSFRNTEVsZW1lbnRcbiAgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICB8IE9ic2VydmFibGU8U2lnbmFsRWxlbWVudEJpbmRpbmdDb21wbGV4VHlwZT5cbiAgfCBTaWduYWw8U2lnbmFsRWxlbWVudEJpbmRpbmdDb21wbGV4VHlwZT5cbiAgfCBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudD5cbiAgfCBFbGVtZW50U2lnbmFsO1xuXG50eXBlIEVsZW1lbnRTaWduYWwgPSBTaWduYWw8e1xuICAvKiogQGRlcHJlY2F0ZWQgQWx3YXlzIHVzZSBjdXJyZW50RWxlbWVudHMgICovXG4gIGN1cnJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgLyoqIEBkZXByZWNhdGVkIEFsd2F5cyB1c2UgcHJldmlvdXNFbGVtZW50cyAgKi9cbiAgcHJldmlvdXNFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIGN1cnJlbnRFbGVtZW50czogSFRNTEVsZW1lbnRbXTtcbiAgcHJldmlvdXNFbGVtZW50czogSFRNTEVsZW1lbnRbXTtcbn0+O1xuXG5mdW5jdGlvbiBpc0VsZW1lbnRTaWduYWwoZWw6IHVua25vd24pOiBlbCBpcyBFbGVtZW50U2lnbmFsIHtcbiAgaWYgKGlzU2lnbmFsKGVsKSkge1xuICAgIGNvbnN0IHZhbCA9IGVsKCk7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiAnY3VycmVudEVsZW1lbnQnIGluIHZhbCAmJiAncHJldmlvdXNFbGVtZW50JyBpbiB2YWw7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmNvbnN0IGRvY3VtZW50RWxlbWVudFNpZ25hbCA9ICgpOiBFbGVtZW50U2lnbmFsID0+XG4gIHNpZ25hbCh7XG4gICAgY3VycmVudEVsZW1lbnQ6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICBwcmV2aW91c0VsZW1lbnQ6IG51bGwsXG4gICAgY3VycmVudEVsZW1lbnRzOiBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSxcbiAgICBwcmV2aW91c0VsZW1lbnRzOiBbXSxcbiAgfSk7XG5cbmNvbnN0IGJ1aWxkRWxlbWVudFNpZ25hbCA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IEVsZW1lbnRTaWduYWwgPT4ge1xuICBpZiAoZWwgPT09IG51bGwgfHwgZWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzaWduYWwoeyBjdXJyZW50RWxlbWVudDogbnVsbCwgcHJldmlvdXNFbGVtZW50OiBudWxsLCBjdXJyZW50RWxlbWVudHM6IFtdLCBwcmV2aW91c0VsZW1lbnRzOiBbXSB9KTtcbiAgfVxuXG4gIGlmIChpc0VsZW1lbnRTaWduYWwoZWwpKSB7XG4gICAgcmV0dXJuIGVsO1xuICB9XG5cbiAgbGV0IG1FbFNpZ25hbDogU2lnbmFsPEhUTUxFbGVtZW50W10gfCBudWxsPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHN3aXRjaEVsZW1lbnQgPSAoKSA9PlxuICAgIHN3aXRjaE1hcCgoZWxPclJlZjogU2lnbmFsRWxlbWVudEJpbmRpbmdDb21wbGV4VHlwZSkgPT4ge1xuICAgICAgaWYgKGVsT3JSZWYgaW5zdGFuY2VvZiBRdWVyeUxpc3QpIHtcbiAgICAgICAgcmV0dXJuIGVsT3JSZWYuY2hhbmdlcy5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChlbE9yUmVmKSxcbiAgICAgICAgICBtYXAoKCkgPT4gZWxPclJlZi50b0FycmF5KCkubWFwKChyKSA9PiBjb2VyY2VFbGVtZW50KHIpKSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZWxPclJlZikpIHtcbiAgICAgICAgcmV0dXJuIG9mKGVsT3JSZWYubWFwKChyKSA9PiBjb2VyY2VFbGVtZW50KHIpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2VyY2VkRWwgPSBjb2VyY2VFbGVtZW50KGVsT3JSZWYpO1xuICAgICAgICByZXR1cm4gb2YoY29lcmNlZEVsID8gW2NvZXJjZWRFbF0gOiBudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBpZiAoZWwgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgbUVsU2lnbmFsID0gdG9TaWduYWwoZWwucGlwZShzd2l0Y2hFbGVtZW50KCkpLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgfSBlbHNlIGlmIChpc1NpZ25hbChlbCkpIHtcbiAgICBtRWxTaWduYWwgPSB0b1NpZ25hbCh0b09ic2VydmFibGUoZWwpLnBpcGUoc3dpdGNoRWxlbWVudCgpKSwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIH0gZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBRdWVyeUxpc3QpIHtcbiAgICBtRWxTaWduYWwgPSB0b1NpZ25hbChcbiAgICAgIGVsLmNoYW5nZXMucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKGVsKSxcbiAgICAgICAgbWFwKCgpID0+IGVsLnRvQXJyYXkoKS5tYXAoKHIpID0+IGNvZXJjZUVsZW1lbnQocikpKSxcbiAgICAgICksXG4gICAgICB7IGluaXRpYWxWYWx1ZTogbnVsbCB9LFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgbUVsU2lnbmFsID0gc2lnbmFsKFtjb2VyY2VFbGVtZW50KGVsKV0pO1xuICB9XG5cbiAgcmV0dXJuIHRvU2lnbmFsKFxuICAgIHRvT2JzZXJ2YWJsZShtRWxTaWduYWwpLnBpcGUoXG4gICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICBwYWlyd2lzZSgpLFxuICAgICAgbWFwKChbcHJldmlvdXNFbGVtZW50cywgY3VycmVudEVsZW1lbnRzXSkgPT4gKHtcbiAgICAgICAgcHJldmlvdXNFbGVtZW50czogcHJldmlvdXNFbGVtZW50cyA/PyBbXSxcbiAgICAgICAgY3VycmVudEVsZW1lbnRzOiBjdXJyZW50RWxlbWVudHMgPz8gW10sXG4gICAgICAgIGN1cnJlbnRFbGVtZW50OiBjdXJyZW50RWxlbWVudHM/LlswXSA/PyBudWxsLFxuICAgICAgICBwcmV2aW91c0VsZW1lbnQ6IHByZXZpb3VzRWxlbWVudHM/LlswXSA/PyBudWxsLFxuICAgICAgfSkpLFxuICAgICksXG4gICAgeyBpbml0aWFsVmFsdWU6IHsgY3VycmVudEVsZW1lbnQ6IG51bGwsIHByZXZpb3VzRWxlbWVudDogbnVsbCwgcHJldmlvdXNFbGVtZW50czogW10sIGN1cnJlbnRFbGVtZW50czogW10gfSB9LFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2lnbmFsRWZmZWN0cyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oY29uZmlnOiB7XG4gIG1hcDogVDtcbiAgZWFjaEl0ZW1GbjogKHBhaXI6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pID0+IHZvaWQ7XG4gIGNsZWFudXBGbjogKHBhaXI6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pID0+IHZvaWQ7XG59KSA9PiB7XG4gIGNvbnN0IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgY29uc3QgeyBtYXAsIGVhY2hJdGVtRm4sIGNsZWFudXBGbiB9ID0gY29uZmlnO1xuXG4gIGNvbnN0IGVmZmVjdFJlZk1hcDogUmVjb3JkPHN0cmluZywgRWZmZWN0UmVmPiA9IHt9O1xuXG4gIGNvbnN0IGhhcyA9ICh0b2tlbjogc3RyaW5nKSA9PiB0b2tlbiBpbiBlZmZlY3RSZWZNYXA7XG5cbiAgY29uc3QgcHVzaCA9ICh0b2tlblN0cmluZzogc3RyaW5nLCBzaWduYWw6IFNpZ25hbDx1bmtub3duPikgPT4ge1xuICAgIGlmIChoYXModG9rZW5TdHJpbmcpKSByZXR1cm47XG5cbiAgICBjb25zdCB0b2tlbkFycmF5ID0gdG9rZW5TdHJpbmcuc3BsaXQoJyAnKS5maWx0ZXIoKHRva2VuKSA9PiAhIXRva2VuKTtcblxuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5BcnJheSkge1xuICAgICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZiA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzaWduYWwoKTtcbiAgICAgICAgICBlYWNoSXRlbUZuKHsga2V5OiB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGVmZmVjdFJlZk1hcFt0b2tlbl0gPSByZWY7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcHVzaE1hbnkgPSAobWFwOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+KSA9PiB7XG4gICAgZm9yIChjb25zdCBbdG9rZW5TdHJpbmcsIHNpZ25hbF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgICAgcHVzaCh0b2tlblN0cmluZywgc2lnbmFsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlID0gKC4uLnRva2Vuczogc3RyaW5nW10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHRva2VuU3RyaW5nIG9mIHRva2Vucykge1xuICAgICAgZWZmZWN0UmVmTWFwW3Rva2VuU3RyaW5nXT8uZGVzdHJveSgpO1xuXG4gICAgICBjbGVhbnVwRm4oeyBrZXk6IHRva2VuU3RyaW5nLCB2YWx1ZTogbWFwW3Rva2VuU3RyaW5nXT8uKCkgfSk7XG5cbiAgICAgIGRlbGV0ZSBlZmZlY3RSZWZNYXBbdG9rZW5TdHJpbmddO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZW1vdmVNYW55ID0gKHRva2Vuczogc3RyaW5nW10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgcmVtb3ZlKHRva2VuKTtcbiAgICB9XG4gIH07XG5cbiAgcHVzaE1hbnkobWFwKTtcblxuICByZXR1cm4geyByZW1vdmUsIHJlbW92ZU1hbnksIGhhcywgcHVzaCwgcHVzaE1hbnkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxJc1JlbmRlcmVkID0gKCkgPT4ge1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcblxuICBhZnRlck5leHRSZW5kZXIoKCkgPT4gaXNSZW5kZXJlZC5zZXQodHJ1ZSkpO1xuXG4gIHJldHVybiBpc1JlbmRlcmVkLmFzUmVhZG9ubHkoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxDbGFzc2VzID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+PihlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLCBjbGFzc01hcDogVCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICBlZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHsgY3VycmVudEVsZW1lbnRzLCBwcmV2aW91c0VsZW1lbnRzIH0gPSBlbGVtZW50cygpO1xuXG4gICAgZm9yIChjb25zdCBwcmV2aW91c0VsIG9mIHByZXZpb3VzRWxlbWVudHMpIHtcbiAgICAgIGlmIChjdXJyZW50RWxlbWVudHMuaW5jbHVkZXMocHJldmlvdXNFbCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB0b2tlbnMgPSBPYmplY3Qua2V5cyhjbGFzc01hcClcbiAgICAgICAgLm1hcCgoa2V5KSA9PiBrZXkuc3BsaXQoJyAnKSlcbiAgICAgICAgLmZsYXQoKTtcblxuICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgcHJldmlvdXNFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRva2Vucyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjdXJyZW50RWwgb2YgY3VycmVudEVsZW1lbnRzKSB7XG4gICAgICBpZiAocHJldmlvdXNFbGVtZW50cy5pbmNsdWRlcyhjdXJyZW50RWwpKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBbdG9rZW5zLCBjb25kaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKGNsYXNzTWFwKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZGl0aW9uKCkpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IHRva2VuQXJyYXkgPSB0b2tlbnMuc3BsaXQoJyAnKTtcblxuICAgICAgICAgIGlmICghdG9rZW5BcnJheS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgIGN1cnJlbnRFbC5jbGFzc0xpc3QuYWRkKC4uLnRva2VuQXJyYXkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIEVmZmVjdFJlZj4gPSB7fTtcblxuICBjb25zdCBoYXMgPSAodG9rZW5zOiBzdHJpbmcpID0+IHRva2VucyBpbiBlZmZlY3RzO1xuXG4gIGNvbnN0IHB1c2ggPSAodG9rZW5zOiBzdHJpbmcsIHNpZ25hbDogU2lnbmFsPHVua25vd24+KSA9PiB7XG4gICAgaWYgKGhhcyh0b2tlbnMpKSByZXR1cm47XG5cbiAgICBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IHtcbiAgICAgIGVmZmVjdHNbdG9rZW5zXSA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY3VycmVudEVsZW1lbnRzIH0gPSB1bnRyYWNrZWQoKCkgPT4gZWxlbWVudHMoKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbCBvZiBjdXJyZW50RWxlbWVudHMpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbkFycmF5ID0gdG9rZW5zLnNwbGl0KCcgJyk7XG4gICAgICAgICAgaWYgKCF0b2tlbkFycmF5Lmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgICAgICBpZiAoIXNpZ25hbCgpKSB7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRva2VuQXJyYXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKC4uLnRva2VuQXJyYXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcHVzaE1hbnkgPSAobWFwOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+KSA9PiB7XG4gICAgZm9yIChjb25zdCBbdG9rZW5zLCBzaWduYWxdIG9mIE9iamVjdC5lbnRyaWVzKG1hcCkpIHtcbiAgICAgIHB1c2godG9rZW5zLCBzaWduYWwpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZW1vdmUgPSAodG9rZW5zOiBzdHJpbmcpID0+IHtcbiAgICBlZmZlY3RzW3Rva2Vuc10/LmRlc3Ryb3koKTtcblxuICAgIGRlbGV0ZSBlZmZlY3RzW3Rva2Vuc107XG5cbiAgICBmb3IgKGNvbnN0IGVsIG9mIGVsZW1lbnRzKCkuY3VycmVudEVsZW1lbnRzKSB7XG4gICAgICBjb25zdCB0b2tlbkFycmF5ID0gdG9rZW5zLnNwbGl0KCcgJyk7XG4gICAgICBpZiAoIXRva2VuQXJyYXkubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSguLi50b2tlbkFycmF5KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlTWFueSA9ICh0b2tlbnM6IHN0cmluZ1tdKSA9PiB7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgIHJlbW92ZSh0b2tlbik7XG4gICAgfVxuICB9O1xuXG4gIHB1c2hNYW55KGNsYXNzTWFwKTtcblxuICByZXR1cm4geyByZW1vdmUsIHJlbW92ZU1hbnksIGhhcywgcHVzaCwgcHVzaE1hbnkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxIb3N0Q2xhc3NlcyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oY2xhc3NNYXA6IFQpID0+XG4gIHNpZ25hbENsYXNzZXMoaW5qZWN0KEVsZW1lbnRSZWYpLCBjbGFzc01hcCk7XG5cbmNvbnN0IEFMV0FZU19UUlVFX0FUVFJJQlVURV9LRVlTID0gWydkaXNhYmxlZCcsICdyZWFkb25seScsICdyZXF1aXJlZCcsICdjaGVja2VkJywgJ3NlbGVjdGVkJywgJ2hpZGRlbicsICdpbmVydCddO1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsQXR0cmlidXRlcyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oXG4gIGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsXG4gIGF0dHJpYnV0ZU1hcDogVCxcbikgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG5cbiAgcmV0dXJuIGJ1aWxkU2lnbmFsRWZmZWN0cyh7XG4gICAgbWFwOiBhdHRyaWJ1dGVNYXAsXG4gICAgZWFjaEl0ZW1GbjogKHsga2V5LCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZVN0cmluZyA9IGAke3ZhbHVlfWA7XG5cbiAgICAgIGlmIChBTFdBWVNfVFJVRV9BVFRSSUJVVEVfS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGVsZW1lbnRzKCkuY3VycmVudEVsZW1lbnQ/LnNldEF0dHJpYnV0ZShrZXksICcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50Py5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50Py5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50Py5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZVN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNsZWFudXBGbjogKHsga2V5IH0pID0+IGVsZW1lbnRzKCkuY3VycmVudEVsZW1lbnQ/LnJlbW92ZUF0dHJpYnV0ZShrZXkpLFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxIb3N0QXR0cmlidXRlcyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oYXR0cmlidXRlTWFwOiBUKSA9PlxuICBzaWduYWxBdHRyaWJ1dGVzKGluamVjdChFbGVtZW50UmVmKSwgYXR0cmlidXRlTWFwKTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbFN0eWxlcyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSwgc3R5bGVNYXA6IFQpID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBidWlsZEVsZW1lbnRTaWduYWwoZWwpO1xuXG4gIHJldHVybiBidWlsZFNpZ25hbEVmZmVjdHMoe1xuICAgIG1hcDogc3R5bGVNYXAsXG4gICAgZWFjaEl0ZW1GbjogKHsga2V5LCB2YWx1ZSB9KSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50Py5zdHlsZS5yZW1vdmVQcm9wZXJ0eShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWVTdHJpbmcgPSBgJHt2YWx1ZX1gO1xuXG4gICAgICAgIGVsZW1lbnRzKCkuY3VycmVudEVsZW1lbnQ/LnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWVTdHJpbmcpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xlYW51cEZuOiAoeyBrZXkgfSkgPT4gZWxlbWVudHMoKS5jdXJyZW50RWxlbWVudD8uc3R5bGUucmVtb3ZlUHJvcGVydHkoa2V5KSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdFN0eWxlcyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oc3R5bGVNYXA6IFQpID0+XG4gIHNpZ25hbFN0eWxlcyhpbmplY3QoRWxlbWVudFJlZiksIHN0eWxlTWFwKTtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dpY2FsU2l6ZSB7XG4gIGlubGluZVNpemU6IG51bWJlcjtcbiAgYmxvY2tTaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudERpbWVuc2lvbnMge1xuICByZWN0OiBET01SZWN0UmVhZE9ubHkgfCBudWxsO1xuICBib3JkZXJCb3hTaXplOiBMb2dpY2FsU2l6ZSB8IG51bGw7XG4gIGNvbnRlbnRCb3hTaXplOiBMb2dpY2FsU2l6ZSB8IG51bGw7XG4gIGRldmljZVBpeGVsQ29udGVudEJveFNpemU6IExvZ2ljYWxTaXplIHwgbnVsbDtcbn1cblxuZXhwb3J0IGNvbnN0IHNpZ25hbEVsZW1lbnREaW1lbnNpb25zID0gKGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUpID0+IHtcbiAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgY29uc3QgZWxlbWVudHMgPSBidWlsZEVsZW1lbnRTaWduYWwoZWwpO1xuICBjb25zdCB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIGNvbnN0IGlzUmVuZGVyZWQgPSBzaWduYWxJc1JlbmRlcmVkKCk7XG5cbiAgY29uc3QgaW5pdGlhbFZhbHVlID0gKCkgPT4gKHtcbiAgICByZWN0OiBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA/PyBudWxsLFxuICAgIGJvcmRlckJveFNpemU6IG51bGwsXG4gICAgY29udGVudEJveFNpemU6IG51bGwsXG4gICAgZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZTogbnVsbCxcbiAgfSk7XG5cbiAgY29uc3QgZWxlbWVudERpbWVuc2lvbnNTaWduYWwgPSBzaWduYWw8RWxlbWVudERpbWVuc2lvbnM+KGluaXRpYWxWYWx1ZSgpKTtcblxuICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZSkgPT4ge1xuICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm47XG5cbiAgICBjb25zdCBlbnRyeSA9IGVbMF07XG5cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGNvbnN0IGRldmljZVBpeGVsQ29udGVudEJveFNpemUgPSBlbnRyeS5kZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplPy5bMF0gPz8gbnVsbDtcbiAgICAgIGNvbnN0IGJvcmRlckJveFNpemUgPSBlbnRyeS5ib3JkZXJCb3hTaXplPy5bMF0gPz8gbnVsbDtcbiAgICAgIGNvbnN0IGNvbnRlbnRCb3hTaXplID0gZW50cnkuY29udGVudEJveFNpemU/LlswXSA/PyBudWxsO1xuXG4gICAgICB6b25lLnJ1bigoKSA9PlxuICAgICAgICBlbGVtZW50RGltZW5zaW9uc1NpZ25hbC5zZXQoe1xuICAgICAgICAgIHJlY3Q6IGVudHJ5LmNvbnRlbnRSZWN0LFxuICAgICAgICAgIGJvcmRlckJveFNpemU6IGJvcmRlckJveFNpemVcbiAgICAgICAgICAgID8geyBpbmxpbmVTaXplOiBib3JkZXJCb3hTaXplLmlubGluZVNpemUsIGJsb2NrU2l6ZTogYm9yZGVyQm94U2l6ZS5ibG9ja1NpemUgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIGNvbnRlbnRCb3hTaXplOiBjb250ZW50Qm94U2l6ZVxuICAgICAgICAgICAgPyB7IGlubGluZVNpemU6IGNvbnRlbnRCb3hTaXplLmlubGluZVNpemUsIGJsb2NrU2l6ZTogY29udGVudEJveFNpemUuYmxvY2tTaXplIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplOiBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplXG4gICAgICAgICAgICA/IHsgaW5saW5lU2l6ZTogZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZS5pbmxpbmVTaXplLCBibG9ja1NpemU6IGRldmljZVBpeGVsQ29udGVudEJveFNpemUuYmxvY2tTaXplIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGVscyA9IGVsZW1lbnRzKCk7XG5cbiAgICAgIGVsZW1lbnREaW1lbnNpb25zU2lnbmFsLnNldChpbml0aWFsVmFsdWUoKSk7XG5cbiAgICAgIGlmIChlbHMucHJldmlvdXNFbGVtZW50KSB7XG4gICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVscy5jdXJyZW50RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb21wdXRlZERpc3BsYXkgPSBnZXRDb21wdXRlZFN0eWxlKGVscy5jdXJyZW50RWxlbWVudCkuZGlzcGxheTtcbiAgICAgICAgY29uc3QgY3VycmVudEVsSXNBbmd1bGFyQ29tcG9uZW50ID0gZWxzLmN1cnJlbnRFbGVtZW50Py50YWdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJy0nKTtcblxuICAgICAgICBpZiAoY29tcHV0ZWREaXNwbGF5ID09PSAnaW5saW5lJyAmJiBpc0Rldk1vZGUoKSAmJiBjdXJyZW50RWxJc0FuZ3VsYXJDb21wb25lbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEVsZW1lbnQgPCR7ZWxzLmN1cnJlbnRFbGVtZW50Py50YWdOYW1lLnRvTG93ZXJDYXNlKCl9PiBpcyBhbiBBbmd1bGFyIGNvbXBvbmVudCBhbmQgaGFzIGEgZGlzcGxheSBvZiAnaW5saW5lJy4gSW5saW5lIGVsZW1lbnRzIGNhbm5vdCBiZSBvYnNlcnZlZCBmb3IgZGltZW5zaW9ucy4gUGxlYXNlIGNoYW5nZSBpdCB0byAnYmxvY2snIG9yIHNvbWV0aGluZyBlbHNlLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxzLmN1cnJlbnRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgKTtcblxuICBkZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuXG4gIHJldHVybiBlbGVtZW50RGltZW5zaW9uc1NpZ25hbC5hc1JlYWRvbmx5KCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEVsZW1lbnREaW1lbnNpb25zID0gKCkgPT4gc2lnbmFsRWxlbWVudERpbWVuc2lvbnMoaW5qZWN0KEVsZW1lbnRSZWYpKTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEVsZW1lbnRNdXRhdGlvbnMgPSAoZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSwgb3B0aW9ucz86IE11dGF0aW9uT2JzZXJ2ZXJJbml0KSA9PiB7XG4gIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3Qgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsSXNSZW5kZXJlZCgpO1xuXG4gIGNvbnN0IGVsZW1lbnRNdXRhdGlvbnNTaWduYWwgPSBzaWduYWw8TXV0YXRpb25SZWNvcmQgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChlKSA9PiB7XG4gICAgaWYgKCFpc1JlbmRlcmVkKCkpIHJldHVybjtcblxuICAgIGNvbnN0IGVudHJ5ID0gZVswXTtcblxuICAgIGlmIChlbnRyeSkge1xuICAgICAgem9uZS5ydW4oKCkgPT4gZWxlbWVudE11dGF0aW9uc1NpZ25hbC5zZXQoZW50cnkpKTtcbiAgICB9XG4gIH0pO1xuXG4gIGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBlbHMgPSBlbGVtZW50cygpO1xuXG4gICAgICBlbGVtZW50TXV0YXRpb25zU2lnbmFsLnNldChudWxsKTtcblxuICAgICAgaWYgKGVscy5wcmV2aW91c0VsZW1lbnQpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxzLmN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxzLmN1cnJlbnRFbGVtZW50LCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgKTtcblxuICBkZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuXG4gIHJldHVybiBlbGVtZW50TXV0YXRpb25zU2lnbmFsLmFzUmVhZG9ubHkoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxIb3N0RWxlbWVudE11dGF0aW9ucyA9IChvcHRpb25zPzogTXV0YXRpb25PYnNlcnZlckluaXQpID0+XG4gIHNpZ25hbEVsZW1lbnRNdXRhdGlvbnMoaW5qZWN0KEVsZW1lbnRSZWYpLCBvcHRpb25zKTtcblxuZXhwb3J0IHR5cGUgU2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlT3B0aW9ucyA9IHtcbiAgLyoqIFRoZSBpbml0aWFsIHNjcm9sbCBwb3NpdGlvbiB0byBzY3JvbGwgdG8uIE9uY2UgYSB0cnV0aHkgdmFsdWUgZ2V0J3MgZW1pdHRlZCwgYWxsIGZ1cnRoZXIgdmFsdWVzIHdpbGwgYmUgaWdub3JlZC4gKi9cbiAgaW5pdGlhbFNjcm9sbFBvc2l0aW9uPzogU2lnbmFsPHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGw+O1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZSA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLCBvcHRpb25zPzogU2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlT3B0aW9ucykgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IGVsZW1lbnREaW1lbnNpb25zID0gc2lnbmFsRWxlbWVudERpbWVuc2lvbnMoZWxlbWVudHMpO1xuICBjb25zdCBlbGVtZW50TXV0YXRpb25zID0gc2lnbmFsRWxlbWVudE11dGF0aW9ucyhlbGVtZW50cywgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gIGNvbnN0IGlzUmVuZGVyZWQgPSBzaWduYWxJc1JlbmRlcmVkKCk7XG5cbiAgY29uc3QgaW5pdGlhbFNjcm9sbFBvc2l0aW9uID0gb3B0aW9ucz8uaW5pdGlhbFNjcm9sbFBvc2l0aW9uO1xuXG4gIGlmIChpbml0aWFsU2Nyb2xsUG9zaXRpb24pIHtcbiAgICBjb25zdCByZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCFpc1JlbmRlcmVkKCkpIHJldHVybjtcblxuICAgICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSBpbml0aWFsU2Nyb2xsUG9zaXRpb24oKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50O1xuXG4gICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gJiYgZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxQb3NpdGlvbi54O1xuICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFBvc2l0aW9uLnk7XG4gICAgICAgIHJlZi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50O1xuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBlbGVtZW50RGltZW5zaW9ucygpO1xuXG4gICAgY29uc3Qgbm90U2Nyb2xsYWJsZSA9ICgpID0+ICh7XG4gICAgICBjYW5TY3JvbGw6IGZhbHNlLFxuICAgICAgY2FuU2Nyb2xsSG9yaXpvbnRhbGx5OiBmYWxzZSxcbiAgICAgIGNhblNjcm9sbFZlcnRpY2FsbHk6IGZhbHNlLFxuICAgICAgc2Nyb2xsV2lkdGg6IGVsZW1lbnQ/LnNjcm9sbFdpZHRoID8/IG51bGwsXG4gICAgICBzY3JvbGxIZWlnaHQ6IGVsZW1lbnQ/LnNjcm9sbEhlaWdodCA/PyBudWxsLFxuICAgICAgZWxlbWVudERpbWVuc2lvbnM6IGRpbWVuc2lvbnMsXG4gICAgfSk7XG5cbiAgICAvLyBXZSBhcmUgbm90IGludGVyZXN0ZWQgd2hhdCB0aGUgbXV0YXRpb24gaXMsIGp1c3QgdGhhdCB0aGVyZSBpcyBvbmUuXG4gICAgLy8gQ2hhbmdlcyB0byB0aGUgRE9NIGNhbiBhZmZlY3QgdGhlIHNjcm9sbCBzdGF0ZSBvZiB0aGUgZWxlbWVudC5cbiAgICBlbGVtZW50TXV0YXRpb25zKCk7XG5cbiAgICBpZiAoIWVsZW1lbnQgfHwgIWRpbWVuc2lvbnMucmVjdCB8fCAhaXNSZW5kZXJlZCgpKSByZXR1cm4gbm90U2Nyb2xsYWJsZSgpO1xuXG4gICAgY29uc3QgeyBzY3JvbGxXaWR0aCwgc2Nyb2xsSGVpZ2h0IH0gPSBlbGVtZW50O1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZGltZW5zaW9ucy5yZWN0O1xuXG4gICAgY29uc3QgY2FuU2Nyb2xsSG9yaXpvbnRhbGx5ID0gc2Nyb2xsV2lkdGggPiB3aWR0aDtcbiAgICBjb25zdCBjYW5TY3JvbGxWZXJ0aWNhbGx5ID0gc2Nyb2xsSGVpZ2h0ID4gaGVpZ2h0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNhblNjcm9sbDogY2FuU2Nyb2xsSG9yaXpvbnRhbGx5IHx8IGNhblNjcm9sbFZlcnRpY2FsbHksXG4gICAgICBjYW5TY3JvbGxIb3Jpem9udGFsbHksXG4gICAgICBjYW5TY3JvbGxWZXJ0aWNhbGx5LFxuICAgICAgc2Nyb2xsV2lkdGgsXG4gICAgICBzY3JvbGxIZWlnaHQsXG4gICAgICBlbGVtZW50RGltZW5zaW9uczogZGltZW5zaW9ucyxcbiAgICB9O1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxIb3N0RWxlbWVudFNjcm9sbFN0YXRlID0gKCkgPT4gc2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlKGluamVjdChFbGVtZW50UmVmKSk7XG5cbmV4cG9ydCB0eXBlIFNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb25PcHRpb25zID0gT21pdDxJbnRlcnNlY3Rpb25PYnNlcnZlckluaXQsICdyb290Jz4gJiB7XG4gIHJvb3Q/OiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGU7XG4gIGVuYWJsZWQ/OiBTaWduYWw8dW5rbm93bj47XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsRWxlbWVudEludGVyc2VjdGlvbiA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLCBvcHRpb25zPzogU2lnbmFsRWxlbWVudEludGVyc2VjdGlvbk9wdGlvbnMpID0+IHtcbiAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgY29uc3QgZWxlbWVudHMgPSBidWlsZEVsZW1lbnRTaWduYWwoZWwpO1xuICBjb25zdCByb290ID0gb3B0aW9ucz8ucm9vdCA/IGJ1aWxkRWxlbWVudFNpZ25hbChvcHRpb25zPy5yb290KSA6IGRvY3VtZW50RWxlbWVudFNpZ25hbCgpO1xuICBjb25zdCB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIGNvbnN0IGlzUmVuZGVyZWQgPSBzaWduYWxJc1JlbmRlcmVkKCk7XG4gIGNvbnN0IGlzRW5hYmxlZCA9IG9wdGlvbnM/LmVuYWJsZWQgPz8gc2lnbmFsKHRydWUpO1xuXG4gIGNvbnN0IGVsZW1lbnRJbnRlcnNlY3Rpb25TaWduYWwgPSBzaWduYWw8SW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVtdPihbXSk7XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBzaWduYWw8SW50ZXJzZWN0aW9uT2JzZXJ2ZXIgfCBudWxsPihudWxsKTtcblxuICBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdEVsID0gcm9vdCgpLmN1cnJlbnRFbGVtZW50O1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4gb2JzZXJ2ZXIoKT8uZGlzY29ubmVjdCgpKTtcblxuICAgICAgY29uc3QgbmV3T2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoXG4gICAgICAgIChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgaWYgKCFpc1JlbmRlcmVkKCkpIHJldHVybjtcblxuICAgICAgICAgIGxldCBjdXJyZW50VmFsdWVzID0gdW50cmFja2VkKCgpID0+IFsuLi5lbGVtZW50SW50ZXJzZWN0aW9uU2lnbmFsKCldKTtcblxuICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdFbnRyeUluZGV4ID0gY3VycmVudFZhbHVlcy5maW5kSW5kZXgoKHYpID0+IHYudGFyZ2V0ID09PSBlbnRyeS50YXJnZXQpO1xuXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdFbnRyeUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICBjdXJyZW50VmFsdWVzID0gW1xuICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRWYWx1ZXMuc2xpY2UoMCwgZXhpc3RpbmdFbnRyeUluZGV4KSxcbiAgICAgICAgICAgICAgICBlbnRyeSxcbiAgICAgICAgICAgICAgICAuLi5jdXJyZW50VmFsdWVzLnNsaWNlKGV4aXN0aW5nRW50cnlJbmRleCArIDEpLFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY3VycmVudFZhbHVlcyA9IFsuLi5jdXJyZW50VmFsdWVzLCBlbnRyeV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4gZWxlbWVudEludGVyc2VjdGlvblNpZ25hbC5zZXQoY3VycmVudFZhbHVlcykpO1xuICAgICAgICB9LFxuICAgICAgICB7IC4uLm9wdGlvbnMsIHJvb3Q6IHJvb3RFbCB9LFxuICAgICAgKTtcblxuICAgICAgb2JzZXJ2ZXIuc2V0KG5ld09ic2VydmVyKTtcbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgKTtcblxuICBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZWxzID0gZWxlbWVudHMoKTtcbiAgICAgIGNvbnN0IG9icyA9IG9ic2VydmVyKCk7XG4gICAgICBjb25zdCBlbmFibGVkID0gaXNFbmFibGVkKCk7XG5cbiAgICAgIGVsZW1lbnRJbnRlcnNlY3Rpb25TaWduYWwuc2V0KFtdKTtcblxuICAgICAgaWYgKGVscy5wcmV2aW91c0VsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBvYnM/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVscy5jdXJyZW50RWxlbWVudHMubGVuZ3RoICYmICEhZW5hYmxlZCkge1xuICAgICAgICBjb25zdCByb290RWwgPSB1bnRyYWNrZWQoKCkgPT4gcm9vdCgpLmN1cnJlbnRFbGVtZW50KTtcblxuICAgICAgICAvLyBjaGVjayBzeW5jIGZvciBpbnRlcnNlY3Rpb25zIHNpbmNlIHRoZSBpbnRlcnNlY3Rpb24gb2JzZXJ2ZXIgYXN5bmMgYW5kIHdlIHByb2JhYmx5IHdhbnQgdG8ga25vdyB0aGUgaW5pdGlhbCBzdGF0ZVxuICAgICAgICBjb25zdCBlbnRyaWVzID0gZWxzLmN1cnJlbnRFbGVtZW50c1xuICAgICAgICAgIC5tYXAoKGVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmlsaXR5ID0gaXNFbGVtZW50VmlzaWJsZSh7XG4gICAgICAgICAgICAgIGNvbnRhaW5lcjogcm9vdEVsLFxuICAgICAgICAgICAgICBlbGVtZW50OiBlbCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXZpc2liaWxpdHkpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gdmlzaWJpbGl0eSBkYXRhIGZvdW5kIGZvciBlbGVtZW50LicsIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbCxcbiAgICAgICAgICAgICAgICBjb250YWluZXI6IHJvb3RFbCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlubGluZUludGVyc2VjdGlvblJhdGlvID0gdmlzaWJpbGl0eS5pbmxpbmVJbnRlcnNlY3Rpb24gLyAxMDA7XG4gICAgICAgICAgICBjb25zdCBibG9ja0ludGVyc2VjdGlvblJhdGlvID0gdmlzaWJpbGl0eS5ibG9ja0ludGVyc2VjdGlvbiAvIDEwMDtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJzZWN0aW5nID0gaW5saW5lSW50ZXJzZWN0aW9uUmF0aW8gPiAwICYmIGJsb2NrSW50ZXJzZWN0aW9uUmF0aW8gPiAwO1xuICAgICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uUmF0aW8gPSBNYXRoLm1pbihpbmxpbmVJbnRlcnNlY3Rpb25SYXRpbywgYmxvY2tJbnRlcnNlY3Rpb25SYXRpbyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdGlvbkVudHJ5OiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5ID0ge1xuICAgICAgICAgICAgICBib3VuZGluZ0NsaWVudFJlY3Q6IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25SYXRpbyxcbiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUmVjdDogZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgIGlzSW50ZXJzZWN0aW5nLFxuICAgICAgICAgICAgICByb290Qm91bmRzOiByb290KCkuY3VycmVudEVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGwsXG4gICAgICAgICAgICAgIHRhcmdldDogZWwsXG4gICAgICAgICAgICAgIHRpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbkVudHJ5O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigoZSk6IGUgaXMgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSA9PiBlICE9PSBudWxsKTtcblxuICAgICAgICBlbGVtZW50SW50ZXJzZWN0aW9uU2lnbmFsLnNldChlbnRyaWVzKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsIG9mIGVscy5jdXJyZW50RWxlbWVudHMpIHtcbiAgICAgICAgICBvYnM/Lm9ic2VydmUoZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIoKT8uZGlzY29ubmVjdCgpKTtcblxuICByZXR1cm4gZWxlbWVudEludGVyc2VjdGlvblNpZ25hbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxIb3N0RWxlbWVudEludGVyc2VjdGlvbiA9IChvcHRpb25zPzogU2lnbmFsRWxlbWVudEludGVyc2VjdGlvbk9wdGlvbnMpID0+XG4gIHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24oaW5qZWN0KEVsZW1lbnRSZWYpLCBvcHRpb25zKTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEVsZW1lbnRDaGlsZHJlbiA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3QgaXNSZW5kZXJlZCA9IHNpZ25hbElzUmVuZGVyZWQoKTtcbiAgY29uc3QgZWxlbWVudE11dGF0aW9ucyA9IHNpZ25hbEVsZW1lbnRNdXRhdGlvbnMoZWxlbWVudHMsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCFpc1JlbmRlcmVkKCkpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IGVscyA9IGVsZW1lbnRzKCk7XG5cbiAgICAvLyBXZSBhcmUgbm90IGludGVyZXN0ZWQgd2hhdCB0aGUgbXV0YXRpb24gaXMsIGp1c3QgdGhhdCB0aGVyZSBpcyBvbmUuXG4gICAgLy8gQ2hhbmdlcyB0byB0aGUgRE9NIG1heSBhZmZlY3QgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50LlxuICAgIGVsZW1lbnRNdXRhdGlvbnMoKTtcblxuICAgIGlmICghZWxzLmN1cnJlbnRFbGVtZW50KSByZXR1cm4gW107XG5cbiAgICBjb25zdCBjaGlsZHJlbjogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGVscy5jdXJyZW50RWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbHMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2aW91c1NpZ25hbFZhbHVlID0gPFQ+KHNpZ25hbDogU2lnbmFsPFQ+KSA9PiB7XG4gIGNvbnN0IG9icyA9IHRvT2JzZXJ2YWJsZShzaWduYWwpLnBpcGUoXG4gICAgcGFpcndpc2UoKSxcbiAgICBtYXAoKFtwcmV2XSkgPT4gcHJldiksXG4gICk7XG5cbiAgcmV0dXJuIHRvU2lnbmFsKG9icyk7XG59O1xuXG5leHBvcnQgY29uc3Qgc3luY1NpZ25hbCA9IDxUPihmcm9tOiBTaWduYWw8VD4sIHRvOiBXcml0YWJsZVNpZ25hbDxUPikgPT4ge1xuICBlZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGZvcm1WYWwgPSBmcm9tKCk7XG5cbiAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgdG8uc2V0KGZvcm1WYWwpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbFZhbHVlU2lnbmFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAzMDBcbiAgICovXG4gIGRlYm91bmNlVGltZT86IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRlYm91bmNlRmlyc3Q/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29udHJvbFZhbHVlU2lnbmFsID0gPFQgZXh0ZW5kcyBGb3JtQ29udHJvbCB8IEZvcm1Hcm91cCB8IEZvcm1BcnJheT4oXG4gIGNvbnRyb2w6IFQsXG4gIG9wdGlvbnM/OiBDb250cm9sVmFsdWVTaWduYWxPcHRpb25zLFxuKSA9PiB7XG4gIGNvbnN0IHZjc09icyA9IG9wdGlvbnM/LmRlYm91bmNlVGltZVxuICAgID8gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUob3B0aW9ucz8uZGVib3VuY2VUaW1lID8/IDMwMCkpXG4gICAgOiBjb250cm9sLnZhbHVlQ2hhbmdlcztcblxuICBjb25zdCBvYnM6IE9ic2VydmFibGU8UmV0dXJuVHlwZTxUWydnZXRSYXdWYWx1ZSddPj4gPSBvcHRpb25zPy5kZWJvdW5jZUZpcnN0XG4gICAgPyBtZXJnZShvZihjb250cm9sLnZhbHVlKSwgdmNzT2JzKVxuICAgIDogdmNzT2JzLnBpcGUoc3RhcnRXaXRoKGNvbnRyb2wuZ2V0UmF3VmFsdWUoKSkpO1xuXG4gIHJldHVybiB0b1NpZ25hbChvYnMucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gZXF1YWwoYSwgYikpKSwge1xuICAgIHJlcXVpcmVTeW5jOiB0cnVlLFxuICB9KTtcbn07XG5cbi8qKlxuICogVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHBhaXIgaXMgdGhlIHByZXZpb3VzIHZhbHVlIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBjb250cm9sVmFsdWVTaWduYWxXaXRoUHJldmlvdXMgPSA8VCBleHRlbmRzIEZvcm1Db250cm9sIHwgRm9ybUdyb3VwIHwgRm9ybUFycmF5PihcbiAgY29udHJvbDogVCxcbiAgb3B0aW9ucz86IENvbnRyb2xWYWx1ZVNpZ25hbE9wdGlvbnMsXG4pID0+IHtcbiAgY29uc3Qgb2JzID0gdG9PYnNlcnZhYmxlKGNvbnRyb2xWYWx1ZVNpZ25hbChjb250cm9sLCBvcHRpb25zKSkucGlwZShcbiAgICBwYWlyd2lzZSgpLFxuICAgIHN0YXJ0V2l0aChbbnVsbCwgY29udHJvbC5nZXRSYXdWYWx1ZSgpXSksXG4gICk7XG5cbiAgcmV0dXJuIHRvU2lnbmFsKG9icywgeyByZXF1aXJlU3luYzogdHJ1ZSB9KTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBjb250cm9sVmFsdWVTaWduYWxgIGluc3RlYWQgd2l0aCBgZGVib3VuY2VUaW1lYCBvcHRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVib3VuY2VkQ29udHJvbFZhbHVlU2lnbmFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAzMDBcbiAgICovXG4gIGRlYm91bmNlVGltZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGNvbnRyb2xWYWx1ZVNpZ25hbGAgaW5zdGVhZCB3aXRoIGBkZWJvdW5jZVRpbWVgIHNldCB0byBgMzAwYCBhbmQgYGRlYm91bmNlRmlyc3RgIHNldCB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWJvdW5jZWRDb250cm9sVmFsdWVTaWduYWwgPSA8VCBleHRlbmRzIEZvcm1Db250cm9sPihcbiAgY29udHJvbDogVCxcbiAgb3B0aW9ucz86IERlYm91bmNlZENvbnRyb2xWYWx1ZVNpZ25hbE9wdGlvbnMsXG4pID0+IGNvbnRyb2xWYWx1ZVNpZ25hbChjb250cm9sLCBvcHRpb25zID8/IHsgZGVib3VuY2VUaW1lOiAzMDAsIGRlYm91bmNlRmlyc3Q6IHRydWUgfSk7XG5cbmV4cG9ydCB0eXBlIEluamVjdFV0aWxDb25maWcgPSB7XG4gIC8qKiBUaGUgaW5qZWN0b3IgdG8gdXNlIGZvciB0aGUgaW5qZWN0aW9uLiBNdXN0IGJlIHByb3ZpZGVkIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIGZyb20gd2l0aGluIGEgaW5qZWN0aW9uIGNvbnRleHQuICovXG4gIGluamVjdG9yPzogSW5qZWN0b3I7XG59O1xuXG5leHBvcnQgdHlwZSBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPEluLCBPdXQ+ID0ge1xuICAvKipcbiAgICogQSB0cmFuc2Zvcm0gZnVuY3Rpb24gc2ltaWxhciB0byB0aGUgYHRyYW5zZm9ybWAgZnVuY3Rpb24gaW4gQW5ndWxhciBpbnB1dCBiaW5kaW5ncy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSB2YWx1ZSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQuXG4gICAqIEUuZy4gdHJhbnNmb3JtaW5nIGBcInRydWVcImAgdG8gYHRydWVgIGZvciBhIGJvb2xlYW4gYXR0cmlidXRlLlxuICAgKi9cbiAgdHJhbnNmb3JtPzogKHZhbHVlOiBJbikgPT4gT3V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGluamVjdE9yUnVuSW5Db250ZXh0ID0gPFQ+KGZuOiAoKSA9PiBULCBjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnKSA9PiB7XG4gIGlmIChjb25maWc/LmluamVjdG9yKSB7XG4gICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dChjb25maWcuaW5qZWN0b3IsIGZuKTtcbiAgfVxuXG4gIHJldHVybiBmbigpO1xufTtcblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybU9yUmV0dXJuID0gPEluLCBPdXQ+KHNyYzogU2lnbmFsPEluPiwgY29uZmlnPzogSW5qZWN0VXRpbFRyYW5zZm9ybUNvbmZpZzxJbiwgT3V0PikgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1lciA9IGNvbmZpZz8udHJhbnNmb3JtO1xuXG4gIGlmICh0cmFuc2Zvcm1lcikge1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB0cmFuc2Zvcm1lcihzcmMoKSkpO1xuICB9XG5cbiAgcmV0dXJuIHNyYyBhcyB1bmtub3duIGFzIFNpZ25hbDxPdXQ+O1xufTtcblxuLyoqIEluamVjdCBhIHNpZ25hbCBjb250YWluaW5nIHRoZSBjdXJyZW50IHJvdXRlIGZyYWdtZW50ICh0aGUgcGFydCBhZnRlciB0aGUgIyBpbnNpZGUgdGhlIHVybCBpZiBwcmVzZW50KSAqL1xuZXhwb3J0IGNvbnN0IGluamVjdEZyYWdtZW50ID0gPFQgPSBzdHJpbmcgfCBudWxsPihcbiAgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZyAmIEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8c3RyaW5nIHwgbnVsbCwgVD4sXG4pID0+IHtcbiAgcmV0dXJuIGluamVjdE9yUnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICBjb25zdCByb3V0ZXJTdGF0ZVNlcnZpY2UgPSBpbmplY3QoUm91dGVyU3RhdGVTZXJ2aWNlKTtcbiAgICBjb25zdCBzcmMgPSB0b1NpZ25hbChyb3V0ZXJTdGF0ZVNlcnZpY2UuZnJhZ21lbnQkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLmZyYWdtZW50IH0pO1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybU9yUmV0dXJuKHNyYywgY29uZmlnKTtcbiAgfSwgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgYWxsIGN1cnJlbnRseSBhdmFpbGFibGUgcXVlcnkgcGFyYW1ldGVycyBhcyBhIHNpZ25hbCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFF1ZXJ5UGFyYW1zID0gKGNvbmZpZz86IEluamVjdFV0aWxDb25maWcpID0+IHtcbiAgcmV0dXJuIGluamVjdE9yUnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICBjb25zdCByb3V0ZXJTdGF0ZVNlcnZpY2UgPSBpbmplY3QoUm91dGVyU3RhdGVTZXJ2aWNlKTtcblxuICAgIHJldHVybiB0b1NpZ25hbChyb3V0ZXJTdGF0ZVNlcnZpY2UucXVlcnlQYXJhbXMkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLnF1ZXJ5UGFyYW1zIH0pO1xuICB9LCBjb25maWcpO1xufTtcblxuLyoqIEluamVjdCBhbGwgY3VycmVudGx5IGF2YWlsYWJsZSByb3V0ZSBkYXRhIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0Um91dGVEYXRhID0gKGNvbmZpZz86IEluamVjdFV0aWxDb25maWcpID0+IHtcbiAgcmV0dXJuIGluamVjdE9yUnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICBjb25zdCByb3V0ZXJTdGF0ZVNlcnZpY2UgPSBpbmplY3QoUm91dGVyU3RhdGVTZXJ2aWNlKTtcblxuICAgIHJldHVybiB0b1NpZ25hbChyb3V0ZXJTdGF0ZVNlcnZpY2UuZGF0YSQsIHsgaW5pdGlhbFZhbHVlOiByb3V0ZXJTdGF0ZVNlcnZpY2UuZGF0YSB9KTtcbiAgfSwgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgdGhlIGN1cnJlbnQgcm91dGUgdGl0bGUgYXMgYSBzaWduYWwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RSb3V0ZVRpdGxlID0gPFQgPSBzdHJpbmcgfCBudWxsPihcbiAgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZyAmIEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8c3RyaW5nIHwgbnVsbCwgVD4sXG4pID0+IHtcbiAgcmV0dXJuIGluamVjdE9yUnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICBjb25zdCByb3V0ZXJTdGF0ZVNlcnZpY2UgPSBpbmplY3QoUm91dGVyU3RhdGVTZXJ2aWNlKTtcbiAgICBjb25zdCBzcmMgPSB0b1NpZ25hbChyb3V0ZXJTdGF0ZVNlcnZpY2UudGl0bGUkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLnRpdGxlIH0pO1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybU9yUmV0dXJuKHNyYywgY29uZmlnKTtcbiAgfSwgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgYWxsIGN1cnJlbnRseSBhdmFpbGFibGUgcGF0aCBwYXJhbWV0ZXJzIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0UGF0aFBhcmFtcyA9IChjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG5cbiAgICByZXR1cm4gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLnBhdGhQYXJhbXMkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLnBhdGhQYXJhbXMgfSk7XG4gIH0sIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGEgc3BlY2lmaWMgcXVlcnkgcGFyYW1ldGVyIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0UXVlcnlQYXJhbSA9IDxUID0gc3RyaW5nIHwgbnVsbD4oXG4gIGtleTogc3RyaW5nLFxuICBjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnICYgSW5qZWN0VXRpbFRyYW5zZm9ybUNvbmZpZzxzdHJpbmcgfCBudWxsLCBUPixcbikgPT4ge1xuICBjb25zdCBxdWVyeVBhcmFtcyA9IGluamVjdFF1ZXJ5UGFyYW1zKGNvbmZpZyk7XG4gIGNvbnN0IHNyYyA9IGNvbXB1dGVkKCgpID0+IHF1ZXJ5UGFyYW1zKClba2V5XSA/PyBudWxsKSBhcyBTaWduYWw8c3RyaW5nIHwgbnVsbD47XG5cbiAgcmV0dXJuIHRyYW5zZm9ybU9yUmV0dXJuKHNyYywgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgYSBzcGVjaWZpYyByb3V0ZSBkYXRhIGl0ZW0gYXMgYSBzaWduYWwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RSb3V0ZURhdGFJdGVtID0gPFQgPSB1bmtub3duPihcbiAga2V5OiBzdHJpbmcsXG4gIGNvbmZpZz86IEluamVjdFV0aWxDb25maWcgJiBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPHVua25vd24sIFQ+LFxuKSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBpbmplY3RSb3V0ZURhdGEoY29uZmlnKTtcbiAgY29uc3Qgc3JjID0gY29tcHV0ZWQoKCkgPT4gZGF0YSgpW2tleV0gPz8gbnVsbCkgYXMgU2lnbmFsPFQ+O1xuXG4gIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGEgc3BlY2lmaWMgcGF0aCBwYXJhbWV0ZXIgYXMgYSBzaWduYWwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RQYXRoUGFyYW0gPSA8VCA9IHN0cmluZyB8IG51bGw+KFxuICBrZXk6IHN0cmluZyxcbiAgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZyAmIEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8c3RyaW5nIHwgbnVsbCwgVD4sXG4pID0+IHtcbiAgY29uc3QgcGF0aFBhcmFtcyA9IGluamVjdFBhdGhQYXJhbXMoY29uZmlnKTtcbiAgY29uc3Qgc3JjID0gY29tcHV0ZWQoKCkgPT4gcGF0aFBhcmFtcygpW2tleV0gPz8gbnVsbCkgYXMgU2lnbmFsPHN0cmluZyB8IG51bGw+O1xuXG4gIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlSXNSZW5kZXJlZFNpZ25hbCA9ICgpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgaWYgKCF2YWx1ZSgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnUmVuZGVyIHNpZ25hbCB3YXMgbm90IHNldCB0byB0cnVlLiBUaGlzIGNhbiBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yLiBNYWtlIHN1cmUgdG8gLmJpbmQoKSB0aGUgcmVuZGVyIHNpZ25hbCBhdCB0aGUgZW5kIG9mIHRoZSBjb25zdHJ1Y3Rvci4nLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHZhbHVlLFxuICAgIGJpbmQ6ICgpID0+IGVmZmVjdCgoKSA9PiB2YWx1ZS5zZXQodHJ1ZSksIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSksXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2FuQW5pbWF0ZVNpZ25hbCA9ICgpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgdmFsdWUuc2V0KHRydWUpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXRlOiB2YWx1ZSxcbiAgfTtcbn07XG4iXX0=
|
|
560
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvc2lnbmFsLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsVUFBVSxFQUVWLFVBQVUsRUFDVixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsbUJBQW1CLEVBR25CLGVBQWUsRUFDZixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBNEJ0RCxTQUFTLGVBQWUsQ0FBQyxFQUFXO0lBQ2xDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakIsTUFBTSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDakIsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxnQkFB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QUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNiLE9BQU8sQ0FBQyxLQUFLLENBQ1gsOElBQThJLENBQy9JLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsS0FBSyxFQUFFLEtBQUs7UUFDWixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztLQUN2RSxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxFQUFFO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QixTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxLQUFLLEVBQUUsS0FBSztLQUNiLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VFbGVtZW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIERlc3Ryb3lSZWYsXG4gIEVmZmVjdFJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIE5nWm9uZSxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFJlbmRlcmVyU3R5bGVGbGFnczIsXG4gIFNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpc0Rldk1vZGUsXG4gIGlzU2lnbmFsLFxuICBydW5JbkluamVjdGlvbkNvbnRleHQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIG1lcmdlLCBvZiwgcGFpcndpc2UsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSb3V0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBuZXh0RnJhbWUgfSBmcm9tICcuL2FuaW1hdGlvbi51dGlscyc7XG5pbXBvcnQgeyBlcXVhbCB9IGZyb20gJy4vZXF1YWwudXRpbCc7XG5pbXBvcnQgeyBpc0VsZW1lbnRWaXNpYmxlIH0gZnJvbSAnLi9zY3JvbGxhYmxlLnV0aWxzJztcblxudHlwZSBTaWduYWxFbGVtZW50QmluZGluZ0NvbXBsZXhUeXBlID1cbiAgfCBIVE1MRWxlbWVudFxuICB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIHwgUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgSFRNTEVsZW1lbnQ+XG4gIHwgQXJyYXk8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudD5cbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkO1xuXG50eXBlIFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSA9XG4gIHwgSFRNTEVsZW1lbnRcbiAgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICB8IE9ic2VydmFibGU8U2lnbmFsRWxlbWVudEJpbmRpbmdDb21wbGV4VHlwZT5cbiAgfCBTaWduYWw8U2lnbmFsRWxlbWVudEJpbmRpbmdDb21wbGV4VHlwZT5cbiAgfCBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudD5cbiAgfCBFbGVtZW50U2lnbmFsO1xuXG50eXBlIEVsZW1lbnRTaWduYWwgPSBTaWduYWw8e1xuICAvKiogQGRlcHJlY2F0ZWQgQWx3YXlzIHVzZSBjdXJyZW50RWxlbWVudHMgICovXG4gIGN1cnJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgLyoqIEBkZXByZWNhdGVkIEFsd2F5cyB1c2UgcHJldmlvdXNFbGVtZW50cyAgKi9cbiAgcHJldmlvdXNFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIGN1cnJlbnRFbGVtZW50czogSFRNTEVsZW1lbnRbXTtcbiAgcHJldmlvdXNFbGVtZW50czogSFRNTEVsZW1lbnRbXTtcbn0+O1xuXG5mdW5jdGlvbiBpc0VsZW1lbnRTaWduYWwoZWw6IHVua25vd24pOiBlbCBpcyBFbGVtZW50U2lnbmFsIHtcbiAgaWYgKGlzU2lnbmFsKGVsKSkge1xuICAgIGNvbnN0IHZhbCA9IGVsKCk7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiAnY3VycmVudEVsZW1lbnQnIGluIHZhbCAmJiAncHJldmlvdXNFbGVtZW50JyBpbiB2YWw7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmNvbnN0IGRvY3VtZW50RWxlbWVudFNpZ25hbCA9ICgpOiBFbGVtZW50U2lnbmFsID0+XG4gIHNpZ25hbCh7XG4gICAgY3VycmVudEVsZW1lbnQ6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICBwcmV2aW91c0VsZW1lbnQ6IG51bGwsXG4gICAgY3VycmVudEVsZW1lbnRzOiBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSxcbiAgICBwcmV2aW91c0VsZW1lbnRzOiBbXSxcbiAgfSk7XG5cbmNvbnN0IGJ1aWxkRWxlbWVudFNpZ25hbCA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IEVsZW1lbnRTaWduYWwgPT4ge1xuICBpZiAoZWwgPT09IG51bGwgfHwgZWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzaWduYWwoeyBjdXJyZW50RWxlbWVudDogbnVsbCwgcHJldmlvdXNFbGVtZW50OiBudWxsLCBjdXJyZW50RWxlbWVudHM6IFtdLCBwcmV2aW91c0VsZW1lbnRzOiBbXSB9KTtcbiAgfVxuXG4gIGlmIChpc0VsZW1lbnRTaWduYWwoZWwpKSB7XG4gICAgcmV0dXJuIGVsO1xuICB9XG5cbiAgbGV0IG1FbFNpZ25hbDogU2lnbmFsPEhUTUxFbGVtZW50W10gfCBudWxsPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHN3aXRjaEVsZW1lbnQgPSAoKSA9PlxuICAgIHN3aXRjaE1hcCgoZWxPclJlZjogU2lnbmFsRWxlbWVudEJpbmRpbmdDb21wbGV4VHlwZSkgPT4ge1xuICAgICAgaWYgKGVsT3JSZWYgaW5zdGFuY2VvZiBRdWVyeUxpc3QpIHtcbiAgICAgICAgcmV0dXJuIGVsT3JSZWYuY2hhbmdlcy5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChlbE9yUmVmKSxcbiAgICAgICAgICBtYXAoKCkgPT4gZWxPclJlZi50b0FycmF5KCkubWFwKChyKSA9PiBjb2VyY2VFbGVtZW50KHIpKSksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZWxPclJlZikpIHtcbiAgICAgICAgcmV0dXJuIG9mKGVsT3JSZWYubWFwKChyKSA9PiBjb2VyY2VFbGVtZW50KHIpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2VyY2VkRWwgPSBjb2VyY2VFbGVtZW50KGVsT3JSZWYpO1xuICAgICAgICByZXR1cm4gb2YoY29lcmNlZEVsID8gW2NvZXJjZWRFbF0gOiBudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBpZiAoZWwgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgbUVsU2lnbmFsID0gdG9TaWduYWwoZWwucGlwZShzd2l0Y2hFbGVtZW50KCkpLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgfSBlbHNlIGlmIChpc1NpZ25hbChlbCkpIHtcbiAgICBtRWxTaWduYWwgPSB0b1NpZ25hbCh0b09ic2VydmFibGUoZWwpLnBpcGUoc3dpdGNoRWxlbWVudCgpKSwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIH0gZWxzZSBpZiAoZWwgaW5zdGFuY2VvZiBRdWVyeUxpc3QpIHtcbiAgICBtRWxTaWduYWwgPSB0b1NpZ25hbChcbiAgICAgIGVsLmNoYW5nZXMucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKGVsKSxcbiAgICAgICAgbWFwKCgpID0+IGVsLnRvQXJyYXkoKS5tYXAoKHIpID0+IGNvZXJjZUVsZW1lbnQocikpKSxcbiAgICAgICksXG4gICAgICB7IGluaXRpYWxWYWx1ZTogbnVsbCB9LFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgbUVsU2lnbmFsID0gc2lnbmFsKFtjb2VyY2VFbGVtZW50KGVsKV0pO1xuICB9XG5cbiAgcmV0dXJuIHRvU2lnbmFsKFxuICAgIHRvT2JzZXJ2YWJsZShtRWxTaWduYWwpLnBpcGUoXG4gICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICBwYWlyd2lzZSgpLFxuICAgICAgbWFwKChbcHJldmlvdXNFbGVtZW50cywgY3VycmVudEVsZW1lbnRzXSkgPT4gKHtcbiAgICAgICAgcHJldmlvdXNFbGVtZW50czogcHJldmlvdXNFbGVtZW50cyA/PyBbXSxcbiAgICAgICAgY3VycmVudEVsZW1lbnRzOiBjdXJyZW50RWxlbWVudHMgPz8gW10sXG4gICAgICAgIGN1cnJlbnRFbGVtZW50OiBjdXJyZW50RWxlbWVudHM/LlswXSA/PyBudWxsLFxuICAgICAgICBwcmV2aW91c0VsZW1lbnQ6IHByZXZpb3VzRWxlbWVudHM/LlswXSA/PyBudWxsLFxuICAgICAgfSkpLFxuICAgICksXG4gICAgeyBpbml0aWFsVmFsdWU6IHsgY3VycmVudEVsZW1lbnQ6IG51bGwsIHByZXZpb3VzRWxlbWVudDogbnVsbCwgcHJldmlvdXNFbGVtZW50czogW10sIGN1cnJlbnRFbGVtZW50czogW10gfSB9LFxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFNpZ25hbEVmZmVjdHNDb25maWc8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+IHtcbiAgLyoqIFRoZSB0b2tlbnMgdG8gYXBwbHkgYW5kIHRoZWlyIHNpZ25hbCB2YWx1ZSAgKi9cbiAgdG9rZW5NYXA6IFQ7XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGZvciBlbGVtZW50cyB0aGF0IHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBzaWduYWwgZWZmZWN0cyAqL1xuICBjbGVhbnVwRm46IChlbDogSFRNTEVsZW1lbnQsIHRva2Vuczogc3RyaW5nW10pID0+IHZvaWQ7XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGZvciBlbGVtZW50cyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIHNpZ25hbCBlZmZlY3RzIG9yIHdoZW4gdGhlaXIgc2lnbmFsIHZhbHVlIGNoYW5nZXMgKi9cbiAgdXBkYXRlRm46IChlbDogSFRNTEVsZW1lbnQsIHRva2Vuczogc3RyaW5nW10sIGNvbmRpdGlvblJlc3VsdDogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2lnbmFsRWZmZWN0cyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oXG4gIGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsXG4gIGNvbmZpZzogQnVpbGRTaWduYWxFZmZlY3RzQ29uZmlnPFQ+LFxuKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgeyBjdXJyZW50RWxlbWVudHMsIHByZXZpb3VzRWxlbWVudHMgfSA9IGVsZW1lbnRzKCk7XG5cbiAgICBmb3IgKGNvbnN0IHByZXZpb3VzRWwgb2YgcHJldmlvdXNFbGVtZW50cykge1xuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50cy5pbmNsdWRlcyhwcmV2aW91c0VsKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IE9iamVjdC5rZXlzKGNvbmZpZy50b2tlbk1hcClcbiAgICAgICAgLm1hcCgoa2V5KSA9PiBrZXkuc3BsaXQoJyAnKSlcbiAgICAgICAgLmZsYXQoKTtcblxuICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgY29uZmlnLmNsZWFudXBGbihwcmV2aW91c0VsLCB0b2tlbnMpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY3VycmVudEVsIG9mIGN1cnJlbnRFbGVtZW50cykge1xuICAgICAgaWYgKHByZXZpb3VzRWxlbWVudHMuaW5jbHVkZXMoY3VycmVudEVsKSkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgW3Rva2VucywgY29uZGl0aW9uXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcudG9rZW5NYXApKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG9rZW5BcnJheSA9IHRva2Vucy5zcGxpdCgnICcpO1xuICAgICAgICAgIGlmICghdG9rZW5BcnJheS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgIGNvbmZpZy51cGRhdGVGbihjdXJyZW50RWwsIHRva2VuQXJyYXksIGNvbmRpdGlvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBlZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBFZmZlY3RSZWY+ID0ge307XG5cbiAgY29uc3QgaGFzID0gKHRva2Vuczogc3RyaW5nKSA9PiB0b2tlbnMgaW4gZWZmZWN0cztcblxuICBjb25zdCBwdXNoID0gKHRva2Vuczogc3RyaW5nLCBzaWduYWw6IFNpZ25hbDx1bmtub3duPikgPT4ge1xuICAgIGlmIChoYXModG9rZW5zKSkgcmV0dXJuO1xuXG4gICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiB7XG4gICAgICBlZmZlY3RzW3Rva2Vuc10gPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnRFbGVtZW50cyB9ID0gdW50cmFja2VkKCgpID0+IGVsZW1lbnRzKCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWwgb2YgY3VycmVudEVsZW1lbnRzKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5BcnJheSA9IHRva2Vucy5zcGxpdCgnICcpO1xuICAgICAgICAgIGlmICghdG9rZW5BcnJheS5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uZmlnLnVwZGF0ZUZuKGVsLCB0b2tlbkFycmF5LCBzaWduYWwoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHB1c2hNYW55ID0gKG1hcDogUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+PikgPT4ge1xuICAgIGZvciAoY29uc3QgW3Rva2Vucywgc2lnbmFsXSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgICBwdXNoKHRva2Vucywgc2lnbmFsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlID0gKHRva2Vuczogc3RyaW5nKSA9PiB7XG4gICAgZWZmZWN0c1t0b2tlbnNdPy5kZXN0cm95KCk7XG5cbiAgICBkZWxldGUgZWZmZWN0c1t0b2tlbnNdO1xuXG4gICAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50cykge1xuICAgICAgY29uc3QgdG9rZW5BcnJheSA9IHRva2Vucy5zcGxpdCgnICcpO1xuICAgICAgaWYgKCF0b2tlbkFycmF5Lmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgIGNvbmZpZy5jbGVhbnVwRm4oZWwsIHRva2VuQXJyYXkpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZW1vdmVNYW55ID0gKHRva2Vuczogc3RyaW5nW10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgcmVtb3ZlKHRva2VuKTtcbiAgICB9XG4gIH07XG5cbiAgcHVzaE1hbnkoY29uZmlnLnRva2VuTWFwKTtcblxuICByZXR1cm4geyByZW1vdmUsIHJlbW92ZU1hbnksIGhhcywgcHVzaCwgcHVzaE1hbnkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxJc1JlbmRlcmVkID0gKCkgPT4ge1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcblxuICBhZnRlck5leHRSZW5kZXIoKCkgPT4gaXNSZW5kZXJlZC5zZXQodHJ1ZSkpO1xuXG4gIHJldHVybiBpc1JlbmRlcmVkLmFzUmVhZG9ubHkoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxDbGFzc2VzID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+PihlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLCBjbGFzc01hcDogVCkgPT4ge1xuICBjb25zdCByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIHJldHVybiBidWlsZFNpZ25hbEVmZmVjdHMoZWwsIHtcbiAgICB0b2tlbk1hcDogY2xhc3NNYXAsXG4gICAgY2xlYW51cEZuOiAoZWwsIHRva2VucykgPT4gdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiByZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgdG9rZW4pKSxcbiAgICB1cGRhdGVGbjogKGVsLCB0b2tlbnMsIGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiByZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgdG9rZW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2Vucy5mb3JFYWNoKCh0b2tlbikgPT4gcmVuZGVyZXIuYWRkQ2xhc3MoZWwsIHRva2VuKSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdENsYXNzZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGNsYXNzTWFwOiBUKSA9PlxuICBzaWduYWxDbGFzc2VzKGluamVjdChFbGVtZW50UmVmKSwgY2xhc3NNYXApO1xuXG5jb25zdCBBTFdBWVNfVFJVRV9BVFRSSUJVVEVfS0VZUyA9IFsnZGlzYWJsZWQnLCAncmVhZG9ubHknLCAncmVxdWlyZWQnLCAnY2hlY2tlZCcsICdzZWxlY3RlZCcsICdoaWRkZW4nLCAnaW5lcnQnXTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEF0dHJpYnV0ZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KFxuICBlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLFxuICBhdHRyaWJ1dGVNYXA6IFQsXG4pID0+IHtcbiAgY29uc3QgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICByZXR1cm4gYnVpbGRTaWduYWxFZmZlY3RzKGVsLCB7XG4gICAgdG9rZW5NYXA6IGF0dHJpYnV0ZU1hcCxcbiAgICBjbGVhbnVwRm46IChlbCwgdG9rZW5zKSA9PiB0b2tlbnMuZm9yRWFjaCgodG9rZW4pID0+IGVsLnJlbW92ZUF0dHJpYnV0ZSh0b2tlbikpLFxuICAgIHVwZGF0ZUZuOiAoZWwsIHRva2VucywgY29uZGl0aW9uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBpZiAoQUxXQVlTX1RSVUVfQVRUUklCVVRFX0tFWVMuaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCB0b2tlbiwgJycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUoZWwsIHRva2VuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBudWxsIHx8IGNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsLCB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCB0b2tlbiwgYCR7Y29uZGl0aW9ufWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEF0dHJpYnV0ZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGF0dHJpYnV0ZU1hcDogVCkgPT5cbiAgc2lnbmFsQXR0cmlidXRlcyhpbmplY3QoRWxlbWVudFJlZiksIGF0dHJpYnV0ZU1hcCk7XG5cbmV4cG9ydCBjb25zdCBzaWduYWxTdHlsZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIHN0eWxlTWFwOiBUKSA9PiB7XG4gIGNvbnN0IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgcmV0dXJuIGJ1aWxkU2lnbmFsRWZmZWN0cyhlbCwge1xuICAgIHRva2VuTWFwOiBzdHlsZU1hcCxcbiAgICBjbGVhbnVwRm46IChlbCwgdG9rZW5zKSA9PiB0b2tlbnMuZm9yRWFjaCgodG9rZW4pID0+IHJlbmRlcmVyLnJlbW92ZVN0eWxlKGVsLCB0b2tlbikpLFxuICAgIHVwZGF0ZUZuOiAoZWwsIHRva2VucywgY29uZGl0aW9uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBudWxsIHx8IGNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVuZGVyZXIucmVtb3ZlU3R5bGUoZWwsIHRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgdG9rZW4sIGAke2NvbmRpdGlvbn1gLCBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEhvc3RTdHlsZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KHN0eWxlTWFwOiBUKSA9PlxuICBzaWduYWxTdHlsZXMoaW5qZWN0KEVsZW1lbnRSZWYpLCBzdHlsZU1hcCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNhbFNpemUge1xuICBpbmxpbmVTaXplOiBudW1iZXI7XG4gIGJsb2NrU2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnREaW1lbnNpb25zIHtcbiAgcmVjdDogRE9NUmVjdFJlYWRPbmx5IHwgbnVsbDtcbiAgYm9yZGVyQm94U2l6ZTogTG9naWNhbFNpemUgfCBudWxsO1xuICBjb250ZW50Qm94U2l6ZTogTG9naWNhbFNpemUgfCBudWxsO1xuICBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplOiBMb2dpY2FsU2l6ZSB8IG51bGw7XG59XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50RGltZW5zaW9ucyA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlKSA9PiB7XG4gIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3Qgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsSXNSZW5kZXJlZCgpO1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZSA9ICgpID0+ICh7XG4gICAgcmVjdDogZWxlbWVudHMoKS5jdXJyZW50RWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgPz8gbnVsbCxcbiAgICBib3JkZXJCb3hTaXplOiBudWxsLFxuICAgIGNvbnRlbnRCb3hTaXplOiBudWxsLFxuICAgIGRldmljZVBpeGVsQ29udGVudEJveFNpemU6IG51bGwsXG4gIH0pO1xuXG4gIGNvbnN0IGVsZW1lbnREaW1lbnNpb25zU2lnbmFsID0gc2lnbmFsPEVsZW1lbnREaW1lbnNpb25zPihpbml0aWFsVmFsdWUoKSk7XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGUpID0+IHtcbiAgICBpZiAoIWlzUmVuZGVyZWQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZW50cnkgPSBlWzBdO1xuXG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBjb25zdCBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplID0gZW50cnkuZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZT8uWzBdID8/IG51bGw7XG4gICAgICBjb25zdCBib3JkZXJCb3hTaXplID0gZW50cnkuYm9yZGVyQm94U2l6ZT8uWzBdID8/IG51bGw7XG4gICAgICBjb25zdCBjb250ZW50Qm94U2l6ZSA9IGVudHJ5LmNvbnRlbnRCb3hTaXplPy5bMF0gPz8gbnVsbDtcblxuICAgICAgem9uZS5ydW4oKCkgPT5cbiAgICAgICAgZWxlbWVudERpbWVuc2lvbnNTaWduYWwuc2V0KHtcbiAgICAgICAgICByZWN0OiBlbnRyeS5jb250ZW50UmVjdCxcbiAgICAgICAgICBib3JkZXJCb3hTaXplOiBib3JkZXJCb3hTaXplXG4gICAgICAgICAgICA/IHsgaW5saW5lU2l6ZTogYm9yZGVyQm94U2l6ZS5pbmxpbmVTaXplLCBibG9ja1NpemU6IGJvcmRlckJveFNpemUuYmxvY2tTaXplIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBjb250ZW50Qm94U2l6ZTogY29udGVudEJveFNpemVcbiAgICAgICAgICAgID8geyBpbmxpbmVTaXplOiBjb250ZW50Qm94U2l6ZS5pbmxpbmVTaXplLCBibG9ja1NpemU6IGNvbnRlbnRCb3hTaXplLmJsb2NrU2l6ZSB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZTogZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZVxuICAgICAgICAgICAgPyB7IGlubGluZVNpemU6IGRldmljZVBpeGVsQ29udGVudEJveFNpemUuaW5saW5lU2l6ZSwgYmxvY2tTaXplOiBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplLmJsb2NrU2l6ZSB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBlbHMgPSBlbGVtZW50cygpO1xuXG4gICAgICBlbGVtZW50RGltZW5zaW9uc1NpZ25hbC5zZXQoaW5pdGlhbFZhbHVlKCkpO1xuXG4gICAgICBpZiAoZWxzLnByZXZpb3VzRWxlbWVudCkge1xuICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbHMuY3VycmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWREaXNwbGF5ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbHMuY3VycmVudEVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbElzQW5ndWxhckNvbXBvbmVudCA9IGVscy5jdXJyZW50RWxlbWVudD8udGFnTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCctJyk7XG5cbiAgICAgICAgaWYgKGNvbXB1dGVkRGlzcGxheSA9PT0gJ2lubGluZScgJiYgaXNEZXZNb2RlKCkgJiYgY3VycmVudEVsSXNBbmd1bGFyQ29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBFbGVtZW50IDwke2Vscy5jdXJyZW50RWxlbWVudD8udGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4gaXMgYW4gQW5ndWxhciBjb21wb25lbnQgYW5kIGhhcyBhIGRpc3BsYXkgb2YgJ2lubGluZScuIElubGluZSBlbGVtZW50cyBjYW5ub3QgYmUgb2JzZXJ2ZWQgZm9yIGRpbWVuc2lvbnMuIFBsZWFzZSBjaGFuZ2UgaXQgdG8gJ2Jsb2NrJyBvciBzb21ldGhpbmcgZWxzZS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVscy5jdXJyZW50RWxlbWVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKTtcblxuICByZXR1cm4gZWxlbWVudERpbWVuc2lvbnNTaWduYWwuYXNSZWFkb25seSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEhvc3RFbGVtZW50RGltZW5zaW9ucyA9ICgpID0+IHNpZ25hbEVsZW1lbnREaW1lbnNpb25zKGluamVjdChFbGVtZW50UmVmKSk7XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50TXV0YXRpb25zID0gKGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIG9wdGlvbnM/OiBNdXRhdGlvbk9ic2VydmVySW5pdCkgPT4ge1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgY29uc3QgaXNSZW5kZXJlZCA9IHNpZ25hbElzUmVuZGVyZWQoKTtcblxuICBjb25zdCBlbGVtZW50TXV0YXRpb25zU2lnbmFsID0gc2lnbmFsPE11dGF0aW9uUmVjb3JkIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoZSkgPT4ge1xuICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm47XG5cbiAgICBjb25zdCBlbnRyeSA9IGVbMF07XG5cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIHpvbmUucnVuKCgpID0+IGVsZW1lbnRNdXRhdGlvbnNTaWduYWwuc2V0KGVudHJ5KSk7XG4gICAgfVxuICB9KTtcblxuICBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZWxzID0gZWxlbWVudHMoKTtcblxuICAgICAgZWxlbWVudE11dGF0aW9uc1NpZ25hbC5zZXQobnVsbCk7XG5cbiAgICAgIGlmIChlbHMucHJldmlvdXNFbGVtZW50KSB7XG4gICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVscy5jdXJyZW50RWxlbWVudCkge1xuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVscy5jdXJyZW50RWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKTtcblxuICByZXR1cm4gZWxlbWVudE11dGF0aW9uc1NpZ25hbC5hc1JlYWRvbmx5KCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEVsZW1lbnRNdXRhdGlvbnMgPSAob3B0aW9ucz86IE11dGF0aW9uT2JzZXJ2ZXJJbml0KSA9PlxuICBzaWduYWxFbGVtZW50TXV0YXRpb25zKGluamVjdChFbGVtZW50UmVmKSwgb3B0aW9ucyk7XG5cbmV4cG9ydCB0eXBlIFNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZU9wdGlvbnMgPSB7XG4gIC8qKiBUaGUgaW5pdGlhbCBzY3JvbGwgcG9zaXRpb24gdG8gc2Nyb2xsIHRvLiBPbmNlIGEgdHJ1dGh5IHZhbHVlIGdldCdzIGVtaXR0ZWQsIGFsbCBmdXJ0aGVyIHZhbHVlcyB3aWxsIGJlIGlnbm9yZWQuICovXG4gIGluaXRpYWxTY3JvbGxQb3NpdGlvbj86IFNpZ25hbDxTY3JvbGxUb09wdGlvbnMgfCBudWxsPjtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50U2Nyb2xsU3RhdGUgPSAoZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSwgb3B0aW9ucz86IFNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZU9wdGlvbnMpID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBidWlsZEVsZW1lbnRTaWduYWwoZWwpO1xuICBjb25zdCBlbGVtZW50RGltZW5zaW9ucyA9IHNpZ25hbEVsZW1lbnREaW1lbnNpb25zKGVsZW1lbnRzKTtcbiAgY29uc3QgZWxlbWVudE11dGF0aW9ucyA9IHNpZ25hbEVsZW1lbnRNdXRhdGlvbnMoZWxlbWVudHMsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsSXNSZW5kZXJlZCgpO1xuXG4gIGNvbnN0IGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9IG9wdGlvbnM/LmluaXRpYWxTY3JvbGxQb3NpdGlvbjtcblxuICBpZiAoaW5pdGlhbFNjcm9sbFBvc2l0aW9uKSB7XG4gICAgY29uc3QgcmVmID0gZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHMoKS5jdXJyZW50RWxlbWVudDtcblxuICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uICYmIGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uLmxlZnQgIT09IHVuZGVmaW5lZCkgZWxlbWVudC5zY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb24ubGVmdDtcbiAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uLnRvcCAhPT0gdW5kZWZpbmVkKSBlbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFBvc2l0aW9uLnRvcDtcbiAgICAgICAgcmVmLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzKCkuY3VycmVudEVsZW1lbnQ7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IGVsZW1lbnREaW1lbnNpb25zKCk7XG5cbiAgICBjb25zdCBub3RTY3JvbGxhYmxlID0gKCkgPT4gKHtcbiAgICAgIGNhblNjcm9sbDogZmFsc2UsXG4gICAgICBjYW5TY3JvbGxIb3Jpem9udGFsbHk6IGZhbHNlLFxuICAgICAgY2FuU2Nyb2xsVmVydGljYWxseTogZmFsc2UsXG4gICAgICBzY3JvbGxXaWR0aDogZWxlbWVudD8uc2Nyb2xsV2lkdGggPz8gbnVsbCxcbiAgICAgIHNjcm9sbEhlaWdodDogZWxlbWVudD8uc2Nyb2xsSGVpZ2h0ID8/IG51bGwsXG4gICAgICBlbGVtZW50RGltZW5zaW9uczogZGltZW5zaW9ucyxcbiAgICB9KTtcblxuICAgIC8vIFdlIGFyZSBub3QgaW50ZXJlc3RlZCB3aGF0IHRoZSBtdXRhdGlvbiBpcywganVzdCB0aGF0IHRoZXJlIGlzIG9uZS5cbiAgICAvLyBDaGFuZ2VzIHRvIHRoZSBET00gY2FuIGFmZmVjdCB0aGUgc2Nyb2xsIHN0YXRlIG9mIHRoZSBlbGVtZW50LlxuICAgIGVsZW1lbnRNdXRhdGlvbnMoKTtcblxuICAgIGlmICghZWxlbWVudCB8fCAhZGltZW5zaW9ucy5yZWN0IHx8ICFpc1JlbmRlcmVkKCkpIHJldHVybiBub3RTY3JvbGxhYmxlKCk7XG5cbiAgICBjb25zdCB7IHNjcm9sbFdpZHRoLCBzY3JvbGxIZWlnaHQgfSA9IGVsZW1lbnQ7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBkaW1lbnNpb25zLnJlY3Q7XG5cbiAgICBjb25zdCBjYW5TY3JvbGxIb3Jpem9udGFsbHkgPSBzY3JvbGxXaWR0aCA+IHdpZHRoO1xuICAgIGNvbnN0IGNhblNjcm9sbFZlcnRpY2FsbHkgPSBzY3JvbGxIZWlnaHQgPiBoZWlnaHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2FuU2Nyb2xsOiBjYW5TY3JvbGxIb3Jpem9udGFsbHkgfHwgY2FuU2Nyb2xsVmVydGljYWxseSxcbiAgICAgIGNhblNjcm9sbEhvcml6b250YWxseSxcbiAgICAgIGNhblNjcm9sbFZlcnRpY2FsbHksXG4gICAgICBzY3JvbGxXaWR0aCxcbiAgICAgIHNjcm9sbEhlaWdodCxcbiAgICAgIGVsZW1lbnREaW1lbnNpb25zOiBkaW1lbnNpb25zLFxuICAgIH07XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEhvc3RFbGVtZW50U2Nyb2xsU3RhdGUgPSAoKSA9PiBzaWduYWxFbGVtZW50U2Nyb2xsU3RhdGUoaW5qZWN0KEVsZW1lbnRSZWYpKTtcblxuZXhwb3J0IHR5cGUgU2lnbmFsRWxlbWVudEludGVyc2VjdGlvbk9wdGlvbnMgPSBPbWl0PEludGVyc2VjdGlvbk9ic2VydmVySW5pdCwgJ3Jvb3QnPiAmIHtcbiAgcm9vdD86IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZTtcbiAgZW5hYmxlZD86IFNpZ25hbDx1bmtub3duPjtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uID0gKGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIG9wdGlvbnM/OiBTaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uT3B0aW9ucykgPT4ge1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IHJvb3QgPSBvcHRpb25zPy5yb290ID8gYnVpbGRFbGVtZW50U2lnbmFsKG9wdGlvbnM/LnJvb3QpIDogZG9jdW1lbnRFbGVtZW50U2lnbmFsKCk7XG4gIGNvbnN0IHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgY29uc3QgaXNSZW5kZXJlZCA9IHNpZ25hbElzUmVuZGVyZWQoKTtcbiAgY29uc3QgaXNFbmFibGVkID0gb3B0aW9ucz8uZW5hYmxlZCA/PyBzaWduYWwodHJ1ZSk7XG5cbiAgY29uc3QgZWxlbWVudEludGVyc2VjdGlvblNpZ25hbCA9IHNpZ25hbDxJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5W10+KFtdKTtcblxuICBjb25zdCBvYnNlcnZlciA9IHNpZ25hbDxJbnRlcnNlY3Rpb25PYnNlcnZlciB8IG51bGw+KG51bGwpO1xuXG4gIGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCByb290RWwgPSByb290KCkuY3VycmVudEVsZW1lbnQ7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiBvYnNlcnZlcigpPy5kaXNjb25uZWN0KCkpO1xuXG4gICAgICBjb25zdCBuZXdPYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihcbiAgICAgICAgKGVudHJpZXMpID0+IHtcbiAgICAgICAgICBpZiAoIWlzUmVuZGVyZWQoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgbGV0IGN1cnJlbnRWYWx1ZXMgPSB1bnRyYWNrZWQoKCkgPT4gWy4uLmVsZW1lbnRJbnRlcnNlY3Rpb25TaWduYWwoKV0pO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0VudHJ5SW5kZXggPSBjdXJyZW50VmFsdWVzLmZpbmRJbmRleCgodikgPT4gdi50YXJnZXQgPT09IGVudHJ5LnRhcmdldCk7XG5cbiAgICAgICAgICAgIGlmIChleGlzdGluZ0VudHJ5SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZXMgPSBbXG4gICAgICAgICAgICAgICAgLi4uY3VycmVudFZhbHVlcy5zbGljZSgwLCBleGlzdGluZ0VudHJ5SW5kZXgpLFxuICAgICAgICAgICAgICAgIGVudHJ5LFxuICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRWYWx1ZXMuc2xpY2UoZXhpc3RpbmdFbnRyeUluZGV4ICsgMSksXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjdXJyZW50VmFsdWVzID0gWy4uLmN1cnJlbnRWYWx1ZXMsIGVudHJ5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB6b25lLnJ1bigoKSA9PiBlbGVtZW50SW50ZXJzZWN0aW9uU2lnbmFsLnNldChjdXJyZW50VmFsdWVzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgLi4ub3B0aW9ucywgcm9vdDogcm9vdEVsIH0sXG4gICAgICApO1xuXG4gICAgICBvYnNlcnZlci5zZXQobmV3T2JzZXJ2ZXIpO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICApO1xuXG4gIGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBlbHMgPSBlbGVtZW50cygpO1xuICAgICAgY29uc3Qgb2JzID0gb2JzZXJ2ZXIoKTtcbiAgICAgIGNvbnN0IGVuYWJsZWQgPSBpc0VuYWJsZWQoKTtcblxuICAgICAgZWxlbWVudEludGVyc2VjdGlvblNpZ25hbC5zZXQoW10pO1xuXG4gICAgICBpZiAoZWxzLnByZXZpb3VzRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIG9icz8uZGlzY29ubmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxzLmN1cnJlbnRFbGVtZW50cy5sZW5ndGggJiYgISFlbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IHJvb3RFbCA9IHVudHJhY2tlZCgoKSA9PiByb290KCkuY3VycmVudEVsZW1lbnQpO1xuICAgICAgICBjb25zdCByb290Qm91bmRzID0gcm9vdEVsPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBjaGVjayBzeW5jIGZvciBpbnRlcnNlY3Rpb25zIHNpbmNlIHRoZSBpbnRlcnNlY3Rpb24gb2JzZXJ2ZXIgYXN5bmMgYW5kIHdlIHByb2JhYmx5IHdhbnQgdG8ga25vdyB0aGUgaW5pdGlhbCBzdGF0ZVxuICAgICAgICBjb25zdCBlbnRyaWVzID0gZWxzLmN1cnJlbnRFbGVtZW50c1xuICAgICAgICAgIC5tYXAoKGVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmlsaXR5ID0gaXNFbGVtZW50VmlzaWJsZSh7XG4gICAgICAgICAgICAgIGNvbnRhaW5lcjogcm9vdEVsLFxuICAgICAgICAgICAgICBlbGVtZW50OiBlbCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXZpc2liaWxpdHkpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gdmlzaWJpbGl0eSBkYXRhIGZvdW5kIGZvciBlbGVtZW50LicsIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBlbCxcbiAgICAgICAgICAgICAgICBjb250YWluZXI6IHJvb3RFbCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlubGluZUludGVyc2VjdGlvblJhdGlvID0gdmlzaWJpbGl0eS5pbmxpbmVJbnRlcnNlY3Rpb24gLyAxMDA7XG4gICAgICAgICAgICBjb25zdCBibG9ja0ludGVyc2VjdGlvblJhdGlvID0gdmlzaWJpbGl0eS5ibG9ja0ludGVyc2VjdGlvbiAvIDEwMDtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJzZWN0aW5nID0gaW5saW5lSW50ZXJzZWN0aW9uUmF0aW8gPiAwICYmIGJsb2NrSW50ZXJzZWN0aW9uUmF0aW8gPiAwO1xuICAgICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uUmF0aW8gPSBNYXRoLm1pbihpbmxpbmVJbnRlcnNlY3Rpb25SYXRpbywgYmxvY2tJbnRlcnNlY3Rpb25SYXRpbyk7XG4gICAgICAgICAgICBjb25zdCBlbEJvdW5kcyA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBpbnRlcnNlY3Rpb25FbnRyeTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSA9IHtcbiAgICAgICAgICAgICAgYm91bmRpbmdDbGllbnRSZWN0OiBlbEJvdW5kcyxcbiAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUmF0aW8sXG4gICAgICAgICAgICAgIGludGVyc2VjdGlvblJlY3Q6IGVsQm91bmRzLFxuICAgICAgICAgICAgICBpc0ludGVyc2VjdGluZyxcbiAgICAgICAgICAgICAgcm9vdEJvdW5kczogcm9vdEJvdW5kcyA/PyBudWxsLFxuICAgICAgICAgICAgICB0YXJnZXQ6IGVsLFxuICAgICAgICAgICAgICB0aW1lOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBpbnRlcnNlY3Rpb25FbnRyeTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKGUpOiBlIGlzIEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgPT4gZSAhPT0gbnVsbCk7XG5cbiAgICAgICAgZWxlbWVudEludGVyc2VjdGlvblNpZ25hbC5zZXQoZW50cmllcyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbCBvZiBlbHMuY3VycmVudEVsZW1lbnRzKSB7XG4gICAgICAgICAgb2JzPy5vYnNlcnZlKGVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICApO1xuXG4gIGRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IG9ic2VydmVyKCk/LmRpc2Nvbm5lY3QoKSk7XG5cbiAgcmV0dXJuIGVsZW1lbnRJbnRlcnNlY3Rpb25TaWduYWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEVsZW1lbnRJbnRlcnNlY3Rpb24gPSAob3B0aW9ucz86IFNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb25PcHRpb25zKSA9PlxuICBzaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uKGluamVjdChFbGVtZW50UmVmKSwgb3B0aW9ucyk7XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50Q2hpbGRyZW4gPSAoZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IGlzUmVuZGVyZWQgPSBzaWduYWxJc1JlbmRlcmVkKCk7XG4gIGNvbnN0IGVsZW1lbnRNdXRhdGlvbnMgPSBzaWduYWxFbGVtZW50TXV0YXRpb25zKGVsZW1lbnRzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSB9KTtcblxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBlbHMgPSBlbGVtZW50cygpO1xuXG4gICAgLy8gV2UgYXJlIG5vdCBpbnRlcmVzdGVkIHdoYXQgdGhlIG11dGF0aW9uIGlzLCBqdXN0IHRoYXQgdGhlcmUgaXMgb25lLlxuICAgIC8vIENoYW5nZXMgdG8gdGhlIERPTSBtYXkgYWZmZWN0IHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudC5cbiAgICBlbGVtZW50TXV0YXRpb25zKCk7XG5cbiAgICBpZiAoIWVscy5jdXJyZW50RWxlbWVudCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgY2hpbGRyZW46IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbHMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxzLmN1cnJlbnRFbGVtZW50LmNoaWxkcmVuW2luZGV4XTtcblxuICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcHJldmlvdXNTaWduYWxWYWx1ZSA9IDxUPihzaWduYWw6IFNpZ25hbDxUPikgPT4ge1xuICBjb25zdCBvYnMgPSB0b09ic2VydmFibGUoc2lnbmFsKS5waXBlKFxuICAgIHBhaXJ3aXNlKCksXG4gICAgbWFwKChbcHJldl0pID0+IHByZXYpLFxuICApO1xuXG4gIHJldHVybiB0b1NpZ25hbChvYnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IHN5bmNTaWduYWwgPSA8VD4oZnJvbTogU2lnbmFsPFQ+LCB0bzogV3JpdGFibGVTaWduYWw8VD4pID0+IHtcbiAgZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBmb3JtVmFsID0gZnJvbSgpO1xuXG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIHRvLnNldChmb3JtVmFsKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xWYWx1ZVNpZ25hbE9wdGlvbnMge1xuICAvKipcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBkZWJvdW5jZVRpbWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWJvdW5jZUZpcnN0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRyb2xWYWx1ZVNpZ25hbCA9IDxUIGV4dGVuZHMgRm9ybUNvbnRyb2wgfCBGb3JtR3JvdXAgfCBGb3JtQXJyYXk+KFxuICBjb250cm9sOiBULFxuICBvcHRpb25zPzogQ29udHJvbFZhbHVlU2lnbmFsT3B0aW9ucyxcbikgPT4ge1xuICBjb25zdCB2Y3NPYnMgPSBvcHRpb25zPy5kZWJvdW5jZVRpbWVcbiAgICA/IGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKG9wdGlvbnM/LmRlYm91bmNlVGltZSA/PyAzMDApKVxuICAgIDogY29udHJvbC52YWx1ZUNoYW5nZXM7XG5cbiAgY29uc3Qgb2JzOiBPYnNlcnZhYmxlPFJldHVyblR5cGU8VFsnZ2V0UmF3VmFsdWUnXT4+ID0gb3B0aW9ucz8uZGVib3VuY2VGaXJzdFxuICAgID8gbWVyZ2Uob2YoY29udHJvbC52YWx1ZSksIHZjc09icylcbiAgICA6IHZjc09icy5waXBlKHN0YXJ0V2l0aChjb250cm9sLmdldFJhd1ZhbHVlKCkpKTtcblxuICByZXR1cm4gdG9TaWduYWwob2JzLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGVxdWFsKGEsIGIpKSksIHtcbiAgICByZXF1aXJlU3luYzogdHJ1ZSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBwYWlyIGlzIHRoZSBwcmV2aW91cyB2YWx1ZSBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIHRoZSBjdXJyZW50IHZhbHVlLlxuICovXG5leHBvcnQgY29uc3QgY29udHJvbFZhbHVlU2lnbmFsV2l0aFByZXZpb3VzID0gPFQgZXh0ZW5kcyBGb3JtQ29udHJvbCB8IEZvcm1Hcm91cCB8IEZvcm1BcnJheT4oXG4gIGNvbnRyb2w6IFQsXG4gIG9wdGlvbnM/OiBDb250cm9sVmFsdWVTaWduYWxPcHRpb25zLFxuKSA9PiB7XG4gIGNvbnN0IG9icyA9IHRvT2JzZXJ2YWJsZShjb250cm9sVmFsdWVTaWduYWwoY29udHJvbCwgb3B0aW9ucykpLnBpcGUoXG4gICAgcGFpcndpc2UoKSxcbiAgICBzdGFydFdpdGgoW251bGwsIGNvbnRyb2wuZ2V0UmF3VmFsdWUoKV0pLFxuICApO1xuXG4gIHJldHVybiB0b1NpZ25hbChvYnMsIHsgcmVxdWlyZVN5bmM6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgY29udHJvbFZhbHVlU2lnbmFsYCBpbnN0ZWFkIHdpdGggYGRlYm91bmNlVGltZWAgb3B0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlYm91bmNlZENvbnRyb2xWYWx1ZVNpZ25hbE9wdGlvbnMge1xuICAvKipcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBkZWJvdW5jZVRpbWU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBjb250cm9sVmFsdWVTaWduYWxgIGluc3RlYWQgd2l0aCBgZGVib3VuY2VUaW1lYCBzZXQgdG8gYDMwMGAgYW5kIGBkZWJvdW5jZUZpcnN0YCBzZXQgdG8gYHRydWVgLlxuICovXG5leHBvcnQgY29uc3QgZGVib3VuY2VkQ29udHJvbFZhbHVlU2lnbmFsID0gPFQgZXh0ZW5kcyBGb3JtQ29udHJvbD4oXG4gIGNvbnRyb2w6IFQsXG4gIG9wdGlvbnM/OiBEZWJvdW5jZWRDb250cm9sVmFsdWVTaWduYWxPcHRpb25zLFxuKSA9PiBjb250cm9sVmFsdWVTaWduYWwoY29udHJvbCwgb3B0aW9ucyA/PyB7IGRlYm91bmNlVGltZTogMzAwLCBkZWJvdW5jZUZpcnN0OiB0cnVlIH0pO1xuXG5leHBvcnQgdHlwZSBJbmplY3RVdGlsQ29uZmlnID0ge1xuICAvKiogVGhlIGluamVjdG9yIHRvIHVzZSBmb3IgdGhlIGluamVjdGlvbi4gTXVzdCBiZSBwcm92aWRlZCBpZiB0aGUgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBmcm9tIHdpdGhpbiBhIGluamVjdGlvbiBjb250ZXh0LiAqL1xuICBpbmplY3Rvcj86IEluamVjdG9yO1xufTtcblxuZXhwb3J0IHR5cGUgSW5qZWN0VXRpbFRyYW5zZm9ybUNvbmZpZzxJbiwgT3V0PiA9IHtcbiAgLyoqXG4gICAqIEEgdHJhbnNmb3JtIGZ1bmN0aW9uIHNpbWlsYXIgdG8gdGhlIGB0cmFuc2Zvcm1gIGZ1bmN0aW9uIGluIEFuZ3VsYXIgaW5wdXQgYmluZGluZ3MuXG4gICAqIENhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgYmVmb3JlIGl0IGlzIHJldHVybmVkLlxuICAgKiBFLmcuIHRyYW5zZm9ybWluZyBgXCJ0cnVlXCJgIHRvIGB0cnVlYCBmb3IgYSBib29sZWFuIGF0dHJpYnV0ZS5cbiAgICovXG4gIHRyYW5zZm9ybT86ICh2YWx1ZTogSW4pID0+IE91dDtcbn07XG5cbmV4cG9ydCBjb25zdCBpbmplY3RPclJ1bkluQ29udGV4dCA9IDxUPihmbjogKCkgPT4gVCwgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZykgPT4ge1xuICBpZiAoY29uZmlnPy5pbmplY3Rvcikge1xuICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQoY29uZmlnLmluamVjdG9yLCBmbik7XG4gIH1cblxuICByZXR1cm4gZm4oKTtcbn07XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1PclJldHVybiA9IDxJbiwgT3V0PihzcmM6IFNpZ25hbDxJbj4sIGNvbmZpZz86IEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8SW4sIE91dD4pID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtZXIgPSBjb25maWc/LnRyYW5zZm9ybTtcblxuICBpZiAodHJhbnNmb3JtZXIpIHtcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gdHJhbnNmb3JtZXIoc3JjKCkpKTtcbiAgfVxuXG4gIHJldHVybiBzcmMgYXMgdW5rbm93biBhcyBTaWduYWw8T3V0Pjtcbn07XG5cbi8qKiBJbmplY3QgYSBzaWduYWwgY29udGFpbmluZyB0aGUgY3VycmVudCByb3V0ZSBmcmFnbWVudCAodGhlIHBhcnQgYWZ0ZXIgdGhlICMgaW5zaWRlIHRoZSB1cmwgaWYgcHJlc2VudCkgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RGcmFnbWVudCA9IDxUID0gc3RyaW5nIHwgbnVsbD4oXG4gIGNvbmZpZz86IEluamVjdFV0aWxDb25maWcgJiBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPHN0cmluZyB8IG51bGwsIFQ+LFxuKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG4gICAgY29uc3Qgc3JjID0gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLmZyYWdtZW50JCwgeyBpbml0aWFsVmFsdWU6IHJvdXRlclN0YXRlU2VydmljZS5mcmFnbWVudCB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG4gIH0sIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGFsbCBjdXJyZW50bHkgYXZhaWxhYmxlIHF1ZXJ5IHBhcmFtZXRlcnMgYXMgYSBzaWduYWwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RRdWVyeVBhcmFtcyA9IChjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG5cbiAgICByZXR1cm4gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLnF1ZXJ5UGFyYW1zJCwgeyBpbml0aWFsVmFsdWU6IHJvdXRlclN0YXRlU2VydmljZS5xdWVyeVBhcmFtcyB9KTtcbiAgfSwgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgYWxsIGN1cnJlbnRseSBhdmFpbGFibGUgcm91dGUgZGF0YSBhcyBhIHNpZ25hbCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFJvdXRlRGF0YSA9IChjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG5cbiAgICByZXR1cm4gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLmRhdGEkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLmRhdGEgfSk7XG4gIH0sIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IHRoZSBjdXJyZW50IHJvdXRlIHRpdGxlIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0Um91dGVUaXRsZSA9IDxUID0gc3RyaW5nIHwgbnVsbD4oXG4gIGNvbmZpZz86IEluamVjdFV0aWxDb25maWcgJiBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPHN0cmluZyB8IG51bGwsIFQ+LFxuKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG4gICAgY29uc3Qgc3JjID0gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLnRpdGxlJCwgeyBpbml0aWFsVmFsdWU6IHJvdXRlclN0YXRlU2VydmljZS50aXRsZSB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG4gIH0sIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGFsbCBjdXJyZW50bHkgYXZhaWxhYmxlIHBhdGggcGFyYW1ldGVycyBhcyBhIHNpZ25hbCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFBhdGhQYXJhbXMgPSAoY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZykgPT4ge1xuICByZXR1cm4gaW5qZWN0T3JSdW5JbkNvbnRleHQoKCkgPT4ge1xuICAgIGNvbnN0IHJvdXRlclN0YXRlU2VydmljZSA9IGluamVjdChSb3V0ZXJTdGF0ZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIHRvU2lnbmFsKHJvdXRlclN0YXRlU2VydmljZS5wYXRoUGFyYW1zJCwgeyBpbml0aWFsVmFsdWU6IHJvdXRlclN0YXRlU2VydmljZS5wYXRoUGFyYW1zIH0pO1xuICB9LCBjb25maWcpO1xufTtcblxuLyoqIEluamVjdCBhIHNwZWNpZmljIHF1ZXJ5IHBhcmFtZXRlciBhcyBhIHNpZ25hbCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFF1ZXJ5UGFyYW0gPSA8VCA9IHN0cmluZyB8IG51bGw+KFxuICBrZXk6IHN0cmluZyxcbiAgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZyAmIEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8c3RyaW5nIHwgbnVsbCwgVD4sXG4pID0+IHtcbiAgY29uc3QgcXVlcnlQYXJhbXMgPSBpbmplY3RRdWVyeVBhcmFtcyhjb25maWcpO1xuICBjb25zdCBzcmMgPSBjb21wdXRlZCgoKSA9PiBxdWVyeVBhcmFtcygpW2tleV0gPz8gbnVsbCkgYXMgU2lnbmFsPHN0cmluZyB8IG51bGw+O1xuXG4gIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGEgc3BlY2lmaWMgcm91dGUgZGF0YSBpdGVtIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0Um91dGVEYXRhSXRlbSA9IDxUID0gdW5rbm93bj4oXG4gIGtleTogc3RyaW5nLFxuICBjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnICYgSW5qZWN0VXRpbFRyYW5zZm9ybUNvbmZpZzx1bmtub3duLCBUPixcbikgPT4ge1xuICBjb25zdCBkYXRhID0gaW5qZWN0Um91dGVEYXRhKGNvbmZpZyk7XG4gIGNvbnN0IHNyYyA9IGNvbXB1dGVkKCgpID0+IGRhdGEoKVtrZXldID8/IG51bGwpIGFzIFNpZ25hbDxUPjtcblxuICByZXR1cm4gdHJhbnNmb3JtT3JSZXR1cm4oc3JjLCBjb25maWcpO1xufTtcblxuLyoqIEluamVjdCBhIHNwZWNpZmljIHBhdGggcGFyYW1ldGVyIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0UGF0aFBhcmFtID0gPFQgPSBzdHJpbmcgfCBudWxsPihcbiAga2V5OiBzdHJpbmcsXG4gIGNvbmZpZz86IEluamVjdFV0aWxDb25maWcgJiBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPHN0cmluZyB8IG51bGwsIFQ+LFxuKSA9PiB7XG4gIGNvbnN0IHBhdGhQYXJhbXMgPSBpbmplY3RQYXRoUGFyYW1zKGNvbmZpZyk7XG4gIGNvbnN0IHNyYyA9IGNvbXB1dGVkKCgpID0+IHBhdGhQYXJhbXMoKVtrZXldID8/IG51bGwpIGFzIFNpZ25hbDxzdHJpbmcgfCBudWxsPjtcblxuICByZXR1cm4gdHJhbnNmb3JtT3JSZXR1cm4oc3JjLCBjb25maWcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlzUmVuZGVyZWRTaWduYWwgPSAoKSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gc2lnbmFsKGZhbHNlKTtcblxuICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgIGlmICghdmFsdWUoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ1JlbmRlciBzaWduYWwgd2FzIG5vdCBzZXQgdG8gdHJ1ZS4gVGhpcyBjYW4gY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvci4gTWFrZSBzdXJlIHRvIC5iaW5kKCkgdGhlIHJlbmRlciBzaWduYWwgYXQgdGhlIGVuZCBvZiB0aGUgY29uc3RydWN0b3IuJyxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXRlOiB2YWx1ZSxcbiAgICBiaW5kOiAoKSA9PiBlZmZlY3QoKCkgPT4gdmFsdWUuc2V0KHRydWUpLCB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0pLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNhbkFuaW1hdGVTaWduYWwgPSAoKSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gc2lnbmFsKGZhbHNlKTtcblxuICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgIHZhbHVlLnNldCh0cnVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGF0ZTogdmFsdWUsXG4gIH07XG59O1xuIl19
|