@ajf/material 18.2.3 → 18.3.0

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.
@@ -313,8 +313,8 @@ export class AjfPaginatedTableWidgetComponent extends AjfBaseWidgetComponent {
313
313
  this._currentPage = 1;
314
314
  this._canGoForward = this._currentPage < this._pages;
315
315
  this._canGoBackward = false;
316
- const columnIdx = parseInt(sort.active.slice(-1)) || 0;
317
- this._sortedAllDataContent = this._allDataContent.slice().sort((a, b) => {
316
+ const columnIdx = parseInt(sort.active.replace(/^\D+/, '')) || 0;
317
+ this._sortedAllDataContent = this._sortedAllDataContent.slice().sort((a, b) => {
318
318
  const isAsc = sort.direction === 'asc';
319
319
  return this._compare(a[columnIdx], b[columnIdx], isAsc);
320
320
  });
@@ -374,4 +374,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
374
374
  type: Component,
375
375
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"ajf-paginated-table\" *ngIf=\"instance\">\n <div class=\"ajf-paginated-table-title-container\" *ngIf=\"pages > 0\">\n <div class=\"ajf-paginated-table-page-selector\">\n <mat-label class=\"ajf-paginated-table-page-selector-label\"\n >{{'Items per page:'|transloco}}</mat-label\n >\n <mat-select\n [value]=\"paginatorConfig.pageSize\"\n (selectionChange)=\"onPageSizeChange($event.value)\"\n >\n <mat-option\n [value]=\"pageSizeOpt\"\n *ngFor=\"let pageSizeOpt of paginatorConfig.pageSizeOptions\"\n >\n {{ pageSizeOpt }}\n </mat-option>\n </mat-select>\n </div>\n <div class=\"ajf-spacer\"></div>\n <div class=\"ajf-paginated-table-paginator\">\n <a\n (click)=\"goToPage('previous')\"\n class=\"ajf-paginated-table-btn ajf-paginated-table-back-btn\"\n [class.ajf-paginated-table-btn-disabled]=\"canGoBackward === false\"\n ></a>\n <div class=\"ajf-paginated-table-paginator-page\">{{ currentPage }}</div>\n <div class=\"ajf-paginated-table-paginator-separator\"></div>\n <div class=\"ajf-paginated-table-paginator-pages\">{{ pages }}</div>\n <a\n (click)=\"goToPage('next')\"\n class=\"ajf-paginated-table-btn ajf-paginated-table-forward-btn\"\n [class.ajf-paginated-table-btn-disabled]=\"canGoForward === false\"\n ></a>\n </div>\n </div>\n <div class=\"ajf-paginated-table-item\">\n <ajf-widget-export\n *ngIf=\"instance\"\n [widgetType]=\"instance.widgetType\"\n [data]=\"exportableContent()\"\n [enable]=\"instance.exportable\"\n >\n <ajf-table [data]=\"currentContent\" (sortSelected)=\"sortPaginatedData($event)\"></ajf-table>\n </ajf-widget-export>\n </div>\n</div>\n", styles: ["table{border-spacing:0}table td{padding:10px}.ajf-paginated-table{width:100%;overflow-x:auto}.ajf-paginated-table table{min-width:100%}.ajf-paginated-table-page-selector{display:flex;align-items:baseline}.ajf-paginated-table-page-selector .ajf-paginated-table-page-selector-label{white-space:nowrap;margin-right:4px;font-size:.9em}.ajf-paginated-table-page-selector .mat-mdc-select{width:70px;font-size:.9em}.ajf-paginated-table-title-container{display:flex;align-items:center}.ajf-spacer{flex:1 0 auto}.ajf-paginated-table-btn{cursor:pointer;display:block;width:32px;height:32px;position:relative}.ajf-paginated-table-btn:after{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.ajf-paginated-table-paginator-separator{width:16px;height:32px;position:relative}.ajf-paginated-table-paginator-separator:after{width:100%;height:100%;display:flex;justify-content:center;align-items:center;content:\"/\"}.ajf-paginated-table-btn-disabled{opacity:.5;cursor:default}.ajf-paginated-table-back-btn:after{content:\"<\"}.ajf-paginated-table-forward-btn:after{content:\">\"}.ajf-paginated-table-paginator{display:flex;align-items:center;font-size:.9em}.ajf-paginated-table-paginator>*{margin:0 .5em}\n"] }]
376
376
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }] });
377
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvcmVwb3J0cy9zcmMvd2lkZ2V0LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvcmVwb3J0cy9zcmMvd2lkZ2V0Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9yZXBvcnRzL3NyYy9jb2x1bW4td2lkZ2V0Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9yZXBvcnRzL3NyYy9sYXlvdXQtd2lkZ2V0Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9yZXBvcnRzL3NyYy9kaWFsb2ctd2lkZ2V0Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9yZXBvcnRzL3NyYy9wYWdpbmF0ZWQtbGlzdC13aWRnZXQuaHRtbCIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL3JlcG9ydHMvc3JjL3BhZ2luYXRlZC10YWJsZS13aWRnZXQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQ0wsc0JBQXNCLEVBTXRCLGVBQWUsSUFBSSxhQUFhLEVBR2hDLGdCQUFnQixJQUFJLFdBQVcsRUFDL0IsYUFBYSxJQUFJLEVBQUUsR0FDcEIsTUFBTSxtQkFBbUIsQ0FBQztBQUczQixPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUdWLE1BQU0sRUFHTixXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFN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ZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1lBQ3RFLElBQUksQ0FBQyxlQUFlLEdBQUc7Z0JBQ3JCLElBQUksQ0FBQyxjQUFjO2dCQUNuQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQzthQUNsRixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0IsQ0FBQzsrR0FsTFUsZ0NBQWdDO21HQUFoQyxnQ0FBZ0MsZ0dNMVE3QyxxeERBOENBOzs0Rk40TmEsZ0NBQWdDO2tCQU41QyxTQUFTO3NDQUdTLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIEdudWNvb3Agc29jLiBjb29wLlxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLFxuICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uXG4gKlxuICovXG5cbmltcG9ydCB7XG4gIEFqZkJhc2VXaWRnZXRDb21wb25lbnQsXG4gIEFqZkNvbHVtbldpZGdldEluc3RhbmNlLFxuICBBamZEaWFsb2dXaWRnZXRJbnN0YW5jZSxcbiAgQWpmTGF5b3V0V2lkZ2V0SW5zdGFuY2UsXG4gIEFqZlBhZ2luYXRlZExpc3RXaWRnZXRJbnN0YW5jZSxcbiAgQWpmUGFnaW5hdGVkVGFibGVXaWRnZXRJbnN0YW5jZSxcbiAgQWpmUmVwb3J0V2lkZ2V0IGFzIENvcmVDb21wb25lbnQsXG4gIEFqZldpZGdldENvbXBvbmVudHNNYXAsXG4gIEFqZldpZGdldEluc3RhbmNlLFxuICBBamZXaWRnZXRTZXJ2aWNlIGFzIENvcmVTZXJ2aWNlLFxuICBBamZXaWRnZXRUeXBlIGFzIHd0LFxufSBmcm9tICdAYWpmL2NvcmUvcmVwb3J0cyc7XG5pbXBvcnQge0FqZkNvbnRleHR9IGZyb20gJ0BhamYvY29yZS9jb21tb24nO1xuaW1wb3J0IHtBamZUYWJsZUNlbGx9IGZyb20gJ0BhamYvY29yZS90YWJsZSc7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3RhYmxlLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtTb3J0fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBamZDaGFydFdpZGdldENvbXBvbmVudH0gZnJvbSAnLi9jaGFydC13aWRnZXQnO1xuaW1wb3J0IHtBamZGb3JtdWxhV2lkZ2V0Q29tcG9uZW50fSBmcm9tICcuL2Zvcm11bGEtd2lkZ2V0JztcbmltcG9ydCB7QWpmR3JhcGhXaWRnZXRDb21wb25lbnR9IGZyb20gJy4vZ3JhcGgtd2lkZ2V0JztcbmltcG9ydCB7QWpmSGVhdE1hcFdpZGdldENvbXBvbmVudH0gZnJvbSAnLi9oZWF0LW1hcC13aWRnZXQnO1xuaW1wb3J0IHtBamZJbWFnZUNvbnRhaW5lcldpZGdldENvbXBvbmVudH0gZnJvbSAnLi9pbWFnZS1jb250YWluZXItd2lkZ2V0JztcbmltcG9ydCB7QWpmSW1hZ2VXaWRnZXRDb21wb25lbnR9IGZyb20gJy4vaW1hZ2Utd2lkZ2V0JztcbmltcG9ydCB7QWpmTWFwV2lkZ2V0Q29tcG9uZW50fSBmcm9tICcuL21hcC13aWRnZXQnO1xuaW1wb3J0IHtBamZQYWdlQnJlYWtXaWRnZXRDb21wb25lbnR9IGZyb20gJy4vcGFnZS1icmVhay13aWRnZXQnO1xuaW1wb3J0IHtBamZUYWJsZVdpZGdldENvbXBvbmVudH0gZnJvbSAnLi90YWJsZS13aWRnZXQnO1xuaW1wb3J0IHtBamZUZXh0V2lkZ2V0Q29tcG9uZW50fSBmcm9tICcuL3RleHQtd2lkZ2V0JztcblxuY29uc3QgZGVmYXVsdFdpZGdldHNGYWN0b3J5ID0gKCk6IEFqZldpZGdldENvbXBvbmVudHNNYXAgPT4ge1xuICBjb25zdCBkZWZhdWx0V2lkZ2V0czogQWpmV2lkZ2V0Q29tcG9uZW50c01hcCA9IHt9O1xuICBkZWZhdWx0V2lkZ2V0c1t3dC5MYXlvdXRdID0ge2NvbXBvbmVudDogQWpmTGF5b3V0V2lkZ2V0Q29tcG9uZW50fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuUGFnZUJyZWFrXSA9IHtjb21wb25lbnQ6IEFqZlBhZ2VCcmVha1dpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LkltYWdlXSA9IHtjb21wb25lbnQ6IEFqZkltYWdlV2lkZ2V0Q29tcG9uZW50fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuVGV4dF0gPSB7Y29tcG9uZW50OiBBamZUZXh0V2lkZ2V0Q29tcG9uZW50fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuQ2hhcnRdID0ge2NvbXBvbmVudDogQWpmQ2hhcnRXaWRnZXRDb21wb25lbnR9O1xuICBkZWZhdWx0V2lkZ2V0c1t3dC5UYWJsZV0gPSB7Y29tcG9uZW50OiBBamZUYWJsZVdpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LkR5bmFtaWNUYWJsZV0gPSB7Y29tcG9uZW50OiBBamZUYWJsZVdpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0Lk1hcF0gPSB7Y29tcG9uZW50OiBBamZNYXBXaWRnZXRDb21wb25lbnR9O1xuICBkZWZhdWx0V2lkZ2V0c1t3dC5Db2x1bW5dID0ge2NvbXBvbmVudDogQWpmQ29sdW1uV2lkZ2V0Q29tcG9uZW50fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuRm9ybXVsYV0gPSB7Y29tcG9uZW50OiBBamZGb3JtdWxhV2lkZ2V0Q29tcG9uZW50fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuSW1hZ2VDb250YWluZXJdID0ge2NvbXBvbmVudDogQWpmSW1hZ2VDb250YWluZXJXaWRnZXRDb21wb25lbnR9O1xuICBkZWZhdWx0V2lkZ2V0c1t3dC5HcmFwaF0gPSB7Y29tcG9uZW50OiBBamZHcmFwaFdpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LlBhZ2luYXRlZExpc3RdID0ge2NvbXBvbmVudDogQWpmUGFnaW5hdGVkTGlzdFdpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LlBhZ2luYXRlZFRhYmxlXSA9IHtjb21wb25lbnQ6IEFqZlBhZ2luYXRlZFRhYmxlV2lkZ2V0Q29tcG9uZW50fTtcblxuICBkZWZhdWx0V2lkZ2V0c1t3dC5EaWFsb2ddID0ge2NvbXBvbmVudDogQWpmRGlhbG9nV2lkZ2V0Q29tcG9uZW50fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuSGVhdE1hcF0gPSB7Y29tcG9uZW50OiBBamZIZWF0TWFwV2lkZ2V0Q29tcG9uZW50fTtcbiAgcmV0dXJuIGRlZmF1bHRXaWRnZXRzO1xufTtcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgQWpmV2lkZ2V0U2VydmljZSBleHRlbmRzIENvcmVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZGVmYXVsdFdpZGdldHNGYWN0b3J5KCkpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FqZi13aWRnZXQnLFxuICB0ZW1wbGF0ZVVybDogJ3dpZGdldC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3dpZGdldC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBamZSZXBvcnRXaWRnZXQgZXh0ZW5kcyBDb3JlQ29tcG9uZW50IHtcbiAgQE91dHB1dCgpIGZpbHRlcldpZGdldENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e2NvbnRleHQ6IEFqZkNvbnRleHQsIHdpZGdldDogQWpmV2lkZ2V0SW5zdGFuY2V9PigpO1xuICByZWFkb25seSB3aWRnZXRzTWFwOiBBamZXaWRnZXRDb21wb25lbnRzTWFwO1xuXG4gIGNvbnN0cnVjdG9yKHJlbmRlcmVyOiBSZW5kZXJlcjIsIHdpZGdldFNlcnZpY2U6IEFqZldpZGdldFNlcnZpY2UpIHtcbiAgICBzdXBlcihyZW5kZXJlcik7XG4gICAgdGhpcy53aWRnZXRzTWFwID0gd2lkZ2V0U2VydmljZS5jb21wb25lbnRzTWFwO1xuICB9XG5cbiAgZmlsdGVyV2lkZ2V0Q2hhbmdlZChjaGFuZ2VzOiB7Y29udGV4dDogQWpmQ29udGV4dCwgd2lkZ2V0OiBBamZXaWRnZXRJbnN0YW5jZX0pIHtcbiAgICB0aGlzLmZpbHRlcldpZGdldENoYW5nZS5lbWl0KGNoYW5nZXMpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJ2NvbHVtbi13aWRnZXQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydjb2x1bW4td2lkZ2V0LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEFqZkNvbHVtbldpZGdldENvbXBvbmVudCBleHRlbmRzIEFqZkJhc2VXaWRnZXRDb21wb25lbnQ8QWpmQ29sdW1uV2lkZ2V0SW5zdGFuY2U+IHtcbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgZWw6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcihjZHIsIGVsKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICdsYXlvdXQtd2lkZ2V0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnbGF5b3V0LXdpZGdldC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBBamZMYXlvdXRXaWRnZXRDb21wb25lbnRcbiAgZXh0ZW5kcyBBamZCYXNlV2lkZ2V0Q29tcG9uZW50PEFqZkxheW91dFdpZGdldEluc3RhbmNlPlxuICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudENoZWNrZWRcbntcbiAgcHJpdmF0ZSBfYWxsY29sdW1uc1JlbmRlcmVkJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGFsbGNvbHVtbnNSZW5kZXJlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzXG4gICAgLl9hbGxjb2x1bW5zUmVuZGVyZWQkIGFzIE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgZWw6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcihjZHIsIGVsKTtcbiAgfVxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fYWxsY29sdW1uc1JlbmRlcmVkJC5uZXh0KHRydWUpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJ2RpYWxvZy13aWRnZXQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydkaWFsb2ctd2lkZ2V0LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEFqZkRpYWxvZ1dpZGdldENvbXBvbmVudCBleHRlbmRzIEFqZkJhc2VXaWRnZXRDb21wb25lbnQ8QWpmRGlhbG9nV2lkZ2V0SW5zdGFuY2U+IHtcbiAgQFZpZXdDaGlsZCgnZGlhbG9nQ29udGVudCcsIHtyZWFkOiBUZW1wbGF0ZVJlZn0pIGRpYWxvZ0NvbnRlbnQhOiBUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgX2RpYWxvZzogTWF0RGlhbG9nKSB7XG4gICAgc3VwZXIoY2RyLCBlbCk7XG4gIH1cblxuICBvcGVuRGlhbG9nKCk6IHZvaWQge1xuICAgIHRoaXMuX2RpYWxvZy5vcGVuKHRoaXMuZGlhbG9nQ29udGVudCk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAncGFnaW5hdGVkLWxpc3Qtd2lkZ2V0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsncGFnaW5hdGVkLWxpc3Qtd2lkZ2V0LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEFqZlBhZ2luYXRlZExpc3RXaWRnZXRDb21wb25lbnRcbiAgZXh0ZW5kcyBBamZCYXNlV2lkZ2V0Q29tcG9uZW50PEFqZlBhZ2luYXRlZExpc3RXaWRnZXRJbnN0YW5jZT5cbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdFxue1xuICBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gIH1cbiAgcHJpdmF0ZSBfY3VycmVudFBhZ2UgPSAwO1xuXG4gIGdldCBwYWdlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9wYWdlcztcbiAgfVxuICBwcml2YXRlIF9wYWdlcyA9IDA7XG5cbiAgZ2V0IGN1cnJlbnRDb250ZW50KCk6IEFqZldpZGdldEluc3RhbmNlW10ge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Q29udGVudDtcbiAgfVxuICBwcml2YXRlIF9jdXJyZW50Q29udGVudDogQWpmV2lkZ2V0SW5zdGFuY2VbXSA9IFtdO1xuXG4gIGdldCBjYW5Hb0ZvcndhcmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbkdvRm9yd2FyZDtcbiAgfVxuICBwcml2YXRlIF9jYW5Hb0ZvcndhcmQgPSBmYWxzZTtcblxuICBnZXQgY2FuR29CYWNrd2FyZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuR29CYWNrd2FyZDtcbiAgfVxuICBwcml2YXRlIF9jYW5Hb0JhY2t3YXJkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgZWw6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcihjZHIsIGVsKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaW5zdGFuY2UnXSkge1xuICAgICAgdGhpcy5fdXBkYXRlQ3VycmVudENvbnRlbnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVDdXJyZW50Q29udGVudCgpO1xuICB9XG5cbiAgZ29Ub1BhZ2UoZGlyZWN0aW9uOiAnbmV4dCcgfCAncHJldmlvdXMnKTogdm9pZCB7XG4gICAgY29uc3QgZGlmZiA9IGRpcmVjdGlvbiA9PT0gJ25leHQnID8gMSA6IC0xO1xuICAgIGNvbnN0IG5ld1BhZ2UgPSB0aGlzLl9jdXJyZW50UGFnZSArIGRpZmY7XG4gICAgaWYgKG5ld1BhZ2UgPD0gMCB8fCBuZXdQYWdlID4gdGhpcy5fcGFnZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBuZXdQYWdlO1xuICAgIHRoaXMuX2NhbkdvRm9yd2FyZCA9IG5ld1BhZ2UgPCB0aGlzLl9wYWdlcztcbiAgICB0aGlzLl9jYW5Hb0JhY2t3YXJkID0gbmV3UGFnZSA+IDE7XG4gICAgdGhpcy5fZmlsbEN1cnJlbnRDb250ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDdXJyZW50Q29udGVudCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jYW5Hb0JhY2t3YXJkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgPT0gbnVsbCB8fCB0aGlzLmluc3RhbmNlLmNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9jdXJyZW50UGFnZSA9IDA7XG4gICAgICB0aGlzLl9wYWdlcyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gMTtcbiAgICAgIGNvbnN0IHtjb250ZW50fSA9IHRoaXMuaW5zdGFuY2U7XG4gICAgICBjb25zdCB7cGFnZVNpemV9ID0gdGhpcy5pbnN0YW5jZS53aWRnZXQ7XG4gICAgICB0aGlzLl9wYWdlcyA9IE1hdGguY2VpbChjb250ZW50Lmxlbmd0aCAvIHBhZ2VTaXplKTtcbiAgICAgIHRoaXMuX2NhbkdvRm9yd2FyZCA9IHRoaXMuX3BhZ2VzID4gMTtcbiAgICB9XG4gICAgdGhpcy5fZmlsbEN1cnJlbnRDb250ZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF9maWxsQ3VycmVudENvbnRlbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgPT0gbnVsbCB8fCB0aGlzLmluc3RhbmNlLmNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Q29udGVudCA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7Y29udGVudH0gPSB0aGlzLmluc3RhbmNlO1xuICAgIGNvbnN0IHtwYWdlU2l6ZX0gPSB0aGlzLmluc3RhbmNlLndpZGdldDtcbiAgICBjb25zdCBzdGFydCA9ICh0aGlzLl9jdXJyZW50UGFnZSAtIDEpICogcGFnZVNpemU7XG4gICAgdGhpcy5fY3VycmVudENvbnRlbnQgPSBjb250ZW50LnNsaWNlKHN0YXJ0LCBzdGFydCArIHBhZ2VTaXplKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAncGFnaW5hdGVkLXRhYmxlLXdpZGdldC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3BhZ2luYXRlZC10YWJsZS13aWRnZXQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmUGFnaW5hdGVkVGFibGVXaWRnZXRDb21wb25lbnRcbiAgZXh0ZW5kcyBBamZCYXNlV2lkZ2V0Q29tcG9uZW50PEFqZlBhZ2luYXRlZFRhYmxlV2lkZ2V0SW5zdGFuY2U+XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXRcbntcbiAgcmVhZG9ubHkgcGFnaW5hdG9yQ29uZmlnID0ge1xuICAgIHBhZ2VTaXplOiAxMCxcbiAgICBwYWdlU2l6ZU9wdGlvbnM6IFs1LCAxMCwgMTUsIDIwLCAyNSwgMzAsIDUwLCAxMDAsIDUwMF0sXG4gIH07XG5cbiAgZ2V0IGN1cnJlbnRQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlO1xuICB9XG4gIHByaXZhdGUgX2N1cnJlbnRQYWdlID0gMDtcblxuICBnZXQgcGFnZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZXM7XG4gIH1cbiAgcHJpdmF0ZSBfcGFnZXMgPSAwO1xuXG4gIGdldCBvcmRlckJ5KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX29yZGVyQnk7XG4gIH1cbiAgcHJpdmF0ZSBfb3JkZXJCeSA9IDA7XG5cbiAgZ2V0IGN1cnJlbnRDb250ZW50KCk6IEFqZlRhYmxlQ2VsbFtdW10ge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50Q29udGVudDtcbiAgfVxuICBwcml2YXRlIF9jdXJyZW50Q29udGVudDogQWpmVGFibGVDZWxsW11bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBmdWxsIGRhdGEgdGFibGVcbiAgICovXG4gIHByaXZhdGUgX2FsbERhdGFDb250ZW50OiBBamZUYWJsZUNlbGxbXVtdID0gW107XG5cbiAgLyoqXG4gICAqIGZ1bGwgc29ydGVkIGRhdGEgdGFibGVcbiAgICovXG4gIHByaXZhdGUgX3NvcnRlZEFsbERhdGFDb250ZW50OiBBamZUYWJsZUNlbGxbXVtdID0gW107XG5cbiAgZ2V0IGhlYWRlckNvbnRlbnQoKTogQWpmVGFibGVDZWxsW10ge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJDb250ZW50O1xuICB9XG4gIHByaXZhdGUgX2hlYWRlckNvbnRlbnQ6IEFqZlRhYmxlQ2VsbFtdID0gW107XG5cbiAgZ2V0IGNhbkdvRm9yd2FyZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuR29Gb3J3YXJkO1xuICB9XG4gIHByaXZhdGUgX2NhbkdvRm9yd2FyZCA9IGZhbHNlO1xuXG4gIGdldCBjYW5Hb0JhY2t3YXJkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW5Hb0JhY2t3YXJkO1xuICB9XG4gIHByaXZhdGUgX2NhbkdvQmFja3dhcmQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjZHI6IENoYW5nZURldGVjdG9yUmVmLCBlbDogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKGNkciwgZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbml0aWFsIGRhdGEgZm9yIHRoZSB0YWJsZSBvbiBpbnN0YW5jZSBjaGFuZ2VzXG4gICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2luc3RhbmNlJ10pIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pbnN0YW5jZSAhPSBudWxsICYmXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uud2lkZ2V0LnBhZ2VTaXplICYmXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uud2lkZ2V0LnBhZ2VTaXplID4gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplID0gdGhpcy5pbnN0YW5jZS53aWRnZXQucGFnZVNpemU7XG4gICAgICB9XG4gICAgICB0aGlzLl91cGRhdGVDdXJyZW50Q29udGVudCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaW5zdGFuY2UgIT0gbnVsbCAmJlxuICAgICAgdGhpcy5pbnN0YW5jZS53aWRnZXQucGFnZVNpemUgJiZcbiAgICAgIHRoaXMuaW5zdGFuY2Uud2lkZ2V0LnBhZ2VTaXplID4gMFxuICAgICkge1xuICAgICAgdGhpcy5wYWdpbmF0b3JDb25maWcucGFnZVNpemUgPSB0aGlzLmluc3RhbmNlLndpZGdldC5wYWdlU2l6ZTtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlQ3VycmVudENvbnRlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHb3QgdG8gbmV4dCBvciBwcmV2aW91cyBwYWdlXG4gICAqIEBwYXJhbSBkaXJlY3Rpb25cbiAgICogQHJldHVybnNcbiAgICovXG4gIGdvVG9QYWdlKGRpcmVjdGlvbjogJ25leHQnIHwgJ3ByZXZpb3VzJyk6IHZvaWQge1xuICAgIGNvbnN0IGRpZmYgPSBkaXJlY3Rpb24gPT09ICduZXh0JyA/IDEgOiAtMTtcbiAgICBjb25zdCBuZXdQYWdlID0gdGhpcy5fY3VycmVudFBhZ2UgKyBkaWZmO1xuICAgIGlmIChuZXdQYWdlIDw9IDAgfHwgbmV3UGFnZSA+IHRoaXMuX3BhZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gbmV3UGFnZTtcbiAgICB0aGlzLl9jYW5Hb0ZvcndhcmQgPSBuZXdQYWdlIDwgdGhpcy5fcGFnZXM7XG4gICAgdGhpcy5fY2FuR29CYWNrd2FyZCA9IG5ld1BhZ2UgPiAxO1xuICAgIHRoaXMuX2ZpbGxDdXJyZW50Q29udGVudCgpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShfcGFnZVNpemU6IG51bWJlcikge1xuICAgIHRoaXMucGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplID0gX3BhZ2VTaXplO1xuICAgIHRoaXMuX3VwZGF0ZUN1cnJlbnRDb250ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogU29ydCBhbGwgZGF0YSBmb3IgdGhlIHRhYmxlLCBub3Qgb25seSBjdXJyZW50IHBhZ2UgZGF0YVxuICAgKiBAcGFyYW0gc29ydFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc29ydFBhZ2luYXRlZERhdGEoc29ydDogU29ydCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hbGxEYXRhQ29udGVudC5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAoIXNvcnQuYWN0aXZlIHx8IHNvcnQuZGlyZWN0aW9uID09PSAnJykge1xuICAgICAgICB0aGlzLl9zb3J0ZWRBbGxEYXRhQ29udGVudCA9IHRoaXMuX2FsbERhdGFDb250ZW50LnNsaWNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jdXJyZW50UGFnZSA9IDE7XG4gICAgICAgIHRoaXMuX2NhbkdvRm9yd2FyZCA9IHRoaXMuX2N1cnJlbnRQYWdlIDwgdGhpcy5fcGFnZXM7XG4gICAgICAgIHRoaXMuX2NhbkdvQmFja3dhcmQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBjb2x1bW5JZHggPSBwYXJzZUludChzb3J0LmFjdGl2ZS5zbGljZSgtMSkpIHx8IDA7XG4gICAgICAgIHRoaXMuX3NvcnRlZEFsbERhdGFDb250ZW50ID0gdGhpcy5fYWxsRGF0YUNvbnRlbnQuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNBc2MgPSBzb3J0LmRpcmVjdGlvbiA9PT0gJ2FzYyc7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBhcmUoYVtjb2x1bW5JZHhdLCBiW2NvbHVtbklkeF0sIGlzQXNjKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9maWxsQ3VycmVudENvbnRlbnQoKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnRhYmxlQ29udGVudCgpOiBBamZUYWJsZUNlbGxbXVtdIHtcbiAgICByZXR1cm4gW3RoaXMuX2hlYWRlckNvbnRlbnQsIC4uLnRoaXMuX3NvcnRlZEFsbERhdGFDb250ZW50XTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBhcmUoYTogQWpmVGFibGVDZWxsLCBiOiBBamZUYWJsZUNlbGwsIGlzQXNjOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIChhLnZhbHVlIDwgYi52YWx1ZSA/IC0xIDogMSkgKiAoaXNBc2MgPyAxIDogLTEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjdXJyZW50IGhlYWRlciBhbmQgZGF0YSBmb3IgdGhlIHRhYmxlLCBzdGFydGluZyBmcm9tIHBhZ2UgMVxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlQ3VycmVudENvbnRlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FuR29CYWNrd2FyZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmluc3RhbmNlID09IG51bGwgfHwgdGhpcy5pbnN0YW5jZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fY3VycmVudFBhZ2UgPSAwO1xuICAgICAgdGhpcy5fcGFnZXMgPSAwO1xuICAgICAgdGhpcy5faGVhZGVyQ29udGVudCA9IFtdO1xuICAgICAgdGhpcy5fY3VycmVudENvbnRlbnQgPSBbXTtcbiAgICAgIHRoaXMuX2FsbERhdGFDb250ZW50ID0gW107XG4gICAgICB0aGlzLl9zb3J0ZWRBbGxEYXRhQ29udGVudCA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9oZWFkZXJDb250ZW50ID0gdGhpcy5pbnN0YW5jZS5kYXRhWzBdO1xuICAgICAgdGhpcy5fYWxsRGF0YUNvbnRlbnQgPSB0aGlzLmluc3RhbmNlLmRhdGEuc2xpY2UoMSk7XG4gICAgICB0aGlzLl9zb3J0ZWRBbGxEYXRhQ29udGVudCA9IFsuLi50aGlzLl9hbGxEYXRhQ29udGVudF07XG4gICAgICB0aGlzLl9jdXJyZW50UGFnZSA9IDE7XG5cbiAgICAgIHRoaXMuX3BhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX2FsbERhdGFDb250ZW50Lmxlbmd0aCAvIHRoaXMucGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplKTtcbiAgICAgIHRoaXMuX2NhbkdvRm9yd2FyZCA9IHRoaXMuX3BhZ2VzID4gMTtcbiAgICB9XG4gICAgdGhpcy5fZmlsbEN1cnJlbnRDb250ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGN1cnJlbnQgZGF0YSBmb3IgdGhlIHRhYmxlLCB1c2luZyBwYWdlIGFuZCBzb3J0ZWQgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBfZmlsbEN1cnJlbnRDb250ZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zb3J0ZWRBbGxEYXRhQ29udGVudC5sZW5ndGggPT09IDAgJiYgdGhpcy5faGVhZGVyQ29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Q29udGVudCA9IFt0aGlzLl9oZWFkZXJDb250ZW50XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RhcnQgPSAodGhpcy5fY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplO1xuICAgICAgdGhpcy5fY3VycmVudENvbnRlbnQgPSBbXG4gICAgICAgIHRoaXMuX2hlYWRlckNvbnRlbnQsXG4gICAgICAgIC4uLnRoaXMuX3NvcnRlZEFsbERhdGFDb250ZW50LnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplKSxcbiAgICAgIF07XG4gICAgfVxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGFqZi1maWx0ZXItd2lkZ2V0XG4gICpuZ0lmPVwiaW5zdGFuY2UgJiYgaW5zdGFuY2UuZmlsdGVyXCJcbiAgW2luc3RhbmNlXT1cImluc3RhbmNlXCJcbiAgKGZpbHRlcmVkSW5zdGFuY2UpPVwiaW5zdGFuY2UgPSAkZXZlbnRcIlxuICAoZmlsdGVyV2lkZ2V0Q2hhbmdlKT1cImZpbHRlcldpZGdldENoYW5nZWQoJGV2ZW50KVwiXG4+XG48L2FqZi1maWx0ZXItd2lkZ2V0PlxuPG5nLXRlbXBsYXRlIGFqZi13aWRnZXQtaG9zdD48L25nLXRlbXBsYXRlPlxuIiwiPGRpdiAqbmdJZj1cImluc3RhbmNlXCIgY2xhc3M9XCJhamYtY29sdW1uLWNvbnRhaW5lclwiPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3IG9mIGluc3RhbmNlLmNvbnRlbnRcIj5cbiAgICA8YWpmLXdpZGdldCBbaW5zdGFuY2VdPVwid1wiPlxuICAgIDwvYWpmLXdpZGdldD5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiIsIjxkaXYgKm5nSWY9XCJpbnN0YW5jZVwiIGNsYXNzPVwiYWpmLWNvbHVtbnNcIj5cbiAgPGRpdlxuICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBpbnN0YW5jZS53aWRnZXQuY29sdW1uczsgbGV0IGlkeCA9IGluZGV4XCJcbiAgICAgIFtuZ1N0eWxlXT1cInsnZmxleC1ncm93JzogY29sdW1uID4gLTEgPyAxIDogbnVsbCwgJ2ZsZXgtYmFzaXMnIDogY29sdW1uID4gLTEgPyAoY29sdW1uICogMTAwKSArICclJyA6IG51bGx9XCJcbiAgICAgIGNsYXNzPVwiYWpmLWNvbHVtblwiXG4gID5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFsbGNvbHVtbnNSZW5kZXJlZCR8YXN5bmNcIj5cbiAgICA8YWpmLXdpZGdldCAqbmdJZj1cIihpbnN0YW5jZXxhamZHZXRDb2x1bW5Db250ZW50OmlkeCkgYXMgY2NcIiBbaW5zdGFuY2VdPVwiY2MhXCI+XG4gICAgPC9hamYtd2lkZ2V0PlxuICA8L25nLWNvbnRhaW5lcj5cbiA8L2Rpdj5cbjwvZGl2PlxuIiwiPGEgKm5nSWY9XCJpbnN0YW5jZVwiIGNsYXNzPVwiYWpmLWRpYWxvZy10b2dnbGVcIiAoY2xpY2spPVwib3BlbkRpYWxvZygpXCI+XG4gIDxhamYtd2lkZ2V0IFtpbnN0YW5jZV09XCJpbnN0YW5jZS50b2dnbGVcIj48L2FqZi13aWRnZXQ+XG48L2E+XG48bmctdGVtcGxhdGUgI2RpYWxvZ0NvbnRlbnQ+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbnN0YW5jZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaW5zdGFuY2UuY29udGVudFwiPlxuICAgICAgPGFqZi13aWRnZXQgW2luc3RhbmNlXT1cIml0ZW1cIj48L2FqZi13aWRnZXQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiIsIjxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLWxpc3RcIiAqbmdJZj1cImluc3RhbmNlICYmIHBhZ2VzID4gMFwiPlxuICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2luYXRlZC1saXN0LXRpdGxlLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLWxpc3QtdGl0bGVcIj57eyBpbnN0YW5jZS53aWRnZXQudGl0bGUgfX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYWpmLXNwYWNlclwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLWxpc3QtcGFnaW5hdG9yXCI+XG4gICAgICA8YSAoY2xpY2spPVwiZ29Ub1BhZ2UoJ3ByZXZpb3VzJylcIiBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtbGlzdC1idG4gYWpmLXBhZ2luYXRlZC1saXN0LWJhY2stYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWpmLXBhZ2luYXRlZC1saXN0LWJ0bi1kaXNhYmxlZF09XCJjYW5Hb0JhY2t3YXJkID09PSBmYWxzZVwiPjwvYT5cbiAgICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLWxpc3QtcGFnaW5hdG9yLXBhZ2VcIj57eyBjdXJyZW50UGFnZSB9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtbGlzdC1wYWdpbmF0b3Itc2VwYXJhdG9yXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2luYXRlZC1saXN0LXBhZ2luYXRvci1wYWdlc1wiPnt7IHBhZ2VzIH19PC9kaXY+XG4gICAgICA8YSAoY2xpY2spPVwiZ29Ub1BhZ2UoJ25leHQnKVwiIGNsYXNzPVwiYWpmLXBhZ2luYXRlZC1saXN0LWJ0biBhamYtcGFnaW5hdGVkLWxpc3QtZm9yd2FyZC1idG5cIlxuICAgICAgICBbY2xhc3MuYWpmLXBhZ2luYXRlZC1saXN0LWJ0bi1kaXNhYmxlZF09XCJjYW5Hb0ZvcndhcmQgPT09IGZhbHNlXCI+PC9hPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY3VycmVudENvbnRlbnRcIj5cbiAgICA8YWpmLXdpZGdldCBbaW5zdGFuY2VdPVwiaXRlbVwiPjwvYWpmLXdpZGdldD5cbiAgPC9kaXY+XG48L2Rpdj5cbiIsIjxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlXCIgKm5nSWY9XCJpbnN0YW5jZVwiPlxuICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2luYXRlZC10YWJsZS10aXRsZS1jb250YWluZXJcIiAqbmdJZj1cInBhZ2VzID4gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2Utc2VsZWN0b3JcIj5cbiAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2Utc2VsZWN0b3ItbGFiZWxcIlxuICAgICAgICA+e3snSXRlbXMgcGVyIHBhZ2U6J3x0cmFuc2xvY299fTwvbWF0LWxhYmVsXG4gICAgICA+XG4gICAgICA8bWF0LXNlbGVjdFxuICAgICAgICBbdmFsdWVdPVwicGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudC52YWx1ZSlcIlxuICAgICAgPlxuICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgIFt2YWx1ZV09XCJwYWdlU2l6ZU9wdFwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHBhZ2VTaXplT3B0IG9mIHBhZ2luYXRvckNvbmZpZy5wYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcGFnZVNpemVPcHQgfX1cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhamYtc3BhY2VyXCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtdGFibGUtcGFnaW5hdG9yXCI+XG4gICAgICA8YVxuICAgICAgICAoY2xpY2spPVwiZ29Ub1BhZ2UoJ3ByZXZpb3VzJylcIlxuICAgICAgICBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtdGFibGUtYnRuIGFqZi1wYWdpbmF0ZWQtdGFibGUtYmFjay1idG5cIlxuICAgICAgICBbY2xhc3MuYWpmLXBhZ2luYXRlZC10YWJsZS1idG4tZGlzYWJsZWRdPVwiY2FuR29CYWNrd2FyZCA9PT0gZmFsc2VcIlxuICAgICAgPjwvYT5cbiAgICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2luYXRvci1wYWdlXCI+e3sgY3VycmVudFBhZ2UgfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2luYXRvci1zZXBhcmF0b3JcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2luYXRvci1wYWdlc1wiPnt7IHBhZ2VzIH19PC9kaXY+XG4gICAgICA8YVxuICAgICAgICAoY2xpY2spPVwiZ29Ub1BhZ2UoJ25leHQnKVwiXG4gICAgICAgIGNsYXNzPVwiYWpmLXBhZ2luYXRlZC10YWJsZS1idG4gYWpmLXBhZ2luYXRlZC10YWJsZS1mb3J3YXJkLWJ0blwiXG4gICAgICAgIFtjbGFzcy5hamYtcGFnaW5hdGVkLXRhYmxlLWJ0bi1kaXNhYmxlZF09XCJjYW5Hb0ZvcndhcmQgPT09IGZhbHNlXCJcbiAgICAgID48L2E+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2luYXRlZC10YWJsZS1pdGVtXCI+XG4gICAgPGFqZi13aWRnZXQtZXhwb3J0XG4gICAgICAqbmdJZj1cImluc3RhbmNlXCJcbiAgICAgIFt3aWRnZXRUeXBlXT1cImluc3RhbmNlLndpZGdldFR5cGVcIlxuICAgICAgW2RhdGFdPVwiZXhwb3J0YWJsZUNvbnRlbnQoKVwiXG4gICAgICBbZW5hYmxlXT1cImluc3RhbmNlLmV4cG9ydGFibGVcIlxuICAgID5cbiAgICAgIDxhamYtdGFibGUgW2RhdGFdPVwiY3VycmVudENvbnRlbnRcIiAoc29ydFNlbGVjdGVkKT1cInNvcnRQYWdpbmF0ZWREYXRhKCRldmVudClcIj48L2FqZi10YWJsZT5cbiAgICA8L2FqZi13aWRnZXQtZXhwb3J0PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvcmVwb3J0cy9zcmMvd2lkZ2V0LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvcmVwb3J0cy9zcmMvd2lkZ2V0Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9yZXBvcnRzL3NyYy9jb2x1bW4td2lkZ2V0Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9yZXBvcnRzL3NyYy9sYXlvdXQtd2lkZ2V0Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9yZXBvcnRzL3NyYy9kaWFsb2ctd2lkZ2V0Lmh0bWwiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9yZXBvcnRzL3NyYy9wYWdpbmF0ZWQtbGlzdC13aWRnZXQuaHRtbCIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL3JlcG9ydHMvc3JjL3BhZ2luYXRlZC10YWJsZS13aWRnZXQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQ0wsc0JBQXNCLEVBTXRCLGVBQWUsSUFBSSxhQUFhLEVBR2hDLGdCQUFnQixJQUFJLFdBQVcsRUFDL0IsYUFBYSxJQUFJLEVBQUUsR0FDcEIsTUFBTSxtQkFBbUIsQ0FBQztBQUczQixPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUdWLE1BQU0sRUFHTixXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFN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SSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMvQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztZQUN0RSxJQUFJLENBQUMsZUFBZSxHQUFHO2dCQUNyQixJQUFJLENBQUMsY0FBYztnQkFDbkIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7YUFDbEYsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNCLENBQUM7K0dBbExVLGdDQUFnQzttR0FBaEMsZ0NBQWdDLGdHTTFRN0MscXhEQThDQTs7NEZONE5hLGdDQUFnQztrQkFONUMsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChDKSBHbnVjb29wIHNvYy4gY29vcC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzXG4gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSxcbiAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLlxuICpcbiAqL1xuXG5pbXBvcnQge1xuICBBamZCYXNlV2lkZ2V0Q29tcG9uZW50LFxuICBBamZDb2x1bW5XaWRnZXRJbnN0YW5jZSxcbiAgQWpmRGlhbG9nV2lkZ2V0SW5zdGFuY2UsXG4gIEFqZkxheW91dFdpZGdldEluc3RhbmNlLFxuICBBamZQYWdpbmF0ZWRMaXN0V2lkZ2V0SW5zdGFuY2UsXG4gIEFqZlBhZ2luYXRlZFRhYmxlV2lkZ2V0SW5zdGFuY2UsXG4gIEFqZlJlcG9ydFdpZGdldCBhcyBDb3JlQ29tcG9uZW50LFxuICBBamZXaWRnZXRDb21wb25lbnRzTWFwLFxuICBBamZXaWRnZXRJbnN0YW5jZSxcbiAgQWpmV2lkZ2V0U2VydmljZSBhcyBDb3JlU2VydmljZSxcbiAgQWpmV2lkZ2V0VHlwZSBhcyB3dCxcbn0gZnJvbSAnQGFqZi9jb3JlL3JlcG9ydHMnO1xuaW1wb3J0IHtBamZDb250ZXh0fSBmcm9tICdAYWpmL2NvcmUvY29tbW9uJztcbmltcG9ydCB7QWpmVGFibGVDZWxsfSBmcm9tICdAYWpmL2NvcmUvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0YWJsZSxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7U29ydH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7QWpmQ2hhcnRXaWRnZXRDb21wb25lbnR9IGZyb20gJy4vY2hhcnQtd2lkZ2V0JztcbmltcG9ydCB7QWpmRm9ybXVsYVdpZGdldENvbXBvbmVudH0gZnJvbSAnLi9mb3JtdWxhLXdpZGdldCc7XG5pbXBvcnQge0FqZkdyYXBoV2lkZ2V0Q29tcG9uZW50fSBmcm9tICcuL2dyYXBoLXdpZGdldCc7XG5pbXBvcnQge0FqZkhlYXRNYXBXaWRnZXRDb21wb25lbnR9IGZyb20gJy4vaGVhdC1tYXAtd2lkZ2V0JztcbmltcG9ydCB7QWpmSW1hZ2VDb250YWluZXJXaWRnZXRDb21wb25lbnR9IGZyb20gJy4vaW1hZ2UtY29udGFpbmVyLXdpZGdldCc7XG5pbXBvcnQge0FqZkltYWdlV2lkZ2V0Q29tcG9uZW50fSBmcm9tICcuL2ltYWdlLXdpZGdldCc7XG5pbXBvcnQge0FqZk1hcFdpZGdldENvbXBvbmVudH0gZnJvbSAnLi9tYXAtd2lkZ2V0JztcbmltcG9ydCB7QWpmUGFnZUJyZWFrV2lkZ2V0Q29tcG9uZW50fSBmcm9tICcuL3BhZ2UtYnJlYWstd2lkZ2V0JztcbmltcG9ydCB7QWpmVGFibGVXaWRnZXRDb21wb25lbnR9IGZyb20gJy4vdGFibGUtd2lkZ2V0JztcbmltcG9ydCB7QWpmVGV4dFdpZGdldENvbXBvbmVudH0gZnJvbSAnLi90ZXh0LXdpZGdldCc7XG5cbmNvbnN0IGRlZmF1bHRXaWRnZXRzRmFjdG9yeSA9ICgpOiBBamZXaWRnZXRDb21wb25lbnRzTWFwID0+IHtcbiAgY29uc3QgZGVmYXVsdFdpZGdldHM6IEFqZldpZGdldENvbXBvbmVudHNNYXAgPSB7fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuTGF5b3V0XSA9IHtjb21wb25lbnQ6IEFqZkxheW91dFdpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LlBhZ2VCcmVha10gPSB7Y29tcG9uZW50OiBBamZQYWdlQnJlYWtXaWRnZXRDb21wb25lbnR9O1xuICBkZWZhdWx0V2lkZ2V0c1t3dC5JbWFnZV0gPSB7Y29tcG9uZW50OiBBamZJbWFnZVdpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LlRleHRdID0ge2NvbXBvbmVudDogQWpmVGV4dFdpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LkNoYXJ0XSA9IHtjb21wb25lbnQ6IEFqZkNoYXJ0V2lkZ2V0Q29tcG9uZW50fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuVGFibGVdID0ge2NvbXBvbmVudDogQWpmVGFibGVXaWRnZXRDb21wb25lbnR9O1xuICBkZWZhdWx0V2lkZ2V0c1t3dC5EeW5hbWljVGFibGVdID0ge2NvbXBvbmVudDogQWpmVGFibGVXaWRnZXRDb21wb25lbnR9O1xuICBkZWZhdWx0V2lkZ2V0c1t3dC5NYXBdID0ge2NvbXBvbmVudDogQWpmTWFwV2lkZ2V0Q29tcG9uZW50fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuQ29sdW1uXSA9IHtjb21wb25lbnQ6IEFqZkNvbHVtbldpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LkZvcm11bGFdID0ge2NvbXBvbmVudDogQWpmRm9ybXVsYVdpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LkltYWdlQ29udGFpbmVyXSA9IHtjb21wb25lbnQ6IEFqZkltYWdlQ29udGFpbmVyV2lkZ2V0Q29tcG9uZW50fTtcbiAgZGVmYXVsdFdpZGdldHNbd3QuR3JhcGhdID0ge2NvbXBvbmVudDogQWpmR3JhcGhXaWRnZXRDb21wb25lbnR9O1xuICBkZWZhdWx0V2lkZ2V0c1t3dC5QYWdpbmF0ZWRMaXN0XSA9IHtjb21wb25lbnQ6IEFqZlBhZ2luYXRlZExpc3RXaWRnZXRDb21wb25lbnR9O1xuICBkZWZhdWx0V2lkZ2V0c1t3dC5QYWdpbmF0ZWRUYWJsZV0gPSB7Y29tcG9uZW50OiBBamZQYWdpbmF0ZWRUYWJsZVdpZGdldENvbXBvbmVudH07XG5cbiAgZGVmYXVsdFdpZGdldHNbd3QuRGlhbG9nXSA9IHtjb21wb25lbnQ6IEFqZkRpYWxvZ1dpZGdldENvbXBvbmVudH07XG4gIGRlZmF1bHRXaWRnZXRzW3d0LkhlYXRNYXBdID0ge2NvbXBvbmVudDogQWpmSGVhdE1hcFdpZGdldENvbXBvbmVudH07XG4gIHJldHVybiBkZWZhdWx0V2lkZ2V0cztcbn07XG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIEFqZldpZGdldFNlcnZpY2UgZXh0ZW5kcyBDb3JlU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGRlZmF1bHRXaWRnZXRzRmFjdG9yeSgpKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhamYtd2lkZ2V0JyxcbiAgdGVtcGxhdGVVcmw6ICd3aWRnZXQuaHRtbCcsXG4gIHN0eWxlVXJsczogWyd3aWRnZXQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQWpmUmVwb3J0V2lkZ2V0IGV4dGVuZHMgQ29yZUNvbXBvbmVudCB7XG4gIEBPdXRwdXQoKSBmaWx0ZXJXaWRnZXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtjb250ZXh0OiBBamZDb250ZXh0LCB3aWRnZXQ6IEFqZldpZGdldEluc3RhbmNlfT4oKTtcbiAgcmVhZG9ubHkgd2lkZ2V0c01hcDogQWpmV2lkZ2V0Q29tcG9uZW50c01hcDtcblxuICBjb25zdHJ1Y3RvcihyZW5kZXJlcjogUmVuZGVyZXIyLCB3aWRnZXRTZXJ2aWNlOiBBamZXaWRnZXRTZXJ2aWNlKSB7XG4gICAgc3VwZXIocmVuZGVyZXIpO1xuICAgIHRoaXMud2lkZ2V0c01hcCA9IHdpZGdldFNlcnZpY2UuY29tcG9uZW50c01hcDtcbiAgfVxuXG4gIGZpbHRlcldpZGdldENoYW5nZWQoY2hhbmdlczoge2NvbnRleHQ6IEFqZkNvbnRleHQsIHdpZGdldDogQWpmV2lkZ2V0SW5zdGFuY2V9KSB7XG4gICAgdGhpcy5maWx0ZXJXaWRnZXRDaGFuZ2UuZW1pdChjaGFuZ2VzKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICdjb2x1bW4td2lkZ2V0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnY29sdW1uLXdpZGdldC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBBamZDb2x1bW5XaWRnZXRDb21wb25lbnQgZXh0ZW5kcyBBamZCYXNlV2lkZ2V0Q29tcG9uZW50PEFqZkNvbHVtbldpZGdldEluc3RhbmNlPiB7XG4gIGNvbnN0cnVjdG9yKGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIGVsOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoY2RyLCBlbCk7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnbGF5b3V0LXdpZGdldC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2xheW91dC13aWRnZXQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmTGF5b3V0V2lkZ2V0Q29tcG9uZW50XG4gIGV4dGVuZHMgQWpmQmFzZVdpZGdldENvbXBvbmVudDxBamZMYXlvdXRXaWRnZXRJbnN0YW5jZT5cbiAgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkXG57XG4gIHByaXZhdGUgX2FsbGNvbHVtbnNSZW5kZXJlZCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBhbGxjb2x1bW5zUmVuZGVyZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpc1xuICAgIC5fYWxsY29sdW1uc1JlbmRlcmVkJCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGNvbnN0cnVjdG9yKGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIGVsOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoY2RyLCBlbCk7XG4gIH1cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX2FsbGNvbHVtbnNSZW5kZXJlZCQubmV4dCh0cnVlKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICdkaWFsb2ctd2lkZ2V0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZGlhbG9nLXdpZGdldC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBBamZEaWFsb2dXaWRnZXRDb21wb25lbnQgZXh0ZW5kcyBBamZCYXNlV2lkZ2V0Q29tcG9uZW50PEFqZkRpYWxvZ1dpZGdldEluc3RhbmNlPiB7XG4gIEBWaWV3Q2hpbGQoJ2RpYWxvZ0NvbnRlbnQnLCB7cmVhZDogVGVtcGxhdGVSZWZ9KSBkaWFsb2dDb250ZW50ITogVGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZykge1xuICAgIHN1cGVyKGNkciwgZWwpO1xuICB9XG5cbiAgb3BlbkRpYWxvZygpOiB2b2lkIHtcbiAgICB0aGlzLl9kaWFsb2cub3Blbih0aGlzLmRpYWxvZ0NvbnRlbnQpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJ3BhZ2luYXRlZC1saXN0LXdpZGdldC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3BhZ2luYXRlZC1saXN0LXdpZGdldC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBBamZQYWdpbmF0ZWRMaXN0V2lkZ2V0Q29tcG9uZW50XG4gIGV4dGVuZHMgQWpmQmFzZVdpZGdldENvbXBvbmVudDxBamZQYWdpbmF0ZWRMaXN0V2lkZ2V0SW5zdGFuY2U+XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXRcbntcbiAgZ2V0IGN1cnJlbnRQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlO1xuICB9XG4gIHByaXZhdGUgX2N1cnJlbnRQYWdlID0gMDtcblxuICBnZXQgcGFnZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZXM7XG4gIH1cbiAgcHJpdmF0ZSBfcGFnZXMgPSAwO1xuXG4gIGdldCBjdXJyZW50Q29udGVudCgpOiBBamZXaWRnZXRJbnN0YW5jZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudENvbnRlbnQ7XG4gIH1cbiAgcHJpdmF0ZSBfY3VycmVudENvbnRlbnQ6IEFqZldpZGdldEluc3RhbmNlW10gPSBbXTtcblxuICBnZXQgY2FuR29Gb3J3YXJkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW5Hb0ZvcndhcmQ7XG4gIH1cbiAgcHJpdmF0ZSBfY2FuR29Gb3J3YXJkID0gZmFsc2U7XG5cbiAgZ2V0IGNhbkdvQmFja3dhcmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbkdvQmFja3dhcmQ7XG4gIH1cbiAgcHJpdmF0ZSBfY2FuR29CYWNrd2FyZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIGVsOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoY2RyLCBlbCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2luc3RhbmNlJ10pIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUN1cnJlbnRDb250ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlQ3VycmVudENvbnRlbnQoKTtcbiAgfVxuXG4gIGdvVG9QYWdlKGRpcmVjdGlvbjogJ25leHQnIHwgJ3ByZXZpb3VzJyk6IHZvaWQge1xuICAgIGNvbnN0IGRpZmYgPSBkaXJlY3Rpb24gPT09ICduZXh0JyA/IDEgOiAtMTtcbiAgICBjb25zdCBuZXdQYWdlID0gdGhpcy5fY3VycmVudFBhZ2UgKyBkaWZmO1xuICAgIGlmIChuZXdQYWdlIDw9IDAgfHwgbmV3UGFnZSA+IHRoaXMuX3BhZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gbmV3UGFnZTtcbiAgICB0aGlzLl9jYW5Hb0ZvcndhcmQgPSBuZXdQYWdlIDwgdGhpcy5fcGFnZXM7XG4gICAgdGhpcy5fY2FuR29CYWNrd2FyZCA9IG5ld1BhZ2UgPiAxO1xuICAgIHRoaXMuX2ZpbGxDdXJyZW50Q29udGVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlQ3VycmVudENvbnRlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FuR29CYWNrd2FyZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmluc3RhbmNlID09IG51bGwgfHwgdGhpcy5pbnN0YW5jZS5jb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fY3VycmVudFBhZ2UgPSAwO1xuICAgICAgdGhpcy5fcGFnZXMgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdXJyZW50UGFnZSA9IDE7XG4gICAgICBjb25zdCB7Y29udGVudH0gPSB0aGlzLmluc3RhbmNlO1xuICAgICAgY29uc3Qge3BhZ2VTaXplfSA9IHRoaXMuaW5zdGFuY2Uud2lkZ2V0O1xuICAgICAgdGhpcy5fcGFnZXMgPSBNYXRoLmNlaWwoY29udGVudC5sZW5ndGggLyBwYWdlU2l6ZSk7XG4gICAgICB0aGlzLl9jYW5Hb0ZvcndhcmQgPSB0aGlzLl9wYWdlcyA+IDE7XG4gICAgfVxuICAgIHRoaXMuX2ZpbGxDdXJyZW50Q29udGVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsbEN1cnJlbnRDb250ZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluc3RhbmNlID09IG51bGwgfHwgdGhpcy5pbnN0YW5jZS5jb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fY3VycmVudENvbnRlbnQgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge2NvbnRlbnR9ID0gdGhpcy5pbnN0YW5jZTtcbiAgICBjb25zdCB7cGFnZVNpemV9ID0gdGhpcy5pbnN0YW5jZS53aWRnZXQ7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5fY3VycmVudFBhZ2UgLSAxKSAqIHBhZ2VTaXplO1xuICAgIHRoaXMuX2N1cnJlbnRDb250ZW50ID0gY29udGVudC5zbGljZShzdGFydCwgc3RhcnQgKyBwYWdlU2l6ZSk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJ3BhZ2luYXRlZC10YWJsZS13aWRnZXQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydwYWdpbmF0ZWQtdGFibGUtd2lkZ2V0LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIEFqZlBhZ2luYXRlZFRhYmxlV2lkZ2V0Q29tcG9uZW50XG4gIGV4dGVuZHMgQWpmQmFzZVdpZGdldENvbXBvbmVudDxBamZQYWdpbmF0ZWRUYWJsZVdpZGdldEluc3RhbmNlPlxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0XG57XG4gIHJlYWRvbmx5IHBhZ2luYXRvckNvbmZpZyA9IHtcbiAgICBwYWdlU2l6ZTogMTAsXG4gICAgcGFnZVNpemVPcHRpb25zOiBbNSwgMTAsIDE1LCAyMCwgMjUsIDMwLCA1MCwgMTAwLCA1MDBdLFxuICB9O1xuXG4gIGdldCBjdXJyZW50UGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UGFnZTtcbiAgfVxuICBwcml2YXRlIF9jdXJyZW50UGFnZSA9IDA7XG5cbiAgZ2V0IHBhZ2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzO1xuICB9XG4gIHByaXZhdGUgX3BhZ2VzID0gMDtcblxuICBnZXQgb3JkZXJCeSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9vcmRlckJ5O1xuICB9XG4gIHByaXZhdGUgX29yZGVyQnkgPSAwO1xuXG4gIGdldCBjdXJyZW50Q29udGVudCgpOiBBamZUYWJsZUNlbGxbXVtdIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudENvbnRlbnQ7XG4gIH1cbiAgcHJpdmF0ZSBfY3VycmVudENvbnRlbnQ6IEFqZlRhYmxlQ2VsbFtdW10gPSBbXTtcblxuICAvKipcbiAgICogZnVsbCBkYXRhIHRhYmxlXG4gICAqL1xuICBwcml2YXRlIF9hbGxEYXRhQ29udGVudDogQWpmVGFibGVDZWxsW11bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBmdWxsIHNvcnRlZCBkYXRhIHRhYmxlXG4gICAqL1xuICBwcml2YXRlIF9zb3J0ZWRBbGxEYXRhQ29udGVudDogQWpmVGFibGVDZWxsW11bXSA9IFtdO1xuXG4gIGdldCBoZWFkZXJDb250ZW50KCk6IEFqZlRhYmxlQ2VsbFtdIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyQ29udGVudDtcbiAgfVxuICBwcml2YXRlIF9oZWFkZXJDb250ZW50OiBBamZUYWJsZUNlbGxbXSA9IFtdO1xuXG4gIGdldCBjYW5Hb0ZvcndhcmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbkdvRm9yd2FyZDtcbiAgfVxuICBwcml2YXRlIF9jYW5Hb0ZvcndhcmQgPSBmYWxzZTtcblxuICBnZXQgY2FuR29CYWNrd2FyZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuR29CYWNrd2FyZDtcbiAgfVxuICBwcml2YXRlIF9jYW5Hb0JhY2t3YXJkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgZWw6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcihjZHIsIGVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaW5pdGlhbCBkYXRhIGZvciB0aGUgdGFibGUgb24gaW5zdGFuY2UgY2hhbmdlc1xuICAgKiBAcGFyYW0gY2hhbmdlc1xuICAgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpbnN0YW5jZSddKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaW5zdGFuY2UgIT0gbnVsbCAmJlxuICAgICAgICB0aGlzLmluc3RhbmNlLndpZGdldC5wYWdlU2l6ZSAmJlxuICAgICAgICB0aGlzLmluc3RhbmNlLndpZGdldC5wYWdlU2l6ZSA+IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLnBhZ2luYXRvckNvbmZpZy5wYWdlU2l6ZSA9IHRoaXMuaW5zdGFuY2Uud2lkZ2V0LnBhZ2VTaXplO1xuICAgICAgfVxuICAgICAgdGhpcy5fdXBkYXRlQ3VycmVudENvbnRlbnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmluc3RhbmNlICE9IG51bGwgJiZcbiAgICAgIHRoaXMuaW5zdGFuY2Uud2lkZ2V0LnBhZ2VTaXplICYmXG4gICAgICB0aGlzLmluc3RhbmNlLndpZGdldC5wYWdlU2l6ZSA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplID0gdGhpcy5pbnN0YW5jZS53aWRnZXQucGFnZVNpemU7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZUN1cnJlbnRDb250ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR290IHRvIG5leHQgb3IgcHJldmlvdXMgcGFnZVxuICAgKiBAcGFyYW0gZGlyZWN0aW9uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnb1RvUGFnZShkaXJlY3Rpb246ICduZXh0JyB8ICdwcmV2aW91cycpOiB2b2lkIHtcbiAgICBjb25zdCBkaWZmID0gZGlyZWN0aW9uID09PSAnbmV4dCcgPyAxIDogLTE7XG4gICAgY29uc3QgbmV3UGFnZSA9IHRoaXMuX2N1cnJlbnRQYWdlICsgZGlmZjtcbiAgICBpZiAobmV3UGFnZSA8PSAwIHx8IG5ld1BhZ2UgPiB0aGlzLl9wYWdlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IG5ld1BhZ2U7XG4gICAgdGhpcy5fY2FuR29Gb3J3YXJkID0gbmV3UGFnZSA8IHRoaXMuX3BhZ2VzO1xuICAgIHRoaXMuX2NhbkdvQmFja3dhcmQgPSBuZXdQYWdlID4gMTtcbiAgICB0aGlzLl9maWxsQ3VycmVudENvbnRlbnQoKTtcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2UoX3BhZ2VTaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2luYXRvckNvbmZpZy5wYWdlU2l6ZSA9IF9wYWdlU2l6ZTtcbiAgICB0aGlzLl91cGRhdGVDdXJyZW50Q29udGVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnQgYWxsIGRhdGEgZm9yIHRoZSB0YWJsZSwgbm90IG9ubHkgY3VycmVudCBwYWdlIGRhdGFcbiAgICogQHBhcmFtIHNvcnRcbiAgICogQHJldHVybnNcbiAgICovXG4gIHNvcnRQYWdpbmF0ZWREYXRhKHNvcnQ6IFNvcnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYWxsRGF0YUNvbnRlbnQubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKCFzb3J0LmFjdGl2ZSB8fCBzb3J0LmRpcmVjdGlvbiA9PT0gJycpIHtcbiAgICAgICAgdGhpcy5fc29ydGVkQWxsRGF0YUNvbnRlbnQgPSB0aGlzLl9hbGxEYXRhQ29udGVudC5zbGljZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICB0aGlzLl9jYW5Hb0ZvcndhcmQgPSB0aGlzLl9jdXJyZW50UGFnZSA8IHRoaXMuX3BhZ2VzO1xuICAgICAgICB0aGlzLl9jYW5Hb0JhY2t3YXJkID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY29sdW1uSWR4ID0gcGFyc2VJbnQoc29ydC5hY3RpdmUucmVwbGFjZSgvXlxcRCsvLCAnJykpIHx8IDA7XG4gICAgICAgIHRoaXMuX3NvcnRlZEFsbERhdGFDb250ZW50ID0gdGhpcy5fc29ydGVkQWxsRGF0YUNvbnRlbnQuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNBc2MgPSBzb3J0LmRpcmVjdGlvbiA9PT0gJ2FzYyc7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBhcmUoYVtjb2x1bW5JZHhdLCBiW2NvbHVtbklkeF0sIGlzQXNjKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9maWxsQ3VycmVudENvbnRlbnQoKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnRhYmxlQ29udGVudCgpOiBBamZUYWJsZUNlbGxbXVtdIHtcbiAgICByZXR1cm4gW3RoaXMuX2hlYWRlckNvbnRlbnQsIC4uLnRoaXMuX3NvcnRlZEFsbERhdGFDb250ZW50XTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBhcmUoYTogQWpmVGFibGVDZWxsLCBiOiBBamZUYWJsZUNlbGwsIGlzQXNjOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIChhLnZhbHVlIDwgYi52YWx1ZSA/IC0xIDogMSkgKiAoaXNBc2MgPyAxIDogLTEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjdXJyZW50IGhlYWRlciBhbmQgZGF0YSBmb3IgdGhlIHRhYmxlLCBzdGFydGluZyBmcm9tIHBhZ2UgMVxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlQ3VycmVudENvbnRlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FuR29CYWNrd2FyZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmluc3RhbmNlID09IG51bGwgfHwgdGhpcy5pbnN0YW5jZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fY3VycmVudFBhZ2UgPSAwO1xuICAgICAgdGhpcy5fcGFnZXMgPSAwO1xuICAgICAgdGhpcy5faGVhZGVyQ29udGVudCA9IFtdO1xuICAgICAgdGhpcy5fY3VycmVudENvbnRlbnQgPSBbXTtcbiAgICAgIHRoaXMuX2FsbERhdGFDb250ZW50ID0gW107XG4gICAgICB0aGlzLl9zb3J0ZWRBbGxEYXRhQ29udGVudCA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9oZWFkZXJDb250ZW50ID0gdGhpcy5pbnN0YW5jZS5kYXRhWzBdO1xuICAgICAgdGhpcy5fYWxsRGF0YUNvbnRlbnQgPSB0aGlzLmluc3RhbmNlLmRhdGEuc2xpY2UoMSk7XG4gICAgICB0aGlzLl9zb3J0ZWRBbGxEYXRhQ29udGVudCA9IFsuLi50aGlzLl9hbGxEYXRhQ29udGVudF07XG4gICAgICB0aGlzLl9jdXJyZW50UGFnZSA9IDE7XG5cbiAgICAgIHRoaXMuX3BhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX2FsbERhdGFDb250ZW50Lmxlbmd0aCAvIHRoaXMucGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplKTtcbiAgICAgIHRoaXMuX2NhbkdvRm9yd2FyZCA9IHRoaXMuX3BhZ2VzID4gMTtcbiAgICB9XG4gICAgdGhpcy5fZmlsbEN1cnJlbnRDb250ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGN1cnJlbnQgZGF0YSBmb3IgdGhlIHRhYmxlLCB1c2luZyBwYWdlIGFuZCBzb3J0ZWQgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBfZmlsbEN1cnJlbnRDb250ZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zb3J0ZWRBbGxEYXRhQ29udGVudC5sZW5ndGggPT09IDAgJiYgdGhpcy5faGVhZGVyQ29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Q29udGVudCA9IFt0aGlzLl9oZWFkZXJDb250ZW50XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RhcnQgPSAodGhpcy5fY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplO1xuICAgICAgdGhpcy5fY3VycmVudENvbnRlbnQgPSBbXG4gICAgICAgIHRoaXMuX2hlYWRlckNvbnRlbnQsXG4gICAgICAgIC4uLnRoaXMuX3NvcnRlZEFsbERhdGFDb250ZW50LnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplKSxcbiAgICAgIF07XG4gICAgfVxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGFqZi1maWx0ZXItd2lkZ2V0XG4gICpuZ0lmPVwiaW5zdGFuY2UgJiYgaW5zdGFuY2UuZmlsdGVyXCJcbiAgW2luc3RhbmNlXT1cImluc3RhbmNlXCJcbiAgKGZpbHRlcmVkSW5zdGFuY2UpPVwiaW5zdGFuY2UgPSAkZXZlbnRcIlxuICAoZmlsdGVyV2lkZ2V0Q2hhbmdlKT1cImZpbHRlcldpZGdldENoYW5nZWQoJGV2ZW50KVwiXG4+XG48L2FqZi1maWx0ZXItd2lkZ2V0PlxuPG5nLXRlbXBsYXRlIGFqZi13aWRnZXQtaG9zdD48L25nLXRlbXBsYXRlPlxuIiwiPGRpdiAqbmdJZj1cImluc3RhbmNlXCIgY2xhc3M9XCJhamYtY29sdW1uLWNvbnRhaW5lclwiPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3IG9mIGluc3RhbmNlLmNvbnRlbnRcIj5cbiAgICA8YWpmLXdpZGdldCBbaW5zdGFuY2VdPVwid1wiPlxuICAgIDwvYWpmLXdpZGdldD5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiIsIjxkaXYgKm5nSWY9XCJpbnN0YW5jZVwiIGNsYXNzPVwiYWpmLWNvbHVtbnNcIj5cbiAgPGRpdlxuICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBpbnN0YW5jZS53aWRnZXQuY29sdW1uczsgbGV0IGlkeCA9IGluZGV4XCJcbiAgICAgIFtuZ1N0eWxlXT1cInsnZmxleC1ncm93JzogY29sdW1uID4gLTEgPyAxIDogbnVsbCwgJ2ZsZXgtYmFzaXMnIDogY29sdW1uID4gLTEgPyAoY29sdW1uICogMTAwKSArICclJyA6IG51bGx9XCJcbiAgICAgIGNsYXNzPVwiYWpmLWNvbHVtblwiXG4gID5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFsbGNvbHVtbnNSZW5kZXJlZCR8YXN5bmNcIj5cbiAgICA8YWpmLXdpZGdldCAqbmdJZj1cIihpbnN0YW5jZXxhamZHZXRDb2x1bW5Db250ZW50OmlkeCkgYXMgY2NcIiBbaW5zdGFuY2VdPVwiY2MhXCI+XG4gICAgPC9hamYtd2lkZ2V0PlxuICA8L25nLWNvbnRhaW5lcj5cbiA8L2Rpdj5cbjwvZGl2PlxuIiwiPGEgKm5nSWY9XCJpbnN0YW5jZVwiIGNsYXNzPVwiYWpmLWRpYWxvZy10b2dnbGVcIiAoY2xpY2spPVwib3BlbkRpYWxvZygpXCI+XG4gIDxhamYtd2lkZ2V0IFtpbnN0YW5jZV09XCJpbnN0YW5jZS50b2dnbGVcIj48L2FqZi13aWRnZXQ+XG48L2E+XG48bmctdGVtcGxhdGUgI2RpYWxvZ0NvbnRlbnQ+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbnN0YW5jZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaW5zdGFuY2UuY29udGVudFwiPlxuICAgICAgPGFqZi13aWRnZXQgW2luc3RhbmNlXT1cIml0ZW1cIj48L2FqZi13aWRnZXQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiIsIjxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLWxpc3RcIiAqbmdJZj1cImluc3RhbmNlICYmIHBhZ2VzID4gMFwiPlxuICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2luYXRlZC1saXN0LXRpdGxlLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLWxpc3QtdGl0bGVcIj57eyBpbnN0YW5jZS53aWRnZXQudGl0bGUgfX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYWpmLXNwYWNlclwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLWxpc3QtcGFnaW5hdG9yXCI+XG4gICAgICA8YSAoY2xpY2spPVwiZ29Ub1BhZ2UoJ3ByZXZpb3VzJylcIiBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtbGlzdC1idG4gYWpmLXBhZ2luYXRlZC1saXN0LWJhY2stYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWpmLXBhZ2luYXRlZC1saXN0LWJ0bi1kaXNhYmxlZF09XCJjYW5Hb0JhY2t3YXJkID09PSBmYWxzZVwiPjwvYT5cbiAgICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLWxpc3QtcGFnaW5hdG9yLXBhZ2VcIj57eyBjdXJyZW50UGFnZSB9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtbGlzdC1wYWdpbmF0b3Itc2VwYXJhdG9yXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2luYXRlZC1saXN0LXBhZ2luYXRvci1wYWdlc1wiPnt7IHBhZ2VzIH19PC9kaXY+XG4gICAgICA8YSAoY2xpY2spPVwiZ29Ub1BhZ2UoJ25leHQnKVwiIGNsYXNzPVwiYWpmLXBhZ2luYXRlZC1saXN0LWJ0biBhamYtcGFnaW5hdGVkLWxpc3QtZm9yd2FyZC1idG5cIlxuICAgICAgICBbY2xhc3MuYWpmLXBhZ2luYXRlZC1saXN0LWJ0bi1kaXNhYmxlZF09XCJjYW5Hb0ZvcndhcmQgPT09IGZhbHNlXCI+PC9hPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY3VycmVudENvbnRlbnRcIj5cbiAgICA8YWpmLXdpZGdldCBbaW5zdGFuY2VdPVwiaXRlbVwiPjwvYWpmLXdpZGdldD5cbiAgPC9kaXY+XG48L2Rpdj5cbiIsIjxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlXCIgKm5nSWY9XCJpbnN0YW5jZVwiPlxuICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2luYXRlZC10YWJsZS10aXRsZS1jb250YWluZXJcIiAqbmdJZj1cInBhZ2VzID4gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2Utc2VsZWN0b3JcIj5cbiAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2Utc2VsZWN0b3ItbGFiZWxcIlxuICAgICAgICA+e3snSXRlbXMgcGVyIHBhZ2U6J3x0cmFuc2xvY299fTwvbWF0LWxhYmVsXG4gICAgICA+XG4gICAgICA8bWF0LXNlbGVjdFxuICAgICAgICBbdmFsdWVdPVwicGFnaW5hdG9yQ29uZmlnLnBhZ2VTaXplXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudC52YWx1ZSlcIlxuICAgICAgPlxuICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgIFt2YWx1ZV09XCJwYWdlU2l6ZU9wdFwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHBhZ2VTaXplT3B0IG9mIHBhZ2luYXRvckNvbmZpZy5wYWdlU2l6ZU9wdGlvbnNcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcGFnZVNpemVPcHQgfX1cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhamYtc3BhY2VyXCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtdGFibGUtcGFnaW5hdG9yXCI+XG4gICAgICA8YVxuICAgICAgICAoY2xpY2spPVwiZ29Ub1BhZ2UoJ3ByZXZpb3VzJylcIlxuICAgICAgICBjbGFzcz1cImFqZi1wYWdpbmF0ZWQtdGFibGUtYnRuIGFqZi1wYWdpbmF0ZWQtdGFibGUtYmFjay1idG5cIlxuICAgICAgICBbY2xhc3MuYWpmLXBhZ2luYXRlZC10YWJsZS1idG4tZGlzYWJsZWRdPVwiY2FuR29CYWNrd2FyZCA9PT0gZmFsc2VcIlxuICAgICAgPjwvYT5cbiAgICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2luYXRvci1wYWdlXCI+e3sgY3VycmVudFBhZ2UgfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2luYXRvci1zZXBhcmF0b3JcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhamYtcGFnaW5hdGVkLXRhYmxlLXBhZ2luYXRvci1wYWdlc1wiPnt7IHBhZ2VzIH19PC9kaXY+XG4gICAgICA8YVxuICAgICAgICAoY2xpY2spPVwiZ29Ub1BhZ2UoJ25leHQnKVwiXG4gICAgICAgIGNsYXNzPVwiYWpmLXBhZ2luYXRlZC10YWJsZS1idG4gYWpmLXBhZ2luYXRlZC10YWJsZS1mb3J3YXJkLWJ0blwiXG4gICAgICAgIFtjbGFzcy5hamYtcGFnaW5hdGVkLXRhYmxlLWJ0bi1kaXNhYmxlZF09XCJjYW5Hb0ZvcndhcmQgPT09IGZhbHNlXCJcbiAgICAgID48L2E+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiYWpmLXBhZ2luYXRlZC10YWJsZS1pdGVtXCI+XG4gICAgPGFqZi13aWRnZXQtZXhwb3J0XG4gICAgICAqbmdJZj1cImluc3RhbmNlXCJcbiAgICAgIFt3aWRnZXRUeXBlXT1cImluc3RhbmNlLndpZGdldFR5cGVcIlxuICAgICAgW2RhdGFdPVwiZXhwb3J0YWJsZUNvbnRlbnQoKVwiXG4gICAgICBbZW5hYmxlXT1cImluc3RhbmNlLmV4cG9ydGFibGVcIlxuICAgID5cbiAgICAgIDxhamYtdGFibGUgW2RhdGFdPVwiY3VycmVudENvbnRlbnRcIiAoc29ydFNlbGVjdGVkKT1cInNvcnRQYWdpbmF0ZWREYXRhKCRldmVudClcIj48L2FqZi10YWJsZT5cbiAgICA8L2FqZi13aWRnZXQtZXhwb3J0PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -19,7 +19,7 @@
19
19
  * If not, see http://www.gnu.org/licenses/.
