UNPKG

162 kBJavaScriptView Raw
1import { __values } from 'tslib';
2import { Injectable, Component, Input, Output, EventEmitter, ViewChild, NgModule } from '@angular/core';
3import { fabric } from 'fabric';
4import { ActionSheetController, IonicModule } from 'ionic-angular';
5import { Gesture } from 'ionic-angular/gestures/gesture';
6import { TranslateService } from '@ngx-translate/core';
7import { CommonModule } from '@angular/common';
8
9/**
10 * @fileoverview added by tsickle
11 * @suppress {checkTypes} checked by tsc
12 */
13/** @enum {number} */
14var AvailableGeometricShape = {
15 "Rectangle": 0,
16 "Circle": 1,
17 "Triangle": 2,
18 "Line": 3,
19 "Cross": 4,
20};
21AvailableGeometricShape[AvailableGeometricShape["Rectangle"]] = "Rectangle";
22AvailableGeometricShape[AvailableGeometricShape["Circle"]] = "Circle";
23AvailableGeometricShape[AvailableGeometricShape["Triangle"]] = "Triangle";
24AvailableGeometricShape[AvailableGeometricShape["Line"]] = "Line";
25AvailableGeometricShape[AvailableGeometricShape["Cross"]] = "Cross";
26
27/**
28 * @fileoverview added by tsickle
29 * @suppress {checkTypes} checked by tsc
30 */
31var /** @type {?} */ SHAPE_DATA = {
32 width: 200,
33 height: 200,
34 left: 50,
35 top: 50,
36 radius: 100,
37 stroke: 10,
38 freeDrawingBrushWidth: 10,
39 cornerSize: 20
40};
41
42/**
43 * @fileoverview added by tsickle
44 * @suppress {checkTypes} checked by tsc
45 */
46var CanvasManagerService = /** @class */ (function () {
47 function CanvasManagerService() {
48 this.emptyCanvas();
49 this.mousePosition = { x: 0, y: 0 };
50 this.cropStartingPosition = { x: 0, y: 0 };
51 this.canvas.freeDrawingBrush.width = SHAPE_DATA.freeDrawingBrushWidth;
52 }
53 Object.defineProperty(CanvasManagerService.prototype, "backgroundImage", {
54 get: /**
55 * @return {?}
56 */
57 function () {
58 return this.canvas;
59 },
60 enumerable: true,
61 configurable: true
62 });
63 Object.defineProperty(CanvasManagerService.prototype, "canvasObjects", {
64 get: /**
65 * @return {?}
66 */
67 function () {
68 return this.canvas.getObjects();
69 },
70 enumerable: true,
71 configurable: true
72 });
73 Object.defineProperty(CanvasManagerService.prototype, "canvasBackgroundImage", {
74 get: /**
75 * @return {?}
76 */
77 function () {
78 return this.canvas.backgroundImage;
79 },
80 enumerable: true,
81 configurable: true
82 });
83 Object.defineProperty(CanvasManagerService.prototype, "activeObject", {
84 get: /**
85 * @return {?}
86 */
87 function () {
88 return this.canvas.getActiveObject();
89 },
90 enumerable: true,
91 configurable: true
92 });
93 Object.defineProperty(CanvasManagerService.prototype, "activeGroup", {
94 get: /**
95 * @return {?}
96 */
97 function () {
98 return this.canvas.getActiveObjects();
99 },
100 enumerable: true,
101 configurable: true
102 });
103 /**
104 * @return {?}
105 */
106 CanvasManagerService.prototype.emptyCanvas = /**
107 * @return {?}
108 */
109 function () {
110 if (this.canvas) {
111 this.canvas.dispose();
112 }
113 this.canvas = new fabric.Canvas('canvas');
114 this.canvas.clear();
115 this.canvas.remove(this.canvas.getObjects());
116 };
117 /**
118 * @param {?=} backgroundImageURL
119 * @return {?}
120 */
121 CanvasManagerService.prototype.loadNewImage = /**
122 * @param {?=} backgroundImageURL
123 * @return {?}
124 */
125 function (backgroundImageURL) {
126 this.emptyCanvas();
127 if (backgroundImageURL) {
128 this.setBackgroundFromURL(backgroundImageURL);
129 }
130 };
131 /**
132 * @return {?}
133 */
134 CanvasManagerService.prototype.renderCanvas = /**
135 * @return {?}
136 */
137 function () {
138 this.markSelectedObjectsDirty();
139 this.canvas.renderAll();
140 };
141 /**
142 * @param {?} strokeColor
143 * @param {?} fillColor
144 * @param {?} shape
145 * @return {?}
146 */
147 CanvasManagerService.prototype.addGeometricShape = /**
148 * @param {?} strokeColor
149 * @param {?} fillColor
150 * @param {?} shape
151 * @return {?}
152 */
153 function (strokeColor, fillColor, shape) {
154 switch (shape) {
155 case AvailableGeometricShape.Rectangle:
156 this.addRectangle(strokeColor, fillColor);
157 break;
158 case AvailableGeometricShape.Circle:
159 this.addCircle(strokeColor, fillColor);
160 break;
161 case AvailableGeometricShape.Triangle:
162 this.addTriangle(strokeColor, fillColor);
163 break;
164 case AvailableGeometricShape.Line:
165 this.addHorizontalLine(strokeColor, fillColor);
166 break;
167 case AvailableGeometricShape.Cross:
168 this.addCross(strokeColor, fillColor);
169 break;
170 }
171 };
172 /**
173 * @param {?} strokeColor
174 * @param {?} fillColor
175 * @return {?}
176 */
177 CanvasManagerService.prototype.addRectangle = /**
178 * @param {?} strokeColor
179 * @param {?} fillColor
180 * @return {?}
181 */
182 function (strokeColor, fillColor) {
183 this.canvas.add(new fabric.Rect({
184 width: SHAPE_DATA.width,
185 height: SHAPE_DATA.height,
186 left: SHAPE_DATA.left,
187 top: SHAPE_DATA.top,
188 fill: fillColor,
189 stroke: strokeColor,
190 strokeWidth: SHAPE_DATA.stroke,
191 cornerSize: SHAPE_DATA.cornerSize
192 }));
193 };
194 /**
195 * @param {?} strokeColor
196 * @param {?} fillColor
197 * @return {?}
198 */
199 CanvasManagerService.prototype.addCircle = /**
200 * @param {?} strokeColor
201 * @param {?} fillColor
202 * @return {?}
203 */
204 function (strokeColor, fillColor) {
205 this.canvas.add(new fabric.Circle({
206 left: SHAPE_DATA.left,
207 top: SHAPE_DATA.top,
208 radius: SHAPE_DATA.radius,
209 stroke: strokeColor,
210 strokeWidth: SHAPE_DATA.stroke,
211 fill: fillColor,
212 cornerSize: SHAPE_DATA.cornerSize
213 }));
214 };
215 /**
216 * @param {?} strokeColor
217 * @param {?} fillColor
218 * @return {?}
219 */
220 CanvasManagerService.prototype.addTriangle = /**
221 * @param {?} strokeColor
222 * @param {?} fillColor
223 * @return {?}
224 */
225 function (strokeColor, fillColor) {
226 this.canvas.add(new fabric.Triangle({
227 width: SHAPE_DATA.width,
228 height: SHAPE_DATA.height,
229 left: SHAPE_DATA.left,
230 top: SHAPE_DATA.top,
231 fill: fillColor,
232 stroke: strokeColor,
233 strokeWidth: SHAPE_DATA.stroke,
234 cornerSize: SHAPE_DATA.cornerSize
235 }));
236 };
237 /**
238 * @param {?} strokeColor
239 * @param {?} fillColor
240 * @return {?}
241 */
242 CanvasManagerService.prototype.addHorizontalLine = /**
243 * @param {?} strokeColor
244 * @param {?} fillColor
245 * @return {?}
246 */
247 function (strokeColor, fillColor) {
248 this.canvas.add(this.createHorizontalLine(strokeColor));
249 };
250 /**
251 * @param {?} strokeColor
252 * @return {?}
253 */
254 CanvasManagerService.prototype.createHorizontalLine = /**
255 * @param {?} strokeColor
256 * @return {?}
257 */
258 function (strokeColor) {
259 var /** @type {?} */ line = new fabric.Line([100, 150, 200, 150], {
260 left: 50,
261 top: 100,
262 stroke: strokeColor,
263 strokeWidth: 5,
264 cornerSize: SHAPE_DATA.cornerSize
265 });
266 line.setControlsVisibility({
267 bl: false,
268 br: false,
269 tl: false,
270 tr: false,
271 mt: false,
272 mb: false
273 });
274 return line;
275 };
276 /**
277 * @param {?} strokeColor
278 * @return {?}
279 */
280 CanvasManagerService.prototype.createVerticalLine = /**
281 * @param {?} strokeColor
282 * @return {?}
283 */
284 function (strokeColor) {
285 var /** @type {?} */ line = new fabric.Line([150, 100, 150, 200], {
286 left: 100,
287 top: 50,
288 stroke: strokeColor,
289 strokeWidth: 5,
290 cornerSize: SHAPE_DATA.cornerSize
291 });
292 line.setControlsVisibility({
293 bl: false,
294 br: false,
295 tl: false,
296 tr: false,
297 ml: false,
298 mr: false
299 });
300 return line;
301 };
302 /**
303 * @param {?} strokeColor
304 * @param {?} fillColor
305 * @return {?}
306 */
307 CanvasManagerService.prototype.addCross = /**
308 * @param {?} strokeColor
309 * @param {?} fillColor
310 * @return {?}
311 */
312 function (strokeColor, fillColor) {
313 var /** @type {?} */ horizontalLine = this.createHorizontalLine(strokeColor);
314 var /** @type {?} */ verticalLine = this.createVerticalLine(strokeColor);
315 this.canvas.add(horizontalLine);
316 this.canvas.add(verticalLine);
317 };
318 /**
319 * @return {?}
320 */
321 CanvasManagerService.prototype.toggleFreeDrawing = /**
322 * @return {?}
323 */
324 function () {
325 this.canvas.isDrawingMode = !this.canvas.isDrawingMode;
326 };
327 /**
328 * @param {?} color
329 * @return {?}
330 */
331 CanvasManagerService.prototype.setFreeDrawingBrushColor = /**
332 * @param {?} color
333 * @return {?}
334 */
335 function (color) {
336 this.canvas.freeDrawingBrush.color = color;
337 };
338 Object.defineProperty(CanvasManagerService.prototype, "freeDrawingBrushWidthFromZoom", {
339 set: /**
340 * @param {?} zoom
341 * @return {?}
342 */
343 function (zoom) {
344 this.canvas.freeDrawingBrush.width = SHAPE_DATA.freeDrawingBrushWidth * (1 / zoom);
345 },
346 enumerable: true,
347 configurable: true
348 });
349 /**
350 * @param {?} color
351 * @param {?} inputText
352 * @return {?}
353 */
354 CanvasManagerService.prototype.addText = /**
355 * @param {?} color
356 * @param {?} inputText
357 * @return {?}
358 */
359 function (color, inputText) {
360 var /** @type {?} */ text = new fabric.IText('text', {
361 fontFamily: 'arial black',
362 fontStyle: 'bold',
363 left: SHAPE_DATA.left,
364 top: SHAPE_DATA.top,
365 cornerSize: SHAPE_DATA.cornerSize
366 });
367 text.setColor(color);
368 this.canvas.add(text);
369 };
370 /**
371 * @param {?} imageURL
372 * @return {?}
373 */
374 CanvasManagerService.prototype.addImage = /**
375 * @param {?} imageURL
376 * @return {?}
377 */
378 function (imageURL) {
379 var _this = this;
380 return new Promise(function (resolve, reject) {
381 var /** @type {?} */ canvas = _this.canvas;
382 var /** @type {?} */ image = new Image();
383 image.onload = function (img) {
384 var /** @type {?} */ fabricImage = new fabric.Image(image, {
385 angle: 0,
386 width: image.width,
387 height: image.height,
388 left: SHAPE_DATA.left,
389 top: SHAPE_DATA.top,
390 scaleX: 1,
391 scaleY: 1,
392 cornerSize: SHAPE_DATA.cornerSize
393 });
394 canvas.add(fabricImage);
395 resolve();
396 };
397 image.src = imageURL;
398 });
399 };
400 /**
401 * @param {?} backgroundImageURL
402 * @return {?}
403 */
404 CanvasManagerService.prototype.setBackgroundFromURL = /**
405 * @param {?} backgroundImageURL
406 * @return {?}
407 */
408 function (backgroundImageURL) {
409 var /** @type {?} */ canvas = this.canvas;
410 var /** @type {?} */ resize = this.resizeCanvasAndComputeScaleFactor;
411 return new Promise(function (resolve, reject) {
412 if (backgroundImageURL == null) {
413 return reject();
414 }
415 var /** @type {?} */ image = new Image();
416 image.onload = function () {
417 var /** @type {?} */ f_img = new fabric.Image(image, {});
418 var /** @type {?} */ scaleData = resize(f_img, canvas);
419 canvas.setBackgroundImage(f_img, canvas.renderAll.bind(canvas), {
420 scaleX: scaleData.scaleFactor,
421 scaleY: scaleData.scaleFactor
422 });
423 canvas.renderAll();
424 resolve();
425 };
426 image.src = backgroundImageURL;
427 });
428 };
429 /**
430 * @param {?} f_img
431 * @param {?} canvas
432 * @return {?}
433 */
434 CanvasManagerService.prototype.resizeCanvasAndComputeScaleFactor = /**
435 * @param {?} f_img
436 * @param {?} canvas
437 * @return {?}
438 */
439 function (f_img, canvas) {
440 var /** @type {?} */ container = document.getElementsByClassName('div-canvas-container')[0];
441 canvas.setWidth(container.clientWidth);
442 canvas.setHeight(container.clientHeight);
443 var /** @type {?} */ canvasWidth = canvas.getWidth();
444 var /** @type {?} */ canvasHeight = canvas.getHeight();
445 var /** @type {?} */ canvasAspect = canvasWidth / canvasHeight;
446 var /** @type {?} */ imgAspect = f_img.width / f_img.height;
447 var /** @type {?} */ left, /** @type {?} */ top, /** @type {?} */ scaleFactor;
448 if (canvasAspect <= imgAspect) {
449 scaleFactor = canvasWidth / f_img.width;
450 left = 0;
451 top = -(f_img.height * scaleFactor - canvasHeight) / 2;
452 }
453 else {
454 scaleFactor = canvasHeight / f_img.height;
455 top = 0;
456 left = -(f_img.width * scaleFactor - canvasWidth) / 2;
457 }
458 return { scaleFactor: scaleFactor, left: left, top: top };
459 };
460 /**
461 * @return {?}
462 */
463 CanvasManagerService.prototype.onOrientationChange = /**
464 * @return {?}
465 */
466 function () {
467 this.mousePosition = { x: this.canvas.getWidth, y: this.canvas.getHeight };
468 this.cropImage();
469 };
470 /**
471 * @param {?} color
472 * @return {?}
473 */
474 CanvasManagerService.prototype.changeSelectedObjectsFillColor = /**
475 * @param {?} color
476 * @return {?}
477 */
478 function (color) {
479 var /** @type {?} */ activeObjects = this.canvas.getActiveObjects();
480 if (activeObjects) {
481 try {
482 for (var activeObjects_1 = __values(activeObjects), activeObjects_1_1 = activeObjects_1.next(); !activeObjects_1_1.done; activeObjects_1_1 = activeObjects_1.next()) {
483 var object = activeObjects_1_1.value;
484 object.setColor(color);
485 this.canvas.renderAll();
486 }
487 }
488 catch (e_1_1) { e_1 = { error: e_1_1 }; }
489 finally {
490 try {
491 if (activeObjects_1_1 && !activeObjects_1_1.done && (_a = activeObjects_1.return)) _a.call(activeObjects_1);
492 }
493 finally { if (e_1) throw e_1.error; }
494 }
495 }
496 var e_1, _a;
497 };
498 /**
499 * @param {?} color
500 * @return {?}
501 */
502 CanvasManagerService.prototype.changeSelectedObjectsStrokeColor = /**
503 * @param {?} color
504 * @return {?}
505 */
506 function (color) {
507 var /** @type {?} */ activeObjects = this.canvas.getActiveObjects();
508 if (activeObjects) {
509 try {
510 for (var activeObjects_2 = __values(activeObjects), activeObjects_2_1 = activeObjects_2.next(); !activeObjects_2_1.done; activeObjects_2_1 = activeObjects_2.next()) {
511 var object = activeObjects_2_1.value;
512 if (object.type === 'i-text') {
513 object.setColor(color);
514 }
515 else {
516 object.stroke = color;
517 object.set('dirty', true);
518 }
519 }
520 }
521 catch (e_2_1) { e_2 = { error: e_2_1 }; }
522 finally {
523 try {
524 if (activeObjects_2_1 && !activeObjects_2_1.done && (_a = activeObjects_2.return)) _a.call(activeObjects_2);
525 }
526 finally { if (e_2) throw e_2.error; }
527 }
528 this.canvas.renderAll();
529 }
530 var e_2, _a;
531 };
532 /**
533 * @return {?}
534 */
535 CanvasManagerService.prototype.deleteSelectedObjects = /**
536 * @return {?}
537 */
538 function () {
539 var /** @type {?} */ activeObjects = this.canvas.getActiveObjects();
540 if (activeObjects) {
541 try {
542 for (var activeObjects_3 = __values(activeObjects), activeObjects_3_1 = activeObjects_3.next(); !activeObjects_3_1.done; activeObjects_3_1 = activeObjects_3.next()) {
543 var object = activeObjects_3_1.value;
544 this.canvas.remove(object);
545 }
546 }
547 catch (e_3_1) { e_3 = { error: e_3_1 }; }
548 finally {
549 try {
550 if (activeObjects_3_1 && !activeObjects_3_1.done && (_a = activeObjects_3.return)) _a.call(activeObjects_3);
551 }
552 finally { if (e_3) throw e_3.error; }
553 }
554 this.canvas.discardActiveObject();
555 this.canvas.renderAll();
556 }
557 var e_3, _a;
558 };
559 /**
560 * @return {?}
561 */
562 CanvasManagerService.prototype.bringSelectedObjectsToFront = /**
563 * @return {?}
564 */
565 function () {
566 var /** @type {?} */ activeObjects = this.canvas.getActiveObjects();
567 if (activeObjects) {
568 try {
569 for (var activeObjects_4 = __values(activeObjects), activeObjects_4_1 = activeObjects_4.next(); !activeObjects_4_1.done; activeObjects_4_1 = activeObjects_4.next()) {
570 var object = activeObjects_4_1.value;
571 this.canvas.bringToFront(object);
572 }
573 }
574 catch (e_4_1) { e_4 = { error: e_4_1 }; }
575 finally {
576 try {
577 if (activeObjects_4_1 && !activeObjects_4_1.done && (_a = activeObjects_4.return)) _a.call(activeObjects_4);
578 }
579 finally { if (e_4) throw e_4.error; }
580 }
581 }
582 var e_4, _a;
583 };
584 /**
585 * @return {?}
586 */
587 CanvasManagerService.prototype.sendSelectedObjectsToBack = /**
588 * @return {?}
589 */
590 function () {
591 var /** @type {?} */ activeObjects = this.canvas.getActiveObjects();
592 if (activeObjects) {
593 try {
594 for (var activeObjects_5 = __values(activeObjects), activeObjects_5_1 = activeObjects_5.next(); !activeObjects_5_1.done; activeObjects_5_1 = activeObjects_5.next()) {
595 var object = activeObjects_5_1.value;
596 this.canvas.sendToBack(object);
597 }
598 }
599 catch (e_5_1) { e_5 = { error: e_5_1 }; }
600 finally {
601 try {
602 if (activeObjects_5_1 && !activeObjects_5_1.done && (_a = activeObjects_5.return)) _a.call(activeObjects_5);
603 }
604 finally { if (e_5) throw e_5.error; }
605 }
606 }
607 var e_5, _a;
608 };
609 /**
610 * @return {?}
611 */
612 CanvasManagerService.prototype.jsonFromCanvas = /**
613 * @return {?}
614 */
615 function () {
616 return this.canvas.toJSON();
617 };
618 /**
619 * @param {?} json
620 * @return {?}
621 */
622 CanvasManagerService.prototype.loadfromJson = /**
623 * @param {?} json
624 * @return {?}
625 */
626 function (json) {
627 var _this = this;
628 var /** @type {?} */ container = document.getElementsByClassName('div-canvas-container')[0];
629 this.canvas.setWidth(container.clientWidth);
630 this.canvas.setHeight(container.clientHeight);
631 return new Promise(function (resolve, reject) {
632 _this.adjustCanvas(json);
633 _this.canvas.loadFromJSON(json, _this.canvas.renderAll.bind(_this.canvas));
634 resolve();
635 });
636 };
637 /**
638 * @param {?} json
639 * @return {?}
640 */
641 CanvasManagerService.prototype.adjustCanvas = /**
642 * @param {?} json
643 * @return {?}
644 */
645 function (json) {
646 var /** @type {?} */ backgroundImage = json['backgroundImage'];
647 var /** @type {?} */ container = document.getElementsByClassName('div-canvas-container')[0];
648 var /** @type {?} */ width = backgroundImage['width'];
649 var /** @type {?} */ height = backgroundImage['height'];
650 var /** @type {?} */ canvasWidth = container.clientWidth;
651 var /** @type {?} */ canvasHeight = container.clientHeight;
652 var /** @type {?} */ canvasAspect = canvasWidth / canvasHeight;
653 var /** @type {?} */ imgAspect = width / height;
654 var /** @type {?} */ scaleFactor;
655 if (canvasAspect <= imgAspect) {
656 scaleFactor = canvasWidth / width;
657 }
658 else {
659 scaleFactor = canvasHeight / height;
660 }
661 var /** @type {?} */ objectScale = scaleFactor / backgroundImage['scaleX'];
662 backgroundImage['scaleX'] = scaleFactor;
663 backgroundImage['scaleY'] = scaleFactor;
664 this.canvas.setWidth(width * scaleFactor);
665 this.canvas.setHeight(height * scaleFactor);
666 var /** @type {?} */ objects = json['objects'];
667 for (var /** @type {?} */ i = 0; i < objects.length; i++) {
668 objects[i]['left'] *= objectScale;
669 objects[i]['top'] *= objectScale;
670 objects[i]['scaleX'] *= objectScale;
671 objects[i]['scaleY'] *= objectScale;
672 }
673 this.canvas.selectable = true;
674 this.canvas.selection = true;
675 this.canvas.renderAll();
676 };
677 /**
678 * @return {?}
679 */
680 CanvasManagerService.prototype.exportImageAsDataURL = /**
681 * @return {?}
682 */
683 function () {
684 return this.canvas.toDataURL('image/png');
685 };
686 /**
687 * @param {?} itemNumber
688 * @return {?}
689 */
690 CanvasManagerService.prototype.selectItem = /**
691 * @param {?} itemNumber
692 * @return {?}
693 */
694 function (itemNumber) {
695 this.canvas.setActiveObject(this.canvas.item(itemNumber));
696 };
697 /**
698 * @param {?} activeObject
699 * @return {?}
700 */
701 CanvasManagerService.prototype.getIndexOf = /**
702 * @param {?} activeObject
703 * @return {?}
704 */
705 function (activeObject) {
706 return this.canvas.getObjects().indexOf(activeObject);
707 };
708 /**
709 * @return {?}
710 */
711 CanvasManagerService.prototype.selectLastObject = /**
712 * @return {?}
713 */
714 function () {
715 var /** @type {?} */ itemNumber = this.canvas.getObjects().length - 1;
716 var /** @type {?} */ object = this.canvas.item(itemNumber);
717 this.canvas.setActiveObject(object);
718 object.enterEditing();
719 };
720 /**
721 * @return {?}
722 */
723 CanvasManagerService.prototype.markSelectedObjectsDirty = /**
724 * @return {?}
725 */
726 function () {
727 var /** @type {?} */ activeObjects = this.canvas.getActiveObjects();
728 if (activeObjects) {
729 try {
730 for (var activeObjects_6 = __values(activeObjects), activeObjects_6_1 = activeObjects_6.next(); !activeObjects_6_1.done; activeObjects_6_1 = activeObjects_6.next()) {
731 var object = activeObjects_6_1.value;
732 object.set('dirty', true);
733 }
734 }
735 catch (e_6_1) { e_6 = { error: e_6_1 }; }
736 finally {
737 try {
738 if (activeObjects_6_1 && !activeObjects_6_1.done && (_a = activeObjects_6.return)) _a.call(activeObjects_6);
739 }
740 finally { if (e_6) throw e_6.error; }
741 }
742 }
743 var e_6, _a;
744 };
745 /**
746 * @return {?}
747 */
748 CanvasManagerService.prototype.addSelectionRectangle = /**
749 * @return {?}
750 */
751 function () {
752 this.cropRectangle = new fabric.Rect({
753 fill: 'transparent',
754 originX: 'left',
755 originY: 'top',
756 stroke: '#ccc',
757 strokeDashArray: [2, 2],
758 opacity: 1,
759 width: 1,
760 height: 1
761 });
762 this.cropRectangle.visible = false;
763 this.canvas.add(this.cropRectangle);
764 };
765 /**
766 * @param {?} event
767 * @return {?}
768 */
769 CanvasManagerService.prototype.ajustCropRectangleFromMouse = /**
770 * @param {?} event
771 * @return {?}
772 */
773 function (event) {
774 var /** @type {?} */ x = Math.min(event.layerX, this.mousePosition.x), /** @type {?} */
775 y = Math.min(event.layerY, this.mousePosition.y), /** @type {?} */
776 w = Math.abs(event.layerX - this.mousePosition.x), /** @type {?} */
777 h = Math.abs(event.layerY - this.mousePosition.y);
778 if (!w || !h) {
779 return false;
780 }
781 this.cropRectangle
782 .set('top', y)
783 .set('left', x)
784 .set('width', w)
785 .set('height', h);
786 this.canvas.renderAll();
787 return true;
788 };
789 /**
790 * @param {?} event
791 * @return {?}
792 */
793 CanvasManagerService.prototype.startSelectingCropRectangleFromMouse = /**
794 * @param {?} event
795 * @return {?}
796 */
797 function (event) {
798 this.cropStartingPosition = { x: this.canvas.left, y: this.canvas.top };
799 this.cropRectangle.left = event.layerX;
800 this.cropRectangle.top = event.layerY;
801 this.cropRectangle.setCoords();
802 this.mousePosition = { x: event.layerX, y: event.layerY };
803 this.canvas.renderAll();
804 this.cropRectangle.visible = true;
805 this.canvas.bringToFront(this.cropRectangle);
806 };
807 /**
808 * @return {?}
809 */
810 CanvasManagerService.prototype.cropImage = /**
811 * @return {?}
812 */
813 function () {
814 var /** @type {?} */ left = this.cropRectangle.left;
815 var /** @type {?} */ top = this.cropRectangle.top;
816 var /** @type {?} */ width = this.cropRectangle.width;
817 var /** @type {?} */ height = this.cropRectangle.height;
818 var /** @type {?} */ container = document.getElementsByClassName('div-canvas-container')[0];
819 var /** @type {?} */ canvasWidth = container.clientWidth;
820 var /** @type {?} */ canvasHeight = container.clientHeight;
821 var /** @type {?} */ canvasAspect = canvasWidth / canvasHeight;
822 var /** @type {?} */ imgAspect = width / height;
823 var /** @type {?} */ scaleFactor;
824 if (canvasAspect <= imgAspect) {
825 scaleFactor = canvasWidth / width;
826 }
827 else {
828 scaleFactor = canvasHeight / height;
829 }
830 this.canvas.setWidth(width * scaleFactor);
831 this.canvas.setHeight(height * scaleFactor);
832 this.canvas.backgroundImage.scaleX *= scaleFactor;
833 this.canvas.backgroundImage.scaleY *= scaleFactor;
834 this.canvas.backgroundImage.left -= left;
835 this.canvas.backgroundImage.left *= scaleFactor;
836 this.canvas.backgroundImage.top -= top - scaleFactor;
837 this.canvas.backgroundImage.top *= scaleFactor;
838 this.moveAllObjectsInCanvas(-1 * left, -1 * top, scaleFactor);
839 this.canvas.selectable = true;
840 this.canvas.selection = true;
841 this.cropRectangle.visible = false;
842 this.canvas.remove(this.cropRectangle);
843 this.canvas.renderAll();
844 };
845 /**
846 * @param {?} event
847 * @return {?}
848 */
849 CanvasManagerService.prototype.ajustCropRectangle = /**
850 * @param {?} event
851 * @return {?}
852 */
853 function (event) {
854 var /** @type {?} */ touch = event.touches[0];
855 var /** @type {?} */ rect = event.target.getBoundingClientRect();
856 var /** @type {?} */ x = Math.min(touch.clientX - rect.left, this.mousePosition.x), /** @type {?} */
857 y = Math.min(touch.clientY - rect.top, this.mousePosition.y), /** @type {?} */
858 w = Math.abs(touch.clientX - rect.left - this.mousePosition.x), /** @type {?} */
859 h = Math.abs(touch.clientY - rect.top - this.mousePosition.y);
860 if (!w || !h) {
861 return false;
862 }
863 this.cropRectangle
864 .set('left', x)
865 .set('top', y)
866 .set('width', w)
867 .set('height', h);
868 this.canvas.renderAll();
869 return true;
870 };
871 /**
872 * @param {?} event
873 * @return {?}
874 */
875 CanvasManagerService.prototype.startSelectingCropRectangle = /**
876 * @param {?} event
877 * @return {?}
878 */
879 function (event) {
880 this.cropStartingPosition = { x: this.canvas.left, y: this.canvas.top };
881 var /** @type {?} */ touch = event.touches[0];
882 var /** @type {?} */ rect = event.target.getBoundingClientRect();
883 this.cropRectangle.left = touch.clientX - rect.left;
884 this.cropRectangle.top = touch.clientY - rect.top;
885 this.cropRectangle.setCoords();
886 this.mousePosition = { x: touch.clientX - rect.left, y: touch.clientY - rect.top };
887 this.canvas.renderAll();
888 this.cropRectangle.visible = true;
889 this.canvas.bringToFront(this.cropRectangle);
890 };
891 /**
892 * @return {?}
893 */
894 CanvasManagerService.prototype.disableSelection = /**
895 * @return {?}
896 */
897 function () {
898 this.canvas.selection = false;
899 };
900 /**
901 * @param {?} x
902 * @param {?} y
903 * @param {?} scaleFactor
904 * @return {?}
905 */
906 CanvasManagerService.prototype.moveAllObjectsInCanvas = /**
907 * @param {?} x
908 * @param {?} y
909 * @param {?} scaleFactor
910 * @return {?}
911 */
912 function (x, y, scaleFactor) {
913 var /** @type {?} */ objects = this.canvas.getObjects();
914 try {
915 for (var objects_1 = __values(objects), objects_1_1 = objects_1.next(); !objects_1_1.done; objects_1_1 = objects_1.next()) {
916 var obj = objects_1_1.value;
917 obj.left += x;
918 obj.left *= scaleFactor;
919 obj.scaleX *= scaleFactor;
920 obj.top += y;
921 obj.scaleY *= scaleFactor;
922 obj.top *= scaleFactor;
923 obj.setCoords();
924 }
925 }
926 catch (e_7_1) { e_7 = { error: e_7_1 }; }
927 finally {
928 try {
929 if (objects_1_1 && !objects_1_1.done && (_a = objects_1.return)) _a.call(objects_1);
930 }
931 finally { if (e_7) throw e_7.error; }
932 }
933 var e_7, _a;
934 };
935 /**
936 * @return {?}
937 */
938 CanvasManagerService.prototype.groupSelectedObjects = /**
939 * @return {?}
940 */
941 function () {
942 var /** @type {?} */ activeObjects = this.canvas.getActiveObjects();
943 if (activeObjects) {
944 var /** @type {?} */ objects = [];
945 try {
946 for (var activeObjects_7 = __values(activeObjects), activeObjects_7_1 = activeObjects_7.next(); !activeObjects_7_1.done; activeObjects_7_1 = activeObjects_7.next()) {
947 var object = activeObjects_7_1.value;
948 objects.push(object);
949 }
950 }
951 catch (e_8_1) { e_8 = { error: e_8_1 }; }
952 finally {
953 try {
954 if (activeObjects_7_1 && !activeObjects_7_1.done && (_a = activeObjects_7.return)) _a.call(activeObjects_7);
955 }
956 finally { if (e_8) throw e_8.error; }
957 }
958 this.deleteSelectedObjects();
959 var /** @type {?} */ group = new fabric.Group(objects);
960 this.canvas.add(group);
961 group.setCoords();
962 this.canvas.setActiveObject(group);
963 this.canvas.renderAll();
964 }
965 var e_8, _a;
966 };
967 /**
968 * @param {?} event
969 * @return {?}
970 */
971 CanvasManagerService.prototype.setLastPanPosition = /**
972 * @param {?} event
973 * @return {?}
974 */
975 function (event) {
976 this.lastPanPosition = new fabric.Point(event.touches[0].clientX, event.touches[0].clientY);
977 };
978 /**
979 * @param {?} event
980 * @return {?}
981 */
982 CanvasManagerService.prototype.panCanvas = /**
983 * @param {?} event
984 * @return {?}
985 */
986 function (event) {
987 var /** @type {?} */ delta = new fabric.Point(event.touches[0].clientX - this.lastPanPosition.x, event.touches[0].clientY - this.lastPanPosition.y);
988 this.canvas.relativePan(delta);
989 this.preventPanOutsideCanvas();
990 this.canvas.renderAll();
991 this.setLastPanPosition(event);
992 };
993 /**
994 * @return {?}
995 */
996 CanvasManagerService.prototype.preventPanOutsideCanvas = /**
997 * @return {?}
998 */
999 function () {
1000 var /** @type {?} */ canvasViewPort = this.canvas.viewportTransform;
1001 var /** @type {?} */ imageHeight = this.canvas.height * canvasViewPort[0];
1002 var /** @type {?} */ imageWidth = this.canvas.width * canvasViewPort[0];
1003 var /** @type {?} */ bottomEndPoint = this.canvas.height * (canvasViewPort[0] - 1);
1004 if (canvasViewPort[5] >= 0 || -bottomEndPoint > canvasViewPort[5]) {
1005 canvasViewPort[5] = (canvasViewPort[5] >= 0) ? 0 : -bottomEndPoint;
1006 }
1007 var /** @type {?} */ rightEndPoint = this.canvas.width * (canvasViewPort[0] - 1);
1008 if (canvasViewPort[4] >= 0 || -rightEndPoint > canvasViewPort[4]) {
1009 canvasViewPort[4] = (canvasViewPort[4] >= 0) ? 0 : -rightEndPoint;
1010 }
1011 };
1012 /**
1013 * @param {?} event
1014 * @return {?}
1015 */
1016 CanvasManagerService.prototype.zoom = /**
1017 * @param {?} event
1018 * @return {?}
1019 */
1020 function (event) {
1021 var /** @type {?} */ point = new fabric.Point(event.center.x, event.center.y);
1022 var /** @type {?} */ zoom = this.canvas.getZoom();
1023 if (event.additionalEvent === 'pinchout') {
1024 zoom *= 1.05;
1025 }
1026 if (event.additionalEvent === 'pinchin') {
1027 zoom /= 1.05;
1028 }
1029 if (zoom < 1) {
1030 zoom = 1;
1031 this.canvas.zoomToPoint(new fabric.Point(0, 0), zoom);
1032 this.canvas.absolutePan(new fabric.Point(0, 0));
1033 }
1034 else {
1035 if (zoom > 10) {
1036 zoom = 10;
1037 }
1038 this.canvas.zoomToPoint(point, zoom);
1039 }
1040 this.freeDrawingBrushWidthFromZoom(zoom);
1041 this.canvas.renderAll();
1042 };
1043 CanvasManagerService.decorators = [
1044 { type: Injectable },
1045 ];
1046 /** @nocollapse */
1047 CanvasManagerService.ctorParameters = function () { return []; };
1048 return CanvasManagerService;
1049}());
1050
1051/**
1052 * @fileoverview added by tsickle
1053 * @suppress {checkTypes} checked by tsc
1054 */
1055var /** @type {?} */ Black = '#000000';
1056var /** @type {?} */ Transparent = 'transparent';
1057var MobileSketchToolComponent = /** @class */ (function () {
1058 function MobileSketchToolComponent(actionSheetCtrl, canvasManagerService, translate) {
1059 this.actionSheetCtrl = actionSheetCtrl;
1060 this.canvasManagerService = canvasManagerService;
1061 this.translate = translate;
1062 this.canvas = new EventEmitter();
1063 this.strokeColor = Black;
1064 this.fillColor = Transparent;
1065 this.isCropping = false;
1066 this.isLoaded = false;
1067 this.isUndoAvailable = false;
1068 this.isSelectingColor = false;
1069 }
1070 /**
1071 * @return {?}
1072 */
1073 MobileSketchToolComponent.prototype.ngOnInit = /**
1074 * @return {?}
1075 */
1076 function () {
1077 if (this.imageData) {
1078 this.canvasManagerService.emptyCanvas();
1079 if (this.loadedJson == null || this.loadedJson.length < 10) {
1080 this.canvasManagerService.setBackgroundFromURL(this.imageData);
1081 }
1082 else {
1083 this.previousJson = JSON.parse(this.loadedJson);
1084 this.currentJson = this.previousJson;
1085 this.canvasManagerService
1086 .loadfromJson(JSON.parse(this.loadedJson));
1087 }
1088 this.isLoaded = true;
1089 this.previousImageData = this.imageData;
1090 }
1091 this.emitCanvas();
1092 };
1093 /**
1094 * @return {?}
1095 */
1096 MobileSketchToolComponent.prototype.ngOnChanges = /**
1097 * @return {?}
1098 */
1099 function () {
1100 if (this.isLoaded) {
1101 if (this.loadedJson === null || this.loadedJson.length < 10 || this.imageData !== this.previousImageData) {
1102 this.canvasManagerService.emptyCanvas();
1103 this.canvasManagerService.setBackgroundFromURL(this.imageData);
1104 this.previousImageData = this.imageData;
1105 this.currentJson = null;
1106 }
1107 else if (this.loadedJson !== JSON.stringify(this.currentJson)) {
1108 this.previousJson = JSON.parse(this.loadedJson);
1109 this.currentJson = this.previousJson;
1110 this.canvasManagerService
1111 .loadfromJson(JSON.parse(this.loadedJson));
1112 }
1113 }
1114 this.emitCanvas();
1115 };
1116 /**
1117 * @return {?}
1118 */
1119 MobileSketchToolComponent.prototype.ngAfterViewInit = /**
1120 * @return {?}
1121 */
1122 function () {
1123 var _this = this;
1124 this.gesture = new Gesture(this.element.nativeElement);
1125 this.gesture.listen();
1126 this.gesture.on('pinch', function ($event) { return _this.pinch($event); });
1127 };
1128 /**
1129 * @return {?}
1130 */
1131 MobileSketchToolComponent.prototype.ngOnDestroy = /**
1132 * @return {?}
1133 */
1134 function () {
1135 this.gesture.destroy();
1136 };
1137 /**
1138 * @param {?} event
1139 * @return {?}
1140 */
1141 MobileSketchToolComponent.prototype.pinchEvent = /**
1142 * @param {?} event
1143 * @return {?}
1144 */
1145 function (event) {
1146 this.canvasManagerService.emptyCanvas();
1147 };
1148 Object.defineProperty(MobileSketchToolComponent.prototype, "hasPictograms", {
1149 get: /**
1150 * @return {?}
1151 */
1152 function () {
1153 return !(!this.icons);
1154 },
1155 enumerable: true,
1156 configurable: true
1157 });
1158 /**
1159 * @return {?}
1160 */
1161 MobileSketchToolComponent.prototype.addText = /**
1162 * @return {?}
1163 */
1164 function () {
1165 this.canvasManagerService.addText(this.strokeColor, 'text ');
1166 this.emitCanvas();
1167 };
1168 /**
1169 * @param {?} shape
1170 * @return {?}
1171 */
1172 MobileSketchToolComponent.prototype.addShape = /**
1173 * @param {?} shape
1174 * @return {?}
1175 */
1176 function (shape) {
1177 this.canvasManagerService.addGeometricShape(this.strokeColor, this.fillColor, AvailableGeometricShape[shape]);
1178 this.emitCanvas();
1179 };
1180 /**
1181 * @param {?} source
1182 * @return {?}
1183 */
1184 MobileSketchToolComponent.prototype.addImage = /**
1185 * @param {?} source
1186 * @return {?}
1187 */
1188 function (source) {
1189 this.canvasManagerService.addImage(this.iconsPath + source);
1190 this.emitCanvas();
1191 };
1192 /**
1193 * @return {?}
1194 */
1195 MobileSketchToolComponent.prototype.changeStrokeColor = /**
1196 * @return {?}
1197 */
1198 function () {
1199 this.canvasManagerService.changeSelectedObjectsStrokeColor(this.strokeColor);
1200 this.canvasManagerService.setFreeDrawingBrushColor(this.strokeColor);
1201 this.emitCanvas();
1202 };
1203 /**
1204 * @return {?}
1205 */
1206 MobileSketchToolComponent.prototype.bringFoward = /**
1207 * @return {?}
1208 */
1209 function () {
1210 this.canvasManagerService.bringSelectedObjectsToFront();
1211 this.emitCanvas();
1212 };
1213 /**
1214 * @return {?}
1215 */
1216 MobileSketchToolComponent.prototype.sendToBack = /**
1217 * @return {?}
1218 */
1219 function () {
1220 this.canvasManagerService.sendSelectedObjectsToBack();
1221 this.emitCanvas();
1222 };
1223 /**
1224 * @return {?}
1225 */
1226 MobileSketchToolComponent.prototype.crop = /**
1227 * @return {?}
1228 */
1229 function () {
1230 this.isCropping = true;
1231 this.canvasManagerService.disableSelection();
1232 this.canvasManagerService.addSelectionRectangle();
1233 this.isUndoAvailable = true;
1234 this.previousJson = this.canvasManagerService.jsonFromCanvas();
1235 this.emitCanvas();
1236 };
1237 /**
1238 * @return {?}
1239 */
1240 MobileSketchToolComponent.prototype.deleteSelection = /**
1241 * @return {?}
1242 */
1243 function () {
1244 this.canvasManagerService.deleteSelectedObjects();
1245 this.emitCanvas();
1246 };
1247 /**
1248 * @param {?} event
1249 * @return {?}
1250 */
1251 MobileSketchToolComponent.prototype.mouseUp = /**
1252 * @param {?} event
1253 * @return {?}
1254 */
1255 function (event) {
1256 if (this.isCropping) {
1257 this.isCropping = false;
1258 this.canvasManagerService.cropImage();
1259 this.isUndoAvailable = true;
1260 this.emitCanvas();
1261 }
1262 };
1263 /**
1264 * @param {?} event
1265 * @return {?}
1266 */
1267 MobileSketchToolComponent.prototype.mouseMove = /**
1268 * @param {?} event
1269 * @return {?}
1270 */
1271 function (event) {
1272 if (this.isCropping) {
1273 this.canvasManagerService.ajustCropRectangle(event);
1274 }
1275 else if (event.touches.length === 3) {
1276 this.canvasManagerService.panCanvas(event);
1277 }
1278 };
1279 /**
1280 * @param {?} event
1281 * @return {?}
1282 */
1283 MobileSketchToolComponent.prototype.mouseDown = /**
1284 * @param {?} event
1285 * @return {?}
1286 */
1287 function (event) {
1288 if (this.isCropping) {
1289 this.canvasManagerService.startSelectingCropRectangle(event);
1290 }
1291 else if (event.touches.length === 3) {
1292 this.canvasManagerService.setLastPanPosition(event);
1293 }
1294 };
1295 /**
1296 * @param {?} event
1297 * @return {?}
1298 */
1299 MobileSketchToolComponent.prototype.pinch = /**
1300 * @param {?} event
1301 * @return {?}
1302 */
1303 function (event) {
1304 event.preventDefault();
1305 this.canvasManagerService.zoom(event);
1306 };
1307 /**
1308 * @return {?}
1309 */
1310 MobileSketchToolComponent.prototype.group = /**
1311 * @return {?}
1312 */
1313 function () {
1314 this.canvasManagerService.groupSelectedObjects();
1315 this.emitCanvas();
1316 };
1317 /**
1318 * @return {?}
1319 */
1320 MobileSketchToolComponent.prototype.undo = /**
1321 * @return {?}
1322 */
1323 function () {
1324 this.canvasManagerService.loadfromJson(this.previousJson);
1325 this.isUndoAvailable = false;
1326 this.emitCanvas();
1327 };
1328 /**
1329 * @return {?}
1330 */
1331 MobileSketchToolComponent.prototype.onColorClicked = /**
1332 * @return {?}
1333 */
1334 function () {
1335 this.isSelectingColor = true;
1336 };
1337 /**
1338 * @param {?} color
1339 * @return {?}
1340 */
1341 MobileSketchToolComponent.prototype.setColor = /**
1342 * @param {?} color
1343 * @return {?}
1344 */
1345 function (color) {
1346 this.strokeColor = color;
1347 this.changeStrokeColor();
1348 this.isSelectingColor = false;
1349 this.emitCanvas();
1350 };
1351 /**
1352 * @return {?}
1353 */
1354 MobileSketchToolComponent.prototype.draw = /**
1355 * @return {?}
1356 */
1357 function () {
1358 this.isDrawing = !this.isDrawing;
1359 this.canvasManagerService.toggleFreeDrawing();
1360 this.canvasManagerService.setFreeDrawingBrushColor(this.strokeColor);
1361 };
1362 /**
1363 * @return {?}
1364 */
1365 MobileSketchToolComponent.prototype.disableDrawing = /**
1366 * @return {?}
1367 */
1368 function () {
1369 if (this.isDrawing) {
1370 this.isDrawing = false;
1371 this.canvasManagerService.toggleFreeDrawing();
1372 }
1373 };
1374 /**
1375 * @return {?}
1376 */
1377 MobileSketchToolComponent.prototype.translateShapeButtonsText = /**
1378 * @return {?}
1379 */
1380 function () {
1381 var /** @type {?} */ translationArray = [];
1382 translationArray.push(this.translate.instant('rectangle'));
1383 translationArray.push(this.translate.instant('triangle'));
1384 translationArray.push(this.translate.instant('circle'));
1385 translationArray.push(this.translate.instant('line'));
1386 translationArray.push(this.translate.instant('cross'));
1387 translationArray.push(this.translate.instant('text'));
1388 return translationArray;
1389 };
1390 /**
1391 * @return {?}
1392 */
1393 MobileSketchToolComponent.prototype.presentShapeActionSheet = /**
1394 * @return {?}
1395 */
1396 function () {
1397 var _this = this;
1398 this.disableDrawing();
1399 var /** @type {?} */ titleText = this.translate.instant('addGeometricShape');
1400 var /** @type {?} */ buttonsText = this.translateShapeButtonsText();
1401 var /** @type {?} */ i = 0;
1402 var /** @type {?} */ actionSheet = this.actionSheetCtrl.create({
1403 title: titleText,
1404 buttons: [
1405 {
1406 text: '\uf0c8 ' + buttonsText[i++],
1407 handler: function () {
1408 _this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Rectangle);
1409 }
1410 },
1411 {
1412 text: '\uf0d8 ' + buttonsText[i++],
1413 handler: function () {
1414 _this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Triangle);
1415 }
1416 },
1417 {
1418 text: '\uf111 ' + buttonsText[i++],
1419 handler: function () {
1420 _this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Circle);
1421 }
1422 },
1423 {
1424 text: '\uf068 ' + buttonsText[i++],
1425 handler: function () {
1426 _this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Line);
1427 }
1428 },
1429 {
1430 text: '\uf067 ' + buttonsText[i++],
1431 handler: function () {
1432 _this.canvasManagerService.addGeometricShape(_this.strokeColor, _this.fillColor, AvailableGeometricShape.Cross);
1433 }
1434 },
1435 {
1436 text: '\uf031 ' + buttonsText[i++],
1437 handler: function () {
1438 _this.canvasManagerService.addText(_this.strokeColor, '');
1439 }
1440 }
1441 ]
1442 });
1443 actionSheet.present();
1444 };
1445 /**
1446 * @return {?}
1447 */
1448 MobileSketchToolComponent.prototype.translateEditButtonsText = /**
1449 * @return {?}
1450 */
1451 function () {
1452 var /** @type {?} */ translationArray = [];
1453 translationArray.push(this.translate.instant('crop'));
1454 translationArray.push(this.translate.instant('group'));
1455 translationArray.push(this.translate.instant('bringToFront'));
1456 translationArray.push(this.translate.instant('sendToBack'));
1457 translationArray.push(this.translate.instant('delete'));
1458 return translationArray;
1459 };
1460 /**
1461 * @return {?}
1462 */
1463 MobileSketchToolComponent.prototype.presentEditActionSheet = /**
1464 * @return {?}
1465 */
1466 function () {
1467 var _this = this;
1468 this.disableDrawing();
1469 var /** @type {?} */ titleText = this.translate.instant('edition');
1470 var /** @type {?} */ buttonsText = this.translateEditButtonsText();
1471 var /** @type {?} */ i = 0;
1472 var /** @type {?} */ actionSheet = this.actionSheetCtrl.create({
1473 title: titleText,
1474 buttons: [
1475 {
1476 text: '\uf125 ' + buttonsText[i++],
1477 handler: function () {
1478 _this.crop();
1479 }
1480 },
1481 {
1482 text: '\uf247 ' + buttonsText[i++],
1483 handler: function () {
1484 _this.group();
1485 }
1486 },
1487 {
1488 text: '\uf0de ' + buttonsText[i++],
1489 handler: function () {
1490 _this.bringFoward();
1491 }
1492 },
1493 {
1494 text: '\uf0dd ' + buttonsText[i++],
1495 handler: function () {
1496 _this.sendToBack();
1497 }
1498 },
1499 {
1500 text: '\uf1f8 ' + buttonsText[i++],
1501 handler: function () {
1502 _this.deleteSelection();
1503 }
1504 }
1505 ]
1506 });
1507 actionSheet.present();
1508 };
1509 /**
1510 * @return {?}
1511 */
1512 MobileSketchToolComponent.prototype.presentPictogramsActionSheet = /**
1513 * @return {?}
1514 */
1515 function () {
1516 var _this = this;
1517 this.disableDrawing();
1518 var /** @type {?} */ buttons = [];
1519 var /** @type {?} */ actionSheetStyles = [];
1520 var /** @type {?} */ images = this.icons;
1521 var _loop_1 = function (i) {
1522 var /** @type {?} */ style = document.createElement('style');
1523 style.type = 'text/css';
1524 style.innerHTML =
1525 '.customCSSClass' +
1526 i +
1527 '{background: url(' +
1528 "'" +
1529 this_1.iconsPath +
1530 images[i] +
1531 "'" +
1532 ') no-repeat !important;padding-left:50px !important;height:80px; background-position: left center !important;}';
1533 document.getElementsByTagName('head')[0].appendChild(style);
1534 actionSheetStyles.push(style);
1535 buttons.push({
1536 role: 'destructive',
1537 text: images[i],
1538 cssClass: 'customCSSClass' + i,
1539 handler: function () {
1540 _this.addImage(images[i]);
1541 }
1542 });
1543 };
1544 var this_1 = this;
1545 for (var /** @type {?} */ i = 0; i < images.length; i++) {
1546 _loop_1(i);
1547 }
1548 var /** @type {?} */ titleText = this.translate.instant('addPictogram');
1549 var /** @type {?} */ actionSheet = this.actionSheetCtrl.create({
1550 title: titleText,
1551 buttons: buttons
1552 });
1553 actionSheet.onDidDismiss(function () {
1554 for (var /** @type {?} */ i = 0; i < actionSheetStyles.length; i++) {
1555 if (actionSheetStyles[i].parentNode != null) {
1556 actionSheetStyles[i].parentNode.removeChild(actionSheetStyles[i]);
1557 }
1558 }
1559 });
1560 actionSheet.present();
1561 };
1562 /**
1563 * @return {?}
1564 */
1565 MobileSketchToolComponent.prototype.emitCanvas = /**
1566 * @return {?}
1567 */
1568 function () {
1569 this.canvas.emit(this.canvasManagerService.canvas);
1570 };
1571 MobileSketchToolComponent.decorators = [
1572 { type: Component, args: [{
1573 selector: 'lib-mobile-sketch-tool',
1574 template: "<ion-content>\n <div\n class=\"div-canvas-container\"\n (touchstart)=\"mouseDown($event)\"\n (touchmove)=\"mouseMove($event)\"\n (touchend)=\"mouseUp($event)\"\n #pinchElement\n >\n <canvas id=\"canvas\"></canvas>\n\n <div\n class=\"color-picker\"\n *ngIf=\"isSelectingColor\"\n >\n <ion-grid fixed>\n <ion-row>\n <ion-col\n style=\"background:#660000\"\n (tap)=\"setColor('#660000')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#663300\"\n (tap)=\"setColor('#663300')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#666600\"\n (tap)=\"setColor('#666600')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#006600\"\n (tap)=\"setColor('#006600')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#000066\"\n (tap)=\"setColor('#000066')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#660066\"\n (tap)=\"setColor('#660066')\"\n >\u00A0\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col\n style=\"background:#CC0000\"\n (tap)=\"setColor('#CC0000')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#CC6600\"\n (tap)=\"setColor('#CC6600')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#CCCC00\"\n (tap)=\"setColor('#CCCC00')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#00CC00\"\n (tap)=\"setColor('#00CC00')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#0000CC\"\n (tap)=\"setColor('#0000CC')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#CC00CC\"\n (tap)=\"setColor('#CC00CC')\"\n >\u00A0\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col\n style=\"background:#FF0000\"\n (tap)=\"setColor('#FF0000')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#FF8000\"\n (tap)=\"setColor('#FF8000')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#FFFF00\"\n (tap)=\"setColor('#FFFF00')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#00FF00\"\n (tap)=\"setColor('#00FF00')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#0000FF\"\n (tap)=\"setColor('#0000FF')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#FF00FF\"\n (tap)=\"setColor('#FF00FF')\"\n >\u00A0\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col\n style=\"background:#FF6666\"\n (tap)=\"setColor('#FF6666')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#FFB266\"\n (tap)=\"setColor('#FFB266')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#FFFF66\"\n (tap)=\"setColor('#FFFF66')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#66FF66\"\n (tap)=\"setColor('#66FF66')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#6666FF\"\n (tap)=\"setColor('#6666FF')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#FF66FF\"\n (tap)=\"setColor('#FF66FF')\"\n >\u00A0\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col\n style=\"background:#FF9999\"\n (tap)=\"setColor('#FF9999')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#FFCC99\"\n (tap)=\"setColor('#FFCC99')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#FFFF99\"\n (tap)=\"setColor('#FFFF99')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#99FF99\"\n (tap)=\"setColor('#99FF99')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#9999FF\"\n (tap)=\"setColor('#9999FF')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#FF99FF\"\n (tap)=\"setColor('#FF99FF')\"\n >\u00A0\n </ion-col>\n\n </ion-row>\n <ion-row>\n <ion-col\n style=\"background:#FFFFFF\"\n (tap)=\"setColor('#FFFFFF')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#C0C0C0\"\n (tap)=\"setColor('#C0C0C0')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#808080\"\n (tap)=\"setColor('#808080')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#606060\"\n (tap)=\"setColor('#606060')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#303030\"\n (tap)=\"setColor('#606060')\"\n >\u00A0\n </ion-col>\n <ion-col\n style=\"background:#000000\"\n (tap)=\"setColor('#000000')\"\n >\u00A0\n </ion-col>\n </ion-row>\n </ion-grid>\n </div>\n </div>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <div class=\"div-edit-toolbar\">\n <button\n class=\"button-edit-toolbar\"\n ion-button\n large\n [clear]=\"true\"\n (click)=\"presentShapeActionSheet()\"\n >\n <i\n class=\"fas fa-shapes\"\n id=\"icon\"\n ></i>\n </button>\n\n <button\n class=\"button-edit-toolbar\"\n ion-button\n large\n [clear]=\"true\"\n (click)=\"presentPictogramsActionSheet()\"\n *ngIf=\"hasPictograms\"\n >\n <i\n class=\"fas fa-images\"\n id=\"icon\"\n ></i>\n </button>\n\n <button\n class=\"button-edit-toolbar\"\n ion-button\n large\n [clear]=\"true\"\n (click)=\"presentEditActionSheet()\"\n >\n <i\n class=\"fas fa-edit\"\n id=\"icon\"\n ></i>\n </button>\n\n <button\n class=\"button-edit-toolbar\"\n ion-button\n large\n [clear]=\"true\"\n (click)=\"draw()\"\n >\n <i\n class=\"fas fa-pencil-alt\"\n id=\"icon\"\n ></i>\n </button>\n\n <button\n class=\"button-edit-toolbar\"\n ion-button\n large\n [clear]=\"true\"\n (click)=\"onColorClicked()\"\n >\n <i\n class=\"fas fa-palette\"\n id=\"icon\"\n ></i>\n </button>\n\n <button\n class=\"button-edit-toolbar\"\n ion-button\n large\n [clear]=\"true\"\n (click)=\"undo()\"\n *ngIf=\"isUndoAvailable\"\n >\n <i\n class=\"fas fa-undo\"\n id=\"icon\"\n ></i>\n </button>\n\n </div>\n </ion-toolbar>\n</ion-footer>\n",
1575 styles: [".div-canvas-container{text-align:center;height:100%;width:100%;-o-object-fit:contain;object-fit:contain}.scroll-content{padding:0!important;overflow-y:hidden}.div-edit-toolbar{text-align:center}.button-edit-toolbar{padding:4%!important;margin:0!important}.action-sheet-button{font-family:FontAwesome,Arial}.color-picker{position:absolute;width:100%;height:auto;bottom:0;left:0}#icon{color:#b32017}"],
1576 providers: [CanvasManagerService]
1577 },] },
1578 ];
1579 /** @nocollapse */
1580 MobileSketchToolComponent.ctorParameters = function () { return [
1581 { type: ActionSheetController, },
1582 { type: CanvasManagerService, },
1583 { type: TranslateService, },
1584 ]; };
1585 MobileSketchToolComponent.propDecorators = {
1586 "element": [{ type: ViewChild, args: ['pinchElement',] },],
1587 "imageData": [{ type: Input },],
1588 "loadedJson": [{ type: Input },],
1589 "iconsPath": [{ type: Input },],
1590 "icons": [{ type: Input },],
1591 "canvas": [{ type: Output },],
1592 };
1593 return MobileSketchToolComponent;
1594}());
1595
1596/**
1597 * @fileoverview added by tsickle
1598 * @suppress {checkTypes} checked by tsc
1599 */
1600var SketchToolModule = /** @class */ (function () {
1601 function SketchToolModule() {
1602 }
1603 SketchToolModule.decorators = [
1604 { type: NgModule, args: [{
1605 imports: [CommonModule, IonicModule],
1606 declarations: [
1607 MobileSketchToolComponent,
1608 ],
1609 providers: [
1610 CanvasManagerService,
1611 ],
1612 exports: [MobileSketchToolComponent]
1613 },] },
1614 ];
1615 return SketchToolModule;
1616}());
1617
1618/**
1619 * @fileoverview added by tsickle
1620 * @suppress {checkTypes} checked by tsc
1621 */
1622
1623/**
1624 * @fileoverview added by tsickle
1625 * @suppress {checkTypes} checked by tsc
1626 */
1627
1628export { MobileSketchToolComponent, CanvasManagerService, SketchToolModule };
1629
1630//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLXNrZXRjaC10b29sLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9saWItc2tldGNoLXRvb2wvYXBwL2xpYi1za2V0Y2gtdG9vbC9jb25zdGFudHMvc2hhcGUtZGF0YS50cyIsIm5nOi8vbGliLXNrZXRjaC10b29sL2FwcC9saWItc2tldGNoLXRvb2wvc2VydmljZXMvY2FudmFzLW1hbmFnZXIuc2VydmljZS50cyIsIm5nOi8vbGliLXNrZXRjaC10b29sL2FwcC9saWItc2tldGNoLXRvb2wvbW9iaWxlLWNvbXBvbmVudC9tb2JpbGUtc2tldGNoLXRvb2wuY29tcG9uZW50LnRzIiwibmc6Ly9saWItc2tldGNoLXRvb2wvYXBwL2xpYi1za2V0Y2gtdG9vbC9za2V0Y2gtdG9vbC5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFNIQVBFX0RBVEEgPSB7XG4gIHdpZHRoOiAyMDAsXG4gIGhlaWdodDogMjAwLFxuICBsZWZ0OiA1MCxcbiAgdG9wOiA1MCxcbiAgcmFkaXVzOiAxMDAsXG4gIHN0cm9rZTogMTAsXG4gIGZyZWVEcmF3aW5nQnJ1c2hXaWR0aDogMTAsXG4gIGNvcm5lclNpemU6IDIwXG59O1xuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmFicmljIH0gZnJvbSAnZmFicmljJztcblxuaW1wb3J0IHsgQXZhaWxhYmxlR2VvbWV0cmljU2hhcGUgfSBmcm9tICcuLy4uL2NvbnN0YW50cy9hdmFpbGFibGUtZ2VvbWV0cmljLXNoYXBlcyc7XG5pbXBvcnQgeyBTSEFQRV9EQVRBIH0gZnJvbSAnLi8uLi9jb25zdGFudHMvc2hhcGUtZGF0YSc7XG5cbmludGVyZmFjZSBTY2FsZURhdGEge1xuICBzY2FsZUZhY3RvcjogbnVtYmVyO1xuICBsZWZ0OiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUG9zaXRpb24ge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENhbnZhc01hbmFnZXJTZXJ2aWNlIHtcbiAgcHVibGljIGNhbnZhcztcblxuICBwcml2YXRlIGNyb3BSZWN0YW5nbGU6IGZhYnJpYy5SZWN0O1xuICBwcml2YXRlIG1vdXNlUG9zaXRpb246IFBvc2l0aW9uO1xuICBwcml2YXRlIGNyb3BTdGFydGluZ1Bvc2l0aW9uOiBQb3NpdGlvbjtcbiAgcHJpdmF0ZSBsYXN0UGFuUG9zaXRpb246IGZhYnJpYy5Qb2ludDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmVtcHR5Q2FudmFzKCk7XG4gICAgdGhpcy5tb3VzZVBvc2l0aW9uID0ge3g6IDAsIHk6IDB9O1xuICAgIHRoaXMuY3JvcFN0YXJ0aW5nUG9zaXRpb24gPSB7eDogMCwgeTogMH07XG4gICAgdGhpcy5jYW52YXMuZnJlZURyYXdpbmdCcnVzaC53aWR0aCA9IFNIQVBFX0RBVEEuZnJlZURyYXdpbmdCcnVzaFdpZHRoO1xuICB9XG5cbiAgZ2V0IGJhY2tncm91bmRJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYW52YXM7XG4gIH1cblxuICBnZXQgY2FudmFzT2JqZWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpO1xuICB9XG5cbiAgZ2V0IGNhbnZhc0JhY2tncm91bmRJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYW52YXMuYmFja2dyb3VuZEltYWdlO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZU9iamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCk7XG4gIH1cblxuICBnZXQgYWN0aXZlR3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FudmFzLmdldEFjdGl2ZU9iamVjdHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBlbXB0eUNhbnZhcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgIHRoaXMuY2FudmFzLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5jYW52YXMgPSBuZXcgZmFicmljLkNhbnZhcygnY2FudmFzJyk7XG4gICAgdGhpcy5jYW52YXMuY2xlYXIoKTtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmUodGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkTmV3SW1hZ2UoYmFja2dyb3VuZEltYWdlVVJMPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbXB0eUNhbnZhcygpO1xuICAgIGlmIChiYWNrZ3JvdW5kSW1hZ2VVUkwpIHtcbiAgICAgIHRoaXMuc2V0QmFja2dyb3VuZEZyb21VUkwoYmFja2dyb3VuZEltYWdlVVJMKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyQ2FudmFzKCk6IHZvaWQge1xuICAgIHRoaXMubWFya1NlbGVjdGVkT2JqZWN0c0RpcnR5KCk7XG4gICAgdGhpcy5jYW52YXMucmVuZGVyQWxsKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkR2VvbWV0cmljU2hhcGUoc3Ryb2tlQ29sb3I6IHN0cmluZywgZmlsbENvbG9yOiBzdHJpbmcsIHNoYXBlOiBBdmFpbGFibGVHZW9tZXRyaWNTaGFwZSk6IHZvaWQge1xuICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgIGNhc2UgQXZhaWxhYmxlR2VvbWV0cmljU2hhcGUuUmVjdGFuZ2xlOlxuICAgICAgICB0aGlzLmFkZFJlY3RhbmdsZShzdHJva2VDb2xvciwgZmlsbENvbG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJsZUdlb21ldHJpY1NoYXBlLkNpcmNsZTpcbiAgICAgICAgdGhpcy5hZGRDaXJjbGUoc3Ryb2tlQ29sb3IsIGZpbGxDb2xvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdmFpbGFibGVHZW9tZXRyaWNTaGFwZS5UcmlhbmdsZTpcbiAgICAgICAgdGhpcy5hZGRUcmlhbmdsZShzdHJva2VDb2xvciwgZmlsbENvbG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJsZUdlb21ldHJpY1NoYXBlLkxpbmU6XG4gICAgICAgIHRoaXMuYWRkSG9yaXpvbnRhbExpbmUoc3Ryb2tlQ29sb3IsIGZpbGxDb2xvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdmFpbGFibGVHZW9tZXRyaWNTaGFwZS5Dcm9zczpcbiAgICAgICAgdGhpcy5hZGRDcm9zcyhzdHJva2VDb2xvciwgZmlsbENvbG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZWN0YW5nbGUoc3Ryb2tlQ29sb3I6IHN0cmluZywgZmlsbENvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhcy5hZGQoXG4gICAgICBuZXcgZmFicmljLlJlY3Qoe1xuICAgICAgICB3aWR0aDogU0hBUEVfREFUQS53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBTSEFQRV9EQVRBLmhlaWdodCxcbiAgICAgICAgbGVmdDogU0hBUEVfREFUQS5sZWZ0LFxuICAgICAgICB0b3A6IFNIQVBFX0RBVEEudG9wLFxuICAgICAgICBmaWxsOiBmaWxsQ29sb3IsXG4gICAgICAgIHN0cm9rZTogc3Ryb2tlQ29sb3IsXG4gICAgICAgIHN0cm9rZVdpZHRoOiBTSEFQRV9EQVRBLnN0cm9rZSxcbiAgICAgICAgY29ybmVyU2l6ZTogU0hBUEVfREFUQS5jb3JuZXJTaXplXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZENpcmNsZShzdHJva2VDb2xvcjogc3RyaW5nLCBmaWxsQ29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY2FudmFzLmFkZChcbiAgICAgIG5ldyBmYWJyaWMuQ2lyY2xlKHtcbiAgICAgICAgbGVmdDogU0hBUEVfREFUQS5sZWZ0LFxuICAgICAgICB0b3A6IFNIQVBFX0RBVEEudG9wLFxuICAgICAgICByYWRpdXM6IFNIQVBFX0RBVEEucmFkaXVzLFxuICAgICAgICBzdHJva2U6IHN0cm9rZUNvbG9yLFxuICAgICAgICBzdHJva2VXaWR0aDogU0hBUEVfREFUQS5zdHJva2UsXG4gICAgICAgIGZpbGw6IGZpbGxDb2xvcixcbiAgICAgICAgY29ybmVyU2l6ZTogU0hBUEVfREFUQS5jb3JuZXJTaXplXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRyaWFuZ2xlKHN0cm9rZUNvbG9yOiBzdHJpbmcsIGZpbGxDb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jYW52YXMuYWRkKFxuICAgICAgbmV3IGZhYnJpYy5UcmlhbmdsZSh7XG4gICAgICAgIHdpZHRoOiBTSEFQRV9EQVRBLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IFNIQVBFX0RBVEEuaGVpZ2h0LFxuICAgICAgICBsZWZ0OiBTSEFQRV9EQVRBLmxlZnQsXG4gICAgICAgIHRvcDogU0hBUEVfREFUQS50b3AsXG4gICAgICAgIGZpbGw6IGZpbGxDb2xvcixcbiAgICAgICAgc3Ryb2tlOiBzdHJva2VDb2xvcixcbiAgICAgICAgc3Ryb2tlV2lkdGg6IFNIQVBFX0RBVEEuc3Ryb2tlLFxuICAgICAgICBjb3JuZXJTaXplOiBTSEFQRV9EQVRBLmNvcm5lclNpemVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkSG9yaXpvbnRhbExpbmUoc3Ryb2tlQ29sb3I6IHN0cmluZywgZmlsbENvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhcy5hZGQodGhpcy5jcmVhdGVIb3Jpem9udGFsTGluZShzdHJva2VDb2xvcikpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVIb3Jpem9udGFsTGluZShzdHJva2VDb2xvcjogc3RyaW5nKTogZmFicmljLkxpbmUge1xuICAgIGNvbnN0IGxpbmUgPSBuZXcgZmFicmljLkxpbmUoWzEwMCwgMTUwLCAyMDAsIDE1MF0sIHtcbiAgICAgIGxlZnQ6IDUwLFxuICAgICAgdG9wOiAxMDAsXG4gICAgICBzdHJva2U6IHN0cm9rZUNvbG9yLFxuICAgICAgc3Ryb2tlV2lkdGg6IDUsXG4gICAgICBjb3JuZXJTaXplOiBTSEFQRV9EQVRBLmNvcm5lclNpemVcbiAgICB9KTtcblxuICAgIGxpbmUuc2V0Q29udHJvbHNWaXNpYmlsaXR5KHtcbiAgICAgIGJsOiBmYWxzZSxcbiAgICAgIGJyOiBmYWxzZSxcbiAgICAgIHRsOiBmYWxzZSxcbiAgICAgIHRyOiBmYWxzZSxcbiAgICAgIG10OiBmYWxzZSxcbiAgICAgIG1iOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxpbmU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVZlcnRpY2FsTGluZShzdHJva2VDb2xvcjogc3RyaW5nKTogZmFicmljLkxpbmUge1xuICAgIGNvbnN0IGxpbmUgPSBuZXcgZmFicmljLkxpbmUoWzE1MCwgMTAwLCAxNTAsIDIwMF0sIHtcbiAgICAgIGxlZnQ6IDEwMCxcbiAgICAgIHRvcDogNTAsXG4gICAgICBzdHJva2U6IHN0cm9rZUNvbG9yLFxuICAgICAgc3Ryb2tlV2lkdGg6IDUsXG4gICAgICBjb3JuZXJTaXplOiBTSEFQRV9EQVRBLmNvcm5lclNpemVcbiAgICB9KTtcblxuICAgIGxpbmUuc2V0Q29udHJvbHNWaXNpYmlsaXR5KHtcbiAgICAgIGJsOiBmYWxzZSxcbiAgICAgIGJyOiBmYWxzZSxcbiAgICAgIHRsOiBmYWxzZSxcbiAgICAgIHRyOiBmYWxzZSxcbiAgICAgIG1sOiBmYWxzZSxcbiAgICAgIG1yOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxpbmU7XG4gIH1cblxuICBwcml2YXRlIGFkZENyb3NzKHN0cm9rZUNvbG9yOiBzdHJpbmcsIGZpbGxDb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaG9yaXpvbnRhbExpbmUgPSB0aGlzLmNyZWF0ZUhvcml6b250YWxMaW5lKHN0cm9rZUNvbG9yKTtcbiAgICBjb25zdCB2ZXJ0aWNhbExpbmUgPSB0aGlzLmNyZWF0ZVZlcnRpY2FsTGluZShzdHJva2VDb2xvcik7XG4gICAgdGhpcy5jYW52YXMuYWRkKGhvcml6b250YWxMaW5lKTtcbiAgICB0aGlzLmNhbnZhcy5hZGQodmVydGljYWxMaW5lKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVGcmVlRHJhd2luZygpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhcy5pc0RyYXdpbmdNb2RlID0gIXRoaXMuY2FudmFzLmlzRHJhd2luZ01vZGU7XG4gIH1cblxuICBwdWJsaWMgc2V0RnJlZURyYXdpbmdCcnVzaENvbG9yKGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLmNvbG9yID0gY29sb3I7XG4gIH1cblxuICBzZXQgZnJlZURyYXdpbmdCcnVzaFdpZHRoRnJvbVpvb20oem9vbSkge1xuICAgIHRoaXMuY2FudmFzLmZyZWVEcmF3aW5nQnJ1c2gud2lkdGggPSBTSEFQRV9EQVRBLmZyZWVEcmF3aW5nQnJ1c2hXaWR0aCAqICgxIC8gem9vbSk7XG4gIH1cblxuICBwdWJsaWMgYWRkVGV4dChjb2xvcjogc3RyaW5nLCBpbnB1dFRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRleHQgPSBuZXcgZmFicmljLklUZXh0KCd0ZXh0Jywge1xuICAgICAgZm9udEZhbWlseTogJ2FyaWFsIGJsYWNrJyxcbiAgICAgIGZvbnRTdHlsZTogJ2JvbGQnLFxuICAgICAgbGVmdDogU0hBUEVfREFUQS5sZWZ0LFxuICAgICAgdG9wOiBTSEFQRV9EQVRBLnRvcCxcbiAgICAgIGNvcm5lclNpemU6IFNIQVBFX0RBVEEuY29ybmVyU2l6ZVxuICAgIH0pO1xuXG4gICAgdGV4dC5zZXRDb2xvcihjb2xvcik7XG5cbiAgICB0aGlzLmNhbnZhcy5hZGQodGV4dCk7XG4gIH1cblxuICBwdWJsaWMgYWRkSW1hZ2UoaW1hZ2VVUkw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShcbiAgICAgIChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXM7XG5cbiAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24oaW1nKSB7XG4gICAgICAgICAgY29uc3QgZmFicmljSW1hZ2UgPSBuZXcgZmFicmljLkltYWdlKGltYWdlLCB7XG4gICAgICAgICAgICBhbmdsZTogMCxcbiAgICAgICAgICAgIHdpZHRoOiBpbWFnZS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaW1hZ2UuaGVpZ2h0LFxuICAgICAgICAgICAgbGVmdDogU0hBUEVfREFUQS5sZWZ0LFxuICAgICAgICAgICAgdG9wOiBTSEFQRV9EQVRBLnRvcCxcbiAgICAgICAgICAgIHNjYWxlWDogMSxcbiAgICAgICAgICAgIHNjYWxlWTogMSxcbiAgICAgICAgICAgIGNvcm5lclNpemU6IFNIQVBFX0RBVEEuY29ybmVyU2l6ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNhbnZhcy5hZGQoZmFicmljSW1hZ2UpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2Uuc3JjID0gaW1hZ2VVUkw7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCYWNrZ3JvdW5kRnJvbVVSTChiYWNrZ3JvdW5kSW1hZ2VVUkw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgIGNvbnN0IHJlc2l6ZSA9IHRoaXMucmVzaXplQ2FudmFzQW5kQ29tcHV0ZVNjYWxlRmFjdG9yO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKFxuICAgICAgKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoYmFja2dyb3VuZEltYWdlVVJMID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY29uc3QgZl9pbWcgPSBuZXcgZmFicmljLkltYWdlKGltYWdlLCB7fSk7XG5cbiAgICAgICAgICBjb25zdCBzY2FsZURhdGEgPSByZXNpemUoZl9pbWcsIGNhbnZhcyk7XG5cbiAgICAgICAgICBjYW52YXMuc2V0QmFja2dyb3VuZEltYWdlKGZfaW1nLCBjYW52YXMucmVuZGVyQWxsLmJpbmQoY2FudmFzKSwge1xuICAgICAgICAgICAgc2NhbGVYOiBzY2FsZURhdGEuc2NhbGVGYWN0b3IsXG4gICAgICAgICAgICBzY2FsZVk6IHNjYWxlRGF0YS5zY2FsZUZhY3RvclxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FudmFzLnJlbmRlckFsbCgpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2Uuc3JjID0gYmFja2dyb3VuZEltYWdlVVJMO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc2l6ZUNhbnZhc0FuZENvbXB1dGVTY2FsZUZhY3RvcihmX2ltZzogZmFicmljLkltYWdlLCBjYW52YXM6IGZhYnJpYy5DYW52YXMpOiBTY2FsZURhdGEge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAnZGl2LWNhbnZhcy1jb250YWluZXInXG4gICAgKVswXTtcblxuICAgIGNhbnZhcy5zZXRXaWR0aChjb250YWluZXIuY2xpZW50V2lkdGgpO1xuICAgIGNhbnZhcy5zZXRIZWlnaHQoY29udGFpbmVyLmNsaWVudEhlaWdodCk7XG5cbiAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhcy5nZXRXaWR0aCgpO1xuICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IGNhbnZhcy5nZXRIZWlnaHQoKTtcblxuICAgIGNvbnN0IGNhbnZhc0FzcGVjdCA9IGNhbnZhc1dpZHRoIC8gY2FudmFzSGVpZ2h0O1xuICAgIGNvbnN0IGltZ0FzcGVjdCA9IGZfaW1nLndpZHRoIC8gZl9pbWcuaGVpZ2h0O1xuICAgIGxldCBsZWZ0LCB0b3AsIHNjYWxlRmFjdG9yO1xuXG4gICAgaWYgKGNhbnZhc0FzcGVjdCA8PSBpbWdBc3BlY3QpIHtcbiAgICAgIHNjYWxlRmFjdG9yID0gY2FudmFzV2lkdGggLyBmX2ltZy53aWR0aDtcbiAgICAgIGxlZnQgPSAwO1xuICAgICAgdG9wID0gLShmX2ltZy5oZWlnaHQgKiBzY2FsZUZhY3RvciAtIGNhbnZhc0hlaWdodCkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2FsZUZhY3RvciA9IGNhbnZhc0hlaWdodCAvIGZfaW1nLmhlaWdodDtcbiAgICAgIHRvcCA9IDA7XG4gICAgICBsZWZ0ID0gLShmX2ltZy53aWR0aCAqIHNjYWxlRmFjdG9yIC0gY2FudmFzV2lkdGgpIC8gMjtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2NhbGVGYWN0b3I6IHNjYWxlRmFjdG9yLCBsZWZ0OiBsZWZ0LCB0b3A6IHRvcCB9O1xuICB9XG5cbiAgcHVibGljIG9uT3JpZW50YXRpb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5tb3VzZVBvc2l0aW9uID0ge3g6IHRoaXMuY2FudmFzLmdldFdpZHRoLCB5OiB0aGlzLmNhbnZhcy5nZXRIZWlnaHQgfTtcbiAgICB0aGlzLmNyb3BJbWFnZSgpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVNlbGVjdGVkT2JqZWN0c0ZpbGxDb2xvcihjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlT2JqZWN0cyA9IHRoaXMuY2FudmFzLmdldEFjdGl2ZU9iamVjdHMoKTtcblxuICAgIGlmIChhY3RpdmVPYmplY3RzKSB7XG4gICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBhY3RpdmVPYmplY3RzKSB7XG4gICAgICAgIG9iamVjdC5zZXRDb2xvcihjb2xvcik7XG4gICAgICAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VTZWxlY3RlZE9iamVjdHNTdHJva2VDb2xvcihjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlT2JqZWN0cyA9IHRoaXMuY2FudmFzLmdldEFjdGl2ZU9iamVjdHMoKTtcblxuICAgIGlmIChhY3RpdmVPYmplY3RzKSB7XG4gICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBhY3RpdmVPYmplY3RzKSB7XG4gICAgICAgIGlmIChvYmplY3QudHlwZSA9PT0gJ2ktdGV4dCcpIHtcbiAgICAgICAgICBvYmplY3Quc2V0Q29sb3IoY29sb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9iamVjdC5zdHJva2UgPSBjb2xvcjtcbiAgICAgICAgICBvYmplY3Quc2V0KCdkaXJ0eScsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlU2VsZWN0ZWRPYmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZU9iamVjdHMgPSB0aGlzLmNhbnZhcy5nZXRBY3RpdmVPYmplY3RzKCk7XG5cbiAgICBpZiAoYWN0aXZlT2JqZWN0cykge1xuICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgYWN0aXZlT2JqZWN0cykge1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FudmFzLmRpc2NhcmRBY3RpdmVPYmplY3QoKTtcbiAgICAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBicmluZ1NlbGVjdGVkT2JqZWN0c1RvRnJvbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlT2JqZWN0cyA9IHRoaXMuY2FudmFzLmdldEFjdGl2ZU9iamVjdHMoKTtcblxuICAgIGlmIChhY3RpdmVPYmplY3RzKSB7XG4gICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiBhY3RpdmVPYmplY3RzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzLmJyaW5nVG9Gcm9udChvYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZW5kU2VsZWN0ZWRPYmplY3RzVG9CYWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZU9iamVjdHMgPSB0aGlzLmNhbnZhcy5nZXRBY3RpdmVPYmplY3RzKCk7XG5cbiAgICBpZiAoYWN0aXZlT2JqZWN0cykge1xuICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgYWN0aXZlT2JqZWN0cykge1xuICAgICAgICB0aGlzLmNhbnZhcy5zZW5kVG9CYWNrKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGpzb25Gcm9tQ2FudmFzKCk6IEpTT04ge1xuICAgIHJldHVybiB0aGlzLmNhbnZhcy50b0pTT04oKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkZnJvbUpzb24oanNvbjogSlNPTik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAnZGl2LWNhbnZhcy1jb250YWluZXInXG4gICAgKVswXTtcblxuICAgIHRoaXMuY2FudmFzLnNldFdpZHRoKGNvbnRhaW5lci5jbGllbnRXaWR0aCk7XG4gICAgdGhpcy5jYW52YXMuc2V0SGVpZ2h0KGNvbnRhaW5lci5jbGllbnRIZWlnaHQpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKFxuICAgICAgKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmFkanVzdENhbnZhcyhqc29uKTtcbiAgICAgICAgdGhpcy5jYW52YXMubG9hZEZyb21KU09OKGpzb24sIHRoaXMuY2FudmFzLnJlbmRlckFsbC5iaW5kKHRoaXMuY2FudmFzKSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFkanVzdENhbnZhcyhqc29uOiBKU09OKTogdm9pZCB7XG4gICAgY29uc3QgYmFja2dyb3VuZEltYWdlID0ganNvblsnYmFja2dyb3VuZEltYWdlJ107XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgJ2Rpdi1jYW52YXMtY29udGFpbmVyJ1xuICAgIClbMF07XG5cbiAgICBjb25zdCB3aWR0aCA9IGJhY2tncm91bmRJbWFnZVsnd2lkdGgnXTtcbiAgICBjb25zdCBoZWlnaHQgPSBiYWNrZ3JvdW5kSW1hZ2VbJ2hlaWdodCddO1xuXG4gICAgY29uc3QgY2FudmFzV2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcblxuICAgIGNvbnN0IGNhbnZhc0FzcGVjdCA9IGNhbnZhc1dpZHRoIC8gY2FudmFzSGVpZ2h0O1xuICAgIGNvbnN0IGltZ0FzcGVjdCA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgIGxldCBzY2FsZUZhY3RvcjtcblxuICAgIGlmIChjYW52YXNBc3BlY3QgPD0gaW1nQXNwZWN0KSB7XG4gICAgICBzY2FsZUZhY3RvciA9IGNhbnZhc1dpZHRoIC8gd2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlRmFjdG9yID0gY2FudmFzSGVpZ2h0IC8gaGVpZ2h0O1xuICAgIH1cblxuICAgIGNvbnN0IG9iamVjdFNjYWxlID0gc2NhbGVGYWN0b3IgLyBiYWNrZ3JvdW5kSW1hZ2VbJ3NjYWxlWCddO1xuXG4gICAgYmFja2dyb3VuZEltYWdlWydzY2FsZVgnXSA9IHNjYWxlRmFjdG9yO1xuICAgIGJhY2tncm91bmRJbWFnZVsnc2NhbGVZJ10gPSBzY2FsZUZhY3RvcjtcblxuICAgIHRoaXMuY2FudmFzLnNldFdpZHRoKHdpZHRoICogc2NhbGVGYWN0b3IpO1xuICAgIHRoaXMuY2FudmFzLnNldEhlaWdodChoZWlnaHQgKiBzY2FsZUZhY3Rvcik7XG5cbiAgICBjb25zdCBvYmplY3RzID0ganNvblsnb2JqZWN0cyddO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzW2ldWydsZWZ0J10gKj0gb2JqZWN0U2NhbGU7XG4gICAgICBvYmplY3RzW2ldWyd0b3AnXSAqPSBvYmplY3RTY2FsZTtcbiAgICAgIG9iamVjdHNbaV1bJ3NjYWxlWCddICo9IG9iamVjdFNjYWxlO1xuICAgICAgb2JqZWN0c1tpXVsnc2NhbGVZJ10gKj0gb2JqZWN0U2NhbGU7XG4gICAgfVxuXG4gICAgdGhpcy5jYW52YXMuc2VsZWN0YWJsZSA9IHRydWU7XG4gICAgdGhpcy5jYW52YXMuc2VsZWN0aW9uID0gdHJ1ZTtcblxuICAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xuICB9XG5cbiAgcHVibGljIGV4cG9ydEltYWdlQXNEYXRhVVJMKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0SXRlbShpdGVtTnVtYmVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhcy5zZXRBY3RpdmVPYmplY3QodGhpcy5jYW52YXMuaXRlbShpdGVtTnVtYmVyKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SW5kZXhPZihhY3RpdmVPYmplY3QpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkuaW5kZXhPZihhY3RpdmVPYmplY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RMYXN0T2JqZWN0KCk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1OdW1iZXIgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBvYmplY3QgPSB0aGlzLmNhbnZhcy5pdGVtKGl0ZW1OdW1iZXIpO1xuICAgIHRoaXMuY2FudmFzLnNldEFjdGl2ZU9iamVjdChvYmplY3QpO1xuICAgIG9iamVjdC5lbnRlckVkaXRpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya1NlbGVjdGVkT2JqZWN0c0RpcnR5KCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZU9iamVjdHMgPSB0aGlzLmNhbnZhcy5nZXRBY3RpdmVPYmplY3RzKCk7XG5cbiAgICBpZiAoYWN0aXZlT2JqZWN0cykge1xuICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgYWN0aXZlT2JqZWN0cykge1xuICAgICAgICBvYmplY3Quc2V0KCdkaXJ0eScsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRTZWxlY3Rpb25SZWN0YW5nbGUoKTogdm9pZCB7XG4gICAgdGhpcy5jcm9wUmVjdGFuZ2xlID0gbmV3IGZhYnJpYy5SZWN0KHtcbiAgICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICBvcmlnaW5YOiAnbGVmdCcsXG4gICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgIHN0cm9rZTogJyNjY2MnLFxuICAgICAgc3Ryb2tlRGFzaEFycmF5OiBbMiwgMl0sXG4gICAgICBvcGFjaXR5OiAxLFxuICAgICAgd2lkdGg6IDEsXG4gICAgICBoZWlnaHQ6IDFcbiAgICB9KTtcblxuICAgIHRoaXMuY3JvcFJlY3RhbmdsZS52aXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5jYW52YXMuYWRkKHRoaXMuY3JvcFJlY3RhbmdsZSk7XG4gIH1cblxuICBwdWJsaWMgYWp1c3RDcm9wUmVjdGFuZ2xlRnJvbU1vdXNlKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgeCA9IE1hdGgubWluKGV2ZW50LmxheWVyWCwgdGhpcy5tb3VzZVBvc2l0aW9uLngpLFxuICAgICAgeSA9IE1hdGgubWluKGV2ZW50LmxheWVyWSwgdGhpcy5tb3VzZVBvc2l0aW9uLnkpLFxuICAgICAgdyA9IE1hdGguYWJzKGV2ZW50LmxheWVyWCAtIHRoaXMubW91c2VQb3NpdGlvbi54KSxcbiAgICAgIGggPSBNYXRoLmFicyhldmVudC5sYXllclkgLSB0aGlzLm1vdXNlUG9zaXRpb24ueSk7XG5cbiAgICBpZiAoIXcgfHwgIWgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmNyb3BSZWN0YW5nbGVcbiAgICAgIC5zZXQoJ3RvcCcsIHkpXG4gICAgICAuc2V0KCdsZWZ0JywgeClcbiAgICAgIC5zZXQoJ3dpZHRoJywgdylcbiAgICAgIC5zZXQoJ2hlaWdodCcsIGgpO1xuXG4gICAgdGhpcy5jYW52YXMucmVuZGVyQWxsKCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydFNlbGVjdGluZ0Nyb3BSZWN0YW5nbGVGcm9tTW91c2UoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNyb3BTdGFydGluZ1Bvc2l0aW9uID0geyB4OiB0aGlzLmNhbnZhcy5sZWZ0LCB5OiB0aGlzLmNhbnZhcy50b3AgfTtcblxuICAgIHRoaXMuY3JvcFJlY3RhbmdsZS5sZWZ0ID0gZXZlbnQubGF5ZXJYO1xuICAgIHRoaXMuY3JvcFJlY3RhbmdsZS50b3AgPSBldmVudC5sYXllclk7XG4gICAgdGhpcy5jcm9wUmVjdGFuZ2xlLnNldENvb3JkcygpO1xuXG4gICAgdGhpcy5tb3VzZVBvc2l0aW9uID0ge3g6IGV2ZW50LmxheWVyWCwgeTogZXZlbnQubGF5ZXJZIH07XG5cbiAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcbiAgICB0aGlzLmNyb3BSZWN0YW5nbGUudmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5jYW52YXMuYnJpbmdUb0Zyb250KHRoaXMuY3JvcFJlY3RhbmdsZSk7XG4gIH1cblxuICBwdWJsaWMgY3JvcEltYWdlKCk6IHZvaWQge1xuICAgIGNvbnN0IGxlZnQgPSB0aGlzLmNyb3BSZWN0YW5nbGUubGVmdDtcbiAgICBjb25zdCB0b3AgPSB0aGlzLmNyb3BSZWN0YW5nbGUudG9wO1xuXG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmNyb3BSZWN0YW5nbGUud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5jcm9wUmVjdGFuZ2xlLmhlaWdodDtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAnZGl2LWNhbnZhcy1jb250YWluZXInXG4gICAgKVswXTtcblxuICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG5cbiAgICBjb25zdCBjYW52YXNBc3BlY3QgPSBjYW52YXNXaWR0aCAvIGNhbnZhc0hlaWdodDtcbiAgICBjb25zdCBpbWdBc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcbiAgICBsZXQgc2NhbGVGYWN0b3I7XG5cbiAgICBpZiAoY2FudmFzQXNwZWN0IDw9IGltZ0FzcGVjdCkge1xuICAgICAgc2NhbGVGYWN0b3IgPSBjYW52YXNXaWR0aCAvIHdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2FsZUZhY3RvciA9IGNhbnZhc0hlaWdodCAvIGhlaWdodDtcbiAgICB9XG5cbiAgICB0aGlzLmNhbnZhcy5zZXRXaWR0aCh3aWR0aCAqIHNjYWxlRmFjdG9yKTtcbiAgICB0aGlzLmNhbnZhcy5zZXRIZWlnaHQoaGVpZ2h0ICogc2NhbGVGYWN0b3IpO1xuXG4gICAgdGhpcy5jYW52YXMuYmFja2dyb3VuZEltYWdlLnNjYWxlWCAqPSBzY2FsZUZhY3RvcjtcbiAgICB0aGlzLmNhbnZhcy5iYWNrZ3JvdW5kSW1hZ2Uuc2NhbGVZICo9IHNjYWxlRmFjdG9yO1xuXG4gICAgdGhpcy5jYW52YXMuYmFja2dyb3VuZEltYWdlLmxlZnQgLT0gbGVmdDtcbiAgICB0aGlzLmNhbnZhcy5iYWNrZ3JvdW5kSW1hZ2UubGVmdCAqPSBzY2FsZUZhY3RvcjtcbiAgICB0aGlzLmNhbnZhcy5iYWNrZ3JvdW5kSW1hZ2UudG9wIC09IHRvcCAtIHNjYWxlRmFjdG9yO1xuICAgIHRoaXMuY2FudmFzLmJhY2tncm91bmRJbWFnZS50b3AgKj0gc2NhbGVGYWN0b3I7XG5cbiAgICB0aGlzLm1vdmVBbGxPYmplY3RzSW5DYW52YXMoLTEgKiBsZWZ0LCAtMSAqIHRvcCwgc2NhbGVGYWN0b3IpO1xuXG4gICAgdGhpcy5jYW52YXMuc2VsZWN0YWJsZSA9IHRydWU7XG4gICAgdGhpcy5jYW52YXMuc2VsZWN0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmNyb3BSZWN0YW5nbGUudmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5jYW52YXMucmVtb3ZlKHRoaXMuY3JvcFJlY3RhbmdsZSk7XG5cbiAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBhanVzdENyb3BSZWN0YW5nbGUoZXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXNbMF07XG5cbiAgICBjb25zdCByZWN0ID0gZXZlbnQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgeCA9IE1hdGgubWluKHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQsIHRoaXMubW91c2VQb3NpdGlvbi54KSxcbiAgICAgIHkgPSBNYXRoLm1pbih0b3VjaC5jbGllbnRZIC0gcmVjdC50b3AsIHRoaXMubW91c2VQb3NpdGlvbi55KSxcbiAgICAgIHcgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gdGhpcy5tb3VzZVBvc2l0aW9uLngpLFxuICAgICAgaCA9IE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcCAtIHRoaXMubW91c2VQb3NpdGlvbi55KTtcblxuICAgIGlmICghdyB8fCAhaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuY3JvcFJlY3RhbmdsZVxuICAgICAgLnNldCgnbGVmdCcsIHgpXG4gICAgICAuc2V0KCd0b3AnLCB5KVxuICAgICAgLnNldCgnd2lkdGgnLCB3KVxuICAgICAgLnNldCgnaGVpZ2h0JywgaCk7XG5cbiAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0U2VsZWN0aW5nQ3JvcFJlY3RhbmdsZShldmVudCk6IHZvaWQge1xuICAgIHRoaXMuY3JvcFN0YXJ0aW5nUG9zaXRpb24gPSB7IHg6IHRoaXMuY2FudmFzLmxlZnQsIHk6IHRoaXMuY2FudmFzLnRvcCB9O1xuXG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50b3VjaGVzWzBdO1xuICAgIGNvbnN0IHJlY3QgPSBldmVudC50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB0aGlzLmNyb3BSZWN0YW5nbGUubGVmdCA9IHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgdGhpcy5jcm9wUmVjdGFuZ2xlLnRvcCA9IHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcDtcbiAgICB0aGlzLmNyb3BSZWN0YW5nbGUuc2V0Q29vcmRzKCk7XG5cbiAgICB0aGlzLm1vdXNlUG9zaXRpb24gPSB7IHg6IHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQsIHk6IHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcCB9O1xuXG4gICAgdGhpcy5jYW52YXMucmVuZGVyQWxsKCk7XG4gICAgdGhpcy5jcm9wUmVjdGFuZ2xlLnZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMuY2FudmFzLmJyaW5nVG9Gcm9udCh0aGlzLmNyb3BSZWN0YW5nbGUpO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGVTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5jYW52YXMuc2VsZWN0aW9uID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG1vdmVBbGxPYmplY3RzSW5DYW52YXMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHNjYWxlRmFjdG9yOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBvYmplY3RzID0gdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpO1xuICAgIGZvciAoY29uc3Qgb2JqIG9mIG9iamVjdHMpIHtcbiAgICAgIG9iai5sZWZ0ICs9IHg7XG4gICAgICBvYmoubGVmdCAqPSBzY2FsZUZhY3RvcjtcbiAgICAgIG9iai5zY2FsZVggKj0gc2NhbGVGYWN0b3I7XG4gICAgICBvYmoudG9wICs9IHk7XG4gICAgICBvYmouc2NhbGVZICo9IHNjYWxlRmFjdG9yO1xuICAgICAgb2JqLnRvcCAqPSBzY2FsZUZhY3RvcjtcbiAgICAgIG9iai5zZXRDb29yZHMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ3JvdXBTZWxlY3RlZE9iamVjdHMoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlT2JqZWN0cyA9IHRoaXMuY2FudmFzLmdldEFjdGl2ZU9iamVjdHMoKTtcblxuICAgIGlmIChhY3RpdmVPYmplY3RzKSB7XG4gICAgICBjb25zdCBvYmplY3RzID0gW107XG5cbiAgICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIGFjdGl2ZU9iamVjdHMpIHtcbiAgICAgICAgb2JqZWN0cy5wdXNoKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlbGV0ZVNlbGVjdGVkT2JqZWN0cygpO1xuXG4gICAgICBjb25zdCBncm91cCA9IG5ldyBmYWJyaWMuR3JvdXAob2JqZWN0cyk7XG4gICAgICB0aGlzLmNhbnZhcy5hZGQoZ3JvdXApO1xuICAgICAgZ3JvdXAuc2V0Q29vcmRzKCk7XG5cbiAgICAgIHRoaXMuY2FudmFzLnNldEFjdGl2ZU9iamVjdChncm91cCk7XG5cbiAgICAgIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRMYXN0UGFuUG9zaXRpb24oZXZlbnQpIHtcbiAgICB0aGlzLmxhc3RQYW5Qb3NpdGlvbiA9IG5ldyBmYWJyaWMuUG9pbnQoZXZlbnQudG91Y2hlc1swXS5jbGllbnRYLCBldmVudC50b3VjaGVzWzBdLmNsaWVudFkpO1xuICB9XG5cbiAgcHVibGljIHBhbkNhbnZhcyhldmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGRlbHRhID0gbmV3IGZhYnJpYy5Qb2ludChcbiAgICAgIGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMubGFzdFBhblBvc2l0aW9uLngsXG4gICAgICBldmVudC50b3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLmxhc3RQYW5Qb3NpdGlvbi55XG4gICAgKTtcblxuICAgIHRoaXMuY2FudmFzLnJlbGF0aXZlUGFuKGRlbHRhKTtcbiAgICB0aGlzLnByZXZlbnRQYW5PdXRzaWRlQ2FudmFzKCk7XG5cbiAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcbiAgICB0aGlzLnNldExhc3RQYW5Qb3NpdGlvbihldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHByZXZlbnRQYW5PdXRzaWRlQ2FudmFzKCkge1xuICAgIGNvbnN0IGNhbnZhc1ZpZXdQb3J0ID0gdGhpcy5jYW52YXMudmlld3BvcnRUcmFuc2Zvcm07XG5cbiAgICBjb25zdCBpbWFnZUhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodCAqIGNhbnZhc1ZpZXdQb3J0WzBdO1xuICAgIGNvbnN0IGltYWdlV2lkdGggPSB0aGlzLmNhbnZhcy53aWR0aCAqIGNhbnZhc1ZpZXdQb3J0WzBdO1xuXG4gICAgY29uc3QgYm90dG9tRW5kUG9pbnQgPSB0aGlzLmNhbnZhcy5oZWlnaHQgKiAoY2FudmFzVmlld1BvcnRbMF0gLSAxKTtcbiAgICBpZiAoY2FudmFzVmlld1BvcnRbNV0gPj0gMCB8fCAtYm90dG9tRW5kUG9pbnQgPiBjYW52YXNWaWV3UG9ydFs1XSkge1xuICAgICAgICBjYW52YXNWaWV3UG9ydFs1XSA9IChjYW52YXNWaWV3UG9ydFs1XSA+PSAwKSA/IDAgOiAtYm90dG9tRW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmlnaHRFbmRQb2ludCA9IHRoaXMuY2FudmFzLndpZHRoICogKGNhbnZhc1ZpZXdQb3J0WzBdIC0gMSk7XG4gICAgaWYgKGNhbnZhc1ZpZXdQb3J0WzRdID49IDAgfHwgLXJpZ2h0RW5kUG9pbnQgPiBjYW52YXNWaWV3UG9ydFs0XSkge1xuICAgICAgICBjYW52YXNWaWV3UG9ydFs0XSA9IChjYW52YXNWaWV3UG9ydFs0XSA+PSAwKSA/IDAgOiAtcmlnaHRFbmRQb2ludDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgem9vbShldmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHBvaW50ID0gbmV3IGZhYnJpYy5Qb2ludChldmVudC5jZW50ZXIueCwgZXZlbnQuY2VudGVyLnkpO1xuXG4gICAgbGV0IHpvb20gPSB0aGlzLmNhbnZhcy5nZXRab29tKCk7XG4gICAgaWYgKGV2ZW50LmFkZGl0aW9uYWxFdmVudCA9PT0gJ3BpbmNob3V0Jykge1xuICAgICAgem9vbSAqPSAxLjA1O1xuICAgIH1cbiAgICBpZiAoZXZlbnQuYWRkaXRpb25hbEV2ZW50ID09PSAncGluY2hpbicpIHtcbiAgICAgIHpvb20gLz0gMS4wNTtcbiAgICB9XG5cbiAgICBpZiAoem9vbSA8IDEpIHtcbiAgICAgIHpvb20gPSAxO1xuICAgICAgdGhpcy5jYW52YXMuem9vbVRvUG9pbnQobmV3IGZhYnJpYy5Qb2ludCgwLCAwKSwgem9vbSk7XG4gICAgICB0aGlzLmNhbnZhcy5hYnNvbHV0ZVBhbihuZXcgZmFicmljLlBvaW50KDAsIDApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHpvb20gPiAxMCkge1xuICAgICAgICB6b29tID0gMTA7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbnZhcy56b29tVG9Qb2ludChwb2ludCwgem9vbSk7XG4gICAgfVxuXG4gICAgdGhpcy5mcmVlRHJhd2luZ0JydXNoV2lkdGhGcm9tWm9vbSh6b29tKTtcbiAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgRXZlbnRFbWl0dGVyLCB0cmFuc2l0aW9uLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9uU2hlZXRDb250cm9sbGVyIH0gZnJvbSAnaW9uaWMtYW5ndWxhcic7XG5pbXBvcnQgeyBHZXN0dXJlIH0gZnJvbSAnaW9uaWMtYW5ndWxhci9nZXN0dXJlcy9nZXN0dXJlJztcbmltcG9ydCB7IEF2YWlsYWJsZUdlb21ldHJpY1NoYXBlIH0gZnJvbSAnLi8uLi9jb25zdGFudHMvYXZhaWxhYmxlLWdlb21ldHJpYy1zaGFwZXMnO1xuaW1wb3J0IHsgQ2FudmFzTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLy4uL3NlcnZpY2VzL2NhbnZhcy1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgZmFicmljIH0gZnJvbSAnZmFicmljJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuXG5jb25zdCBCbGFjayA9ICcjMDAwMDAwJztcbmNvbnN0IFRyYW5zcGFyZW50ID0gJ3RyYW5zcGFyZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW1vYmlsZS1za2V0Y2gtdG9vbCcsXG4gIHRlbXBsYXRlOiBgPGlvbi1jb250ZW50PlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkaXYtY2FudmFzLWNvbnRhaW5lclwiXG4gICAgICAgICh0b3VjaHN0YXJ0KT1cIm1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAgICAgKHRvdWNobW92ZSk9XCJtb3VzZU1vdmUoJGV2ZW50KVwiXG4gICAgICAgICh0b3VjaGVuZCk9XCJtb3VzZVVwKCRldmVudClcIlxuICAgICAgICAjcGluY2hFbGVtZW50XG4gICAgPlxuICAgICAgICA8Y2FudmFzIGlkPVwiY2FudmFzXCI+PC9jYW52YXM+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc1NlbGVjdGluZ0NvbG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlvbi1ncmlkIGZpeGVkPlxuICAgICAgICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM2NjAwMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzY2MDAwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM2NjMzMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzY2MzMwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM2NjY2MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzY2NjYwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwMDY2MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzAwNjYwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwMDAwNjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzAwMDA2NicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM2NjAwNjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzY2MDA2NicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNDQzAwMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0NDMDAwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNDQzY2MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0NDNjYwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNDQ0NDMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0NDQ0MwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwMENDMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzAwQ0MwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwMDAwQ0NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzAwMDBDQycpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNDQzAwQ0NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0NDMDBDQycpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRjAwMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGMDAwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRjgwMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGODAwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRkZGMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGRkYwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwMEZGMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzAwRkYwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwMDAwRkZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzAwMDBGRicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRjAwRkZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGMDBGRicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRjY2NjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGNjY2NicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRkIyNjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGQjI2NicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRkZGNjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGRkY2NicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM2NkZGNjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzY2RkY2NicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM2NjY2RkZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzY2NjZGRicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRjY2RkZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGNjZGRicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRjk5OTlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGOTk5OScpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRkNDOTlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGQ0M5OScpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRkZGOTlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGRkY5OScpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM5OUZGOTlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzk5RkY5OScpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM5OTk5RkZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzk5OTlGRicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRjk5RkZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGOTlGRicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgICAgPC9pb24tcm93PlxuICAgICAgICAgICAgICAgIDxpb24tcm93PlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNGRkZGRkZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0ZGRkZGRicpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiNDMEMwQzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignI0MwQzBDMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM4MDgwODBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzgwODA4MCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiM2MDYwNjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzYwNjA2MCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMzMDMwMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzYwNjA2MCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiMwMDAwMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcCk9XCJzZXRDb2xvcignIzAwMDAwMCcpXCJcbiAgICAgICAgICAgICAgICAgICAgPsOCwqBcbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgIDwvaW9uLWdyaWQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9pb24tY29udGVudD5cblxuPGlvbi1mb290ZXI+XG4gICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWVkaXQtdG9vbGJhclwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLWVkaXQtdG9vbGJhclwiXG4gICAgICAgICAgICAgICAgaW9uLWJ1dHRvblxuICAgICAgICAgICAgICAgIGxhcmdlXG4gICAgICAgICAgICAgICAgW2NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmVzZW50U2hhcGVBY3Rpb25TaGVldCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1zaGFwZXNcIlxuICAgICAgICAgICAgICAgICAgICBpZD1cImljb25cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLWVkaXQtdG9vbGJhclwiXG4gICAgICAgICAgICAgICAgaW9uLWJ1dHRvblxuICAgICAgICAgICAgICAgIGxhcmdlXG4gICAgICAgICAgICAgICAgW2NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJwcmVzZW50UGljdG9ncmFtc0FjdGlvblNoZWV0KClcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzUGljdG9ncmFtc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtaW1hZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJpY29uXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1lZGl0LXRvb2xiYXJcIlxuICAgICAgICAgICAgICAgIGlvbi1idXR0b25cbiAgICAgICAgICAgICAgICBsYXJnZVxuICAgICAgICAgICAgICAgIFtjbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJlc2VudEVkaXRBY3Rpb25TaGVldCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1lZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJpY29uXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1lZGl0LXRvb2xiYXJcIlxuICAgICAgICAgICAgICAgIGlvbi1idXR0b25cbiAgICAgICAgICAgICAgICBsYXJnZVxuICAgICAgICAgICAgICAgIFtjbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHJhdygpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1wZW5jaWwtYWx0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJpY29uXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1lZGl0LXRvb2xiYXJcIlxuICAgICAgICAgICAgICAgIGlvbi1idXR0b25cbiAgICAgICAgICAgICAgICBsYXJnZVxuICAgICAgICAgICAgICAgIFtjbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Db2xvckNsaWNrZWQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtcGFsZXR0ZVwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24tZWRpdC10b29sYmFyXCJcbiAgICAgICAgICAgICAgICBpb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgbGFyZ2VcbiAgICAgICAgICAgICAgICBbY2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVuZG8oKVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc1VuZG9BdmFpbGFibGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXVuZG9cIlxuICAgICAgICAgICAgICAgICAgICBpZD1cImljb25cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8L2Rpdj5cbiAgICA8L2lvbi10b29sYmFyPlxuPC9pb24tZm9vdGVyPlxuYCxcbiAgc3R5bGVzOiBbYC5kaXYtY2FudmFzLWNvbnRhaW5lcnt0ZXh0LWFsaWduOmNlbnRlcjtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlOy1vLW9iamVjdC1maXQ6Y29udGFpbjtvYmplY3QtZml0OmNvbnRhaW59LnNjcm9sbC1jb250ZW50e3BhZGRpbmc6MCFpbXBvcnRhbnQ7b3ZlcmZsb3cteTpoaWRkZW59LmRpdi1lZGl0LXRvb2xiYXJ7dGV4dC1hbGlnbjpjZW50ZXJ9LmJ1dHRvbi1lZGl0LXRvb2xiYXJ7cGFkZGluZzo0JSFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50fS5hY3Rpb24tc2hlZXQtYnV0dG9ue2ZvbnQtZmFtaWx5OkZvbnRBd2Vzb21lLEFyaWFsfS5jb2xvci1waWNrZXJ7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtoZWlnaHQ6YXV0bztib3R0b206MDtsZWZ0OjB9I2ljb257Y29sb3I6I2IzMjAxN31gXSxcbiAgcHJvdmlkZXJzOiBbQ2FudmFzTWFuYWdlclNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIE1vYmlsZVNrZXRjaFRvb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBnZXN0dXJlOiBHZXN0dXJlO1xuICBAVmlld0NoaWxkKCdwaW5jaEVsZW1lbnQnKSBlbGVtZW50O1xuXG4gIHB1YmxpYyBmaWxsQ29sb3I6IHN0cmluZztcbiAgcHVibGljIHN0cm9rZUNvbG9yOiBzdHJpbmc7XG4gIHB1YmxpYyBpc0Nyb3BwaW5nOiBib29sZWFuO1xuICBwdWJsaWMgaXNVbmRvQXZhaWxhYmxlOiBib29sZWFuO1xuICBwdWJsaWMgaXNTZWxlY3RpbmdDb2xvcjogYm9vbGVhbjtcbiAgcHVibGljIGlzRHJhd2luZzogYm9vbGVhbjtcblxuICBASW5wdXQoKSBwdWJsaWMgaW1hZ2VEYXRhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkZWRKc29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBpY29uc1BhdGg6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIGljb25zOiBbc3RyaW5nXTtcblxuICBAT3V0cHV0KCkgcHVibGljIGNhbnZhcyA9IG5ldyBFdmVudEVtaXR0ZXI8ZmFicmljLkNhbnZhcz4oKTtcblxuICBwcml2YXRlIGlzTG9hZGVkOiBib29sZWFuO1xuICBwcml2YXRlIGlzUGFubmluZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwcmV2aW91c0ltYWdlRGF0YTogc3RyaW5nO1xuICBwcml2YXRlIGN1cnJlbnRKc29uOiBKU09OO1xuICBwcml2YXRlIHByZXZpb3VzSnNvbjogSlNPTjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aW9uU2hlZXRDdHJsOiBBY3Rpb25TaGVldENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBjYW52YXNNYW5hZ2VyU2VydmljZTogQ2FudmFzTWFuYWdlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zdHJva2VDb2xvciA9IEJsYWNrO1xuICAgIHRoaXMuZmlsbENvbG9yID0gVHJhbnNwYXJlbnQ7XG4gICAgdGhpcy5pc0Nyb3BwaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNVbmRvQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5pc1NlbGVjdGluZ0NvbG9yID0gZmFsc2U7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5pbWFnZURhdGEpIHtcbiAgICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UuZW1wdHlDYW52YXMoKTtcbiAgICAgIGlmICh0aGlzLmxvYWRlZEpzb24gPT0gbnVsbCB8fCB0aGlzLmxvYWRlZEpzb24ubGVuZ3RoIDwgMTApIHtcbiAgICAgICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5zZXRCYWNrZ3JvdW5kRnJvbVVSTCh0aGlzLmltYWdlRGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByZXZpb3VzSnNvbiA9IEpTT04ucGFyc2UodGhpcy5sb2FkZWRKc29uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50SnNvbiA9IHRoaXMucHJldmlvdXNKc29uO1xuICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlXG4gICAgICAgICAgLmxvYWRmcm9tSnNvbihKU09OLnBhcnNlKHRoaXMubG9hZGVkSnNvbikpO1xuICAgICAgfVxuICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XG4gICAgICB0aGlzLnByZXZpb3VzSW1hZ2VEYXRhID0gdGhpcy5pbWFnZURhdGE7XG4gICAgfVxuICAgIHRoaXMuZW1pdENhbnZhcygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkZWQpIHtcbiAgICAgIGlmICh0aGlzLmxvYWRlZEpzb24gPT09IG51bGwgfHwgdGhpcy5sb2FkZWRKc29uLmxlbmd0aCA8IDEwIHx8IHRoaXMuaW1hZ2VEYXRhICE9PSB0aGlzLnByZXZpb3VzSW1hZ2VEYXRhKSB7XG4gICAgICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UuZW1wdHlDYW52YXMoKTtcbiAgICAgICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5zZXRCYWNrZ3JvdW5kRnJvbVVSTCh0aGlzLmltYWdlRGF0YSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNJbWFnZURhdGEgPSB0aGlzLmltYWdlRGF0YTtcbiAgICAgICAgdGhpcy5jdXJyZW50SnNvbiA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubG9hZGVkSnNvbiAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5jdXJyZW50SnNvbikpIHtcbiAgICAgICAgICB0aGlzLnByZXZpb3VzSnNvbiA9IEpTT04ucGFyc2UodGhpcy5sb2FkZWRKc29uKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRKc29uID0gdGhpcy5wcmV2aW91c0pzb247XG4gICAgICAgICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZVxuICAgICAgICAgICAgLmxvYWRmcm9tSnNvbihKU09OLnBhcnNlKHRoaXMubG9hZGVkSnNvbikpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVtaXRDYW52YXMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmdlc3R1cmUgPSBuZXcgR2VzdHVyZSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5nZXN0dXJlLmxpc3RlbigpO1xuICAgIHRoaXMuZ2VzdHVyZS5vbigncGluY2gnLCAkZXZlbnQgPT4gdGhpcy5waW5jaCgkZXZlbnQpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZ2VzdHVyZS5kZXN0cm95KCk7XG59XG5cbiAgcHJpdmF0ZSBwaW5jaEV2ZW50KGV2ZW50KSB7XG4gICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLmVtcHR5Q2FudmFzKCk7XG4gIH1cblxuICBnZXQgaGFzUGljdG9ncmFtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISghdGhpcy5pY29ucyk7XG4gIH1cblxuICBwdWJsaWMgYWRkVGV4dCgpIHtcbiAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLmFkZFRleHQodGhpcy5zdHJva2VDb2xvciwgJ3RleHQgJyk7XG4gICAgdGhpcy5lbWl0Q2FudmFzKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkU2hhcGUoc2hhcGU6IHN0cmluZykge1xuICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UuYWRkR2VvbWV0cmljU2hhcGUoXG4gICAgICB0aGlzLnN0cm9rZUNvbG9yLFxuICAgICAgdGhpcy5maWxsQ29sb3IsXG4gICAgICBBdmFpbGFibGVHZW9tZXRyaWNTaGFwZVtzaGFwZV1cbiAgICApO1xuICAgIHRoaXMuZW1pdENhbnZhcygpO1xuICB9XG5cbiAgcHVibGljIGFkZEltYWdlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5hZGRJbWFnZSh0aGlzLmljb25zUGF0aCArIHNvdXJjZSk7XG4gICAgdGhpcy5lbWl0Q2FudmFzKCk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlU3Ryb2tlQ29sb3IoKSB7XG4gICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5jaGFuZ2VTZWxlY3RlZE9iamVjdHNTdHJva2VDb2xvcihcbiAgICAgIHRoaXMuc3Ryb2tlQ29sb3JcbiAgICApO1xuICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2Uuc2V0RnJlZURyYXdpbmdCcnVzaENvbG9yKHRoaXMuc3Ryb2tlQ29sb3IpO1xuICAgIHRoaXMuZW1pdENhbnZhcygpO1xuICB9XG5cbiAgcHVibGljIGJyaW5nRm93YXJkKCkge1xuICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UuYnJpbmdTZWxlY3RlZE9iamVjdHNUb0Zyb250KCk7XG4gICAgdGhpcy5lbWl0Q2FudmFzKCk7XG4gIH1cblxuICBwdWJsaWMgc2VuZFRvQmFjaygpIHtcbiAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLnNlbmRTZWxlY3RlZE9iamVjdHNUb0JhY2soKTtcbiAgICB0aGlzLmVtaXRDYW52YXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBjcm9wKCkge1xuICAgIHRoaXMuaXNDcm9wcGluZyA9IHRydWU7XG4gICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5kaXNhYmxlU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5hZGRTZWxlY3Rpb25SZWN0YW5nbGUoKTtcbiAgICB0aGlzLmlzVW5kb0F2YWlsYWJsZSA9IHRydWU7XG4gICAgdGhpcy5wcmV2aW91c0pzb24gPSB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLmpzb25Gcm9tQ2FudmFzKCk7XG4gICAgdGhpcy5lbWl0Q2FudmFzKCk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlU2VsZWN0aW9uKCkge1xuICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UuZGVsZXRlU2VsZWN0ZWRPYmplY3RzKCk7XG4gICAgdGhpcy5lbWl0Q2FudmFzKCk7XG4gIH1cblxuICBwdWJsaWMgbW91c2VVcChldmVudCkge1xuICAgIGlmICh0aGlzLmlzQ3JvcHBpbmcpIHtcbiAgICAgIHRoaXMuaXNDcm9wcGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5jcm9wSW1hZ2UoKTtcbiAgICAgIHRoaXMuaXNVbmRvQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW1pdENhbnZhcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBtb3VzZU1vdmUoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc0Nyb3BwaW5nKSB7XG4gICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLmFqdXN0Q3JvcFJlY3RhbmdsZShldmVudCk7XG4gICAgfSBlbHNlIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLnBhbkNhbnZhcyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1vdXNlRG93bihldmVudCkge1xuICAgIGlmICh0aGlzLmlzQ3JvcHBpbmcpIHtcbiAgICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2Uuc3RhcnRTZWxlY3RpbmdDcm9wUmVjdGFuZ2xlKGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2Uuc2V0TGFzdFBhblBvc2l0aW9uKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGluY2goZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2Uuem9vbShldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ3JvdXAoKSB7XG4gICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5ncm91cFNlbGVjdGVkT2JqZWN0cygpO1xuICAgIHRoaXMuZW1pdENhbnZhcygpO1xuICB9XG5cbiAgcHVibGljIHVuZG8oKSB7XG4gICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5sb2FkZnJvbUpzb24odGhpcy5wcmV2aW91c0pzb24pO1xuICAgIHRoaXMuaXNVbmRvQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0Q2FudmFzKCk7XG4gIH1cblxuICBwdWJsaWMgb25Db2xvckNsaWNrZWQoKSB7XG4gICAgdGhpcy5pc1NlbGVjdGluZ0NvbG9yID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5zdHJva2VDb2xvciA9IGNvbG9yO1xuICAgIHRoaXMuY2hhbmdlU3Ryb2tlQ29sb3IoKTtcbiAgICB0aGlzLmlzU2VsZWN0aW5nQ29sb3IgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRDYW52YXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBkcmF3KCkge1xuICAgIHRoaXMuaXNEcmF3aW5nID0gIXRoaXMuaXNEcmF3aW5nO1xuICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UudG9nZ2xlRnJlZURyYXdpbmcoKTtcbiAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLnNldEZyZWVEcmF3aW5nQnJ1c2hDb2xvcih0aGlzLnN0cm9rZUNvbG9yKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZURyYXdpbmcoKSB7XG4gICAgaWYgKHRoaXMuaXNEcmF3aW5nKSB7XG4gICAgICB0aGlzLmlzRHJhd2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS50b2dnbGVGcmVlRHJhd2luZygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlU2hhcGVCdXR0b25zVGV4dCgpOiBBcnJheTxTdHJpbmc+IHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbkFycmF5ID0gW107XG4gICAgdHJhbnNsYXRpb25BcnJheS5wdXNoKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3JlY3RhbmdsZScpKTtcbiAgICB0cmFuc2xhdGlvbkFycmF5LnB1c2godGhpcy50cmFuc2xhdGUuaW5zdGFudCgndHJpYW5nbGUnKSk7XG4gICAgdHJhbnNsYXRpb25BcnJheS5wdXNoKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2NpcmNsZScpKTtcbiAgICB0cmFuc2xhdGlvbkFycmF5LnB1c2godGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbGluZScpKTtcbiAgICB0cmFuc2xhdGlvbkFycmF5LnB1c2godGhpcy50cmFuc2xhdGUuaW5zdGFudCgnY3Jvc3MnKSk7XG4gICAgdHJhbnNsYXRpb25BcnJheS5wdXNoKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3RleHQnKSk7XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uQXJyYXk7XG4gIH1cblxuICBwdWJsaWMgcHJlc2VudFNoYXBlQWN0aW9uU2hlZXQoKSB7XG4gICAgdGhpcy5kaXNhYmxlRHJhd2luZygpO1xuXG4gICAgY29uc3QgdGl0bGVUZXh0ID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnYWRkR2VvbWV0cmljU2hhcGUnKTtcbiAgICBjb25zdCBidXR0b25zVGV4dCA9IHRoaXMudHJhbnNsYXRlU2hhcGVCdXR0b25zVGV4dCgpO1xuICAgIGxldCBpID0gMDtcblxuICAgIGNvbnN0IGFjdGlvblNoZWV0ID0gdGhpcy5hY3Rpb25TaGVldEN0cmwuY3JlYXRlKHtcbiAgICAgIHRpdGxlOiB0aXRsZVRleHQsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnXFx1ZjBjOCAgICcgKyBidXR0b25zVGV4dFtpKytdLFxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UuYWRkR2VvbWV0cmljU2hhcGUoXG4gICAgICAgICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgIHRoaXMuZmlsbENvbG9yLFxuICAgICAgICAgICAgICBBdmFpbGFibGVHZW9tZXRyaWNTaGFwZS5SZWN0YW5nbGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ1xcdWYwZDggICAnICsgYnV0dG9uc1RleHRbaSsrXSxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLmFkZEdlb21ldHJpY1NoYXBlKFxuICAgICAgICAgICAgICB0aGlzLnN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgICB0aGlzLmZpbGxDb2xvcixcbiAgICAgICAgICAgICAgQXZhaWxhYmxlR2VvbWV0cmljU2hhcGUuVHJpYW5nbGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ1xcdWYxMTEgICAnICsgYnV0dG9uc1RleHRbaSsrXSxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLmFkZEdlb21ldHJpY1NoYXBlKFxuICAgICAgICAgICAgICB0aGlzLnN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgICB0aGlzLmZpbGxDb2xvcixcbiAgICAgICAgICAgICAgQXZhaWxhYmxlR2VvbWV0cmljU2hhcGUuQ2lyY2xlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6ICdcXHVmMDY4ICAgJyArIGJ1dHRvbnNUZXh0W2krK10sXG4gICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYW52YXNNYW5hZ2VyU2VydmljZS5hZGRHZW9tZXRyaWNTaGFwZShcbiAgICAgICAgICAgICAgdGhpcy5zdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgdGhpcy5maWxsQ29sb3IsXG4gICAgICAgICAgICAgIEF2YWlsYWJsZUdlb21ldHJpY1NoYXBlLkxpbmVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ1xcdWYwNjcgICAnICsgYnV0dG9uc1RleHRbaSsrXSxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLmFkZEdlb21ldHJpY1NoYXBlKFxuICAgICAgICAgICAgICB0aGlzLnN0cm9rZUNvbG9yLFxuICAgICAgICAgICAgICB0aGlzLmZpbGxDb2xvcixcbiAgICAgICAgICAgICAgQXZhaWxhYmxlR2VvbWV0cmljU2hhcGUuQ3Jvc3NcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ1xcdWYwMzEgICAnICsgYnV0dG9uc1RleHRbaSsrXSxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXJTZXJ2aWNlLmFkZFRleHQodGhpcy5zdHJva2VDb2xvciwgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuICAgIGFjdGlvblNoZWV0LnByZXNlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlRWRpdEJ1dHRvbnNUZXh0KCk6IEFycmF5PFN0cmluZz4ge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uQXJyYXkgPSBbXTtcbiAgICB0cmFuc2xhdGlvbkFycmF5LnB1c2godGhpcy50cmFuc2xhdGUuaW5zdGFudCgnY3JvcCcpKTtcbiAgICB0cmFuc2xhdGlvbkFycmF5LnB1c2godGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZ3JvdXAnKSk7XG4gICAgdHJhbnNsYXRpb25BcnJheS5wdXNoKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2JyaW5nVG9Gcm9udCcpKTtcbiAgICB0cmFuc2xhdGlvbkFycmF5LnB1c2godGhpcy50cmFuc2xhdGUuaW5zdGFudCgnc2VuZFRvQmFjaycpKTtcbiAgICB0cmFuc2xhdGlvbkFycmF5LnB1c2godGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZGVsZXRlJykpO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbkFycmF5O1xuICB9XG5cbiAgcHVibGljIHByZXNlbnRFZGl0QWN0aW9uU2hlZXQoKSB7XG4gICAgdGhpcy5kaXNhYmxlRHJhd2luZygpO1xuXG4gICAgY29uc3QgdGl0bGVUZXh0ID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnZWRpdGlvbicpO1xuXG4gICAgY29uc3QgYnV0dG9uc1RleHQgPSB0aGlzLnRyYW5zbGF0ZUVkaXRCdXR0b25zVGV4dCgpO1xuICAgIGxldCBpID0gMDtcblxuICAgIGNvbnN0IGFjdGlvblNoZWV0ID0gdGhpcy5hY3Rpb25TaGVldEN0cmwuY3JlYXRlKHtcbiAgICAgIHRpdGxlOiB0aXRsZVRleHQsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnXFx1ZjEyNSAnICsgYnV0dG9uc1RleHRbaSsrXSxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyb3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnXFx1ZjI0NyAgICcgKyBidXR0b25zVGV4dFtpKytdLFxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXAoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnXFx1ZjBkZSAgICcgKyBidXR0b25zVGV4dFtpKytdLFxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYnJpbmdGb3dhcmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnXFx1ZjBkZCAgICcgKyBidXR0b25zVGV4dFtpKytdLFxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFRvQmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6ICdcXHVmMWY4ICAgJyArIGJ1dHRvbnNUZXh0W2krK10sXG4gICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVTZWxlY3Rpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBhY3Rpb25TaGVldC5wcmVzZW50KCk7XG4gIH1cblxuICBwdWJsaWMgcHJlc2VudFBpY3RvZ3JhbXNBY3Rpb25TaGVldCgpIHtcbiAgICB0aGlzLmRpc2FibGVEcmF3aW5nKCk7XG5cbiAgICBjb25zdCBidXR0b25zID0gW107XG4gICAgY29uc3QgYWN0aW9uU2hlZXRTdHlsZXMgPSBbXTtcbiAgICBjb25zdCBpbWFnZXMgPSB0aGlzLmljb25zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIHN0eWxlLmlubmVySFRNTCA9XG4gICAgICAgICcuY3VzdG9tQ1NTQ2xhc3MnICtcbiAgICAgICAgaSArXG4gICAgICAgICd7YmFja2dyb3VuZDogdXJsKCcgK1xuICAgICAgICBcIidcIiArXG4gICAgICAgIHRoaXMuaWNvbnNQYXRoICtcbiAgICAgICAgaW1hZ2VzW2ldICtcbiAgICAgICAgXCInXCIgK1xuICAgICAgICAnKSBuby1yZXBlYXQgIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6NTBweCAhaW1wb3J0YW50O2hlaWdodDo4MHB4OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGNlbnRlciAhaW1wb3J0YW50O30nO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICBhY3Rpb25TaGVldFN0eWxlcy5wdXNoKHN0eWxlKTtcbiAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgIHJvbGU6ICdkZXN0cnVjdGl2ZScsXG4gICAgICAgIHRleHQ6IGltYWdlc1tpXSxcbiAgICAgICAgY3NzQ2xhc3M6ICdjdXN0b21DU1NDbGFzcycgKyBpLFxuICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRJbWFnZShpbWFnZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0aXRsZVRleHQgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZGRQaWN0b2dyYW0nKTtcblxuICAgIGNvbnN0IGFjdGlvblNoZWV0ID0gdGhpcy5hY3Rpb25TaGVldEN0cmwuY3JlYXRlKHtcbiAgICAgIHRpdGxlOiB0aXRsZVRleHQsXG4gICAgICBidXR0b25zOiBidXR0b25zXG4gICAgfSk7XG4gICAgYWN0aW9uU2hlZXQub25EaWREaXNtaXNzKCgpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aW9uU2hlZXRTdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFjdGlvblNoZWV0U3R5bGVzW2ldLnBhcmVudE5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIGFjdGlvblNoZWV0U3R5bGVzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYWN0aW9uU2hlZXRTdHlsZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhY3Rpb25TaGVldC5wcmVzZW50KCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdENhbnZhcygpIHtcbiAgICB0aGlzLmNhbnZhcy5lbWl0KHRoaXMuY2FudmFzTWFuYWdlclNlcnZpY2UuY2FudmFzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJb25pY01vZHVsZSB9IGZyb20gJ2lvbmljLWFuZ3VsYXInO1xuXG5pbXBvcnQgeyBNb2JpbGVTa2V0Y2hUb29sQ29tcG9uZW50IH0gZnJvbSAnLi9tb2JpbGUtY29tcG9uZW50L21vYmlsZS1za2V0Y2gtdG9vbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2FudmFzTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2NhbnZhcy1tYW5hZ2VyLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25pY01vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIE1vYmlsZVNrZXRjaFRvb2xDb21wb25lbnQsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIENhbnZhc01hbmFnZXJTZXJ2aWNlLFxuICBdLFxuICBleHBvcnRzOiBbTW9iaWxlU2tldGNoVG9vbENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgU2tldGNoVG9vbE1vZHVsZSB7fVxuIl0sIm5hbWVzIjpbInRzbGliXzEuX192YWx1ZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLEFBQU8scUJBQU0sVUFBVSxHQUFHO0lBQ3hCLEtBQUssRUFBRSxHQUFHO0lBQ1YsTUFBTSxFQUFFLEdBQUc7SUFDWCxJQUFJLEVBQUUsRUFBRTtJQUNSLEdBQUcsRUFBRSxFQUFFO0lBQ1AsTUFBTSxFQUFFLEdBQUc7SUFDWCxNQUFNLEVBQUUsRUFBRTtJQUNWLHFCQUFxQixFQUFFLEVBQUU7SUFDekIsVUFBVSxFQUFFLEVBQUU7Q0FDZixDQUFDOzs7Ozs7O0lDaUJB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
\No newline at end of file