ngx-image-cropper 5.0.1 → 6.0.3
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/README.md +1 -0
- package/esm2020/lib/component/image-cropper.component.mjs +540 -0
- package/esm2020/lib/image-cropper.module.mjs +26 -0
- package/esm2020/lib/interfaces/cropper-options.interface.mjs +2 -0
- package/esm2020/lib/interfaces/cropper-position.interface.mjs +2 -0
- package/esm2020/lib/interfaces/cropper.settings.mjs +51 -0
- package/esm2020/lib/interfaces/dimensions.interface.mjs +2 -0
- package/esm2020/lib/interfaces/exif-transform.interface.mjs +2 -0
- package/esm2020/lib/interfaces/image-cropped-event.interface.mjs +2 -0
- package/esm2020/lib/interfaces/image-transform.interface.mjs +2 -0
- package/esm2020/lib/interfaces/index.mjs +2 -0
- package/esm2020/lib/interfaces/loaded-image.interface.mjs +2 -0
- package/esm2020/lib/interfaces/move-start.interface.mjs +7 -0
- package/esm2020/lib/services/crop.service.mjs +117 -0
- package/esm2020/lib/services/cropper-position.service.mjs +201 -0
- package/esm2020/lib/services/load-image.service.mjs +168 -0
- package/esm2020/lib/utils/blob.utils.mjs +12 -0
- package/esm2020/lib/utils/exif.utils.mjs +89 -0
- package/esm2020/lib/utils/hammer.utils.mjs +2 -0
- package/esm2020/lib/utils/keyboard.utils.mjs +40 -0
- package/esm2020/lib/utils/resize.utils.mjs +75 -0
- package/esm2020/ngx-image-cropper.mjs +5 -0
- package/esm2020/public-api.mjs +6 -0
- package/fesm2015/{ngx-image-cropper.js → ngx-image-cropper.mjs} +252 -1035
- package/fesm2015/ngx-image-cropper.mjs.map +1 -0
- package/fesm2020/ngx-image-cropper.mjs +1316 -0
- package/fesm2020/ngx-image-cropper.mjs.map +1 -0
- package/lib/component/image-cropper.component.d.ts +12 -9
- package/lib/image-cropper.module.d.ts +6 -0
- package/lib/interfaces/cropper.settings.d.ts +1 -1
- package/lib/services/crop.service.d.ts +3 -0
- package/lib/services/cropper-position.service.d.ts +3 -0
- package/lib/services/load-image.service.d.ts +3 -0
- package/lib/utils/hammer.utils.d.ts +1 -1
- package/ngx-image-cropper.d.ts +1 -3
- package/package.json +24 -13
- package/bundles/ngx-image-cropper.umd.js +0 -2418
- package/bundles/ngx-image-cropper.umd.js.map +0 -1
- package/bundles/ngx-image-cropper.umd.min.js +0 -16
- package/bundles/ngx-image-cropper.umd.min.js.map +0 -1
- package/esm2015/lib/component/image-cropper.component.js +0 -827
- package/esm2015/lib/image-cropper.module.js +0 -24
- package/esm2015/lib/interfaces/cropper-options.interface.js +0 -56
- package/esm2015/lib/interfaces/cropper-position.interface.js +0 -20
- package/esm2015/lib/interfaces/cropper.settings.js +0 -140
- package/esm2015/lib/interfaces/dimensions.interface.js +0 -16
- package/esm2015/lib/interfaces/exif-transform.interface.js +0 -16
- package/esm2015/lib/interfaces/image-cropped-event.interface.js +0 -24
- package/esm2015/lib/interfaces/image-transform.interface.js +0 -20
- package/esm2015/lib/interfaces/index.js +0 -6
- package/esm2015/lib/interfaces/loaded-image.interface.js +0 -18
- package/esm2015/lib/interfaces/move-start.interface.js +0 -37
- package/esm2015/lib/services/crop.service.js +0 -176
- package/esm2015/lib/services/cropper-position.service.js +0 -259
- package/esm2015/lib/services/load-image.service.js +0 -304
- package/esm2015/lib/utils/blob.utils.js +0 -26
- package/esm2015/lib/utils/exif.utils.js +0 -128
- package/esm2015/lib/utils/hammer.utils.js +0 -29
- package/esm2015/lib/utils/keyboard.utils.js +0 -58
- package/esm2015/lib/utils/resize.utils.js +0 -116
- package/esm2015/ngx-image-cropper.js +0 -13
- package/esm2015/public-api.js +0 -11
- package/fesm2015/ngx-image-cropper.js.map +0 -1
- package/ngx-image-cropper.metadata.json +0 -1
|
@@ -1,827 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* Generated from: lib/component/image-cropper.component.ts
|
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
-
*/
|
|
6
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, isDevMode, Output, ViewChild } from '@angular/core';
|
|
7
|
-
import { DomSanitizer } from '@angular/platform-browser';
|
|
8
|
-
import { CropperSettings } from '../interfaces/cropper.settings';
|
|
9
|
-
import { MoveTypes } from '../interfaces/move-start.interface';
|
|
10
|
-
import { CropService } from '../services/crop.service';
|
|
11
|
-
import { CropperPositionService } from '../services/cropper-position.service';
|
|
12
|
-
import { LoadImageService } from '../services/load-image.service';
|
|
13
|
-
import { getEventForKey, getInvertedPositionForKey, getPositionForKey } from '../utils/keyboard.utils';
|
|
14
|
-
export class ImageCropperComponent {
|
|
15
|
-
/**
|
|
16
|
-
* @param {?} cropService
|
|
17
|
-
* @param {?} cropperPositionService
|
|
18
|
-
* @param {?} loadImageService
|
|
19
|
-
* @param {?} sanitizer
|
|
20
|
-
* @param {?} cd
|
|
21
|
-
*/
|
|
22
|
-
constructor(cropService, cropperPositionService, loadImageService, sanitizer, cd) {
|
|
23
|
-
this.cropService = cropService;
|
|
24
|
-
this.cropperPositionService = cropperPositionService;
|
|
25
|
-
this.loadImageService = loadImageService;
|
|
26
|
-
this.sanitizer = sanitizer;
|
|
27
|
-
this.cd = cd;
|
|
28
|
-
this.Hammer = (window === null || window === void 0 ? void 0 : window['Hammer']) || null;
|
|
29
|
-
this.settings = new CropperSettings();
|
|
30
|
-
this.setImageMaxSizeRetries = 0;
|
|
31
|
-
this.marginLeft = '0px';
|
|
32
|
-
this.moveTypes = MoveTypes;
|
|
33
|
-
this.imageVisible = false;
|
|
34
|
-
this.format = this.settings.format;
|
|
35
|
-
this.transform = {};
|
|
36
|
-
this.maintainAspectRatio = this.settings.maintainAspectRatio;
|
|
37
|
-
this.aspectRatio = this.settings.aspectRatio;
|
|
38
|
-
this.resizeToWidth = this.settings.resizeToWidth;
|
|
39
|
-
this.resizeToHeight = this.settings.resizeToHeight;
|
|
40
|
-
this.cropperMinWidth = this.settings.cropperMinWidth;
|
|
41
|
-
this.cropperMinHeight = this.settings.cropperMinHeight;
|
|
42
|
-
this.cropperMaxHeight = this.settings.cropperMaxHeight;
|
|
43
|
-
this.cropperMaxWidth = this.settings.cropperMaxWidth;
|
|
44
|
-
this.cropperStaticWidth = this.settings.cropperStaticWidth;
|
|
45
|
-
this.cropperStaticHeight = this.settings.cropperStaticHeight;
|
|
46
|
-
this.canvasRotation = this.settings.canvasRotation;
|
|
47
|
-
this.initialStepSize = this.settings.initialStepSize;
|
|
48
|
-
this.roundCropper = this.settings.roundCropper;
|
|
49
|
-
this.onlyScaleDown = this.settings.onlyScaleDown;
|
|
50
|
-
this.imageQuality = this.settings.imageQuality;
|
|
51
|
-
this.autoCrop = this.settings.autoCrop;
|
|
52
|
-
this.backgroundColor = this.settings.backgroundColor;
|
|
53
|
-
this.containWithinAspectRatio = this.settings.containWithinAspectRatio;
|
|
54
|
-
this.hideResizeSquares = this.settings.hideResizeSquares;
|
|
55
|
-
this.cropper = {
|
|
56
|
-
x1: -100,
|
|
57
|
-
y1: -100,
|
|
58
|
-
x2: 10000,
|
|
59
|
-
y2: 10000
|
|
60
|
-
};
|
|
61
|
-
this.alignImage = this.settings.alignImage;
|
|
62
|
-
this.disabled = false;
|
|
63
|
-
this.imageCropped = new EventEmitter();
|
|
64
|
-
this.startCropImage = new EventEmitter();
|
|
65
|
-
this.imageLoaded = new EventEmitter();
|
|
66
|
-
this.cropperReady = new EventEmitter();
|
|
67
|
-
this.loadImageFailed = new EventEmitter();
|
|
68
|
-
this.reset();
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* @param {?} changes
|
|
72
|
-
* @return {?}
|
|
73
|
-
*/
|
|
74
|
-
ngOnChanges(changes) {
|
|
75
|
-
var _a;
|
|
76
|
-
this.onChangesUpdateSettings(changes);
|
|
77
|
-
this.onChangesInputImage(changes);
|
|
78
|
-
if (((_a = this.loadedImage) === null || _a === void 0 ? void 0 : _a.original.image.complete) && (changes.containWithinAspectRatio || changes.canvasRotation)) {
|
|
79
|
-
this.loadImageService
|
|
80
|
-
.transformLoadedImage(this.loadedImage, this.settings)
|
|
81
|
-
.then((/**
|
|
82
|
-
* @param {?} res
|
|
83
|
-
* @return {?}
|
|
84
|
-
*/
|
|
85
|
-
(res) => this.setLoadedImage(res)))
|
|
86
|
-
.catch((/**
|
|
87
|
-
* @param {?} err
|
|
88
|
-
* @return {?}
|
|
89
|
-
*/
|
|
90
|
-
(err) => this.loadImageError(err)));
|
|
91
|
-
}
|
|
92
|
-
if (changes.cropper || changes.maintainAspectRatio || changes.aspectRatio) {
|
|
93
|
-
this.setMaxSize();
|
|
94
|
-
this.setCropperScaledMinSize();
|
|
95
|
-
this.setCropperScaledMaxSize();
|
|
96
|
-
if (this.maintainAspectRatio && (changes.maintainAspectRatio || changes.aspectRatio)) {
|
|
97
|
-
this.resetCropperPosition();
|
|
98
|
-
}
|
|
99
|
-
else if (changes.cropper) {
|
|
100
|
-
this.checkCropperPosition(false);
|
|
101
|
-
this.doAutoCrop();
|
|
102
|
-
}
|
|
103
|
-
this.cd.markForCheck();
|
|
104
|
-
}
|
|
105
|
-
if (changes.transform) {
|
|
106
|
-
this.transform = this.transform || {};
|
|
107
|
-
this.setCssTransform();
|
|
108
|
-
this.doAutoCrop();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* @private
|
|
113
|
-
* @param {?} changes
|
|
114
|
-
* @return {?}
|
|
115
|
-
*/
|
|
116
|
-
onChangesUpdateSettings(changes) {
|
|
117
|
-
this.settings.setOptionsFromChanges(changes);
|
|
118
|
-
if (this.settings.cropperStaticHeight && this.settings.cropperStaticWidth) {
|
|
119
|
-
this.settings.setOptions({
|
|
120
|
-
hideResizeSquares: true,
|
|
121
|
-
cropperMinWidth: this.settings.cropperStaticWidth,
|
|
122
|
-
cropperMinHeight: this.settings.cropperStaticHeight,
|
|
123
|
-
cropperMaxHeight: this.settings.cropperStaticHeight,
|
|
124
|
-
cropperMaxWidth: this.settings.cropperStaticWidth,
|
|
125
|
-
maintainAspectRatio: false
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* @private
|
|
131
|
-
* @param {?} changes
|
|
132
|
-
* @return {?}
|
|
133
|
-
*/
|
|
134
|
-
onChangesInputImage(changes) {
|
|
135
|
-
if (changes.imageChangedEvent || changes.imageURL || changes.imageBase64 || changes.imageFile) {
|
|
136
|
-
this.reset();
|
|
137
|
-
}
|
|
138
|
-
if (changes.imageChangedEvent && this.isValidImageChangedEvent()) {
|
|
139
|
-
this.loadImageFile(this.imageChangedEvent.target.files[0]);
|
|
140
|
-
}
|
|
141
|
-
if (changes.imageURL && this.imageURL) {
|
|
142
|
-
this.loadImageFromURL(this.imageURL);
|
|
143
|
-
}
|
|
144
|
-
if (changes.imageBase64 && this.imageBase64) {
|
|
145
|
-
this.loadBase64Image(this.imageBase64);
|
|
146
|
-
}
|
|
147
|
-
if (changes.imageFile && this.imageFile) {
|
|
148
|
-
this.loadImageFile(this.imageFile);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* @private
|
|
153
|
-
* @return {?}
|
|
154
|
-
*/
|
|
155
|
-
isValidImageChangedEvent() {
|
|
156
|
-
var _a, _b, _c;
|
|
157
|
-
return ((_c = (_b = (_a = this.imageChangedEvent) === null || _a === void 0 ? void 0 : _a.target) === null || _b === void 0 ? void 0 : _b.files) === null || _c === void 0 ? void 0 : _c.length) > 0;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* @private
|
|
161
|
-
* @return {?}
|
|
162
|
-
*/
|
|
163
|
-
setCssTransform() {
|
|
164
|
-
this.safeTransformStyle = this.sanitizer.bypassSecurityTrustStyle('scaleX(' + (this.transform.scale || 1) * (this.transform.flipH ? -1 : 1) + ')' +
|
|
165
|
-
'scaleY(' + (this.transform.scale || 1) * (this.transform.flipV ? -1 : 1) + ')' +
|
|
166
|
-
'rotate(' + (this.transform.rotate || 0) + 'deg)');
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* @return {?}
|
|
170
|
-
*/
|
|
171
|
-
ngOnInit() {
|
|
172
|
-
this.settings.stepSize = this.initialStepSize;
|
|
173
|
-
this.activatePinchGesture();
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* @private
|
|
177
|
-
* @return {?}
|
|
178
|
-
*/
|
|
179
|
-
reset() {
|
|
180
|
-
this.imageVisible = false;
|
|
181
|
-
this.loadedImage = null;
|
|
182
|
-
this.safeImgDataUrl = 'data:image/png;base64,iVBORw0KGg'
|
|
183
|
-
+ 'oAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAU'
|
|
184
|
-
+ 'AAarVyFEAAAAASUVORK5CYII=';
|
|
185
|
-
this.moveStart = {
|
|
186
|
-
active: false,
|
|
187
|
-
type: null,
|
|
188
|
-
position: null,
|
|
189
|
-
x1: 0,
|
|
190
|
-
y1: 0,
|
|
191
|
-
x2: 0,
|
|
192
|
-
y2: 0,
|
|
193
|
-
clientX: 0,
|
|
194
|
-
clientY: 0
|
|
195
|
-
};
|
|
196
|
-
this.maxSize = {
|
|
197
|
-
width: 0,
|
|
198
|
-
height: 0
|
|
199
|
-
};
|
|
200
|
-
this.cropper.x1 = -100;
|
|
201
|
-
this.cropper.y1 = -100;
|
|
202
|
-
this.cropper.x2 = 10000;
|
|
203
|
-
this.cropper.y2 = 10000;
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* @private
|
|
207
|
-
* @param {?} file
|
|
208
|
-
* @return {?}
|
|
209
|
-
*/
|
|
210
|
-
loadImageFile(file) {
|
|
211
|
-
this.loadImageService
|
|
212
|
-
.loadImageFile(file, this.settings)
|
|
213
|
-
.then((/**
|
|
214
|
-
* @param {?} res
|
|
215
|
-
* @return {?}
|
|
216
|
-
*/
|
|
217
|
-
(res) => this.setLoadedImage(res)))
|
|
218
|
-
.catch((/**
|
|
219
|
-
* @param {?} err
|
|
220
|
-
* @return {?}
|
|
221
|
-
*/
|
|
222
|
-
(err) => this.loadImageError(err)));
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* @private
|
|
226
|
-
* @param {?} imageBase64
|
|
227
|
-
* @return {?}
|
|
228
|
-
*/
|
|
229
|
-
loadBase64Image(imageBase64) {
|
|
230
|
-
this.loadImageService
|
|
231
|
-
.loadBase64Image(imageBase64, this.settings)
|
|
232
|
-
.then((/**
|
|
233
|
-
* @param {?} res
|
|
234
|
-
* @return {?}
|
|
235
|
-
*/
|
|
236
|
-
(res) => this.setLoadedImage(res)))
|
|
237
|
-
.catch((/**
|
|
238
|
-
* @param {?} err
|
|
239
|
-
* @return {?}
|
|
240
|
-
*/
|
|
241
|
-
(err) => this.loadImageError(err)));
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* @private
|
|
245
|
-
* @param {?} url
|
|
246
|
-
* @return {?}
|
|
247
|
-
*/
|
|
248
|
-
loadImageFromURL(url) {
|
|
249
|
-
this.loadImageService
|
|
250
|
-
.loadImageFromURL(url, this.settings)
|
|
251
|
-
.then((/**
|
|
252
|
-
* @param {?} res
|
|
253
|
-
* @return {?}
|
|
254
|
-
*/
|
|
255
|
-
(res) => this.setLoadedImage(res)))
|
|
256
|
-
.catch((/**
|
|
257
|
-
* @param {?} err
|
|
258
|
-
* @return {?}
|
|
259
|
-
*/
|
|
260
|
-
(err) => this.loadImageError(err)));
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* @private
|
|
264
|
-
* @param {?} loadedImage
|
|
265
|
-
* @return {?}
|
|
266
|
-
*/
|
|
267
|
-
setLoadedImage(loadedImage) {
|
|
268
|
-
this.loadedImage = loadedImage;
|
|
269
|
-
this.safeImgDataUrl = this.sanitizer.bypassSecurityTrustResourceUrl(loadedImage.transformed.base64);
|
|
270
|
-
this.cd.markForCheck();
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* @private
|
|
274
|
-
* @param {?} error
|
|
275
|
-
* @return {?}
|
|
276
|
-
*/
|
|
277
|
-
loadImageError(error) {
|
|
278
|
-
console.error(error);
|
|
279
|
-
this.loadImageFailed.emit();
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* @return {?}
|
|
283
|
-
*/
|
|
284
|
-
imageLoadedInView() {
|
|
285
|
-
if (this.loadedImage != null) {
|
|
286
|
-
this.imageLoaded.emit(this.loadedImage);
|
|
287
|
-
this.setImageMaxSizeRetries = 0;
|
|
288
|
-
setTimeout((/**
|
|
289
|
-
* @return {?}
|
|
290
|
-
*/
|
|
291
|
-
() => this.checkImageMaxSizeRecursively()));
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* @private
|
|
296
|
-
* @return {?}
|
|
297
|
-
*/
|
|
298
|
-
checkImageMaxSizeRecursively() {
|
|
299
|
-
if (this.setImageMaxSizeRetries > 40) {
|
|
300
|
-
this.loadImageFailed.emit();
|
|
301
|
-
}
|
|
302
|
-
else if (this.sourceImageLoaded()) {
|
|
303
|
-
this.setMaxSize();
|
|
304
|
-
this.setCropperScaledMinSize();
|
|
305
|
-
this.setCropperScaledMaxSize();
|
|
306
|
-
this.resetCropperPosition();
|
|
307
|
-
this.cropperReady.emit(Object.assign({}, this.maxSize));
|
|
308
|
-
this.cd.markForCheck();
|
|
309
|
-
}
|
|
310
|
-
else {
|
|
311
|
-
this.setImageMaxSizeRetries++;
|
|
312
|
-
setTimeout((/**
|
|
313
|
-
* @return {?}
|
|
314
|
-
*/
|
|
315
|
-
() => this.checkImageMaxSizeRecursively()), 50);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* @private
|
|
320
|
-
* @return {?}
|
|
321
|
-
*/
|
|
322
|
-
sourceImageLoaded() {
|
|
323
|
-
var _a, _b;
|
|
324
|
-
return ((_b = (_a = this.sourceImage) === null || _a === void 0 ? void 0 : _a.nativeElement) === null || _b === void 0 ? void 0 : _b.offsetWidth) > 0;
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* @return {?}
|
|
328
|
-
*/
|
|
329
|
-
onResize() {
|
|
330
|
-
if (!this.loadedImage) {
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
this.resizeCropperPosition();
|
|
334
|
-
this.setMaxSize();
|
|
335
|
-
this.setCropperScaledMinSize();
|
|
336
|
-
this.setCropperScaledMaxSize();
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* @private
|
|
340
|
-
* @return {?}
|
|
341
|
-
*/
|
|
342
|
-
activatePinchGesture() {
|
|
343
|
-
if (this.Hammer) {
|
|
344
|
-
/** @type {?} */
|
|
345
|
-
const hammer = new this.Hammer(this.wrapper.nativeElement);
|
|
346
|
-
hammer.get('pinch').set({ enable: true });
|
|
347
|
-
hammer.on('pinchmove', this.onPinch.bind(this));
|
|
348
|
-
hammer.on('pinchend', this.pinchStop.bind(this));
|
|
349
|
-
hammer.on('pinchstart', this.startPinch.bind(this));
|
|
350
|
-
}
|
|
351
|
-
else if (isDevMode()) {
|
|
352
|
-
console.warn('[NgxImageCropper] Could not find HammerJS - Pinch Gesture won\'t work');
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* @private
|
|
357
|
-
* @return {?}
|
|
358
|
-
*/
|
|
359
|
-
resizeCropperPosition() {
|
|
360
|
-
/** @type {?} */
|
|
361
|
-
const sourceImageElement = this.sourceImage.nativeElement;
|
|
362
|
-
if (this.maxSize.width !== sourceImageElement.offsetWidth || this.maxSize.height !== sourceImageElement.offsetHeight) {
|
|
363
|
-
this.cropper.x1 = this.cropper.x1 * sourceImageElement.offsetWidth / this.maxSize.width;
|
|
364
|
-
this.cropper.x2 = this.cropper.x2 * sourceImageElement.offsetWidth / this.maxSize.width;
|
|
365
|
-
this.cropper.y1 = this.cropper.y1 * sourceImageElement.offsetHeight / this.maxSize.height;
|
|
366
|
-
this.cropper.y2 = this.cropper.y2 * sourceImageElement.offsetHeight / this.maxSize.height;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* @return {?}
|
|
371
|
-
*/
|
|
372
|
-
resetCropperPosition() {
|
|
373
|
-
this.cropperPositionService.resetCropperPosition(this.sourceImage, this.cropper, this.settings);
|
|
374
|
-
this.doAutoCrop();
|
|
375
|
-
this.imageVisible = true;
|
|
376
|
-
}
|
|
377
|
-
/**
|
|
378
|
-
* @param {?} event
|
|
379
|
-
* @return {?}
|
|
380
|
-
*/
|
|
381
|
-
keyboardAccess(event) {
|
|
382
|
-
this.changeKeyboardStepSize(event);
|
|
383
|
-
this.keyboardMoveCropper(event);
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* @private
|
|
387
|
-
* @param {?} event
|
|
388
|
-
* @return {?}
|
|
389
|
-
*/
|
|
390
|
-
changeKeyboardStepSize(event) {
|
|
391
|
-
/** @type {?} */
|
|
392
|
-
const key = +event.key;
|
|
393
|
-
if (key >= 1 && key <= 9) {
|
|
394
|
-
this.settings.stepSize = key;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* @private
|
|
399
|
-
* @param {?} event
|
|
400
|
-
* @return {?}
|
|
401
|
-
*/
|
|
402
|
-
keyboardMoveCropper(event) {
|
|
403
|
-
/** @type {?} */
|
|
404
|
-
const keyboardWhiteList = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft'];
|
|
405
|
-
if (!(keyboardWhiteList.includes(event.key))) {
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
/** @type {?} */
|
|
409
|
-
const moveType = event.shiftKey ? MoveTypes.Resize : MoveTypes.Move;
|
|
410
|
-
/** @type {?} */
|
|
411
|
-
const position = event.altKey ? getInvertedPositionForKey(event.key) : getPositionForKey(event.key);
|
|
412
|
-
/** @type {?} */
|
|
413
|
-
const moveEvent = getEventForKey(event.key, this.settings.stepSize);
|
|
414
|
-
event.preventDefault();
|
|
415
|
-
event.stopPropagation();
|
|
416
|
-
this.startMove({ clientX: 0, clientY: 0 }, moveType, position);
|
|
417
|
-
this.moveImg(moveEvent);
|
|
418
|
-
this.moveStop();
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* @param {?} event
|
|
422
|
-
* @param {?} moveType
|
|
423
|
-
* @param {?=} position
|
|
424
|
-
* @return {?}
|
|
425
|
-
*/
|
|
426
|
-
startMove(event, moveType, position = null) {
|
|
427
|
-
var _a, _b;
|
|
428
|
-
if (((_a = this.moveStart) === null || _a === void 0 ? void 0 : _a.active) && ((_b = this.moveStart) === null || _b === void 0 ? void 0 : _b.type) === MoveTypes.Pinch) {
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
if (event.preventDefault) {
|
|
432
|
-
event.preventDefault();
|
|
433
|
-
}
|
|
434
|
-
this.moveStart = Object.assign({ active: true, type: moveType, position, clientX: this.cropperPositionService.getClientX(event), clientY: this.cropperPositionService.getClientY(event) }, this.cropper);
|
|
435
|
-
}
|
|
436
|
-
/**
|
|
437
|
-
* @param {?} event
|
|
438
|
-
* @return {?}
|
|
439
|
-
*/
|
|
440
|
-
startPinch(event) {
|
|
441
|
-
if (!this.safeImgDataUrl) {
|
|
442
|
-
return;
|
|
443
|
-
}
|
|
444
|
-
if (event.preventDefault) {
|
|
445
|
-
event.preventDefault();
|
|
446
|
-
}
|
|
447
|
-
this.moveStart = Object.assign({ active: true, type: MoveTypes.Pinch, position: 'center', clientX: this.cropper.x1 + (this.cropper.x2 - this.cropper.x1) / 2, clientY: this.cropper.y1 + (this.cropper.y2 - this.cropper.y1) / 2 }, this.cropper);
|
|
448
|
-
}
|
|
449
|
-
/**
|
|
450
|
-
* @param {?} event
|
|
451
|
-
* @return {?}
|
|
452
|
-
*/
|
|
453
|
-
moveImg(event) {
|
|
454
|
-
if (this.moveStart.active) {
|
|
455
|
-
if (event.stopPropagation) {
|
|
456
|
-
event.stopPropagation();
|
|
457
|
-
}
|
|
458
|
-
if (event.preventDefault) {
|
|
459
|
-
event.preventDefault();
|
|
460
|
-
}
|
|
461
|
-
if (this.moveStart.type === MoveTypes.Move) {
|
|
462
|
-
this.cropperPositionService.move(event, this.moveStart, this.cropper);
|
|
463
|
-
this.checkCropperPosition(true);
|
|
464
|
-
}
|
|
465
|
-
else if (this.moveStart.type === MoveTypes.Resize) {
|
|
466
|
-
if (!this.cropperStaticWidth && !this.cropperStaticHeight) {
|
|
467
|
-
this.cropperPositionService.resize(event, this.moveStart, this.cropper, this.maxSize, this.settings);
|
|
468
|
-
}
|
|
469
|
-
this.checkCropperPosition(false);
|
|
470
|
-
}
|
|
471
|
-
this.cd.detectChanges();
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* @param {?} event
|
|
476
|
-
* @return {?}
|
|
477
|
-
*/
|
|
478
|
-
onPinch(event) {
|
|
479
|
-
if (this.moveStart.active) {
|
|
480
|
-
if (event.stopPropagation) {
|
|
481
|
-
event.stopPropagation();
|
|
482
|
-
}
|
|
483
|
-
if (event.preventDefault) {
|
|
484
|
-
event.preventDefault();
|
|
485
|
-
}
|
|
486
|
-
if (this.moveStart.type === MoveTypes.Pinch) {
|
|
487
|
-
this.cropperPositionService.resize(event, this.moveStart, this.cropper, this.maxSize, this.settings);
|
|
488
|
-
this.checkCropperPosition(false);
|
|
489
|
-
}
|
|
490
|
-
this.cd.detectChanges();
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
/**
|
|
494
|
-
* @private
|
|
495
|
-
* @return {?}
|
|
496
|
-
*/
|
|
497
|
-
setMaxSize() {
|
|
498
|
-
if (this.sourceImage) {
|
|
499
|
-
/** @type {?} */
|
|
500
|
-
const sourceImageElement = this.sourceImage.nativeElement;
|
|
501
|
-
this.maxSize.width = sourceImageElement.offsetWidth;
|
|
502
|
-
this.maxSize.height = sourceImageElement.offsetHeight;
|
|
503
|
-
this.marginLeft = this.sanitizer.bypassSecurityTrustStyle('calc(50% - ' + this.maxSize.width / 2 + 'px)');
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
/**
|
|
507
|
-
* @private
|
|
508
|
-
* @return {?}
|
|
509
|
-
*/
|
|
510
|
-
setCropperScaledMinSize() {
|
|
511
|
-
var _a, _b;
|
|
512
|
-
if ((_b = (_a = this.loadedImage) === null || _a === void 0 ? void 0 : _a.transformed) === null || _b === void 0 ? void 0 : _b.image) {
|
|
513
|
-
this.setCropperScaledMinWidth();
|
|
514
|
-
this.setCropperScaledMinHeight();
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
this.settings.cropperScaledMinWidth = 20;
|
|
518
|
-
this.settings.cropperScaledMinHeight = 20;
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
/**
|
|
522
|
-
* @private
|
|
523
|
-
* @return {?}
|
|
524
|
-
*/
|
|
525
|
-
setCropperScaledMinWidth() {
|
|
526
|
-
this.settings.cropperScaledMinWidth = this.cropperMinWidth > 0
|
|
527
|
-
? Math.max(20, this.cropperMinWidth / this.loadedImage.transformed.image.width * this.maxSize.width)
|
|
528
|
-
: 20;
|
|
529
|
-
}
|
|
530
|
-
/**
|
|
531
|
-
* @private
|
|
532
|
-
* @return {?}
|
|
533
|
-
*/
|
|
534
|
-
setCropperScaledMinHeight() {
|
|
535
|
-
if (this.maintainAspectRatio) {
|
|
536
|
-
this.settings.cropperScaledMinHeight = Math.max(20, this.settings.cropperScaledMinWidth / this.aspectRatio);
|
|
537
|
-
}
|
|
538
|
-
else if (this.cropperMinHeight > 0) {
|
|
539
|
-
this.settings.cropperScaledMinHeight = Math.max(20, this.cropperMinHeight / this.loadedImage.transformed.image.height * this.maxSize.height);
|
|
540
|
-
}
|
|
541
|
-
else {
|
|
542
|
-
this.settings.cropperScaledMinHeight = 20;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
/**
|
|
546
|
-
* @private
|
|
547
|
-
* @return {?}
|
|
548
|
-
*/
|
|
549
|
-
setCropperScaledMaxSize() {
|
|
550
|
-
var _a, _b;
|
|
551
|
-
if ((_b = (_a = this.loadedImage) === null || _a === void 0 ? void 0 : _a.transformed) === null || _b === void 0 ? void 0 : _b.image) {
|
|
552
|
-
/** @type {?} */
|
|
553
|
-
const ratio = this.loadedImage.transformed.size.width / this.maxSize.width;
|
|
554
|
-
this.settings.cropperScaledMaxWidth = this.cropperMaxWidth > 20 ? this.cropperMaxWidth / ratio : this.maxSize.width;
|
|
555
|
-
this.settings.cropperScaledMaxHeight = this.cropperMaxHeight > 20 ? this.cropperMaxHeight / ratio : this.maxSize.height;
|
|
556
|
-
if (this.maintainAspectRatio) {
|
|
557
|
-
if (this.settings.cropperScaledMaxWidth > this.settings.cropperScaledMaxHeight * this.aspectRatio) {
|
|
558
|
-
this.settings.cropperScaledMaxWidth = this.settings.cropperScaledMaxHeight * this.aspectRatio;
|
|
559
|
-
}
|
|
560
|
-
else if (this.settings.cropperScaledMaxWidth < this.settings.cropperScaledMaxHeight * this.aspectRatio) {
|
|
561
|
-
this.settings.cropperScaledMaxHeight = this.settings.cropperScaledMaxWidth / this.aspectRatio;
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
else {
|
|
566
|
-
this.settings.cropperScaledMaxWidth = this.maxSize.width;
|
|
567
|
-
this.settings.cropperScaledMaxHeight = this.maxSize.height;
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
/**
|
|
571
|
-
* @private
|
|
572
|
-
* @param {?=} maintainSize
|
|
573
|
-
* @return {?}
|
|
574
|
-
*/
|
|
575
|
-
checkCropperPosition(maintainSize = false) {
|
|
576
|
-
if (this.cropper.x1 < 0) {
|
|
577
|
-
this.cropper.x2 -= maintainSize ? this.cropper.x1 : 0;
|
|
578
|
-
this.cropper.x1 = 0;
|
|
579
|
-
}
|
|
580
|
-
if (this.cropper.y1 < 0) {
|
|
581
|
-
this.cropper.y2 -= maintainSize ? this.cropper.y1 : 0;
|
|
582
|
-
this.cropper.y1 = 0;
|
|
583
|
-
}
|
|
584
|
-
if (this.cropper.x2 > this.maxSize.width) {
|
|
585
|
-
this.cropper.x1 -= maintainSize ? (this.cropper.x2 - this.maxSize.width) : 0;
|
|
586
|
-
this.cropper.x2 = this.maxSize.width;
|
|
587
|
-
}
|
|
588
|
-
if (this.cropper.y2 > this.maxSize.height) {
|
|
589
|
-
this.cropper.y1 -= maintainSize ? (this.cropper.y2 - this.maxSize.height) : 0;
|
|
590
|
-
this.cropper.y2 = this.maxSize.height;
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
/**
|
|
594
|
-
* @return {?}
|
|
595
|
-
*/
|
|
596
|
-
moveStop() {
|
|
597
|
-
if (this.moveStart.active) {
|
|
598
|
-
this.moveStart.active = false;
|
|
599
|
-
this.doAutoCrop();
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
/**
|
|
603
|
-
* @return {?}
|
|
604
|
-
*/
|
|
605
|
-
pinchStop() {
|
|
606
|
-
if (this.moveStart.active) {
|
|
607
|
-
this.moveStart.active = false;
|
|
608
|
-
this.doAutoCrop();
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
/**
|
|
612
|
-
* @private
|
|
613
|
-
* @return {?}
|
|
614
|
-
*/
|
|
615
|
-
doAutoCrop() {
|
|
616
|
-
if (this.autoCrop) {
|
|
617
|
-
this.crop();
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
/**
|
|
621
|
-
* @return {?}
|
|
622
|
-
*/
|
|
623
|
-
crop() {
|
|
624
|
-
var _a, _b;
|
|
625
|
-
if (((_b = (_a = this.loadedImage) === null || _a === void 0 ? void 0 : _a.transformed) === null || _b === void 0 ? void 0 : _b.image) != null) {
|
|
626
|
-
this.startCropImage.emit();
|
|
627
|
-
/** @type {?} */
|
|
628
|
-
const output = this.cropService.crop(this.sourceImage, this.loadedImage, this.cropper, this.settings);
|
|
629
|
-
if (output != null) {
|
|
630
|
-
this.imageCropped.emit(output);
|
|
631
|
-
}
|
|
632
|
-
return output;
|
|
633
|
-
}
|
|
634
|
-
return null;
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
ImageCropperComponent.decorators = [
|
|
638
|
-
{ type: Component, args: [{
|
|
639
|
-
selector: 'image-cropper',
|
|
640
|
-
template: "<div [style.background]=\"imageVisible && backgroundColor\"\n #wrapper\n>\n <img\n #sourceImage\n class=\"ngx-ic-source-image\"\n *ngIf=\"safeImgDataUrl\"\n [src]=\"safeImgDataUrl\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n [style.transform]=\"safeTransformStyle\"\n (load)=\"imageLoadedInView()\"\n />\n <div\n class=\"ngx-ic-overlay\"\n [style.width.px]=\"maxSize.width\"\n [style.height.px]=\"maxSize.height\"\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\n ></div>\n <div class=\"ngx-ic-cropper\"\n *ngIf=\"imageVisible\"\n [class.ngx-ic-round]=\"roundCropper\"\n [style.top.px]=\"cropper.y1\"\n [style.left.px]=\"cropper.x1\"\n [style.width.px]=\"cropper.x2 - cropper.x1\"\n [style.height.px]=\"cropper.y2 - cropper.y1\"\n [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\n [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\n (keydown)=\"keyboardAccess($event)\"\n tabindex=\"0\"\n >\n <div\n (mousedown)=\"startMove($event, moveTypes.Move)\"\n (touchstart)=\"startMove($event, moveTypes.Move)\"\n class=\"ngx-ic-move\">\n </div>\n <ng-container *ngIf=\"!hideResizeSquares\">\n <span class=\"ngx-ic-resize ngx-ic-topleft\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topleft')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-top\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-topright\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'topright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'topright')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-right\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-bottomright\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomright')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-bottom\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-bottomleft\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomleft')\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize ngx-ic-left\">\n <span class=\"ngx-ic-square\"></span>\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-top\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\">\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-right\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\">\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-bottom\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\">\n </span>\n <span class=\"ngx-ic-resize-bar ngx-ic-left\"\n (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\n (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\">\n </span>\n </ng-container>\n </div>\n</div>\n",
|
|
641
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
642
|
-
styles: [":host{display:flex;max-height:100%;max-width:100%;overflow:hidden;padding:5px;text-align:center}:host,:host>div{position:relative;width:100%}:host>div img.ngx-ic-source-image{max-height:100%;max-width:100%;transform-origin:center}:host .ngx-ic-overlay{left:0;outline:var(--cropper-overlay-color,#fff) solid 100vw;pointer-events:none;position:absolute;top:0;touch-action:none}:host .ngx-ic-cropper{background:transparent;color:#53535c;display:flex;outline:100vw solid hsla(0,0%,100%,.3);outline:var(--cropper-outline-color,hsla(0,0%,100%,.3)) solid 100vw;position:absolute;touch-action:none}@media (orientation:portrait){:host .ngx-ic-cropper{outline-width:100vh}}:host .ngx-ic-cropper:after{border:1px dashed;bottom:0;color:inherit;content:\"\";left:0;opacity:.75;pointer-events:none;position:absolute;right:0;top:0;z-index:1}:host .ngx-ic-cropper .ngx-ic-move{border:1px solid hsla(0,0%,100%,.5);cursor:move;width:100%}:host .ngx-ic-cropper:focus .ngx-ic-move{border-color:#1e90ff;border-width:2px}:host .ngx-ic-cropper .ngx-ic-resize{display:inline-block;line-height:6px;opacity:.85;padding:8px;position:absolute;z-index:1}:host .ngx-ic-cropper .ngx-ic-resize .ngx-ic-square{background:#53535c;border:1px solid hsla(0,0%,100%,.5);box-sizing:content-box;display:inline-block;height:6px;width:6px}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-topleft{cursor:nwse-resize;left:-12px;top:-12px}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-top{cursor:ns-resize;left:calc(50% - 12px);top:-12px}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-topright{cursor:nesw-resize;right:-12px;top:-12px}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-right{cursor:ew-resize;right:-12px;top:calc(50% - 12px)}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-bottomright{bottom:-12px;cursor:nwse-resize;right:-12px}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-bottom{bottom:-12px;cursor:ns-resize;left:calc(50% - 12px)}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-bottomleft{bottom:-12px;cursor:nesw-resize;left:-12px}:host .ngx-ic-cropper .ngx-ic-resize.ngx-ic-left{cursor:ew-resize;left:-12px;top:calc(50% - 12px)}:host .ngx-ic-cropper .ngx-ic-resize-bar{position:absolute;z-index:1}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-top{cursor:ns-resize;height:22px;left:11px;top:-11px;width:calc(100% - 22px)}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-right{cursor:ew-resize;height:calc(100% - 22px);right:-11px;top:11px;width:22px}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-bottom{bottom:-11px;cursor:ns-resize;height:22px;left:11px;width:calc(100% - 22px)}:host .ngx-ic-cropper .ngx-ic-resize-bar.ngx-ic-left{cursor:ew-resize;height:calc(100% - 22px);left:-11px;top:11px;width:22px}:host .ngx-ic-cropper.ngx-ic-round{outline-color:transparent}:host .ngx-ic-cropper.ngx-ic-round:after{border-radius:100%;box-shadow:0 0 0 100vw hsla(0,0%,100%,.3);box-shadow:0 0 0 100vw var(--cropper-outline-color,hsla(0,0%,100%,.3))}@media (orientation:portrait){:host .ngx-ic-cropper.ngx-ic-round:after{box-shadow:0 0 0 100vh hsla(0,0%,100%,.3);box-shadow:0 0 0 100vh var(--cropper-outline-color,hsla(0,0%,100%,.3))}}:host .ngx-ic-cropper.ngx-ic-round .ngx-ic-move{border-radius:100%}:host.disabled .ngx-ic-cropper .ngx-ic-move,:host.disabled .ngx-ic-cropper .ngx-ic-resize,:host.disabled .ngx-ic-cropper .ngx-ic-resize-bar{display:none}"]
|
|
643
|
-
}] }
|
|
644
|
-
];
|
|
645
|
-
/** @nocollapse */
|
|
646
|
-
ImageCropperComponent.ctorParameters = () => [
|
|
647
|
-
{ type: CropService },
|
|
648
|
-
{ type: CropperPositionService },
|
|
649
|
-
{ type: LoadImageService },
|
|
650
|
-
{ type: DomSanitizer },
|
|
651
|
-
{ type: ChangeDetectorRef }
|
|
652
|
-
];
|
|
653
|
-
ImageCropperComponent.propDecorators = {
|
|
654
|
-
wrapper: [{ type: ViewChild, args: ['wrapper', { static: true },] }],
|
|
655
|
-
sourceImage: [{ type: ViewChild, args: ['sourceImage', { static: false },] }],
|
|
656
|
-
imageChangedEvent: [{ type: Input }],
|
|
657
|
-
imageURL: [{ type: Input }],
|
|
658
|
-
imageBase64: [{ type: Input }],
|
|
659
|
-
imageFile: [{ type: Input }],
|
|
660
|
-
format: [{ type: Input }],
|
|
661
|
-
transform: [{ type: Input }],
|
|
662
|
-
maintainAspectRatio: [{ type: Input }],
|
|
663
|
-
aspectRatio: [{ type: Input }],
|
|
664
|
-
resizeToWidth: [{ type: Input }],
|
|
665
|
-
resizeToHeight: [{ type: Input }],
|
|
666
|
-
cropperMinWidth: [{ type: Input }],
|
|
667
|
-
cropperMinHeight: [{ type: Input }],
|
|
668
|
-
cropperMaxHeight: [{ type: Input }],
|
|
669
|
-
cropperMaxWidth: [{ type: Input }],
|
|
670
|
-
cropperStaticWidth: [{ type: Input }],
|
|
671
|
-
cropperStaticHeight: [{ type: Input }],
|
|
672
|
-
canvasRotation: [{ type: Input }],
|
|
673
|
-
initialStepSize: [{ type: Input }],
|
|
674
|
-
roundCropper: [{ type: Input }],
|
|
675
|
-
onlyScaleDown: [{ type: Input }],
|
|
676
|
-
imageQuality: [{ type: Input }],
|
|
677
|
-
autoCrop: [{ type: Input }],
|
|
678
|
-
backgroundColor: [{ type: Input }],
|
|
679
|
-
containWithinAspectRatio: [{ type: Input }],
|
|
680
|
-
hideResizeSquares: [{ type: Input }],
|
|
681
|
-
cropper: [{ type: Input }],
|
|
682
|
-
alignImage: [{ type: HostBinding, args: ['style.text-align',] }, { type: Input }],
|
|
683
|
-
disabled: [{ type: HostBinding, args: ['class.disabled',] }, { type: Input }],
|
|
684
|
-
imageCropped: [{ type: Output }],
|
|
685
|
-
startCropImage: [{ type: Output }],
|
|
686
|
-
imageLoaded: [{ type: Output }],
|
|
687
|
-
cropperReady: [{ type: Output }],
|
|
688
|
-
loadImageFailed: [{ type: Output }],
|
|
689
|
-
onResize: [{ type: HostListener, args: ['window:resize',] }],
|
|
690
|
-
moveImg: [{ type: HostListener, args: ['document:mousemove', ['$event'],] }, { type: HostListener, args: ['document:touchmove', ['$event'],] }],
|
|
691
|
-
moveStop: [{ type: HostListener, args: ['document:mouseup',] }, { type: HostListener, args: ['document:touchend',] }]
|
|
692
|
-
};
|
|
693
|
-
if (false) {
|
|
694
|
-
/**
|
|
695
|
-
* @type {?}
|
|
696
|
-
* @private
|
|
697
|
-
*/
|
|
698
|
-
ImageCropperComponent.prototype.Hammer;
|
|
699
|
-
/**
|
|
700
|
-
* @type {?}
|
|
701
|
-
* @private
|
|
702
|
-
*/
|
|
703
|
-
ImageCropperComponent.prototype.settings;
|
|
704
|
-
/**
|
|
705
|
-
* @type {?}
|
|
706
|
-
* @private
|
|
707
|
-
*/
|
|
708
|
-
ImageCropperComponent.prototype.setImageMaxSizeRetries;
|
|
709
|
-
/**
|
|
710
|
-
* @type {?}
|
|
711
|
-
* @private
|
|
712
|
-
*/
|
|
713
|
-
ImageCropperComponent.prototype.moveStart;
|
|
714
|
-
/**
|
|
715
|
-
* @type {?}
|
|
716
|
-
* @private
|
|
717
|
-
*/
|
|
718
|
-
ImageCropperComponent.prototype.loadedImage;
|
|
719
|
-
/** @type {?} */
|
|
720
|
-
ImageCropperComponent.prototype.safeImgDataUrl;
|
|
721
|
-
/** @type {?} */
|
|
722
|
-
ImageCropperComponent.prototype.safeTransformStyle;
|
|
723
|
-
/** @type {?} */
|
|
724
|
-
ImageCropperComponent.prototype.marginLeft;
|
|
725
|
-
/** @type {?} */
|
|
726
|
-
ImageCropperComponent.prototype.maxSize;
|
|
727
|
-
/** @type {?} */
|
|
728
|
-
ImageCropperComponent.prototype.moveTypes;
|
|
729
|
-
/** @type {?} */
|
|
730
|
-
ImageCropperComponent.prototype.imageVisible;
|
|
731
|
-
/** @type {?} */
|
|
732
|
-
ImageCropperComponent.prototype.wrapper;
|
|
733
|
-
/** @type {?} */
|
|
734
|
-
ImageCropperComponent.prototype.sourceImage;
|
|
735
|
-
/** @type {?} */
|
|
736
|
-
ImageCropperComponent.prototype.imageChangedEvent;
|
|
737
|
-
/** @type {?} */
|
|
738
|
-
ImageCropperComponent.prototype.imageURL;
|
|
739
|
-
/** @type {?} */
|
|
740
|
-
ImageCropperComponent.prototype.imageBase64;
|
|
741
|
-
/** @type {?} */
|
|
742
|
-
ImageCropperComponent.prototype.imageFile;
|
|
743
|
-
/** @type {?} */
|
|
744
|
-
ImageCropperComponent.prototype.format;
|
|
745
|
-
/** @type {?} */
|
|
746
|
-
ImageCropperComponent.prototype.transform;
|
|
747
|
-
/** @type {?} */
|
|
748
|
-
ImageCropperComponent.prototype.maintainAspectRatio;
|
|
749
|
-
/** @type {?} */
|
|
750
|
-
ImageCropperComponent.prototype.aspectRatio;
|
|
751
|
-
/** @type {?} */
|
|
752
|
-
ImageCropperComponent.prototype.resizeToWidth;
|
|
753
|
-
/** @type {?} */
|
|
754
|
-
ImageCropperComponent.prototype.resizeToHeight;
|
|
755
|
-
/** @type {?} */
|
|
756
|
-
ImageCropperComponent.prototype.cropperMinWidth;
|
|
757
|
-
/** @type {?} */
|
|
758
|
-
ImageCropperComponent.prototype.cropperMinHeight;
|
|
759
|
-
/** @type {?} */
|
|
760
|
-
ImageCropperComponent.prototype.cropperMaxHeight;
|
|
761
|
-
/** @type {?} */
|
|
762
|
-
ImageCropperComponent.prototype.cropperMaxWidth;
|
|
763
|
-
/** @type {?} */
|
|
764
|
-
ImageCropperComponent.prototype.cropperStaticWidth;
|
|
765
|
-
/** @type {?} */
|
|
766
|
-
ImageCropperComponent.prototype.cropperStaticHeight;
|
|
767
|
-
/** @type {?} */
|
|
768
|
-
ImageCropperComponent.prototype.canvasRotation;
|
|
769
|
-
/** @type {?} */
|
|
770
|
-
ImageCropperComponent.prototype.initialStepSize;
|
|
771
|
-
/** @type {?} */
|
|
772
|
-
ImageCropperComponent.prototype.roundCropper;
|
|
773
|
-
/** @type {?} */
|
|
774
|
-
ImageCropperComponent.prototype.onlyScaleDown;
|
|
775
|
-
/** @type {?} */
|
|
776
|
-
ImageCropperComponent.prototype.imageQuality;
|
|
777
|
-
/** @type {?} */
|
|
778
|
-
ImageCropperComponent.prototype.autoCrop;
|
|
779
|
-
/** @type {?} */
|
|
780
|
-
ImageCropperComponent.prototype.backgroundColor;
|
|
781
|
-
/** @type {?} */
|
|
782
|
-
ImageCropperComponent.prototype.containWithinAspectRatio;
|
|
783
|
-
/** @type {?} */
|
|
784
|
-
ImageCropperComponent.prototype.hideResizeSquares;
|
|
785
|
-
/** @type {?} */
|
|
786
|
-
ImageCropperComponent.prototype.cropper;
|
|
787
|
-
/** @type {?} */
|
|
788
|
-
ImageCropperComponent.prototype.alignImage;
|
|
789
|
-
/** @type {?} */
|
|
790
|
-
ImageCropperComponent.prototype.disabled;
|
|
791
|
-
/** @type {?} */
|
|
792
|
-
ImageCropperComponent.prototype.imageCropped;
|
|
793
|
-
/** @type {?} */
|
|
794
|
-
ImageCropperComponent.prototype.startCropImage;
|
|
795
|
-
/** @type {?} */
|
|
796
|
-
ImageCropperComponent.prototype.imageLoaded;
|
|
797
|
-
/** @type {?} */
|
|
798
|
-
ImageCropperComponent.prototype.cropperReady;
|
|
799
|
-
/** @type {?} */
|
|
800
|
-
ImageCropperComponent.prototype.loadImageFailed;
|
|
801
|
-
/**
|
|
802
|
-
* @type {?}
|
|
803
|
-
* @private
|
|
804
|
-
*/
|
|
805
|
-
ImageCropperComponent.prototype.cropService;
|
|
806
|
-
/**
|
|
807
|
-
* @type {?}
|
|
808
|
-
* @private
|
|
809
|
-
*/
|
|
810
|
-
ImageCropperComponent.prototype.cropperPositionService;
|
|
811
|
-
/**
|
|
812
|
-
* @type {?}
|
|
813
|
-
* @private
|
|
814
|
-
*/
|
|
815
|
-
ImageCropperComponent.prototype.loadImageService;
|
|
816
|
-
/**
|
|
817
|
-
* @type {?}
|
|
818
|
-
* @private
|
|
819
|
-
*/
|
|
820
|
-
ImageCropperComponent.prototype.sanitizer;
|
|
821
|
-
/**
|
|
822
|
-
* @type {?}
|
|
823
|
-
* @private
|
|
824
|
-
*/
|
|
825
|
-
ImageCropperComponent.prototype.cd;
|
|
826
|
-
}
|
|
827
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL21hd2kvUHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9pbWFnZS1jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFHVCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFHN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSx5QkFBeUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBUXZHLE1BQU0sT0FBTyxxQkFBcUI7Ozs7Ozs7O0lBNERoQyxZQUNVLFdBQXdCLEVBQ3hCLHNCQUE4QyxFQUM5QyxnQkFBa0MsRUFDbEMsU0FBdUIsRUFDdkIsRUFBcUI7UUFKckIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGNBQVMsR0FBVCxT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bUJBQW1COzs7Ozs7O0lBbGNqQyx1Q0FBMEQ7Ozs7O0lBQzFELHlDQUF5Qzs7Ozs7SUFDekMsdURBQW1DOzs7OztJQUNuQywwQ0FBNkI7Ozs7O0lBQzdCLDRDQUFpQzs7SUFFakMsK0NBQWlDOztJQUNqQyxtREFBdUM7O0lBQ3ZDLDJDQUF1Qzs7SUFDdkMsd0NBQW9COztJQUNwQiwwQ0FBc0I7O0lBQ3RCLDZDQUFxQjs7SUFFckIsd0NBQTRFOztJQUM1RSw0Q0FBcUY7O0lBRXJGLGtEQUFnQzs7SUFDaEMseUNBQTBCOztJQUMxQiw0Q0FBNkI7O0lBQzdCLDBDQUF5Qjs7SUFFekIsdUNBQXFEOztJQUNyRCwwQ0FBd0M7O0lBQ3hDLG9EQUFpRTs7SUFDakUsNENBQWlEOztJQUNqRCw4Q0FBcUQ7O0lBQ3JELCtDQUF1RDs7SUFDdkQsZ0RBQXlEOztJQUN6RCxpREFBMkQ7O0lBQzNELGlEQUEyRDs7SUFDM0QsZ0RBQXlEOztJQUN6RCxtREFBK0Q7O0lBQy9ELG9EQUFpRTs7SUFDakUsK0NBQXVEOztJQUN2RCxnREFBeUQ7O0lBQ3pELDZDQUFtRDs7SUFDbkQsOENBQXFEOztJQUNyRCw2Q0FBbUQ7O0lBQ25ELHlDQUEyQzs7SUFDM0MsZ0RBQXlEOztJQUN6RCx5REFBMkU7O0lBQzNFLGtEQUE2RDs7SUFDN0Qsd0NBS0U7O0lBQ0YsMkNBQ2tFOztJQUNsRSx5Q0FDMEI7O0lBRTFCLDZDQUErRDs7SUFDL0QsK0NBQW9EOztJQUNwRCw0Q0FBd0Q7O0lBQ3hELDZDQUF3RDs7SUFDeEQsZ0RBQXFEOzs7OztJQUduRCw0Q0FBZ0M7Ozs7O0lBQ2hDLHVEQUFzRDs7Ozs7SUFDdEQsaURBQTBDOzs7OztJQUMxQywwQ0FBK0I7Ozs7O0lBQy9CLG1DQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBpc0Rldk1vZGUsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVN0eWxlLCBTYWZlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24sIERpbWVuc2lvbnMsIEltYWdlQ3JvcHBlZEV2ZW50LCBJbWFnZVRyYW5zZm9ybSwgTG9hZGVkSW1hZ2UsIE1vdmVTdGFydCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jcm9wcGVyLW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IENyb3BwZXJTZXR0aW5ncyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY3JvcHBlci5zZXR0aW5ncyc7XG5pbXBvcnQgeyBNb3ZlVHlwZXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL21vdmUtc3RhcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENyb3BTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY3JvcC5zZXJ2aWNlJztcbmltcG9ydCB7IENyb3BwZXJQb3NpdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jcm9wcGVyLXBvc2l0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9hZEltYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvYWQtaW1hZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBIYW1tZXJTdGF0aWMgfSBmcm9tICcuLi91dGlscy9oYW1tZXIudXRpbHMnO1xuaW1wb3J0IHsgZ2V0RXZlbnRGb3JLZXksIGdldEludmVydGVkUG9zaXRpb25Gb3JLZXksIGdldFBvc2l0aW9uRm9yS2V5IH0gZnJvbSAnLi4vdXRpbHMva2V5Ym9hcmQudXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpbWFnZS1jcm9wcGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLWNyb3BwZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbWFnZS1jcm9wcGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlQ3JvcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgcHJpdmF0ZSBIYW1tZXI6IEhhbW1lclN0YXRpYyA9IHdpbmRvdz8uWydIYW1tZXInXSB8fCBudWxsO1xuICBwcml2YXRlIHNldHRpbmdzID0gbmV3IENyb3BwZXJTZXR0aW5ncygpO1xuICBwcml2YXRlIHNldEltYWdlTWF4U2l6ZVJldHJpZXMgPSAwO1xuICBwcml2YXRlIG1vdmVTdGFydDogTW92ZVN0YXJ0O1xuICBwcml2YXRlIGxvYWRlZEltYWdlOiBMb2FkZWRJbWFnZTtcblxuICBzYWZlSW1nRGF0YVVybDogU2FmZVVybCB8IHN0cmluZztcbiAgc2FmZVRyYW5zZm9ybVN0eWxlOiBTYWZlU3R5bGUgfCBzdHJpbmc7XG4gIG1hcmdpbkxlZnQ6IFNhZmVTdHlsZSB8IHN0cmluZyA9ICcwcHgnO1xuICBtYXhTaXplOiBEaW1lbnNpb25zO1xuICBtb3ZlVHlwZXMgPSBNb3ZlVHlwZXM7XG4gIGltYWdlVmlzaWJsZSA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ3dyYXBwZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSB3cmFwcGVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc291cmNlSW1hZ2UnLCB7IHN0YXRpYzogZmFsc2UgfSkgc291cmNlSW1hZ2U6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBJbnB1dCgpIGltYWdlQ2hhbmdlZEV2ZW50OiBhbnk7XG4gIEBJbnB1dCgpIGltYWdlVVJMOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGltYWdlQmFzZTY0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGltYWdlRmlsZTogRmlsZTtcblxuICBASW5wdXQoKSBmb3JtYXQ6IE91dHB1dEZvcm1hdCA9IHRoaXMuc2V0dGluZ3MuZm9ybWF0O1xuICBASW5wdXQoKSB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge307XG4gIEBJbnB1dCgpIG1haW50YWluQXNwZWN0UmF0aW8gPSB0aGlzLnNldHRpbmdzLm1haW50YWluQXNwZWN0UmF0aW87XG4gIEBJbnB1dCgpIGFzcGVjdFJhdGlvID0gdGhpcy5zZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgQElucHV0KCkgcmVzaXplVG9XaWR0aCA9IHRoaXMuc2V0dGluZ3MucmVzaXplVG9XaWR0aDtcbiAgQElucHV0KCkgcmVzaXplVG9IZWlnaHQgPSB0aGlzLnNldHRpbmdzLnJlc2l6ZVRvSGVpZ2h0O1xuICBASW5wdXQoKSBjcm9wcGVyTWluV2lkdGggPSB0aGlzLnNldHRpbmdzLmNyb3BwZXJNaW5XaWR0aDtcbiAgQElucHV0KCkgY3JvcHBlck1pbkhlaWdodCA9IHRoaXMuc2V0dGluZ3MuY3JvcHBlck1pbkhlaWdodDtcbiAgQElucHV0KCkgY3JvcHBlck1heEhlaWdodCA9IHRoaXMuc2V0dGluZ3MuY3JvcHBlck1heEhlaWdodDtcbiAgQElucHV0KCkgY3JvcHBlck1heFdpZHRoID0gdGhpcy5zZXR0aW5ncy5jcm9wcGVyTWF4V2lkdGg7XG4gIEBJbnB1dCgpIGNyb3BwZXJTdGF0aWNXaWR0aCA9IHRoaXMuc2V0dGluZ3MuY3JvcHBlclN0YXRpY1dpZHRoO1xuICBASW5wdXQoKSBjcm9wcGVyU3RhdGljSGVpZ2h0ID0gdGhpcy5zZXR0aW5ncy5jcm9wcGVyU3RhdGljSGVpZ2h0O1xuICBASW5wdXQoKSBjYW52YXNSb3RhdGlvbiA9IHRoaXMuc2V0dGluZ3MuY2FudmFzUm90YXRpb247XG4gIEBJbnB1dCgpIGluaXRpYWxTdGVwU2l6ZSA9IHRoaXMuc2V0dGluZ3MuaW5pdGlhbFN0ZXBTaXplO1xuICBASW5wdXQoKSByb3VuZENyb3BwZXIgPSB0aGlzLnNldHRpbmdzLnJvdW5kQ3JvcHBlcjtcbiAgQElucHV0KCkgb25seVNjYWxlRG93biA9IHRoaXMuc2V0dGluZ3Mub25seVNjYWxlRG93bjtcbiAgQElucHV0KCkgaW1hZ2VRdWFsaXR5ID0gdGhpcy5zZXR0aW5ncy5pbWFnZVF1YWxpdHk7XG4gIEBJbnB1dCgpIGF1dG9Dcm9wID0gdGhpcy5zZXR0aW5ncy5hdXRvQ3JvcDtcbiAgQElucHV0KCkgYmFja2dyb3VuZENvbG9yID0gdGhpcy5zZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3I7XG4gIEBJbnB1dCgpIGNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbyA9IHRoaXMuc2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvO1xuICBASW5wdXQoKSBoaWRlUmVzaXplU3F1YXJlcyA9IHRoaXMuc2V0dGluZ3MuaGlkZVJlc2l6ZVNxdWFyZXM7XG4gIEBJbnB1dCgpIGNyb3BwZXI6IENyb3BwZXJQb3NpdGlvbiA9IHtcbiAgICB4MTogLTEwMCxcbiAgICB5MTogLTEwMCxcbiAgICB4MjogMTAwMDAsXG4gICAgeTI6IDEwMDAwXG4gIH07XG4gIEBIb3N0QmluZGluZygnc3R5bGUudGV4dC1hbGlnbicpXG4gIEBJbnB1dCgpIGFsaWduSW1hZ2U6ICdsZWZ0JyB8ICdjZW50ZXInID0gdGhpcy5zZXR0aW5ncy5hbGlnbkltYWdlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRpc2FibGVkJylcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgaW1hZ2VDcm9wcGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJbWFnZUNyb3BwZWRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHN0YXJ0Q3JvcEltYWdlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgaW1hZ2VMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPExvYWRlZEltYWdlPigpO1xuICBAT3V0cHV0KCkgY3JvcHBlclJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxEaW1lbnNpb25zPigpO1xuICBAT3V0cHV0KCkgbG9hZEltYWdlRmFpbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY3JvcFNlcnZpY2U6IENyb3BTZXJ2aWNlLFxuICAgIHByaXZhdGUgY3JvcHBlclBvc2l0aW9uU2VydmljZTogQ3JvcHBlclBvc2l0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGxvYWRJbWFnZVNlcnZpY2U6IExvYWRJbWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZXNVcGRhdGVTZXR0aW5ncyhjaGFuZ2VzKTtcbiAgICB0aGlzLm9uQ2hhbmdlc0lucHV0SW1hZ2UoY2hhbmdlcyk7XG5cbiAgICBpZiAodGhpcy5sb2FkZWRJbWFnZT8ub3JpZ2luYWwuaW1hZ2UuY29tcGxldGUgJiYgKGNoYW5nZXMuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvIHx8IGNoYW5nZXMuY2FudmFzUm90YXRpb24pKSB7XG4gICAgICB0aGlzLmxvYWRJbWFnZVNlcnZpY2VcbiAgICAgICAgLnRyYW5zZm9ybUxvYWRlZEltYWdlKHRoaXMubG9hZGVkSW1hZ2UsIHRoaXMuc2V0dGluZ3MpXG4gICAgICAgIC50aGVuKChyZXMpID0+IHRoaXMuc2V0TG9hZGVkSW1hZ2UocmVzKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMubG9hZEltYWdlRXJyb3IoZXJyKSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmNyb3BwZXIgfHwgY2hhbmdlcy5tYWludGFpbkFzcGVjdFJhdGlvIHx8IGNoYW5nZXMuYXNwZWN0UmF0aW8pIHtcbiAgICAgIHRoaXMuc2V0TWF4U2l6ZSgpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWluU2l6ZSgpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWF4U2l6ZSgpO1xuICAgICAgaWYgKHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpbyAmJiAoY2hhbmdlcy5tYWludGFpbkFzcGVjdFJhdGlvIHx8IGNoYW5nZXMuYXNwZWN0UmF0aW8pKSB7XG4gICAgICAgIHRoaXMucmVzZXRDcm9wcGVyUG9zaXRpb24oKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5jcm9wcGVyKSB7XG4gICAgICAgIHRoaXMuY2hlY2tDcm9wcGVyUG9zaXRpb24oZmFsc2UpO1xuICAgICAgICB0aGlzLmRvQXV0b0Nyb3AoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLnRyYW5zZm9ybSkge1xuICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybSB8fCB7fTtcbiAgICAgIHRoaXMuc2V0Q3NzVHJhbnNmb3JtKCk7XG4gICAgICB0aGlzLmRvQXV0b0Nyb3AoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uQ2hhbmdlc1VwZGF0ZVNldHRpbmdzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLnNldHRpbmdzLnNldE9wdGlvbnNGcm9tQ2hhbmdlcyhjaGFuZ2VzKTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmNyb3BwZXJTdGF0aWNIZWlnaHQgJiYgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU3RhdGljV2lkdGgpIHtcbiAgICAgIHRoaXMuc2V0dGluZ3Muc2V0T3B0aW9ucyh7XG4gICAgICAgIGhpZGVSZXNpemVTcXVhcmVzOiB0cnVlLFxuICAgICAgICBjcm9wcGVyTWluV2lkdGg6IHRoaXMuc2V0dGluZ3MuY3JvcHBlclN0YXRpY1dpZHRoLFxuICAgICAgICBjcm9wcGVyTWluSGVpZ2h0OiB0aGlzLnNldHRpbmdzLmNyb3BwZXJTdGF0aWNIZWlnaHQsXG4gICAgICAgIGNyb3BwZXJNYXhIZWlnaHQ6IHRoaXMuc2V0dGluZ3MuY3JvcHBlclN0YXRpY0hlaWdodCxcbiAgICAgICAgY3JvcHBlck1heFdpZHRoOiB0aGlzLnNldHRpbmdzLmNyb3BwZXJTdGF0aWNXaWR0aCxcbiAgICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25DaGFuZ2VzSW5wdXRJbWFnZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuaW1hZ2VDaGFuZ2VkRXZlbnQgfHwgY2hhbmdlcy5pbWFnZVVSTCB8fCBjaGFuZ2VzLmltYWdlQmFzZTY0IHx8IGNoYW5nZXMuaW1hZ2VGaWxlKSB7XG4gICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmltYWdlQ2hhbmdlZEV2ZW50ICYmIHRoaXMuaXNWYWxpZEltYWdlQ2hhbmdlZEV2ZW50KCkpIHtcbiAgICAgIHRoaXMubG9hZEltYWdlRmlsZSh0aGlzLmltYWdlQ2hhbmdlZEV2ZW50LnRhcmdldC5maWxlc1swXSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmltYWdlVVJMICYmIHRoaXMuaW1hZ2VVUkwpIHtcbiAgICAgIHRoaXMubG9hZEltYWdlRnJvbVVSTCh0aGlzLmltYWdlVVJMKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaW1hZ2VCYXNlNjQgJiYgdGhpcy5pbWFnZUJhc2U2NCkge1xuICAgICAgdGhpcy5sb2FkQmFzZTY0SW1hZ2UodGhpcy5pbWFnZUJhc2U2NCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmltYWdlRmlsZSAmJiB0aGlzLmltYWdlRmlsZSkge1xuICAgICAgdGhpcy5sb2FkSW1hZ2VGaWxlKHRoaXMuaW1hZ2VGaWxlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRJbWFnZUNoYW5nZWRFdmVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbWFnZUNoYW5nZWRFdmVudD8udGFyZ2V0Py5maWxlcz8ubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q3NzVHJhbnNmb3JtKCkge1xuICAgIHRoaXMuc2FmZVRyYW5zZm9ybVN0eWxlID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgJ3NjYWxlWCgnICsgKHRoaXMudHJhbnNmb3JtLnNjYWxlIHx8IDEpICogKHRoaXMudHJhbnNmb3JtLmZsaXBIID8gLTEgOiAxKSArICcpJyArXG4gICAgICAnc2NhbGVZKCcgKyAodGhpcy50cmFuc2Zvcm0uc2NhbGUgfHwgMSkgKiAodGhpcy50cmFuc2Zvcm0uZmxpcFYgPyAtMSA6IDEpICsgJyknICtcbiAgICAgICdyb3RhdGUoJyArICh0aGlzLnRyYW5zZm9ybS5yb3RhdGUgfHwgMCkgKyAnZGVnKSdcbiAgICApO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncy5zdGVwU2l6ZSA9IHRoaXMuaW5pdGlhbFN0ZXBTaXplO1xuICAgIHRoaXMuYWN0aXZhdGVQaW5jaEdlc3R1cmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZVZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmxvYWRlZEltYWdlID0gbnVsbDtcbiAgICB0aGlzLnNhZmVJbWdEYXRhVXJsID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnJ1xuICAgICAgKyAnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFDMGxFUVZRWVYyTmdBQUlBQUFVJ1xuICAgICAgKyAnQUFhclZ5RkVBQUFBQVNVVk9SSzVDWUlJPSc7XG4gICAgdGhpcy5tb3ZlU3RhcnQgPSB7XG4gICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgdHlwZTogbnVsbCxcbiAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgeDE6IDAsXG4gICAgICB5MTogMCxcbiAgICAgIHgyOiAwLFxuICAgICAgeTI6IDAsXG4gICAgICBjbGllbnRYOiAwLFxuICAgICAgY2xpZW50WTogMFxuICAgIH07XG4gICAgdGhpcy5tYXhTaXplID0ge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICAgIHRoaXMuY3JvcHBlci54MSA9IC0xMDA7XG4gICAgdGhpcy5jcm9wcGVyLnkxID0gLTEwMDtcbiAgICB0aGlzLmNyb3BwZXIueDIgPSAxMDAwMDtcbiAgICB0aGlzLmNyb3BwZXIueTIgPSAxMDAwMDtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEltYWdlRmlsZShmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkSW1hZ2VTZXJ2aWNlXG4gICAgICAubG9hZEltYWdlRmlsZShmaWxlLCB0aGlzLnNldHRpbmdzKVxuICAgICAgLnRoZW4oKHJlcykgPT4gdGhpcy5zZXRMb2FkZWRJbWFnZShyZXMpKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMubG9hZEltYWdlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRCYXNlNjRJbWFnZShpbWFnZUJhc2U2NDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkSW1hZ2VTZXJ2aWNlXG4gICAgICAubG9hZEJhc2U2NEltYWdlKGltYWdlQmFzZTY0LCB0aGlzLnNldHRpbmdzKVxuICAgICAgLnRoZW4oKHJlcykgPT4gdGhpcy5zZXRMb2FkZWRJbWFnZShyZXMpKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHRoaXMubG9hZEltYWdlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRJbWFnZUZyb21VUkwodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRJbWFnZVNlcnZpY2VcbiAgICAgIC5sb2FkSW1hZ2VGcm9tVVJMKHVybCwgdGhpcy5zZXR0aW5ncylcbiAgICAgIC50aGVuKChyZXMpID0+IHRoaXMuc2V0TG9hZGVkSW1hZ2UocmVzKSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB0aGlzLmxvYWRJbWFnZUVycm9yKGVycikpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRMb2FkZWRJbWFnZShsb2FkZWRJbWFnZTogTG9hZGVkSW1hZ2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRlZEltYWdlID0gbG9hZGVkSW1hZ2U7XG4gICAgdGhpcy5zYWZlSW1nRGF0YVVybCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5iYXNlNjQpO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRJbWFnZUVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB0aGlzLmxvYWRJbWFnZUZhaWxlZC5lbWl0KCk7XG4gIH1cblxuICBpbWFnZUxvYWRlZEluVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkZWRJbWFnZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmltYWdlTG9hZGVkLmVtaXQodGhpcy5sb2FkZWRJbWFnZSk7XG4gICAgICB0aGlzLnNldEltYWdlTWF4U2l6ZVJldHJpZXMgPSAwO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNoZWNrSW1hZ2VNYXhTaXplUmVjdXJzaXZlbHkoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ltYWdlTWF4U2l6ZVJlY3Vyc2l2ZWx5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNldEltYWdlTWF4U2l6ZVJldHJpZXMgPiA0MCkge1xuICAgICAgdGhpcy5sb2FkSW1hZ2VGYWlsZWQuZW1pdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zb3VyY2VJbWFnZUxvYWRlZCgpKSB7XG4gICAgICB0aGlzLnNldE1heFNpemUoKTtcbiAgICAgIHRoaXMuc2V0Q3JvcHBlclNjYWxlZE1pblNpemUoKTtcbiAgICAgIHRoaXMuc2V0Q3JvcHBlclNjYWxlZE1heFNpemUoKTtcbiAgICAgIHRoaXMucmVzZXRDcm9wcGVyUG9zaXRpb24oKTtcbiAgICAgIHRoaXMuY3JvcHBlclJlYWR5LmVtaXQoeyAuLi50aGlzLm1heFNpemUgfSk7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEltYWdlTWF4U2l6ZVJldHJpZXMrKztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGVja0ltYWdlTWF4U2l6ZVJlY3Vyc2l2ZWx5KCksIDUwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNvdXJjZUltYWdlTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUltYWdlPy5uYXRpdmVFbGVtZW50Py5vZmZzZXRXaWR0aCA+IDA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25SZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmxvYWRlZEltYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzaXplQ3JvcHBlclBvc2l0aW9uKCk7XG4gICAgdGhpcy5zZXRNYXhTaXplKCk7XG4gICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWluU2l6ZSgpO1xuICAgIHRoaXMuc2V0Q3JvcHBlclNjYWxlZE1heFNpemUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZhdGVQaW5jaEdlc3R1cmUoKSB7XG4gICAgaWYgKHRoaXMuSGFtbWVyKSB7XG4gICAgICBjb25zdCBoYW1tZXIgPSBuZXcgdGhpcy5IYW1tZXIodGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgaGFtbWVyLmdldCgncGluY2gnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7XG4gICAgICBoYW1tZXIub24oJ3BpbmNobW92ZScsIHRoaXMub25QaW5jaC5iaW5kKHRoaXMpKTtcbiAgICAgIGhhbW1lci5vbigncGluY2hlbmQnLCB0aGlzLnBpbmNoU3RvcC5iaW5kKHRoaXMpKTtcbiAgICAgIGhhbW1lci5vbigncGluY2hzdGFydCcsIHRoaXMuc3RhcnRQaW5jaC5iaW5kKHRoaXMpKTtcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tOZ3hJbWFnZUNyb3BwZXJdIENvdWxkIG5vdCBmaW5kIEhhbW1lckpTIC0gUGluY2ggR2VzdHVyZSB3b25cXCd0IHdvcmsnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2l6ZUNyb3BwZXJQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2VJbWFnZUVsZW1lbnQgPSB0aGlzLnNvdXJjZUltYWdlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMubWF4U2l6ZS53aWR0aCAhPT0gc291cmNlSW1hZ2VFbGVtZW50Lm9mZnNldFdpZHRoIHx8IHRoaXMubWF4U2l6ZS5oZWlnaHQgIT09IHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcbiAgICAgIHRoaXMuY3JvcHBlci54MSA9IHRoaXMuY3JvcHBlci54MSAqIHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRXaWR0aCAvIHRoaXMubWF4U2l6ZS53aWR0aDtcbiAgICAgIHRoaXMuY3JvcHBlci54MiA9IHRoaXMuY3JvcHBlci54MiAqIHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRXaWR0aCAvIHRoaXMubWF4U2l6ZS53aWR0aDtcbiAgICAgIHRoaXMuY3JvcHBlci55MSA9IHRoaXMuY3JvcHBlci55MSAqIHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRIZWlnaHQgLyB0aGlzLm1heFNpemUuaGVpZ2h0O1xuICAgICAgdGhpcy5jcm9wcGVyLnkyID0gdGhpcy5jcm9wcGVyLnkyICogc291cmNlSW1hZ2VFbGVtZW50Lm9mZnNldEhlaWdodCAvIHRoaXMubWF4U2l6ZS5oZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRDcm9wcGVyUG9zaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5jcm9wcGVyUG9zaXRpb25TZXJ2aWNlLnJlc2V0Q3JvcHBlclBvc2l0aW9uKHRoaXMuc291cmNlSW1hZ2UsIHRoaXMuY3JvcHBlciwgdGhpcy5zZXR0aW5ncyk7XG4gICAgdGhpcy5kb0F1dG9Dcm9wKCk7XG4gICAgdGhpcy5pbWFnZVZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAga2V5Ym9hcmRBY2Nlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLmNoYW5nZUtleWJvYXJkU3RlcFNpemUoZXZlbnQpO1xuICAgIHRoaXMua2V5Ym9hcmRNb3ZlQ3JvcHBlcihldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZUtleWJvYXJkU3RlcFNpemUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSArZXZlbnQua2V5O1xuICAgIGlmIChrZXkgPj0gMSAmJiBrZXkgPD0gOSkge1xuICAgICAgdGhpcy5zZXR0aW5ncy5zdGVwU2l6ZSA9IGtleTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGtleWJvYXJkTW92ZUNyb3BwZXIoZXZlbnQpIHtcbiAgICBjb25zdCBrZXlib2FyZFdoaXRlTGlzdDogc3RyaW5nW10gPSBbJ0Fycm93VXAnLCAnQXJyb3dEb3duJywgJ0Fycm93UmlnaHQnLCAnQXJyb3dMZWZ0J107XG4gICAgaWYgKCEoa2V5Ym9hcmRXaGl0ZUxpc3QuaW5jbHVkZXMoZXZlbnQua2V5KSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW92ZVR5cGUgPSBldmVudC5zaGlmdEtleSA/IE1vdmVUeXBlcy5SZXNpemUgOiBNb3ZlVHlwZXMuTW92ZTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IGV2ZW50LmFsdEtleSA/IGdldEludmVydGVkUG9zaXRpb25Gb3JLZXkoZXZlbnQua2V5KSA6IGdldFBvc2l0aW9uRm9yS2V5KGV2ZW50LmtleSk7XG4gICAgY29uc3QgbW92ZUV2ZW50ID0gZ2V0RXZlbnRGb3JLZXkoZXZlbnQua2V5LCB0aGlzLnNldHRpbmdzLnN0ZXBTaXplKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc3RhcnRNb3ZlKHsgY2xpZW50WDogMCwgY2xpZW50WTogMCB9LCBtb3ZlVHlwZSwgcG9zaXRpb24pO1xuICAgIHRoaXMubW92ZUltZyhtb3ZlRXZlbnQpO1xuICAgIHRoaXMubW92ZVN0b3AoKTtcbiAgfVxuXG4gIHN0YXJ0TW92ZShldmVudDogYW55LCBtb3ZlVHlwZTogTW92ZVR5cGVzLCBwb3NpdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb3ZlU3RhcnQ/LmFjdGl2ZSAmJiB0aGlzLm1vdmVTdGFydD8udHlwZSA9PT0gTW92ZVR5cGVzLlBpbmNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy5tb3ZlU3RhcnQgPSB7XG4gICAgICBhY3RpdmU6IHRydWUsXG4gICAgICB0eXBlOiBtb3ZlVHlwZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgY2xpZW50WDogdGhpcy5jcm9wcGVyUG9zaXRpb25TZXJ2aWNlLmdldENsaWVudFgoZXZlbnQpLFxuICAgICAgY2xpZW50WTogdGhpcy5jcm9wcGVyUG9zaXRpb25TZXJ2aWNlLmdldENsaWVudFkoZXZlbnQpLFxuICAgICAgLi4udGhpcy5jcm9wcGVyXG4gICAgfTtcbiAgfVxuXG4gIHN0YXJ0UGluY2goZXZlbnQ6IGFueSkge1xuICAgIGlmICghdGhpcy5zYWZlSW1nRGF0YVVybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHRoaXMubW92ZVN0YXJ0ID0ge1xuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgdHlwZTogTW92ZVR5cGVzLlBpbmNoLFxuICAgICAgcG9zaXRpb246ICdjZW50ZXInLFxuICAgICAgY2xpZW50WDogdGhpcy5jcm9wcGVyLngxICsgKHRoaXMuY3JvcHBlci54MiAtIHRoaXMuY3JvcHBlci54MSkgLyAyLFxuICAgICAgY2xpZW50WTogdGhpcy5jcm9wcGVyLnkxICsgKHRoaXMuY3JvcHBlci55MiAtIHRoaXMuY3JvcHBlci55MSkgLyAyLFxuICAgICAgLi4udGhpcy5jcm9wcGVyXG4gICAgfTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnRvdWNobW92ZScsIFsnJGV2ZW50J10pXG4gIG1vdmVJbWcoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vdmVTdGFydC5hY3RpdmUpIHtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1vdmVTdGFydC50eXBlID09PSBNb3ZlVHlwZXMuTW92ZSkge1xuICAgICAgICB0aGlzLmNyb3BwZXJQb3NpdGlvblNlcnZpY2UubW92ZShldmVudCwgdGhpcy5tb3ZlU3RhcnQsIHRoaXMuY3JvcHBlcik7XG4gICAgICAgIHRoaXMuY2hlY2tDcm9wcGVyUG9zaXRpb24odHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubW92ZVN0YXJ0LnR5cGUgPT09IE1vdmVUeXBlcy5SZXNpemUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNyb3BwZXJTdGF0aWNXaWR0aCAmJiAhdGhpcy5jcm9wcGVyU3RhdGljSGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5jcm9wcGVyUG9zaXRpb25TZXJ2aWNlLnJlc2l6ZShldmVudCwgdGhpcy5tb3ZlU3RhcnQsIHRoaXMuY3JvcHBlciwgdGhpcy5tYXhTaXplLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrQ3JvcHBlclBvc2l0aW9uKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGluY2goZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLm1vdmVTdGFydC5hY3RpdmUpIHtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1vdmVTdGFydC50eXBlID09PSBNb3ZlVHlwZXMuUGluY2gpIHtcbiAgICAgICAgdGhpcy5jcm9wcGVyUG9zaXRpb25TZXJ2aWNlLnJlc2l6ZShldmVudCwgdGhpcy5tb3ZlU3RhcnQsIHRoaXMuY3JvcHBlciwgdGhpcy5tYXhTaXplLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5jaGVja0Nyb3BwZXJQb3NpdGlvbihmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldE1heFNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc291cmNlSW1hZ2UpIHtcbiAgICAgIGNvbnN0IHNvdXJjZUltYWdlRWxlbWVudCA9IHRoaXMuc291cmNlSW1hZ2UubmF0aXZlRWxlbWVudDtcbiAgICAgIHRoaXMubWF4U2l6ZS53aWR0aCA9IHNvdXJjZUltYWdlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgIHRoaXMubWF4U2l6ZS5oZWlnaHQgPSBzb3VyY2VJbWFnZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgdGhpcy5tYXJnaW5MZWZ0ID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKCdjYWxjKDUwJSAtICcgKyB0aGlzLm1heFNpemUud2lkdGggLyAyICsgJ3B4KScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q3JvcHBlclNjYWxlZE1pblNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGVkSW1hZ2U/LnRyYW5zZm9ybWVkPy5pbWFnZSkge1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWluV2lkdGgoKTtcbiAgICAgIHRoaXMuc2V0Q3JvcHBlclNjYWxlZE1pbkhlaWdodCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCA9IDIwO1xuICAgICAgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0ID0gMjA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDcm9wcGVyU2NhbGVkTWluV2lkdGgoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWluV2lkdGggPSB0aGlzLmNyb3BwZXJNaW5XaWR0aCA+IDBcbiAgICAgID8gTWF0aC5tYXgoMjAsIHRoaXMuY3JvcHBlck1pbldpZHRoIC8gdGhpcy5sb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5pbWFnZS53aWR0aCAqIHRoaXMubWF4U2l6ZS53aWR0aClcbiAgICAgIDogMjA7XG4gIH1cblxuICBwcml2YXRlIHNldENyb3BwZXJTY2FsZWRNaW5IZWlnaHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpbykge1xuICAgICAgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0ID0gTWF0aC5tYXgoMjAsIHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1pbldpZHRoIC8gdGhpcy5hc3BlY3RSYXRpbyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNyb3BwZXJNaW5IZWlnaHQgPiAwKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQgPSBNYXRoLm1heChcbiAgICAgICAgMjAsXG4gICAgICAgIHRoaXMuY3JvcHBlck1pbkhlaWdodCAvIHRoaXMubG9hZGVkSW1hZ2UudHJhbnNmb3JtZWQuaW1hZ2UuaGVpZ2h0ICogdGhpcy5tYXhTaXplLmhlaWdodFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0ID0gMjA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDcm9wcGVyU2NhbGVkTWF4U2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkZWRJbWFnZT8udHJhbnNmb3JtZWQ/LmltYWdlKSB7XG4gICAgICBjb25zdCByYXRpbyA9IHRoaXMubG9hZGVkSW1hZ2UudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAvIHRoaXMubWF4U2l6ZS53aWR0aDtcbiAgICAgIHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heFdpZHRoID0gdGhpcy5jcm9wcGVyTWF4V2lkdGggPiAyMCA/IHRoaXMuY3JvcHBlck1heFdpZHRoIC8gcmF0aW8gOiB0aGlzLm1heFNpemUud2lkdGg7XG4gICAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQgPSB0aGlzLmNyb3BwZXJNYXhIZWlnaHQgPiAyMCA/IHRoaXMuY3JvcHBlck1heEhlaWdodCAvIHJhdGlvIDogdGhpcy5tYXhTaXplLmhlaWdodDtcbiAgICAgIGlmICh0aGlzLm1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heFdpZHRoID4gdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0ICogdGhpcy5hc3BlY3RSYXRpbykge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heFdpZHRoID0gdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0ICogdGhpcy5hc3BlY3RSYXRpbztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCA8IHRoaXMuc2V0dGluZ3MuY3JvcHBlclNjYWxlZE1heEhlaWdodCAqIHRoaXMuYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQgPSB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCAvIHRoaXMuYXNwZWN0UmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXR0aW5ncy5jcm9wcGVyU2NhbGVkTWF4V2lkdGggPSB0aGlzLm1heFNpemUud2lkdGg7XG4gICAgICB0aGlzLnNldHRpbmdzLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQgPSB0aGlzLm1heFNpemUuaGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tDcm9wcGVyUG9zaXRpb24obWFpbnRhaW5TaXplID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jcm9wcGVyLngxIDwgMCkge1xuICAgICAgdGhpcy5jcm9wcGVyLngyIC09IG1haW50YWluU2l6ZSA/IHRoaXMuY3JvcHBlci54MSA6IDA7XG4gICAgICB0aGlzLmNyb3BwZXIueDEgPSAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5jcm9wcGVyLnkxIDwgMCkge1xuICAgICAgdGhpcy5jcm9wcGVyLnkyIC09IG1haW50YWluU2l6ZSA/IHRoaXMuY3JvcHBlci55MSA6IDA7XG4gICAgICB0aGlzLmNyb3BwZXIueTEgPSAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5jcm9wcGVyLngyID4gdGhpcy5tYXhTaXplLndpZHRoKSB7XG4gICAgICB0aGlzLmNyb3BwZXIueDEgLT0gbWFpbnRhaW5TaXplID8gKHRoaXMuY3JvcHBlci54MiAtIHRoaXMubWF4U2l6ZS53aWR0aCkgOiAwO1xuICAgICAgdGhpcy5jcm9wcGVyLngyID0gdGhpcy5tYXhTaXplLndpZHRoO1xuICAgIH1cbiAgICBpZiAodGhpcy5jcm9wcGVyLnkyID4gdGhpcy5tYXhTaXplLmhlaWdodCkge1xuICAgICAgdGhpcy5jcm9wcGVyLnkxIC09IG1haW50YWluU2l6ZSA/ICh0aGlzLmNyb3BwZXIueTIgLSB0aGlzLm1heFNpemUuaGVpZ2h0KSA6IDA7XG4gICAgICB0aGlzLmNyb3BwZXIueTIgPSB0aGlzLm1heFNpemUuaGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNldXAnKVxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp0b3VjaGVuZCcpXG4gIG1vdmVTdG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vdmVTdGFydC5hY3RpdmUpIHtcbiAgICAgIHRoaXMubW92ZVN0YXJ0LmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kb0F1dG9Dcm9wKCk7XG4gICAgfVxuICB9XG5cbiAgcGluY2hTdG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vdmVTdGFydC5hY3RpdmUpIHtcbiAgICAgIHRoaXMubW92ZVN0YXJ0LmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kb0F1dG9Dcm9wKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkb0F1dG9Dcm9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9Dcm9wKSB7XG4gICAgICB0aGlzLmNyb3AoKTtcbiAgICB9XG4gIH1cblxuICBjcm9wKCk6IEltYWdlQ3JvcHBlZEV2ZW50IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMubG9hZGVkSW1hZ2U/LnRyYW5zZm9ybWVkPy5pbWFnZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnN0YXJ0Q3JvcEltYWdlLmVtaXQoKTtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JvcFNlcnZpY2UuY3JvcCh0aGlzLnNvdXJjZUltYWdlLCB0aGlzLmxvYWRlZEltYWdlLCB0aGlzLmNyb3BwZXIsIHRoaXMuc2V0dGluZ3MpO1xuICAgICAgaWYgKG91dHB1dCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VDcm9wcGVkLmVtaXQob3V0cHV0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
|