tui-image-editor-angular3 14.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +155 -0
  2. package/esm2020/lib/consts.mjs +170 -0
  3. package/esm2020/lib/i18n/en.mjs +129 -0
  4. package/esm2020/lib/i18n/nl.mjs +128 -0
  5. package/esm2020/lib/i18n/translation.service.mjs +40 -0
  6. package/esm2020/lib/interfaces/command.mjs +2 -0
  7. package/esm2020/lib/interfaces/history-item.mjs +343 -0
  8. package/esm2020/lib/interfaces/image-size.mjs +2 -0
  9. package/esm2020/lib/interfaces/tools-config.mjs +2 -0
  10. package/esm2020/lib/menus/buttons/crop/crop.component.mjs +22 -0
  11. package/esm2020/lib/menus/buttons/delete/delete.component.mjs +40 -0
  12. package/esm2020/lib/menus/buttons/delete-all/delete-all.component.mjs +27 -0
  13. package/esm2020/lib/menus/buttons/download/download.component.mjs +40 -0
  14. package/esm2020/lib/menus/buttons/drag/drag.component.mjs +41 -0
  15. package/esm2020/lib/menus/buttons/draw/draw.component.mjs +22 -0
  16. package/esm2020/lib/menus/buttons/filter/filter.component.mjs +22 -0
  17. package/esm2020/lib/menus/buttons/flip/flip.component.mjs +22 -0
  18. package/esm2020/lib/menus/buttons/history/history.component.mjs +41 -0
  19. package/esm2020/lib/menus/buttons/icon/icon.component.mjs +22 -0
  20. package/esm2020/lib/menus/buttons/load/load.component.mjs +23 -0
  21. package/esm2020/lib/menus/buttons/mask/mask.component.mjs +22 -0
  22. package/esm2020/lib/menus/buttons/redo/redo.component.mjs +36 -0
  23. package/esm2020/lib/menus/buttons/reset/reset.component.mjs +28 -0
  24. package/esm2020/lib/menus/buttons/rotate/rotate.component.mjs +22 -0
  25. package/esm2020/lib/menus/buttons/shape/shape.component.mjs +22 -0
  26. package/esm2020/lib/menus/buttons/text/text.component.mjs +22 -0
  27. package/esm2020/lib/menus/buttons/undo/undo.component.mjs +36 -0
  28. package/esm2020/lib/menus/buttons/zoom-in/zoom-in.component.mjs +45 -0
  29. package/esm2020/lib/menus/buttons/zoom-out/zoom-out.component.mjs +20 -0
  30. package/esm2020/lib/services/history.service.mjs +86 -0
  31. package/esm2020/lib/services/tools.config-manager.service.mjs +45 -0
  32. package/esm2020/lib/submenus/crop/crop.component.mjs +76 -0
  33. package/esm2020/lib/submenus/draw/draw.component.mjs +149 -0
  34. package/esm2020/lib/submenus/filter/filter.component.mjs +345 -0
  35. package/esm2020/lib/submenus/flip/flip.component.mjs +39 -0
  36. package/esm2020/lib/submenus/icon/icon.component.mjs +119 -0
  37. package/esm2020/lib/submenus/mask/mask.component.mjs +69 -0
  38. package/esm2020/lib/submenus/rotate/rotate.component.mjs +57 -0
  39. package/esm2020/lib/submenus/shape/shape.component.mjs +163 -0
  40. package/esm2020/lib/submenus/text/text.component.mjs +175 -0
  41. package/esm2020/lib/svg-definitions/svg-definitions.component.mjs +12 -0
  42. package/esm2020/lib/tui-image-editor.component.mjs +294 -0
  43. package/esm2020/lib/tui-image-editor.module.mjs +136 -0
  44. package/esm2020/lib/utils.mjs +173 -0
  45. package/esm2020/public-api.mjs +8 -0
  46. package/esm2020/tui-image-editor-angular2.mjs +5 -0
  47. package/esm2020/tui-image-editor-angular3.mjs +5 -0
  48. package/fesm2015/tui-image-editor-angular2.mjs +3166 -0
  49. package/fesm2015/tui-image-editor-angular2.mjs.map +1 -0
  50. package/fesm2015/tui-image-editor-angular3.mjs +3166 -0
  51. package/fesm2015/tui-image-editor-angular3.mjs.map +1 -0
  52. package/fesm2020/tui-image-editor-angular2.mjs +3126 -0
  53. package/fesm2020/tui-image-editor-angular2.mjs.map +1 -0
  54. package/fesm2020/tui-image-editor-angular3.mjs +3126 -0
  55. package/fesm2020/tui-image-editor-angular3.mjs.map +1 -0
  56. package/index.d.ts +5 -0
  57. package/lib/consts.d.ts +144 -0
  58. package/lib/consts.d.ts.map +1 -0
  59. package/lib/i18n/en.d.ts +128 -0
  60. package/lib/i18n/en.d.ts.map +1 -0
  61. package/lib/i18n/nl.d.ts +127 -0
  62. package/lib/i18n/nl.d.ts.map +1 -0
  63. package/lib/i18n/translation.service.d.ts +14 -0
  64. package/lib/i18n/translation.service.d.ts.map +1 -0
  65. package/lib/interfaces/command.d.ts +4 -0
  66. package/lib/interfaces/command.d.ts.map +1 -0
  67. package/lib/interfaces/history-item.d.ts +26 -0
  68. package/lib/interfaces/history-item.d.ts.map +1 -0
  69. package/lib/interfaces/image-size.d.ts +6 -0
  70. package/lib/interfaces/image-size.d.ts.map +1 -0
  71. package/lib/interfaces/tools-config.d.ts +14 -0
  72. package/lib/interfaces/tools-config.d.ts.map +1 -0
  73. package/lib/menus/buttons/crop/crop.component.d.ts +10 -0
  74. package/lib/menus/buttons/crop/crop.component.d.ts.map +1 -0
  75. package/lib/menus/buttons/delete/delete.component.d.ts +13 -0
  76. package/lib/menus/buttons/delete/delete.component.d.ts.map +1 -0
  77. package/lib/menus/buttons/delete-all/delete-all.component.d.ts +11 -0
  78. package/lib/menus/buttons/delete-all/delete-all.component.d.ts.map +1 -0
  79. package/lib/menus/buttons/download/download.component.d.ts +9 -0
  80. package/lib/menus/buttons/download/download.component.d.ts.map +1 -0
  81. package/lib/menus/buttons/drag/drag.component.d.ts +11 -0
  82. package/lib/menus/buttons/drag/drag.component.d.ts.map +1 -0
  83. package/lib/menus/buttons/draw/draw.component.d.ts +10 -0
  84. package/lib/menus/buttons/draw/draw.component.d.ts.map +1 -0
  85. package/lib/menus/buttons/filter/filter.component.d.ts +10 -0
  86. package/lib/menus/buttons/filter/filter.component.d.ts.map +1 -0
  87. package/lib/menus/buttons/flip/flip.component.d.ts +10 -0
  88. package/lib/menus/buttons/flip/flip.component.d.ts.map +1 -0
  89. package/lib/menus/buttons/history/history.component.d.ts +13 -0
  90. package/lib/menus/buttons/history/history.component.d.ts.map +1 -0
  91. package/lib/menus/buttons/icon/icon.component.d.ts +10 -0
  92. package/lib/menus/buttons/icon/icon.component.d.ts.map +1 -0
  93. package/lib/menus/buttons/load/load.component.d.ts +9 -0
  94. package/lib/menus/buttons/load/load.component.d.ts.map +1 -0
  95. package/lib/menus/buttons/mask/mask.component.d.ts +10 -0
  96. package/lib/menus/buttons/mask/mask.component.d.ts.map +1 -0
  97. package/lib/menus/buttons/redo/redo.component.d.ts +12 -0
  98. package/lib/menus/buttons/redo/redo.component.d.ts.map +1 -0
  99. package/lib/menus/buttons/reset/reset.component.d.ts +12 -0
  100. package/lib/menus/buttons/reset/reset.component.d.ts.map +1 -0
  101. package/lib/menus/buttons/rotate/rotate.component.d.ts +10 -0
  102. package/lib/menus/buttons/rotate/rotate.component.d.ts.map +1 -0
  103. package/lib/menus/buttons/shape/shape.component.d.ts +10 -0
  104. package/lib/menus/buttons/shape/shape.component.d.ts.map +1 -0
  105. package/lib/menus/buttons/text/text.component.d.ts +10 -0
  106. package/lib/menus/buttons/text/text.component.d.ts.map +1 -0
  107. package/lib/menus/buttons/undo/undo.component.d.ts +12 -0
  108. package/lib/menus/buttons/undo/undo.component.d.ts.map +1 -0
  109. package/lib/menus/buttons/zoom-in/zoom-in.component.d.ts +12 -0
  110. package/lib/menus/buttons/zoom-in/zoom-in.component.d.ts.map +1 -0
  111. package/lib/menus/buttons/zoom-out/zoom-out.component.d.ts +9 -0
  112. package/lib/menus/buttons/zoom-out/zoom-out.component.d.ts.map +1 -0
  113. package/lib/services/history.service.d.ts +45 -0
  114. package/lib/services/history.service.d.ts.map +1 -0
  115. package/lib/services/tools.config-manager.service.d.ts +12 -0
  116. package/lib/services/tools.config-manager.service.d.ts.map +1 -0
  117. package/lib/submenus/crop/crop.component.d.ts +23 -0
  118. package/lib/submenus/crop/crop.component.d.ts.map +1 -0
  119. package/lib/submenus/draw/draw.component.d.ts +32 -0
  120. package/lib/submenus/draw/draw.component.d.ts.map +1 -0
  121. package/lib/submenus/filter/filter.component.d.ts +70 -0
  122. package/lib/submenus/filter/filter.component.d.ts.map +1 -0
  123. package/lib/submenus/flip/flip.component.d.ts +10 -0
  124. package/lib/submenus/flip/flip.component.d.ts.map +1 -0
  125. package/lib/submenus/icon/icon.component.d.ts +24 -0
  126. package/lib/submenus/icon/icon.component.d.ts.map +1 -0
  127. package/lib/submenus/mask/mask.component.d.ts +16 -0
  128. package/lib/submenus/mask/mask.component.d.ts.map +1 -0
  129. package/lib/submenus/rotate/rotate.component.d.ts +12 -0
  130. package/lib/submenus/rotate/rotate.component.d.ts.map +1 -0
  131. package/lib/submenus/shape/shape.component.d.ts +31 -0
  132. package/lib/submenus/shape/shape.component.d.ts.map +1 -0
  133. package/lib/submenus/text/text.component.d.ts +31 -0
  134. package/lib/submenus/text/text.component.d.ts.map +1 -0
  135. package/lib/svg-definitions/svg-definitions.component.d.ts +6 -0
  136. package/lib/svg-definitions/svg-definitions.component.d.ts.map +1 -0
  137. package/lib/tui-image-editor.component.d.ts +71 -0
  138. package/lib/tui-image-editor.component.d.ts.map +1 -0
  139. package/lib/tui-image-editor.module.d.ts +48 -0
  140. package/lib/tui-image-editor.module.d.ts.map +1 -0
  141. package/lib/utils.d.ts +45 -0
  142. package/lib/utils.d.ts.map +1 -0
  143. package/package.json +43 -0
  144. package/public-api.d.ts +4 -0
  145. package/public-api.d.ts.map +1 -0
  146. package/src/checkboxes.scss +95 -0
  147. package/src/theme.scss +936 -0
  148. package/tui-image-editor-angular2.d.ts.map +1 -0
