UNPKG

70 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var lodash_1 = require("lodash");
5var persist_1 = require("./persist");
6var actions_1 = require("./actions");
7function orderedPages(instances) {
8 return instances.pageOrder.map(function (path) { return instances.pages[path]; });
9}
10function cloneInstances(oldInstances) {
11 return {
12 pageOrder: oldInstances.pageOrder.slice(),
13 pages: tslib_1.__assign({}, oldInstances.pages),
14 };
15}
16function openPage(instances, options, pages) {
17 var newInstances = cloneInstances(instances);
18 var insertAfterMutex = options.insertAfterMutex, occurrence = tslib_1.__rest(options, ["insertAfterMutex"]);
19 var insertAfterIndex = insertAfterMutex ? newInstances.pageOrder.indexOf(insertAfterMutex) : -1;
20 if (occurrence.parent) {
21 if (occurrence.parent === occurrence.mutex) {
22 throw new Error(occurrence.mutex + " cannot be child of itself.");
23 }
24 if (!instances.pages[occurrence.parent]) {
25 throw new Error("Parent of " + occurrence.mutex + " is invalid.");
26 }
27 if (insertAfterIndex !== -1 &&
28 insertAfterIndex < instances.pageOrder.indexOf(occurrence.parent)) {
29 throw new Error("Cannot open " + occurrence.mutex + ". Cannot be inserted before the parent.");
30 }
31 if (instances.pages[occurrence.parent].parent) {
32 throw new Error("Cannot open " + occurrence.mutex + ". Nesting more than one level is forbidden.");
33 }
34 }
35 var newPage = pages.buildInstance(occurrence);
36 if (insertAfterIndex !== -1) {
37 newInstances.pageOrder.splice(insertAfterIndex + 1, 0, occurrence.mutex);
38 }
39 else {
40 newInstances.pageOrder.push(occurrence.mutex);
41 }
42 newInstances.pages[occurrence.mutex] = newPage;
43 return newInstances;
44}
45function closePage(instances, toRemoveMutex) {
46 var newPages = orderedPages(instances).filter(function (page) {
47 if (page.mutex === toRemoveMutex) {
48 return false;
49 }
50 return page.parent !== toRemoveMutex;
51 });
52 return {
53 pageOrder: newPages.map(function (page) { return page.mutex; }),
54 pages: lodash_1.keyBy(newPages, function (page) { return page.mutex; }),
55 };
56}
57function findClosePageTarget(instances, toRemoveMutex, override) {
58 if (instances.pageOrder.length < 2) {
59 return;
60 }
61 if (override && override !== toRemoveMutex && instances.pages[override]) {
62 return override;
63 }
64 var toRemove = instances.pages[toRemoveMutex];
65 if (!toRemove.parent) {
66 var roots = orderedPages(instances).filter(function (page) { return !page.parent; }).map(function (page) { return page.mutex; });
67 var toRemoveRootIndex = roots.indexOf(toRemoveMutex);
68 return toRemoveRootIndex === 0 ? roots[1] : roots[toRemoveRootIndex - 1];
69 }
70 var parentChildren = orderedPages(instances)
71 .filter(function (page) { return page.parent === toRemove.parent; })
72 .map(function (page) { return page.mutex; });
73 if (parentChildren.length === 1) {
74 return toRemove.parent;
75 }
76 var toRemoveIndex = parentChildren.indexOf(toRemoveMutex);
77 return toRemoveIndex === 0 ? parentChildren[1] : parentChildren[toRemoveIndex - 1];
78}
79function replacePage(instances, options, pages) {
80 var toRemoveMutex = options.toRemoveMutex, occurrence = tslib_1.__rest(options, ["toRemoveMutex"]);
81 var toInsertIndex = instances.pageOrder.indexOf(toRemoveMutex);
82 if (toInsertIndex === -1) {
83 return openPage(instances, occurrence, pages);
84 }
85 if (occurrence.parent !== instances.pages[toRemoveMutex].parent) {
86 throw new Error("Cannot open " + occurrence.mutex + ". " +
87 'The new page and the page to be removed must have the same parent.');
88 }
89 var newPage = pages.buildInstance(occurrence);
90 var newInstances = closePage(instances, toRemoveMutex);
91 newInstances.pageOrder.splice(toInsertIndex, 0, occurrence.mutex);
92 newInstances.pages[occurrence.mutex] = newPage;
93 return newInstances;
94}
95function cloneActiveChildren(instances, currentActives) {
96 var newActives = {};
97 var roots = orderedPages(instances).filter(function (page) { return !page.parent; }).map(function (page) { return page.mutex; });
98 for (var _i = 0, roots_1 = roots; _i < roots_1.length; _i++) {
99 var root = roots_1[_i];
100 if (currentActives[root] && instances.pages[currentActives[root]]) {
101 newActives[root] = currentActives[root];
102 }
103 }
104 return newActives;
105}
106function updateActiveChildren(instances, actives, target) {
107 var newActives = cloneActiveChildren(instances, actives);
108 if (!target) {
109 return newActives;
110 }
111 var targetPage = instances.pages[target];
112 // target is root
113 if (targetPage && !targetPage.parent) {
114 if (!newActives[target]) {
115 return newActives;
116 }
117 delete newActives[target];
118 return newActives;
119 }
120 var root = targetPage && targetPage.parent;
121 if (!root) {
122 return newActives;
123 }
124 return tslib_1.__assign({}, newActives, (_a = {}, _a[root] = target, _a));
125 var _a;
126}
127function getTransitionTarget(instances, actives, currentActive, desiredTarget) {
128 var desiredTargetPage = instances.pages[desiredTarget];
129 var currentPage = currentActive && instances.pages[currentActive];
130 // non-root
131 if (desiredTargetPage && desiredTargetPage.parent) {
132 return desiredTarget;
133 }
134 // transiting to own root
135 if (currentPage && desiredTarget === currentPage.parent) {
136 return desiredTarget;
137 }
138 if (actives[desiredTarget] && instances.pages[actives[desiredTarget]]) {
139 return actives[desiredTarget];
140 }
141 return desiredTarget;
142}
143var Navigator = /** @class */ (function () {
144 function Navigator(pages) {
145 this.instances = { pageOrder: [], pages: {} };
146 this.activeChildren = {};
147 this.pages = pages;
148 }
149 Object.defineProperty(Navigator.prototype, "all", {
150 get: function () {
151 return orderedPages(this.instances);
152 },
153 enumerable: true,
154 configurable: true
155 });
156 Object.defineProperty(Navigator.prototype, "roots", {
157 get: function () {
158 return this.all.filter(function (page) { return !page.parent; });
159 },
160 enumerable: true,
161 configurable: true
162 });
163 Object.defineProperty(Navigator.prototype, "active", {
164 get: function () {
165 if (!this.activePageMutex) {
166 return;
167 }
168 return this.instances.pages[this.activePageMutex];
169 },
170 enumerable: true,
171 configurable: true
172 });
173 Object.defineProperty(Navigator.prototype, "activeMutex", {
174 get: function () {
175 return this.activePageMutex;
176 },
177 enumerable: true,
178 configurable: true
179 });
180 Object.defineProperty(Navigator.prototype, "activeRootMutex", {
181 get: function () {
182 if (!this.activePageMutex || !this.instances.pages[this.activePageMutex]) {
183 return;
184 }
185 if (this.instances.pages[this.activePageMutex].parent) {
186 return this.instances.pages[this.activePageMutex].parent;
187 }
188 return this.activePageMutex;
189 },
190 enumerable: true,
191 configurable: true
192 });
193 Object.defineProperty(Navigator.prototype, "activeRoot", {
194 get: function () {
195 var mutex = this.activeRootMutex;
196 if (!mutex) {
197 return;
198 }
199 return this.instances.pages[mutex];
200 },
201 enumerable: true,
202 configurable: true
203 });
204 Object.defineProperty(Navigator.prototype, "activeRootIndex", {
205 get: function () {
206 if (!this.activePageMutex || !this.instances.pages[this.activePageMutex]) {
207 return -1;
208 }
209 var parentMutex = this.instances.pages[this.activePageMutex].parent;
210 if (!parentMutex) {
211 return this.roots.map(function (page) { return page.mutex; }).indexOf(this.activePageMutex);
212 }
213 return this.roots.map(function (page) { return page.mutex; }).indexOf(parentMutex);
214 },
215 enumerable: true,
216 configurable: true
217 });
218 Object.defineProperty(Navigator.prototype, "indexAsChildOfActiveRoot", {
219 get: function () {
220 if (!this.activePageMutex || !this.instances.pages[this.activePageMutex]) {
221 return -1;
222 }
223 var parentMutex = this.instances.pages[this.activePageMutex].parent;
224 if (!parentMutex) {
225 return -1;
226 }
227 return this.childrenOf(parentMutex).map(function (page) { return page.mutex; }).indexOf(this.activePageMutex);
228 },
229 enumerable: true,
230 configurable: true
231 });
232 Navigator.prototype.hasChildren = function (mutex) {
233 return this.all.some(function (page) { return page.parent === mutex; });
234 };
235 Navigator.prototype.childrenOf = function (mutex) {
236 return this.all.filter(function (page) { return page.parent === mutex; });
237 };
238 Navigator.prototype.pageFromMutex = function (mutex) {
239 return typeof mutex === 'string' ? this.instances.pages[mutex] : undefined;
240 };
241 Navigator.prototype.getActiveChild = function (mutex) {
242 return mutex ? this.activeChildren[mutex] : undefined;
243 };
244 Navigator.prototype.persistInstances = function (instances) {
245 var toSave = [];
246 for (var _i = 0, _a = orderedPages(instances); _i < _a.length; _i++) {
247 var instance = _a[_i];
248 if (instance.page.persistent !== false) {
249 if (instance.parent) {
250 if (instances.pages[instance.parent].page.persistent !== false) {
251 toSave.push(instance.occurrence);
252 }
253 }
254 else {
255 toSave.push(instance.occurrence);
256 }
257 }
258 }
259 persist_1.save(toSave);
260 };
261 Navigator.prototype.persistActivePage = function (instances, mutex) {
262 if (!mutex) {
263 persist_1.saveActivePage(undefined);
264 return;
265 }
266 if (instances.pages[mutex].page.persistent !== false) {
267 var parentMutex = instances.pages[mutex].parent;
268 if (parentMutex) {
269 var parent_1 = instances.pages[parentMutex];
270 if (parent_1.page.persistent !== false) {
271 persist_1.saveActivePage(mutex);
272 }
273 }
274 else {
275 persist_1.saveActivePage(mutex);
276 }
277 }
278 };
279 Navigator.prototype.reduce = function (action) {
280 if (actions_1.NAVIGATION_TRANSIT_TO_PAGE.is(actions_1.__NAVIGATION_IDENTIFIER__, action)) {
281 if (action.payload === this.activePageMutex) {
282 return this;
283 }
284 if (!action.payload) {
285 this.persistActivePage(this.instances, undefined);
286 var newNavWithoutActive = new Navigator(this.pages);
287 newNavWithoutActive.instances = this.instances;
288 newNavWithoutActive.activeChildren = this.activeChildren;
289 return newNavWithoutActive;
290 }
291 if (!this.instances.pages[action.payload]) {
292 return this;
293 }
294 var transitionTarget = getTransitionTarget(this.instances, this.activeChildren, this.activePageMutex, action.payload);
295 this.persistActivePage(this.instances, transitionTarget);
296 var newNav = new Navigator(this.pages);
297 newNav.instances = this.instances;
298 newNav.activePageMutex = transitionTarget;
299 newNav.activeChildren
300 = updateActiveChildren(this.instances, this.activeChildren, transitionTarget);
301 return newNav;
302 }
303 if (actions_1.NAVIGATION_OPEN_PAGE.is(actions_1.__NAVIGATION_IDENTIFIER__, action)) {
304 if (!action.payload || action.payload.mutex === this.activePageMutex) {
305 return this;
306 }
307 var _a = action.payload, mutex = _a.mutex, path = _a.path;
308 if (this.instances.pages[mutex]) {
309 this.persistActivePage(this.instances, mutex);
310 var newNav = new Navigator(this.pages);
311 newNav.instances = this.instances;
312 newNav.activePageMutex = mutex;
313 newNav.activeChildren = updateActiveChildren(this.instances, this.activeChildren, mutex);
314 return newNav;
315 }
316 if (this.pages.hasPage(path)) {
317 var newInstances = openPage(this.instances, action.payload, this.pages);
318 this.persistInstances(newInstances);
319 this.persistActivePage(newInstances, mutex);
320 var newNav = new Navigator(this.pages);
321 newNav.instances = newInstances;
322 newNav.activePageMutex = mutex;
323 newNav.activeChildren = updateActiveChildren(newInstances, this.activeChildren, mutex);
324 return newNav;
325 }
326 return this;
327 }
328 if (actions_1.NAVIGATION_REPLACE_PAGE.is(actions_1.__NAVIGATION_IDENTIFIER__, action)) {
329 if (!action.payload) {
330 return this;
331 }
332 var _b = action.payload, mutex = _b.mutex, path = _b.path;
333 if (this.instances.pages[mutex]) {
334 this.persistActivePage(this.instances, mutex);
335 var newNav = new Navigator(this.pages);
336 newNav.instances = this.instances;
337 newNav.activePageMutex = mutex;
338 newNav.activeChildren = updateActiveChildren(this.instances, this.activeChildren, mutex);
339 return newNav;
340 }
341 if (this.pages.hasPage(path)) {
342 var newInstances = replacePage(this.instances, action.payload, this.pages);
343 this.persistInstances(newInstances);
344 this.persistActivePage(newInstances, mutex);
345 var newNav = new Navigator(this.pages);
346 newNav.instances = newInstances;
347 newNav.activePageMutex = mutex;
348 newNav.activeChildren = updateActiveChildren(newInstances, this.activeChildren, mutex);
349 return newNav;
350 }
351 return this;
352 }
353 if (actions_1.NAVIGATION_CLOSE_PAGE.is(actions_1.__NAVIGATION_IDENTIFIER__, action)) {
354 if (!action.payload) {
355 return this;
356 }
357 var _c = action.payload, mutex = _c.mutex, goto = _c.goto;
358 if (!this.instances.pages[mutex]) {
359 return this;
360 }
361 var newNav = new Navigator(this.pages);
362 newNav.activePageMutex = this.activePageMutex;
363 var newInstances = closePage(this.instances, mutex);
364 var isParentOfActive = this.activePageMutex &&
365 this.instances.pages[this.activePageMutex].parent === mutex;
366 if (this.activePageMutex === mutex || isParentOfActive) {
367 var targetMutex = findClosePageTarget(this.instances, isParentOfActive ? this.instances.pages[this.activePageMutex].parent : mutex, goto);
368 var transitionTarget = targetMutex && getTransitionTarget(newInstances, this.activeChildren, this.activePageMutex, targetMutex);
369 this.persistActivePage(this.instances, undefined);
370 this.persistActivePage(this.instances, transitionTarget);
371 newNav.activePageMutex = transitionTarget;
372 }
373 this.persistInstances(newInstances);
374 newNav.instances = newInstances;
375 newNav.activeChildren
376 = updateActiveChildren(newInstances, this.activeChildren, newNav.activePageMutex);
377 return newNav;
378 }
379 if (actions_1.NAVIGATION_LOAD_PAGES.is(actions_1.__NAVIGATION_IDENTIFIER__, action)) {
380 var occurrence = persist_1.load();
381 var loadedActivePageMutex = persist_1.loadActivePage();
382 var instances = undefined;
383 var activePageMutex = undefined;
384 if (occurrence && occurrence.length > 0) {
385 instances = { pageOrder: [], pages: {} };
386 for (var _i = 0, occurrence_1 = occurrence; _i < occurrence_1.length; _i++) {
387 var instanceData = occurrence_1[_i];
388 if (this.pages.hasPage(instanceData.path)) {
389 var pageInstance = this.pages.buildInstance(instanceData);
390 if (pageInstance.mutex === loadedActivePageMutex) {
391 activePageMutex = loadedActivePageMutex;
392 }
393 instances.pageOrder.push(pageInstance.mutex);
394 instances.pages[pageInstance.mutex] = pageInstance;
395 }
396 }
397 }
398 if (instances && instances.pageOrder.length > 0) {
399 var newNav = new Navigator(this.pages);
400 newNav.instances = instances;
401 newNav.activePageMutex = activePageMutex;
402 newNav.activeChildren
403 = updateActiveChildren(instances, this.activeChildren, activePageMutex);
404 return newNav;
405 }
406 return this;
407 }
408 if (actions_1.NAVIGATION_CLEAR_PAGES.is(actions_1.__NAVIGATION_IDENTIFIER__, action)) {
409 persist_1.clear();
410 return new Navigator(this.pages);
411 }
412 var nextInstances = { pageOrder: this.instances.pageOrder, pages: {} };
413 var modified = false;
414 for (var _d = 0, _e = orderedPages(this.instances); _d < _e.length; _d++) {
415 var instance = _e[_d];
416 var newInstance = instance.reduce(action);
417 if (newInstance !== instance) {
418 modified = true;
419 }
420 nextInstances.pages[instance.mutex] = newInstance;
421 }
422 if (modified) {
423 var newNav = new Navigator(this.pages);
424 newNav.activePageMutex = this.activePageMutex;
425 newNav.instances = nextInstances;
426 newNav.activeChildren = this.activeChildren;
427 return newNav;
428 }
429 return this;
430 };
431 Navigator.prototype.transit = function (dispatch, mutex) {
432 dispatch(actions_1.NAVIGATION_TRANSIT_TO_PAGE.create.unicast(actions_1.__NAVIGATION_IDENTIFIER__, mutex));
433 };
434 Navigator.prototype.open = function (dispatch, occurrence) {
435 dispatch(actions_1.NAVIGATION_OPEN_PAGE.create.unicast(actions_1.__NAVIGATION_IDENTIFIER__, occurrence));
436 };
437 Navigator.prototype.replace = function (dispatch, toRemoveMutex, occurrence) {
438 dispatch(actions_1.NAVIGATION_REPLACE_PAGE.create.unicast(actions_1.__NAVIGATION_IDENTIFIER__, tslib_1.__assign({ toRemoveMutex: toRemoveMutex }, occurrence)));
439 };
440 Navigator.prototype.close = function (dispatch, mutex, goto) {
441 dispatch(actions_1.NAVIGATION_CLOSE_PAGE.create.unicast(actions_1.__NAVIGATION_IDENTIFIER__, { mutex: mutex, goto: goto }));
442 };
443 Navigator.prototype.load = function (dispatch) {
444 dispatch(actions_1.NAVIGATION_LOAD_PAGES.create.unicast(actions_1.__NAVIGATION_IDENTIFIER__));
445 };
446 Navigator.prototype.clear = function (dispatch) {
447 dispatch(actions_1.NAVIGATION_CLEAR_PAGES.create.unicast(actions_1.__NAVIGATION_IDENTIFIER__));
448 };
449 return Navigator;
450}());
451exports.Navigator = Navigator;
452//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25hdmlnYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpQ0FBK0I7QUFHL0IscUNBQThFO0FBQzlFLHFDQVFtQjtBQTRCbkIsc0JBQXNCLFNBQW9CO0lBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQXJCLENBQXFCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsd0JBQXdCLFlBQXVCO0lBQzdDLE1BQU0sQ0FBQztRQUNMLFNBQVMsRUFBTSxZQUFZLENBQUMsU0FBUyxRQUFDO1FBQ3RDLEtBQUssdUJBQU8sWUFBWSxDQUFDLEtBQUssQ0FBRTtLQUNqQyxDQUFDO0FBQ0osQ0FBQztBQUVELGtCQUFrQixTQUFvQixFQUFFLE9BQXdCLEVBQUUsS0FBWTtJQUM1RSxJQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkMsSUFBQSwyQ0FBZ0IsRUFBRSwwREFBYSxDQUFhO0lBQ3BELElBQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWxHLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBSSxVQUFVLENBQUMsS0FBSyxnQ0FBNkIsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFB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LENBQUMsbUNBQXlCLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTSx5QkFBSyxHQUFaLFVBQWEsUUFBa0I7UUFDN0IsUUFBUSxDQUFDLGdDQUFzQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUNBQXlCLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDSCxnQkFBQztBQUFELENBQUMsQUFwWEQsSUFvWEM7QUFwWFksOEJBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWR1Y2libGUsIEFjdGlvbiwgRGlzcGF0Y2ggfSBmcm9tICdyZWR1Y2libGUtbm9kZSc7XHJcbmltcG9ydCB7IGtleUJ5IH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgUGFnZUluc3RhbmNlIH0gZnJvbSAnLi9wYWdlSW5zdGFuY2UnO1xyXG5pbXBvcnQgeyBQYWdlcywgUGFnZU9jY3VycmVuY2UgfSBmcm9tICcuL3BhZ2VzJztcclxuaW1wb3J0IHsgbG9hZCwgY2xlYXIsIGxvYWRBY3RpdmVQYWdlLCBzYXZlLCBzYXZlQWN0aXZlUGFnZSB9IGZyb20gJy4vcGVyc2lzdCc7XHJcbmltcG9ydCB7XHJcbiAgX19OQVZJR0FUSU9OX0lERU5USUZJRVJfXyxcclxuICBOQVZJR0FUSU9OX1RSQU5TSVRfVE9fUEFHRSxcclxuICBOQVZJR0FUSU9OX09QRU5fUEFHRSxcclxuICBOQVZJR0FUSU9OX1JFUExBQ0VfUEFHRSxcclxuICBOQVZJR0FUSU9OX0NMT1NFX1BBR0UsXHJcbiAgTkFWSUdBVElPTl9MT0FEX1BBR0VTLFxyXG4gIE5BVklHQVRJT05fQ0xFQVJfUEFHRVMsXHJcbn0gZnJvbSAnLi9hY3Rpb25zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVJlcGxhY2VPcHRpb25zIGV4dGVuZHMgUGFnZU9jY3VycmVuY2U8YW55PiB7XHJcbiAgdG9SZW1vdmVNdXRleDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VPcGVuT3B0aW9ucyBleHRlbmRzIFBhZ2VPY2N1cnJlbmNlPGFueT4ge1xyXG4gIGluc2VydEFmdGVyTXV0ZXg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUNsb3NlT3B0aW9ucyB7XHJcbiAgbXV0ZXg6IHN0cmluZztcclxuICBnb3RvPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSW5zdGFuY2VNYXAge1xyXG4gIFtwcm9wOiBzdHJpbmddOiBQYWdlSW5zdGFuY2U8YW55LCBhbnk+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSW5zdGFuY2VzIHtcclxuICBwYWdlT3JkZXI6IHN0cmluZ1tdO1xyXG4gIHBhZ2VzOiBJbnN0YW5jZU1hcDtcclxufVxyXG5cclxuaW50ZXJmYWNlIEFjdGl2ZUNoaWxkcmVuIHtcclxuICBbcm9vdDogc3RyaW5nXTogc3RyaW5nO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvcmRlcmVkUGFnZXMoaW5zdGFuY2VzOiBJbnN0YW5jZXMpOiBQYWdlSW5zdGFuY2U8YW55LCBhbnk+W10ge1xyXG4gIHJldHVybiBpbnN0YW5jZXMucGFnZU9yZGVyLm1hcChwYXRoID0+IGluc3RhbmNlcy5wYWdlc1twYXRoXSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb25lSW5zdGFuY2VzKG9sZEluc3RhbmNlczogSW5zdGFuY2VzKTogSW5zdGFuY2VzIHtcclxuICByZXR1cm4ge1xyXG4gICAgcGFnZU9yZGVyOiBbLi4ub2xkSW5zdGFuY2VzLnBhZ2VPcmRlcl0sXHJcbiAgICBwYWdlczogeyAuLi5vbGRJbnN0YW5jZXMucGFnZXMgfSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBvcGVuUGFnZShpbnN0YW5jZXM6IEluc3RhbmNlcywgb3B0aW9uczogUGFnZU9wZW5PcHRpb25zLCBwYWdlczogUGFnZXMpOiBJbnN0YW5jZXMge1xyXG4gIGNvbnN0IG5ld0luc3RhbmNlcyA9IGNsb25lSW5zdGFuY2VzKGluc3RhbmNlcyk7XHJcbiAgY29uc3QgeyBpbnNlcnRBZnRlck11dGV4LCAuLi5vY2N1cnJlbmNlIH0gPSBvcHRpb25zO1xyXG4gIGNvbnN0IGluc2VydEFmdGVySW5kZXggPSBpbnNlcnRBZnRlck11dGV4ID8gbmV3SW5zdGFuY2VzLnBhZ2VPcmRlci5pbmRleE9mKGluc2VydEFmdGVyTXV0ZXgpIDogLTE7XHJcblxyXG4gIGlmIChvY2N1cnJlbmNlLnBhcmVudCkge1xyXG4gICAgaWYgKG9jY3VycmVuY2UucGFyZW50ID09PSBvY2N1cnJlbmNlLm11dGV4KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvY2N1cnJlbmNlLm11dGV4fSBjYW5ub3QgYmUgY2hpbGQgb2YgaXRzZWxmLmApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghaW5zdGFuY2VzLnBhZ2VzW29jY3VycmVuY2UucGFyZW50XSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmVudCBvZiAke29jY3VycmVuY2UubXV0ZXh9IGlzIGludmFsaWQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBpbnNlcnRBZnRlckluZGV4ICE9PSAtMSAmJlxyXG4gICAgICBpbnNlcnRBZnRlckluZGV4IDwgaW5zdGFuY2VzLnBhZ2VPcmRlci5pbmRleE9mKG9jY3VycmVuY2UucGFyZW50KVxyXG4gICAgKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgQ2Fubm90IG9wZW4gJHtvY2N1cnJlbmNlLm11dGV4fS4gQ2Fubm90IGJlIGluc2VydGVkIGJlZm9yZSB0aGUgcGFyZW50LmAsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGluc3RhbmNlcy5wYWdlc1tvY2N1cnJlbmNlLnBhcmVudF0ucGFyZW50KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgQ2Fubm90IG9wZW4gJHtvY2N1cnJlbmNlLm11dGV4fS4gTmVzdGluZyBtb3JlIHRoYW4gb25lIGxldmVsIGlzIGZvcmJpZGRlbi5gLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbmV3UGFnZSA9IHBhZ2VzLmJ1aWxkSW5zdGFuY2Uob2NjdXJyZW5jZSk7XHJcblxyXG4gIGlmIChpbnNlcnRBZnRlckluZGV4ICE9PSAtMSkge1xyXG4gICAgbmV3SW5zdGFuY2VzLnBhZ2VPcmRlci5zcGxpY2UoaW5zZXJ0QWZ0ZXJJbmRleCArIDEsIDAsIG9jY3VycmVuY2UubXV0ZXgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBuZXdJbnN0YW5jZXMucGFnZU9yZGVyLnB1c2gob2NjdXJyZW5jZS5tdXRleCk7XHJcbiAgfVxyXG5cclxuICBuZXdJbnN0YW5jZXMucGFnZXNbb2NjdXJyZW5jZS5tdXRleF0gPSBuZXdQYWdlO1xyXG5cclxuICByZXR1cm4gbmV3SW5zdGFuY2VzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9zZVBhZ2UoaW5zdGFuY2VzOiBJbnN0YW5jZXMsIHRvUmVtb3ZlTXV0ZXg6IHN0cmluZyk6IEluc3RhbmNlcyB7XHJcbiAgY29uc3QgbmV3UGFnZXMgPSBvcmRlcmVkUGFnZXMoaW5zdGFuY2VzKS5maWx0ZXIocGFnZSA9PiB7XHJcbiAgICBpZiAocGFnZS5tdXRleCA9PT0gdG9SZW1vdmVNdXRleCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhZ2UucGFyZW50ICE9PSB0b1JlbW92ZU11dGV4O1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcGFnZU9yZGVyOiBuZXdQYWdlcy5tYXAocGFnZSA9PiBwYWdlLm11dGV4KSxcclxuICAgIHBhZ2VzOiBrZXlCeShuZXdQYWdlcywgcGFnZSA9PiBwYWdlLm11dGV4KSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kQ2xvc2VQYWdlVGFyZ2V0KFxyXG4gIGluc3RhbmNlczogSW5zdGFuY2VzLFxyXG4gIHRvUmVtb3ZlTXV0ZXg6IHN0cmluZyxcclxuICBvdmVycmlkZT86IHN0cmluZyxcclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoaW5zdGFuY2VzLnBhZ2VPcmRlci5sZW5ndGggPCAyKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBpZiAob3ZlcnJpZGUgJiYgb3ZlcnJpZGUgIT09IHRvUmVtb3ZlTXV0ZXggJiYgaW5zdGFuY2VzLnBhZ2VzW292ZXJyaWRlXSkge1xyXG4gICAgcmV0dXJuIG92ZXJyaWRlO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdG9SZW1vdmUgPSBpbnN0YW5jZXMucGFnZXNbdG9SZW1vdmVNdXRleF07XHJcblxyXG4gIGlmICghdG9SZW1vdmUucGFyZW50KSB7XHJcbiAgICBjb25zdCByb290cyA9IG9yZGVyZWRQYWdlcyhpbnN0YW5jZXMpLmZpbHRlcihwYWdlID0+ICFwYWdlLnBhcmVudCkubWFwKHBhZ2UgPT4gcGFnZS5tdXRleCk7XHJcbiAgICBjb25zdCB0b1JlbW92ZVJvb3RJbmRleCA9IHJvb3RzLmluZGV4T2YodG9SZW1vdmVNdXRleCk7XHJcbiAgICByZXR1cm4gdG9SZW1vdmVSb290SW5kZXggPT09IDAgPyByb290c1sxXSA6IHJvb3RzW3RvUmVtb3ZlUm9vdEluZGV4IC0gMV07XHJcbiAgfVxyXG5cclxuICBjb25zdCBwYXJlbnRDaGlsZHJlbiA9IG9yZGVyZWRQYWdlcyhpbnN0YW5jZXMpXHJcbiAgICAuZmlsdGVyKHBhZ2UgPT4gcGFnZS5wYXJlbnQgPT09IHRvUmVtb3ZlLnBhcmVudClcclxuICAgIC5tYXAocGFnZSA9PiBwYWdlLm11dGV4KTtcclxuXHJcbiAgaWYgKHBhcmVudENoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgcmV0dXJuIHRvUmVtb3ZlLnBhcmVudDtcclxuICB9XHJcblxyXG4gIGNvbnN0IHRvUmVtb3ZlSW5kZXggPSBwYXJlbnRDaGlsZHJlbi5pbmRleE9mKHRvUmVtb3ZlTXV0ZXgpO1xyXG4gIHJldHVybiB0b1JlbW92ZUluZGV4ID09PSAwID8gcGFyZW50Q2hpbGRyZW5bMV0gOiBwYXJlbnRDaGlsZHJlblt0b1JlbW92ZUluZGV4IC0gMV07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcGxhY2VQYWdlKGluc3RhbmNlczogSW5zdGFuY2VzLCBvcHRpb25zOiBQYWdlUmVwbGFjZU9wdGlvbnMsIHBhZ2VzOiBQYWdlcyk6IEluc3RhbmNlcyB7XHJcbiAgY29uc3QgeyB0b1JlbW92ZU11dGV4LCAuLi5vY2N1cnJlbmNlIH0gPSBvcHRpb25zO1xyXG4gIGNvbnN0IHRvSW5zZXJ0SW5kZXggPSBpbnN0YW5jZXMucGFnZU9yZGVyLmluZGV4T2YodG9SZW1vdmVNdXRleCk7XHJcblxyXG4gIGlmICh0b0luc2VydEluZGV4ID09PSAtMSkge1xyXG4gICAgcmV0dXJuIG9wZW5QYWdlKGluc3RhbmNlcywgb2NjdXJyZW5jZSwgcGFnZXMpO1xyXG4gIH1cclxuXHJcbiAgaWYgKG9jY3VycmVuY2UucGFyZW50ICE9PSBpbnN0YW5jZXMucGFnZXNbdG9SZW1vdmVNdXRleF0ucGFyZW50KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgIGBDYW5ub3Qgb3BlbiAke29jY3VycmVuY2UubXV0ZXh9LiBgICtcclxuICAgICAgJ1RoZSBuZXcgcGFnZSBhbmQgdGhlIHBhZ2UgdG8gYmUgcmVtb3ZlZCBtdXN0IGhhdmUgdGhlIHNhbWUgcGFyZW50LicsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgbmV3UGFnZSA9IHBhZ2VzLmJ1aWxkSW5zdGFuY2Uob2NjdXJyZW5jZSk7XHJcbiAgY29uc3QgbmV3SW5zdGFuY2VzID0gY2xvc2VQYWdlKGluc3RhbmNlcywgdG9SZW1vdmVNdXRleCk7XHJcblxyXG4gIG5ld0luc3RhbmNlcy5wYWdlT3JkZXIuc3BsaWNlKHRvSW5zZXJ0SW5kZXgsIDAsIG9jY3VycmVuY2UubXV0ZXgpO1xyXG4gIG5ld0luc3RhbmNlcy5wYWdlc1tvY2N1cnJlbmNlLm11dGV4XSA9IG5ld1BhZ2U7XHJcblxyXG4gIHJldHVybiBuZXdJbnN0YW5jZXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb25lQWN0aXZlQ2hpbGRyZW4oaW5zdGFuY2VzOiBJbnN0YW5jZXMsIGN1cnJlbnRBY3RpdmVzOiBBY3RpdmVDaGlsZHJlbik6IEFjdGl2ZUNoaWxkcmVuIHtcclxuICBjb25zdCBuZXdBY3RpdmVzOiBBY3RpdmVDaGlsZHJlbiA9IHt9O1xyXG4gIGNvbnN0IHJvb3RzID0gb3JkZXJlZFBhZ2VzKGluc3RhbmNlcykuZmlsdGVyKHBhZ2UgPT4gIXBhZ2UucGFyZW50KS5tYXAocGFnZSA9PiBwYWdlLm11dGV4KTtcclxuXHJcbiAgZm9yIChjb25zdCByb290IG9mIHJvb3RzKSB7XHJcbiAgICBpZiAoY3VycmVudEFjdGl2ZXNbcm9vdF0gJiYgaW5zdGFuY2VzLnBhZ2VzW2N1cnJlbnRBY3RpdmVzW3Jvb3RdXSkge1xyXG4gICAgICBuZXdBY3RpdmVzW3Jvb3RdID0gY3VycmVudEFjdGl2ZXNbcm9vdF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbmV3QWN0aXZlcztcclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlQWN0aXZlQ2hpbGRyZW4oXHJcbiAgaW5zdGFuY2VzOiBJbnN0YW5jZXMsXHJcbiAgYWN0aXZlczogQWN0aXZlQ2hpbGRyZW4sXHJcbiAgdGFyZ2V0Pzogc3RyaW5nLFxyXG4pOiBBY3RpdmVDaGlsZHJlbiB7XHJcbiAgY29uc3QgbmV3QWN0aXZlcyA9IGNsb25lQWN0aXZlQ2hpbGRyZW4oaW5zdGFuY2VzLCBhY3RpdmVzKTtcclxuXHJcbiAgaWYgKCF0YXJnZXQpIHtcclxuICAgIHJldHVybiBuZXdBY3RpdmVzO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdGFyZ2V0UGFnZSA9IGluc3RhbmNlcy5wYWdlc1t0YXJnZXRdO1xyXG5cclxuICAvLyB0YXJnZXQgaXMgcm9vdFxyXG4gIGlmICh0YXJnZXRQYWdlICYmICF0YXJnZXRQYWdlLnBhcmVudCkge1xyXG4gICAgaWYgKCFuZXdBY3RpdmVzW3RhcmdldF0pIHtcclxuICAgICAgcmV0dXJuIG5ld0FjdGl2ZXM7XHJcbiAgICB9XHJcbiAgICBkZWxldGUgbmV3QWN0aXZlc1t0YXJnZXRdO1xyXG4gICAgcmV0dXJuIG5ld0FjdGl2ZXM7XHJcbiAgfVxyXG5cclxuICBjb25zdCByb290ID0gdGFyZ2V0UGFnZSAmJiB0YXJnZXRQYWdlLnBhcmVudDtcclxuXHJcbiAgaWYgKCFyb290KSB7XHJcbiAgICByZXR1cm4gbmV3QWN0aXZlcztcclxuICB9XHJcblxyXG4gIHJldHVybiB7IC4uLm5ld0FjdGl2ZXMsIFtyb290XTogdGFyZ2V0IH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25UYXJnZXQoXHJcbiAgaW5zdGFuY2VzOiBJbnN0YW5jZXMsXHJcbiAgYWN0aXZlczogQWN0aXZlQ2hpbGRyZW4sXHJcbiAgY3VycmVudEFjdGl2ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gIGRlc2lyZWRUYXJnZXQ6IHN0cmluZyxcclxuKTogc3RyaW5nIHtcclxuICBjb25zdCBkZXNpcmVkVGFyZ2V0UGFnZSA9IGluc3RhbmNlcy5wYWdlc1tkZXNpcmVkVGFyZ2V0XTtcclxuICBjb25zdCBjdXJyZW50UGFnZSA9IGN1cnJlbnRBY3RpdmUgJiYgaW5zdGFuY2VzLnBhZ2VzW2N1cnJlbnRBY3RpdmVdO1xyXG5cclxuICAvLyBub24tcm9vdFxyXG4gIGlmIChkZXNpcmVkVGFyZ2V0UGFnZSAmJiBkZXNpcmVkVGFyZ2V0UGFnZS5wYXJlbnQpIHtcclxuICAgIHJldHVybiBkZXNpcmVkVGFyZ2V0O1xyXG4gIH1cclxuXHJcbiAgLy8gdHJhbnNpdGluZyB0byBvd24gcm9vdFxyXG4gIGlmIChjdXJyZW50UGFnZSAmJiBkZXNpcmVkVGFyZ2V0ID09PSBjdXJyZW50UGFnZS5wYXJlbnQpIHtcclxuICAgIHJldHVybiBkZXNpcmVkVGFyZ2V0O1xyXG4gIH1cclxuXHJcbiAgaWYgKGFjdGl2ZXNbZGVzaXJlZFRhcmdldF0gJiYgaW5zdGFuY2VzLnBhZ2VzW2FjdGl2ZXNbZGVzaXJlZFRhcmdldF1dKSB7XHJcbiAgICByZXR1cm4gYWN0aXZlc1tkZXNpcmVkVGFyZ2V0XTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkZXNpcmVkVGFyZ2V0O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmF2aWdhdG9yIGltcGxlbWVudHMgUmVkdWNpYmxlPE5hdmlnYXRvcj4ge1xyXG4gIHByaXZhdGUgcGFnZXM6IFBhZ2VzO1xyXG4gIHByaXZhdGUgaW5zdGFuY2VzOiBJbnN0YW5jZXMgPSB7IHBhZ2VPcmRlcjogW10sIHBhZ2VzOiB7fSB9O1xyXG4gIHByaXZhdGUgYWN0aXZlUGFnZU11dGV4OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBhY3RpdmVDaGlsZHJlbjogQWN0aXZlQ2hpbGRyZW4gPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocGFnZXM6IFBhZ2VzKSB7XHJcbiAgICB0aGlzLnBhZ2VzID0gcGFnZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFsbCgpOiBQYWdlSW5zdGFuY2U8YW55LCBhbnk+W10ge1xyXG4gICAgcmV0dXJuIG9yZGVyZWRQYWdlcyh0aGlzLmluc3RhbmNlcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHJvb3RzKCk6IFBhZ2VJbnN0YW5jZTxhbnksIGFueT5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGwuZmlsdGVyKHBhZ2UgPT4gIXBhZ2UucGFyZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IFBhZ2VJbnN0YW5jZTxhbnksIGFueT4gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCF0aGlzLmFjdGl2ZVBhZ2VNdXRleCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMucGFnZXNbdGhpcy5hY3RpdmVQYWdlTXV0ZXhdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhY3RpdmVNdXRleCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlUGFnZU11dGV4O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhY3RpdmVSb290TXV0ZXgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghdGhpcy5hY3RpdmVQYWdlTXV0ZXggfHwgIXRoaXMuaW5zdGFuY2VzLnBhZ2VzW3RoaXMuYWN0aXZlUGFnZU11dGV4XSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaW5zdGFuY2VzLnBhZ2VzW3RoaXMuYWN0aXZlUGFnZU11dGV4XS5wYXJlbnQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzLnBhZ2VzW3RoaXMuYWN0aXZlUGFnZU11dGV4XS5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlUGFnZU11dGV4O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhY3RpdmVSb290KCk6IFBhZ2VJbnN0YW5jZTxhbnksIGFueT4gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgbXV0ZXggPSB0aGlzLmFjdGl2ZVJvb3RNdXRleDtcclxuICAgIGlmICghbXV0ZXgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlcy5wYWdlc1ttdXRleF07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFjdGl2ZVJvb3RJbmRleCgpOiBudW1iZXIge1xyXG4gICAgaWYgKCF0aGlzLmFjdGl2ZVBhZ2VNdXRleCB8fCAhdGhpcy5pbnN0YW5jZXMucGFnZXNbdGhpcy5hY3RpdmVQYWdlTXV0ZXhdKSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXJlbnRNdXRleCA9IHRoaXMuaW5zdGFuY2VzLnBhZ2VzW3RoaXMuYWN0aXZlUGFnZU11dGV4XS5wYXJlbnQ7XHJcblxyXG4gICAgaWYgKCFwYXJlbnRNdXRleCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yb290cy5tYXAocGFnZSA9PiBwYWdlLm11dGV4KS5pbmRleE9mKHRoaXMuYWN0aXZlUGFnZU11dGV4KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5yb290cy5tYXAocGFnZSA9PiBwYWdlLm11dGV4KS5pbmRleE9mKHBhcmVudE11dGV4KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaW5kZXhBc0NoaWxkT2ZBY3RpdmVSb290KCk6IG51bWJlciB7XHJcbiAgICBpZiAoIXRoaXMuYWN0aXZlUGFnZU11dGV4IHx8ICF0aGlzLmluc3RhbmNlcy5wYWdlc1t0aGlzLmFjdGl2ZVBhZ2VNdXRleF0pIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcmVudE11dGV4ID0gdGhpcy5pbnN0YW5jZXMucGFnZXNbdGhpcy5hY3RpdmVQYWdlTXV0ZXhdLnBhcmVudDtcclxuXHJcbiAgICBpZiAoIXBhcmVudE11dGV4KSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbk9mKHBhcmVudE11dGV4KS5tYXAocGFnZSA9PiBwYWdlLm11dGV4KS5pbmRleE9mKHRoaXMuYWN0aXZlUGFnZU11dGV4KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYXNDaGlsZHJlbihtdXRleDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGwuc29tZShwYWdlID0+IHBhZ2UucGFyZW50ID09PSBtdXRleCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hpbGRyZW5PZihtdXRleDogc3RyaW5nKTogUGFnZUluc3RhbmNlPGFueSwgYW55PltdIHtcclxuICAgIHJldHVybiB0aGlzLmFsbC5maWx0ZXIocGFnZSA9PiBwYWdlLnBhcmVudCA9PT0gbXV0ZXgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHBhZ2VGcm9tTXV0ZXgobXV0ZXg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFBhZ2VJbnN0YW5jZTxhbnksIGFueT4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBtdXRleCA9PT0gJ3N0cmluZycgPyB0aGlzLmluc3RhbmNlcy5wYWdlc1ttdXRleF0gOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QWN0aXZlQ2hpbGQobXV0ZXg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gbXV0ZXggPyB0aGlzLmFjdGl2ZUNoaWxkcmVuW211dGV4XSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGVyc2lzdEluc3RhbmNlcyhpbnN0YW5jZXM6IEluc3RhbmNlcyk6IHZvaWQge1xyXG4gICAgY29uc3QgdG9TYXZlOiBQYWdlT2NjdXJyZW5jZTxhbnk+W10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIG9yZGVyZWRQYWdlcyhpbnN0YW5jZXMpKSB7XHJcbiAgICAgIGlmIChpbnN0YW5jZS5wYWdlLnBlcnNpc3RlbnQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKGluc3RhbmNlLnBhcmVudCkge1xyXG4gICAgICAgICAgaWYgKGluc3RhbmNlcy5wYWdlc1tpbnN0YW5jZS5wYXJlbnRdLnBhZ2UucGVyc2lzdGVudCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdG9TYXZlLnB1c2goaW5zdGFuY2Uub2NjdXJyZW5jZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRvU2F2ZS5wdXNoKGluc3RhbmNlLm9jY3VycmVuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNhdmUodG9TYXZlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGVyc2lzdEFjdGl2ZVBhZ2UoaW5zdGFuY2VzOiBJbnN0YW5jZXMsIG11dGV4OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIGlmICghbXV0ZXgpIHtcclxuICAgICAgc2F2ZUFjdGl2ZVBhZ2UodW5kZWZpbmVkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbnN0YW5jZXMucGFnZXNbbXV0ZXhdLnBhZ2UucGVyc2lzdGVudCAhPT0gZmFsc2UpIHtcclxuICAgICAgY29uc3QgcGFyZW50TXV0ZXggPSBpbnN0YW5jZXMucGFnZXNbbXV0ZXhdLnBhcmVudDtcclxuXHJcbiAgICAgIGlmIChwYXJlbnRNdXRleCkge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGluc3RhbmNlcy5wYWdlc1twYXJlbnRNdXRleF07XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnQucGFnZS5wZXJzaXN0ZW50ICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgc2F2ZUFjdGl2ZVBhZ2UobXV0ZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzYXZlQWN0aXZlUGFnZShtdXRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWR1Y2UoYWN0aW9uOiBBY3Rpb248YW55Pik6IHRoaXMge1xyXG4gICAgaWYgKE5BVklHQVRJT05fVFJBTlNJVF9UT19QQUdFLmlzKF9fTkFWSUdBVElPTl9JREVOVElGSUVSX18sIGFjdGlvbikpIHtcclxuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkID09PSB0aGlzLmFjdGl2ZVBhZ2VNdXRleCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWFjdGlvbi5wYXlsb2FkKSB7XHJcbiAgICAgICAgdGhpcy5wZXJzaXN0QWN0aXZlUGFnZSh0aGlzLmluc3RhbmNlcywgdW5kZWZpbmVkKTtcclxuICAgICAgICBjb25zdCBuZXdOYXZXaXRob3V0QWN0aXZlID0gPHRoaXM+bmV3IE5hdmlnYXRvcih0aGlzLnBhZ2VzKTtcclxuICAgICAgICBuZXdOYXZXaXRob3V0QWN0aXZlLmluc3RhbmNlcyA9IHRoaXMuaW5zdGFuY2VzO1xyXG4gICAgICAgIG5ld05hdldpdGhvdXRBY3RpdmUuYWN0aXZlQ2hpbGRyZW4gPSB0aGlzLmFjdGl2ZUNoaWxkcmVuO1xyXG4gICAgICAgIHJldHVybiBuZXdOYXZXaXRob3V0QWN0aXZlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaW5zdGFuY2VzLnBhZ2VzW2FjdGlvbi5wYXlsb2FkXSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0cmFuc2l0aW9uVGFyZ2V0ID0gZ2V0VHJhbnNpdGlvblRhcmdldChcclxuICAgICAgICB0aGlzLmluc3RhbmNlcyxcclxuICAgICAgICB0aGlzLmFjdGl2ZUNoaWxkcmVuLFxyXG4gICAgICAgIHRoaXMuYWN0aXZlUGFnZU11dGV4LFxyXG4gICAgICAgIGFjdGlvbi5wYXlsb2FkLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5wZXJzaXN0QWN0aXZlUGFnZSh0aGlzLmluc3RhbmNlcywgdHJhbnNpdGlvblRhcmdldCk7XHJcblxyXG4gICAgICBjb25zdCBuZXdOYXYgPSA8dGhpcz5uZXcgTmF2aWdhdG9yKHRoaXMucGFnZXMpO1xyXG4gICAgICBuZXdOYXYuaW5zdGFuY2VzID0gdGhpcy5pbnN0YW5jZXM7XHJcbiAgICAgIG5ld05hdi5hY3RpdmVQYWdlTXV0ZXggPSB0cmFuc2l0aW9uVGFyZ2V0O1xyXG4gICAgICBuZXdOYXYuYWN0aXZlQ2hpbGRyZW5cclxuICAgICAgICA9IHVwZGF0ZUFjdGl2ZUNoaWxkcmVuKHRoaXMuaW5zdGFuY2VzLCB0aGlzLmFjdGl2ZUNoaWxkcmVuLCB0cmFuc2l0aW9uVGFyZ2V0KTtcclxuICAgICAgcmV0dXJuIG5ld05hdjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoTkFWSUdBVElPTl9PUEVOX1BBR0UuaXMoX19OQVZJR0FUSU9OX0lERU5USUZJRVJfXywgYWN0aW9uKSkge1xyXG4gICAgICBpZiAoIWFjdGlvbi5wYXlsb2FkIHx8IGFjdGlvbi5wYXlsb2FkLm11dGV4ID09PSB0aGlzLmFjdGl2ZVBhZ2VNdXRleCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB7IG11dGV4LCBwYXRoIH0gPSBhY3Rpb24ucGF5bG9hZDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmluc3RhbmNlcy5wYWdlc1ttdXRleF0pIHtcclxuXHJcbiAgICAgICAgdGhpcy5wZXJzaXN0QWN0aXZlUGFnZSh0aGlzLmluc3RhbmNlcywgbXV0ZXgpO1xyXG5cclxuICAgICAgICBjb25zdCBuZXdOYXYgPSA8dGhpcz5uZXcgTmF2aWdhdG9yKHRoaXMucGFnZXMpO1xyXG4gICAgICAgIG5ld05hdi5pbnN0YW5jZXMgPSB0aGlzLmluc3RhbmNlcztcclxuICAgICAgICBuZXdOYXYuYWN0aXZlUGFnZU11dGV4ID0gbXV0ZXg7XHJcbiAgICAgICAgbmV3TmF2LmFjdGl2ZUNoaWxkcmVuID0gdXBkYXRlQWN0aXZlQ2hpbGRyZW4odGhpcy5pbnN0YW5jZXMsIHRoaXMuYWN0aXZlQ2hpbGRyZW4sIG11dGV4KTtcclxuICAgICAgICByZXR1cm4gbmV3TmF2O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5wYWdlcy5oYXNQYWdlKHBhdGgpKSB7XHJcbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2VzID0gb3BlblBhZ2UodGhpcy5pbnN0YW5jZXMsIGFjdGlvbi5wYXlsb2FkLCB0aGlzLnBhZ2VzKTtcclxuXHJcbiAgICAgICAgdGhpcy5wZXJzaXN0SW5zdGFuY2VzKG5ld0luc3RhbmNlcyk7XHJcbiAgICAgICAgdGhpcy5wZXJzaXN0QWN0aXZlUGFnZShuZXdJbnN0YW5jZXMsIG11dGV4KTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV3TmF2ID0gPHRoaXM+bmV3IE5hdmlnYXRvcih0aGlzLnBhZ2VzKTtcclxuICAgICAgICBuZXdOYXYuaW5zdGFuY2VzID0gbmV3SW5zdGFuY2VzO1xyXG4gICAgICAgIG5ld05hdi5hY3RpdmVQYWdlTXV0ZXggPSBtdXRleDtcclxuICAgICAgICBuZXdOYXYuYWN0aXZlQ2hpbGRyZW4gPSB1cGRhdGVBY3RpdmVDaGlsZHJlbihuZXdJbnN0YW5jZXMsIHRoaXMuYWN0aXZlQ2hpbGRyZW4sIG11dGV4KTtcclxuICAgICAgICByZXR1cm4gbmV3TmF2O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChOQVZJR0FUSU9OX1JFUExBQ0VfUEFHRS5pcyhfX05BVklHQVRJT05fSURFTlRJRklFUl9fLCBhY3Rpb24pKSB7XHJcbiAgICAgIGlmICghYWN0aW9uLnBheWxvYWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgeyBtdXRleCwgcGF0aCB9ID0gYWN0aW9uLnBheWxvYWQ7XHJcblxyXG4gICAgICBpZiAodGhpcy5pbnN0YW5jZXMucGFnZXNbbXV0ZXhdKSB7XHJcblxyXG4gICAgICAgIHRoaXMucGVyc2lzdEFjdGl2ZVBhZ2UodGhpcy5pbnN0YW5jZXMsIG11dGV4KTtcclxuXHJcbiAgICAgICAgY29uc3QgbmV3TmF2ID0gPHRoaXM+bmV3IE5hdmlnYXRvcih0aGlzLnBhZ2VzKTtcclxuICAgICAgICBuZXdOYXYuaW5zdGFuY2VzID0gdGhpcy5pbnN0YW5jZXM7XHJcbiAgICAgICAgbmV3TmF2LmFjdGl2ZVBhZ2VNdXRleCA9IG11dGV4O1xyXG4gICAgICAgIG5ld05hdi5hY3RpdmVDaGlsZHJlbiA9IHVwZGF0ZUFjdGl2ZUNoaWxkcmVuKHRoaXMuaW5zdGFuY2VzLCB0aGlzLmFjdGl2ZUNoaWxkcmVuLCBtdXRleCk7XHJcbiAgICAgICAgcmV0dXJuIG5ld05hdjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMucGFnZXMuaGFzUGFnZShwYXRoKSkge1xyXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlcyA9IHJlcGxhY2VQYWdlKHRoaXMuaW5zdGFuY2VzLCBhY3Rpb24ucGF5bG9hZCwgdGhpcy5wYWdlcyk7XHJcblxyXG4gICAgICAgIHRoaXMucGVyc2lzdEluc3RhbmNlcyhuZXdJbnN0YW5jZXMpO1xyXG4gICAgICAgIHRoaXMucGVyc2lzdEFjdGl2ZVBhZ2UobmV3SW5zdGFuY2VzLCBtdXRleCk7XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld05hdiA9IDx0aGlzPm5ldyBOYXZpZ2F0b3IodGhpcy5wYWdlcyk7XHJcbiAgICAgICAgbmV3TmF2Lmluc3RhbmNlcyA9IG5ld0luc3RhbmNlcztcclxuICAgICAgICBuZXdOYXYuYWN0aXZlUGFnZU11dGV4ID0gbXV0ZXg7XHJcbiAgICAgICAgbmV3TmF2LmFjdGl2ZUNoaWxkcmVuID0gdXBkYXRlQWN0aXZlQ2hpbGRyZW4obmV3SW5zdGFuY2VzLCB0aGlzLmFjdGl2ZUNoaWxkcmVuLCBtdXRleCk7XHJcbiAgICAgICAgcmV0dXJuIG5ld05hdjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoTkFWSUdBVElPTl9DTE9TRV9QQUdFLmlzKF9fTkFWSUdBVElPTl9JREVOVElGSUVSX18sIGFjdGlvbikpIHtcclxuICAgICAgaWYgKCFhY3Rpb24ucGF5bG9hZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB7IG11dGV4LCBnb3RvIH0gPSBhY3Rpb24ucGF5bG9hZDtcclxuXHJcbiAgICAgIGlmICghdGhpcy5pbnN0YW5jZXMucGFnZXNbbXV0ZXhdKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5ld05hdiA9IDx0aGlzPm5ldyBOYXZpZ2F0b3IodGhpcy5wYWdlcyk7XHJcbiAgICAgIG5ld05hdi5hY3RpdmVQYWdlTXV0ZXggPSB0aGlzLmFjdGl2ZVBhZ2VNdXRleDtcclxuICAgICAgY29uc3QgbmV3SW5zdGFuY2VzID0gY2xvc2VQYWdlKHRoaXMuaW5zdGFuY2VzLCBtdXRleCk7XHJcblxyXG4gICAgICBjb25zdCBpc1BhcmVudE9mQWN0aXZlID0gdGhpcy5hY3RpdmVQYWdlTXV0ZXggJiZcclxuICAgICAgICB0aGlzLmluc3RhbmNlcy5wYWdlc1t0aGlzLmFjdGl2ZVBhZ2VNdXRleF0ucGFyZW50ID09PSBtdXRleDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVBhZ2VNdXRleCA9PT0gbXV0ZXggfHwgaXNQYXJlbnRPZkFjdGl2ZSkge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldE11dGV4ID0gZmluZENsb3NlUGFnZVRhcmdldChcclxuICAgICAgICAgIHRoaXMuaW5zdGFuY2VzLFxyXG4gICAgICAgICAgaXNQYXJlbnRPZkFjdGl2ZSA/IHRoaXMuaW5zdGFuY2VzLnBhZ2VzW3RoaXMuYWN0aXZlUGFnZU11dGV4IV0ucGFyZW50ISA6IG11dGV4LFxyXG4gICAgICAgICAgZ290byxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCB0cmFuc2l0aW9uVGFyZ2V0ID0gdGFyZ2V0TXV0ZXggJiYgZ2V0VHJhbnNpdGlvblRhcmdldChcclxuICAgICAgICAgIG5ld0luc3RhbmNlcyxcclxuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hpbGRyZW4sXHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZVBhZ2VNdXRleCxcclxuICAgICAgICAgIHRhcmdldE11dGV4LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMucGVyc2lzdEFjdGl2ZVBhZ2UodGhpcy5pbnN0YW5jZXMsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5wZXJzaXN0QWN0aXZlUGFnZSh0aGlzLmluc3RhbmNlcywgdHJhbnNpdGlvblRhcmdldCk7XHJcblxyXG4gICAgICAgIG5ld05hdi5hY3RpdmVQYWdlTXV0ZXggPSB0cmFuc2l0aW9uVGFyZ2V0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnBlcnNpc3RJbnN0YW5jZXMobmV3SW5zdGFuY2VzKTtcclxuXHJcbiAgICAgIG5ld05hdi5pbnN0YW5jZXMgPSBuZXdJbnN0YW5jZXM7XHJcbiAgICAgIG5ld05hdi5hY3RpdmVDaGlsZHJlblxyXG4gICAgICAgID0gdXBkYXRlQWN0aXZlQ2hpbGRyZW4obmV3SW5zdGFuY2VzLCB0aGlzLmFjdGl2ZUNoaWxkcmVuLCBuZXdOYXYuYWN0aXZlUGFnZU11dGV4KTtcclxuICAgICAgcmV0dXJuIG5ld05hdjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoTkFWSUdBVElPTl9MT0FEX1BBR0VTLmlzKF9fTkFWSUdBVElPTl9JREVOVElGSUVSX18sIGFjdGlvbikpIHtcclxuXHJcbiAgICAgIGNvbnN0IG9jY3VycmVuY2UgPSBsb2FkKCk7XHJcbiAgICAgIGNvbnN0IGxvYWRlZEFjdGl2ZVBhZ2VNdXRleCA9IGxvYWRBY3RpdmVQYWdlKCk7XHJcblxyXG4gICAgICBsZXQgaW5zdGFuY2VzOiBJbnN0YW5jZXMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgIGxldCBhY3RpdmVQYWdlTXV0ZXg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmIChvY2N1cnJlbmNlICYmIG9jY3VycmVuY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGluc3RhbmNlcyA9IHsgcGFnZU9yZGVyOiBbXSwgcGFnZXM6IHt9IH07XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgaW5zdGFuY2VEYXRhIG9mIG9jY3VycmVuY2UpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnBhZ2VzLmhhc1BhZ2UoaW5zdGFuY2VEYXRhLnBhdGgpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VJbnN0YW5jZSA9IHRoaXMucGFnZXMuYnVpbGRJbnN0YW5jZShpbnN0YW5jZURhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhZ2VJbnN0YW5jZS5tdXRleCA9PT0gbG9hZGVkQWN0aXZlUGFnZU11dGV4KSB7XHJcbiAgICAgICAgICAgICAgYWN0aXZlUGFnZU11dGV4ID0gbG9hZGVkQWN0aXZlUGFnZU11dGV4O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpbnN0YW5jZXMucGFnZU9yZGVyLnB1c2gocGFnZUluc3RhbmNlLm11dGV4KTtcclxuICAgICAgICAgICAgaW5zdGFuY2VzLnBhZ2VzW3BhZ2VJbnN0YW5jZS5tdXRleF0gPSBwYWdlSW5zdGFuY2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW5zdGFuY2VzICYmIGluc3RhbmNlcy5wYWdlT3JkZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IG5ld05hdiA9IDx0aGlzPm5ldyBOYXZpZ2F0b3IodGhpcy5wYWdlcyk7XHJcbiAgICAgICAgbmV3TmF2Lmluc3RhbmNlcyA9IGluc3RhbmNlcztcclxuICAgICAgICBuZXdOYXYuYWN0aXZlUGFnZU11dGV4ID0gYWN0aXZlUGFnZU11dGV4O1xyXG4gICAgICAgIG5ld05hdi5hY3RpdmVDaGlsZHJlblxyXG4gICAgICAgICAgPSB1cGRhdGVBY3RpdmVDaGlsZHJlbihpbnN0YW5jZXMsIHRoaXMuYWN0aXZlQ2hpbGRyZW4sIGFjdGl2ZVBhZ2VNdXRleCk7XHJcbiAgICAgICAgcmV0dXJuIG5ld05hdjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoTkFWSUdBVElPTl9DTEVBUl9QQUdFUy5pcyhfX05BVklHQVRJT05fSURFTlRJRklFUl9fLCBhY3Rpb24pKSB7XHJcbiAgICAgIGNsZWFyKCk7XHJcbiAgICAgIHJldHVybiA8dGhpcz5uZXcgTmF2aWdhdG9yKHRoaXMucGFnZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5leHRJbnN0YW5jZXM6IEluc3RhbmNlcyA9IHsgcGFnZU9yZGVyOiB0aGlzLmluc3RhbmNlcy5wYWdlT3JkZXIsIHBhZ2VzOiB7fSB9O1xyXG4gICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBvcmRlcmVkUGFnZXModGhpcy5pbnN0YW5jZXMpKSB7XHJcbiAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFuY2UucmVkdWNlKGFjdGlvbik7XHJcbiAgICAgIGlmIChuZXdJbnN0YW5jZSAhPT0gaW5zdGFuY2UpIHtcclxuICAgICAgICBtb2RpZmllZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgbmV4dEluc3RhbmNlcy5wYWdlc1tpbnN0YW5jZS5tdXRleF0gPSBuZXdJbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobW9kaWZpZWQpIHtcclxuICAgICAgY29uc3QgbmV3TmF2ID0gPHRoaXM+bmV3IE5hdmlnYXRvcih0aGlzLnBhZ2VzKTtcclxuICAgICAgbmV3TmF2LmFjdGl2ZVBhZ2VNdXRleCA9IHRoaXMuYWN0aXZlUGFnZU11dGV4O1xyXG4gICAgICBuZXdOYXYuaW5zdGFuY2VzID0gbmV4dEluc3RhbmNlcztcclxuICAgICAgbmV3TmF2LmFjdGl2ZUNoaWxkcmVuID0gdGhpcy5hY3RpdmVDaGlsZHJlbjtcclxuICAgICAgcmV0dXJuIG5ld05hdjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyYW5zaXQoZGlzcGF0Y2g6IERpc3BhdGNoLCBtdXRleDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBkaXNwYXRjaChOQVZJR0FUSU9OX1RSQU5TSVRfVE9fUEFHRS5jcmVhdGUudW5pY2FzdChfX05BVklHQVRJT05fSURFTlRJRklFUl9fLCBtdXRleCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW4oZGlzcGF0Y2g6IERpc3BhdGNoLCBvY2N1cnJlbmNlOiBQYWdlT3Blbk9wdGlvbnMpIHtcclxuICAgIGRpc3BhdGNoKE5BVklHQVRJT05fT1BFTl9QQUdFLmNyZWF0ZS51bmljYXN0KF9fTkFWSUdBVElPTl9JREVOVElGSUVSX18sIG9jY3VycmVuY2UpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXBsYWNlKFxyXG4gICAgZGlzcGF0Y2g6IERpc3BhdGNoLFxyXG4gICAgdG9SZW1vdmVNdXRleDogc3RyaW5nLFxyXG4gICAgb2NjdXJyZW5jZTogUGFnZU9jY3VycmVuY2U8YW55PixcclxuICApIHtcclxuICAgIGRpc3BhdGNoKE5BVklHQVRJT05fUkVQTEFDRV9QQUdFLmNyZWF0ZS51bmljYXN0KFxyXG4gICAgICBfX05BVklHQVRJT05fSURFTlRJRklFUl9fLFxyXG4gICAgICB7IHRvUmVtb3ZlTXV0ZXgsIC4uLm9jY3VycmVuY2UgfSxcclxuICAgICkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlKGRpc3BhdGNoOiBEaXNwYXRjaCwgbXV0ZXg6IHN0cmluZywgZ290bz86IHN0cmluZykge1xyXG4gICAgZGlzcGF0Y2goTkFWSUdBVElPTl9DTE9TRV9QQUdFLmNyZWF0ZS51bmljYXN0KF9fTkFWSUdBVElPTl9JREVOVElGSUVSX18sIHsgbXV0ZXgsIGdvdG8gfSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWQoZGlzcGF0Y2g6IERpc3BhdGNoKSB7XHJcbiAgICBkaXNwYXRjaChOQVZJR0FUSU9OX0xPQURfUEFHRVMuY3JlYXRlLnVuaWNhc3QoX19OQVZJR0FUSU9OX0lERU5USUZJRVJfXykpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyKGRpc3BhdGNoOiBEaXNwYXRjaCkge1xyXG4gICAgZGlzcGF0Y2goTkFWSUdBVElPTl9DTEVBUl9QQUdFUy5jcmVhdGUudW5pY2FzdChfX05BVklHQVRJT05fSURFTlRJRklFUl9fKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
\No newline at end of file