pretur.navigation
Version:
SPA navigation helper using react and redux
453 lines • 71.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var lodash_1 = require("lodash");
var persist_1 = require("./persist");
var actions_1 = require("./actions");
function orderedPages(instances) {
return instances.pageOrder.map(function (path) { return instances.pages[path]; });
}
function cloneInstances(oldInstances) {
return {
pageOrder: oldInstances.pageOrder.slice(),
pages: tslib_1.__assign({}, oldInstances.pages),
};
}
function openPage(instances, options, pages) {
var newInstances = cloneInstances(instances);
var insertAfterMutex = options.insertAfterMutex, occurrence = tslib_1.__rest(options, ["insertAfterMutex"]);
var insertAfterIndex = insertAfterMutex ? newInstances.pageOrder.indexOf(insertAfterMutex) : -1;
if (occurrence.parent) {
if (occurrence.parent === occurrence.mutex) {
throw new Error(occurrence.mutex + " cannot be child of itself.");
}
if (!instances.pages[occurrence.parent]) {
throw new Error("Parent of " + occurrence.mutex + " is invalid.");
}
if (insertAfterIndex !== -1 &&
insertAfterIndex < instances.pageOrder.indexOf(occurrence.parent)) {
throw new Error("Cannot open " + occurrence.mutex + ". Cannot be inserted before the parent.");
}
if (instances.pages[occurrence.parent].parent) {
throw new Error("Cannot open " + occurrence.mutex + ". Nesting more than one level is forbidden.");
}
}
var newPage = pages.buildInstance(occurrence);
if (insertAfterIndex !== -1) {
newInstances.pageOrder.splice(insertAfterIndex + 1, 0, occurrence.mutex);
}
else {
newInstances.pageOrder.push(occurrence.mutex);
}
newInstances.pages[occurrence.mutex] = newPage;
return newInstances;
}
function closePage(instances, toRemoveMutex) {
var newPages = orderedPages(instances).filter(function (page) {
if (page.mutex === toRemoveMutex) {
return false;
}
return page.parent !== toRemoveMutex;
});
return {
pageOrder: newPages.map(function (page) { return page.mutex; }),
pages: lodash_1.keyBy(newPages, function (page) { return page.mutex; }),
};
}
function findClosePageTarget(instances, toRemoveMutex, override) {
if (instances.pageOrder.length < 2) {
return;
}
if (override && override !== toRemoveMutex && instances.pages[override]) {
return override;
}
var toRemove = instances.pages[toRemoveMutex];
if (!toRemove.parent) {
var roots = orderedPages(instances).filter(function (page) { return !page.parent; }).map(function (page) { return page.mutex; });
var toRemoveRootIndex = roots.indexOf(toRemoveMutex);
return toRemoveRootIndex === 0 ? roots[1] : roots[toRemoveRootIndex - 1];
}
var parentChildren = orderedPages(instances)
.filter(function (page) { return page.parent === toRemove.parent; })
.map(function (page) { return page.mutex; });
if (parentChildren.length === 1) {
return toRemove.parent;
}
var toRemoveIndex = parentChildren.indexOf(toRemoveMutex);
return toRemoveIndex === 0 ? parentChildren[1] : parentChildren[toRemoveIndex - 1];
}
function replacePage(instances, options, pages) {
var toRemoveMutex = options.toRemoveMutex, occurrence = tslib_1.__rest(options, ["toRemoveMutex"]);
var toInsertIndex = instances.pageOrder.indexOf(toRemoveMutex);
if (toInsertIndex === -1) {
return openPage(instances, occurrence, pages);
}
if (occurrence.parent !== instances.pages[toRemoveMutex].parent) {
throw new Error("Cannot open " + occurrence.mutex + ". " +
'The new page and the page to be removed must have the same parent.');
}
var newPage = pages.buildInstance(occurrence);
var newInstances = closePage(instances, toRemoveMutex);
newInstances.pageOrder.splice(toInsertIndex, 0, occurrence.mutex);
newInstances.pages[occurrence.mutex] = newPage;
return newInstances;
}
function cloneActiveChildren(instances, currentActives) {
var newActives = {};
var roots = orderedPages(instances).filter(function (page) { return !page.parent; }).map(function (page) { return page.mutex; });
for (var _i = 0, roots_1 = roots; _i < roots_1.length; _i++) {
var root = roots_1[_i];
if (currentActives[root] && instances.pages[currentActives[root]]) {
newActives[root] = currentActives[root];
}
}
return newActives;
}
function updateActiveChildren(instances, actives, target) {
var newActives = cloneActiveChildren(instances, actives);
if (!target) {
return newActives;
}
var targetPage = instances.pages[target];
// target is root
if (targetPage && !targetPage.parent) {
if (!newActives[target]) {
return newActives;
}
delete newActives[target];
return newActives;
}
var root = targetPage && targetPage.parent;
if (!root) {
return newActives;
}
return tslib_1.__assign({}, newActives, (_a = {}, _a[root] = target, _a));
var _a;
}
function getTransitionTarget(instances, actives, currentActive, desiredTarget) {
var desiredTargetPage = instances.pages[desiredTarget];
var currentPage = currentActive && instances.pages[currentActive];
// non-root
if (desiredTargetPage && desiredTargetPage.parent) {
return desiredTarget;
}
// transiting to own root
if (currentPage && desiredTarget === currentPage.parent) {
return desiredTarget;
}
if (actives[desiredTarget] && instances.pages[actives[desiredTarget]]) {
return actives[desiredTarget];
}
return desiredTarget;
}
var Navigator = /** @class */ (function () {
function Navigator(pages, identifier) {
this.instances = { pageOrder: [], pages: {} };
this.activeChildren = {};
this.pages = pages;
this.identifier = typeof identifier === 'symbol' ? identifier : Symbol();
}
Object.defineProperty(Navigator.prototype, "all", {
get: function () {
return orderedPages(this.instances);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Navigator.prototype, "roots", {
get: function () {
return this.all.filter(function (page) { return !page.parent; });
},
enumerable: true,
configurable: true
});
Object.defineProperty(Navigator.prototype, "active", {
get: function () {
if (!this.activePageMutex) {
return;
}
return this.instances.pages[this.activePageMutex];
},
enumerable: true,
configurable: true
});
Object.defineProperty(Navigator.prototype, "activeMutex", {
get: function () {
return this.activePageMutex;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Navigator.prototype, "activeRootMutex", {
get: function () {
if (!this.activePageMutex || !this.instances.pages[this.activePageMutex]) {
return;
}
if (this.instances.pages[this.activePageMutex].parent) {
return this.instances.pages[this.activePageMutex].parent;
}
return this.activePageMutex;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Navigator.prototype, "activeRoot", {
get: function () {
var mutex = this.activeRootMutex;
if (!mutex) {
return;
}
return this.instances.pages[mutex];
},
enumerable: true,
configurable: true
});
Object.defineProperty(Navigator.prototype, "activeRootIndex", {
get: function () {
if (!this.activePageMutex || !this.instances.pages[this.activePageMutex]) {
return -1;
}
var parentMutex = this.instances.pages[this.activePageMutex].parent;
if (!parentMutex) {
return this.roots.map(function (page) { return page.mutex; }).indexOf(this.activePageMutex);
}
return this.roots.map(function (page) { return page.mutex; }).indexOf(parentMutex);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Navigator.prototype, "indexAsChildOfActiveRoot", {
get: function () {
if (!this.activePageMutex || !this.instances.pages[this.activePageMutex]) {
return -1;
}
var parentMutex = this.instances.pages[this.activePageMutex].parent;
if (!parentMutex) {
return -1;
}
return this.childrenOf(parentMutex).map(function (page) { return page.mutex; }).indexOf(this.activePageMutex);
},
enumerable: true,
configurable: true
});
Navigator.prototype.hasChildren = function (mutex) {
return this.all.some(function (page) { return page.parent === mutex; });
};
Navigator.prototype.childrenOf = function (mutex) {
return this.all.filter(function (page) { return page.parent === mutex; });
};
Navigator.prototype.pageFromMutex = function (mutex) {
return typeof mutex === 'string' ? this.instances.pages[mutex] : undefined;
};
Navigator.prototype.getActiveChild = function (mutex) {
return mutex ? this.activeChildren[mutex] : undefined;
};
Navigator.prototype.persistInstances = function (instances) {
var toSave = [];
for (var _i = 0, _a = orderedPages(instances); _i < _a.length; _i++) {
var instance = _a[_i];
if (instance.page.persistent !== false) {
if (instance.parent) {
if (instances.pages[instance.parent].page.persistent !== false) {
toSave.push(instance.occurrence);
}
}
else {
toSave.push(instance.occurrence);
}
}
}
persist_1.save(this.pages.prefix, toSave);
};
Navigator.prototype.persistActivePage = function (instances, mutex) {
if (!mutex) {
persist_1.saveActivePage(this.pages.prefix, undefined);
return;
}
if (instances.pages[mutex].page.persistent !== false) {
var parentMutex = instances.pages[mutex].parent;
if (parentMutex) {
var parent_1 = instances.pages[parentMutex];
if (parent_1.page.persistent !== false) {
persist_1.saveActivePage(this.pages.prefix, mutex);
}
}
else {
persist_1.saveActivePage(this.pages.prefix, mutex);
}
}
};
Navigator.prototype.reduce = function (action) {
if (actions_1.NAVIGATION_TRANSIT_TO_PAGE.is(this.identifier, action)) {
if (action.payload === this.activePageMutex) {
return this;
}
if (!action.payload) {
this.persistActivePage(this.instances, undefined);
var newNavWithoutActive = new Navigator(this.pages, this.identifier);
newNavWithoutActive.instances = this.instances;
newNavWithoutActive.activeChildren = this.activeChildren;
return newNavWithoutActive;
}
if (!this.instances.pages[action.payload]) {
return this;
}
var transitionTarget = getTransitionTarget(this.instances, this.activeChildren, this.activePageMutex, action.payload);
this.persistActivePage(this.instances, transitionTarget);
var newNav = new Navigator(this.pages, this.identifier);
newNav.instances = this.instances;
newNav.activePageMutex = transitionTarget;
newNav.activeChildren
= updateActiveChildren(this.instances, this.activeChildren, transitionTarget);
return newNav;
}
if (actions_1.NAVIGATION_OPEN_PAGE.is(this.identifier, action)) {
if (!action.payload || action.payload.mutex === this.activePageMutex) {
return this;
}
var _a = action.payload, mutex = _a.mutex, path = _a.path;
if (this.instances.pages[mutex]) {
this.persistActivePage(this.instances, mutex);
var newNav = new Navigator(this.pages, this.identifier);
newNav.instances = this.instances;
newNav.activePageMutex = mutex;
newNav.activeChildren = updateActiveChildren(this.instances, this.activeChildren, mutex);
return newNav;
}
if (this.pages.hasPage(path)) {
var newInstances = openPage(this.instances, action.payload, this.pages);
this.persistInstances(newInstances);
this.persistActivePage(newInstances, mutex);
var newNav = new Navigator(this.pages, this.identifier);
newNav.instances = newInstances;
newNav.activePageMutex = mutex;
newNav.activeChildren = updateActiveChildren(newInstances, this.activeChildren, mutex);
return newNav;
}
return this;
}
if (actions_1.NAVIGATION_REPLACE_PAGE.is(this.identifier, action)) {
if (!action.payload) {
return this;
}
var _b = action.payload, mutex = _b.mutex, path = _b.path;
if (this.instances.pages[mutex]) {
this.persistActivePage(this.instances, mutex);
var newNav = new Navigator(this.pages, this.identifier);
newNav.instances = this.instances;
newNav.activePageMutex = mutex;
newNav.activeChildren = updateActiveChildren(this.instances, this.activeChildren, mutex);
return newNav;
}
if (this.pages.hasPage(path)) {
var newInstances = replacePage(this.instances, action.payload, this.pages);
this.persistInstances(newInstances);
this.persistActivePage(newInstances, mutex);
var newNav = new Navigator(this.pages, this.identifier);
newNav.instances = newInstances;
newNav.activePageMutex = mutex;
newNav.activeChildren = updateActiveChildren(newInstances, this.activeChildren, mutex);
return newNav;
}
return this;
}
if (actions_1.NAVIGATION_CLOSE_PAGE.is(this.identifier, action)) {
if (!action.payload) {
return this;
}
var _c = action.payload, mutex = _c.mutex, goto = _c.goto;
if (!this.instances.pages[mutex]) {
return this;
}
var newNav = new Navigator(this.pages, this.identifier);
newNav.activePageMutex = this.activePageMutex;
var newInstances = closePage(this.instances, mutex);
var isParentOfActive = this.activePageMutex &&
this.instances.pages[this.activePageMutex].parent === mutex;
if (this.activePageMutex === mutex || isParentOfActive) {
var targetMutex = findClosePageTarget(this.instances, isParentOfActive ? this.instances.pages[this.activePageMutex].parent : mutex, goto);
var transitionTarget = targetMutex && getTransitionTarget(newInstances, this.activeChildren, this.activePageMutex, targetMutex);
this.persistActivePage(this.instances, undefined);
this.persistActivePage(this.instances, transitionTarget);
newNav.activePageMutex = transitionTarget;
}
this.persistInstances(newInstances);
newNav.instances = newInstances;
newNav.activeChildren
= updateActiveChildren(newInstances, this.activeChildren, newNav.activePageMutex);
return newNav;
}
if (actions_1.NAVIGATION_LOAD_PAGES.is(this.identifier, action)) {
var occurrence = persist_1.load(this.pages.prefix);
var loadedActivePageMutex = persist_1.loadActivePage(this.pages.prefix);
var instances = undefined;
var activePageMutex = undefined;
if (occurrence && occurrence.length > 0) {
instances = { pageOrder: [], pages: {} };
for (var _i = 0, occurrence_1 = occurrence; _i < occurrence_1.length; _i++) {
var instanceData = occurrence_1[_i];
if (this.pages.hasPage(instanceData.path)) {
var pageInstance = this.pages.buildInstance(instanceData);
if (pageInstance.mutex === loadedActivePageMutex) {
activePageMutex = loadedActivePageMutex;
}
instances.pageOrder.push(pageInstance.mutex);
instances.pages[pageInstance.mutex] = pageInstance;
}
}
}
if (instances && instances.pageOrder.length > 0) {
var newNav = new Navigator(this.pages, this.identifier);
newNav.instances = instances;
newNav.activePageMutex = activePageMutex;
newNav.activeChildren
= updateActiveChildren(instances, this.activeChildren, activePageMutex);
return newNav;
}
return this;
}
if (actions_1.NAVIGATION_CLEAR_PAGES.is(this.identifier, action)) {
persist_1.clear(this.pages.prefix);
return new Navigator(this.pages, this.identifier);
}
var nextInstances = { pageOrder: this.instances.pageOrder, pages: {} };
var modified = false;
for (var _d = 0, _e = orderedPages(this.instances); _d < _e.length; _d++) {
var instance = _e[_d];
var newInstance = instance.reduce(action);
if (newInstance !== instance) {
modified = true;
}
nextInstances.pages[instance.mutex] = newInstance;
}
if (modified) {
var newNav = new Navigator(this.pages, this.identifier);
newNav.activePageMutex = this.activePageMutex;
newNav.instances = nextInstances;
newNav.activeChildren = this.activeChildren;
return newNav;
}
return this;
};
Navigator.prototype.transit = function (dispatch, mutex) {
dispatch(actions_1.NAVIGATION_TRANSIT_TO_PAGE.create.unicast(this.identifier, mutex));
};
Navigator.prototype.open = function (dispatch, occurrence) {
dispatch(actions_1.NAVIGATION_OPEN_PAGE.create.unicast(this.identifier, occurrence));
};
Navigator.prototype.replace = function (dispatch, toRemoveMutex, occurrence) {
dispatch(actions_1.NAVIGATION_REPLACE_PAGE.create.unicast(this.identifier, tslib_1.__assign({ toRemoveMutex: toRemoveMutex }, occurrence)));
};
Navigator.prototype.close = function (dispatch, mutex, goto) {
dispatch(actions_1.NAVIGATION_CLOSE_PAGE.create.unicast(this.identifier, { mutex: mutex, goto: goto }));
};
Navigator.prototype.load = function (dispatch) {
dispatch(actions_1.NAVIGATION_LOAD_PAGES.create.unicast(this.identifier));
};
Navigator.prototype.clear = function (dispatch) {
dispatch(actions_1.NAVIGATION_CLEAR_PAGES.create.unicast(this.identifier));
};
return Navigator;
}());
exports.Navigator = Navigator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25hdmlnYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpQ0FBK0I7QUFHL0IscUNBQThFO0FBQzlFLHFDQU9tQjtBQTRCbkIsc0JBQXNCLFNBQW9CO0lBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQXJCLENBQXFCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsd0JBQXdCLFlBQXVCO0lBQzdDLE1BQU0sQ0FBQztRQUNMLFNBQVMsRUFBTSxZQUFZLENBQUMsU0FBUyxRQUFDO1FBQ3RDLEtBQUssdUJBQU8sWUFBWSxDQUFDLEtBQUssQ0FBRTtLQUNqQyxDQUFDO0FBQ0osQ0FBQztBQUVELGtCQUFrQixTQUFvQixFQUFFLE9BQXdCLEVBQUUsS0FBWTtJQUM1RSxJQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkMsSUFBQSwyQ0FBZ0IsRUFBRSwwREFBYSxDQUFhO0lBQ3BELElBQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWxHLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBSSxVQUFVLENBQUMsS0FBSyxnQ0FBNkIsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFB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QUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sd0JBQUksR0FBWCxVQUFZLFFBQWtCLEVBQUUsVUFBMkI7UUFDekQsUUFBUSxDQUFDLDhCQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFTSwyQkFBTyxHQUFkLFVBQ0UsUUFBa0IsRUFDbEIsYUFBcUIsRUFDckIsVUFBK0I7UUFFL0IsUUFBUSxDQUFDLGlDQUF1QixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQzdDLElBQUksQ0FBQyxVQUFVLHFCQUNiLGFBQWEsZUFBQSxJQUFLLFVBQVUsRUFDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHlCQUFLLEdBQVosVUFBYSxRQUFrQixFQUFFLEtBQWEsRUFBRSxJQUFhO1FBQzNELFFBQVEsQ0FBQywrQkFBcUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLE9BQUEsRUFBRSxJQUFJLE1BQUEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRU0sd0JBQUksR0FBWCxVQUFZLFFBQWtCO1FBQzVCLFFBQVEsQ0FBQywrQkFBcUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSx5QkFBSyxHQUFaLFVBQWEsUUFBa0I7UUFDN0IsUUFBUSxDQUFDLGdDQUFzQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxBQXZYRCxJQXVYQztBQXZYWSw4QkFBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlZHVjaWJsZSwgQWN0aW9uLCBEaXNwYXRjaCB9IGZyb20gJ3JlZHVjaWJsZS1ub2RlJztcclxuaW1wb3J0IHsga2V5QnkgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBQYWdlSW5zdGFuY2UgfSBmcm9tICcuL3BhZ2VJbnN0YW5jZSc7XHJcbmltcG9ydCB7IFBhZ2VzLCBQYWdlT2NjdXJyZW5jZSB9IGZyb20gJy4vcGFnZXMnO1xyXG5pbXBvcnQgeyBsb2FkLCBjbGVhciwgbG9hZEFjdGl2ZVBhZ2UsIHNhdmUsIHNhdmVBY3RpdmVQYWdlIH0gZnJvbSAnLi9wZXJzaXN0JztcclxuaW1wb3J0IHtcclxuICBOQVZJR0FUSU9OX1RSQU5TSVRfVE9fUEFHRSxcclxuICBOQVZJR0FUSU9OX09QRU5fUEFHRSxcclxuICBOQVZJR0FUSU9OX1JFUExBQ0VfUEFHRSxcclxuICBOQVZJR0FUSU9OX0NMT1NFX1BBR0UsXHJcbiAgTkFWSUdBVElPTl9MT0FEX1BBR0VTLFxyXG4gIE5BVklHQVRJT05fQ0xFQVJfUEFHRVMsXHJcbn0gZnJvbSAnLi9hY3Rpb25zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVJlcGxhY2VPcHRpb25zIGV4dGVuZHMgUGFnZU9jY3VycmVuY2U8YW55PiB7XHJcbiAgdG9SZW1vdmVNdXRleDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VPcGVuT3B0aW9ucyBleHRlbmRzIFBhZ2VPY2N1cnJlbmNlPGFueT4ge1xyXG4gIGluc2VydEFmdGVyTXV0ZXg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUNsb3NlT3B0aW9ucyB7XHJcbiAgbXV0ZXg6IHN0cmluZztcclxuICBnb3RvPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSW5zdGFuY2VNYXAge1xyXG4gIFtwcm9wOiBzdHJpbmddOiBQYWdlSW5zdGFuY2U8YW55LCBhbnk+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSW5zdGFuY2VzIHtcclxuICBwYWdlT3JkZXI6IHN0cmluZ1tdO1xyXG4gIHBhZ2VzOiBJbnN0YW5jZU1hcDtcclxufVxyXG5cclxuaW50ZXJmYWNlIEFjdGl2ZUNoaWxkcmVuIHtcclxuICBbcm9vdDogc3RyaW5nXTogc3RyaW5nO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvcmRlcmVkUGFnZXMoaW5zdGFuY2VzOiBJbnN0YW5jZXMpOiBQYWdlSW5zdGFuY2U8YW55LCBhbnk+W10ge1xyXG4gIHJldHVybiBpbnN0YW5jZXMucGFnZU9yZGVyLm1hcChwYXRoID0+IGluc3RhbmNlcy5wYWdlc1twYXRoXSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb25lSW5zdGFuY2VzKG9sZEluc3RhbmNlczogSW5zdGFuY2VzKTogSW5zdGFuY2VzIHtcclxuICByZXR1cm4ge1xyXG4gICAgcGFnZU9yZGVyOiBbLi4ub2xkSW5zdGFuY2VzLnBhZ2VPcmRlcl0sXHJcbiAgICBwYWdlczogeyAuLi5vbGRJbnN0YW5jZXMucGFnZXMgfSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBvcGVuUGFnZShpbnN0YW5jZXM6IEluc3RhbmNlcywgb3B0aW9uczogUGFnZU9wZW5PcHRpb25zLCBwYWdlczogUGFnZXMpOiBJbnN0YW5jZXMge1xyXG4gIGNvbnN0IG5ld0luc3RhbmNlcyA9IGNsb25lSW5zdGFuY2VzKGluc3RhbmNlcyk7XHJcbiAgY29uc3QgeyBpbnNlcnRBZnRlck11dGV4LCAuLi5vY2N1cnJlbmNlIH0gPSBvcHRpb25zO1xyXG4gIGNvbnN0IGluc2VydEFmdGVySW5kZXggPSBpbnNlcnRBZnRlck11dGV4ID8gbmV3SW5zdGFuY2VzLnBhZ2VPcmRlci5pbmRleE9mKGluc2VydEFmdGVyTXV0ZXgpIDogLTE7XHJcblxyXG4gIGlmIChvY2N1cnJlbmNlLnBhcmVudCkge1xyXG4gICAgaWYgKG9jY3VycmVuY2UucGFyZW50ID09PSBvY2N1cnJlbmNlLm11dGV4KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvY2N1cnJlbmNlLm11dGV4fSBjYW5ub3QgYmUgY2hpbGQgb2YgaXRzZWxmLmApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghaW5zdGFuY2VzLnBhZ2VzW29jY3VycmVuY2UucGFyZW50XSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmVudCBvZiAke29jY3VycmVuY2UubXV0ZXh9IGlzIGludmFsaWQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBpbnNlcnRBZnRlckluZGV4ICE9PSAtMSAmJlxyXG4gICAgICBpbnNlcnRBZnRlckluZGV4IDwgaW5zdGFuY2VzLnBhZ2VPcmRlci5pbmRleE9mKG9jY3VycmVuY2UucGFyZW50KVxyXG4gICAgKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgQ2Fubm90IG9wZW4gJHtvY2N1cnJlbmNlLm11dGV4fS4gQ2Fubm90IGJlIGluc2VydGVkIGJlZm9yZSB0aGUgcGFyZW50LmAsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGluc3RhbmNlcy5wYWdlc1tvY2N1cnJlbmNlLnBhcmVudF0ucGFyZW50KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgQ2Fubm90IG9wZW4gJHtvY2N1cnJlbmNlLm11dGV4fS4gTmVzdGluZyBtb3JlIHRoYW4gb25lIGxldmVsIGlzIGZvcmJpZGRlbi5gLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbmV3UGFnZSA9IHBhZ2VzLmJ1aWxkSW5zdGFuY2Uob2NjdXJyZW5jZSk7XHJcblxyXG4gIGlmIChpbnNlcnRBZnRlckluZGV4ICE9PSAtMSkge1xyXG4gICAgbmV3SW5zdGFuY2VzLnBhZ2VPcmRlci5zcGxpY2UoaW5zZXJ0QWZ0ZXJJbmRleCArIDEsIDAsIG9jY3VycmVuY2UubXV0ZXgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBuZXdJbnN0YW5jZXMucGFnZU9yZGVyLnB1c2gob2NjdXJyZW5jZS5tdXRleCk7XHJcbiAgfVxyXG5cclxuICBuZXdJbnN0YW5jZXMucGFnZXNbb2NjdXJyZW5jZS5tdXRleF0gPSBuZXdQYWdlO1xyXG5cclxuICByZXR1cm4gbmV3SW5zdGFuY2VzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9zZVBhZ2UoaW5zdGFuY2VzOiBJbnN0YW5jZXMsIHRvUmVtb3ZlTXV0ZXg6IHN0cmluZyk6IEluc3RhbmNlcyB7XHJcbiAgY29uc3QgbmV3UGFnZXMgPSBvcmRlcmVkUGFnZXMoaW5zdGFuY2VzKS5maWx0ZXIocGFnZSA9PiB7XHJcbiAgICBpZiAocGFnZS5tdXRleCA9PT0gdG9SZW1vdmVNdXRleCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhZ2UucGFyZW50ICE9PSB0b1JlbW92ZU11dGV4O1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcGFnZU9yZGVyOiBuZXdQYWdlcy5tYXAocGFnZSA9PiBwYWdlLm11dGV4KSxcclxuICAgIHBhZ2VzOiBrZXlCeShuZXdQYWdlcywgcGFnZSA9PiBwYWdlLm11dGV4KSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kQ2xvc2VQYWdlVGFyZ2V0KFxyXG4gIGluc3RhbmNlczogSW5zdGFuY2VzLFxyXG4gIHRvUmVtb3ZlTXV0ZXg6IHN0cmluZyxcclxuICBvdmVycmlkZT86IHN0cmluZyxcclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoaW5zdGFuY2VzLnBhZ2VPcmRlci5sZW5ndGggPCAyKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBpZiAob3ZlcnJpZGUgJiYgb3ZlcnJpZGUgIT09IHRvUmVtb3ZlTXV0ZXggJiYgaW5zdGFuY2VzLnBhZ2VzW292ZXJyaWRlXSkge1xyXG4gICAgcmV0dXJuIG92ZXJyaWRlO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdG9SZW1vdmUgPSBpbnN0YW5jZXMucGFnZXNbdG9SZW1vdmVNdXRleF07XHJcblxyXG4gIGlmICghdG9SZW1vdmUucGFyZW50KSB7XHJcbiAgICBjb25zdCByb290cyA9IG9yZGVyZWRQYWdlcyhpbnN0YW5jZXMpLmZp