@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
804 lines • 69.6 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { CommonModule } from '@angular/common';
import { AfterContentInit, AfterViewChecked, AfterViewInit, Component, ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, NgModule, Output, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
import { IgxBadgeModule } from '../badge/badge.component';
import { IgxIconModule } from '../icon/index';
var NEXT_ID = 0;
var IgxTabTemplateDirective = /** @class */ (function () {
function IgxTabTemplateDirective(template) {
this.template = template;
}
IgxTabTemplateDirective.ctorParameters = function () { return [
{ type: TemplateRef }
]; };
IgxTabTemplateDirective = __decorate([
Directive({
selector: '[igxTab]'
}),
__metadata("design:paramtypes", [TemplateRef])
], IgxTabTemplateDirective);
return IgxTabTemplateDirective;
}());
export { IgxTabTemplateDirective };
/**
* **Ignite UI for Angular Tab Bar** -
* [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/tabbar.html)
*
* The Ignite UI Tab Bar enables the user to navigate among a number of content panels displayed in a single view.
*
* Example:
* ```html
* <igx-bottom-nav>
* <igx-tab-panel label="Tab 1">Tab 1 Content</igx-tab-panel>
* <igx-tab-panel label="Tab 2">Tab 2 Content</igx-tab-panel>
* <igx-tab-panel label="Tab 3">Tab 3 Content</igx-tab-panel>
* </igx-bottom-nav>
* ```
*/
var IgxBottomNavComponent = /** @class */ (function () {
function IgxBottomNavComponent(_element) {
this._element = _element;
/**
* Sets/gets the `id` of the tab bar.
* If not set, the `id` of the first tab bar component will be `"igx-bottom-nav-0"`.
* ```html
* <igx-bottom-nav id = "my-first-tab-bar"></igx-bottom-nav>
* ```
* ```typescript
* let tabBarId = this.tabBar.id;
* ```
* @memberof IgxBottomNavComponent
*/
this.id = "igx-bottom-nav-" + NEXT_ID++;
/**
* Emits an event when a new tab is selected.
* Provides references to the `IgxTabComponent` and `IgxTabPanelComponent` as event arguments.
* ```html
* <igx-bottom-nav (onTableSelected) = "onTabSelected($event)"><igx-bottom-nav>
* ```
* @memberof IgxBottomNavComponent
*/
this.onTabSelected = new EventEmitter();
/**
* Emits an event when a tab is deselected.
* Provides references to the `IgxTabComponent` and `IgxTabPanelComponent` as event arguments.
* ```html
* <igx-bottom-nav (onTabDeselected) = "onTabDeselected($event)"><igx-bottom-nav>
* ```
* @memberof IgxBottomNavComponent
*/
this.onTabDeselected = new EventEmitter();
/**
* Gets the `index` of selected tab/panel in the respective collection.
* ```typescript
* let index = this.tabBar.selectedIndex;
* ```
* @memberof IgxBottomNavComponent
*/
this.selectedIndex = -1;
/**
*@hidden
*/
this._itemStyle = 'igx-bottom-nav';
}
Object.defineProperty(IgxBottomNavComponent.prototype, "tabs", {
/**
* Gets the `IgxTabComponent` elements for this bottom navigation component.
* First try to get them as content children if not available get them as view children.
* ```typescript
* let tabs: QueryList<IgxTabComponent> = this.tabBar.tabs;
* ```
* @memberof IgxBottomNavComponent
*/
get: function () {
return this.hasContentTabs ? this.contentTabs : this.viewTabs;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxBottomNavComponent.prototype, "itemStyle", {
/**
* Gets the `itemStyle` of the tab bar.
* ```typescript
* let itemStyle = this.tabBar.itemStyle;
* ```
* @memberof IgxBottomNavComponent
*/
get: function () {
return this._itemStyle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxBottomNavComponent.prototype, "hasContentTabs", {
/**
*@hidden
*/
get: function () {
return (this.contentTabs && this.contentTabs.length > 0);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxBottomNavComponent.prototype, "selectedTab", {
/**
* Gets the selected tab in the tab bar.
* ```typescript
* let tab = this.tabBar.selectedTab;
* ```
* @memberof IgxBottomNavComponent
*/
get: function () {
if (this.tabs && this.selectedIndex !== undefined) {
return this.tabs.toArray()[this.selectedIndex];
}
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxBottomNavComponent.prototype.ngAfterViewInit = function () {
var _this = this;
// initial selection
setTimeout(function () {
if (_this.selectedIndex === -1) {
var selectablePanels = _this.panels.filter(function (p) { return !p.disabled; });
var panel = selectablePanels[0];
if (panel) {
panel.select();
}
}
}, 0);
};
/**
*@hidden
*/
IgxBottomNavComponent.prototype._selectedPanelHandler = function (args) {
var _this = this;
if (this.hasContentTabs) {
this.selectedIndex = args.tab.index;
this.contentTabs.forEach(function (t) {
if (t !== args.tab) {
_this._deselectTab(t);
}
});
}
else {
if (args.panel) {
this.selectedIndex = args.panel.index;
this.panels.forEach(function (p) {
if (p.index !== _this.selectedIndex) {
_this._deselectPanel(p);
}
});
}
}
};
/**
*@hidden
*/
IgxBottomNavComponent.prototype._deselectPanel = function (panel) {
// Cannot deselect the selected tab - this will mean that there will be not selected tab left
if (panel.disabled || this.selectedTab.index === panel.index) {
return;
}
panel.isSelected = false;
this.onTabDeselected.emit({ tab: this.tabs[panel.index], panel: panel });
};
IgxBottomNavComponent.prototype._deselectTab = function (aTab) {
aTab.isSelected = false;
this.onTabDeselected.emit({ tab: aTab, panel: null });
};
IgxBottomNavComponent.ctorParameters = function () { return [
{ type: ElementRef }
]; };
__decorate([
ViewChildren(forwardRef(function () { return IgxTabComponent; })),
__metadata("design:type", QueryList)
], IgxBottomNavComponent.prototype, "viewTabs", void 0);
__decorate([
ContentChildren(forwardRef(function () { return IgxTabComponent; })),
__metadata("design:type", QueryList)
], IgxBottomNavComponent.prototype, "contentTabs", void 0);
__decorate([
ContentChildren(forwardRef(function () { return IgxTabPanelComponent; })),
__metadata("design:type", QueryList)
], IgxBottomNavComponent.prototype, "panels", void 0);
__decorate([
HostBinding('attr.id'),
Input(),
__metadata("design:type", Object)
], IgxBottomNavComponent.prototype, "id", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxBottomNavComponent.prototype, "onTabSelected", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxBottomNavComponent.prototype, "onTabDeselected", void 0);
__decorate([
HostListener('onTabSelected', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxBottomNavComponent.prototype, "_selectedPanelHandler", null);
IgxBottomNavComponent = __decorate([
Component({
selector: 'igx-bottom-nav',
template: "<div *ngIf=\"!hasContentTabs\">\n <ng-content></ng-content>\n</div>\n<div #tablist class=\"{{itemStyle}}__menu {{itemStyle}}__menu--bottom\" role=\"tablist\" aria-orientation=\"horizontal\">\n <ng-container *ngIf=\"!hasContentTabs\"> \n <igx-tab *ngFor=\"let panel of panels\" [relatedPanel]=\"panel\">\n </igx-tab>\n </ng-container>\n <ng-content select=\"igx-tab\"></ng-content>\n</div>",
styles: ["\n :host {\n display: block;\n }\n "]
}),
__metadata("design:paramtypes", [ElementRef])
], IgxBottomNavComponent);
return IgxBottomNavComponent;
}());
export { IgxBottomNavComponent };
// ================================= IgxTabPanelComponent ======================================
var IgxTabPanelComponent = /** @class */ (function () {
function IgxTabPanelComponent(_tabBar, _element) {
this._tabBar = _tabBar;
this._element = _element;
/**
*@hidden
*/
this._itemStyle = 'igx-tab-panel';
/**
*@hidden
*/
this._isSelected = false;
/**
* Gets the role of the tab panel.
* ```typescript
* let tabPanelRole = this.tabPanel.role;
* ```
* @memberof IgxTabPanelComponent
*/
this.role = 'tabpanel';
}
Object.defineProperty(IgxTabPanelComponent.prototype, "styleClass", {
/**
* Gets whether a tab panel will have `igx-bottom-nav__panel` class.
* ```typescript
* let styleClass = this.tabPanel.styleClass;
* ```
* @memberof IgxTabPanelComponent
*/
get: function () {
return (!this.isSelected);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabPanelComponent.prototype, "isSelected", {
/**
* Sets/gets whether a tab panel is selected.
* ```typescript
* this.tabPanel.isSelected = true;
* ```
* ```typescript
* let isSelected = this.tabPanel.isSelected;
* ```
* @memberof IgxTabPanelComponent
*/
get: function () {
return this._isSelected;
},
set: function (newValue) {
if (this._isSelected !== newValue) {
if (newValue) {
this.select();
}
else {
this._isSelected = newValue;
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabPanelComponent.prototype, "itemStyle", {
/**
* Gets the `itemStyle` of the tab panel.
* ```typescript
* let itemStyle = this.tabPanel.itemStyle;
* ```
* @memberof IgxTabPanelComponent
*/
get: function () {
return this._itemStyle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabPanelComponent.prototype, "relatedTab", {
/**
* Gets the tab associated with the panel.
* ```typescript
* let tab = this.tabPanel.relatedTab;
* ```
* @memberof IgxTabPanelComponent
*/
get: function () {
if (this._tabBar.tabs) {
return this._tabBar.tabs.toArray()[this.index];
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabPanelComponent.prototype, "changesCount", {
/**
* Gets the changes and updates accordingly applied to the tab/panel.
*
* @memberof IgxTabComponent
*/
get: function () {
return this.relatedTab ? this.relatedTab.changesCount : 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabPanelComponent.prototype, "index", {
/**
* Gets the index of a panel in the panels collection.
* ```typescript
* let panelIndex = this.tabPanel.index
* ```
* @memberof IgxTabPanelComponent
*/
get: function () {
if (this._tabBar.panels) {
return this._tabBar.panels.toArray().indexOf(this);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabPanelComponent.prototype, "customTabTemplate", {
/**
* Gets the tab template.
* ```typescript
* let tabTemplate = this.tabPanel.customTabTemplate
* ```
* @memberof IgxTabPanelComponent
*/
get: function () {
return this._tabTemplate;
},
/**
* Sets the tab template.
* ```typescript
* this.tabPanel.customTabTemplate(tabTemplate);
* ```
* @memberof IgxTabPanelComponent
*/
set: function (template) {
this._tabTemplate = template;
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxTabPanelComponent.prototype.ngAfterContentInit = function () {
if (this.tabTemplate) {
this._tabTemplate = this.tabTemplate.template;
}
};
/**
*@hidden
*/
IgxTabPanelComponent.prototype.ngAfterViewChecked = function () {
this._element.nativeElement.setAttribute('aria-labelledby', "igx-tab-" + this.index);
this._element.nativeElement.setAttribute('id', "igx-bottom-nav__panel-" + this.index);
};
/**
* Selects the current tab and the tab panel.
* ```typescript
* this.tabPanel.select();
* ```
* @memberof IgxTabPanelComponent
*/
IgxTabPanelComponent.prototype.select = function () {
if (this.disabled || this._tabBar.selectedIndex === this.index) {
return;
}
this._isSelected = true;
this._tabBar.onTabSelected.emit({ tab: this._tabBar.tabs.toArray()[this.index], panel: this });
};
IgxTabPanelComponent.ctorParameters = function () { return [
{ type: IgxBottomNavComponent },
{ type: ElementRef }
]; };
__decorate([
Input(),
__metadata("design:type", String)
], IgxTabPanelComponent.prototype, "label", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], IgxTabPanelComponent.prototype, "icon", void 0);
__decorate([
Input(),
__metadata("design:type", Boolean)
], IgxTabPanelComponent.prototype, "disabled", void 0);
__decorate([
HostBinding('attr.role'),
__metadata("design:type", Object)
], IgxTabPanelComponent.prototype, "role", void 0);
__decorate([
HostBinding('class.igx-bottom-nav__panel'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxTabPanelComponent.prototype, "styleClass", null);
__decorate([
HostBinding('class.igx-bottom-nav__panel--selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxTabPanelComponent.prototype, "isSelected", null);
__decorate([
ContentChild(IgxTabTemplateDirective, { read: IgxTabTemplateDirective }),
__metadata("design:type", IgxTabTemplateDirective)
], IgxTabPanelComponent.prototype, "tabTemplate", void 0);
IgxTabPanelComponent = __decorate([
Component({
selector: 'igx-tab-panel',
template: "<ng-content></ng-content>\n"
}),
__metadata("design:paramtypes", [IgxBottomNavComponent, ElementRef])
], IgxTabPanelComponent);
return IgxTabPanelComponent;
}());
export { IgxTabPanelComponent };
// ======================================= IgxTabComponent ==========================================
var IgxTabComponent = /** @class */ (function () {
function IgxTabComponent(_tabBar, _element) {
this._tabBar = _tabBar;
this._element = _element;
/**
* Gets the `role` attribute.
* ```typescript
* let tabRole = this.tab.role;
* ```
* @memberof IgxTabComponent
*/
this.role = 'tab';
/**
* @hidden @internal
*/
this.id = 'igx-tab-' + this.index;
/**
* @hidden @internal
*/
this.ariaLabel = this.label;
/**
* @hidden @internal
*/
this.ariaDisabled = this.disabled;
/**
* @hidden @internal
*/
this.ariaSelected = this.isSelected;
/**
* @hidden @internal
*/
this.ariaControls = 'igx-tab-panel-' + this.index;
/**
*@hidden
*/
this._changesCount = 0; // changes and updates accordingly applied to the tab.
this._disabled = false;
this._selected = false;
}
Object.defineProperty(IgxTabComponent.prototype, "label", {
/**
* Sets/gets the `label` of the tab panel.
* ```html
* <igx-tab [label] = "'Tab label'"><igx-tab>
* ```
* ```typescript
* let tabLabel = this.tab.label;
* ```
* @memberof IgxTabComponent
*/
get: function () {
return this.relatedPanel ? this.relatedPanel.label : this._label;
},
set: function (newValue) {
if (this.relatedPanel) {
this.relatedPanel.label = newValue;
}
this._label = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "icon", {
/**
* Sets/gets the `icon` of the tab panel.
* ```html
* <igx-tab [icon] = "tab_icon"><igx-tab>
* ```
* ```typescript
* let tabIcon = this.tab.icon;
* ```
* @memberof IgxTabComponent
*/
get: function () {
return this.relatedPanel ? this.relatedPanel.icon : this._icon;
},
set: function (newValue) {
if (this.relatedPanel) {
this.relatedPanel.icon = newValue;
}
this._icon = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "changesCount", {
/**
* Gets the changes and updates accordingly applied to the tab.
*
* @memberof IgxTabComponent
*/
get: function () {
return this._changesCount;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "disabled", {
/**
* Gets whether the tab is disabled.
* ```typescript
* let isDisabled = this.tab.disabled;
* ```
* @memberof IgxTabComponent
*/
get: function () {
return this.relatedPanel ? this.relatedPanel.disabled : this._disabled;
},
set: function (newValue) {
if (this.relatedPanel) {
this.relatedPanel.disabled = newValue;
}
else {
this._disabled = newValue;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "isSelected", {
get: function () {
return this.relatedPanel ? this.relatedPanel.isSelected : this._selected;
},
/**
* Gets whether the tab is selected.
* ```typescript
* let isSelected = this.tab.isSelected;
* ```
* @memberof IgxTabComponent
*/
set: function (newValue) {
if (this.relatedPanel) {
this.relatedPanel.isSelected = newValue;
}
else if (this._selected !== newValue) {
this._selected = newValue;
if (this._selected) {
this._tabBar.onTabSelected.emit({ tab: this, panel: null });
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "cssClassSelected", {
get: function () {
return this.isSelected;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "cssClassDisabled", {
get: function () {
return this.disabled;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "cssClass", {
get: function () {
return (!this.disabled && !this.isSelected);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "index", {
/**
* Gets the `index` of the tab.
* ```typescript
* let tabIndex = this.tab.index;
* ```
* @memberof IgxTabComponent
*/
get: function () {
if (this._tabBar.tabs) {
return this._tabBar.tabs.toArray().indexOf(this);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "template", {
/**
* Returns the `template` for this IgxTabComponent.
* ```typescript
* let tabItemTemplate = this.tabItem.template;
* ```
* @memberof IgxTabComponent
*/
get: function () {
if (this.relatedPanel && this.relatedPanel.customTabTemplate) {
return this.relatedPanel.customTabTemplate;
}
if (this.customTabTemplateDir) {
return this.customTabTemplateDir.template;
}
return this.defaultTabTemplate;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxTabComponent.prototype, "context", {
/**
* Returns the `context` object for the template of this `IgxTabComponent`.
* ```typescript
* let tabItemContext = this.tabItem.context;
* ```
*/
get: function () {
return this.relatedPanel ? this.relatedPanel : this;
},
enumerable: true,
configurable: true
});
/**
* Selects the current tab and the associated panel.
* ```typescript
* this.tab.select();
* ```
* @memberof IgxTabComponent
*/
IgxTabComponent.prototype.select = function () {
if (this.relatedPanel) {
this.relatedPanel.select();
}
else {
this._selected = true;
this._tabBar.onTabSelected.emit({ tab: this, panel: null });
}
};
/**
* @hidden
*/
IgxTabComponent.prototype.onClick = function () {
this.select();
};
IgxTabComponent.prototype.elementRef = function () {
return this._element;
};
IgxTabComponent.ctorParameters = function () { return [
{ type: IgxBottomNavComponent },
{ type: ElementRef }
]; };
__decorate([
HostBinding('attr.role'),
__metadata("design:type", Object)
], IgxTabComponent.prototype, "role", void 0);
__decorate([
HostBinding('attr.id'),
__metadata("design:type", Object)
], IgxTabComponent.prototype, "id", void 0);
__decorate([
HostBinding('attr.aria-label'),
__metadata("design:type", Object)
], IgxTabComponent.prototype, "ariaLabel", void 0);
__decorate([
HostBinding('attr.aria-disabled'),
__metadata("design:type", Object)
], IgxTabComponent.prototype, "ariaDisabled", void 0);
__decorate([
HostBinding('attr.aria-selected'),
__metadata("design:type", Object)
], IgxTabComponent.prototype, "ariaSelected", void 0);
__decorate([
HostBinding('attr.aria-controls'),
__metadata("design:type", Object)
], IgxTabComponent.prototype, "ariaControls", void 0);
__decorate([
Input(),
__metadata("design:type", IgxTabPanelComponent)
], IgxTabComponent.prototype, "relatedPanel", void 0);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxTabComponent.prototype, "label", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxTabComponent.prototype, "icon", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxTabComponent.prototype, "disabled", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxTabComponent.prototype, "isSelected", null);
__decorate([
HostBinding('class.igx-bottom-nav__menu-item--selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxTabComponent.prototype, "cssClassSelected", null);
__decorate([
HostBinding('class.igx-bottom-nav__menu-item--disabled'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxTabComponent.prototype, "cssClassDisabled", null);
__decorate([
HostBinding('class.igx-bottom-nav__menu-item'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxTabComponent.prototype, "cssClass", null);
__decorate([
ViewChild('defaultTabTemplate', { read: TemplateRef, static: true }),
__metadata("design:type", TemplateRef)
], IgxTabComponent.prototype, "defaultTabTemplate", void 0);
__decorate([
ContentChild(IgxTabTemplateDirective, { read: IgxTabTemplateDirective }),
__metadata("design:type", IgxTabTemplateDirective)
], IgxTabComponent.prototype, "customTabTemplateDir", void 0);
__decorate([
HostListener('click'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxTabComponent.prototype, "onClick", null);
IgxTabComponent = __decorate([
Component({
selector: 'igx-tab',
template: "<ng-template #defaultTabTemplate let-context>\n <div *ngIf=\"context.icon\" class=\"tab-icon\">\n <igx-icon fontSet=\"material\">{{context.icon}}</igx-icon>\n <igx-badge [value]=\"context.changesCount\" [hidden]=\"context.changesCount === 0\"></igx-badge>\n </div>\n <div *ngIf=\"context.label\" ngClass=\"tab-label\">{{context.label}}</div>\n</ng-template>\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this.context }\">\n</ng-container>"
}),
__metadata("design:paramtypes", [IgxBottomNavComponent, ElementRef])
], IgxTabComponent);
return IgxTabComponent;
}());
export { IgxTabComponent };
/**
* @hidden
*/
var IgxBottomNavModule = /** @class */ (function () {
function IgxBottomNavModule() {
}
IgxBottomNavModule = __decorate([
NgModule({
declarations: [IgxBottomNavComponent, IgxTabPanelComponent, IgxTabComponent, IgxTabTemplateDirective],
exports: [IgxBottomNavComponent, IgxTabPanelComponent, IgxTabComponent, IgxTabTemplateDirective],
imports: [CommonModule, IgxBadgeModule, IgxIconModule]
})
], IgxBottomNavModule);
return IgxBottomNavModule;
}());
export { IgxBottomNavModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvdGFiYmFyL3RhYmJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUTlDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQUtoQjtJQUVJLGlDQUFtQixRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtJQUM3QyxDQUFDOztnQkFENEIsV0FBVzs7SUFGL0IsdUJBQXVCO1FBSG5DLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxVQUFVO1NBQ3ZCLENBQUM7eUNBRytCLFdBQVc7T0FGL0IsdUJBQXVCLENBSW5DO0lBQUQsOEJBQUM7Q0FBQSxBQUpELElBSUM7U0FKWSx1QkFBdUI7QUFLcEM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFVSDtJQTRISSwrQkFBb0IsUUFBb0I7UUFBcEIsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQWhGeEM7Ozs7Ozs7Ozs7V0FVRztRQUdJLE9BQUUsR0FBRyxvQkFBa0IsT0FBTyxFQUFJLENBQUM7UUFFMUM7Ozs7Ozs7V0FPRztRQUNjLGtCQUFhLEdB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bW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hCYWRnZU1vZHVsZSB9IGZyb20gJy4uL2JhZGdlL2JhZGdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hJY29uTW9kdWxlIH0gZnJvbSAnLi4vaWNvbi9pbmRleCc7XG5pbXBvcnQgeyBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWxlY3RUYWJFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgdGFiOiBJZ3hUYWJDb21wb25lbnQ7XG4gICAgcGFuZWw6IElneFRhYlBhbmVsQ29tcG9uZW50O1xufVxuXG5sZXQgTkVYVF9JRCA9IDA7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneFRhYl0nXG59KVxuZXhwb3J0IGNsYXNzIElneFRhYlRlbXBsYXRlRGlyZWN0aXZlIHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIH1cbn1cbi8qKlxuICogKipJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgVGFiIEJhcioqIC1cbiAqIFtEb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5pbmZyYWdpc3RpY3MuY29tL3Byb2R1Y3RzL2lnbml0ZS11aS1hbmd1bGFyL2FuZ3VsYXIvY29tcG9uZW50cy90YWJiYXIuaHRtbClcbiAqXG4gKiBUaGUgSWduaXRlIFVJIFRhYiBCYXIgZW5hYmxlcyB0aGUgdXNlciB0byBuYXZpZ2F0ZSBhbW9uZyBhIG51bWJlciBvZiBjb250ZW50IHBhbmVscyBkaXNwbGF5ZWQgaW4gYSBzaW5nbGUgdmlldy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgaHRtbFxuICogPGlneC1ib3R0b20tbmF2PlxuICogICA8aWd4LXRhYi1wYW5lbCBsYWJlbD1cIlRhYiAxXCI+VGFiIDEgQ29udGVudDwvaWd4LXRhYi1wYW5lbD5cbiAqICAgPGlneC10YWItcGFuZWwgbGFiZWw9XCJUYWIgMlwiPlRhYiAyIENvbnRlbnQ8L2lneC10YWItcGFuZWw+XG4gKiAgIDxpZ3gtdGFiLXBhbmVsIGxhYmVsPVwiVGFiIDNcIj5UYWIgMyBDb250ZW50PC9pZ3gtdGFiLXBhbmVsPlxuICogPC9pZ3gtYm90dG9tLW5hdj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1ib3R0b20tbmF2JyxcbiAgICB0ZW1wbGF0ZVVybDogJ3RhYi1iYXItY29udGVudC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgIGBdXG59KVxuZXhwb3J0IGNsYXNzIElneEJvdHRvbU5hdkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYElneFRhYkNvbXBvbmVudGAgZWxlbWVudHMgaW4gdGhlIHRhYiBiYXIgY29tcG9uZW50IGNyZWF0ZWQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhbmVscy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRhYnM6IFF1ZXJ5TGlzdDxJZ3hUYWJDb21wb25lbnQ+ID0gIHRoaXMudGFiQmFyLnZpZXdUYWJzO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hCb3R0b21OYXZDb21wb25lbnRcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gSWd4VGFiQ29tcG9uZW50KSlcbiAgICBwdWJsaWMgdmlld1RhYnM6IFF1ZXJ5TGlzdDxJZ3hUYWJDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYElneFRhYkNvbXBvbmVudGAgZWxlbWVudHMgaW4gdGhlIHRhYiBiYXIgY29tcG9uZW50IGRlZmluZWQgYXMgY29udGVudCBjaGlsZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRhYnM6IFF1ZXJ5TGlzdDxJZ3hUYWJDb21wb25lbnQ+ID0gIHRoaXMudGFiQmFyLmNvbnRlbnRUYWJzO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hCb3R0b21OYXZDb21wb25lbnRcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gSWd4VGFiQ29tcG9uZW50KSlcbiAgICBwdWJsaWMgY29udGVudFRhYnM6IFF1ZXJ5TGlzdDxJZ3hUYWJDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYElneFRhYkNvbXBvbmVudGAgZWxlbWVudHMgZm9yIHRoaXMgYm90dG9tIG5hdmlnYXRpb24gY29tcG9uZW50LlxuICAgICAqIEZpcnN0IHRyeSB0byBnZXQgdGhlbSBhcyBjb250ZW50IGNoaWxkcmVuIGlmIG5vdCBhdmFpbGFibGUgZ2V0IHRoZW0gYXMgdmlldyBjaGlsZHJlbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRhYnM6IFF1ZXJ5TGlzdDxJZ3hUYWJDb21wb25lbnQ+ID0gIHRoaXMudGFiQmFyLnRhYnM7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEJvdHRvbU5hdkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGFicygpOiBRdWVyeUxpc3Q8SWd4VGFiQ29tcG9uZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0NvbnRlbnRUYWJzID8gdGhpcy5jb250ZW50VGFicyA6IHRoaXMudmlld1RhYnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYElneFRhYlBhbmVsQ29tcG9uZW50YCBlbGVtZW50cyBpbiB0aGUgdGFiIGJhciBjb21wb25lbnQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0YWJQYW5lbHM6IFF1ZXJ5TGlzdDxJZ3hUYWJQYW5lbENvbXBvbmVudD4gPSB0aGlzLnRhYkJhci5wYW5lbHM7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEJvdHRvbU5hdkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBJZ3hUYWJQYW5lbENvbXBvbmVudCkpXG4gICAgcHVibGljIHBhbmVsczogUXVlcnlMaXN0PElneFRhYlBhbmVsQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGlkYCBvZiB0aGUgdGFiIGJhci5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGlkYCBvZiB0aGUgZmlyc3QgdGFiIGJhciBjb21wb25lbnQgd2lsbCBiZSBgXCJpZ3gtYm90dG9tLW5hdi0wXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWJvdHRvbS1uYXYgaWQgPSBcIm15LWZpcnN0LXRhYi1iYXJcIj48L2lneC1ib3R0b20tbmF2PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdGFiQmFySWQgPSAgdGhpcy50YWJCYXIuaWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEJvdHRvbU5hdkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWJvdHRvbS1uYXYtJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBuZXcgdGFiIGlzIHNlbGVjdGVkLlxuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZXMgdG8gdGhlIGBJZ3hUYWJDb21wb25lbnRgIGFuZCBgSWd4VGFiUGFuZWxDb21wb25lbnRgIGFzIGV2ZW50IGFyZ3VtZW50cy5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ib3R0b20tbmF2IChvblRhYmxlU2VsZWN0ZWQpID0gXCJvblRhYlNlbGVjdGVkKCRldmVudClcIj48aWd4LWJvdHRvbS1uYXY+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEJvdHRvbU5hdkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25UYWJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVNlbGVjdFRhYkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSB0YWIgaXMgZGVzZWxlY3RlZC5cbiAgICAgKiBQcm92aWRlcyByZWZlcmVuY2VzIHRvIHRoZSBgSWd4VGFiQ29tcG9uZW50YCBhbmQgYElneFRhYlBhbmVsQ29tcG9uZW50YCBhcyBldmVudCBhcmd1bWVudHMuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtYm90dG9tLW5hdiAob25UYWJEZXNlbGVjdGVkKSA9IFwib25UYWJEZXNlbGVjdGVkKCRldmVudClcIj48aWd4LWJvdHRvbS1uYXY+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEJvdHRvbU5hdkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25UYWJEZXNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0VGFiRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGluZGV4YCBvZiBzZWxlY3RlZCB0YWIvcGFuZWwgaW4gdGhlIHJlc3BlY3RpdmUgY29sbGVjdGlvbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGluZGV4ID0gIHRoaXMudGFiQmFyLnNlbGVjdGVkSW5kZXg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEJvdHRvbU5hdkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZEluZGV4ID0gLTE7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgaXRlbVN0eWxlYCBvZiB0aGUgdGFiIGJhci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1TdHlsZSA9ICB0aGlzLnRhYkJhci5pdGVtU3R5bGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneEJvdHRvbU5hdkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXRlbVN0eWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtU3R5bGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNDb250ZW50VGFicygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRlbnRUYWJzICYmIHRoaXMuY29udGVudFRhYnMubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfaXRlbVN0eWxlID0gJ2lneC1ib3R0b20tbmF2JztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNlbGVjdGVkIHRhYiBpbiB0aGUgdGFiIGJhci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRhYiA9ICB0aGlzLnRhYkJhci5zZWxlY3RlZFRhYjtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Qm90dG9tTmF2Q29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IHNlbGVjdGVkVGFiKCk6IElneFRhYkNvbXBvbmVudCB7XG4gICAgIC