kivio 1.4.9 → 1.4.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,6 +42,7 @@ export class KvMainTableComponent {
42
42
  this.filteredItems = [];
43
43
  this.activeColumns = [];
44
44
  this.options = [];
45
+ this.searchInput = '';
45
46
  this.filters = {
46
47
  state: '',
47
48
  type: '',
@@ -56,15 +57,17 @@ export class KvMainTableComponent {
56
57
  this.subscription.add(this.paginationService.paginationState$.subscribe((state) => {
57
58
  this.currentPage = state.currentPage;
58
59
  this.pageSize = state.pageSize;
59
- this.filters.name = state.searchText;
60
- this.updateFilteredData();
61
60
  }));
61
+ const now = new Date();
62
+ this.today = now.toISOString().split('T')[0];
62
63
  const currentState = this.paginationService.getCurrentState();
63
64
  this.currentPage = currentState.currentPage;
64
65
  this.pageSize = currentState.pageSize;
65
66
  this.filters.name = currentState.searchText;
66
67
  if (this.totalRecords > 0) {
67
- this.paginationService.updatePaginationState({ totalItems: this.totalRecords });
68
+ this.paginationService.updatePaginationState({
69
+ totalItems: this.totalRecords,
70
+ });
68
71
  }
69
72
  this.updateFilteredData();
70
73
  if (this.lazyLoading) {
@@ -92,7 +95,9 @@ export class KvMainTableComponent {
92
95
  }
93
96
  ngOnChanges(changes) {
94
97
  if (changes['totalRecords']) {
95
- this.paginationService.updatePaginationState({ totalItems: this.totalRecords });
98
+ this.paginationService.updatePaginationState({
99
+ totalItems: this.totalRecords,
100
+ });
96
101
  }
97
102
  if (changes['data'] && !this.lazyLoading) {
98
103
  this.updateFilteredData();
@@ -107,7 +112,7 @@ export class KvMainTableComponent {
107
112
  updateData() {
108
113
  this.data = this.data.map((item) => ({
109
114
  ...item,
110
- description: this.changeText(item.description, 50)
115
+ description: this.changeText(item.description ?? '', 50),
111
116
  }));
112
117
  }
113
118
  changeText(text, maxLength) {
@@ -125,34 +130,40 @@ export class KvMainTableComponent {
125
130
  }
126
131
  getFilteredData() {
127
132
  this.updateData();
128
- return this.data
129
- .slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize);
133
+ let filtered = this.data;
134
+ if (this.filters.name && this.filters.name.trim() !== '') {
135
+ filtered = this.data.filter((item) => this.columns.some((col) => String(item[col.key])
136
+ .toLowerCase()
137
+ .includes(this.filters.name.toLowerCase())));
138
+ }
139
+ return filtered.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize);
130
140
  }
131
141
  get filteredData() {
132
- return this.lazyLoading ? this.data : this.getFilteredData();
142
+ return this.lazyLoading ? this.data : this.filteredItems;
133
143
  }
134
144
  totalPages() {
135
- return this.paginationService.calculateTotalPages() || Math.ceil(this.data.filter((item) => this.columns.some((col) => item[col.key]
136
- ?.toString()
137
- .toLowerCase()
138
- .includes(this.filters.name.toLowerCase()))).length / this.pageSize);
145
+ return (this.paginationService.calculateTotalPages() ||
146
+ Math.ceil(this.data.filter((item) => this.columns.some((col) => String(item[col.key])
147
+ .toLowerCase()
148
+ .includes(this.filters.name.toLowerCase()))).length / this.pageSize));
139
149
  }
140
150
  updateToFirstPage() {
141
151
  this.currentPage = 1;
142
152
  this.paginationService.updatePaginationState({
143
153
  currentPage: 1,
144
- searchText: this.filters.name
154
+ searchText: this.filters.name,
145
155
  });
146
156
  }
147
157
  onSearched() {
158
+ this.filters.name = this.pendingSearch;
159
+ this.updateToFirstPage();
160
+ this.updateFilteredData();
148
161
  const hasFilters = Object.values(this.filters).some((value) => value !== null && value !== undefined && value !== '');
149
162
  if (hasFilters) {
150
163
  this.onFilterChange.emit(this.filters);
151
- this.updateToFirstPage();
152
164
  }
153
165
  else {
154
166
  this.filters.name = '';
155
- this.updateToFirstPage();
156
167
  this.updateFilteredData();
157
168
  this.onFilterChange.emit(this.filters);
158
169
  }
@@ -207,7 +218,7 @@ export class KvMainTableComponent {
207
218
  }
208
219
  }
209
220
  else {
210
- this.activeColumns = this.activeColumns.filter(c => c !== columnKey);
221
+ this.activeColumns = this.activeColumns.filter((c) => c !== columnKey);
211
222
  if (columnKey === 'created_at') {
212
223
  delete this.filters['created_at_start'];
213
224
  delete this.filters['created_at_end'];
@@ -215,8 +226,7 @@ export class KvMainTableComponent {
215
226
  else if (this.filters[columnKey]) {
216
227
  delete this.filters[columnKey];
217
228
  }
218
- ;
219
- const hasFilters = Object.values(this.filters).some(value => value !== null && value !== undefined && value !== '');
229
+ const hasFilters = Object.values(this.filters).some((value) => value !== null && value !== undefined && value !== '');
220
230
  if (!hasFilters) {
221
231
  this.updateToFirstPage();
222
232
  this.onFilterChange.emit(this.filters);
@@ -235,12 +245,31 @@ export class KvMainTableComponent {
235
245
  }
236
246
  }
237
247
  }
248
+ clearFilters() {
249
+ this.filters = {
250
+ state: '',
251
+ type: '',
252
+ created_at_start: '',
253
+ created_at_end: '',
254
+ name: '',
255
+ source: '',
256
+ };
257
+ this.pendingSearch = '';
258
+ this.updateToFirstPage();
259
+ this.updateFilteredData();
260
+ this.onFilterChange.emit(this.filters);
261
+ }
238
262
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KvMainTableComponent, deps: [{ token: i1.PaginationService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
239
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: KvMainTableComponent, isStandalone: true, selector: "lib-kv-main-table", inputs: { columns: "columns", data: "data", extraData: "extraData", showPaginator: "showPaginator", lazyLoading: "lazyLoading", loading: "loading", messageTitle: "messageTitle", messageDescription: "messageDescription", totalRecords: "totalRecords", message: "message", hasMoreItems: "hasMoreItems", tableId: "tableId", letFilters: "letFilters", totalItems: "totalItems" }, outputs: { onNameClicked: "onNameClicked", onPageChange: "onPageChange", onFilterChange: "onFilterChange" }, host: { listeners: { "document:click": "handleClickOutside($event)" } }, queries: [{ propertyName: "cellActionsTemplate", first: true, predicate: ["cellActions"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<lib-kv-loading [message]=\"message\" [isLoading]=\"loading\" > </lib-kv-loading>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"search-container\">\r\n <div class=\"search-section\">\r\n\r\n <div class=\"filters\">\r\n <ng-container *ngFor=\"let col of columns\">\r\n <div *ngIf=\"activeColumns.includes(col.key)\">\r\n <ng-container *ngIf=\"col.key === 'created_at'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"calendarOpen\">\r\n <div class=\"selected\" (click)=\"calendarOpen = !calendarOpen; dropdownOpenState = false; dropdownOpenType = false; dropdownOpenSource = false\">\r\n <span *ngIf=\"filters.created_at_start && filters.created_at_end\">\r\n {{ filters.created_at_start | date:'dd/MM/yyyy' }} - {{ filters.created_at_end | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"filters.created_at_start && !filters.created_at_end\">\r\n {{ filters.created_at_start | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"!filters.created_at_start && filters.created_at_end\">\r\n {{ filters.created_at_end | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"!filters.created_at_start && !filters.created_at_end\" class=\"placeholder\">\r\n Created at\r\n </span>\r\n </div>\r\n \r\n <div class=\"calendar-popup\" *ngIf=\"calendarOpen\">\r\n <input type=\"date\" [(ngModel)]=\"filters.created_at_start\" (change)=\"updateRange()\" />\r\n <input type=\"date\" [(ngModel)]=\"filters.created_at_end\" (change)=\"updateRange()\" />\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"col.key === 'expire_at'\">\r\n <label>Fecha:</label>\r\n <input type=\"date\" [(ngModel)]=\"filters.expire_at\" />\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"col.key === 'state'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenState\">\r\n <div class=\"selected\" (click)=\"dropdownOpenState = !dropdownOpenState; dropdownOpenType = false; dropdownOpenSource = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.state\" class=\"state\" [ngClass]=\"filters.state\">\r\n {{ filters.state }}\r\n </span>\r\n <span *ngIf=\"!filters.state\" class=\"placeholder\">State</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenState\">\r\n <li *ngFor=\"let opt of options\"\r\n (click)=\"filters.state = opt; dropdownOpenState = false\"\r\n class=\"state\"\r\n [ngClass]=\"opt\">\r\n {{ opt }}\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"col.key === 'source'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenSource\">\r\n <div class=\"selected\" (click)=\"dropdownOpenSource = !dropdownOpenSource; dropdownOpenState = false; dropdownOpenType = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.source\" class=\"source\" >\r\n {{ filters.source }}\r\n </span>\r\n <span *ngIf=\"!filters.source\" class=\"placeholder\">Imported from</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenSource\">\r\n <li (click)=\"filters.source ='local'; dropdownOpenSource = false\"\r\n class=\"source\" [ngClass]=\"'local'\">local\r\n </li>\r\n <li (click)=\"filters.source = 'ecommerce'; dropdownOpenSource = false\"\r\n class=\"source\" [ngClass]=\"'ecommerce'\">ecommerce\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"col.key === 'type'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenType\">\r\n <div class=\"selected\" (click)=\"dropdownOpenType = !dropdownOpenType; dropdownOpenState = false; dropdownOpenSource = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.type\" class=\"type\" [ngClass]=\"filters.type.replace(' ', '-')\">\r\n {{ filters.type }}\r\n </span>\r\n <span *ngIf=\"!filters.type\" class=\"placeholder\">Offer type</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenType\">\r\n <li (click)=\"filters.type ='Regular auction'; dropdownOpenType = false\"\r\n class=\"type\" [ngClass]=\"'Regular-auction'\">Regular auction\r\n </li>\r\n <li (click)=\"filters.type = 'Quick offer'; dropdownOpenType = false\"\r\n class=\"type\" [ngClass]=\"'Quick-offer'\">Quick offer \r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"filter-container\" *ngIf=\"letFilters\">\r\n\r\n <div\r\n class=\"filter-overlay\"\r\n *ngIf=\"showFilterMenu\"\r\n (click)=\"showFilterMenu = false\">\r\n </div>\r\n\r\n <button \r\n (click)=\"showFilterMenu = !showFilterMenu; dropdownOpenState = false; dropdownOpenSource = false; calendarOpen = false; dropdownOpenType = false\" \r\n class=\"filter-button\"\r\n [class.active]=\"showFilterMenu\"\r\n >\r\n <span class=\"plus\">+</span>\r\n <span class=\"material-symbols-outlined filter-icon\">\r\n filter_alt\r\n </span>\r\n </button>\r\n\r\n <div class=\"filter-menu\" *ngIf=\"showFilterMenu\">\r\n <ng-container *ngFor=\"let col of columns\">\r\n <ng-container *ngIf=\"col.key !== 'name' && col.key !== 'images' && col.key !== 'pos_id' && col.key !== 'point_of_sale_id' && col.key !== 'description' \">\r\n <label class=\"custom-checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"activeColumns.includes(col.key)\"\r\n (change)=\"toggleColumn(col.key, $event)\"\r\n />\r\n <span class=\"label-text\">{{ col.label }}</span>\r\n </label>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n \r\n <input\r\n type=\"text\"\r\n class=\"input\"\r\n placeholder=\"Buscar...\"\r\n [(ngModel)]=\"filters.name\"\r\n (keyup.enter)=\"onSearched()\"\r\n />\r\n <button class=\"button--create\" (click)=\"onSearched()\">Buscar</button>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(!data || data.length === 0) && !loading\">\r\n <lib-kv-resource-not-found class=\"resource-not-found\"\r\n [messageTitle]=\"messageTitle\"\r\n [messageDescription]=\"messageDescription\"></lib-kv-resource-not-found>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(data && data.length > 0) || loading\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of columns\">{{ column.label }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of filteredData\">\r\n <td *ngFor=\"let column of columns\">\r\n <div class=\"state\" [ngClass]=\"item[column.key]\">\r\n <ng-container *ngIf=\"column.label === 'Services'\">\r\n <div class=\"service-info\" (click)=\"emitData(item)\">\r\n <img [src]=\"item.url || 'https://i.imgur.com/InRaVrL.jpg'\" alt=\"Imagen\" class=\"service-image\" />\r\n <a class=\"a-link\">{{ item.name }}</a>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'name' && column.label !== 'Services'\">\r\n <a class=\"a-link\" (click)=\"emitData(item)\">{{\r\n item[column.key]\r\n }}</a>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'images'\">\r\n <div class=\"image-container\">\r\n <div *ngFor=\"let image of item[column.key]?.slice(0, 3)\">\r\n <img [src]=\"image\" alt=\"Imagen\" />\r\n </div>\r\n <div *ngIf=\"item[column.key]?.length > 3\" class=\"extra-images\">\r\n +{{ item[column.key].length - 3 }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'created_at'\">\r\n {{ item[column.key] | date : \"dd/MM/yyyy\" }}\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'expire_at'\">\r\n {{ item[column.key] | date : \"dd/MM/yyyy\" }}\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'actions'\">\r\n <ng-container *ngTemplateOutlet=\"cellActionsTemplate; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"\r\n column.key !== 'expire_at' &&\r\n column.key !== 'created_at' &&\r\n column.key !== 'point_of_sale_id' &&\r\n column.key !== 'name' &&\r\n column.key !== 'pos_id' &&\r\n column.key !== 'images' &&\r\n column.key !== 'actions'\r\n \"\r\n >\r\n {{ item[column.key] }}\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"column.key === 'point_of_sale_id' || column.key === 'pos_id'\"\r\n >\r\n {{ getPosName(item[column.key]) }}\r\n </ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <ng-container *ngIf=\"showPaginator\">\r\n <table class=\"table-pagination\">\r\n <tbody>\r\n <tr>\r\n <div class=\"pagination\">\r\n <div class=\"button-section\">\r\n <button (click)=\"changePage(-1)\" [disabled]=\"currentPage === 1\">\r\n Previous\r\n </button>\r\n <button\r\n (click)=\"changePage(1)\"\r\n [disabled]=\"currentPage === totalPages() && !hasMoreItems\"\r\n >\r\n Next\r\n </button>\r\n </div>\r\n <div class=\"current-section\">\r\n <span>Page {{ currentPage }} of {{ totalPages() }}</span>\r\n </div>\r\n </div>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined\";input,textarea{padding:10px;width:-webkit-fill-available;border:1px solid #ccc;border-radius:5px;font-size:16px;font-family:Roboto,sans-serif!important;color:#101828;background-color:#fff}input::placeholder,textarea::placeholder{color:#475467}input:focus,textarea:focus{border-color:#007bff;box-shadow:0 0 8px #007bff80;background-color:#fff}input.error,textarea.error{border-color:#fcd9d9;box-shadow:0 0 8px #fcd9d980}.input-group{margin-bottom:15px}.input-group label{font-size:14px;margin-bottom:5px;color:#555}.input-group .error-message{color:red}.input-cost{display:flex;gap:10px}table{width:100%;border-collapse:collapse;text-align:left;border:1px solid #ccc;border-radius:4px}thead{background-color:#fff;color:#101828}tbody{color:#475467}th,td{padding:10px;font-size:14px;border-bottom:1px solid #ccc}tbody tr:hover{background-color:#fff}.state.Active{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Active a{color:#036338!important}.state.Waiting{background-color:#f8e0d1;color:#b53701!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Waiting a{color:#b53701!important}.state.Created{background-color:#f8e0d1;color:#b53701!important;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Created a{color:#b53701!important}.state.Offered{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Offered a{color:#036338!important}.state.Closed{background-color:#fcd9d9;color:#581d1d;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Closed a{color:#581d1d!important}.state.Approved{background-color:#d1e7dd;color:#0f5132;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Approved a{color:#0f5132!important}.state.Rejected{background-color:#f8d7da;color:#842029;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Rejected a{color:#842029!important}.state.Pending{background-color:#f8e0d1;color:#b53701;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Pending a{color:#b53701!important}.pagination{display:flex;justify-content:space-between;margin-top:10px}.pagination button{padding:5px 10px;border:1px solid #ccc;background-color:#fff;cursor:pointer}.pagination button:disabled{color:#555;cursor:not-allowed}.search-container{margin-bottom:10px;display:flex;justify-content:flex-end;width:100%}.search-container .search-section input{width:min-content!important}.pagination{display:flex;justify-content:space-between;align-items:center;gap:10px;margin:14px;color:#101828}.pagination button{padding:6px 12px;border:none;color:#101828;cursor:pointer;border-radius:4px;margin-right:6px}.pagination button:disabled{background-color:#ededed;cursor:not-allowed}.table-pagination{border-top:0!important}@media (max-width: 768px){.search-container{margin-bottom:10px;display:flex;justify-content:center;width:100%;margin-left:1.5rem}}.a-link{text-decoration:none}.a-link:hover{cursor:pointer;text-decoration:underline}.a-link2{text-decoration:underline}.a-link2:hover{cursor:pointer;text-decoration:underline}.column-direction{display:flex;flex-direction:row;gap:1rem;padding:2rem;width:100%}.main-text{font-size:30px;color:#101828}.secondary-text{font-size:16px;color:#475467}.sidebar-title{font-size:24px;color:#101828;font-weight:700;margin-bottom:20px}.description-section{margin-top:30px}.description-section .description-title{color:#101828}.description-section .description-body{color:#475467}.list-container{width:100%;border:1px solid #ccc;border-radius:12px;margin-top:22px}.list-container .list-section{margin:1rem;color:#101828}.list-container .list-section .list{margin-top:12px;color:#475467}.required{color:#b90000;font-weight:700}.service-info{align-items:center;display:flex}.service-info img{width:40px;height:40px;border:2px solid #ccc;border-radius:50%;margin:5px}.table-button--primary{width:100%;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.table-button--primary:hover{background-color:#00438a}.table-button--primary:disabled{background-color:#ededed;cursor:not-allowed}.button--primary{width:100%;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--primary:hover{background-color:#00438a}.button--primary:disabled{background-color:#ededed;cursor:not-allowed}.button--minimalist{height:min-content;padding:5px;background-color:#ebebeb;color:#475467;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--minimalist:disabled{background-color:#ededed;cursor:not-allowed}.button--primary-min{height:min-content;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;background:#0052cc;color:#fcfcfd}.button--primary-min:hover{background:#00438a}.button--primary-min:disabled{background-color:#ededed;cursor:not-allowed}.button--cancel{height:min-content;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;color:#475467;background-color:#fff;border:1px solid #ededed}.button--cancel:disabled{background-color:#ededed;cursor:not-allowed}.button--create{height:min-content;align-self:center;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--create:hover{background-color:#00438a}.button--create:disabled{background-color:#ededed;cursor:not-allowed}.button--sidenav{background-color:#fff;color:#475467;padding:8px;font-weight:700;border:none;display:flex;border-radius:4px;cursor:pointer;gap:10px;margin-top:10px;width:100%;align-items:center}.button--sidenav:hover{background-color:#f2f4f7;color:#101828}.button--sidenav:disabled{background-color:#ededed;cursor:not-allowed}.button--warn{background-color:#b90000;color:#f2f4f7;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;height:min-content}.button--warn:hover{background-color:red}.button--warn:disabled{background-color:#ededed;cursor:not-allowed}.button-container{display:flex;justify-content:flex-end;gap:8px}.button-container:disabled{background-color:#ededed;cursor:not-allowed}table{width:100%;table-layout:fixed}th{text-align:flex-start;padding:10px}.image-container{display:flex;align-items:center}.image-container img{width:40px;height:40px;border:2px solid #ccc;border-radius:50%;margin-left:-10px}.extra-images{width:40px;height:40px;border-radius:50%;border:2px solid #ccc;margin-left:-10px;background-color:#0052cc;color:#fff;font-size:15px;display:flex;align-items:center;justify-content:center}.loading-indicator{display:flex;justify-content:center;align-items:center;padding:10px;background-color:#0000000d;margin:10px 0;border-radius:4px}.search-section{display:flex;gap:7px;align-items:center}.search-section input{padding:5px}.search-section button{padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;cursor:pointer}.search-section button .button--create{background-color:#0052cc}.search-section button:hover{background-color:#f4f3f3}.search-section button.button--create{background-color:#0052cc;color:#fff;border-color:#0052cc;height:28px;text-align:center}@media (max-width: 768px){.search-section button.button--create{height:36px;font-size:14px;width:100%;border-radius:6px;margin-right:2.8rem}}.filters{display:flex;gap:7px;align-items:center}.filter-container{position:relative;display:inline-block}.filter-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;z-index:10}.filter-menu{position:absolute;top:120%;left:0;background:#fff;padding:.4rem;border-radius:8px;display:flex;flex-direction:column;z-index:20;font-size:14px;width:130px}.filter-button{position:relative;height:28px;display:flex;align-items:center;justify-content:center;gap:2px;cursor:pointer;width:35px;z-index:20}.filter-icon{font-size:20px;color:#666}.plus{font-size:16px;color:#555;transition:color .3s ease}.filter-button.active .plus{color:#0052cc}.custom-checkbox input[type=checkbox]{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:1px solid #ccc;border-radius:2px;background:#fff;cursor:pointer;display:inline-block;vertical-align:middle;transition:all .2s ease;position:relative;padding:5px}.custom-checkbox input[type=checkbox]:checked{background:#0052cc;border-color:#0052cc}.custom-checkbox input[type=checkbox]:focus-visible{padding:6px!important;outline:2px solid rgba(0,123,255,.4);outline-offset:2px}.custom-checkbox input[type=checkbox]:checked+.label-text{color:#0052cc}.custom-dropdown{position:relative;width:fit-content;cursor:pointer;height:24px;font-size:14px;display:inline-block;padding:2px 6px;line-height:1.2;border-radius:4px;min-width:auto}.custom-dropdown .selected{display:inline-block;position:relative;top:-2px;border:1px solid #ccc;border-radius:6px;padding:2px 6px;background:#fff;display:flex;align-items:center;justify-content:space-between;height:24px}.custom-dropdown .selected .placeholder{color:#0052cc}.custom-dropdown .options{position:absolute;top:calc(100% + 6px);left:0;list-style:none;margin:0;padding:8px;border:1px solid #ccc;border-radius:8px;background:#fff;box-shadow:0 4px 8px #0000001a;z-index:10;white-space:nowrap}.custom-dropdown .options li{display:block;padding:2px 6px;line-height:1.1;border-radius:4px;margin:2px 0;cursor:pointer;transition:transform .1s ease-in}.custom-dropdown .options li:hover{transform:scale(1.03)}.type.Regular-auction{background-color:#d3eef7;color:#025875!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.type.Quick-offer{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.custom-calendar{position:relative;display:inline-block;font-family:sans-serif}.calendar-header .placeholder{color:#999}.calendar-popup{position:absolute;top:110%;left:0;background:#fff;border:1px solid #ccc;border-radius:6px;padding:12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 4px 8px #0000001a;z-index:10}.calendar-popup input[type=date]{padding:6px;border:1px solid #ddd;border-radius:4px}.calendar-popup button{background:#0052cc;color:#fff;border:none;padding:6px 12px;border-radius:4px;cursor:pointer}.calendar-popup button:hover{background:#0052cc}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: KvLoadingComponent, selector: "lib-kv-loading", inputs: ["message", "isLoading", "isFullScreen", "customIcon", "customImage", "iconStyles", "imageStyles"] }, { kind: "component", type: ResourceNotFoundComponent, selector: "lib-kv-resource-not-found", inputs: ["messageTitle", "messageDescription"] }] }); }
263
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: KvMainTableComponent, isStandalone: true, selector: "lib-kv-main-table", inputs: { columns: "columns", data: "data", extraData: "extraData", showPaginator: "showPaginator", lazyLoading: "lazyLoading", loading: "loading", messageTitle: "messageTitle", messageDescription: "messageDescription", totalRecords: "totalRecords", message: "message", hasMoreItems: "hasMoreItems", tableId: "tableId", letFilters: "letFilters", totalItems: "totalItems" }, outputs: { onNameClicked: "onNameClicked", onPageChange: "onPageChange", onFilterChange: "onFilterChange" }, host: { listeners: { "document:click": "handleClickOutside($event)" } }, queries: [{ propertyName: "cellActionsTemplate", first: true, predicate: ["cellActions"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<lib-kv-loading [message]=\"message\" [isLoading]=\"loading\" > </lib-kv-loading>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"search-container\">\r\n <div class=\"search-section\">\r\n\r\n <div class=\"filters\">\r\n <ng-container *ngFor=\"let col of columns\">\r\n <div *ngIf=\"activeColumns.includes(col.key)\">\r\n <ng-container *ngIf=\"col.key === 'created_at'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"calendarOpen\">\r\n <div class=\"selected\" (click)=\"calendarOpen = !calendarOpen; dropdownOpenState = false; dropdownOpenType = false; dropdownOpenSource = false\">\r\n <span *ngIf=\"filters.created_at_start && filters.created_at_end\">\r\n {{ filters.created_at_start | date:'dd/MM/yyyy' }} - {{ filters.created_at_end | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"filters.created_at_start && !filters.created_at_end\">\r\n {{ filters.created_at_start | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"!filters.created_at_start && filters.created_at_end\">\r\n {{ filters.created_at_end | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"!filters.created_at_start && !filters.created_at_end\" class=\"placeholder\">\r\n Created at\r\n </span>\r\n </div>\r\n \r\n <div class=\"calendar-popup\" *ngIf=\"calendarOpen\">\r\n <input type=\"date\" [(ngModel)]=\"filters.created_at_start\" (change)=\"updateRange()\" [max]=\"today\" />\r\n <input type=\"date\" [(ngModel)]=\"filters.created_at_end\" (change)=\"updateRange()\" [max]=\"today\" />\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"col.key === 'expire_at'\">\r\n <label>Fecha:</label>\r\n <input type=\"date\" [(ngModel)]=\"filters.expire_at\" [max]=\"today\" />\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"col.key === 'state'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenState\">\r\n <div class=\"selected\" (click)=\"dropdownOpenState = !dropdownOpenState; dropdownOpenType = false; dropdownOpenSource = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.state\" class=\"state\" [ngClass]=\"filters.state\">\r\n {{ filters.state }}\r\n </span>\r\n <span *ngIf=\"!filters.state\" class=\"placeholder\">State</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenState\">\r\n <li *ngFor=\"let opt of options\"\r\n (click)=\"filters.state = opt; dropdownOpenState = false\"\r\n class=\"state\"\r\n [ngClass]=\"opt\">\r\n {{ opt }}\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"col.key === 'source'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenSource\">\r\n <div class=\"selected\" (click)=\"dropdownOpenSource = !dropdownOpenSource; dropdownOpenState = false; dropdownOpenType = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.source\" class=\"source\" >\r\n {{ filters.source }}\r\n </span>\r\n <span *ngIf=\"!filters.source\" class=\"placeholder\">Imported from</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenSource\">\r\n <li (click)=\"filters.source ='local'; dropdownOpenSource = false\"\r\n class=\"source\" [ngClass]=\"'local'\">local\r\n </li>\r\n <li (click)=\"filters.source = 'ecommerce'; dropdownOpenSource = false\"\r\n class=\"source\" [ngClass]=\"'ecommerce'\">ecommerce\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"col.key === 'type'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenType\">\r\n <div class=\"selected\" (click)=\"dropdownOpenType = !dropdownOpenType; dropdownOpenState = false; dropdownOpenSource = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.type\" class=\"type\" [ngClass]=\"filters.type.replace(' ', '-')\">\r\n {{ filters.type }}\r\n </span>\r\n <span *ngIf=\"!filters.type\" class=\"placeholder\">Offer type</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenType\">\r\n <li (click)=\"filters.type ='Regular auction'; dropdownOpenType = false\"\r\n class=\"type\" [ngClass]=\"'Regular-auction'\">Regular auction\r\n </li>\r\n <li (click)=\"filters.type = 'Quick offer'; dropdownOpenType = false\"\r\n class=\"type\" [ngClass]=\"'Quick-offer'\">Quick offer \r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"filter-container\" *ngIf=\"letFilters\">\r\n\r\n <div\r\n class=\"filter-overlay\"\r\n *ngIf=\"showFilterMenu\"\r\n (click)=\"showFilterMenu = false\">\r\n </div>\r\n\r\n <button \r\n (click)=\"showFilterMenu = !showFilterMenu; dropdownOpenState = false; dropdownOpenSource = false; calendarOpen = false; dropdownOpenType = false\" \r\n class=\"filter-button\"\r\n [class.active]=\"showFilterMenu\"\r\n >\r\n <span class=\"plus\">+</span>\r\n <span class=\"material-symbols-outlined filter-icon\">\r\n filter_alt\r\n </span>\r\n </button>\r\n\r\n <div class=\"filter-menu\" *ngIf=\"showFilterMenu\">\r\n <ng-container *ngFor=\"let col of columns\">\r\n <ng-container *ngIf=\"col.key !== 'name' && col.key !== 'images' && col.key !== 'pos_id' && col.key !== 'point_of_sale_id' && col.key !== 'description' \">\r\n <label class=\"custom-checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"activeColumns.includes(col.key)\"\r\n (change)=\"toggleColumn(col.key, $event)\"\r\n />\r\n <span class=\"label-text\">{{ col.label }}</span>\r\n </label>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n \r\n <input\r\n type=\"text\"\r\n class=\"input\"\r\n placeholder=\"Buscar...\"\r\n [(ngModel)]=\"pendingSearch\"\r\n (keyup.enter)=\"onSearched()\"\r\n />\r\n <button class=\"button--create\" (click)=\"onSearched()\">Buscar</button>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(!data || data.length === 0) && !loading\">\r\n <lib-kv-resource-not-found class=\"resource-not-found\"\r\n [messageTitle]=\"messageTitle\"\r\n [messageDescription]=\"messageDescription\"></lib-kv-resource-not-found>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(data && data.length > 0) || loading\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of columns\">{{ column.label }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of filteredData\">\r\n <td *ngFor=\"let column of columns\">\r\n <div class=\"state\" [ngClass]=\"item[column.key]\">\r\n <ng-container *ngIf=\"column.label === 'Services'\">\r\n <div class=\"service-info\" (click)=\"emitData(item)\">\r\n <img [src]=\"item['url'] || 'https://i.imgur.com/InRaVrL.jpg'\" alt=\"Imagen\" class=\"service-image\" />\r\n <a class=\"a-link\">{{ item.name }}</a>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'name' && column.label !== 'Services'\">\r\n <a class=\"a-link\" (click)=\"emitData(item)\">{{\r\n item[column.key]\r\n }}</a>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'images'\">\r\n <div class=\"image-container\">\r\n <div *ngFor=\"let image of item[column.key]?.slice(0, 3)\">\r\n <img [src]=\"image\" alt=\"Imagen\" />\r\n </div>\r\n <div *ngIf=\"item[column.key]?.length > 3\" class=\"extra-images\">\r\n +{{ item[column.key].length - 3 }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'created_at'\">\r\n {{ item[column.key] | date : \"dd/MM/yyyy\" }}\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'expire_at'\">\r\n {{ item[column.key] | date : \"dd/MM/yyyy\" }}\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'actions'\">\r\n <ng-container *ngTemplateOutlet=\"cellActionsTemplate; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"\r\n column.key !== 'expire_at' &&\r\n column.key !== 'created_at' &&\r\n column.key !== 'point_of_sale_id' &&\r\n column.key !== 'name' &&\r\n column.key !== 'pos_id' &&\r\n column.key !== 'images' &&\r\n column.key !== 'actions'\r\n \"\r\n >\r\n {{ item[column.key] }}\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"column.key === 'point_of_sale_id' || column.key === 'pos_id'\"\r\n >\r\n {{ getPosName(item[column.key]) }}\r\n </ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <ng-container *ngIf=\"showPaginator\">\r\n <table class=\"table-pagination\">\r\n <tbody>\r\n <tr>\r\n <div class=\"pagination\">\r\n <div class=\"button-section\">\r\n <button (click)=\"changePage(-1)\" [disabled]=\"currentPage === 1\">\r\n Previous\r\n </button>\r\n <button\r\n (click)=\"changePage(1)\"\r\n [disabled]=\"currentPage === totalPages() && !hasMoreItems\"\r\n >\r\n Next\r\n </button>\r\n </div>\r\n <div class=\"current-section\">\r\n <span>Page {{ currentPage }} of {{ totalPages() }}</span>\r\n </div>\r\n </div>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined\";input,textarea{padding:10px;width:-webkit-fill-available;border:1px solid #ccc;border-radius:5px;font-size:16px;font-family:Roboto,sans-serif!important;color:#101828;background-color:#fff}input::placeholder,textarea::placeholder{color:#475467}input:focus,textarea:focus{border-color:#007bff;box-shadow:0 0 8px #007bff80;background-color:#fff}input.error,textarea.error{border-color:#fcd9d9;box-shadow:0 0 8px #fcd9d980}.input-group{margin-bottom:15px}.input-group label{font-size:14px;margin-bottom:5px;color:#555}.input-group .error-message{color:red}.input-cost{display:flex;gap:10px}table{width:100%;border-collapse:collapse;text-align:left;border:1px solid #ccc;border-radius:4px}thead{background-color:#fff;color:#101828}tbody{color:#475467}th,td{padding:10px;font-size:14px;border-bottom:1px solid #ccc}tbody tr:hover{background-color:#fff}.state.Active{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Active a{color:#036338!important}.state.Waiting{background-color:#f8e0d1;color:#b53701!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Waiting a{color:#b53701!important}.state.Created{background-color:#f8e0d1;color:#b53701!important;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Created a{color:#b53701!important}.state.Offered{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Offered a{color:#036338!important}.state.Closed{background-color:#fcd9d9;color:#581d1d;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Closed a{color:#581d1d!important}.state.Approved{background-color:#d1e7dd;color:#0f5132;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Approved a{color:#0f5132!important}.state.Rejected{background-color:#f8d7da;color:#842029;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Rejected a{color:#842029!important}.state.Pending{background-color:#f8e0d1;color:#b53701;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Pending a{color:#b53701!important}.pagination{display:flex;justify-content:space-between;margin-top:10px}.pagination button{padding:5px 10px;border:1px solid #ccc;background-color:#fff;cursor:pointer}.pagination button:disabled{color:#555;cursor:not-allowed}.search-container{margin-bottom:10px;display:flex;justify-content:flex-end;width:100%}.search-container .search-section input{width:min-content!important}.pagination{display:flex;justify-content:space-between;align-items:center;gap:10px;margin:14px;color:#101828}.pagination button{padding:6px 12px;border:none;color:#101828;cursor:pointer;border-radius:4px;margin-right:6px}.pagination button:disabled{background-color:#ededed;cursor:not-allowed}.table-pagination{border-top:0!important}@media (max-width: 768px){.search-container{margin-bottom:10px;display:flex;justify-content:center;width:100%;margin-left:1.5rem}}.a-link{text-decoration:none}.a-link:hover{cursor:pointer;text-decoration:underline}.a-link2{text-decoration:underline}.a-link2:hover{cursor:pointer;text-decoration:underline}.column-direction{display:flex;flex-direction:row;gap:1rem;padding:2rem;width:100%}.main-text{font-size:30px;color:#101828}.secondary-text{font-size:16px;color:#475467}.sidebar-title{font-size:24px;color:#101828;font-weight:700;margin-bottom:20px}.description-section{margin-top:30px}.description-section .description-title{color:#101828}.description-section .description-body{color:#475467}.list-container{width:100%;border:1px solid #ccc;border-radius:12px;margin-top:22px}.list-container .list-section{margin:1rem;color:#101828}.list-container .list-section .list{margin-top:12px;color:#475467}.required{color:#b90000;font-weight:700}.service-info{align-items:center;display:flex}.service-info img{width:40px;height:40px;border:2px solid #ccc;border-radius:50%;margin:5px}.table-button--primary{width:100%;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.table-button--primary:hover{background-color:#00438a}.table-button--primary:disabled{background-color:#ededed;cursor:not-allowed}.button--primary{width:100%;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--primary:hover{background-color:#00438a}.button--primary:disabled{background-color:#ededed;cursor:not-allowed}.button--minimalist{height:min-content;padding:5px;background-color:#ebebeb;color:#475467;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--minimalist:disabled{background-color:#ededed;cursor:not-allowed}.button--primary-min{height:min-content;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;background:#0052cc;color:#fcfcfd}.button--primary-min:hover{background:#00438a}.button--primary-min:disabled{background-color:#ededed;cursor:not-allowed}.button--cancel{height:min-content;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;color:#475467;background-color:#fff;border:1px solid #ededed}.button--cancel:disabled{background-color:#ededed;cursor:not-allowed}.button--create{height:min-content;align-self:center;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--create:hover{background-color:#00438a}.button--create:disabled{background-color:#ededed;cursor:not-allowed}.button--sidenav{background-color:#fff;color:#475467;padding:8px;font-weight:700;border:none;display:flex;border-radius:4px;cursor:pointer;gap:10px;margin-top:10px;width:100%;align-items:center}.button--sidenav:hover{background-color:#f2f4f7;color:#101828}.button--sidenav:disabled{background-color:#ededed;cursor:not-allowed}.button--warn{background-color:#b90000;color:#f2f4f7;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;height:min-content}.button--warn:hover{background-color:red}.button--warn:disabled{background-color:#ededed;cursor:not-allowed}.button-container{display:flex;justify-content:flex-end;gap:8px}.button-container:disabled{background-color:#ededed;cursor:not-allowed}table{width:100%;table-layout:fixed}th{text-align:flex-start;padding:10px}.image-container{display:flex;align-items:center}.image-container img{width:40px;height:40px;border:2px solid #ccc;border-radius:50%;margin-left:-10px}.extra-images{width:40px;height:40px;border-radius:50%;border:2px solid #ccc;margin-left:-10px;background-color:#0052cc;color:#fff;font-size:15px;display:flex;align-items:center;justify-content:center}.loading-indicator{display:flex;justify-content:center;align-items:center;padding:10px;background-color:#0000000d;margin:10px 0;border-radius:4px}.search-section{display:flex;gap:7px;align-items:center}.search-section input{padding:5px}.search-section button{padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;cursor:pointer}.search-section button .button--create{background-color:#0052cc}.search-section button:hover{background-color:#f4f3f3}.search-section button.button--create{background-color:#0052cc;color:#fff;border-color:#0052cc;height:28px;text-align:center}@media (max-width: 768px){.search-section button.button--create{height:36px;font-size:14px;width:100%;border-radius:6px;margin-right:2.8rem}}.filters{display:flex;gap:7px;align-items:center}.filter-container{position:relative;display:inline-block}.filter-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;z-index:10}.filter-menu{position:absolute;top:120%;left:0;background:#fff;padding:.4rem;border-radius:8px;display:flex;flex-direction:column;z-index:20;font-size:14px;width:130px}.filter-button{position:relative;height:28px;display:flex;align-items:center;justify-content:center;gap:2px;cursor:pointer;width:35px;z-index:20}.filter-icon{font-size:20px;color:#666}.plus{font-size:16px;color:#555;transition:color .3s ease}.filter-button.active .plus{color:#0052cc}.custom-checkbox input[type=checkbox]{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:1px solid #ccc;border-radius:2px;background:#fff;cursor:pointer;display:inline-block;vertical-align:middle;transition:all .2s ease;position:relative;padding:5px}.custom-checkbox input[type=checkbox]:checked{background:#0052cc;border-color:#0052cc}.custom-checkbox input[type=checkbox]:focus-visible{padding:6px!important;outline:2px solid rgba(0,123,255,.4);outline-offset:2px}.custom-checkbox input[type=checkbox]:checked+.label-text{color:#0052cc}.custom-dropdown{position:relative;width:fit-content;cursor:pointer;height:24px;font-size:14px;display:inline-block;padding:2px 6px;line-height:1.2;border-radius:4px;min-width:auto}.custom-dropdown .selected{display:inline-block;position:relative;top:-2px;border:1px solid #ccc;border-radius:6px;padding:2px 6px;background:#fff;display:flex;align-items:center;justify-content:space-between;height:24px}.custom-dropdown .selected .placeholder{color:#0052cc}.custom-dropdown .options{position:absolute;top:calc(100% + 6px);left:0;list-style:none;margin:0;padding:8px;border:1px solid #ccc;border-radius:8px;background:#fff;box-shadow:0 4px 8px #0000001a;z-index:10;white-space:nowrap}.custom-dropdown .options li{display:block;padding:2px 6px;line-height:1.1;border-radius:4px;margin:2px 0;cursor:pointer;transition:transform .1s ease-in}.custom-dropdown .options li:hover{transform:scale(1.03)}.type.Regular-auction{background-color:#d3eef7;color:#025875!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.type.Quick-offer{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.custom-calendar{position:relative;display:inline-block;font-family:sans-serif}.calendar-header .placeholder{color:#999}.calendar-popup{position:absolute;top:110%;left:0;background:#fff;border:1px solid #ccc;border-radius:6px;padding:12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 4px 8px #0000001a;z-index:10}.calendar-popup input[type=date]{padding:6px;border:1px solid #ddd;border-radius:4px}.calendar-popup button{background:#0052cc;color:#fff;border:none;padding:6px 12px;border-radius:4px;cursor:pointer}.calendar-popup button:hover{background:#0052cc}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: KvLoadingComponent, selector: "lib-kv-loading", inputs: ["message", "isLoading", "isFullScreen", "customIcon", "customImage", "iconStyles", "imageStyles"] }, { kind: "component", type: ResourceNotFoundComponent, selector: "lib-kv-resource-not-found", inputs: ["messageTitle", "messageDescription"] }] }); }
240
264
  }
241
265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KvMainTableComponent, decorators: [{
242
266
  type: Component,
243
- args: [{ selector: 'lib-kv-main-table', standalone: true, imports: [CommonModule, FormsModule, KvLoadingComponent, ResourceNotFoundComponent], template: "<lib-kv-loading [message]=\"message\" [isLoading]=\"loading\" > </lib-kv-loading>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"search-container\">\r\n <div class=\"search-section\">\r\n\r\n <div class=\"filters\">\r\n <ng-container *ngFor=\"let col of columns\">\r\n <div *ngIf=\"activeColumns.includes(col.key)\">\r\n <ng-container *ngIf=\"col.key === 'created_at'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"calendarOpen\">\r\n <div class=\"selected\" (click)=\"calendarOpen = !calendarOpen; dropdownOpenState = false; dropdownOpenType = false; dropdownOpenSource = false\">\r\n <span *ngIf=\"filters.created_at_start && filters.created_at_end\">\r\n {{ filters.created_at_start | date:'dd/MM/yyyy' }} - {{ filters.created_at_end | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"filters.created_at_start && !filters.created_at_end\">\r\n {{ filters.created_at_start | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"!filters.created_at_start && filters.created_at_end\">\r\n {{ filters.created_at_end | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"!filters.created_at_start && !filters.created_at_end\" class=\"placeholder\">\r\n Created at\r\n </span>\r\n </div>\r\n \r\n <div class=\"calendar-popup\" *ngIf=\"calendarOpen\">\r\n <input type=\"date\" [(ngModel)]=\"filters.created_at_start\" (change)=\"updateRange()\" />\r\n <input type=\"date\" [(ngModel)]=\"filters.created_at_end\" (change)=\"updateRange()\" />\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"col.key === 'expire_at'\">\r\n <label>Fecha:</label>\r\n <input type=\"date\" [(ngModel)]=\"filters.expire_at\" />\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"col.key === 'state'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenState\">\r\n <div class=\"selected\" (click)=\"dropdownOpenState = !dropdownOpenState; dropdownOpenType = false; dropdownOpenSource = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.state\" class=\"state\" [ngClass]=\"filters.state\">\r\n {{ filters.state }}\r\n </span>\r\n <span *ngIf=\"!filters.state\" class=\"placeholder\">State</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenState\">\r\n <li *ngFor=\"let opt of options\"\r\n (click)=\"filters.state = opt; dropdownOpenState = false\"\r\n class=\"state\"\r\n [ngClass]=\"opt\">\r\n {{ opt }}\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"col.key === 'source'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenSource\">\r\n <div class=\"selected\" (click)=\"dropdownOpenSource = !dropdownOpenSource; dropdownOpenState = false; dropdownOpenType = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.source\" class=\"source\" >\r\n {{ filters.source }}\r\n </span>\r\n <span *ngIf=\"!filters.source\" class=\"placeholder\">Imported from</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenSource\">\r\n <li (click)=\"filters.source ='local'; dropdownOpenSource = false\"\r\n class=\"source\" [ngClass]=\"'local'\">local\r\n </li>\r\n <li (click)=\"filters.source = 'ecommerce'; dropdownOpenSource = false\"\r\n class=\"source\" [ngClass]=\"'ecommerce'\">ecommerce\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"col.key === 'type'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenType\">\r\n <div class=\"selected\" (click)=\"dropdownOpenType = !dropdownOpenType; dropdownOpenState = false; dropdownOpenSource = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.type\" class=\"type\" [ngClass]=\"filters.type.replace(' ', '-')\">\r\n {{ filters.type }}\r\n </span>\r\n <span *ngIf=\"!filters.type\" class=\"placeholder\">Offer type</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenType\">\r\n <li (click)=\"filters.type ='Regular auction'; dropdownOpenType = false\"\r\n class=\"type\" [ngClass]=\"'Regular-auction'\">Regular auction\r\n </li>\r\n <li (click)=\"filters.type = 'Quick offer'; dropdownOpenType = false\"\r\n class=\"type\" [ngClass]=\"'Quick-offer'\">Quick offer \r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"filter-container\" *ngIf=\"letFilters\">\r\n\r\n <div\r\n class=\"filter-overlay\"\r\n *ngIf=\"showFilterMenu\"\r\n (click)=\"showFilterMenu = false\">\r\n </div>\r\n\r\n <button \r\n (click)=\"showFilterMenu = !showFilterMenu; dropdownOpenState = false; dropdownOpenSource = false; calendarOpen = false; dropdownOpenType = false\" \r\n class=\"filter-button\"\r\n [class.active]=\"showFilterMenu\"\r\n >\r\n <span class=\"plus\">+</span>\r\n <span class=\"material-symbols-outlined filter-icon\">\r\n filter_alt\r\n </span>\r\n </button>\r\n\r\n <div class=\"filter-menu\" *ngIf=\"showFilterMenu\">\r\n <ng-container *ngFor=\"let col of columns\">\r\n <ng-container *ngIf=\"col.key !== 'name' && col.key !== 'images' && col.key !== 'pos_id' && col.key !== 'point_of_sale_id' && col.key !== 'description' \">\r\n <label class=\"custom-checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"activeColumns.includes(col.key)\"\r\n (change)=\"toggleColumn(col.key, $event)\"\r\n />\r\n <span class=\"label-text\">{{ col.label }}</span>\r\n </label>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n \r\n <input\r\n type=\"text\"\r\n class=\"input\"\r\n placeholder=\"Buscar...\"\r\n [(ngModel)]=\"filters.name\"\r\n (keyup.enter)=\"onSearched()\"\r\n />\r\n <button class=\"button--create\" (click)=\"onSearched()\">Buscar</button>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(!data || data.length === 0) && !loading\">\r\n <lib-kv-resource-not-found class=\"resource-not-found\"\r\n [messageTitle]=\"messageTitle\"\r\n [messageDescription]=\"messageDescription\"></lib-kv-resource-not-found>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(data && data.length > 0) || loading\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of columns\">{{ column.label }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of filteredData\">\r\n <td *ngFor=\"let column of columns\">\r\n <div class=\"state\" [ngClass]=\"item[column.key]\">\r\n <ng-container *ngIf=\"column.label === 'Services'\">\r\n <div class=\"service-info\" (click)=\"emitData(item)\">\r\n <img [src]=\"item.url || 'https://i.imgur.com/InRaVrL.jpg'\" alt=\"Imagen\" class=\"service-image\" />\r\n <a class=\"a-link\">{{ item.name }}</a>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'name' && column.label !== 'Services'\">\r\n <a class=\"a-link\" (click)=\"emitData(item)\">{{\r\n item[column.key]\r\n }}</a>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'images'\">\r\n <div class=\"image-container\">\r\n <div *ngFor=\"let image of item[column.key]?.slice(0, 3)\">\r\n <img [src]=\"image\" alt=\"Imagen\" />\r\n </div>\r\n <div *ngIf=\"item[column.key]?.length > 3\" class=\"extra-images\">\r\n +{{ item[column.key].length - 3 }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'created_at'\">\r\n {{ item[column.key] | date : \"dd/MM/yyyy\" }}\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'expire_at'\">\r\n {{ item[column.key] | date : \"dd/MM/yyyy\" }}\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'actions'\">\r\n <ng-container *ngTemplateOutlet=\"cellActionsTemplate; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"\r\n column.key !== 'expire_at' &&\r\n column.key !== 'created_at' &&\r\n column.key !== 'point_of_sale_id' &&\r\n column.key !== 'name' &&\r\n column.key !== 'pos_id' &&\r\n column.key !== 'images' &&\r\n column.key !== 'actions'\r\n \"\r\n >\r\n {{ item[column.key] }}\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"column.key === 'point_of_sale_id' || column.key === 'pos_id'\"\r\n >\r\n {{ getPosName(item[column.key]) }}\r\n </ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <ng-container *ngIf=\"showPaginator\">\r\n <table class=\"table-pagination\">\r\n <tbody>\r\n <tr>\r\n <div class=\"pagination\">\r\n <div class=\"button-section\">\r\n <button (click)=\"changePage(-1)\" [disabled]=\"currentPage === 1\">\r\n Previous\r\n </button>\r\n <button\r\n (click)=\"changePage(1)\"\r\n [disabled]=\"currentPage === totalPages() && !hasMoreItems\"\r\n >\r\n Next\r\n </button>\r\n </div>\r\n <div class=\"current-section\">\r\n <span>Page {{ currentPage }} of {{ totalPages() }}</span>\r\n </div>\r\n </div>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined\";input,textarea{padding:10px;width:-webkit-fill-available;border:1px solid #ccc;border-radius:5px;font-size:16px;font-family:Roboto,sans-serif!important;color:#101828;background-color:#fff}input::placeholder,textarea::placeholder{color:#475467}input:focus,textarea:focus{border-color:#007bff;box-shadow:0 0 8px #007bff80;background-color:#fff}input.error,textarea.error{border-color:#fcd9d9;box-shadow:0 0 8px #fcd9d980}.input-group{margin-bottom:15px}.input-group label{font-size:14px;margin-bottom:5px;color:#555}.input-group .error-message{color:red}.input-cost{display:flex;gap:10px}table{width:100%;border-collapse:collapse;text-align:left;border:1px solid #ccc;border-radius:4px}thead{background-color:#fff;color:#101828}tbody{color:#475467}th,td{padding:10px;font-size:14px;border-bottom:1px solid #ccc}tbody tr:hover{background-color:#fff}.state.Active{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Active a{color:#036338!important}.state.Waiting{background-color:#f8e0d1;color:#b53701!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Waiting a{color:#b53701!important}.state.Created{background-color:#f8e0d1;color:#b53701!important;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Created a{color:#b53701!important}.state.Offered{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Offered a{color:#036338!important}.state.Closed{background-color:#fcd9d9;color:#581d1d;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Closed a{color:#581d1d!important}.state.Approved{background-color:#d1e7dd;color:#0f5132;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Approved a{color:#0f5132!important}.state.Rejected{background-color:#f8d7da;color:#842029;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Rejected a{color:#842029!important}.state.Pending{background-color:#f8e0d1;color:#b53701;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Pending a{color:#b53701!important}.pagination{display:flex;justify-content:space-between;margin-top:10px}.pagination button{padding:5px 10px;border:1px solid #ccc;background-color:#fff;cursor:pointer}.pagination button:disabled{color:#555;cursor:not-allowed}.search-container{margin-bottom:10px;display:flex;justify-content:flex-end;width:100%}.search-container .search-section input{width:min-content!important}.pagination{display:flex;justify-content:space-between;align-items:center;gap:10px;margin:14px;color:#101828}.pagination button{padding:6px 12px;border:none;color:#101828;cursor:pointer;border-radius:4px;margin-right:6px}.pagination button:disabled{background-color:#ededed;cursor:not-allowed}.table-pagination{border-top:0!important}@media (max-width: 768px){.search-container{margin-bottom:10px;display:flex;justify-content:center;width:100%;margin-left:1.5rem}}.a-link{text-decoration:none}.a-link:hover{cursor:pointer;text-decoration:underline}.a-link2{text-decoration:underline}.a-link2:hover{cursor:pointer;text-decoration:underline}.column-direction{display:flex;flex-direction:row;gap:1rem;padding:2rem;width:100%}.main-text{font-size:30px;color:#101828}.secondary-text{font-size:16px;color:#475467}.sidebar-title{font-size:24px;color:#101828;font-weight:700;margin-bottom:20px}.description-section{margin-top:30px}.description-section .description-title{color:#101828}.description-section .description-body{color:#475467}.list-container{width:100%;border:1px solid #ccc;border-radius:12px;margin-top:22px}.list-container .list-section{margin:1rem;color:#101828}.list-container .list-section .list{margin-top:12px;color:#475467}.required{color:#b90000;font-weight:700}.service-info{align-items:center;display:flex}.service-info img{width:40px;height:40px;border:2px solid #ccc;border-radius:50%;margin:5px}.table-button--primary{width:100%;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.table-button--primary:hover{background-color:#00438a}.table-button--primary:disabled{background-color:#ededed;cursor:not-allowed}.button--primary{width:100%;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--primary:hover{background-color:#00438a}.button--primary:disabled{background-color:#ededed;cursor:not-allowed}.button--minimalist{height:min-content;padding:5px;background-color:#ebebeb;color:#475467;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--minimalist:disabled{background-color:#ededed;cursor:not-allowed}.button--primary-min{height:min-content;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;background:#0052cc;color:#fcfcfd}.button--primary-min:hover{background:#00438a}.button--primary-min:disabled{background-color:#ededed;cursor:not-allowed}.button--cancel{height:min-content;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;color:#475467;background-color:#fff;border:1px solid #ededed}.button--cancel:disabled{background-color:#ededed;cursor:not-allowed}.button--create{height:min-content;align-self:center;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--create:hover{background-color:#00438a}.button--create:disabled{background-color:#ededed;cursor:not-allowed}.button--sidenav{background-color:#fff;color:#475467;padding:8px;font-weight:700;border:none;display:flex;border-radius:4px;cursor:pointer;gap:10px;margin-top:10px;width:100%;align-items:center}.button--sidenav:hover{background-color:#f2f4f7;color:#101828}.button--sidenav:disabled{background-color:#ededed;cursor:not-allowed}.button--warn{background-color:#b90000;color:#f2f4f7;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;height:min-content}.button--warn:hover{background-color:red}.button--warn:disabled{background-color:#ededed;cursor:not-allowed}.button-container{display:flex;justify-content:flex-end;gap:8px}.button-container:disabled{background-color:#ededed;cursor:not-allowed}table{width:100%;table-layout:fixed}th{text-align:flex-start;padding:10px}.image-container{display:flex;align-items:center}.image-container img{width:40px;height:40px;border:2px solid #ccc;border-radius:50%;margin-left:-10px}.extra-images{width:40px;height:40px;border-radius:50%;border:2px solid #ccc;margin-left:-10px;background-color:#0052cc;color:#fff;font-size:15px;display:flex;align-items:center;justify-content:center}.loading-indicator{display:flex;justify-content:center;align-items:center;padding:10px;background-color:#0000000d;margin:10px 0;border-radius:4px}.search-section{display:flex;gap:7px;align-items:center}.search-section input{padding:5px}.search-section button{padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;cursor:pointer}.search-section button .button--create{background-color:#0052cc}.search-section button:hover{background-color:#f4f3f3}.search-section button.button--create{background-color:#0052cc;color:#fff;border-color:#0052cc;height:28px;text-align:center}@media (max-width: 768px){.search-section button.button--create{height:36px;font-size:14px;width:100%;border-radius:6px;margin-right:2.8rem}}.filters{display:flex;gap:7px;align-items:center}.filter-container{position:relative;display:inline-block}.filter-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;z-index:10}.filter-menu{position:absolute;top:120%;left:0;background:#fff;padding:.4rem;border-radius:8px;display:flex;flex-direction:column;z-index:20;font-size:14px;width:130px}.filter-button{position:relative;height:28px;display:flex;align-items:center;justify-content:center;gap:2px;cursor:pointer;width:35px;z-index:20}.filter-icon{font-size:20px;color:#666}.plus{font-size:16px;color:#555;transition:color .3s ease}.filter-button.active .plus{color:#0052cc}.custom-checkbox input[type=checkbox]{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:1px solid #ccc;border-radius:2px;background:#fff;cursor:pointer;display:inline-block;vertical-align:middle;transition:all .2s ease;position:relative;padding:5px}.custom-checkbox input[type=checkbox]:checked{background:#0052cc;border-color:#0052cc}.custom-checkbox input[type=checkbox]:focus-visible{padding:6px!important;outline:2px solid rgba(0,123,255,.4);outline-offset:2px}.custom-checkbox input[type=checkbox]:checked+.label-text{color:#0052cc}.custom-dropdown{position:relative;width:fit-content;cursor:pointer;height:24px;font-size:14px;display:inline-block;padding:2px 6px;line-height:1.2;border-radius:4px;min-width:auto}.custom-dropdown .selected{display:inline-block;position:relative;top:-2px;border:1px solid #ccc;border-radius:6px;padding:2px 6px;background:#fff;display:flex;align-items:center;justify-content:space-between;height:24px}.custom-dropdown .selected .placeholder{color:#0052cc}.custom-dropdown .options{position:absolute;top:calc(100% + 6px);left:0;list-style:none;margin:0;padding:8px;border:1px solid #ccc;border-radius:8px;background:#fff;box-shadow:0 4px 8px #0000001a;z-index:10;white-space:nowrap}.custom-dropdown .options li{display:block;padding:2px 6px;line-height:1.1;border-radius:4px;margin:2px 0;cursor:pointer;transition:transform .1s ease-in}.custom-dropdown .options li:hover{transform:scale(1.03)}.type.Regular-auction{background-color:#d3eef7;color:#025875!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.type.Quick-offer{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.custom-calendar{position:relative;display:inline-block;font-family:sans-serif}.calendar-header .placeholder{color:#999}.calendar-popup{position:absolute;top:110%;left:0;background:#fff;border:1px solid #ccc;border-radius:6px;padding:12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 4px 8px #0000001a;z-index:10}.calendar-popup input[type=date]{padding:6px;border:1px solid #ddd;border-radius:4px}.calendar-popup button{background:#0052cc;color:#fff;border:none;padding:6px 12px;border-radius:4px;cursor:pointer}.calendar-popup button:hover{background:#0052cc}\n"] }]
267
+ args: [{ selector: 'lib-kv-main-table', standalone: true, imports: [
268
+ CommonModule,
269
+ FormsModule,
270
+ KvLoadingComponent,
271
+ ResourceNotFoundComponent,
272
+ ], template: "<lib-kv-loading [message]=\"message\" [isLoading]=\"loading\" > </lib-kv-loading>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"search-container\">\r\n <div class=\"search-section\">\r\n\r\n <div class=\"filters\">\r\n <ng-container *ngFor=\"let col of columns\">\r\n <div *ngIf=\"activeColumns.includes(col.key)\">\r\n <ng-container *ngIf=\"col.key === 'created_at'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"calendarOpen\">\r\n <div class=\"selected\" (click)=\"calendarOpen = !calendarOpen; dropdownOpenState = false; dropdownOpenType = false; dropdownOpenSource = false\">\r\n <span *ngIf=\"filters.created_at_start && filters.created_at_end\">\r\n {{ filters.created_at_start | date:'dd/MM/yyyy' }} - {{ filters.created_at_end | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"filters.created_at_start && !filters.created_at_end\">\r\n {{ filters.created_at_start | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"!filters.created_at_start && filters.created_at_end\">\r\n {{ filters.created_at_end | date:'dd/MM/yyyy' }}\r\n </span>\r\n <span *ngIf=\"!filters.created_at_start && !filters.created_at_end\" class=\"placeholder\">\r\n Created at\r\n </span>\r\n </div>\r\n \r\n <div class=\"calendar-popup\" *ngIf=\"calendarOpen\">\r\n <input type=\"date\" [(ngModel)]=\"filters.created_at_start\" (change)=\"updateRange()\" [max]=\"today\" />\r\n <input type=\"date\" [(ngModel)]=\"filters.created_at_end\" (change)=\"updateRange()\" [max]=\"today\" />\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"col.key === 'expire_at'\">\r\n <label>Fecha:</label>\r\n <input type=\"date\" [(ngModel)]=\"filters.expire_at\" [max]=\"today\" />\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"col.key === 'state'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenState\">\r\n <div class=\"selected\" (click)=\"dropdownOpenState = !dropdownOpenState; dropdownOpenType = false; dropdownOpenSource = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.state\" class=\"state\" [ngClass]=\"filters.state\">\r\n {{ filters.state }}\r\n </span>\r\n <span *ngIf=\"!filters.state\" class=\"placeholder\">State</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenState\">\r\n <li *ngFor=\"let opt of options\"\r\n (click)=\"filters.state = opt; dropdownOpenState = false\"\r\n class=\"state\"\r\n [ngClass]=\"opt\">\r\n {{ opt }}\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"col.key === 'source'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenSource\">\r\n <div class=\"selected\" (click)=\"dropdownOpenSource = !dropdownOpenSource; dropdownOpenState = false; dropdownOpenType = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.source\" class=\"source\" >\r\n {{ filters.source }}\r\n </span>\r\n <span *ngIf=\"!filters.source\" class=\"placeholder\">Imported from</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenSource\">\r\n <li (click)=\"filters.source ='local'; dropdownOpenSource = false\"\r\n class=\"source\" [ngClass]=\"'local'\">local\r\n </li>\r\n <li (click)=\"filters.source = 'ecommerce'; dropdownOpenSource = false\"\r\n class=\"source\" [ngClass]=\"'ecommerce'\">ecommerce\r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"col.key === 'type'\">\r\n <div class=\"custom-dropdown\" [class.open]=\"dropdownOpenType\">\r\n <div class=\"selected\" (click)=\"dropdownOpenType = !dropdownOpenType; dropdownOpenState = false; dropdownOpenSource = false; calendarOpen = false\">\r\n <span *ngIf=\"filters.type\" class=\"type\" [ngClass]=\"filters.type.replace(' ', '-')\">\r\n {{ filters.type }}\r\n </span>\r\n <span *ngIf=\"!filters.type\" class=\"placeholder\">Offer type</span>\r\n </div>\r\n \r\n <ul class=\"options\" *ngIf=\"dropdownOpenType\">\r\n <li (click)=\"filters.type ='Regular auction'; dropdownOpenType = false\"\r\n class=\"type\" [ngClass]=\"'Regular-auction'\">Regular auction\r\n </li>\r\n <li (click)=\"filters.type = 'Quick offer'; dropdownOpenType = false\"\r\n class=\"type\" [ngClass]=\"'Quick-offer'\">Quick offer \r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"filter-container\" *ngIf=\"letFilters\">\r\n\r\n <div\r\n class=\"filter-overlay\"\r\n *ngIf=\"showFilterMenu\"\r\n (click)=\"showFilterMenu = false\">\r\n </div>\r\n\r\n <button \r\n (click)=\"showFilterMenu = !showFilterMenu; dropdownOpenState = false; dropdownOpenSource = false; calendarOpen = false; dropdownOpenType = false\" \r\n class=\"filter-button\"\r\n [class.active]=\"showFilterMenu\"\r\n >\r\n <span class=\"plus\">+</span>\r\n <span class=\"material-symbols-outlined filter-icon\">\r\n filter_alt\r\n </span>\r\n </button>\r\n\r\n <div class=\"filter-menu\" *ngIf=\"showFilterMenu\">\r\n <ng-container *ngFor=\"let col of columns\">\r\n <ng-container *ngIf=\"col.key !== 'name' && col.key !== 'images' && col.key !== 'pos_id' && col.key !== 'point_of_sale_id' && col.key !== 'description' \">\r\n <label class=\"custom-checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"activeColumns.includes(col.key)\"\r\n (change)=\"toggleColumn(col.key, $event)\"\r\n />\r\n <span class=\"label-text\">{{ col.label }}</span>\r\n </label>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n \r\n <input\r\n type=\"text\"\r\n class=\"input\"\r\n placeholder=\"Buscar...\"\r\n [(ngModel)]=\"pendingSearch\"\r\n (keyup.enter)=\"onSearched()\"\r\n />\r\n <button class=\"button--create\" (click)=\"onSearched()\">Buscar</button>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"(!data || data.length === 0) && !loading\">\r\n <lib-kv-resource-not-found class=\"resource-not-found\"\r\n [messageTitle]=\"messageTitle\"\r\n [messageDescription]=\"messageDescription\"></lib-kv-resource-not-found>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(data && data.length > 0) || loading\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let column of columns\">{{ column.label }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let item of filteredData\">\r\n <td *ngFor=\"let column of columns\">\r\n <div class=\"state\" [ngClass]=\"item[column.key]\">\r\n <ng-container *ngIf=\"column.label === 'Services'\">\r\n <div class=\"service-info\" (click)=\"emitData(item)\">\r\n <img [src]=\"item['url'] || 'https://i.imgur.com/InRaVrL.jpg'\" alt=\"Imagen\" class=\"service-image\" />\r\n <a class=\"a-link\">{{ item.name }}</a>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'name' && column.label !== 'Services'\">\r\n <a class=\"a-link\" (click)=\"emitData(item)\">{{\r\n item[column.key]\r\n }}</a>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'images'\">\r\n <div class=\"image-container\">\r\n <div *ngFor=\"let image of item[column.key]?.slice(0, 3)\">\r\n <img [src]=\"image\" alt=\"Imagen\" />\r\n </div>\r\n <div *ngIf=\"item[column.key]?.length > 3\" class=\"extra-images\">\r\n +{{ item[column.key].length - 3 }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'created_at'\">\r\n {{ item[column.key] | date : \"dd/MM/yyyy\" }}\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'expire_at'\">\r\n {{ item[column.key] | date : \"dd/MM/yyyy\" }}\r\n </ng-container>\r\n <ng-container *ngIf=\"column.key === 'actions'\">\r\n <ng-container *ngTemplateOutlet=\"cellActionsTemplate; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"\r\n column.key !== 'expire_at' &&\r\n column.key !== 'created_at' &&\r\n column.key !== 'point_of_sale_id' &&\r\n column.key !== 'name' &&\r\n column.key !== 'pos_id' &&\r\n column.key !== 'images' &&\r\n column.key !== 'actions'\r\n \"\r\n >\r\n {{ item[column.key] }}\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"column.key === 'point_of_sale_id' || column.key === 'pos_id'\"\r\n >\r\n {{ getPosName(item[column.key]) }}\r\n </ng-container>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n <ng-container *ngIf=\"showPaginator\">\r\n <table class=\"table-pagination\">\r\n <tbody>\r\n <tr>\r\n <div class=\"pagination\">\r\n <div class=\"button-section\">\r\n <button (click)=\"changePage(-1)\" [disabled]=\"currentPage === 1\">\r\n Previous\r\n </button>\r\n <button\r\n (click)=\"changePage(1)\"\r\n [disabled]=\"currentPage === totalPages() && !hasMoreItems\"\r\n >\r\n Next\r\n </button>\r\n </div>\r\n <div class=\"current-section\">\r\n <span>Page {{ currentPage }} of {{ totalPages() }}</span>\r\n </div>\r\n </div>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined\";input,textarea{padding:10px;width:-webkit-fill-available;border:1px solid #ccc;border-radius:5px;font-size:16px;font-family:Roboto,sans-serif!important;color:#101828;background-color:#fff}input::placeholder,textarea::placeholder{color:#475467}input:focus,textarea:focus{border-color:#007bff;box-shadow:0 0 8px #007bff80;background-color:#fff}input.error,textarea.error{border-color:#fcd9d9;box-shadow:0 0 8px #fcd9d980}.input-group{margin-bottom:15px}.input-group label{font-size:14px;margin-bottom:5px;color:#555}.input-group .error-message{color:red}.input-cost{display:flex;gap:10px}table{width:100%;border-collapse:collapse;text-align:left;border:1px solid #ccc;border-radius:4px}thead{background-color:#fff;color:#101828}tbody{color:#475467}th,td{padding:10px;font-size:14px;border-bottom:1px solid #ccc}tbody tr:hover{background-color:#fff}.state.Active{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Active a{color:#036338!important}.state.Waiting{background-color:#f8e0d1;color:#b53701!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Waiting a{color:#b53701!important}.state.Created{background-color:#f8e0d1;color:#b53701!important;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Created a{color:#b53701!important}.state.Offered{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.state.Offered a{color:#036338!important}.state.Closed{background-color:#fcd9d9;color:#581d1d;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Closed a{color:#581d1d!important}.state.Approved{background-color:#d1e7dd;color:#0f5132;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Approved a{color:#0f5132!important}.state.Rejected{background-color:#f8d7da;color:#842029;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Rejected a{color:#842029!important}.state.Pending{background-color:#f8e0d1;color:#b53701;font-weight:700;width:min-content;padding:6px;border-radius:4px}.state.Pending a{color:#b53701!important}.pagination{display:flex;justify-content:space-between;margin-top:10px}.pagination button{padding:5px 10px;border:1px solid #ccc;background-color:#fff;cursor:pointer}.pagination button:disabled{color:#555;cursor:not-allowed}.search-container{margin-bottom:10px;display:flex;justify-content:flex-end;width:100%}.search-container .search-section input{width:min-content!important}.pagination{display:flex;justify-content:space-between;align-items:center;gap:10px;margin:14px;color:#101828}.pagination button{padding:6px 12px;border:none;color:#101828;cursor:pointer;border-radius:4px;margin-right:6px}.pagination button:disabled{background-color:#ededed;cursor:not-allowed}.table-pagination{border-top:0!important}@media (max-width: 768px){.search-container{margin-bottom:10px;display:flex;justify-content:center;width:100%;margin-left:1.5rem}}.a-link{text-decoration:none}.a-link:hover{cursor:pointer;text-decoration:underline}.a-link2{text-decoration:underline}.a-link2:hover{cursor:pointer;text-decoration:underline}.column-direction{display:flex;flex-direction:row;gap:1rem;padding:2rem;width:100%}.main-text{font-size:30px;color:#101828}.secondary-text{font-size:16px;color:#475467}.sidebar-title{font-size:24px;color:#101828;font-weight:700;margin-bottom:20px}.description-section{margin-top:30px}.description-section .description-title{color:#101828}.description-section .description-body{color:#475467}.list-container{width:100%;border:1px solid #ccc;border-radius:12px;margin-top:22px}.list-container .list-section{margin:1rem;color:#101828}.list-container .list-section .list{margin-top:12px;color:#475467}.required{color:#b90000;font-weight:700}.service-info{align-items:center;display:flex}.service-info img{width:40px;height:40px;border:2px solid #ccc;border-radius:50%;margin:5px}.table-button--primary{width:100%;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.table-button--primary:hover{background-color:#00438a}.table-button--primary:disabled{background-color:#ededed;cursor:not-allowed}.button--primary{width:100%;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--primary:hover{background-color:#00438a}.button--primary:disabled{background-color:#ededed;cursor:not-allowed}.button--minimalist{height:min-content;padding:5px;background-color:#ebebeb;color:#475467;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--minimalist:disabled{background-color:#ededed;cursor:not-allowed}.button--primary-min{height:min-content;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;background:#0052cc;color:#fcfcfd}.button--primary-min:hover{background:#00438a}.button--primary-min:disabled{background-color:#ededed;cursor:not-allowed}.button--cancel{height:min-content;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;color:#475467;background-color:#fff;border:1px solid #ededed}.button--cancel:disabled{background-color:#ededed;cursor:not-allowed}.button--create{height:min-content;align-self:center;padding:10px;background-color:#0052cc;color:#fcfcfd;border:none;border-radius:5px;font-size:16px;cursor:pointer}.button--create:hover{background-color:#00438a}.button--create:disabled{background-color:#ededed;cursor:not-allowed}.button--sidenav{background-color:#fff;color:#475467;padding:8px;font-weight:700;border:none;display:flex;border-radius:4px;cursor:pointer;gap:10px;margin-top:10px;width:100%;align-items:center}.button--sidenav:hover{background-color:#f2f4f7;color:#101828}.button--sidenav:disabled{background-color:#ededed;cursor:not-allowed}.button--warn{background-color:#b90000;color:#f2f4f7;padding:8px 20px;border:none;border-radius:4px;cursor:pointer;height:min-content}.button--warn:hover{background-color:red}.button--warn:disabled{background-color:#ededed;cursor:not-allowed}.button-container{display:flex;justify-content:flex-end;gap:8px}.button-container:disabled{background-color:#ededed;cursor:not-allowed}table{width:100%;table-layout:fixed}th{text-align:flex-start;padding:10px}.image-container{display:flex;align-items:center}.image-container img{width:40px;height:40px;border:2px solid #ccc;border-radius:50%;margin-left:-10px}.extra-images{width:40px;height:40px;border-radius:50%;border:2px solid #ccc;margin-left:-10px;background-color:#0052cc;color:#fff;font-size:15px;display:flex;align-items:center;justify-content:center}.loading-indicator{display:flex;justify-content:center;align-items:center;padding:10px;background-color:#0000000d;margin:10px 0;border-radius:4px}.search-section{display:flex;gap:7px;align-items:center}.search-section input{padding:5px}.search-section button{padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;cursor:pointer}.search-section button .button--create{background-color:#0052cc}.search-section button:hover{background-color:#f4f3f3}.search-section button.button--create{background-color:#0052cc;color:#fff;border-color:#0052cc;height:28px;text-align:center}@media (max-width: 768px){.search-section button.button--create{height:36px;font-size:14px;width:100%;border-radius:6px;margin-right:2.8rem}}.filters{display:flex;gap:7px;align-items:center}.filter-container{position:relative;display:inline-block}.filter-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;z-index:10}.filter-menu{position:absolute;top:120%;left:0;background:#fff;padding:.4rem;border-radius:8px;display:flex;flex-direction:column;z-index:20;font-size:14px;width:130px}.filter-button{position:relative;height:28px;display:flex;align-items:center;justify-content:center;gap:2px;cursor:pointer;width:35px;z-index:20}.filter-icon{font-size:20px;color:#666}.plus{font-size:16px;color:#555;transition:color .3s ease}.filter-button.active .plus{color:#0052cc}.custom-checkbox input[type=checkbox]{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:1px solid #ccc;border-radius:2px;background:#fff;cursor:pointer;display:inline-block;vertical-align:middle;transition:all .2s ease;position:relative;padding:5px}.custom-checkbox input[type=checkbox]:checked{background:#0052cc;border-color:#0052cc}.custom-checkbox input[type=checkbox]:focus-visible{padding:6px!important;outline:2px solid rgba(0,123,255,.4);outline-offset:2px}.custom-checkbox input[type=checkbox]:checked+.label-text{color:#0052cc}.custom-dropdown{position:relative;width:fit-content;cursor:pointer;height:24px;font-size:14px;display:inline-block;padding:2px 6px;line-height:1.2;border-radius:4px;min-width:auto}.custom-dropdown .selected{display:inline-block;position:relative;top:-2px;border:1px solid #ccc;border-radius:6px;padding:2px 6px;background:#fff;display:flex;align-items:center;justify-content:space-between;height:24px}.custom-dropdown .selected .placeholder{color:#0052cc}.custom-dropdown .options{position:absolute;top:calc(100% + 6px);left:0;list-style:none;margin:0;padding:8px;border:1px solid #ccc;border-radius:8px;background:#fff;box-shadow:0 4px 8px #0000001a;z-index:10;white-space:nowrap}.custom-dropdown .options li{display:block;padding:2px 6px;line-height:1.1;border-radius:4px;margin:2px 0;cursor:pointer;transition:transform .1s ease-in}.custom-dropdown .options li:hover{transform:scale(1.03)}.type.Regular-auction{background-color:#d3eef7;color:#025875!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.type.Quick-offer{background-color:#12b76a26;color:#036338!important;font-weight:700;width:min-content;padding:6px;border-radius:4px;white-space:nowrap}.custom-calendar{position:relative;display:inline-block;font-family:sans-serif}.calendar-header .placeholder{color:#999}.calendar-popup{position:absolute;top:110%;left:0;background:#fff;border:1px solid #ccc;border-radius:6px;padding:12px;display:flex;flex-direction:column;gap:8px;box-shadow:0 4px 8px #0000001a;z-index:10}.calendar-popup input[type=date]{padding:6px;border:1px solid #ddd;border-radius:4px}.calendar-popup button{background:#0052cc;color:#fff;border:none;padding:6px 12px;border-radius:4px;cursor:pointer}.calendar-popup button:hover{background:#0052cc}\n"] }]
244
273
  }], ctorParameters: () => [{ type: i1.PaginationService }, { type: i0.ElementRef }], propDecorators: { columns: [{
245
274
  type: Input
246
275
  }], data: [{
@@ -282,4 +311,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
282
311
  type: HostListener,
283
312
  args: ['document:click', ['$event']]
284
313
  }] } });
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtbWFpbi10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXZpby9zcmMvbGliL2NvbXBvbmVudHMva3YtbWFpbi10YWJsZS9rdi1tYWluLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdmlvL3NyYy9saWIvY29tcG9uZW50cy9rdi1tYWluLXRhYmxlL2t2LW1haW4tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBSU4sWUFBWSxFQUVaLFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQzs7Ozs7QUFTckcsTUFBTSxPQUFPLG9CQUFvQjtJQWMvQixJQUFhLFVBQVUsQ0FBQyxLQUFhO1FBQ25DLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNyRTtJQUNILENBQUM7SUEyQ0QsWUFBb0IsaUJBQW9DLEVBQVUsSUFBZ0I7UUFBOUQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQVk7UUE1RHpFLFlBQU8sR0FBcUMsRUFBRSxDQUFDO1FBQy9DLFNBQUks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Y29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBPbkluaXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIE9uRGVzdHJveSxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgRWxlbWVudFJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEt2TG9hZGluZ0NvbXBvbmVudCB9IGZyb20gJy4uL2t2LWxvYWRpbmcva3YtbG9hZGluZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSwgUGFnaW5hdGlvblN0YXRlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJlc291cmNlTm90Rm91bmRDb21wb25lbnQgfSBmcm9tICcuLi9rdi1yZXNvdXJjZS1ub3QtZm91bmQva3YtcmVzb3VyY2Utbm90LWZvdW5kLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1rdi1tYWluLXRhYmxlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBLdkxvYWRpbmdDb21wb25lbnQsIFJlc291cmNlTm90Rm91bmRDb21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9rdi1tYWluLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4va3YtbWFpbi10YWJsZS5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLdk1haW5UYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcbiAgQElucHV0KCkgZGF0YTogYW55W10gPSBbXTtcclxuICBASW5wdXQoKSBleHRyYURhdGEhOiBhbnlbXTtcclxuICBASW5wdXQoKSBzaG93UGFnaW5hdG9yOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBsYXp5TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBtZXNzYWdlVGl0bGU6IHN0cmluZyA9ICdSZXNvdXJjZSBub3QgZm91bmQnO1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2VEZXNjcmlwdGlvbjogc3RyaW5nID0gJ1RoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kLic7XHJcbiAgQElucHV0KCkgdG90YWxSZWNvcmRzOiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2U6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGhhc01vcmVJdGVtczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgdGFibGVJZDogc3RyaW5nID0gJ2RlZmF1bHQnO1xyXG4gIEBJbnB1dCgpIGxldEZpbHRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZXQgdG90YWxJdGVtcyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZVBhZ2luYXRpb25TdGF0ZSh7IHRvdGFsSXRlbXM6IHZhbHVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQENvbnRlbnRDaGlsZCgnY2VsbEFjdGlvbnMnKSBjZWxsQWN0aW9uc1RlbXBsYXRlOiBhbnk7XHJcbiAgQE91dHB1dCgpIG9uTmFtZUNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uUGFnZUNoYW5nZTogRXZlbnRFbWl0dGVyPHtcclxuICAgIHBhZ2U6IG51bWJlcjtcclxuICAgIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgICBzZWFyY2hUZXh0OiBzdHJpbmc7XHJcbiAgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHtcclxuICAgIHBhZ2U6IG51bWJlcjtcclxuICAgIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgICBzZWFyY2hUZXh0OiBzdHJpbmc7XHJcbiAgfT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uRmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBzdGF0ZTogc3RyaW5nO1xyXG4gICAgdHlwZTogc3RyaW5nO1xyXG4gICAgY3JlYXRlZF9hdF9zdGFydDogc3RyaW5nO1xyXG4gICAgY3JlYXRlZF9hdF9lbmQ6IHN0cmluZztcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIHNvdXJjZTogc3RyaW5nO1xyXG4gIH0+KCk7XHJcblxyXG4gIGRyb3Bkb3duT3BlblN0YXRlID0gZmFsc2U7XHJcbiAgZHJvcGRvd25PcGVuVHlwZSA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duT3BlblNvdXJjZSA9IGZhbHNlXHJcbiAgY2FsZW5kYXJPcGVuID0gZmFsc2U7XHJcbiAgY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XHJcbiAgcGFnZVNpemU6IG51bWJlciA9IDU7XHJcbiAgc2hvd0ZpbHRlck1lbnUgPSBmYWxzZTtcclxuICBmaWx0ZXJlZEl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gIHB1YmxpYyBhY3RpdmVDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIG9wdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgcHVibGljIGZpbHRlcnM6IGFueSA9IHtcclxuICAgIHN0YXRlOiAnJyxcclxuICAgIHR5cGU6ICcnLFxyXG4gICAgY3JlYXRlZF9hdF9zdGFydDogJycsXHJcbiAgICBjcmVhdGVkX2F0X2VuZDogJycsXHJcbiAgICBuYW1lOiAnJywgXHJcbiAgICBzb3VyY2U6ICcnLFxyXG4gIH07XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2UsIHByaXZhdGUgZVJlZjogRWxlbWVudFJlZikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnBhZ2luYXRpb25TdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZTogUGFnaW5hdGlvblN0YXRlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHN0YXRlLmN1cnJlbnRQYWdlO1xyXG4gICAgICAgIHRoaXMucGFnZVNpemUgPSBzdGF0ZS5wYWdlU2l6ZTtcclxuICAgICAgICB0aGlzLmZpbHRlcnMubmFtZSA9IHN0YXRlLnNlYXJjaFRleHQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5wYWdpbmF0aW9uU2VydmljZS5nZXRDdXJyZW50U3RhdGUoKTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBjdXJyZW50U3RhdGUuY3VycmVudFBhZ2U7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gY3VycmVudFN0YXRlLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5maWx0ZXJzLm5hbWUgPSBjdXJyZW50U3RhdGUuc2VhcmNoVGV4dDtcclxuXHJcbiAgICBpZiAodGhpcy50b3RhbFJlY29yZHMgPiAwKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlUGFnaW5hdGlvblN0YXRlKHsgdG90YWxJdGVtczogdGhpcy50b3RhbFJlY29yZHMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcclxuICAgIGlmICh0aGlzLmxhenlMb2FkaW5nKSB7XHJcbiAgICAgIHRoaXMubG9hZExhenlEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29sdW1ucyAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAodGhpcy5jb2x1bW5zWzBdLmxhYmVsID09PSAnT2ZmZXIgbmFtZScpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBbJ0NyZWF0ZWQnLCAnT2ZmZXJlZCcsICdDbG9zZWQnXTsgXHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2x1bW5zWzBdLmxhYmVsID09PSAnQ3VzdG9tZXIgRW1haWwnKXtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBbJ0NyZWF0ZWQnLCAnUmVqZWN0ZWQnLCAnUGVuZGluZycsICdDbG9zZWQnLCAnQXBwcm92ZWQnXSA7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFsnQXBwcm92ZWQnLCAnUmVqZWN0ZWQnLCAnUGVuZGluZyddO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmVSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuZHJvcGRvd25PcGVuU3RhdGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5kcm9wZG93bk9wZW5UeXBlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZHJvcGRvd25PcGVuU291cmNlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2FsZW5kYXJPcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gICAgXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3RvdGFsUmVjb3JkcyddKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlUGFnaW5hdGlvblN0YXRlKHsgdG90YWxJdGVtczogdGhpcy50b3RhbFJlY29yZHMgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddICYmICF0aGlzLmxhenlMb2FkaW5nKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdW5TdWJzY3JpYmVUb1BhZ2luYXRpb25TZXJ2aWNlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGF0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5tYXAoKGl0ZW0pID0+ICh7XHJcbiAgICAgIC4uLml0ZW0sXHJcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNoYW5nZVRleHQoaXRlbS5kZXNjcmlwdGlvbiwgNTApXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoYW5nZVRleHQodGV4dDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcclxuICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA+IG1heExlbmd0aFxyXG4gICAgICA/IHRleHQuc3Vic3RyaW5nKDAsIG1heExlbmd0aCkudHJpbUVuZCgpICsgJy4uLidcclxuICAgICAgOiB0ZXh0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJlZERhdGEoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgIGlmICghdGhpcy5sYXp5TG9hZGluZykge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLmdldEZpbHRlcmVkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJlZERhdGEoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZURhdGEoKTtcclxuICAgIHJldHVybiB0aGlzLmRhdGFcclxuICAgICAgLnNsaWNlKFxyXG4gICAgICAgICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplLFxyXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWREYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGF6eUxvYWRpbmcgPyB0aGlzLmRhdGEgOiB0aGlzLmdldEZpbHRlcmVkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgdG90YWxQYWdlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuY2FsY3VsYXRlVG90YWxQYWdlcygpIHx8IE1hdGguY2VpbChcclxuICAgICAgdGhpcy5kYXRhLmZpbHRlcigoaXRlbSkgPT5cclxuICAgICAgICB0aGlzLmNvbHVtbnMuc29tZSgoY29sKSA9PlxyXG4gICAgICAgICAgaXRlbVtjb2wua2V5XVxyXG4gICAgICAgICAgICA/LnRvU3RyaW5nKClcclxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgLmluY2x1ZGVzKHRoaXMuZmlsdGVycy5uYW1lLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgKVxyXG4gICAgICApLmxlbmd0aCAvIHRoaXMucGFnZVNpemVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUb0ZpcnN0UGFnZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVQYWdpbmF0aW9uU3RhdGUoe1xyXG4gICAgICBjdXJyZW50UGFnZTogMSxcclxuICAgICAgc2VhcmNoVGV4dDogdGhpcy5maWx0ZXJzLm5hbWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2hlZCgpe1xyXG4gICAgY29uc3QgaGFzRmlsdGVycyA9IE9iamVjdC52YWx1ZXModGhpcy5maWx0ZXJzKS5zb21lKFxyXG4gICAgICAodmFsdWUpID0+IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChoYXNGaWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMub25GaWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcnMpO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRvRmlyc3RQYWdlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpbHRlcnMubmFtZSA9ICcnO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRvRmlyc3RQYWdlKCk7XHJcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XHJcbiAgICAgIHRoaXMub25GaWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlUGFnZShkaXJlY3Rpb246IG51bWJlcikge1xyXG4gICAgY29uc3QgdG90YWxQYWdlcyA9IHRoaXMudG90YWxQYWdlcygpO1xyXG5cclxuICAgIGlmICh0aGlzLmxhenlMb2FkaW5nKSB7XHJcbiAgICAgIGNvbnN0IG5ld1BhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlICsgZGlyZWN0aW9uO1xyXG4gICAgICBpZiAobmV3UGFnZSA+PSAxICYmIG5ld1BhZ2UgPD0gdG90YWxQYWdlcykge1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlUGFnaW5hdGlvblN0YXRlKHsgY3VycmVudFBhZ2U6IG5ld1BhZ2UgfSk7XHJcbiAgICAgICAgdGhpcy5sb2FkTGF6eURhdGEoKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRQYWdlICE9PSAxICYmIG5ld1BhZ2UgPCAxKSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVQYWdpbmF0aW9uU3RhdGUoeyBjdXJyZW50UGFnZTogMSB9KTtcclxuICAgICAgICB0aGlzLmxvYWRMYXp5RGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBuZXdQYWdlID0gdGhpcy5jdXJyZW50UGFnZSArIGRpcmVjdGlvbjtcclxuICAgICAgaWYgKG5ld1BhZ2UgPiAwICYmIG5ld1BhZ2UgPD0gdG90YWxQYWdlcykge1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlUGFnaW5hdGlvblN0YXRlKHsgY3VycmVudFBhZ2U6IG5ld1BhZ2UgfSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5oYXNNb3JlSXRlbXMpIHtcclxuICAgICAgICB0aGlzLm9uUGFnZUNoYW5nZS5lbWl0KHtcclxuICAgICAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXHJcbiAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgICAgIHNlYXJjaFRleHQ6IHRoaXMuZmlsdGVycy5uYW1lLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkTGF6eURhdGEoKSB7XHJcbiAgICB0aGlzLm9uUGFnZUNoYW5nZS5lbWl0KHtcclxuICAgICAgcGFnZTogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsXHJcbiAgICAgIHNlYXJjaFRleHQ6IHRoaXMuZmlsdGVycy5uYW1lLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UG9zTmFtZShwb3NJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZXh0cmFEYXRhPy5maW5kKChwb3MpID0+IHBvcy5wb2ludF9vZl9zYWxlX2lkID09PSBwb3NJZCk/Lm5hbWUgfHwgJydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1pdERhdGEoZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLm9uTmFtZUNsaWNrZWQuZW1pdChkYXRhKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNvbHVtbihjb2x1bW5LZXk6IHN0cmluZywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgY2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7XHJcbiAgXHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoIXRoaXMuYWN0aXZlQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW5LZXkpKSB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLnB1c2goY29sdW1uS2V5KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zID0gdGhpcy5hY3RpdmVDb2x1bW5zLmZpbHRlcihjID0+IGMgIT09IGNvbHVtbktleSk7XHJcbiAgICAgIGlmIChjb2x1bW5LZXkgPT09ICdjcmVhdGVkX2F0Jykge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlcnNbJ2NyZWF0ZWRfYXRfc3RhcnQnXTtcclxuICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXJzWydjcmVhdGVkX2F0X2VuZCddO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZmlsdGVyc1tjb2x1bW5LZXldKSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyc1tjb2x1bW5LZXldO1xyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBoYXNGaWx0ZXJzID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZpbHRlcnMpLnNvbWUoXHJcbiAgICAgICAgdmFsdWUgPT4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJydcclxuICAgICAgKTtcclxuICAgIFxyXG4gICAgICBpZiAoIWhhc0ZpbHRlcnMpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRvRmlyc3RQYWdlKCk7XHJcbiAgICAgICAgdGhpcy5vbkZpbHRlckNoYW5nZS5lbWl0KHRoaXMuZmlsdGVycyApO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ2FsZW5kYXIoKSB7XHJcbiAgICB0aGlzLmNhbGVuZGFyT3BlbiA9ICF0aGlzLmNhbGVuZGFyT3BlbjtcclxuICB9XHJcbiAgXHJcbiAgdXBkYXRlUmFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJzLmNyZWF0ZWRfYXRfc3RhcnQgJiYgdGhpcy5maWx0ZXJzLmNyZWF0ZWRfYXRfZW5kKSB7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuY3JlYXRlZF9hdF9zdGFydCA+IHRoaXMuZmlsdGVycy5jcmVhdGVkX2F0X2VuZCkge1xyXG4gICAgICAgIGNvbnN0IHRlbXAgPSB0aGlzLmZpbHRlcnMuY3JlYXRlZF9hdF9zdGFydDtcclxuICAgICAgICB0aGlzLmZpbHRlcnMuY3JlYXRlZF9hdF9zdGFydCA9IHRoaXMuZmlsdGVycy5jcmVhdGVkX2F0X2VuZDtcclxuICAgICAgICB0aGlzLmZpbHRlcnMuY3JlYXRlZF9hdF9lbmQgPSB0ZW1wO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8bGliLWt2LWxvYWRpbmcgW21lc3NhZ2VdPVwibWVzc2FnZVwiIFtpc0xvYWRpbmddPVwibG9hZGluZ1wiID4gPC9saWIta3YtbG9hZGluZz5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtc2VjdGlvblwiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImZpbHRlcnNcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZUNvbHVtbnMuaW5jbHVkZXMoY29sLmtleSlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5rZXkgPT09ICdjcmVhdGVkX2F0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wZG93blwiIFtjbGFzcy5vcGVuXT1cImNhbGVuZGFyT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWRcIiAoY2xpY2spPVwiY2FsZW5kYXJPcGVuID0gIWNhbGVuZGFyT3BlbjsgZHJvcGRvd25PcGVuU3RhdGUgPSBmYWxzZTsgZHJvcGRvd25PcGVuVHlwZSA9IGZhbHNlOyBkcm9wZG93bk9wZW5Tb3VyY2UgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmlsdGVycy5jcmVhdGVkX2F0X3N0YXJ0ICYmIGZpbHRlcnMuY3JlYXRlZF9hdF9lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlcnMuY3JlYXRlZF9hdF9zdGFydCB8IGRhdGU6J2RkL01NL3l5eXknIH19IC0ge3sgZmlsdGVycy5jcmVhdGVkX2F0X2VuZCB8IGRhdGU6J2RkL01NL3l5eXknIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmlsdGVycy5jcmVhdGVkX2F0X3N0YXJ0ICYmICFmaWx0ZXJzLmNyZWF0ZWRfYXRfZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJzLmNyZWF0ZWRfYXRfc3RhcnQgfCBkYXRlOidkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWx0ZXJzLmNyZWF0ZWRfYXRfc3RhcnQgJiYgZmlsdGVycy5jcmVhdGVkX2F0X2VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVycy5jcmVhdGVkX2F0X2VuZCB8IGRhdGU6J2RkL01NL3l5eXknIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlcnMuY3JlYXRlZF9hdF9zdGFydCAmJiAhZmlsdGVycy5jcmVhdGVkX2F0X2VuZFwiIGNsYXNzPVwicGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZWQgYXRcclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItcG9wdXBcIiAqbmdJZj1cImNhbGVuZGFyT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIFsobmdNb2RlbCldPVwiZmlsdGVycy5jcmVhdGVkX2F0X3N0YXJ0XCIgKGNoYW5nZSk9XCJ1cGRhdGVSYW5nZSgpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBbKG5nTW9kZWwpXT1cImZpbHRlcnMuY3JlYXRlZF9hdF9lbmRcIiAoY2hhbmdlKT1cInVwZGF0ZVJhbmdlKClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wua2V5ID09PSAnZXhwaXJlX2F0J1wiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbD5GZWNoYTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIFsobmdNb2RlbCldPVwiZmlsdGVycy5leHBpcmVfYXRcIiAgLz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmtleSA9PT0gJ3N0YXRlJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tZHJvcGRvd25cIiBbY2xhc3Mub3Blbl09XCJkcm9wZG93bk9wZW5TdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkXCIgKGNsaWNrKT1cImRyb3Bkb3duT3BlblN0YXRlID0gIWRyb3Bkb3duT3BlblN0YXRlOyBkcm9wZG93bk9wZW5UeXBlID0gZmFsc2U7IGRyb3Bkb3duT3BlblNvdXJjZSA9IGZhbHNlOyBjYWxlbmRhck9wZW4gPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpbHRlcnMuc3RhdGVcIiBjbGFzcz1cInN0YXRlXCIgW25nQ2xhc3NdPVwiZmlsdGVycy5zdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlcnMuc3RhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWx0ZXJzLnN0YXRlXCIgY2xhc3M9XCJwbGFjZWhvbGRlclwiPlN0YXRlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJvcHRpb25zXCIgKm5nSWY9XCJkcm9wZG93bk9wZW5TdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IG9wdCBvZiBvcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWx0ZXJzLnN0YXRlID0gb3B0OyBkcm9wZG93bk9wZW5TdGF0ZSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwib3B0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgb3B0IH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wua2V5ID09PSAnc291cmNlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wZG93blwiIFtjbGFzcy5vcGVuXT1cImRyb3Bkb3duT3BlblNvdXJjZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWRcIiAoY2xpY2spPVwiZHJvcGRvd25PcGVuU291cmNlID0gIWRyb3Bkb3duT3BlblNvdXJjZTsgZHJvcGRvd25PcGVuU3RhdGUgPSBmYWxzZTsgZHJvcGRvd25PcGVuVHlwZSA9IGZhbHNlOyBjYWxlbmRhck9wZW4gPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmlsdGVycy5zb3VyY2VcIiBjbGFzcz1cInNvdXJjZVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlcnMuc291cmNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlcnMuc291cmNlXCIgY2xhc3M9XCJwbGFjZWhvbGRlclwiPkltcG9ydGVkIGZyb208L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm9wdGlvbnNcIiAqbmdJZj1cImRyb3Bkb3duT3BlblNvdXJjZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZmlsdGVycy5zb3VyY2UgPSdsb2NhbCc7IGRyb3Bkb3duT3BlblNvdXJjZSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzb3VyY2VcIiBbbmdDbGFzc109XCInbG9jYWwnXCI+bG9jYWxcclxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZmlsdGVycy5zb3VyY2UgPSAnZWNvbW1lcmNlJzsgZHJvcGRvd25PcGVuU291cmNlID0gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvdXJjZVwiIFtuZ0NsYXNzXT1cIidlY29tbWVyY2UnXCI+ZWNvbW1lcmNlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wua2V5ID09PSAndHlwZSdcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWRyb3Bkb3duXCIgW2NsYXNzLm9wZW5dPVwiZHJvcGRvd25PcGVuVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkXCIgKGNsaWNrKT1cImRyb3Bkb3duT3BlblR5cGUgPSAhZHJvcGRvd25PcGVuVHlwZTsgZHJvcGRvd25PcGVuU3RhdGUgPSBmYWxzZTsgZHJvcGRvd25PcGVuU291cmNlID0gZmFsc2U7IGNhbGVuZGFyT3BlbiA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmlsdGVycy50eXBlXCIgY2xhc3M9XCJ0eXBlXCIgIFtuZ0NsYXNzXT1cImZpbHRlcnMudHlwZS5yZXBsYWNlKCcgJywgJy0nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlcnMudHlwZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlcnMudHlwZVwiIGNsYXNzPVwicGxhY2Vob2xkZXJcIj5PZmZlciB0eXBlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJvcHRpb25zXCIgKm5nSWY9XCJkcm9wZG93bk9wZW5UeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZmlsdGVycy50eXBlID0nUmVndWxhciBhdWN0aW9uJzsgZHJvcGRvd25PcGVuVHlwZSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHlwZVwiIFtuZ0NsYXNzXT1cIidSZWd1bGFyLWF1Y3Rpb24nXCI+UmVndWxhciBhdWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZmlsdGVycy50eXBlID0gJ1F1aWNrIG9mZmVyJzsgZHJvcGRvd25PcGVuVHlwZSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHlwZVwiIFtuZ0NsYXNzXT1cIidRdWljay1vZmZlcidcIj5RdWljayBvZmZlciBcclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItY29udGFpbmVyXCIgKm5nSWY9XCJsZXRGaWx0ZXJzXCI+XHJcblxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLW92ZXJsYXlcIlxyXG4gICAgICAgICAgKm5nSWY9XCJzaG93RmlsdGVyTWVudVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2hvd0ZpbHRlck1lbnUgPSBmYWxzZVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgKGNsaWNrKT1cInNob3dGaWx0ZXJNZW51ID0gIXNob3dGaWx0ZXJNZW51OyBkcm9wZG93bk9wZW5TdGF0ZSA9IGZhbHNlOyBkcm9wZG93bk9wZW5Tb3VyY2UgPSBmYWxzZTsgY2FsZW5kYXJPcGVuID0gZmFsc2U7IGRyb3Bkb3duT3BlblR5cGUgPSBmYWxzZVwiIFxyXG4gICAgICAgICAgY2xhc3M9XCJmaWx0ZXItYnV0dG9uXCJcclxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2hvd0ZpbHRlck1lbnVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGx1c1wiPis8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZmlsdGVyLWljb25cIj5cclxuICAgICAgICAgICAgZmlsdGVyX2FsdFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW1lbnVcIiAqbmdJZj1cInNob3dGaWx0ZXJNZW51XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmtleSAhPT0gJ25hbWUnICYmIGNvbC5rZXkgIT09ICdpbWFnZXMnICYmIGNvbC5rZXkgIT09ICdwb3NfaWQnICYmIGNvbC5rZXkgIT09ICdwb2ludF9vZl9zYWxlX2lkJyAmJiBjb2wua2V5ICE9PSAnZGVzY3JpcHRpb24nIFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFjdGl2ZUNvbHVtbnMuaW5jbHVkZXMoY29sLmtleSlcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUNvbHVtbihjb2wua2V5LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHRcIj57eyBjb2wubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIFxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dFwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJCdXNjYXIuLi5cIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVycy5uYW1lXCJcclxuICAgICAgICAgKGtleXVwLmVudGVyKT1cIm9uU2VhcmNoZWQoKVwiXHJcbiAgICAgIC8+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tLWNyZWF0ZVwiIChjbGljayk9XCJvblNlYXJjaGVkKClcIj5CdXNjYXI8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSAmJiAhbG9hZGluZ1wiPlxyXG4gICAgPGxpYi1rdi1yZXNvdXJjZS1ub3QtZm91bmQgY2xhc3M9XCJyZXNvdXJjZS1ub3QtZm91bmRcIlxyXG4gICAgICBbbWVzc2FnZVRpdGxlXT1cIm1lc3NhZ2VUaXRsZVwiXHJcbiAgICAgIFttZXNzYWdlRGVzY3JpcHRpb25dPVwibWVzc2FnZURlc2NyaXB0aW9uXCI+PC9saWIta3YtcmVzb3VyY2Utbm90LWZvdW5kPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB8fCBsb2FkaW5nXCI+XHJcbiAgICA8dGFibGU+XHJcbiAgICAgIDx0aGVhZD5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCI+e3sgY29sdW1uLmxhYmVsIH19PC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L3RoZWFkPlxyXG4gICAgICA8dGJvZHk+XHJcbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkRGF0YVwiPlxyXG4gICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdGVcIiBbbmdDbGFzc109XCJpdGVtW2NvbHVtbi5rZXldXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5sYWJlbCA9PT0gJ1NlcnZpY2VzJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaW5mb1wiIChjbGljayk9XCJlbWl0RGF0YShpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaXRlbS51cmwgfHwgJ2h0dHBzOi8vaS5pbWd1ci5jb20vSW5SYVZyTC5qcGcnXCIgYWx0PVwiSW1hZ2VuXCIgY2xhc3M9XCJzZXJ2aWNlLWltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhLWxpbmtcIj57eyBpdGVtLm5hbWUgfX08L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ua2V5ID09PSAnbmFtZScgJiYgY29sdW1uLmxhYmVsICE9PSAnU2VydmljZXMnXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImEtbGlua1wiIChjbGljayk9XCJlbWl0RGF0YShpdGVtKVwiPnt7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1bY29sdW1uLmtleV1cclxuICAgICAgICAgICAgICAgIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ua2V5ID09PSAnaW1hZ2VzJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpbWFnZSBvZiBpdGVtW2NvbHVtbi5rZXldPy5zbGljZSgwLCAzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZVwiIGFsdD1cIkltYWdlblwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbVtjb2x1bW4ua2V5XT8ubGVuZ3RoID4gM1wiIGNsYXNzPVwiZXh0cmEtaW1hZ2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgK3t7IGl0ZW1bY29sdW1uLmtleV0ubGVuZ3RoIC0gMyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ua2V5ID09PSAnY3JlYXRlZF9hdCdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sdW1uLmtleV0gfCBkYXRlIDogXCJkZC9NTS95eXl5XCIgfX1cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmtleSA9PT0gJ2V4cGlyZV9hdCdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sdW1uLmtleV0gfCBkYXRlIDogXCJkZC9NTS95eXl5XCIgfX1cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmtleSA9PT0gJ2FjdGlvbnMnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VsbEFjdGlvbnNUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdleHBpcmVfYXQnICYmXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdjcmVhdGVkX2F0JyAmJlxyXG4gICAgICAgICAgICAgICAgICBjb2x1bW4ua2V5ICE9PSAncG9pbnRfb2Zfc2FsZV9pZCcgJiZcclxuICAgICAgICAgICAgICAgICAgY29sdW1uLmtleSAhPT0gJ25hbWUnICYmXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdwb3NfaWQnICYmXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdpbWFnZXMnICYmXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdhY3Rpb25zJ1xyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbHVtbi5rZXldIH19XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4ua2V5ID09PSAncG9pbnRfb2Zfc2FsZV9pZCcgfHwgY29sdW1uLmtleSA9PT0gJ3Bvc19pZCdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IGdldFBvc05hbWUoaXRlbVtjb2x1bW4ua2V5XSkgfX1cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGJvZHk+XHJcbiAgICA8L3RhYmxlPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UGFnaW5hdG9yXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlLXBhZ2luYXRpb25cIj5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWdpbmF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjaGFuZ2VQYWdlKC0xKVwiIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiPlxyXG4gICAgICAgICAgICAgICAgICBQcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VQYWdlKDEpXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSB0b3RhbFBhZ2VzKCkgJiYgIWhhc01vcmVJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIE5leHRcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJyZW50LXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlBhZ2Uge3sgY3VycmVudFBhZ2UgfX0gb2Yge3sgdG90YWxQYWdlcygpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19
314
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtbWFpbi10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXZpby9zcmMvbGliL2NvbXBvbmVudHMva3YtbWFpbi10YWJsZS9rdi1tYWluLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdmlvL3NyYy9saWIvY29tcG9uZW50cy9rdi1tYWluLXRhYmxlL2t2LW1haW4tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBSU4sWUFBWSxFQUVaLFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFLeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQzs7Ozs7QUF5QnJHLE1BQU0sT0FBTyxvQkFBb0I7SUFrQi9CLElBQWEsVUFBVSxDQUFDLEtBQWE7UUFDbkMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQTRDRCxZQUNVLGlCQUFvQyxFQUNwQyxJQUFnQjtRQURoQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFNBQUksR0FBSixJQUFJLENBQVk7UUFuRWpCLFlBQU8sR0FBcUMsRUFBRSxDQUFDO1FBQy9DLFNB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b21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIE9uSW5pdCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgT25EZXN0cm95LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBFbGVtZW50UmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgS3ZMb2FkaW5nQ29tcG9uZW50IH0gZnJvbSAnLi4va3YtbG9hZGluZy9rdi1sb2FkaW5nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgUGFnaW5hdGlvblNlcnZpY2UsXHJcbiAgUGFnaW5hdGlvblN0YXRlLFxyXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhZ2luYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZXNvdXJjZU5vdEZvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi4va3YtcmVzb3VyY2Utbm90LWZvdW5kL2t2LXJlc291cmNlLW5vdC1mb3VuZC5jb21wb25lbnQnO1xyXG5cclxuaW50ZXJmYWNlIFRhYmxlSXRlbSB7XHJcbiAgc3RhdGU/OiBzdHJpbmc7XHJcbiAgdHlwZT86IHN0cmluZztcclxuICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xyXG4gIGV4cGlyZV9hdD86IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIHNvdXJjZT86IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWt2LW1haW4tdGFibGUnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBLdkxvYWRpbmdDb21wb25lbnQsXHJcbiAgICBSZXNvdXJjZU5vdEZvdW5kQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2t2LW1haW4tdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9rdi1tYWluLXRhYmxlLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEt2TWFpblRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgY29sdW1uczogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcclxuICBASW5wdXQoKSBkYXRhOiBUYWJsZUl0ZW1bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGV4dHJhRGF0YSE6IGFueVtdO1xyXG4gIEBJbnB1dCgpIHNob3dQYWdpbmF0b3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGxhenlMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2VUaXRsZTogc3RyaW5nID0gJ1Jlc291cmNlIG5vdCBmb3VuZCc7XHJcbiAgQElucHV0KCkgbWVzc2FnZURlc2NyaXB0aW9uOiBzdHJpbmcgPVxyXG4gICAgJ1RoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kLic7XHJcbiAgQElucHV0KCkgdG90YWxSZWNvcmRzOiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2U6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGhhc01vcmVJdGVtczogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgdGFibGVJZDogc3RyaW5nID0gJ2RlZmF1bHQnO1xyXG4gIEBJbnB1dCgpIGxldEZpbHRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0b2RheSE6IHN0cmluZztcclxuc2VhcmNoVGV4dDogYW55O1xyXG5wZW5kaW5nU2VhcmNoOiBhbnk7XHJcbiAgQElucHV0KCkgc2V0IHRvdGFsSXRlbXModmFsdWU6IG51bWJlcikge1xyXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVQYWdpbmF0aW9uU3RhdGUoeyB0b3RhbEl0ZW1zOiB2YWx1ZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoJ2NlbGxBY3Rpb25zJykgY2VsbEFjdGlvbnNUZW1wbGF0ZTogYW55O1xyXG4gIEBPdXRwdXQoKSBvbk5hbWVDbGlja2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvblBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBwYWdlOiBudW1iZXI7XHJcbiAgICBwYWdlU2l6ZTogbnVtYmVyO1xyXG4gICAgc2VhcmNoVGV4dDogc3RyaW5nO1xyXG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBwYWdlOiBudW1iZXI7XHJcbiAgICBwYWdlU2l6ZTogbnVtYmVyO1xyXG4gICAgc2VhcmNoVGV4dDogc3RyaW5nO1xyXG4gIH0+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvbkZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgc3RhdGU6IHN0cmluZztcclxuICAgIHR5cGU6IHN0cmluZztcclxuICAgIGNyZWF0ZWRfYXRfc3RhcnQ6IHN0cmluZztcclxuICAgIGNyZWF0ZWRfYXRfZW5kOiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBzb3VyY2U6IHN0cmluZztcclxuICB9PigpO1xyXG5cclxuICBkcm9wZG93bk9wZW5TdGF0ZSA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duT3BlblR5cGUgPSBmYWxzZTtcclxuICBkcm9wZG93bk9wZW5Tb3VyY2UgPSBmYWxzZTtcclxuICBjYWxlbmRhck9wZW4gPSBmYWxzZTtcclxuICBjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcclxuICBwYWdlU2l6ZTogbnVtYmVyID0gNTtcclxuICBzaG93RmlsdGVyTWVudSA9IGZhbHNlO1xyXG4gIGZpbHRlcmVkSXRlbXM6IFRhYmxlSXRlbVtdID0gW107XHJcbiAgcHVibGljIGFjdGl2ZUNvbHVtbnM6IHN0cmluZ1tdID0gW107XHJcbiAgb3B0aW9uczogc3RyaW5nW10gPSBbXTtcclxuICBwdWJsaWMgc2VhcmNoSW5wdXQ6IHN0cmluZyA9ICcnO1xyXG4gIHB1YmxpYyBmaWx0ZXJzOiBhbnkgPSB7XHJcbiAgICBzdGF0ZTogJycsXHJcbiAgICB0eXBlOiAnJyxcclxuICAgIGNyZWF0ZWRfYXRfc3RhcnQ6ICcnLFxyXG4gICAgY3JlYXRlZF9hdF9lbmQ6ICcnLFxyXG4gICAgbmFtZTogJycsXHJcbiAgICBzb3VyY2U6ICcnLFxyXG4gIH07XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZVJlZjogRWxlbWVudFJlZlxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UucGFnaW5hdGlvblN0YXRlJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHN0YXRlOiBQYWdpbmF0aW9uU3RhdGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBzdGF0ZS5jdXJyZW50UGFnZTtcclxuICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBzdGF0ZS5wYWdlU2l6ZTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMudG9kYXkgPSBub3cudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMucGFnaW5hdGlvblNlcnZpY2UuZ2V0Q3VycmVudFN0YXRlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gY3VycmVudFN0YXRlLmN1cnJlbnRQYWdlO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IGN1cnJlbnRTdGF0ZS5wYWdlU2l6ZTtcclxuICAgIHRoaXMuZmlsdGVycy5uYW1lID0gY3VycmVudFN0YXRlLnNlYXJjaFRleHQ7XHJcblxyXG4gICAgaWYgKHRoaXMudG90YWxSZWNvcmRzID4gMCkge1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZVBhZ2luYXRpb25TdGF0ZSh7XHJcbiAgICAgICAgdG90YWxJdGVtczogdGhpcy50b3RhbFJlY29yZHMsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XHJcbiAgICBpZiAodGhpcy5sYXp5TG9hZGluZykge1xyXG4gICAgICB0aGlzLmxvYWRMYXp5RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbHVtbnMgJiYgdGhpcy5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgaWYgKHRoaXMuY29sdW1uc1swXS5sYWJlbCA9PT0gJ09mZmVyIG5hbWUnKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gWydDcmVhdGVkJywgJ09mZmVyZWQnLCAnQ2xvc2VkJ107XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2x1bW5zWzBdLmxhYmVsID09PSAnQ3VzdG9tZXIgRW1haWwnKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gWydDcmVhdGVkJywgJ1JlamVjdGVkJywgJ1BlbmRpbmcnLCAnQ2xvc2VkJywgJ0FwcHJvdmVkJ107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gWydBcHByb3ZlZCcsICdSZWplY3RlZCcsICdQZW5kaW5nJ107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVDbGlja091dHNpZGUoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuZVJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgdGhpcy5kcm9wZG93bk9wZW5TdGF0ZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duT3BlblR5cGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5kcm9wZG93bk9wZW5Tb3VyY2UgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jYWxlbmRhck9wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzWyd0b3RhbFJlY29yZHMnXSkge1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZVBhZ2luYXRpb25TdGF0ZSh7XHJcbiAgICAgICAgdG90YWxJdGVtczogdGhpcy50b3RhbFJlY29yZHMsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSAmJiAhdGhpcy5sYXp5TG9hZGluZykge1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVuU3Vic2NyaWJlVG9QYWdpbmF0aW9uU2VydmljZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZURhdGEoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEubWFwKChpdGVtOiBUYWJsZUl0ZW0pID0+ICh7XHJcbiAgICAgIC4uLml0ZW0sXHJcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNoYW5nZVRleHQoaXRlbS5kZXNjcmlwdGlvbiA/PyAnJywgNTApLFxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGFuZ2VUZXh0KHRleHQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XHJcbiAgICByZXR1cm4gdGV4dC5sZW5ndGggPiBtYXhMZW5ndGhcclxuICAgICAgPyB0ZXh0LnN1YnN0cmluZygwLCBtYXhMZW5ndGgpLnRyaW1FbmQoKSArICcuLi4nXHJcbiAgICAgIDogdGV4dDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyZWREYXRhKCkge1xyXG4gICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcbiAgICBpZiAoIXRoaXMubGF6eUxvYWRpbmcpIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy5nZXRGaWx0ZXJlZERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWREYXRhKCkge1xyXG4gICAgdGhpcy51cGRhdGVEYXRhKCk7XHJcblxyXG4gICAgbGV0IGZpbHRlcmVkOiBUYWJsZUl0ZW1bXSA9IHRoaXMuZGF0YTtcclxuICAgIGlmICh0aGlzLmZpbHRlcnMubmFtZSAmJiB0aGlzLmZpbHRlcnMubmFtZS50cmltKCkgIT09ICcnKSB7XHJcbiAgICAgIGZpbHRlcmVkID0gdGhpcy5kYXRhLmZpbHRlcigoaXRlbTogVGFibGVJdGVtKSA9PlxyXG4gICAgICAgIHRoaXMuY29sdW1ucy5zb21lKChjb2wpID0+XHJcbiAgICAgICAgICBTdHJpbmcoaXRlbVtjb2wua2V5XSlcclxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgLmluY2x1ZGVzKHRoaXMuZmlsdGVycy5uYW1lLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmaWx0ZXJlZC5zbGljZShcclxuICAgICAgKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemUsXHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkRGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLmxhenlMb2FkaW5nID8gdGhpcy5kYXRhIDogdGhpcy5maWx0ZXJlZEl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgdG90YWxQYWdlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5jYWxjdWxhdGVUb3RhbFBhZ2VzKCkgfHxcclxuICAgICAgTWF0aC5jZWlsKFxyXG4gICAgICAgIHRoaXMuZGF0YS5maWx0ZXIoKGl0ZW06IFRhYmxlSXRlbSkgPT5cclxuICAgICAgICAgIHRoaXMuY29sdW1ucy5zb21lKChjb2wpID0+XHJcbiAgICAgICAgICAgIFN0cmluZyhpdGVtW2NvbC5rZXldKVxyXG4gICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgLmluY2x1ZGVzKHRoaXMuZmlsdGVycy5uYW1lLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKS5sZW5ndGggLyB0aGlzLnBhZ2VTaXplXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUb0ZpcnN0UGFnZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVQYWdpbmF0aW9uU3RhdGUoe1xyXG4gICAgICBjdXJyZW50UGFnZTogMSxcclxuICAgICAgc2VhcmNoVGV4dDogdGhpcy5maWx0ZXJzLm5hbWUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoZWQoKSB7XHJcbiAgICB0aGlzLmZpbHRlcnMubmFtZSA9IHRoaXMucGVuZGluZ1NlYXJjaDtcclxuICAgIHRoaXMudXBkYXRlVG9GaXJzdFBhZ2UoKTtcclxuICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XHJcblxyXG4gICAgY29uc3QgaGFzRmlsdGVycyA9IE9iamVjdC52YWx1ZXModGhpcy5maWx0ZXJzKS5zb21lKFxyXG4gICAgICAodmFsdWUpID0+IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChoYXNGaWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMub25GaWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWx0ZXJzLm5hbWUgPSAnJztcclxuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcclxuICAgICAgdGhpcy5vbkZpbHRlckNoYW5nZS5lbWl0KHRoaXMuZmlsdGVycyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VQYWdlKGRpcmVjdGlvbjogbnVtYmVyKSB7XHJcbiAgICBjb25zdCB0b3RhbFBhZ2VzID0gdGhpcy50b3RhbFBhZ2VzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMubGF6eUxvYWRpbmcpIHtcclxuICAgICAgY29uc3QgbmV3UGFnZSA9IHRoaXMuY3VycmVudFBhZ2UgKyBkaXJlY3Rpb247XHJcbiAgICAgIGlmIChuZXdQYWdlID49IDEgJiYgbmV3UGFnZSA8PSB0b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVQYWdpbmF0aW9uU3RhdGUoeyBjdXJyZW50UGFnZTogbmV3UGFnZSB9KTtcclxuICAgICAgICB0aGlzLmxvYWRMYXp5RGF0YSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFBhZ2UgIT09IDEgJiYgbmV3UGFnZSA8IDEpIHtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnVwZGF0ZVBhZ2luYXRpb25TdGF0ZSh7IGN1cnJlbnRQYWdlOiAxIH0pO1xyXG4gICAgICAgIHRoaXMubG9hZExhenlEYXRhKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IG5ld1BhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlICsgZGlyZWN0aW9uO1xyXG4gICAgICBpZiAobmV3UGFnZSA+IDAgJiYgbmV3UGFnZSA8PSB0b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVQYWdpbmF0aW9uU3RhdGUoeyBjdXJyZW50UGFnZTogbmV3UGFnZSB9KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmhhc01vcmVJdGVtcykge1xyXG4gICAgICAgIHRoaXMub25QYWdlQ2hhbmdlLmVtaXQoe1xyXG4gICAgICAgICAgcGFnZTogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxyXG4gICAgICAgICAgc2VhcmNoVGV4dDogdGhpcy5maWx0ZXJzLm5hbWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRMYXp5RGF0YSgpIHtcclxuICAgIHRoaXMub25QYWdlQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBwYWdlOiB0aGlzLmN1cnJlbnRQYWdlLFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgc2VhcmNoVGV4dDogdGhpcy5maWx0ZXJzLm5hbWUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRQb3NOYW1lKHBvc0lkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5leHRyYURhdGE/LmZpbmQoKHBvcykgPT4gcG9zLnBvaW50X29mX3NhbGVfaWQgPT09IHBvc0lkKT8ubmFtZSB8fCAnJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlbWl0RGF0YShkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMub25OYW1lQ2xpY2tlZC5lbWl0KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ29sdW1uKGNvbHVtbktleTogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjaGVja2VkID0gaW5wdXQuY2hlY2tlZDtcclxuXHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoIXRoaXMuYWN0aXZlQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW5LZXkpKSB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zLnB1c2goY29sdW1uS2V5KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVDb2x1bW5zID0gdGhpcy5hY3RpdmVDb2x1bW5zLmZpbHRlcigoYykgPT4gYyAhPT0gY29sdW1uS2V5KTtcclxuICAgICAgaWYgKGNvbHVtbktleSA9PT0gJ2NyZWF0ZWRfYXQnKSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyc1snY3JlYXRlZF9hdF9zdGFydCddO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlcnNbJ2NyZWF0ZWRfYXRfZW5kJ107XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJzW2NvbHVtbktleV0pIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXJzW2NvbHVtbktleV07XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaGFzRmlsdGVycyA9IE9iamVjdC52YWx1ZXModGhpcy5maWx0ZXJzKS5zb21lKFxyXG4gICAgICAgICh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJydcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghaGFzRmlsdGVycykge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVG9GaXJzdFBhZ2UoKTtcclxuICAgICAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXJzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ2FsZW5kYXIoKSB7XHJcbiAgICB0aGlzLmNhbGVuZGFyT3BlbiA9ICF0aGlzLmNhbGVuZGFyT3BlbjtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVJhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVycy5jcmVhdGVkX2F0X3N0YXJ0ICYmIHRoaXMuZmlsdGVycy5jcmVhdGVkX2F0X2VuZCkge1xyXG4gICAgICBpZiAodGhpcy5maWx0ZXJzLmNyZWF0ZWRfYXRfc3RhcnQgPiB0aGlzLmZpbHRlcnMuY3JlYXRlZF9hdF9lbmQpIHtcclxuICAgICAgICBjb25zdCB0ZW1wID0gdGhpcy5maWx0ZXJzLmNyZWF0ZWRfYXRfc3RhcnQ7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzLmNyZWF0ZWRfYXRfc3RhcnQgPSB0aGlzLmZpbHRlcnMuY3JlYXRlZF9hdF9lbmQ7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzLmNyZWF0ZWRfYXRfZW5kID0gdGVtcDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVycyA9IHtcclxuICAgICAgc3RhdGU6ICcnLFxyXG4gICAgICB0eXBlOiAnJyxcclxuICAgICAgY3JlYXRlZF9hdF9zdGFydDogJycsXHJcbiAgICAgIGNyZWF0ZWRfYXRfZW5kOiAnJyxcclxuICAgICAgbmFtZTogJycsXHJcbiAgICAgIHNvdXJjZTogJycsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5wZW5kaW5nU2VhcmNoID0gJyc7XHJcbiAgICB0aGlzLnVwZGF0ZVRvRmlyc3RQYWdlKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xyXG4gICAgdGhpcy5vbkZpbHRlckNoYW5nZS5lbWl0KHRoaXMuZmlsdGVycyk7XHJcbiAgfVxyXG59IiwiPGxpYi1rdi1sb2FkaW5nIFttZXNzYWdlXT1cIm1lc3NhZ2VcIiBbaXNMb2FkaW5nXT1cImxvYWRpbmdcIiA+IDwvbGliLWt2LWxvYWRpbmc+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXNlY3Rpb25cIj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJzXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVDb2x1bW5zLmluY2x1ZGVzKGNvbC5rZXkpXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wua2V5ID09PSAnY3JlYXRlZF9hdCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tZHJvcGRvd25cIiBbY2xhc3Mub3Blbl09XCJjYWxlbmRhck9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkXCIgKGNsaWNrKT1cImNhbGVuZGFyT3BlbiA9ICFjYWxlbmRhck9wZW47IGRyb3Bkb3duT3BlblN0YXRlID0gZmFsc2U7IGRyb3Bkb3duT3BlblR5cGUgPSBmYWxzZTsgZHJvcGRvd25PcGVuU291cmNlID0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpbHRlcnMuY3JlYXRlZF9hdF9zdGFydCAmJiBmaWx0ZXJzLmNyZWF0ZWRfYXRfZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJzLmNyZWF0ZWRfYXRfc3RhcnQgfCBkYXRlOidkZC9NTS95eXl5JyB9fSAtIHt7IGZpbHRlcnMuY3JlYXRlZF9hdF9lbmQgfCBkYXRlOidkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpbHRlcnMuY3JlYXRlZF9hdF9zdGFydCAmJiAhZmlsdGVycy5jcmVhdGVkX2F0X2VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVycy5jcmVhdGVkX2F0X3N0YXJ0IHwgZGF0ZTonZGQvTU0veXl5eScgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmlsdGVycy5jcmVhdGVkX2F0X3N0YXJ0ICYmIGZpbHRlcnMuY3JlYXRlZF9hdF9lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlcnMuY3JlYXRlZF9hdF9lbmQgfCBkYXRlOidkZC9NTS95eXl5JyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWx0ZXJzLmNyZWF0ZWRfYXRfc3RhcnQgJiYgIWZpbHRlcnMuY3JlYXRlZF9hdF9lbmRcIiBjbGFzcz1cInBsYWNlaG9sZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVkIGF0XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXBvcHVwXCIgKm5nSWY9XCJjYWxlbmRhck9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBbKG5nTW9kZWwpXT1cImZpbHRlcnMuY3JlYXRlZF9hdF9zdGFydFwiIChjaGFuZ2UpPVwidXBkYXRlUmFuZ2UoKVwiIFttYXhdPVwidG9kYXlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIFsobmdNb2RlbCldPVwiZmlsdGVycy5jcmVhdGVkX2F0X2VuZFwiIChjaGFuZ2UpPVwidXBkYXRlUmFuZ2UoKVwiIFttYXhdPVwidG9kYXlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wua2V5ID09PSAnZXhwaXJlX2F0J1wiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbD5GZWNoYTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIFsobmdNb2RlbCldPVwiZmlsdGVycy5leHBpcmVfYXRcIiBbbWF4XT1cInRvZGF5XCIgLz5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmtleSA9PT0gJ3N0YXRlJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tZHJvcGRvd25cIiBbY2xhc3Mub3Blbl09XCJkcm9wZG93bk9wZW5TdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkXCIgKGNsaWNrKT1cImRyb3Bkb3duT3BlblN0YXRlID0gIWRyb3Bkb3duT3BlblN0YXRlOyBkcm9wZG93bk9wZW5UeXBlID0gZmFsc2U7IGRyb3Bkb3duT3BlblNvdXJjZSA9IGZhbHNlOyBjYWxlbmRhck9wZW4gPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpbHRlcnMuc3RhdGVcIiBjbGFzcz1cInN0YXRlXCIgW25nQ2xhc3NdPVwiZmlsdGVycy5zdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlcnMuc3RhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWx0ZXJzLnN0YXRlXCIgY2xhc3M9XCJwbGFjZWhvbGRlclwiPlN0YXRlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJvcHRpb25zXCIgKm5nSWY9XCJkcm9wZG93bk9wZW5TdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IG9wdCBvZiBvcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWx0ZXJzLnN0YXRlID0gb3B0OyBkcm9wZG93bk9wZW5TdGF0ZSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwib3B0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgb3B0IH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wua2V5ID09PSAnc291cmNlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wZG93blwiIFtjbGFzcy5vcGVuXT1cImRyb3Bkb3duT3BlblNvdXJjZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWRcIiAoY2xpY2spPVwiZHJvcGRvd25PcGVuU291cmNlID0gIWRyb3Bkb3duT3BlblNvdXJjZTsgZHJvcGRvd25PcGVuU3RhdGUgPSBmYWxzZTsgZHJvcGRvd25PcGVuVHlwZSA9IGZhbHNlOyBjYWxlbmRhck9wZW4gPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmlsdGVycy5zb3VyY2VcIiBjbGFzcz1cInNvdXJjZVwiID5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlcnMuc291cmNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlcnMuc291cmNlXCIgY2xhc3M9XCJwbGFjZWhvbGRlclwiPkltcG9ydGVkIGZyb208L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cIm9wdGlvbnNcIiAqbmdJZj1cImRyb3Bkb3duT3BlblNvdXJjZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZmlsdGVycy5zb3VyY2UgPSdsb2NhbCc7IGRyb3Bkb3duT3BlblNvdXJjZSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzb3VyY2VcIiBbbmdDbGFzc109XCInbG9jYWwnXCI+bG9jYWxcclxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZmlsdGVycy5zb3VyY2UgPSAnZWNvbW1lcmNlJzsgZHJvcGRvd25PcGVuU291cmNlID0gZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvdXJjZVwiIFtuZ0NsYXNzXT1cIidlY29tbWVyY2UnXCI+ZWNvbW1lcmNlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wua2V5ID09PSAndHlwZSdcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWRyb3Bkb3duXCIgW2NsYXNzLm9wZW5dPVwiZHJvcGRvd25PcGVuVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkXCIgKGNsaWNrKT1cImRyb3Bkb3duT3BlblR5cGUgPSAhZHJvcGRvd25PcGVuVHlwZTsgZHJvcGRvd25PcGVuU3RhdGUgPSBmYWxzZTsgZHJvcGRvd25PcGVuU291cmNlID0gZmFsc2U7IGNhbGVuZGFyT3BlbiA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmlsdGVycy50eXBlXCIgY2xhc3M9XCJ0eXBlXCIgIFtuZ0NsYXNzXT1cImZpbHRlcnMudHlwZS5yZXBsYWNlKCcgJywgJy0nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlcnMudHlwZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlcnMudHlwZVwiIGNsYXNzPVwicGxhY2Vob2xkZXJcIj5PZmZlciB0eXBlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJvcHRpb25zXCIgKm5nSWY9XCJkcm9wZG93bk9wZW5UeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZmlsdGVycy50eXBlID0nUmVndWxhciBhdWN0aW9uJzsgZHJvcGRvd25PcGVuVHlwZSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHlwZVwiIFtuZ0NsYXNzXT1cIidSZWd1bGFyLWF1Y3Rpb24nXCI+UmVndWxhciBhdWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZmlsdGVycy50eXBlID0gJ1F1aWNrIG9mZmVyJzsgZHJvcGRvd25PcGVuVHlwZSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHlwZVwiIFtuZ0NsYXNzXT1cIidRdWljay1vZmZlcidcIj5RdWljayBvZmZlciBcclxuICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItY29udGFpbmVyXCIgKm5nSWY9XCJsZXRGaWx0ZXJzXCI+XHJcblxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiZmlsdGVyLW92ZXJsYXlcIlxyXG4gICAgICAgICAgKm5nSWY9XCJzaG93RmlsdGVyTWVudVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2hvd0ZpbHRlck1lbnUgPSBmYWxzZVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgKGNsaWNrKT1cInNob3dGaWx0ZXJNZW51ID0gIXNob3dGaWx0ZXJNZW51OyBkcm9wZG93bk9wZW5TdGF0ZSA9IGZhbHNlOyBkcm9wZG93bk9wZW5Tb3VyY2UgPSBmYWxzZTsgY2FsZW5kYXJPcGVuID0gZmFsc2U7IGRyb3Bkb3duT3BlblR5cGUgPSBmYWxzZVwiIFxyXG4gICAgICAgICAgY2xhc3M9XCJmaWx0ZXItYnV0dG9uXCJcclxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2hvd0ZpbHRlck1lbnVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGx1c1wiPis8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZmlsdGVyLWljb25cIj5cclxuICAgICAgICAgICAgZmlsdGVyX2FsdFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW1lbnVcIiAqbmdJZj1cInNob3dGaWx0ZXJNZW51XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmtleSAhPT0gJ25hbWUnICYmIGNvbC5rZXkgIT09ICdpbWFnZXMnICYmIGNvbC5rZXkgIT09ICdwb3NfaWQnICYmIGNvbC5rZXkgIT09ICdwb2ludF9vZl9zYWxlX2lkJyAmJiBjb2wua2V5ICE9PSAnZGVzY3JpcHRpb24nIFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImFjdGl2ZUNvbHVtbnMuaW5jbHVkZXMoY29sLmtleSlcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUNvbHVtbihjb2wua2V5LCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHRcIj57eyBjb2wubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIFxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dFwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJCdXNjYXIuLi5cIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwicGVuZGluZ1NlYXJjaFwiXHJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cIm9uU2VhcmNoZWQoKVwiXHJcbiAgICAgIC8+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tLWNyZWF0ZVwiIChjbGljayk9XCJvblNlYXJjaGVkKClcIj5CdXNjYXI8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSAmJiAhbG9hZGluZ1wiPlxyXG4gICAgPGxpYi1rdi1yZXNvdXJjZS1ub3QtZm91bmQgY2xhc3M9XCJyZXNvdXJjZS1ub3QtZm91bmRcIlxyXG4gICAgICBbbWVzc2FnZVRpdGxlXT1cIm1lc3NhZ2VUaXRsZVwiXHJcbiAgICAgIFttZXNzYWdlRGVzY3JpcHRpb25dPVwibWVzc2FnZURlc2NyaXB0aW9uXCI+PC9saWIta3YtcmVzb3VyY2Utbm90LWZvdW5kPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB8fCBsb2FkaW5nXCI+XHJcbiAgICA8dGFibGU+XHJcbiAgICAgIDx0aGVhZD5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCI+e3sgY29sdW1uLmxhYmVsIH19PC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L3RoZWFkPlxyXG4gICAgICA8dGJvZHk+XHJcbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkRGF0YVwiPlxyXG4gICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdGVcIiBbbmdDbGFzc109XCJpdGVtW2NvbHVtbi5rZXldXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5sYWJlbCA9PT0gJ1NlcnZpY2VzJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaW5mb1wiIChjbGljayk9XCJlbWl0RGF0YShpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaXRlbVsndXJsJ10gfHwgJ2h0dHBzOi8vaS5pbWd1ci5jb20vSW5SYVZyTC5qcGcnXCIgYWx0PVwiSW1hZ2VuXCIgY2xhc3M9XCJzZXJ2aWNlLWltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhLWxpbmtcIj57eyBpdGVtLm5hbWUgfX08L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ua2V5ID09PSAnbmFtZScgJiYgY29sdW1uLmxhYmVsICE9PSAnU2VydmljZXMnXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImEtbGlua1wiIChjbGljayk9XCJlbWl0RGF0YShpdGVtKVwiPnt7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW1bY29sdW1uLmtleV1cclxuICAgICAgICAgICAgICAgIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ua2V5ID09PSAnaW1hZ2VzJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpbWFnZSBvZiBpdGVtW2NvbHVtbi5rZXldPy5zbGljZSgwLCAzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZVwiIGFsdD1cIkltYWdlblwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbVtjb2x1bW4ua2V5XT8ubGVuZ3RoID4gM1wiIGNsYXNzPVwiZXh0cmEtaW1hZ2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgK3t7IGl0ZW1bY29sdW1uLmtleV0ubGVuZ3RoIC0gMyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ua2V5ID09PSAnY3JlYXRlZF9hdCdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sdW1uLmtleV0gfCBkYXRlIDogXCJkZC9NTS95eXl5XCIgfX1cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmtleSA9PT0gJ2V4cGlyZV9hdCdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sdW1uLmtleV0gfCBkYXRlIDogXCJkZC9NTS95eXl5XCIgfX1cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmtleSA9PT0gJ2FjdGlvbnMnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VsbEFjdGlvbnNUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdleHBpcmVfYXQnICYmXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdjcmVhdGVkX2F0JyAmJlxyXG4gICAgICAgICAgICAgICAgICBjb2x1bW4ua2V5ICE9PSAncG9pbnRfb2Zfc2FsZV9pZCcgJiZcclxuICAgICAgICAgICAgICAgICAgY29sdW1uLmtleSAhPT0gJ25hbWUnICYmXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdwb3NfaWQnICYmXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdpbWFnZXMnICYmXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5rZXkgIT09ICdhY3Rpb25zJ1xyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbHVtbi5rZXldIH19XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4ua2V5ID09PSAncG9pbnRfb2Zfc2FsZV9pZCcgfHwgY29sdW1uLmtleSA9PT0gJ3Bvc19pZCdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IGdldFBvc05hbWUoaXRlbVtjb2x1bW4ua2V5XSkgfX1cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGJvZHk+XHJcbiAgICA8L3RhYmxlPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UGFnaW5hdG9yXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlLXBhZ2luYXRpb25cIj5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWdpbmF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjaGFuZ2VQYWdlKC0xKVwiIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiPlxyXG4gICAgICAgICAgICAgICAgICBQcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VQYWdlKDEpXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID09PSB0b3RhbFBhZ2VzKCkgJiYgIWhhc01vcmVJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIE5leHRcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJyZW50LXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlBhZ2Uge3sgY3VycmVudFBhZ2UgfX0gb2Yge3sgdG90YWxQYWdlcygpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L25nLWNvbnRhaW5lcj4iXX0=