carbon-components-angular
Version:
Next generation components
320 lines • 26.7 kB
JavaScript
import { Component, Input, ContentChildren, Optional, Output, EventEmitter } from "@angular/core";
import { BreadcrumbItemComponent } from "./breadcrumb-item.component";
import * as i0 from "@angular/core";
import * as i1 from "carbon-components-angular/i18n";
import * as i2 from "@angular/router";
import * as i3 from "@angular/common";
import * as i4 from "carbon-components-angular/dialog";
import * as i5 from "carbon-components-angular/icon";
import * as i6 from "./breadcrumb-item.component";
const MINIMUM_OVERFLOW_THRESHOLD = 4;
/**
* Get started with importing the module:
*
* ```typescript
* import { BreadcrumbModule } from 'carbon-components-angular';
* ```
*
* [See demo](../../?path=/story/components-breadcrumb--basic)
*/
export class Breadcrumb {
constructor(i18n, router) {
this.i18n = i18n;
this.router = router;
this.noTrailingSlash = false;
/**
* Set to `sm` for compact breadcrumb text. Defaults to `md`.
*/
this.size = "md";
this.ariaLabel = this.i18n.get().BREADCRUMB.LABEL;
/**
* **Experimental**: Auto align menu tooltip position
*/
this.autoAlign = false;
this.description = this.i18n.get().BREADCRUMB.OVERFLOW_MENU_DESCRIPTION;
/**
* Emits the navigation status promise when the link is activated
*/
this.navigation = new EventEmitter();
this._skeleton = false;
}
set skeleton(value) {
this._skeleton = value;
this.updateChildren();
}
get skeleton() {
return this._skeleton;
}
set threshold(threshold) {
this._threshold = threshold;
if (isNaN(threshold) || threshold < MINIMUM_OVERFLOW_THRESHOLD) {
this._threshold = MINIMUM_OVERFLOW_THRESHOLD;
}
}
get threshold() {
return this._threshold;
}
get shouldShowContent() {
return !this.items;
}
get shouldShowOverflow() {
if (!this.items) {
return false;
}
return this.items.length > this.threshold;
}
get first() {
return this.shouldShowOverflow ? this.items[0] : null;
}
get overflowItems() {
return this.shouldShowOverflow ? this.items.slice(1, this.items.length - 2) : [];
}
get secondLast() {
return this.shouldShowOverflow ? this.items[this.items.length - 2] : null;
}
get last() {
return this.shouldShowOverflow ? this.items[this.items.length - 1] : null;
}
ngAfterContentInit() {
this.updateChildren();
}
navigate(event, item) {
if (this.router && item.route) {
event.preventDefault();
const status = this.router.navigate(item.route, item.routeExtras);
this.navigation.emit(status);
}
}
updateChildren() {
if (this.children) {
this.children.toArray().forEach(child => child.skeleton = this.skeleton);
}
}
}
Breadcrumb.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Breadcrumb, deps: [{ token: i1.I18n }, { token: i2.Router, optional: true }], target: i0.ɵɵFactoryTarget.Component });
Breadcrumb.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: Breadcrumb, selector: "cds-breadcrumb, ibm-breadcrumb", inputs: { items: "items", noTrailingSlash: "noTrailingSlash", size: "size", ariaLabel: "ariaLabel", skeleton: "skeleton", threshold: "threshold", autoAlign: "autoAlign", description: "description" }, outputs: { navigation: "navigation" }, queries: [{ propertyName: "children", predicate: BreadcrumbItemComponent }], ngImport: i0, template: `
<nav #nav class="cds--breadcrumb"
[ngClass]="{
'cds--skeleton' : skeleton,
'cds--breadcrumb--no-trailing-slash' : noTrailingSlash,
'cds--breadcrumb--sm' : size === 'sm'
}"
[attr.aria-label]="ariaLabel">
<ng-template [ngIf]="shouldShowContent">
<ng-content></ng-content>
</ng-template>
<ng-template [ngIf]="!shouldShowOverflow">
<cds-breadcrumb-item
*ngFor="let item of items"
[href]="item.href"
[route]="item.route"
[routeExtras]="item.routeExtras"
[current]="item.current"
[ariaCurrent]="item.ariaCurrent"
(navigation)="navigation.emit($event)">
<ng-container *ngIf="!item.template">{{item.content}}</ng-container>
<ng-template
*ngIf="item.template"
[ngTemplateOutlet]="item.template"
[ngTemplateOutletContext]="{ $implicit: item }">
</ng-template>
</cds-breadcrumb-item>
</ng-template>
<ng-template [ngIf]="shouldShowOverflow">
<cds-breadcrumb-item
[href]="first?.href"
[route]="first?.route"
[routeExtras]="first?.routeExtras"
[current]="first?.current"
[ariaCurrent]="first?.ariaCurrent"
(navigation)="navigation.emit($event)">
<ng-container *ngIf="!first?.template">{{first?.content}}</ng-container>
<ng-template
*ngIf="first?.template"
[ngTemplateOutlet]="first?.template"
[ngTemplateOutletContext]="{ $implicit: first }">
</ng-template>
</cds-breadcrumb-item>
<cds-breadcrumb-item>
<ng-template #overflowMenuTrigger>
<svg class="cds--overflow-menu__icon" cdsIcon="overflow-menu--horizontal" size="16"></svg>
</ng-template>
<cds-overflow-menu
[customTrigger]="overflowMenuTrigger"
triggerClass="cds--btn--icon-only"
[description]="description"
[autoAlign]="autoAlign">
<li class="cds--overflow-menu-options__option"
*ngFor="let item of overflowItems">
<a class="cds--overflow-menu-options__btn"
href="{{item?.href}}"
(click)="navigate($event, item)"
style="text-decoration: none;">
<ng-container *ngIf="!item?.template">{{item?.content}}</ng-container>
<ng-template
*ngIf="item?.template"
[ngTemplateOutlet]="item?.template"
[ngTemplateOutletContext]="{ $implicit: item }">
</ng-template>
</a>
</li>
</cds-overflow-menu>
</cds-breadcrumb-item>
<cds-breadcrumb-item
[href]="secondLast?.href"
[route]="secondLast?.route"
[routeExtras]="secondLast?.routeExtras"
[current]="secondLast?.current"
[ariaCurrent]="secondLast?.ariaCurrent"
(navigation)="navigation.emit($event)">
<ng-container *ngIf="!secondLast?.template">{{secondLast?.content}}</ng-container>
<ng-template
*ngIf="secondLast?.template"
[ngTemplateOutlet]="secondLast?.template"
[ngTemplateOutletContext]="{ $implicit: secondLast }">
</ng-template>
</cds-breadcrumb-item>
<cds-breadcrumb-item
[href]="last?.href"
[route]="last?.route"
[routeExtras]="last?.routeExtras"
[current]="last?.current"
[ariaCurrent]="last?.ariaCurrent"
(navigation)="navigation.emit($event)">
<ng-container *ngIf="!last?.template">{{last?.content}}</ng-container>
<ng-template
*ngIf="last?.template"
[ngTemplateOutlet]="last?.template"
[ngTemplateOutletContext]="{ $implicit: last }">
</ng-template>
</cds-breadcrumb-item>
</ng-template>
</nav>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.OverflowMenu, selector: "cds-overflow-menu, ibm-overflow-menu", inputs: ["buttonLabel", "description", "flip", "placement", "open", "customTrigger", "offset", "wrapperClass", "triggerClass"], outputs: ["openChange"] }, { kind: "directive", type: i5.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i6.BreadcrumbItemComponent, selector: "cds-breadcrumb-item, ibm-breadcrumb-item", inputs: ["href", "route", "routeExtras", "skeleton", "ariaCurrent", "current"], outputs: ["navigation"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Breadcrumb, decorators: [{
type: Component,
args: [{
selector: "cds-breadcrumb, ibm-breadcrumb",
template: `
<nav #nav class="cds--breadcrumb"
[ngClass]="{
'cds--skeleton' : skeleton,
'cds--breadcrumb--no-trailing-slash' : noTrailingSlash,
'cds--breadcrumb--sm' : size === 'sm'
}"
[attr.aria-label]="ariaLabel">
<ng-template [ngIf]="shouldShowContent">
<ng-content></ng-content>
</ng-template>
<ng-template [ngIf]="!shouldShowOverflow">
<cds-breadcrumb-item
*ngFor="let item of items"
[href]="item.href"
[route]="item.route"
[routeExtras]="item.routeExtras"
[current]="item.current"
[ariaCurrent]="item.ariaCurrent"
(navigation)="navigation.emit($event)">
<ng-container *ngIf="!item.template">{{item.content}}</ng-container>
<ng-template
*ngIf="item.template"
[ngTemplateOutlet]="item.template"
[ngTemplateOutletContext]="{ $implicit: item }">
</ng-template>
</cds-breadcrumb-item>
</ng-template>
<ng-template [ngIf]="shouldShowOverflow">
<cds-breadcrumb-item
[href]="first?.href"
[route]="first?.route"
[routeExtras]="first?.routeExtras"
[current]="first?.current"
[ariaCurrent]="first?.ariaCurrent"
(navigation)="navigation.emit($event)">
<ng-container *ngIf="!first?.template">{{first?.content}}</ng-container>
<ng-template
*ngIf="first?.template"
[ngTemplateOutlet]="first?.template"
[ngTemplateOutletContext]="{ $implicit: first }">
</ng-template>
</cds-breadcrumb-item>
<cds-breadcrumb-item>
<ng-template #overflowMenuTrigger>
<svg class="cds--overflow-menu__icon" cdsIcon="overflow-menu--horizontal" size="16"></svg>
</ng-template>
<cds-overflow-menu
[customTrigger]="overflowMenuTrigger"
triggerClass="cds--btn--icon-only"
[description]="description"
[autoAlign]="autoAlign">
<li class="cds--overflow-menu-options__option"
*ngFor="let item of overflowItems">
<a class="cds--overflow-menu-options__btn"
href="{{item?.href}}"
(click)="navigate($event, item)"
style="text-decoration: none;">
<ng-container *ngIf="!item?.template">{{item?.content}}</ng-container>
<ng-template
*ngIf="item?.template"
[ngTemplateOutlet]="item?.template"
[ngTemplateOutletContext]="{ $implicit: item }">
</ng-template>
</a>
</li>
</cds-overflow-menu>
</cds-breadcrumb-item>
<cds-breadcrumb-item
[href]="secondLast?.href"
[route]="secondLast?.route"
[routeExtras]="secondLast?.routeExtras"
[current]="secondLast?.current"
[ariaCurrent]="secondLast?.ariaCurrent"
(navigation)="navigation.emit($event)">
<ng-container *ngIf="!secondLast?.template">{{secondLast?.content}}</ng-container>
<ng-template
*ngIf="secondLast?.template"
[ngTemplateOutlet]="secondLast?.template"
[ngTemplateOutletContext]="{ $implicit: secondLast }">
</ng-template>
</cds-breadcrumb-item>
<cds-breadcrumb-item
[href]="last?.href"
[route]="last?.route"
[routeExtras]="last?.routeExtras"
[current]="last?.current"
[ariaCurrent]="last?.ariaCurrent"
(navigation)="navigation.emit($event)">
<ng-container *ngIf="!last?.template">{{last?.content}}</ng-container>
<ng-template
*ngIf="last?.template"
[ngTemplateOutlet]="last?.template"
[ngTemplateOutletContext]="{ $implicit: last }">
</ng-template>
</cds-breadcrumb-item>
</ng-template>
</nav>`
}]
}], ctorParameters: function () { return [{ type: i1.I18n }, { type: i2.Router, decorators: [{
type: Optional
}] }]; }, propDecorators: { children: [{
type: ContentChildren,
args: [BreadcrumbItemComponent]
}], items: [{
type: Input
}], noTrailingSlash: [{
type: Input
}], size: [{
type: Input
}], ariaLabel: [{
type: Input
}], skeleton: [{
type: Input
}], threshold: [{
type: Input
}], autoAlign: [{
type: Input
}], description: [{
type: Input
}], navigation: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnJlYWRjcnVtYi9icmVhZGNydW1iLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxlQUFlLEVBSWYsUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7Ozs7O0FBSXRFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO0FBRXJDOzs7Ozs7OztHQVFHO0FBc0dILE1BQU0sT0FBTyxVQUFVO0lBNkV0QixZQUFzQixJQUFVLEVBQXdCLE1BQWM7UUFBaEQsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUF3QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBeEU3RCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUVqQzs7V0FFRztRQUNNLFNBQUksR0FBZ0IsSUFBSSxDQUFDO1FBRXpCLGNBQVMsR0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUF3QjlEOztXQUVHO1FBQ00sY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixnQkFBVyxHQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDO1FBRXBGOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBOEJsRCxjQUFTLEdBQUcsS0FBSyxDQUFDO0lBRThDLENBQUM7SUEvRDNFLElBQ0ksUUFBUSxDQUFDLEtBQVU7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFD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RUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQWlHSDtpQkFDUDs7MEJBOEVtQyxRQUFROzRDQTVFRCxRQUFRO3NCQUFqRCxlQUFlO3VCQUFDLHVCQUF1QjtnQkFFL0IsS0FBSztzQkFBYixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0YsUUFBUTtzQkFEWCxLQUFLO2dCQVdGLFNBQVM7c0JBRFosS0FBSztnQkFlRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0ksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0SW5wdXQsXG5cdENvbnRlbnRDaGlsZHJlbixcblx0UXVlcnlMaXN0LFxuXHRBZnRlckNvbnRlbnRJbml0LFxuXHRUZW1wbGF0ZVJlZixcblx0T3B0aW9uYWwsXG5cdE91dHB1dCxcblx0RXZlbnRFbWl0dGVyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7IEJyZWFkY3J1bWJJdGVtIH0gZnJvbSBcIi4vYnJlYWRjcnVtYi1pdGVtLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgQnJlYWRjcnVtYkl0ZW1Db21wb25lbnQgfSBmcm9tIFwiLi9icmVhZGNydW1iLWl0ZW0uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBJMThuIH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvaTE4blwiO1xuXG5jb25zdCBNSU5JTVVNX09WRVJGTE9XX1RIUkVTSE9MRCA9IDQ7XG5cbi8qKlxuICogR2V0IHN0YXJ0ZWQgd2l0aCBpbXBvcnRpbmcgdGhlIG1vZHVsZTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBCcmVhZGNydW1iTW9kdWxlIH0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG4gKiBgYGBcbiAqXG4gKiBbU2VlIGRlbW9dKC4uLy4uLz9wYXRoPS9zdG9yeS9jb21wb25lbnRzLWJyZWFkY3J1bWItLWJhc2ljKVxuICovXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwiY2RzLWJyZWFkY3J1bWIsIGlibS1icmVhZGNydW1iXCIsXG5cdHRlbXBsYXRlOiBgXG5cdDxuYXYgI25hdiBjbGFzcz1cImNkcy0tYnJlYWRjcnVtYlwiXG5cdFx0W25nQ2xhc3NdPVwie1xuXHRcdFx0J2Nkcy0tc2tlbGV0b24nIDogc2tlbGV0b24sXG5cdFx0XHQnY2RzLS1icmVhZGNydW1iLS1uby10cmFpbGluZy1zbGFzaCcgOiBub1RyYWlsaW5nU2xhc2gsXG5cdFx0XHQnY2RzLS1icmVhZGNydW1iLS1zbScgOiBzaXplID09PSAnc20nXG5cdFx0fVwiXG5cdFx0W2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIj5cblx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwic2hvdWxkU2hvd0NvbnRlbnRcIj5cblx0XHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhc2hvdWxkU2hvd092ZXJmbG93XCI+XG5cdFx0XHQ8Y2RzLWJyZWFkY3J1bWItaXRlbVxuXHRcdFx0XHQqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiXG5cdFx0XHRcdFtocmVmXT1cIml0ZW0uaHJlZlwiXG5cdFx0XHRcdFtyb3V0ZV09XCJpdGVtLnJvdXRlXCJcblx0XHRcdFx0W3JvdXRlRXh0cmFzXT1cIml0ZW0ucm91dGVFeHRyYXNcIlxuXHRcdFx0XHRbY3VycmVudF09XCJpdGVtLmN1cnJlbnRcIlxuXHRcdFx0XHRbYXJpYUN1cnJlbnRdPVwiaXRlbS5hcmlhQ3VycmVudFwiXG5cdFx0XHRcdChuYXZpZ2F0aW9uKT1cIm5hdmlnYXRpb24uZW1pdCgkZXZlbnQpXCI+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS50ZW1wbGF0ZVwiPnt7aXRlbS5jb250ZW50fX08L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlXG5cdFx0XHRcdFx0Km5nSWY9XCJpdGVtLnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtLnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9jZHMtYnJlYWRjcnVtYi1pdGVtPlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNob3VsZFNob3dPdmVyZmxvd1wiPlxuXHRcdFx0PGNkcy1icmVhZGNydW1iLWl0ZW1cblx0XHRcdFx0W2hyZWZdPVwiZmlyc3Q/LmhyZWZcIlxuXHRcdFx0XHRbcm91dGVdPVwiZmlyc3Q/LnJvdXRlXCJcblx0XHRcdFx0W3JvdXRlRXh0cmFzXT1cImZpcnN0Py5yb3V0ZUV4dHJhc1wiXG5cdFx0XHRcdFtjdXJyZW50XT1cImZpcnN0Py5jdXJyZW50XCJcblx0XHRcdFx0W2FyaWFDdXJyZW50XT1cImZpcnN0Py5hcmlhQ3VycmVudFwiXG5cdFx0XHRcdChuYXZpZ2F0aW9uKT1cIm5hdmlnYXRpb24uZW1pdCgkZXZlbnQpXCI+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhZmlyc3Q/LnRlbXBsYXRlXCI+e3tmaXJzdD8uY29udGVudH19PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdCpuZ0lmPVwiZmlyc3Q/LnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJmaXJzdD8udGVtcGxhdGVcIlxuXHRcdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogZmlyc3QgfVwiPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9jZHMtYnJlYWRjcnVtYi1pdGVtPlxuXHRcdFx0PGNkcy1icmVhZGNydW1iLWl0ZW0+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSAjb3ZlcmZsb3dNZW51VHJpZ2dlcj5cblx0XHRcdFx0XHQ8c3ZnIGNsYXNzPVwiY2RzLS1vdmVyZmxvdy1tZW51X19pY29uXCIgY2RzSWNvbj1cIm92ZXJmbG93LW1lbnUtLWhvcml6b250YWxcIiBzaXplPVwiMTZcIj48L3N2Zz5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PGNkcy1vdmVyZmxvdy1tZW51XG5cdFx0XHRcdFx0W2N1c3RvbVRyaWdnZXJdPVwib3ZlcmZsb3dNZW51VHJpZ2dlclwiXG5cdFx0XHRcdFx0dHJpZ2dlckNsYXNzPVwiY2RzLS1idG4tLWljb24tb25seVwiXG5cdFx0XHRcdFx0W2Rlc2NyaXB0aW9uXT1cImRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHRbYXV0b0FsaWduXT1cImF1dG9BbGlnblwiPlxuXHRcdFx0XHRcdDxsaSBjbGFzcz1cImNkcy0tb3ZlcmZsb3ctbWVudS1vcHRpb25zX19vcHRpb25cIlxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IGl0ZW0gb2Ygb3ZlcmZsb3dJdGVtc1wiPlxuXHRcdFx0XHRcdFx0PGEgY2xhc3M9XCJjZHMtLW92ZXJmbG93LW1lbnUtb3B0aW9uc19fYnRuXCJcblx0XHRcdFx0XHRcdFx0aHJlZj1cInt7aXRlbT8uaHJlZn19XCJcblx0XHRcdFx0XHRcdFx0KGNsaWNrKT1cIm5hdmlnYXRlKCRldmVudCwgaXRlbSlcIlxuXHRcdFx0XHRcdFx0XHRzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogbm9uZTtcIj5cblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtPy50ZW1wbGF0ZVwiPnt7aXRlbT8uY29udGVudH19PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0XHRcdCpuZ0lmPVwiaXRlbT8udGVtcGxhdGVcIlxuXHRcdFx0XHRcdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW0/LnRlbXBsYXRlXCJcblx0XHRcdFx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPlxuXHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHRcdFx0PC9hPlxuXHRcdFx0XHRcdDwvbGk+XG5cdFx0XHRcdDwvY2RzLW92ZXJmbG93LW1lbnU+XG5cdFx0XHQ8L2Nkcy1icmVhZGNydW1iLWl0ZW0+XG5cdFx0XHQ8Y2RzLWJyZWFkY3J1bWItaXRlbVxuXHRcdFx0XHRbaHJlZl09XCJzZWNvbmRMYXN0Py5ocmVmXCJcblx0XHRcdFx0W3JvdXRlXT1cInNlY29uZExhc3Q/LnJvdXRlXCJcblx0XHRcdFx0W3JvdXRlRXh0cmFzXT1cInNlY29uZExhc3Q/LnJvdXRlRXh0cmFzXCJcblx0XHRcdFx0W2N1cnJlbnRdPVwic2Vjb25kTGFzdD8uY3VycmVudFwiXG5cdFx0XHRcdFthcmlhQ3VycmVudF09XCJzZWNvbmRMYXN0Py5hcmlhQ3VycmVudFwiXG5cdFx0XHRcdChuYXZpZ2F0aW9uKT1cIm5hdmlnYXRpb24uZW1pdCgkZXZlbnQpXCI+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2Vjb25kTGFzdD8udGVtcGxhdGVcIj57e3NlY29uZExhc3Q/LmNvbnRlbnR9fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGVcblx0XHRcdFx0XHQqbmdJZj1cInNlY29uZExhc3Q/LnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldF09XCJzZWNvbmRMYXN0Py50ZW1wbGF0ZVwiXG5cdFx0XHRcdFx0W25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBzZWNvbmRMYXN0IH1cIj5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvY2RzLWJyZWFkY3J1bWItaXRlbT5cblx0XHRcdDxjZHMtYnJlYWRjcnVtYi1pdGVtXG5cdFx0XHRcdFtocmVmXT1cImxhc3Q/LmhyZWZcIlxuXHRcdFx0XHRbcm91dGVdPVwibGFzdD8ucm91dGVcIlxuXHRcdFx0XHRbcm91dGVFeHRyYXNdPVwibGFzdD8ucm91dGVFeHRyYXNcIlxuXHRcdFx0XHRbY3VycmVudF09XCJsYXN0Py5jdXJyZW50XCJcblx0XHRcdFx0W2FyaWFDdXJyZW50XT1cImxhc3Q/LmFyaWFDdXJyZW50XCJcblx0XHRcdFx0KG5hdmlnYXRpb24pPVwibmF2aWdhdGlvbi5lbWl0KCRldmVudClcIj5cblx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0Py50ZW1wbGF0ZVwiPnt7bGFzdD8uY29udGVudH19PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdCpuZ0lmPVwibGFzdD8udGVtcGxhdGVcIlxuXHRcdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhc3Q/LnRlbXBsYXRlXCJcblx0XHRcdFx0XHRbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGxhc3QgfVwiPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9jZHMtYnJlYWRjcnVtYi1pdGVtPlxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdDwvbmF2PmBcbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuXHRAQ29udGVudENoaWxkcmVuKEJyZWFkY3J1bWJJdGVtQ29tcG9uZW50KSBjaGlsZHJlbjogUXVlcnlMaXN0PEJyZWFkY3J1bWJJdGVtQ29tcG9uZW50PjtcblxuXHRASW5wdXQoKSBpdGVtczogQXJyYXk8QnJlYWRjcnVtYkl0ZW0+O1xuXG5cdEBJbnB1dCgpIG5vVHJhaWxpbmdTbGFzaCA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBTZXQgdG8gYHNtYCBmb3IgY29tcGFjdCBicmVhZGNydW1iIHRleHQuIERlZmF1bHRzIHRvIGBtZGAuXG5cdCAqL1xuXHRASW5wdXQoKSBzaXplOiBcInNtXCIgfCBcIm1kXCIgPSBcIm1kXCI7XG5cblx0QElucHV0KCkgYXJpYUxhYmVsOiBzdHJpbmcgPSB0aGlzLmkxOG4uZ2V0KCkuQlJFQURDUlVNQi5MQUJFTDtcblxuXHRASW5wdXQoKVxuXHRzZXQgc2tlbGV0b24odmFsdWU6IGFueSkge1xuXHRcdHRoaXMuX3NrZWxldG9uID0gdmFsdWU7XG5cdFx0dGhpcy51cGRhdGVDaGlsZHJlbigpO1xuXHR9XG5cblx0Z2V0IHNrZWxldG9uKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuX3NrZWxldG9uO1xuXHR9XG5cblx0QElucHV0KClcblx0c2V0IHRocmVzaG9sZCh0aHJlc2hvbGQ6IG51bWJlcikge1xuXHRcdHRoaXMuX3RocmVzaG9sZCA9IHRocmVzaG9sZDtcblx0XHRpZiAoaXNOYU4odGhyZXNob2xkKSB8fCB0aHJlc2hvbGQgPCBNSU5JTVVNX09WRVJGTE9XX1RIUkVTSE9MRCkge1xuXHRcdFx0dGhpcy5fdGhyZXNob2xkID0gTUlOSU1VTV9PVkVSRkxPV19USFJFU0hPTEQ7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IHRocmVzaG9sZCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl90aHJlc2hvbGQ7XG5cdH1cblxuXHQvKipcblx0ICogKipFeHBlcmltZW50YWwqKjogQXV0byBhbGlnbiBtZW51IHRvb2x0aXAgcG9zaXRpb25cblx0ICovXG5cdEBJbnB1dCgpIGF1dG9BbGlnbiA9IGZhbHNlO1xuXHRASW5wdXQoKSBkZXNjcmlwdGlvbjogc3RyaW5nID0gdGhpcy5pMThuLmdldCgpLkJSRUFEQ1JVTUIuT1ZFUkZMT1dfTUVOVV9ERVNDUklQVElPTjtcblxuXHQvKipcblx0ICogRW1pdHMgdGhlIG5hdmlnYXRpb24gc3RhdHVzIHByb21pc2Ugd2hlbiB0aGUgbGluayBpcyBhY3RpdmF0ZWRcblx0ICovXG5cdEBPdXRwdXQoKSBuYXZpZ2F0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9taXNlPGJvb2xlYW4+PigpO1xuXG5cdGdldCBzaG91bGRTaG93Q29udGVudCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gIXRoaXMuaXRlbXM7XG5cdH1cblxuXHRnZXQgc2hvdWxkU2hvd092ZXJmbG93KCk6IGJvb2xlYW4ge1xuXHRcdGlmICghdGhpcy5pdGVtcykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGggPiB0aGlzLnRocmVzaG9sZDtcblx0fVxuXG5cdGdldCBmaXJzdCgpOiBCcmVhZGNydW1iSXRlbSB7XG5cdFx0cmV0dXJuIHRoaXMuc2hvdWxkU2hvd092ZXJmbG93ID8gdGhpcy5pdGVtc1swXSA6IG51bGw7XG5cdH1cblxuXHRnZXQgb3ZlcmZsb3dJdGVtcygpOiBBcnJheTxCcmVhZGNydW1iSXRlbT4ge1xuXHRcdHJldHVybiB0aGlzLnNob3VsZFNob3dPdmVyZmxvdyA/IHRoaXMuaXRlbXMuc2xpY2UoMSwgdGhpcy5pdGVtcy5sZW5ndGggLSAyKSA6IFtdO1xuXHR9XG5cblx0Z2V0IHNlY29uZExhc3QoKTogQnJlYWRjcnVtYkl0ZW0ge1xuXHRcdHJldHVybiB0aGlzLnNob3VsZFNob3dPdmVyZmxvdyA/IHRoaXMuaXRlbXNbdGhpcy5pdGVtcy5sZW5ndGggLSAyXSA6IG51bGw7XG5cdH1cblxuXHRnZXQgbGFzdCgpOiBCcmVhZGNydW1iSXRlbSB7XG5cdFx0cmV0dXJuIHRoaXMuc2hvdWxkU2hvd092ZXJmbG93ID8gdGhpcy5pdGVtc1t0aGlzLml0ZW1zLmxlbmd0aCAtIDFdIDogbnVsbDtcblx0fVxuXG5cdHByb3RlY3RlZCBfdGhyZXNob2xkOiBudW1iZXI7XG5cdHByb3RlY3RlZCBfc2tlbGV0b24gPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaTE4bjogSTE4biwgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyKSB7IH1cblxuXHRuZ0FmdGVyQ29udGVudEluaXQoKSB7XG5cdFx0dGhpcy51cGRhdGVDaGlsZHJlbigpO1xuXHR9XG5cblx0bmF2aWdhdGUoZXZlbnQsIGl0ZW06IEJyZWFkY3J1bWJJdGVtKSB7XG5cdFx0aWYgKHRoaXMucm91dGVyICYmIGl0ZW0ucm91dGUpIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRjb25zdCBzdGF0dXMgPSB0aGlzLnJvdXRlci5uYXZpZ2F0ZShpdGVtLnJvdXRlLCBpdGVtLnJvdXRlRXh0cmFzKTtcblx0XHRcdHRoaXMubmF2aWdhdGlvbi5lbWl0KHN0YXR1cyk7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIHVwZGF0ZUNoaWxkcmVuKCkge1xuXHRcdGlmICh0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLnRvQXJyYXkoKS5mb3JFYWNoKGNoaWxkID0+IGNoaWxkLnNrZWxldG9uID0gdGhpcy5za2VsZXRvbik7XG5cdFx0fVxuXHR9XG59XG4iXX0=