keevo-components 1.8.457 → 1.8.459

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.
@@ -1,21 +1,16 @@
1
- import { Component, computed, HostListener, Injectable, signal, ViewChild } from '@angular/core';
1
+ import { Component, Injectable, signal } from '@angular/core';
2
2
  import { DialogModule } from 'primeng/dialog';
3
+ import { ImageCropperComponent } from 'ngx-image-cropper';
3
4
  // ? Componente de modal usado no cutter
4
- import { SliderModule } from 'primeng/slider';
5
5
  import { CommonModule } from '@angular/common';
6
6
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
7
- import { ButtonModule } from 'primeng/button';
8
- import { FileUploadModule } from 'primeng/fileupload';
9
7
  import { KvLabelModule } from '../../components/kv-label/kv-label.module';
10
8
  import { FormService } from './form.service';
11
9
  import { KvModalModule } from '../../components/kv-modal/kv-modal.module';
12
10
  import { KvButtonModule } from '../../components/kv-button/kv-button.module';
13
11
  import * as i0 from "@angular/core";
14
12
  import * as i1 from "primeng/dynamicdialog";
15
- import * as i2 from "primeng/slider";
16
- import * as i3 from "@angular/forms";
17
- import * as i4 from "../../components/kv-button/kv-button.component";
18
- import * as i5 from "../../components/kv-label/kv-label.component";
13
+ import * as i2 from "../../components/kv-button/kv-button.component";
19
14
  export class ImageCutterService {
20
15
  constructor(dialogservice) {
21
16
  this.dialogservice = dialogservice;
@@ -51,158 +46,39 @@ export class ImageCutterService {
51
46
  }
52
47
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: ImageCutterService, decorators: [{
53
48
  type: Injectable,
54
- args: [{
55
- providedIn: 'root'
56
- }]
49
+ args: [{ providedIn: 'root' }]
57
50
  }], ctorParameters: () => [{ type: i1.DialogService }] });
