import { flatten, first, merge } from './utils/collection'; import { TreeNode } from './utils/tree'; import { RouterStateSnapshot, ActivatedRouteSnapshot } from './router_state'; import { PRIMARY_OUTLET } from './shared'; import { Observable } from 'rxjs/Observable'; export function recognize(rootComponentType, config, url) { try { const match = new MatchResult(rootComponentType, config, [url.root], {}, url._root.children, [], PRIMARY_OUTLET, null, url.root); const roots = constructActivatedRoute(match); const res = new RouterStateSnapshot(roots[0], url.queryParameters, url.fragment); return new Observable(obs => { obs.next(res); obs.complete(); }); } catch (e) { return new Observable(obs => obs.error(e)); } } function constructActivatedRoute(match) { const activatedRoute = createActivatedRouteSnapshot(match); const children = match.leftOverUrl.length > 0 ? recognizeMany(match.children, match.leftOverUrl) : recognizeLeftOvers(match.children, match.lastUrlSegment); checkOutletNameUniqueness(children); children.sort((a, b) => { if (a.value.outlet === PRIMARY_OUTLET) return -1; if (b.value.outlet === PRIMARY_OUTLET) return 1; return a.value.outlet.localeCompare(b.value.outlet); }); return [new TreeNode(activatedRoute, children)]; } function recognizeLeftOvers(config, lastUrlSegment) { if (!config) return []; const mIndex = matchIndex(config, [], lastUrlSegment); return mIndex ? constructActivatedRoute(mIndex) : []; } function recognizeMany(config, urls) { return flatten(urls.map(url => recognizeOne(config, url))); } function createActivatedRouteSnapshot(match) { return new ActivatedRouteSnapshot(match.consumedUrlSegments, match.parameters, match.outlet, match.component, match.route, match.lastUrlSegment); } function recognizeOne(config, url) { const m = match(config, url); const primary = constructActivatedRoute(m); const secondary = recognizeMany(config, m.secondary); const res = primary.concat(secondary); checkOutletNameUniqueness(res); return res; } function checkOutletNameUniqueness(nodes) { let names = {}; nodes.forEach(n => { let routeWithSameOutletName = names[n.value.outlet]; if (routeWithSameOutletName) { const p = routeWithSameOutletName.urlSegments.map(s => s.toString()).join("/"); const c = n.value.urlSegments.map(s => s.toString()).join("/"); throw new Error(`Two segments cannot have the same outlet name: '${p}' and '${c}'.`); } names[n.value.outlet] = n.value; }); return nodes; } function match(config, url) { const m = matchNonIndex(config, url); if (m) return m; const mIndex = matchIndex(config, [url], url.value); if (mIndex) return mIndex; const availableRoutes = config.map(r => { const outlet = !r.outlet ? '' : `${r.outlet}:`; return `'${outlet}${r.path}'`; }).join(", "); throw new Error(`Cannot match any routes. Current segment: '${url.value}'. Available routes: [${availableRoutes}].`); } function matchNonIndex(config, url) { for (let r of config) { let m = matchWithParts(r, url); if (m) return m; } return null; } function matchIndex(config, leftOverUrls, lastUrlSegment) { for (let r of config) { if (r.index) { const outlet = r.outlet ? r.outlet : PRIMARY_OUTLET; const children = r.children ? r.children : []; return new MatchResult(r.component, children, [], lastUrlSegment.parameters, leftOverUrls, [], outlet, r, lastUrlSegment); } } return null; } function matchWithParts(route, url) { if (!route.path) return null; if ((route.outlet ? route.outlet : PRIMARY_OUTLET) !== url.value.outlet) return null; const path = route.path.startsWith("/") ? route.path.substring(1) : route.path; if (path === "**") { const consumedUrl = []; let u = url; while (u) { consumedUrl.push(u.value); u = first(u.children); } const last = consumedUrl[consumedUrl.length - 1]; return new MatchResult(route.component, [], consumedUrl, last.parameters, [], [], PRIMARY_OUTLET, route, last); } const parts = path.split("/"); const positionalParams = {}; const consumedUrlSegments = []; let lastParent = null; let lastSegment = null; let current = url; for (let i = 0; i < parts.length; ++i) { if (!current) return null; const p = parts[i]; const isLastSegment = i === parts.length - 1; const isLastParent = i === parts.length - 2; const isPosParam = p.startsWith(":"); if (!isPosParam && p != current.value.path) return null; if (isLastSegment) { lastSegment = current; } if (isLastParent) { lastParent = current; } if (isPosParam) { positionalParams[p.substring(1)] = current.value.path; } consumedUrlSegments.push(current.value); current = first(current.children); } if (!lastSegment) throw "Cannot be reached"; const p = lastSegment.value.parameters; const parameters = merge(p, positionalParams); const secondarySubtrees = lastParent ? lastParent.children.slice(1) : []; const children = route.children ? route.children : []; const outlet = route.outlet ? route.outlet : PRIMARY_OUTLET; return new MatchResult(route.component, children, consumedUrlSegments, parameters, lastSegment.children, secondarySubtrees, outlet, route, lastSegment.value); } class MatchResult { constructor(component, children, consumedUrlSegments, parameters, leftOverUrl, secondary, outlet, route, lastUrlSegment) { this.component = component; this.children = children; this.consumedUrlSegments = consumedUrlSegments; this.parameters = parameters; this.leftOverUrl = leftOverUrl; this.secondary = secondary; this.outlet = outlet; this.route = route; this.lastUrlSegment = lastUrlSegment; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb2duaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlY29nbml6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiT0FDTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CO09BQ25ELEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYztPQUNoQyxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCO09BQ3JFLEVBQVUsY0FBYyxFQUFFLE1BQU0sVUFBVTtPQUcxQyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQjtBQUU1QywwQkFBMEIsaUJBQXVCLEVBQUUsTUFBb0IsRUFBRSxHQUFZO0lBQ25GLElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pJLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBc0IsR0FBRztZQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBRTtJQUFBLEtBQUssQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVixNQUFNLENBQUMsSUFB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akIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFjO1FBQ2pDLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBQ25DLGdCQUFXLEdBQVgsV0FBVyxDQUF3QjtRQUNuQyxjQUFTLEdBQVQsU0FBUyxDQUF3QjtRQUNqQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBWTtJQUMxQyxDQUFDO0FBQ04sQ0FBQztBQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXJsVHJlZSwgVXJsU2VnbWVudCB9IGZyb20gJy4vdXJsX3RyZWUnO1xuaW1wb3J0IHsgZmxhdHRlbiwgZmlyc3QsIG1lcmdlIH0gZnJvbSAnLi91dGlscy9jb2xsZWN0aW9uJztcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAnLi91dGlscy90cmVlJztcbmltcG9ydCB7IFJvdXRlclN0YXRlU25hcHNob3QsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICcuL3JvdXRlcl9zdGF0ZSc7XG5pbXBvcnQgeyBQYXJhbXMsIFBSSU1BUllfT1VUTEVUIH0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHsgUm91dGVyQ29uZmlnLCBSb3V0ZSB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVjb2duaXplKHJvb3RDb21wb25lbnRUeXBlOiBUeXBlLCBjb25maWc6IFJvdXRlckNvbmZpZywgdXJsOiBVcmxUcmVlKTogT2JzZXJ2YWJsZTxSb3V0ZXJTdGF0ZVNuYXBzaG90PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWF0Y2ggPSBuZXcgTWF0Y2hSZXN1bHQocm9vdENvbXBvbmVudFR5cGUsIGNvbmZpZywgW3VybC5yb290XSwge30sIHVybC5fcm9vdC5jaGlsZHJlbiwgW10sIFBSSU1BUllfT1VUTEVULCBudWxsLCB1cmwucm9vdCk7XG4gICAgY29uc3Qgcm9vdHMgPSBjb25zdHJ1Y3RBY3RpdmF0ZWRSb3V0ZShtYXRjaCk7XG4gICAgY29uc3QgcmVzID0gbmV3IFJvdXRlclN0YXRlU25hcHNob3Qocm9vdHNbMF0sIHVybC5xdWVyeVBhcmFtZXRlcnMsIHVybC5mcmFnbWVudCk7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFJvdXRlclN0YXRlU25hcHNob3Q+KG9icyA9PiB7XG4gICAgICBvYnMubmV4dChyZXMpO1xuICAgICAgb2JzLmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxSb3V0ZXJTdGF0ZVNuYXBzaG90PihvYnMgPT4gb2JzLmVycm9yKGUpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RBY3RpdmF0ZWRSb3V0ZShtYXRjaDogTWF0Y2hSZXN1bHQpOiBUcmVlTm9kZTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PltdIHtcbiAgY29uc3QgYWN0aXZhdGVkUm91dGUgPSBjcmVhdGVBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KG1hdGNoKTtcbiAgY29uc3QgY2hpbGRyZW4gPSBtYXRjaC5sZWZ0T3ZlclVybC5sZW5ndGggPiAwID9cbiAgICByZWNvZ25pemVNYW55KG1hdGNoLmNoaWxkcmVuLCBtYXRjaC5sZWZ0T3ZlclVybCkgOiByZWNvZ25pemVMZWZ0T3ZlcnMobWF0Y2guY2hpbGRyZW4sIG1hdGNoLmxhc3RVcmxTZWdtZW50KTtcbiAgY2hlY2tPdXRsZXROYW1lVW5pcXVlbmVzcyhjaGlsZHJlbik7XG4gIGNoaWxkcmVuLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS52YWx1ZS5vdXRsZXQgPT09IFBSSU1BUllfT1VUTEVUKSByZXR1cm4gLTE7XG4gICAgaWYgKGIudmFsdWUub3V0bGV0ID09PSBQUklNQVJZX09VVExFVCkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIGEudmFsdWUub3V0bGV0LmxvY2FsZUNvbXBhcmUoYi52YWx1ZS5vdXRsZXQpXG4gIH0pO1xuICByZXR1cm4gW25ldyBUcmVlTm9kZTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PihhY3RpdmF0ZWRSb3V0ZSwgY2hpbGRyZW4pXTtcbn1cblxuZnVuY3Rpb24gcmVjb2duaXplTGVmdE92ZXJzKGNvbmZpZzogUm91dGVbXSwgbGFzdFVybFNlZ21lbnQ6IFVybFNlZ21lbnQpOiBUcmVlTm9kZTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PltdIHtcbiAgaWYgKCFjb25maWcpIHJldHVybiBbXTtcbiAgY29uc3QgbUluZGV4ID0gbWF0Y2hJbmRleChjb25maWcsIFtdLCBsYXN0VXJsU2VnbWVudCk7XG4gIHJldHVybiBtSW5kZXggPyBjb25zdHJ1Y3RBY3RpdmF0ZWRSb3V0ZShtSW5kZXgpIDogW107XG59XG5cbmZ1bmN0aW9uIHJlY29nbml6ZU1hbnkoY29uZmlnOiBSb3V0ZVtdLCB1cmxzOiBUcmVlTm9kZTxVcmxTZWdtZW50PltdKTogVHJlZU5vZGU8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD5bXSB7XG4gIHJldHVybiBmbGF0dGVuKHVybHMubWFwKHVybCA9PiByZWNvZ25pemVPbmUoY29uZmlnLCB1cmwpKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFjdGl2YXRlZFJvdXRlU25hcHNob3QobWF0Y2g6IE1hdGNoUmVzdWx0KTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB7XG4gIHJldHVybiBuZXcgQWN0aXZhdGVkUm91dGVTbmFwc2hvdChtYXRjaC5jb25zdW1lZFVybFNlZ21lbnRzLCBtYXRjaC5wYXJhbWV0ZXJzLCBtYXRjaC5vdXRsZXQsIG1hdGNoLmNvbXBvbmVudCwgbWF0Y2gucm91dGUsIG1hdGNoLmxhc3RVcmxTZWdtZW50KTtcbn1cblxuZnVuY3Rpb24gcmVjb2duaXplT25lKGNvbmZpZzogUm91dGVbXSwgdXJsOiBUcmVlTm9kZTxVcmxTZWdtZW50Pik6IFRyZWVOb2RlPEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+W10ge1xuICBjb25zdCBtID0gbWF0Y2goY29uZmlnLCB1cmwpO1xuICBjb25zdCBwcmltYXJ5ID0gY29uc3RydWN0QWN0aXZhdGVkUm91dGUobSk7XG4gIGNvbnN0IHNlY29uZGFyeSA9IHJlY29nbml6ZU1hbnkoY29uZmlnLCBtLnNlY29uZGFyeSk7XG4gIGNvbnN0IHJlcyA9IHByaW1hcnkuY29uY2F0KHNlY29uZGFyeSk7XG4gIGNoZWNrT3V0bGV0TmFtZVVuaXF1ZW5lc3MocmVzKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gY2hlY2tPdXRsZXROYW1lVW5pcXVlbmVzcyhub2RlczogVHJlZU5vZGU8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD5bXSk6IFRyZWVOb2RlPEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+W10ge1xuICBsZXQgbmFtZXMgPSB7fTtcbiAgbm9kZXMuZm9yRWFjaChuID0+IHtcbiAgICBsZXQgcm91dGVXaXRoU2FtZU91dGxldE5hbWUgPSBuYW1lc1tuLnZhbHVlLm91dGxldF07XG4gICAgaWYgKHJvdXRlV2l0aFNhbWVPdXRsZXROYW1lKSB7XG4gICAgICBjb25zdCBwID0gcm91dGVXaXRoU2FtZU91dGxldE5hbWUudXJsU2VnbWVudHMubWFwKHMgPT4gcy50b1N0cmluZygpKS5qb2luKFwiL1wiKTtcbiAgICAgIGNvbnN0IGMgPSBuLnZhbHVlLnVybFNlZ21lbnRzLm1hcChzID0+IHMudG9TdHJpbmcoKSkuam9pbihcIi9cIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR3byBzZWdtZW50cyBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBvdXRsZXQgbmFtZTogJyR7cH0nIGFuZCAnJHtjfScuYCk7XG4gICAgfVxuICAgIG5hbWVzW24udmFsdWUub3V0bGV0XSA9IG4udmFsdWU7XG4gIH0pO1xuICByZXR1cm4gbm9kZXM7XG59XG5cbmZ1bmN0aW9uIG1hdGNoKGNvbmZpZzogUm91dGVbXSwgdXJsOiBUcmVlTm9kZTxVcmxTZWdtZW50Pik6IE1hdGNoUmVzdWx0IHtcbiAgY29uc3QgbSA9IG1hdGNoTm9uSW5kZXgoY29uZmlnLCB1cmwpO1xuICBpZiAobSkgcmV0dXJuIG07XG5cbiAgY29uc3QgbUluZGV4ID0gbWF0Y2hJbmRleChjb25maWcsIFt1cmxdLCB1cmwudmFsdWUpO1xuICBpZiAobUluZGV4KSByZXR1cm4gbUluZGV4O1xuXG4gIGNvbnN0IGF2YWlsYWJsZVJvdXRlcyA9IGNvbmZpZy5tYXAociA9PiB7XG4gICAgY29uc3Qgb3V0bGV0ID0gIXIub3V0bGV0ID8gJycgOiBgJHtyLm91dGxldH06YDtcbiAgICByZXR1cm4gYCcke291dGxldH0ke3IucGF0aH0nYDtcbiAgfSkuam9pbihcIiwgXCIpO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBtYXRjaCBhbnkgcm91dGVzLiBDdXJyZW50IHNlZ21lbnQ6ICcke3VybC52YWx1ZX0nLiBBdmFpbGFibGUgcm91dGVzOiBbJHthdmFpbGFibGVSb3V0ZXN9XS5gKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hOb25JbmRleChjb25maWc6IFJvdXRlW10sIHVybDogVHJlZU5vZGU8VXJsU2VnbWVudD4pOiBNYXRjaFJlc3VsdCB8IG51bGwge1xuICBmb3IgKGxldCByIG9mIGNvbmZpZykge1xuICAgIGxldCBtID0gbWF0Y2hXaXRoUGFydHMociwgdXJsKTtcbiAgICBpZiAobSkgcmV0dXJuIG07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hdGNoSW5kZXgoY29uZmlnOiBSb3V0ZVtdLCBsZWZ0T3ZlclVybHM6IFRyZWVOb2RlPFVybFNlZ21lbnQ+W10sIGxhc3RVcmxTZWdtZW50OiBVcmxTZWdtZW50KTogTWF0Y2hSZXN1bHQgfCBudWxsIHtcbiAgZm9yIChsZXQgciBvZiBjb25maWcpIHtcbiAgICBpZiAoci5pbmRleCkge1xuICAgICAgY29uc3Qgb3V0bGV0ID0gci5vdXRsZXQgPyByLm91dGxldCA6IFBSSU1BUllfT1VUTEVUO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSByLmNoaWxkcmVuID8gci5jaGlsZHJlbiA6IFtdO1xuICAgICAgcmV0dXJuIG5ldyBNYXRjaFJlc3VsdChyLmNvbXBvbmVudCwgY2hpbGRyZW4sIFtdLCBsYXN0VXJsU2VnbWVudC5wYXJhbWV0ZXJzLCBsZWZ0T3ZlclVybHMsIFtdLCBvdXRsZXQsIHIsIGxhc3RVcmxTZWdtZW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hdGNoV2l0aFBhcnRzKHJvdXRlOiBSb3V0ZSwgdXJsOiBUcmVlTm9kZTxVcmxTZWdtZW50Pik6IE1hdGNoUmVzdWx0IHwgbnVsbCB7XG4gIGlmICghcm91dGUucGF0aCkgcmV0dXJuIG51bGw7XG4gIGlmICgocm91dGUub3V0bGV0ID8gcm91dGUub3V0bGV0IDogUFJJTUFSWV9PVVRMRVQpICE9PSB1cmwudmFsdWUub3V0bGV0KSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBwYXRoID0gcm91dGUucGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHJvdXRlLnBhdGguc3Vic3RyaW5nKDEpIDogcm91dGUucGF0aDtcbiAgaWYgKHBhdGggPT09IFwiKipcIikge1xuICAgIGNvbnN0IGNvbnN1bWVkVXJsID0gW107XG4gICAgbGV0IHU6VHJlZU5vZGU8VXJsU2VnbWVudD58bnVsbCA9IHVybDtcbiAgICB3aGlsZSAodSkge1xuICAgICAgY29uc3VtZWRVcmwucHVzaCh1LnZhbHVlKTtcbiAgICAgIHUgPSBmaXJzdCh1LmNoaWxkcmVuKTtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IGNvbnN1bWVkVXJsW2NvbnN1bWVkVXJsLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBuZXcgTWF0Y2hSZXN1bHQocm91dGUuY29tcG9uZW50LCBbXSwgY29uc3VtZWRVcmwsIGxhc3QucGFyYW1ldGVycywgW10sIFtdLCBQUklNQVJZX09VVExFVCwgcm91dGUsIGxhc3QpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgcG9zaXRpb25hbFBhcmFtcyA9IHt9O1xuICBjb25zdCBjb25zdW1lZFVybFNlZ21lbnRzID0gW107XG5cbiAgbGV0IGxhc3RQYXJlbnQ6IFRyZWVOb2RlPFVybFNlZ21lbnQ+fG51bGwgPSBudWxsO1xuICBsZXQgbGFzdFNlZ21lbnQ6IFRyZWVOb2RlPFVybFNlZ21lbnQ+fG51bGwgPSBudWxsO1xuXG4gIGxldCBjdXJyZW50OiBUcmVlTm9kZTxVcmxTZWdtZW50PnxudWxsID0gdXJsO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHAgPSBwYXJ0c1tpXTtcbiAgICBjb25zdCBpc0xhc3RTZWdtZW50ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBpc0xhc3RQYXJlbnQgPSBpID09PSBwYXJ0cy5sZW5ndGggLSAyO1xuICAgIGNvbnN0IGlzUG9zUGFyYW0gPSBwLnN0YXJ0c1dpdGgoXCI6XCIpO1xuXG4gICAgaWYgKCFpc1Bvc1BhcmFtICYmIHAgIT0gY3VycmVudC52YWx1ZS5wYXRoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoaXNMYXN0U2VnbWVudCkge1xuICAgICAgbGFzdFNlZ21lbnQgPSBjdXJyZW50O1xuICAgIH1cbiAgICBpZiAoaXNMYXN0UGFyZW50KSB7XG4gICAgICBsYXN0UGFyZW50ID0gY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaXNQb3NQYXJhbSkge1xuICAgICAgcG9zaXRpb25hbFBhcmFtc1twLnN1YnN0cmluZygxKV0gPSBjdXJyZW50LnZhbHVlLnBhdGg7XG4gICAgfVxuXG4gICAgY29uc3VtZWRVcmxTZWdtZW50cy5wdXNoKGN1cnJlbnQudmFsdWUpO1xuXG4gICAgY3VycmVudCA9IGZpcnN0KGN1cnJlbnQuY2hpbGRyZW4pO1xuICB9XG5cbiAgaWYgKCFsYXN0U2VnbWVudCkgdGhyb3cgXCJDYW5ub3QgYmUgcmVhY2hlZFwiO1xuXG4gIGNvbnN0IHAgPSBsYXN0U2VnbWVudC52YWx1ZS5wYXJhbWV0ZXJzO1xuICBjb25zdCBwYXJhbWV0ZXJzID0gPHtba2V5OiBzdHJpbmddOiBzdHJpbmd9Pm1lcmdlKHAsIHBvc2l0aW9uYWxQYXJhbXMpO1xuICBjb25zdCBzZWNvbmRhcnlTdWJ0cmVlcyA9IGxhc3RQYXJlbnQgPyBsYXN0UGFyZW50LmNoaWxkcmVuLnNsaWNlKDEpIDogW107XG4gIGNvbnN0IGNoaWxkcmVuID0gcm91dGUuY2hpbGRyZW4gPyByb3V0ZS5jaGlsZHJlbiA6IFtdO1xuICBjb25zdCBvdXRsZXQgPSByb3V0ZS5vdXRsZXQgPyByb3V0ZS5vdXRsZXQgOiBQUklNQVJZX09VVExFVDtcblxuICByZXR1cm4gbmV3IE1hdGNoUmVzdWx0KHJvdXRlLmNvbXBvbmVudCwgY2hpbGRyZW4sIGNvbnN1bWVkVXJsU2VnbWVudHMsIHBhcmFtZXRlcnMsIGxhc3RTZWdtZW50LmNoaWxkcmVuLFxuICAgIHNlY29uZGFyeVN1YnRyZWVzLCBvdXRsZXQsIHJvdXRlLCBsYXN0U2VnbWVudC52YWx1ZSk7XG59XG5cbmNsYXNzIE1hdGNoUmVzdWx0IHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudDogVHlwZSB8IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIGNoaWxkcmVuOiBSb3V0ZVtdLFxuICAgICAgICAgICAgICBwdWJsaWMgY29uc3VtZWRVcmxTZWdtZW50czogVXJsU2VnbWVudFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgcGFyYW1ldGVyczoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgICAgICAgICAgIHB1YmxpYyBsZWZ0T3ZlclVybDogVHJlZU5vZGU8VXJsU2VnbWVudD5bXSxcbiAgICAgICAgICAgICAgcHVibGljIHNlY29uZGFyeTogVHJlZU5vZGU8VXJsU2VnbWVudD5bXSxcbiAgICAgICAgICAgICAgcHVibGljIG91dGxldDogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgcm91dGU6IFJvdXRlIHwgbnVsbCxcbiAgICAgICAgICAgICAgcHVibGljIGxhc3RVcmxTZWdtZW50OiBVcmxTZWdtZW50XG4gICkge31cbn0iXX0=