design-angular-kit
Version:
Un toolkit Angular conforme alle linee guida di design per i servizi web della PA
142 lines • 21.6 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, inject, Input, Output, ViewChild, } from '@angular/core';
import { ItAbstractComponent } from '../../../abstracts/abstract.component';
import { ItFileUtils } from '../../../utils/file-utils';
import { ProgressDonut } from 'bootstrap-italia';
import { ItIconComponent } from '../../utils/icon/icon.component';
import { NgOptimizedImage } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { IT_ASSET_BASE_PATH } from '../../../interfaces/design-angular-kit-config';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
export class ItUploadDragDropComponent extends ItAbstractComponent {
constructor() {
super();
/**
* The accepted file type to upload <br>
* Possible values: <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types">MIME Types</a> separated by comma
* @example application/pdf,image/png
* @default *
*/
this.accept = '*';
/**
* Fired when file start to upload
*/
this.fileStartUpload = new EventEmitter();
this.isDragover = false;
this.isLoading = false;
this.isSuccess = false;
this.assetBasePath = inject(IT_ASSET_BASE_PATH);
}
ngAfterViewInit() {
super.ngAfterViewInit();
if (this.donutElement) {
this.donut = ProgressDonut.getOrCreateInstance(this.donutElement.nativeElement);
}
}
// Dragover listener
onDragOver(evt) {
evt.preventDefault();
evt.stopPropagation();
this.isDragover = !this.isLoading;
}
// Dragleave listener
onDragLeave(evt) {
evt.preventDefault();
evt.stopPropagation();
this.isDragover = false;
}
// Drop leave listener
onDrop(evt) {
evt.preventDefault();
evt.stopPropagation();
this.isDragover = false;
const files = evt.dataTransfer?.files;
if (this.isLoading || !files?.length) {
return;
}
this.start(files[0]);
}
/**
* On load file from input
* @param event
*/
onLoadFile(event) {
const files = event.target?.files;
if (!files?.length) {
return;
}
this.start(files[0]);
}
/**
* Start the upload file
* @param file
*/
start(file) {
if (this.accept !== '*' && !this.accept.includes(file.type)) {
return;
}
this.reset();
this.isLoading = true;
const splitName = file.name.split('.');
this.filename = splitName[0];
this.extension = splitName[1]?.toUpperCase();
this.fileSize = ItFileUtils.getFileSizeString(file);
this.fileStartUpload.emit(file);
}
/**
* Percentage of upload
* @param value the percentage [0 - 100]
*/
progress(value) {
if (!this.isLoading) {
return;
}
if (value >= 100) {
this.success();
}
else {
this.donut?.set((value < 0 ? 0 : value) / 100);
}
}
/**
* Upload success
*/
success() {
this.isLoading = false;
this.isSuccess = true;
this._changeDetectorRef.detectChanges();
}
/**
* Reset file uploader
*/
reset() {
this.isLoading = false;
this.isSuccess = false;
this.filename = this.extension = this.fileSize = undefined;
this.donut?.set(0);
this._changeDetectorRef.detectChanges();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItUploadDragDropComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItUploadDragDropComponent, isStandalone: true, selector: "it-upload-drag-drop", inputs: { accept: "accept" }, outputs: { fileStartUpload: "fileStartUpload" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "drop": "onDrop($event)" } }, viewQueries: [{ propertyName: "donutElement", first: true, predicate: ["donutElement"], descendants: true }], exportAs: ["itUploadDragDrop"], usesInheritance: true, ngImport: i0, template: "<div class=\"upload-dragdrop\" [class.dragover]=\"isDragover\" [class.loading]=\"isLoading\" [class.success]=\"isSuccess\">\n <div class=\"upload-dragdrop-image\">\n <img\n [ngSrc]=\"assetBasePath + '/dist/assets/upload-drag-drop-icon.svg'\"\n alt=\"drag-drop-icon\"\n aria-hidden=\"true\"\n [width]=\"180\"\n [height]=\"180\" />\n <div class=\"upload-dragdrop-loading\">\n <div class=\"progress-donut\" #donutElement></div>\n </div>\n <div class=\"upload-dragdrop-success\">\n <it-icon name=\"check\"></it-icon>\n </div>\n </div>\n <div class=\"upload-dragdrop-text\">\n <p class=\"upload-dragdrop-weight\">\n <it-icon name=\"file\" size=\"xs\"></it-icon>\n {{ extension }} ({{ fileSize }})\n </p>\n <h5>{{ filename || ('it.form.upload-drag-file' | translate) }}</h5>\n @if (isLoading) {\n <p>{{ 'it.form.upload-loading' | translate }}</p>\n }\n @if (isSuccess) {\n <p>{{ 'it.form.upload-complete' | translate }}</p>\n }\n @if (!isLoading && !isSuccess) {\n <p>\n {{ 'it.form.upload-or' | translate }}\n <input type=\"file\" [id]=\"id\" class=\"upload-dragdrop-input\" [accept]=\"accept\" (change)=\"onLoadFile($event)\" />\n <label [for]=\"id\">{{ 'it.form.upload-select-device' | translate }}</label>\n </p>\n }\n </div>\n</div>\n", dependencies: [{ kind: "component", type: ItIconComponent, selector: "it-icon", inputs: ["name", "size", "color", "padded", "svgClass", "title", "labelWaria"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItUploadDragDropComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'it-upload-drag-drop', exportAs: 'itUploadDragDrop', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ItIconComponent, TranslateModule, NgOptimizedImage], template: "<div class=\"upload-dragdrop\" [class.dragover]=\"isDragover\" [class.loading]=\"isLoading\" [class.success]=\"isSuccess\">\n <div class=\"upload-dragdrop-image\">\n <img\n [ngSrc]=\"assetBasePath + '/dist/assets/upload-drag-drop-icon.svg'\"\n alt=\"drag-drop-icon\"\n aria-hidden=\"true\"\n [width]=\"180\"\n [height]=\"180\" />\n <div class=\"upload-dragdrop-loading\">\n <div class=\"progress-donut\" #donutElement></div>\n </div>\n <div class=\"upload-dragdrop-success\">\n <it-icon name=\"check\"></it-icon>\n </div>\n </div>\n <div class=\"upload-dragdrop-text\">\n <p class=\"upload-dragdrop-weight\">\n <it-icon name=\"file\" size=\"xs\"></it-icon>\n {{ extension }} ({{ fileSize }})\n </p>\n <h5>{{ filename || ('it.form.upload-drag-file' | translate) }}</h5>\n @if (isLoading) {\n <p>{{ 'it.form.upload-loading' | translate }}</p>\n }\n @if (isSuccess) {\n <p>{{ 'it.form.upload-complete' | translate }}</p>\n }\n @if (!isLoading && !isSuccess) {\n <p>\n {{ 'it.form.upload-or' | translate }}\n <input type=\"file\" [id]=\"id\" class=\"upload-dragdrop-input\" [accept]=\"accept\" (change)=\"onLoadFile($event)\" />\n <label [for]=\"id\">{{ 'it.form.upload-select-device' | translate }}</label>\n </p>\n }\n </div>\n</div>\n" }]
}], ctorParameters: () => [], propDecorators: { accept: [{
type: Input
}], fileStartUpload: [{
type: Output
}], donutElement: [{
type: ViewChild,
args: ['donutElement']
}], onDragOver: [{
type: HostListener,
args: ['dragover', ['$event']]
}], onDragLeave: [{
type: HostListener,
args: ['dragleave', ['$event']]
}], onDrop: [{
type: HostListener,
args: ['drop', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWRyYWctZHJvcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vdXBsb2FkLWRyYWctZHJvcC91cGxvYWQtZHJhZy1kcm9wLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS91cGxvYWQtZHJhZy1kcm9wL3VwbG9hZC1kcmFnLWRyb3AuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDOzs7QUFVbkYsTUFBTSxPQUFPLHlCQUEwQixTQUFRLG1CQUFtQjtJQWdDaEU7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQWhDVjs7Ozs7V0FLRztRQUNNLFdBQU0sR0FBVyxHQUFHLENBQUM7UUFFOUI7O1dBRUc7UUFDTyxvQkFBZSxHQUFH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QUF4QixNQUFNO2dCQVE0QixZQUFZO3NCQUE5QyxTQUFTO3VCQUFDLGNBQWM7Z0JBMEJsQixVQUFVO3NCQURoQixZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFTN0IsV0FBVztzQkFEakIsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzlCLE1BQU07c0JBRFosWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSXRBYnN0cmFjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Fic3RyYWN0cy9hYnN0cmFjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSXRGaWxlVXRpbHMgfSBmcm9tICcuLi8uLi8uLi91dGlscy9maWxlLXV0aWxzJztcbmltcG9ydCB7IFByb2dyZXNzRG9udXQgfSBmcm9tICdib290c3RyYXAtaXRhbGlhJztcbmltcG9ydCB7IEl0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmdPcHRpbWl6ZWRJbWFnZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElUX0FTU0VUX0JBU0VfUEFUSCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZGVzaWduLWFuZ3VsYXIta2l0LWNvbmZpZyc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2l0LXVwbG9hZC1kcmFnLWRyb3AnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkLWRyYWctZHJvcC5jb21wb25lbnQuaHRtbCcsXG4gIGV4cG9ydEFzOiAnaXRVcGxvYWREcmFnRHJvcCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbSXRJY29uQ29tcG9uZW50LCBUcmFuc2xhdGVNb2R1bGUsIE5nT3B0aW1pemVkSW1hZ2VdLFxufSlcbmV4cG9ydCBjbGFzcyBJdFVwbG9hZERyYWdEcm9wQ29tcG9uZW50IGV4dGVuZHMgSXRBYnN0cmFjdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAvKipcbiAgICogVGhlIGFjY2VwdGVkIGZpbGUgdHlwZSB0byB1cGxvYWQgPGJyPlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6IDxhIGhyZWY9XCJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0Jhc2ljc19vZl9IVFRQL01JTUVfdHlwZXMvQ29tbW9uX3R5cGVzXCI+TUlNRSBUeXBlczwvYT4gc2VwYXJhdGVkIGJ5IGNvbW1hXG4gICAqIEBleGFtcGxlIGFwcGxpY2F0aW9uL3BkZixpbWFnZS9wbmdcbiAgICogQGRlZmF1bHQgKlxuICAgKi9cbiAgQElucHV0KCkgYWNjZXB0OiBzdHJpbmcgPSAnKic7XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gZmlsZSBzdGFydCB0byB1cGxvYWRcbiAgICovXG4gIEBPdXRwdXQoKSBmaWxlU3RhcnRVcGxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7XG5cbiAgcHJvdGVjdGVkIGlzRHJhZ292ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgaXNTdWNjZXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGRvbnV0PzogUHJvZ3Jlc3NEb251dDtcblxuICBAVmlld0NoaWxkKCdkb251dEVsZW1lbnQnKSBwcml2YXRlIGRvbnV0RWxlbWVudD86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCBmaWxlbmFtZT86IHN0cmluZztcbiAgcHJvdGVjdGVkIGV4dGVuc2lvbj86IHN0cmluZztcbiAgcHJvdGVjdGVkIGZpbGVTaXplPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYm9vdHN0cmFwLWl0YWxpYSBhc3NldCBmb2xkZXIgcGF0aFxuICAgKiBAZGVmYXVsdCAuL2Jvb3RzdHJhcC1pdGFsaWFcbiAgICovXG4gIHByb3RlY3RlZCBhc3NldEJhc2VQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFzc2V0QmFzZVBhdGggPSBpbmplY3QoSVRfQVNTRVRfQkFTRV9QQVRIKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICBpZiAodGhpcy5kb251dEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZG9udXQgPSBQcm9ncmVzc0RvbnV0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcy5kb251dEVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHJhZ292ZXIgbGlzdGVuZXJcbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKVxuICBwdWJsaWMgb25EcmFnT3ZlcihldnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzRHJhZ292ZXIgPSAhdGhpcy5pc0xvYWRpbmc7XG4gIH1cblxuICAvLyBEcmFnbGVhdmUgbGlzdGVuZXJcbiAgQEhvc3RMaXN0ZW5lcignZHJhZ2xlYXZlJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uRHJhZ0xlYXZlKGV2dDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNEcmFnb3ZlciA9IGZhbHNlO1xuICB9XG5cbiAgLy8gRHJvcCBsZWF2ZSBsaXN0ZW5lclxuICBASG9zdExpc3RlbmVyKCdkcm9wJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uRHJvcChldnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuaXNEcmFnb3ZlciA9IGZhbHNlO1xuICAgIGNvbnN0IGZpbGVzID0gZXZ0LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nIHx8ICFmaWxlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhcnQoZmlsZXNbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIGxvYWQgZmlsZSBmcm9tIGlucHV0XG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgb25Mb2FkRmlsZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk/LmZpbGVzO1xuICAgIGlmICghZmlsZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0KGZpbGVzWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgdXBsb2FkIGZpbGVcbiAgICogQHBhcmFtIGZpbGVcbiAgICovXG4gIHB1YmxpYyBzdGFydChmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWNjZXB0ICE9PSAnKicgJiYgIXRoaXMuYWNjZXB0LmluY2x1ZGVzKGZpbGUudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgY29uc3Qgc3BsaXROYW1lID0gZmlsZS5uYW1lLnNwbGl0KCcuJyk7XG4gICAgdGhpcy5maWxlbmFtZSA9IHNwbGl0TmFtZVswXTtcbiAgICB0aGlzLmV4dGVuc2lvbiA9IHNwbGl0TmFtZVsxXT8udG9VcHBlckNhc2UoKTtcbiAgICB0aGlzLmZpbGVTaXplID0gSXRGaWxlVXRpbHMuZ2V0RmlsZVNpemVTdHJpbmcoZmlsZSk7XG5cbiAgICB0aGlzLmZpbGVTdGFydFVwbG9hZC5lbWl0KGZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmNlbnRhZ2Ugb2YgdXBsb2FkXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgcGVyY2VudGFnZSBbMCAtIDEwMF1cbiAgICovXG4gIHB1YmxpYyBwcm9ncmVzcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA+PSAxMDApIHtcbiAgICAgIHRoaXMuc3VjY2VzcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvbnV0Py5zZXQoKHZhbHVlIDwgMCA/IDAgOiB2YWx1ZSkgLyAxMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgc3VjY2Vzc1xuICAgKi9cbiAgcHVibGljIHN1Y2Nlc3MoKTogdm9pZCB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzU3VjY2VzcyA9IHRydWU7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGZpbGUgdXBsb2FkZXJcbiAgICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgdGhpcy5maWxlbmFtZSA9IHRoaXMuZXh0ZW5zaW9uID0gdGhpcy5maWxlU2l6ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRvbnV0Py5zZXQoMCk7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidXBsb2FkLWRyYWdkcm9wXCIgW2NsYXNzLmRyYWdvdmVyXT1cImlzRHJhZ292ZXJcIiBbY2xhc3MubG9hZGluZ109XCJpc0xvYWRpbmdcIiBbY2xhc3Muc3VjY2Vzc109XCJpc1N1Y2Nlc3NcIj5cbiAgPGRpdiBjbGFzcz1cInVwbG9hZC1kcmFnZHJvcC1pbWFnZVwiPlxuICAgIDxpbWdcbiAgICAgIFtuZ1NyY109XCJhc3NldEJhc2VQYXRoICsgJy9kaXN0L2Fzc2V0cy91cGxvYWQtZHJhZy1kcm9wLWljb24uc3ZnJ1wiXG4gICAgICBhbHQ9XCJkcmFnLWRyb3AtaWNvblwiXG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgW3dpZHRoXT1cIjE4MFwiXG4gICAgICBbaGVpZ2h0XT1cIjE4MFwiIC8+XG4gICAgPGRpdiBjbGFzcz1cInVwbG9hZC1kcmFnZHJvcC1sb2FkaW5nXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZG9udXRcIiAjZG9udXRFbGVtZW50PjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtZHJhZ2Ryb3Atc3VjY2Vzc1wiPlxuICAgICAgPGl0LWljb24gbmFtZT1cImNoZWNrXCI+PC9pdC1pY29uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInVwbG9hZC1kcmFnZHJvcC10ZXh0XCI+XG4gICAgPHAgY2xhc3M9XCJ1cGxvYWQtZHJhZ2Ryb3Atd2VpZ2h0XCI+XG4gICAgICA8aXQtaWNvbiBuYW1lPVwiZmlsZVwiIHNpemU9XCJ4c1wiPjwvaXQtaWNvbj5cbiAgICAgIHt7IGV4dGVuc2lvbiB9fSAoe3sgZmlsZVNpemUgfX0pXG4gICAgPC9wPlxuICAgIDxoNT57eyBmaWxlbmFtZSB8fCAoJ2l0LmZvcm0udXBsb2FkLWRyYWctZmlsZScgfCB0cmFuc2xhdGUpIH19PC9oNT5cbiAgICBAaWYgKGlzTG9hZGluZykge1xuICAgICAgPHA+e3sgJ2l0LmZvcm0udXBsb2FkLWxvYWRpbmcnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgIH1cbiAgICBAaWYgKGlzU3VjY2Vzcykge1xuICAgICAgPHA+e3sgJ2l0LmZvcm0udXBsb2FkLWNvbXBsZXRlJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICB9XG4gICAgQGlmICghaXNMb2FkaW5nICYmICFpc1N1Y2Nlc3MpIHtcbiAgICAgIDxwPlxuICAgICAgICB7eyAnaXQuZm9ybS51cGxvYWQtb3InIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIFtpZF09XCJpZFwiIGNsYXNzPVwidXBsb2FkLWRyYWdkcm9wLWlucHV0XCIgW2FjY2VwdF09XCJhY2NlcHRcIiAoY2hhbmdlKT1cIm9uTG9hZEZpbGUoJGV2ZW50KVwiIC8+XG4gICAgICAgIDxsYWJlbCBbZm9yXT1cImlkXCI+e3sgJ2l0LmZvcm0udXBsb2FkLXNlbGVjdC1kZXZpY2UnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDwvcD5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=