@@ -0,0 +1,163 @@
1
+ import { Component, Input, } from '@angular/core';
2
+ import { defaultColors, eventNames } from '../../consts';
3
+ import { clearSelection, getActiveObjectId } from '../../utils';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ import * as i2 from "ngx-color-picker";
7
+ import * as i3 from "@ngx-translate/core";
8
+ export class ShapeComponent {
9
+ constructor() {
10
+ this.defaultShapeStrokeColors = defaultColors;
11
+ this.defaultShapeFillColors = defaultColors;
12
+ this.shapeStrokeWidthValue = 3;
13
+ this.shapeFillColor = 'rgba(255, 255, 255, 0)';
14
+ this.shapeStrokeColor = 'rgba(0, 169, 255, 1)';
15
+ this.onObjectActivatedEventListener = this.onObjectActivated.bind(this);
16
+ this.onObjectAddedEventListener = this.onObjectAdded.bind(this);
17
+ }
18
+ ngOnChanges(changes) {
19
+ var that = this;
20
+ if (changes['imageEditor']) {
21
+ this.activeObjectId = getActiveObjectId(changes['imageEditor'].currentValue);
22
+ this.checkActiveObject(this.activeObjectId);
23
+ changes['imageEditor'].previousValue?.off(eventNames.OBJECT_ACTIVATED, that.onObjectActivatedEventListener);
24
+ changes['imageEditor'].currentValue?.on(eventNames.OBJECT_ACTIVATED, that.onObjectActivatedEventListener);
25
+ changes['imageEditor'].previousValue?.off(eventNames.OBJECT_ADDED, that.onObjectAddedEventListener);
26
+ changes['imageEditor'].currentValue?.on(eventNames.OBJECT_ADDED, that.onObjectAddedEventListener);
27
+ }
28
+ }
29
+ ngOnDestroy() {
30
+ if (this.imageEditor) {
31
+ this.imageEditor.off(eventNames.OBJECT_ACTIVATED, this.onObjectActivatedEventListener);
32
+ this.imageEditor.off(eventNames.OBJECT_ADDED, this.onObjectAddedEventListener);
33
+ }
34
+ }
35
+ onObjectActivated(props) {
36
+ this.activeObjectId = props?.id;
37
+ this.checkActiveObject(this.activeObjectId);
38
+ }
39
+ onObjectAdded(props) {
40
+ if (props && ['rect', 'circle', 'triangle'].indexOf(props.type) > -1) {
41
+ this.shapeType = null;
42
+ this.imageEditor?.stopDrawingMode();
43
+ }
44
+ }
45
+ checkActiveObject(activeObjectId) {
46
+ if (activeObjectId != null) {
47
+ var props = this.imageEditor?.getObjectProperties(activeObjectId, [
48
+ 'type',
49
+ 'strokeWidth',
50
+ 'stroke',
51
+ 'fill',
52
+ ]);
53
+ if (props && ['rect', 'circle', 'triangle'].indexOf(props.type) > -1) {
54
+ this.shapeStrokeWidthValue = props.strokeWidth;
55
+ this.shapeFillColor =
56
+ typeof props.fill == 'object' && props.fill.type == 'color'
57
+ ? props.fill.color
58
+ : props.fill == null || props.fill.trim() == ''
59
+ ? 'rgba(255, 255, 255, 0)'
60
+ : props.fill;
61
+ this.shapeStrokeColor =
62
+ props.stroke == null || props.stroke.trim() == ''
63
+ ? 'rgba(255, 255, 255, 0)'
64
+ : props.stroke;
65
+ }
66
+ }
67
+ }
68
+ shapeStrokeWidthChanged(currentStrokeWidth, isSilent) {
69
+ this.setDrawingShape(this.shapeType, {
70
+ fill: this.shapeFillColor,
71
+ stroke: this.shapeStrokeColor,
72
+ strokeWidth: typeof currentStrokeWidth === "number" ? currentStrokeWidth : this.shapeStrokeWidthValue,
73
+ });
74
+ this.shapeChangeActiveObject('strokeWidth', isSilent);
75
+ }
76
+ shapeColorChanged(type, currentColor) {
77
+ switch (type) {
78
+ case 'fill':
79
+ this.setDrawingShape(this.shapeType, {
80
+ fill: currentColor,
81
+ stroke: this.shapeStrokeColor,
82
+ strokeWidth: this.shapeStrokeWidthValue,
83
+ });
84
+ break;
85
+ case 'stroke':
86
+ this.setDrawingShape(this.shapeType, {
87
+ fill: this.shapeFillColor,
88
+ stroke: currentColor,
89
+ strokeWidth: this.shapeStrokeWidthValue,
90
+ });
91
+ break;
92
+ }
93
+ this.shapeChangeActiveObject(type == 'stroke' ? 'strokeColor' : 'fillColor');
94
+ }
95
+ setShapeType(type) {
96
+ clearSelection(this.imageEditor);
97
+ if (this.shapeType != type) {
98
+ this.shapeType = type;
99
+ this.imageEditor.startDrawingMode('SHAPE');
100
+ this.setDrawingShape(this.shapeType, {
101
+ fill: this.shapeFillColor,
102
+ stroke: this.shapeStrokeColor,
103
+ strokeWidth: this.shapeStrokeWidthValue,
104
+ });
105
+ }
106
+ else {
107
+ this.shapeType = null;
108
+ this.imageEditor.stopDrawingMode();
109
+ }
110
+ }
111
+ setDrawingShape(type, options) {
112
+ this.imageEditor.setDrawingShape(type, options);
113
+ }
114
+ shapeChangeActiveObject(changedProperty, isSilent = false) {
115
+ if (this.activeObjectId != null &&
116
+ getActiveObjectId(this.imageEditor) == this.activeObjectId) {
117
+ var props = this.imageEditor.getObjectProperties(this.activeObjectId, 'type');
118
+ if (props != null &&
119
+ ['rect', 'circle', 'triangle'].indexOf(props.type) > -1) {
120
+ let parameters = null;
121
+ switch (changedProperty) {
122
+ case 'strokeWidth':
123
+ parameters = {
124
+ strokeWidth: this.shapeStrokeWidthValue,
125
+ };
126
+ break;
127
+ case 'strokeColor':
128
+ parameters = {
129
+ stroke: this.shapeStrokeColor,
130
+ };
131
+ break;
132
+ case 'fillColor':
133
+ parameters = {
134
+ fill: this.shapeFillColor,
135
+ };
136
+ break;
137
+ }
138
+ let functionToExecute = () => {
139
+ this.imageEditor.changeShape(this.activeObjectId, parameters, isSilent);
140
+ };
141
+ if (isSilent) {
142
+ functionToExecute();
143
+ }
144
+ else {
145
+ setTimeout(functionToExecute);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ ShapeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ShapeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
152
+ ShapeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: ShapeComponent, selector: "tui-image-editor-submenus-shape", inputs: { imageEditor: "imageEditor", defaultShapeStrokeColors: "defaultShapeStrokeColors", defaultShapeFillColors: "defaultShapeFillColors" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"tui-image-editor-menu-shape\">\r\n <div class=\"tui-image-editor-submenu-item\">\r\n <div class=\"tui-image-editor-d-flex tui-image-editor-justify-content-center\">\r\n <div class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\">\r\n <div class=\"tie-shape-button\">\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button rect ' +\r\n (shapeType == 'rect' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('rect')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-rectangle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-rectangle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-rectangle\" | translate\r\n }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button circle ' +\r\n (shapeType == 'circle' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('circle')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-circle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-circle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-shape-circle\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button triangle ' +\r\n (shapeType == 'triangle' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('triangle')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-triangle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-triangle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-triangle\" | translate\r\n }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div class=\"tie-shape-color-button tui-image-editor-d-flex tui-image-editor-flex-row\">\r\n <div\r\n class=\"tie-color-fill tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Fill\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-draw-color-picker\"\r\n [(colorPicker)]=\"shapeFillColor\"\r\n [style.background]=\"shapeFillColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultShapeFillColors\"\r\n (colorPickerChange)=\"shapeColorChanged('fill', $event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{ \"tui-image-editor-angular-submenus-shape-fill\" | translate }}\r\n </div></label\r\n >\r\n </div>\r\n <div\r\n class=\"tie-color-stroke tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Stroke\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-draw-color-picker\"\r\n [(colorPicker)]=\"shapeStrokeColor\"\r\n [style.background]=\"shapeStrokeColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultShapeStrokeColors\"\r\n (colorPickerChange)=\"shapeColorChanged('stroke', $event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-stroke\" | translate\r\n }}\r\n </div></label\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-justify-content-center tui-image-editor-align-items-center tui-image-editor-mb-3\"\r\n >\r\n <label class=\"range\">{{\r\n \"tui-image-editor-angular-submenus-shape-strokeWidth\" | translate\r\n }}</label>\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"shapeStrokeWidthValue\"\r\n (ngModelChange)=\"shapeStrokeWidthChanged($event, true)\"\r\n (change)=\"shapeStrokeWidthChanged($event, false)\"\r\n min=\"2\"\r\n max=\"300\"\r\n />\r\n <input\r\n type=\"number\"\r\n min=\"2\"\r\n max=\"300\"\r\n step=\"1\"\r\n class=\"tie-draw-range-value tui-image-editor-range-value\"\r\n [(ngModel)]=\"shapeStrokeWidthValue\"\r\n (ngModelChange)=\"shapeStrokeWidthChanged($event, true)\"\r\n (change)=\"shapeStrokeWidthChanged($event, false)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.ColorPickerDirective, selector: "[colorPicker]", inputs: ["colorPicker", "cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpEyeDropper", "cpPresetLabel", "cpPresetColors", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "cpExtraTemplate"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ShapeComponent, decorators: [{
154
+ type: Component,
155
+ args: [{ selector: 'tui-image-editor-submenus-shape', template: "<div class=\"tui-image-editor-menu-shape\">\r\n <div class=\"tui-image-editor-submenu-item\">\r\n <div class=\"tui-image-editor-d-flex tui-image-editor-justify-content-center\">\r\n <div class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\">\r\n <div class=\"tie-shape-button\">\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button rect ' +\r\n (shapeType == 'rect' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('rect')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-rectangle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-rectangle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-rectangle\" | translate\r\n }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button circle ' +\r\n (shapeType == 'circle' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('circle')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-circle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-circle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-shape-circle\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button triangle ' +\r\n (shapeType == 'triangle' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('triangle')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-triangle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-triangle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-triangle\" | translate\r\n }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div class=\"tie-shape-color-button tui-image-editor-d-flex tui-image-editor-flex-row\">\r\n <div\r\n class=\"tie-color-fill tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Fill\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-draw-color-picker\"\r\n [(colorPicker)]=\"shapeFillColor\"\r\n [style.background]=\"shapeFillColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultShapeFillColors\"\r\n (colorPickerChange)=\"shapeColorChanged('fill', $event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{ \"tui-image-editor-angular-submenus-shape-fill\" | translate }}\r\n </div></label\r\n >\r\n </div>\r\n <div\r\n class=\"tie-color-stroke tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Stroke\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-draw-color-picker\"\r\n [(colorPicker)]=\"shapeStrokeColor\"\r\n [style.background]=\"shapeStrokeColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultShapeStrokeColors\"\r\n (colorPickerChange)=\"shapeColorChanged('stroke', $event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-stroke\" | translate\r\n }}\r\n </div></label\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-justify-content-center tui-image-editor-align-items-center tui-image-editor-mb-3\"\r\n >\r\n <label class=\"range\">{{\r\n \"tui-image-editor-angular-submenus-shape-strokeWidth\" | translate\r\n }}</label>\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"shapeStrokeWidthValue\"\r\n (ngModelChange)=\"shapeStrokeWidthChanged($event, true)\"\r\n (change)=\"shapeStrokeWidthChanged($event, false)\"\r\n min=\"2\"\r\n max=\"300\"\r\n />\r\n <input\r\n type=\"number\"\r\n min=\"2\"\r\n max=\"300\"\r\n step=\"1\"\r\n class=\"tie-draw-range-value tui-image-editor-range-value\"\r\n [(ngModel)]=\"shapeStrokeWidthValue\"\r\n (ngModelChange)=\"shapeStrokeWidthChanged($event, true)\"\r\n (change)=\"shapeStrokeWidthChanged($event, false)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n" }]
156
+ }], ctorParameters: function () { return []; }, propDecorators: { imageEditor: [{
157
+ type: Input
158
+ }], defaultShapeStrokeColors: [{
159
+ type: Input
160
+ }], defaultShapeFillColors: [{
161
+ type: Input
162
+ }] } });
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVpLWltYWdlLWVkaXRvci1hbmd1bGFyMi9zcmMvbGliL3N1Ym1lbnVzL3NoYXBlL3NoYXBlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1aS1pbWFnZS1lZGl0b3ItYW5ndWxhcjIvc3JjL2xpYi9zdWJtZW51cy9zaGFwZS9zaGFwZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssR0FLTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQU9oRSxNQUFNLE9BQU8sY0FBYztJQVl6QjtRQVZTLDZCQUF3QixHQUFhLGFBQWEsQ0FBQztRQUNuRCwyQkFBc0IsR0FBYSxhQUFhLENBQUM7UUFDbkQsMEJBQXFCLEdBQVcsQ0FBQyxDQUFDO1FBQ2xDLG1CQUFjLEdBQVcsd0JBQXdCLENBQUM7UUFDbEQscUJBQWdCLEdBQVcsc0JBQXNCLENBQUM7UUFPdkQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQ3JD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QyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN2RDtnQkFDQSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLFFBQVEsZUFBZSxFQUFFO29CQUN2QixLQUFLLGFBQWE7d0JBQ2hCLFVBQVUsR0FBRzs0QkFDWCxXQUFXLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjt5QkFDeEMsQ0FBQzt3QkFDRixNQUFNO29CQUNSLEtBQUssYUFBYTt3QkFDaEIsVUFBVSxHQUFHOzRCQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCO3lCQUM5QixDQUFDO3dCQUNGLE1BQU07b0JBQ1IsS0FBSyxXQUFXO3dCQUNkLFVBQVUsR0FBRzs0QkFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWM7eUJBQzFCLENBQUM7d0JBQ0YsTUFBTTtpQkFDVDtnQkFDRCxJQUFJLGlCQUFpQixHQUFHLEdBQUcsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQzFCLElBQUksQ0FBQyxjQUFjLEVBQ25CLFVBQVUsRUFDVixRQUFRLENBQ1QsQ0FBQztnQkFDSixDQUFDLENBQUM7Z0JBQ0YsSUFBSSxRQUFRLEVBQUU7b0JBQ1osaUJBQWlCLEVBQUUsQ0FBQztpQkFDckI7cUJBQU07b0JBQ0wsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7aUJBQy9CO2FBQ0Y7U0FDRjtJQUNILENBQUM7OzJHQXhNVSxjQUFjOytGQUFkLGNBQWMsNE9DaEIzQixvOExBMkpBOzJGRDNJYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLGlDQUFpQzswRUFLbEMsV0FBVztzQkFBbkIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZGVmYXVsdENvbG9ycywgZXZlbnROYW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0cyc7XHJcbmltcG9ydCB7IGNsZWFyU2VsZWN0aW9uLCBnZXRBY3RpdmVPYmplY3RJZCB9IGZyb20gJy4uLy4uL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHVpLWltYWdlLWVkaXRvci1zdWJtZW51cy1zaGFwZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NoYXBlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zaGFwZS5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaGFwZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBpbWFnZUVkaXRvcjogYW55O1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRTaGFwZVN0cm9rZUNvbG9yczogc3RyaW5nW10gPSBkZWZhdWx0Q29sb3JzO1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRTaGFwZUZpbGxDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcclxuICBwdWJsaWMgc2hhcGVTdHJva2VXaWR0aFZhbHVlOiBudW1iZXIgPSAzO1xyXG4gIHB1YmxpYyBzaGFwZUZpbGxDb2xvcjogc3RyaW5nID0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMCknO1xyXG4gIHB1YmxpYyBzaGFwZVN0cm9rZUNvbG9yOiBzdHJpbmcgPSAncmdiYSgwLCAxNjksIDI1NSwgMSknO1xyXG4gIHB1YmxpYyBzaGFwZVR5cGU6ICdjaXJjbGUnIHwgJ3RyaWFuZ2xlJyB8ICdyZWN0JztcclxuICBwdWJsaWMgYWN0aXZlT2JqZWN0SWQ6IG51bWJlcjtcclxuICBwdWJsaWMgb25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyOiBhbnk7XHJcbiAgcHVibGljIG9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5vbk9iamVjdEFjdGl2YXRlZEV2ZW50TGlzdGVuZXIgPSB0aGlzLm9uT2JqZWN0QWN0aXZhdGVkLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLm9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyID0gdGhpcy5vbk9iamVjdEFkZGVkLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB2YXIgdGhhdCA9IHRoaXM7XHJcbiAgICBpZiAoY2hhbmdlc1snaW1hZ2VFZGl0b3InXSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZU9iamVjdElkID0gZ2V0QWN0aXZlT2JqZWN0SWQoXHJcbiAgICAgICAgY2hhbmdlc1snaW1hZ2VFZGl0b3InXS5jdXJyZW50VmFsdWVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jaGVja0FjdGl2ZU9iamVjdCh0aGlzLmFjdGl2ZU9iamVjdElkKTtcclxuXHJcbiAgICAgIGNoYW5nZXNbJ2ltYWdlRWRpdG9yJ10ucHJldmlvdXNWYWx1ZT8ub2ZmKFxyXG4gICAgICAgIGV2ZW50TmFtZXMuT0JKRUNUX0FDVElWQVRFRCxcclxuICAgICAgICB0aGF0Lm9uT2JqZWN0QWN0aXZhdGVkRXZlbnRMaXN0ZW5lclxyXG4gICAgICApO1xyXG4gICAgICBjaGFuZ2VzWydpbWFnZUVkaXRvciddLmN1cnJlbnRWYWx1ZT8ub24oXHJcbiAgICAgICAgZXZlbnROYW1lcy5PQkpFQ1RfQUNUSVZBVEVELFxyXG4gICAgICAgIHRoYXQub25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjaGFuZ2VzWydpbWFnZUVkaXRvciddLnByZXZpb3VzVmFsdWU/Lm9mZihcclxuICAgICAgICBldmVudE5hbWVzLk9CSkVDVF9BRERFRCxcclxuICAgICAgICB0aGF0Lm9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICAgIGNoYW5nZXNbJ2ltYWdlRWRpdG9yJ10uY3VycmVudFZhbHVlPy5vbihcclxuICAgICAgICBldmVudE5hbWVzLk9CSkVDVF9BRERFRCxcclxuICAgICAgICB0aGF0Lm9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmltYWdlRWRpdG9yKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VFZGl0b3Iub2ZmKFxyXG4gICAgICAgIGV2ZW50TmFtZXMuT0JKRUNUX0FDVElWQVRFRCxcclxuICAgICAgICB0aGlzLm9uT2JqZWN0QWN0aXZhdGVkRXZlbnRMaXN0ZW5lclxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmltYWdlRWRpdG9yLm9mZihcclxuICAgICAgICBldmVudE5hbWVzLk9CSkVDVF9BRERFRCxcclxuICAgICAgICB0aGlzLm9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uT2JqZWN0QWN0aXZhdGVkKHByb3BzKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU9iamVjdElkID0gcHJvcHM/LmlkO1xyXG4gICAgdGhpcy5jaGVja0FjdGl2ZU9iamVjdCh0aGlzLmFjdGl2ZU9iamVjdElkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25PYmplY3RBZGRlZChwcm9wcykge1xyXG4gICAgaWYgKHByb3BzICYmIFsncmVjdCcsICdjaXJjbGUnLCAndHJpYW5nbGUnXS5pbmRleE9mKHByb3BzLnR5cGUpID4gLTEpIHtcclxuICAgICAgdGhpcy5zaGFwZVR5cGUgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlRWRpdG9yPy5zdG9wRHJhd2luZ01vZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tBY3RpdmVPYmplY3QoYWN0aXZlT2JqZWN0SWQ6IG51bWJlcikge1xyXG4gICAgaWYgKGFjdGl2ZU9iamVjdElkICE9IG51bGwpIHtcclxuICAgICAgdmFyIHByb3BzID0gdGhpcy5pbWFnZUVkaXRvcj8uZ2V0T2JqZWN0UHJvcGVydGllcyhhY3RpdmVPYmplY3RJZCwgW1xyXG4gICAgICAgICd0eXBlJyxcclxuICAgICAgICAnc3Ryb2tlV2lkdGgnLFxyXG4gICAgICAgICdzdHJva2UnLFxyXG4gICAgICAgICdmaWxsJyxcclxuICAgICAgXSk7XHJcbiAgICAgIGlmIChwcm9wcyAmJiBbJ3JlY3QnLCAnY2lyY2xlJywgJ3RyaWFuZ2xlJ10uaW5kZXhPZihwcm9wcy50eXBlKSA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5zaGFwZVN0cm9rZVdpZHRoVmFsdWUgPSBwcm9wcy5zdHJva2VXaWR0aDtcclxuICAgICAgICB0aGlzLnNoYXBlRmlsbENvbG9yID1cclxuICAgICAgICAgIHR5cGVvZiBwcm9wcy5maWxsID09ICdvYmplY3QnICYmIHByb3BzLmZpbGwudHlwZSA9PSAnY29sb3InXHJcbiAgICAgICAgICAgID8gcHJvcHMuZmlsbC5jb2xvclxyXG4gICAgICAgICAgICA6IHByb3BzLmZpbGwgPT0gbnVsbCB8fCBwcm9wcy5maWxsLnRyaW0oKSA9PSAnJ1xyXG4gICAgICAgICAgICA/ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDApJ1xyXG4gICAgICAgICAgICA6IHByb3BzLmZpbGw7XHJcbiAgICAgICAgdGhpcy5zaGFwZVN0cm9rZUNvbG9yID1cclxuICAgICAgICAgIHByb3BzLnN0cm9rZSA9PSBudWxsIHx8IHByb3BzLnN0cm9rZS50cmltKCkgPT0gJydcclxuICAgICAgICAgICAgPyAncmdiYSgyNTUsIDI1NSwgMjU1LCAwKSdcclxuICAgICAgICAgICAgOiBwcm9wcy5zdHJva2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNoYXBlU3Ryb2tlV2lkdGhDaGFuZ2VkKGN1cnJlbnRTdHJva2VXaWR0aDogbnVtYmVyIHwgRXZlbnQsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNldERyYXdpbmdTaGFwZSh0aGlzLnNoYXBlVHlwZSwge1xyXG4gICAgICBmaWxsOiB0aGlzLnNoYXBlRmlsbENvbG9yLFxyXG4gICAgICBzdHJva2U6IHRoaXMuc2hhcGVTdHJva2VDb2xvcixcclxuICAgICAgc3Ryb2tlV2lkdGg6IHR5cGVvZiBjdXJyZW50U3Ryb2tlV2lkdGggPT09IFwibnVtYmVyXCIgPyBjdXJyZW50U3Ryb2tlV2lkdGggOiB0aGlzLnNoYXBlU3Ryb2tlV2lkdGhWYWx1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zaGFwZUNoYW5nZUFjdGl2ZU9iamVjdCgnc3Ryb2tlV2lkdGgnLCBpc1NpbGVudCk7XHJcbiAgfVxyXG5cclxuICBzaGFwZUNvbG9yQ2hhbmdlZCh0eXBlOiAnc3Ryb2tlJyB8ICdmaWxsJywgY3VycmVudENvbG9yOiBzdHJpbmcpIHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICdmaWxsJzpcclxuICAgICAgICB0aGlzLnNldERyYXdpbmdTaGFwZSh0aGlzLnNoYXBlVHlwZSwge1xyXG4gICAgICAgICAgZmlsbDogY3VycmVudENvbG9yLFxyXG4gICAgICAgICAgc3Ryb2tlOiB0aGlzLnNoYXBlU3Ryb2tlQ29sb3IsXHJcbiAgICAgICAgICBzdHJva2VXaWR0aDogdGhpcy5zaGFwZVN0cm9rZVdpZHRoVmFsdWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3N0cm9rZSc6XHJcbiAgICAgICAgdGhpcy5zZXREcmF3aW5nU2hhcGUodGhpcy5zaGFwZVR5cGUsIHtcclxuICAgICAgICAgIGZpbGw6IHRoaXMuc2hhcGVGaWxsQ29sb3IsXHJcbiAgICAgICAgICBzdHJva2U6IGN1cnJlbnRDb2xvcixcclxuICAgICAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnNoYXBlU3Ryb2tlV2lkdGhWYWx1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHRoaXMuc2hhcGVDaGFuZ2VBY3RpdmVPYmplY3QoXHJcbiAgICAgIHR5cGUgPT0gJ3N0cm9rZScgPyAnc3Ryb2tlQ29sb3InIDogJ2ZpbGxDb2xvcidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRTaGFwZVR5cGUodHlwZTogJ2NpcmNsZScgfCAndHJpYW5nbGUnIHwgJ3JlY3QnKSB7XHJcbiAgICBjbGVhclNlbGVjdGlvbih0aGlzLmltYWdlRWRpdG9yKTtcclxuICAgIGlmICh0aGlzLnNoYXBlVHlwZSAhPSB0eXBlKSB7XHJcbiAgICAgIHRoaXMuc2hhcGVUeXBlID0gdHlwZTtcclxuICAgICAgdGhpcy5pbWFnZUVkaXRvci5zdGFydERyYXdpbmdNb2RlKCdTSEFQRScpO1xyXG4gICAgICB0aGlzLnNldERyYXdpbmdTaGFwZSh0aGlzLnNoYXBlVHlwZSwge1xyXG4gICAgICAgIGZpbGw6IHRoaXMuc2hhcGVGaWxsQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlOiB0aGlzLnNoYXBlU3Ryb2tlQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc2hhcGVTdHJva2VXaWR0aFZhbHVlLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2hhcGVUeXBlID0gbnVsbDtcclxuICAgICAgdGhpcy5pbWFnZUVkaXRvci5zdG9wRHJhd2luZ01vZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldERyYXdpbmdTaGFwZShcclxuICAgIHR5cGU6ICdjaXJjbGUnIHwgJ3RyaWFuZ2xlJyB8ICdyZWN0JyxcclxuICAgIG9wdGlvbnM6IHtcclxuICAgICAgZmlsbDogc3RyaW5nO1xyXG4gICAgICBzdHJva2U6IHN0cmluZztcclxuICAgICAgc3Ryb2tlV2lkdGg6IG51bWJlcjtcclxuICAgIH1cclxuICApIHtcclxuICAgIHRoaXMuaW1hZ2VFZGl0b3Iuc2V0RHJhd2luZ1NoYXBlKHR5cGUsIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgc2hhcGVDaGFuZ2VBY3RpdmVPYmplY3QoXHJcbiAgICBjaGFuZ2VkUHJvcGVydHk6ICdzdHJva2VXaWR0aCcgfCAnc3Ryb2tlQ29sb3InIHwgJ2ZpbGxDb2xvcicsXHJcbiAgICBpc1NpbGVudDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYWN0aXZlT2JqZWN0SWQgIT0gbnVsbCAmJlxyXG4gICAgICBnZXRBY3RpdmVPYmplY3RJZCh0aGlzLmltYWdlRWRpdG9yKSA9PSB0aGlzLmFjdGl2ZU9iamVjdElkXHJcbiAgICApIHtcclxuICAgICAgdmFyIHByb3BzID0gdGhpcy5pbWFnZUVkaXRvci5nZXRPYmplY3RQcm9wZXJ0aWVzKFxyXG4gICAgICAgIHRoaXMuYWN0aXZlT2JqZWN0SWQsXHJcbiAgICAgICAgJ3R5cGUnXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwcm9wcyAhPSBudWxsICYmXHJcbiAgICAgICAgWydyZWN0JywgJ2NpcmNsZScsICd0cmlhbmdsZSddLmluZGV4T2YocHJvcHMudHlwZSkgPiAtMVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcGFyYW1ldGVycyA9IG51bGw7XHJcbiAgICAgICAgc3dpdGNoIChjaGFuZ2VkUHJvcGVydHkpIHtcclxuICAgICAgICAgIGNhc2UgJ3N0cm9rZVdpZHRoJzpcclxuICAgICAgICAgICAgcGFyYW1ldGVycyA9IHtcclxuICAgICAgICAgICAgICBzdHJva2VXaWR0aDogdGhpcy5zaGFwZVN0cm9rZVdpZHRoVmFsdWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnc3Ryb2tlQ29sb3InOlxyXG4gICAgICAgICAgICBwYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICAgIHN0cm9rZTogdGhpcy5zaGFwZVN0cm9rZUNvbG9yLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2ZpbGxDb2xvcic6XHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgZmlsbDogdGhpcy5zaGFwZUZpbGxDb2xvcixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdW5jdGlvblRvRXhlY3V0ZSA9ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuY2hhbmdlU2hhcGUoXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlT2JqZWN0SWQsXHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgIGlzU2lsZW50XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGlzU2lsZW50KSB7XHJcbiAgICAgICAgICBmdW5jdGlvblRvRXhlY3V0ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uVG9FeGVjdXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItbWVudS1zaGFwZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXN1Ym1lbnUtaXRlbVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItanVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLW92ZXJmbG93YWJsZS14IHR1aS1pbWFnZS1lZGl0b3ItcHktM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aWUtc2hhcGUtYnV0dG9uXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gcmVjdCAnICtcclxuICAgICAgICAgICAgICAoc2hhcGVUeXBlID09ICdyZWN0JyA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRTaGFwZVR5cGUoJ3JlY3QnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtc2hhcGUtcmVjdGFuZ2xlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJub3JtYWwgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXNoYXBlLXJlY3RhbmdsZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aXZlIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtc2hhcGUtcmVjdGFuZ2xlXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gY2lyY2xlICcgK1xyXG4gICAgICAgICAgICAgIChzaGFwZVR5cGUgPT0gJ2NpcmNsZScgPyAnYWN0aXZlJyA6ICcnKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0U2hhcGVUeXBlKCdjaXJjbGUnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtc2hhcGUtY2lyY2xlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJub3JtYWwgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXNoYXBlLWNpcmNsZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aXZlIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICB7eyBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1zaGFwZS1jaXJjbGVcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gdHJpYW5nbGUgJyArXHJcbiAgICAgICAgICAgICAgKHNoYXBlVHlwZSA9PSAndHJpYW5nbGUnID8gJ2FjdGl2ZScgOiAnJylcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNldFNoYXBlVHlwZSgndHJpYW5nbGUnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtc2hhcGUtdHJpYW5nbGVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm5vcm1hbCB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtc2hhcGUtdHJpYW5nbGVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGl2ZSB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLXNoYXBlLXRyaWFuZ2xlXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItcGFydGl0aW9uXCI+XHJcbiAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aWUtc2hhcGUtY29sb3ItYnV0dG9uIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3dcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJ0aWUtY29sb3ItZmlsbCB0dWktaW1hZ2UtZWRpdG9yLWJ1dHRvbiB0dWktaW1hZ2UtZWRpdG9yLWJ1dHRvbi1jb2xvci1waWNrZXIgdHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LWNvbHVtblwiXHJcbiAgICAgICAgICAgIHRpdGxlPVwiRmlsbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRpZS1kcmF3LWNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICBbKGNvbG9yUGlja2VyKV09XCJzaGFwZUZpbGxDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzaGFwZUZpbGxDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbY3BPdXRwdXRGb3JtYXRdPVwiJ3JnYmEnXCJcclxuICAgICAgICAgICAgICAgIFtjcFByZXNldENvbG9yc109XCJkZWZhdWx0U2hhcGVGaWxsQ29sb3JzXCJcclxuICAgICAgICAgICAgICAgIChjb2xvclBpY2tlckNoYW5nZSk9XCJzaGFwZUNvbG9yQ2hhbmdlZCgnZmlsbCcsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW2NwVXNlUm9vdFZpZXdDb250YWluZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAge3sgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtc2hhcGUtZmlsbFwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJ0aWUtY29sb3Itc3Ryb2tlIHR1aS1pbWFnZS1lZGl0b3ItYnV0dG9uIHR1aS1pbWFnZS1lZGl0b3ItYnV0dG9uLWNvbG9yLXBpY2tlciB0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtY29sdW1uXCJcclxuICAgICAgICAgICAgdGl0bGU9XCJTdHJva2VcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICByZWFkb25seVxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtZHJhdy1jb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgWyhjb2xvclBpY2tlcildPVwic2hhcGVTdHJva2VDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzaGFwZVN0cm9rZUNvbG9yXCJcclxuICAgICAgICAgICAgICAgIFtjcE91dHB1dEZvcm1hdF09XCIncmdiYSdcIlxyXG4gICAgICAgICAgICAgICAgW2NwUHJlc2V0Q29sb3JzXT1cImRlZmF1bHRTaGFwZVN0cm9rZUNvbG9yc1wiXHJcbiAgICAgICAgICAgICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwic2hhcGVDb2xvckNoYW5nZWQoJ3N0cm9rZScsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW2NwVXNlUm9vdFZpZXdDb250YWluZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtc2hhcGUtc3Ryb2tlXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLW5ld2xpbmUgdHVpLWltYWdlLWVkaXRvci1yYW5nZS13cmFwIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1qdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItbWItM1wiXHJcbiAgICA+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cInJhbmdlXCI+e3tcclxuICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1zaGFwZS1zdHJva2VXaWR0aFwiIHwgdHJhbnNsYXRlXHJcbiAgICAgIH19PC9sYWJlbD5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNoYXBlU3Ryb2tlV2lkdGhWYWx1ZVwiXHJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2hhcGVTdHJva2VXaWR0aENoYW5nZWQoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJzaGFwZVN0cm9rZVdpZHRoQ2hhbmdlZCgkZXZlbnQsIGZhbHNlKVwiXHJcbiAgICAgICAgbWluPVwiMlwiXHJcbiAgICAgICAgbWF4PVwiMzAwXCJcclxuICAgICAgLz5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgbWluPVwiMlwiXHJcbiAgICAgICAgbWF4PVwiMzAwXCJcclxuICAgICAgICBzdGVwPVwiMVwiXHJcbiAgICAgICAgY2xhc3M9XCJ0aWUtZHJhdy1yYW5nZS12YWx1ZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXZhbHVlXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNoYXBlU3Ryb2tlV2lkdGhWYWx1ZVwiXHJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2hhcGVTdHJva2VXaWR0aENoYW5nZWQoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJzaGFwZVN0cm9rZVdpZHRoQ2hhbmdlZCgkZXZlbnQsIGZhbHNlKVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,175 @@
1
+ import { Component, Input, } from '@angular/core';
2
+ import { defaultColors, eventNames } from '../../consts';
3
+ import { getActiveObjectId } from '../../utils';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ import * as i2 from "ngx-color-picker";
7
+ import * as i3 from "@ngx-translate/core";
8
+ export class TextComponent {
9
+ constructor() {
10
+ this.defaultTextColors = defaultColors;
11
+ this.textColor = 'rgba(255, 187, 59, 1)';
12
+ this.textSizeValue = 50;
13
+ this.textAlign = 'left';
14
+ this.textFontFamily = 'Noto Sans';
15
+ this.textFontStyle = 'normal';
16
+ this.textFontWeight = 'normal';
17
+ this.textDecoration = null;
18
+ this.onObjectActivatedEventListener = this.onObjectActivated.bind(this);
19
+ this.onTextAddedEventListener = this.onTextAdded.bind(this);
20
+ }
21
+ ngOnChanges(changes) {
22
+ var that = this;
23
+ if (changes['imageEditor']) {
24
+ this.activeObjectId = getActiveObjectId(changes['imageEditor'].currentValue);
25
+ this.checkActiveObject(this.activeObjectId);
26
+ changes['imageEditor'].currentValue?.startDrawingMode('TEXT');
27
+ changes['imageEditor'].previousValue?.off(eventNames.OBJECT_ACTIVATED, that.onObjectActivatedEventListener);
28
+ changes['imageEditor'].currentValue?.on(eventNames.OBJECT_ACTIVATED, that.onObjectActivatedEventListener);
29
+ changes['imageEditor'].previousValue?.off(eventNames.ADD_TEXT, that.onTextAddedEventListener);
30
+ changes['imageEditor'].currentValue?.on(eventNames.ADD_TEXT, that.onTextAddedEventListener);
31
+ }
32
+ }
33
+ ngOnDestroy() {
34
+ if (this.imageEditor) {
35
+ this.imageEditor.off(eventNames.OBJECT_ACTIVATED, this.onObjectActivatedEventListener);
36
+ this.imageEditor.off(eventNames.ADD_TEXT, this.onTextAddedEventListener);
37
+ }
38
+ }
39
+ onObjectActivated(props) {
40
+ this.activeObjectId = props?.id;
41
+ this.checkActiveObject(this.activeObjectId);
42
+ }
43
+ onTextAdded(e) {
44
+ this.imageEditor
45
+ .addText('Edit text', {
46
+ position: e.originPosition,
47
+ styles: {
48
+ fill: this.textColor,
49
+ fontFamily: this.textFontFamily,
50
+ fontSize: this.textSizeValue,
51
+ fontStyle: this.textFontStyle,
52
+ fontWeight: this.textFontWeight,
53
+ textAlign: this.textAlign,
54
+ textDecoration: this.textDecoration,
55
+ underline: this.textDecoration == 'underline',
56
+ },
57
+ })
58
+ .then(() => {
59
+ this.imageEditor.changeCursor('default');
60
+ this.imageEditor?.startDrawingMode('TEXT');
61
+ });
62
+ }
63
+ checkActiveObject(activeObjectId) {
64
+ if (activeObjectId != null) {
65
+ var props = this.imageEditor?.getObjectProperties(activeObjectId, [
66
+ 'type',
67
+ 'fill',
68
+ 'textAlign',
69
+ 'textDecoration',
70
+ 'fontFamily',
71
+ 'fontStyle',
72
+ 'fontWeight',
73
+ 'fontSize',
74
+ ]);
75
+ if (props && (props.type === 'i-text' || props.type === 'text')) {
76
+ this.textAlign = props.textAlign;
77
+ this.textColor = props.fill;
78
+ this.textDecoration = props.textDecoration;
79
+ this.textFontFamily = props.fontFamily;
80
+ this.textFontStyle = props.fontStyle;
81
+ this.textFontWeight = props.fontWeight;
82
+ this.textSizeValue = props.fontSize;
83
+ this.imageEditor?.startDrawingMode('TEXT');
84
+ }
85
+ }
86
+ }
87
+ changeTextAlignment(newValue) {
88
+ this.textAlign = newValue;
89
+ this.textChangeActiveObject('textAlign');
90
+ }
91
+ changeTextFontStyle(newFontStyle) {
92
+ this.textFontStyle = newFontStyle;
93
+ this.textChangeActiveObject('fontStyle');
94
+ }
95
+ changeTextFontWeight(newFontWeight) {
96
+ this.textFontWeight = newFontWeight;
97
+ this.textChangeActiveObject('fontWeight');
98
+ }
99
+ changeTextDecoration(newTextDecoration) {
100
+ this.textDecoration = newTextDecoration;
101
+ this.textChangeActiveObject('textDecoration');
102
+ }
103
+ textSizeValueChanged(currentTextSizeValue, isSilent) {
104
+ this.textChangeActiveObject('fontSize', isSilent);
105
+ }
106
+ textColorChanged(currentColor) {
107
+ this.textChangeActiveObject('color');
108
+ }
109
+ textChangeActiveObject(type, isSilent = false) {
110
+ if (this.activeObjectId != null &&
111
+ getActiveObjectId(this.imageEditor) == this.activeObjectId) {
112
+ var props = this.imageEditor.getObjectProperties(this.activeObjectId, 'type');
113
+ let parameters = null;
114
+ if (props.type === 'i-text' || props.type === 'text') {
115
+ switch (type) {
116
+ case 'color':
117
+ parameters = {
118
+ fill: this.textColor,
119
+ };
120
+ break;
121
+ case 'fontFamily':
122
+ parameters = {
123
+ fontFamily: this.textFontFamily,
124
+ };
125
+ break;
126
+ case 'fontSize':
127
+ parameters = {
128
+ fontSize: this.textSizeValue,
129
+ };
130
+ break;
131
+ case 'fontStyle':
132
+ parameters = {
133
+ fontStyle: this.textFontStyle,
134
+ };
135
+ break;
136
+ case 'fontWeight':
137
+ parameters = {
138
+ fontWeight: this.textFontWeight,
139
+ };
140
+ break;
141
+ case 'textAlign':
142
+ parameters = {
143
+ textAlign: this.textAlign,
144
+ };
145
+ break;
146
+ case 'textDecoration':
147
+ parameters = {
148
+ textDecoration: this.textDecoration,
149
+ };
150
+ break;
151
+ }
152
+ let functionToExecute = () => {
153
+ this.imageEditor.changeTextStyle(this.activeObjectId, parameters, isSilent);
154
+ };
155
+ if (isSilent) {
156
+ functionToExecute();
157
+ }
158
+ else {
159
+ setTimeout(functionToExecute);
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+ TextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
166
+ TextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: TextComponent, selector: "tui-image-editor-submenus-text", inputs: { imageEditor: "imageEditor", defaultTextColors: "defaultTextColors" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"tui-image-editor-menu-text\">\r\n <div class=\"tui-image-editor-submenu-item\">\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-justify-content-center\"\r\n [style.maxWidth]=\"'100%'\"\r\n >\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\"\r\n >\r\n <div\r\n class=\"tie-text-effect-button tui-image-editor-d-flex tui-image-editor-flex-row\"\r\n >\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button bold ' +\r\n (textFontWeight == 'bold' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextFontWeight(textFontWeight == 'bold' ? 'normal' : 'bold')\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-bold\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-bold\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-bold\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button italic ' +\r\n (textFontStyle == 'italic' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextFontStyle(\r\n textFontStyle == 'italic' ? 'normal' : 'italic'\r\n )\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-italic\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-italic\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-italic\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button underline ' +\r\n (textDecoration == 'underline' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextDecoration(\r\n textDecoration == 'underline' ? null : 'underline'\r\n )\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-underline\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-underline\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-text-underline\" | translate\r\n }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div\r\n class=\"tie-text-align-button tui-image-editor-d-flex tui-image-editor-flex-row\"\r\n >\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button left ' +\r\n (textAlign == 'left' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('left')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-left\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-left\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-left\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button center ' +\r\n (textAlign == 'center' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('center')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-center\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-center\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-center\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button right ' +\r\n (textAlign == 'right' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('right')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-right\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-right\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-right\" | translate }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div>\r\n <div\r\n class=\"tie-text-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Color\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-text-color-picker\"\r\n [(colorPicker)]=\"textColor\"\r\n [style.background]=\"textColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultTextColors\"\r\n (colorPickerChange)=\"textColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{ \"tui-image-editor-angular-submenus-text-color\" | translate }}\r\n </div></label\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-justify-content-center tui-image-editor-mb-3\"\r\n >\r\n <label class=\"range\">\r\n {{\r\n \"tui-image-editor-angular-submenus-text-textSize\" | translate\r\n }}</label\r\n >\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"textSizeValue\"\r\n (ngModelChange)=\"textSizeValueChanged($event, true)\"\r\n (change)=\"textSizeValueChanged($event, false)\"\r\n min=\"10\"\r\n max=\"100\"\r\n />\r\n <input\r\n type=\"number\"\r\n min=\"10\"\r\n max=\"100\"\r\n step=\"1\"\r\n class=\"tie-text-range-value tui-image-editor-range-value\"\r\n [(ngModel)]=\"textSizeValue\"\r\n (ngModelChange)=\"textSizeValueChanged($event, true)\"\r\n (change)=\"textSizeValueChanged($event, false)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.ColorPickerDirective, selector: "[colorPicker]", inputs: ["colorPicker", "cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpEyeDropper", "cpPresetLabel", "cpPresetColors", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "cpExtraTemplate"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TextComponent, decorators: [{
168
+ type: Component,
169
+ args: [{ selector: 'tui-image-editor-submenus-text', template: "<div class=\"tui-image-editor-menu-text\">\r\n <div class=\"tui-image-editor-submenu-item\">\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-justify-content-center\"\r\n [style.maxWidth]=\"'100%'\"\r\n >\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\"\r\n >\r\n <div\r\n class=\"tie-text-effect-button tui-image-editor-d-flex tui-image-editor-flex-row\"\r\n >\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button bold ' +\r\n (textFontWeight == 'bold' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextFontWeight(textFontWeight == 'bold' ? 'normal' : 'bold')\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-bold\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-bold\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-bold\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button italic ' +\r\n (textFontStyle == 'italic' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextFontStyle(\r\n textFontStyle == 'italic' ? 'normal' : 'italic'\r\n )\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-italic\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-italic\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-italic\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button underline ' +\r\n (textDecoration == 'underline' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextDecoration(\r\n textDecoration == 'underline' ? null : 'underline'\r\n )\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-underline\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-underline\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-text-underline\" | translate\r\n }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div\r\n class=\"tie-text-align-button tui-image-editor-d-flex tui-image-editor-flex-row\"\r\n >\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button left ' +\r\n (textAlign == 'left' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('left')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-left\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-left\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-left\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button center ' +\r\n (textAlign == 'center' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('center')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-center\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-center\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-center\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button right ' +\r\n (textAlign == 'right' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('right')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-right\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-right\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-right\" | translate }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div>\r\n <div\r\n class=\"tie-text-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Color\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-text-color-picker\"\r\n [(colorPicker)]=\"textColor\"\r\n [style.background]=\"textColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultTextColors\"\r\n (colorPickerChange)=\"textColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{ \"tui-image-editor-angular-submenus-text-color\" | translate }}\r\n </div></label\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-justify-content-center tui-image-editor-mb-3\"\r\n >\r\n <label class=\"range\">\r\n {{\r\n \"tui-image-editor-angular-submenus-text-textSize\" | translate\r\n }}</label\r\n >\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"textSizeValue\"\r\n (ngModelChange)=\"textSizeValueChanged($event, true)\"\r\n (change)=\"textSizeValueChanged($event, false)\"\r\n min=\"10\"\r\n max=\"100\"\r\n />\r\n <input\r\n type=\"number\"\r\n min=\"10\"\r\n max=\"100\"\r\n step=\"1\"\r\n class=\"tie-text-range-value tui-image-editor-range-value\"\r\n [(ngModel)]=\"textSizeValue\"\r\n (ngModelChange)=\"textSizeValueChanged($event, true)\"\r\n (change)=\"textSizeValueChanged($event, false)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n" }]
170
+ }], ctorParameters: function () { return []; }, propDecorators: { imageEditor: [{
171
+ type: Input
172
+ }], defaultTextColors: [{
173
+ type: Input
174
+ }] } });
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXIyL3NyYy9saWIvc3VibWVudXMvdGV4dC90ZXh0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1aS1pbWFnZS1lZGl0b3ItYW5ndWxhcjIvc3JjL2xpYi9zdWJtZW51cy90ZXh0L3RleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEdBS04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQU9oRCxNQUFNLE9BQU8sYUFBYTtJQWtCeEI7UUFmUyxzQkFBaUIsR0FBYSxhQUFhLENBQUM7UUFDOUMsY0FBUyxHQUFXLHVCQUF1QixDQUFDO1FBQzVDLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGNBQVMsR0FBZ0MsTUFBTSxDQUFDO1FBQ2hELG1CQUFjLEdBQUcsV0FBVyxDQUFDO1FBQzdCLGtCQUFhLEdBQXdCLFFBQVEsQ0FBQztRQUM5QyxtQkFBYyxHQUFzQixRQUFRLENBQUM7UUFDN0MsbUJBQWMsR0FJVixJQUFJLENBQUM7UUFLZCxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxP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QUFNO29CQUNSLEtBQUssWUFBWTt3QkFDZixVQUFVLEdBQUc7NEJBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjO3lCQUNoQyxDQUFDO3dCQUNGLE1BQU07b0JBQ1IsS0FBSyxXQUFXO3dCQUNkLFVBQVUsR0FBRzs0QkFDWCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7eUJBQzFCLENBQUM7d0JBQ0YsTUFBTTtvQkFDUixLQUFLLGdCQUFnQjt3QkFDbkIsVUFBVSxHQUFHOzRCQUNYLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYzt5QkFDcEMsQ0FBQzt3QkFDRixNQUFNO2lCQUNUO2dCQUNELElBQUksaUJBQWlCLEdBQUcsR0FBRyxFQUFFO29CQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FDOUIsSUFBSSxDQUFDLGNBQWMsRUFDbkIsVUFBVSxFQUNWLFFBQVEsQ0FDVCxDQUFDO2dCQUNKLENBQUMsQ0FBQztnQkFDRixJQUFJLFFBQVEsRUFBRTtvQkFDWixpQkFBaUIsRUFBRSxDQUFDO2lCQUNyQjtxQkFBTTtvQkFDTCxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztpQkFDL0I7YUFDRjtTQUNGO0lBQ0gsQ0FBQzs7MEdBdk5VLGFBQWE7OEZBQWIsYUFBYSwyS0NoQjFCLHkrUEFrT0E7MkZEbE5hLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsZ0NBQWdDOzBFQUtqQyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGRlZmF1bHRDb2xvcnMsIGV2ZW50TmFtZXMgfSBmcm9tICcuLi8uLi9jb25zdHMnO1xyXG5pbXBvcnQgeyBnZXRBY3RpdmVPYmplY3RJZCB9IGZyb20gJy4uLy4uL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHVpLWltYWdlLWVkaXRvci1zdWJtZW51cy10ZXh0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGltYWdlRWRpdG9yOiBhbnk7XHJcbiAgcHVibGljIGFjdGl2ZU9iamVjdElkOiBudW1iZXI7XHJcbiAgQElucHV0KCkgZGVmYXVsdFRleHRDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcclxuICBwdWJsaWMgdGV4dENvbG9yOiBzdHJpbmcgPSAncmdiYSgyNTUsIDE4NywgNTksIDEpJztcclxuICBwdWJsaWMgdGV4dFNpemVWYWx1ZTogbnVtYmVyID0gNTA7XHJcbiAgcHVibGljIHRleHRBbGlnbjogJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnID0gJ2xlZnQnO1xyXG4gIHB1YmxpYyB0ZXh0Rm9udEZhbWlseSA9ICdOb3RvIFNhbnMnO1xyXG4gIHB1YmxpYyB0ZXh0Rm9udFN0eWxlOiAnbm9ybWFsJyB8ICdpdGFsaWMnID0gJ25vcm1hbCc7XHJcbiAgcHVibGljIHRleHRGb250V2VpZ2h0OiAnbm9ybWFsJyB8ICdib2xkJyA9ICdub3JtYWwnO1xyXG4gIHB1YmxpYyB0ZXh0RGVjb3JhdGlvbjpcclxuICAgIHwgJ3VuZGVybGluZSdcclxuICAgIHwgJ2xpbmUtdGhyb3VnaCdcclxuICAgIHwgJ292ZXJsaW5lJ1xyXG4gICAgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgb25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyOiBhbnk7XHJcbiAgcHVibGljIG9uVGV4dEFkZGVkRXZlbnRMaXN0ZW5lcjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMub25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyID0gdGhpcy5vbk9iamVjdEFjdGl2YXRlZC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5vblRleHRBZGRlZEV2ZW50TGlzdGVuZXIgPSB0aGlzLm9uVGV4dEFkZGVkLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB2YXIgdGhhdCA9IHRoaXM7XHJcbiAgICBpZiAoY2hhbmdlc1snaW1hZ2VFZGl0b3InXSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZU9iamVjdElkID0gZ2V0QWN0aXZlT2JqZWN0SWQoXHJcbiAgICAgICAgY2hhbmdlc1snaW1hZ2VFZGl0b3InXS5jdXJyZW50VmFsdWVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jaGVja0FjdGl2ZU9iamVjdCh0aGlzLmFjdGl2ZU9iamVjdElkKTtcclxuICAgICAgY2hhbmdlc1snaW1hZ2VFZGl0b3InXS5jdXJyZW50VmFsdWU/LnN0YXJ0RHJhd2luZ01vZGUoJ1RFWFQnKTtcclxuXHJcbiAgICAgIGNoYW5nZXNbJ2ltYWdlRWRpdG9yJ10ucHJldmlvdXNWYWx1ZT8ub2ZmKFxyXG4gICAgICAgIGV2ZW50TmFtZXMuT0JKRUNUX0FDVElWQVRFRCxcclxuICAgICAgICB0aGF0Lm9uT2JqZWN0QWN0aXZhdGVkRXZlbnRMaXN0ZW5lclxyXG4gICAgICApO1xyXG4gICAgICBjaGFuZ2VzWydpbWFnZUVkaXRvciddLmN1cnJlbnRWYWx1ZT8ub24oXHJcbiAgICAgICAgZXZlbnROYW1lcy5PQkpFQ1RfQUNUSVZBVEVELFxyXG4gICAgICAgIHRoYXQub25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjaGFuZ2VzWydpbWFnZUVkaXRvciddLnByZXZpb3VzVmFsdWU/Lm9mZihcclxuICAgICAgICBldmVudE5hbWVzLkFERF9URVhULFxyXG4gICAgICAgIHRoYXQub25UZXh0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICAgIGNoYW5nZXNbJ2ltYWdlRWRpdG9yJ10uY3VycmVudFZhbHVlPy5vbihcclxuICAgICAgICBldmVudE5hbWVzLkFERF9URVhULFxyXG4gICAgICAgIHRoYXQub25UZXh0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmltYWdlRWRpdG9yKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VFZGl0b3Iub2ZmKFxyXG4gICAgICAgIGV2ZW50TmFtZXMuT0JKRUNUX0FDVElWQVRFRCxcclxuICAgICAgICB0aGlzLm9uT2JqZWN0QWN0aXZhdGVkRXZlbnRMaXN0ZW5lclxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmltYWdlRWRpdG9yLm9mZihldmVudE5hbWVzLkFERF9URVhULCB0aGlzLm9uVGV4dEFkZGVkRXZlbnRMaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uT2JqZWN0QWN0aXZhdGVkKHByb3BzKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU9iamVjdElkID0gcHJvcHM/LmlkO1xyXG4gICAgdGhpcy5jaGVja0FjdGl2ZU9iamVjdCh0aGlzLmFjdGl2ZU9iamVjdElkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25UZXh0QWRkZWQoZSkge1xyXG4gICAgdGhpcy5pbWFnZUVkaXRvclxyXG4gICAgICAuYWRkVGV4dCgnRWRpdCB0ZXh0Jywge1xyXG4gICAgICAgIHBvc2l0aW9uOiBlLm9yaWdpblBvc2l0aW9uLFxyXG4gICAgICAgIHN0eWxlczoge1xyXG4gICAgICAgICAgZmlsbDogdGhpcy50ZXh0Q29sb3IsXHJcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLnRleHRGb250RmFtaWx5LFxyXG4gICAgICAgICAgZm9udFNpemU6IHRoaXMudGV4dFNpemVWYWx1ZSxcclxuICAgICAgICAgIGZvbnRTdHlsZTogdGhpcy50ZXh0Rm9udFN0eWxlLFxyXG4gICAgICAgICAgZm9udFdlaWdodDogdGhpcy50ZXh0Rm9udFdlaWdodCxcclxuICAgICAgICAgIHRleHRBbGlnbjogdGhpcy50ZXh0QWxpZ24sXHJcbiAgICAgICAgICB0ZXh0RGVjb3JhdGlvbjogdGhpcy50ZXh0RGVjb3JhdGlvbixcclxuICAgICAgICAgIHVuZGVybGluZTogdGhpcy50ZXh0RGVjb3JhdGlvbiA9PSAndW5kZXJsaW5lJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbWFnZUVkaXRvci5jaGFuZ2VDdXJzb3IoJ2RlZmF1bHQnKTtcclxuICAgICAgICB0aGlzLmltYWdlRWRpdG9yPy5zdGFydERyYXdpbmdNb2RlKCdURVhUJyk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0FjdGl2ZU9iamVjdChhY3RpdmVPYmplY3RJZDogbnVtYmVyKSB7XHJcbiAgICBpZiAoYWN0aXZlT2JqZWN0SWQgIT0gbnVsbCkge1xyXG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLmltYWdlRWRpdG9yPy5nZXRPYmplY3RQcm9wZXJ0aWVzKGFjdGl2ZU9iamVjdElkLCBbXHJcbiAgICAgICAgJ3R5cGUnLFxyXG4gICAgICAgICdmaWxsJyxcclxuICAgICAgICAndGV4dEFsaWduJyxcclxuICAgICAgICAndGV4dERlY29yYXRpb24nLFxyXG4gICAgICAgICdmb250RmFtaWx5JyxcclxuICAgICAgICAnZm9udFN0eWxlJyxcclxuICAgICAgICAnZm9udFdlaWdodCcsXHJcbiAgICAgICAgJ2ZvbnRTaXplJyxcclxuICAgICAgXSk7XHJcbiAgICAgIGlmIChwcm9wcyAmJiAocHJvcHMudHlwZSA9PT0gJ2ktdGV4dCcgfHwgcHJvcHMudHlwZSA9PT0gJ3RleHQnKSkge1xyXG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduO1xyXG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gcHJvcHMuZmlsbDtcclxuICAgICAgICB0aGlzLnRleHREZWNvcmF0aW9uID0gcHJvcHMudGV4dERlY29yYXRpb247XHJcbiAgICAgICAgdGhpcy50ZXh0Rm9udEZhbWlseSA9IHByb3BzLmZvbnRGYW1pbHk7XHJcbiAgICAgICAgdGhpcy50ZXh0Rm9udFN0eWxlID0gcHJvcHMuZm9udFN0eWxlO1xyXG4gICAgICAgIHRoaXMudGV4dEZvbnRXZWlnaHQgPSBwcm9wcy5mb250V2VpZ2h0O1xyXG4gICAgICAgIHRoaXMudGV4dFNpemVWYWx1ZSA9IHByb3BzLmZvbnRTaXplO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0b3I/LnN0YXJ0RHJhd2luZ01vZGUoJ1RFWFQnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGV4dEFsaWdubWVudChuZXdWYWx1ZTogJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnKSB7XHJcbiAgICB0aGlzLnRleHRBbGlnbiA9IG5ld1ZhbHVlO1xyXG4gICAgdGhpcy50ZXh0Q2hhbmdlQWN0aXZlT2JqZWN0KCd0ZXh0QWxpZ24nKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZVRleHRGb250U3R5bGUobmV3Rm9udFN0eWxlOiAnbm9ybWFsJyB8ICdpdGFsaWMnKSB7XHJcbiAgICB0aGlzLnRleHRGb250U3R5bGUgPSBuZXdGb250U3R5bGU7XHJcbiAgICB0aGlzLnRleHRDaGFuZ2VBY3RpdmVPYmplY3QoJ2ZvbnRTdHlsZScpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGV4dEZvbnRXZWlnaHQobmV3Rm9udFdlaWdodDogJ25vcm1hbCcgfCAnYm9sZCcpIHtcclxuICAgIHRoaXMudGV4dEZvbnRXZWlnaHQgPSBuZXdGb250V2VpZ2h0O1xyXG4gICAgdGhpcy50ZXh0Q2hhbmdlQWN0aXZlT2JqZWN0KCdmb250V2VpZ2h0Jyk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VUZXh0RGVjb3JhdGlvbihcclxuICAgIG5ld1RleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJyB8ICdsaW5lLXRocm91Z2gnIHwgJ292ZXJsaW5lJyB8IG51bGxcclxuICApIHtcclxuICAgIHRoaXMudGV4dERlY29yYXRpb24gPSBuZXdUZXh0RGVjb3JhdGlvbjtcclxuICAgIHRoaXMudGV4dENoYW5nZUFjdGl2ZU9iamVjdCgndGV4dERlY29yYXRpb24nKTtcclxuICB9XHJcblxyXG4gIHRleHRTaXplVmFsdWVDaGFuZ2VkKGN1cnJlbnRUZXh0U2l6ZVZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnRleHRDaGFuZ2VBY3RpdmVPYmplY3QoJ2ZvbnRTaXplJywgaXNTaWxlbnQpO1xyXG4gIH1cclxuXHJcbiAgdGV4dENvbG9yQ2hhbmdlZChjdXJyZW50Q29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZXh0Q2hhbmdlQWN0aXZlT2JqZWN0KCdjb2xvcicpO1xyXG4gIH1cclxuXHJcbiAgdGV4dENoYW5nZUFjdGl2ZU9iamVjdChcclxuICAgIHR5cGU6XHJcbiAgICAgIHwgJ2NvbG9yJ1xyXG4gICAgICB8ICdmb250RmFtaWx5J1xyXG4gICAgICB8ICdmb250U2l6ZSdcclxuICAgICAgfCAnZm9udFN0eWxlJ1xyXG4gICAgICB8ICdmb250V2VpZ2h0J1xyXG4gICAgICB8ICd0ZXh0QWxpZ24nXHJcbiAgICAgIHwgJ3RleHREZWNvcmF0aW9uJyxcclxuICAgIGlzU2lsZW50OiBib29sZWFuID0gZmFsc2VcclxuICApIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5hY3RpdmVPYmplY3RJZCAhPSBudWxsICYmXHJcbiAgICAgIGdldEFjdGl2ZU9iamVjdElkKHRoaXMuaW1hZ2VFZGl0b3IpID09IHRoaXMuYWN0aXZlT2JqZWN0SWRcclxuICAgICkge1xyXG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLmltYWdlRWRpdG9yLmdldE9iamVjdFByb3BlcnRpZXMoXHJcbiAgICAgICAgdGhpcy5hY3RpdmVPYmplY3RJZCxcclxuICAgICAgICAndHlwZSdcclxuICAgICAgKTtcclxuICAgICAgbGV0IHBhcmFtZXRlcnMgPSBudWxsO1xyXG4gICAgICBpZiAocHJvcHMudHlwZSA9PT0gJ2ktdGV4dCcgfHwgcHJvcHMudHlwZSA9PT0gJ3RleHQnKSB7XHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICBjYXNlICdjb2xvcic6XHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgZmlsbDogdGhpcy50ZXh0Q29sb3IsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnZm9udEZhbWlseSc6XHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogdGhpcy50ZXh0Rm9udEZhbWlseSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdmb250U2l6ZSc6XHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgZm9udFNpemU6IHRoaXMudGV4dFNpemVWYWx1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdmb250U3R5bGUnOlxyXG4gICAgICAgICAgICBwYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICAgIGZvbnRTdHlsZTogdGhpcy50ZXh0Rm9udFN0eWxlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2ZvbnRXZWlnaHQnOlxyXG4gICAgICAgICAgICBwYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHRoaXMudGV4dEZvbnRXZWlnaHQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAndGV4dEFsaWduJzpcclxuICAgICAgICAgICAgcGFyYW1ldGVycyA9IHtcclxuICAgICAgICAgICAgICB0ZXh0QWxpZ246IHRoaXMudGV4dEFsaWduLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ3RleHREZWNvcmF0aW9uJzpcclxuICAgICAgICAgICAgcGFyYW1ldGVycyA9IHtcclxuICAgICAgICAgICAgICB0ZXh0RGVjb3JhdGlvbjogdGhpcy50ZXh0RGVjb3JhdGlvbixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdW5jdGlvblRvRXhlY3V0ZSA9ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuY2hhbmdlVGV4dFN0eWxlKFxyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU9iamVjdElkLFxyXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLFxyXG4gICAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChpc1NpbGVudCkge1xyXG4gICAgICAgICAgZnVuY3Rpb25Ub0V4ZWN1dGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvblRvRXhlY3V0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLW1lbnUtdGV4dFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXN1Ym1lbnUtaXRlbVwiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItanVzdGlmeS1jb250ZW50LWNlbnRlclwiXHJcbiAgICAgIFtzdHlsZS5tYXhXaWR0aF09XCInMTAwJSdcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3Itb3ZlcmZsb3dhYmxlLXggdHVpLWltYWdlLWVkaXRvci1weS0zXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwidGllLXRleHQtZWZmZWN0LWJ1dHRvbiB0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gYm9sZCAnICtcclxuICAgICAgICAgICAgICAodGV4dEZvbnRXZWlnaHQgPT0gJ2JvbGQnID8gJ2FjdGl2ZScgOiAnJylcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIlxyXG4gICAgICAgICAgICAgIGNoYW5nZVRleHRGb250V2VpZ2h0KHRleHRGb250V2VpZ2h0ID09ICdib2xkJyA/ICdub3JtYWwnIDogJ2JvbGQnKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzdmdfaWMtc3VibWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXRleHQtYm9sZFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9ybWFsIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWJvbGRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGl2ZSB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAge3sgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtdGV4dC1ib2xkXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgJ3R1aS1pbWFnZS1lZGl0b3ItYnV0dG9uIGl0YWxpYyAnICtcclxuICAgICAgICAgICAgICAodGV4dEZvbnRTdHlsZSA9PSAnaXRhbGljJyA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJcclxuICAgICAgICAgICAgICBjaGFuZ2VUZXh0Rm9udFN0eWxlKFxyXG4gICAgICAgICAgICAgICAgdGV4dEZvbnRTdHlsZSA9PSAnaXRhbGljJyA/ICdub3JtYWwnIDogJ2l0YWxpYydcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtdGV4dC1pdGFsaWNcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm5vcm1hbCB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtdGV4dC1pdGFsaWNcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGl2ZSB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAge3sgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtdGV4dC1pdGFsaWNcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gdW5kZXJsaW5lICcgK1xyXG4gICAgICAgICAgICAgICh0ZXh0RGVjb3JhdGlvbiA9PSAndW5kZXJsaW5lJyA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJcclxuICAgICAgICAgICAgICBjaGFuZ2VUZXh0RGVjb3JhdGlvbihcclxuICAgICAgICAgICAgICAgIHRleHREZWNvcmF0aW9uID09ICd1bmRlcmxpbmUnID8gbnVsbCA6ICd1bmRlcmxpbmUnXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzdmdfaWMtc3VibWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXRleHQtdW5kZXJsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJub3JtYWwgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXRleHQtdW5kZXJsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3RpdmUgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy10ZXh0LXVuZGVybGluZVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXBhcnRpdGlvblwiPlxyXG4gICAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInRpZS10ZXh0LWFsaWduLWJ1dHRvbiB0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gbGVmdCAnICtcclxuICAgICAgICAgICAgICAodGV4dEFsaWduID09ICdsZWZ0JyA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUZXh0QWxpZ25tZW50KCdsZWZ0JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzdmdfaWMtc3VibWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXRleHQtYWxpZ24tbGVmdFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9ybWFsIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWFsaWduLWxlZnRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGl2ZSB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAge3sgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtdGV4dC1sZWZ0XCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgJ3R1aS1pbWFnZS1lZGl0b3ItYnV0dG9uIGNlbnRlciAnICtcclxuICAgICAgICAgICAgICAodGV4dEFsaWduID09ICdjZW50ZXInID8gJ2FjdGl2ZScgOiAnJylcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVRleHRBbGlnbm1lbnQoJ2NlbnRlcicpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwic3ZnX2ljLXN1Ym1lbnVcIj5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWFsaWduLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9ybWFsIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWFsaWduLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aXZlIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICB7eyBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy10ZXh0LWNlbnRlclwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgW2NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICd0dWktaW1hZ2UtZWRpdG9yLWJ1dHRvbiByaWdodCAnICtcclxuICAgICAgICAgICAgICAodGV4dEFsaWduID09ICdyaWdodCcgPyAnYWN0aXZlJyA6ICcnKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGV4dEFsaWdubWVudCgncmlnaHQnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtdGV4dC1hbGlnbi1yaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9ybWFsIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWFsaWduLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3RpdmUgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgIHt7IFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLXRleHQtcmlnaHRcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItcGFydGl0aW9uXCI+XHJcbiAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwidGllLXRleHQtY29sb3IgdHVpLWltYWdlLWVkaXRvci1idXR0b24gdHVpLWltYWdlLWVkaXRvci1idXR0b24tY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1jb2x1bW5cIlxyXG4gICAgICAgICAgICB0aXRsZT1cIkNvbG9yXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGllLXRleHQtY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgIFsoY29sb3JQaWNrZXIpXT1cInRleHRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJ0ZXh0Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgW2NwT3V0cHV0Rm9ybWF0XT1cIidyZ2JhJ1wiXHJcbiAgICAgICAgICAgICAgICBbY3BQcmVzZXRDb2xvcnNdPVwiZGVmYXVsdFRleHRDb2xvcnNcIlxyXG4gICAgICAgICAgICAgICAgKGNvbG9yUGlja2VyQ2hhbmdlKT1cInRleHRDb2xvckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbY3BVc2VSb290Vmlld0NvbnRhaW5lcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICB7eyBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy10ZXh0LWNvbG9yXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj48L2xhYmVsXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItbmV3bGluZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXdyYXAgdHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWp1c3RpZnktY29udGVudC1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1tYi0zXCJcclxuICAgID5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwicmFuZ2VcIj5cclxuICAgICAgICB7e1xyXG4gICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtdGV4dC10ZXh0U2l6ZVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgfX08L2xhYmVsXHJcbiAgICAgID5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInRleHRTaXplVmFsdWVcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRleHRTaXplVmFsdWVDaGFuZ2VkKCRldmVudCwgdHJ1ZSlcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwidGV4dFNpemVWYWx1ZUNoYW5nZWQoJGV2ZW50LCBmYWxzZSlcIlxyXG4gICAgICAgIG1pbj1cIjEwXCJcclxuICAgICAgICBtYXg9XCIxMDBcIlxyXG4gICAgICAvPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICBtaW49XCIxMFwiXHJcbiAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICBzdGVwPVwiMVwiXHJcbiAgICAgICAgY2xhc3M9XCJ0aWUtdGV4dC1yYW5nZS12YWx1ZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXZhbHVlXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInRleHRTaXplVmFsdWVcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRleHRTaXplVmFsdWVDaGFuZ2VkKCRldmVudCwgdHJ1ZSlcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwidGV4dFNpemVWYWx1ZUNoYW5nZWQoJGV2ZW50LCBmYWxzZSlcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=