UNPKG

@harbor/ui

Version:

Harbor shared UI components based on Clarity and Angular6

200 lines (199 loc) 21.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input } from '@angular/core'; import { AccessLogService, RequestQueryParams } from '../service/index'; import { ErrorHandler } from '../error-handler/index'; import { toPromise, CustomComparator } from '../utils'; import { DEFAULT_PAGE_SIZE, calculatePage, doFiltering, doSorting } from '../utils'; export class RecentLogComponent { /** * @param {?} logService * @param {?} errorHandler */ constructor(logService, errorHandler) { this.logService = logService; this.errorHandler = errorHandler; this.recentLogs = []; this.loading = true; this.defaultFilter = "username"; this.withTitle = false; this.pageSize = DEFAULT_PAGE_SIZE; this.currentPage = 1; this.currentPagePvt = 0; this.opTimeComparator = new CustomComparator('op_time', 'date'); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ get totalCount() { return this.logsCache && this.logsCache.metadata ? this.logsCache.metadata.xTotalCount : 0; } /** * @return {?} */ get inProgress() { return this.loading; } /** * @param {?} terms * @return {?} */ doFilter(terms) { if (!terms) { return; } this.currentTerm = terms.trim(); // Trigger data loading and start from first page this.loading = true; this.currentPage = 1; if (this.currentPagePvt === 1) { /** @type {?} */ let st = this.currentState; if (!st) { st = { page: {} }; } st.page.from = 0; st.page.to = this.pageSize - 1; st.page.size = this.pageSize; this.currentPagePvt = 0; // Reset pvt this.load(st); } } /** * @return {?} */ refresh() { this.doFilter(""); } /** * @param {?} isOpen * @return {?} */ openFilter(isOpen) { if (isOpen) { this.isOpenFilterTag = true; } else { this.isOpenFilterTag = false; } } /** * @param {?} $event * @return {?} */ selectFilterKey($event) { this.defaultFilter = $event['target'].value; this.doFilter(this.currentTerm); } /** * @param {?} state * @return {?} */ load(state) { // Keep it for future filter this.currentState = state; /** @type {?} */ let pageNumber = calculatePage(state); if (pageNumber !== this.currentPagePvt) { /** @type {?} */ let params = new RequestQueryParams(); params.set("page", '' + pageNumber); params.set("page_size", '' + this.pageSize); if (this.currentTerm && this.currentTerm !== "") { params.set(this.defaultFilter, this.currentTerm); } this.loading = true; toPromise(this.logService.getRecentLogs(params)) .then(response => { this.logsCache = response; // Keep the data this.recentLogs = this.logsCache.data.filter(log => log.username !== ""); // To display // Do customized filter this.recentLogs = doFiltering(this.recentLogs, state); // Do customized sorting this.recentLogs = doSorting(this.recentLogs, state); this.currentPagePvt = pageNumber; this.loading = false; }) .catch(error => { this.loading = false; this.errorHandler.error(error); }); } else { // Column sorting and filtering this.recentLogs = this.logsCache.data.filter(log => log.username !== ""); // Reset data // Do customized filter this.recentLogs = doFiltering(this.recentLogs, state); // Do customized sorting this.recentLogs = doSorting(this.recentLogs, state); } } /** * @param {?} terms * @param {?} log * @return {?} */ isMatched(terms, log) { /** @type {?} */ let reg = new RegExp('.*' + terms + '.*', 'i'); return reg.test(log.username) || reg.test(log.repo_name) || reg.test(log.operation) || reg.test(log.repo_tag); } } RecentLogComponent.decorators = [ { type: Component, args: [{ selector: 'hbr-log', template: "<div>\n <h2 class=\"h2-log-override\" *ngIf=\"withTitle\">{{'SIDE_NAV.LOGS' | translate}}</h2>\n <div class=\"row flex-items-xs-between flex-items-xs-bottom\">\n <div></div>\n <div class=\"action-head-pos rightPos\">\n <div class=\"select filterTag\" [hidden]=\"!isOpenFilterTag\">\n <select id=\"selectKey\" (change)=\"selectFilterKey($event)\">\n <option value=\"username\">{{\"AUDIT_LOG.USERNAME\" | translate | lowercase}}</option>\n <option value=\"repository\">{{\"CONFIG.REPOSITORY\" | translate | lowercase}}</option>\n <option value=\"tag\">{{\"REPOSITORY.TAG\" | translate | lowercase}}</option>\n <option value=\"operation\">{{\"AUDIT_LOG.OPERATION\" | translate | lowercase}}</option>\n </select>\n </div>\n <hbr-filter [withDivider]=\"true\" filterPlaceholder='{{\"AUDIT_LOG.FILTER_PLACEHOLDER\" | translate}}' (filterEvt)=\"doFilter($event)\"\n (openFlag)=\"openFilter($event)\" [currentValue]=\"currentTerm\"></hbr-filter>\n <span (click)=\"refresh()\" class=\"refresh-btn\">\n <clr-icon shape=\"refresh\" [hidden]=\"inProgress\" ng-disabled=\"inProgress\"></clr-icon>\n <span class=\"spinner spinner-inline\" [hidden]=\"!inProgress\"></span>\n </span>\n </div>\n </div>\n <div>\n <clr-datagrid (clrDgRefresh)=\"load($event)\" [clrDgLoading]=\"loading\">\n <clr-dg-column [clrDgField]=\"'username'\">{{'AUDIT_LOG.USERNAME' | translate}}</clr-dg-column>\n <clr-dg-column [clrDgField]=\"'repo_name'\">{{'AUDIT_LOG.REPOSITORY_NAME' | translate}}</clr-dg-column>\n <clr-dg-column [clrDgField]=\"'repo_tag'\">{{'AUDIT_LOG.TAGS' | translate}}</clr-dg-column>\n <clr-dg-column [clrDgField]=\"'operation'\">{{'AUDIT_LOG.OPERATION' | translate}}</clr-dg-column>\n <clr-dg-column [clrDgSortBy]=\"opTimeComparator\">{{'AUDIT_LOG.TIMESTAMP' | translate}}</clr-dg-column>\n <clr-dg-placeholder>We couldn't find any logs!</clr-dg-placeholder>\n <clr-dg-row *ngFor=\"let l of recentLogs\">\n <clr-dg-cell>{{l.username}}</clr-dg-cell>\n <clr-dg-cell>{{l.repo_name}}</clr-dg-cell>\n <clr-dg-cell>{{l.repo_tag}}</clr-dg-cell>\n <clr-dg-cell>{{l.operation}}</clr-dg-cell>\n <clr-dg-cell>{{l.op_time | date: 'short'}}</clr-dg-cell>\n </clr-dg-row>\n <clr-dg-footer>\n {{pagination.firstItem + 1}} - {{pagination.lastItem + 1}} {{'AUDIT_LOG.OF' | translate}} {{pagination.totalItems}} {{'AUDIT_LOG.ITEMS'\n | translate}}\n <clr-dg-pagination #pagination [(clrDgPage)]=\"currentPage\" [clrDgPageSize]=\"pageSize\" [clrDgTotalItems]=\"totalCount\"></clr-dg-pagination>\n </clr-dg-footer>\n </clr-datagrid>\n </div>\n</div>", styles: [".h2-log-override{margin-top:0!important}.action-head-pos{padding-right:18px;height:24px}.refresh-btn{cursor:pointer}.refresh-btn:hover{color:#007cbb}.custom-lines-button{padding:0!important;min-width:25px!important}.lines-button-toggole{font-size:16px;text-decoration:underline}.log-select{width:130px;display:inline-block;top:1px}.item-divider{height:24px;display:inline-block;width:1px;background-color:#ccc;opacity:.55;margin-left:12px;top:8px;position:relative}.rightPos{position:absolute;z-index:100;right:35px;margin-top:4px}.filterTag{float:left;margin-top:8px}"] }] } ]; /** @nocollapse */ RecentLogComponent.ctorParameters = () => [ { type: AccessLogService }, { type: ErrorHandler } ]; RecentLogComponent.propDecorators = { withTitle: [{ type: Input }] }; if (false) { /** @type {?} */ RecentLogComponent.prototype.recentLogs; /** @type {?} */ RecentLogComponent.prototype.logsCache; /** @type {?} */ RecentLogComponent.prototype.loading; /** @type {?} */ RecentLogComponent.prototype.currentTerm; /** @type {?} */ RecentLogComponent.prototype.defaultFilter; /** @type {?} */ RecentLogComponent.prototype.isOpenFilterTag; /** @type {?} */ RecentLogComponent.prototype.withTitle; /** @type {?} */ RecentLogComponent.prototype.pageSize; /** @type {?} */ RecentLogComponent.prototype.currentPage; /** @type {?} */ RecentLogComponent.prototype.currentPagePvt; /** @type {?} */ RecentLogComponent.prototype.currentState; /** @type {?} */ RecentLogComponent.prototype.opTimeComparator; /** @type {?} */ RecentLogComponent.prototype.logService; /** @type {?} */ RecentLogComponent.prototype.errorHandler; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjZW50LWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaGFyYm9yL3VpLyIsInNvdXJjZXMiOlsic3JjL2xvZy9yZWNlbnQtbG9nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBYUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekQsT0FBTyxFQUNILGdCQUFnQixFQUdoQixrQkFBa0IsRUFDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN2RCxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixXQUFXLEVBQ1gsU0FBUyxFQUNaLE1BQU0sVUFBVSxDQUFDO0FBUWxCLE1BQU07Ozs7O0lBZ0JGLFlBQ1ksWUFDQTtRQURBLGVBQVUsR0FBVixVQUFVO1FBQ1YsaUJBQVksR0FBWixZQUFZOzBCQWpCTSxFQUFFO3VCQUViLElBQUk7NkJBRVAsVUFBVTt5QkFFSSxLQUFLO3dCQUVoQixpQkFBaUI7MkJBQ2QsQ0FBQzs4QkFDRSxDQUFDO2dDQUdvQixJQUFJLGdCQUFnQixDQUFnQixTQUFTLEVBQUUsTUFBTSxDQUFDO0tBSXpEOzs7O0lBRTNDLFFBQVE7S0FDUDs7OztRQUVVLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7UUFHcEYsVUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7Ozs7OztJQUdqQixRQUFRLENBQUMsS0FBYTtRQUN6QixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1Is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LEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTcgVk13YXJlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbi8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuLy9cbi8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuLy9cbi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbXBhcmF0b3IsIFN0YXRlIH0gZnJvbSAnQGNsci9hbmd1bGFyJztcblxuaW1wb3J0IHtcbiAgICBBY2Nlc3NMb2dTZXJ2aWNlLFxuICAgIEFjY2Vzc0xvZyxcbiAgICBBY2Nlc3NMb2dJdGVtLFxuICAgIFJlcXVlc3RRdWVyeVBhcmFtc1xufSBmcm9tICcuLi9zZXJ2aWNlL2luZGV4JztcbmltcG9ydCB7IEVycm9ySGFuZGxlciB9IGZyb20gJy4uL2Vycm9yLWhhbmRsZXIvaW5kZXgnO1xuaW1wb3J0IHsgdG9Qcm9taXNlLCBDdXN0b21Db21wYXJhdG9yIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgICBERUZBVUxUX1BBR0VfU0laRSxcbiAgICBjYWxjdWxhdGVQYWdlLFxuICAgIGRvRmlsdGVyaW5nLFxuICAgIGRvU29ydGluZ1xufSBmcm9tICcuLi91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaGJyLWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3JlY2VudC1sb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3JlY2VudC1sb2cuY29tcG9uZW50LnNjc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIFJlY2VudExvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcmVjZW50TG9nczogQWNjZXNzTG9nSXRlbVtdID0gW107XG4gICAgbG9nc0NhY2hlOiBBY2Nlc3NMb2c7XG4gICAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG4gICAgY3VycmVudFRlcm06IHN0cmluZztcbiAgICBkZWZhdWx0RmlsdGVyID0gXCJ1c2VybmFtZVwiO1xuICAgIGlzT3BlbkZpbHRlclRhZzogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB3aXRoVGl0bGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHBhZ2VTaXplOiBudW1iZXIgPSBERUZBVUxUX1BBR0VfU0laRTtcbiAgICBjdXJyZW50UGFnZTogbnVtYmVyID0gMTsgLy8gRG91YmxlIGJvdW5kIHRvIHBhZ2luYXRpb24gY29tcG9uZW50XG4gICAgY3VycmVudFBhZ2VQdnQ6IG51bWJlciA9IDA7IC8vIFVzZWQgdG8gY29uZmlybSB3aGV0aGVyIHBhZ2UgaXMgY2hhbmdlZFxuICAgIGN1cnJlbnRTdGF0ZTogU3RhdGU7XG5cbiAgICBvcFRpbWVDb21wYXJhdG9yOiBDb21wYXJhdG9yPEFjY2Vzc0xvZ0l0ZW0+ID0gbmV3IEN1c3RvbUNvbXBhcmF0b3I8QWNjZXNzTG9nSXRlbT4oJ29wX3RpbWUnLCAnZGF0ZScpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbG9nU2VydmljZTogQWNjZXNzTG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlcikgeyB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvdGFsQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nc0NhY2hlICYmIHRoaXMubG9nc0NhY2hlLm1ldGFkYXRhID8gdGhpcy5sb2dzQ2FjaGUubWV0YWRhdGEueFRvdGFsQ291bnQgOiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaW5Qcm9ncmVzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgZG9GaWx0ZXIodGVybXM6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRlcm1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50VGVybSA9IHRlcm1zLnRyaW0oKTtcbiAgICAgICAgLy8gVHJpZ2dlciBkYXRhIGxvYWRpbmcgYW5kIHN0YXJ0IGZyb20gZmlyc3QgcGFnZVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2VQdnQgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIEZvcmNlIHJlbG9hZGluZ1xuICAgICAgICAgICAgbGV0IHN0OiBTdGF0ZSA9IHRoaXMuY3VycmVudFN0YXRlO1xuICAgICAgICAgICAgaWYgKCFzdCkge1xuICAgICAgICAgICAgICAgIHN0ID0ge1xuICAgICAgICAgICAgICAgICAgICBwYWdlOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdC5wYWdlLmZyb20gPSAwO1xuICAgICAgICAgICAgc3QucGFnZS50byA9IHRoaXMucGFnZVNpemUgLSAxO1xuICAgICAgICAgICAgc3QucGFnZS5zaXplID0gdGhpcy5wYWdlU2l6ZTtcblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZVB2dCA9IDA7IC8vIFJlc2V0IHB2dFxuXG4gICAgICAgICAgICB0aGlzLmxvYWQoc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9GaWx0ZXIoXCJcIik7XG4gICAgfVxuXG4gICAgb3BlbkZpbHRlcihpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5pc09wZW5GaWx0ZXJUYWcgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc09wZW5GaWx0ZXJUYWcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdEZpbHRlcktleSgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlZmF1bHRGaWx0ZXIgPSAkZXZlbnRbJ3RhcmdldCddLnZhbHVlO1xuICAgICAgICB0aGlzLmRvRmlsdGVyKHRoaXMuY3VycmVudFRlcm0pO1xuICAgIH1cblxuICAgIGxvYWQoc3RhdGU6IFN0YXRlKSB7XG4gICAgICAgIC8vIEtlZXAgaXQgZm9yIGZ1dHVyZSBmaWx0ZXJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSBzdGF0ZTtcblxuICAgICAgICBsZXQgcGFnZU51bWJlcjogbnVtYmVyID0gY2FsY3VsYXRlUGFnZShzdGF0ZSk7XG4gICAgICAgIGlmIChwYWdlTnVtYmVyICE9PSB0aGlzLmN1cnJlbnRQYWdlUHZ0KSB7XG4gICAgICAgICAgICAvLyBsb2FkIGRhdGFcbiAgICAgICAgICAgIGxldCBwYXJhbXM6IFJlcXVlc3RRdWVyeVBhcmFtcyA9IG5ldyBSZXF1ZXN0UXVlcnlQYXJhbXMoKTtcbiAgICAgICAgICAgIHBhcmFtcy5zZXQoXCJwYWdlXCIsICcnICsgcGFnZU51bWJlcik7XG4gICAgICAgICAgICBwYXJhbXMuc2V0KFwicGFnZV9zaXplXCIsICcnICsgdGhpcy5wYWdlU2l6ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGVybSAmJiB0aGlzLmN1cnJlbnRUZXJtICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLnNldCh0aGlzLmRlZmF1bHRGaWx0ZXIsIHRoaXMuY3VycmVudFRlcm0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdG9Qcm9taXNlPEFjY2Vzc0xvZz4odGhpcy5sb2dTZXJ2aWNlLmdldFJlY2VudExvZ3MocGFyYW1zKSlcbiAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nc0NhY2hlID0gcmVzcG9uc2U7IC8vIEtlZXAgdGhlIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNlbnRMb2dzID0gdGhpcy5sb2dzQ2FjaGUuZGF0YS5maWx0ZXIobG9nID0+IGxvZy51c2VybmFtZSAhPT0gXCJcIik7IC8vIFRvIGRpc3BsYXlcblxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBjdXN0b21pemVkIGZpbHRlclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY2VudExvZ3MgPSBkb0ZpbHRlcmluZzxBY2Nlc3NMb2dJdGVtPih0aGlzLnJlY2VudExvZ3MsIHN0YXRlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBjdXN0b21pemVkIHNvcnRpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNlbnRMb2dzID0gZG9Tb3J0aW5nPEFjY2Vzc0xvZ0l0ZW0+KHRoaXMucmVjZW50TG9ncywgc3RhdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VQdnQgPSBwYWdlTnVtYmVyO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbHVtbiBzb3J0aW5nIGFuZCBmaWx0ZXJpbmdcblxuICAgICAgICAgICAgdGhpcy5yZWNlbnRMb2dzID0gdGhpcy5sb2dzQ2FjaGUuZGF0YS5maWx0ZXIobG9nID0+IGxvZy51c2VybmFtZSAhPT0gXCJcIik7IC8vIFJlc2V0IGRhdGFcblxuICAgICAgICAgICAgLy8gRG8gY3VzdG9taXplZCBmaWx0ZXJcbiAgICAgICAgICAgIHRoaXMucmVjZW50TG9ncyA9IGRvRmlsdGVyaW5nPEFjY2Vzc0xvZ0l0ZW0+KHRoaXMucmVjZW50TG9ncywgc3RhdGUpO1xuXG4gICAgICAgICAgICAvLyBEbyBjdXN0b21pemVkIHNvcnRpbmdcbiAgICAgICAgICAgIHRoaXMucmVjZW50TG9ncyA9IGRvU29ydGluZzxBY2Nlc3NMb2dJdGVtPih0aGlzLnJlY2VudExvZ3MsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzTWF0Y2hlZCh0ZXJtczogc3RyaW5nLCBsb2c6IEFjY2Vzc0xvZ0l0ZW0pOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlZyA9IG5ldyBSZWdFeHAoJy4qJyArIHRlcm1zICsgJy4qJywgJ2knKTtcbiAgICAgICAgcmV0dXJuIHJlZy50ZXN0KGxvZy51c2VybmFtZSkgfHxcbiAgICAgICAgICAgIHJlZy50ZXN0KGxvZy5yZXBvX25hbWUpIHx8XG4gICAgICAgICAgICByZWcudGVzdChsb2cub3BlcmF0aW9uKSB8fFxuICAgICAgICAgICAgcmVnLnRlc3QobG9nLnJlcG9fdGFnKTtcbiAgICB9XG59XG4iXX0=