onshore-forms 0.0.13 → 0.0.15
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.
- package/esm2020/lib/components/form-image-item/form-image-item.component.mjs +60 -61
- package/esm2020/lib/components/image-chooser/image-chooser.component.mjs +116 -0
- package/esm2020/lib/components/image-placeholder/image-placeholder.component.mjs +41 -0
- package/esm2020/lib/components/webcam/webcam.component.mjs +83 -0
- package/esm2020/lib/models/form.models.mjs +1 -1
- package/esm2020/lib/onshore-forms.module.mjs +37 -11
- package/esm2020/lib/validators/form.validators.mjs +2 -2
- package/esm2020/public-api.mjs +4 -1
- package/fesm2015/onshore-forms.mjs +338 -94
- package/fesm2015/onshore-forms.mjs.map +1 -1
- package/fesm2020/onshore-forms.mjs +334 -94
- package/fesm2020/onshore-forms.mjs.map +1 -1
- package/lib/components/form-image-item/form-image-item.component.d.ts +14 -18
- package/lib/components/image-chooser/image-chooser.component.d.ts +34 -0
- package/lib/components/image-placeholder/image-placeholder.component.d.ts +15 -0
- package/lib/components/webcam/webcam.component.d.ts +33 -0
- package/lib/models/form.models.d.ts +12 -0
- package/lib/onshore-forms.module.d.ts +35 -30
- package/package.json +3 -1
- package/public-api.d.ts +3 -0
- package/styles/scss/main.css +1 -1
- package/styles/scss/theme1.css +1 -1
|
@@ -1,33 +1,40 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, Self } from '@angular/core';
|
|
2
|
+
import { OnshoreFormTemplateLayout } from '../../enums/form.enums';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
import * as i1 from "@angular/forms";
|
|
4
5
|
import * as i2 from "primeng/dynamicdialog";
|
|
5
6
|
import * as i3 from "@ngx-translate/core";
|
|
6
7
|
import * as i4 from "@angular/common";
|
|
7
8
|
import * as i5 from "primeng/button";
|
|
8
|
-
import * as i6 from "primeng/
|
|
9
|
-
import * as i7 from "
|
|
9
|
+
import * as i6 from "primeng/dialog";
|
|
10
|
+
import * as i7 from "../image-placeholder/image-placeholder.component";
|
|
11
|
+
import * as i8 from "../form-item-container/form-item-container.component";
|
|
12
|
+
import * as i9 from "../image-chooser/image-chooser.component";
|
|
13
|
+
import * as i10 from "../webcam/webcam.component";
|
|
10
14
|
export class OnshoreFormImageItemComponent {
|
|
11
15
|
constructor(cdr, ngControl, dialogService, translate) {
|
|
12
16
|
this.cdr = cdr;
|
|
13
17
|
this.ngControl = ngControl;
|
|
14
18
|
this.dialogService = dialogService;
|
|
15
19
|
this.translate = translate;
|
|
16
|
-
this.inverseColor = false;
|
|
17
|
-
// Image updload params
|
|
18
|
-
this.imageWidth = 400;
|
|
19
|
-
this.imageHeight = 400;
|
|
20
|
-
this.containWithinAspectRatio = false;
|
|
21
|
-
this.aspectRatio = 1 / 1;
|
|
22
|
-
this.disableImageSelection = false;
|
|
23
|
-
this.disableWebcamSelection = false;
|
|
24
|
-
this.disableMediaSelection = false;
|
|
25
|
-
this.disableDelete = false;
|
|
26
|
-
this.imagePlaceholder = '';
|
|
27
|
-
this.mediaType = '';
|
|
28
20
|
this.imageDeleted = new EventEmitter();
|
|
29
21
|
this.imageCleared = new EventEmitter();
|
|
30
|
-
this.
|
|
22
|
+
this.imageReady = new EventEmitter();
|
|
23
|
+
this.selectFromMedia = new EventEmitter();
|
|
24
|
+
this.isLoading = new EventEmitter();
|
|
25
|
+
this.OnshoreFormTemplateLayout = OnshoreFormTemplateLayout;
|
|
26
|
+
this.defaultImageSettings = {
|
|
27
|
+
imageWidth: 400,
|
|
28
|
+
imageHeight: 400,
|
|
29
|
+
containWithinAspectRatio: false,
|
|
30
|
+
aspectRatio: 1 / 1,
|
|
31
|
+
imageSelectionEnabled: true,
|
|
32
|
+
webcamSelectionEnabled: true,
|
|
33
|
+
mediaSelectionEnabled: true,
|
|
34
|
+
deleteEnabled: true,
|
|
35
|
+
placeholderImage: '',
|
|
36
|
+
placeholderIcon: 'fa fa-image fa-10x'
|
|
37
|
+
};
|
|
31
38
|
this.image = '';
|
|
32
39
|
this.disabled = false;
|
|
33
40
|
this.webcamDialogVisible = false;
|
|
@@ -43,6 +50,7 @@ export class OnshoreFormImageItemComponent {
|
|
|
43
50
|
this.cdr.markForCheck();
|
|
44
51
|
this.ngControl?.control?.setValue(this.image);
|
|
45
52
|
this.ngControl?.control?.markAsDirty();
|
|
53
|
+
this.imageReady.emit(this.image);
|
|
46
54
|
}, 500);
|
|
47
55
|
}
|
|
48
56
|
}
|
|
@@ -54,27 +62,10 @@ export class OnshoreFormImageItemComponent {
|
|
|
54
62
|
this.cdr.markForCheck();
|
|
55
63
|
this.ngControl?.control?.setValue(this.image);
|
|
56
64
|
this.ngControl?.control?.markAsDirty();
|
|
65
|
+
this.imageReady.emit(this.image);
|
|
57
66
|
}, 500);
|
|
58
67
|
}
|
|
59
68
|
}
|
|
60
|
-
/*searchMedia() {
|
|
61
|
-
this.dialogService.open(SearchMediaComponent,{
|
|
62
|
-
styleClass: 'p-dialog-background-white',
|
|
63
|
-
modal: true,
|
|
64
|
-
header: this.translate.instant('search.media.dialogTitle'),
|
|
65
|
-
data: { targetType: this.mediaType }
|
|
66
|
-
}).onClose.subscribe((result) => {
|
|
67
|
-
if(result) {
|
|
68
|
-
this.image = result.url;
|
|
69
|
-
setTimeout(() => {
|
|
70
|
-
this.cdr.markForCheck();
|
|
71
|
-
this.ngControl?.control?.setValue(this.image);
|
|
72
|
-
this.ngControl?.control?.markAsDirty();
|
|
73
|
-
this.imageSelectedFromMedia.next(result);
|
|
74
|
-
}, 500);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
}*/
|
|
78
69
|
removeImage() {
|
|
79
70
|
if (this.image && !this.image.includes('base64')) {
|
|
80
71
|
this.imageDeleted.emit(this.image);
|
|
@@ -93,6 +84,7 @@ export class OnshoreFormImageItemComponent {
|
|
|
93
84
|
if (obj == null) {
|
|
94
85
|
this.image = '';
|
|
95
86
|
}
|
|
87
|
+
this.imageReady.emit(this.image);
|
|
96
88
|
this.cdr.markForCheck();
|
|
97
89
|
}
|
|
98
90
|
registerOnChange(fn) {
|
|
@@ -107,8 +99,8 @@ export class OnshoreFormImageItemComponent {
|
|
|
107
99
|
this.cdr.markForCheck();
|
|
108
100
|
}
|
|
109
101
|
ngOnInit() {
|
|
110
|
-
if (this.ngControl
|
|
111
|
-
this.ngControl
|
|
102
|
+
if (this.ngControl?.control?.value == '' && this.formTemplate.default != undefined) {
|
|
103
|
+
this.ngControl?.control?.setValue(this.formTemplate.default);
|
|
112
104
|
this.cdr.markForCheck();
|
|
113
105
|
}
|
|
114
106
|
}
|
|
@@ -116,48 +108,55 @@ export class OnshoreFormImageItemComponent {
|
|
|
116
108
|
this.subscriptions.forEach((subscription) => {
|
|
117
109
|
subscription.unsubscribe();
|
|
118
110
|
});
|
|
119
|
-
this.ngControl
|
|
111
|
+
this.ngControl?.control?.disable();
|
|
120
112
|
this.image = null;
|
|
121
113
|
}
|
|
114
|
+
ngOnChanges(changes) {
|
|
115
|
+
const imageSettings = changes['imageSettings']?.currentValue;
|
|
116
|
+
if (imageSettings) {
|
|
117
|
+
if (!imageSettings.imageWidth || !imageSettings.imageHeight) {
|
|
118
|
+
this.imageSettings.imageWidth = this.defaultImageSettings.imageWidth;
|
|
119
|
+
this.imageSettings.imageHeight = this.defaultImageSettings.imageHeight;
|
|
120
|
+
}
|
|
121
|
+
if (!imageSettings.placeholderIcon)
|
|
122
|
+
this.imageSettings.placeholderIcon = this.defaultImageSettings.placeholderIcon;
|
|
123
|
+
if (!imageSettings.aspectRatio)
|
|
124
|
+
this.imageSettings.aspectRatio = this.defaultImageSettings.aspectRatio;
|
|
125
|
+
if (!imageSettings.containWithinAspectRatio)
|
|
126
|
+
this.imageSettings.containWithinAspectRatio = this.defaultImageSettings.containWithinAspectRatio;
|
|
127
|
+
if (!imageSettings.imageSelectionEnabled)
|
|
128
|
+
this.imageSettings.imageSelectionEnabled = this.defaultImageSettings.imageSelectionEnabled;
|
|
129
|
+
if (!imageSettings.mediaSelectionEnabled)
|
|
130
|
+
this.imageSettings.mediaSelectionEnabled = this.defaultImageSettings.mediaSelectionEnabled;
|
|
131
|
+
if (!imageSettings.webcamSelectionEnabled)
|
|
132
|
+
this.imageSettings.webcamSelectionEnabled = this.defaultImageSettings.webcamSelectionEnabled;
|
|
133
|
+
if (!imageSettings.deleteEnabled)
|
|
134
|
+
this.imageSettings.deleteEnabled = this.defaultImageSettings.deleteEnabled;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
122
137
|
}
|
|
123
138
|
OnshoreFormImageItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: OnshoreFormImageItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }, { token: i2.DialogService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
124
|
-
OnshoreFormImageItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: OnshoreFormImageItemComponent, selector: "onshore-form-image-item", inputs: { formTemplate: "formTemplate",
|
|
139
|
+
OnshoreFormImageItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: OnshoreFormImageItemComponent, selector: "onshore-form-image-item", inputs: { formTemplate: "formTemplate", imageSettings: "imageSettings" }, outputs: { imageDeleted: "imageDeleted", imageCleared: "imageCleared", imageReady: "imageReady", selectFromMedia: "selectFromMedia", isLoading: "isLoading" }, usesOnChanges: true, ngImport: i0, template: "<onshore-form-item-container [formTemplate]=\"formTemplate\" [ngControl]=\"ngControl\">\n <div class=\"w-full flex align-items-center flex-wrap\">\n\n <div class=\"position-relative flex justify-content-center align-items-center onshore-border-gray-4 border-solid border-1\" style=\"background-color: white\">\n <onshore-image-placeholder\n class=\"w-full\"\n [image]=\"image\"\n imageStyle=\"position: absolut; height: 250px; width: 250px\"\n [placeholderIcon]=\"imageSettings.placeholderIcon\"\n [placeholderImage]=\"imageSettings.placeholderImage\"\n placeholderStyle=\"width: 250px; height: 250px\">\n </onshore-image-placeholder>\n </div>\n\n <div class=\"flex flex-column m-4\">\n <button pButton\n type=\"button\"\n [hidden]=\"!imageSettings.imageSelectionEnabled\"\n icon=\"fa fa-image\"\n [label]=\"'form.imageControl.uploadImageButton' | translate\"\n class=\"onshore-button-primary mb-2\"\n [disabled]=\"disabled\"\n (click)=\"imageChooserDialogVisible = true; cdr.detectChanges()\">\n </button>\n\n <button pButton\n type=\"button\"\n [hidden]=\"!imageSettings.webcamSelectionEnabled\"\n icon=\"fa fa-camera\"\n [label]=\"'form.imageControl.webcamImageButton' | translate\"\n class=\"onshore-button-light mb-2\"\n [disabled]=\"disabled\"\n (click)=\"webcamDialogVisible = true\">\n </button>\n\n <button pButton\n type=\"button\"\n [hidden]=\"!imageSettings.mediaSelectionEnabled\"\n icon=\"fa fa-photo-video\"\n [label]=\"'form.imageControl.mediaImageButton' | translate\"\n class=\"onshore-button-light mb-2\"\n [disabled]=\"disabled\"\n (click)=\"selectFromMedia.emit()\">\n </button>\n\n <button pButton\n type=\"button\"\n [hidden]=\"!imageSettings.deleteEnabled\"\n icon=\"fa fa-eraser\"\n [label]=\"'form.imageControl.removeImageButton' | translate\"\n class=\"onshore-button-light\"\n (click)=\"removeImage()\"\n [disabled]=\"!image || disabled\">\n </button>\n\n </div>\n\n </div>\n</onshore-form-item-container>\n\n<p-dialog [header]=\"'form.imageControl.uploadImageTitle' | translate\" [(visible)]=\"imageChooserDialogVisible\" [modal]=\"true\" [style]=\"{'max-width': '50vw'}\">\n <onshore-image-chooser\n (choosen)=\"getFileImage($event)\"\n (canceled)=\"imageChooserDialogVisible = false\"\n [resizeToWidth]=\"imageSettings.imageWidth\"\n [resizeToHeight]=\"imageSettings.imageHeight\"\n [containWithinAspectRatio]=\"imageSettings.containWithinAspectRatio\"\n [aspectRatio]=\"imageSettings.aspectRatio\"\n backgroundColor=\"transparent\">\n </onshore-image-chooser>\n</p-dialog>\n\n<p-dialog [header]=\"'form.imageControl.webacmImageTitle' | translate\" [(visible)]=\"webcamDialogVisible\" [modal]=\"true\" [style]=\"{'max-width': '50vw'}\">\n <onshore-webcam *ngIf=\"webcamDialogVisible\" (shot)=\"getWebcamImage($event)\" (canceled)=\"webcamDialogVisible = false\"></onshore-webcam>\n</p-dialog>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i6.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "component", type: i7.OnshoreImagePlaceholderComponent, selector: "onshore-image-placeholder", inputs: ["placeholderIcon", "placeholderImage", "image", "imageStyle", "placeholderStyle", "showLoader"] }, { kind: "component", type: i8.OnshoreFormItemContainer, selector: "onshore-form-item-container", inputs: ["formTemplate", "ngControl"] }, { kind: "component", type: i9.OnshoreImageChooserComponent, selector: "onshore-image-chooser", inputs: ["imageQuality", "resizeToHeight", "resizeToWidth", "backgroundColor", "format", "alignImage", "containWithinAspectRatio", "aspectRatio", "cropperPreviewHeight", "cropperPreviewWidth", "circleCropper", "autoSave", "inverseColor"], outputs: ["choosen", "canceled"] }, { kind: "component", type: i10.WebcamComponent, selector: "onshore-webcam", inputs: ["inverseColor", "imageQuality", "resizeToHeight", "resizeToWidth", "backgroundColor", "format", "alignImage", "containWithinAspectRatio", "aspectRatio", "cropperPreviewHeight", "cropperPreviewWidth", "circleCropper"], outputs: ["shot", "canceled"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
125
140
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: OnshoreFormImageItemComponent, decorators: [{
|
|
126
141
|
type: Component,
|
|
127
|
-
args: [{ selector: 'onshore-form-image-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<
|
|
142
|
+
args: [{ selector: 'onshore-form-image-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<onshore-form-item-container [formTemplate]=\"formTemplate\" [ngControl]=\"ngControl\">\n <div class=\"w-full flex align-items-center flex-wrap\">\n\n <div class=\"position-relative flex justify-content-center align-items-center onshore-border-gray-4 border-solid border-1\" style=\"background-color: white\">\n <onshore-image-placeholder\n class=\"w-full\"\n [image]=\"image\"\n imageStyle=\"position: absolut; height: 250px; width: 250px\"\n [placeholderIcon]=\"imageSettings.placeholderIcon\"\n [placeholderImage]=\"imageSettings.placeholderImage\"\n placeholderStyle=\"width: 250px; height: 250px\">\n </onshore-image-placeholder>\n </div>\n\n <div class=\"flex flex-column m-4\">\n <button pButton\n type=\"button\"\n [hidden]=\"!imageSettings.imageSelectionEnabled\"\n icon=\"fa fa-image\"\n [label]=\"'form.imageControl.uploadImageButton' | translate\"\n class=\"onshore-button-primary mb-2\"\n [disabled]=\"disabled\"\n (click)=\"imageChooserDialogVisible = true; cdr.detectChanges()\">\n </button>\n\n <button pButton\n type=\"button\"\n [hidden]=\"!imageSettings.webcamSelectionEnabled\"\n icon=\"fa fa-camera\"\n [label]=\"'form.imageControl.webcamImageButton' | translate\"\n class=\"onshore-button-light mb-2\"\n [disabled]=\"disabled\"\n (click)=\"webcamDialogVisible = true\">\n </button>\n\n <button pButton\n type=\"button\"\n [hidden]=\"!imageSettings.mediaSelectionEnabled\"\n icon=\"fa fa-photo-video\"\n [label]=\"'form.imageControl.mediaImageButton' | translate\"\n class=\"onshore-button-light mb-2\"\n [disabled]=\"disabled\"\n (click)=\"selectFromMedia.emit()\">\n </button>\n\n <button pButton\n type=\"button\"\n [hidden]=\"!imageSettings.deleteEnabled\"\n icon=\"fa fa-eraser\"\n [label]=\"'form.imageControl.removeImageButton' | translate\"\n class=\"onshore-button-light\"\n (click)=\"removeImage()\"\n [disabled]=\"!image || disabled\">\n </button>\n\n </div>\n\n </div>\n</onshore-form-item-container>\n\n<p-dialog [header]=\"'form.imageControl.uploadImageTitle' | translate\" [(visible)]=\"imageChooserDialogVisible\" [modal]=\"true\" [style]=\"{'max-width': '50vw'}\">\n <onshore-image-chooser\n (choosen)=\"getFileImage($event)\"\n (canceled)=\"imageChooserDialogVisible = false\"\n [resizeToWidth]=\"imageSettings.imageWidth\"\n [resizeToHeight]=\"imageSettings.imageHeight\"\n [containWithinAspectRatio]=\"imageSettings.containWithinAspectRatio\"\n [aspectRatio]=\"imageSettings.aspectRatio\"\n backgroundColor=\"transparent\">\n </onshore-image-chooser>\n</p-dialog>\n\n<p-dialog [header]=\"'form.imageControl.webacmImageTitle' | translate\" [(visible)]=\"webcamDialogVisible\" [modal]=\"true\" [style]=\"{'max-width': '50vw'}\">\n <onshore-webcam *ngIf=\"webcamDialogVisible\" (shot)=\"getWebcamImage($event)\" (canceled)=\"webcamDialogVisible = false\"></onshore-webcam>\n</p-dialog>\n" }]
|
|
128
143
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NgControl, decorators: [{
|
|
129
144
|
type: Self
|
|
130
145
|
}, {
|
|
131
146
|
type: Optional
|
|
132
147
|
}] }, { type: i2.DialogService }, { type: i3.TranslateService }]; }, propDecorators: { formTemplate: [{
|
|
133
148
|
type: Input
|
|
134
|
-
}],
|
|
135
|
-
type: Input
|
|
136
|
-
}], imageWidth: [{
|
|
137
|
-
type: Input
|
|
138
|
-
}], imageHeight: [{
|
|
139
|
-
type: Input
|
|
140
|
-
}], containWithinAspectRatio: [{
|
|
141
|
-
type: Input
|
|
142
|
-
}], aspectRatio: [{
|
|
143
|
-
type: Input
|
|
144
|
-
}], disableImageSelection: [{
|
|
145
|
-
type: Input
|
|
146
|
-
}], disableWebcamSelection: [{
|
|
147
|
-
type: Input
|
|
148
|
-
}], disableMediaSelection: [{
|
|
149
|
-
type: Input
|
|
150
|
-
}], disableDelete: [{
|
|
151
|
-
type: Input
|
|
152
|
-
}], imagePlaceholder: [{
|
|
153
|
-
type: Input
|
|
154
|
-
}], mediaType: [{
|
|
149
|
+
}], imageSettings: [{
|
|
155
150
|
type: Input
|
|
156
151
|
}], imageDeleted: [{
|
|
157
152
|
type: Output
|
|
158
153
|
}], imageCleared: [{
|
|
159
154
|
type: Output
|
|
160
|
-
}],
|
|
155
|
+
}], imageReady: [{
|
|
156
|
+
type: Output
|
|
157
|
+
}], selectFromMedia: [{
|
|
158
|
+
type: Output
|
|
159
|
+
}], isLoading: [{
|
|
161
160
|
type: Output
|
|
162
161
|
}] } });
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbWFnZS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uc2hvcmUtZm9ybXMvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0taW1hZ2UtaXRlbS9mb3JtLWltYWdlLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25zaG9yZS1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1pbWFnZS1pdGVtL2Zvcm0taW1hZ2UtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUM5QixRQUFRLEVBQUUsTUFBTSxFQUNoQixJQUFJLEVBQ0wsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQVl2QixNQUFNLE9BQU8sNkJBQTZCO0lBd0h4QyxZQUFvQixHQUFzQixFQUNILFNBQW9CLEVBQ3hDLGFBQTRCLEVBQzNCLFNBQTJCO1FBSDNCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ0gsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQXpIdEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFdkMsdUJBQXVCO1FBQ2QsZUFBVSxHQUFXLEdBQUcsQ0FBQztRQUN6QixnQkFBVyxHQUFXLEdBQUcsQ0FBQztRQUMxQiw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDakMsZ0JBQVcsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLDBCQUFxQixHQUF3QixLQUFLLENBQUM7UUFDbkQsMkJBQXNCLEdBQXdCLEtBQUssQ0FBQztRQUNwRCwwQkFBcUIsR0FBd0IsS0FBSyxDQUFDO1FBQ25ELGtCQUFhLEdBQXdCLEtBQUssQ0FBQztRQUMzQyxxQkFBZ0Is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SztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsXG4gIE9wdGlvbmFsLCBPdXRwdXQsXG4gIFNlbGZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE9uc2hvcmVGb3JtVGVtcGxhdGVJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Zvcm0ubW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb25zaG9yZS1mb3JtLWltYWdlLWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1pbWFnZS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE9uc2hvcmVGb3JtSW1hZ2VJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZm9ybVRlbXBsYXRlITogT25zaG9yZUZvcm1UZW1wbGF0ZUl0ZW07XG4gIEBJbnB1dCgpIGludmVyc2VDb2xvcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIEltYWdlIHVwZGxvYWQgcGFyYW1zXG4gIEBJbnB1dCgpIGltYWdlV2lkdGg6IG51bWJlciA9IDQwMDtcbiAgQElucHV0KCkgaW1hZ2VIZWlnaHQ6IG51bWJlciA9IDQwMDtcbiAgQElucHV0KCkgY29udGFpbldpdGhpbkFzcGVjdFJhdGlvID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFzcGVjdFJhdGlvOiBudW1iZXIgPSAxIC8gMTtcbiAgQElucHV0KCkgZGlzYWJsZUltYWdlU2VsZWN0aW9uOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVXZWJjYW1TZWxlY3Rpb246IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZU1lZGlhU2VsZWN0aW9uOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVEZWxldGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgaW1hZ2VQbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIG1lZGlhVHlwZTogc3RyaW5nID0gJyc7XG4gIEBPdXRwdXQoKSBpbWFnZURlbGV0ZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaW1hZ2VDbGVhcmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGltYWdlU2VsZWN0ZWRGcm9tTWVkaWE6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGltYWdlID0gJyc7XG4gIGRpc2FibGVkID0gZmFsc2U7XG4gIHdlYmNhbURpYWxvZ1Zpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW1hZ2VDaG9vc2VyRGlhbG9nVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcblxuICBnZXRGaWxlSW1hZ2UoaW1hZ2U6IGFueSkge1xuICAgIHRoaXMuaW1hZ2VDaG9vc2VyRGlhbG9nVmlzaWJsZSA9IGZhbHNlO1xuICAgIGlmKGltYWdlKSB7XG4gICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMubmdDb250cm9sPy5jb250cm9sPy5zZXRWYWx1ZSh0aGlzLmltYWdlKTtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgICB9LCA1MDApO1xuICAgIH1cbiAgfVxuXG4gIGdldFdlYmNhbUltYWdlKGltYWdlOiBhbnkpIHtcbiAgICB0aGlzLndlYmNhbURpYWxvZ1Zpc2libGUgPSBmYWxzZTtcbiAgICBpZihpbWFnZSkge1xuICAgICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8uc2V0VmFsdWUodGhpcy5pbWFnZSk7XG4gICAgICAgIHRoaXMubmdDb250cm9sPy5jb250cm9sPy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfSwgNTAwKTtcbiAgICB9XG4gIH1cblxuICAvKnNlYXJjaE1lZGlhKCkge1xuICAgIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKFNlYXJjaE1lZGlhQ29tcG9uZW50LHtcbiAgICAgIHN0eWxlQ2xhc3M6ICdwLWRpYWxvZy1iYWNrZ3JvdW5kLXdoaXRlJyxcbiAgICAgIG1vZGFsOiB0cnVlLFxuICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdzZWFyY2gubWVkaWEuZGlhbG9nVGl0bGUnKSxcbiAgICAgIGRhdGE6IHsgdGFyZ2V0VHlwZTogdGhpcy5tZWRpYVR5cGUgfVxuICAgIH0pLm9uQ2xvc2Uuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmltYWdlID0gcmVzdWx0LnVybDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/LnNldFZhbHVlKHRoaXMuaW1hZ2UpO1xuICAgICAgICAgIHRoaXMubmdDb250cm9sPy5jb250cm9sPy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgIHRoaXMuaW1hZ2VTZWxlY3RlZEZyb21NZWRpYS5uZXh0KHJlc3VsdCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0qL1xuXG4gIHJlbW92ZUltYWdlKCkge1xuICAgIGlmKHRoaXMuaW1hZ2UgJiYgIXRoaXMuaW1hZ2UuaW5jbHVkZXMoJ2Jhc2U2NCcpKSB7XG4gICAgICB0aGlzLmltYWdlRGVsZXRlZC5lbWl0KHRoaXMuaW1hZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmltYWdlQ2xlYXJlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/LnNldFZhbHVlKG51bGwpO1xuICAgIHRoaXMubmdDb250cm9sPy5jb250cm9sPy5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuaW1hZ2UgPSAnJztcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgaWYob2JqICYmICFvYmouaW5jbHVkZXMoJ2Jhc2U2NCcpKSB7XG4gICAgICB0aGlzLmltYWdlID0gb2JqO1xuICAgIH1cbiAgICBpZihvYmogPT0gbnVsbCkge1xuICAgICAgdGhpcy5pbWFnZSA9ICcnO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICBpZih0aGlzLm5nQ29udHJvbC52YWx1ZSkge1xuICAgICAgdGhpcy5pbWFnZSA9IHRoaXMubmdDb250cm9sLnZhbHVlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHt9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmKHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsdWUgPT0gJycgJiYgdGhpcy5mb3JtVGVtcGxhdGUuZGVmYXVsdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5mb3JtVGVtcGxhdGUuZGVmYXVsdCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgoc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24pID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZSgpO1xuICAgIHRoaXMuaW1hZ2UgPSBudWxsO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICAgICAgICAgICAgcHVibGljIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7XG4gICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIG1iLTNcIiBzdHlsZT1cIm1heC13aWR0aDogNTAwcHhcIj5cbiAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgPGIgW2NsYXNzLnRleHQtbXV0ZWRdPVwiZGlzYWJsZWRcIiBjbGFzcz1cIm1iLTEgd2hpdGUtc3BhY2Utbm93cmFwXCI+XG4gICAgICB7e2Zvcm1UZW1wbGF0ZS5sYWJlbH19XG4gICAgICA8c3BhbiAqbmdJZj1cImZvcm1UZW1wbGF0ZS5yZXF1aXJlZFwiIGNsYXNzPVwidGwtY29sb3ItZGFuZ2VyXCI+Kjwvc3Bhbj5cbiAgICA8L2I+XG4gICAgPGkgKm5nSWY9XCJmb3JtVGVtcGxhdGUudG9vbHRpcFwiIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGUgdGwtY29sb3ItYmxhY2tcIiBbcFRvb2x0aXBdPVwiZm9ybVRlbXBsYXRlLnRvb2x0aXBcIiB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCIgW2VzY2FwZV09XCJmYWxzZVwiPjwvaT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInctMTAwXCI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZVwiPlxuICAgICAgICA8IS0tPGFwcC1pbWFnZS1wbGFjZWhvbGRlciBjbGFzcz1cInctMTAwXCIgW2ltYWdlXT1cImltYWdlXCIgaW1hZ2VTdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0OyBoZWlnaHQ6IDI1MHB4OyB3aWR0aDogMjUwcHhcIiBbcGxhY2Vob2xkZXJdPVwiZmltYWdlUGxhY2Vob2xkZXIgPyBpbWFnZVBsYWNlaG9sZGVyICsgJyBmYS0xMHgnIDogJ2ZhLWltYWdlIGZhLTEweCdcIiBwbGFjZWhvbGRlclN0eWxlPVwid2lkdGg6IDI1MHB4OyBoZWlnaHQ6IDI1MHB4XCI+PC9hcHAtaW1hZ2UtcGxhY2Vob2xkZXI+LS0+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gbXQtNCB3LTEwMFwiPlxuICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImRpc2FibGVJbWFnZVNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWltYWdlXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkJpbGQgaG9jaGxhZGVuXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tb3V0bGluZWQgdGV4dC1zZWNvbmRhcnkgbWItMlwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW1hZ2VDaG9vc2VyRGlhbG9nVmlzaWJsZSA9IHRydWVcIj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJkaXNhYmxlV2ViY2FtU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtY2FtZXJhXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkZvdG8gYXVmbmVobWVuXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tb3V0bGluZWQgdGV4dC1zZWNvbmRhcnkgbWItMlwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwid2ViY2FtRGlhbG9nVmlzaWJsZSA9IHRydWVcIj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPCEtLTxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiZGlzYWJsZU1lZGlhU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtcGhvdG8tdmlkZW9cIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiTWVkaWVudmVyd2FsdHVuZ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIHRleHQtc2Vjb25kYXJ5IG1iLTJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaE1lZGlhKClcIj5cbiAgICAgICAgPC9idXR0b24+LS0+XG5cbiAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJkaXNhYmxlRGVsZXRlXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtZXJhc2VyXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIkVudGZlcm5lblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUltYWdlKClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaW1hZ2UgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1vdXRsaW5lZCB0ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPHNtYWxsICpuZ0lmPVwiZm9ybVRlbXBsYXRlLmRlc2NyaXB0aW9uXCI+PGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZVwiPjwvaT4ge3tmb3JtVGVtcGxhdGUuZGVzY3JpcHRpb259fTwvc21hbGw+XG5cbjwvZGl2PlxuXG48IS0tXG48cC1kaWFsb2cgW2hlYWRlcl09XCInQmlsZCBhdXN3w6RobGVuJ1wiIFsodmlzaWJsZSldPVwiaW1hZ2VDaG9vc2VyRGlhbG9nVmlzaWJsZVwiIFttb2RhbF09XCJ0cnVlXCIgW3N0eWxlXT1cInsnbWF4LXdpZHRoJzogJzUwdncnfVwiPlxuICA8YXBwLWltYWdlLWNob29zZXIgYnV0dG9uTGFiZWw9XCJBdXN3w6RobGVuXCJcbiAgICAgICAgICAgICAgICAgICAgIChjaG9vc2VuKT1cImdldEZpbGVJbWFnZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgIChjYW5jZWxlZCk9XCJpbWFnZUNob29zZXJEaWFsb2dWaXNpYmxlID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgW2ludmVyc2VDb2xvcl09XCJpbnZlcnNlQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgW3Jlc2l6ZVRvV2lkdGhdPVwiaW1hZ2VXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICBbcmVzaXplVG9IZWlnaHRdPVwiaW1hZ2VIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJjb250YWluV2l0aGluQXNwZWN0UmF0aW9cIlxuICAgICAgICAgICAgICAgICAgICAgW2FzcGVjdFJhdGlvXT1cImFzcGVjdFJhdGlvXCJcbiAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cInRyYW5zcGFyZW50XCI+PC9hcHAtaW1hZ2UtY2hvb3Nlcj5cbjwvcC1kaWFsb2c+XG4tLT5cblxuPCEtLVxuPHAtZGlhbG9nIFtoZWFkZXJdPVwiJ0ZvdG8gYXVmbmVobWVuJ1wiIFsodmlzaWJsZSldPVwid2ViY2FtRGlhbG9nVmlzaWJsZVwiIFttb2RhbF09XCJ0cnVlXCIgW3N0eWxlXT1cInsnbWF4LXdpZHRoJzogJzUwdncnfVwiPlxuICA8YXBwLXdlYmNhbSAqbmdJZj1cIndlYmNhbURpYWxvZ1Zpc2libGVcIiBidXR0b25MYWJlbD1cIlNtaWxlXCIgKHNob3QpPVwiZ2V0V2ViY2FtSW1hZ2UoJGV2ZW50KVwiIChjYW5jZWxlZCk9XCJ3ZWJjYW1EaWFsb2dWaXNpYmxlID0gZmFsc2VcIiBbaW52ZXJzZUNvbG9yXT1cImludmVyc2VDb2xvclwiPjwvYXBwLXdlYmNhbT5cbjwvcC1kaWFsb2c+XG4tLT5cbiJdfQ==
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbWFnZS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uc2hvcmUtZm9ybXMvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0taW1hZ2UtaXRlbS9mb3JtLWltYWdlLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25zaG9yZS1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1pbWFnZS1pdGVtL2Zvcm0taW1hZ2UtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUM5QixRQUFRLEVBQUUsTUFBTSxFQUNoQixJQUFJLEVBQ0wsTUFBTSxlQUFlLENBQUM7QUFNdkIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7OztBQU9uRSxNQUFNLE9BQU8sNkJBQTZCO0lBZ0l4QyxZQUFtQixHQUFzQixFQUNGLFNBQW9CLEVBQ3hDLGFBQTRCLEVBQzNCLFNBQTJCO1FBSDVCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ0YsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQS9IckMsaUJBQVksR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN4RCxpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JELGVBQVUsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0RCxvQkFBZSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3hELGNBQVMsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoRSw4QkFBeUIsR0FBRyx5QkFBeUIsQ0FBQztRQUV0RCx5QkFBb0IsR0FBNkI7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R0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUM7WUFDdkksSUFBRyxDQUFDLGFBQWEsQ0FBQyxhQUFhO2dCQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUM7U0FDN0c7SUFDSCxDQUFDOzswSEE5SFUsNkJBQTZCOzhHQUE3Qiw2QkFBNkIsNlRDbkIxQyxnM0dBMkVBOzJGRHhEYSw2QkFBNkI7a0JBTHpDLFNBQVM7K0JBQ0UseUJBQXlCLG1CQUVsQix1QkFBdUIsQ0FBQyxNQUFNOzswQkFtSWxDLElBQUk7OzBCQUFJLFFBQVE7dUdBaElwQixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsXG4gIE9wdGlvbmFsLCBPdXRwdXQsXG4gIFNlbGYsIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE9uc2hvcmVGb3JtSW1hZ2VTZXR0aW5ncywgT25zaG9yZUZvcm1UZW1wbGF0ZUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvZm9ybS5tb2RlbHMnO1xuaW1wb3J0IHsgT25zaG9yZUZvcm1UZW1wbGF0ZUxheW91dCB9IGZyb20gJy4uLy4uL2VudW1zL2Zvcm0uZW51bXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvbnNob3JlLWZvcm0taW1hZ2UtaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWltYWdlLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgT25zaG9yZUZvcm1JbWFnZUl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGZvcm1UZW1wbGF0ZSE6IE9uc2hvcmVGb3JtVGVtcGxhdGVJdGVtO1xuICBASW5wdXQoKSBpbWFnZVNldHRpbmdzOiBPbnNob3JlRm9ybUltYWdlU2V0dGluZ3M7XG5cbiAgQE91dHB1dCgpIGltYWdlRGVsZXRlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBpbWFnZUNsZWFyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaW1hZ2VSZWFkeTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RGcm9tTWVkaWE6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaXNMb2FkaW5nOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgT25zaG9yZUZvcm1UZW1wbGF0ZUxheW91dCA9IE9uc2hvcmVGb3JtVGVtcGxhdGVMYXlvdXQ7XG5cbiAgZGVmYXVsdEltYWdlU2V0dGluZ3M6IE9uc2hvcmVGb3JtSW1hZ2VTZXR0aW5ncyA9IHtcbiAgICBpbWFnZVdpZHRoOiA0MDAsXG4gICAgaW1hZ2VIZWlnaHQ6IDQwMCxcbiAgICBjb250YWluV2l0aGluQXNwZWN0UmF0aW86IGZhbHNlLFxuICAgIGFzcGVjdFJhdGlvOiAxIC8gMSxcbiAgICBpbWFnZVNlbGVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgd2ViY2FtU2VsZWN0aW9uRW5hYmxlZDogdHJ1ZSxcbiAgICBtZWRpYVNlbGVjdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgZGVsZXRlRW5hYmxlZDogdHJ1ZSxcbiAgICBwbGFjZWhvbGRlckltYWdlOiAnJyxcbiAgICBwbGFjZWhvbGRlckljb246ICdmYSBmYS1pbWFnZSBmYS0xMHgnXG4gIH07XG5cbiAgaW1hZ2U6IHN0cmluZyB8IG51bGwgPSAnJztcbiAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgd2ViY2FtRGlhbG9nVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpbWFnZUNob29zZXJEaWFsb2dWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuXG4gIGdldEZpbGVJbWFnZShpbWFnZTogYW55KSB7XG4gICAgdGhpcy5pbWFnZUNob29zZXJEaWFsb2dWaXNpYmxlID0gZmFsc2U7XG4gICAgaWYoaW1hZ2UpIHtcbiAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/LnNldFZhbHVlKHRoaXMuaW1hZ2UpO1xuICAgICAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8ubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5pbWFnZVJlYWR5LmVtaXQodGhpcy5pbWFnZSk7XG4gICAgICB9LCA1MDApO1xuICAgIH1cbiAgfVxuXG4gIGdldFdlYmNhbUltYWdlKGltYWdlOiBhbnkpIHtcbiAgICB0aGlzLndlYmNhbURpYWxvZ1Zpc2libGUgPSBmYWxzZTtcbiAgICBpZihpbWFnZSkge1xuICAgICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8uc2V0VmFsdWUodGhpcy5pbWFnZSk7XG4gICAgICAgIHRoaXMubmdDb250cm9sPy5jb250cm9sPy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmltYWdlUmVhZHkuZW1pdCh0aGlzLmltYWdlKTtcbiAgICAgIH0sIDUwMCk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlSW1hZ2UoKSB7XG4gICAgaWYodGhpcy5pbWFnZSAmJiAhdGhpcy5pbWFnZS5pbmNsdWRlcygnYmFzZTY0JykpIHtcbiAgICAgIHRoaXMuaW1hZ2VEZWxldGVkLmVtaXQodGhpcy5pbWFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW1hZ2VDbGVhcmVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLm5nQ29udHJvbD8uY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgdGhpcy5pbWFnZSA9ICcnO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICBpZihvYmogJiYgIW9iai5pbmNsdWRlcygnYmFzZTY0JykpIHtcbiAgICAgIHRoaXMuaW1hZ2UgPSBvYmo7XG4gICAgfVxuICAgIGlmKG9iaiA9PSBudWxsKSB7XG4gICAgICB0aGlzLmltYWdlID0gJyc7XG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZVJlYWR5LmVtaXQodGhpcy5pbWFnZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgaWYodGhpcy5uZ0NvbnRyb2wudmFsdWUpIHtcbiAgICAgIHRoaXMuaW1hZ2UgPSB0aGlzLm5nQ29udHJvbC52YWx1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7fVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLm5nQ29udHJvbD8uY29udHJvbD8udmFsdWUgPT0gJycgJiYgdGhpcy5mb3JtVGVtcGxhdGUuZGVmYXVsdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubmdDb250cm9sPy5jb250cm9sPy5zZXRWYWx1ZSh0aGlzLmZvcm1UZW1wbGF0ZS5kZWZhdWx0KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbikgPT4ge1xuICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/LmRpc2FibGUoKTtcbiAgICB0aGlzLmltYWdlID0gbnVsbDtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCBpbWFnZVNldHRpbmdzOiBPbnNob3JlRm9ybUltYWdlU2V0dGluZ3MgPSBjaGFuZ2VzWydpbWFnZVNldHRpbmdzJ10/LmN1cnJlbnRWYWx1ZTtcbiAgICBpZihpbWFnZVNldHRpbmdzKSB7XG4gICAgICBpZighaW1hZ2VTZXR0aW5ncy5pbWFnZVdpZHRoIHx8ICFpbWFnZVNldHRpbmdzLmltYWdlSGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuaW1hZ2VTZXR0aW5ncy5pbWFnZVdpZHRoID0gdGhpcy5kZWZhdWx0SW1hZ2VTZXR0aW5ncy5pbWFnZVdpZHRoO1xuICAgICAgICB0aGlzLmltYWdlU2V0dGluZ3MuaW1hZ2VIZWlnaHQgPSB0aGlzLmRlZmF1bHRJbWFnZVNldHRpbmdzLmltYWdlSGVpZ2h0O1xuICAgICAgfVxuICAgICAgaWYoIWltYWdlU2V0dGluZ3MucGxhY2Vob2xkZXJJY29uKSB0aGlzLmltYWdlU2V0dGluZ3MucGxhY2Vob2xkZXJJY29uID0gdGhpcy5kZWZhdWx0SW1hZ2VTZXR0aW5ncy5wbGFjZWhvbGRlckljb247XG4gICAgICBpZighaW1hZ2VTZXR0aW5ncy5hc3BlY3RSYXRpbykgdGhpcy5pbWFnZVNldHRpbmdzLmFzcGVjdFJhdGlvID0gdGhpcy5kZWZhdWx0SW1hZ2VTZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgICAgIGlmKCFpbWFnZVNldHRpbmdzLmNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbykgdGhpcy5pbWFnZVNldHRpbmdzLmNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbyA9IHRoaXMuZGVmYXVsdEltYWdlU2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvO1xuICAgICAgaWYoIWltYWdlU2V0dGluZ3MuaW1hZ2VTZWxlY3Rpb25FbmFibGVkKSB0aGlzLmltYWdlU2V0dGluZ3MuaW1hZ2VTZWxlY3Rpb25FbmFibGVkID0gdGhpcy5kZWZhdWx0SW1hZ2VTZXR0aW5ncy5pbWFnZVNlbGVjdGlvbkVuYWJsZWQ7XG4gICAgICBpZighaW1hZ2VTZXR0aW5ncy5tZWRpYVNlbGVjdGlvbkVuYWJsZWQpIHRoaXMuaW1hZ2VTZXR0aW5ncy5tZWRpYVNlbGVjdGlvbkVuYWJsZWQgPSB0aGlzLmRlZmF1bHRJbWFnZVNldHRpbmdzLm1lZGlhU2VsZWN0aW9uRW5hYmxlZDtcbiAgICAgIGlmKCFpbWFnZVNldHRpbmdzLndlYmNhbVNlbGVjdGlvbkVuYWJsZWQpIHRoaXMuaW1hZ2VTZXR0aW5ncy53ZWJjYW1TZWxlY3Rpb25FbmFibGVkID0gdGhpcy5kZWZhdWx0SW1hZ2VTZXR0aW5ncy53ZWJjYW1TZWxlY3Rpb25FbmFibGVkO1xuICAgICAgaWYoIWltYWdlU2V0dGluZ3MuZGVsZXRlRW5hYmxlZCkgdGhpcy5pbWFnZVNldHRpbmdzLmRlbGV0ZUVuYWJsZWQgPSB0aGlzLmRlZmF1bHRJbWFnZVNldHRpbmdzLmRlbGV0ZUVuYWJsZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLFxuICAgICAgICAgICAgICBwdWJsaWMgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcbiAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgfVxufVxuIiwiPG9uc2hvcmUtZm9ybS1pdGVtLWNvbnRhaW5lciBbZm9ybVRlbXBsYXRlXT1cImZvcm1UZW1wbGF0ZVwiIFtuZ0NvbnRyb2xdPVwibmdDb250cm9sXCI+XG4gIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBvbnNob3JlLWJvcmRlci1ncmF5LTQgYm9yZGVyLXNvbGlkIGJvcmRlci0xXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZVwiPlxuICAgICAgPG9uc2hvcmUtaW1hZ2UtcGxhY2Vob2xkZXJcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGxcIlxuICAgICAgICBbaW1hZ2VdPVwiaW1hZ2VcIlxuICAgICAgICBpbWFnZVN0eWxlPVwicG9zaXRpb246IGFic29sdXQ7IGhlaWdodDogMjUwcHg7IHdpZHRoOiAyNTBweFwiXG4gICAgICAgIFtwbGFjZWhvbGRlckljb25dPVwiaW1hZ2VTZXR0aW5ncy5wbGFjZWhvbGRlckljb25cIlxuICAgICAgICBbcGxhY2Vob2xkZXJJbWFnZV09XCJpbWFnZVNldHRpbmdzLnBsYWNlaG9sZGVySW1hZ2VcIlxuICAgICAgICBwbGFjZWhvbGRlclN0eWxlPVwid2lkdGg6IDI1MHB4OyBoZWlnaHQ6IDI1MHB4XCI+XG4gICAgICA8L29uc2hvcmUtaW1hZ2UtcGxhY2Vob2xkZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBtLTRcIj5cbiAgICAgIDxidXR0b24gcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2hpZGRlbl09XCIhaW1hZ2VTZXR0aW5ncy5pbWFnZVNlbGVjdGlvbkVuYWJsZWRcIlxuICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtaW1hZ2VcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2Zvcm0uaW1hZ2VDb250cm9sLnVwbG9hZEltYWdlQnV0dG9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwib25zaG9yZS1idXR0b24tcHJpbWFyeSBtYi0yXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImltYWdlQ2hvb3NlckRpYWxvZ1Zpc2libGUgPSB0cnVlOyBjZHIuZGV0ZWN0Q2hhbmdlcygpXCI+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvbiBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFpbWFnZVNldHRpbmdzLndlYmNhbVNlbGVjdGlvbkVuYWJsZWRcIlxuICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtY2FtZXJhXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIidmb3JtLmltYWdlQ29udHJvbC53ZWJjYW1JbWFnZUJ1dHRvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm9uc2hvcmUtYnV0dG9uLWxpZ2h0IG1iLTJcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwid2ViY2FtRGlhbG9nVmlzaWJsZSA9IHRydWVcIj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8YnV0dG9uIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtoaWRkZW5dPVwiIWltYWdlU2V0dGluZ3MubWVkaWFTZWxlY3Rpb25FbmFibGVkXCJcbiAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLXBob3RvLXZpZGVvXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIidmb3JtLmltYWdlQ29udHJvbC5tZWRpYUltYWdlQnV0dG9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwib25zaG9yZS1idXR0b24tbGlnaHQgbWItMlwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RGcm9tTWVkaWEuZW1pdCgpXCI+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvbiBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFpbWFnZVNldHRpbmdzLmRlbGV0ZUVuYWJsZWRcIlxuICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtZXJhc2VyXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIidmb3JtLmltYWdlQ29udHJvbC5yZW1vdmVJbWFnZUJ1dHRvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm9uc2hvcmUtYnV0dG9uLWxpZ2h0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUltYWdlKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWltYWdlIHx8IGRpc2FibGVkXCI+XG4gICAgICA8L2J1dHRvbj5cblxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuPC9vbnNob3JlLWZvcm0taXRlbS1jb250YWluZXI+XG5cbjxwLWRpYWxvZyBbaGVhZGVyXT1cIidmb3JtLmltYWdlQ29udHJvbC51cGxvYWRJbWFnZVRpdGxlJyB8IHRyYW5zbGF0ZVwiIFsodmlzaWJsZSldPVwiaW1hZ2VDaG9vc2VyRGlhbG9nVmlzaWJsZVwiIFttb2RhbF09XCJ0cnVlXCIgW3N0eWxlXT1cInsnbWF4LXdpZHRoJzogJzUwdncnfVwiPlxuICA8b25zaG9yZS1pbWFnZS1jaG9vc2VyXG4gICAgICAgICAgICAgICAgICAgICAoY2hvb3Nlbik9XCJnZXRGaWxlSW1hZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAoY2FuY2VsZWQpPVwiaW1hZ2VDaG9vc2VyRGlhbG9nVmlzaWJsZSA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtyZXNpemVUb1dpZHRoXT1cImltYWdlU2V0dGluZ3MuaW1hZ2VXaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICBbcmVzaXplVG9IZWlnaHRdPVwiaW1hZ2VTZXR0aW5ncy5pbWFnZUhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICBbY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXT1cImltYWdlU2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXCJcbiAgICAgICAgICAgICAgICAgICAgIFthc3BlY3RSYXRpb109XCJpbWFnZVNldHRpbmdzLmFzcGVjdFJhdGlvXCJcbiAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cInRyYW5zcGFyZW50XCI+XG4gIDwvb25zaG9yZS1pbWFnZS1jaG9vc2VyPlxuPC9wLWRpYWxvZz5cblxuPHAtZGlhbG9nIFtoZWFkZXJdPVwiJ2Zvcm0uaW1hZ2VDb250cm9sLndlYmFjbUltYWdlVGl0bGUnIHwgdHJhbnNsYXRlXCIgWyh2aXNpYmxlKV09XCJ3ZWJjYW1EaWFsb2dWaXNpYmxlXCIgW21vZGFsXT1cInRydWVcIiBbc3R5bGVdPVwieydtYXgtd2lkdGgnOiAnNTB2dyd9XCI+XG4gIDxvbnNob3JlLXdlYmNhbSAqbmdJZj1cIndlYmNhbURpYWxvZ1Zpc2libGVcIiAoc2hvdCk9XCJnZXRXZWJjYW1JbWFnZSgkZXZlbnQpXCIgKGNhbmNlbGVkKT1cIndlYmNhbURpYWxvZ1Zpc2libGUgPSBmYWxzZVwiPjwvb25zaG9yZS13ZWJjYW0+XG48L3AtZGlhbG9nPlxuIl19
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { OnshoreImageError } from '../../enums/form.enums';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "primeng/button";
|
|
6
|
+
import * as i3 from "primeng/api";
|
|
7
|
+
import * as i4 from "ngx-image-cropper";
|
|
8
|
+
import * as i5 from "@ngx-translate/core";
|
|
9
|
+
export class OnshoreImageChooserComponent {
|
|
10
|
+
constructor(cdr) {
|
|
11
|
+
this.cdr = cdr;
|
|
12
|
+
this.drag = false;
|
|
13
|
+
this.image = '';
|
|
14
|
+
this.finalImage = '';
|
|
15
|
+
this.imageErrorType = OnshoreImageError;
|
|
16
|
+
this.imageError = OnshoreImageError.none;
|
|
17
|
+
this.imageQuality = 100;
|
|
18
|
+
this.resizeToHeight = 400;
|
|
19
|
+
this.resizeToWidth = 400;
|
|
20
|
+
this.backgroundColor = 'white';
|
|
21
|
+
this.format = 'png';
|
|
22
|
+
this.alignImage = 'center';
|
|
23
|
+
this.containWithinAspectRatio = false;
|
|
24
|
+
this.aspectRatio = 1 / 1;
|
|
25
|
+
this.cropperPreviewHeight = 200;
|
|
26
|
+
this.cropperPreviewWidth = 200;
|
|
27
|
+
this.circleCropper = false;
|
|
28
|
+
this.autoSave = true;
|
|
29
|
+
this.inverseColor = false;
|
|
30
|
+
this.choosen = new EventEmitter();
|
|
31
|
+
this.canceled = new EventEmitter();
|
|
32
|
+
}
|
|
33
|
+
clear() {
|
|
34
|
+
this.image = '';
|
|
35
|
+
this.finalImage = '';
|
|
36
|
+
this.imageError = OnshoreImageError.none;
|
|
37
|
+
}
|
|
38
|
+
fileChange(event) {
|
|
39
|
+
this.imageError = OnshoreImageError.none;
|
|
40
|
+
const target = event.target;
|
|
41
|
+
const file = target?.files ? target?.files[0] : null;
|
|
42
|
+
if (file?.type != 'image/png' && file?.type != 'image/jpeg' && file?.type != 'image/webp') {
|
|
43
|
+
this.imageError = OnshoreImageError.fileType;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (file?.size > 6400000) {
|
|
47
|
+
this.imageError = OnshoreImageError.size;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (file) {
|
|
51
|
+
const reader = new FileReader();
|
|
52
|
+
reader.readAsDataURL(file);
|
|
53
|
+
reader.onload = () => {
|
|
54
|
+
const img = new Image();
|
|
55
|
+
img.src = window.URL.createObjectURL(file);
|
|
56
|
+
img.onload = () => {
|
|
57
|
+
const originalWidth = img.width;
|
|
58
|
+
const originalHeight = img.height;
|
|
59
|
+
if (originalWidth >= this.resizeToWidth && originalHeight >= this.resizeToHeight) {
|
|
60
|
+
this.image = reader.result?.toString() || '';
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.imageError = OnshoreImageError.ratio;
|
|
64
|
+
}
|
|
65
|
+
this.cdr.markForCheck();
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
imageCropped(event) {
|
|
71
|
+
// ToDo: Check needed base64 format
|
|
72
|
+
//this.finalImage = event.base64.split(',')[1];
|
|
73
|
+
this.finalImage = event.base64 || '';
|
|
74
|
+
}
|
|
75
|
+
imageCroppedReady() {
|
|
76
|
+
this.choosen.emit(this.finalImage);
|
|
77
|
+
this.clear();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
OnshoreImageChooserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: OnshoreImageChooserComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
81
|
+
OnshoreImageChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: OnshoreImageChooserComponent, selector: "onshore-image-chooser", inputs: { imageQuality: "imageQuality", resizeToHeight: "resizeToHeight", resizeToWidth: "resizeToWidth", backgroundColor: "backgroundColor", format: "format", alignImage: "alignImage", containWithinAspectRatio: "containWithinAspectRatio", aspectRatio: "aspectRatio", cropperPreviewHeight: "cropperPreviewHeight", cropperPreviewWidth: "cropperPreviewWidth", circleCropper: "circleCropper", autoSave: "autoSave", inverseColor: "inverseColor" }, outputs: { choosen: "choosen", canceled: "canceled" }, ngImport: i0, template: "<div class=\"flex flex-column justify-content-center align-items-center w-full\">\n\n <div *ngIf=\"!image\" class=\"flex justify-content-center flex-column align-items-center w-full\">\n <!--<div style=\"max-width: 400px\" class=\"pt-4\">\n <app-info-box title=\"Hinweis\"\n [description]=\"'Die Bilddatei muss mindestens ' + resizeToWidth + 'px x ' + resizeToHeight + 'px betragen, darf maximal 6,4 MB gro\u00DF sein und muss im Dateiformat JPG oder PNG vorliegen.'\"\n icon=\"fa-info-circle\"\n backgroud=\"navy\"\n iconPosition=\"bottom\"\n [descriptionWrap]=\"true\">\n </app-info-box>\n </div>-->\n\n <div\n class=\"onshore-image-upload flex flex-column justify-content-between align-items-center rounded-lg p-4 relative m-3\"\n [class.onshore-border-gray-3]=\"drag\"\n [class.onshore-border-danger]=\"imageError != imageErrorType.none\">\n <i class=\"fa fa-image fa-5x onshore-color-gray-4\"></i>\n <small class=\"onshore-color-gray-4 mb-2\">{{'form.imageControl.dropImageLabel' | translate}}</small>\n\n <button pButton\n type=\"button\"\n icon=\"fa fa-file\"\n [label]=\"'form.imageControl.imageChooserFileButton' | translate\"\n class=\"onshore-button-primary mr-2\">\n </button>\n\n <input\n (change)=\"fileChange($event)\"\n *ngIf=\"!image\"\n accept=\"image/png, image/jpeg, image/webp\"\n class=\"onshore-image-input absolute w-full h-full\"\n type=\"file\"\n (dragenter)=\"drag = true\"\n (dragleave)=\"drag = false\"\n (dragend)=\"drag = false\"\n />\n </div>\n </div>\n\n <div class=\"flex flex-column relative align-items-center w-full\" *ngIf=\"image\">\n <!--<div style=\"max-width: 400px\" class=\"pt-4\">\n <app-info-box title=\"Hinweis\"\n description=\"W\u00E4hle einen Bereich der vom Bild verwendet werden soll.\"\n icon=\"fa-info-circle\"\n backgroud=\"navy\"\n iconPosition=\"bottom\"\n [descriptionWrap]=\"true\">\n </app-info-box>\n </div>-->\n\n <image-cropper\n class=\"onshore-image-cropper m-3\"\n [class.onshore-cropper-circle]=\"circleCropper\"\n (imageCropped)=\"imageCropped($event)\"\n [imageBase64]=\"image\"\n [imageQuality]=\"imageQuality\"\n [alignImage]=\"alignImage\"\n [backgroundColor]=\"backgroundColor\"\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\n [format]=\"format\"\n [aspectRatio]=\"aspectRatio\"\n [resizeToHeight]=\"resizeToHeight\"\n [resizeToWidth]=\"resizeToWidth\">\n </image-cropper>\n </div>\n\n <div *ngIf=\"imageError\"class=\"pb-2 text-wrap text-center onshore-color-danger\">\n <small *ngIf=\"imageError == imageErrorType.ratio\">{{'form.imageControl.imageErrorRatio' | translate: {resizeToWidth, resizeToHeight} }}</small>\n <small *ngIf=\"imageError == imageErrorType.fileType\">{{'form.imageControl.imageErrorFileType' | translate}}</small>\n <small *ngIf=\"imageError == imageErrorType.size\">{{'form.imageControl.imageErrorSize' | translate}}</small>\n </div>\n</div>\n\n\n<p-footer>\n <div class=\"flex justify-content-end align-items-center mt-2\">\n <button pButton\n type=\"button\"\n icon=\"fa fa-times\"\n [label]=\"'form.imageControl.imageChooserCancelButton' | translate\"\n class=\"onshore-button-light mr-2\"\n (click)=\"clear(); canceled.emit(true)\">\n </button>\n\n <button pButton\n type=\"button\"\n [label]=\"'form.imageControl.imageChooserSelectButton' | translate\"\n class=\"onshore-button-light\"\n icon=\"fa fa-check\"\n (click)=\"imageCroppedReady()\">\n </button>\n </div>\n</p-footer>\n\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i3.Footer, selector: "p-footer" }, { kind: "component", type: i4.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
82
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: OnshoreImageChooserComponent, decorators: [{
|
|
83
|
+
type: Component,
|
|
84
|
+
args: [{ selector: 'onshore-image-chooser', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-column justify-content-center align-items-center w-full\">\n\n <div *ngIf=\"!image\" class=\"flex justify-content-center flex-column align-items-center w-full\">\n <!--<div style=\"max-width: 400px\" class=\"pt-4\">\n <app-info-box title=\"Hinweis\"\n [description]=\"'Die Bilddatei muss mindestens ' + resizeToWidth + 'px x ' + resizeToHeight + 'px betragen, darf maximal 6,4 MB gro\u00DF sein und muss im Dateiformat JPG oder PNG vorliegen.'\"\n icon=\"fa-info-circle\"\n backgroud=\"navy\"\n iconPosition=\"bottom\"\n [descriptionWrap]=\"true\">\n </app-info-box>\n </div>-->\n\n <div\n class=\"onshore-image-upload flex flex-column justify-content-between align-items-center rounded-lg p-4 relative m-3\"\n [class.onshore-border-gray-3]=\"drag\"\n [class.onshore-border-danger]=\"imageError != imageErrorType.none\">\n <i class=\"fa fa-image fa-5x onshore-color-gray-4\"></i>\n <small class=\"onshore-color-gray-4 mb-2\">{{'form.imageControl.dropImageLabel' | translate}}</small>\n\n <button pButton\n type=\"button\"\n icon=\"fa fa-file\"\n [label]=\"'form.imageControl.imageChooserFileButton' | translate\"\n class=\"onshore-button-primary mr-2\">\n </button>\n\n <input\n (change)=\"fileChange($event)\"\n *ngIf=\"!image\"\n accept=\"image/png, image/jpeg, image/webp\"\n class=\"onshore-image-input absolute w-full h-full\"\n type=\"file\"\n (dragenter)=\"drag = true\"\n (dragleave)=\"drag = false\"\n (dragend)=\"drag = false\"\n />\n </div>\n </div>\n\n <div class=\"flex flex-column relative align-items-center w-full\" *ngIf=\"image\">\n <!--<div style=\"max-width: 400px\" class=\"pt-4\">\n <app-info-box title=\"Hinweis\"\n description=\"W\u00E4hle einen Bereich der vom Bild verwendet werden soll.\"\n icon=\"fa-info-circle\"\n backgroud=\"navy\"\n iconPosition=\"bottom\"\n [descriptionWrap]=\"true\">\n </app-info-box>\n </div>-->\n\n <image-cropper\n class=\"onshore-image-cropper m-3\"\n [class.onshore-cropper-circle]=\"circleCropper\"\n (imageCropped)=\"imageCropped($event)\"\n [imageBase64]=\"image\"\n [imageQuality]=\"imageQuality\"\n [alignImage]=\"alignImage\"\n [backgroundColor]=\"backgroundColor\"\n [containWithinAspectRatio]=\"containWithinAspectRatio\"\n [format]=\"format\"\n [aspectRatio]=\"aspectRatio\"\n [resizeToHeight]=\"resizeToHeight\"\n [resizeToWidth]=\"resizeToWidth\">\n </image-cropper>\n </div>\n\n <div *ngIf=\"imageError\"class=\"pb-2 text-wrap text-center onshore-color-danger\">\n <small *ngIf=\"imageError == imageErrorType.ratio\">{{'form.imageControl.imageErrorRatio' | translate: {resizeToWidth, resizeToHeight} }}</small>\n <small *ngIf=\"imageError == imageErrorType.fileType\">{{'form.imageControl.imageErrorFileType' | translate}}</small>\n <small *ngIf=\"imageError == imageErrorType.size\">{{'form.imageControl.imageErrorSize' | translate}}</small>\n </div>\n</div>\n\n\n<p-footer>\n <div class=\"flex justify-content-end align-items-center mt-2\">\n <button pButton\n type=\"button\"\n icon=\"fa fa-times\"\n [label]=\"'form.imageControl.imageChooserCancelButton' | translate\"\n class=\"onshore-button-light mr-2\"\n (click)=\"clear(); canceled.emit(true)\">\n </button>\n\n <button pButton\n type=\"button\"\n [label]=\"'form.imageControl.imageChooserSelectButton' | translate\"\n class=\"onshore-button-light\"\n icon=\"fa fa-check\"\n (click)=\"imageCroppedReady()\">\n </button>\n </div>\n</p-footer>\n\n" }]
|
|
85
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { imageQuality: [{
|
|
86
|
+
type: Input
|
|
87
|
+
}], resizeToHeight: [{
|
|
88
|
+
type: Input
|
|
89
|
+
}], resizeToWidth: [{
|
|
90
|
+
type: Input
|
|
91
|
+
}], backgroundColor: [{
|
|
92
|
+
type: Input
|
|
93
|
+
}], format: [{
|
|
94
|
+
type: Input
|
|
95
|
+
}], alignImage: [{
|
|
96
|
+
type: Input
|
|
97
|
+
}], containWithinAspectRatio: [{
|
|
98
|
+
type: Input
|
|
99
|
+
}], aspectRatio: [{
|
|
100
|
+
type: Input
|
|
101
|
+
}], cropperPreviewHeight: [{
|
|
102
|
+
type: Input
|
|
103
|
+
}], cropperPreviewWidth: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}], circleCropper: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}], autoSave: [{
|
|
108
|
+
type: Input
|
|
109
|
+
}], inverseColor: [{
|
|
110
|
+
type: Input
|
|
111
|
+
}], choosen: [{
|
|
112
|
+
type: Output
|
|
113
|
+
}], canceled: [{
|
|
114
|
+
type: Output
|
|
115
|
+
}] } });
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY2hvb3Nlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnNob3JlLWZvcm1zL3NyYy9saWIvY29tcG9uZW50cy9pbWFnZS1jaG9vc2VyL2ltYWdlLWNob29zZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25zaG9yZS1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvaW1hZ2UtY2hvb3Nlci9pbWFnZS1jaG9vc2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7O0FBTzNELE1BQU0sT0FBTyw0QkFBNEI7SUFxRnZDLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbkYxQyxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsbUJBQWMsR0FBRyxpQkFBaUIsQ0FBQztRQUNuQyxlQUFVLEdBQXNCLGlCQUFpQixDQUFDLElBQUksQ0FBQztRQUV2QyxpQkFBWSxHQUFHLEdBQUcsQ0FBQztRQUNuQixtQkFBYyxHQUFHLEdBQUcsQ0FBQztRQUNyQixrQkFBYSxHQUFHLEdBQUcsQ0FBQztRQUNwQixvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUMxQixXQUFNLEdBQTRDLEtBQUssQ0FBQztRQUN4RCxlQUFVLEdBQXNCLFFBQVEsQ0FBQztRQUN6Qyw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDakMsZ0JBQVcsR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLHlCQUFvQixHQUFHLEdBQUcsQ0FBQztRQUMzQix3QkFBbUIsR0FBRyxHQUFHLENBQUM7UUFDMUIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUVwQyxZQUFPLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkQsYUFBUSxHQUEwQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBK0QvRCxDQUFDO0lBN0RELEtBQUs7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQztJQUMzQyxDQUFDO0lBRU0sVUFBVSxDQUFDLEtBQVk7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQTRCLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUU5RSxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksWUFBWSxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksWUFBWSxFQUFFO1lBQ3pGLElBQUksQ0FBQyxVQUFVLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDO1lBQzdDLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxFQUFFLElBQUksR0FBRyxPQUFPLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDekMsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLEVBQUU7WUFDUixNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBRW5CLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3hCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO29CQUVoQixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO29CQUNoQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUVsQyxJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO3dCQUNoRixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO3FCQUM5Qzt5QkFBTTt3QkFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQztxQkFDM0M7b0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFFMUIsQ0FBQyxDQUFBO1lBRUgsQ0FBQyxDQUFDO1NBQ0g7SUFJSCxDQUFDO0lBRU0sWUFBWSxDQUFDLEtBQXdCO1FBQzFDLG1DQUFtQztRQUNuQywrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDOzt5SEFuRlUsNEJBQTRCOzZHQUE1Qiw0QkFBNEIsZ2pCQ2hCekMsZzVIQStGQTsyRkQvRWEsNEJBQTRCO2tCQUx4QyxTQUFTOytCQUNFLHVCQUF1QixtQkFFaEIsdUJBQXVCLENBQUMsTUFBTTt3R0FVL0IsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBQ1UsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1Usd0JBQXdCO3NCQUF2QyxLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1Usb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUNVLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFFSSxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW1hZ2VDcm9wcGVkRXZlbnQgfSBmcm9tICduZ3gtaW1hZ2UtY3JvcHBlcic7XG5pbXBvcnQgeyBPbnNob3JlSW1hZ2VFcnJvciB9IGZyb20gJy4uLy4uL2VudW1zL2Zvcm0uZW51bXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvbnNob3JlLWltYWdlLWNob29zZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UtY2hvb3Nlci5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBPbnNob3JlSW1hZ2VDaG9vc2VyQ29tcG9uZW50IHtcblxuICBkcmFnID0gZmFsc2U7XG4gIGltYWdlID0gJyc7XG4gIGZpbmFsSW1hZ2UgPSAnJztcbiAgaW1hZ2VFcnJvclR5cGUgPSBPbnNob3JlSW1hZ2VFcnJvcjtcbiAgaW1hZ2VFcnJvcjogT25zaG9yZUltYWdlRXJyb3IgPSBPbnNob3JlSW1hZ2VFcnJvci5ub25lO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBpbWFnZVF1YWxpdHkgPSAxMDA7XG4gIEBJbnB1dCgpIHB1YmxpYyByZXNpemVUb0hlaWdodCA9IDQwMDtcbiAgQElucHV0KCkgcHVibGljIHJlc2l6ZVRvV2lkdGggPSA0MDA7XG4gIEBJbnB1dCgpIHB1YmxpYyBiYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xuICBASW5wdXQoKSBwdWJsaWMgZm9ybWF0OiAncG5nJyB8ICdqcGVnJyB8ICdibXAnIHwgJ3dlYnAnIHwgJ2ljbycgPSAncG5nJztcbiAgQElucHV0KCkgcHVibGljIGFsaWduSW1hZ2U6ICdsZWZ0JyB8ICdjZW50ZXInID0gJ2NlbnRlcic7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb250YWluV2l0aGluQXNwZWN0UmF0aW8gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGFzcGVjdFJhdGlvOiBudW1iZXIgPSAxIC8gMTtcbiAgQElucHV0KCkgcHVibGljIGNyb3BwZXJQcmV2aWV3SGVpZ2h0ID0gMjAwO1xuICBASW5wdXQoKSBwdWJsaWMgY3JvcHBlclByZXZpZXdXaWR0aCA9IDIwMDtcbiAgQElucHV0KCkgcHVibGljIGNpcmNsZUNyb3BwZXIgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGF1dG9TYXZlID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGludmVyc2VDb2xvcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBjaG9vc2VuOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGNhbmNlbGVkOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5pbWFnZSA9ICcnO1xuICAgIHRoaXMuZmluYWxJbWFnZSA9ICcnO1xuICAgIHRoaXMuaW1hZ2VFcnJvciA9IE9uc2hvcmVJbWFnZUVycm9yLm5vbmU7XG4gIH1cblxuICBwdWJsaWMgZmlsZUNoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlRXJyb3IgPSBPbnNob3JlSW1hZ2VFcnJvci5ub25lO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGZpbGU6IEZpbGUgfCB1bmRlZmluZWQgfCBudWxsID0gdGFyZ2V0Py5maWxlcyA/IHRhcmdldD8uZmlsZXNbMF0gOiBudWxsO1xuXG4gICAgaWYgKGZpbGU/LnR5cGUgIT0gJ2ltYWdlL3BuZycgJiYgZmlsZT8udHlwZSAhPSAnaW1hZ2UvanBlZycgJiYgZmlsZT8udHlwZSAhPSAnaW1hZ2Uvd2VicCcpIHtcbiAgICAgIHRoaXMuaW1hZ2VFcnJvciA9IE9uc2hvcmVJbWFnZUVycm9yLmZpbGVUeXBlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmaWxlPy5zaXplID4gNjQwMDAwMCkge1xuICAgICAgdGhpcy5pbWFnZUVycm9yID0gT25zaG9yZUltYWdlRXJyb3Iuc2l6ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmlsZSkge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcblxuICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1nLnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuXG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbEhlaWdodCA9IGltZy5oZWlnaHQ7XG5cbiAgICAgICAgICBpZiAob3JpZ2luYWxXaWR0aCA+PSB0aGlzLnJlc2l6ZVRvV2lkdGggJiYgb3JpZ2luYWxIZWlnaHQgPj0gdGhpcy5yZXNpemVUb0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZSA9IHJlYWRlci5yZXN1bHQ/LnRvU3RyaW5nKCkgfHwgJyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VFcnJvciA9IE9uc2hvcmVJbWFnZUVycm9yLnJhdGlvO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICB9XG5cbiAgICAgIH07XG4gICAgfVxuXG5cblxuICB9XG5cbiAgcHVibGljIGltYWdlQ3JvcHBlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBUb0RvOiBDaGVjayBuZWVkZWQgYmFzZTY0IGZvcm1hdFxuICAgIC8vdGhpcy5maW5hbEltYWdlID0gZXZlbnQuYmFzZTY0LnNwbGl0KCcsJylbMV07XG4gICAgdGhpcy5maW5hbEltYWdlID0gZXZlbnQuYmFzZTY0IHx8ICcnO1xuICB9XG5cbiAgcHVibGljIGltYWdlQ3JvcHBlZFJlYWR5KCk6IHZvaWQge1xuICAgIHRoaXMuY2hvb3Nlbi5lbWl0KHRoaXMuZmluYWxJbWFnZSk7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHctZnVsbFwiPlxuXG4gIDxkaXYgKm5nSWY9XCIhaW1hZ2VcIiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgdy1mdWxsXCI+XG4gICAgPCEtLTxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6IDQwMHB4XCIgY2xhc3M9XCJwdC00XCI+XG4gICAgICA8YXBwLWluZm8tYm94IHRpdGxlPVwiSGlud2Vpc1wiXG4gICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCInRGllIEJpbGRkYXRlaSBtdXNzIG1pbmRlc3RlbnMgJyArIHJlc2l6ZVRvV2lkdGggKyAncHggeCAnICsgcmVzaXplVG9IZWlnaHQgKyAncHggYmV0cmFnZW4sIGRhcmYgbWF4aW1hbCA2LDQgTUIgZ3Jvw58gc2VpbiB1bmQgbXVzcyBpbSBEYXRlaWZvcm1hdCBKUEcgb2RlciBQTkcgdm9ybGllZ2VuLidcIlxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEtaW5mby1jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdWQ9XCJuYXZ5XCJcbiAgICAgICAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uV3JhcF09XCJ0cnVlXCI+XG4gICAgICA8L2FwcC1pbmZvLWJveD5cbiAgICA8L2Rpdj4tLT5cblxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwib25zaG9yZS1pbWFnZS11cGxvYWQgZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgcm91bmRlZC1sZyBwLTQgcmVsYXRpdmUgbS0zXCJcbiAgICAgIFtjbGFzcy5vbnNob3JlLWJvcmRlci1ncmF5LTNdPVwiZHJhZ1wiXG4gICAgICBbY2xhc3Mub25zaG9yZS1ib3JkZXItZGFuZ2VyXT1cImltYWdlRXJyb3IgIT0gaW1hZ2VFcnJvclR5cGUubm9uZVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbWFnZSBmYS01eCBvbnNob3JlLWNvbG9yLWdyYXktNFwiPjwvaT5cbiAgICAgIDxzbWFsbCBjbGFzcz1cIm9uc2hvcmUtY29sb3ItZ3JheS00IG1iLTJcIj57eydmb3JtLmltYWdlQ29udHJvbC5kcm9wSW1hZ2VMYWJlbCcgfCB0cmFuc2xhdGV9fTwvc21hbGw+XG5cbiAgICAgIDxidXR0b24gcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWZpbGVcIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiJ2Zvcm0uaW1hZ2VDb250cm9sLmltYWdlQ2hvb3NlckZpbGVCdXR0b24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJvbnNob3JlLWJ1dHRvbi1wcmltYXJ5IG1yLTJcIj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8aW5wdXRcbiAgICAgICAgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAqbmdJZj1cIiFpbWFnZVwiXG4gICAgICAgIGFjY2VwdD1cImltYWdlL3BuZywgaW1hZ2UvanBlZywgaW1hZ2Uvd2VicFwiXG4gICAgICAgIGNsYXNzPVwib25zaG9yZS1pbWFnZS1pbnB1dCBhYnNvbHV0ZSB3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAoZHJhZ2VudGVyKT1cImRyYWcgPSB0cnVlXCJcbiAgICAgICAgKGRyYWdsZWF2ZSk9XCJkcmFnID0gZmFsc2VcIlxuICAgICAgICAoZHJhZ2VuZCk9XCJkcmFnID0gZmFsc2VcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gcmVsYXRpdmUgYWxpZ24taXRlbXMtY2VudGVyIHctZnVsbFwiICpuZ0lmPVwiaW1hZ2VcIj5cbiAgICA8IS0tPGRpdiBzdHlsZT1cIm1heC13aWR0aDogNDAwcHhcIiBjbGFzcz1cInB0LTRcIj5cbiAgICAgIDxhcHAtaW5mby1ib3ggdGl0bGU9XCJIaW53ZWlzXCJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJXw6RobGUgZWluZW4gQmVyZWljaCBkZXIgdm9tIEJpbGQgdmVyd2VuZGV0IHdlcmRlbiBzb2xsLlwiXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJmYS1pbmZvLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91ZD1cIm5hdnlcIlxuICAgICAgICAgICAgICAgICAgICBpY29uUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgICAgICAgICAgICAgICBbZGVzY3JpcHRpb25XcmFwXT1cInRydWVcIj5cbiAgICAgIDwvYXBwLWluZm8tYm94PlxuICAgIDwvZGl2Pi0tPlxuXG4gICAgPGltYWdlLWNyb3BwZXJcbiAgICAgIGNsYXNzPVwib25zaG9yZS1pbWFnZS1jcm9wcGVyIG0tM1wiXG4gICAgICBbY2xhc3Mub25zaG9yZS1jcm9wcGVyLWNpcmNsZV09XCJjaXJjbGVDcm9wcGVyXCJcbiAgICAgIChpbWFnZUNyb3BwZWQpPVwiaW1hZ2VDcm9wcGVkKCRldmVudClcIlxuICAgICAgW2ltYWdlQmFzZTY0XT1cImltYWdlXCJcbiAgICAgIFtpbWFnZVF1YWxpdHldPVwiaW1hZ2VRdWFsaXR5XCJcbiAgICAgIFthbGlnbkltYWdlXT1cImFsaWduSW1hZ2VcIlxuICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJiYWNrZ3JvdW5kQ29sb3JcIlxuICAgICAgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJjb250YWluV2l0aGluQXNwZWN0UmF0aW9cIlxuICAgICAgW2Zvcm1hdF09XCJmb3JtYXRcIlxuICAgICAgW2FzcGVjdFJhdGlvXT1cImFzcGVjdFJhdGlvXCJcbiAgICAgIFtyZXNpemVUb0hlaWdodF09XCJyZXNpemVUb0hlaWdodFwiXG4gICAgICBbcmVzaXplVG9XaWR0aF09XCJyZXNpemVUb1dpZHRoXCI+XG4gICAgPC9pbWFnZS1jcm9wcGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiaW1hZ2VFcnJvclwiY2xhc3M9XCJwYi0yIHRleHQtd3JhcCB0ZXh0LWNlbnRlciBvbnNob3JlLWNvbG9yLWRhbmdlclwiPlxuICAgIDxzbWFsbCAqbmdJZj1cImltYWdlRXJyb3IgPT0gaW1hZ2VFcnJvclR5cGUucmF0aW9cIj57eydmb3JtLmltYWdlQ29udHJvbC5pbWFnZUVycm9yUmF0aW8nIHwgdHJhbnNsYXRlOiB7cmVzaXplVG9XaWR0aCwgcmVzaXplVG9IZWlnaHR9IH19PC9zbWFsbD5cbiAgICA8c21hbGwgKm5nSWY9XCJpbWFnZUVycm9yID09IGltYWdlRXJyb3JUeXBlLmZpbGVUeXBlXCI+e3snZm9ybS5pbWFnZUNvbnRyb2wuaW1hZ2VFcnJvckZpbGVUeXBlJyB8IHRyYW5zbGF0ZX19PC9zbWFsbD5cbiAgICA8c21hbGwgKm5nSWY9XCJpbWFnZUVycm9yID09IGltYWdlRXJyb3JUeXBlLnNpemVcIj57eydmb3JtLmltYWdlQ29udHJvbC5pbWFnZUVycm9yU2l6ZScgfCB0cmFuc2xhdGV9fTwvc21hbGw+XG4gIDwvZGl2PlxuPC9kaXY+XG5cblxuPHAtZm9vdGVyPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yXCI+XG4gICAgPGJ1dHRvbiBwQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb249XCJmYSBmYS10aW1lc1wiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ2Zvcm0uaW1hZ2VDb250cm9sLmltYWdlQ2hvb3NlckNhbmNlbEJ1dHRvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJvbnNob3JlLWJ1dHRvbi1saWdodCBtci0yXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigpOyBjYW5jZWxlZC5lbWl0KHRydWUpXCI+XG4gICAgPC9idXR0b24+XG5cbiAgICA8YnV0dG9uIHBCdXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidmb3JtLmltYWdlQ29udHJvbC5pbWFnZUNob29zZXJTZWxlY3RCdXR0b24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGNsYXNzPVwib25zaG9yZS1idXR0b24tbGlnaHRcIlxuICAgICAgICAgICAgaWNvbj1cImZhIGZhLWNoZWNrXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpbWFnZUNyb3BwZWRSZWFkeSgpXCI+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9wLWZvb3Rlcj5cblxuIl19
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
export class OnshoreImagePlaceholderComponent {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.placeholderIcon = '';
|
|
7
|
+
this.placeholderImage = '';
|
|
8
|
+
this.image = '';
|
|
9
|
+
this.imageStyle = '';
|
|
10
|
+
this.placeholderStyle = '';
|
|
11
|
+
this.showLoader = true;
|
|
12
|
+
this.imageLoaded = false;
|
|
13
|
+
}
|
|
14
|
+
loadReady() {
|
|
15
|
+
this.imageLoaded = true;
|
|
16
|
+
this.showLoader = false;
|
|
17
|
+
}
|
|
18
|
+
abort() {
|
|
19
|
+
this.imageLoaded = false;
|
|
20
|
+
this.showLoader = false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
OnshoreImagePlaceholderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: OnshoreImagePlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
24
|
+
OnshoreImagePlaceholderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: OnshoreImagePlaceholderComponent, selector: "onshore-image-placeholder", inputs: { placeholderIcon: "placeholderIcon", placeholderImage: "placeholderImage", image: "image", imageStyle: "imageStyle", placeholderStyle: "placeholderStyle", showLoader: "showLoader" }, ngImport: i0, template: "<div class=\"h-full\" [hidden]=\"!imageLoaded || !image\">\n <img [style]=\"imageStyle\" [src]=\"image\" (load)=\"loadReady()\" (abort)=\"abort()\" />\n</div>\n\n<div *ngIf=\"!imageLoaded || !image\" class=\"flex justify-content-center align-items-center\" [style]=\"placeholderStyle\" [class.bg-gray-200]=\"placeholderIcon\" [class.p-2]=\"placeholderIcon\">\n <i *ngIf=\"placeholderIcon\" [class]=\"'text-muted fa ' + placeholderIcon\" [class.opacity-20]=\"showLoader && image\"></i>\n <img *ngIf=\"placeholderImage\" [src]=\"placeholderImage\" [class.opacity-20]=\"showLoader && image\" class=\"h-full\" />\n <i *ngIf=\"showLoader && image\" class=\"fas fa-circle-notch fa-spin fa-2x absolute\"></i>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: OnshoreImagePlaceholderComponent, decorators: [{
|
|
26
|
+
type: Component,
|
|
27
|
+
args: [{ selector: 'onshore-image-placeholder', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"h-full\" [hidden]=\"!imageLoaded || !image\">\n <img [style]=\"imageStyle\" [src]=\"image\" (load)=\"loadReady()\" (abort)=\"abort()\" />\n</div>\n\n<div *ngIf=\"!imageLoaded || !image\" class=\"flex justify-content-center align-items-center\" [style]=\"placeholderStyle\" [class.bg-gray-200]=\"placeholderIcon\" [class.p-2]=\"placeholderIcon\">\n <i *ngIf=\"placeholderIcon\" [class]=\"'text-muted fa ' + placeholderIcon\" [class.opacity-20]=\"showLoader && image\"></i>\n <img *ngIf=\"placeholderImage\" [src]=\"placeholderImage\" [class.opacity-20]=\"showLoader && image\" class=\"h-full\" />\n <i *ngIf=\"showLoader && image\" class=\"fas fa-circle-notch fa-spin fa-2x absolute\"></i>\n</div>\n" }]
|
|
28
|
+
}], ctorParameters: function () { return []; }, propDecorators: { placeholderIcon: [{
|
|
29
|
+
type: Input
|
|
30
|
+
}], placeholderImage: [{
|
|
31
|
+
type: Input
|
|
32
|
+
}], image: [{
|
|
33
|
+
type: Input
|
|
34
|
+
}], imageStyle: [{
|
|
35
|
+
type: Input
|
|
36
|
+
}], placeholderStyle: [{
|
|
37
|
+
type: Input
|
|
38
|
+
}], showLoader: [{
|
|
39
|
+
type: Input
|
|
40
|
+
}] } });
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcGxhY2Vob2xkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25zaG9yZS1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvaW1hZ2UtcGxhY2Vob2xkZXIvaW1hZ2UtcGxhY2Vob2xkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25zaG9yZS1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvaW1hZ2UtcGxhY2Vob2xkZXIvaW1hZ2UtcGxhY2Vob2xkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU8xRSxNQUFNLE9BQU8sZ0NBQWdDO0lBcUIzQztRQW5CZ0Isb0JBQWUsR0FBVyxFQUFFLENBQUM7UUFDN0IscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBQzlCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixxQkFBZ0IsR0FBVyxFQUFFLENBQUM7UUFDOUIsZUFBVSxHQUFZLElBQUksQ0FBQztRQUUzQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztJQVlMLENBQUM7SUFWaEIsU0FBUztRQUNQLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQzs7NkhBbkJVLGdDQUFnQztpSEFBaEMsZ0NBQWdDLGlRQ1A3Qyw2c0JBU0E7MkZERmEsZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLDJCQUEyQixtQkFFcEIsdUJBQXVCLENBQUMsTUFBTTswRUFJL0IsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb25zaG9yZS1pbWFnZS1wbGFjZWhvbGRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS1wbGFjZWhvbGRlci5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBPbnNob3JlSW1hZ2VQbGFjZWhvbGRlckNvbXBvbmVudCB7XG5cbiAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVySWNvbjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlckltYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcHVibGljIGltYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcHVibGljIGltYWdlU3R5bGU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXJTdHlsZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93TG9hZGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICBpbWFnZUxvYWRlZCA9IGZhbHNlO1xuXG4gIGxvYWRSZWFkeSgpIHtcbiAgICB0aGlzLmltYWdlTG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZTtcbiAgfVxuXG4gIGFib3J0KCkge1xuICAgIHRoaXMuaW1hZ2VMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dMb2FkZXIgPSBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge31cblxufVxuIiwiPGRpdiBjbGFzcz1cImgtZnVsbFwiIFtoaWRkZW5dPVwiIWltYWdlTG9hZGVkIHx8ICFpbWFnZVwiPlxuICA8aW1nIFtzdHlsZV09XCJpbWFnZVN0eWxlXCIgW3NyY109XCJpbWFnZVwiIChsb2FkKT1cImxvYWRSZWFkeSgpXCIgKGFib3J0KT1cImFib3J0KClcIiAvPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCIhaW1hZ2VMb2FkZWQgfHwgIWltYWdlXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCIgW3N0eWxlXT1cInBsYWNlaG9sZGVyU3R5bGVcIiBbY2xhc3MuYmctZ3JheS0yMDBdPVwicGxhY2Vob2xkZXJJY29uXCIgW2NsYXNzLnAtMl09XCJwbGFjZWhvbGRlckljb25cIj5cbiAgPGkgKm5nSWY9XCJwbGFjZWhvbGRlckljb25cIiBbY2xhc3NdPVwiJ3RleHQtbXV0ZWQgZmEgJyArIHBsYWNlaG9sZGVySWNvblwiIFtjbGFzcy5vcGFjaXR5LTIwXT1cInNob3dMb2FkZXIgJiYgaW1hZ2VcIj48L2k+XG4gIDxpbWcgKm5nSWY9XCJwbGFjZWhvbGRlckltYWdlXCIgW3NyY109XCJwbGFjZWhvbGRlckltYWdlXCIgW2NsYXNzLm9wYWNpdHktMjBdPVwic2hvd0xvYWRlciAmJiBpbWFnZVwiIGNsYXNzPVwiaC1mdWxsXCIgLz5cbiAgPGkgKm5nSWY9XCJzaG93TG9hZGVyICYmIGltYWdlXCIgY2xhc3M9XCJmYXMgZmEtY2lyY2xlLW5vdGNoIGZhLXNwaW4gZmEtMnggYWJzb2x1dGVcIj48L2k+XG48L2Rpdj5cbiJdfQ==
|