58
51
  class SimpleComponent {
59
52
  constructor(dynamicDialogRef, dialogService) {
60
53
  this.dynamicDialogRef = dynamicDialogRef;
61
54
  this.dialogService = dialogService;
62
- // ? Variavies que recebem os valores do dialog
55
+ this.imageChangedEvent = null;
56
+ this.croppedImage = '';
57
+ //#region Variáveis de controle
63
58
  this._variaviesDialog = signal(null);
64
- //? Referências para o contexto e canvas
65
- this.canvas = signal(null);
66
- this.ctx = signal(null);
67
- this._Image = signal(new Image());
68
- //? Coordenadas iniciais e finais do desenho
69
- this.startX = 0;
70
- this.startY = 0;
71
- //? Fator de escala da imagem e zoom
72
- this.scaleFactorReadOnly = computed(() => {
73
- return Math.min(this.scaleFactor(), this.scaleFactorInicial() + 5);
74
- });
75
- this.scaleFactorInicial = signal(null);
76
- this.scaleFactor = signal(null);
77
- this.scaleFactorModel = 0;
78
- this.imageX = 0;
79
- this.imageY = 0;
80
- //#region Propriedades computadas de tamanho do canvas e da imagem
81
- //? Largura e altura do canvas baseado na tamanho da tela
82
- this.canvasWidth = computed(() => this.widthTela() * 0.5);
83
- this.canvasHeight = computed(() => this.heigthTela() * 0.5);
84
- //? Largura e altura da área de corte
85
- this.cutWidth = computed(() => {
86
- if (this._variaviesDialog()?.indCircle) {
87
- return this.radius() * 2;
88
- }
89
- else {
90
- const canvasWidth = this.canvasWidth();
91
- const maxWidth = canvasWidth * 0.8;
92
- const proportionalHeight = maxWidth * this.proporcaoImagem();
93
- return proportionalHeight > this.canvasHeight() * 0.8 ? this.canvasHeight() * 0.8 / this.proporcaoImagem() : maxWidth;
94
- }
95
- });
96
- this.cutHeight = computed(() => {
97
- if (this._variaviesDialog()?.indCircle) {
98
- return this.radius() * 2;
99
- }
100
- else {
101
- const canvasHeight = this.canvasHeight();
102
- const maxHeight = canvasHeight * 0.8;
103
- const proportionalWidth = maxHeight / this.proporcaoImagem();
104
- return proportionalWidth > this.canvasWidth() * 0.8 ? this.canvasWidth() * 0.8 * this.proporcaoImagem() : maxHeight;
105
- }
106
- });
107
- //? Largura e altura da imagem no canvas (baseado na escala) - tamanho real da imagem
108
- this.canvaImageWidth = computed(() => {
109
- return this._Image().width * this.scaleFactorReadOnly();
110
- });
111
- this.canvaImageHeight = computed(() => {
112
- return this._Image().height * this.scaleFactorReadOnly();
113
- });
114
- this.proporcaoImagem = computed(() => {
115
- return this._variaviesDialog()?.height / this._variaviesDialog()?.width;
116
- });
117
- this.radius = computed(() => {
118
- const minSize = Math.min(this.canvasHeight() * 0.8, this.canvasWidth() * 0.8);
119
- return minSize / 2;
120
- });
121
- //#endregion
122
- // #region Limites de movimentação da imagem
123
- //? Limites de movimentação da imagem
124
- this.indCircle = computed(() => {
125
- return this._variaviesDialog()?.indCircle;
126
- });
127
- this.xMin = computed(() => {
128
- return !this._variaviesDialog()?.indCircle ? (this.canvasWidth() - this.cutWidth()) / 2 : (this.canvasWidth() - (this.radius() * 2)) / 2;
129
- });
130
- this.yMin = computed(() => {
131
- return !this._variaviesDialog()?.indCircle ? (this.canvasHeight() - this.cutHeight()) / 2 : (this.canvasHeight() - (this.radius() * 2)) / 2;
132
- });
133
- this.xMax = computed(() => {
134
- return !this._variaviesDialog()?.indCircle ? -(this.canvaImageWidth() - (this.xMin()) - this.cutWidth()) : -(this.canvaImageWidth() - (this.xMin()) - (this.radius() * 2));
135
- });
136
- this.yMax = computed(() => {
137
- return !this._variaviesDialog()?.indCircle ? -(this.canvaImageHeight() - (this.yMin()) - this.cutHeight()) : -(this.canvaImageHeight() - (this.yMin()) - (this.radius() * 2));
138
- });
139
- // #endregion
140
- //? Proporção da imagem
141
- this.widthTela = signal(0);
142
- this.heigthTela = signal(0);
143
- //#endregion
144
- //#region handlers de eventos
145
- this.comparadorOnZoomChange = this.scaleFactorInicial();
146
- this.atualizaTamanhoTela();
59
+ this.aspectRatio = signal(1 / 1);
147
60
  }
148
- setScaleFactorModel(valor) {
149
- this.scaleFactorModel = valor - this.scaleFactorInicial();
150
- this.scaleFactor.set(valor);
61
+ fileChangeEvent(event) {
62
+ this.imageChangedEvent = event;
151
63
  }
152
- onWindowResize() {
153
- this.atualizaTamanhoTela();
154
- this.updateCanvasSize();
155
- this.atualizaCutBorder();
64
+ imageCropped(event) {
65
+ this.croppedImage = event.base64;
156
66
  }
157
- atualizaTamanhoTela() {
158
- this.widthTela.set(window.innerWidth);
159
- this.heigthTela.set(window.innerHeight);
160
- }
161
- ngAfterViewInit() {
67
+ imageLoaded(image) { }
68
+ cropperReady() { }
69
+ loadImageFailed() { }
70
+ //#endregion
71
+ ngAfterContentInit() {
162
72
  this.recuperarVariaviesDialog();
163
- this.inciarReferencias();
164
- this.iniciarCanvas();
73
+ this.recuperaInstanciaDialog();
74
+ this.setAspectRatio();
165
75
  }
166
- inciarReferencias() {
167
- this.canvas.set(this.cropCanvas.nativeElement);
168
- this.ctx.set(this.canvas().getContext('2d'));
169
- this._Image().src = this._variaviesDialog()?.imagem;
170
- }
171
- iniciarCanvas() {
172
- this._Image().onload = () => {
173
- //? Define o tamanho do canvas
174
- this.canvas().height = this.canvasHeight();
175
- this.canvas().width = this.canvasWidth();
176
- this.ajustarZommEPosicaoInicial();
177
- this.initializeImageMove(this.canvas(), this.ctx(), this._Image());
178
- this.initializeMouseWheel(this.canvas(), this.ctx(), this._Image());
179
- this.redrawCanvas(this.ctx(), this._Image());
180
- };
181
- }
182
- ajustarZommEPosicaoInicial() {
183
- const cutWidth = this.cutWidth();
184
- const cutHeight = this.cutHeight();
185
- const imageWidth = this._Image().width;
186
- const imageHeight = this._Image().height;
187
- //? Ajusta possição e zoom inicial
188
- if (this._variaviesDialog()?.indCircle) {
189
- const scaleFactor = (this.radius() * 2) / Math.min(imageWidth, imageHeight);
190
- this.scaleFactorInicial.set(scaleFactor);
191
- this.setScaleFactorModel(scaleFactor);
192
- }
193
- else {
194
- const scaleFactor = this.cutHeight() === this.cutWidth()
195
- ? this._Image().width > this._Image().height
196
- ? this.cutHeight() / imageHeight
197
- : this.cutWidth() / imageWidth
198
- : this.cutHeight() > this.cutWidth()
199
- ? this.cutHeight() / imageHeight
200
- : this.cutWidth() / imageWidth;
201
- this.scaleFactorInicial.set(scaleFactor);
202
- this.setScaleFactorModel(scaleFactor);
203
- }
204
- this.imageX = Math.max((this.canvas().width - imageWidth * this.scaleFactorReadOnly()) / 2, this.xMin());
205
- this.imageY = Math.max((this.canvasHeight() - imageHeight * this.scaleFactorReadOnly()) / 2, this.yMin());
76
+ setAspectRatio(width = this._variaviesDialog()?.width, height = this._variaviesDialog()?.height) {
77
+ const gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));
78
+ const divisor = gcd(width, height);
79
+ const aspectWidth = width / divisor;
80
+ const aspectHeight = height / divisor;
81
+ this.aspectRatio.set(aspectWidth / aspectHeight);
206
82
  }
207
83
  //#region Métodos de recuperação de dados
208
84
  recuperaInstanciaDialog() {
@@ -218,273 +94,13 @@ class SimpleComponent {
218
94
  this._variaviesDialog.set(this.recuperaInstanciaDialog().data.id);
219
95
  }
220
96
  //#endregion
221
- //#region Métodos de atualizacao do canvas
222
- //? Atualiza o tamanho do canvas
223
- updateCanvasSize() {
224
- this.imageX = (this.canvas().width - this._Image().width * this.scaleFactorReadOnly()) / 2;
225
- this.imageY = (this.canvasHeight() / 2) - (this._Image().height * this.scaleFactorReadOnly()) / 2;
226
- this.canvas().height = this.canvasHeight();
227
- this.canvas().width = this.canvasWidth();
228
- this.redrawCanvas(this.ctx(), this._Image());
229
- }
230
- redrawCanvas(ctx, img) {
231
- if (!ctx)
232
- return;
233
- this.drawCropArea(ctx);
234
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
235
- ctx.filter = 'blur(5px) opacity(0.9)';
236
- ctx.drawImage(img, this.imageX, this.imageY, img.width * this.scaleFactorReadOnly(), img.height * this.scaleFactorReadOnly());
237
- ctx.filter = 'none';
238
- this.drawImageInCropArea(ctx, img);
239
- }
240
- //? Desenha a área de corte
241
- drawCropArea(ctx) {
242
- if (!ctx)
243
- return;
244
- this.atualizaCutBorder();
245
- const cropX = ctx.canvas.width / 2 - this.cutWidth() / 2;
246
- const cropY = ctx.canvas.height / 2 - this.cutHeight() / 2;
247
- const cropXCircle = ctx.canvas.width / 2 - this.radius() / 2;
248
- const cropYCircle = ctx.canvas.height / 2 - this.radius() / 2;
249
- ctx.beginPath();
250
- ctx.strokeStyle = 'transparent';
251
- ctx.lineWidth = 2;
252
- if (this._variaviesDialog()?.indCircle) {
253
- ctx.arc(cropXCircle, cropYCircle, this.radius(), 0, Math.PI * 2, true);
254
- }
255
- else {
256
- ctx.rect(cropX, cropY, this.cutWidth(), this.cutHeight());
257
- }
258
- ctx.stroke();
259
- }
260
- //? Desenha a imagem na área de corte
261
- drawImageInCropArea(ctx, img) {
262
- if (!ctx)
263
- return;
264
- const cropX = (ctx.canvas.width - this.cutWidth()) / 2;
265
- const cropY = (ctx.canvas.height - this.cutHeight()) / 2;
266
- ctx.save();
267
- ctx.beginPath();
268
- if (this._variaviesDialog()?.indCircle) {
269
- ctx.arc(ctx.canvas.width / 2, ctx.canvas.height / 2, this.radius(), 0, Math.PI * 2, true);
270
- }
271
- else {
272
- ctx.rect(cropX, cropY, this.cutWidth(), this.cutHeight());
273
- }
274
- ctx.clip();
275
- ctx.drawImage(img, this.imageX, this.imageY, img.width * this.scaleFactorReadOnly(), img.height * this.scaleFactorReadOnly());
276
- ctx.restore();
277
- }
278
- atualizaCutBorder() {
279
- if (this.cropBorder && this.cropBorder.nativeElement) {
280
- const cropBorderElement = this.cropBorder.nativeElement;
281
- if (this._variaviesDialog()?.indCircle) {
282
- cropBorderElement.style.borderRadius = this.radius() * 2 + 'px';
283
- cropBorderElement.style.width = this.radius() * 2 + 'px';
284
- cropBorderElement.style.height = this.radius() * 2 + 'px';
285
- }
286
- else {
287
- cropBorderElement.style.width = this.cutWidth() + 'px';
288
- cropBorderElement.style.height = this.cutHeight() + 'px';
289
- }
290
- }
291
- }
292
- onZoomChange(e) {
293
- const prevZoom = this.comparadorOnZoomChange;
294
- const zoomValue = e.value;
295
- this.comparadorOnZoomChange = e.value;
296
- const direction = prevZoom < zoomValue ? 'up' : 'down';
297
- this.ajustarZoom(direction, e.value);
298
- }
299
- initializeMouseWheel(canvas, ctx, img) {
300
- canvas.onwheel = (e) => {
301
- e.preventDefault();
302
- //? Recuperando os valores de zoom e delta atuais
303
- const direction = e.deltaY > 0 ? 'down' : 'up';
304
- this.ajustarZoom(direction);
305
- };
306
- }
307
- ajustarZoom(direction, value) {
308
- const prevScaleFactor = this.scaleFactorReadOnly();
309
- const delta = direction == 'down' ? -0.015 : 0.015;
310
- let scaleFactor = prevScaleFactor + (delta * 1.4);
311
- if (value)
312
- scaleFactor = value + this.scaleFactorInicial();
313
- const newHeight = this._Image().height * scaleFactor;
314
- const newWidth = this._Image().width * scaleFactor;
315
- if (this._variaviesDialog()?.indCircle) {
316
- if (newHeight < this.radius() * 2 || newWidth < this.radius() * 2) {
317
- scaleFactor = prevScaleFactor;
318
- }
319
- else {
320
- this.scaleFactor.set(scaleFactor);
321
- this.setScaleFactorModel(scaleFactor);
322
- }
323
- }
324
- else {
325
- if (newHeight < this.cutHeight() || newWidth < this.cutWidth()) {
326
- scaleFactor = prevScaleFactor;
327
- }
328
- else {
329
- this.scaleFactor.set(scaleFactor);
330
- this.setScaleFactorModel(scaleFactor);
331
- }
332
- }
333
- this.scaleFactor.set(scaleFactor);
334
- this.setScaleFactorModel(scaleFactor);
335
- const canvas = this.cropCanvas.nativeElement;
336
- const canvasWidth = canvas.offsetWidth;
337
- const canvasHeight = canvas.offsetHeight;
338
- const centerX = canvasWidth / 2;
339
- const centerY = canvasHeight / 2;
340
- const newCanvasX = centerX - (centerX - this.imageX) * (scaleFactor / prevScaleFactor);
341
- const newCanvasY = centerY - (centerY - this.imageY) * (scaleFactor / prevScaleFactor);
342
- this.imageX = newCanvasX;
343
- this.imageY = newCanvasY;
344
- if (!this.verificaImagemdentroDosLimiteXmin()) {
345
- const diffXmin = this.retornaDiffXmax();
346
- this.moveImage(this.imageX - diffXmin);
347
- }
348
- if (!this.verificaImagemdentroDosLimiteXmax()) {
349
- const diffXmax = this.retornaDiffXmin();
350
- this.moveImage(this.imageX + diffXmax);
351
- }
352
- if (!this.verificaImagemdentroDosLimiteYmax()) {
353
- const diffYmax = this.retornaDiffYmin();
354
- this.moveImage(undefined, this.imageY + diffYmax);
355
- }
356
- if (!this.verificaImagemdentroDosLimiteYmin()) {
357
- const diffYmin = this.retornaDiffYmax();
358
- this.moveImage(undefined, this.imageY - diffYmin);
359
- }
360
- this.redrawCanvas(this.ctx(), this._Image());
361
- }
362
- verificaImagemdentroDosLimiteXmin() {
363
- const newImageX = this.imageX;
364
- return newImageX < this.xMin();
365
- }
366
- verificaImagemdentroDosLimiteXmax() {
367
- const newImageX = this.imageX;
368
- return newImageX > this.xMax();
369
- }
370
- verificaImagemdentroDosLimiteYmin() {
371
- const newImageY = this.imageY;
372
- return newImageY < this.yMin();
373
- }
374
- verificaImagemdentroDosLimiteYmax() {
375
- const newImageY = this.imageY;
376
- return newImageY > this.yMax();
377
- }
378
- retornaDiffXmin() {
379
- const newImageX = this.imageX;
380
- return this.xMin() - newImageX;
381
- }
382
- retornaDiffXmax() {
383
- const newImageX = this.imageX;
384
- return newImageX - this.xMax();
385
- }
386
- retornaDiffYmin() {
387
- const newImageY = this.imageY;
388
- return this.yMin() - newImageY;
389
- }
390
- retornaDiffYmax() {
391
- const newImageY = this.imageY;
392
- return newImageY - this.yMax();
393
- }
394
- initializeImageMove(canvas, ctx, img) {
395
- let isDragging = false;
396
- canvas.style.cursor = 'grab';
397
- canvas.onmousedown = (e) => {
398
- isDragging = true;
399
- canvas.style.cursor = 'grabbing';
400
- this.startX = e.offsetX - this.imageX;
401
- this.startY = e.offsetY - this.imageY;
402
- };
403
- canvas.onmouseup = () => {
404
- isDragging = false;
405
- canvas.style.cursor = 'grab';
406
- };
407
- canvas.onmouseout = () => {
408
- isDragging = false;
409
- canvas.style.cursor = 'grab';
410
- };
411
- canvas.onmousemove = (e) => {
412
- if (isDragging) {
413
- // Calcula o novo posicionamento da imagem
414
- let newImageX = e.offsetX - this.startX;
415
- let newImageY = e.offsetY - this.startY;
416
- if (newImageX < this.xMin() && newImageX > this.xMax()) {
417
- this.moveImage(newImageX);
418
- }
419
- if (newImageY < this.yMin() && newImageY > this.yMax()) {
420
- this.moveImage(undefined, newImageY);
421
- }
422
- this.redrawCanvas(ctx, img);
423
- }
424
- };
425
- }
426
- moveImage(dx, dy) {
427
- this.imageX = (dx ?? this.imageX);
428
- this.imageY = (dy ?? this.imageY);
429
- }
430
- //#endregion
431
97
  //#region Métodos de corte e fechamento do modal
432
98
  cropImage() {
433
- const ctx = this.ctx();
434
- if (ctx) {
435
- const X = ((this.canvas().width - this._Image().width * this.scaleFactorReadOnly()) / 2);
436
- const Y = ((this.canvasHeight() / 2) - (this._Image().height * this.scaleFactorReadOnly()) / 2);
437
- // Recuperar o imageData da imagem que está na área de corte
438
- let imageData;
439
- const cropX = (ctx.canvas.width - this.cutWidth()) / 2;
440
- const cropY = (ctx.canvas.height - this.cutHeight()) / 2;
441
- if (this._variaviesDialog()?.indCircle) {
442
- // Create a new canvas with the same dimensions as the circle
443
- const circleCanvas = document.createElement('canvas');
444
- const circleCtx = circleCanvas.getContext('2d');
445
- circleCanvas.width = this.radius() * 2;
446
- circleCanvas.height = this.radius() * 2;
447
- // Draw the circle on the new canvas
448
- circleCtx.beginPath();
449
- circleCtx.arc(this.radius(), this.radius(), this.radius(), 0, 2 * Math.PI);
450
- circleCtx.fill();
451
- // Set the composite operation to 'destination-in' to cut out the circle
452
- ctx.globalCompositeOperation = 'destination-in';
453
- // Draw the image on the main canvas using the circle as a mask
454
- ctx.drawImage(circleCanvas, cropX, cropY);
455
- // Reset the composite operation to the default value
456
- ctx.globalCompositeOperation = 'source-over';
457
- // Get the image data of the cropped circle
458
- imageData = ctx.getImageData(cropX, cropY, this.radius() * 2, this.radius() * 2);
459
- }
460
- else {
461
- imageData = ctx.getImageData(cropX, cropY, this.cutWidth(), this.cutHeight());
462
- }
463
- // Obter os valores de width e height da variável _variaviesDialog
464
- const variaveisDialog = this._variaviesDialog();
465
- if (variaveisDialog) {
466
- const { width, height } = variaveisDialog;
467
- // Criar um novo canvas e contexto com os valores de width e height
468
- const newCanvas = document.createElement('canvas');
469
- const newCtx = newCanvas.getContext('2d');
470
- newCanvas.width = width;
471
- newCanvas.height = height;
472
- if (newCtx) {
473
- // Redimensionar a imagem para o tamanho especificado
474
- const tempCanvas = document.createElement('canvas');
475
- const tempCtx = tempCanvas.getContext('2d');
476
- tempCanvas.width = this.cutWidth();
477
- tempCanvas.height = this.cutHeight();
478
- tempCtx.putImageData(imageData, 0, 0);
479
- newCtx.drawImage(tempCanvas, 0, 0, width, height);
480
- window.dispatchEvent(new CustomEvent('cropImage', { detail: {
481
- result: Promise.resolve(newCanvas.toDataURL()),
482
- status: true
483
- } }));
484
- this.closeCropModal();
485
- }
486
- }
487
- }
99
+ window.dispatchEvent(new CustomEvent('cropImage', { detail: {
100
+ result: this.croppedImage,
101
+ status: true
102
+ } }));
103
+ this.closeCropModal();
488
104
  }
489
105
  closeCropModal() {
490
106
  this.dialogInstance.close();
@@ -497,73 +113,73 @@ class SimpleComponent {
497
113
  this.closeCropModal();
498
114
  }
499
115
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: SimpleComponent, deps: [{ token: i1.DynamicDialogRef }, { token: i1.DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
500
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.8", type: SimpleComponent, isStandalone: true, selector: "app-simple-component", host: { listeners: { "window:resize": "onWindowResize($event)" } }, viewQueries: [{ propertyName: "cropCanvas", first: true, predicate: ["cropCanvas"], descendants: true }, { propertyName: "cropBorder", first: true, predicate: ["cropBorder"], descendants: true }], ngImport: i0, template: `
116
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.8", type: SimpleComponent, isStandalone: true, selector: "app-simple-component", ngImport: i0, template: `
501
117
  <div class="modal-content">
502
- <div class="crop-container">
503
- <canvas #cropCanvas class="crop-canvas"></canvas>
504
- <div #cropBorder class="crop-border"></div>
505
- </div>
506
118
 
507
- <div class="w-full mt-2">
508
- <kv-label label="Zoom" style="text-align: left;" />
509
- <p-slider [(ngModel)]="this.scaleFactorModel" [step]="0.0001" [max]="5" (onChange)="onZoomChange($event)"></p-slider>
510
- </div>
119
+ <image-cropper
120
+ [imageBase64]="_variaviesDialog()?.imagem"
121
+ (imageCropped)="imageCropped($event)"
122
+ [aspectRatio]="aspectRatio()"
123
+ (imageLoaded)="imageLoaded($event)"
124
+ (cropperReady)="cropperReady()"
125
+ (loadImageFailed)="loadImageFailed()"
126
+ [roundCropper]="this._variaviesDialog()?.indCircle"
127
+ [maintainAspectRatio]="true"
128
+ [imageQuality]="100"
129
+ format="jpeg"
130
+ output='base64'
131
+ alignImage="center"
132
+ />
511
133
 
512
- <div class="button-container">
134
+
135
+ </div>
136
+ <div class="button-container">
513
137
  <kv-button label="Cancelar" severity="tertiary" icon="close" (click)="cancel()"></kv-button>
514
138
  <kv-button label="Recortar" severity="primary" icon="crop" (click)="cropImage()" class="ml-2"></kv-button>
515
139
  </div>
516
140
 
517
- </div>
518
141
 
519
142
 
520
-
521
- `, isInline: true, styles: ["img{border-style:solid;border-width:2px;border-radius:50%;object-fit:cover}i{font-size:22px}.botao-alterar-foto{border-style:none;width:max-content;background-color:#002542;color:#000;font-weight:700;cursor:pointer;padding:7px 9px}.botao-alterar-foto i{color:#fff}.botao-excluir-foto{border-style:none;width:max-content;background-color:#002542;color:#000;font-weight:700;cursor:pointer;padding:7px 9px}.botao-excluir-foto i{color:#fff}.btn{position:absolute;top:87%;left:87%;transform:translate(-50%,-50%)}.image-container{display:inline-block;position:relative}.modal-content{position:relative;background-color:#fefefe;margin:1% auto;padding:20px;width:80%;max-width:fit-content;text-align:center;border-radius:12px}.crop-container{display:flex;justify-content:center;align-items:center}.crop-canvas{border:1px solid #d1d5db;border-radius:12px;width:100%;height:auto}.crop-border{position:absolute;border:2px dashed #9ca3af;pointer-events:none}.zoom-container{padding-top:20px;padding-bottom:20px}.button-container{display:flex;align-items:center;justify-content:flex-end;flex-direction:row;margin-top:24px}\n"], dependencies: [{ kind: "ngmodule", type: DialogModule }, { kind: "ngmodule", type: KvModalModule }, { kind: "ngmodule", type: SliderModule }, { kind: "component", type: i2.Slider, selector: "p-slider", inputs: ["animate", "disabled", "min", "max", "orientation", "step", "range", "style", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: FileUploadModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: KvButtonModule }, { kind: "component", type: i4.KvButtonComponent, selector: "kv-button", inputs: ["fullWidth", "type", "loading", "severity", "size", "icon", "label", "disabled"], outputs: ["onClick"] }, { kind: "ngmodule", type: KvLabelModule }, { kind: "component", type: i5.KvLabelComponent, selector: "kv-label", inputs: ["componentId", "label"] }] }); }
143
+ `, isInline: true, styles: ["img{border-style:solid;border-width:2px;border-radius:50%;object-fit:cover}i{font-size:22px}.botao-alterar-foto{border-style:none;width:max-content;background-color:#002542;color:#000;font-weight:700;cursor:pointer;padding:7px 9px}.botao-alterar-foto i{color:#fff}.botao-excluir-foto{border-style:none;width:max-content;background-color:#002542;color:#000;font-weight:700;cursor:pointer;padding:7px 9px}.botao-excluir-foto i{color:#fff}.btn{position:absolute;top:87%;left:87%;transform:translate(-50%,-50%)}.image-container{display:inline-block;position:relative}.modal-content{height:60vh;position:relative;background-color:#fefefe;margin:1% auto;padding:20px;width:80%;max-width:fit-content;text-align:center;border-radius:12px;display:flex;align-items:center;justify-content:center}.crop-container{display:flex;justify-content:center;align-items:center}.crop-canvas{border:1px solid #d1d5db;border-radius:12px;width:100%;height:auto}.crop-border{position:absolute;border:2px dashed #9ca3af;pointer-events:none}.zoom-container{padding-top:20px;padding-bottom:20px}.button-container{display:flex;align-items:center;justify-content:flex-end;flex-direction:row;margin-top:24px;position:fixed;bottom:0;background:#fff;width:90%;padding:15px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DialogModule }, { kind: "ngmodule", type: KvModalModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: KvButtonModule }, { kind: "component", type: i2.KvButtonComponent, selector: "kv-button", inputs: ["fullWidth", "type", "loading", "severity", "size", "icon", "label", "disabled"], outputs: ["onClick"] }, { kind: "ngmodule", type: KvLabelModule }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }] }); }
522
144
  }
523
145
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: SimpleComponent, decorators: [{
524
146
  type: Component,
525
147
  args: [{ selector: 'app-simple-component', template: `
526
148
  <div class="modal-content">
527
- <div class="crop-container">
528
- <canvas #cropCanvas class="crop-canvas"></canvas>
529
- <div #cropBorder class="crop-border"></div>
530
- </div>
531
149
 
532
- <div class="w-full mt-2">
533
- <kv-label label="Zoom" style="text-align: left;" />
534
- <p-slider [(ngModel)]="this.scaleFactorModel" [step]="0.0001" [max]="5" (onChange)="onZoomChange($event)"></p-slider>
535
- </div>
150
+ <image-cropper
151
+ [imageBase64]="_variaviesDialog()?.imagem"
152
+ (imageCropped)="imageCropped($event)"
153
+ [aspectRatio]="aspectRatio()"
154
+ (imageLoaded)="imageLoaded($event)"
155
+ (cropperReady)="cropperReady()"
156
+ (loadImageFailed)="loadImageFailed()"
157
+ [roundCropper]="this._variaviesDialog()?.indCircle"
158
+ [maintainAspectRatio]="true"
159
+ [imageQuality]="100"
160
+ format="jpeg"
161
+ output='base64'
162
+ alignImage="center"
163
+ />
536
164
 
537
- <div class="button-container">
165
+
166
+ </div>
167
+ <div class="button-container">
538
168
  <kv-button label="Cancelar" severity="tertiary" icon="close" (click)="cancel()"></kv-button>
539
169
  <kv-button label="Recortar" severity="primary" icon="crop" (click)="cropImage()" class="ml-2"></kv-button>
540
170
  </div>
541
171
 
542
- </div>
543
-
544
172
 
545
173
 
546
174
  `, standalone: true, imports: [
175
+ CommonModule,
547
176
  DialogModule,
548
177
  KvModalModule,
549
- SliderModule,
550
- CommonModule,
551
- ButtonModule,
552
- FileUploadModule,
553
- SliderModule,
554
178
  FormsModule,
555
179
  ReactiveFormsModule,
556
180
  KvButtonModule,
557
181
  KvLabelModule,
558
- ], styles: ["img{border-style:solid;border-width:2px;border-radius:50%;object-fit:cover}i{font-size:22px}.botao-alterar-foto{border-style:none;width:max-content;background-color:#002542;color:#000;font-weight:700;cursor:pointer;padding:7px 9px}.botao-alterar-foto i{color:#fff}.botao-excluir-foto{border-style:none;width:max-content;background-color:#002542;color:#000;font-weight:700;cursor:pointer;padding:7px 9px}.botao-excluir-foto i{color:#fff}.btn{position:absolute;top:87%;left:87%;transform:translate(-50%,-50%)}.image-container{display:inline-block;position:relative}.modal-content{position:relative;background-color:#fefefe;margin:1% auto;padding:20px;width:80%;max-width:fit-content;text-align:center;border-radius:12px}.crop-container{display:flex;justify-content:center;align-items:center}.crop-canvas{border:1px solid #d1d5db;border-radius:12px;width:100%;height:auto}.crop-border{position:absolute;border:2px dashed #9ca3af;pointer-events:none}.zoom-container{padding-top:20px;padding-bottom:20px}.button-container{display:flex;align-items:center;justify-content:flex-end;flex-direction:row;margin-top:24px}\n"] }]
559
- }], ctorParameters: () => [{ type: i1.DynamicDialogRef }, { type: i1.DialogService }], propDecorators: { cropCanvas: [{
560
- type: ViewChild,
561
- args: ['cropCanvas']
562
- }], cropBorder: [{
563
- type: ViewChild,
564
- args: ['cropBorder']
565
- }], onWindowResize: [{
566
- type: HostListener,
567
- args: ['window:resize', ['$event']]
568
- }] } });
569
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY3V0dGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvYXBpL3NlcnZpY2VzL2ltYWdlLmN1dHRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWdCLFFBQVEsRUFBYyxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBMEM5Qyx3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7Ozs7OztBQTlDN0UsTUFBTSxPQUFPLGtCQUFrQjtJQUU3QixZQUNtQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUMzQyxDQUFDO0lBRUwsR0FBRyxDQUFDLFdBQW1CLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxZQUFxQixLQUFLO1FBQ2hGLE1BQU0sU0FBUyxHQUFH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LGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTTtRQUNKLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFDO2dCQUN6RCxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ2pDLE1BQU0sRUFBRSxLQUFLO2FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtJQUN2QixDQUFDOzhHQXRqQkcsZUFBZTtrR0FBZixlQUFlLHlWQTFJVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJULGdxQ0FzR0MsWUFBWSw4QkFDWixhQUFhLDhCQUNiLFlBQVksK1JBQ1osWUFBWSw4QkFDWixZQUFZLDhCQUNaLGdCQUFnQiw4QkFFaEIsV0FBVyw4VkFDWCxtQkFBbUIsOEJBQ25CLGNBQWMseU5BQ2QsYUFBYTs7MkZBS1gsZUFBZTtrQkE1SXBCLFNBQVM7K0JBQ0Usc0JBQXNCLFlBQ3RCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQlQsY0FvR1csSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2QsYUFBYTtxQkFFZDtpSEFnQjBCLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDRSxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBK0d6QixjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRSZWYsIGNvbXB1dGVkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdGFibGUsIHNpZ25hbCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dDb21wb25lbnQsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbWFnZUN1dHRlclNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nc2VydmljZTogRGlhbG9nU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIGN1dChpbWFnZUJhc2U2NDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgaW5kQ2lyY2xlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgY3V0Q29uZmlnID0geyBpbWFnZUJhc2U2NCwgd2lkdGgsIGhlaWdodCwgaW5kQ2lyY2xlIH07XHJcbiAgICB0aGlzLmFicmlyTW9kYWwoY3V0Q29uZmlnKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjcm9wSW1hZ2UnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmKGV2ZW50LmRldGFpbC5zdGF0dXMgPT0gdHJ1ZSApIHtcclxuICAgICAgICAgIHJlc29sdmUoZXZlbnQuZGV0YWlsLnJlc3VsdCk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICByZWplY3QoJ09wZXJhY2FvIGNhbmNlbGFkYS4nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgYWJyaXJNb2RhbChjdXRDb25maWc6IHsgaW1hZ2VCYXNlNjQ6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGluZENpcmNsZTogYm9vbGVhbiB9KSB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSAgICAgICB7XHJcbiAgICAgIGNsb3NhYmxlOiB0cnVlLFxyXG4gICAgICBtYXhpbWl6YWJsZTogZmFsc2UsXHJcbiAgICAgIHBvcHVwOiB0cnVlLFxyXG4gICAgICB3aWR0aDogJzc1dncnLFxyXG4gICAgICBoZWFkZXI6IGBDb3J0YXJgICxcclxuICAgICAgaWQ6IHsgaW1hZ2VtOiBjdXRDb25maWcuaW1hZ2VCYXNlNjQsIHdpZHRoOiBjdXRDb25maWcud2lkdGgsIGhlaWdodDogY3V0Q29uZmlnLmhlaWdodCwgaW5kQ2lyY2xlOiBjdXRDb25maWcuaW5kQ2lyY2xlIH0sXHJcbiAgICAgIHN0eWxlQ2xhc3M6ICdtb2RhbCdcclxuICAgIH1cclxuICAgIGNvbnN0IGRpYWxvZ1JlZjogRHluYW1pY0RpYWxvZ1JlZiA9IEZvcm1TZXJ2aWNlLm9wZW5EaWFsb2codGhpcy5kaWFsb2dzZXJ2aWNlLCBTaW1wbGVDb21wb25lbnQsICgpPT57fSwgcGFyYW1zKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4vLyA/IENvbXBvbmVudGUgZGUgbW9kYWwgdXNhZG8gbm8gY3V0dGVyXHJcbmltcG9ydCB7IFNsaWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2xpZGVyJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZmlsZXVwbG9hZCc7XHJcbmltcG9ydCB7IEt2TGFiZWxNb2R1bGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2t2LWxhYmVsL2t2LWxhYmVsLm1vZHVsZSc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBLdk1vZGFsTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9rdi1tb2RhbC9rdi1tb2RhbC5tb2R1bGUnO1xyXG5pbXBvcnQgeyBLdkJ1dHRvbk1vZHVsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMva3YtYnV0dG9uL2t2LWJ1dHRvbi5tb2R1bGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtc2ltcGxlLWNvbXBvbmVudCcsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3JvcC1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxjYW52YXMgI2Nyb3BDYW52YXMgY2xhc3M9XCJjcm9wLWNhbnZhc1wiPjwvY2FudmFzPlxyXG4gICAgICAgICAgPGRpdiAjY3JvcEJvcmRlciBjbGFzcz1cImNyb3AtYm9yZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbXQtMlwiPlxyXG4gICAgICAgICAgPGt2LWxhYmVsIGxhYmVsPVwiWm9vbVwiIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDtcIiAvPlxyXG4gICAgICAgICAgPHAtc2xpZGVyIFsobmdNb2RlbCldPVwidGhpcy5zY2FsZUZhY3Rvck1vZGVsXCIgW3N0ZXBdPVwiMC4wMDAxXCIgIFttYXhdPVwiNVwiICAob25DaGFuZ2UpPVwib25ab29tQ2hhbmdlKCRldmVudClcIj48L3Atc2xpZGVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8a3YtYnV0dG9uIGxhYmVsPVwiQ2FuY2VsYXJcIiBzZXZlcml0eT1cInRlcnRpYXJ5XCIgaWNvbj1cImNsb3NlXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+PC9rdi1idXR0b24+XHJcbiAgICAgICAgICA8a3YtYnV0dG9uIGxhYmVsPVwiUmVjb3J0YXJcIiBzZXZlcml0eT1cInByaW1hcnlcIiBpY29uPVwiY3JvcFwiIChjbGljayk9XCJjcm9wSW1hZ2UoKVwiIGNsYXNzPVwibWwtMlwiPjwva3YtYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcblxyXG5pbWcge1xyXG4gIGJvcmRlci1zdHlsZTogc29saWQ7XHJcbiAgYm9yZGVyLXdpZHRoOiAycHg7XHJcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gIG9iamVjdC1maXQ6IGNvdmVyO1xyXG59XHJcblxyXG5pIHtcclxuICBmb250LXNpemU6IDIycHg7XHJcbn1cclxuXHJcbi5ib3Rhby1hbHRlcmFyLWZvdG8ge1xyXG4gIGJvcmRlci1zdHlsZTogbm9uZTtcclxuICB3aWR0aDogbWF4LWNvbnRlbnQ7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMjU0MjtcclxuICBjb2xvcjogYmxhY2s7XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHBhZGRpbmc6IDdweCA5cHg7XHJcbn1cclxuXHJcbi5ib3Rhby1hbHRlcmFyLWZvdG8gaSB7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbi5ib3Rhby1leGNsdWlyLWZvdG8ge1xyXG4gIGJvcmRlci1zdHlsZTogbm9uZTtcclxuICB3aWR0aDogbWF4LWNvbnRlbnQ7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMjU0MjtcclxuICBjb2xvcjogYmxhY2s7XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHBhZGRpbmc6IDdweCA5cHg7XHJcbn1cclxuXHJcbi5ib3Rhby1leGNsdWlyLWZvdG8gaSB7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbi5idG4ge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICB0b3A6IDg3JTtcclxuICBsZWZ0OiA4NyU7XHJcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbn1cclxuXHJcbi5pbWFnZS1jb250YWluZXIge1xyXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbn1cclxuXHJcbi5tb2RhbC1jb250ZW50IHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcclxuICBtYXJnaW46IDElIGF1dG87XHJcbiAgcGFkZGluZzogMjBweDtcclxuICB3aWR0aDogODAlO1xyXG4gIG1heC13aWR0aDogZml0LWNvbnRlbnQ7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XHJcbn1cclxuXHJcbi5jcm9wLWNvbnRhaW5lciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG59XHJcblxyXG4uY3JvcC1jYW52YXMge1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7XHJcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IGF1dG87XHJcbn1cclxuXHJcbi5jcm9wLWJvcmRlciB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIGJvcmRlcjogMnB4IGRhc2hlZCAjOWNhM2FmO1xyXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG59XHJcblxyXG4uem9vbS1jb250YWluZXIge1xyXG4gIHBhZGRpbmctdG9wOiAyMHB4O1xyXG4gIHBhZGRpbmctYm90dG9tOiAyMHB4O1xyXG59XHJcblxyXG4uYnV0dG9uLWNvbnRhaW5lciB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XHJcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICBtYXJnaW4tdG9wOiAyNHB4O1xyXG59XHJcblxyXG5cclxuXHJcbiAgYF0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBEaWFsb2dNb2R1bGUsXHJcbiAgICBLdk1vZGFsTW9kdWxlLFxyXG4gICAgU2xpZGVyTW9kdWxlLFxyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgQnV0dG9uTW9kdWxlLFxyXG4gICAgRmlsZVVwbG9hZE1vZHVsZSxcclxuICAgIFNsaWRlck1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIEt2QnV0dG9uTW9kdWxlLFxyXG4gICAgS3ZMYWJlbE1vZHVsZSxcclxuXHJcbiAgXVxyXG59KVxyXG5cclxuY2xhc3MgU2ltcGxlQ29tcG9uZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkeW5hbWljRGlhbG9nUmVmOiBEeW5hbWljRGlhbG9nUmVmLCBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UpIHtcclxuICAgIHRoaXMuYXR1YWxpemFUYW1hbmhvVGVsYSgpXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gPyBWYXJpYXZpZXMgcXVlIHJlY2ViZW0gb3MgdmFsb3JlcyBkbyBkaWFsb2dcclxuICBfdmFyaWF2aWVzRGlhbG9nID0gc2lnbmFsPHsgaW1hZ2VtOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBpbmRDaXJjbGU6IGJvb2xlYW4gfXxudWxsPihudWxsKVxyXG5cclxuXHJcblxyXG4gICAgLy8/IFJlZmVyw6puY2lhIHBhcmEgbyBlbGVtZW50byBxdWUgY29udMOpbSBhIGltYWdlbSBlIGNhbnZhc1xyXG4gICAgQFZpZXdDaGlsZCgnY3JvcENhbnZhcycpIGNyb3BDYW52YXMhOiBFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50PjtcclxuICAgIEBWaWV3Q2hpbGQoJ2Nyb3BCb3JkZXInKSBjcm9wQm9yZGVyITogRWxlbWVudFJlZjtcclxuXHJcbiAgICAvLz8gUmVmZXLDqm5jaWFzIHBhcmEgbyBjb250ZXh0byBlIGNhbnZhc1xyXG4gICAgcHJpdmF0ZSBjYW52YXMgPSBzaWduYWw8SFRNTENhbnZhc0VsZW1lbnR8bnVsbD4obnVsbCk7XHJcbiAgICBwcml2YXRlIGN0eCA9ICBzaWduYWw8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfG51bGw+KG51bGwpO1xyXG4gICAgcHJpdmF0ZSBfSW1hZ2UgPSBzaWduYWw8SFRNTEltYWdlRWxlbWVudD4obmV3IEltYWdlKCkpO1xyXG5cclxuICAgIC8vPyBDb29yZGVuYWRhcyBpbmljaWFpcyBlIGZpbmFpcyBkbyBkZXNlbmhvXHJcbiAgICBwcml2YXRlIHN0YXJ0WCA9IDA7XHJcbiAgICBwcml2YXRlIHN0YXJ0WSA9IDA7XHJcblxyXG4gICAgLy8/IFJlZmVyw6puY2lhIHBhcmEgbyBtb2RhbFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dJbnN0YW5jZSE6RHluYW1pY0RpYWxvZ0NvbXBvbmVudDtcclxuXHJcbiAgICAvLz8gRmF0b3IgZGUgZXNjYWxhIGRhIGltYWdlbSBlIHpvb21cclxuICAgIHNjYWxlRmFjdG9yUmVhZE9ubHkgPSBjb21wdXRlZDxudW1iZXI+KCgpPT4ge1xyXG4gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5zY2FsZUZhY3RvcigpISwgdGhpcy5zY2FsZUZhY3RvckluaWNpYWwoKSErNSk7XHJcbiAgICB9KVxyXG5cclxuICAgIHB1YmxpYyBzY2FsZUZhY3RvckluaWNpYWwgPSBzaWduYWw8bnVtYmVyfG51bGw+KG51bGwpO1xyXG5cclxuICAgIHByaXZhdGUgc2NhbGVGYWN0b3IgPSBzaWduYWw8bnVtYmVyfG51bGw+KG51bGwpO1xyXG5cclxuICAgIHNldFNjYWxlRmFjdG9yTW9kZWwodmFsb3I6bnVtYmVyKXtcclxuICAgICAgdGhpcy5zY2FsZUZhY3Rvck1vZGVsID0gdmFsb3IgLSB0aGlzLnNjYWxlRmFjdG9ySW5pY2lhbCgpITtcclxuICAgICAgdGhpcy5zY2FsZUZhY3Rvci5zZXQodmFsb3IpXHJcbiAgICB9XHJcbiAgICBzY2FsZUZhY3Rvck1vZGVsID0gMDtcclxuXHJcbiAgICBwcml2YXRlIGltYWdlWDogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgaW1hZ2VZOiBudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgICAvLyNyZWdpb24gUHJvcHJpZWRhZGVzIGNvbXB1dGFkYXMgZGUgdGFtYW5obyBkbyBjYW52YXMgZSBkYSBpbWFnZW1cclxuICAgICAgLy8/IExhcmd1cmEgZSBhbHR1cmEgZG8gY2FudmFzIGJhc2VhZG8gbmEgdGFtYW5obyBkYSB0ZWxhXHJcbiAgICAgIGNhbnZhc1dpZHRoID0gY29tcHV0ZWQ8bnVtYmVyIHwgbnVsbD4oKCkgPT4gdGhpcy53aWR0aFRlbGEoKSowLjUpO1xyXG4gICAgICBjYW52YXNIZWlnaHQgPSBjb21wdXRlZDxudW1iZXIgfCBudWxsPigoKSA9PiB0aGlzLmhlaWd0aFRlbGEoKSowLjUpO1xyXG5cclxuICAgICAgLy8/IExhcmd1cmEgZSBhbHR1cmEgZGEgw6FyZWEgZGUgY29ydGVcclxuICAgICAgY3V0V2lkdGggPSBjb21wdXRlZDxudW1iZXIgfCBudWxsPigoKSA9PiB7XHJcbiAgICAgICAgaWYodGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LmluZENpcmNsZSl7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5yYWRpdXMoKSEgKiAyO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgY29uc3QgY2FudmFzV2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoKCkhO1xyXG4gICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBjYW52YXNXaWR0aCAqIDAuODtcclxuICAgICAgICAgIGNvbnN0IHByb3BvcnRpb25hbEhlaWdodCA9IG1heFdpZHRoICogdGhpcy5wcm9wb3JjYW9JbWFnZW0oKSE7XHJcbiAgICAgICAgICByZXR1cm4gcHJvcG9ydGlvbmFsSGVpZ2h0ID4gdGhpcy5jYW52YXNIZWlnaHQoKSEgKiAwLjggPyB0aGlzLmNhbnZhc0hlaWdodCgpISAqIDAuOCAvIHRoaXMucHJvcG9yY2FvSW1hZ2VtKCkhIDogbWF4V2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICAgIGN1dEhlaWdodCA9IGNvbXB1dGVkPG51bWJlciB8IG51bGw+KCgpID0+IHtcclxuICAgICAgICBpZih0aGlzLl92YXJpYXZpZXNEaWFsb2coKT8uaW5kQ2lyY2xlKXtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnJhZGl1cygpISAqIDI7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSB0aGlzLmNhbnZhc0hlaWdodCgpITtcclxuICAgICAgICAgIGNvbnN0IG1heEhlaWdodCA9IGNhbnZhc0hlaWdodCAqIDAuODtcclxuICAgICAgICAgIGNvbnN0IHByb3BvcnRpb25hbFdpZHRoID0gbWF4SGVpZ2h0IC8gdGhpcy5wcm9wb3JjYW9JbWFnZW0oKSE7XHJcbiAgICAgICAgICByZXR1cm4gcHJvcG9ydGlvbmFsV2lkdGggPiB0aGlzLmNhbnZhc1dpZHRoKCkhICogMC44ID8gdGhpcy5jYW52YXNXaWR0aCgpISAqIDAuOCAqIHRoaXMucHJvcG9yY2FvSW1hZ2VtKCkhIDogbWF4SGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8/IExhcmd1cmEgZSBhbHR1cmEgZGEgaW1hZ2VtIG5vIGNhbnZhcyAoYmFzZWFkbyBuYSBlc2NhbGEpIC0gdGFtYW5obyByZWFsIGRhIGltYWdlbVxyXG4gICAgICBjYW52YUltYWdlV2lkdGggPSBjb21wdXRlZDxudW1iZXI+KCgpPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9JbWFnZSgpLndpZHRoICogdGhpcy5zY2FsZUZhY3RvclJlYWRPbmx5KCkhXHJcbiAgICAgIH0pXHJcbiAgICAgIGNhbnZhSW1hZ2VIZWlnaHQgPSBjb21wdXRlZDxudW1iZXI+KCgpPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9JbWFnZSgpLmhlaWdodCAqIHRoaXMuc2NhbGVGYWN0b3JSZWFkT25seSgpIVxyXG4gICAgICB9KVxyXG4gICAgICBwcm9wb3JjYW9JbWFnZW0gPSBjb21wdXRlZDxudW1iZXIgfCBudWxsPigoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zhcmlhdmllc0RpYWxvZygpPy5oZWlnaHQhIC8gdGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LndpZHRoITtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByYWRpdXMgPSBjb21wdXRlZDxudW1iZXIgfCBudWxsPigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWluU2l6ZSA9ICAgTWF0aC5taW4odGhpcy5jYW52YXNIZWlnaHQoKSEqMC44LCB0aGlzLmNhbnZhc1dpZHRoKCkhKjAuOCApO1xyXG4gICAgICAgIHJldHVybiBtaW5TaXplLzI7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vICNyZWdpb24gTGltaXRlcyBkZSBtb3ZpbWVudGHDp8OjbyBkYSBpbWFnZW1cclxuICAgIC8vPyBMaW1pdGVzIGRlIG1vdmltZW50YcOnw6NvIGRhIGltYWdlbVxyXG4gICAgICBpbmRDaXJjbGUgPSBjb21wdXRlZDxib29sZWFuPigoKT0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LmluZENpcmNsZSFcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHhNaW4gPSBjb21wdXRlZDxudW1iZXI+KCgpPT4ge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LmluZENpcmNsZSEgPyAodGhpcy5jYW52YXNXaWR0aCgpISAtICB0aGlzLmN1dFdpZHRoKCkhKS8yIDogKHRoaXMuY2FudmFzV2lkdGgoKSEgLSAgKHRoaXMucmFkaXVzKCkhKjIpKS8yXHJcbiAgICAgIH0pXHJcbiAgICAgIHlNaW4gPSBjb21wdXRlZDxudW1iZXI+KCgpPT4ge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LmluZENpcmNsZSEgPyAodGhpcy5jYW52YXNIZWlnaHQoKSEgLSAgdGhpcy5jdXRIZWlnaHQoKSEpLzIgOiAodGhpcy5jYW52YXNIZWlnaHQoKSEgLSAgKHRoaXMucmFkaXVzKCkhKjIpKS8yXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB4TWF4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKT0+IHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuX3Zhcmlhdmllc0RpYWxvZygpPy5pbmRDaXJjbGUhID8gLSggdGhpcy5jYW52YUltYWdlV2lkdGgoKSEgLSAodGhpcy54TWluKCkhKSAtIHRoaXMuY3V0V2lkdGgoKSEpIDogLSggdGhpcy5jYW52YUltYWdlV2lkdGgoKSEgLSAodGhpcy54TWluKCkhKSAtICh0aGlzLnJhZGl1cygpISoyKSlcclxuICAgICAgfSlcclxuICAgICAgeU1heCA9IGNvbXB1dGVkPG51bWJlcj4oKCk9PiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLl92YXJpYXZpZXNEaWFsb2coKT8uaW5kQ2lyY2xlISA/IC0oIHRoaXMuY2FudmFJbWFnZUhlaWdodCgpISAtICh0aGlzLnlNaW4oKSEpIC0gdGhpcy5jdXRIZWlnaHQoKSEpIDogLSggdGhpcy5jYW52YUltYWdlSGVpZ2h0KCkhIC0gKHRoaXMueU1pbigpISkgLSAodGhpcy5yYWRpdXMoKSEqMikpXHJcbiAgICAgIH0pXHJcbiAgICAvLyAjZW5kcmVnaW9uXHJcblxyXG5cclxuXHJcbiAgICAvLz8gUHJvcG9yw6fDo28gZGEgaW1hZ2VtXHJcblxyXG4gICAgd2lkdGhUZWxhID0gc2lnbmFsPG51bWJlcj4oMClcclxuICAgIGhlaWd0aFRlbGEgPSBzaWduYWw8bnVtYmVyPigwKVxyXG5cclxuXHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gIG9uV2luZG93UmVzaXplKCkge1xyXG4gICAgdGhpcy5hdHVhbGl6YVRhbWFuaG9UZWxhKClcclxuICAgIHRoaXMudXBkYXRlQ2FudmFzU2l6ZSgpO1xyXG4gICAgdGhpcy5hdHVhbGl6YUN1dEJvcmRlcigpO1xyXG4gIH1cclxuXHJcbiAgYXR1YWxpemFUYW1hbmhvVGVsYSgpe1xyXG4gICAgdGhpcy53aWR0aFRlbGEuc2V0KHdpbmRvdy5pbm5lcldpZHRoKTtcclxuICAgIHRoaXMuaGVpZ3RoVGVsYS5zZXQod2luZG93LmlubmVySGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMucmVjdXBlcmFyVmFyaWF2aWVzRGlhbG9nKClcclxuICAgIHRoaXMuaW5jaWFyUmVmZXJlbmNpYXMoKVxyXG4gICAgdGhpcy5pbmljaWFyQ2FudmFzKClcclxuICB9XHJcbiAgaW5jaWFyUmVmZXJlbmNpYXMoKXtcclxuICAgIHRoaXMuY2FudmFzLnNldCh0aGlzLmNyb3BDYW52YXMubmF0aXZlRWxlbWVudCk7XHJcbiAgICB0aGlzLmN0eC5zZXQodGhpcy5jYW52YXMoKSEuZ2V0Q29udGV4dCgnMmQnKSlcclxuICAgIHRoaXMuX0ltYWdlKCkuc3JjID0gdGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LmltYWdlbSFcclxuICB9XHJcbiAgaW5pY2lhckNhbnZhcygpe1xyXG4gICAgICB0aGlzLl9JbWFnZSgpLm9ubG9hZCA9ICgpID0+IHtcclxuXHJcbiAgICAgIC8vPyBEZWZpbmUgbyB0YW1hbmhvIGRvIGNhbnZhc1xyXG4gICAgICB0aGlzLmNhbnZhcygpIS5oZWlnaHQgPSB0aGlzLmNhbnZhc0hlaWdodCgpITtcclxuICAgICAgdGhpcy5jYW52YXMoKSEud2lkdGggPSB0aGlzLmNhbnZhc1dpZHRoKCkhO1xyXG5cclxuXHJcbiAgICAgIHRoaXMuYWp1c3RhclpvbW1FUG9zaWNhb0luaWNpYWwoKVxyXG5cclxuXHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlTW92ZSh0aGlzLmNhbnZhcygpISwgdGhpcy5jdHgoKSwgdGhpcy5fSW1hZ2UoKSk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZU1vdXNlV2hlZWwodGhpcy5jYW52YXMoKSEsIHRoaXMuY3R4KCksIHRoaXMuX0ltYWdlKCkpO1xyXG5cclxuICAgICAgdGhpcy5yZWRyYXdDYW52YXModGhpcy5jdHgoKSwgdGhpcy5fSW1hZ2UoKSk7XHJcblxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGFqdXN0YXJab21tRVBvc2ljYW9JbmljaWFsKCl7XHJcbiAgICBjb25zdCBjdXRXaWR0aCA9IHRoaXMuY3V0V2lkdGgoKSE7XHJcbiAgICBjb25zdCBjdXRIZWlnaHQgPSB0aGlzLmN1dEhlaWdodCgpITtcclxuICAgIGNvbnN0IGltYWdlV2lkdGggPSB0aGlzLl9JbWFnZSgpLndpZHRoO1xyXG4gICAgY29uc3QgaW1hZ2VIZWlnaHQgPSB0aGlzLl9JbWFnZSgpLmhlaWdodDtcclxuXHJcbiAgICAvLz8gQWp1c3RhIHBvc3Npw6fDo28gZSB6b29tIGluaWNpYWxcclxuXHJcbiAgICBpZiAodGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LmluZENpcmNsZSkge1xyXG4gICAgICBjb25zdCBzY2FsZUZhY3RvciA9ICh0aGlzLnJhZGl1cygpISAqIDIpIC8gTWF0aC5taW4oaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpO1xyXG4gICAgICB0aGlzLnNjYWxlRmFjdG9ySW5pY2lhbC5zZXQoc2NhbGVGYWN0b3IpXHJcbiAgICAgIHRoaXMuc2V0U2NhbGVGYWN0b3JNb2RlbChzY2FsZUZhY3Rvcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBzY2FsZUZhY3RvciA9IHRoaXMuY3V0SGVpZ2h0KCkhID09PSB0aGlzLmN1dFdpZHRoKCkhXHJcbiAgICAgICAgPyB0aGlzLl9JbWFnZSgpLndpZHRoID4gdGhpcy5fSW1hZ2UoKS5oZWlnaHRcclxuICAgICAgICAgID8gdGhpcy5jdXRIZWlnaHQoKSEgLyBpbWFnZUhlaWdodFxyXG4gICAgICAgICAgOiB0aGlzLmN1dFdpZHRoKCkhIC8gaW1hZ2VXaWR0aFxyXG4gICAgICAgIDogdGhpcy5jdXRIZWlnaHQoKSEgPiB0aGlzLmN1dFdpZHRoKCkhXHJcbiAgICAgICAgICA/IHRoaXMuY3V0SGVpZ2h0KCkhIC8gaW1hZ2VIZWlnaHRcclxuICAgICAgICAgIDogdGhpcy5jdXRXaWR0aCgpISAvIGltYWdlV2lkdGg7XHJcbiAgICAgIHRoaXMuc2NhbGVGYWN0b3JJbmljaWFsLnNldChzY2FsZUZhY3RvcilcclxuICAgICAgdGhpcy5zZXRTY2FsZUZhY3Rvck1vZGVsKHNjYWxlRmFjdG9yKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbWFnZVggPSBNYXRoLm1heCgodGhpcy5jYW52YXMoKSEud2lkdGggLSBpbWFnZVdpZHRoICogdGhpcy5zY2FsZUZhY3RvclJlYWRPbmx5KCkhKSAvIDIsIHRoaXMueE1pbigpISk7XHJcbiAgICB0aGlzLmltYWdlWSA9IE1hdGgubWF4KCh0aGlzLmNhbnZhc0hlaWdodCgpISAtIGltYWdlSGVpZ2h0ICogdGhpcy5zY2FsZUZhY3RvclJlYWRPbmx5KCkhKSAvIDIsIHRoaXMueU1pbigpISk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIE3DqXRvZG9zIGRlIHJlY3VwZXJhw6fDo28gZGUgZGFkb3NcclxuICByZWN1cGVyYUluc3RhbmNpYURpYWxvZygpOiBEeW5hbWljRGlhbG9nQ29tcG9uZW50IHtcclxuICAgIGNvbnN0IGFycjogTWFwPER5bmFtaWNEaWFsb2dSZWY8YW55PiwgQ29tcG9uZW50UmVmPGFueT4+ID0gdGhpcy5kaWFsb2dTZXJ2aWNlLmRpYWxvZ0NvbXBvbmVudFJlZk1hcFxyXG4gICAgY29uc3QgZW50cmllcyA9IGFyci5lbnRyaWVzKCk7XHJcbiAgICBjb25zdCBmaXJzdEVudHJ5ID0gZW50cmllcy5uZXh0KCkudmFsdWU7XHJcbiAgICBjb25zdCBbZmlyc3RLZXksIGZpcnN0VmFsdWVdID0gZmlyc3RFbnRyeTtcclxuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5kaWFsb2dTZXJ2aWNlLmdldEluc3RhbmNlKGZpcnN0S2V5KVxyXG4gICAgdGhpcy5kaWFsb2dJbnN0YW5jZSA9IGluc3RhbmNlXHJcbiAgICByZXR1cm4gaW5zdGFuY2VcclxuICB9XHJcblxyXG4gIHJlY3VwZXJhclZhcmlhdmllc0RpYWxvZygpOiB2b2lke1xyXG4gICAgdGhpcy5fdmFyaWF2aWVzRGlhbG9nLnNldCh0aGlzLnJlY3VwZXJhSW5zdGFuY2lhRGlhbG9nKCkuZGF0YS5pZClcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAvLyNyZWdpb24gTcOpdG9kb3MgZGUgYXR1YWxpemFjYW8gZG8gY2FudmFzXHJcbiAgLy8/IEF0dWFsaXphIG8gdGFtYW5obyBkbyBjYW52YXNcclxuICB1cGRhdGVDYW52YXNTaXplKCkge1xyXG5cclxuICAgIHRoaXMuaW1hZ2VYID0gKHRoaXMuY2FudmFzKCkhLndpZHRoIC0gdGhpcy5fSW1hZ2UoKS53aWR0aCAqIHRoaXMuc2NhbGVGYWN0b3JSZWFkT25seSgpISkgLyAyO1xyXG4gICAgdGhpcy5pbWFnZVkgPSAodGhpcy5jYW52YXNIZWlnaHQoKSEgLyAyKSAtICh0aGlzLl9JbWFnZSgpLmhlaWdodCAqIHRoaXMuc2NhbGVGYWN0b3JSZWFkT25seSgpISkgLyAyO1xyXG5cclxuXHJcblxyXG4gICAgdGhpcy5jYW52YXMoKSEuaGVpZ2h0ID0gdGhpcy5jYW52YXNIZWlnaHQoKSE7XHJcbiAgICB0aGlzLmNhbnZhcygpIS53aWR0aCA9IHRoaXMuY2FudmFzV2lkdGgoKSE7XHJcblxyXG4gICAgdGhpcy5yZWRyYXdDYW52YXModGhpcy5jdHgoKSwgdGhpcy5fSW1hZ2UoKSk7XHJcbiAgfVxyXG5cclxuICByZWRyYXdDYW52YXMoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsLCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQpIHtcclxuICAgIGlmICghY3R4KSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5kcmF3Q3JvcEFyZWEoY3R4KTtcclxuXHJcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTtcclxuICAgIGN0eC5maWx0ZXIgPSAnYmx1cig1cHgpIG9wYWNpdHkoMC45KSc7XHJcbiAgICBjdHguZHJhd0ltYWdlKGltZywgdGhpcy5pbWFnZVgsIHRoaXMuaW1hZ2VZLCBpbWcud2lkdGggKiB0aGlzLnNjYWxlRmFjdG9yUmVhZE9ubHkoKSEsIGltZy5oZWlnaHQgKiB0aGlzLnNjYWxlRmFjdG9yUmVhZE9ubHkoKSEpO1xyXG4gICAgY3R4LmZpbHRlciA9ICdub25lJztcclxuXHJcbiAgICB0aGlzLmRyYXdJbWFnZUluQ3JvcEFyZWEoY3R4LCBpbWcpO1xyXG4gIH1cclxuXHJcbiAgLy8/IERlc2VuaGEgYSDDoXJlYSBkZSBjb3J0ZVxyXG4gIGRyYXdDcm9wQXJlYShjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IG51bGwpIHtcclxuICAgIGlmICghY3R4KSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5hdHVhbGl6YUN1dEJvcmRlcigpXHJcblxyXG4gICAgY29uc3QgY3JvcFggPSBjdHguY2FudmFzLndpZHRoIC8gMiAtIHRoaXMuY3V0V2lkdGgoKSEgLyAyO1xyXG4gICAgY29uc3QgY3JvcFkgPSBjdHguY2FudmFzLmhlaWdodCAvIDIgLSB0aGlzLmN1dEhlaWdodCgpISAvIDI7XHJcblxyXG5cclxuICAgIGNvbnN0IGNyb3BYQ2lyY2xlID0gY3R4LmNhbnZhcy53aWR0aCAvIDIgLSB0aGlzLnJhZGl1cygpISAvIDI7XHJcbiAgICBjb25zdCBjcm9wWUNpcmNsZSA9IGN0eC5jYW52YXMuaGVpZ2h0IC8gMiAtIHRoaXMucmFkaXVzKCkhIC8gMjtcclxuXHJcbiAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSAndHJhbnNwYXJlbnQnO1xyXG4gICAgY3R4LmxpbmVXaWR0aCA9IDI7XHJcblxyXG4gICAgaWYodGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LmluZENpcmNsZSkge1xyXG4gICAgICBjdHguYXJjKGNyb3BYQ2lyY2xlLCBjcm9wWUNpcmNsZSwgdGhpcy5yYWRpdXMoKSEsIDAsIE1hdGguUEkgKiAyLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN0eC5yZWN0KGNyb3BYLCBjcm9wWSAsIHRoaXMuY3V0V2lkdGgoKSEsIHRoaXMuY3V0SGVpZ2h0KCkhKTtcclxuICAgIH1cclxuXHJcbiAgICBjdHguc3Ryb2tlKCk7XHJcblxyXG5cclxuICB9XHJcbiAgLy8/IERlc2VuaGEgYSBpbWFnZW0gbmEgw6FyZWEgZGUgY29ydGVcclxuICBkcmF3SW1hZ2VJbkNyb3BBcmVhKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCwgaW1nOiBIVE1MSW1hZ2VFbGVtZW50KSB7XHJcbiAgICAgIGlmICghY3R4KSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBjcm9wWCA9IChjdHguY2FudmFzLndpZHRoIC0gdGhpcy5jdXRXaWR0aCgpISkgLyAyO1xyXG4gICAgICBjb25zdCBjcm9wWSA9IChjdHguY2FudmFzLmhlaWdodCAtIHRoaXMuY3V0SGVpZ2h0KCkhKSAvIDI7XHJcblxyXG4gICAgICBjdHguc2F2ZSgpO1xyXG4gICAgICBjdHguYmVnaW5QYXRoKCk7XHJcblxyXG4gICAgICBpZih0aGlzLl92YXJpYXZpZXNEaWFsb2coKT8uaW5kQ2lyY2xlKSB7XHJcbiAgICAgICAgY3R4LmFyYyhjdHguY2FudmFzLndpZHRoLzIsIGN0eC5jYW52YXMuaGVpZ2h0LzIsIHRoaXMucmFkaXVzKCkhLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGN0eC5yZWN0KGNyb3BYLCBjcm9wWSAsIHRoaXMuY3V0V2lkdGgoKSEsIHRoaXMuY3V0SGVpZ2h0KCkhKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3R4LmNsaXAoKTtcclxuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIHRoaXMuaW1hZ2VYLCB0aGlzLmltYWdlWSwgaW1nLndpZHRoICogdGhpcy5zY2FsZUZhY3RvclJlYWRPbmx5KCkhLCBpbWcuaGVpZ2h0ICogdGhpcy5zY2FsZUZhY3RvclJlYWRPbmx5KCkhKTtcclxuICAgICAgY3R4LnJlc3RvcmUoKTtcclxuICB9XHJcbiAgYXR1YWxpemFDdXRCb3JkZXIoKSB7XHJcbiAgICBpZiAodGhpcy5jcm9wQm9yZGVyICYmIHRoaXMuY3JvcEJvcmRlci5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIGNvbnN0IGNyb3BCb3JkZXJFbGVtZW50ID0gdGhpcy5jcm9wQm9yZGVyLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGlmKHRoaXMuX3Zhcmlhdmllc0RpYWxvZygpPy5pbmRDaXJjbGUpe1xyXG5cclxuICAgICAgICBjcm9wQm9yZGVyRWxlbWVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSB0aGlzLnJhZGl1cygpISoyKydweCc7XHJcbiAgICAgICAgY3JvcEJvcmRlckVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLnJhZGl1cygpISoyKydweCc7XHJcbiAgICAgICAgY3JvcEJvcmRlckVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5yYWRpdXMoKSEqMisncHgnO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBjcm9wQm9yZGVyRWxlbWVudC5zdHlsZS53aWR0aCA9IHRoaXMuY3V0V2lkdGgoKSErJ3B4JztcclxuICAgICAgICBjcm9wQm9yZGVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmN1dEhlaWdodCgpISsncHgnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZXJzIGRlIGV2ZW50b3NcclxuXHJcbiAgY29tcGFyYWRvck9uWm9vbUNoYW5nZSA9IHRoaXMuc2NhbGVGYWN0b3JJbmljaWFsKCkhO1xyXG4gIG9uWm9vbUNoYW5nZShlOiBhbnkpIHtcclxuICAgIGNvbnN0IHByZXZab29tID0gdGhpcy5jb21wYXJhZG9yT25ab29tQ2hhbmdlO1xyXG4gICAgY29uc3Qgem9vbVZhbHVlID0gZS52YWx1ZTtcclxuICAgIHRoaXMuY29tcGFyYWRvck9uWm9vbUNoYW5nZSA9IGUudmFsdWU7XHJcbiAgICBjb25zdCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicgPSBwcmV2Wm9vbSA8IHpvb21WYWx1ZSA/ICd1cCcgOiAnZG93bic7XHJcbiAgICB0aGlzLmFqdXN0YXJab29tKGRpcmVjdGlvbiwgZS52YWx1ZSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGluaXRpYWxpemVNb3VzZVdoZWVsKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCwgaW1nOiBIVE1MSW1hZ2VFbGVtZW50KSB7XHJcbiAgICBjYW52YXMub253aGVlbCA9IChlKSA9PiB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgLy8/IFJlY3VwZXJhbmRvIG9zIHZhbG9yZXMgZGUgem9vbSBlIGRlbHRhIGF0dWFpc1xyXG4gICAgICBjb25zdCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicgPSBlLmRlbHRhWSA+IDAgPyAnZG93bicgOiAndXAnO1xyXG5cclxuICAgICAgdGhpcy5hanVzdGFyWm9vbShkaXJlY3Rpb24pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcblxyXG4gIGFqdXN0YXJab29tKGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJywgdmFsdWU/OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHByZXZTY2FsZUZhY3RvciA9IHRoaXMuc2NhbGVGYWN0b3JSZWFkT25seSgpITtcclxuICAgIGNvbnN0IGRlbHRhID0gZGlyZWN0aW9uID09ICdkb3duJyA/IC0wLjAxNSA6IDAuMDE1O1xyXG5cclxuICAgIGxldCBzY2FsZUZhY3RvciA9IHByZXZTY2FsZUZhY3RvciArIChkZWx0YSoxLjQpO1xyXG5cclxuICAgIGlmKHZhbHVlKVxyXG4gICAgICAgIHNjYWxlRmFjdG9yID0gdmFsdWUrIHRoaXMuc2NhbGVGYWN0b3JJbmljaWFsKCkhO1xyXG5cclxuICAgIGNvbnN0IG5ld0hlaWdodCA9IHRoaXMuX0ltYWdlKCkuaGVpZ2h0ICogc2NhbGVGYWN0b3I7XHJcbiAgICBjb25zdCBuZXdXaWR0aCA9IHRoaXMuX0ltYWdlKCkud2lkdGggKiBzY2FsZUZhY3RvcjtcclxuXHJcbiAgICBpZiAodGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LmluZENpcmNsZSkge1xyXG4gICAgICBpZiAobmV3SGVpZ2h0IDwgdGhpcy5yYWRpdXMoKSEgKiAyIHx8IG5ld1dpZHRoIDwgdGhpcy5yYWRpdXMoKSEgKiAyKSB7XHJcbiAgICAgICAgc2NhbGVGYWN0b3IgPSBwcmV2U2NhbGVGYWN0b3I7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zY2FsZUZhY3Rvci5zZXQoc2NhbGVGYWN0b3IpO1xyXG4gICAgICAgIHRoaXMuc2V0U2NhbGVGYWN0b3JNb2RlbChzY2FsZUZhY3Rvcik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChuZXdIZWlnaHQgPCB0aGlzLmN1dEhlaWdodCgpISB8fCBuZXdXaWR0aCA8IHRoaXMuY3V0V2lkdGgoKSEpIHtcclxuICAgICAgICBzY2FsZUZhY3RvciA9IHByZXZTY2FsZUZhY3RvcjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNjYWxlRmFjdG9yLnNldChzY2FsZUZhY3Rvcik7XHJcbiAgICAgICAgdGhpcy5zZXRTY2FsZUZhY3Rvck1vZGVsKHNjYWxlRmFjdG9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2NhbGVGYWN0b3Iuc2V0KHNjYWxlRmFjdG9yKTtcclxuICAgIHRoaXMuc2V0U2NhbGVGYWN0b3JNb2RlbChzY2FsZUZhY3Rvcik7XHJcblxyXG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jcm9wQ2FudmFzLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhcy5vZmZzZXRXaWR0aDtcclxuICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IGNhbnZhcy5vZmZzZXRIZWlnaHQ7XHJcbiAgICBjb25zdCBjZW50ZXJYID0gY2FudmFzV2lkdGggLyAyO1xyXG4gICAgY29uc3QgY2VudGVyWSA9IGNhbnZhc0hlaWdodCAvIDI7XHJcbiAgICBjb25zdCBuZXdDYW52YXNYID0gY2VudGVyWCAtIChjZW50ZXJYIC0gdGhpcy5pbWFnZVgpICogKHNjYWxlRmFjdG9yIC8gcHJldlNjYWxlRmFjdG9yKTtcclxuICAgIGNvbnN0IG5ld0NhbnZhc1kgPSBjZW50ZXJZIC0gKGNlbnRlclkgLSB0aGlzLmltYWdlWSkgKiAoc2NhbGVGYWN0b3IgLyBwcmV2U2NhbGVGYWN0b3IpO1xyXG4gICAgdGhpcy5pbWFnZVggPSBuZXdDYW52YXNYO1xyXG4gICAgdGhpcy5pbWFnZVkgPSBuZXdDYW52YXNZO1xyXG5cclxuICAgIGlmICghdGhpcy52ZXJpZmljYUltYWdlbWRlbnRyb0Rvc0xpbWl0ZVhtaW4oKSkge1xyXG4gICAgICBjb25zdCBkaWZmWG1pbiA9IHRoaXMucmV0b3JuYURpZmZYbWF4KCk7XHJcbiAgICAgIHRoaXMubW92ZUltYWdlKHRoaXMuaW1hZ2VYIC0gZGlmZlhtaW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy52ZXJpZmljYUltYWdlbWRlbnRyb0Rvc0xpbWl0ZVhtYXgoKSkge1xyXG4gICAgICBjb25zdCBkaWZmWG1heCA9IHRoaXMucmV0b3JuYURpZmZYbWluKCk7XHJcbiAgICAgIHRoaXMubW92ZUltYWdlKHRoaXMuaW1hZ2VYICsgZGlmZlhtYXgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy52ZXJpZmljYUltYWdlbWRlbnRyb0Rvc0xpbWl0ZVltYXgoKSkge1xyXG4gICAgICBjb25zdCBkaWZmWW1heCA9IHRoaXMucmV0b3JuYURpZmZZbWluKCk7XHJcbiAgICAgIHRoaXMubW92ZUltYWdlKHVuZGVmaW5lZCwgdGhpcy5pbWFnZVkgKyBkaWZmWW1heCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnZlcmlmaWNhSW1hZ2VtZGVudHJvRG9zTGltaXRlWW1pbigpKSB7XHJcbiAgICAgIGNvbnN0IGRpZmZZbWluID0gdGhpcy5yZXRvcm5hRGlmZlltYXgoKTtcclxuICAgICAgdGhpcy5tb3ZlSW1hZ2UodW5kZWZpbmVkLCB0aGlzLmltYWdlWSAtIGRpZmZZbWluKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVkcmF3Q2FudmFzKHRoaXMuY3R4KCkhLCB0aGlzLl9JbWFnZSgpISk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICB2ZXJpZmljYUltYWdlbWRlbnRyb0Rvc0xpbWl0ZVhtaW4oKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBuZXdJbWFnZVggPSB0aGlzLmltYWdlWDtcclxuICAgIHJldHVybiBuZXdJbWFnZVggPCB0aGlzLnhNaW4oKSFcclxuICB9XHJcbiAgdmVyaWZpY2FJbWFnZW1kZW50cm9Eb3NMaW1pdGVYbWF4KCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbmV3SW1hZ2VYID0gdGhpcy5pbWFnZVg7XHJcbiAgICByZXR1cm4gbmV3SW1hZ2VYID4gdGhpcy54TWF4KCkhXHJcbiAgfVxyXG4gIHZlcmlmaWNhSW1hZ2VtZGVudHJvRG9zTGltaXRlWW1pbigpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG5ld0ltYWdlWSA9IHRoaXMuaW1hZ2VZO1xyXG4gICAgcmV0dXJuIG5ld0ltYWdlWSA8IHRoaXMueU1pbigpIVxyXG4gIH1cclxuICB2ZXJpZmljYUltYWdlbWRlbnRyb0Rvc0xpbWl0ZVltYXgoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBuZXdJbWFnZVkgPSB0aGlzLmltYWdlWTtcclxuICAgIHJldHVybiBuZXdJbWFnZVkgPiB0aGlzLnlNYXgoKSFcclxuICB9XHJcblxyXG4gIHJldG9ybmFEaWZmWG1pbigpOiBudW1iZXIge1xyXG4gICAgY29uc3QgbmV3SW1hZ2VYID0gdGhpcy5pbWFnZVg7XHJcbiAgICByZXR1cm4gdGhpcy54TWluKCkhIC0gbmV3SW1hZ2VYO1xyXG4gIH1cclxuICByZXRvcm5hRGlmZlhtYXgoKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG5ld0ltYWdlWCA9IHRoaXMuaW1hZ2VYO1xyXG4gICAgcmV0dXJuIG5ld0ltYWdlWCAtIHRoaXMueE1heCgpITtcclxuICB9XHJcbiAgcmV0b3JuYURpZmZZbWluKCk6IG51bWJlciB7XHJcbiAgICBjb25zdCBuZXdJbWFnZVkgPSB0aGlzLmltYWdlWTtcclxuICAgIHJldHVybiB0aGlzLnlNaW4oKSEgLSBuZXdJbWFnZVk7XHJcbiAgfVxyXG4gIHJldG9ybmFEaWZmWW1heCgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgbmV3SW1hZ2VZID0gdGhpcy5pbWFnZVk7XHJcbiAgICByZXR1cm4gbmV3SW1hZ2VZIC0gdGhpcy55TWF4KCkhO1xyXG4gIH1cclxuXHJcblxyXG4gIGluaXRpYWxpemVJbWFnZU1vdmUoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsLCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQpIHtcclxuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9ICdncmFiJztcclxuXHJcbiAgICBjYW52YXMub25tb3VzZWRvd24gPSAoZSkgPT4ge1xyXG4gICAgICBpc0RyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgY2FudmFzLnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7XHJcbiAgICAgIHRoaXMuc3RhcnRYID0gZS5vZmZzZXRYIC0gdGhpcy5pbWFnZVg7XHJcbiAgICAgIHRoaXMuc3RhcnRZID0gZS5vZmZzZXRZIC0gdGhpcy5pbWFnZVk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNhbnZhcy5vbm1vdXNldXAgPSAoKSA9PiB7XHJcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgY2FudmFzLnN0eWxlLmN1cnNvciA9ICdncmFiJztcclxuICAgIH07XHJcblxyXG4gICAgY2FudmFzLm9ubW91c2VvdXQgPSAoKSA9PiB7XHJcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgY2FudmFzLnN0eWxlLmN1cnNvciA9ICdncmFiJztcclxuICAgIH07XHJcblxyXG4gICAgY2FudmFzLm9ubW91c2Vtb3ZlID0gKGUpID0+IHtcclxuICAgICAgaWYgKGlzRHJhZ2dpbmcpIHtcclxuXHJcbiAgICAgICAgICAvLyBDYWxjdWxhIG8gbm92byBwb3NpY2lvbmFtZW50byBkYSBpbWFnZW1cclxuICAgICAgICAgIGxldCBuZXdJbWFnZVggPSBlLm9mZnNldFggLSB0aGlzLnN0YXJ0WDtcclxuICAgICAgICAgIGxldCBuZXdJbWFnZVkgPSBlLm9mZnNldFkgLSB0aGlzLnN0YXJ0WTtcclxuXHJcbiAgICAgICAgICBpZiAobmV3SW1hZ2VYIDwgIHRoaXMueE1pbigpISAmJiBuZXdJbWFnZVggPiB0aGlzLnhNYXgoKSEpIHtcclxuICAgICAgICAgICAgdGhpcy5tb3ZlSW1hZ2UobmV3SW1hZ2VYKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYobmV3SW1hZ2VZIDwgdGhpcy55TWluKCkhICYmIG5ld0ltYWdlWSA+IHRoaXMueU1heCgpISl7XHJcbiAgICAgICAgICAgIHRoaXMubW92ZUltYWdlKHVuZGVmaW5lZCwgbmV3SW1hZ2VZKVxyXG4gICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICB0aGlzLnJlZHJhd0NhbnZhcyhjdHgsIGltZyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICB9XHJcblxyXG4gIG1vdmVJbWFnZShkeD86IG51bWJlciwgZHk/OiBudW1iZXIpIHtcclxuICAgIHRoaXMuaW1hZ2VYID0gKGR4Pz90aGlzLmltYWdlWCk7XHJcbiAgICB0aGlzLmltYWdlWSA9IChkeT8/dGhpcy5pbWFnZVkpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gIC8vI3JlZ2lvbiBNw6l0b2RvcyBkZSBjb3J0ZSBlIGZlY2hhbWVudG8gZG8gbW9kYWxcclxuICBjcm9wSW1hZ2UoKSB7XHJcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eCgpO1xyXG5cclxuICAgIGlmIChjdHgpIHtcclxuICAgICAgY29uc3QgWCA9ICgodGhpcy5jYW52YXMoKSEud2lkdGggLSB0aGlzLl9JbWFnZSgpLndpZHRoICogdGhpcy5zY2FsZUZhY3RvclJlYWRPbmx5KCkhKSAvIDIpO1xyXG4gICAgICBjb25zdCBZID0gKCh0aGlzLmNhbnZhc0hlaWdodCgpISAvIDIpIC0gKHRoaXMuX0ltYWdlKCkuaGVpZ2h0ICogdGhpcy5zY2FsZUZhY3RvclJlYWRPbmx5KCkhKSAvIDIpO1xyXG5cclxuICAgICAgLy8gUmVjdXBlcmFyIG8gaW1hZ2VEYXRhIGRhIGltYWdlbSBxdWUgZXN0w6EgbmEgw6FyZWEgZGUgY29ydGVcclxuICAgICAgbGV0IGltYWdlRGF0YVxyXG4gICAgICBjb25zdCBjcm9wWCA9IChjdHguY2FudmFzLndpZHRoIC0gdGhpcy5jdXRXaWR0aCgpISkgLyAyO1xyXG4gICAgICBjb25zdCBjcm9wWSA9IChjdHguY2FudmFzLmhlaWdodCAtIHRoaXMuY3V0SGVpZ2h0KCkhKSAvIDI7XHJcbiAgICAgIGlmKHRoaXMuX3Zhcmlhdmllc0RpYWxvZygpPy5pbmRDaXJjbGUpe1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjYW52YXMgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIHRoZSBjaXJjbGVcclxuICAgICAgICBjb25zdCBjaXJjbGVDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjb25zdCBjaXJjbGVDdHggPSBjaXJjbGVDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBjaXJjbGVDYW52YXMud2lkdGggPSB0aGlzLnJhZGl1cygpISAqIDI7XHJcbiAgICAgICAgY2lyY2xlQ2FudmFzLmhlaWdodCA9IHRoaXMucmFkaXVzKCkhICogMjtcclxuXHJcbiAgICAgICAgLy8gRHJhdyB0aGUgY2lyY2xlIG9uIHRoZSBuZXcgY2FudmFzXHJcbiAgICAgICAgY2lyY2xlQ3R4IS5iZWdpblBhdGgoKTtcclxuICAgICAgICBjaXJjbGVDdHghLmFyYyh0aGlzLnJhZGl1cygpISwgdGhpcy5yYWRpdXMoKSEsIHRoaXMucmFkaXVzKCkhLCAwLCAyICogTWF0aC5QSSk7XHJcbiAgICAgICAgY2lyY2xlQ3R4IS5maWxsKCk7XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgY29tcG9zaXRlIG9wZXJhdGlvbiB0byAnZGVzdGluYXRpb24taW4nIHRvIGN1dCBvdXQgdGhlIGNpcmNsZVxyXG4gICAgICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24taW4nO1xyXG5cclxuICAgICAgICAvLyBEcmF3IHRoZSBpbWFnZSBvbiB0aGUgbWFpbiBjYW52YXMgdXNpbmcgdGhlIGNpcmNsZSBhcyBhIG1hc2tcclxuICAgICAgICBjdHguZHJhd0ltYWdlKGNpcmNsZUNhbnZhcywgY3JvcFgsIGNyb3BZKTtcclxuXHJcbiAgICAgICAgLy8gUmVzZXQgdGhlIGNvbXBvc2l0ZSBvcGVyYXRpb24gdG8gdGhlIGRlZmF1bHQgdmFsdWVcclxuICAgICAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBpbWFnZSBkYXRhIG9mIHRoZSBjcm9wcGVkIGNpcmNsZVxyXG4gICAgICAgIGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoY3JvcFgsIGNyb3BZLCB0aGlzLnJhZGl1cygpISAqIDIsIHRoaXMucmFkaXVzKCkhICogMik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YShjcm9wWCwgY3JvcFksIHRoaXMuY3V0V2lkdGgoKSEsIHRoaXMuY3V0SGVpZ2h0KCkhKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIE9idGVyIG9zIHZhbG9yZXMgZGUgd2lkdGggZSBoZWlnaHQgZGEgdmFyacOhdmVsIF92YXJpYXZpZXNEaWFsb2dcclxuICAgICAgY29uc3QgdmFyaWF2ZWlzRGlhbG9nID0gdGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk7XHJcbiAgICAgIGlmICh2YXJpYXZlaXNEaWFsb2cpIHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHZhcmlhdmVpc0RpYWxvZztcclxuXHJcbiAgICAgICAgLy8gQ3JpYXIgdW0gbm92byBjYW52YXMgZSBjb250ZXh0byBjb20gb3MgdmFsb3JlcyBkZSB3aWR0aCBlIGhlaWdodFxyXG4gICAgICAgIGNvbnN0IG5ld0NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IG5ld0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgIG5ld0NhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIG5ld0NhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChuZXdDdHgpIHtcclxuICAgICAgICAgIC8vIFJlZGltZW5zaW9uYXIgYSBpbWFnZW0gcGFyYSBvIHRhbWFuaG8gZXNwZWNpZmljYWRvXHJcbiAgICAgICAgICBjb25zdCB0ZW1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgICAgICBjb25zdCB0ZW1wQ3R4ID0gdGVtcENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgICAgdGVtcENhbnZhcy53aWR0aCA9IHRoaXMuY3V0V2lkdGgoKSE7XHJcbiAgICAgICAgICB0ZW1wQ2FudmFzLmhlaWdodCA9IHRoaXMuY3V0SGVpZ2h0KCkhO1xyXG4gICAgICAgICAgdGVtcEN0eCEucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XHJcblxyXG4gICAgICAgICAgbmV3Q3R4LmRyYXdJbWFnZSh0ZW1wQ2FudmFzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Nyb3BJbWFnZScsIHsgZGV0YWlsOntcclxuICAgICAgICAgICAgcmVzdWx0OiBQcm9taXNlLnJlc29sdmUobmV3Q2FudmFzLnRvRGF0YVVSTCgpKSxcclxuICAgICAgICAgICAgc3RhdHVzOiB0cnVlXHJcbiAgICAgICAgICB9IH0pKTtcclxuICAgICAgICAgIHRoaXMuY2xvc2VDcm9wTW9kYWwoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlQ3JvcE1vZGFsKCkge1xyXG4gICAgdGhpcy5kaWFsb2dJbnN0YW5jZS5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCl7XHJcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2Nyb3BJbWFnZScsIHsgZGV0YWlsOntcclxuICAgICAgcmVzdWx0OiBQcm9taXNlLnJlc29sdmUoJ2NhbmNlbCcpLFxyXG4gICAgICBzdGF0dXM6IGZhbHNlXHJcbiAgICB9IH0pKTtcclxuXHJcbiAgICB0aGlzLmNsb3NlQ3JvcE1vZGFsKClcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG59XHJcbiJdfQ==
182
+ ImageCropperComponent
183
+ ], styles: ["img{border-style:solid;border-width:2px;border-radius:50%;object-fit:cover}i{font-size:22px}.botao-alterar-foto{border-style:none;width:max-content;background-color:#002542;color:#000;font-weight:700;cursor:pointer;padding:7px 9px}.botao-alterar-foto i{color:#fff}.botao-excluir-foto{border-style:none;width:max-content;background-color:#002542;color:#000;font-weight:700;cursor:pointer;padding:7px 9px}.botao-excluir-foto i{color:#fff}.btn{position:absolute;top:87%;left:87%;transform:translate(-50%,-50%)}.image-container{display:inline-block;position:relative}.modal-content{height:60vh;position:relative;background-color:#fefefe;margin:1% auto;padding:20px;width:80%;max-width:fit-content;text-align:center;border-radius:12px;display:flex;align-items:center;justify-content:center}.crop-container{display:flex;justify-content:center;align-items:center}.crop-canvas{border:1px solid #d1d5db;border-radius:12px;width:100%;height:auto}.crop-border{position:absolute;border:2px dashed #9ca3af;pointer-events:none}.zoom-container{padding-top:20px;padding-bottom:20px}.button-container{display:flex;align-items:center;justify-content:flex-end;flex-direction:row;margin-top:24px;position:fixed;bottom:0;background:#fff;width:90%;padding:15px}\n"] }]
184
+ }], ctorParameters: () => [{ type: i1.DynamicDialogRef }, { type: i1.DialogService }] });
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY3V0dGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvYXBpL3NlcnZpY2VzL2ltYWdlLmN1dHRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWdCLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBcUIscUJBQXFCLEVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQXNDMUYsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7O0FBekM3RSxNQUFNLE9BQU8sa0JBQWtCO0lBRTdCLFlBQTZCLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBQUcsQ0FBQztJQUU3RCxHQUFHLENBQUMsV0FBbUIsRUFBRSxLQUFhLEVBQUUsTUFBYyxFQUFFLFlBQXFCLEtBQUs7UUFDaEYsTUFBTSxTQUFTLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTNCLE9BQU8sSUFBSSxPQUFPLENBQVMs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QztJQUM5QixDQUFDO0lBRUQsTUFBTTtRQUNKLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFDO2dCQUN6RCxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ2pDLE1BQU0sRUFBRSxLQUFLO2FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtJQUN2QixDQUFDOzhHQWhGRyxlQUFlO2tHQUFmLGVBQWUsZ0ZBckpUOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQlQsa3lDQStHQyxZQUFZLDhCQUNaLFlBQVksOEJBQ1osYUFBYSw4QkFDYixXQUFXLDhCQUNYLG1CQUFtQiw4QkFDbkIsY0FBYyx5TkFDZCxhQUFhLCtCQUNiLHFCQUFxQjs7MkZBSW5CLGVBQWU7a0JBdkpwQixTQUFTOytCQUNFLHNCQUFzQixZQUN0Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJULGNBNkdXLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLHFCQUFxQjtxQkFDdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIER5bmFtaWNEaWFsb2dDb21wb25lbnQsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XHJcbmltcG9ydCB7IEltYWdlQ3JvcHBlZEV2ZW50LCBJbWFnZUNyb3BwZXJDb21wb25lbnQsIExvYWRlZEltYWdlIH0gZnJvbSAnbmd4LWltYWdlLWNyb3BwZXInO1xyXG5cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXHJcbmV4cG9ydCBjbGFzcyBJbWFnZUN1dHRlclNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ3NlcnZpY2U6IERpYWxvZ1NlcnZpY2UpIHt9XHJcblxyXG4gIGN1dChpbWFnZUJhc2U2NDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgaW5kQ2lyY2xlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgY3V0Q29uZmlnID0geyBpbWFnZUJhc2U2NCwgd2lkdGgsIGhlaWdodCwgaW5kQ2lyY2xlIH07XHJcbiAgICB0aGlzLmFicmlyTW9kYWwoY3V0Q29uZmlnKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjcm9wSW1hZ2UnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmKGV2ZW50LmRldGFpbC5zdGF0dXMgPT0gdHJ1ZSApIHtcclxuICAgICAgICAgIHJlc29sdmUoZXZlbnQuZGV0YWlsLnJlc3VsdCk7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICByZWplY3QoJ09wZXJhY2FvIGNhbmNlbGFkYS4nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhYnJpck1vZGFsKGN1dENvbmZpZzogeyBpbWFnZUJhc2U2NDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgaW5kQ2lyY2xlOiBib29sZWFuIH0pIHtcclxuICAgIGNvbnN0IHBhcmFtcyA9ICAgICAgIHtcclxuICAgICAgY2xvc2FibGU6IHRydWUsXHJcbiAgICAgIG1heGltaXphYmxlOiBmYWxzZSxcclxuICAgICAgcG9wdXA6IHRydWUsXHJcbiAgICAgIHdpZHRoOiAnNzV2dycsXHJcbiAgICAgIGhlYWRlcjogYENvcnRhcmAgLFxyXG4gICAgICBpZDogeyBpbWFnZW06IGN1dENvbmZpZy5pbWFnZUJhc2U2NCwgd2lkdGg6IGN1dENvbmZpZy53aWR0aCwgaGVpZ2h0OiBjdXRDb25maWcuaGVpZ2h0LCBpbmRDaXJjbGU6IGN1dENvbmZpZy5pbmRDaXJjbGUgfSxcclxuICAgICAgc3R5bGVDbGFzczogJ21vZGFsJ1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGlhbG9nUmVmOiBEeW5hbWljRGlhbG9nUmVmID0gRm9ybVNlcnZpY2Uub3BlbkRpYWxvZyh0aGlzLmRpYWxvZ3NlcnZpY2UsIFNpbXBsZUNvbXBvbmVudCwgKCk9Pnt9LCBwYXJhbXMpO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG4vLyA/IENvbXBvbmVudGUgZGUgbW9kYWwgdXNhZG8gbm8gY3V0dGVyXHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBLdkxhYmVsTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9rdi1sYWJlbC9rdi1sYWJlbC5tb2R1bGUnO1xyXG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4vZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgS3ZNb2RhbE1vZHVsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMva3YtbW9kYWwva3YtbW9kYWwubW9kdWxlJztcclxuaW1wb3J0IHsgS3ZCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2t2LWJ1dHRvbi9rdi1idXR0b24ubW9kdWxlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zaW1wbGUtY29tcG9uZW50JyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG5cclxuICAgICAgICAgIDxpbWFnZS1jcm9wcGVyXHJcbiAgICAgICAgICAgIFtpbWFnZUJhc2U2NF09XCJfdmFyaWF2aWVzRGlhbG9nKCk/LmltYWdlbVwiXHJcbiAgICAgICAgICAgIChpbWFnZUNyb3BwZWQpPVwiaW1hZ2VDcm9wcGVkKCRldmVudClcIlxyXG4gICAgICAgICAgICBbYXNwZWN0UmF0aW9dPVwiYXNwZWN0UmF0aW8oKVwiXHJcbiAgICAgICAgICAgIChpbWFnZUxvYWRlZCk9XCJpbWFnZUxvYWRlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoKVwiXHJcbiAgICAgICAgICAgIChsb2FkSW1hZ2VGYWlsZWQpPVwibG9hZEltYWdlRmFpbGVkKClcIlxyXG4gICAgICAgICAgICBbcm91bmRDcm9wcGVyXT1cInRoaXMuX3Zhcmlhdmllc0RpYWxvZygpPy5pbmRDaXJjbGVcIlxyXG4gICAgICAgICAgICBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJ0cnVlXCJcclxuICAgICAgICAgICAgW2ltYWdlUXVhbGl0eV09XCIxMDBcIlxyXG4gICAgICAgICAgICBmb3JtYXQ9XCJqcGVnXCJcclxuICAgICAgICAgICAgb3V0cHV0PSdiYXNlNjQnXHJcbiAgICAgICAgICAgIGFsaWduSW1hZ2U9XCJjZW50ZXJcIlxyXG4gICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICBcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGt2LWJ1dHRvbiBsYWJlbD1cIkNhbmNlbGFyXCIgc2V2ZXJpdHk9XCJ0ZXJ0aWFyeVwiIGljb249XCJjbG9zZVwiIChjbGljayk9XCJjYW5jZWwoKVwiPjwva3YtYnV0dG9uPlxyXG4gICAgICAgICAgPGt2LWJ1dHRvbiBsYWJlbD1cIlJlY29ydGFyXCIgc2V2ZXJpdHk9XCJwcmltYXJ5XCIgaWNvbj1cImNyb3BcIiAoY2xpY2spPVwiY3JvcEltYWdlKClcIiBjbGFzcz1cIm1sLTJcIj48L2t2LWJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuICBgLFxyXG4gIHN0eWxlczogW2BcclxuXHJcbiAgICBpbWcge1xyXG4gICAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xyXG4gICAgICBib3JkZXItd2lkdGg6IDJweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgICBvYmplY3QtZml0OiBjb3ZlcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaSB7XHJcbiAgICAgIGZvbnQtc2l6ZTogMjJweDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLmJvdGFvLWFsdGVyYXItZm90byB7XHJcbiAgICAgIGJvcmRlci1zdHlsZTogbm9uZTtcclxuICAgICAgd2lkdGg6IG1heC1jb250ZW50O1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAyNTQyO1xyXG4gICAgICBjb2xvcjogYmxhY2s7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDdweCA5cHg7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5ib3Rhby1hbHRlcmFyLWZvdG8gaSB7XHJcbiAgICAgIGNvbG9yOiAjZmZmO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAuYm90YW8tZXhjbHVpci1mb3RvIHtcclxuICAgICAgYm9yZGVyLXN0eWxlOiBub25lO1xyXG4gICAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDI1NDI7XHJcbiAgICAgIGNvbG9yOiBibGFjaztcclxuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgcGFkZGluZzogN3B4IDlweDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLmJvdGFvLWV4Y2x1aXItZm90byBpIHtcclxuICAgICAgY29sb3I6ICNmZmY7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5idG4ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHRvcDogODclO1xyXG4gICAgICBsZWZ0OiA4NyU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAuaW1hZ2UtY29udGFpbmVyIHtcclxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5tb2RhbC1jb250ZW50IHtcclxuICAgICAgaGVpZ2h0OiA2MHZoO1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XHJcbiAgICAgIG1hcmdpbjogMSUgYXV0bztcclxuICAgICAgcGFkZGluZzogMjBweDtcclxuICAgICAgd2lkdGg6IDgwJTtcclxuICAgICAgbWF4LXdpZHRoOiBmaXQtY29udGVudDtcclxuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLmNyb3AtY29udGFpbmVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5jcm9wLWNhbnZhcyB7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMWQ1ZGI7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5jcm9wLWJvcmRlciB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgYm9yZGVyOiAycHggZGFzaGVkICM5Y2EzYWY7XHJcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAuem9vbS1jb250YWluZXIge1xyXG4gICAgICBwYWRkaW5nLXRvcDogMjBweDtcclxuICAgICAgcGFkZGluZy1ib3R0b206IDIwcHg7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5idXR0b24tY29udGFpbmVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcclxuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgICAgbWFyZ2luLXRvcDogMjRweDtcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICBib3R0b206IDBweDtcclxuICAgICAgYmFja2dyb3VuZDogI2ZmZjtcclxuICAgICAgd2lkdGg6IDkwJTtcclxuICAgICAgcGFkZGluZzogMTVweDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICBcclxuICAgICAgYF0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBEaWFsb2dNb2R1bGUsXHJcbiAgICBLdk1vZGFsTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgS3ZCdXR0b25Nb2R1bGUsXHJcbiAgICBLdkxhYmVsTW9kdWxlLFxyXG4gICAgSW1hZ2VDcm9wcGVyQ29tcG9uZW50XHJcbiAgXVxyXG59KVxyXG5cclxuY2xhc3MgU2ltcGxlQ29tcG9uZW50IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkeW5hbWljRGlhbG9nUmVmOiBEeW5hbWljRGlhbG9nUmVmLCBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UpIHt9XHJcbiAgaW1hZ2VDaGFuZ2VkRXZlbnQ6IEV2ZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgY3JvcHBlZEltYWdlOiBTYWZlVXJsICA9ICcnO1xyXG4gIFxyXG4gICAgXHJcbiAgICBmaWxlQ2hhbmdlRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBldmVudDtcclxuICAgIH1cclxuICAgIGltYWdlQ3JvcHBlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpIHtcclxuICAgICAgdGhpcy5jcm9wcGVkSW1hZ2UgPSBldmVudC5iYXNlNjQhO1xyXG4gICAgfVxyXG4gICAgaW1hZ2VMb2FkZWQoaW1hZ2U6IExvYWRlZEltYWdlKSB7fVxyXG4gICAgY3JvcHBlclJlYWR5KCkge31cclxuICAgIGxvYWRJbWFnZUZhaWxlZCgpIHt9XHJcblxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIFZhcmnDoXZlaXMgZGUgY29udHJvbGVcclxuICAgIF92YXJpYXZpZXNEaWFsb2cgPSBzaWduYWw8eyBpbWFnZW06IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGluZENpcmNsZTogYm9vbGVhbiB9fG51bGw+KG51bGwpXHJcbiAgICBwcml2YXRlIGRpYWxvZ0luc3RhbmNlITpEeW5hbWljRGlhbG9nQ29tcG9uZW50O1xyXG4gICAgYXNwZWN0UmF0aW8gPSBzaWduYWw8YW55PigxLzEpXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlY3VwZXJhclZhcmlhdmllc0RpYWxvZygpXHJcbiAgICB0aGlzLnJlY3VwZXJhSW5zdGFuY2lhRGlhbG9nKClcclxuICAgIHRoaXMuc2V0QXNwZWN0UmF0aW8oKVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBzZXRBc3BlY3RSYXRpbyh3aWR0aDogbnVtYmVyID0gdGhpcy5fdmFyaWF2aWVzRGlhbG9nKCk/LndpZHRoISwgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLl92YXJpYXZpZXNEaWFsb2coKT8uaGVpZ2h0ISkge1xyXG4gICAgY29uc3QgZ2NkID0gKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyID0+IChiID09PSAwID8gYSA6IGdjZChiLCBhICUgYikpO1xyXG4gICAgY29uc3QgZGl2aXNvciA9IGdjZCh3aWR0aCwgaGVpZ2h0KTtcclxuICAgIGNvbnN0IGFzcGVjdFdpZHRoID0gd2lkdGggLyBkaXZpc29yO1xyXG4gICAgY29uc3QgYXNwZWN0SGVpZ2h0ID0gaGVpZ2h0IC8gZGl2aXNvcjtcclxuICAgIHRoaXMuYXNwZWN0UmF0aW8uc2V0KGFzcGVjdFdpZHRoL2FzcGVjdEhlaWdodClcclxuXHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gTcOpdG9kb3MgZGUgcmVjdXBlcmHDp8OjbyBkZSBkYWRvc1xyXG4gIHJlY3VwZXJhSW5zdGFuY2lhRGlhbG9nKCk6IER5bmFtaWNEaWFsb2dDb21wb25lbnQge1xyXG4gICAgY29uc3QgYXJyOiBNYXA8RHluYW1pY0RpYWxvZ1JlZjxhbnk+LCBDb21wb25lbnRSZWY8YW55Pj4gPSB0aGlzLmRpYWxvZ1NlcnZpY2UuZGlhbG9nQ29tcG9uZW50UmVmTWFwXHJcbiAgICBjb25zdCBlbnRyaWVzID0gYXJyLmVudHJpZXMoKTtcclxuICAgIGNvbnN0IGZpcnN0RW50cnkgPSBlbnRyaWVzLm5leHQoKS52YWx1ZTtcclxuICAgIGNvbnN0IFtmaXJzdEtleSwgZmlyc3RWYWx1ZV0gPSBmaXJzdEVudHJ5ITtcclxuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5kaWFsb2dTZXJ2aWNlLmdldEluc3RhbmNlKGZpcnN0S2V5KVxyXG4gICAgdGhpcy5kaWFsb2dJbnN0YW5jZSA9IGluc3RhbmNlXHJcbiAgICByZXR1cm4gaW5zdGFuY2VcclxuICB9XHJcblxyXG4gIHJlY3VwZXJhclZhcmlhdmllc0RpYWxvZygpOiB2b2lke1xyXG4gICAgdGhpcy5fdmFyaWF2aWVzRGlhbG9nLnNldCh0aGlzLnJlY3VwZXJhSW5zdGFuY2lhRGlhbG9nKCkuZGF0YS5pZClcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAvLyNyZWdpb24gTcOpdG9kb3MgZGUgY29ydGUgZSBmZWNoYW1lbnRvIGRvIG1vZGFsXHJcbiAgY3JvcEltYWdlKCkge1xyXG4gICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjcm9wSW1hZ2UnLCB7IGRldGFpbDoge1xyXG4gICAgICAgICAgICByZXN1bHQ6IHRoaXMuY3JvcHBlZEltYWdlLFxyXG4gICAgICAgICAgICBzdGF0dXM6IHRydWVcclxuICAgICAgICAgIH0gfSkpO1xyXG4gICAgICAgICAgdGhpcy5jbG9zZUNyb3BNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VDcm9wTW9kYWwoKSB7XHJcbiAgICB0aGlzLmRpYWxvZ0luc3RhbmNlLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWwoKXtcclxuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY3JvcEltYWdlJywgeyBkZXRhaWw6e1xyXG4gICAgICByZXN1bHQ6IFByb21pc2UucmVzb2x2ZSgnY2FuY2VsJyksXHJcbiAgICAgIHN0YXR1czogZmFsc2VcclxuICAgIH0gfSkpO1xyXG5cclxuICAgIHRoaXMuY2xvc2VDcm9wTW9kYWwoKVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbn1cclxuIl19