UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

118 lines 17.1 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Injectable } from "@angular/core"; import _forEach from "lodash/forEach"; import _get from "lodash/get"; import _orderBy from "lodash/orderBy"; import { DataSourceService } from "./data-source.service"; import { SorterDirection } from "../../lib/sorter/public-api"; import { SearchService } from "../search.service"; import * as i0 from "@angular/core"; import * as i1 from "../search.service"; /** * <example-url>./../examples/index.html#/common/data-source-service/client-side</example-url> */ export class ClientSideDataSource extends DataSourceService { constructor(searchService) { super(); this.searchService = searchService; this._searchProps = []; // cache used to store our previous fetched results while scrolling // and more data is automatically fetched from the backend this.virtualScrollData = []; } setData(initialData = []) { this._allData = initialData; } setSearchProperties(properties) { this._searchProps = properties; } async getFilteredData(filters) { let nextChunk = this.prepareData(filters); // APPLY SEARCH USING CHECKBOX VALUES const searchTerm = filters?.search?.value; // APPLY SEARCH if (searchTerm) { nextChunk = this.searchHandler(searchTerm); } const numberOfItems = nextChunk.length; if (this.shouldResetFilters(filters) && filters?.virtualScroll) { // reset virtual scroll items this.virtualScrollData = []; } nextChunk = this.sortingHandler(filters, nextChunk); nextChunk = this.paginationHandler(filters, nextChunk); nextChunk = this.virtualScrollHandler(filters, nextChunk); return { repeat: { itemsSource: nextChunk, }, paginator: { total: numberOfItems, }, }; } prepareData(filters) { return this._allData; } searchHandler(searchTerm) { return this.searchService.search(this._allData, this._searchProps, searchTerm); } sortingHandler(filters, nextChunk) { if (_get(filters, "sorter.value.sortBy") && _get(filters, "sorter.value.direction")) { // Original direction means that sorting is not needed if (filters.sorter.value.direction !== SorterDirection.original) { return _orderBy(nextChunk, filters.sorter.value.sortBy, filters.sorter.value.direction); } } return nextChunk; } paginationHandler(filters, nextChunk) { if (filters?.paginator) { return nextChunk.slice(filters.paginator.value.start, filters.paginator.value.end); } return nextChunk; } virtualScrollHandler(filters, nextChunk) { let data = nextChunk; if (filters?.virtualScroll) { data = nextChunk.slice(filters.virtualScroll.value.start, filters.virtualScroll.value.end); // for virtual scroll we must always append current chunk to the previous ones data = this.virtualScrollData = this.virtualScrollData.concat(data); } return data; } extractMultiFilters(filters) { const multiFilterArr = []; _forEach(filters, (value, key) => { if (value?.type === "string[]") { multiFilterArr.push({ [key]: value }); } }); return multiFilterArr; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ClientSideDataSource, deps: [{ token: i1.SearchService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ClientSideDataSource }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ClientSideDataSource, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.SearchService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXNpZGUtZGF0YS1zb3VyY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9kYXRhLXNvdXJjZS9jbGllbnQtc2lkZS1kYXRhLXNvdXJjZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLFlBQVksQ0FBQztBQUM5QixPQUFPLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVExRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFbEQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sb0JBR1gsU0FBUSxpQkFBdUI7SUFRN0IsWUFBc0IsYUFBNEI7UUFDOUMsS0FBSyxFQUFFLENBQUM7UUFEVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQU54QyxpQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUV0QyxtRUFBbUU7UUFDbkUsMERBQTBEO1FBQ2hELHNCQUFpQixHQUFRLEVBQUUsQ0FBQztJQUl0QyxDQUFDO0lBRU0sT0FB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QUFLLENBQUMsR0FBRyxDQUNsQyxDQUFDO1lBRUYsOEVBQThFO1lBQzlFLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2RTtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFUyxtQkFBbUIsQ0FDekIsT0FBVTtRQUVWLE1BQU0sY0FBYyxHQUVkLEVBQUUsQ0FBQztRQUNULFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLFVBQVUsRUFBRTtnQkFDNUIsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFTLENBQUMsQ0FBQzthQUNoRDtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxjQUFjLENBQUM7SUFDMUIsQ0FBQzsrR0F4SFEsb0JBQW9CO21IQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgX2ZvckVhY2ggZnJvbSBcImxvZGFzaC9mb3JFYWNoXCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoL2dldFwiO1xuaW1wb3J0IF9vcmRlckJ5IGZyb20gXCJsb2Rhc2gvb3JkZXJCeVwiO1xuXG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gXCIuL2RhdGEtc291cmNlLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gICAgSUZpbHRlcixcbiAgICBJRmlsdGVyR3JvdXAsXG4gICAgSU11bHRpRmlsdGVyTWV0YWRhdGEsXG4gICAgSU5vdmFGaWx0ZXJpbmdPdXRwdXRzLFxuICAgIElOb3ZhRmlsdGVycyxcbn0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgU29ydGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uLy4uL2xpYi9zb3J0ZXIvcHVibGljLWFwaVwiO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gXCIuLi9zZWFyY2guc2VydmljZVwiO1xuXG4vKipcbiAqIDxleGFtcGxlLXVybD4uLy4uL2V4YW1wbGVzL2luZGV4Lmh0bWwjL2NvbW1vbi9kYXRhLXNvdXJjZS1zZXJ2aWNlL2NsaWVudC1zaWRlPC9leGFtcGxlLXVybD5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENsaWVudFNpZGVEYXRhU291cmNlPFxuICAgIFQsXG4gICAgRiBleHRlbmRzIElOb3ZhRmlsdGVycyA9IElOb3ZhRmlsdGVyc1xuPiBleHRlbmRzIERhdGFTb3VyY2VTZXJ2aWNlPFQsIEY+IHtcbiAgICBwcm90ZWN0ZWQgX2FsbERhdGE6IFRbXTtcbiAgICBwcm90ZWN0ZWQgX3NlYXJjaFByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gY2FjaGUgdXNlZCB0byBzdG9yZSBvdXIgcHJldmlvdXMgZmV0Y2hlZCByZXN1bHRzIHdoaWxlIHNjcm9sbGluZ1xuICAgIC8vIGFuZCBtb3JlIGRhdGEgaXMgYXV0b21hdGljYWxseSBmZXRjaGVkIGZyb20gdGhlIGJhY2tlbmRcbiAgICBwcm90ZWN0ZWQgdmlydHVhbFNjcm9sbERhdGE6IFRbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGF0YShpbml0aWFsRGF0YTogVFtdID0gW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYWxsRGF0YSA9IGluaXRpYWxEYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTZWFyY2hQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3NlYXJjaFByb3BzID0gcHJvcGVydGllcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RmlsdGVyZWREYXRhKGZpbHRlcnM6IEYpOiBQcm9taXNlPElOb3ZhRmlsdGVyaW5nT3V0cHV0cz4ge1xuICAgICAgICBsZXQgbmV4dENodW5rOiBUW10gPSB0aGlzLnByZXBhcmVEYXRhKGZpbHRlcnMpO1xuXG4gICAgICAgIC8vIEFQUExZIFNFQVJDSCBVU0lORyBDSEVDS0JPWCBWQUxVRVNcbiAgICAgICAgY29uc3Qgc2VhcmNoVGVybTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZmlsdGVycz8uc2VhcmNoPy52YWx1ZTtcbiAgICAgICAgLy8gQVBQTFkgU0VBUkNIXG4gICAgICAgIGlmIChzZWFyY2hUZXJtKSB7XG4gICAgICAgICAgICBuZXh0Q2h1bmsgPSB0aGlzLnNlYXJjaEhhbmRsZXIoc2VhcmNoVGVybSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBudW1iZXJPZkl0ZW1zID0gbmV4dENodW5rLmxlbmd0aDtcblxuICAgICAgICBpZiAodGhpcy5zaG91bGRSZXNldEZpbHRlcnMoZmlsdGVycykgJiYgZmlsdGVycz8udmlydHVhbFNjcm9sbCkge1xuICAgICAgICAgICAgLy8gcmVzZXQgdmlydHVhbCBzY3JvbGwgaXRlbXNcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbERhdGEgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRDaHVuayA9IDxUW10+dGhpcy5zb3J0aW5nSGFuZGxlcihmaWx0ZXJzLCBuZXh0Q2h1bmspO1xuICAgICAgICBuZXh0Q2h1bmsgPSB0aGlzLnBhZ2luYXRpb25IYW5kbGVyKGZpbHRlcnMsIG5leHRDaHVuayk7XG4gICAgICAgIG5leHRDaHVuayA9IHRoaXMudmlydHVhbFNjcm9sbEhhbmRsZXIoZmlsdGVycywgbmV4dENodW5rKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVwZWF0OiB7XG4gICAgICAgICAgICAgICAgaXRlbXNTb3VyY2U6IG5leHRDaHVuayxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYWdpbmF0b3I6IHtcbiAgICAgICAgICAgICAgICB0b3RhbDogbnVtYmVyT2ZJdGVtcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByZXBhcmVEYXRhKGZpbHRlcnM6IEYpOiBUW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsRGF0YTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VhcmNoSGFuZGxlcihzZWFyY2hUZXJtOiBhbnkpOiBUW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaChcbiAgICAgICAgICAgIHRoaXMuX2FsbERhdGEsXG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hQcm9wcyxcbiAgICAgICAgICAgIHNlYXJjaFRlcm1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc29ydGluZ0hhbmRsZXIoZmlsdGVyczogYW55LCBuZXh0Q2h1bms6IFRbXSk6IFRbXSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIF9nZXQoZmlsdGVycywgXCJzb3J0ZXIudmFsdWUuc29ydEJ5XCIpICYmXG4gICAgICAgICAgICBfZ2V0KGZpbHRlcnMsIFwic29ydGVyLnZhbHVlLmRpcmVjdGlvblwiKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIE9yaWdpbmFsIGRpcmVjdGlvbiBtZWFucyB0aGF0IHNvcnRpbmcgaXMgbm90IG5lZWRlZFxuICAgICAgICAgICAgaWYgKGZpbHRlcnMuc29ydGVyLnZhbHVlLmRpcmVjdGlvbiAhPT0gU29ydGVyRGlyZWN0aW9uLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vcmRlckJ5KFxuICAgICAgICAgICAgICAgICAgICBuZXh0Q2h1bmssXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnMuc29ydGVyLnZhbHVlLnNvcnRCeSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVycy5zb3J0ZXIudmFsdWUuZGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dENodW5rO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwYWdpbmF0aW9uSGFuZGxlcihmaWx0ZXJzOiBhbnksIG5leHRDaHVuazogVFtdKTogVFtdIHtcbiAgICAgICAgaWYgKGZpbHRlcnM/LnBhZ2luYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIG5leHRDaHVuay5zbGljZShcbiAgICAgICAgICAgICAgICBmaWx0ZXJzLnBhZ2luYXRvci52YWx1ZS5zdGFydCxcbiAgICAgICAgICAgICAgICBmaWx0ZXJzLnBhZ2luYXRvci52YWx1ZS5lbmRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHRDaHVuaztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdmlydHVhbFNjcm9sbEhhbmRsZXIoZmlsdGVyczogYW55LCBuZXh0Q2h1bms6IFRbXSk6IFRbXSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV4dENodW5rO1xuICAgICAgICBpZiAoZmlsdGVycz8udmlydHVhbFNjcm9sbCkge1xuICAgICAgICAgICAgZGF0YSA9IG5leHRDaHVuay5zbGljZShcbiAgICAgICAgICAgICAgICBmaWx0ZXJzLnZpcnR1YWxTY3JvbGwudmFsdWUuc3RhcnQsXG4gICAgICAgICAgICAgICAgZmlsdGVycy52aXJ0dWFsU2Nyb2xsLnZhbHVlLmVuZFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gZm9yIHZpcnR1YWwgc2Nyb2xsIHdlIG11c3QgYWx3YXlzIGFwcGVuZCBjdXJyZW50IGNodW5rIHRvIHRoZSBwcmV2aW91cyBvbmVzXG4gICAgICAgICAgICBkYXRhID0gdGhpcy52aXJ0dWFsU2Nyb2xsRGF0YSA9IHRoaXMudmlydHVhbFNjcm9sbERhdGEuY29uY2F0KGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4dHJhY3RNdWx0aUZpbHRlcnMoXG4gICAgICAgIGZpbHRlcnM6IEZcbiAgICApOiBJRmlsdGVyR3JvdXA8SUZpbHRlcjxzdHJpbmdbXSwgSU11bHRpRmlsdGVyTWV0YWRhdGE+PltdIHtcbiAgICAgICAgY29uc3QgbXVsdGlGaWx0ZXJBcnI6IElGaWx0ZXJHcm91cDxcbiAgICAgICAgICAgIElGaWx0ZXI8c3RyaW5nW10sIElNdWx0aUZpbHRlck1ldGFkYXRhPlxuICAgICAgICA+W10gPSBbXTtcbiAgICAgICAgX2ZvckVhY2goZmlsdGVycywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZT8udHlwZSA9PT0gXCJzdHJpbmdbXVwiKSB7XG4gICAgICAgICAgICAgICAgbXVsdGlGaWx0ZXJBcnIucHVzaCh7IFtrZXldOiB2YWx1ZSB9IGFzIGFueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbXVsdGlGaWx0ZXJBcnI7XG4gICAgfVxufVxuIl19