20
20
  *
21
21
  */
22
- import { AjfSignature } from '@ajf/core/signature';
22
+ import { AjfSignature, canvasToIndexedPngDataUrl } from '@ajf/core/signature';
23
23
  import { ChangeDetectionStrategy, Component, forwardRef, ViewEncapsulation, } from '@angular/core';
24
24
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
25
25
  import * as i0 from "@angular/core";
@@ -54,8 +54,8 @@ export class AjfSignatureComponent extends AjfSignature {
54
54
  }
55
55
  this.isDrawn = false;
56
56
  this.value = {
57
- name: 'signature.webp',
58
- type: 'image/webp',
57
+ name: 'signature.png',
58
+ type: 'image/png',
59
59
  signature: true,
60
60
  size: undefined,
61
61
  content: undefined,
@@ -68,12 +68,13 @@ export class AjfSignatureComponent extends AjfSignature {
68
68
  */
69
69
  accept() {
70
70
  if (this.sigPadElement != null) {
71
- const signatureDataUrl = this.sigPadElement.toDataURL('image/webp', 0.5);
72
- const head = 'data:image/webp;base64,';
71
+ // const signatureDataUrl = this.sigPadElement.toDataURL('image/png');
72
+ const signatureDataUrl = canvasToIndexedPngDataUrl(this.sigPadElement);
73
+ const head = 'data:image/png;base64,';
73
74
  const imgFileSize = Math.round(((signatureDataUrl.length - head.length) * 3) / 4);
74
75
  this.value = {
75
- name: 'signature.webp',
76
- type: 'image/webp',
76
+ name: 'signature.png',
77
+ type: 'image/png',
77
78
  signature: true,
78
79
  size: imgFileSize,
79
80
  content: signatureDataUrl,
@@ -106,4 +107,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
106
107
  type: Component,
107
108
  args: [{ selector: 'ajf-signature', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [SIGNATURE_CONTROL_VALUE_ACCESSOR], template: "<div class=\"ajf-signature-container\">\n <p class=\"ajf-signature-text\">{{'Please sign here'|transloco}}</p>\n <canvas\n class=\"ajf-signature-canvas\"\n #sigPad\n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (touchstart)=\"onMouseDown($event)\"\n (touchmove)=\"onMouseMove($event)\"\n ></canvas>\n <div class=\"ajf-signature-actions\">\n <button mat-fab (click)=\"clear()\" class=\"ajf-signature-action-clear\">\n <mat-icon>close</mat-icon>\n </button>\n <button mat-fab (click)=\"accept()\" color=\"primary\" [disabled]=\"!isDrawn\" class=\"ajf-signature-action-accept\">\n <mat-icon>check</mat-icon>\n </button>\n </div>\n\n <img class=\"ajf-signature-preview\" [src]=\"safeImageSrc\" />\n</div>\n", styles: ["ajf-signature{display:block}ajf-signature .ajf-signature-container{width:100%;display:flex;flex-flow:column wrap;justify-content:center;align-items:center}ajf-signature .ajf-signature-container .ajf-signature-preview{max-width:200px;max-height:100px;margin:auto;padding:5px}ajf-signature .ajf-signature-container .ajf-signature-canvas{margin:auto;border-radius:10px;border:2px solid rgba(0,0,0,.4)}ajf-signature .ajf-signature-container .ajf-signature-actions{flex:1 0 auto;display:flex;flex-flow:row wrap;justify-content:space-around}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab{margin:10px}ajf-signature .ajf-signature-container .ajf-signature-actions .mdc-fab .mat-icon{margin-left:0!important}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-clear{background-color:#f53d3d99}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept{background-color:#32db6499}ajf-signature .ajf-signature-container .ajf-signature-actions .ajf-signature-action-accept[disabled=true]{background-color:#0000001f;color:#00000061}\n"] }]
108
109
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1.DomSanitizer }] });
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvc2lnbmF0dXJlL3NyYy9zaWduYXR1cmUudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9zaWduYXR1cmUvc3JjL3NpZ25hdHVyZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBR1YsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFHakQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQVE7SUFDbkQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDO0lBQ3BELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGOztHQUVHO0FBU0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFlBQVk7SUFDckQsWUFBWSxHQUFzQixFQUFFLFFBQW1CLEVBQVUsVUFBd0I7UUFDdkYsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUQwQyxlQUFVLEdBQVYsVUFBVSxDQUFjO0lBRXpGLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHO1lBQ1gsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixJQUFJLEVBQUUsWUFBWTtZQUNsQixTQUFTLEVBQUUsSUFBSTtZQUNmLElBQUksRUFBRSxTQUFTO1lBQ2YsT0FBTyxFQUFFLFNBQVM7WUFDbEIsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLFNBQVM7WUFDakMsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0IsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFekUsTUFBTSxJQUFJLEdBQUcseUJBQXlCLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVsRixJQUFJLENBQUMsS0FBSyxHQUFHO2dCQUNYLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLElBQUksRUFBRSxZQUFZO2dCQUNsQixTQUFTLEVBQUUsSUFBSTtnQkFDZixJQUFJLEVBQUUsV0FBVztnQkFDakIsT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLFNBQVM7Z0JBQ2pDLFNBQVMsRUFBRSxLQUFLO2FBQ2pCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxZQUFZO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTdELE1BQU0sTUFBTSxHQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRSxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU87SUFDVCxDQUFDOytHQXJFVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix3Q0FGckIsQ0FBQyxnQ0FBZ0MsQ0FBQyxpRENuRC9DLDZ3QkFxQkE7OzRGRGdDYSxxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZUFBZSxpQkFHVixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIEdudWNvb3Agc29jLiBjb29wLlxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLFxuICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uXG4gKlxuICovXG5cbmltcG9ydCB7QWpmU2lnbmF0dXJlfSBmcm9tICdAYWpmL2NvcmUvc2lnbmF0dXJlJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtEb21TYW5pdGl6ZXIsIFNhZmVVcmx9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5leHBvcnQgY29uc3QgU0lHTkFUVVJFX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFqZlNpZ25hdHVyZUNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuLyoqXG4gKiBBamYgc2lnbmF0dXJlIGNvbXBvbmVudC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWpmLXNpZ25hdHVyZScsXG4gIHRlbXBsYXRlVXJsOiAnc2lnbmF0dXJlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2lnbmF0dXJlLnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1NJR05BVFVSRV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmU2lnbmF0dXJlQ29tcG9uZW50IGV4dGVuZHMgQWpmU2lnbmF0dXJlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcbiAgICBzdXBlcihjZHIsIHJlbmRlcmVyKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNpZ1BhZEVsZW1lbnQgPSB0aGlzLnNpZ1BhZC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuY29udGV4dCA9IHRoaXMuc2lnUGFkRWxlbWVudD8uZ2V0Q29udGV4dCgnMmQnKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgc2lnbmF0dXJlIHZhbHVlIGFuZCBwcmV2aWV3IChrZWVwcyB0aGUgb2xkIHVybCB0byBkZWxldGUgb2xkIHNpZ25hdHVyZSBmcm9tIHN0b3JhZ2UpXG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5jb250ZXh0ICE9IG51bGwgJiYgdGhpcy5zaWdQYWRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaWdQYWRFbGVtZW50LndpZHRoLCB0aGlzLnNpZ1BhZEVsZW1lbnQuaGVpZ2h0KTtcbiAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG4gICAgdGhpcy5pc0RyYXduID0gZmFsc2U7XG4gICAgdGhpcy52YWx1ZSA9IHtcbiAgICAgIG5hbWU6ICdzaWduYXR1cmUud2VicCcsXG4gICAgICB0eXBlOiAnaW1hZ2Uvd2VicCcsXG4gICAgICBzaWduYXR1cmU6IHRydWUsXG4gICAgICBzaXplOiB1bmRlZmluZWQsXG4gICAgICBjb250ZW50OiB1bmRlZmluZWQsXG4gICAgICB1cmw6IHRoaXMudmFsdWU/LnVybCA/PyB1bmRlZmluZWQsXG4gICAgICBkZWxldGVVcmw6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHRzIHRoZSBuZXcgc2lnbmF0dXJlIGZyb20gdGhlIGNhbnZhcyBhbmQgc2V0cyBpdCBhcyBmaWVsZCB2YWx1ZSAoa2VlcHMgdGhlIG9sZCB1cmwgdG8gZGVsZXRlIG9sZCBzaWduYXR1cmUgZnJvbSBzdG9yYWdlKVxuICAgKi9cbiAgYWNjZXB0KCkge1xuICAgIGlmICh0aGlzLnNpZ1BhZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlRGF0YVVybCA9IHRoaXMuc2lnUGFkRWxlbWVudC50b0RhdGFVUkwoJ2ltYWdlL3dlYnAnLCAwLjUpO1xuXG4gICAgICBjb25zdCBoZWFkID0gJ2RhdGE6aW1hZ2Uvd2VicDtiYXNlNjQsJztcbiAgICAgIGNvbnN0IGltZ0ZpbGVTaXplID0gTWF0aC5yb3VuZCgoKHNpZ25hdHVyZURhdGFVcmwubGVuZ3RoIC0gaGVhZC5sZW5ndGgpICogMykgLyA0KTtcblxuICAgICAgdGhpcy52YWx1ZSA9IHtcbiAgICAgICAgbmFtZTogJ3NpZ25hdHVyZS53ZWJwJyxcbiAgICAgICAgdHlwZTogJ2ltYWdlL3dlYnAnLFxuICAgICAgICBzaWduYXR1cmU6IHRydWUsXG4gICAgICAgIHNpemU6IGltZ0ZpbGVTaXplLFxuICAgICAgICBjb250ZW50OiBzaWduYXR1cmVEYXRhVXJsLFxuICAgICAgICB1cmw6IHRoaXMudmFsdWU/LnVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgIGRlbGV0ZVVybDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZXMgc2lnbmF0dXJlIGltYWdlIHVybFxuICAgKi9cbiAgZ2V0IHNhZmVJbWFnZVNyYygpOiBTYWZlVXJsIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMudmFsdWUuY29udGVudCAmJiB0aGlzLnZhbHVlLmRlbGV0ZVVybCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByYXdVcmwgPVxuICAgICAgdGhpcy52YWx1ZS5jb250ZW50ICYmIHRoaXMudmFsdWUuY29udGVudC5sZW5ndGggPyB0aGlzLnZhbHVlLmNvbnRlbnQgOiB0aGlzLnZhbHVlLnVybDtcbiAgICBpZiAoIXJhd1VybCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBzYW5pdGl6ZWRVcmwgPSB0aGlzLl9zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChyYXdVcmwpO1xuICAgIHJldHVybiBzYW5pdGl6ZWRVcmw7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhamYtc2lnbmF0dXJlLWNvbnRhaW5lclwiPlxuICA8cCBjbGFzcz1cImFqZi1zaWduYXR1cmUtdGV4dFwiPnt7J1BsZWFzZSBzaWduIGhlcmUnfHRyYW5zbG9jb319PC9wPlxuICA8Y2FudmFzXG4gICAgY2xhc3M9XCJhamYtc2lnbmF0dXJlLWNhbnZhc1wiXG4gICAgI3NpZ1BhZFxuICAgIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50KVwiXG4gICAgKG1vdXNlbW92ZSk9XCJvbk1vdXNlTW92ZSgkZXZlbnQpXCJcbiAgICAodG91Y2hzdGFydCk9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAodG91Y2htb3ZlKT1cIm9uTW91c2VNb3ZlKCRldmVudClcIlxuICA+PC9jYW52YXM+XG4gIDxkaXYgY2xhc3M9XCJhamYtc2lnbmF0dXJlLWFjdGlvbnNcIj5cbiAgICA8YnV0dG9uIG1hdC1mYWIgKGNsaWNrKT1cImNsZWFyKClcIiBjbGFzcz1cImFqZi1zaWduYXR1cmUtYWN0aW9uLWNsZWFyXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LWZhYiAoY2xpY2spPVwiYWNjZXB0KClcIiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIWlzRHJhd25cIiBjbGFzcz1cImFqZi1zaWduYXR1cmUtYWN0aW9uLWFjY2VwdFwiPlxuICAgICAgPG1hdC1pY29uPmNoZWNrPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGltZyBjbGFzcz1cImFqZi1zaWduYXR1cmUtcHJldmlld1wiIFtzcmNdPVwic2FmZUltYWdlU3JjXCIgLz5cbjwvZGl2PlxuIl19
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmF0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvc2lnbmF0dXJlL3NyYy9zaWduYXR1cmUudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9zaWduYXR1cmUvc3JjL3NpZ25hdHVyZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUseUJBQXlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBR1YsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFHakQsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQVE7SUFDbkQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDO0lBQ3BELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGOztHQUVHO0FBU0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFlBQVk7SUFDckQsWUFBWSxHQUFzQixFQUFFLFFBQW1CLEVBQVUsVUFBd0I7UUFDdkYsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUQwQyxlQUFVLEdBQVYsVUFBVSxDQUFjO0lBRXpGLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUMvQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHO1lBQ1gsSUFBSSxFQUFFLGVBQWU7WUFDckIsSUFBSSxFQUFFLFdBQVc7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxTQUFTO1lBQ2pDLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9CLHNFQUFzRTtZQUN0RSxNQUFNLGdCQUFnQixHQUFHLHlCQUF5QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUV2RSxNQUFNLElBQUksR0FBRyx3QkFBd0IsQ0FBQztZQUN0QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRWxGLElBQUksQ0FBQyxLQUFLLEdBQUc7Z0JBQ1gsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLElBQUksRUFBRSxXQUFXO2dCQUNqQixTQUFTLEVBQUUsSUFBSTtnQkFDZixJQUFJLEVBQUUsV0FBVztnQkFDakIsT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLFNBQVM7Z0JBQ2pDLFNBQVMsRUFBRSxLQUFLO2FBQ2pCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxZQUFZO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTdELE1BQU0sTUFBTSxHQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRSxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU87SUFDVCxDQUFDOytHQXRFVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix3Q0FGckIsQ0FBQyxnQ0FBZ0MsQ0FBQyxpRENuRC9DLDZ3QkFxQkE7OzRGRGdDYSxxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZUFBZSxpQkFHVixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDLENBQUMsZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIEdudWNvb3Agc29jLiBjb29wLlxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXNcbiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLFxuICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBBZmZlcm9cbiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uXG4gKlxuICovXG5cbmltcG9ydCB7QWpmU2lnbmF0dXJlLCBjYW52YXNUb0luZGV4ZWRQbmdEYXRhVXJsfSBmcm9tICdAYWpmL2NvcmUvc2lnbmF0dXJlJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBmb3J3YXJkUmVmLFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtEb21TYW5pdGl6ZXIsIFNhZmVVcmx9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5leHBvcnQgY29uc3QgU0lHTkFUVVJFX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFqZlNpZ25hdHVyZUNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlLFxufTtcblxuLyoqXG4gKiBBamYgc2lnbmF0dXJlIGNvbXBvbmVudC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWpmLXNpZ25hdHVyZScsXG4gIHRlbXBsYXRlVXJsOiAnc2lnbmF0dXJlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc2lnbmF0dXJlLnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1NJR05BVFVSRV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmU2lnbmF0dXJlQ29tcG9uZW50IGV4dGVuZHMgQWpmU2lnbmF0dXJlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcbiAgICBzdXBlcihjZHIsIHJlbmRlcmVyKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNpZ1BhZEVsZW1lbnQgPSB0aGlzLnNpZ1BhZC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuY29udGV4dCA9IHRoaXMuc2lnUGFkRWxlbWVudD8uZ2V0Q29udGV4dCgnMmQnKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgc2lnbmF0dXJlIHZhbHVlIGFuZCBwcmV2aWV3IChrZWVwcyB0aGUgb2xkIHVybCB0byBkZWxldGUgb2xkIHNpZ25hdHVyZSBmcm9tIHN0b3JhZ2UpXG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5jb250ZXh0ICE9IG51bGwgJiYgdGhpcy5zaWdQYWRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5zaWdQYWRFbGVtZW50LndpZHRoLCB0aGlzLnNpZ1BhZEVsZW1lbnQuaGVpZ2h0KTtcbiAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB9XG4gICAgdGhpcy5pc0RyYXduID0gZmFsc2U7XG4gICAgdGhpcy52YWx1ZSA9IHtcbiAgICAgIG5hbWU6ICdzaWduYXR1cmUucG5nJyxcbiAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxuICAgICAgc2lnbmF0dXJlOiB0cnVlLFxuICAgICAgc2l6ZTogdW5kZWZpbmVkLFxuICAgICAgY29udGVudDogdW5kZWZpbmVkLFxuICAgICAgdXJsOiB0aGlzLnZhbHVlPy51cmwgPz8gdW5kZWZpbmVkLFxuICAgICAgZGVsZXRlVXJsOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyB0aGUgbmV3IHNpZ25hdHVyZSBmcm9tIHRoZSBjYW52YXMgYW5kIHNldHMgaXQgYXMgZmllbGQgdmFsdWUgKGtlZXBzIHRoZSBvbGQgdXJsIHRvIGRlbGV0ZSBvbGQgc2lnbmF0dXJlIGZyb20gc3RvcmFnZSlcbiAgICovXG4gIGFjY2VwdCgpIHtcbiAgICBpZiAodGhpcy5zaWdQYWRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIGNvbnN0IHNpZ25hdHVyZURhdGFVcmwgPSB0aGlzLnNpZ1BhZEVsZW1lbnQudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZURhdGFVcmwgPSBjYW52YXNUb0luZGV4ZWRQbmdEYXRhVXJsKHRoaXMuc2lnUGFkRWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IGhlYWQgPSAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCc7XG4gICAgICBjb25zdCBpbWdGaWxlU2l6ZSA9IE1hdGgucm91bmQoKChzaWduYXR1cmVEYXRhVXJsLmxlbmd0aCAtIGhlYWQubGVuZ3RoKSAqIDMpIC8gNCk7XG5cbiAgICAgIHRoaXMudmFsdWUgPSB7XG4gICAgICAgIG5hbWU6ICdzaWduYXR1cmUucG5nJyxcbiAgICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXG4gICAgICAgIHNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgICAgc2l6ZTogaW1nRmlsZVNpemUsXG4gICAgICAgIGNvbnRlbnQ6IHNpZ25hdHVyZURhdGFVcmwsXG4gICAgICAgIHVybDogdGhpcy52YWx1ZT8udXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZGVsZXRlVXJsOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplcyBzaWduYXR1cmUgaW1hZ2UgdXJsXG4gICAqL1xuICBnZXQgc2FmZUltYWdlU3JjKCk6IFNhZmVVcmwgfCBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMudmFsdWUpIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy52YWx1ZS5jb250ZW50ICYmIHRoaXMudmFsdWUuZGVsZXRlVXJsKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJhd1VybCA9XG4gICAgICB0aGlzLnZhbHVlLmNvbnRlbnQgJiYgdGhpcy52YWx1ZS5jb250ZW50Lmxlbmd0aCA/IHRoaXMudmFsdWUuY29udGVudCA6IHRoaXMudmFsdWUudXJsO1xuICAgIGlmICghcmF3VXJsKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHNhbml0aXplZFVybCA9IHRoaXMuX3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKHJhd1VybCk7XG4gICAgcmV0dXJuIHNhbml0aXplZFVybDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHJldHVybjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFqZi1zaWduYXR1cmUtY29udGFpbmVyXCI+XG4gIDxwIGNsYXNzPVwiYWpmLXNpZ25hdHVyZS10ZXh0XCI+e3snUGxlYXNlIHNpZ24gaGVyZSd8dHJhbnNsb2NvfX08L3A+XG4gIDxjYW52YXNcbiAgICBjbGFzcz1cImFqZi1zaWduYXR1cmUtY2FudmFzXCJcbiAgICAjc2lnUGFkXG4gICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAobW91c2Vtb3ZlKT1cIm9uTW91c2VNb3ZlKCRldmVudClcIlxuICAgICh0b3VjaHN0YXJ0KT1cIm9uTW91c2VEb3duKCRldmVudClcIlxuICAgICh0b3VjaG1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiXG4gID48L2NhbnZhcz5cbiAgPGRpdiBjbGFzcz1cImFqZi1zaWduYXR1cmUtYWN0aW9uc1wiPlxuICAgIDxidXR0b24gbWF0LWZhYiAoY2xpY2spPVwiY2xlYXIoKVwiIGNsYXNzPVwiYWpmLXNpZ25hdHVyZS1hY3Rpb24tY2xlYXJcIj5cbiAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtZmFiIChjbGljayk9XCJhY2NlcHQoKVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhaXNEcmF3blwiIGNsYXNzPVwiYWpmLXNpZ25hdHVyZS1hY3Rpb24tYWNjZXB0XCI+XG4gICAgICA8bWF0LWljb24+Y2hlY2s8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8aW1nIGNsYXNzPVwiYWpmLXNpZ25hdHVyZS1wcmV2aWV3XCIgW3NyY109XCJzYWZlSW1hZ2VTcmNcIiAvPlxuPC9kaXY+XG4iXX0=
@@ -2,13 +2,14 @@ import { AjfAudio } from '@ajf/core/audio';
2
2
  import * as i0 from '@angular/core';
3
3
  import { Input, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
4
4
  import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
5
- import * as i1 from '@angular/common';
5
+ import * as i1 from '@angular/platform-browser';
6
+ import * as i2 from '@angular/common';
6
7
  import { CommonModule } from '@angular/common';
7
- import * as i2 from '@angular/material/button';
8
+ import * as i3 from '@angular/material/button';
8
9
  import { MatButtonModule } from '@angular/material/button';
9
- import * as i3 from '@angular/material/icon';
10
+ import * as i4 from '@angular/material/icon';
10
11
  import { MatIconModule } from '@angular/material/icon';
11
- import * as i4 from '@angular/material/tooltip';
12
+ import * as i5 from '@angular/material/tooltip';
12
13
  import { MatTooltipModule } from '@angular/material/tooltip';
13
14
 
14
15
  /**
@@ -33,28 +34,30 @@ import { MatTooltipModule } from '@angular/material/tooltip';
33
34
  *
34
35
  */
35
36
  class AjfAudioComponent extends AjfAudio {
36
- constructor(cdr) {
37
+ constructor(cdr, _sanitizer) {
37
38
  super(cdr);
39
+ this._sanitizer = _sanitizer;
38
40
  this.readonly = false;
39
41
  this.isRecording = false;
40
- this.audioUrl = null;
41
42
  this.mediaRecorder = null;
42
43
  this.audioChunks = [];
43
- // Keep track of object URLs to revoke them
44
- this.createdUrls = [];
45
44
  }
46
45
  ngOnDestroy() {
47
46
  this.stopRecording();
48
- this.revokeUrls();
49
47
  }
50
- // Override writeValue to handle audioUrl creation
51
- writeValue(value) {
52
- super.writeValue(value);
53
- // If we have a value (base64) but no URL, create one for playback if needed
54
- // However, for <audio src="data:..."> base64 works directly.
55
- // If the value is a blob URL, we might need handling, but here we assume base64 storage.
56
- this.audioUrl = value;
57
- this._cdr.markForCheck();
48
+ /**
49
+ * Sanitizes the audio source for playback, either from the base64 content
50
+ * or, as a fallback, from the stored url.
51
+ */
52
+ get safeAudioSrc() {
53
+ if (!this.value)
54
+ return null;
55
+ if (!this.value.content && this.value.deleteUrl)
56
+ return null;
57
+ const rawUrl = this.value.content && this.value.content.length ? this.value.content : this.value.url;
58
+ if (!rawUrl)
59
+ return null;
60
+ return this._sanitizer.bypassSecurityTrustUrl(rawUrl);
58
61
  }
59
62
  async startRecording() {
60
63
  try {
@@ -66,14 +69,21 @@ class AjfAudioComponent extends AjfAudio {
66
69
  };
67
70
  this.mediaRecorder.onstop = () => {
68
71
  const audioBlob = new Blob(this.audioChunks, { type: 'audio/webm' });
69
- // Create a temporary URL for immediate playback if needed,
70
- // but primarily we converts to base64 for value.
71
72
  const reader = new FileReader();
72
73
  reader.readAsDataURL(audioBlob);
73
74
  reader.onloadend = () => {
74
75
  const base64data = reader.result;
75
- this.value = base64data;
76
- this.audioUrl = base64data;
76
+ const head = 'data:audio/webm;base64,';
77
+ const audioFileSize = Math.round(((base64data.length - head.length) * 3) / 4);
78
+ // Keeps the old url to delete old audio from storage
79
+ this.value = {
80
+ name: 'audio.webm',
81
+ type: 'audio/webm',
82
+ size: audioFileSize,
83
+ content: base64data,
84
+ url: this.value?.url ?? undefined,
85
+ deleteUrl: false,
86
+ };
77
87
  this._cdr.markForCheck();
78
88
  };
79
89
  };
@@ -93,24 +103,29 @@ class AjfAudioComponent extends AjfAudio {
93
103
  this._cdr.markForCheck();
94
104
  }
95
105
  }
106
+ /**
107
+ * Clears the recording value and preview (keeps the old url to delete old audio from storage)
108
+ */
96
109
  clearRecording() {
97
- this.audioUrl = null;
98
110
  this.audioChunks = [];
99
- this.value = null;
111
+ this.value = {
112
+ name: 'audio.webm',
113
+ type: 'audio/webm',
114
+ size: undefined,
115
+ content: undefined,
116
+ url: this.value?.url ?? undefined,
117
+ deleteUrl: true,
118
+ };
100
119
  this._cdr.markForCheck();
101
120
  }
102
- revokeUrls() {
103
- this.createdUrls.forEach(url => URL.revokeObjectURL(url));
104
- this.createdUrls = [];
105
- }
106
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfAudioComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
121
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfAudioComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
107
122
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AjfAudioComponent, selector: "ajf-audio", inputs: { readonly: "readonly" }, providers: [
108
123
  {
109
124
  provide: NG_VALUE_ACCESSOR,
110
125
  useExisting: AjfAudioComponent,
111
126
  multi: true,
112
127
  },
113
- ], usesInheritance: true, ngImport: i0, template: "<div class=\"ajf-field-wrapper\">\n <div class=\"ajf-audio-controls\">\n <!-- Start Recording Button -->\n <button\n mat-mini-fab\n color=\"primary\"\n (click)=\"startRecording()\"\n *ngIf=\"!isRecording && !audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Start Recording\"\n >\n <mat-icon>mic</mat-icon>\n </button>\n\n <!-- Stop Recording Button -->\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"stopRecording()\"\n *ngIf=\"isRecording\"\n matTooltip=\"Stop Recording\"\n >\n <mat-icon>stop</mat-icon>\n </button>\n\n <!-- Recording Indicator -->\n <div *ngIf=\"isRecording\" class=\"recording-indicator\">\n <mat-icon>fiber_manual_record</mat-icon>\n Recording...\n </div>\n\n <!-- Playback -->\n <audio *ngIf=\"audioUrl\" [src]=\"audioUrl\" controls></audio>\n\n <!-- Delete/Reset Button -->\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"clearRecording()\"\n *ngIf=\"audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Delete Audio\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".ajf-audio-controls{display:flex;align-items:center;gap:16px;margin-top:8px}.ajf-audio-controls .recording-indicator{color:#f44336;animation:pulse 1.5s infinite;display:flex;align-items:center;gap:4px;font-weight:500}.ajf-audio-controls audio{height:36px;outline:none}@keyframes pulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
128
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"ajf-field-wrapper\">\n <div class=\"ajf-audio-controls\">\n <!-- Start Recording Button -->\n <button\n mat-mini-fab\n color=\"primary\"\n (click)=\"startRecording()\"\n *ngIf=\"!isRecording && !safeAudioSrc\"\n [disabled]=\"readonly\"\n matTooltip=\"Start Recording\"\n >\n <mat-icon>mic</mat-icon>\n </button>\n\n <!-- Stop Recording Button -->\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"stopRecording()\"\n *ngIf=\"isRecording\"\n matTooltip=\"Stop Recording\"\n >\n <mat-icon>stop</mat-icon>\n </button>\n\n <!-- Recording Indicator -->\n <div *ngIf=\"isRecording\" class=\"recording-indicator\">\n <mat-icon>fiber_manual_record</mat-icon>\n Recording...\n </div>\n\n <!-- Playback -->\n <audio *ngIf=\"safeAudioSrc\" [src]=\"safeAudioSrc\" controls></audio>\n\n <!-- Delete/Reset Button -->\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"clearRecording()\"\n *ngIf=\"safeAudioSrc\"\n [disabled]=\"readonly\"\n matTooltip=\"Delete Audio\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".ajf-audio-controls{display:flex;align-items:center;gap:16px;margin-top:8px}.ajf-audio-controls .recording-indicator{color:#f44336;animation:pulse 1.5s infinite;display:flex;align-items:center;gap:4px;font-weight:500}.ajf-audio-controls audio{height:36px;outline:none}@keyframes pulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
114
129
  }
115
130
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AjfAudioComponent, decorators: [{
116
131
  type: Component,
@@ -120,8 +135,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
120
135
  useExisting: AjfAudioComponent,
121
136
  multi: true,
122
137
  },
123
- ], template: "<div class=\"ajf-field-wrapper\">\n <div class=\"ajf-audio-controls\">\n <!-- Start Recording Button -->\n <button\n mat-mini-fab\n color=\"primary\"\n (click)=\"startRecording()\"\n *ngIf=\"!isRecording && !audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Start Recording\"\n >\n <mat-icon>mic</mat-icon>\n </button>\n\n <!-- Stop Recording Button -->\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"stopRecording()\"\n *ngIf=\"isRecording\"\n matTooltip=\"Stop Recording\"\n >\n <mat-icon>stop</mat-icon>\n </button>\n\n <!-- Recording Indicator -->\n <div *ngIf=\"isRecording\" class=\"recording-indicator\">\n <mat-icon>fiber_manual_record</mat-icon>\n Recording...\n </div>\n\n <!-- Playback -->\n <audio *ngIf=\"audioUrl\" [src]=\"audioUrl\" controls></audio>\n\n <!-- Delete/Reset Button -->\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"clearRecording()\"\n *ngIf=\"audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Delete Audio\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".ajf-audio-controls{display:flex;align-items:center;gap:16px;margin-top:8px}.ajf-audio-controls .recording-indicator{color:#f44336;animation:pulse 1.5s infinite;display:flex;align-items:center;gap:4px;font-weight:500}.ajf-audio-controls audio{height:36px;outline:none}@keyframes pulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"] }]
124
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { readonly: [{
138
+ ], template: "<div class=\"ajf-field-wrapper\">\n <div class=\"ajf-audio-controls\">\n <!-- Start Recording Button -->\n <button\n mat-mini-fab\n color=\"primary\"\n (click)=\"startRecording()\"\n *ngIf=\"!isRecording && !safeAudioSrc\"\n [disabled]=\"readonly\"\n matTooltip=\"Start Recording\"\n >\n <mat-icon>mic</mat-icon>\n </button>\n\n <!-- Stop Recording Button -->\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"stopRecording()\"\n *ngIf=\"isRecording\"\n matTooltip=\"Stop Recording\"\n >\n <mat-icon>stop</mat-icon>\n </button>\n\n <!-- Recording Indicator -->\n <div *ngIf=\"isRecording\" class=\"recording-indicator\">\n <mat-icon>fiber_manual_record</mat-icon>\n Recording...\n </div>\n\n <!-- Playback -->\n <audio *ngIf=\"safeAudioSrc\" [src]=\"safeAudioSrc\" controls></audio>\n\n <!-- Delete/Reset Button -->\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"clearRecording()\"\n *ngIf=\"safeAudioSrc\"\n [disabled]=\"readonly\"\n matTooltip=\"Delete Audio\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".ajf-audio-controls{display:flex;align-items:center;gap:16px;margin-top:8px}.ajf-audio-controls .recording-indicator{color:#f44336;animation:pulse 1.5s infinite;display:flex;align-items:center;gap:4px;font-weight:500}.ajf-audio-controls audio{height:36px;outline:none}@keyframes pulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}\n"] }]
139
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }], propDecorators: { readonly: [{
125
140
  type: Input
126
141
  }] } });
127
142
 
@@ -1 +1 @@
1
- {"version":3,"file":"ajf-material-audio.mjs","sources":["../../../projects/material/audio/src/audio.ts","../../../projects/material/audio/src/audio.html","../../../projects/material/audio/src/audio-module.ts","../../../projects/material/audio/src/public_api.ts","../../../projects/material/audio/index.ts","../../../projects/material/audio/ajf-material-audio.ts"],"sourcesContent":["/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nimport {AjfAudio} from '@ajf/core/audio';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n ViewEncapsulation,\n} from '@angular/core';\nimport {NG_VALUE_ACCESSOR} from '@angular/forms';\n\n@Component({\n selector: 'ajf-audio',\n templateUrl: 'audio.html',\n styleUrls: ['audio.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: AjfAudioComponent,\n multi: true,\n },\n ],\n})\nexport class AjfAudioComponent extends AjfAudio implements OnDestroy {\n @Input() readonly = false;\n\n isRecording = false;\n audioUrl: string | null = null;\n private mediaRecorder: MediaRecorder | null = null;\n private audioChunks: any[] = [];\n // Keep track of object URLs to revoke them\n private createdUrls: string[] = [];\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\n\n ngOnDestroy(): void {\n this.stopRecording();\n this.revokeUrls();\n }\n\n // Override writeValue to handle audioUrl creation\n override writeValue(value: string | null): void {\n super.writeValue(value);\n // If we have a value (base64) but no URL, create one for playback if needed\n // However, for <audio src=\"data:...\"> base64 works directly.\n // If the value is a blob URL, we might need handling, but here we assume base64 storage.\n this.audioUrl = value;\n this._cdr.markForCheck();\n }\n\n async startRecording() {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({audio: true});\n this.mediaRecorder = new MediaRecorder(stream);\n this.audioChunks = [];\n\n this.mediaRecorder.ondataavailable = event => {\n this.audioChunks.push(event.data);\n };\n\n this.mediaRecorder.onstop = () => {\n const audioBlob = new Blob(this.audioChunks, {type: 'audio/webm'});\n // Create a temporary URL for immediate playback if needed,\n // but primarily we converts to base64 for value.\n\n const reader = new FileReader();\n reader.readAsDataURL(audioBlob);\n reader.onloadend = () => {\n const base64data = reader.result as string;\n this.value = base64data;\n this.audioUrl = base64data;\n this._cdr.markForCheck();\n };\n };\n\n this.mediaRecorder.start();\n this.isRecording = true;\n this._cdr.markForCheck();\n } catch (err) {\n console.error('Error accessing microphone:', err);\n }\n }\n\n stopRecording() {\n if (this.mediaRecorder && this.isRecording) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.mediaRecorder.stream.getTracks().forEach(track => track.stop());\n this._cdr.markForCheck();\n }\n }\n\n clearRecording() {\n this.audioUrl = null;\n this.audioChunks = [];\n this.value = null;\n this._cdr.markForCheck();\n }\n\n private revokeUrls() {\n this.createdUrls.forEach(url => URL.revokeObjectURL(url));\n this.createdUrls = [];\n }\n}\n","<div class=\"ajf-field-wrapper\">\n <div class=\"ajf-audio-controls\">\n <!-- Start Recording Button -->\n <button\n mat-mini-fab\n color=\"primary\"\n (click)=\"startRecording()\"\n *ngIf=\"!isRecording && !audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Start Recording\"\n >\n <mat-icon>mic</mat-icon>\n </button>\n\n <!-- Stop Recording Button -->\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"stopRecording()\"\n *ngIf=\"isRecording\"\n matTooltip=\"Stop Recording\"\n >\n <mat-icon>stop</mat-icon>\n </button>\n\n <!-- Recording Indicator -->\n <div *ngIf=\"isRecording\" class=\"recording-indicator\">\n <mat-icon>fiber_manual_record</mat-icon>\n Recording...\n </div>\n\n <!-- Playback -->\n <audio *ngIf=\"audioUrl\" [src]=\"audioUrl\" controls></audio>\n\n <!-- Delete/Reset Button -->\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"clearRecording()\"\n *ngIf=\"audioUrl\"\n [disabled]=\"readonly\"\n matTooltip=\"Delete Audio\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n</div>\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatTooltipModule} from '@angular/material/tooltip';\n\nimport {AjfAudioComponent} from './audio';\nimport {FormsModule} from '@angular/forms';\n\n@NgModule({\n imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule],\n declarations: [AjfAudioComponent],\n exports: [AjfAudioComponent],\n})\nexport class AjfAudioModule {}\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nexport * from './audio';\nexport * from './audio-module';\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nexport * from './src/public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ajf-material-audio.mjs","sources":["../../../projects/material/audio/src/audio.ts","../../../projects/material/audio/src/audio.html","../../../projects/material/audio/src/audio-module.ts","../../../projects/material/audio/src/public_api.ts","../../../projects/material/audio/index.ts","../../../projects/material/audio/ajf-material-audio.ts"],"sourcesContent":["/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nimport {AjfAudio} from '@ajf/core/audio';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n ViewEncapsulation,\n} from '@angular/core';\nimport {NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {DomSanitizer, SafeUrl} from '@angular/platform-browser';\n\n@Component({\n selector: 'ajf-audio',\n templateUrl: 'audio.html',\n styleUrls: ['audio.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: AjfAudioComponent,\n multi: true,\n },\n ],\n})\nexport class AjfAudioComponent extends AjfAudio implements OnDestroy {\n @Input() readonly = false;\n\n isRecording = false;\n private mediaRecorder: MediaRecorder | null = null;\n private audioChunks: any[] = [];\n\n constructor(cdr: ChangeDetectorRef, private _sanitizer: DomSanitizer) {\n super(cdr);\n }\n\n ngOnDestroy(): void {\n this.stopRecording();\n }\n\n /**\n * Sanitizes the audio source for playback, either from the base64 content\n * or, as a fallback, from the stored url.\n */\n get safeAudioSrc(): SafeUrl | string | null {\n if (!this.value) return null;\n if (!this.value.content && this.value.deleteUrl) return null;\n\n const rawUrl =\n this.value.content && this.value.content.length ? this.value.content : this.value.url;\n if (!rawUrl) return null;\n\n return this._sanitizer.bypassSecurityTrustUrl(rawUrl);\n }\n\n async startRecording() {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({audio: true});\n this.mediaRecorder = new MediaRecorder(stream);\n this.audioChunks = [];\n\n this.mediaRecorder.ondataavailable = event => {\n this.audioChunks.push(event.data);\n };\n\n this.mediaRecorder.onstop = () => {\n const audioBlob = new Blob(this.audioChunks, {type: 'audio/webm'});\n\n const reader = new FileReader();\n reader.readAsDataURL(audioBlob);\n reader.onloadend = () => {\n const base64data = reader.result as string;\n const head = 'data:audio/webm;base64,';\n const audioFileSize = Math.round(((base64data.length - head.length) * 3) / 4);\n // Keeps the old url to delete old audio from storage\n this.value = {\n name: 'audio.webm',\n type: 'audio/webm',\n size: audioFileSize,\n content: base64data,\n url: this.value?.url ?? undefined,\n deleteUrl: false,\n };\n this._cdr.markForCheck();\n };\n };\n\n this.mediaRecorder.start();\n this.isRecording = true;\n this._cdr.markForCheck();\n } catch (err) {\n console.error('Error accessing microphone:', err);\n }\n }\n\n stopRecording() {\n if (this.mediaRecorder && this.isRecording) {\n this.mediaRecorder.stop();\n this.isRecording = false;\n this.mediaRecorder.stream.getTracks().forEach(track => track.stop());\n this._cdr.markForCheck();\n }\n }\n\n /**\n * Clears the recording value and preview (keeps the old url to delete old audio from storage)\n */\n clearRecording(): void {\n this.audioChunks = [];\n this.value = {\n name: 'audio.webm',\n type: 'audio/webm',\n size: undefined,\n content: undefined,\n url: this.value?.url ?? undefined,\n deleteUrl: true,\n };\n this._cdr.markForCheck();\n }\n}\n","<div class=\"ajf-field-wrapper\">\n <div class=\"ajf-audio-controls\">\n <!-- Start Recording Button -->\n <button\n mat-mini-fab\n color=\"primary\"\n (click)=\"startRecording()\"\n *ngIf=\"!isRecording && !safeAudioSrc\"\n [disabled]=\"readonly\"\n matTooltip=\"Start Recording\"\n >\n <mat-icon>mic</mat-icon>\n </button>\n\n <!-- Stop Recording Button -->\n <button\n mat-mini-fab\n color=\"warn\"\n (click)=\"stopRecording()\"\n *ngIf=\"isRecording\"\n matTooltip=\"Stop Recording\"\n >\n <mat-icon>stop</mat-icon>\n </button>\n\n <!-- Recording Indicator -->\n <div *ngIf=\"isRecording\" class=\"recording-indicator\">\n <mat-icon>fiber_manual_record</mat-icon>\n Recording...\n </div>\n\n <!-- Playback -->\n <audio *ngIf=\"safeAudioSrc\" [src]=\"safeAudioSrc\" controls></audio>\n\n <!-- Delete/Reset Button -->\n <button\n mat-icon-button\n color=\"warn\"\n (click)=\"clearRecording()\"\n *ngIf=\"safeAudioSrc\"\n [disabled]=\"readonly\"\n matTooltip=\"Delete Audio\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n</div>\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatTooltipModule} from '@angular/material/tooltip';\n\nimport {AjfAudioComponent} from './audio';\nimport {FormsModule} from '@angular/forms';\n\n@NgModule({\n imports: [CommonModule, FormsModule, MatButtonModule, MatIconModule, MatTooltipModule],\n declarations: [AjfAudioComponent],\n exports: [AjfAudioComponent],\n})\nexport class AjfAudioModule {}\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nexport * from './audio';\nexport * from './audio-module';\n","/**\n * @license\n * Copyright (C) Gnucoop soc. coop.\n *\n * This file is part of the Advanced JSON forms (ajf).\n *\n * Advanced JSON forms (ajf) is free software: you can redistribute it and/or\n * modify it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n * General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with Advanced JSON forms (ajf).\n * If not, see http://www.gnu.org/licenses/.\n *\n */\n\nexport * from './src/public_api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -533,7 +533,7 @@ class AjfFormBuilderService {
533
533
  },
534
534
  {
535
535
  label: 'Date',
536
- nodeType: { node: AjfNodeType.AjfField, field: AjfFieldType.Date },
536
+ nodeType: { node: AjfNodeType.AjfField, field: AjfFieldType.DateRange },
537
537
  },
538
538
  {
539
539
  label: 'Date input',