carbon-components-angular
Version:
Next generation components
171 lines (167 loc) • 15.3 kB
JavaScript
import { Component, Input, Optional, Output, EventEmitter, HostBinding } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "@angular/router";
import * as i3 from "@angular/common";
import * as i4 from "./routerlink-extended.directive";
/**
* `SideNavItem` can either be a child of `SideNav` or `SideNavMenu`
*/
export class SideNavItem {
constructor(domSanitizer, router) {
this.domSanitizer = domSanitizer;
this.router = router;
/**
* Use the routerLink attribute on <a> tag for navigation instead of using event handlers
*/
this.useRouter = false;
/**
* Toggles the active (current page) state for the link.
*/
this.active = false;
this.isSubMenu = false;
/**
* Emits the navigation status promise when the link is activated
*/
this.navigation = new EventEmitter();
/**
* Emits when `active` input is changed. This is mainly used to indicate to any parent menu items that a
* child sidenav item is active or not active.
*/
this.selected = new EventEmitter();
this.role = "listitem";
this._href = "#";
}
/**
* Link for the item. NOTE: *do not* pass unsafe or untrusted values, this has the potential to open you up to XSS attacks
*/
set href(v) {
// Needed when component is created dynamically with a model.
if (v === undefined) {
return;
}
this._href = v;
}
get href() {
return this.domSanitizer.bypassSecurityTrustUrl(this._href);
}
get sideNav() {
return !this.isSubMenu;
}
get menuItem() {
return this.isSubMenu;
}
ngOnChanges(changes) {
if (changes.active) {
this.selected.emit(this.active);
}
}
navigate(event) {
if (this.router && this.route) {
event.preventDefault();
const status = this.router.navigate(this.route, this.routeExtras);
this.navigation.emit(status);
}
else if (this._href === "#") {
event.preventDefault();
}
}
}
SideNavItem.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SideNavItem, deps: [{ token: i1.DomSanitizer }, { token: i2.Router, optional: true }], target: i0.ɵɵFactoryTarget.Component });
SideNavItem.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SideNavItem, selector: "cds-sidenav-item, ibm-sidenav-item", inputs: { href: "href", useRouter: "useRouter", active: "active", route: "route", isSubMenu: "isSubMenu", routeExtras: "routeExtras", title: "title" }, outputs: { navigation: "navigation", selected: "selected" }, host: { properties: { "class.cds--side-nav__item": "this.sideNav", "class.cds--side-nav__menu-item": "this.menuItem", "attr.role": "this.role" } }, usesOnChanges: true, ngImport: i0, template: `
<a *ngIf="!useRouter; else sidenavItemRouterTpl"
class="cds--side-nav__link"
[ngClass]="{
'cds--side-nav__item--active': active
}"
[href]="href"
[attr.aria-current]="(active ? 'page' : null)"
[attr.title]="title ? title : null"
(click)="navigate($event)">
<ng-template [ngTemplateOutlet]="sidenavItemContentTpl"></ng-template>
</a>
<ng-template #sidenavItemRouterTpl>
<a
[attr.title]="title ? title : null"
[routerLink]="route"
[routeExtras]="routeExtras"
routerLinkActive="cds--side-nav__item--active"
ariaCurrentWhenActive="page"
class="cds--side-nav__link">
<ng-template [ngTemplateOutlet]="sidenavItemContentTpl"></ng-template>
</a>
</ng-template>
<ng-template #sidenavItemContentTpl>
<div *ngIf="!isSubMenu" class="cds--side-nav__icon">
<ng-content select="svg, [icon]"></ng-content>
</div>
<span class="cds--side-nav__link-text">
<ng-content></ng-content>
</span>
</ng-template>
`, isInline: true, styles: [":host{display:list-item}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i4.RouterLinkExtendedDirective, selector: "[routerLink]", inputs: ["routeExtras"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SideNavItem, decorators: [{
type: Component,
args: [{ selector: "cds-sidenav-item, ibm-sidenav-item", template: `
<a *ngIf="!useRouter; else sidenavItemRouterTpl"
class="cds--side-nav__link"
[ngClass]="{
'cds--side-nav__item--active': active
}"
[href]="href"
[attr.aria-current]="(active ? 'page' : null)"
[attr.title]="title ? title : null"
(click)="navigate($event)">
<ng-template [ngTemplateOutlet]="sidenavItemContentTpl"></ng-template>
</a>
<ng-template #sidenavItemRouterTpl>
<a
[attr.title]="title ? title : null"
[routerLink]="route"
[routeExtras]="routeExtras"
routerLinkActive="cds--side-nav__item--active"
ariaCurrentWhenActive="page"
class="cds--side-nav__link">
<ng-template [ngTemplateOutlet]="sidenavItemContentTpl"></ng-template>
</a>
</ng-template>
<ng-template #sidenavItemContentTpl>
<div *ngIf="!isSubMenu" class="cds--side-nav__icon">
<ng-content select="svg, [icon]"></ng-content>
</div>
<span class="cds--side-nav__link-text">
<ng-content></ng-content>
</span>
</ng-template>
`, styles: [":host{display:list-item}\n"] }]
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i2.Router, decorators: [{
type: Optional
}] }]; }, propDecorators: { href: [{
type: Input
}], useRouter: [{
type: Input
}], sideNav: [{
type: HostBinding,
args: ["class.cds--side-nav__item"]
}], menuItem: [{
type: HostBinding,
args: ["class.cds--side-nav__menu-item"]
}], active: [{
type: Input
}], route: [{
type: Input
}], isSubMenu: [{
type: Input
}], routeExtras: [{
type: Input
}], title: [{
type: Input
}], navigation: [{
type: Output
}], selected: [{
type: Output
}], role: [{
type: HostBinding,
args: ["attr.role"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZW5hdi1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91aS1zaGVsbC9zaWRlbmF2L3NpZGVuYXYtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEVBRVosV0FBVyxFQUVYLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFJdkI7O0dBRUc7QUEyQ0gsTUFBTSxPQUFPLFdBQVc7SUFvRXZCLFlBQXNCLFlBQTBCLEVBQXdCLE1BQWM7UUFBaEUsaUJBQVksR0FBWixZQUFZLENBQWM7UUFBd0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXBEdEY7O1dBRUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBVTNCOztXQUVHO1FBQ00sV0FBTSxHQUFHLEtBQUssQ0FBQztRQVFmLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFhM0I7O1dBRUc7UUFDTyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFFNUQ7OztXQUdHO1FBQ08sYUFBUSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdkIsU0FBSSxHQUFHLFVBQVUsQ0FBQztRQUVsQyxVQUFLLEdBQUcsR0FBRyxDQUFDO0lBRW1FLENBQUM7SUFuRTFGOztPQUVHO0lBQ0gsSUFBYSxJQUFJLENBQUMsQ0FBUztRQUMxQiw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3BCLE9BQU87U0FDUDtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBVyxDQUFDO0lBQ3ZFLENBQUM7SUFPRCxJQUE4QyxPQUFPO1FBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFtRCxRQUFRO1FBQzFELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN2QixDQUFDO0lBMkNELFdBQVcsQ0FBQyxPQUFzQjtRQUNqQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hDO0lBQ0YsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFpQjtRQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUM5QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0I7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssR0FBRyxFQUFFO1lBQzlCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtJQUNGLENBQUM7O3dHQXBGVyxXQUFXOzRGQUFYLFdBQVcsd2NBeENiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpQ1Q7MkZBT1csV0FBVztrQkExQ3ZCLFNBQVM7K0JBQ0Msb0NBQW9DLFlBQ3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpQ1Q7OzBCQTJFa0QsUUFBUTs0Q0FoRTlDLElBQUk7c0JBQWhCLEtBQUs7Z0JBZUcsU0FBUztzQkFBakIsS0FBSztnQkFFd0MsT0FBTztzQkFBcEQsV0FBVzt1QkFBQywyQkFBMkI7Z0JBSVcsUUFBUTtzQkFBMUQsV0FBVzt1QkFBQyxnQ0FBZ0M7Z0JBT3BDLE1BQU07c0JBQWQsS0FBSztnQkFNRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLSSxVQUFVO3NCQUFuQixNQUFNO2dCQU1HLFFBQVE7c0JBQWpCLE1BQU07Z0JBRW1CLElBQUk7c0JBQTdCLFdBQVc7dUJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0SW5wdXQsXG5cdE9wdGlvbmFsLFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0T25DaGFuZ2VzLFxuXHRIb3N0QmluZGluZyxcblx0U2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcblxuLyoqXG4gKiBgU2lkZU5hdkl0ZW1gIGNhbiBlaXRoZXIgYmUgYSBjaGlsZCBvZiBgU2lkZU5hdmAgb3IgYFNpZGVOYXZNZW51YFxuICovXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwiY2RzLXNpZGVuYXYtaXRlbSwgaWJtLXNpZGVuYXYtaXRlbVwiLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxhICpuZ0lmPVwiIXVzZVJvdXRlcjsgZWxzZSBzaWRlbmF2SXRlbVJvdXRlclRwbFwiXG5cdFx0XHRjbGFzcz1cImNkcy0tc2lkZS1uYXZfX2xpbmtcIlxuXHRcdFx0W25nQ2xhc3NdPVwie1xuXHRcdFx0XHQnY2RzLS1zaWRlLW5hdl9faXRlbS0tYWN0aXZlJzogYWN0aXZlXG5cdFx0XHR9XCJcblx0XHRcdFtocmVmXT1cImhyZWZcIlxuXHRcdFx0W2F0dHIuYXJpYS1jdXJyZW50XT1cIihhY3RpdmUgPyAncGFnZScgOiBudWxsKVwiXG5cdFx0XHRbYXR0ci50aXRsZV09XCJ0aXRsZSA/IHRpdGxlIDogbnVsbFwiXG5cdFx0XHQoY2xpY2spPVwibmF2aWdhdGUoJGV2ZW50KVwiPlxuXHRcdFx0PG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNpZGVuYXZJdGVtQ29udGVudFRwbFwiPjwvbmctdGVtcGxhdGU+XG5cdFx0PC9hPlxuXG5cdFx0PG5nLXRlbXBsYXRlICNzaWRlbmF2SXRlbVJvdXRlclRwbD5cblx0XHRcdDxhXG5cdFx0XHRcdFthdHRyLnRpdGxlXT1cInRpdGxlID8gdGl0bGUgOiBudWxsXCJcblx0XHRcdFx0W3JvdXRlckxpbmtdPVwicm91dGVcIlxuXHRcdFx0XHRbcm91dGVFeHRyYXNdPVwicm91dGVFeHRyYXNcIlxuXHRcdFx0XHRyb3V0ZXJMaW5rQWN0aXZlPVwiY2RzLS1zaWRlLW5hdl9faXRlbS0tYWN0aXZlXCJcblx0XHRcdFx0YXJpYUN1cnJlbnRXaGVuQWN0aXZlPVwicGFnZVwiXG5cdFx0XHRcdGNsYXNzPVwiY2RzLS1zaWRlLW5hdl9fbGlua1wiPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2lkZW5hdkl0ZW1Db250ZW50VHBsXCI+PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvYT5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXG5cdFx0PG5nLXRlbXBsYXRlICNzaWRlbmF2SXRlbUNvbnRlbnRUcGw+XG5cdFx0XHQ8ZGl2ICpuZ0lmPVwiIWlzU3ViTWVudVwiIGNsYXNzPVwiY2RzLS1zaWRlLW5hdl9faWNvblwiPlxuXHRcdFx0XHQ8bmctY29udGVudCBzZWxlY3Q9XCJzdmcsIFtpY29uXVwiPjwvbmctY29udGVudD5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PHNwYW4gY2xhc3M9XCJjZHMtLXNpZGUtbmF2X19saW5rLXRleHRcIj5cblx0XHRcdFx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRcdFx0PC9zcGFuPlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdGAsXG5cdHN0eWxlczogW2Bcblx0XHQ6aG9zdCB7XG5cdFx0XHRkaXNwbGF5OiBsaXN0LWl0ZW07XG5cdFx0fVxuXHRgXVxufSlcbmV4cG9ydCBjbGFzcyBTaWRlTmF2SXRlbSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cdC8qKlxuXHQgKiBMaW5rIGZvciB0aGUgaXRlbS4gTk9URTogKmRvIG5vdCogcGFzcyB1bnNhZmUgb3IgdW50cnVzdGVkIHZhbHVlcywgdGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBvcGVuIHlvdSB1cCB0byBYU1MgYXR0YWNrc1xuXHQgKi9cblx0QElucHV0KCkgc2V0IGhyZWYodjogc3RyaW5nKSB7XG5cdFx0Ly8gTmVlZGVkIHdoZW4gY29tcG9uZW50IGlzIGNyZWF0ZWQgZHluYW1pY2FsbHkgd2l0aCBhIG1vZGVsLlxuXHRcdGlmICh2ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5faHJlZiA9IHY7XG5cdH1cblxuXHRnZXQgaHJlZigpIHtcblx0XHRyZXR1cm4gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybCh0aGlzLl9ocmVmKSBhcyBzdHJpbmc7XG5cdH1cblxuXHQvKipcblx0ICogVXNlIHRoZSByb3V0ZXJMaW5rIGF0dHJpYnV0ZSBvbiA8YT4gdGFnIGZvciBuYXZpZ2F0aW9uIGluc3RlYWQgb2YgdXNpbmcgZXZlbnQgaGFuZGxlcnNcblx0ICovXG5cdEBJbnB1dCgpIHVzZVJvdXRlciA9IGZhbHNlO1xuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tc2lkZS1uYXZfX2l0ZW1cIikgZ2V0IHNpZGVOYXYoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmlzU3ViTWVudTtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tc2lkZS1uYXZfX21lbnUtaXRlbVwiKSBnZXQgbWVudUl0ZW0oKSB7XG5cdFx0cmV0dXJuIHRoaXMuaXNTdWJNZW51O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRvZ2dsZXMgdGhlIGFjdGl2ZSAoY3VycmVudCBwYWdlKSBzdGF0ZSBmb3IgdGhlIGxpbmsuXG5cdCAqL1xuXHRASW5wdXQoKSBhY3RpdmUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogQXJyYXkgb2YgY29tbWFuZHMgdG8gc2VuZCB0byB0aGUgcm91dGVyIHdoZW4gdGhlIGxpbmsgaXMgYWN0aXZhdGVkXG5cdCAqIFNlZTogaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9yb3V0ZXIvUm91dGVyI25hdmlnYXRlXG5cdCAqL1xuXHRASW5wdXQoKSByb3V0ZTogYW55W107XG5cblx0QElucHV0KCkgaXNTdWJNZW51ID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFJvdXRlciBvcHRpb25zLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHJvdXRlYFxuXHQgKiBTZWU6IGh0dHBzOi8vYW5ndWxhci5pby9hcGkvcm91dGVyL1JvdXRlciNuYXZpZ2F0ZVxuXHQgKi9cblx0QElucHV0KCkgcm91dGVFeHRyYXM6IGFueTtcblxuXHQvKipcblx0ICogVGl0bGUgYXR0cmlidXRlIG9mIHRoZSBhbmNob3IgZWxlbWVudC5cblx0ICovXG5cdEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEVtaXRzIHRoZSBuYXZpZ2F0aW9uIHN0YXR1cyBwcm9taXNlIHdoZW4gdGhlIGxpbmsgaXMgYWN0aXZhdGVkXG5cdCAqL1xuXHRAT3V0cHV0KCkgbmF2aWdhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvbWlzZTxib29sZWFuPj4oKTtcblxuXHQvKipcblx0ICogRW1pdHMgd2hlbiBgYWN0aXZlYCBpbnB1dCBpcyBjaGFuZ2VkLiBUaGlzIGlzIG1haW5seSB1c2VkIHRvIGluZGljYXRlIHRvIGFueSBwYXJlbnQgbWVudSBpdGVtcyB0aGF0IGFcblx0ICogY2hpbGQgc2lkZW5hdiBpdGVtIGlzIGFjdGl2ZSBvciBub3QgYWN0aXZlLlxuXHQgKi9cblx0QE91dHB1dCgpIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG5cdEBIb3N0QmluZGluZyhcImF0dHIucm9sZVwiKSByb2xlID0gXCJsaXN0aXRlbVwiO1xuXG5cdHByb3RlY3RlZCBfaHJlZiA9IFwiI1wiO1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplciwgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyKSB7fVxuXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcblx0XHRpZiAoY2hhbmdlcy5hY3RpdmUpIHtcblx0XHRcdHRoaXMuc2VsZWN0ZWQuZW1pdCh0aGlzLmFjdGl2ZSk7XG5cdFx0fVxuXHR9XG5cblx0bmF2aWdhdGUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcblx0XHRpZiAodGhpcy5yb3V0ZXIgJiYgdGhpcy5yb3V0ZSkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGNvbnN0IHN0YXR1cyA9IHRoaXMucm91dGVyLm5hdmlnYXRlKHRoaXMucm91dGUsIHRoaXMucm91dGVFeHRyYXMpO1xuXHRcdFx0dGhpcy5uYXZpZ2F0aW9uLmVtaXQoc3RhdHVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuX2hyZWYgPT09IFwiI1wiKSB7XG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fVxufVxuIl19