@stratio/egeo
Version:
579 lines • 42.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/st-table/st-table.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*
* © 2017 Stratio Big Data Inc., Sucursal en España.
*
* This software is licensed under the Apache License, Version 2.0.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the terms of the License for more details.
*
* SPDX-License-Identifier: Apache-2.0.
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, OnInit, Output, TemplateRef } from '@angular/core';
import { StEgeo, StRequired } from '../decorators/require-decorators';
import { Order, ORDER_TYPE } from './shared/order';
import { cloneDeep as _cloneDeep, get as _get } from 'lodash';
import { StTableIconClasses } from './st-table.interface';
/**
* \@description {Component} [Table]
*
* The table component has been designed to display any content like images, text, graphs, etc.
*
* * \@model
*
* [StTableHeader] {./shared/table-header.interface.ts#StTableHeader}
* [StDynamicTableHeader] {./shared/table-header.interface.ts#StFilterElement}
* [StFilterHeader] {./shared/table-header.interface.ts#StFilterHeader}
* [StTableFilterIconClasses] {./st-table.interface.ts#StTableFilterIconClasses}
* [StTableIconClasses] {./st-table.interface.ts#StTableIconClasses}
*
* \@example
*
* {html}
*
* ```
* <st-table [fields]="fields" [sortable]="true" (changeOrder)="yourFunctionToOrder($event)">
* <tr st-table-row *ngFor="let userData of data">
* <td st-table-cell st-table-row-content>
* <label >{{userData.id}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.name}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.lastName}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.phone}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.company}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.completedProfile}}</label>
* </td>
* <td st-table-row-hover>
* <i class="icon icon-arrow2_right"></i>
* </td>
* </tr>
* </st-table>
* ```
*
*/
let StTableComponent = /**
* \@description {Component} [Table]
*
* The table component has been designed to display any content like images, text, graphs, etc.
*
* * \@model
*
* [StTableHeader] {./shared/table-header.interface.ts#StTableHeader}
* [StDynamicTableHeader] {./shared/table-header.interface.ts#StFilterElement}
* [StFilterHeader] {./shared/table-header.interface.ts#StFilterHeader}
* [StTableFilterIconClasses] {./st-table.interface.ts#StTableFilterIconClasses}
* [StTableIconClasses] {./st-table.interface.ts#StTableIconClasses}
*
* \@example
*
* {html}
*
* ```
* <st-table [fields]="fields" [sortable]="true" (changeOrder)="yourFunctionToOrder($event)">
* <tr st-table-row *ngFor="let userData of data">
* <td st-table-cell st-table-row-content>
* <label >{{userData.id}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.name}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.lastName}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.phone}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.company}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.completedProfile}}</label>
* </td>
* <td st-table-row-hover>
* <i class="icon icon-arrow2_right"></i>
* </td>
* </tr>
* </st-table>
* ```
*
*/
class StTableComponent {
/**
* @param {?} _cd
*/
constructor(_cd) {
this._cd = _cd;
/**
* \@Input {boolean} [header=true] Boolean to show or hide the header
*/
this.header = true;
/**
* \@Input {boolean} [sortable=true] Boolean to make sortable the table, To enable sorting of columns use
* the new "sortable" field inside stTableHeader model
*/
this.sortable = true;
/**
* \@Input {boolean} [filterable=true] Boolean to make filterable the table, To enable filtering of columns use
* the new "filterable" field inside stTableHeader model (necessary define filterConfig).
*/
this.filterable = false;
/**
* \@Input {boolean} [selectableAll=false] Boolean to show or hide a checkbox in the header to select or
* deselect all rows
*/
this.selectableAll = false;
/**
* \@Input {StTableIconClasses} [iconClasses=''] List of icon classes
*/
this.iconClasses = new StTableIconClasses();
/**
* \@Output {Order} [changeOrder=''] Event emitted with the new order which has to be applied to the table rows
*/
this.changeOrder = new EventEmitter();
/**
* \@Output {boolean} [selectAll=''] Event emitted when user interacts with the checkbox to select or deselect
* all rows
*/
this.selectAll = new EventEmitter();
/**
* \@Output {string} [clickFilter=] Event emitted when clicking on filters icon
*/
this.clickFilter = new EventEmitter();
/**
* \@Output {StTableHeader[]} [selectFilters=''] Event emitted when user interacts with filter button without a custom template
*/
this.selectFilters = new EventEmitter();
this.tableClasses = {};
this.visibleFilter = -1;
this._fixedHeader = false;
this._stickyHoverMenu = false;
this._hasHoverMenu = false;
}
/**
* \@Input {boolean} [fixedHeader=false] Boolean to fix the table header
* @return {?}
*/
get fixedHeader() {
return this._fixedHeader;
}
/**
* @param {?} newValue
* @return {?}
*/
set fixedHeader(newValue) {
this._fixedHeader = newValue;
}
/**
* \@Input {boolean} [stickyHoverMenu=false] Boolean to fix hover menu always visible
* @return {?}
*/
get stickyHoverMenu() {
return this._stickyHoverMenu;
}
/**
* @param {?} newValue
* @return {?}
*/
set stickyHoverMenu(newValue) {
this._stickyHoverMenu = newValue;
}
/**
* \@Input {string} [customClasses=] Classes for adding styles to table tag from outside. These can be: separated-rows
* @return {?}
*/
get customClasses() {
return this._customClasses;
}
/**
* @param {?} newValue
* @return {?}
*/
set customClasses(newValue) {
this.tableClasses[this._customClasses] = undefined;
this._customClasses = newValue;
this.tableClasses[this._customClasses] = this._customClasses;
}
/**
* \@Input {boolean} [selectedAll=false] It specifies if all rows are selected
* @return {?}
*/
get selectedAll() {
return this._selectedAll;
}
/**
* @param {?} newValue
* @return {?}
*/
set selectedAll(newValue) {
this._selectedAll = newValue;
this._cd.markForCheck();
}
/**
* \@Input {boolean} [hasHoverMenu=false] It specifies if a menu has to be displayed when user puts the mouse over
* the rows. Remember to add a cell with the selector st-table-row-hover for adding content to the menu
* @return {?}
*/
get hasHoverMenu() {
return this._hasHoverMenu;
}
/**
* @param {?} newValue
* @return {?}
*/
set hasHoverMenu(newValue) {
this._hasHoverMenu = newValue;
}
/**
* @return {?}
*/
ngOnInit() {
if (this.filterable && !this.statusFilter) {
this.statusFilter = new Array(this.fields.length);
this.statusFilter.fill(false);
}
}
/**
* @param {?} field
* @return {?}
*/
getHeaderItemClass(field) {
/** @type {?} */
let isOrderAsc = this.isSortedByFieldAndDirection(field, ORDER_TYPE.ASC);
return isOrderAsc ? this.iconClasses.sort.asc : this.iconClasses.sort.desc;
}
/**
* @param {?} field
* @return {?}
*/
isSortable(field) {
return field && field.sortable !== undefined ? field.sortable : this.sortable;
}
/**
* @param {?} field
* @return {?}
*/
isSortedByField(field) {
return this.currentOrder && this.currentOrder.orderBy === field.id;
}
/**
* @param {?} field
* @return {?}
*/
isFilterable(field) {
return this.filterable && ((_get(field, 'filters.filterConfig')) ||
(this.templateContentFilter && _get(field, 'filters')) ||
_get(field, 'filters.templateRef'));
}
/**
* @return {?}
*/
onHideFilterMenu() {
this.visibleFilter = -1;
this._cd.markForCheck();
}
/**
* @param {?} field
* @return {?}
*/
onChangeOrder(field) {
/** @type {?} */
let _currentOrder;
if (field && this.isSortable(field)) {
if (this.currentOrder && this.currentOrder.orderBy === field.id) {
_currentOrder = this.changeOrderDirection();
}
else {
_currentOrder = new Order(field.id, ORDER_TYPE.ASC);
}
this.changeOrder.emit(_currentOrder);
}
}
/**
* @param {?} event
* @return {?}
*/
onSelectAll(event) {
this.selectAll.emit(event.checked);
}
/**
* @return {?}
*/
onSelectFilters() {
/** @type {?} */
let selectedFilters = _cloneDeep(this.fields);
selectedFilters = selectedFilters.filter((/**
* @param {?} field
* @return {?}
*/
(field) => {
if (_get(field, 'filters.filterConfig')) {
field.filters.filterConfig = field.filters.filterConfig.filter((/**
* @param {?} conf
* @return {?}
*/
(conf) => conf.selected));
if (field.filters.filterConfig.length > 0) {
return field;
}
}
}));
this.selectFilters.emit(selectedFilters);
}
/**
* @param {?} event
* @param {?} index
* @param {?} field
* @return {?}
*/
onChangeFilterVisibility(event, index, field) {
event.stopPropagation();
this.visibleFilter = this.visibleFilter === index ? undefined : index;
this.clickFilter.emit(field);
this._cd.markForCheck();
}
/**
* @param {?} position
* @return {?}
*/
getFilterIconClasses(position) {
/** @type {?} */
const classes = {};
classes['st-table__filter-arrow'] = true;
classes[this.statusFilter[position] ? this.iconClasses.filter.selected : this.iconClasses.filter.enabled] = true;
return classes;
}
/**
* @private
* @return {?}
*/
changeOrderDirection() {
/** @type {?} */
let newDirection = this.currentOrder.type === ORDER_TYPE.ASC ? ORDER_TYPE.DESC : ORDER_TYPE.ASC;
return new Order(this.currentOrder.orderBy, newDirection);
}
/**
* @private
* @param {?} field
* @param {?} orderType
* @return {?}
*/
isSortedByFieldAndDirection(field, orderType) {
return this.isSortedByField(field) && this.currentOrder.type === orderType;
}
};
StTableComponent.ctorParameters = () => [
{ type: ChangeDetectorRef }
];
StTableComponent.decorators = [
{ type: Component, args: [{
selector: 'st-table',
template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<table class='st-table' [ngClass]=\"tableClasses\" [attr.id]='qaTag'>\n <thead>\n <tr *ngIf=\"header\" class='st-table__header'>\n\n <th *ngFor='let field of fields; let i = index' class='st-table__header-item' [ngClass]=\"{\n 'st-table__header-item--selected': isSortedByField(field),\n 'st-table__header-item--sortable': isSortable(field),\n 'st-table__header-item--filterable': isFilterable(field)}\">\n <st-checkbox *ngIf=\"i == 0 && selectableAll\" qaTag=\"select-all-checkbox\" class=\"st-table__checkbox\"\n name=\"selectAll\"\n [checked]=\"selectedAll\" (change)=\"onSelectAll($event)\">\n </st-checkbox>\n <label class='st-table__header-text' (click)=\"onChangeOrder(field)\">\n <i *ngIf=\"isSortedByField(field)\" class='st-table__order-arrow' [ngClass]=\"getHeaderItemClass(field)\">\n </i>\n {{field.label}}\n </label>\n <st-popover-filter *ngIf=\"isFilterable(field)\"\n [field]=\"field\"\n [index]=\"i\"\n [templateContentFilter]=\"templateContentFilter\"\n [hidden]=\"visibleFilter !== i\"\n (filter)=\"onSelectFilters()\"\n (close)=\"onHideFilterMenu()\">\n <i popover-filter-button\n [ngClass]=\"getFilterIconClasses(i)\"\n (click)=\"onChangeFilterVisibility($event, i, field)\">\n </i>\n </st-popover-filter>\n </th>\n <th *ngIf=\"hasHoverMenu\"></th> <!-- For hover cell -->\n </tr>\n </thead>\n <ng-content></ng-content>\n</table>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: ["@charset \"UTF-8\";.st-table{width:100%}.st-table__header-item{text-transform:capitalize;position:relative;vertical-align:bottom}.st-table__header-text{position:relative;height:100%;display:inline-flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:flex-start;cursor:inherit}"]
}] }
];
/** @nocollapse */
StTableComponent.ctorParameters = () => [
{ type: ChangeDetectorRef }
];
StTableComponent.propDecorators = {
fields: [{ type: Input }],
qaTag: [{ type: Input }],
header: [{ type: Input }],
sortable: [{ type: Input }],
filterable: [{ type: Input }],
selectableAll: [{ type: Input }],
currentOrder: [{ type: Input }],
templateContentFilter: [{ type: Input }],
statusFilter: [{ type: Input }],
iconClasses: [{ type: Input }],
fixedHeader: [{ type: Input }, { type: HostBinding, args: ['class.st-custom-scrollbar',] }, { type: HostBinding, args: ['class.fixed-header',] }],
stickyHoverMenu: [{ type: Input }, { type: HostBinding, args: ['class.sticky-hover-menu',] }],
customClasses: [{ type: Input }],
selectedAll: [{ type: Input }],
hasHoverMenu: [{ type: Input }],
changeOrder: [{ type: Output }],
selectAll: [{ type: Output }],
clickFilter: [{ type: Output }],
selectFilters: [{ type: Output }]
};
tslib_1.__decorate([
StRequired(),
tslib_1.__metadata("design:type", Array)
], StTableComponent.prototype, "fields", void 0);
/**
* \@description {Component} [Table]
*
* The table component has been designed to display any content like images, text, graphs, etc.
*
* * \@model
*
* [StTableHeader] {./shared/table-header.interface.ts#StTableHeader}
* [StDynamicTableHeader] {./shared/table-header.interface.ts#StFilterElement}
* [StFilterHeader] {./shared/table-header.interface.ts#StFilterHeader}
* [StTableFilterIconClasses] {./st-table.interface.ts#StTableFilterIconClasses}
* [StTableIconClasses] {./st-table.interface.ts#StTableIconClasses}
*
* \@example
*
* {html}
*
* ```
* <st-table [fields]="fields" [sortable]="true" (changeOrder)="yourFunctionToOrder($event)">
* <tr st-table-row *ngFor="let userData of data">
* <td st-table-cell st-table-row-content>
* <label >{{userData.id}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.name}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.lastName}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.phone}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.company}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.completedProfile}}</label>
* </td>
* <td st-table-row-hover>
* <i class="icon icon-arrow2_right"></i>
* </td>
* </tr>
* </st-table>
* ```
*
*/
StTableComponent = tslib_1.__decorate([
StEgeo(),
tslib_1.__metadata("design:paramtypes", [ChangeDetectorRef])
], StTableComponent);
export { StTableComponent };
if (false) {
/**
* \@Input {StTableHeader[]} [fields=''] List of field displayed in the header
* @type {?}
*/
StTableComponent.prototype.fields;
/**
* \@Input {string} [qaTag=''] Prefix used to generate the id values for qa tests
* @type {?}
*/
StTableComponent.prototype.qaTag;
/**
* \@Input {boolean} [header=true] Boolean to show or hide the header
* @type {?}
*/
StTableComponent.prototype.header;
/**
* \@Input {boolean} [sortable=true] Boolean to make sortable the table, To enable sorting of columns use
* the new "sortable" field inside stTableHeader model
* @type {?}
*/
StTableComponent.prototype.sortable;
/**
* \@Input {boolean} [filterable=true] Boolean to make filterable the table, To enable filtering of columns use
* the new "filterable" field inside stTableHeader model (necessary define filterConfig).
* @type {?}
*/
StTableComponent.prototype.filterable;
/**
* \@Input {boolean} [selectableAll=false] Boolean to show or hide a checkbox in the header to select or
* deselect all rows
* @type {?}
*/
StTableComponent.prototype.selectableAll;
/**
* \@Input {Order} [currentOrder=''] It specifies what is the current order applied to the table
* @type {?}
*/
StTableComponent.prototype.currentOrder;
/**
* \@Input {TemplateRef} [templateContentFilter=undefined] Reference to paint a custom template inside popover content
* @type {?}
*/
StTableComponent.prototype.templateContentFilter;
/**
* \@Input {boolean[]} [statusFilter=''] List of status filter by column, needed with templateContentFilter
* @type {?}
*/
StTableComponent.prototype.statusFilter;
/**
* \@Input {StTableIconClasses} [iconClasses=''] List of icon classes
* @type {?}
*/
StTableComponent.prototype.iconClasses;
/**
* \@Output {Order} [changeOrder=''] Event emitted with the new order which has to be applied to the table rows
* @type {?}
*/
StTableComponent.prototype.changeOrder;
/**
* \@Output {boolean} [selectAll=''] Event emitted when user interacts with the checkbox to select or deselect
* all rows
* @type {?}
*/
StTableComponent.prototype.selectAll;
/**
* \@Output {string} [clickFilter=] Event emitted when clicking on filters icon
* @type {?}
*/
StTableComponent.prototype.clickFilter;
/**
* \@Output {StTableHeader[]} [selectFilters=''] Event emitted when user interacts with filter button without a custom template
* @type {?}
*/
StTableComponent.prototype.selectFilters;
/** @type {?} */
StTableComponent.prototype.tableClasses;
/** @type {?} */
StTableComponent.prototype.visibleFilter;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._fixedHeader;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._stickyHoverMenu;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._selectedAll;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._hasHoverMenu;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._customClasses;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._cd;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC10YWJsZS9zdC10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckosT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxTQUFTLElBQUksVUFBVSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBd0Q3QyxnQkFBZ0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFBaEIsZ0JBQWdCOzs7O0lBbUgxQixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjs7OztRQTdHakMsV0FBTSxHQUFZLElBQUksQ0FBQzs7Ozs7UUFLdkIsYUFBUSxHQUFZLElBQUksQ0FBQzs7Ozs7UUFLekIsZUFBVSxHQUFZLEtBQUssQ0FBQzs7Ozs7UUFLNUIsa0JBQWEsR0FBWSxLQUFLLENBQUM7Ozs7UUFZL0IsZ0JBQVcsR0FBd0IsSUFBSSxrQkFBa0IsRUFBRSxDQUFDOzs7O1FBNkQzRCxnQkFBVyxHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFDOzs7OztRQUl0RCxjQUFTLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7UUFHdEQsZ0JBQVcsR0FBZ0MsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7OztRQUc5RCxrQkFBYSxHQUFrQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXJFLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRWxDLGtCQUFhLEdBQVksS0FBSyxDQUFDO0lBSXZDLENBQUM7Ozs7O0lBaEZELElBR0ksV0FBVztRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM1QixDQUFDOzs7OztJQUVELElBQUksV0FBVyxDQUFDLFFBQWlCO1FBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO0lBQ2hDLENBQUM7Ozs7O0lBR0QsSUFFSSxlQUFlO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2hDLENBQUM7Ozs7O0lBRUQsSUFBSSxlQUFlLENBQUMsUUFBaUI7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztJQUNwQyxDQUFDOzs7OztJQUdELElBQ0ksYUFBYTtRQUNkLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM5QixDQUFDOzs7OztJQUVELElBQUksYUFBYSxDQUFDLFFBQWdCO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ2hFLENBQUM7Ozs7O0lBR0QsSUFDSSxXQUFXO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzVCLENBQUM7Ozs7O0lBRUQsSUFBSSxXQUFXLENBQUMsUUFBaUI7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQixDQUFDOzs7Ozs7SUFLRCxJQUNJLFlBQVk7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDN0IsQ0FBQzs7Ozs7SUFFRCxJQUFJLFlBQVksQ0FBQyxRQUFpQjtRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztJQUNqQyxDQUFDOzs7O0lBMkJELFFBQVE7UUFDTCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoQztJQUNKLENBQUM7Ozs7O0lBRU0sa0JBQWtCLENBQUMsS0FBb0I7O1lBQ3ZDLFVBQVUsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDeEUsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzlFLENBQUM7Ozs7O0lBRU0sVUFBVSxDQUFDLEtBQW9CO1FBQ25DLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ2pGLENBQUM7Ozs7O0lBRU0sZUFBZSxDQUFDLEtBQW9CO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQ3RFLENBQUM7Ozs7O0lBRU0sWUFBWSxDQUFDLEtBQW9CO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBQzdELENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7OztJQUVNLGdCQUFnQjtRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7Ozs7SUFFTSxhQUFhLENBQUMsS0FBb0I7O1lBQ2xDLGFBQW9CO1FBQ3hCLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEMsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQzlELGFBQWEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzthQUM5QztpQkFBTTtnQkFDSixhQUFhLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDdEQ7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUN2QztJQUNKLENBQUM7Ozs7O0lBRU0sV0FBVyxDQUFDLEtBQVU7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7SUFFTSxlQUFlOztZQUNmLGVBQWUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxlQUFlLEdBQUcsZUFBZSxDQUFDLE1BQU07Ozs7UUFBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2hELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxFQUFFO2dCQUN0QyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNOzs7O2dCQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUM7Z0JBQ3hGLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDeEMsT0FBTyxLQUFLLENBQUM7aUJBQ2Y7YUFDSDtRQUNKLENBQUMsRUFBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7Ozs7OztJQUVNLHdCQUF3QixDQUFDLEtBQWlCLEVBQUUsS0FBYSxFQUFFLEtBQW9CO1FBQ25GLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN0RSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNCLENBQUM7Ozs7O0lBRU0sb0JBQW9CLENBQUMsUUFBZ0I7O2NBQ25DLE9BQU8sR0FBK0IsRUFBRTtRQUM5QyxPQUFPLENBQUMsd0JBQXdCLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRWpILE9BQU8sT0FBTyxDQUFDO0lBQ2xCLENBQUM7Ozs7O0lBRU8sb0JBQW9COztZQUNyQixZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUc7UUFDL0YsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM3RCxDQUFDOzs7Ozs7O0lBRU8sMkJBQTJCLENBQUMsS0FBb0IsRUFBRSxTQUFxQjtRQUM1RSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQzlFLENBQUM7Q0FDSCxDQUFBOztZQXRGMkIsaUJBQWlCOzs7WUExSDVDLFNBQVMsU0FBQztnQkFDUixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsc3BFQUF3QztnQkFFeEMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O2FBQ2pEOzs7O1lBNURpQyxpQkFBaUI7OztxQkFnRS9DLEtBQUs7b0JBRUwsS0FBSztxQkFFTCxLQUFLO3VCQUtMLEtBQUs7eUJBS0wsS0FBSzs0QkFLTCxLQUFLOzJCQUdMLEtBQUs7b0NBR0wsS0FBSzsyQkFHTCxLQUFLOzBCQUdMLEtBQUs7MEJBR0wsS0FBSyxZQUNMLFdBQVcsU0FBQywyQkFBMkIsY0FDdkMsV0FBVyxTQUFDLG9CQUFvQjs4QkFVaEMsS0FBSyxZQUNMLFdBQVcsU0FBQyx5QkFBeUI7NEJBVXJDLEtBQUs7MEJBWUwsS0FBSzsyQkFhTCxLQUFLOzBCQVVMLE1BQU07d0JBSU4sTUFBTTswQkFHTixNQUFNOzRCQUdOLE1BQU07O0FBdEdnQjtJQUFiLFVBQVUsRUFBRTs7Z0RBQXlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUZyQyxnQkFBZ0I7SUFSNUIsTUFBTSxFQUFFOzZDQTJIbUIsaUJBQWlCO0dBbkhoQyxnQkFBZ0IsQ0F5TTVCO1NBek1ZLGdCQUFnQjs7Ozs7O0lBRTFCLGtDQUErQzs7Ozs7SUFFL0MsaUNBQXVCOzs7OztJQUV2QixrQ0FBZ0M7Ozs7OztJQUtoQyxvQ0FBa0M7Ozs7OztJQUtsQyxzQ0FBcUM7Ozs7OztJQUtyQyx5Q0FBd0M7Ozs7O0lBR3hDLHdDQUE2Qjs7Ozs7SUFHN0IsaURBQWtEOzs7OztJQUdsRCx3Q0FBa0M7Ozs7O0lBR2xDLHVDQUFxRTs7Ozs7SUE2RHJFLHVDQUFnRTs7Ozs7O0lBSWhFLHFDQUFnRTs7Ozs7SUFHaEUsdUNBQXdFOzs7OztJQUd4RSx5Q0FBNEU7O0lBRTVFLHdDQUE4Qjs7SUFDOUIseUNBQWtDOzs7OztJQUVsQyx3Q0FBc0M7Ozs7O0lBQ3RDLDRDQUEwQzs7Ozs7SUFDMUMsd0NBQThCOzs7OztJQUM5Qix5Q0FBdUM7Ozs7O0lBQ3ZDLDBDQUErQjs7Ozs7SUFFbkIsK0JBQThCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIMKpIDIwMTcgU3RyYXRpbyBCaWcgRGF0YSBJbmMuLCBTdWN1cnNhbCBlbiBFc3Bhw7FhLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7XG4gKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuICogU2VlIHRoZSB0ZXJtcyBvZiB0aGUgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wLlxuICovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdEVnZW8sIFN0UmVxdWlyZWQgfSBmcm9tICcuLi9kZWNvcmF0b3JzL3JlcXVpcmUtZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBPcmRlciwgT1JERVJfVFlQRSB9IGZyb20gJy4vc2hhcmVkL29yZGVyJztcbmltcG9ydCB7IFN0VGFibGVIZWFkZXIgfSBmcm9tICcuL3NoYXJlZC90YWJsZS1oZWFkZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IGNsb25lRGVlcCBhcyBfY2xvbmVEZWVwLCBnZXQgYXMgX2dldCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBTdFRhYmxlSWNvbkNsYXNzZXMgfSBmcm9tICcuL3N0LXRhYmxlLmludGVyZmFjZSc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIHtDb21wb25lbnR9IFtUYWJsZV1cbiAqXG4gKiBUaGUgdGFibGUgY29tcG9uZW50IGhhcyBiZWVuIGRlc2lnbmVkIHRvIGRpc3BsYXkgYW55IGNvbnRlbnQgbGlrZSBpbWFnZXMsIHRleHQsIGdyYXBocywgZXRjLlxuICpcbiAqICogQG1vZGVsXG4gKlxuICogICBbU3RUYWJsZUhlYWRlcl0gey4vc2hhcmVkL3RhYmxlLWhlYWRlci5pbnRlcmZhY2UudHMjU3RUYWJsZUhlYWRlcn1cbiAqICAgW1N0RHluYW1pY1RhYmxlSGVhZGVyXSB7Li9zaGFyZWQvdGFibGUtaGVhZGVyLmludGVyZmFjZS50cyNTdEZpbHRlckVsZW1lbnR9XG4gKiAgIFtTdEZpbHRlckhlYWRlcl0gey4vc2hhcmVkL3RhYmxlLWhlYWRlci5pbnRlcmZhY2UudHMjU3RGaWx0ZXJIZWFkZXJ9XG4gKiAgIFtTdFRhYmxlRmlsdGVySWNvbkNsYXNzZXNdIHsuL3N0LXRhYmxlLmludGVyZmFjZS50cyNTdFRhYmxlRmlsdGVySWNvbkNsYXNzZXN9XG4gKiAgIFtTdFRhYmxlSWNvbkNsYXNzZXNdIHsuL3N0LXRhYmxlLmludGVyZmFjZS50cyNTdFRhYmxlSWNvbkNsYXNzZXN9XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiB7aHRtbH1cbiAqXG4gKiBgYGBcbiAqIDxzdC10YWJsZSBbZmllbGRzXT1cImZpZWxkc1wiIFtzb3J0YWJsZV09XCJ0cnVlXCIgKGNoYW5nZU9yZGVyKT1cInlvdXJGdW5jdGlvblRvT3JkZXIoJGV2ZW50KVwiPlxuICogPHRyIHN0LXRhYmxlLXJvdyAqbmdGb3I9XCJsZXQgdXNlckRhdGEgb2YgZGF0YVwiPlxuICogPHRkIHN0LXRhYmxlLWNlbGwgc3QtdGFibGUtcm93LWNvbnRlbnQ+XG4gKiAgICA8bGFiZWwgPnt7dXNlckRhdGEuaWR9fTwvbGFiZWw+XG4gKiA8L3RkPlxuICogPHRkIHN0LXRhYmxlLWNlbGwgc3QtdGFibGUtcm93LWNvbnRlbnQ+XG4gKiAgICA8bGFiZWwgPnt7dXNlckRhdGEubmFtZX19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5sYXN0TmFtZX19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5waG9uZX19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5jb21wYW55fX08L2xhYmVsPlxuICogPC90ZD5cbiAqIDx0ZCBzdC10YWJsZS1jZWxsIHN0LXRhYmxlLXJvdy1jb250ZW50PlxuICogICAgPGxhYmVsID57e3VzZXJEYXRhLmNvbXBsZXRlZFByb2ZpbGV9fTwvbGFiZWw+XG4gKiA8L3RkPlxuICogPHRkIHN0LXRhYmxlLXJvdy1ob3Zlcj5cbiAqICAgIDxpIGNsYXNzPVwiaWNvbiBpY29uLWFycm93Ml9yaWdodFwiPjwvaT5cbiAqIDwvdGQ+XG4gKiA8L3RyPlxuICogPC9zdC10YWJsZT5cbiAqIGBgYFxuICpcbiAqL1xuQFN0RWdlbygpXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiAnc3QtdGFibGUnLFxuICAgdGVtcGxhdGVVcmw6ICcuL3N0LXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgIHN0eWxlVXJsczogWycuL3N0LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcblxuZXhwb3J0IGNsYXNzIFN0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgLyoqIEBJbnB1dCB7U3RUYWJsZUhlYWRlcltdfSBbZmllbGRzPScnXSBMaXN0IG9mIGZpZWxkIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyICovXG4gICBASW5wdXQoKSBAU3RSZXF1aXJlZCgpIGZpZWxkczogU3RUYWJsZUhlYWRlcltdO1xuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbcWFUYWc9JyddIFByZWZpeCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBpZCB2YWx1ZXMgZm9yIHFhIHRlc3RzICovXG4gICBASW5wdXQoKSBxYVRhZzogc3RyaW5nO1xuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2hlYWRlcj10cnVlXSBCb29sZWFuIHRvIHNob3cgb3IgaGlkZSB0aGUgaGVhZGVyICovXG4gICBASW5wdXQoKSBoZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuICAgLyoqXG4gICAgKiBASW5wdXQge2Jvb2xlYW59IFtzb3J0YWJsZT10cnVlXSBCb29sZWFuIHRvIG1ha2Ugc29ydGFibGUgdGhlIHRhYmxlLCBUbyBlbmFibGUgc29ydGluZyBvZiBjb2x1bW5zIHVzZVxuICAgICogdGhlIG5ldyBcInNvcnRhYmxlXCIgZmllbGQgaW5zaWRlIHN0VGFibGVIZWFkZXIgbW9kZWxcbiAgICAqL1xuICAgQElucHV0KCkgc29ydGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICAgLyoqXG4gICAgKiBASW5wdXQge2Jvb2xlYW59IFtmaWx0ZXJhYmxlPXRydWVdIEJvb2xlYW4gdG8gbWFrZSBmaWx0ZXJhYmxlIHRoZSB0YWJsZSwgVG8gZW5hYmxlIGZpbHRlcmluZyBvZiBjb2x1bW5zIHVzZVxuICAgICogdGhlIG5ldyBcImZpbHRlcmFibGVcIiBmaWVsZCBpbnNpZGUgc3RUYWJsZUhlYWRlciBtb2RlbCAobmVjZXNzYXJ5IGRlZmluZSBmaWx0ZXJDb25maWcpLlxuICAgICovXG4gICBASW5wdXQoKSBmaWx0ZXJhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICAvKipcbiAgICAqIEBJbnB1dCB7Ym9vbGVhbn0gW3NlbGVjdGFibGVBbGw9ZmFsc2VdIEJvb2xlYW4gdG8gc2hvdyBvciBoaWRlIGEgY2hlY2tib3ggaW4gdGhlIGhlYWRlciB0byBzZWxlY3Qgb3JcbiAgICAqICBkZXNlbGVjdCBhbGwgcm93c1xuICAgICovXG4gICBASW5wdXQoKSBzZWxlY3RhYmxlQWxsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgIC8qKiBASW5wdXQge09yZGVyfSBbY3VycmVudE9yZGVyPScnXSBJdCBzcGVjaWZpZXMgd2hhdCBpcyB0aGUgY3VycmVudCBvcmRlciBhcHBsaWVkIHRvIHRoZSB0YWJsZSAqL1xuICAgQElucHV0KCkgY3VycmVudE9yZGVyOiBPcmRlcjtcblxuICAgLyoqIEBJbnB1dCB7VGVtcGxhdGVSZWZ9IFt0ZW1wbGF0ZUNvbnRlbnRGaWx0ZXI9dW5kZWZpbmVkXSBSZWZlcmVuY2UgdG8gcGFpbnQgYSBjdXN0b20gdGVtcGxhdGUgaW5zaWRlIHBvcG92ZXIgY29udGVudCAqL1xuICAgQElucHV0KCkgdGVtcGxhdGVDb250ZW50RmlsdGVyPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbltdfSBbc3RhdHVzRmlsdGVyPScnXSBMaXN0IG9mIHN0YXR1cyBmaWx0ZXIgYnkgY29sdW1uLCBuZWVkZWQgd2l0aCB0ZW1wbGF0ZUNvbnRlbnRGaWx0ZXIgKi9cbiAgIEBJbnB1dCgpIHN0YXR1c0ZpbHRlcj86IGJvb2xlYW5bXTtcblxuICAgLyoqIEBJbnB1dCB7U3RUYWJsZUljb25DbGFzc2VzfSBbaWNvbkNsYXNzZXM9JyddIExpc3Qgb2YgaWNvbiBjbGFzc2VzICovXG4gICBASW5wdXQoKSBpY29uQ2xhc3Nlcz86IFN0VGFibGVJY29uQ2xhc3NlcyA9IG5ldyBTdFRhYmxlSWNvbkNsYXNzZXMoKTtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2ZpeGVkSGVhZGVyPWZhbHNlXSBCb29sZWFuIHRvIGZpeCB0aGUgdGFibGUgaGVhZGVyICovXG4gICBASW5wdXQoKVxuICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zdC1jdXN0b20tc2Nyb2xsYmFyJylcbiAgIEBIb3N0QmluZGluZygnY2xhc3MuZml4ZWQtaGVhZGVyJylcbiAgIGdldCBmaXhlZEhlYWRlcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9maXhlZEhlYWRlcjtcbiAgIH1cblxuICAgc2V0IGZpeGVkSGVhZGVyKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9maXhlZEhlYWRlciA9IG5ld1ZhbHVlO1xuICAgfVxuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbc3RpY2t5SG92ZXJNZW51PWZhbHNlXSBCb29sZWFuIHRvIGZpeCBob3ZlciBtZW51IGFsd2F5cyB2aXNpYmxlICovXG4gICBASW5wdXQoKVxuICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zdGlja3ktaG92ZXItbWVudScpXG4gICBnZXQgc3RpY2t5SG92ZXJNZW51KCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0aWNreUhvdmVyTWVudTtcbiAgIH1cblxuICAgc2V0IHN0aWNreUhvdmVyTWVudShuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fc3RpY2t5SG92ZXJNZW51ID0gbmV3VmFsdWU7XG4gICB9XG5cbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW2N1c3RvbUNsYXNzZXM9XSBDbGFzc2VzIGZvciBhZGRpbmcgc3R5bGVzIHRvIHRhYmxlIHRhZyBmcm9tIG91dHNpZGUuIFRoZXNlIGNhbiBiZTogc2VwYXJhdGVkLXJvd3MgKi9cbiAgIEBJbnB1dCgpXG4gICBnZXQgY3VzdG9tQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNsYXNzZXM7XG4gICB9XG5cbiAgIHNldCBjdXN0b21DbGFzc2VzKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMudGFibGVDbGFzc2VzW3RoaXMuX2N1c3RvbUNsYXNzZXNdID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY3VzdG9tQ2xhc3NlcyA9IG5ld1ZhbHVlO1xuICAgICAgdGhpcy50YWJsZUNsYXNzZXNbdGhpcy5fY3VzdG9tQ2xhc3Nlc10gPSB0aGlzLl9jdXN0b21DbGFzc2VzO1xuICAgfVxuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbc2VsZWN0ZWRBbGw9ZmFsc2VdIEl0IHNwZWNpZmllcyBpZiBhbGwgcm93cyBhcmUgc2VsZWN0ZWQgKi9cbiAgIEBJbnB1dCgpXG4gICBnZXQgc2VsZWN0ZWRBbGwoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBbGw7XG4gICB9XG5cbiAgIHNldCBzZWxlY3RlZEFsbChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRBbGwgPSBuZXdWYWx1ZTtcbiAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbaGFzSG92ZXJNZW51PWZhbHNlXSBJdCBzcGVjaWZpZXMgaWYgYSBtZW51IGhhcyB0byBiZSBkaXNwbGF5ZWQgd2hlbiB1c2VyIHB1dHMgdGhlIG1vdXNlIG92ZXJcbiAgICAqIHRoZSByb3dzLiBSZW1lbWJlciB0byBhZGQgYSBjZWxsIHdpdGggdGhlIHNlbGVjdG9yIHN0LXRhYmxlLXJvdy1ob3ZlciBmb3IgYWRkaW5nIGNvbnRlbnQgdG8gdGhlIG1lbnVcbiAgICAqL1xuICAgQElucHV0KClcbiAgIGdldCBoYXNIb3Zlck1lbnUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5faGFzSG92ZXJNZW51O1xuICAgfVxuXG4gICBzZXQgaGFzSG92ZXJNZW51KG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9oYXNIb3Zlck1lbnUgPSBuZXdWYWx1ZTtcbiAgIH1cblxuICAgLyoqIEBPdXRwdXQge09yZGVyfSBbY2hhbmdlT3JkZXI9JyddIEV2ZW50IGVtaXR0ZWQgd2l0aCB0aGUgbmV3IG9yZGVyIHdoaWNoIGhhcyB0byBiZSBhcHBsaWVkIHRvIHRoZSB0YWJsZSByb3dzICovXG4gICBAT3V0cHV0KCkgY2hhbmdlT3JkZXI6IEV2ZW50RW1pdHRlcjxPcmRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAvKiogQE91dHB1dCB7Ym9vbGVhbn0gW3NlbGVjdEFsbD0nJ10gRXZlbnQgZW1pdHRlZCB3aGVuIHVzZXIgaW50ZXJhY3RzIHdpdGggdGhlIGNoZWNrYm94IHRvIHNlbGVjdCBvciBkZXNlbGVjdFxuICAgICogYWxsIHJvd3NcbiAgICAqL1xuICAgQE91dHB1dCgpIHNlbGVjdEFsbDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAvKiogQE91dHB1dCB7c3RyaW5nfSBbY2xpY2tGaWx0ZXI9XSBFdmVudCBlbWl0dGVkIHdoZW4gY2xpY2tpbmcgb24gZmlsdGVycyBpY29uICAqL1xuICAgQE91dHB1dCgpIGNsaWNrRmlsdGVyOiBFdmVudEVtaXR0ZXI8U3RUYWJsZUhlYWRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgIC8qKiBAT3V0cHV0IHtTdFRhYmxlSGVhZGVyW119IFtzZWxlY3RGaWx0ZXJzPScnXSBFdmVudCBlbWl0dGVkICB3aGVuIHVzZXIgaW50ZXJhY3RzIHdpdGggZmlsdGVyIGJ1dHRvbiB3aXRob3V0IGEgY3VzdG9tIHRlbXBsYXRlICovXG4gICBAT3V0cHV0KCkgc2VsZWN0RmlsdGVyczogRXZlbnRFbWl0dGVyPFN0VGFibGVIZWFkZXJbXT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgIHB1YmxpYyB0YWJsZUNsYXNzZXM6IGFueSA9IHt9O1xuICAgcHVibGljIHZpc2libGVGaWx0ZXI6IG51bWJlciA9IC0xO1xuXG4gICBwcml2YXRlIF9maXhlZEhlYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICAgcHJpdmF0ZSBfc3RpY2t5SG92ZXJNZW51OiBib29sZWFuID0gZmFsc2U7XG4gICBwcml2YXRlIF9zZWxlY3RlZEFsbDogYm9vbGVhbjtcbiAgIHByaXZhdGUgX2hhc0hvdmVyTWVudTogYm9vbGVhbiA9IGZhbHNlO1xuICAgcHJpdmF0ZSBfY3VzdG9tQ2xhc3Nlczogc3RyaW5nO1xuXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgIH1cblxuICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJhYmxlICYmICF0aGlzLnN0YXR1c0ZpbHRlcikge1xuICAgICAgICAgdGhpcy5zdGF0dXNGaWx0ZXIgPSBuZXcgQXJyYXkodGhpcy5maWVsZHMubGVuZ3RoKTtcbiAgICAgICAgIHRoaXMuc3RhdHVzRmlsdGVyLmZpbGwoZmFsc2UpO1xuICAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgZ2V0SGVhZGVySXRlbUNsYXNzKGZpZWxkOiBTdFRhYmxlSGVhZGVyKTogc3RyaW5nIHtcbiAgICAgIGxldCBpc09yZGVyQXNjID0gdGhpcy5pc1NvcnRlZEJ5RmllbGRBbmREaXJlY3Rpb24oZmllbGQsIE9SREVSX1RZUEUuQVNDKTtcbiAgICAgIHJldHVybiBpc09yZGVyQXNjID8gdGhpcy5pY29uQ2xhc3Nlcy5zb3J0LmFzYyA6IHRoaXMuaWNvbkNsYXNzZXMuc29ydC5kZXNjO1xuICAgfVxuXG4gICBwdWJsaWMgaXNTb3J0YWJsZShmaWVsZDogU3RUYWJsZUhlYWRlcik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGZpZWxkICYmIGZpZWxkLnNvcnRhYmxlICE9PSB1bmRlZmluZWQgPyBmaWVsZC5zb3J0YWJsZSA6IHRoaXMuc29ydGFibGU7XG4gICB9XG5cbiAgIHB1YmxpYyBpc1NvcnRlZEJ5RmllbGQoZmllbGQ6IFN0VGFibGVIZWFkZXIpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRPcmRlciAmJiB0aGlzLmN1cnJlbnRPcmRlci5vcmRlckJ5ID09PSBmaWVsZC5pZDtcbiAgIH1cblxuICAgcHVibGljIGlzRmlsdGVyYWJsZShmaWVsZDogU3RUYWJsZUhlYWRlcik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyYWJsZSAmJiAoKF9nZXQoZmllbGQsICdmaWx0ZXJzLmZpbHRlckNvbmZpZycpKSB8fFxuICAgICAgICAgKHRoaXMudGVtcGxhdGVDb250ZW50RmlsdGVyICYmIF9nZXQoZmllbGQsICdmaWx0ZXJzJykpIHx8XG4gICAgICAgICBfZ2V0KGZpZWxkLCAnZmlsdGVycy50ZW1wbGF0ZVJlZicpKTtcbiAgIH1cblxuICAgcHVibGljIG9uSGlkZUZpbHRlck1lbnUoKTogdm9pZCB7XG4gICAgICB0aGlzLnZpc2libGVGaWx0ZXIgPSAtMTtcbiAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICBwdWJsaWMgb25DaGFuZ2VPcmRlcihmaWVsZDogU3RUYWJsZUhlYWRlcik6IHZvaWQge1xuICAgICAgbGV0IF9jdXJyZW50T3JkZXI6IE9yZGVyO1xuICAgICAgaWYgKGZpZWxkICYmIHRoaXMuaXNTb3J0YWJsZShmaWVsZCkpIHtcbiAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRPcmRlciAmJiB0aGlzLmN1cnJlbnRPcmRlci5vcmRlckJ5ID09PSBmaWVsZC5pZCkge1xuICAgICAgICAgICAgX2N1cnJlbnRPcmRlciA9IHRoaXMuY2hhbmdlT3JkZXJEaXJlY3Rpb24oKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfY3VycmVudE9yZGVyID0gbmV3IE9yZGVyKGZpZWxkLmlkLCBPUkRFUl9UWVBFLkFTQyk7XG4gICAgICAgICB9XG4gICAgICAgICB0aGlzLmNoYW5nZU9yZGVyLmVtaXQoX2N1cnJlbnRPcmRlcik7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBvblNlbGVjdEFsbChldmVudDogYW55KTogdm9pZCB7XG4gICAgICB0aGlzLnNlbGVjdEFsbC5lbWl0KGV2ZW50LmNoZWNrZWQpO1xuICAgfVxuXG4gICBwdWJsaWMgb25TZWxlY3RGaWx0ZXJzKCk6IHZvaWQge1xuICAgICAgbGV0IHNlbGVjdGVkRmlsdGVycyA9IF9jbG9uZURlZXAodGhpcy5maWVsZHMpO1xuICAgICAgc2VsZWN0ZWRGaWx0ZXJzID0gc2VsZWN0ZWRGaWx0ZXJzLmZpbHRlcigoZmllbGQpID0+IHtcbiAgICAgICAgIGlmIChfZ2V0KGZpZWxkLCAnZmlsdGVycy5maWx0ZXJDb25maWcnKSkge1xuICAgICAgICAgICAgZmllbGQuZmlsdGVycy5maWx0ZXJDb25maWcgPSBmaWVsZC5maWx0ZXJzLmZpbHRlckNvbmZpZy5maWx0ZXIoKGNvbmYpID0+IGNvbmYuc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmZpbHRlcnMuZmlsdGVyQ29uZmlnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RGaWx0ZXJzLmVtaXQoc2VsZWN0ZWRGaWx0ZXJzKTtcbiAgIH1cblxuICAgcHVibGljIG9uQ2hhbmdlRmlsdGVyVmlzaWJpbGl0eShldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlciwgZmllbGQ6IFN0VGFibGVIZWFkZXIpOiB2b2lkIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy52aXNpYmxlRmlsdGVyID0gdGhpcy52aXNpYmxlRmlsdGVyID09PSBpbmRleCA/IHVuZGVmaW5lZCA6IGluZGV4O1xuICAgICAgdGhpcy5jbGlja0ZpbHRlci5lbWl0KGZpZWxkKTtcbiAgICAgIHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0RmlsdGVySWNvbkNsYXNzZXMocG9zaXRpb246IG51bWJlcik6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcbiAgICAgIGNvbnN0IGNsYXNzZXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gICAgICBjbGFzc2VzWydzdC10YWJsZV9fZmlsdGVyLWFycm93J10gPSB0cnVlO1xuICAgICAgY2xhc3Nlc1t0aGlzLnN0YXR1c0ZpbHRlcltwb3NpdGlvbl0gPyB0aGlzLmljb25DbGFzc2VzLmZpbHRlci5zZWxlY3RlZCA6IHRoaXMuaWNvbkNsYXNzZXMuZmlsdGVyLmVuYWJsZWRdID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hhbmdlT3JkZXJEaXJlY3Rpb24oKTogT3JkZXIge1xuICAgICAgbGV0IG5ld0RpcmVjdGlvbiA9IHRoaXMuY3VycmVudE9yZGVyLnR5cGUgPT09IE9SREVSX1RZUEUuQVNDID8gT1JERVJfVFlQRS5ERVNDIDogT1JERVJfVFlQRS5BU0M7XG4gICAgICByZXR1cm4gbmV3IE9yZGVyKHRoaXMuY3VycmVudE9yZGVyLm9yZGVyQnksIG5ld0RpcmVjdGlvbik7XG4gICB9XG5cbiAgIHByaXZhdGUgaXNTb3J0ZWRCeUZpZWxkQW5kRGlyZWN0aW9uKGZpZWxkOiBTdFRhYmxlSGVhZGVyLCBvcmRlclR5cGU6IE9SREVSX1RZUEUpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmlzU29ydGVkQnlGaWVsZChmaWVsZCkgJiYgdGhpcy5jdXJyZW50T3JkZXIudHlwZSA9PT0gb3JkZXJUeXBlO1xuICAgfVxufVxuIl19