UNPKG

@stratio/egeo

Version:
611 lines 44.7 kB
/** * @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> * ``` * */ var StTableComponent = /** @class */ (function () { function StTableComponent(_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; } Object.defineProperty(StTableComponent.prototype, "fixedHeader", { /** @Input {boolean} [fixedHeader=false] Boolean to fix the table header */ get: /** * \@Input {boolean} [fixedHeader=false] Boolean to fix the table header * @return {?} */ function () { return this._fixedHeader; }, set: /** * @param {?} newValue * @return {?} */ function (newValue) { this._fixedHeader = newValue; }, enumerable: true, configurable: true }); Object.defineProperty(StTableComponent.prototype, "stickyHoverMenu", { /** @Input {boolean} [stickyHoverMenu=false] Boolean to fix hover menu always visible */ get: /** * \@Input {boolean} [stickyHoverMenu=false] Boolean to fix hover menu always visible * @return {?} */ function () { return this._stickyHoverMenu; }, set: /** * @param {?} newValue * @return {?} */ function (newValue) { this._stickyHoverMenu = newValue; }, enumerable: true, configurable: true }); Object.defineProperty(StTableComponent.prototype, "customClasses", { /** @Input {string} [customClasses=] Classes for adding styles to table tag from outside. These can be: separated-rows */ get: /** * \@Input {string} [customClasses=] Classes for adding styles to table tag from outside. These can be: separated-rows * @return {?} */ function () { return this._customClasses; }, set: /** * @param {?} newValue * @return {?} */ function (newValue) { this.tableClasses[this._customClasses] = undefined; this._customClasses = newValue; this.tableClasses[this._customClasses] = this._customClasses; }, enumerable: true, configurable: true }); Object.defineProperty(StTableComponent.prototype, "selectedAll", { /** @Input {boolean} [selectedAll=false] It specifies if all rows are selected */ get: /** * \@Input {boolean} [selectedAll=false] It specifies if all rows are selected * @return {?} */ function () { return this._selectedAll; }, set: /** * @param {?} newValue * @return {?} */ function (newValue) { this._selectedAll = newValue; this._cd.markForCheck(); }, enumerable: true, configurable: true }); Object.defineProperty(StTableComponent.prototype, "hasHoverMenu", { /** @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 */ get: /** * \@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 {?} */ function () { return this._hasHoverMenu; }, set: /** * @param {?} newValue * @return {?} */ function (newValue) { this._hasHoverMenu = newValue; }, enumerable: true, configurable: true }); /** * @return {?} */ StTableComponent.prototype.ngOnInit = /** * @return {?} */ function () { if (this.filterable && !this.statusFilter) { this.statusFilter = new Array(this.fields.length); this.statusFilter.fill(false); } }; /** * @param {?} field * @return {?} */ StTableComponent.prototype.getHeaderItemClass = /** * @param {?} field * @return {?} */ function (field) { /** @type {?} */ var isOrderAsc = this.isSortedByFieldAndDirection(field, ORDER_TYPE.ASC); return isOrderAsc ? this.iconClasses.sort.asc : this.iconClasses.sort.desc; }; /** * @param {?} field * @return {?} */ StTableComponent.prototype.isSortable = /** * @param {?} field * @return {?} */ function (field) { return field && field.sortable !== undefined ? field.sortable : this.sortable; }; /** * @param {?} field * @return {?} */ StTableComponent.prototype.isSortedByField = /** * @param {?} field * @return {?} */ function (field) { return this.currentOrder && this.currentOrder.orderBy === field.id; }; /** * @param {?} field * @return {?} */ StTableComponent.prototype.isFilterable = /** * @param {?} field * @return {?} */ function (field) { return this.filterable && ((_get(field, 'filters.filterConfig')) || (this.templateContentFilter && _get(field, 'filters')) || _get(field, 'filters.templateRef')); }; /** * @return {?} */ StTableComponent.prototype.onHideFilterMenu = /** * @return {?} */ function () { this.visibleFilter = -1; this._cd.markForCheck(); }; /** * @param {?} field * @return {?} */ StTableComponent.prototype.onChangeOrder = /** * @param {?} field * @return {?} */ function (field) { /** @type {?} */ var _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 {?} */ StTableComponent.prototype.onSelectAll = /** * @param {?} event * @return {?} */ function (event) { this.selectAll.emit(event.checked); }; /** * @return {?} */ StTableComponent.prototype.onSelectFilters = /** * @return {?} */ function () { /** @type {?} */ var selectedFilters = _cloneDeep(this.fields); selectedFilters = selectedFilters.filter((/** * @param {?} field * @return {?} */ function (field) { if (_get(field, 'filters.filterConfig')) { field.filters.filterConfig = field.filters.filterConfig.filter((/** * @param {?} conf * @return {?} */ function (conf) { return conf.selected; })); if (field.filters.filterConfig.length > 0) { return field; } } })); this.selectFilters.emit(selectedFilters); }; /** * @param {?} event * @param {?} index * @param {?} field * @return {?} */ StTableComponent.prototype.onChangeFilterVisibility = /** * @param {?} event * @param {?} index * @param {?} field * @return {?} */ function (event, index, field) { event.stopPropagation(); this.visibleFilter = this.visibleFilter === index ? undefined : index; this.clickFilter.emit(field); this._cd.markForCheck(); }; /** * @param {?} position * @return {?} */ StTableComponent.prototype.getFilterIconClasses = /** * @param {?} position * @return {?} */ function (position) { /** @type {?} */ var classes = {}; classes['st-table__filter-arrow'] = true; classes[this.statusFilter[position] ? this.iconClasses.filter.selected : this.iconClasses.filter.enabled] = true; return classes; }; /** * @private * @return {?} */ StTableComponent.prototype.changeOrderDirection = /** * @private * @return {?} */ function () { /** @type {?} */ var 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 {?} */ StTableComponent.prototype.isSortedByFieldAndDirection = /** * @private * @param {?} field * @param {?} orderType * @return {?} */ function (field, orderType) { return this.isSortedByField(field) && this.currentOrder.type === orderType; }; StTableComponent.ctorParameters = function () { return [ { 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 = function () { return [ { 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); return 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC10YWJsZS9zdC10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckosT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxTQUFTLElBQUksVUFBVSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTJLdkQsMEJBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1COzs7O1FBN0dqQyxXQUFNLEdBQVksSUFBSSxDQUFDOzs7OztRQUt2QixhQUFRLEdBQVksSUFBSSxDQUFDOzs7OztRQUt6QixlQUFVLEdBQVksS0FBSyxDQUFDOzs7OztRQUs1QixrQkFBYSxHQUFZLEtBQUssQ0FBQzs7OztRQVkvQixnQkFBVyxHQUF3QixJQUFJLGtCQUFrQixFQUFFLENBQUM7Ozs7UUE2RDNELGdCQUFXLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7O1FBSXRELGNBQVMsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7OztRQUd0RCxnQkFBVyxHQUFnQyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FB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LFlBQ0wsV0FBVyxTQUFDLHlCQUF5QjtnQ0FVckMsS0FBSzs4QkFZTCxLQUFLOytCQWFMLEtBQUs7OEJBVUwsTUFBTTs0QkFJTixNQUFNOzhCQUdOLE1BQU07Z0NBR04sTUFBTTs7SUF0R2dCO1FBQWIsVUFBVSxFQUFFOztvREFBeUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRnJDLGdCQUFnQjtRQVI1QixNQUFNLEVBQUU7aURBMkhtQixpQkFBaUI7T0FuSGhDLGdCQUFnQixDQXlNNUI7SUFBRCx1QkFBQztDQUFBLElBQUE7U0F6TVksZ0JBQWdCOzs7Ozs7SUFFMUIsa0NBQStDOzs7OztJQUUvQyxpQ0FBdUI7Ozs7O0lBRXZCLGtDQUFnQzs7Ozs7O0lBS2hDLG9DQUFrQzs7Ozs7O0lBS2xDLHNDQUFxQzs7Ozs7O0lBS3JDLHlDQUF3Qzs7Ozs7SUFHeEMsd0NBQTZCOzs7OztJQUc3QixpREFBa0Q7Ozs7O0lBR2xELHdDQUFrQzs7Ozs7SUFHbEMsdUNBQXFFOzs7OztJQTZEckUsdUNBQWdFOzs7Ozs7SUFJaEUscUNBQWdFOzs7OztJQUdoRSx1Q0FBd0U7Ozs7O0lBR3hFLHlDQUE0RTs7SUFFNUUsd0NBQThCOztJQUM5Qix5Q0FBa0M7Ozs7O0lBRWxDLHdDQUFzQzs7Ozs7SUFDdEMsNENBQTBDOzs7OztJQUMxQyx3Q0FBOEI7Ozs7O0lBQzlCLHlDQUF1Qzs7Ozs7SUFDdkMsMENBQStCOzs7OztJQUVuQiwrQkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogwqkgMjAxNyBTdHJhdGlvIEJpZyBEYXRhIEluYy4sIFN1Y3Vyc2FsIGVuIEVzcGHDsWEuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTtcbiAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4gKiBTZWUgdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAuXG4gKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN0RWdlbywgU3RSZXF1aXJlZCB9IGZyb20gJy4uL2RlY29yYXRvcnMvcmVxdWlyZS1kZWNvcmF0b3JzJztcbmltcG9ydCB7IE9yZGVyLCBPUkRFUl9UWVBFIH0gZnJvbSAnLi9zaGFyZWQvb3JkZXInO1xuaW1wb3J0IHsgU3RUYWJsZUhlYWRlciB9IGZyb20gJy4vc2hhcmVkL3RhYmxlLWhlYWRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIGFzIF9jbG9uZURlZXAsIGdldCBhcyBfZ2V0IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFN0VGFibGVJY29uQ2xhc3NlcyB9IGZyb20gJy4vc3QtdGFibGUuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24ge0NvbXBvbmVudH0gW1RhYmxlXVxuICpcbiAqIFRoZSB0YWJsZSBjb21wb25lbnQgaGFzIGJlZW4gZGVzaWduZWQgdG8gZGlzcGxheSBhbnkgY29udGVudCBsaWtlIGltYWdlcywgdGV4dCwgZ3JhcGhzLCBldGMuXG4gKlxuICogKiBAbW9kZWxcbiAqXG4gKiAgIFtTdFRhYmxlSGVhZGVyXSB7Li9zaGFyZWQvdGFibGUtaGVhZGVyLmludGVyZmFjZS50cyNTdFRhYmxlSGVhZGVyfVxuICogICBbU3REeW5hbWljVGFibGVIZWFkZXJdIHsuL3NoYXJlZC90YWJsZS1oZWFkZXIuaW50ZXJmYWNlLnRzI1N0RmlsdGVyRWxlbWVudH1cbiAqICAgW1N0RmlsdGVySGVhZGVyXSB7Li9zaGFyZWQvdGFibGUtaGVhZGVyLmludGVyZmFjZS50cyNTdEZpbHRlckhlYWRlcn1cbiAqICAgW1N0VGFibGVGaWx0ZXJJY29uQ2xhc3Nlc10gey4vc3QtdGFibGUuaW50ZXJmYWNlLnRzI1N0VGFibGVGaWx0ZXJJY29uQ2xhc3Nlc31cbiAqICAgW1N0VGFibGVJY29uQ2xhc3Nlc10gey4vc3QtdGFibGUuaW50ZXJmYWNlLnRzI1N0VGFibGVJY29uQ2xhc3Nlc31cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIHtodG1sfVxuICpcbiAqIGBgYFxuICogPHN0LXRhYmxlIFtmaWVsZHNdPVwiZmllbGRzXCIgW3NvcnRhYmxlXT1cInRydWVcIiAoY2hhbmdlT3JkZXIpPVwieW91ckZ1bmN0aW9uVG9PcmRlcigkZXZlbnQpXCI+XG4gKiA8dHIgc3QtdGFibGUtcm93ICpuZ0Zvcj1cImxldCB1c2VyRGF0YSBvZiBkYXRhXCI+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5pZH19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5uYW1lfX08L2xhYmVsPlxuICogPC90ZD5cbiAqIDx0ZCBzdC10YWJsZS1jZWxsIHN0LXRhYmxlLXJvdy1jb250ZW50PlxuICogICAgPGxhYmVsID57e3VzZXJEYXRhLmxhc3ROYW1lfX08L2xhYmVsPlxuICogPC90ZD5cbiAqIDx0ZCBzdC10YWJsZS1jZWxsIHN0LXRhYmxlLXJvdy1jb250ZW50PlxuICogICAgPGxhYmVsID57e3VzZXJEYXRhLnBob25lfX08L2xhYmVsPlxuICogPC90ZD5cbiAqIDx0ZCBzdC10YWJsZS1jZWxsIHN0LXRhYmxlLXJvdy1jb250ZW50PlxuICogICAgPGxhYmVsID57e3VzZXJEYXRhLmNvbXBhbnl9fTwvbGFiZWw+XG4gKiA8L3RkPlxuICogPHRkIHN0LXRhYmxlLWNlbGwgc3QtdGFibGUtcm93LWNvbnRlbnQ+XG4gKiAgICA8bGFiZWwgPnt7dXNlckRhdGEuY29tcGxldGVkUHJvZmlsZX19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtcm93LWhvdmVyPlxuICogICAgPGkgY2xhc3M9XCJpY29uIGljb24tYXJyb3cyX3JpZ2h0XCI+PC9pPlxuICogPC90ZD5cbiAqIDwvdHI+XG4gKiA8L3N0LXRhYmxlPlxuICogYGBgXG4gKlxuICovXG5AU3RFZ2VvKClcbkBDb21wb25lbnQoe1xuICAgc2VsZWN0b3I6ICdzdC10YWJsZScsXG4gICB0ZW1wbGF0ZVVybDogJy4vc3QtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgc3R5bGVVcmxzOiBbJy4vc3QtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuXG5leHBvcnQgY2xhc3MgU3RUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAvKiogQElucHV0IHtTdFRhYmxlSGVhZGVyW119IFtmaWVsZHM9JyddIExpc3Qgb2YgZmllbGQgZGlzcGxheWVkIGluIHRoZSBoZWFkZXIgKi9cbiAgIEBJbnB1dCgpIEBTdFJlcXVpcmVkKCkgZmllbGRzOiBTdFRhYmxlSGVhZGVyW107XG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtxYVRhZz0nJ10gUHJlZml4IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGlkIHZhbHVlcyBmb3IgcWEgdGVzdHMgKi9cbiAgIEBJbnB1dCgpIHFhVGFnOiBzdHJpbmc7XG4gICAvKiogQElucHV0IHtib29sZWFufSBbaGVhZGVyPXRydWVdIEJvb2xlYW4gdG8gc2hvdyBvciBoaWRlIHRoZSBoZWFkZXIgKi9cbiAgIEBJbnB1dCgpIGhlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gICAvKipcbiAgICAqIEBJbnB1dCB7Ym9vbGVhbn0gW3NvcnRhYmxlPXRydWVdIEJvb2xlYW4gdG8gbWFrZSBzb3J0YWJsZSB0aGUgdGFibGUsIFRvIGVuYWJsZSBzb3J0aW5nIG9mIGNvbHVtbnMgdXNlXG4gICAgKiB0aGUgbmV3IFwic29ydGFibGVcIiBmaWVsZCBpbnNpZGUgc3RUYWJsZUhlYWRlciBtb2RlbFxuICAgICovXG4gICBASW5wdXQoKSBzb3J0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gICAvKipcbiAgICAqIEBJbnB1dCB7Ym9vbGVhbn0gW2ZpbHRlcmFibGU9dHJ1ZV0gQm9vbGVhbiB0byBtYWtlIGZpbHRlcmFibGUgdGhlIHRhYmxlLCBUbyBlbmFibGUgZmlsdGVyaW5nIG9mIGNvbHVtbnMgdXNlXG4gICAgKiB0aGUgbmV3IFwiZmlsdGVyYWJsZVwiIGZpZWxkIGluc2lkZSBzdFRhYmxlSGVhZGVyIG1vZGVsIChuZWNlc3NhcnkgZGVmaW5lIGZpbHRlckNvbmZpZykuXG4gICAgKi9cbiAgIEBJbnB1dCgpIGZpbHRlcmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgIC8qKlxuICAgICogQElucHV0IHtib29sZWFufSBbc2VsZWN0YWJsZUFsbD1mYWxzZV0gQm9vbGVhbiB0byBzaG93IG9yIGhpZGUgYSBjaGVja2JveCBpbiB0aGUgaGVhZGVyIHRvIHNlbGVjdCBvclxuICAgICogIGRlc2VsZWN0IGFsbCByb3dzXG4gICAgKi9cbiAgIEBJbnB1dCgpIHNlbGVjdGFibGVBbGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgLyoqIEBJbnB1dCB7T3JkZXJ9IFtjdXJyZW50T3JkZXI9JyddIEl0IHNwZWNpZmllcyB3aGF0IGlzIHRoZSBjdXJyZW50IG9yZGVyIGFwcGxpZWQgdG8gdGhlIHRhYmxlICovXG4gICBASW5wdXQoKSBjdXJyZW50T3JkZXI6IE9yZGVyO1xuXG4gICAvKiogQElucHV0IHtUZW1wbGF0ZVJlZn0gW3RlbXBsYXRlQ29udGVudEZpbHRlcj11bmRlZmluZWRdIFJlZmVyZW5jZSB0byBwYWludCBhIGN1c3RvbSB0ZW1wbGF0ZSBpbnNpZGUgcG9wb3ZlciBjb250ZW50ICovXG4gICBASW5wdXQoKSB0ZW1wbGF0ZUNvbnRlbnRGaWx0ZXI/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAvKiogQElucHV0IHtib29sZWFuW119IFtzdGF0dXNGaWx0ZXI9JyddIExpc3Qgb2Ygc3RhdHVzIGZpbHRlciBieSBjb2x1bW4sIG5lZWRlZCB3aXRoIHRlbXBsYXRlQ29udGVudEZpbHRlciAqL1xuICAgQElucHV0KCkgc3RhdHVzRmlsdGVyPzogYm9vbGVhbltdO1xuXG4gICAvKiogQElucHV0IHtTdFRhYmxlSWNvbkNsYXNzZXN9IFtpY29uQ2xhc3Nlcz0nJ10gTGlzdCBvZiBpY29uIGNsYXNzZXMgKi9cbiAgIEBJbnB1dCgpIGljb25DbGFzc2VzPzogU3RUYWJsZUljb25DbGFzc2VzID0gbmV3IFN0VGFibGVJY29uQ2xhc3NlcygpO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbZml4ZWRIZWFkZXI9ZmFsc2VdIEJvb2xlYW4gdG8gZml4IHRoZSB0YWJsZSBoZWFkZXIgKi9cbiAgIEBJbnB1dCgpXG4gICBASG9zdEJpbmRpbmcoJ2NsYXNzLnN0LWN1c3RvbS1zY3JvbGxiYXInKVxuICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5maXhlZC1oZWFkZXInKVxuICAgZ2V0IGZpeGVkSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpeGVkSGVhZGVyO1xuICAgfVxuXG4gICBzZXQgZml4ZWRIZWFkZXIobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuX2ZpeGVkSGVhZGVyID0gbmV3VmFsdWU7XG4gICB9XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtzdGlja3lIb3Zlck1lbnU9ZmFsc2VdIEJvb2xlYW4gdG8gZml4IGhvdmVyIG1lbnUgYWx3YXlzIHZpc2libGUgKi9cbiAgIEBJbnB1dCgpXG4gICBASG9zdEJpbmRpbmcoJ2NsYXNzLnN0aWNreS1ob3Zlci1tZW51JylcbiAgIGdldCBzdGlja3lIb3Zlck1lbnUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RpY2t5SG92ZXJNZW51O1xuICAgfVxuXG4gICBzZXQgc3RpY2t5SG92ZXJNZW51KG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9zdGlja3lIb3Zlck1lbnUgPSBuZXdWYWx1ZTtcbiAgIH1cblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbY3VzdG9tQ2xhc3Nlcz1dIENsYXNzZXMgZm9yIGFkZGluZyBzdHlsZXMgdG8gdGFibGUgdGFnIGZyb20gb3V0c2lkZS4gVGhlc2UgY2FuIGJlOiBzZXBhcmF0ZWQtcm93cyAqL1xuICAgQElucHV0KClcbiAgIGdldCBjdXN0b21DbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ2xhc3NlcztcbiAgIH1cblxuICAgc2V0IGN1c3RvbUNsYXNzZXMobmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy50YWJsZUNsYXNzZXNbdGhpcy5fY3VzdG9tQ2xhc3Nlc10gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jdXN0b21DbGFzc2VzID0gbmV3VmFsdWU7XG4gICAgICB0aGlzLnRhYmxlQ2xhc3Nlc1t0aGlzLl9jdXN0b21DbGFzc2VzXSA9IHRoaXMuX2N1c3RvbUNsYXNzZXM7XG4gICB9XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtzZWxlY3RlZEFsbD1mYWxzZV0gSXQgc3BlY2lmaWVzIGlmIGFsbCByb3dzIGFyZSBzZWxlY3RlZCAqL1xuICAgQElucHV0KClcbiAgIGdldCBzZWxlY3RlZEFsbCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEFsbDtcbiAgIH1cblxuICAgc2V0IHNlbGVjdGVkQWxsKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZEFsbCA9IG5ld1ZhbHVlO1xuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtoYXNIb3Zlck1lbnU9ZmFsc2VdIEl0IHNwZWNpZmllcyBpZiBhIG1lbnUgaGFzIHRvIGJlIGRpc3BsYXllZCB3aGVuIHVzZXIgcHV0cyB0aGUgbW91c2Ugb3ZlclxuICAgICogdGhlIHJvd3MuIFJlbWVtYmVyIHRvIGFkZCBhIGNlbGwgd2l0aCB0aGUgc2VsZWN0b3Igc3QtdGFibGUtcm93LWhvdmVyIGZvciBhZGRpbmcgY29udGVudCB0byB0aGUgbWVudVxuICAgICovXG4gICBASW5wdXQoKVxuICAgZ2V0IGhhc0hvdmVyTWVudSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYXNIb3Zlck1lbnU7XG4gICB9XG5cbiAgIHNldCBoYXNIb3Zlck1lbnUobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuX2hhc0hvdmVyTWVudSA9IG5ld1ZhbHVlO1xuICAgfVxuXG4gICAvKiogQE91dHB1dCB7T3JkZXJ9IFtjaGFuZ2VPcmRlcj0nJ10gRXZlbnQgZW1pdHRlZCB3aXRoIHRoZSBuZXcgb3JkZXIgd2hpY2ggaGFzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHRhYmxlIHJvd3MgKi9cbiAgIEBPdXRwdXQoKSBjaGFuZ2VPcmRlcjogRXZlbnRFbWl0dGVyPE9yZGVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgIC8qKiBAT3V0cHV0IHtib29sZWFufSBbc2VsZWN0QWxsPScnXSBFdmVudCBlbWl0dGVkIHdoZW4gdXNlciBpbnRlcmFjdHMgd2l0aCB0aGUgY2hlY2tib3ggdG8gc2VsZWN0IG9yIGRlc2VsZWN0XG4gICAgKiBhbGwgcm93c1xuICAgICovXG4gICBAT3V0cHV0KCkgc2VsZWN0QWxsOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgIC8qKiBAT3V0cHV0IHtzdHJpbmd9IFtjbGlja0ZpbHRlcj1dIEV2ZW50IGVtaXR0ZWQgd2hlbiBjbGlja2luZyBvbiBmaWx0ZXJzIGljb24gICovXG4gICBAT3V0cHV0KCkgY2xpY2tGaWx0ZXI6IEV2ZW50RW1pdHRlcjxTdFRhYmxlSGVhZGVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgLyoqIEBPdXRwdXQge1N0VGFibGVIZWFkZXJbXX0gW3NlbGVjdEZpbHRlcnM9JyddIEV2ZW50IGVtaXR0ZWQgIHdoZW4gdXNlciBpbnRlcmFjdHMgd2l0aCBmaWx0ZXIgYnV0dG9uIHdpdGhvdXQgYSBjdXN0b20gdGVtcGxhdGUgKi9cbiAgIEBPdXRwdXQoKSBzZWxlY3RGaWx0ZXJzOiBFdmVudEVtaXR0ZXI8U3RUYWJsZUhlYWRlcltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgcHVibGljIHRhYmxlQ2xhc3NlczogYW55ID0ge307XG4gICBwdWJsaWMgdmlzaWJsZUZpbHRlcjogbnVtYmVyID0gLTE7XG5cbiAgIHByaXZhdGUgX2ZpeGVkSGVhZGVyOiBib29sZWFuID0gZmFsc2U7XG4gICBwcml2YXRlIF9zdGlja3lIb3Zlck1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgIHByaXZhdGUgX3NlbGVjdGVkQWxsOiBib29sZWFuO1xuICAgcHJpdmF0ZSBfaGFzSG92ZXJNZW51OiBib29sZWFuID0gZmFsc2U7XG4gICBwcml2YXRlIF9jdXN0b21DbGFzc2VzOiBzdHJpbmc7XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgfVxuXG4gICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUgJiYgIXRoaXMuc3RhdHVzRmlsdGVyKSB7XG4gICAgICAgICB0aGlzLnN0YXR1c0ZpbHRlciA9IG5ldyBBcnJheSh0aGlzLmZpZWxkcy5sZW5ndGgpO1xuICAgICAgICAgdGhpcy5zdGF0dXNGaWx0ZXIuZmlsbChmYWxzZSk7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBnZXRIZWFkZXJJdGVtQ2xhc3MoZmllbGQ6IFN0VGFibGVIZWFkZXIpOiBzdHJpbmcge1xuICAgICAgbGV0IGlzT3JkZXJBc2MgPSB0aGlzLmlzU29ydGVkQnlGaWVsZEFuZERpcmVjdGlvbihmaWVsZCwgT1JERVJfVFlQRS5BU0MpO1xuICAgICAgcmV0dXJuIGlzT3JkZXJBc2MgPyB0aGlzLmljb25DbGFzc2VzLnNvcnQuYXNjIDogdGhpcy5pY29uQ2xhc3Nlcy5zb3J0LmRlc2M7XG4gICB9XG5cbiAgIHB1YmxpYyBpc1NvcnRhYmxlKGZpZWxkOiBTdFRhYmxlSGVhZGVyKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZmllbGQgJiYgZmllbGQuc29ydGFibGUgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnNvcnRhYmxlIDogdGhpcy5zb3J0YWJsZTtcbiAgIH1cblxuICAgcHVibGljIGlzU29ydGVkQnlGaWVsZChmaWVsZDogU3RUYWJsZUhlYWRlcik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudE9yZGVyICYmIHRoaXMuY3VycmVudE9yZGVyLm9yZGVyQnkgPT09IGZpZWxkLmlkO1xuICAgfVxuXG4gICBwdWJsaWMgaXNGaWx0ZXJhYmxlKGZpZWxkOiBTdFRhYmxlSGVhZGVyKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJhYmxlICYmICgoX2dldChmaWVsZCwgJ2ZpbHRlcnMuZmlsdGVyQ29uZmlnJykpIHx8XG4gICAgICAgICAodGhpcy50ZW1wbGF0ZUNvbnRlbnRGaWx0ZXIgJiYgX2dldChmaWVsZCwgJ2ZpbHRlcnMnKSkgfHxcbiAgICAgICAgIF9nZXQoZmllbGQsICdmaWx0ZXJzLnRlbXBsYXRlUmVmJykpO1xuICAgfVxuXG4gICBwdWJsaWMgb25IaWRlRmlsdGVyTWVudSgpOiB2b2lkIHtcbiAgICAgIHRoaXMudmlzaWJsZUZpbHRlciA9IC0xO1xuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIHB1YmxpYyBvbkNoYW5nZU9yZGVyKGZpZWxkOiBTdFRhYmxlSGVhZGVyKTogdm9pZCB7XG4gICAgICBsZXQgX2N1cnJlbnRPcmRlcjogT3JkZXI7XG4gICAgICBpZiAoZmllbGQgJiYgdGhpcy5pc1NvcnRhYmxlKGZpZWxkKSkge1xuICAgICAgICAgaWYgKHRoaXMuY3VycmVudE9yZGVyICYmIHRoaXMuY3VycmVudE9yZGVyLm9yZGVyQnkgPT09IGZpZWxkLmlkKSB7XG4gICAgICAgICAgICBfY3VycmVudE9yZGVyID0gdGhpcy5jaGFuZ2VPcmRlckRpcmVjdGlvbigpO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9jdXJyZW50T3JkZXIgPSBuZXcgT3JkZXIoZmllbGQuaWQsIE9SREVSX1RZUEUuQVNDKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuY2hhbmdlT3JkZXIuZW1pdChfY3VycmVudE9yZGVyKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIG9uU2VsZWN0QWxsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgIHRoaXMuc2VsZWN0QWxsLmVtaXQoZXZlbnQuY2hlY2tlZCk7XG4gICB9XG5cbiAgIHB1YmxpYyBvblNlbGVjdEZpbHRlcnMoKTogdm9pZCB7XG4gICAgICBsZXQgc2VsZWN0ZWRGaWx0ZXJzID0gX2Nsb25lRGVlcCh0aGlzLmZpZWxkcyk7XG4gICAgICBzZWxlY3RlZEZpbHRlcnMgPSBzZWxlY3RlZEZpbHRlcnMuZmlsdGVyKChmaWVsZCkgPT4ge1xuICAgICAgICAgaWYgKF9nZXQoZmllbGQsICdmaWx0ZXJzLmZpbHRlckNvbmZpZycpKSB7XG4gICAgICAgICAgICBmaWVsZC5maWx0ZXJzLmZpbHRlckNvbmZpZyA9IGZpZWxkLmZpbHRlcnMuZmlsdGVyQ29uZmlnLmZpbHRlcigoY29uZikgPT4gY29uZi5zZWxlY3RlZCk7XG4gICAgICAgICAgICBpZiAoZmllbGQuZmlsdGVycy5maWx0ZXJDb25maWcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNlbGVjdEZpbHRlcnMuZW1pdChzZWxlY3RlZEZpbHRlcnMpO1xuICAgfVxuXG4gICBwdWJsaWMgb25DaGFuZ2VGaWx0ZXJWaXNpYmlsaXR5KGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyLCBmaWVsZDogU3RUYWJsZUhlYWRlcik6IHZvaWQge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLnZpc2libGVGaWx0ZXIgPSB0aGlzLnZpc2libGVGaWx0ZXIgPT09IGluZGV4ID8gdW5kZWZpbmVkIDogaW5kZXg7XG4gICAgICB0aGlzLmNsaWNrRmlsdGVyLmVtaXQoZmllbGQpO1xuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIHB1YmxpYyBnZXRGaWx0ZXJJY29uQ2xhc3Nlcyhwb3NpdGlvbjogbnVtYmVyKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0ge1xuICAgICAgY29uc3QgY2xhc3NlczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICAgIGNsYXNzZXNbJ3N0LXRhYmxlX19maWx0ZXItYXJyb3cnXSA9IHRydWU7XG4gICAgICBjbGFzc2VzW3RoaXMuc3RhdHVzRmlsdGVyW3Bvc2l0aW9uXSA/IHRoaXMuaWNvbkNsYXNzZXMuZmlsdGVyLnNlbGVjdGVkIDogdGhpcy5pY29uQ2xhc3Nlcy5maWx0ZXIuZW5hYmxlZF0gPSB0cnVlO1xuXG4gICAgICByZXR1cm4gY2xhc3NlcztcbiAgIH1cblxuICAgcHJpdmF0ZSBjaGFuZ2VPcmRlckRpcmVjdGlvbigpOiBPcmRlciB7XG4gICAgICBsZXQgbmV3RGlyZWN0aW9uID0gdGhpcy5jdXJyZW50T3JkZXIudHlwZSA9PT0gT1JERVJfVFlQRS5BU0MgPyBPUkRFUl9UWVBFLkRFU0MgOiBPUkRFUl9UWVBFLkFTQztcbiAgICAgIHJldHVybiBuZXcgT3JkZXIodGhpcy5jdXJyZW50T3JkZXIub3JkZXJCeSwgbmV3RGlyZWN0aW9uKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBpc1NvcnRlZEJ5RmllbGRBbmREaXJlY3Rpb24oZmllbGQ6IFN0VGFibGVIZWFkZXIsIG9yZGVyVHlwZTogT1JERVJfVFlQRSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaXNTb3J0ZWRCeUZpZWxkKGZpZWxkKSAmJiB0aGlzLmN1cnJlbnRPcmRlci50eXBlID09PSBvcmRlclR5cGU7XG4gICB9XG59XG4iXX0=