UNPKG

@hxui/angular

Version:

* * *

537 lines 62.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, EventEmitter } from '@angular/core'; import { ITabularConfig } from './tabular-config.interface'; import { ActionConfigRouteType } from './actions-config.interface'; import { TabularSortByService, SortByDirection } from './tabular-sort-by.service'; import { TabularConfig } from './tabular.config'; import { TabularSize } from './tabular-size.enum'; import { TabularColumnTypes } from './tabular-column.interface'; import { Context } from '../enums'; import * as _ from 'lodash'; var TabularComponent = /** @class */ (function () { function TabularComponent(conf, sortByService) { var _this = this; this.conf = conf; this.sortByService = sortByService; /** * Event fired when refresh is called. * Host should refresh data of input. */ this.refresh = new EventEmitter(); /** * Event fired when a row is clicked. */ this.rowClick = new EventEmitter(); /** * Event fired when a column is sorted */ this.onSort = new EventEmitter(); this.oldRows = []; this.pagedItems = []; this.TabularColumnTypes = TabularColumnTypes; this.TabularSize = TabularSize; this.ActionConfigRouteType = ActionConfigRouteType; this.selectAll = false; this.Context = Context; this.SortByDirection = SortByDirection; this.toggleSelectAll = function ($event) { for (var i = 0; i < _this.rows.length; i++) { _this.rows[i].checked = _this.selectAll; } }; this.toggleIndividualSelect = function ($event) { /** @type {?} */ var count = 0; for (var i = 0; i < _this.rows.length; i++) { if (_this.rows[i].checked) { count++; } } _this.selectAll = (_this.rows.length === count); }; Object.assign(this, conf); } Object.defineProperty(TabularComponent.prototype, "config", { /** * Tabular configuration * IPaginationInstance, ISearchConfig */ get: /** * Tabular configuration * IPaginationInstance, ISearchConfig * @return {?} */ function () { return this._config; }, set: /** * @param {?} c * @return {?} */ function (c) { if (!c.sortBy) { c.sortBy = []; } this._config = c; }, enumerable: true, configurable: true }); Object.defineProperty(TabularComponent.prototype, "callback", { /** The function to call when a action item is clicked **/ get: /** * The function to call when a action item is clicked * * @return {?} */ function () { return this._callback; }, set: /** * @param {?} Fn * @return {?} */ function (Fn) { this._callback = Fn; }, enumerable: true, configurable: true }); Object.defineProperty(TabularComponent.prototype, "searchTerm", { /** * Search term is used in the simple search pipe * Array of objects: *ngFor="#row of rows | simpleSearch : 'the search term'" */ get: /** * Search term is used in the simple search pipe * Array of objects: *ngFor="#row of rows | simpleSearch : 'the search term'" * @return {?} */ function () { return this._searchTerm; }, set: /** * @param {?} term * @return {?} */ function (term) { this._searchTerm = term; }, enumerable: true, configurable: true }); /** * @return {?} */ TabularComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @return {?} */ TabularComponent.prototype.ngDoCheck = /** * @return {?} */ function () { if (!_.isEqual(this.rows, this.oldRows)) { this.oldRows = _.cloneDeep(this.rows); this.orderByData(false); } }; /** * Calls the parsed callback with optional arguments */ /** * Calls the parsed callback with optional arguments * @param {?} event * @param {?} cb * @return {?} */ TabularComponent.prototype.executeCallback = /** * Calls the parsed callback with optional arguments * @param {?} event * @param {?} cb * @return {?} */ function (event, cb) { if (cb.length) { if (cb.length === 1) { // if callback has no arguments cb[0](); } else { // if callback has 1 or more arguments // if callback has 1 or more arguments /** @type {?} */ var args = []; for (var i = 1; i < cb.length; i++) { args.push(cb[i]); } cb[0].apply(this, args); } } }; /** * @param {?=} $event * @return {?} */ TabularComponent.prototype.setPage = /** * @param {?=} $event * @return {?} */ function ($event) { if ($event === void 0) { $event = { page: this.config.pagination.currentPage, itemsPerPage: this.config.pagination.itemsPerPage }; } this.config.pagination.currentPage = $event.page; // calculate start and end page item indexes /** @type {?} */ var startIndex = (this.config.pagination.currentPage - 1) * this.config.pagination.itemsPerPage; /** @type {?} */ var endIndex = Math.min(startIndex + this.config.pagination.itemsPerPage - 1, this.totalItemCount - 1); this.pagedItems = this.rows.slice(startIndex, endIndex + 1); }; /** * Get the action tooltip if it exists */ /** * Get the action tooltip if it exists * @param {?} action * @return {?} */ TabularComponent.prototype.getActionTooltip = /** * Get the action tooltip if it exists * @param {?} action * @return {?} */ function (action) { return (action && action.disabledConfig) ? action.disabledConfig.tooltip : ''; }; /** * @param {?} action * @return {?} */ TabularComponent.prototype.getActionDisabledState = /** * @param {?} action * @return {?} */ function (action) { return (action && action.disabledConfig) ? action.disabledConfig.disabled : false; }; /** * Handles the column header click event for sorting. * Sort order is Descending, Ascending followed by None. */ /** * Handles the column header click event for sorting. * Sort order is Descending, Ascending followed by None. * @param {?} key * @param {?} type * @return {?} */ TabularComponent.prototype.onSortClickHandler = /** * Handles the column header click event for sorting. * Sort order is Descending, Ascending followed by None. * @param {?} key * @param {?} type * @return {?} */ function (key, type) { /** @type {?} */ var findPropInSortList = this.config.sortBy.filter(function (prop) { return (prop.property === key); }); if (findPropInSortList.length) { /** @type {?} */ var prop_1 = findPropInSortList[0]; /** @type {?} */ var index = this.config.sortBy.findIndex(function (x) { return x === prop_1; }); if (prop_1.direction === SortByDirection.None) { prop_1.direction = SortByDirection.Descending; } else if (prop_1.direction === SortByDirection.Descending) { prop_1.direction = SortByDirection.Ascending; } else if (prop_1.direction === SortByDirection.Ascending) { if (index > -1) { this.config.sortBy.splice(index, 1); } } } else { if (!this.config.multiSorting) { this.config.sortBy = []; } this.config.sortBy.push({ property: key, direction: SortByDirection.Descending, type: type }); } this.orderByData(true); return false; }; /** * @param {?} key * @param {?} direction * @return {?} */ TabularComponent.prototype.isColumnSorted = /** * @param {?} key * @param {?} direction * @return {?} */ function (key, direction) { /** @type {?} */ var findPropInSortList = this.config.sortBy.filter(function (prop) { return (prop.property === key && prop.direction === direction); }); return (findPropInSortList.length > 0); }; /** * Handles the row click event. */ /** * Handles the row click event. * @param {?} $event * @param {?} data * @return {?} */ TabularComponent.prototype.onRowClickHandler = /** * Handles the row click event. * @param {?} $event * @param {?} data * @return {?} */ function ($event, data) { /** @type {?} */ var el = $event.target; if (this.config.clickableRows) { if (el.parentElement.tagName === 'BUTTON' || el.tagName === 'BUTTON' || el.parentElement.classList.contains('hx-checkbox-control')) { return; } this.rowClick.emit(data); } }; /** * @param {?} emitSortEvent * @return {?} */ TabularComponent.prototype.orderByData = /** * @param {?} emitSortEvent * @return {?} */ function (emitSortEvent) { if (this.config.sortBy.length > 0) { if (!this.config.remoteSorting) { this.rows = tslib_1.__spread(this.rows); // Required as array-sort-by mutates the original array this.sortByService.sortBy(this.rows, this.config.sortBy); } } if (emitSortEvent) { this.onSort.emit(this.config.sortBy); } this.setPage(); }; Object.defineProperty(TabularComponent.prototype, "totalItemCount", { get: /** * @return {?} */ function () { return this.rows.length; }, enumerable: true, configurable: true }); /** * Helper to determine if tabular instance is in small mode */ /** * Helper to determine if tabular instance is in small mode * @return {?} */ TabularComponent.prototype.isSmall = /** * Helper to determine if tabular instance is in small mode * @return {?} */ function () { return (this.config.size === TabularSize.Small); }; /** * @param {?} colData * @return {?} */ TabularComponent.prototype.hasValidBadgeTypeParams = /** * @param {?} colData * @return {?} */ function (colData) { if (colData) { if (typeof colData.label !== 'undefined') { return true; } else { console.error('Record for column type badge is invalid, make sure you have the right type. ITabularColumnTypeBadge', { columnValue: colData }); } } return false; }; /** * @param {?} colData * @return {?} */ TabularComponent.prototype.hasValidIconTypeParams = /** * @param {?} colData * @return {?} */ function (colData) { /** @type {?} */ var hasError = false; if (colData) { if (typeof colData.icon !== 'undefined') { if (typeof colData.tooltip.config !== 'undefined' && typeof colData.tooltip.content !== 'undefined') { if (typeof colData.tooltip.config.context !== 'undefined' || typeof colData.tooltip.config.placement !== 'undefined') { return true; } else { hasError = true; } } else { hasError = true; } } else { hasError = true; } } if (hasError) { console.error('Record for column type icon is invalid, make sure you have the right type. ITabularColumnTypeIcon', { columnValue: colData }); } return false; }; /** * @param {?} colData * @return {?} */ TabularComponent.prototype.getTooltipContext = /** * @param {?} colData * @return {?} */ function (colData) { return (!this.hasValidIconTypeParams(colData)) ? colData.tooltip.config.context : Context.None; }; /** * @param {?} action * @return {?} */ TabularComponent.prototype.hasChildren = /** * @param {?} action * @return {?} */ function (action) { return (action.children && action.children.length > 0); }; /** * @param {?} index * @param {?} action * @return {?} */ TabularComponent.prototype.trackByFn = /** * @param {?} index * @param {?} action * @return {?} */ function (index, action) { return index; // or action.id }; TabularComponent.decorators = [ { type: Component, args: [{ selector: 'hxa-tabular', template: "<table class=\"tabular hx-table is-striped {{config.cssClass}}\"\n [class.is-hover]=\"config.clickableRows\"\n [class.is-narrow]=\"config.size === TabularSize.Small\"\n [class.has-sticky-header]=\"config.stickyHeader\">\n <thead>\n <tr>\n <th *ngFor=\"let col of columns\" class=\"{{col.cssClass}} tabular__{{col.label}}\" [ngClass]=\"{'tabular__checkboxes': col.dataType === TabularColumnTypes.Checkbox, 'tabular__sortable': col.sortable}\">\n\n <!-- sortable column -->\n <a class=\"tabular__sorter\" href=\"#\" *ngIf=\"col.sortable && col.dataType != TabularColumnTypes.Checkbox\" (click)=\"onSortClickHandler(col.id, col.dataType)\">{{col.label}} <i class=\"hx-icon icon-arrow-up is-small\" [class.icon-arrow-up]=\"isColumnSorted(col.id, SortByDirection.Ascending)\" [class.icon-arrow-down]=\"isColumnSorted(col.id, SortByDirection.Descending)\" *ngIf=\"isColumnSorted(col.id, SortByDirection.Descending) || isColumnSorted(col.id, SortByDirection.Ascending)\"></i></a>\n\n <!-- non sortable column -->\n <span *ngIf=\"!col.sortable && col.dataType !== TabularColumnTypes.Checkbox\">{{col.label}}</span>\n\n <!-- checkbox column -->\n <div *ngIf=\"col.dataType === TabularColumnTypes.Checkbox\" class=\"hx-checkbox-control\">\n <input id=\"selectAll\" name=\"selectAll\" type=\"checkbox\" class=\"hx-checkbox\" (change)=\"toggleSelectAll($event)\" title=\"Select All\" [(ngModel)]=\"selectAll\" />\n <label for=\"selectAll\" class=\"hx-label\"></label>\n </div>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <!--<tr *ngFor=\"let row of rows | paginate: config.pagination | simpleSearch: searchTerm\">-->\n <tr *ngFor=\"let row of pagedItems\"\n (click)=\"onRowClickHandler($event, row)\"\n [class.is-selected]=\"row.selected\"\n [class.is-danger]=\"row.context && row.context === Context.Danger\"\n [class.is-warning]=\"row.context && row.context === Context.Warning\"\n [class.is-info]=\"row.context && row.context === Context.Info\"\n [class.is-success]=\"row.context && row.context === Context.Success\"\n [class.has-stripe-danger]=\"row.stripeContext && row.stripeContext === Context.Danger\"\n [class.has-stripe-warning]=\"row.stripeContext && row.stripeContext === Context.Warning\"\n [class.has-stripe-info]=\"row.stripeContext && row.stripeContext === Context.Info\"\n [class.has-stripe-success]=\"row.stripeContext && row.stripeContext === Context.Success\"\n [ngClass]=\"[row.cssClass? row.cssClass : '']\"\n [attr.title]=\"row.title ? row.title : ''\">\n <td *ngFor=\"let col of columns\" class=\"{{col.cssClass}} tabular__{{col.label}}\" [ngClass]=\"{'tabular__checkboxes': col.dataType === TabularColumnTypes.Checkbox}\">\n\n <!-- checkbox type -->\n <div *ngIf=\"col.dataType === TabularColumnTypes.Checkbox\" class=\"hx-checkbox-control\">\n <input id=\"checkbox-{{row.id}}\" name=\"{{col.label}}-checkbox\" type=\"checkbox\" class=\"hx-checkbox\" title=\"{{col.label}}\" (change)=\"toggleIndividualSelect($event)\" [(ngModel)]=\"row.checked\" />\n <label for=\"checkbox-{{row.id}}\" class=\"hx-label\"></label>\n </div>\n\n <!-- string type | number type -->\n <span *ngIf=\"col.dataType === TabularColumnTypes.String || col.dataType === TabularColumnTypes.Number\" title=\"{{row[col.id]}}\">{{row[col.id]}}</span>\n\n <!-- html type -->\n <div *ngIf=\"col.dataType === TabularColumnTypes.Html\" [innerHTML]=\"row[col.id]\"></div>\n\n <!-- icon type -->\n <i *ngIf=\"col.dataType === TabularColumnTypes.Icon && hasValidIconTypeParams(row[col.id])\" title=\"\" class=\"hx-icon {{row[col.id].icon}}\" [hxTooltip]=\"row[col.id].tooltip.content\" placement=\"{{row[col.id].tooltip.config.placement}}\" [context]=\"row[col.id].tooltip.config.context\"></i>\n\n <!-- date type -->\n <span *ngIf=\"col.dataType === TabularColumnTypes.Date\">{{row[col.id] | date:'d/M/yy'}}</span>\n\n <!-- status type -->\n <span *ngIf=\"col.dataType === TabularColumnTypes.Status\" class=\"hx-icon\" [ngClass]=\"{'is-primary':row[col.id],'is-danger':!row[col.id], 'icon-check-empty': row[col.id], 'icon-close-empty':!row[col.id]}\" ></span>\n\n <!-- badge type -->\n <span *ngIf=\"col.dataType === TabularColumnTypes.Badge && hasValidBadgeTypeParams(row[col.id])\" class=\"hx-badge is-small {{row[col.id].cssClass}}\"><span class=\"hx-badge-content\">{{row[col.id].label}}</span></span>\n\n <!-- date time type -->\n <span *ngIf=\"col.dataType === TabularColumnTypes.DateTime\">{{row[col.id] | date:'d/M/yy h:mm a'}}</span>\n\n <!-- actions type -->\n <div *ngIf=\"col.dataType === TabularColumnTypes.Actions\" class=\"hx-dropdown tabularActions\">\n\n\n <div class=\"tabularActions__action\">\n\n <ng-container *ngFor=\"let action of row[col.id];trackBy: trackByFn\">\n\n <!-- single action -->\n <span [hxTooltip]=\"action.tooltip?.content\"\n placement=\"{{action.tooltip?.config.placement}}\"\n [context]=\"action.tooltip?.config.context\"\n [disabled]=\"action.tooltip?.config.disabled\">\n <button type=\"button\" class=\"hx-button is-flat\" [class.is-small]=\"config.size === TabularSize.Small\"\n *ngIf=\"!getActionDisabledState(action) && action.routeType === ActionConfigRouteType.Route && !hasChildren(action)\"\n [routerLink]=\"action.route\"\n class=\"hx-button is-flat {{action.css}}\"\n title=\"{{action.label}}\"\n ><span class=\"hx-icon {{action.icon}}\"></span></button>\n </span>\n <span [hxTooltip]=\"action.tooltip?.content\"\n placement=\"{{action.tooltip?.config.placement}}\"\n [context]=\"action.tooltip?.config.context\"\n [disabled]=\"action.tooltip?.config.disabled\">\n <button type=\"button\" class=\"hx-button is-flat\" [class.is-small]=\"config.size === TabularSize.Small\"\n *ngIf=\"!getActionDisabledState(action) && action.routeType === ActionConfigRouteType.Callback && !hasChildren(action)\"\n (click)='executeCallback($event,action.callback)'\n class=\"hx-button is-flat {{action.css}}\"\n [hxTooltip]=\"action.tooltip?.content\"\n placement=\"{{action.tooltip?.config.placement}}\"\n [context]=\"action.tooltip?.config.context\"><span class=\"hx-icon {{action.icon}}\"></span></button>\n </span>\n\n <!-- action with children -->\n <div class=\"hx-dropdown\" hxaDropdown *ngIf=\"hasChildren(action)\" [isDisabled]=\"!!row.actionDisabled\">\n <span [hxTooltip]=\"action.tooltip?.content\"\n placement=\"{{action.tooltip?.config.placement}}\"\n [context]=\"action.tooltip?.config.context\"\n [disabled]=\"action.tooltip?.config.disabled\">\n <button class=\"hx-button is-flat hx-button-dropdown\" [class.is-small]=\"config.size === TabularSize.Small\" hxaDropdownToggle type=\"button\">\n <i class=\"icon {{action.icon}}\"></i>\n </button>\n </span>\n\n <div class=\"hx-dropdown-menu\" *hxaDropdownMenu>\n\n <ng-container *ngFor=\"let childAction of action.children;trackBy: trackByFn\">\n <a *ngIf=\"!getActionDisabledState(childAction) && childAction.routeType === ActionConfigRouteType.Route\"\n [routerLink]=\"childAction.route\"\n hxaDropdownItem\n class=\"hx-dropdown-item {{childAction.css}}\" [id]=\"childAction.id\">{{childAction.label}}</a>\n <a *ngIf=\"!getActionDisabledState(childAction) && childAction.routeType === ActionConfigRouteType.Callback\"\n (click)='executeCallback($event,childAction.callback)'\n hxaDropdownItem\n class=\"hx-dropdown-item {{childAction.css}}\" [id]=\"childAction.id\" >{{childAction.label}}</a>\n </ng-container>\n\n </div>\n </div>\n\n </ng-container>\n\n </div>\n </div>\n\n </td>\n </tr>\n </tbody>\n</table>\n\n<hx-pagination [directionLinks]=\"true\" [boundaryLinks]=\"true\" [rotate]=\"false\" [maxSize]=\"10\"\n [totalItems]=\"totalItemCount\" [itemsPerPage]=\"config.pagination.itemsPerPage\"\n [(ngModel)]=\"config.pagination.currentPage\" (pageChanged)=\"setPage($event)\" *ngIf=\"totalItemCount > config.pagination.itemsPerPage\"></hx-pagination>\n", styles: [ '.tabular__sortable {}', '.tabular__sorter {cursor:pointer; display:flex; align-items: center;}', '.tabular__sorter .hx-icon {margin-left:.1rem;}', '.tabular__checkboxes{width:2%;}', '.tabular__checkboxes .hx-checkbox-control{display:flex;}', '.tabularActions__action button.hx-button{ width: 1rem;}', '.tabularActions__action {display:flex;}' ] },] }, ]; /** @nocollapse */ TabularComponent.ctorParameters = function () { return [ { type: TabularConfig }, { type: TabularSortByService } ]; }; TabularComponent.propDecorators = { columns: [{ type: Input }], rows: [{ type: Input }], config: [{ type: Input }], callback: [{ type: Input }], searchTerm: [{ type: Input }], refresh: [{ type: Output }], rowClick: [{ type: Output }], onSort: [{ type: Output }] }; return TabularComponent; }()); export { TabularComponent }; if (false) { /** * Collection of column models * @type {?} */ TabularComponent.prototype.columns; /** * Collection of data rows * @type {?} */ TabularComponent.prototype.rows; /** * Event fired when refresh is called. * Host should refresh data of input. * @type {?} */ TabularComponent.prototype.refresh; /** * Event fired when a row is clicked. * @type {?} */ TabularComponent.prototype.rowClick; /** * Event fired when a column is sorted * @type {?} */ TabularComponent.prototype.onSort; /** @type {?} */ TabularComponent.prototype.oldRows; /** @type {?} */ TabularComponent.prototype.pagedItems; /** @type {?} */ TabularComponent.prototype.TabularColumnTypes; /** @type {?} */ TabularComponent.prototype.TabularSize; /** @type {?} */ TabularComponent.prototype.ActionConfigRouteType; /** @type {?} */ TabularComponent.prototype.selectAll; /** @type {?} */ TabularComponent.prototype.Context; /** @type {?} */ TabularComponent.prototype.SortByDirection; /** @type {?} */ TabularComponent.prototype._callback; /** @type {?} */ TabularComponent.prototype._config; /** @type {?} */ TabularComponent.prototype._searchTerm; /** @type {?} */ TabularComponent.prototype.toggleSelectAll; /** @type {?} */ TabularComponent.prototype.toggleIndividualSelect; /** @type {?} */ TabularComponent.prototype.conf; /** @type {?} */ TabularComponent.prototype.sortByService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFidWxhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3RhYnVsYXIvdGFidWxhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUN2QyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFpQixNQUFNLDRCQUE0QixDQUFDO0FBQ2pGLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxlQUFlLEVBQWtCLE1BQU0sMkJBQTJCLENBQUM7QUFDakcsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQWtELGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFL0csT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QjtJQTJPRywwQkFDUyxJQUFtQixFQUNuQixhQUFtQztRQUY1QyxpQkFLQTtRQUpTLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQXNCOzs7OztRQTVCbkMsWUFBTyxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDOzs7O1FBSzdELGFBQVEsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7OztRQU10RCxXQUFNLEdBQW9DLElBQUksWUFBWSxFQUFxQixDQUFDO1FBRW5GLFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBQzVCLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFDdkIsdUJBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDeEMsZ0JBQVcsR0FB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clxuICBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBEb0NoZWNrLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXNcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtUYWJ1bGFyQ29sdW1ufSBmcm9tICcuL3RhYnVsYXInO1xyXG5pbXBvcnQge0lUYWJ1bGFyQ29uZmlnfSBmcm9tICcuL3RhYnVsYXItY29uZmlnLmludGVyZmFjZSc7XHJcbmltcG9ydCB7QWN0aW9uQ29uZmlnUm91dGVUeXBlLCBJQWN0aW9uc0NvbmZpZ30gZnJvbSAnLi9hY3Rpb25zLWNvbmZpZy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1RhYnVsYXJTb3J0QnlTZXJ2aWNlLCBTb3J0QnlEaXJlY3Rpb24sIElTb3J0QnlQcm9wZXJ0eX0gZnJvbSAnLi90YWJ1bGFyLXNvcnQtYnkuc2VydmljZSc7XHJcbmltcG9ydCB7VGFidWxhckNvbmZpZ30gZnJvbSAnLi90YWJ1bGFyLmNvbmZpZyc7XHJcbmltcG9ydCB7VGFidWxhclNpemV9IGZyb20gJy4vdGFidWxhci1zaXplLmVudW0nO1xyXG5pbXBvcnQge0lUYWJ1bGFyQ29sdW1uQmFkZ2VUeXBlLCBJVGFidWxhckNvbHVtbkljb25UeXBlLCBUYWJ1bGFyQ29sdW1uVHlwZXN9IGZyb20gJy4vdGFidWxhci1jb2x1bW4uaW50ZXJmYWNlJztcclxuaW1wb3J0IHtJVGFidWxhclJvd30gZnJvbSAnLi90YWJ1bGFyLXJvdy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0NvbnRleHR9IGZyb20gJy4uL2VudW1zJztcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoeGEtdGFidWxhcicsXHJcbiAgdGVtcGxhdGU6IGA8dGFibGUgY2xhc3M9XCJ0YWJ1bGFyIGh4LXRhYmxlIGlzLXN0cmlwZWQge3tjb25maWcuY3NzQ2xhc3N9fVwiXHJcbiAgICAgICBbY2xhc3MuaXMtaG92ZXJdPVwiY29uZmlnLmNsaWNrYWJsZVJvd3NcIlxyXG4gICAgICAgW2NsYXNzLmlzLW5hcnJvd109XCJjb25maWcuc2l6ZSA9PT0gVGFidWxhclNpemUuU21hbGxcIlxyXG4gICAgICAgW2NsYXNzLmhhcy1zdGlja3ktaGVhZGVyXT1cImNvbmZpZy5zdGlja3lIZWFkZXJcIj5cclxuICA8dGhlYWQ+XHJcbiAgPHRyPlxyXG4gICAgPHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIGNsYXNzPVwie3tjb2wuY3NzQ2xhc3N9fSB0YWJ1bGFyX197e2NvbC5sYWJlbH19XCIgW25nQ2xhc3NdPVwieyd0YWJ1bGFyX19jaGVja2JveGVzJzogY29sLmRhdGFUeXBlID09PSBUYWJ1bGFyQ29sdW1uVHlwZXMuQ2hlY2tib3gsICd0YWJ1bGFyX19zb3J0YWJsZSc6IGNvbC5zb3J0YWJsZX1cIj5cclxuXHJcbiAgICAgIDwhLS0gc29ydGFibGUgY29sdW1uIC0tPlxyXG4gICAgICA8YSBjbGFzcz1cInRhYnVsYXJfX3NvcnRlclwiIGhyZWY9XCIjXCIgKm5nSWY9XCJjb2wuc29ydGFibGUgJiYgY29sLmRhdGFUeXBlICE9IFRhYnVsYXJDb2x1bW5UeXBlcy5DaGVja2JveFwiIChjbGljayk9XCJvblNvcnRDbGlja0hhbmRsZXIoY29sLmlkLCBjb2wuZGF0YVR5cGUpXCI+e3tjb2wubGFiZWx9fSA8aSBjbGFzcz1cImh4LWljb24gaWNvbi1hcnJvdy11cCBpcy1zbWFsbFwiIFtjbGFzcy5pY29uLWFycm93LXVwXT1cImlzQ29sdW1uU29ydGVkKGNvbC5pZCwgU29ydEJ5RGlyZWN0aW9uLkFzY2VuZGluZylcIiBbY2xhc3MuaWNvbi1hcnJvdy1kb3duXT1cImlzQ29sdW1uU29ydGVkKGNvbC5pZCwgU29ydEJ5RGlyZWN0aW9uLkRlc2NlbmRpbmcpXCIgKm5nSWY9XCJpc0NvbHVtblNvcnRlZChjb2wuaWQsIFNvcnRCeURpcmVjdGlvbi5EZXNjZW5kaW5nKSB8fCBpc0NvbHVtblNvcnRlZChjb2wuaWQsIFNvcnRCeURpcmVjdGlvbi5Bc2NlbmRpbmcpXCI+PC9pPjwvYT5cclxuXHJcbiAgICAgIDwhLS0gbm9uIHNvcnRhYmxlIGNvbHVtbiAtLT5cclxuICAgICAgPHNwYW4gKm5nSWY9XCIhY29sLnNvcnRhYmxlICYmIGNvbC5kYXRhVHlwZSAhPT0gVGFidWxhckNvbHVtblR5cGVzLkNoZWNrYm94XCI+e3tjb2wubGFiZWx9fTwvc3Bhbj5cclxuXHJcbiAgICAgIDwhLS0gY2hlY2tib3ggY29sdW1uIC0tPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiY29sLmRhdGFUeXBlID09PSBUYWJ1bGFyQ29sdW1uVHlwZXMuQ2hlY2tib3hcIiBjbGFzcz1cImh4LWNoZWNrYm94LWNvbnRyb2xcIj5cclxuICAgICAgICA8aW5wdXQgaWQ9XCJzZWxlY3RBbGxcIiBuYW1lPVwic2VsZWN0QWxsXCIgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJoeC1jaGVja2JveFwiIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKCRldmVudClcIiB0aXRsZT1cIlNlbGVjdCBBbGxcIiBbKG5nTW9kZWwpXT1cInNlbGVjdEFsbFwiIC8+XHJcbiAgICAgICAgPGxhYmVsIGZvcj1cInNlbGVjdEFsbFwiIGNsYXNzPVwiaHgtbGFiZWxcIj48L2xhYmVsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGg+XHJcbiAgPC90cj5cclxuICA8L3RoZWFkPlxyXG5cclxuICA8dGJvZHk+XHJcbiAgPCEtLTx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3MgfCBwYWdpbmF0ZTogY29uZmlnLnBhZ2luYXRpb24gfCBzaW1wbGVTZWFyY2g6IHNlYXJjaFRlcm1cIj4tLT5cclxuICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwYWdlZEl0ZW1zXCJcclxuICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2tIYW5kbGVyKCRldmVudCwgcm93KVwiXHJcbiAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJyb3cuc2VsZWN0ZWRcIlxyXG4gICAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cInJvdy5jb250ZXh0ICYmIHJvdy5jb250ZXh0ID09PSBDb250ZXh0LkRhbmdlclwiXHJcbiAgICAgIFtjbGFzcy5pcy13YXJuaW5nXT1cInJvdy5jb250ZXh0ICYmIHJvdy5jb250ZXh0ID09PSBDb250ZXh0Lldhcm5pbmdcIlxyXG4gICAgICBbY2xhc3MuaXMtaW5mb109XCJyb3cuY29udGV4dCAmJiByb3cuY29udGV4dCA9PT0gQ29udGV4dC5JbmZvXCJcclxuICAgICAgW2NsYXNzLmlzLXN1Y2Nlc3NdPVwicm93LmNvbnRleHQgJiYgcm93LmNvbnRleHQgPT09IENvbnRleHQuU3VjY2Vzc1wiXHJcbiAgICAgIFtjbGFzcy5oYXMtc3RyaXBlLWRhbmdlcl09XCJyb3cuc3RyaXBlQ29udGV4dCAmJiByb3cuc3RyaXBlQ29udGV4dCA9PT0gQ29udGV4dC5EYW5nZXJcIlxyXG4gICAgICBbY2xhc3MuaGFzLXN0cmlwZS13YXJuaW5nXT1cInJvdy5zdHJpcGVDb250ZXh0ICYmIHJvdy5zdHJpcGVDb250ZXh0ID09PSBDb250ZXh0Lldhcm5pbmdcIlxyXG4gICAgICBbY2xhc3MuaGFzLXN0cmlwZS1pbmZvXT1cInJvdy5zdHJpcGVDb250ZXh0ICYmIHJvdy5zdHJpcGVDb250ZXh0ID09PSBDb250ZXh0LkluZm9cIlxyXG4gICAgICBbY2xhc3MuaGFzLXN0cmlwZS1zdWNjZXNzXT1cInJvdy5zdHJpcGVDb250ZXh0ICYmIHJvdy5zdHJpcGVDb250ZXh0ID09PSBDb250ZXh0LlN1Y2Nlc3NcIlxyXG4gICAgICBbbmdDbGFzc109XCJbcm93LmNzc0NsYXNzPyByb3cuY3NzQ2xhc3MgOiAnJ11cIlxyXG4gICAgICBbYXR0ci50aXRsZV09XCJyb3cudGl0bGUgPyByb3cudGl0bGUgOiAnJ1wiPlxyXG4gICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiIGNsYXNzPVwie3tjb2wuY3NzQ2xhc3N9fSB0YWJ1bGFyX197e2NvbC5sYWJlbH19XCIgW25nQ2xhc3NdPVwieyd0YWJ1bGFyX19jaGVja2JveGVzJzogY29sLmRhdGFUeXBlID09PSBUYWJ1bGFyQ29sdW1uVHlwZXMuQ2hlY2tib3h9XCI+XHJcblxyXG4gICAgICA8IS0tIGNoZWNrYm94IHR5cGUgLS0+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZGF0YVR5cGUgPT09IFRhYnVsYXJDb2x1bW5UeXBlcy5DaGVja2JveFwiIGNsYXNzPVwiaHgtY2hlY2tib3gtY29udHJvbFwiPlxyXG4gICAgICAgIDxpbnB1dCBpZD1cImNoZWNrYm94LXt7cm93LmlkfX1cIiBuYW1lPVwie3tjb2wubGFiZWx9fS1jaGVja2JveFwiIHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiaHgtY2hlY2tib3hcIiB0aXRsZT1cInt7Y29sLmxhYmVsfX1cIiAoY2hhbmdlKT1cInRvZ2dsZUluZGl2aWR1YWxTZWxlY3QoJGV2ZW50KVwiIFsobmdNb2RlbCldPVwicm93LmNoZWNrZWRcIiAvPlxyXG4gICAgICAgIDxsYWJlbCBmb3I9XCJjaGVja2JveC17e3Jvdy5pZH19XCIgY2xhc3M9XCJoeC1sYWJlbFwiPjwvbGFiZWw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBzdHJpbmcgdHlwZSB8IG51bWJlciB0eXBlIC0tPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImNvbC5kYXRhVHlwZSA9PT0gVGFidWxhckNvbHVtblR5cGVzLlN0cmluZyB8fCBjb2wuZGF0YVR5cGUgPT09IFRhYnVsYXJDb2x1bW5UeXBlcy5OdW1iZXJcIiB0aXRsZT1cInt7cm93W2NvbC5pZF19fVwiPnt7cm93W2NvbC5pZF19fTwvc3Bhbj5cclxuXHJcbiAgICAgIDwhLS0gaHRtbCB0eXBlIC0tPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiY29sLmRhdGFUeXBlID09PSBUYWJ1bGFyQ29sdW1uVHlwZXMuSHRtbFwiIFtpbm5lckhUTUxdPVwicm93W2NvbC5pZF1cIj48L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gaWNvbiB0eXBlIC0tPlxyXG4gICAgICA8aSAqbmdJZj1cImNvbC5kYXRhVHlwZSA9PT0gVGFidWxhckNvbHVtblR5cGVzLkljb24gJiYgaGFzVmFsaWRJY29uVHlwZVBhcmFtcyhyb3dbY29sLmlkXSlcIiB0aXRsZT1cIlwiIGNsYXNzPVwiaHgtaWNvbiB7e3Jvd1tjb2wuaWRdLmljb259fVwiIFtoeFRvb2x0aXBdPVwicm93W2NvbC5pZF0udG9vbHRpcC5jb250ZW50XCIgcGxhY2VtZW50PVwie3tyb3dbY29sLmlkXS50b29sdGlwLmNvbmZpZy5wbGFjZW1lbnR9fVwiIFtjb250ZXh0XT1cInJvd1tjb2wuaWRdLnRvb2x0aXAuY29uZmlnLmNvbnRleHRcIj48L2k+XHJcblxyXG4gICAgICA8IS0tIGRhdGUgdHlwZSAtLT5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJjb2wuZGF0YVR5cGUgPT09IFRhYnVsYXJDb2x1bW5UeXBlcy5EYXRlXCI+e3tyb3dbY29sLmlkXSB8IGRhdGU6J2QvTS95eSd9fTwvc3Bhbj5cclxuXHJcbiAgICAgIDwhLS0gc3RhdHVzIHR5cGUgLS0+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiY29sLmRhdGFUeXBlID09PSBUYWJ1bGFyQ29sdW1uVHlwZXMuU3RhdHVzXCIgY2xhc3M9XCJoeC1pY29uXCIgW25nQ2xhc3NdPVwieydpcy1wcmltYXJ5Jzpyb3dbY29sLmlkXSwnaXMtZGFuZ2VyJzohcm93W2NvbC5pZF0sICdpY29uLWNoZWNrLWVtcHR5Jzogcm93W2NvbC5pZF0sICdpY29uLWNsb3NlLWVtcHR5Jzohcm93W2NvbC5pZF19XCIgPjwvc3Bhbj5cclxuXHJcbiAgICAgIDwhLS0gYmFkZ2UgdHlwZSAtLT5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJjb2wuZGF0YVR5cGUgPT09IFRhYnVsYXJDb2x1bW5UeXBlcy5CYWRnZSAmJiBoYXNWYWxpZEJhZGdlVHlwZVBhcmFtcyhyb3dbY29sLmlkXSlcIiBjbGFzcz1cImh4LWJhZGdlIGlzLXNtYWxsIHt7cm93W2NvbC5pZF0uY3NzQ2xhc3N9fVwiPjxzcGFuIGNsYXNzPVwiaHgtYmFkZ2UtY29udGVudFwiPnt7cm93W2NvbC5pZF0ubGFiZWx9fTwvc3Bhbj48L3NwYW4+XHJcblxyXG4gICAgICA8IS0tIGRhdGUgdGltZSB0eXBlIC0tPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImNvbC5kYXRhVHlwZSA9PT0gVGFidWxhckNvbHVtblR5cGVzLkRhdGVUaW1lXCI+e3tyb3dbY29sLmlkXSB8IGRhdGU6J2QvTS95eSBoOm1tIGEnfX08L3NwYW4+XHJcblxyXG4gICAgICA8IS0tIGFjdGlvbnMgdHlwZSAtLT5cclxuICAgICAgPGRpdiAqbmdJZj1cImNvbC5kYXRhVHlwZSA9PT0gVGFidWxhckNvbHVtblR5cGVzLkFjdGlvbnNcIiBjbGFzcz1cImh4LWRyb3Bkb3duIHRhYnVsYXJBY3Rpb25zXCI+XHJcblxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFidWxhckFjdGlvbnNfX2FjdGlvblwiPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiByb3dbY29sLmlkXTt0cmFja0J5OiB0cmFja0J5Rm5cIj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gc2luZ2xlIGFjdGlvbiAtLT5cclxuICAgICAgICAgICAgPHNwYW4gIFtoeFRvb2x0aXBdPVwiYWN0aW9uLnRvb2x0aXA/LmNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwie3thY3Rpb24udG9vbHRpcD8uY29uZmlnLnBsYWNlbWVudH19XCJcclxuICAgICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cImFjdGlvbi50b29sdGlwPy5jb25maWcuY29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uLnRvb2x0aXA/LmNvbmZpZy5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaHgtYnV0dG9uIGlzLWZsYXRcIiBbY2xhc3MuaXMtc21hbGxdPVwiY29uZmlnLnNpemUgPT09IFRhYnVsYXJTaXplLlNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWdldEFjdGlvbkRpc2FibGVkU3RhdGUoYWN0aW9uKSAmJiBhY3Rpb24ucm91dGVUeXBlID09PSBBY3Rpb25Db25maWdSb3V0ZVR5cGUuUm91dGUgJiYgIWhhc0NoaWxkcmVuKGFjdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiYWN0aW9uLnJvdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaHgtYnV0dG9uIGlzLWZsYXQge3thY3Rpb24uY3NzfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7e2FjdGlvbi5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgPjxzcGFuIGNsYXNzPVwiaHgtaWNvbiB7e2FjdGlvbi5pY29ufX1cIj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gIFtoeFRvb2x0aXBdPVwiYWN0aW9uLnRvb2x0aXA/LmNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwie3thY3Rpb24udG9vbHRpcD8uY29uZmlnLnBsYWNlbWVudH19XCJcclxuICAgICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cImFjdGlvbi50b29sdGlwPy5jb25maWcuY29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWN0aW9uLnRvb2x0aXA/LmNvbmZpZy5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaHgtYnV0dG9uIGlzLWZsYXRcIiBbY2xhc3MuaXMtc21hbGxdPVwiY29uZmlnLnNpemUgPT09IFRhYnVsYXJTaXplLlNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWdldEFjdGlvbkRpc2FibGVkU3RhdGUoYWN0aW9uKSAmJiBhY3Rpb24ucm91dGVUeXBlID09PSBBY3Rpb25Db25maWdSb3V0ZVR5cGUuQ2FsbGJhY2sgJiYgIWhhc0NoaWxkcmVuKGFjdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9J2V4ZWN1dGVDYWxsYmFjaygkZXZlbnQsYWN0aW9uLmNhbGxiYWNrKSdcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImh4LWJ1dHRvbiBpcy1mbGF0IHt7YWN0aW9uLmNzc319XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtoeFRvb2x0aXBdPVwiYWN0aW9uLnRvb2x0aXA/LmNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwie3thY3Rpb24udG9vbHRpcD8uY29uZmlnLnBsYWNlbWVudH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cImFjdGlvbi50b29sdGlwPy5jb25maWcuY29udGV4dFwiPjxzcGFuIGNsYXNzPVwiaHgtaWNvbiB7e2FjdGlvbi5pY29ufX1cIj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gYWN0aW9uIHdpdGggY2hpbGRyZW4gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeC1kcm9wZG93blwiIGh4YURyb3Bkb3duICAqbmdJZj1cImhhc0NoaWxkcmVuKGFjdGlvbilcIiBbaXNEaXNhYmxlZF09XCIhIXJvdy5hY3Rpb25EaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBbaHhUb29sdGlwXT1cImFjdGlvbi50b29sdGlwPy5jb250ZW50XCJcclxuICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwie3thY3Rpb24udG9vbHRpcD8uY29uZmlnLnBsYWNlbWVudH19XCJcclxuICAgICAgICAgICAgICAgICAgW2NvbnRleHRdPVwiYWN0aW9uLnRvb2x0aXA/LmNvbmZpZy5jb250ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi50b29sdGlwPy5jb25maWcuZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJoeC1idXR0b24gaXMtZmxhdCBoeC1idXR0b24tZHJvcGRvd25cIiBbY2xhc3MuaXMtc21hbGxdPVwiY29uZmlnLnNpemUgPT09IFRhYnVsYXJTaXplLlNtYWxsXCIgaHhhRHJvcGRvd25Ub2dnbGUgdHlwZT1cImJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uIHt7YWN0aW9uLmljb259fVwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeC1kcm9wZG93bi1tZW51XCIgKmh4YURyb3Bkb3duTWVudT5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjaGlsZEFjdGlvbiBvZiBhY3Rpb24uY2hpbGRyZW47dHJhY2tCeTogdHJhY2tCeUZuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiIWdldEFjdGlvbkRpc2FibGVkU3RhdGUoY2hpbGRBY3Rpb24pICYmIGNoaWxkQWN0aW9uLnJvdXRlVHlwZSA9PT0gQWN0aW9uQ29uZmlnUm91dGVUeXBlLlJvdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImNoaWxkQWN0aW9uLnJvdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGh4YURyb3Bkb3duSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoeC1kcm9wZG93bi1pdGVtIHt7Y2hpbGRBY3Rpb24uY3NzfX1cIiBbaWRdPVwiY2hpbGRBY3Rpb24uaWRcIj57e2NoaWxkQWN0aW9uLmxhYmVsfX08L2E+XHJcbiAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiIWdldEFjdGlvbkRpc2FibGVkU3RhdGUoY2hpbGRBY3Rpb24pICYmIGNoaWxkQWN0aW9uLnJvdXRlVHlwZSA9PT0gQWN0aW9uQ29uZmlnUm91dGVUeXBlLkNhbGxiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9J2V4ZWN1dGVDYWxsYmFjaygkZXZlbnQsY2hpbGRBY3Rpb24uY2FsbGJhY2spJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgIGh4YURyb3Bkb3duSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoeC1kcm9wZG93bi1pdGVtIHt7Y2hpbGRBY3Rpb24uY3NzfX1cIiBbaWRdPVwiY2hpbGRBY3Rpb24uaWRcIiA+e3tjaGlsZEFjdGlvbi5sYWJlbH19PC9hPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvdGQ+XHJcbiAgPC90cj5cclxuICA8L3Rib2R5PlxyXG48L3RhYmxlPlxyXG5cclxuPGh4LXBhZ2luYXRpb24gW2RpcmVjdGlvbkxpbmtzXT1cInRydWVcIiBbYm91bmRhcnlMaW5rc109XCJ0cnVlXCIgW3JvdGF0ZV09XCJmYWxzZVwiIFttYXhTaXplXT1cIjEwXCJcclxuICAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwidG90YWxJdGVtQ291bnRcIiBbaXRlbXNQZXJQYWdlXT1cImNvbmZpZy5wYWdpbmF0aW9uLml0ZW1zUGVyUGFnZVwiXHJcbiAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29uZmlnLnBhZ2luYXRpb24uY3VycmVudFBhZ2VcIiAocGFnZUNoYW5nZWQpPVwic2V0UGFnZSgkZXZlbnQpXCIgKm5nSWY9XCJ0b3RhbEl